Merge branch 'eb/doc-log-manpage'
authorJunio C Hamano <gitster@pobox.com>
Thu, 15 Jul 2010 19:07:56 +0000 (12:07 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 15 Jul 2010 19:07:56 +0000 (12:07 -0700)
* eb/doc-log-manpage:
Reorganize `git-log' man page to clarify common diff options.

50 files changed:
Documentation/Makefile
Documentation/RelNotes-1.7.2.txt
Documentation/config.txt
Documentation/fetch-options.txt
Documentation/git-cat-file.txt
Documentation/git-check-ref-format.txt
Documentation/git-checkout.txt
Documentation/git-cherry-pick.txt
Documentation/git-diff.txt
Documentation/git-fast-import.txt
Documentation/git-format-patch.txt
Documentation/git-log.txt
Documentation/git-push.txt
Documentation/git-reflog.txt
Documentation/git-rev-parse.txt
Documentation/git-revert.txt
Documentation/git-show-branch.txt
Documentation/git-show.txt
Documentation/git-submodule.txt
Documentation/git.txt
Documentation/gitcore-tutorial.txt
Documentation/gitk.txt
Documentation/gitmodules.txt
Documentation/gitrevisions.txt [new file with mode: 0644]
Documentation/revisions.txt [new file with mode: 0644]
Documentation/technical/protocol-capabilities.txt
Documentation/user-manual.txt
Makefile
builtin/commit.c
builtin/grep.c
builtin/read-tree.c
diff.c
git-rebase--interactive.sh
git-submodule.sh
gitweb/gitweb.perl
setup.c
t/gitweb-lib.sh
t/lib-cvs.sh
t/lib-git-svn.sh
t/lib-httpd.sh
t/lib-patch-mode.sh
t/t0005-signals.sh
t/t1001-read-tree-m-2way.sh
t/t3404-rebase-interactive.sh
t/t5800-remote-helpers.sh
t/t7005-editor.sh
t/t7400-submodule-basic.sh
t/t7811-grep-open.sh
t/t9118-git-svn-funky-branch-names.sh
t/test-lib.sh
index 04f69cf64e5d989bac3cd1c235e6a7e657c6c103..a4c4063e50d3eb3bd36d94b399f790e56fe4b050 100644 (file)
@@ -6,7 +6,7 @@ MAN5_TXT=gitattributes.txt gitignore.txt gitmodules.txt githooks.txt \
        gitrepository-layout.txt
 MAN7_TXT=gitcli.txt gittutorial.txt gittutorial-2.txt \
        gitcvs-migration.txt gitcore-tutorial.txt gitglossary.txt \
-       gitdiffcore.txt gitworkflows.txt
+       gitdiffcore.txt gitrevisions.txt gitworkflows.txt
 
 MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
 MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT))
index 03832ff2f985133c2785dd3f0c2b45f2386e9e3d..f24b3876af6e2edbfdd7e8af2eff445fb8e6f85d 100644 (file)
@@ -145,8 +145,11 @@ release, unless otherwise noted.
  * "git reset --hard" started from a wrong directory and a working tree in
    a nonstandard location is in use got confused (560fb6a1).
 
+ * "git read-tree -m A B" used to switch to branch B while retaining
+   local changes added an incorrect cache-tree information (b1f47514).
+
 --
 exec >/var/tmp/1
-O=v1.7.2-rc1-37-g2a16315
+O=v1.7.2-rc2-17-gc9a9766
 echo O=$(git describe HEAD)
 git shortlog --no-merges HEAD ^maint ^$O
index 72949e71ac0996c3a6af7ff98c4de5bb4a457625..e75434b3ef2d81fa8dafd552d4b689eb84eea441 100644 (file)
@@ -886,9 +886,11 @@ format.headers::
        Additional email headers to include in a patch to be submitted
        by mail.  See linkgit:git-format-patch[1].
 
+format.to::
 format.cc::
-       Additional "Cc:" headers to include in a patch to be submitted
-       by mail.  See the --cc option in linkgit:git-format-patch[1].
+       Additional recipients to include in a patch to be submitted
+       by mail.  See the --to and --cc options in
+       linkgit:git-format-patch[1].
 
 format.subjectprefix::
        The default for format-patch is to output files with the '[PATCH]'
@@ -1732,6 +1734,15 @@ status.submodulesummary::
        summary of commits for modified submodules will be shown (see
        --summary-limit option of linkgit:git-submodule[1]).
 
+submodule.<name>.path::
+submodule.<name>.url::
+submodule.<name>.update::
+       The path within this project, URL, and the updating strategy
+       for a submodule.  These variables are initially populated
+       by 'git submodule init'; edit them to override the
+       URL and other values found in the `.gitmodules` file.  See
+       linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
+
 tar.umask::
        This variable can be used to restrict the permission bits of
        tar archive entries.  The default is 0002, which turns off the
index 044ec882ccf9f8437862a5e59a3caee7030c36ae..9333c42c558464ce2430df39e9864f932e786b36 100644 (file)
@@ -34,6 +34,7 @@ ifndef::git-pull[]
        Allow several <repository> and <group> arguments to be
        specified. No <refspec>s may be specified.
 
+-p::
 --prune::
        After fetching, remove any remote tracking branches which
        no longer exist on the remote.
index 9ebbe9402b216d33fb7148f2f796d1f58d12cfd9..a3f56b07fd251cbd121c28189d1f9018b892b48e 100644 (file)
@@ -27,7 +27,7 @@ OPTIONS
 <object>::
        The name of the object to show.
        For a more complete list of ways to spell object names, see
-       the "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+       the "SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
 
 -t::
        Instead of the content, show the object type identified by
index 379eee6734323ee566480d5f9159dd28ed27ecd2..f5c2e0601db6782b2a8690c687611b93da935024 100644 (file)
@@ -49,7 +49,7 @@ git imposes the following rules on how references are named:
 These rules make it easy for shell script based tools to parse
 reference names, pathname expansion by the shell when a reference name is used
 unquoted (by mistake), and also avoids ambiguities in certain
-reference name expressions (see linkgit:git-rev-parse[1]):
+reference name expressions (see linkgit:gitrevisions[1]):
 
 . A double-dot `..` is often used as in `ref1..ref2`, and in some
   contexts this notation means `{caret}ref1 ref2` (i.e. not in
index 261dd90c381eccbd87d73325478e1d5abcf05e15..1bacd2e1044f5b3b7d5a60e1687387cc277fc52a 100644 (file)
@@ -263,7 +263,7 @@ the above checkout would fail like this:
 +
 ------------
 $ git checkout mytopic
-fatal: Entry 'frotz' not uptodate. Cannot merge.
+error: You have local changes to 'frotz'; not switching branches.
 ------------
 +
 You can give the `-m` flag to the command, which would try a
index ca485dbac19da231eca045bcf55c6b5df87e8dec..2cef579316ba11e68d65dc4d7309f2e56a465b3d 100644 (file)
@@ -20,8 +20,8 @@ OPTIONS
 -------
 <commit>...::
        Commits to cherry-pick.
-       For a more complete list of ways to spell commits, see the
-       "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+       For a more complete list of ways to spell commits, see
+       linkgit:gitrevisions[1].
        Sets of commits can be passed but no traversal is done by
        default, as if the '--no-walk' option was specified, see
        linkgit:git-rev-list[1].
index 723a64872fd4b43612d576781d915a7538189f46..08fd4099addac3959e5aedbd1a0668367f07bb21 100644 (file)
@@ -68,11 +68,11 @@ for the last two forms that use ".." notations, can be any
 <tree-ish>.
 
 For a more complete list of ways to spell <commit>, see
-"SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+"SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
 However, "diff" is about comparing two _endpoints_, not ranges,
 and the range notations ("<commit>..<commit>" and
 "<commit>\...<commit>") do not mean a range as defined in the
-"SPECIFYING RANGES" section in linkgit:git-rev-parse[1].
+"SPECIFYING RANGES" section in linkgit:gitrevisions[1].
 
 OPTIONS
 -------
index 19082b04eb7ec77bcf974e0c76b8d20bb736c021..77a0a2481a34f987aab4688002a6e6a0ae2e497f 100644 (file)
@@ -439,7 +439,7 @@ Marks must be declared (via `mark`) before they can be used.
 * A complete 40 byte or abbreviated commit SHA-1 in hex.
 
 * Any valid Git SHA-1 expression that resolves to a commit.  See
-  ``SPECIFYING REVISIONS'' in linkgit:git-rev-parse[1] for details.
+  ``SPECIFYING REVISIONS'' in linkgit:gitrevisions[1] for details.
 
 The special case of restarting an incremental import from the
 current branch value should be written as:
index c8c81e8437c5fdd4ca488e3889345c9831a66329..4b3f5ba5358da469feff4e861e69717f16e81d21 100644 (file)
@@ -39,7 +39,7 @@ There are two ways to specify which commits to operate on.
    that leads to the <since> to be output.
 
 2. Generic <revision range> expression (see "SPECIFYING
-   REVISIONS" section in linkgit:git-rev-parse[1]) means the
+   REVISIONS" section in linkgit:gitrevisions[1]) means the
    commits in the specified range.
 
 The first rule takes precedence in the case of a single <commit>.  To
index c925d3675af78e0bce7840a8fef28567d72e4695..e970664fe1a47c3f35f0f7c60b6c8f9781caed31 100644 (file)
@@ -31,8 +31,7 @@ OPTIONS
        either <since> or <until> is omitted, it defaults to
        `HEAD`, i.e. the tip of the current branch.
        For a more complete list of ways to spell <since>
-       and <until>, see "SPECIFYING REVISIONS" section in
-       linkgit:git-rev-parse[1].
+       and <until>, see linkgit:gitrevisions[1].
 
 --follow::
        Continue listing the history of a file beyond renames
index 48570242fb2dda31a5684e2d678d40690d3c4cab..b68abff28a0fe27fbcb2bbffa2296cffb1297eaf 100644 (file)
@@ -41,7 +41,7 @@ OPTIONS[[OPTIONS]]
 +
 The <src> is often the name of the branch you would want to push, but
 it can be any arbitrary "SHA-1 expression", such as `master~4` or
-`HEAD` (see linkgit:git-rev-parse[1]).
+`HEAD` (see linkgit:gitrevisions[1]).
 +
 The <dst> tells which ref on the remote side is updated with this
 push. Arbitrary expressions cannot be used here, an actual ref must
index 4eaa62b6913f15c354e8008c2884f476428ebb0b..5a0451aaf377d13590d6112a9ee8cf51e217a21d 100644 (file)
@@ -40,7 +40,7 @@ see linkgit:git-log[1].
 The reflog is useful in various git commands, to specify the old value
 of a reference. For example, `HEAD@\{2\}` means "where HEAD used to be
 two moves ago", `master@\{one.week.ago\}` means "where master used to
-point to one week ago", and so on. See linkgit:git-rev-parse[1] for
+point to one week ago", and so on. See linkgit:gitrevisions[1] for
 more details.
 
 To delete single entries from the reflog, use the subcommand "delete"
index 833a2a29ccf65afe275bc35fa0eaa3c5afd21fae..0727f431c6dc01296b04cc93204ba37d16b5a32b 100644 (file)
@@ -174,205 +174,7 @@ shown.  If the pattern does not contain a globbing character (`?`,
        Flags and parameters to be parsed.
 
 
-SPECIFYING REVISIONS
---------------------
-
-A revision parameter typically, but not necessarily, names a
-commit object.  They use what is called an 'extended SHA1'
-syntax.  Here are various ways to spell object names.  The
-ones listed near the end of this list are to name trees and
-blobs contained in a commit.
-
-* The full SHA1 object name (40-byte hexadecimal string), or
-  a substring of such that is unique within the repository.
-  E.g. dae86e1950b1277e545cee180551750029cfe735 and dae86e both
-  name the same commit object if there are no other object in
-  your repository whose object name starts with dae86e.
-
-* An output from 'git describe'; i.e. a closest tag, optionally
-  followed by a dash and a number of commits, followed by a dash, a
-  `g`, and an abbreviated object name.
-
-* A symbolic ref name.  E.g. 'master' typically means the commit
-  object referenced by refs/heads/master.  If you
-  happen to have both heads/master and tags/master, you can
-  explicitly say 'heads/master' to tell git which one you mean.
-  When ambiguous, a `<name>` is disambiguated by taking the
-  first match in the following rules:
-
-  . if `$GIT_DIR/<name>` exists, that is what you mean (this is usually
-    useful only for `HEAD`, `FETCH_HEAD`, `ORIG_HEAD` and `MERGE_HEAD`);
-
-  . otherwise, `refs/<name>` if exists;
-
-  . otherwise, `refs/tags/<name>` if exists;
-
-  . otherwise, `refs/heads/<name>` if exists;
-
-  . otherwise, `refs/remotes/<name>` if exists;
-
-  . otherwise, `refs/remotes/<name>/HEAD` if exists.
-+
-HEAD names the commit your changes in the working tree is based on.
-FETCH_HEAD records the branch you fetched from a remote repository
-with your last 'git fetch' invocation.
-ORIG_HEAD is created by commands that moves your HEAD in a drastic
-way, to record the position of the HEAD before their operation, so that
-you can change the tip of the branch back to the state before you ran
-them easily.
-MERGE_HEAD records the commit(s) you are merging into your branch
-when you run 'git merge'.
-+
-Note that any of the `refs/*` cases above may come either from
-the `$GIT_DIR/refs` directory or from the `$GIT_DIR/packed-refs` file.
-
-* A ref followed by the suffix '@' with a date specification
-  enclosed in a brace
-  pair (e.g. '\{yesterday\}', '\{1 month 2 weeks 3 days 1 hour 1
-  second ago\}' or '\{1979-02-26 18:30:00\}') to specify the value
-  of the ref at a prior point in time.  This suffix may only be
-  used immediately following a ref name and the ref must have an
-  existing log ($GIT_DIR/logs/<ref>). Note that this looks up the state
-  of your *local* ref at a given time; e.g., what was in your local
-  `master` branch last week. If you want to look at commits made during
-  certain times, see `--since` and `--until`.
-
-* A ref followed by the suffix '@' with an ordinal specification
-  enclosed in a brace pair (e.g. '\{1\}', '\{15\}') to specify
-  the n-th prior value of that ref.  For example 'master@\{1\}'
-  is the immediate prior value of 'master' while 'master@\{5\}'
-  is the 5th prior value of 'master'. This suffix may only be used
-  immediately following a ref name and the ref must have an existing
-  log ($GIT_DIR/logs/<ref>).
-
-* You can use the '@' construct with an empty ref part to get at a
-  reflog of the current branch. For example, if you are on the
-  branch 'blabla', then '@\{1\}' means the same as 'blabla@\{1\}'.
-
-* The special construct '@\{-<n>\}' means the <n>th branch checked out
-  before the current one.
-
-* The suffix '@\{upstream\}' to a ref (short form 'ref@\{u\}') refers to
-  the branch the ref is set to build on top of.  Missing ref defaults
-  to the current branch.
-
-* A suffix '{caret}' to a revision parameter (e.g. 'HEAD{caret}') means the first parent of
-  that commit object.  '{caret}<n>' means the <n>th parent (i.e.
-  'rev{caret}'
-  is equivalent to 'rev{caret}1').  As a special rule,
-  'rev{caret}0' means the commit itself and is used when 'rev' is the
-  object name of a tag object that refers to a commit object.
-
-* A suffix '{tilde}<n>' to a revision parameter means the commit
-  object that is the <n>th generation grand-parent of the named
-  commit object, following only the first parent.  I.e. rev~3 is
-  equivalent to rev{caret}{caret}{caret} which is equivalent to
-  rev{caret}1{caret}1{caret}1.  See below for a illustration of
-  the usage of this form.
-
-* A suffix '{caret}' followed by an object type name enclosed in
-  brace pair (e.g. `v0.99.8{caret}\{commit\}`) means the object
-  could be a tag, and dereference the tag recursively until an
-  object of that type is found or the object cannot be
-  dereferenced anymore (in which case, barf).  `rev{caret}0`
-  introduced earlier is a short-hand for `rev{caret}\{commit\}`.
-
-* A suffix '{caret}' followed by an empty brace pair
-  (e.g. `v0.99.8{caret}\{\}`) means the object could be a tag,
-  and dereference the tag recursively until a non-tag object is
-  found.
-
-* A colon, followed by a slash, followed by a text (e.g. `:/fix nasty bug`): this names
-  a commit whose commit message starts with the specified text.
-  This name returns the youngest matching commit which is
-  reachable from any ref.  If the commit message starts with a
-  '!', you have to repeat that;  the special sequence ':/!',
-  followed by something else than '!' is reserved for now.
-
-* A suffix ':' followed by a path (e.g. `HEAD:README`); this names the blob or tree
-  at the given path in the tree-ish object named by the part
-  before the colon.
-  ':path' (with an empty part before the colon, e.g. `:README`)
-  is a special case of the syntax described next: content
-  recorded in the index at the given path.
-
-* A colon, optionally followed by a stage number (0 to 3) and a
-  colon, followed by a path (e.g. `:0:README`); this names a blob object in the
-  index at the given path. Missing stage number (and the colon
-  that follows it, e.g. `:README`) names a stage 0 entry. During a merge, stage
-  1 is the common ancestor, stage 2 is the target branch's version
-  (typically the current branch), and stage 3 is the version from
-  the branch being merged.
-
-Here is an illustration, by Jon Loeliger.  Both commit nodes B
-and C are parents of commit node A.  Parent commits are ordered
-left-to-right.
-
-........................................
-G   H   I   J
- \ /     \ /
-  D   E   F
-   \  |  / \
-    \ | /   |
-     \|/    |
-      B     C
-       \   /
-        \ /
-         A
-........................................
-
-    A =      = A^0
-    B = A^   = A^1     = A~1
-    C = A^2  = A^2
-    D = A^^  = A^1^1   = A~2
-    E = B^2  = A^^2
-    F = B^3  = A^^3
-    G = A^^^ = A^1^1^1 = A~3
-    H = D^2  = B^^2    = A^^^2  = A~2^2
-    I = F^   = B^3^    = A^^3^
-    J = F^2  = B^3^2   = A^^3^2
-
-
-SPECIFYING RANGES
------------------
-
-History traversing commands such as 'git log' operate on a set
-of commits, not just a single commit.  To these commands,
-specifying a single revision with the notation described in the
-previous section means the set of commits reachable from that
-commit, following the commit ancestry chain.
-
-To exclude commits reachable from a commit, a prefix `{caret}`
-notation is used.  E.g. `{caret}r1 r2` means commits reachable
-from `r2` but exclude the ones reachable from `r1`.
-
-This set operation appears so often that there is a shorthand
-for it.  When you have two commits `r1` and `r2` (named according
-to the syntax explained in SPECIFYING REVISIONS above), you can ask
-for commits that are reachable from r2 excluding those that are reachable
-from r1 by `{caret}r1 r2` and it can be written as `r1..r2`.
-
-A similar notation `r1\...r2` is called symmetric difference
-of `r1` and `r2` and is defined as
-`r1 r2 --not $(git merge-base --all r1 r2)`.
-It is the set of commits that are reachable from either one of
-`r1` or `r2` but not from both.
-
-Two other shorthands for naming a set that is formed by a commit
-and its parent commits exist.  The `r1{caret}@` notation means all
-parents of `r1`.  `r1{caret}!` includes commit `r1` but excludes
-all of its parents.
-
-Here are a handful of examples:
-
-   D                G H D
-   D F              G H I J D F
-   ^G D             H D
-   ^D B             E I J F B
-   B...C            G H D E B C
-   ^D B C           E I J F B C
-   C^@              I J F
-   F^! D            G H D F
+include::revisions.txt[]
 
 PARSEOPT
 --------
index dea4f53522271ee329658169c2aed41d797dc8a8..b7d9ef7e4726db40f3b0d1ec9474494bb6e07dcf 100644 (file)
@@ -31,7 +31,7 @@ OPTIONS
 <commit>...::
        Commits to revert.
        For a more complete list of ways to spell commit names, see
-       "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+       linkgit:gitrevisions[1].
        Sets of commits can also be given but no traversal is done by
        default, see linkgit:git-rev-list[1] and its '--no-walk'
        option.
index f1499bba88028775032819708db22a3250b5b840..81ba29669c52a7c50fb126b7b70c3a867df25f00 100644 (file)
@@ -32,7 +32,7 @@ no <rev> nor <glob> is given on the command line.
 OPTIONS
 -------
 <rev>::
-       Arbitrary extended SHA1 expression (see linkgit:git-rev-parse[1])
+       Arbitrary extended SHA1 expression (see linkgit:gitrevisions[1])
        that typically names a branch head or a tag.
 
 <glob>::
index 55e687a7c7f2113615c80e1719c4f3a2120ba7fa..0002bfb0455b38eecf6b29da6a2464058ba42c57 100644 (file)
@@ -36,7 +36,7 @@ OPTIONS
 <object>...::
        The names of objects to show.
        For a more complete list of ways to spell object names, see
-       "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+       "SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
 
 include::pretty-options.txt[]
 
index cdabfd29add5752caab24a1715427c0e4eba9a11..76a832a3ac893111b2d17333e6bc99b7903b47a8 100644 (file)
@@ -95,6 +95,10 @@ is the superproject and submodule repositories will be kept
 together in the same relative location, and only the
 superproject's URL needs to be provided: git-submodule will correctly
 locate the submodule using the relative URL in .gitmodules.
++
+The submodule will be added with "git add --force <path>". I.e. git
+doesn't care if the new path is in a `gitignore`. Your invocation of
+"git submodule add" is considered enough to override it.
 
 status::
        Show the status of the submodules. This will print the SHA-1 of the
index 8f0dd7fe702ee5ab74e4ab0f35ead780f9e31d49..12066ab3fc2ba37c0a9eb291d40e1fb4a985714b 100644 (file)
@@ -479,7 +479,7 @@ HEAD::
        (i.e. the contents of `$GIT_DIR/refs/heads/<head>`).
 
 For a more complete list of ways to spell object names, see
-"SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+"SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
 
 
 File/Directory Structure
index f7815e96a268f0eac7602e03255c28ea2fe04e6b..ed3ddc92cb51eaeb3d4a988e396a4f90297037c6 100644 (file)
@@ -971,7 +971,7 @@ commits from the master branch.  The string inside brackets
 before the commit log message is a short name you can use to
 name the commit.  In the above example, 'master' and 'mybranch'
 are branch heads.  'master^' is the first parent of 'master'
-branch head.  Please see linkgit:git-rev-parse[1] if you want to
+branch head.  Please see linkgit:gitrevisions[1] if you want to
 see more complex cases.
 
 [NOTE]
index 99baa24a2d5c8c703d3ad5ce7442bb8363359cd6..05ac1c79f768352be8756eeb483e71f0d09131de 100644 (file)
@@ -69,7 +69,7 @@ frequently used options.
        the form "'<from>'..'<to>'" to show all revisions between '<from>' and
        back to '<to>'. Note, more advanced revision selection can be applied.
        For a more complete list of ways to spell object names, see
-       "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1].
+       linkgit:gitrevisions[1].
 
 <path>...::
 
index 5daf750d1942f3b97844b4ef378daf9346cb46d4..72a13d18e019ef00de0e8a79bbe5fe4651ab8dba 100644 (file)
@@ -29,6 +29,9 @@ submodule.<name>.path::
 
 submodule.<name>.url::
        Defines an url from where the submodule repository can be cloned.
+       This may be either an absolute URL ready to be passed to
+       linkgit:git-clone[1] or (if it begins with ./ or ../) a location
+       relative to the superproject's origin repository.
 
 submodule.<name>.update::
        Defines what to do when the submodule is updated by the superproject.
diff --git a/Documentation/gitrevisions.txt b/Documentation/gitrevisions.txt
new file mode 100644 (file)
index 0000000..fc4789f
--- /dev/null
@@ -0,0 +1,35 @@
+gitrevisions(7)
+================
+
+NAME
+----
+gitrevisions - specifying revisions and ranges for git
+
+SYNOPSIS
+--------
+gitrevisions
+
+
+DESCRIPTION
+-----------
+
+Many Git commands take revision parameters as arguments. Depending on
+the command, they denote a specific commit or, for commands which
+walk the revision graph (such as linkgit:git-log[1]), all commits which can
+be reached from that commit. In the latter case one can also specify a
+range of revisions explicitly.
+
+In addition, some Git commands (such as linkgit:git-show[1]) also take
+revision parameters which denote other objects than commits, e.g. blobs
+("files") or trees ("directories of files").
+
+include::revisions.txt[]
+
+
+SEE ALSO
+--------
+linkgit:git-rev-parse[1]
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
new file mode 100644 (file)
index 0000000..fe846f0
--- /dev/null
@@ -0,0 +1,199 @@
+SPECIFYING REVISIONS
+--------------------
+
+A revision parameter typically, but not necessarily, names a
+commit object.  They use what is called an 'extended SHA1'
+syntax.  Here are various ways to spell object names.  The
+ones listed near the end of this list are to name trees and
+blobs contained in a commit.
+
+* The full SHA1 object name (40-byte hexadecimal string), or
+  a substring of such that is unique within the repository.
+  E.g. dae86e1950b1277e545cee180551750029cfe735 and dae86e both
+  name the same commit object if there are no other object in
+  your repository whose object name starts with dae86e.
+
+* An output from 'git describe'; i.e. a closest tag, optionally
+  followed by a dash and a number of commits, followed by a dash, a
+  `g`, and an abbreviated object name.
+
+* A symbolic ref name.  E.g. 'master' typically means the commit
+  object referenced by refs/heads/master.  If you
+  happen to have both heads/master and tags/master, you can
+  explicitly say 'heads/master' to tell git which one you mean.
+  When ambiguous, a `<name>` is disambiguated by taking the
+  first match in the following rules:
+
+  . if `$GIT_DIR/<name>` exists, that is what you mean (this is usually
+    useful only for `HEAD`, `FETCH_HEAD`, `ORIG_HEAD` and `MERGE_HEAD`);
+
+  . otherwise, `refs/<name>` if exists;
+
+  . otherwise, `refs/tags/<name>` if exists;
+
+  . otherwise, `refs/heads/<name>` if exists;
+
+  . otherwise, `refs/remotes/<name>` if exists;
+
+  . otherwise, `refs/remotes/<name>/HEAD` if exists.
++
+HEAD names the commit your changes in the working tree is based on.
+FETCH_HEAD records the branch you fetched from a remote repository
+with your last 'git fetch' invocation.
+ORIG_HEAD is created by commands that moves your HEAD in a drastic
+way, to record the position of the HEAD before their operation, so that
+you can change the tip of the branch back to the state before you ran
+them easily.
+MERGE_HEAD records the commit(s) you are merging into your branch
+when you run 'git merge'.
++
+Note that any of the `refs/*` cases above may come either from
+the `$GIT_DIR/refs` directory or from the `$GIT_DIR/packed-refs` file.
+
+* A ref followed by the suffix '@' with a date specification
+  enclosed in a brace
+  pair (e.g. '\{yesterday\}', '\{1 month 2 weeks 3 days 1 hour 1
+  second ago\}' or '\{1979-02-26 18:30:00\}') to specify the value
+  of the ref at a prior point in time.  This suffix may only be
+  used immediately following a ref name and the ref must have an
+  existing log ($GIT_DIR/logs/<ref>). Note that this looks up the state
+  of your *local* ref at a given time; e.g., what was in your local
+  `master` branch last week. If you want to look at commits made during
+  certain times, see `--since` and `--until`.
+
+* A ref followed by the suffix '@' with an ordinal specification
+  enclosed in a brace pair (e.g. '\{1\}', '\{15\}') to specify
+  the n-th prior value of that ref.  For example 'master@\{1\}'
+  is the immediate prior value of 'master' while 'master@\{5\}'
+  is the 5th prior value of 'master'. This suffix may only be used
+  immediately following a ref name and the ref must have an existing
+  log ($GIT_DIR/logs/<ref>).
+
+* You can use the '@' construct with an empty ref part to get at a
+  reflog of the current branch. For example, if you are on the
+  branch 'blabla', then '@\{1\}' means the same as 'blabla@\{1\}'.
+
+* The special construct '@\{-<n>\}' means the <n>th branch checked out
+  before the current one.
+
+* The suffix '@\{upstream\}' to a ref (short form 'ref@\{u\}') refers to
+  the branch the ref is set to build on top of.  Missing ref defaults
+  to the current branch.
+
+* A suffix '{caret}' to a revision parameter (e.g. 'HEAD{caret}') means the first parent of
+  that commit object.  '{caret}<n>' means the <n>th parent (i.e.
+  'rev{caret}'
+  is equivalent to 'rev{caret}1').  As a special rule,
+  'rev{caret}0' means the commit itself and is used when 'rev' is the
+  object name of a tag object that refers to a commit object.
+
+* A suffix '{tilde}<n>' to a revision parameter means the commit
+  object that is the <n>th generation grand-parent of the named
+  commit object, following only the first parent.  I.e. rev~3 is
+  equivalent to rev{caret}{caret}{caret} which is equivalent to
+  rev{caret}1{caret}1{caret}1.  See below for a illustration of
+  the usage of this form.
+
+* A suffix '{caret}' followed by an object type name enclosed in
+  brace pair (e.g. `v0.99.8{caret}\{commit\}`) means the object
+  could be a tag, and dereference the tag recursively until an
+  object of that type is found or the object cannot be
+  dereferenced anymore (in which case, barf).  `rev{caret}0`
+  introduced earlier is a short-hand for `rev{caret}\{commit\}`.
+
+* A suffix '{caret}' followed by an empty brace pair
+  (e.g. `v0.99.8{caret}\{\}`) means the object could be a tag,
+  and dereference the tag recursively until a non-tag object is
+  found.
+
+* A colon, followed by a slash, followed by a text (e.g. `:/fix nasty bug`): this names
+  a commit whose commit message starts with the specified text.
+  This name returns the youngest matching commit which is
+  reachable from any ref.  If the commit message starts with a
+  '!', you have to repeat that;  the special sequence ':/!',
+  followed by something else than '!' is reserved for now.
+
+* A suffix ':' followed by a path (e.g. `HEAD:README`); this names the blob or tree
+  at the given path in the tree-ish object named by the part
+  before the colon.
+  ':path' (with an empty part before the colon, e.g. `:README`)
+  is a special case of the syntax described next: content
+  recorded in the index at the given path.
+
+* A colon, optionally followed by a stage number (0 to 3) and a
+  colon, followed by a path (e.g. `:0:README`); this names a blob object in the
+  index at the given path. Missing stage number (and the colon
+  that follows it, e.g. `:README`) names a stage 0 entry. During a merge, stage
+  1 is the common ancestor, stage 2 is the target branch's version
+  (typically the current branch), and stage 3 is the version from
+  the branch being merged.
+
+Here is an illustration, by Jon Loeliger.  Both commit nodes B
+and C are parents of commit node A.  Parent commits are ordered
+left-to-right.
+
+........................................
+G   H   I   J
+ \ /     \ /
+  D   E   F
+   \  |  / \
+    \ | /   |
+     \|/    |
+      B     C
+       \   /
+        \ /
+         A
+........................................
+
+    A =      = A^0
+    B = A^   = A^1     = A~1
+    C = A^2  = A^2
+    D = A^^  = A^1^1   = A~2
+    E = B^2  = A^^2
+    F = B^3  = A^^3
+    G = A^^^ = A^1^1^1 = A~3
+    H = D^2  = B^^2    = A^^^2  = A~2^2
+    I = F^   = B^3^    = A^^3^
+    J = F^2  = B^3^2   = A^^3^2
+
+
+SPECIFYING RANGES
+-----------------
+
+History traversing commands such as 'git log' operate on a set
+of commits, not just a single commit.  To these commands,
+specifying a single revision with the notation described in the
+previous section means the set of commits reachable from that
+commit, following the commit ancestry chain.
+
+To exclude commits reachable from a commit, a prefix `{caret}`
+notation is used.  E.g. `{caret}r1 r2` means commits reachable
+from `r2` but exclude the ones reachable from `r1`.
+
+This set operation appears so often that there is a shorthand
+for it.  When you have two commits `r1` and `r2` (named according
+to the syntax explained in SPECIFYING REVISIONS above), you can ask
+for commits that are reachable from r2 excluding those that are reachable
+from r1 by `{caret}r1 r2` and it can be written as `r1..r2`.
+
+A similar notation `r1\...r2` is called symmetric difference
+of `r1` and `r2` and is defined as
+`r1 r2 --not $(git merge-base --all r1 r2)`.
+It is the set of commits that are reachable from either one of
+`r1` or `r2` but not from both.
+
+Two other shorthands for naming a set that is formed by a commit
+and its parent commits exist.  The `r1{caret}@` notation means all
+parents of `r1`.  `r1{caret}!` includes commit `r1` but excludes
+all of its parents.
+
+Here are a handful of examples:
+
+   D                G H D
+   D F              G H I J D F
+   ^G D             H D
+   ^D B             E I J F B
+   B...C            G H D E B C
+   ^D B C           E I J F B C
+   C^@              I J F
+   F^! D            G H D F
index fd1a593149a0ed1a12085bb83067576674a04e81..b15517fa06bd782fb757e6b0836f9bceea8b7c05 100644 (file)
@@ -119,7 +119,7 @@ both.
 ofs-delta
 ---------
 
-Server can send, and client understand PACKv2 with delta refering to
+Server can send, and client understand PACKv2 with delta referring to
 its base by position in pack rather than by an obj-id.  That is, they can
 send/read OBJ_OFS_DELTA (aka type 6) in a packfile.
 
index fe6fb722da1a5c288c7ae3757622aac8cac79a73..22aee34d4a49b242370e5244f35d542ad0b79391 100644 (file)
@@ -397,7 +397,7 @@ is usually a shortcut for the HEAD branch in the repository "origin".
 For the complete list of paths which git checks for references, and
 the order it uses to decide which to choose when there are multiple
 references with the same shorthand name, see the "SPECIFYING
-REVISIONS" section of linkgit:git-rev-parse[1].
+REVISIONS" section of linkgit:gitrevisions[1].
 
 [[Updating-a-repository-With-git-fetch]]
 Updating a repository with git fetch
@@ -568,7 +568,7 @@ We have seen several ways of naming commits already:
        - HEAD: refers to the head of the current branch
 
 There are many more; see the "SPECIFYING REVISIONS" section of the
-linkgit:git-rev-parse[1] man page for the complete list of ways to
+linkgit:gitrevisions[1] man page for the complete list of ways to
 name revisions.  Some examples:
 
 -------------------------------------------------
@@ -909,7 +909,7 @@ commits reachable from some head but not from any tag in the repository:
 $ gitk $( git show-ref --heads ) --not  $( git show-ref --tags )
 -------------------------------------------------
 
-(See linkgit:git-rev-parse[1] for explanations of commit-selecting
+(See linkgit:gitrevisions[1] for explanations of commit-selecting
 syntax such as `--not`.)
 
 [[making-a-release]]
@@ -1635,7 +1635,7 @@ you've checked out.
 The reflogs are kept by default for 30 days, after which they may be
 pruned.  See linkgit:git-reflog[1] and linkgit:git-gc[1] to learn
 how to control this pruning, and see the "SPECIFYING REVISIONS"
-section of linkgit:git-rev-parse[1] for details.
+section of linkgit:gitrevisions[1] for details.
 
 Note that the reflog history is very different from normal git history.
 While normal history is shared by every repository that works on the
index 9aca8a16d955e904b4a8f07e70fba754ac65fcc3..bc3c57058faba66f6a7a947e1e9642f47053b5bb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2079,19 +2079,19 @@ endif
                test -z "$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
                ln "$$bindir/git$X" "$$execdir/git$X" 2>/dev/null || \
                cp "$$bindir/git$X" "$$execdir/git$X"; } ; } && \
-       for p in $(BUILT_INS); do \
+       for p in $(BUILT_INS); do \
                $(RM) "$$execdir/$$p" && \
                ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \
                ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \
                cp "$$execdir/git$X" "$$execdir/$$p" || exit; \
-         done; } && \
-       { test x"$(REMOTE_CURL_ALIASES)" = x || \
-               { for p in $(REMOTE_CURL_ALIASES); do \
+       done && \
+       remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \
+       for p in $$remote_curl_aliases; do \
                $(RM) "$$execdir/$$p" && \
                ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
                ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \
                cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; \
-         done; } ; } && \
+       done && \
        ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
 
 install-gitweb:
index c101f006f6b5d7d185aa97081fb9717de92b09cd..a78dbd83bf04c7080487b8508321d79d848e9b1f 100644 (file)
@@ -343,9 +343,13 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, int
        if (!pathspec || !*pathspec) {
                fd = hold_locked_index(&index_lock, 1);
                refresh_cache_or_die(refresh_flags);
-               if (write_cache(fd, active_cache, active_nr) ||
-                   commit_locked_index(&index_lock))
-                       die("unable to write new_index file");
+               if (active_cache_changed) {
+                       if (write_cache(fd, active_cache, active_nr) ||
+                           commit_locked_index(&index_lock))
+                               die("unable to write new_index file");
+               } else {
+                       rollback_lock_file(&index_lock);
+               }
                commit_style = COMMIT_AS_IS;
                return get_index_file();
        }
@@ -1085,9 +1089,11 @@ int cmd_status(int argc, const char **argv, const char *prefix)
 
        fd = hold_locked_index(&index_lock, 0);
        if (0 <= fd) {
-               if (!write_cache(fd, active_cache, active_nr))
+               if (active_cache_changed &&
+                   !write_cache(fd, active_cache, active_nr))
                        commit_locked_index(&index_lock);
-               rollback_lock_file(&index_lock);
+               else
+                       rollback_lock_file(&index_lock);
        }
 
        s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
index 232cd1ce07bf3f695c722e6217ce653ff704d64b..597f76bc42f51e0fc1906c287981e3d37dc0f536 100644 (file)
@@ -1001,6 +1001,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
        if (show_in_pager == default_pager)
                show_in_pager = git_pager(1);
        if (show_in_pager) {
+               opt.color = 0;
                opt.name_only = 1;
                opt.null_following_name = 1;
                opt.output_priv = &path_list;
index 8bdcab11389e8b4facab355f27f0e1926134b86f..9ad1e66916545dd2aeeb110661e56edfa5921019 100644 (file)
@@ -219,14 +219,9 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
         * "-m ent" or "--reset ent" form), we can obtain a fully
         * valid cache-tree because the index must match exactly
         * what came from the tree.
-        *
-        * The same holds true if we are switching between two trees
-        * using read-tree -m A B.  The index must match B after that.
         */
        if (nr_trees == 1 && !opts.prefix)
                prime_cache_tree(&active_cache_tree, trees[0]);
-       else if (nr_trees == 2 && opts.merge)
-               prime_cache_tree(&active_cache_tree, trees[1]);
 
        if (write_cache(newfd, active_cache, active_nr) ||
            commit_locked_index(&lock_file))
diff --git a/diff.c b/diff.c
index 3aa695df62d2f13beed4b4ac54e3ea568194ae02..17873f3d9e88fccbf98e790d243397dcc4ccb24b 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2627,8 +2627,7 @@ static void fill_metainfo(struct strbuf *msg,
                            (!fill_mmfile(&mf, two) && diff_filespec_is_binary(two)))
                                abbrev = 40;
                }
-               strbuf_addf(msg, "%s%sindex %s..", set,
-                           line_prefix,
+               strbuf_addf(msg, "%s%sindex %s..", line_prefix, set,
                            find_unique_abbrev(one->sha1, abbrev));
                strbuf_addstr(msg, find_unique_abbrev(two->sha1, abbrev));
                if (one->mode == two->mode)
index 6b86abc64bfe0034caf23cf9530955128766de32..31e68603f4e8124fd67f42c8aae6033a792892cb 100755 (executable)
@@ -263,10 +263,10 @@ pick_one_preserving_merges () {
        then
                if test "$fast_forward" = t
                then
-                       cat "$DOTEST"/current-commit | while read current_commit
+                       while read current_commit
                        do
                                git rev-parse HEAD > "$REWRITTEN"/$current_commit
-                       done
+                       done <"$DOTEST"/current-commit
                        rm "$DOTEST"/current-commit ||
                        die "Cannot write current commit's replacement sha1"
                fi
@@ -440,9 +440,9 @@ record_in_rewritten() {
        echo "$oldsha1" >> "$REWRITTEN_PENDING"
 
        case "$(peek_next_command)" in
-           squash|s|fixup|f)
+       squash|s|fixup|f)
                ;;
-           *)
+       *)
                flush_rewritten_pending
                ;;
        esac
@@ -450,7 +450,7 @@ record_in_rewritten() {
 
 do_next () {
        rm -f "$MSG" "$AUTHOR_SCRIPT" "$AMEND" || exit
-       read command sha1 rest < "$TODO"
+       read -r command sha1 rest < "$TODO"
        case "$command" in
        '#'*|''|noop)
                mark_action_done
@@ -591,7 +591,7 @@ do_rest () {
 # skip picking commits whose parents are unchanged
 skip_unnecessary_picks () {
        fd=3
-       while read command sha1 rest
+       while read -r command sha1 rest
        do
                # fd=3 means we skip the command
                case "$fd,$command,$(git rev-parse --verify --quiet $sha1^)" in
@@ -644,13 +644,13 @@ rearrange_squash () {
        test -s "$1.sq" || return
 
        used=
-       while read pick sha1 message
+       while read -r pick sha1 message
        do
                case " $used" in
                *" $sha1 "*) continue ;;
                esac
                echo "$pick $sha1 $message"
-               while read squash action msg
+               while read -r squash action msg
                do
                        case "$message" in
                        "$msg"*)
@@ -890,7 +890,8 @@ first and then run 'git rebase --continue' again."
                git rev-list $MERGES_OPTION --pretty=oneline --abbrev-commit \
                        --abbrev=7 --reverse --left-right --topo-order \
                        $REVISIONS | \
-                       sed -n "s/^>//p" | while read shortsha1 rest
+                       sed -n "s/^>//p" |
+               while read -r shortsha1 rest
                do
                        if test t != "$PRESERVE_MERGES"
                        then
index d9950c2b7fadef0876867e11ef26283ca1cfaf1e..ad2417d1b0827b80ec884009447adada0ddb8173 100755 (executable)
@@ -234,12 +234,12 @@ cmd_add()
                ) || die "Unable to checkout submodule '$path'"
        fi
 
-       git add "$path" ||
+       git add --force "$path" ||
        die "Failed to add submodule '$path'"
 
        git config -f .gitmodules submodule."$path".path "$path" &&
        git config -f .gitmodules submodule."$path".url "$repo" &&
-       git add .gitmodules ||
+       git add --force .gitmodules ||
        die "Failed to register submodule '$path'"
 }
 
index 1f611d22d4c4d5b00491f98eff5c4749900333e9..cedc3573136922d424971ef2a16feeb82496c37d 100755 (executable)
@@ -1327,8 +1327,7 @@ sub esc_param {
 sub esc_url {
        my $str = shift;
        return undef unless defined $str;
-       $str =~ s/([^A-Za-z0-9\-_.~();\/;?:@&=])/sprintf("%%%02X", ord($1))/eg;
-       $str =~ s/\+/%2B/g;
+       $str =~ s/([^A-Za-z0-9\-_.~();\/;?:@&= ]+)/CGI::escape($1)/eg;
        $str =~ s/ /\+/g;
        return $str;
 }
diff --git a/setup.c b/setup.c
index 7e0460205dc1d15007849f367d21e999f2da044c..87c21f02e0e3bedb42305bbfe2b4223885d4250f 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -323,7 +323,8 @@ const char *setup_git_directory_gently(int *nongit_ok)
        const char *gitdirenv;
        const char *gitfile_dir;
        int len, offset, ceil_offset, root_len;
-       int current_device = 0, one_filesystem = 1;
+       dev_t current_device = 0;
+       int one_filesystem = 1;
        struct stat buf;
 
        /*
index b70b891b628d1e5d7fe68b4d303c17fdd0416981..81ef2a0969d98f05ce22cd8a06fcb55a7af9aee8 100644 (file)
@@ -76,12 +76,12 @@ gitweb_run () {
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping gitweb tests, perl not available'
+       skip_all='skipping gitweb tests, perl not available'
        test_done
 fi
 
 perl -MEncode -e 'decode_utf8("", Encode::FB_CROAK)' >/dev/null 2>&1 || {
-    say 'skipping gitweb tests, perl version is too old'
+    skip_all='skipping gitweb tests, perl version is too old'
     test_done
 }
 
index 4b3b793730604e5b513c5017f39f4560b3083338..648d1619c86bb676faadf62bd831683cb46d6be2 100644 (file)
@@ -9,7 +9,7 @@ export HOME
 
 if ! type cvs >/dev/null 2>&1
 then
-       say 'skipping cvsimport tests, cvs not found'
+       skip_all='skipping cvsimport tests, cvs not found'
        test_done
 fi
 
@@ -21,11 +21,11 @@ case "$cvsps_version" in
 2.1 | 2.2*)
        ;;
 '')
-       say 'skipping cvsimport tests, cvsps not found'
+       skip_all='skipping cvsimport tests, cvsps not found'
        test_done
        ;;
 *)
-       say 'skipping cvsimport tests, unsupported cvsps version'
+       skip_all='skipping cvsimport tests, unsupported cvsps version'
        test_done
        ;;
 esac
index 344785dd7da05d68a4c268b2bf3a8eeb425912d0..c3f6676ca2c4a37cbe1cf2779e97a678c1345559 100644 (file)
@@ -21,7 +21,7 @@ PERL=${PERL:-perl}
 svn >/dev/null 2>&1
 if test $? -ne 1
 then
-    say 'skipping git svn tests, svn not found'
+    skip_all='skipping git svn tests, svn not found'
     test_done
 fi
 
@@ -40,13 +40,12 @@ x=$?
 if test $x -ne 0
 then
        if test $x -eq 42; then
-               err='Perl SVN libraries must be >= 1.1.0'
+               skip_all='Perl SVN libraries must be >= 1.1.0'
        elif test $x -eq 41; then
-               err='svnadmin failed to create fsfs repository'
+               skip_all='svnadmin failed to create fsfs repository'
        else
-               err='Perl SVN libraries not found or unusable, skipping test'
+               skip_all='Perl SVN libraries not found or unusable'
        fi
-       say "$err"
        test_done
 fi
 
@@ -159,7 +158,7 @@ EOF
 require_svnserve () {
     if test -z "$SVNSERVE_PORT"
     then
-        say 'skipping svnserve test. (set $SVNSERVE_PORT to enable)'
+       skip_all='skipping svnserve test. (set $SVNSERVE_PORT to enable)'
         test_done
     fi
 }
index a0944d662c7c6bc2ea331c8f7ce2a2b8b43bd530..71effc5becd09d1289361767f6f54af8f1594627 100644 (file)
@@ -45,7 +45,7 @@ HTTPD_DOCUMENT_ROOT_PATH=$HTTPD_ROOT_PATH/www
 
 if ! test -x "$LIB_HTTPD_PATH"
 then
-       say "skipping test, no web server found at '$LIB_HTTPD_PATH'"
+       skip_all="skipping test, no web server found at '$LIB_HTTPD_PATH'"
        test_done
 fi
 
@@ -58,12 +58,12 @@ then
        then
                if ! test $HTTPD_VERSION -ge 2
                then
-                       say "skipping test, at least Apache version 2 is required"
+                       skip_all="skipping test, at least Apache version 2 is required"
                        test_done
                fi
                if ! test -d "$DEFAULT_HTTPD_MODULE_PATH"
                then
-                       say "Apache module directory not found.  Skipping tests."
+                       skip_all="Apache module directory not found.  Skipping tests."
                        test_done
                fi
 
@@ -118,7 +118,7 @@ start_httpd() {
                >&3 2>&4
        if test $? -ne 0
        then
-               say "skipping test, web server setup failed"
+               skip_all="skipping test, web server setup failed"
                trap 'die' EXIT
                test_done
        fi
index ce36f34d0337d29f6ec8f274cd99ad201bd3965d..375e2486511656df4294f0a4b750fd8d3f16d273 100644 (file)
@@ -3,7 +3,7 @@
 . ./test-lib.sh
 
 if ! test_have_prereq PERL; then
-       say 'skipping --patch tests, perl not available'
+       skip_all='skipping --patch tests, perl not available'
        test_done
 fi
 
index 09f855af3e9cded903c828f3f946a0c2403ddcdf..93e58c00e886db22b5ebf86af103efc4e65ec832 100755 (executable)
@@ -13,6 +13,7 @@ test_expect_success 'sigchain works' '
        test-sigchain >actual
        case "$?" in
        143) true ;; # POSIX w/ SIGTERM=15
+       271) true ;; # ksh w/ SIGTERM=15
          3) true ;; # Windows
          *) false ;;
        esac &&
index 6327d205cb89b00e77502031e3b56b4b895cc32d..0c562bb820cb747a8f0d0df1eabb39da0b9eea21 100755 (executable)
@@ -390,4 +390,20 @@ test_expect_success \
      git ls-files --stage | tee >treeMcheck.out &&
      test_cmp treeM.out treeMcheck.out'
 
+test_expect_success '-m references the correct modified tree' '
+       echo >file-a &&
+       echo >file-b &&
+       git add file-a file-b &&
+       git commit -a -m "test for correct modified tree"
+       git branch initial-mod &&
+       echo b >file-b &&
+       git commit -a -m "B" &&
+       echo a >file-a &&
+       git add file-a &&
+       git ls-tree $(git write-tree) file-a >expect &&
+       git read-tree -m HEAD initial-mod &&
+       git ls-tree $(git write-tree) file-a >actual &&
+       test_cmp expect actual
+'
+
 test_done
index ee9a1b25e6a35adcb2350068d3b63b50bc9c24b3..47ca88fc5231a5e0689b43a35eb660285a73190d 100755 (executable)
@@ -630,4 +630,22 @@ test_expect_success 'always cherry-pick with --no-ff' '
        test_cmp empty out
 '
 
+test_expect_success 'set up commits with funny messages' '
+       git checkout -b funny A &&
+       echo >>file1 &&
+       test_tick &&
+       git commit -a -m "end with slash\\" &&
+       echo >>file1 &&
+       test_tick &&
+       git commit -a -m "another commit"
+'
+
+test_expect_success 'rebase-i history with funny messages' '
+       git rev-list A..funny >expect &&
+       test_tick &&
+       FAKE_LINES="1 2" git rebase -i A &&
+       git rev-list A.. >actual &&
+       test_cmp expect actual
+'
+
 test_done
index 4ee7b65ce6d86be5f4debec6ca5021231e8d69de..637d8e97ac4d220437ac168dcce49dfd33aa7a24 100755 (executable)
@@ -15,7 +15,7 @@ if sys.hexversion < 0x02040000:
 then
        :
 else
-       say 'skipping git remote-testgit tests: requires Python 2.4 or newer'
+       skip_all='skipping git remote-testgit tests: requires Python 2.4 or newer'
        test_done
 fi
 
index fe60d699a3d6d00a734e9f0bbc502828c5244b7e..26ddf9d496f6eacddbec603659be7fca3dff294b 100755 (executable)
@@ -113,7 +113,7 @@ done
 
 if ! echo 'echo space > "$1"' > "e space.sh"
 then
-       say "Skipping; FS does not support spaces in filenames"
+       skip_all="Skipping; FS does not support spaces in filenames"
        test_done
 fi
 
index 97ff074da768cbf3418f22b366ff935d82915f85..d9f27859932c33e126fa64c5c1fb80963dabb97a 100755 (executable)
@@ -42,7 +42,8 @@ test_expect_success 'setup - hide init subdirectory' '
 '
 
 test_expect_success 'setup - repository to add submodules to' '
-       git init addtest
+       git init addtest &&
+       git init addtest-ignore
 '
 
 # The 'submodule add' tests need some repository to add as a submodule.
@@ -85,6 +86,27 @@ test_expect_success 'submodule add' '
        test_cmp empty untracked
 '
 
+test_expect_success 'submodule add to .gitignored path' '
+       echo "refs/heads/master" >expect &&
+       >empty &&
+
+       (
+               cd addtest-ignore &&
+               # Does not use test_commit due to the ignore
+               echo "*" > .gitignore &&
+               git add --force .gitignore &&
+               git commit -m"Ignore everything" &&
+               git submodule add "$submodurl" submod &&
+               git submodule init
+       ) &&
+
+       rm -f heads head untracked &&
+       inspect addtest/submod ../.. &&
+       test_cmp expect heads &&
+       test_cmp expect head &&
+       test_cmp empty untracked
+'
+
 test_expect_success 'submodule add --branch' '
        echo "refs/heads/initial" >expect-head &&
        cat <<-\EOF >expect-heads &&
index c1104413445b18bb1532931183e1c529632ad527..568a6f2b69ab5003c00f206806c3fe6289f63a98 100755 (executable)
@@ -125,6 +125,21 @@ test_expect_success 'modified file' '
        test_cmp empty out
 '
 
+test_config() {
+       git config "$1" "$2" &&
+       test_when_finished "git config --unset $1"
+}
+
+test_expect_success 'copes with color settings' '
+       rm -f actual &&
+       echo grep.h >expect &&
+       test_config color.grep always &&
+       test_config color.grep.filename yellow &&
+       test_config color.grep.separator green &&
+       git grep -O'\''printf "%s\n" >actual'\'' GREP_AND &&
+       test_cmp expect actual
+'
+
 test_expect_success 'run from subdir' '
        rm -f actual &&
        echo grep.c >expect &&
index 7d7acc30b4a64ba97afe06e03c65ebca4ca7f242..63fc982c8cdbd9c19eb06bba58ad5e86da5dd03e 100755 (executable)
@@ -28,48 +28,52 @@ test_expect_success 'setup svnrepo' '
        svn_cmd cp -m "trailing .lock" "$svnrepo/pr ject/trunk" \
                        "$svnrepo/pr ject/branches/trailing_dotlock.lock" &&
        svn_cmd cp -m "reflog" "$svnrepo/pr ject/trunk" \
-                       "$svnrepo/pr ject/branches/not-a@{0}reflog" &&
+                       "$svnrepo/pr ject/branches/not-a%40{0}reflog" &&
        start_httpd
        '
 
 test_expect_success 'test clone with funky branch names' '
        git svn clone -s "$svnrepo/pr ject" project &&
-       cd project &&
+       (
+               cd project &&
                git rev-parse "refs/remotes/fun%20plugin" &&
                git rev-parse "refs/remotes/more%20fun%20plugin!" &&
                git rev-parse "refs/remotes/$scary_ref" &&
                git rev-parse "refs/remotes/%2Eleading_dot" &&
                git rev-parse "refs/remotes/trailing_dot%2E" &&
                git rev-parse "refs/remotes/trailing_dotlock%2Elock" &&
-               git rev-parse "refs/remotes/not-a%40{0}reflog" &&
-       cd ..
+               git rev-parse "refs/remotes/not-a%40{0}reflog"
+       )
        '
 
 test_expect_success 'test dcommit to funky branch' "
-       cd project &&
-       git reset --hard 'refs/remotes/more%20fun%20plugin!' &&
-       echo hello >> foo &&
-       git commit -m 'hello' -- foo &&
-       git svn dcommit &&
-       cd ..
+       (
+               cd project &&
+               git reset --hard 'refs/remotes/more%20fun%20plugin!' &&
+               echo hello >> foo &&
+               git commit -m 'hello' -- foo &&
+               git svn dcommit
+       )
        "
 
 test_expect_success 'test dcommit to scary branch' '
-       cd project &&
-       git reset --hard "refs/remotes/$scary_ref" &&
-       echo urls are scary >> foo &&
-       git commit -m "eep" -- foo &&
-       git svn dcommit &&
-       cd ..
+       (
+               cd project &&
+               git reset --hard "refs/remotes/$scary_ref" &&
+               echo urls are scary >> foo &&
+               git commit -m "eep" -- foo &&
+               git svn dcommit
+       )
        '
 
 test_expect_success 'test dcommit to trailing_dotlock branch' '
-       cd project &&
-       git reset --hard "refs/remotes/trailing_dotlock%2Elock" &&
-       echo who names branches like this anyway? >> foo &&
-       git commit -m "bar" -- foo &&
-       git svn dcommit &&
-       cd ..
+       (
+               cd project &&
+               git reset --hard "refs/remotes/trailing_dotlock%2Elock" &&
+               echo who names branches like this anyway? >> foo &&
+               git commit -m "bar" -- foo &&
+               git svn dcommit
+       )
        '
 
 stop_httpd
index ac496aa479090a4cda1b6e854ed7845484fdfa06..db8371cb170c5924512a5626681f485ea3cf6884 100644 (file)
@@ -385,6 +385,7 @@ test_skip () {
                case $this_test.$test_count in
                $skp)
                        to_skip=t
+                       break
                esac
        done
        if test -z "$to_skip" && test -n "$prereq" &&
@@ -395,7 +396,7 @@ test_skip () {
        case "$to_skip" in
        t)
                say_color skip >&3 "skipping test: $@"
-               say_color skip "ok $test_count: # skip $1"
+               say_color skip "ok $test_count # skip $1"
                : true
                ;;
        *)
@@ -829,18 +830,10 @@ this_test=${0##*/}
 this_test=${this_test%%-*}
 for skp in $GIT_SKIP_TESTS
 do
-       to_skip=
-       for skp in $GIT_SKIP_TESTS
-       do
-               case "$this_test" in
-               $skp)
-                       to_skip=t
-               esac
-       done
-       case "$to_skip" in
-       t)
+       case "$this_test" in
+       $skp)
                say_color skip >&3 "skipping test $this_test altogether"
-               say_color skip "skip all tests in $this_test"
+               skip_all="skip all tests in $this_test"
                test_done
        esac
 done