Brian Gernhardt <benji@xxxxxxxxxxxxxxxxxx> writes: >> ** jc/reflog (Thu Dec 14 15:58:56 2006 -0800) 1 commit >> - Teach show-branch how to show ref-log data. >> >> A strawman to make reflog data a bit more browsable; it would be >> useful while recovering from a mistake you made recently. Not >> essential and can wait or be dropped if people do not find it >> useful. > > I'd prefer not to add clutter into show-branch. I use it on a regular > basis to see what I've added to what topic branch recently, and to > look at branches before rebasing. It also just seems like the wrong > place to have that kind of data, although I guess it's more useful > for people who do merges more often than I do. I happen to find it a reasonable way to present how a topic was rewind and rebuilt, but I think that is I rewind my internal topic (i.e. the parts that have not been merged into 'next' yet) all the time. > What about a "git reflog [<branch>]" command instead? Would show > output similar to "git log" (or "git show-branch" for brevity). This is not a 'git reflog' command, but is another way to show the tips of reflog entries (use it with 'git show'). I find the show-branch variant easier to see, but you can judge for yourself. This happens to show why pruning while not culling reflog entries is a bad idea. If your master@{2} is gone due to rewind and prune, and master@{0}, master@{1} and master@{3} are still available, the pattern master@{0..3} would not give you a usable result. -- >8 -- This allows you to add between Nth and Mth (inclusive) reflog entries. "git show master@{1} master@{2} master@{3}" is equivalent to "git show master@{1..3}". Signed-off-by: Junio C Hamano <junkio@xxxxxxx> --- revision.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) diff --git a/revision.c b/revision.c index 993bb66..3f1d65e 100644 --- a/revision.c +++ b/revision.c @@ -592,6 +592,59 @@ static void prepare_show_merge(struct rev_info *revs) revs->prune_data = prune; } +static int parse_digits(const char *p, int len) +{ + int accum = 0; + while (0 < len--) { + int ch = *p++; + if ('0' <= ch && ch <= '9') + accum = accum * 10 + ch - '0'; + else + return -1; + } + return accum; +} + +static int list_of_reflog_entries(const char *arg, const char *dotdot, + struct rev_info *revs, int flags) +{ + /* + * "ref@{N..M}" -- push them for "git show". + * dotdot points at the first dot + */ + int n, m, i, added; + int len; + char *at_brace = strstr(arg, "@{"); + + + if (!at_brace) + return 0; + len = strlen(arg); + if (arg[len-1] != '}') + return 0; + if ((m = parse_digits(dotdot + 2, len - (dotdot - arg) - 3)) < 0) + return 0; + if ((n = parse_digits(at_brace + 2, dotdot - at_brace - 2)) < 0) + return 0; + if (n > m) + return 0; + + added = 0; + for (i = n; i <= m; i++) { + char buf[1024]; + unsigned char sha1[20]; + + snprintf(buf, sizeof(buf), "%.*s@{%d}", + (int) (at_brace - arg), arg, i); + if (!get_sha1(buf, sha1)) { + /* this is synthetic -- do not check filename */ + handle_revision_arg(buf, revs, flags, 1); + added = 1; + } + } + return added; +} + int handle_revision_arg(const char *arg, struct rev_info *revs, int flags, int cant_be_filename) @@ -648,7 +701,13 @@ int handle_revision_arg(const char *arg, struct rev_info *revs, add_pending_object(revs, &b->object, next); return 0; } + *dotdot = '.'; + + /* It could be ref@{N..M} */ + if (list_of_reflog_entries(arg, dotdot, revs, flags)) + return 0; + } dotdot = strstr(arg, "^@"); if (dotdot && !dotdot[2]) { -- 1.4.4.2.g83c5 - 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