From 4a4ca4796df6b81d5995f31e87e9e6a64c2b889d Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 24 Jan 2016 16:28:19 +0100 Subject: dir: add {new,add}_untracked_cache() Factor out code into new_untracked_cache() and add_untracked_cache(), which will be used in later commits. Helped-by: Eric Sunshine Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- dir.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'dir.c') diff --git a/dir.c b/dir.c index d2a8f06b02..31eae37f5b 100644 --- a/dir.c +++ b/dir.c @@ -1938,6 +1938,24 @@ void add_untracked_ident(struct untracked_cache *uc) strbuf_addch(&uc->ident, 0); } +static void new_untracked_cache(struct index_state *istate) +{ + struct untracked_cache *uc = xcalloc(1, sizeof(*uc)); + strbuf_init(&uc->ident, 100); + uc->exclude_per_dir = ".gitignore"; + /* should be the same flags used by git-status */ + uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; + istate->untracked = uc; +} + +void add_untracked_cache(struct index_state *istate) +{ + if (!istate->untracked) { + new_untracked_cache(istate); + add_untracked_ident(istate->untracked); + istate->cache_changed |= UNTRACKED_CHANGED; +} + static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir, int base_len, const struct pathspec *pathspec) -- cgit v1.2.1 From 07b29bfd8d3de9a16c1c93e285b6980ca6b77b45 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 24 Jan 2016 16:28:20 +0100 Subject: dir: add remove_untracked_cache() Factor out code into remove_untracked_cache(), which will be used in a later commit. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- dir.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'dir.c') diff --git a/dir.c b/dir.c index 31eae37f5b..0d069c9054 100644 --- a/dir.c +++ b/dir.c @@ -1956,6 +1956,15 @@ void add_untracked_cache(struct index_state *istate) istate->cache_changed |= UNTRACKED_CHANGED; } +void remove_untracked_cache(struct index_state *istate) +{ + if (istate->untracked) { + free_untracked_cache(istate->untracked); + istate->untracked = NULL; + istate->cache_changed |= UNTRACKED_CHANGED; + } +} + static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir, int base_len, const struct pathspec *pathspec) -- cgit v1.2.1 From 0e0f761842eafb51c1a5d93fbc84470e2d7ee7c3 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sun, 24 Jan 2016 16:28:21 +0100 Subject: dir: simplify untracked cache "ident" field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is not a good idea to compare kernel versions and disable the untracked cache if it changes, as people may upgrade and still want the untracked cache to work. So let's just compare work tree locations and kernel name to decide if we should disable it. Also storing many locations in the ident field and comparing to any of them can be dangerous if GIT_WORK_TREE is used with different values. So let's just store one location, the location of the current work tree. The downside is that untracked cache can only be used by one type of OS for now. Exporting a git repo to different clients via a network to e.g. Linux and Windows means that only one can use the untracked cache. If the location changed in the ident field and we still want an untracked cache, let's delete the cache and recreate it. Note that if an untracked cache has been created by a previous Git version, then the kernel version is stored in the ident field. As we now compare with just the kernel name the comparison will fail and the untracked cache will be disabled until it's recreated. Helped-by: Torsten Bögershausen Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- dir.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'dir.c') diff --git a/dir.c b/dir.c index 0d069c9054..42d3b6b100 100644 --- a/dir.c +++ b/dir.c @@ -1913,28 +1913,31 @@ static const char *get_ident_string(void) return sb.buf; if (uname(&uts) < 0) die_errno(_("failed to get kernel name and information")); - strbuf_addf(&sb, "Location %s, system %s %s %s", get_git_work_tree(), - uts.sysname, uts.release, uts.version); + strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(), + uts.sysname); return sb.buf; } static int ident_in_untracked(const struct untracked_cache *uc) { - const char *end = uc->ident.buf + uc->ident.len; - const char *p = uc->ident.buf; + /* + * Previous git versions may have saved many NUL separated + * strings in the "ident" field, but it is insane to manage + * many locations, so just take care of the first one. + */ - for (p = uc->ident.buf; p < end; p += strlen(p) + 1) - if (!strcmp(p, get_ident_string())) - return 1; - return 0; + return !strcmp(uc->ident.buf, get_ident_string()); } -void add_untracked_ident(struct untracked_cache *uc) +static void set_untracked_ident(struct untracked_cache *uc) { - if (ident_in_untracked(uc)) - return; + strbuf_reset(&uc->ident); strbuf_addstr(&uc->ident, get_ident_string()); - /* this strbuf contains a list of strings, save NUL too */ + + /* + * This strbuf used to contain a list of NUL separated + * strings, so save NUL too for backward compatibility. + */ strbuf_addch(&uc->ident, 0); } @@ -1945,15 +1948,21 @@ static void new_untracked_cache(struct index_state *istate) uc->exclude_per_dir = ".gitignore"; /* should be the same flags used by git-status */ uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; + set_untracked_ident(uc); istate->untracked = uc; + istate->cache_changed |= UNTRACKED_CHANGED; } void add_untracked_cache(struct index_state *istate) { if (!istate->untracked) { new_untracked_cache(istate); - add_untracked_ident(istate->untracked); - istate->cache_changed |= UNTRACKED_CHANGED; + } else { + if (!ident_in_untracked(istate->untracked)) { + free_untracked_cache(istate->untracked); + new_untracked_cache(istate); + } + } } void remove_untracked_cache(struct index_state *istate) @@ -2022,7 +2031,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d return NULL; if (!ident_in_untracked(dir->untracked)) { - warning(_("Untracked cache is disabled on this system.")); + warning(_("Untracked cache is disabled on this system or location.")); return NULL; } -- cgit v1.2.1