Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- builtin/revert.c | 62 ++++++++++++++++++++++++++++++----------------------- 1 files changed, 35 insertions(+), 27 deletions(-) diff --git a/builtin/revert.c b/builtin/revert.c index eff5268..a611960 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -244,6 +244,40 @@ static NORETURN void die_dirty_index(const char *me) } } +static struct commit * check_parent(struct commit *commit, int mainline) +{ + if (!commit->parents) { + if (action == REVERT) + die ("Cannot revert a root commit"); + return NULL; + } + + if (commit->parents->next) { + /* Reverting or cherry-picking a merge commit */ + int cnt; + struct commit_list *p; + + if (!mainline) + die("Commit %s is a merge but no -m option was given.", + sha1_to_hex(commit->object.sha1)); + + for (cnt = 1, p = commit->parents; + cnt != mainline && p; + cnt++) + p = p->next; + if (cnt != mainline || !p) + die("Commit %s does not have parent %d", + sha1_to_hex(commit->object.sha1), mainline); + return p->item; + } + + if (0 < mainline) + die("Mainline was specified but commit %s is not a merge.", + sha1_to_hex(commit->object.sha1)); + + return commit->parents->item; +} + static int revert_or_cherry_pick(int argc, const char **argv) { unsigned char head[20]; @@ -286,33 +320,7 @@ static int revert_or_cherry_pick(int argc, const char **argv) index_fd = hold_locked_index(&index_lock, 1); - if (!commit->parents) { - if (action == REVERT) - die ("Cannot revert a root commit"); - parent = NULL; - } - else if (commit->parents->next) { - /* Reverting or cherry-picking a merge commit */ - int cnt; - struct commit_list *p; - - if (!mainline) - die("Commit %s is a merge but no -m option was given.", - sha1_to_hex(commit->object.sha1)); - - for (cnt = 1, p = commit->parents; - cnt != mainline && p; - cnt++) - p = p->next; - if (cnt != mainline || !p) - die("Commit %s does not have parent %d", - sha1_to_hex(commit->object.sha1), mainline); - parent = p->item; - } else if (0 < mainline) - die("Mainline was specified but commit %s is not a merge.", - sha1_to_hex(commit->object.sha1)); - else - parent = commit->parents->item; + parent = check_parent(commit, mainline); if (!(message = commit->buffer)) die ("Cannot get commit message for %s", -- 1.7.0.315.gbc198 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html