Treat CHERRY_PICK_HEAD as a pseudo ref

Check for existence and delete CHERRY_PICK_HEAD through pseudo ref functions.
This will help cherry-pick work with alternate ref storage backends.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Han-Wen Nienhuys
2020-06-16 19:20:31 +00:00
committed by Junio C Hamano
parent c69b75b7d9
commit 7bff03216e
6 changed files with 52 additions and 38 deletions

View File

@ -847,21 +847,25 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS &&
!merge_contains_scissors)
wt_status_add_cut_line(s->fp);
status_printf_ln(s, GIT_COLOR_NORMAL,
whence == FROM_MERGE
? _("\n"
if (whence == FROM_MERGE)
status_printf_ln(
s, GIT_COLOR_NORMAL,
_("\n"
"It looks like you may be committing a merge.\n"
"If this is not correct, please remove the file\n"
" %s\n"
"and try again.\n")
: _("\n"
"It looks like you may be committing a cherry-pick.\n"
"If this is not correct, please remove the file\n"
" %s\n"
"and try again.\n"),
whence == FROM_MERGE ?
git_path_merge_head(the_repository) :
git_path_cherry_pick_head(the_repository));
git_path_merge_head(the_repository));
else
status_printf_ln(
s, GIT_COLOR_NORMAL,
_("\n"
"It looks like you may be committing a cherry-pick.\n"
"If this is not correct, please run\n"
" git cherry-pick --abort\n"
"and try again.\n"));
}
fprintf(s->fp, "\n");

View File

@ -1353,7 +1353,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(the_repository))) {
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."));

1
path.c
View File

@ -1528,7 +1528,6 @@ char *xdg_cache_home(const char *filename)
return NULL;
}
REPO_GIT_PATH_FUNC(cherry_pick_head, "CHERRY_PICK_HEAD")
REPO_GIT_PATH_FUNC(revert_head, "REVERT_HEAD")
REPO_GIT_PATH_FUNC(squash_msg, "SQUASH_MSG")
REPO_GIT_PATH_FUNC(merge_msg, "MERGE_MSG")

7
path.h
View File

@ -170,7 +170,6 @@ void report_linked_checkout_garbage(void);
}
struct path_cache {
const char *cherry_pick_head;
const char *revert_head;
const char *squash_msg;
const char *merge_msg;
@ -182,9 +181,11 @@ struct path_cache {
const char *shallow;
};
#define PATH_CACHE_INIT { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
#define PATH_CACHE_INIT \
{ \
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL \
}
const char *git_path_cherry_pick_head(struct repository *r);
const char *git_path_revert_head(struct repository *r);
const char *git_path_squash_msg(struct repository *r);
const char *git_path_merge_msg(struct repository *r);

View File

@ -381,7 +381,8 @@ static void print_advice(struct repository *r, int show_hint,
* (typically rebase --interactive) wants to take care
* of the commit itself so remove CHERRY_PICK_HEAD
*/
unlink(git_path_cherry_pick_head(r));
refs_delete_pseudoref(get_main_ref_store(r), "CHERRY_PICK_HEAD",
NULL);
return;
}
@ -1455,7 +1456,8 @@ static int do_commit(struct repository *r,
author, opts, flags, &oid);
strbuf_release(&sb);
if (!res) {
unlink(git_path_cherry_pick_head(r));
refs_delete_pseudoref(get_main_ref_store(r),
"CHERRY_PICK_HEAD", NULL);
unlink(git_path_merge_msg(r));
if (!is_rebase_i(opts))
print_commit_summary(r, NULL, &oid,
@ -1966,7 +1968,8 @@ static int do_pick_commit(struct repository *r,
flags |= ALLOW_EMPTY;
} else if (allow == 2) {
drop_commit = 1;
unlink(git_path_cherry_pick_head(r));
refs_delete_pseudoref(get_main_ref_store(r), "CHERRY_PICK_HEAD",
NULL);
unlink(git_path_merge_msg(r));
fprintf(stderr,
_("dropping %s %s -- patch contents already upstream\n"),
@ -2305,8 +2308,10 @@ void sequencer_post_commit_cleanup(struct repository *r, int verbose)
struct replay_opts opts = REPLAY_OPTS_INIT;
int need_cleanup = 0;
if (file_exists(git_path_cherry_pick_head(r))) {
if (!unlink(git_path_cherry_pick_head(r)) && verbose)
if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
if (!refs_delete_pseudoref(get_main_ref_store(r),
"CHERRY_PICK_HEAD", NULL) &&
verbose)
warning(_("cancelling a cherry picking in progress"));
opts.action = REPLAY_PICK;
need_cleanup = 1;
@ -2671,8 +2676,9 @@ static int create_seq_dir(struct repository *r)
enum replay_action action;
const char *in_progress_error = NULL;
const char *in_progress_advice = NULL;
unsigned int advise_skip = file_exists(git_path_revert_head(r)) ||
file_exists(git_path_cherry_pick_head(r));
unsigned int advise_skip =
file_exists(git_path_revert_head(r)) ||
refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD");
if (!sequencer_get_last_command(r, &action)) {
switch (action) {
@ -2771,7 +2777,7 @@ static int rollback_single_pick(struct repository *r)
{
struct object_id head_oid;
if (!file_exists(git_path_cherry_pick_head(r)) &&
if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
!file_exists(git_path_revert_head(r)))
return error(_("no cherry-pick or revert in progress"));
if (read_ref_full("HEAD", 0, &head_oid, NULL))
@ -2874,7 +2880,8 @@ int sequencer_skip(struct repository *r, struct replay_opts *opts)
}
break;
case REPLAY_PICK:
if (!file_exists(git_path_cherry_pick_head(r))) {
if (!refs_ref_exists(get_main_ref_store(r),
"CHERRY_PICK_HEAD")) {
if (action != REPLAY_PICK)
return error(_("no cherry-pick in progress"));
if (!rollback_is_safe())
@ -3569,7 +3576,8 @@ static int do_merge(struct repository *r,
oid_to_hex(&j->item->object.oid));
strbuf_release(&ref_name);
unlink(git_path_cherry_pick_head(r));
refs_delete_pseudoref(get_main_ref_store(r), "CHERRY_PICK_HEAD",
NULL);
rollback_lock_file(&lock);
rollback_lock_file(&lock);
@ -4201,7 +4209,7 @@ static int continue_single_pick(struct repository *r)
{
const char *argv[] = { "commit", NULL };
if (!file_exists(git_path_cherry_pick_head(r)) &&
if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
!file_exists(git_path_revert_head(r)))
return error(_("no cherry-pick or revert in progress"));
return run_command_v_opt(argv, RUN_GIT_CMD);
@ -4318,9 +4326,10 @@ static int commit_staged_changes(struct repository *r,
}
if (is_clean) {
const char *cherry_pick_head = git_path_cherry_pick_head(r);
if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
if (refs_ref_exists(get_main_ref_store(r),
"CHERRY_PICK_HEAD") &&
refs_delete_pseudoref(get_main_ref_store(r),
"CHERRY_PICK_HEAD", NULL))
return error(_("could not remove CHERRY_PICK_HEAD"));
if (!final_fixup)
return 0;
@ -4379,7 +4388,8 @@ int sequencer_continue(struct repository *r, struct replay_opts *opts)
if (!is_rebase_i(opts)) {
/* Verify that the conflict has been resolved */
if (file_exists(git_path_cherry_pick_head(r)) ||
if (refs_ref_exists(get_main_ref_store(r),
"CHERRY_PICK_HEAD") ||
file_exists(git_path_revert_head(r))) {
res = continue_single_pick(r);
if (res)
@ -5439,7 +5449,7 @@ int todo_list_rearrange_squash(struct todo_list *todo_list)
int sequencer_determine_whence(struct repository *r, enum commit_whence *whence)
{
if (file_exists(git_path_cherry_pick_head(r))) {
if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
struct object_id cherry_pick_head, rebase_head;
if (file_exists(git_path_seq_dir()))

View File

@ -1636,7 +1636,7 @@ void wt_status_get_state(struct repository *r,
state->merge_in_progress = 1;
} else if (wt_status_check_rebase(NULL, state)) {
; /* all set */
} else if (!stat(git_path_cherry_pick_head(r), &st) &&
} else if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
!get_oid("CHERRY_PICK_HEAD", &oid)) {
state->cherry_pick_in_progress = 1;
oidcpy(&state->cherry_pick_head_oid, &oid);