diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-09-01 14:05:05 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-09-01 14:05:05 -0700 |
commit | af6c6e0b19dc396849e7e09727044ba1a725e811 (patch) | |
tree | d8734727ffddc4c6f3faf76cf0868fc93c6b2364 | |
parent | c7f649a794250ca680569bd8c2466af42acb434a (diff) | |
parent | be7c6d467e8cc4104e1a15e8ff2d7b207624c685 (diff) | |
download | git-af6c6e0b19dc396849e7e09727044ba1a725e811.tar.gz git-af6c6e0b19dc396849e7e09727044ba1a725e811.tar.xz |
Merge branch 'gp/pack-refs-remove-empty-dirs' into maint
* gp/pack-refs-remove-empty-dirs:
pack-refs: remove newly empty directories
-rw-r--r-- | pack-refs.c | 32 | ||||
-rwxr-xr-x | t/t3210-pack-refs.sh | 6 |
2 files changed, 38 insertions, 0 deletions
diff --git a/pack-refs.c b/pack-refs.c index 7f43f8ac3..129057026 100644 --- a/pack-refs.c +++ b/pack-refs.c @@ -60,6 +60,37 @@ static int handle_one_ref(const char *path, const unsigned char *sha1, return 0; } +/* + * Remove empty parents, but spare refs/ and immediate subdirs. + * Note: munges *name. + */ +static void try_remove_empty_parents(char *name) +{ + char *p, *q; + int i; + p = name; + for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */ + while (*p && *p != '/') + p++; + /* tolerate duplicate slashes; see check_ref_format() */ + while (*p == '/') + p++; + } + for (q = p; *q; q++) + ; + while (1) { + while (q > p && *q != '/') + q--; + while (q > p && *(q-1) == '/') + q--; + if (q == p) + break; + *q = '\0'; + if (rmdir(git_path("%s", name))) + break; + } +} + /* make sure nobody touched the ref, and unlink */ static void prune_ref(struct ref_to_prune *r) { @@ -68,6 +99,7 @@ static void prune_ref(struct ref_to_prune *r) if (lock) { unlink_or_warn(git_path("%s", r->name)); unlock_ref(lock); + try_remove_empty_parents(r->name); } } diff --git a/t/t3210-pack-refs.sh b/t/t3210-pack-refs.sh index 525174013..cd04361df 100755 --- a/t/t3210-pack-refs.sh +++ b/t/t3210-pack-refs.sh @@ -60,6 +60,12 @@ test_expect_success 'see if git pack-refs --prune remove ref files' ' ! test -f .git/refs/heads/f ' +test_expect_success 'see if git pack-refs --prune removes empty dirs' ' + git branch r/s/t && + git pack-refs --all --prune && + ! test -e .git/refs/heads/r +' + test_expect_success \ 'git branch g should work when git branch g/h has been deleted' \ 'git branch g/h && |