Skip to content

Commit

Permalink
git-repack: Be careful when updating the same pack as an existing one.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Jun 25, 2006
1 parent 29f4ad8 commit 2ad47d6
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions git-repack.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2ad47d6

Please sign in to comment.