Merge branch 'jk/reset-reflog-message-fix'

* jk/reset-reflog-message-fix:
  reset: give better reflog messages
This commit is contained in:
Junio C Hamano 2011-08-08 12:33:33 -07:00
commit 75745bc704
2 changed files with 20 additions and 37 deletions

View File

@ -33,25 +33,6 @@ static const char *reset_type_names[] = {
N_("mixed"), N_("soft"), N_("hard"), N_("merge"), N_("keep"), NULL N_("mixed"), N_("soft"), N_("hard"), N_("merge"), N_("keep"), NULL
}; };
static char *args_to_str(const char **argv)
{
char *buf = NULL;
unsigned long len, space = 0, nr = 0;
for (; *argv; argv++) {
len = strlen(*argv);
ALLOC_GROW(buf, nr + 1 + len, space);
if (nr)
buf[nr++] = ' ';
memcpy(buf + nr, *argv, len);
nr += len;
}
ALLOC_GROW(buf, nr + 1, space);
buf[nr] = '\0';
return buf;
}
static inline int is_merge(void) static inline int is_merge(void)
{ {
return !access(git_path("MERGE_HEAD"), F_OK); return !access(git_path("MERGE_HEAD"), F_OK);
@ -215,14 +196,18 @@ static int read_from_tree(const char *prefix, const char **argv,
return update_index_refresh(index_fd, lock, refresh_flags); return update_index_refresh(index_fd, lock, refresh_flags);
} }
static void prepend_reflog_action(const char *action, char *buf, size_t size) static void set_reflog_message(struct strbuf *sb, const char *action,
const char *rev)
{ {
const char *sep = ": ";
const char *rla = getenv("GIT_REFLOG_ACTION"); const char *rla = getenv("GIT_REFLOG_ACTION");
if (!rla)
rla = sep = ""; strbuf_reset(sb);
if (snprintf(buf, size, "%s%s%s", rla, sep, action) >= size) if (rla)
warning(_("Reflog action message too long: %.*s..."), 50, buf); strbuf_addf(sb, "%s: %s", rla, action);
else if (rev)
strbuf_addf(sb, "reset: moving to %s", rev);
else
strbuf_addf(sb, "reset: %s", action);
} }
static void die_if_unmerged_cache(int reset_type) static void die_if_unmerged_cache(int reset_type)
@ -241,7 +226,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
unsigned char sha1[20], *orig = NULL, sha1_orig[20], unsigned char sha1[20], *orig = NULL, sha1_orig[20],
*old_orig = NULL, sha1_old_orig[20]; *old_orig = NULL, sha1_old_orig[20];
struct commit *commit; struct commit *commit;
char *reflog_action, msg[1024]; struct strbuf msg = STRBUF_INIT;
const struct option options[] = { const struct option options[] = {
OPT__QUIET(&quiet, "be quiet, only report errors"), OPT__QUIET(&quiet, "be quiet, only report errors"),
OPT_SET_INT(0, "mixed", &reset_type, OPT_SET_INT(0, "mixed", &reset_type,
@ -261,8 +246,6 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, git_reset_usage, argc = parse_options(argc, argv, prefix, options, git_reset_usage,
PARSE_OPT_KEEP_DASHDASH); PARSE_OPT_KEEP_DASHDASH);
reflog_action = args_to_str(argv);
setenv("GIT_REFLOG_ACTION", reflog_action, 0);
/* /*
* Possible arguments are: * Possible arguments are:
@ -357,13 +340,13 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
old_orig = sha1_old_orig; old_orig = sha1_old_orig;
if (!get_sha1("HEAD", sha1_orig)) { if (!get_sha1("HEAD", sha1_orig)) {
orig = sha1_orig; orig = sha1_orig;
prepend_reflog_action("updating ORIG_HEAD", msg, sizeof(msg)); set_reflog_message(&msg, "updating ORIG_HEAD", NULL);
update_ref(msg, "ORIG_HEAD", orig, old_orig, 0, MSG_ON_ERR); update_ref(msg.buf, "ORIG_HEAD", orig, old_orig, 0, MSG_ON_ERR);
} }
else if (old_orig) else if (old_orig)
delete_ref("ORIG_HEAD", old_orig, 0); delete_ref("ORIG_HEAD", old_orig, 0);
prepend_reflog_action("updating HEAD", msg, sizeof(msg)); set_reflog_message(&msg, "updating HEAD", rev);
update_ref_status = update_ref(msg, "HEAD", sha1, orig, 0, MSG_ON_ERR); update_ref_status = update_ref(msg.buf, "HEAD", sha1, orig, 0, MSG_ON_ERR);
switch (reset_type) { switch (reset_type) {
case HARD: case HARD:
@ -380,7 +363,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
remove_branch_state(); remove_branch_state();
free(reflog_action); strbuf_release(&msg);
return update_ref_status; return update_ref_status;
} }

View File

@ -21,10 +21,10 @@ test_expect_success 'setup reflog with alternating commits' '
test_expect_success 'reflog shows all entries' ' test_expect_success 'reflog shows all entries' '
cat >expect <<-\EOF cat >expect <<-\EOF
topic@{0} two: updating HEAD topic@{0} reset: moving to two
topic@{1} one: updating HEAD topic@{1} reset: moving to one
topic@{2} two: updating HEAD topic@{2} reset: moving to two
topic@{3} one: updating HEAD topic@{3} reset: moving to one
topic@{4} branch: Created from HEAD topic@{4} branch: Created from HEAD
EOF EOF
git log -g --format="%gd %gs" topic >actual && git log -g --format="%gd %gs" topic >actual &&