Instead of directly writing to and reading from files in
$GIT_DIR, use ref API to interact with CHERRY_PICK_HEAD
and REVERT_HEAD.
Signed-off-by: David Turner dtur...@twopensource.com
---
branch.c | 4 ++--
builtin/commit.c | 6 +++---
builtin/merge.c | 2 +-
contrib/completion/git-prompt.sh | 4 ++--
git-gui/lib/commit.tcl | 2 +-
sequencer.c | 37 +++--
t/t7509-commit.sh| 4 ++--
wt-status.c | 6 ++
8 files changed, 32 insertions(+), 33 deletions(-)
diff --git a/branch.c b/branch.c
index b002435..ec598aa 100644
--- a/branch.c
+++ b/branch.c
@@ -302,8 +302,8 @@ void create_branch(const char *head,
void remove_branch_state(void)
{
- unlink(git_path(CHERRY_PICK_HEAD));
- unlink(git_path(REVERT_HEAD));
+ delete_ref(CHERRY_PICK_HEAD, NULL, REF_NODEREF);
+ delete_ref(REVERT_HEAD, NULL, REF_NODEREF);
unlink(git_path(MERGE_HEAD));
unlink(git_path(MERGE_RR));
unlink(git_path(MERGE_MSG));
diff --git a/builtin/commit.c b/builtin/commit.c
index b5b1158..53c7e90 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -168,7 +168,7 @@ static void determine_whence(struct wt_status *s)
{
if (file_exists(git_path(MERGE_HEAD)))
whence = FROM_MERGE;
- else if (file_exists(git_path(CHERRY_PICK_HEAD))) {
+ else if (ref_exists(CHERRY_PICK_HEAD)) {
whence = FROM_CHERRY_PICK;
if (file_exists(git_path(SEQ_DIR)))
sequencer_in_use = 1;
@@ -1777,8 +1777,8 @@ int cmd_commit(int argc, const char **argv, const char
*prefix)
}
ref_transaction_free(transaction);
- unlink(git_path(CHERRY_PICK_HEAD));
- unlink(git_path(REVERT_HEAD));
+ delete_ref(CHERRY_PICK_HEAD, NULL, REF_NODEREF);
+ delete_ref(REVERT_HEAD, NULL, REF_NODEREF);
unlink(git_path(MERGE_HEAD));
unlink(git_path(MERGE_MSG));
unlink(git_path(MERGE_MODE));
diff --git a/builtin/merge.c b/builtin/merge.c
index 46aacd6..3e2ae2f 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -1206,7 +1206,7 @@ int cmd_merge(int argc, const char **argv, const char
*prefix)
else
die(_(You have not concluded your merge (MERGE_HEAD
exists).));
}
- if (file_exists(git_path(CHERRY_PICK_HEAD))) {
+ if (ref_exists(CHERRY_PICK_HEAD)) {
if (advice_resolve_conflict)
die(_(You have not concluded your cherry-pick
(CHERRY_PICK_HEAD exists).\n
Please, commit your changes before you merge.));
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 366f0bc..e2c5583 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -415,9 +415,9 @@ __git_ps1 ()
fi
elif [ -f $g/MERGE_HEAD ]; then
r=|MERGING
- elif [ -f $g/CHERRY_PICK_HEAD ]; then
+ elif git rev-parse --quiet --verify CHERRY_PICK_HEAD
/dev/null; then
r=|CHERRY-PICKING
- elif [ -f $g/REVERT_HEAD ]; then
+ elif git rev-parse --quiet --verify REVERT_HEAD /dev/null;
then
r=|REVERTING
elif [ -f $g/BISECT_LOG ]; then
r=|BISECTING
diff --git a/git-gui/lib/commit.tcl b/git-gui/lib/commit.tcl
index 864b687..2b08b13 100644
--- a/git-gui/lib/commit.tcl
+++ b/git-gui/lib/commit.tcl
@@ -409,7 +409,7 @@ A rescan will be automatically started now.
catch {file delete [gitdir MERGE_MSG]}
catch {file delete [gitdir SQUASH_MSG]}
catch {file delete [gitdir GITGUI_MSG]}
- catch {file delete [gitdir CHERRY_PICK_HEAD]}
+ catch {git update-ref -d --no-deref CHERRY_PICK_HEAD}
# -- Let rerere do its thing.
#
diff --git a/sequencer.c b/sequencer.c
index f8421a8..de904aa 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -160,19 +160,20 @@ static void free_message(struct commit *commit, struct
commit_message *msg)
static void write_cherry_pick_head(struct commit *commit, const char
*pseudoref)
{
- const char *filename;
- int fd;
- struct strbuf buf = STRBUF_INIT;
+ struct strbuf err = STRBUF_INIT;
+ void *transaction;
- strbuf_addf(buf, %s\n, sha1_to_hex(commit-object.sha1));
+ transaction = ref_transaction_begin(err);
+ if (!transaction)
+ die(_(Could not create transaction: %s), err.buf);
- filename = git_path(%s, pseudoref);
- fd = open(filename, O_WRONLY | O_CREAT, 0666);
- if (fd 0)
- die_errno(_(Could not open '%s' for writing), filename);
- if (write_in_full(fd, buf.buf, buf.len) != buf.len || close(fd))
- die_errno(_(Could not write