Unlike the original one, this one only does prefix matches, so you can't do --pretty=er anymore :) This one really works with and without the gitopt changes. Signed-off-by: Eric Wong <normalperson@xxxxxxxx> --- Junio C Hamano <junkio@xxxxxxx> wrote: > Eric Wong <normalperson@xxxxxxxx> writes: > > > commit.c | 42 +++++++++++++++++++++++++++++------------- > > 1 files changed, 29 insertions(+), 13 deletions(-) > > This is applicable without the gitopt changes, but I have a > feeling that when we think about abbreviations the users would > expect the leading substring abbreviation, not strstr(). > > While "git log --pretty=lle" or "git log --pretty=or" might be > unambiguous, I think that is trying to be too cute and > confusing, especially if somebody picks up that habit by > watching others type such a cute abbreviations. > > That comment probably incidentally applies to your bigger > patches. Ok. The current gitopt patch only uses leading substring abbreviations by default. GIT_ABBREV_HARDER needs to be set if you want all the crazyness :) commit.c | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 36 insertions(+), 14 deletions(-) d4473559924b1a5ba655cd5d5b18d39f53e25184 diff --git a/commit.c b/commit.c index 2717dd8..2753677 100644 --- a/commit.c +++ b/commit.c @@ -22,23 +22,45 @@ struct sort_node const char *commit_type = "commit"; +struct cmt_fmt_map { + const char *n; + enum cmit_fmt v; +} cmt_fmts[] = { + { "raw", CMIT_FMT_RAW }, + { "medium", CMIT_FMT_MEDIUM }, + { "short", CMIT_FMT_SHORT }, + { "full", CMIT_FMT_FULL }, + { "fuller", CMIT_FMT_FULLER }, + { "oneline", CMIT_FMT_ONELINE }, +}; + enum cmit_fmt get_commit_format(const char *arg) { - if (!*arg) + int i, found; + size_t len; + + if (!arg || !*arg) return CMIT_FMT_DEFAULT; - if (!strcmp(arg, "=raw")) - return CMIT_FMT_RAW; - if (!strcmp(arg, "=medium")) - return CMIT_FMT_MEDIUM; - if (!strcmp(arg, "=short")) - return CMIT_FMT_SHORT; - if (!strcmp(arg, "=full")) - return CMIT_FMT_FULL; - if (!strcmp(arg, "=fuller")) - return CMIT_FMT_FULLER; - if (!strcmp(arg, "=oneline")) - return CMIT_FMT_ONELINE; - die("invalid --pretty format"); + if (*arg == '=') + arg++; + for (i = 0; i < ARRAY_SIZE(cmt_fmts); i++) { + if (!strcmp(arg, cmt_fmts[i].n)) + return cmt_fmts[i].v; + } + + /* look for abbreviations */ + len = strlen(arg); + found = -1; + for (i = 0; i < ARRAY_SIZE(cmt_fmts); i++) { + if (!strncmp(cmt_fmts[i].n, arg, len)) { + if (found >= 0) + die("invalid --pretty format: %s", arg); + found = i; + } + } + if (found >= 0) + return cmt_fmts[found].v; + die("invalid --pretty format: %s", arg); } static struct commit *check_commit(struct object *obj, -- 1.3.2.g58c0 - : 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