Merge branch 'jc/logsemantics'
authorJunio C Hamano <gitster@pobox.com>
Wed, 29 Aug 2007 04:49:01 +0000 (21:49 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 29 Aug 2007 04:49:01 +0000 (21:49 -0700)
* jc/logsemantics:
"format-patch --root rev" is the way to show everything.
Porcelain level "log" family should recurse when diffing.

Documentation/git-format-patch.txt
Documentation/git-log.txt
Documentation/user-manual.txt
builtin-log.c
index c514fdd93f40223e1ea7d8996f1a096fc3e61613..5e6d5373ad595d58d2eac53e172099354ca55148 100644 (file)
@@ -16,21 +16,32 @@ SYNOPSIS
                    [--in-reply-to=Message-Id] [--suffix=.<sfx>]
                    [--ignore-if-in-upstream]
                    [--subject-prefix=Subject-Prefix]
-                   <since>[..<until>]
+                  [ <since> | <revision range> ]
 
 DESCRIPTION
 -----------
 
-Prepare each commit between <since> and <until> with its patch in
+Prepare each commit with its patch in
 one file per commit, formatted to resemble UNIX mailbox format.
-If ..<until> is not specified, the head of the current working
-tree is implied.  For a more complete list of ways to spell
-<since> and <until>, 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, <since>, specifies that the commits leading
+   to the tip of the current branch that are not in the history
+   that leads to the <since> to be output.
+
+2. Generic <revision range> 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 <revision range> 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 <that-commit>", 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
index 1e6dbd93b1939bb3ce01f5873a433f981aa1f236..5ec547cc0c10fb940b1bd2481940997cd375e830 100644 (file)
@@ -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
index 06ab79fbd1bba327c82f392e68405ba9d3494951..35298e626be6bd440d6451c0b6205298c9d1fe19 100644 (file)
@@ -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`
 -------------------------------------------------
 
index 13bae3110e05b804db22149e9eb366669a8147c7..fa81c259207d24a506b671f081f7b218ceb557f4 100644 (file)
@@ -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;
@@ -586,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.
                 */
        }