From: Christian Couder Date: Wed, 03 Mar 2010 20:11:39 GMT Subject: [PATCH v3 4/9] revert: refactor checking parent in a check_parent() function Message-ID: <20100303201146.23506.21157.chriscool@tuxfamily.org> In-Reply-To: <20100303201046.23506.32653.chriscool@tuxfamily.org> Signed-off-by: Christian Couder --- 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