Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
---
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html