summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: ac5409e)
raw | patch | inline | side by side (parent: ac5409e)
author | Junio C Hamano <junkio@cox.net> | |
Wed, 27 Sep 2006 09:06:31 +0000 (02:06 -0700) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Wed, 27 Sep 2006 09:06:31 +0000 (02:06 -0700) |
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>
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>
git-branch.sh | patch | blob | history | |
git-commit.sh | patch | blob | history | |
git-tag.sh | patch | blob | history |
diff --git a/git-branch.sh b/git-branch.sh
index 2600e9c4a81a0d3aa0d23bde23b6b0b34256b4d2..4379a07210cf30c5d6e5abdb36722985983edb46 100755 (executable)
--- a/git-branch.sh
+++ b/git-branch.sh
esac
;;
esac
- rm -f "$GIT_DIR/logs/refs/heads/$branch_name"
- rm -f "$GIT_DIR/refs/heads/$branch_name"
+ git update-ref -d "refs/heads/$branch_name" "$branch"
echo "Deleted branch $branch_name."
done
exit 0
git-check-ref-format "heads/$branchname" ||
die "we do not like '$branchname' as a branch name."
+prev=''
if git-show-ref --verify --quiet -- "refs/heads/$branchname"
then
if test '' = "$force"
then
die "cannot force-update the current branch."
fi
+ prev=`git rev-parse --verify "refs/heads/$branchname"`
fi
if test "$create_log" = 'yes'
then
mkdir -p $(dirname "$GIT_DIR/logs/refs/heads/$branchname")
touch "$GIT_DIR/logs/refs/heads/$branchname"
fi
-git update-ref -m "branch: Created from $head" "refs/heads/$branchname" $rev
+git update-ref -m "branch: Created from $head" "refs/heads/$branchname" "$rev" "$prev"
diff --git a/git-commit.sh b/git-commit.sh
index 5a4c659b6fb5f0b23c6a10b0e3bd69893d9c380a..ee5a165e74a4d3a0d204ebe10650688050547b90 100755 (executable)
--- a/git-commit.sh
+++ b/git-commit.sh
PARENTS=$(git-cat-file commit HEAD |
sed -n -e '/^$/q' -e 's/^parent /-p /p')
fi
- current=$(git-rev-parse --verify HEAD)
+ current="$(git-rev-parse --verify HEAD)"
else
if [ -z "$(git-ls-files)" ]; then
echo >&2 Nothing to commit
exit 1
fi
PARENTS=""
- current=
rloga='commit (initial)'
+ current=''
fi
if test -z "$no_edit"
fi &&
commit=$(cat "$GIT_DIR"/COMMIT_MSG | git-commit-tree $tree $PARENTS) &&
rlogm=$(sed -e 1q "$GIT_DIR"/COMMIT_MSG) &&
- git-update-ref -m "$rloga: $rlogm" HEAD $commit $current &&
+ git-update-ref -m "$rloga: $rlogm" HEAD $commit "$current" &&
rm -f -- "$GIT_DIR/MERGE_HEAD" &&
if test -f "$NEXT_INDEX"
then
diff --git a/git-tag.sh b/git-tag.sh
index a0afa25821b5438f41abfed3a2f27bd22767c3d6..2bde3c05fc1def12c68954bbc79e0879555bfe92 100755 (executable)
--- a/git-tag.sh
+++ b/git-tag.sh
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" ||
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"