From: Linus Torvalds Date: Thu, 5 May 2005 01:18:40 +0000 (-0700) Subject: Merge http://members.cox.net/junkio/git-jc.git/ X-Git-Tag: v0.99~646 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=d0d0d0bd3c2c4591ffbc292d7e082e8ad8f2057f;hp=-c;p=git.git Merge http://members.cox.net/junkio/git-jc.git/ --- d0d0d0bd3c2c4591ffbc292d7e082e8ad8f2057f diff --combined fsck-cache.c index e328cec7,5db07e0f..301cc67b --- a/fsck-cache.c +++ b/fsck-cache.c @@@ -12,6 -12,7 +12,7 @@@ static int show_root = 0; static int show_tags = 0; static int show_unreachable = 0; + static int keep_cache_objects = 0; static unsigned char head_sha1[20]; static void check_connectivity(void) @@@ -275,8 -276,12 +276,12 @@@ int main(int argc, char **argv show_root = 1; continue; } + if (!strcmp(arg, "--cache")) { + keep_cache_objects = 1; + continue; + } if (*arg == '-') - usage("fsck-cache [--tags] [[--unreachable] *]"); + usage("fsck-cache [--tags] [[--unreachable] [--cache] *]"); } sha1_dir = getenv(DB_ENVIRONMENT) ? : DEFAULT_DB_ENVIRONMENT; @@@ -295,12 -300,14 +300,12 @@@ continue; if (!get_sha1(arg, head_sha1)) { - struct commit *commit = lookup_commit(head_sha1); - struct object *obj; + struct object *obj = lookup_object(head_sha1); - /* Error is printed by lookup_commit(). */ - if (!commit) + /* Error is printed by lookup_object(). */ + if (!obj) continue; - obj = &commit->object; obj->used = 1; mark_reachable(obj, REACHABLE); heads++; @@@ -309,12 -316,27 +314,27 @@@ error("expected sha1, got %s", arg); } - if (!heads) { + if (keep_cache_objects) { + int i; + read_cache(); + for (i = 0; i < active_nr; i++) { + struct blob *blob = lookup_blob(active_cache[i]->sha1); + struct object *obj; + if (!blob) + continue; + obj = &blob->object; + obj->used = 1; + mark_reachable(obj, REACHABLE); + } + } + + if (!heads && !keep_cache_objects) { if (show_unreachable) { - fprintf(stderr, "unable to do reachability without a head\n"); + fprintf(stderr, "unable to do reachability without a head nor --cache\n"); show_unreachable = 0; } - fprintf(stderr, "expect dangling commits - potential heads - due to lack of head information\n"); + if (!heads) + fprintf(stderr, "expect dangling commits - potential heads - due to lack of head information\n"); } check_connectivity(); diff --combined git-prune-script index a24ba616,30a989e8..9ba89a5b mode 100755,100755..100644 --- a/git-prune-script +++ b/git-prune-script @@@ -1,4 -1,37 +1,36 @@@ #!/bin/sh - REFS=$(cat .git/refs/*/*) - [ "$REFS" ] || exit 1 - git-fsck-cache --unreachable $REFS | grep unreachable | cut -d' ' -f3 | sed 's:^\(..\):.git/objects/\1/:' | xargs -r rm - + dryrun= + while case "$#" in 0) break ;; esac + do + case "$1" in + -n) dryrun=echo ;; + --) break ;; + -*) echo >&2 "usage: git-prune-script [ -n ] [ heads... ]"; exit 1 ;; + *) break ;; + esac + shift; + done + + # Defaulting to include .git/refs/*/* may be debatable from the + # purist POV but power users can always give explicit parameters + # to the script anyway. + + case "$#" in + 0) + x_40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' + x_40="$x_40$x_40$x_40$x_40$x_40$x_40$x_40$x_40" + set x $(sed -ne "/^$x_40\$/p" .git/HEAD .git/refs/*/* 2>/dev/null) + shift ;; + esac + + git-fsck-cache --cache --unreachable "$@" | + sed -ne '/unreachable /{ + s/unreachable [^ ][^ ]* // + s|\(..\)|\1/|p + }' | { + case "$SHA1_FILE_DIRECTORY" in + '') cd .git/objects/ ;; + *) cd "$SHA1_FILE_DIRECTORY" ;; + esac || exit + xargs -r $dryrun rm -f + }