Browse Source

pretty: add aliases for pretty formats

previously the only ways to alias a --pretty format within git were
either to set the format as your default format (via the format.pretty
configuration variable), or by using a regular git alias. This left the
definition of more complicated formats to the realm of "builtin or
nothing", with user-defined formats usually being reserved for quick
one-offs.

Here we allow user-defined formats to enjoy more or less the same
benefits of builtins. By defining pretty.myalias, "myalias" can be
used in place of whatever would normally come after --pretty=. This
can be a format:, tformat:, raw (ie, defaulting to tformat), or the name
of another builtin or user-defined pretty format.

Signed-off-by: Will Palmer <wmpalmer@gmail.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Will Palmer 15 years ago committed by Junio C Hamano
parent
commit
8028184eec
  1. 10
      Documentation/config.txt
  2. 7
      Documentation/pretty-formats.txt
  3. 57
      pretty.c
  4. 74
      t/t4205-log-pretty-formats.sh

10
Documentation/config.txt

@ -1466,6 +1466,16 @@ pager.<cmd>:: @@ -1466,6 +1466,16 @@ pager.<cmd>::
it takes precedence over this option. To disable pagination for
all commands, set `core.pager` or `GIT_PAGER` to `cat`.

pretty.<name>::
Alias for a --pretty= format string, as specified in
linkgit:git-log[1]. Any aliases defined here can be used just
as the built-in pretty formats could. For example,
running `git config pretty.changelog "format:{asterisk} %H %s"`
would cause the invocation `git log --pretty=changelog`
to be equivalent to running `git log "--pretty=format:{asterisk} %H %s"`.
Note that an alias with the same name as a built-in format
will be silently ignored.

pull.octopus::
The default merge strategy to use when pulling multiple branches
at once.

7
Documentation/pretty-formats.txt

@ -11,7 +11,12 @@ have limited your view of history: for example, if you are @@ -11,7 +11,12 @@ have limited your view of history: for example, if you are
only interested in changes related to a certain directory or
file.

Here are some additional details for each format:
There are several built-in formats, and you can define
additional formats by setting a pretty.<name>
config option to either another format name, or a
'format:' string, as described below (see
linkgit:git-config[1]). Here are the details of the
built-in formats:

* 'oneline'


57
pretty.c

@ -18,7 +18,9 @@ static struct cmt_fmt_map { @@ -18,7 +18,9 @@ static struct cmt_fmt_map {
int is_alias;
const char *user_format;
} *commit_formats;
static size_t builtin_formats_len;
static size_t commit_formats_len;
static size_t commit_formats_alloc;
static struct cmt_fmt_map *find_commit_format(const char *sought);

static void save_user_format(struct rev_info *rev, const char *cp, int is_tformat)
@ -30,6 +32,51 @@ static void save_user_format(struct rev_info *rev, const char *cp, int is_tforma @@ -30,6 +32,51 @@ static void save_user_format(struct rev_info *rev, const char *cp, int is_tforma
rev->commit_format = CMIT_FMT_USERFORMAT;
}

static int git_pretty_formats_config(const char *var, const char *value, void *cb)
{
struct cmt_fmt_map *commit_format = NULL;
const char *name;
const char *fmt;
int i;

if (prefixcmp(var, "pretty."))
return 0;

name = var + strlen("pretty.");
for (i = 0; i < builtin_formats_len; i++) {
if (!strcmp(commit_formats[i].name, name))
return 0;
}

for (i = builtin_formats_len; i < commit_formats_len; i++) {
if (!strcmp(commit_formats[i].name, name)) {
commit_format = &commit_formats[i];
break;
}
}

if (!commit_format) {
ALLOC_GROW(commit_formats, commit_formats_len+1,
commit_formats_alloc);
commit_format = &commit_formats[commit_formats_len];
commit_formats_len++;
}

commit_format->name = xstrdup(name);
commit_format->format = CMIT_FMT_USERFORMAT;
git_config_string(&fmt, var, value);
if (!prefixcmp(fmt, "format:") || !prefixcmp(fmt, "tformat:")) {
commit_format->is_tformat = fmt[0] == 't';
fmt = strchr(fmt, ':') + 1;
} else if (strchr(fmt, '%'))
commit_format->is_tformat = 1;
else
commit_format->is_alias = 1;
commit_format->user_format = fmt;

return 0;
}

static void setup_commit_formats(void)
{
struct cmt_fmt_map builtin_formats[] = {
@ -42,10 +89,12 @@ static void setup_commit_formats(void) @@ -42,10 +89,12 @@ static void setup_commit_formats(void)
{ "oneline", CMIT_FMT_ONELINE, 1 }
};
commit_formats_len = ARRAY_SIZE(builtin_formats);
commit_formats = xmalloc(commit_formats_len *
sizeof(*builtin_formats));
builtin_formats_len = commit_formats_len;
ALLOC_GROW(commit_formats, commit_formats_len, commit_formats_alloc);
memcpy(commit_formats, builtin_formats,
sizeof(*builtin_formats)*ARRAY_SIZE(builtin_formats));

git_config(git_pretty_formats_config, NULL);
}

static struct cmt_fmt_map *find_commit_format_recursive(const char *sought,
@ -116,6 +165,10 @@ void get_commit_format(const char *arg, struct rev_info *rev) @@ -116,6 +165,10 @@ void get_commit_format(const char *arg, struct rev_info *rev)

rev->commit_format = commit_format->format;
rev->use_terminator = commit_format->is_tformat;
if (commit_format->format == CMIT_FMT_USERFORMAT) {
save_user_format(rev, commit_format->user_format,
commit_format->is_tformat);
}
}

/*

74
t/t4205-log-pretty-formats.sh

@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
#!/bin/sh
#
# Copyright (c) 2010, Will Palmer
#

test_description='Test pretty formats'
. ./test-lib.sh

test_expect_success 'set up basic repos' '
>foo &&
>bar &&
git add foo &&
test_tick &&
git commit -m initial &&
git add bar &&
test_tick &&
git commit -m "add bar"
'

test_expect_success 'alias builtin format' '
git log --pretty=oneline >expected &&
git config pretty.test-alias oneline &&
git log --pretty=test-alias >actual &&
test_cmp expected actual
'

test_expect_success 'alias masking builtin format' '
git log --pretty=oneline >expected &&
git config pretty.oneline "%H" &&
git log --pretty=oneline >actual &&
test_cmp expected actual
'

test_expect_success 'alias user-defined format' '
git log --pretty="format:%h" >expected &&
git config pretty.test-alias "format:%h" &&
git log --pretty=test-alias >actual &&
test_cmp expected actual
'

test_expect_success 'alias user-defined tformat' '
git log --pretty="tformat:%h" >expected &&
git config pretty.test-alias "tformat:%h" &&
git log --pretty=test-alias >actual &&
test_cmp expected actual
'

test_expect_success 'alias non-existant format' '
git config pretty.test-alias format-that-will-never-exist &&
test_must_fail git log --pretty=test-alias
'

test_expect_success 'alias of an alias' '
git log --pretty="tformat:%h" >expected &&
git config pretty.test-foo "tformat:%h" &&
git config pretty.test-bar test-foo &&
git log --pretty=test-bar >actual && test_cmp expected actual
'

test_expect_success 'alias masking an alias' '
git log --pretty=format:"Two %H" >expected &&
git config pretty.duplicate "format:One %H" &&
git config --add pretty.duplicate "format:Two %H" &&
git log --pretty=duplicate >actual &&
test_cmp expected actual
'

test_expect_success 'alias loop' '
git config pretty.test-foo test-bar &&
git config pretty.test-bar test-foo &&
test_must_fail git log --pretty=test-foo
'

test_done
Loading…
Cancel
Save