Instead of common_list having formatting like ! and /, use a struct to hold common_list data in a structured form. We don't use 'exclude' yet; instead, we keep the old codepath that handles info/sparse-checkout and logs/HEAD. Later, we will use exclude. Signed-off-by: David Turner <dturner@xxxxxxxxxxxxxxxx> --- Junio was worried about the performance of common_list and the weird string parsing bits of update_common_dir, so this version of the patch series begins by cleaning and optimizing those bits. Additionally, I incorporated Junio's suggestion to use is_per_worktree_ref, and his formatting suggestions. There is now a hack so that git for-each-ref works on per-worktree refs. I also added git-bisect.sh, which I had overzealously reverted during my proofreading step last time. --- path.c | 58 +++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/path.c b/path.c index 10f4cbf..236f797 100644 --- a/path.c +++ b/path.c @@ -91,35 +91,51 @@ static void replace_dir(struct strbuf *buf, int len, const char *newdir) buf->buf[newlen] = '/'; } -static const char *common_list[] = { - "/branches", "/hooks", "/info", "!/logs", "/lost-found", - "/objects", "/refs", "/remotes", "/worktrees", "/rr-cache", "/svn", - "config", "!gc.pid", "packed-refs", "shallow", - NULL +struct common_dir { + const char *dirname; + /* Not considered garbage for report_linked_checkout_garbage */ + unsigned ignore_garbage:1; + unsigned is_dir:1; + /* Not common even though its parent is */ + unsigned exclude:1; +}; + +struct common_dir common_list[] = { + { "branches", 0, 1, 0 }, + { "hooks", 0, 1, 0 }, + { "info", 0, 1, 0 }, + { "info/sparse-checkout", 0, 0, 1 }, + { "logs", 1, 1, 0 }, + { "logs/HEAD", 1, 1, 1 }, + { "lost-found", 0, 1, 0 }, + { "objects", 0, 1, 0 }, + { "refs", 0, 1, 0 }, + { "remotes", 0, 1, 0 }, + { "worktrees", 0, 1, 0 }, + { "rr-cache", 0, 1, 0 }, + { "svn", 0, 1, 0 }, + { "config", 0, 0, 0 }, + { "gc.pid", 1, 0, 0 }, + { "packed-refs", 0, 0, 0 }, + { "shallow", 0, 0, 0 }, + { NULL, 0, 0, 0 } }; static void update_common_dir(struct strbuf *buf, int git_dir_len) { char *base = buf->buf + git_dir_len; - const char **p; + const struct common_dir *p; if (is_dir_file(base, "logs", "HEAD") || is_dir_file(base, "info", "sparse-checkout")) return; /* keep this in $GIT_DIR */ - for (p = common_list; *p; p++) { - const char *path = *p; - int is_dir = 0; - if (*path == '!') - path++; - if (*path == '/') { - path++; - is_dir = 1; - } - if (is_dir && dir_prefix(base, path)) { + for (p = common_list; p->dirname; p++) { + const char *path = p->dirname; + if (p->is_dir && dir_prefix(base, path)) { replace_dir(buf, git_dir_len, get_git_common_dir()); return; } - if (!is_dir && !strcmp(base, path)) { + if (!p->is_dir && !strcmp(base, path)) { replace_dir(buf, git_dir_len, get_git_common_dir()); return; } @@ -129,16 +145,16 @@ static void update_common_dir(struct strbuf *buf, int git_dir_len) void report_linked_checkout_garbage(void) { struct strbuf sb = STRBUF_INIT; - const char **p; + const struct common_dir *p; int len; if (!git_common_dir_env) return; strbuf_addf(&sb, "%s/", get_git_dir()); len = sb.len; - for (p = common_list; *p; p++) { - const char *path = *p; - if (*path == '!') + for (p = common_list; p->dirname; p++) { + const char *path = p->dirname; + if (p->ignore_garbage) continue; strbuf_setlen(&sb, len); strbuf_addstr(&sb, path); -- 2.0.4.315.gad8727a-twtrsrc -- 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