Skip to content

Commit

Permalink
Merge branch 'rr/fmt-merge-msg'
Browse files Browse the repository at this point in the history
* rr/fmt-merge-msg:
  t6200-fmt-merge-msg: Exercise '--log' to configure shortlog length
  t6200-fmt-merge-msg: Exercise 'merge.log' to configure shortlog length
  merge: Make 'merge.log' an integer or boolean option
  merge: Make '--log' an integer option for number of shortlog entries
  fmt_merge_msg: Change fmt_merge_msg API to accept shortlog_len

Conflicts:
	builtin/merge.c
  • Loading branch information
Junio C Hamano committed Sep 29, 2010
2 parents 2851e8e + bd2549c commit 02ef0ed
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 55 deletions.
16 changes: 10 additions & 6 deletions Documentation/git-fmt-merge-msg.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ git-fmt-merge-msg - Produce a merge commit message
SYNOPSIS
--------
[verse]
'git fmt-merge-msg' [-m <message>] [--log | --no-log] <$GIT_DIR/FETCH_HEAD
'git fmt-merge-msg' [-m <message>] [--log | --no-log] -F <file>
'git fmt-merge-msg' [-m <message>] [--log[=<n>] | --no-log] <$GIT_DIR/FETCH_HEAD
'git fmt-merge-msg' [-m <message>] [--log[=<n>] | --no-log] -F <file>

DESCRIPTION
-----------
Expand All @@ -24,10 +24,12 @@ automatically invoking 'git merge'.
OPTIONS
-------

--log::
--log[=<n>]::
In addition to branch names, populate the log message with
one-line descriptions from the actual commits that are being
merged.
merged. At most <n> commits from each merge parent will be
used (20 if <n> is omitted). This overrides the `merge.log`
configuration variable.

--no-log::
Do not list one-line descriptions from the actual commits being
Expand All @@ -52,8 +54,10 @@ CONFIGURATION
-------------

merge.log::
Whether to include summaries of merged commits in newly
merge commit messages. False by default.
In addition to branch names, populate the log message with at
most the specified number of one-line descriptions from the
actual commits that are being merged. Defaults to false, and
true is a synoym for 20.

merge.summary::
Synonym to `merge.log`; this is deprecated and will be removed in
Expand Down
6 changes: 4 additions & 2 deletions Documentation/merge-config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ merge.conflictstyle::
marker and the original text before the `=======` marker.

merge.log::
Whether to include summaries of merged commits in newly created
merge commit messages. False by default.
In addition to branch names, populate the log message with at
most the specified number of one-line descriptions from the
actual commits that are being merged. Defaults to false, and
true is a synoym for 20.

merge.renameLimit::
The number of files to consider when performing rename detection
Expand Down
6 changes: 3 additions & 3 deletions Documentation/merge-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ inspect and further tweak the merge result before committing.
With --no-ff Generate a merge commit even if the merge
resolved as a fast-forward.

--log::
--log[=<n>]::
--no-log::
In addition to branch names, populate the log message with
one-line descriptions from the actual commits that are being
merged.
one-line descriptions from at most <n> actual commits that are being
merged. See also linkgit:git-fmt-merge-msg[1].
+
With --no-log do not list one-line descriptions from the
actual commits being merged.
Expand Down
7 changes: 4 additions & 3 deletions builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,15 @@
#include "commit.h"
#include "notes.h"

#define DEFAULT_MERGE_LOG_LEN 20

extern const char git_version_string[];
extern const char git_usage_string[];
extern const char git_more_info_string[];

extern void prune_packed_objects(int);
extern int fmt_merge_msg(int merge_summary, struct strbuf *in,
struct strbuf *out);
extern int fmt_merge_msg_shortlog(struct strbuf *in, struct strbuf *out);
extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
int merge_title, int shortlog_len);
extern int commit_notes(struct notes_tree *t, const char *msg);

struct notes_rewrite_cfg {
Expand Down
60 changes: 32 additions & 28 deletions builtin/fmt-merge-msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,22 @@
#include "string-list.h"

static const char * const fmt_merge_msg_usage[] = {
"git fmt-merge-msg [-m <message>] [--log|--no-log] [--file <file>]",
"git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]",
NULL
};

static int merge_summary;
static int shortlog_len;

static int fmt_merge_msg_config(const char *key, const char *value, void *cb)
{
static int found_merge_log = 0;
if (!strcmp("merge.log", key)) {
found_merge_log = 1;
merge_summary = git_config_bool(key, value);
if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) {
int is_bool;
shortlog_len = git_config_bool_or_int(key, value, &is_bool);
if (!is_bool && shortlog_len < 0)
return error("%s: negative length %s", key, value);
if (is_bool && shortlog_len)
shortlog_len = DEFAULT_MERGE_LOG_LEN;
}
if (!found_merge_log && !strcmp("merge.summary", key))
merge_summary = git_config_bool(key, value);
return 0;
}

Expand Down Expand Up @@ -255,9 +256,9 @@ static void do_fmt_merge_msg_title(struct strbuf *out,
strbuf_addf(out, " into %s\n", current_branch);
}

static int do_fmt_merge_msg(int merge_title, int merge_summary,
struct strbuf *in, struct strbuf *out) {
int limit = 20, i = 0, pos = 0;
static int do_fmt_merge_msg(int merge_title, struct strbuf *in,
struct strbuf *out, int shortlog_len) {
int i = 0, pos = 0;
unsigned char head_sha1[20];
const char *current_branch;

Expand Down Expand Up @@ -288,7 +289,7 @@ static int do_fmt_merge_msg(int merge_title, int merge_summary,
if (merge_title)
do_fmt_merge_msg_title(out, current_branch);

if (merge_summary) {
if (shortlog_len) {
struct commit *head;
struct rev_info rev;

Expand All @@ -303,28 +304,28 @@ static int do_fmt_merge_msg(int merge_title, int merge_summary,

for (i = 0; i < origins.nr; i++)
shortlog(origins.items[i].string, origins.items[i].util,
head, &rev, limit, out);
head, &rev, shortlog_len, out);
}
return 0;
}

int fmt_merge_msg(int merge_summary, struct strbuf *in, struct strbuf *out) {
return do_fmt_merge_msg(1, merge_summary, in, out);
}

int fmt_merge_msg_shortlog(struct strbuf *in, struct strbuf *out) {
return do_fmt_merge_msg(0, 1, in, out);
int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
int merge_title, int shortlog_len) {
return do_fmt_merge_msg(merge_title, in, out, shortlog_len);
}

int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
{
const char *inpath = NULL;
const char *message = NULL;
struct option options[] = {
OPT_BOOLEAN(0, "log", &merge_summary, "populate log with the shortlog"),
{ OPTION_BOOLEAN, 0, "summary", &merge_summary, NULL,
{ OPTION_INTEGER, 0, "log", &shortlog_len, "n",
"populate log with at most <n> entries from shortlog",
PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
{ OPTION_INTEGER, 0, "summary", &shortlog_len, "n",
"alias for --log (deprecated)",
PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
PARSE_OPT_OPTARG | PARSE_OPT_HIDDEN, NULL,
DEFAULT_MERGE_LOG_LEN },
OPT_STRING('m', "message", &message, "text",
"use <text> as start of message"),
OPT_FILENAME('F', "file", &inpath, "file to read from"),
Expand All @@ -340,12 +341,14 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
0);
if (argc > 0)
usage_with_options(fmt_merge_msg_usage, options);
if (message && !merge_summary) {
if (message && !shortlog_len) {
char nl = '\n';
write_in_full(STDOUT_FILENO, message, strlen(message));
write_in_full(STDOUT_FILENO, &nl, 1);
return 0;
}
if (shortlog_len < 0)
die("Negative --log=%d", shortlog_len);

if (inpath && strcmp(inpath, "-")) {
in = fopen(inpath, "r");
Expand All @@ -355,12 +358,13 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)

if (strbuf_read(&input, fileno(in), 0) < 0)
die_errno("could not read input file");
if (message) {

if (message)
strbuf_addstr(&output, message);
ret = fmt_merge_msg_shortlog(&input, &output);
} else {
ret = fmt_merge_msg(merge_summary, &input, &output);
}
ret = fmt_merge_msg(&input, &output,
message ? 0 : 1,
shortlog_len);

if (ret)
return ret;
write_in_full(STDOUT_FILENO, output.buf, output.len);
Expand Down
32 changes: 19 additions & 13 deletions builtin/merge.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static const char * const builtin_merge_usage[] = {
NULL
};

static int show_diffstat = 1, option_log, squash;
static int show_diffstat = 1, shortlog_len, squash;
static int option_commit = 1, allow_fast_forward = 1;
static int fast_forward_only;
static int allow_trivial = 1, have_message;
Expand Down Expand Up @@ -177,8 +177,9 @@ static struct option builtin_merge_options[] = {
OPT_BOOLEAN(0, "stat", &show_diffstat,
"show a diffstat at the end of the merge"),
OPT_BOOLEAN(0, "summary", &show_diffstat, "(synonym to --stat)"),
OPT_BOOLEAN(0, "log", &option_log,
"add list of one-line log to merge commit message"),
{ OPTION_INTEGER, 0, "log", &shortlog_len, "n",
"add (at most <n>) entries from shortlog to merge commit message",
PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
OPT_BOOLEAN(0, "squash", &squash,
"create a single commit instead of doing a merge"),
OPT_BOOLEAN(0, "commit", &option_commit,
Expand Down Expand Up @@ -504,10 +505,17 @@ static int git_merge_config(const char *k, const char *v, void *cb)
return git_config_string(&pull_twohead, k, v);
else if (!strcmp(k, "pull.octopus"))
return git_config_string(&pull_octopus, k, v);
else if (!strcmp(k, "merge.log") || !strcmp(k, "merge.summary"))
option_log = git_config_bool(k, v);
else if (!strcmp(k, "merge.renormalize"))
option_renormalize = git_config_bool(k, v);
else if (!strcmp(k, "merge.log") || !strcmp(k, "merge.summary")) {
int is_bool;
shortlog_len = git_config_bool_or_int(k, v, &is_bool);
if (!is_bool && shortlog_len < 0)
return error("%s: negative length %s", k, v);
if (is_bool && shortlog_len)
shortlog_len = DEFAULT_MERGE_LOG_LEN;
return 0;
}
return git_diff_ui_config(k, v, cb);
}

Expand Down Expand Up @@ -1012,14 +1020,12 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
for (i = 0; i < argc; i++)
merge_name(argv[i], &merge_names);

if (have_message && option_log)
fmt_merge_msg_shortlog(&merge_names, &merge_msg);
else if (!have_message)
fmt_merge_msg(option_log, &merge_names, &merge_msg);


if (!(have_message && !option_log) && merge_msg.len)
strbuf_setlen(&merge_msg, merge_msg.len-1);
if (!have_message || shortlog_len) {
fmt_merge_msg(&merge_names, &merge_msg, !have_message,
shortlog_len);
if (merge_msg.len)
strbuf_setlen(&merge_msg, merge_msg.len - 1);
}
}

if (head_invalid || !argc)
Expand Down
91 changes: 91 additions & 0 deletions t/t6200-fmt-merge-msg.sh
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,97 @@ test_expect_success '[merge] summary/log configuration' '
test_cmp expected actual2
'

test_expect_success 'setup: clear [merge] configuration' '
test_might_fail git config --unset-all merge.log &&
test_might_fail git config --unset-all merge.summary
'

test_expect_success 'setup FETCH_HEAD' '
git checkout master &&
test_tick &&
git fetch . left
'

test_expect_success 'merge.log=3 limits shortlog length' '
cat >expected <<-EOF &&
Merge branch ${apos}left${apos}
* left: (5 commits)
Left #5
Left #4
Left #3
...
EOF
git -c merge.log=3 fmt-merge-msg <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success 'merge.log=5 shows all 5 commits' '
cat >expected <<-EOF &&
Merge branch ${apos}left${apos}
* left:
Left #5
Left #4
Left #3
Common #2
Common #1
EOF
git -c merge.log=5 fmt-merge-msg <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success 'merge.log=0 disables shortlog' '
echo "Merge branch ${apos}left${apos}" >expected
git -c merge.log=0 fmt-merge-msg <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success '--log=3 limits shortlog length' '
cat >expected <<-EOF &&
Merge branch ${apos}left${apos}
* left: (5 commits)
Left #5
Left #4
Left #3
...
EOF
git fmt-merge-msg --log=3 <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success '--log=5 shows all 5 commits' '
cat >expected <<-EOF &&
Merge branch ${apos}left${apos}
* left:
Left #5
Left #4
Left #3
Common #2
Common #1
EOF
git fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success '--no-log disables shortlog' '
echo "Merge branch ${apos}left${apos}" >expected &&
git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success '--log=0 disables shortlog' '
echo "Merge branch ${apos}left${apos}" >expected &&
git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
test_cmp expected actual
'

test_expect_success 'fmt-merge-msg -m' '
echo "Sync with left" >expected &&
cat >expected.log <<-EOF &&
Expand Down

0 comments on commit 02ef0ed

Please sign in to comment.