summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-06-25 05:28:58 -0700
committerJunio C Hamano <junkio@cox.net>2006-06-25 05:28:58 -0700
commit2ad47d61b93e4027bd20f71963dcf1429dccc1fa (patch)
tree6fc480d6f11ba66bf1ed90cadfd2a4b3bb3b2aa3
parent29f4ad867cd15f4029c280c417f4a0866d5229a9 (diff)
downloadgit-2ad47d61b93e4027bd20f71963dcf1429dccc1fa.tar.gz
git-repack: Be careful when updating the same pack as an existing one.
After a clone, packfiles are read-only by default and "mv" to replace the pack with a new one goes interactive, asking if the user wants to replace it. If one is successfully moved and the other is not, the pack and its idx would become out-of-sync and corrupts the repository. Recovering is straightforward -- it is just the matter of finding the remaining .tmp-pack-* and make sure they are both moved -- but we should be extra careful not to do something so alarming to the users. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-xgit-repack.sh21
1 files changed, 18 insertions, 3 deletions
diff --git a/git-repack.sh b/git-repack.sh
index eb75c8cda9..640ad8d90b 100755
--- a/git-repack.sh
+++ b/git-repack.sh
@@ -54,9 +54,24 @@ else
fi
mkdir -p "$PACKDIR" || exit
- mv .tmp-pack-$name.pack "$PACKDIR/pack-$name.pack" &&
- mv .tmp-pack-$name.idx "$PACKDIR/pack-$name.idx" ||
- exit
+ for sfx in pack idx
+ do
+ if test -f "$PACKDIR/pack-$name.$sfx"
+ then
+ mv -f "$PACKDIR/pack-$name.$sfx" \
+ "$PACKDIR/old-pack-$name.$sfx"
+ fi
+ done &&
+ mv -f .tmp-pack-$name.pack "$PACKDIR/pack-$name.pack" &&
+ mv -f .tmp-pack-$name.idx "$PACKDIR/pack-$name.idx" &&
+ test -f "$PACKDIR/pack-$name.pack" &&
+ test -f "$PACKDIR/pack-$name.idx" || {
+ echo >&2 "Couldn't replace the existing pack with updated one."
+ echo >&2 "The original set of packs have been saved as"
+ echo >&2 "old-pack-$name.{pack,idx} in $PACKDIR."
+ exit 1
+ }
+ rm -f "$PACKDIR/old-pack-$name.pack" "$PACKDIR/old-pack-$name.idx"
fi
if test "$remove_redundant" = t