From 170c04383bca07fb5a32227474dfd58f29258d25 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 27 Aug 2007 01:33:49 -0700 Subject: [PATCH 1/2] Porcelain level "log" family should recurse when diffing. Most notably, "git log --name-status" stopped at top level directory changes without "-r" option. Signed-off-by: Junio C Hamano --- Documentation/git-log.txt | 2 +- Documentation/user-manual.txt | 2 +- builtin-log.c | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 1e6dbd93b1..5ec547cc0c 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -96,7 +96,7 @@ git log --since="2 weeks ago" \-- gitk:: The "--" is necessary to avoid confusion with the *branch* named 'gitk' -git log -r --name-status release..test:: +git log --name-status release..test:: Show the commits that are in the "test" branch but not yet in the "release" branch, along with the list of paths diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 06ab79fbd1..35298e626b 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -921,7 +921,7 @@ file such that it contained the given content either before or after the commit. You can find out with this: ------------------------------------------------- -$ git log --raw -r --abbrev=40 --pretty=oneline -- filename | +$ git log --raw --abbrev=40 --pretty=oneline -- filename | grep -B 1 `git hash-object filename` ------------------------------------------------- diff --git a/builtin-log.c b/builtin-log.c index 13bae3110e..a381c75f3c 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -55,6 +55,7 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix, rev->abbrev = DEFAULT_ABBREV; rev->commit_format = CMIT_FMT_DEFAULT; rev->verbose_header = 1; + rev->diffopt.recursive = 1; rev->show_root_diff = default_show_root; rev->subject_prefix = fmt_patch_subject_prefix; argc = setup_revisions(argc, argv, rev, "HEAD"); @@ -116,7 +117,6 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix) git_config(git_log_config); init_revisions(&rev, prefix); rev.diff = 1; - rev.diffopt.recursive = 1; rev.simplify_history = 0; cmd_log_init(argc, argv, prefix, &rev); if (!rev.diffopt.output_format) @@ -165,7 +165,6 @@ int cmd_show(int argc, const char **argv, const char *prefix) git_config(git_log_config); init_revisions(&rev, prefix); rev.diff = 1; - rev.diffopt.recursive = 1; rev.combine_merges = 1; rev.dense_combined_merges = 1; rev.always_show_header = 1; From 8a1d076e21810f5bc7e9ef10d84f7ca9637b89af Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 28 Aug 2007 00:38:48 -0700 Subject: [PATCH 2/2] "format-patch --root rev" is the way to show everything. We used to trigger the special case "things not in origin" semantics only when one and only one positive ref is given, and no number (e.g. "git format-patch -4 origin") was specified, and used the general revision range semantics for everything else. This narrows the special case a bit more, by making: git format-patch --root this_version to show everything that leads to the named commit. More importantly, document the two different semantics better. The generic revision range semantics came later and bolted on without being clearly documented. Signed-off-by: Junio C Hamano --- Documentation/git-format-patch.txt | 29 ++++++++++++++++++++++------- builtin-log.c | 13 ++++++++++--- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index c514fdd93f..5e6d5373ad 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -16,21 +16,32 @@ SYNOPSIS [--in-reply-to=Message-Id] [--suffix=.] [--ignore-if-in-upstream] [--subject-prefix=Subject-Prefix] - [..] + [ | ] DESCRIPTION ----------- -Prepare each commit between and with its patch in +Prepare each commit with its patch in one file per commit, formatted to resemble UNIX mailbox format. -If .. is not specified, the head of the current working -tree is implied. For a more complete list of ways to spell - and , see "SPECIFYING REVISIONS" section in -gitlink:git-rev-parse[1]. - The output of this command is convenient for e-mail submission or for use with gitlink:git-am[1]. +There are two ways to specify which commits to operate on. + +1. A single commit, , specifies that the commits leading + to the tip of the current branch that are not in the history + that leads to the to be output. + +2. Generic expression (see "SPECIFYING + REVISIONS" section in gitlink:git-rev-parse[1]) means the + commits in the specified range. A single commit, when + interpreted as a expression, means + "everything that leads to that commit", but that is taken as + the special case above. If you want to format everything + since project inception to one commit, say "git format-patch + \--root ", as showing the root commit as patch + requires \--root option anyway. + By default, each output file is numbered sequentially from 1, and uses the first line of the commit message (massaged for pathname safety) as the filename. With the --numbered-files option, the output file names @@ -153,6 +164,10 @@ git-format-patch origin:: not in the origin branch. For each commit a separate file is created in the current directory. +git-format-patch \--root origin:: + Extract all commits which that leads to 'origin' since the + inception of the project. + git-format-patch -M -B origin:: The same as the previous one. Additionally, it detects and handles renames and complete rewrites intelligently to diff --git a/builtin-log.c b/builtin-log.c index a381c75f3c..fa81c25920 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -585,12 +585,19 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) } if (rev.pending.nr == 1) { - if (rev.max_count < 0) { + if (rev.max_count < 0 && !rev.show_root_diff) { + /* + * This is traditional behaviour of "git format-patch + * origin" that prepares what the origin side still + * does not have. + */ rev.pending.objects[0].item->flags |= UNINTERESTING; add_head(&rev); } - /* Otherwise, it is "format-patch -22 HEAD", and - * get_revision() would return only the specified count. + /* + * Otherwise, it is "format-patch -22 HEAD", and/or + * "format-patch --root HEAD". The user wants + * get_revision() to do the usual traversal. */ }