update a few Porcelain-ish for ref lock safety.
This updates the use of git-update-ref in git-branch, git-tag and git-commit to make them safer in a few corner cases as demonstration. - git-tag makes sure that the named tag does not exist, allows you to edit tag message and then creates the tag. If a tag with the same name was created by somebody else in the meantime, it used to happily overwrote it. Now it notices the situation. - git-branch -d and git-commit (for the initial commit) had the same issue but with smaller race window, which is plugged with this. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
@ -63,8 +63,11 @@ done
|
||||
|
||||
name="$1"
|
||||
[ "$name" ] || usage
|
||||
if [ -e "$GIT_DIR/refs/tags/$name" -a -z "$force" ]; then
|
||||
die "tag '$name' already exists"
|
||||
prev=0000000000000000000000000000000000000000
|
||||
if test -e "$GIT_DIR/refs/tags/$name"
|
||||
then
|
||||
test -n "$force" || die "tag '$name' already exists"
|
||||
prev=`git rev-parse "refs/tags/$name"`
|
||||
fi
|
||||
shift
|
||||
git-check-ref-format "tags/$name" ||
|
||||
@ -109,4 +112,4 @@ fi
|
||||
|
||||
leading=`expr "refs/tags/$name" : '\(.*\)/'` &&
|
||||
mkdir -p "$GIT_DIR/$leading" &&
|
||||
echo $object > "$GIT_DIR/refs/tags/$name"
|
||||
GIT_DIR="$GIT_DIR" git update-ref "refs/tags/$name" "$object" "$prev"
|
||||
|
Reference in New Issue
Block a user