Skip to content

Commit

Permalink
revert: make commit subjects in insn sheet optional
Browse files Browse the repository at this point in the history
Change the instruction sheet format subtly so that the subject of the
commit message that follows the object name is optional.  As a result,
an instruction sheet like this is now perfectly valid:

  pick 35b0426
  pick fbd5bbcbc2e
  pick 7362160f

While at it, also fix a bug introduced by 5a5d80f (revert: Introduce
--continue to continue the operation, 2011-08-04) that failed to read
lines that are too long to fit on the commit-id-shaped buffer we
currently use; eliminate the need for the buffer altogether.  In
addition to literal SHA-1 hexes, you can now safely use expressions
like the following in the instruction sheet:

  featurebranch~4
  rr/revert-cherry-pick-continue^2~12@{12 days ago}

[jc: simplify parsing]

Suggested-by: Jonathan Nieder <jrnieder@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Ramkumar Ramachandra authored and Junio C Hamano committed Dec 15, 2011
1 parent bf3de2b commit 6bc1a23
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 21 deletions.
37 changes: 16 additions & 21 deletions builtin/revert.c
Original file line number Diff line number Diff line change
Expand Up @@ -714,31 +714,27 @@ static int format_todo(struct strbuf *buf, struct commit_list *todo_list,
return 0;
}

static struct commit *parse_insn_line(char *start, struct replay_opts *opts)
static struct commit *parse_insn_line(char *bol, char *eol, struct replay_opts *opts)
{
unsigned char commit_sha1[20];
char sha1_abbrev[40];
enum replay_action action;
int insn_len = 0;
char *p, *q;
char *end_of_object_name;
int saved, status;

if (!prefixcmp(start, "pick ")) {
if (!prefixcmp(bol, "pick ")) {
action = CHERRY_PICK;
insn_len = strlen("pick");
p = start + insn_len + 1;
} else if (!prefixcmp(start, "revert ")) {
bol += strlen("pick ");
} else if (!prefixcmp(bol, "revert ")) {
action = REVERT;
insn_len = strlen("revert");
p = start + insn_len + 1;
bol += strlen("revert ");
} else
return NULL;

q = strchr(p, ' ');
if (!q)
return NULL;
q++;

strlcpy(sha1_abbrev, p, q - p);
end_of_object_name = bol + strcspn(bol, " \n");
saved = *end_of_object_name;
*end_of_object_name = '\0';
status = get_sha1(bol, commit_sha1);
*end_of_object_name = saved;

/*
* Verify that the action matches up with the one in
Expand All @@ -751,7 +747,7 @@ static struct commit *parse_insn_line(char *start, struct replay_opts *opts)
return NULL;
}

if (get_sha1(sha1_abbrev, commit_sha1) < 0)
if (status < 0)
return NULL;

return lookup_commit_reference(commit_sha1);
Expand All @@ -766,13 +762,12 @@ static int parse_insn_buffer(char *buf, struct commit_list **todo_list,
int i;

for (i = 1; *p; i++) {
commit = parse_insn_line(p, opts);
char *eol = strchrnul(p, '\n');
commit = parse_insn_line(p, eol, opts);
if (!commit)
return error(_("Could not parse line %d."), i);
next = commit_list_append(commit, next);
p = strchrnul(p, '\n');
if (*p)
p++;
p = *eol ? eol + 1 : eol;
}
if (!*todo_list)
return error(_("No commits parsed."));
Expand Down
28 changes: 28 additions & 0 deletions t/t3510-cherry-pick-sequence.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ test_description='Test cherry-pick continuation features

. ./test-lib.sh

# Repeat first match 10 times
_r10='\1\1\1\1\1\1\1\1\1\1'

pristine_detach () {
git cherry-pick --quit &&
git checkout -f "$1^0" &&
Expand Down Expand Up @@ -478,4 +481,29 @@ test_expect_success 'empty commit set' '
test_expect_code 128 git cherry-pick base..base
'

test_expect_success 'malformed instruction sheet 3' '
pristine_detach initial &&
test_must_fail git cherry-pick base..anotherpick &&
echo "resolved" >foo &&
git add foo &&
git commit &&
sed "s/pick \([0-9a-f]*\)/pick $_r10/" .git/sequencer/todo >new_sheet &&
cp new_sheet .git/sequencer/todo &&
test_must_fail git cherry-pick --continue
'

test_expect_success 'commit descriptions in insn sheet are optional' '
pristine_detach initial &&
test_must_fail git cherry-pick base..anotherpick &&
echo "c" >foo &&
git add foo &&
git commit &&
cut -d" " -f1,2 .git/sequencer/todo >new_sheet &&
cp new_sheet .git/sequencer/todo &&
git cherry-pick --continue &&
test_path_is_missing .git/sequencer &&
git rev-list HEAD >commits &&
test_line_count = 4 commits
'

test_done

0 comments on commit 6bc1a23

Please sign in to comment.