Signed-off-by: Christian Couder <chriscool@xxxxxxxxxxxxx> --- builtin-reset.c | 43 +++++++++++++++++++++++++++---------------- 1 files changed, 27 insertions(+), 16 deletions(-) diff --git a/builtin-reset.c b/builtin-reset.c index 0f5022e..3569695 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -211,15 +211,38 @@ static void prepend_reflog_action(const char *action, char *buf, size_t size) warning("Reflog action message too long: %.*s...", 50, buf); } +/* + * Any resets update HEAD to the head being switched to, + * saving the previous head in ORIG_HEAD before. + */ +static int update_heads(unsigned char *sha1) +{ + unsigned char sha1_orig[20], *orig = NULL, + sha1_old_orig[20], *old_orig = NULL; + char msg[1024]; + + if (!get_sha1("ORIG_HEAD", sha1_old_orig)) + old_orig = sha1_old_orig; + if (!get_sha1("HEAD", sha1_orig)) { + orig = sha1_orig; + prepend_reflog_action("updating ORIG_HEAD", msg, sizeof(msg)); + update_ref(msg, "ORIG_HEAD", orig, old_orig, 0, MSG_ON_ERR); + } + else if (old_orig) + delete_ref("ORIG_HEAD", old_orig, 0); + prepend_reflog_action("updating HEAD", msg, sizeof(msg)); + + return update_ref(msg, "HEAD", sha1, orig, 0, MSG_ON_ERR); +} + int cmd_reset(int argc, const char **argv, const char *prefix) { int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0; int patch_mode = 0; const char *rev = "HEAD"; - unsigned char sha1[20], *orig = NULL, sha1_orig[20], - *old_orig = NULL, sha1_old_orig[20]; + unsigned char sha1[20]; struct commit *commit; - char *reflog_action, msg[1024]; + char *reflog_action; const struct option options[] = { OPT__QUIET(&quiet), OPT_SET_INT(0, "mixed", &reset_type, @@ -321,19 +344,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) else if (reset_index_file(sha1, reset_type, quiet)) die("Could not reset index file to revision '%s'.", rev); - /* Any resets update HEAD to the head being switched to, - * saving the previous head in ORIG_HEAD before. */ - if (!get_sha1("ORIG_HEAD", sha1_old_orig)) - old_orig = sha1_old_orig; - if (!get_sha1("HEAD", sha1_orig)) { - orig = sha1_orig; - prepend_reflog_action("updating ORIG_HEAD", msg, sizeof(msg)); - update_ref(msg, "ORIG_HEAD", orig, old_orig, 0, MSG_ON_ERR); - } - else if (old_orig) - delete_ref("ORIG_HEAD", old_orig, 0); - prepend_reflog_action("updating HEAD", msg, sizeof(msg)); - update_ref_status = update_ref(msg, "HEAD", sha1, orig, 0, MSG_ON_ERR); + update_ref_status = update_heads(sha1); switch (reset_type) { case HARD: -- 1.6.6.1.557.g77031 -- 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