Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/config.txt | 5 +++++ file-watcher-lib.c | 18 +++++++++++++++--- file-watcher-lib.h | 2 +- file-watcher.c | 8 ++++++-- read-cache.c | 17 +++++++++++++++-- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index e394399..3316b69 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -1038,6 +1038,11 @@ difftool.<tool>.cmd:: difftool.prompt:: Prompt before each invocation of the diff tool. +filewatcher.autorun:: + Run `git file-watcher` automatically if the number of cached + entries is greater than this limit. Zero means no running + file-watcher automatically. Default value is zero. + filewatcher.minfiles:: Start watching files if the number of watchable files are above this limit. Default value is 65536. diff --git a/file-watcher-lib.c b/file-watcher-lib.c index ed14ef9..71c8545 100644 --- a/file-watcher-lib.c +++ b/file-watcher-lib.c @@ -1,16 +1,28 @@ #include "cache.h" +#include "run-command.h" #define WAIT_TIME 20 /* in ms */ #define TRACE_KEY "GIT_TRACE_WATCHER" -int connect_watcher(const char *path) +int connect_watcher(const char *path, int autorun) { struct strbuf sb = STRBUF_INIT; struct stat st; - int fd = -1; + int fd = -1, ret; strbuf_addf(&sb, "%s.watcher", path); - if (!stat(sb.buf, &st) && S_ISSOCK(st.st_mode)) { + ret = stat(sb.buf, &st); + if (autorun && ret && errno == ENOENT) { + const char *av[] = { "file-watcher", "--daemon", "--quiet", NULL }; + struct child_process cp; + memset(&cp, 0, sizeof(cp)); + cp.git_cmd = 1; + cp.argv = av; + if (run_command(&cp)) + return -1; + ret = stat(sb.buf, &st); + } + if (!ret && S_ISSOCK(st.st_mode)) { struct sockaddr_un sun; fd = socket(AF_UNIX, SOCK_DGRAM, 0); sun.sun_family = AF_UNIX; diff --git a/file-watcher-lib.h b/file-watcher-lib.h index 0fe9399..ef3d196 100644 --- a/file-watcher-lib.h +++ b/file-watcher-lib.h @@ -1,7 +1,7 @@ #ifndef __FILE_WATCHER_LIB__ #define __FILE_WATCHER_LIB__ -int connect_watcher(const char *path); +int connect_watcher(const char *path, int autorun); ssize_t send_watcher(int sockfd, struct sockaddr_un *dest, const char *fmt, ...) __attribute__((format (printf, 3, 4))); diff --git a/file-watcher.c b/file-watcher.c index 369af37..1b4ac0a 100644 --- a/file-watcher.c +++ b/file-watcher.c @@ -168,8 +168,9 @@ int main(int argc, const char **argv) struct pollfd pfd[2]; int fd, err, nr; const char *prefix; - int daemon = 0; + int daemon = 0, quiet = 0; struct option options[] = { + OPT__QUIET(&quiet, N_("be quiet")), OPT_BOOL(0, "daemon", &daemon, N_("run in background")), OPT_END() @@ -189,8 +190,11 @@ int main(int argc, const char **argv) fd = socket(AF_UNIX, SOCK_DGRAM, 0); sun.sun_family = AF_UNIX; strlcpy(sun.sun_path, socket_path, sizeof(sun.sun_path)); - if (bind(fd, (struct sockaddr *)&sun, sizeof(sun))) + if (bind(fd, (struct sockaddr *)&sun, sizeof(sun))) { + if (quiet) + exit(128); die_errno("unable to bind to %s", socket_path); + } atexit(cleanup); sigchain_push_common(cleanup_on_signal); diff --git a/read-cache.c b/read-cache.c index 3aa541d..5dae9eb 100644 --- a/read-cache.c +++ b/read-cache.c @@ -40,6 +40,7 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int reall struct index_state the_index; static int watch_lowerlimit = 65536; static int recent_limit = 1800; +static int autorun_watcher = -1; static void set_index_entry(struct index_state *istate, int nr, struct cache_entry *ce) { @@ -1518,6 +1519,10 @@ failed: static int watcher_config(const char *var, const char *value, void *data) { + if (!strcmp(var, "filewatcher.autorun")) { + autorun_watcher = git_config_int(var, value); + return 0; + } if (!strcmp(var, "filewatcher.minfiles")) { watch_lowerlimit = git_config_int(var, value); return 0; @@ -1538,8 +1543,16 @@ static void validate_watcher(struct index_state *istate, const char *path) return; } - git_config(watcher_config, NULL); - istate->watcher = connect_watcher(path); + if (autorun_watcher == -1) { + git_config(watcher_config, NULL); + if (autorun_watcher == -1) + autorun_watcher = 0; + } + + istate->watcher = connect_watcher(path, + autorun_watcher && + istate->cache_nr >= autorun_watcher); + autorun_watcher = 0; if (istate->watcher != -1) { struct strbuf sb = STRBUF_INIT; char *msg; -- 1.8.5.1.208.g05b12ea -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html