aboutsummaryrefslogtreecommitdiff
path: root/git-tag.sh
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-09-27 02:06:31 -0700
committerJunio C Hamano <junkio@cox.net>2006-09-27 02:06:31 -0700
commitcede7526534c47436de17977eb39e55aa8c1e646 (patch)
tree74296304f26c57dc9727e068374aea2a6a2df794 /git-tag.sh
parentac5409e420e5fdd7c4a381f873ffcedfb83d7117 (diff)
downloadgit-cede7526534c47436de17977eb39e55aa8c1e646.tar.gz
git-cede7526534c47436de17977eb39e55aa8c1e646.tar.xz
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>
Diffstat (limited to 'git-tag.sh')
-rwxr-xr-xgit-tag.sh9
1 files changed, 6 insertions, 3 deletions
diff --git a/git-tag.sh b/git-tag.sh
index a0afa2582..2bde3c05f 100755
--- a/git-tag.sh
+++ b/git-tag.sh
@@ -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"