void add_root_warnings_to_response(json_t *response, w_root_t *root) { char *str = NULL; char *full = NULL; if (!root->last_recrawl_reason && !root->warning) { return; } if (cfg_get_bool(root, "suppress_recrawl_warnings", false)) { return; } if (root->last_recrawl_reason) { ignore_result( asprintf(&str, "Recrawled this watch %d times, most recently because:\n" "%.*s\n" "To resolve, please review the information on\n" "%s#recrawl", root->recrawl_count, root->last_recrawl_reason->len, root->last_recrawl_reason->buf, cfg_get_trouble_url())); } ignore_result(asprintf( &full, "%.*s%s" // root->warning "%s\n" // str (last recrawl reason) "To clear this warning, run:\n" "`watchman watch-del %.*s ; watchman watch-project %.*s`\n", root->warning ? root->warning->len : 0, root->warning ? root->warning->buf : "", root->warning && str ? "\n" : "", // newline if we have both strings str ? str : "", root->root_path->len, root->root_path->buf, root->root_path->len, root->root_path->buf)); if (full) { set_prop(response, "warning", typed_string_to_json(full, W_STRING_MIXED)); } free(str); free(full); }
void add_root_warnings_to_response(json_t *response, w_root_t *root) { char *str = NULL; if (!root->last_recrawl_reason) { return; } ignore_result(asprintf(&str, "Recrawled this watch %d times, most recently because:\n" "%.*s\n" "To resolve, please review the information on\n" "%s#recrawl", root->recrawl_count, root->last_recrawl_reason->len, root->last_recrawl_reason->buf, cfg_get_trouble_url())); if (!str) { return; } set_prop(response, "warning", json_string_nocheck(str)); free(str); }
void FSEventsWatcher::FSEventsThread(const std::shared_ptr<w_root_t>& root) { CFFileDescriptorRef fdref; CFFileDescriptorContext fdctx; w_set_thread_name("fsevents %s", root->root_path.c_str()); { // Block until fsevents_root_start is waiting for our initialization auto wlock = items_.wlock(); attempt_resync_on_drop = root->config.getBool("fsevents_try_resync", true); memset(&fdctx, 0, sizeof(fdctx)); fdctx.info = root.get(); fdref = CFFileDescriptorCreate( nullptr, fse_pipe.read.fd(), true, fse_pipe_callback, &fdctx); CFFileDescriptorEnableCallBacks(fdref, kCFFileDescriptorReadCallBack); { CFRunLoopSourceRef fdsrc; fdsrc = CFFileDescriptorCreateRunLoopSource(nullptr, fdref, 0); if (!fdsrc) { root->failure_reason = w_string_new_typed( "CFFileDescriptorCreateRunLoopSource failed", W_STRING_UNICODE); goto done; } CFRunLoopAddSource(CFRunLoopGetCurrent(), fdsrc, kCFRunLoopDefaultMode); CFRelease(fdsrc); } stream = fse_stream_make( root, kFSEventStreamEventIdSinceNow, root->failure_reason); if (!stream) { goto done; } if (!FSEventStreamStart(stream->stream)) { root->failure_reason = w_string::printf( "FSEventStreamStart failed, look at your log file %s for " "lines mentioning FSEvents and see %s#fsevents for more information\n", log_name, cfg_get_trouble_url()); goto done; } // Signal to fsevents_root_start that we're done initializing fse_cond.notify_one(); } // Process the events stream until we get signalled to quit CFRunLoopRun(); done: if (stream) { delete stream; } if (fdref) { CFRelease(fdref); } w_log(W_LOG_DBG, "fse_thread done\n"); }