]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'nd/add-empty-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 5 Feb 2014 22:02:44 +0000 (14:02 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Feb 2014 22:02:44 +0000 (14:02 -0800)
"git add -A" (no other arguments) in a totally empty working tree
used to emit an error.

* nd/add-empty-fix:
  add: don't complain when adding empty project root

63 files changed:
Documentation/CodingGuidelines
Documentation/RelNotes/1.8.4.5.txt [new file with mode: 0644]
Documentation/RelNotes/1.8.5.1.txt [new file with mode: 0644]
Documentation/RelNotes/1.8.5.2.txt [new file with mode: 0644]
Documentation/RelNotes/1.8.5.3.txt [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/git-cherry.txt
Documentation/git-fetch-pack.txt
Documentation/git-log.txt
Documentation/git.txt
Documentation/gitcli.txt
Documentation/gitmodules.txt
Documentation/glossary-content.txt
Documentation/rev-list-options.txt
Documentation/technical/api-ref-iteration.txt
Documentation/technical/http-protocol.txt
Documentation/technical/pack-heuristics.txt
GIT-VERSION-GEN
RelNotes
builtin/cat-file.c
builtin/clone.c
builtin/commit.c
builtin/diff.c
builtin/fetch-pack.c
builtin/fetch.c
builtin/for-each-ref.c
builtin/gc.c
builtin/mv.c
builtin/repack.c
builtin/rev-parse.c
connect.c
connect.h
contrib/gitview/gitview
contrib/mw-to-git/git-remote-mediawiki.perl
contrib/mw-to-git/t/test-gitmw-lib.sh
contrib/mw-to-git/t/test.config
daemon.c
fetch-pack.h
git-bisect.sh
git-send-email.perl
git-submodule.sh
log-tree.c
pathspec.c
perl/Git/SVN/Editor.pm
po/de.po
prompt.c
sha1_file.c
t/lib-read-tree.sh
t/t1005-read-tree-reset.sh
t/t1006-cat-file.sh
t/t1506-rev-parse-diagnosis.sh
t/t4205-log-pretty-formats.sh
t/t5500-fetch-pack.sh
t/t5601-clone.sh
t/t6131-pathspec-icase.sh
t/t7001-mv.sh
t/t7406-submodule-update.sh
t/t7507-commit-verbose.sh
transport.c
unpack-trees.c
wrapper.c
wt-status.c
wt-status.h

index a600e35c810b74848062dee8d74e573192c09e2c..ef67b53f721f28e5442c00273dec5f1582f555be 100644 (file)
@@ -260,9 +260,11 @@ Writing Documentation:
 
  Every user-visible change should be reflected in the documentation.
  The same general rule as for code applies -- imitate the existing
- conventions.  A few commented examples follow to provide reference
- when writing or modifying command usage strings and synopsis sections
- in the manual pages:
+ conventions.
+
+ A few commented examples follow to provide reference when writing or
+ modifying command usage strings and synopsis sections in the manual
+ pages:
 
  Placeholders are spelled in lowercase and enclosed in angle brackets:
    <file>
@@ -312,3 +314,29 @@ Writing Documentation:
    Use 'git' (all lowercase) when talking about commands i.e. something
    the user would type into a shell and use 'Git' (uppercase first letter)
    when talking about the version control system and its properties.
+
+ A few commented examples follow to provide reference when writing or
+ modifying paragraphs or option/command explanations that contain options
+ or commands:
+
+ Literal examples (e.g. use of command-line options, command names, and
+ configuration variables) are typeset in monospace, and if you can use
+ `backticks around word phrases`, do so.
+   `--pretty=oneline`
+   `git rev-list`
+   `remote.pushdefault`
+
+ Word phrases enclosed in `backtick characters` are rendered literally
+ and will not be further expanded. The use of `backticks` to achieve the
+ previous rule means that literal examples should not use AsciiDoc
+ escapes.
+   Correct:
+      `--pretty=oneline`
+   Incorrect:
+      `\--pretty=oneline`
+
+ If some place in the documentation needs to typeset a command usage
+ example with inline substitutions, it is fine to use +monospaced and
+ inline substituted text+ instead of `monospaced literal text`, and with
+ the former, the part that should not get substituted must be
+ quoted/escaped.
diff --git a/Documentation/RelNotes/1.8.4.5.txt b/Documentation/RelNotes/1.8.4.5.txt
new file mode 100644 (file)
index 0000000..215bd1a
--- /dev/null
@@ -0,0 +1,13 @@
+Git v1.8.4.5 Release Notes
+==========================
+
+Fixes since v1.8.4.4
+--------------------
+
+ * Recent update to remote-hg that attempted to make it work better
+   with non ASCII pathnames fed Unicode strings to the underlying Hg
+   API, which was wrong.
+
+ * "git submodule init" copied "submodule.$name.update" settings from
+   .gitmodules to .git/config without making sure if the suggested
+   value was sensible.
diff --git a/Documentation/RelNotes/1.8.5.1.txt b/Documentation/RelNotes/1.8.5.1.txt
new file mode 100644 (file)
index 0000000..7236aaf
--- /dev/null
@@ -0,0 +1,9 @@
+Git v1.8.5.1 Release Notes
+==========================
+
+Fixes since v1.8.5
+------------------
+
+ * "git submodule init" copied "submodule.$name.update" settings from
+   .gitmodules to .git/config without making sure if the suggested
+   value was sensible.
diff --git a/Documentation/RelNotes/1.8.5.2.txt b/Documentation/RelNotes/1.8.5.2.txt
new file mode 100644 (file)
index 0000000..3ac4984
--- /dev/null
@@ -0,0 +1,20 @@
+Git v1.8.5.2 Release Notes
+==========================
+
+Fixes since v1.8.5.1
+--------------------
+
+ * "git diff -- ':(icase)makefile'" was unnecessarily rejected at the
+   command line parser.
+
+ * "git cat-file --batch-check=ok" did not check the existence of
+   the named object.
+
+ * "git am --abort" sometimes complained about not being able to write
+   a tree with an 0{40} object in it.
+
+ * Two processes creating loose objects at the same time could have
+   failed unnecessarily when the name of their new objects started
+   with the same byte value, due to a race condition.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/1.8.5.3.txt b/Documentation/RelNotes/1.8.5.3.txt
new file mode 100644 (file)
index 0000000..3de2dd0
--- /dev/null
@@ -0,0 +1,27 @@
+Git v1.8.5.3 Release Notes
+==========================
+
+Fixes since v1.8.5.2
+--------------------
+
+ * The "--[no-]informative-errors" options to "git daemon" were parsed
+   a bit too loosely, allowing any other string after these option
+   names.
+
+ * A "gc" process running as a different user should be able to stop a
+   new "gc" process from starting.
+
+ * An earlier "clean-up" introduced an unnecessary memory leak to the
+   credential subsystem.
+
+ * "git mv A B/", when B does not exist as a directory, should error
+   out, but it didn't.
+
+ * "git rev-parse <revs> -- <paths>" did not implement the usual
+   disambiguation rules the commands in the "git log" family used in
+   the same way.
+
+ * "git cat-file --batch=", an admittedly useless command, did not
+   behave very well.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
index 705557689d7fa46f88f936bb8c42471ffbfb052b..e6d46edbe7376a9f15d4f337a341a344b5197ca4 100644 (file)
@@ -139,8 +139,15 @@ People on the Git mailing list need to be able to read and
 comment on the changes you are submitting.  It is important for
 a developer to be able to "quote" your changes, using standard
 e-mail tools, so that they may comment on specific portions of
-your code.  For this reason, all patches should be submitted
-"inline".  If your log message (including your name on the
+your code.  For this reason, each patch should be submitted
+"inline" in a separate message.
+
+Multiple related patches should be grouped into their own e-mail
+thread to help readers find all parts of the series.  To that end,
+send them as replies to either an additional "cover letter" message
+(see below), the first patch, or the respective preceding patch.
+
+If your log message (including your name on the
 Signed-off-by line) is not writable in ASCII, make sure that
 you send off a message in the correct encoding.
 
index 2d0daae626dd8e58c5a5c72ef999e36f56bcdce7..0ea921a5931647f21f74a44a80622c3d3c16827c 100644 (file)
@@ -3,7 +3,7 @@ git-cherry(1)
 
 NAME
 ----
-git-cherry - Find commits not merged upstream
+git-cherry - Find commits yet to be applied to upstream
 
 SYNOPSIS
 --------
@@ -12,46 +12,26 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-The changeset (or "diff") of each commit between the fork-point and <head>
-is compared against each commit between the fork-point and <upstream>.
-The diffs are compared after removing any whitespace and line numbers.
+Determine whether there are commits in `<head>..<upstream>` that are
+equivalent to those in the range `<limit>..<head>`.
 
-Every commit that doesn't exist in the <upstream> branch
-has its id (sha1) reported, prefixed by a symbol.  The ones that have
-equivalent change already
-in the <upstream> branch are prefixed with a minus (-) sign, and those
-that only exist in the <head> branch are prefixed with a plus (+) symbol:
-
-               __*__*__*__*__> <upstream>
-              /
-    fork-point
-              \__+__+__-__+__+__-__+__> <head>
-
-
-If a <limit> has been given then the commits along the <head> branch up
-to and including <limit> are not reported:
-
-               __*__*__*__*__> <upstream>
-              /
-    fork-point
-              \__*__*__<limit>__-__+__> <head>
-
-
-Because 'git cherry' compares the changeset rather than the commit id
-(sha1), you can use 'git cherry' to find out if a commit you made locally
-has been applied <upstream> under a different commit id.  For example,
-this will happen if you're feeding patches <upstream> via email rather
-than pushing or pulling commits directly.
+The equivalence test is based on the diff, after removing whitespace
+and line numbers.  git-cherry therefore detects when commits have been
+"copied" by means of linkgit:git-cherry-pick[1], linkgit:git-am[1] or
+linkgit:git-rebase[1].
 
+Outputs the SHA1 of every commit in `<limit>..<head>`, prefixed with
+`-` for commits that have an equivalent in <upstream>, and `+` for
+commits that do not.
 
 OPTIONS
 -------
 -v::
-       Verbose.
+       Show the commit subjects next to the SHA1s.
 
 <upstream>::
-       Upstream branch to compare against.
-       Defaults to the first tracked remote branch, if available.
+       Upstream branch to search for equivalent commits.
+       Defaults to the upstream branch of HEAD.
 
 <head>::
        Working branch; defaults to HEAD.
@@ -59,6 +39,103 @@ OPTIONS
 <limit>::
        Do not report commits up to (and including) limit.
 
+EXAMPLES
+--------
+
+Patch workflows
+~~~~~~~~~~~~~~~
+
+git-cherry is frequently used in patch-based workflows (see
+linkgit:gitworkflows[7]) to determine if a series of patches has been
+applied by the upstream maintainer.  In such a workflow you might
+create and send a topic branch like this:
+
+------------
+$ git checkout -b topic origin/master
+# work and create some commits
+$ git format-patch origin/master
+$ git send-email ... 00*
+------------
+
+Later, you can see whether your changes have been applied by saying
+(still on `topic`):
+
+------------
+$ git fetch  # update your notion of origin/master
+$ git cherry -v
+------------
+
+Concrete example
+~~~~~~~~~~~~~~~~
+
+In a situation where topic consisted of three commits, and the
+maintainer applied two of them, the situation might look like:
+
+------------
+$ git log --graph --oneline --decorate --boundary origin/master...topic
+* 7654321 (origin/master) upstream tip commit
+[... snip some other commits ...]
+* cccc111 cherry-pick of C
+* aaaa111 cherry-pick of A
+[... snip a lot more that has happened ...]
+| * cccc000 (topic) commit C
+| * bbbb000 commit B
+| * aaaa000 commit A
+|/
+o 1234567 branch point
+------------
+
+In such cases, git-cherry shows a concise summary of what has yet to
+be applied:
+
+------------
+$ git cherry origin/master topic
+- cccc000... commit C
++ bbbb000... commit B
+- aaaa000... commit A
+------------
+
+Here, we see that the commits A and C (marked with `-`) can be
+dropped from your `topic` branch when you rebase it on top of
+`origin/master`, while the commit B (marked with `+`) still needs to
+be kept so that it will be sent to be applied to `origin/master`.
+
+
+Using a limit
+~~~~~~~~~~~~~
+
+The optional <limit> is useful in cases where your topic is based on
+other work that is not in upstream.  Expanding on the previous
+example, this might look like:
+
+------------
+$ git log --graph --oneline --decorate --boundary origin/master...topic
+* 7654321 (origin/master) upstream tip commit
+[... snip some other commits ...]
+* cccc111 cherry-pick of C
+* aaaa111 cherry-pick of A
+[... snip a lot more that has happened ...]
+| * cccc000 (topic) commit C
+| * bbbb000 commit B
+| * aaaa000 commit A
+| * 0000fff (base) unpublished stuff F
+[... snip ...]
+| * 0000aaa unpublished stuff A
+|/
+o 1234567 merge-base between upstream and topic
+------------
+
+By specifying `base` as the limit, you can avoid listing commits
+between `base` and `topic`:
+
+------------
+$ git cherry origin/master topic base
+- cccc000... commit C
++ bbbb000... commit B
+- aaaa000... commit A
+------------
+
+
 SEE ALSO
 --------
 linkgit:git-patch-id[1]
index 444b805d350a6111d56b53d19fe155eb7b79038b..93b50679461a201badf62afe5ed3931bbdfa88e5 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
 'git fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag]
        [--upload-pack=<git-upload-pack>]
        [--depth=<n>] [--no-progress]
-       [-v] [<host>:]<directory> [<refs>...]
+       [-v] <repository> [<refs>...]
 
 DESCRIPTION
 -----------
@@ -97,19 +97,18 @@ be in a separate packet, and the list must end with a flush packet.
 -v::
        Run verbosely.
 
-<host>::
-       A remote host that houses the repository.  When this
-       part is specified, 'git-upload-pack' is invoked via
-       ssh.
-
-<directory>::
-       The repository to sync from.
+<repository>::
+       The URL to the remote repository.
 
 <refs>...::
        The remote heads to update from. This is relative to
        $GIT_DIR (e.g. "HEAD", "refs/heads/master").  When
        unspecified, update from all heads the remote side has.
 
+SEE ALSO
+--------
+linkgit:git-fetch[1]
+
 GIT
 ---
 Part of the linkgit:git[1] suite
index 34097efea707aa59b6a5703826445f5c3fccabcf..1f7bc67d6cc8a842151fc2e4705ecc4e6fb8392e 100644 (file)
@@ -15,9 +15,9 @@ DESCRIPTION
 -----------
 Shows the commit logs.
 
-The command takes options applicable to the 'git rev-list'
+The command takes options applicable to the `git rev-list`
 command to control what is shown and how, and options applicable to
-the 'git diff-*' commands to control how the changes
+the `git diff-*` commands to control how the changes
 each commit introduces are shown.
 
 
@@ -42,29 +42,27 @@ OPTIONS
 
 --use-mailmap::
        Use mailmap file to map author and committer names and email
-       to canonical real names and email addresses. See
+       addresses to canonical real names and email addresses. See
        linkgit:git-shortlog[1].
 
 --full-diff::
-       Without this flag, "git log -p <path>..." shows commits that
+       Without this flag, `git log -p <path>...` shows commits that
        touch the specified paths, and diffs about the same specified
        paths.  With this, the full diff is shown for commits that touch
        the specified paths; this means that "<path>..." limits only
        commits, and doesn't limit diff for those commits.
 +
 Note that this affects all diff-based output types, e.g. those
-produced by --stat etc.
+produced by `--stat`, etc.
 
 --log-size::
-       Before the log message print out its size in bytes. Intended
-       mainly for porcelain tools consumption. If Git is unable to
-       produce a valid value size is set to zero.
-       Note that only message is considered, if also a diff is shown
-       its size is not included.
+       Include a line ``log size <number>'' in the output for each commit,
+       where <number> is the length of that commit's message in bytes.
+       Intended to speed up tools that read log messages from `git log`
+       output by allowing them to allocate space in advance.
 
 -L <start>,<end>:<file>::
 -L :<regex>:<file>::
-
        Trace the evolution of the line range given by "<start>,<end>"
        (or the funcname regex <regex>) within the <file>.  You may
        not give any pathspec limiters.  This is currently limited to
@@ -80,16 +78,16 @@ include::line-range-format.txt[]
        whole history leading to the current commit).  `origin..HEAD`
        specifies all the commits reachable from the current commit
        (i.e. `HEAD`), but not from `origin`. For a complete list of
-       ways to spell <revision range>, see the "Specifying Ranges"
+       ways to spell <revision range>, see the 'Specifying Ranges'
        section of linkgit:gitrevisions[7].
 
 [\--] <path>...::
        Show only commits that are enough to explain how the files
-       that match the specified paths came to be.  See "History
-       Simplification" below for details and other simplification
+       that match the specified paths came to be.  See 'History
+       Simplification' below for details and other simplification
        modes.
 +
-Paths may need to be prefixed with "\-- " to separate them from
+Paths may need to be prefixed with ``\-- '' to separate them from
 options or the revision range, when confusion arises.
 
 include::rev-list-options.txt[]
@@ -113,12 +111,12 @@ EXAMPLES
 `git log v2.6.12.. include/scsi drivers/scsi`::
 
        Show all commits since version 'v2.6.12' that changed any file
-       in the include/scsi or drivers/scsi subdirectories
+       in the `include/scsi` or `drivers/scsi` subdirectories
 
 `git log --since="2 weeks ago" -- gitk`::
 
        Show the changes during the last two weeks to the file 'gitk'.
-       The "--" is necessary to avoid confusion with the *branch* named
+       The ``--'' is necessary to avoid confusion with the *branch* named
        'gitk'
 
 `git log --name-status release..test`::
@@ -129,7 +127,7 @@ EXAMPLES
 
 `git log --follow builtin/rev-list.c`::
 
-       Shows the commits that changed builtin/rev-list.c, including
+       Shows the commits that changed `builtin/rev-list.c`, including
        those commits that occurred before the file was given its
        present name.
 
@@ -147,17 +145,18 @@ EXAMPLES
 `git log -p -m --first-parent`::
 
        Shows the history including change diffs, but only from the
-       "main branch" perspective, skipping commits that come from merged
+       ``main branch'' perspective, skipping commits that come from merged
        branches, and showing full diffs of changes introduced by the merges.
        This makes sense only when following a strict policy of merging all
        topic branches when staying on a single integration branch.
 
 `git log -L '/int main/',/^}/:main.c`::
 
-       Shows how the function `main()` in the file 'main.c' evolved
+       Shows how the function `main()` in the file `main.c` evolved
        over time.
 
 `git log -3`::
+
        Limits the number of commits to show to 3.
 
 DISCUSSION
@@ -172,12 +171,12 @@ See linkgit:git-config[1] for core variables and linkgit:git-diff[1]
 for settings related to diff generation.
 
 format.pretty::
-       Default for the `--format` option.  (See "PRETTY FORMATS" above.)
-       Defaults to "medium".
+       Default for the `--format` option.  (See 'Pretty Formats' above.)
+       Defaults to `medium`.
 
 i18n.logOutputEncoding::
-       Encoding to use when displaying logs.  (See "Discussion", above.)
-       Defaults to the value of `i18n.commitEncoding` if set, UTF-8
+       Encoding to use when displaying logs.  (See 'Discussion' above.)
+       Defaults to the value of `i18n.commitEncoding` if set, and UTF-8
        otherwise.
 
 log.date::
@@ -186,7 +185,7 @@ log.date::
        dates like `Sat May 8 19:35:34 2010 -0500`.
 
 log.showroot::
-       If `false`, 'git log' and related commands will not treat the
+       If `false`, `git log` and related commands will not treat the
        initial commit as a big creation event.  Any root commits in
        `git log -p` output would be shown without a diff attached.
        The default is `true`.
@@ -197,7 +196,7 @@ mailmap.*::
 notes.displayRef::
        Which refs, in addition to the default set by `core.notesRef`
        or 'GIT_NOTES_REF', to read notes from when showing commit
-       messages with the 'log' family of commands.  See
+       messages with the `log` family of commands.  See
        linkgit:git-notes[1].
 +
 May be an unabbreviated ref name or a glob and may be specified
index b73a24a3c78c72c8cb6e75b0e14a45cb0e0b42e9..388b19633ea21cbf1e66bb32d7d08c7fcda4b890 100644 (file)
@@ -43,14 +43,18 @@ unreleased) version of Git, that is available from 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
-* link:v1.8.5/git.html[documentation for release 1.8.5]
+* link:v1.8.5.3/git.html[documentation for release 1.8.5.3]
 
 * release notes for
+  link:RelNotes/1.8.5.3.txt[1.8.5.3],
+  link:RelNotes/1.8.5.2.txt[1.8.5.2],
+  link:RelNotes/1.8.5.1.txt[1.8.5.1],
   link:RelNotes/1.8.5.txt[1.8.5].
 
-* link:v1.8.4.4/git.html[documentation for release 1.8.4.4]
+* link:v1.8.4.5/git.html[documentation for release 1.8.4.5]
 
 * release notes for
+  link:RelNotes/1.8.4.5.txt[1.8.4.5],
   link:RelNotes/1.8.4.4.txt[1.8.4.4],
   link:RelNotes/1.8.4.3.txt[1.8.4.3],
   link:RelNotes/1.8.4.2.txt[1.8.4.2],
index 3146413cce0d732e89d5f4e9b3fd519a347ee17d..41bed2983f936bc936cb7e655ceb3ce04146aeeb 100644 (file)
@@ -83,12 +83,12 @@ scripting Git:
    `git log -1 HEAD` but write `git log -1 HEAD --`; the former will not work
    if you happen to have a file called `HEAD` in the work tree.
 
- * many commands allow a long option "--option" to be abbreviated
+ * many commands allow a long option `--option` to be abbreviated
    only to their unique prefix (e.g. if there is no other option
-   whose name begins with "opt", you may be able to spell "--opt" to
-   invoke the "--option" flag), but you should fully spell them out
+   whose name begins with `opt`, you may be able to spell `--opt` to
+   invoke the `--option` flag), but you should fully spell them out
    when writing your scripts; later versions of Git may introduce a
-   new option whose name shares the same prefix, e.g. "--optimize",
+   new option whose name shares the same prefix, e.g. `--optimize`,
    to make a short prefix that used to be unique no longer unique.
 
 
@@ -149,7 +149,7 @@ prefix of a long option as if it is fully spelled out, but use this
 with a caution.  For example, `git commit --amen` behaves as if you
 typed `git commit --amend`, but that is true only until a later version
 of Git introduces another option that shares the same prefix,
-e.g `git commit --amenity" option.
+e.g. `git commit --amenity` option.
 
 
 Separating argument from the option
index f7be93f6317c7170af642c43d107a6617eb33a18..347a9f76ee809c3691dc6580b0fba3ebde0b0e3c 100644 (file)
@@ -35,6 +35,8 @@ submodule.<name>.url::
        linkgit:git-clone[1] or (if it begins with ./ or ../) a location
        relative to the superproject's origin repository.
 
+In addition, there are a number of optional keys:
+
 submodule.<name>.update::
        Defines what to do when the submodule is updated by the superproject.
        If 'checkout' (the default), the new commit specified in the
index e4706615be147f71a4c840e386f14d141b4436aa..aa1c8880dd491a5840492d610c44fec6e07684ca 100644 (file)
@@ -362,12 +362,12 @@ full pathname may have special meaning:
 
  - A leading "`**`" followed by a slash means match in all
    directories. For example, "`**/foo`" matches file or directory
-   "`foo`" anywhere, the same as pattern "`foo`". "**/foo/bar"
+   "`foo`" anywhere, the same as pattern "`foo`". "`**/foo/bar`"
    matches file or directory "`bar`" anywhere that is directly
    under directory "`foo`".
 
- - A trailing "/**" matches everything inside. For example,
-   "abc/**" matches all files inside directory "abc", relative
+ - A trailing "`/**`" matches everything inside. For example,
+   "`abc/**`" matches all files inside directory "abc", relative
    to the location of the `.gitignore` file, with infinite depth.
 
  - A slash followed by two consecutive asterisks then a slash
index ec86d091993fc32c2ecc18bbefe019c98886beae..2991d70a4a24d10c7f121b766d5f52545414b591 100644 (file)
@@ -18,33 +18,27 @@ ordering and formatting options, such as `--reverse`.
 -<number>::
 -n <number>::
 --max-count=<number>::
-
        Limit the number of commits to output.
 
 --skip=<number>::
-
        Skip 'number' commits before starting to show the commit output.
 
 --since=<date>::
 --after=<date>::
-
        Show commits more recent than a specific date.
 
 --until=<date>::
 --before=<date>::
-
        Show commits older than a specific date.
 
 ifdef::git-rev-list[]
 --max-age=<timestamp>::
 --min-age=<timestamp>::
-
        Limit the commits output to specified time range.
 endif::git-rev-list[]
 
 --author=<pattern>::
 --committer=<pattern>::
-
        Limit the commits output to ones with author/committer
        header lines that match the specified pattern (regular
        expression).  With more than one `--author=<pattern>`,
@@ -52,7 +46,6 @@ endif::git-rev-list[]
        chosen (similarly for multiple `--committer=<pattern>`).
 
 --grep-reflog=<pattern>::
-
        Limit the commits output to ones with reflog entries that
        match the specified pattern (regular expression). With
        more than one `--grep-reflog`, commits whose reflog message
@@ -60,7 +53,6 @@ endif::git-rev-list[]
        error to use this option unless `--walk-reflogs` is in use.
 
 --grep=<pattern>::
-
        Limit the commits output to ones with log message that
        matches the specified pattern (regular expression).  With
        more than one `--grep=<pattern>`, commits whose message
@@ -71,46 +63,39 @@ When `--show-notes` is in effect, the message from the notes as
 if it is part of the log message.
 
 --all-match::
-       Limit the commits output to ones that match all given --grep,
+       Limit the commits output to ones that match all given `--grep`,
        instead of ones that match at least one.
 
 -i::
 --regexp-ignore-case::
-
-       Match the regexp limiting patterns without regard to letters case.
+       Match the regular expression limiting patterns without regard to letter
+       case.
 
 --basic-regexp::
-
        Consider the limiting patterns to be basic regular expressions;
        this is the default.
 
 -E::
 --extended-regexp::
-
        Consider the limiting patterns to be extended regular expressions
        instead of the default basic regular expressions.
 
 -F::
 --fixed-strings::
-
        Consider the limiting patterns to be fixed strings (don't interpret
        pattern as a regular expression).
 
 --perl-regexp::
-
-       Consider the limiting patterns to be Perl-compatible regexp.
+       Consider the limiting patterns to be Perl-compatible regular expressions.
        Requires libpcre to be compiled in.
 
 --remove-empty::
-
        Stop when a given path disappears from the tree.
 
 --merges::
-
        Print only merge commits. This is exactly the same as `--min-parents=2`.
 
 --no-merges::
-
        Do not print commits with more than one parent. This is
        exactly the same as `--max-parents=1`.
 
@@ -118,7 +103,6 @@ if it is part of the log message.
 --max-parents=<number>::
 --no-min-parents::
 --no-max-parents::
-
        Show only commits which have at least (or at most) that many parent
        commits. In particular, `--max-parents=1` is the same as `--no-merges`,
        `--min-parents=2` is the same as `--merges`.  `--max-parents=0`
@@ -138,31 +122,26 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit).
        brought in to your history by such a merge.
 
 --not::
-
        Reverses the meaning of the '{caret}' prefix (or lack thereof)
-       for all following revision specifiers, up to the next '--not'.
+       for all following revision specifiers, up to the next `--not`.
 
 --all::
-
        Pretend as if all the refs in `refs/` are listed on the
        command line as '<commit>'.
 
 --branches[=<pattern>]::
-
        Pretend as if all the refs in `refs/heads` are listed
        on the command line as '<commit>'. If '<pattern>' is given, limit
        branches to ones matching given shell glob. If pattern lacks '?',
        '{asterisk}', or '[', '/{asterisk}' at the end is implied.
 
 --tags[=<pattern>]::
-
        Pretend as if all the refs in `refs/tags` are listed
        on the command line as '<commit>'. If '<pattern>' is given, limit
        tags to ones matching given shell glob. If pattern lacks '?', '{asterisk}',
        or '[', '/{asterisk}' at the end is implied.
 
 --remotes[=<pattern>]::
-
        Pretend as if all the refs in `refs/remotes` are listed
        on the command line as '<commit>'. If '<pattern>' is given, limit
        remote-tracking branches to ones matching given shell glob.
@@ -175,13 +154,11 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit).
        or '[', '/{asterisk}' at the end is implied.
 
 --ignore-missing::
-
        Upon seeing an invalid object name in the input, pretend as if
        the bad input was not given.
 
 ifndef::git-rev-list[]
 --bisect::
-
        Pretend as if the bad bisection ref `refs/bisect/bad`
        was listed and as if it was followed by `--not` and the good
        bisection refs `refs/bisect/good-*` on the command
@@ -189,7 +166,6 @@ ifndef::git-rev-list[]
 endif::git-rev-list[]
 
 --stdin::
-
        In addition to the '<commit>' listed on the command
        line, read them from the standard input. If a '--' separator is
        seen, stop reading commits and start reading paths to limit the
@@ -197,36 +173,32 @@ endif::git-rev-list[]
 
 ifdef::git-rev-list[]
 --quiet::
-
        Don't print anything to standard output.  This form
        is primarily meant to allow the caller to
        test the exit status to see if a range of objects is fully
        connected (or not).  It is faster than redirecting stdout
-       to /dev/null as the output does not have to be formatted.
+       to `/dev/null` as the output does not have to be formatted.
 endif::git-rev-list[]
 
 --cherry-mark::
-
        Like `--cherry-pick` (see below) but mark equivalent commits
        with `=` rather than omitting them, and inequivalent ones with `+`.
 
 --cherry-pick::
-
        Omit any commit that introduces the same change as
-       another commit on the "other side" when the set of
+       another commit on the ``other side'' when the set of
        commits are limited with symmetric difference.
 +
 For example, if you have two branches, `A` and `B`, a usual way
 to list all commits on only one side of them is with
 `--left-right` (see the example below in the description of
-the `--left-right` option).  It however shows the commits that were cherry-picked
-from the other branch (for example, "3rd on b" may be cherry-picked
-from branch A).  With this option, such pairs of commits are
+the `--left-right` option). However, it shows the commits that were
+cherry-picked from the other branch (for example, ``3rd on b'' may be
+cherry-picked from branch A). With this option, such pairs of commits are
 excluded from the output.
 
 --left-only::
 --right-only::
-
        List only commits on the respective side of a symmetric range,
        i.e. only those which would be marked `<` resp. `>` by
        `--left-right`.
@@ -238,7 +210,6 @@ More precisely, `--cherry-pick --right-only --no-merges` gives the exact
 list.
 
 --cherry::
-
        A synonym for `--right-only --cherry-mark --no-merges`; useful to
        limit the output to the commits on our side and mark those that
        have been applied to the other side of a forked history with
@@ -247,30 +218,27 @@ list.
 
 -g::
 --walk-reflogs::
-
        Instead of walking the commit ancestry chain, walk
        reflog entries from the most recent one to older ones.
        When this option is used you cannot specify commits to
        exclude (that is, '{caret}commit', 'commit1..commit2',
        nor 'commit1\...commit2' notations cannot be used).
 +
-With '\--pretty' format other than oneline (for obvious reasons),
+With `--pretty` format other than `oneline` (for obvious reasons),
 this causes the output to have two extra lines of information
 taken from the reflog.  By default, 'commit@\{Nth}' notation is
 used in the output.  When the starting commit is specified as
 'commit@\{now}', output also uses 'commit@\{timestamp}' notation
-instead.  Under '\--pretty=oneline', the commit message is
+instead.  Under `--pretty=oneline`, the commit message is
 prefixed with this information on the same line.
-This option cannot be combined with '\--reverse'.
+This option cannot be combined with `--reverse`.
 See also linkgit:git-reflog[1].
 
 --merge::
-
        After a failed merge, show refs that touch files having a
        conflict and don't exist on all heads to merge.
 
 --boundary::
-
        Output excluded boundary commits. Boundary commits are
        prefixed with `-`.
 
@@ -287,11 +255,9 @@ is how to do it, as there are various strategies to simplify the history.
 The following options select the commits to be shown:
 
 <paths>::
-
        Commits modifying the given <paths> are selected.
 
 --simplify-by-decoration::
-
        Commits that are referred by some branch or tag are selected.
 
 Note that extra commits can be shown to give a meaningful history.
@@ -299,33 +265,27 @@ Note that extra commits can be shown to give a meaningful history.
 The following options affect the way the simplification is performed:
 
 Default mode::
-
        Simplifies the history to the simplest history explaining the
        final state of the tree. Simplest because it prunes some side
        branches if the end result is the same (i.e. merging branches
        with the same content)
 
 --full-history::
-
        Same as the default mode, but does not prune some history.
 
 --dense::
-
        Only the selected commits are shown, plus some to have a
        meaningful history.
 
 --sparse::
-
        All commits in the simplified history are shown.
 
 --simplify-merges::
-
-       Additional option to '--full-history' to remove some needless
+       Additional option to `--full-history` to remove some needless
        merges from the resulting history, as there are no selected
        commits contributing to this merge.
 
 --ancestry-path::
-
        When given a range of commits to display (e.g. 'commit1..commit2'
        or 'commit2 {caret}commit1'), only display commits that exist
        directly on the ancestry chain between the 'commit1' and
@@ -352,36 +312,35 @@ The horizontal line of history A---Q is taken to be the first parent of
 each merge.  The commits are:
 
 * `I` is the initial commit, in which `foo` exists with contents
-  "asdf", and a file `quux` exists with contents "quux".  Initial
+  ``asdf'', and a file `quux` exists with contents ``quux''. Initial
   commits are compared to an empty tree, so `I` is !TREESAME.
 
-* In `A`, `foo` contains just "foo".
+* In `A`, `foo` contains just ``foo''.
 
 * `B` contains the same change as `A`.  Its merge `M` is trivial and
   hence TREESAME to all parents.
 
-* `C` does not change `foo`, but its merge `N` changes it to "foobar",
+* `C` does not change `foo`, but its merge `N` changes it to ``foobar'',
   so it is not TREESAME to any parent.
 
-* `D` sets `foo` to "baz".  Its merge `O` combines the strings from
-  `N` and `D` to "foobarbaz"; i.e., it is not TREESAME to any parent.
+* `D` sets `foo` to ``baz''. Its merge `O` combines the strings from
+  `N` and `D` to ``foobarbaz''; i.e., it is not TREESAME to any parent.
 
-* `E` changes `quux` to "xyzzy", and its merge `P` combines the
-  strings to "quux xyzzy".  `P` is TREESAME to `O`, but not to `E`.
+* `E` changes `quux` to ``xyzzy'', and its merge `P` combines the
+  strings to ``quux xyzzy''. `P` is TREESAME to `O`, but not to `E`.
 
 * `X` is an independent root commit that added a new file `side`, and `Y`
   modified it. `Y` is TREESAME to `X`. Its merge `Q` added `side` to `P`, and
   `Q` is TREESAME to `P`, but not to `Y`.
 
-'rev-list' walks backwards through history, including or excluding
-commits based on whether '\--full-history' and/or parent rewriting
-(via '\--parents' or '\--children') are used.  The following settings
+`rev-list` walks backwards through history, including or excluding
+commits based on whether `--full-history` and/or parent rewriting
+(via `--parents` or `--children`) are used. The following settings
 are available.
 
 Default mode::
-
        Commits are included if they are not TREESAME to any parent
-       (though this can be changed, see '\--sparse' below).  If the
+       (though this can be changed, see `--sparse` below).  If the
        commit was a merge, and it was TREESAME to one parent, follow
        only that parent.  (Even if there are several TREESAME
        parents, follow only one of them.)  Otherwise, follow all
@@ -400,12 +359,11 @@ available, removed `B` from consideration entirely.  `C` was
 considered via `N`, but is TREESAME.  Root commits are compared to an
 empty tree, so `I` is !TREESAME.
 +
-Parent/child relations are only visible with --parents, but that does
+Parent/child relations are only visible with `--parents`, but that does
 not affect the commits selected in default mode, so we have shown the
 parent lines.
 
 --full-history without parent rewriting::
-
        This mode differs from the default in one point: always follow
        all parents of a merge, even if it is TREESAME to one of them.
        Even if more than one side of the merge has commits that are
@@ -425,9 +383,8 @@ about the parent/child relationships between the commits, so we show
 them disconnected.
 
 --full-history with parent rewriting::
-
        Ordinary commits are only included if they are !TREESAME
-       (though this can be changed, see '\--sparse' below).
+       (though this can be changed, see `--sparse` below).
 +
 Merges are always included.  However, their parent list is rewritten:
 Along each parent, prune away commits that are not included
@@ -441,7 +398,7 @@ themselves.  This results in
          `-------------'
 -----------------------------------------------------------------------
 +
-Compare to '\--full-history' without rewriting above.  Note that `E`
+Compare to `--full-history` without rewriting above.  Note that `E`
 was pruned away because it is TREESAME, but the parent list of P was
 rewritten to contain `E`'s parent `I`.  The same happened for `C` and
 `N`, and `X`, `Y` and `Q`.
@@ -450,22 +407,19 @@ In addition to the above settings, you can change whether TREESAME
 affects inclusion:
 
 --dense::
-
        Commits that are walked are included if they are not TREESAME
        to any parent.
 
 --sparse::
-
        All commits that are walked are included.
 +
-Note that without '\--full-history', this still simplifies merges: if
+Note that without `--full-history`, this still simplifies merges: if
 one of the parents is TREESAME, we follow only that one, so the other
 sides of the merge are never walked.
 
 --simplify-merges::
-
        First, build a history graph in the same way that
-       '\--full-history' with parent rewriting does (see above).
+       `--full-history` with parent rewriting does (see above).
 +
 Then simplify each commit `C` to its replacement `C'` in the final
 history according to the following rules:
@@ -484,7 +438,7 @@ history according to the following rules:
 --
 +
 The effect of this is best shown by way of comparing to
-'\--full-history' with parent rewriting.  The example turns into:
+`--full-history` with parent rewriting.  The example turns into:
 +
 -----------------------------------------------------------------------
          .-A---M---N---O
@@ -494,7 +448,7 @@ The effect of this is best shown by way of comparing to
          `---------'
 -----------------------------------------------------------------------
 +
-Note the major differences in `N`, `P` and `Q` over '--full-history':
+Note the major differences in `N`, `P`, and `Q` over `--full-history`:
 +
 --
 * `N`'s parent list had `I` removed, because it is an ancestor of the
@@ -511,11 +465,10 @@ Note the major differences in `N`, `P` and `Q` over '--full-history':
 Finally, there is a fifth simplification mode available:
 
 --ancestry-path::
-
        Limit the displayed commits to those directly on the ancestry
-       chain between the "from" and "to" commits in the given commit
-       range. I.e. only display commits that are ancestor of the "to"
-       commit, and descendants of the "from" commit.
+       chain between the ``from'' and ``to'' commits in the given commit
+       range. I.e. only display commits that are ancestor of the ``to''
+       commit and descendants of the ``from'' commit.
 +
 As an example use case, consider the following commit history:
 +
@@ -530,14 +483,14 @@ As an example use case, consider the following commit history:
 A regular 'D..M' computes the set of commits that are ancestors of `M`,
 but excludes the ones that are ancestors of `D`. This is useful to see
 what happened to the history leading to `M` since `D`, in the sense
-that "what does `M` have that did not exist in `D`". The result in this
+that ``what does `M` have that did not exist in `D`''. The result in this
 example would be all the commits, except `A` and `B` (and `D` itself,
 of course).
 +
 When we want to find out what commits in `M` are contaminated with the
 bug introduced by `D` and need fixing, however, we might want to view
 only the subset of 'D..M' that are actually descendants of `D`, i.e.
-excluding `C` and `K`. This is exactly what the '--ancestry-path'
+excluding `C` and `K`. This is exactly what the `--ancestry-path`
 option does. Applied to the 'D..M' range, it results in:
 +
 -----------------------------------------------------------------------
@@ -548,7 +501,7 @@ option does. Applied to the 'D..M' range, it results in:
                                L--M
 -----------------------------------------------------------------------
 
-The '\--simplify-by-decoration' option allows you to view only the
+The `--simplify-by-decoration` option allows you to view only the
 big picture of the topology of the history, by omitting commits
 that are not referenced by tags.  Commits are marked as !TREESAME
 (in other words, kept after history simplification rules described
@@ -561,50 +514,47 @@ Bisection Helpers
 ~~~~~~~~~~~~~~~~~
 
 --bisect::
-
-Limit output to the one commit object which is roughly halfway between
-included and excluded commits. Note that the bad bisection ref
-`refs/bisect/bad` is added to the included commits (if it
-exists) and the good bisection refs `refs/bisect/good-*` are
-added to the excluded commits (if they exist). Thus, supposing there
-are no refs in `refs/bisect/`, if
-
+       Limit output to the one commit object which is roughly halfway between
+       included and excluded commits. Note that the bad bisection ref
+       `refs/bisect/bad` is added to the included commits (if it
+       exists) and the good bisection refs `refs/bisect/good-*` are
+       added to the excluded commits (if they exist). Thus, supposing there
+       are no refs in `refs/bisect/`, if
++
 -----------------------------------------------------------------------
        $ git rev-list --bisect foo ^bar ^baz
 -----------------------------------------------------------------------
-
++
 outputs 'midpoint', the output of the two commands
-
++
 -----------------------------------------------------------------------
        $ git rev-list foo ^midpoint
        $ git rev-list midpoint ^bar ^baz
 -----------------------------------------------------------------------
-
++
 would be of roughly the same length.  Finding the change which
 introduces a regression is thus reduced to a binary search: repeatedly
 generate and test new 'midpoint's until the commit chain is of length
 one.
 
 --bisect-vars::
-
-This calculates the same as `--bisect`, except that refs in
-`refs/bisect/` are not used, and except that this outputs
-text ready to be eval'ed by the shell. These lines will assign the
-name of the midpoint revision to the variable `bisect_rev`, and the
-expected number of commits to be tested after `bisect_rev` is tested
-to `bisect_nr`, the expected number of commits to be tested if
-`bisect_rev` turns out to be good to `bisect_good`, the expected
-number of commits to be tested if `bisect_rev` turns out to be bad to
-`bisect_bad`, and the number of commits we are bisecting right now to
-`bisect_all`.
+       This calculates the same as `--bisect`, except that refs in
+       `refs/bisect/` are not used, and except that this outputs
+       text ready to be eval'ed by the shell. These lines will assign the
+       name of the midpoint revision to the variable `bisect_rev`, and the
+       expected number of commits to be tested after `bisect_rev` is tested
+       to `bisect_nr`, the expected number of commits to be tested if
+       `bisect_rev` turns out to be good to `bisect_good`, the expected
+       number of commits to be tested if `bisect_rev` turns out to be bad to
+       `bisect_bad`, and the number of commits we are bisecting right now to
+       `bisect_all`.
 
 --bisect-all::
-
-This outputs all the commit objects between the included and excluded
-commits, ordered by their distance to the included and excluded
-commits. Refs in `refs/bisect/` are not used. The farthest
-from them is displayed first. (This is the only one displayed by
-`--bisect`.)
+       This outputs all the commit objects between the included and excluded
+       commits, ordered by their distance to the included and excluded
+       commits. Refs in `refs/bisect/` are not used. The farthest
+       from them is displayed first. (This is the only one displayed by
+       `--bisect`.)
 +
 This is useful because it makes it easy to choose a good commit to
 test when you want to avoid to test some of them for some reason (they
@@ -654,9 +604,8 @@ avoid showing the commits from two parallel development track mixed
 together.
 
 --reverse::
-
        Output the commits in reverse order.
-       Cannot be combined with '\--walk-reflogs'.
+       Cannot be combined with `--walk-reflogs`.
 
 Object Traversal
 ~~~~~~~~~~~~~~~~
@@ -664,37 +613,32 @@ Object Traversal
 These options are mostly targeted for packing of Git repositories.
 
 --objects::
-
        Print the object IDs of any object referenced by the listed
-       commits.  '--objects foo ^bar' thus means "send me
+       commits.  `--objects foo ^bar` thus means ``send me
        all object IDs which I need to download if I have the commit
-       object 'bar', but not 'foo'".
+       object _bar_ but not _foo_''.
 
 --objects-edge::
-
-       Similar to '--objects', but also print the IDs of excluded
-       commits prefixed with a "-" character.  This is used by
-       linkgit:git-pack-objects[1] to build "thin" pack, which records
+       Similar to `--objects`, but also print the IDs of excluded
+       commits prefixed with a ``-'' character.  This is used by
+       linkgit:git-pack-objects[1] to build ``thin'' pack, which records
        objects in deltified form based on objects contained in these
        excluded commits to reduce network traffic.
 
 --unpacked::
-
-       Only useful with '--objects'; print the object IDs that are not
+       Only useful with `--objects`; print the object IDs that are not
        in packs.
 
 --no-walk[=(sorted|unsorted)]::
-
        Only show the given commits, but do not traverse their ancestors.
        This has no effect if a range is specified. If the argument
-       "unsorted" is given, the commits are show in the order they were
-       given on the command line. Otherwise (if "sorted" or no argument
-       was given), the commits are show in reverse chronological order
+       `unsorted` is given, the commits are shown in the order they were
+       given on the command line. Otherwise (if `sorted` or no argument
+       was given), the commits are shown in reverse chronological order
        by commit time.
 
 --do-walk::
-
-       Overrides a previous --no-walk.
+       Overrides a previous `--no-walk`.
 
 Commit Formatting
 ~~~~~~~~~~~~~~~~~
@@ -708,26 +652,24 @@ endif::git-rev-list[]
 include::pretty-options.txt[]
 
 --relative-date::
-
        Synonym for `--date=relative`.
 
 --date=(relative|local|default|iso|rfc|short|raw)::
-
        Only takes effect for dates shown in human-readable format, such
-       as when using "--pretty". `log.date` config variable sets a default
-       value for log command's --date option.
+       as when using `--pretty`. `log.date` config variable sets a default
+       value for the log command's `--date` option.
 +
 `--date=relative` shows dates relative to the current time,
-e.g. "2 hours ago".
+e.g. ``2 hours ago''.
 +
 `--date=local` shows timestamps in user's local time zone.
 +
 `--date=iso` (or `--date=iso8601`) shows timestamps in ISO 8601 format.
 +
 `--date=rfc` (or `--date=rfc2822`) shows timestamps in RFC 2822
-format, often found in E-mail messages.
+format, often found in email messages.
 +
-`--date=short` shows only date but not time, in `YYYY-MM-DD` format.
+`--date=short` shows only the date, but not the time, in `YYYY-MM-DD` format.
 +
 `--date=raw` shows the date in the internal raw Git format `%s %z` format.
 +
@@ -736,18 +678,15 @@ format, often found in E-mail messages.
 
 ifdef::git-rev-list[]
 --header::
-
        Print the contents of the commit in raw-format; each record is
        separated with a NUL character.
 endif::git-rev-list[]
 
 --parents::
-
        Print also the parents of the commit (in the form "commit parent...").
        Also enables parent rewriting, see 'History Simplification' below.
 
 --children::
-
        Print also the children of the commit (in the form "commit child...").
        Also enables parent rewriting, see 'History Simplification' below.
 
@@ -757,7 +696,6 @@ ifdef::git-rev-list[]
 endif::git-rev-list[]
 
 --left-right::
-
        Mark which side of a symmetric diff a commit is reachable from.
        Commits from the left side are prefixed with `<` and those from
        the right with `>`.  If combined with `--boundary`, those
@@ -787,7 +725,6 @@ you would get an output like this:
 -----------------------------------------------------------------------
 
 --graph::
-
        Draw a text-based graphical representation of the commit history
        on the left hand side of the output.  This may cause extra lines
        to be printed in between commits, in order for the graph history
@@ -795,31 +732,29 @@ you would get an output like this:
 +
 This enables parent rewriting, see 'History Simplification' below.
 +
-This implies the '--topo-order' option by default, but the
-'--date-order' option may also be specified.
+This implies the `--topo-order` option by default, but the
+`--date-order` option may also be specified.
 
 ifdef::git-rev-list[]
 --count::
        Print a number stating how many commits would have been
        listed, and suppress all other output.  When used together
-       with '--left-right', instead print the counts for left and
+       with `--left-right`, instead print the counts for left and
        right commits, separated by a tab. When used together with
-       '--cherry-mark', omit patch equivalent commits from these
+       `--cherry-mark`, omit patch equivalent commits from these
        counts and print the count for equivalent commits separated
        by a tab.
 endif::git-rev-list[]
 
-
 ifndef::git-rev-list[]
 Diff Formatting
 ~~~~~~~~~~~~~~~
 
-Below are listed options that control the formatting of diff output.
+Listed below are options that control the formatting of diff output.
 Some of them are specific to linkgit:git-rev-list[1], however other diff
 options may be given. See linkgit:git-diff-files[1] for more options.
 
 -c::
-
        With this option, diff output for a merge commit
        shows the differences from each of the parents to the merge result
        simultaneously instead of showing pairwise diff between a parent
@@ -827,26 +762,22 @@ options may be given. See linkgit:git-diff-files[1] for more options.
        which were modified from all parents.
 
 --cc::
-
-       This flag implies the '-c' option and further compresses the
+       This flag implies the `-c` option and further compresses the
        patch output by omitting uninteresting hunks whose contents in
        the parents have only two variants and the merge result picks
        one of them without modification.
 
 -m::
-
        This flag makes the merge commits show the full diff like
        regular commits; for each merge parent, a separate log entry
        and diff is generated. An exception is that only diff against
-       the first parent is shown when '--first-parent' option is given;
+       the first parent is shown when `--first-parent` option is given;
        in that case, the output represents the changes the merge
        brought _into_ the then-current branch.
 
 -r::
-
        Show recursive diffs.
 
 -t::
-
-       Show the tree objects in the diff output. This implies '-r'.
+       Show the tree objects in the diff output. This implies `-r`.
 endif::git-rev-list[]
index aa1c50f181eb20e27a8299ca8ec691eeffa9d51b..02adfd45d3a82466627bea702f9b04dfff5e2cc8 100644 (file)
@@ -50,10 +50,10 @@ submodules object database. You can do this by a code-snippet like
 this:
 
        const char *path = "path/to/submodule"
-       if (!add_submodule_odb(path))
+       if (add_submodule_odb(path))
                die("Error submodule '%s' not populated.", path);
 
-`add_submodule_odb()` will return an non-zero value on success. If you
+`add_submodule_odb()` will return zero on success. If you
 do not do this you will get an error for each ref that it does not point
 to a valid object.
 
index caf941a1c52d843ac2335bd4f7a6df7fb0f4fcc8..d21d77d1deea538756c400a3438533a777af6861 100644 (file)
@@ -307,7 +307,7 @@ Clients MUST first perform ref discovery with
    S: ....ACK %s, continue
    S: ....NAK
 
-Clients MUST NOT reuse or revalidate a cached reponse.
+Clients MUST NOT reuse or revalidate a cached response.
 Servers MUST include sufficient Cache-Control headers
 to prevent caching of the response.
 
@@ -468,7 +468,7 @@ Clients MUST first perform ref discovery with
    S:
    S: ....
 
-Clients MUST NOT reuse or revalidate a cached reponse.
+Clients MUST NOT reuse or revalidate a cached response.
 Servers MUST include sufficient Cache-Control headers
 to prevent caching of the response.
 
index b7bd95152ea2526cf000911d81b02fe46539816f..95a07db6e82b5f5f3261d75e5e97fb4b674580a8 100644 (file)
@@ -1,5 +1,5 @@
-        Concerning Git's Packing Heuristics
-        ===================================
+Concerning Git's Packing Heuristics
+===================================
 
         Oh, here's a really stupid question:
 
index 99a62f3bafdf4e5f8392bc72d9619fd9d3a6a671..a8f58ee282998b531ac093280b678baccef7e7ca 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.8.5
+DEF_VER=v1.8.5.3
 
 LF='
 '
index 61c3b54134d985cef6071014604d5b0499712df5..8e86db6ab6eeed617bb208dadba417731c162eae 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/1.8.5.txt
\ No newline at end of file
+Documentation/RelNotes/1.8.5.3.txt
\ No newline at end of file
index b2ca775a80f54fcceba344d5545fe3cb34ba0184..f8288c830cad215af63dd6d575c9bd4bf7aeaf6c 100644 (file)
@@ -193,25 +193,28 @@ static size_t expand_format(struct strbuf *sb, const char *start, void *data)
        return end - start + 1;
 }
 
-static void print_object_or_die(int fd, const unsigned char *sha1,
-                               enum object_type type, unsigned long size)
+static void print_object_or_die(int fd, struct expand_data *data)
 {
-       if (type == OBJ_BLOB) {
+       const unsigned char *sha1 = data->sha1;
+
+       assert(data->info.typep);
+
+       if (data->type == OBJ_BLOB) {
                if (stream_blob_to_fd(fd, sha1, NULL, 0) < 0)
                        die("unable to stream %s to stdout", sha1_to_hex(sha1));
        }
        else {
-               enum object_type rtype;
-               unsigned long rsize;
+               enum object_type type;
+               unsigned long size;
                void *contents;
 
-               contents = read_sha1_file(sha1, &rtype, &rsize);
+               contents = read_sha1_file(sha1, &type, &size);
                if (!contents)
                        die("object %s disappeared", sha1_to_hex(sha1));
-               if (rtype != type)
+               if (type != data->type)
                        die("object %s changed type!?", sha1_to_hex(sha1));
-               if (rsize != size)
-                       die("object %s change size!?", sha1_to_hex(sha1));
+               if (data->info.sizep && size != data->size)
+                       die("object %s changed size!?", sha1_to_hex(sha1));
 
                write_or_die(fd, contents, size);
                free(contents);
@@ -250,7 +253,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt,
        strbuf_release(&buf);
 
        if (opt->print_contents) {
-               print_object_or_die(1, data->sha1, data->type, data->size);
+               print_object_or_die(1, data);
                write_or_die(1, "\n", 1);
        }
        return 0;
@@ -274,6 +277,13 @@ static int batch_objects(struct batch_options *opt)
        strbuf_expand(&buf, opt->format, expand_format, &data);
        data.mark_query = 0;
 
+       /*
+        * If we are printing out the object, then always fill in the type,
+        * since we will want to decide whether or not to stream.
+        */
+       if (opt->print_contents)
+               data.info.typep = &data.type;
+
        /*
         * We are going to call get_sha1 on a potentially very large number of
         * objects. In most large cases, these will be actual object sha1s. The
index 874e0fd0b6e3ea4882783c0b2377016d93bd989d..cc11104d4267f61aa5a2aa5472a5c69c1ccd8994 100644 (file)
@@ -796,6 +796,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        if (option_local > 0 && !is_local)
                warning(_("--local is ignored"));
 
+       /* no need to be strict, transport_set_option() will validate it again */
+       if (option_depth && atoi(option_depth) < 1)
+               die(_("depth %s is not a positive number"), option_depth);
+
        if (argc == 2)
                dir = xstrdup(argv[1]);
        else
index 6ab4605cf5c2e6ef5efb37518c9c215bf8895f97..fedb45af8c65d28c3b43b3b74362e589d81a95ee 100644 (file)
@@ -1505,7 +1505,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        struct strbuf sb = STRBUF_INIT;
        struct strbuf author_ident = STRBUF_INIT;
        const char *index_file, *reflog_msg;
-       char *nl, *p;
+       char *nl;
        unsigned char sha1[20];
        struct ref_lock *ref_lock;
        struct commit_list *parents = NULL, **pptr = &parents;
@@ -1601,11 +1601,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
        }
 
        /* Truncate the message just before the diff, if any. */
-       if (verbose) {
-               p = strstr(sb.buf, "\ndiff --git ");
-               if (p != NULL)
-                       strbuf_setlen(&sb, p - sb.buf + 1);
-       }
+       if (verbose)
+               wt_status_truncate_message_at_cut_line(&sb);
 
        if (cleanup_mode != CLEANUP_NONE)
                stripspace(&sb, cleanup_mode == CLEANUP_ALL);
index adb93a9efa5ed9b97a08224e46f6fbaf680343e6..fe0cc7f1b5b1451f267b1d9e24a6e40cd6e55325 100644 (file)
@@ -64,15 +64,18 @@ static void stuff_change(struct diff_options *opt,
 
 static int builtin_diff_b_f(struct rev_info *revs,
                            int argc, const char **argv,
-                           struct blobinfo *blob,
-                           const char *path)
+                           struct blobinfo *blob)
 {
        /* Blob vs file in the working tree*/
        struct stat st;
+       const char *path;
 
        if (argc > 1)
                usage(builtin_diff_usage);
 
+       GUARD_PATHSPEC(&revs->prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL);
+       path = revs->prune_data.items[0].match;
+
        if (lstat(path, &st))
                die_errno(_("failed to stat '%s'"), path);
        if (!(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)))
@@ -255,7 +258,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
        struct rev_info rev;
        struct object_array ent = OBJECT_ARRAY_INIT;
        int blobs = 0, paths = 0;
-       const char *path = NULL;
        struct blobinfo blob[2];
        int nongit;
        int result = 0;
@@ -366,13 +368,8 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                        die(_("unhandled object '%s' given."), name);
                }
        }
-       if (rev.prune_data.nr) {
-               /* builtin_diff_b_f() */
-               GUARD_PATHSPEC(&rev.prune_data, PATHSPEC_FROMTOP | PATHSPEC_LITERAL);
-               if (!path)
-                       path = rev.prune_data.items[0].match;
+       if (rev.prune_data.nr)
                paths += rev.prune_data.nr;
-       }
 
        /*
         * Now, do the arguments look reasonable?
@@ -385,7 +382,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
                case 1:
                        if (paths != 1)
                                usage(builtin_diff_usage);
-                       result = builtin_diff_b_f(&rev, argc, argv, blob, path);
+                       result = builtin_diff_b_f(&rev, argc, argv, blob);
                        break;
                case 2:
                        if (paths)
index c8e858232a8e7a3536ef4d296efdc618e034c36e..758b5acd55aadcb43b6d11b02f0555a214b35744 100644 (file)
@@ -7,7 +7,7 @@
 static const char fetch_pack_usage[] =
 "git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] "
 "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] "
-"[--no-progress] [-v] [<host>:]<directory> [<refs>...]";
+"[--no-progress] [--diag-url] [-v] [<host>:]<directory> [<refs>...]";
 
 static void add_sought_entry_mem(struct ref ***sought, int *nr, int *alloc,
                                 const char *name, int namelen)
@@ -81,6 +81,10 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
                        args.stdin_refs = 1;
                        continue;
                }
+               if (!strcmp("--diag-url", arg)) {
+                       args.diag_url = 1;
+                       continue;
+               }
                if (!strcmp("-v", arg)) {
                        args.verbose = 1;
                        continue;
@@ -146,10 +150,14 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
                fd[0] = 0;
                fd[1] = 1;
        } else {
+               int flags = args.verbose ? CONNECT_VERBOSE : 0;
+               if (args.diag_url)
+                       flags |= CONNECT_DIAG_URL;
                conn = git_connect(fd, dest, args.uploadpack,
-                                  args.verbose ? CONNECT_VERBOSE : 0);
+                                  flags);
+               if (!conn)
+                       return args.diag_url ? 0 : 1;
        }
-
        get_remote_heads(fd[0], NULL, 0, &ref, 0, NULL);
 
        ref = fetch_pack(&args, fd, conn, ref, dest,
index bd7a10164f4fed8aeb6e8148e2ae8c0a793e7ee0..5bd00d064a7fbfb828f7a7c5e79f8ed0a5a1e959 100644 (file)
@@ -1075,6 +1075,10 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
                }
        }
 
+       /* no need to be strict, transport_set_option() will validate it again */
+       if (depth && atoi(depth) < 1)
+               die(_("depth %s is not a positive number"), depth);
+
        if (recurse_submodules != RECURSE_SUBMODULES_OFF) {
                if (recurse_submodules_default) {
                        int arg = parse_fetch_recurse_submodules_arg("--recurse-submodules-default", recurse_submodules_default);
index d096051b15c14a4f109bc9a9cfcf9749c14258b9..7557aa239eeaf94b5cd609cfd8f44ee547c04190 100644 (file)
@@ -89,7 +89,7 @@ static struct {
  */
 static const char **used_atom;
 static cmp_type *used_atom_type;
-static int used_atom_cnt, sort_atom_limit, need_tagged, need_symref;
+static int used_atom_cnt, need_tagged, need_symref;
 
 /*
  * Used to parse format string and sort specifiers
@@ -1037,7 +1037,6 @@ int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 
        if (!sort)
                sort = default_sort();
-       sort_atom_limit = used_atom_cnt;
 
        /* for warn_ambiguous_refs */
        git_config(git_default_config, NULL);
index c14190f840b0427820ebf69b209d86f0a21c62b7..25f2237c08f3b8fbc8f3554f3e22bf7e59e74b1c 100644 (file)
@@ -222,7 +222,7 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
                        time(NULL) - st.st_mtime <= 12 * 3600 &&
                        fscanf(fp, "%"PRIuMAX" %127c", &pid, locking_host) == 2 &&
                        /* be gentle to concurrent "gc" on remote hosts */
-                       (strcmp(locking_host, my_host) || !kill(pid, 0));
+                       (strcmp(locking_host, my_host) || !kill(pid, 0) || errno == EPERM);
                if (fp != NULL)
                        fclose(fp);
                if (should_exit) {
index 2e0e61b6517d74edc8b7ef2e56c75927385e7c85..21c46d1636e6e87dd9eaaca60ac08ebbbc4efec3 100644 (file)
@@ -16,9 +16,12 @@ static const char * const builtin_mv_usage[] = {
        NULL
 };
 
+#define DUP_BASENAME 1
+#define KEEP_TRAILING_SLASH 2
+
 static const char **internal_copy_pathspec(const char *prefix,
                                           const char **pathspec,
-                                          int count, int base_name)
+                                          int count, unsigned flags)
 {
        int i;
        const char **result = xmalloc((count + 1) * sizeof(const char *));
@@ -27,11 +30,12 @@ static const char **internal_copy_pathspec(const char *prefix,
        for (i = 0; i < count; i++) {
                int length = strlen(result[i]);
                int to_copy = length;
-               while (to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
+               while (!(flags & KEEP_TRAILING_SLASH) &&
+                      to_copy > 0 && is_dir_sep(result[i][to_copy - 1]))
                        to_copy--;
-               if (to_copy != length || base_name) {
+               if (to_copy != length || flags & DUP_BASENAME) {
                        char *it = xmemdupz(result[i], to_copy);
-                       if (base_name) {
+                       if (flags & DUP_BASENAME) {
                                result[i] = xstrdup(basename(it));
                                free(it);
                        } else
@@ -87,16 +91,21 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
 
        source = internal_copy_pathspec(prefix, argv, argc, 0);
        modes = xcalloc(argc, sizeof(enum update_mode));
-       dest_path = internal_copy_pathspec(prefix, argv + argc, 1, 0);
+       /*
+        * Keep trailing slash, needed to let
+        * "git mv file no-such-dir/" error out.
+        */
+       dest_path = internal_copy_pathspec(prefix, argv + argc, 1,
+                                          KEEP_TRAILING_SLASH);
        submodule_gitfile = xcalloc(argc, sizeof(char *));
 
        if (dest_path[0][0] == '\0')
                /* special case: "." was normalized to "" */
-               destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
        else if (!lstat(dest_path[0], &st) &&
                        S_ISDIR(st.st_mode)) {
                dest_path[0] = add_slash(dest_path[0]);
-               destination = internal_copy_pathspec(dest_path[0], argv, argc, 1);
+               destination = internal_copy_pathspec(dest_path[0], argv, argc, DUP_BASENAME);
        } else {
                if (argc != 1)
                        die("destination '%s' is not a directory", dest_path[0]);
@@ -205,6 +214,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
                        }
                } else if (string_list_has_string(&src_for_dst, dst))
                        bad = _("multiple sources for the same target");
+               else if (is_dir_sep(dst[strlen(dst) - 1]))
+                       bad = _("destination directory does not exist");
                else
                        string_list_insert(&src_for_dst, dst);
 
index a0ff5c704f4e21c5021091aa7335e00959993470..91e2363c7172ae3db9304e1490234b2b4cfbe381 100644 (file)
@@ -123,7 +123,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        struct string_list rollback = STRING_LIST_INIT_NODUP;
        struct string_list existing_packs = STRING_LIST_INIT_DUP;
        struct strbuf line = STRBUF_INIT;
-       int nr_packs, ext, ret, failed;
+       int ext, ret, failed;
        FILE *out;
 
        /* variables to be filled by option parsing */
@@ -233,13 +233,11 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
        if (ret)
                return ret;
 
-       nr_packs = 0;
        out = xfdopen(cmd.out, "r");
        while (strbuf_getline(&line, out, '\n') != EOF) {
                if (line.len != 40)
                        die("repack: Expecting 40 character sha1 lines only from pack-objects.");
                string_list_append(&names, line.buf);
-               nr_packs++;
        }
        fclose(out);
        ret = finish_command(&cmd);
@@ -247,7 +245,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
                return ret;
        argv_array_clear(&cmd_args);
 
-       if (!nr_packs && !quiet)
+       if (!names.nr && !quiet)
                printf("Nothing new to pack.\n");
 
        /*
index c76b89dc5bcccb42f7c2613072b1093a58c7d21c..c4b768ffda4cb91dbe01012ccb8eb2475435a77e 100644 (file)
@@ -279,6 +279,7 @@ static int try_difference(const char *arg)
                                exclude = n;
                        }
                }
+               *dotdot = '.';
                return 1;
        }
        *dotdot = '.';
@@ -302,8 +303,10 @@ static int try_parent_shorthands(const char *arg)
                return 0;
 
        *dotdot = 0;
-       if (get_sha1_committish(arg, sha1))
+       if (get_sha1_committish(arg, sha1)) {
+               *dotdot = '^';
                return 0;
+       }
 
        if (!parents_only)
                show_rev(NORMAL, sha1, arg);
@@ -312,6 +315,7 @@ static int try_parent_shorthands(const char *arg)
                show_rev(parents_only ? NORMAL : REVERSED,
                                parents->item->object.sha1, arg);
 
+       *dotdot = '^';
        return 1;
 }
 
@@ -476,6 +480,7 @@ N_("git rev-parse --parseopt [options] -- [<args>...]\n"
 int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 {
        int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
+       int has_dashdash = 0;
        int output_prefix = 0;
        unsigned char sha1[20];
        const char *name = NULL;
@@ -489,6 +494,13 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
        if (argc > 1 && !strcmp("-h", argv[1]))
                usage(builtin_rev_parse_usage);
 
+       for (i = 1; i < argc; i++) {
+               if (!strcmp(argv[i], "--")) {
+                       has_dashdash = 1;
+                       break;
+               }
+       }
+
        prefix = setup_git_directory();
        git_config(git_default_config, NULL);
        for (i = 1; i < argc; i++) {
@@ -765,6 +777,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                }
                if (verify)
                        die_no_single_rev(quiet);
+               if (has_dashdash)
+                       die("bad revision '%s'", arg);
                as_is = 1;
                if (!show_file(arg, output_prefix))
                        continue;
index 06e88b0705f7fbd138e504920c20c70218121696..8a013a723b4d81deb76baabb7615c06b0caa068c 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -232,10 +232,34 @@ int server_supports(const char *feature)
 
 enum protocol {
        PROTO_LOCAL = 1,
+       PROTO_FILE,
        PROTO_SSH,
        PROTO_GIT
 };
 
+int url_is_local_not_ssh(const char *url)
+{
+       const char *colon = strchr(url, ':');
+       const char *slash = strchr(url, '/');
+       return !colon || (slash && slash < colon) ||
+               has_dos_drive_prefix(url);
+}
+
+static const char *prot_name(enum protocol protocol)
+{
+       switch (protocol) {
+               case PROTO_LOCAL:
+               case PROTO_FILE:
+                       return "file";
+               case PROTO_SSH:
+                       return "ssh";
+               case PROTO_GIT:
+                       return "git";
+               default:
+                       return "unkown protocol";
+       }
+}
+
 static enum protocol get_protocol(const char *name)
 {
        if (!strcmp(name, "ssh"))
@@ -247,7 +271,7 @@ static enum protocol get_protocol(const char *name)
        if (!strcmp(name, "ssh+git"))
                return PROTO_SSH;
        if (!strcmp(name, "file"))
-               return PROTO_LOCAL;
+               return PROTO_FILE;
        die("I don't handle protocol '%s'", name);
 }
 
@@ -527,55 +551,31 @@ static struct child_process *git_proxy_connect(int fd[2], char *host)
        return proxy;
 }
 
-#define MAX_CMD_LEN 1024
-
-static char *get_port(char *host)
+static const char *get_port_numeric(const char *p)
 {
        char *end;
-       char *p = strchr(host, ':');
-
        if (p) {
                long port = strtol(p + 1, &end, 10);
                if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) {
-                       *p = '\0';
-                       return p+1;
+                       return p;
                }
        }
 
        return NULL;
 }
 
-static struct child_process no_fork;
-
 /*
- * This returns a dummy child_process if the transport protocol does not
- * need fork(2), or a struct child_process object if it does.  Once done,
- * finish the connection with finish_connect() with the value returned from
- * this function (it is safe to call finish_connect() with NULL to support
- * the former case).
- *
- * If it returns, the connect is successful; it just dies on errors (this
- * will hopefully be changed in a libification effort, to return NULL when
- * the connection failed).
+ * Extract protocol and relevant parts from the specified connection URL.
+ * The caller must free() the returned strings.
  */
-struct child_process *git_connect(int fd[2], const char *url_orig,
-                                 const char *prog, int flags)
+static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
+                                      char **ret_path)
 {
        char *url;
        char *host, *path;
        char *end;
-       int c;
-       struct child_process *conn = &no_fork;
+       int separator = '/';
        enum protocol protocol = PROTO_LOCAL;
-       int free_path = 0;
-       char *port = NULL;
-       const char **arg;
-       struct strbuf cmd;
-
-       /* Without this we cannot rely on waitpid() to tell
-        * what happened to our children.
-        */
-       signal(SIGCHLD, SIG_DFL);
 
        if (is_url(url_orig))
                url = url_decode(url_orig);
@@ -587,40 +587,33 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
                *host = '\0';
                protocol = get_protocol(url);
                host += 3;
-               c = '/';
        } else {
                host = url;
-               c = ':';
+               if (!url_is_local_not_ssh(url)) {
+                       protocol = PROTO_SSH;
+                       separator = ':';
+               }
        }
 
        /*
-        * Don't do destructive transforms with git:// as that
-        * protocol code does '[]' unwrapping of its own.
+        * Don't do destructive transforms as protocol code does
+        * '[]' unwrapping in get_host_and_port()
         */
        if (host[0] == '[') {
                end = strchr(host + 1, ']');
                if (end) {
-                       if (protocol != PROTO_GIT) {
-                               *end = 0;
-                               host++;
-                       }
                        end++;
                } else
                        end = host;
        } else
                end = host;
 
-       path = strchr(end, c);
-       if (path && !has_dos_drive_prefix(end)) {
-               if (c == ':') {
-                       if (host != url || path < strchrnul(host, '/')) {
-                               protocol = PROTO_SSH;
-                               *path++ = '\0';
-                       } else /* '/' in the host part, assume local path */
-                               path = end;
-               }
-       } else
+       if (protocol == PROTO_LOCAL)
                path = end;
+       else if (protocol == PROTO_FILE && has_dos_drive_prefix(end))
+               path = end; /* "file://$(pwd)" may be "file://C:/projects/repo" */
+       else
+               path = strchr(end, separator);
 
        if (!path || !*path)
                die("No path specified. See 'man git-pull' for valid url syntax");
@@ -629,33 +622,67 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
         * null-terminate hostname and point path to ~ for URL's like this:
         *    ssh://host.xz/~user/repo
         */
-       if (protocol != PROTO_LOCAL && host != url) {
-               char *ptr = path;
+
+       end = path; /* Need to \0 terminate host here */
+       if (separator == ':')
+               path++; /* path starts after ':' */
+       if (protocol == PROTO_GIT || protocol == PROTO_SSH) {
                if (path[1] == '~')
                        path++;
-               else {
-                       path = xstrdup(ptr);
-                       free_path = 1;
-               }
-
-               *ptr = '\0';
        }
 
-       /*
-        * Add support for ssh port: ssh://host.xy:<port>/...
+       path = xstrdup(path);
+       *end = '\0';
+
+       *ret_host = xstrdup(host);
+       *ret_path = path;
+       free(url);
+       return protocol;
+}
+
+static struct child_process no_fork;
+
+/*
+ * This returns a dummy child_process if the transport protocol does not
+ * need fork(2), or a struct child_process object if it does.  Once done,
+ * finish the connection with finish_connect() with the value returned from
+ * this function (it is safe to call finish_connect() with NULL to support
+ * the former case).
+ *
+ * If it returns, the connect is successful; it just dies on errors (this
+ * will hopefully be changed in a libification effort, to return NULL when
+ * the connection failed).
+ */
+struct child_process *git_connect(int fd[2], const char *url,
+                                 const char *prog, int flags)
+{
+       char *hostandport, *path;
+       struct child_process *conn = &no_fork;
+       enum protocol protocol;
+       const char **arg;
+       struct strbuf cmd = STRBUF_INIT;
+
+       /* Without this we cannot rely on waitpid() to tell
+        * what happened to our children.
         */
-       if (protocol == PROTO_SSH && host != url)
-               port = get_port(end);
+       signal(SIGCHLD, SIG_DFL);
 
-       if (protocol == PROTO_GIT) {
+       protocol = parse_connect_url(url, &hostandport, &path);
+       if (flags & CONNECT_DIAG_URL) {
+               printf("Diag: url=%s\n", url ? url : "NULL");
+               printf("Diag: protocol=%s\n", prot_name(protocol));
+               printf("Diag: hostandport=%s\n", hostandport ? hostandport : "NULL");
+               printf("Diag: path=%s\n", path ? path : "NULL");
+               conn = NULL;
+       } else if (protocol == PROTO_GIT) {
                /* These underlying connection commands die() if they
                 * cannot connect.
                 */
-               char *target_host = xstrdup(host);
-               if (git_use_proxy(host))
-                       conn = git_proxy_connect(fd, host);
+               char *target_host = xstrdup(hostandport);
+               if (git_use_proxy(hostandport))
+                       conn = git_proxy_connect(fd, hostandport);
                else
-                       git_tcp_connect(fd, host, flags);
+                       git_tcp_connect(fd, hostandport, flags);
                /*
                 * Separate original protocol components prog and path
                 * from extended host header with a NUL byte.
@@ -668,55 +695,51 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
                             prog, path, 0,
                             target_host, 0);
                free(target_host);
-               free(url);
-               if (free_path)
-                       free(path);
-               return conn;
-       }
-
-       conn = xcalloc(1, sizeof(*conn));
-
-       strbuf_init(&cmd, MAX_CMD_LEN);
-       strbuf_addstr(&cmd, prog);
-       strbuf_addch(&cmd, ' ');
-       sq_quote_buf(&cmd, path);
-       if (cmd.len >= MAX_CMD_LEN)
-               die("command line too long");
-
-       conn->in = conn->out = -1;
-       conn->argv = arg = xcalloc(7, sizeof(*arg));
-       if (protocol == PROTO_SSH) {
-               const char *ssh = getenv("GIT_SSH");
-               int putty = ssh && strcasestr(ssh, "plink");
-               if (!ssh) ssh = "ssh";
-
-               *arg++ = ssh;
-               if (putty && !strcasestr(ssh, "tortoiseplink"))
-                       *arg++ = "-batch";
-               if (port) {
-                       /* P is for PuTTY, p is for OpenSSH */
-                       *arg++ = putty ? "-P" : "-p";
-                       *arg++ = port;
+       } else {
+               conn = xcalloc(1, sizeof(*conn));
+
+               strbuf_addstr(&cmd, prog);
+               strbuf_addch(&cmd, ' ');
+               sq_quote_buf(&cmd, path);
+
+               conn->in = conn->out = -1;
+               conn->argv = arg = xcalloc(7, sizeof(*arg));
+               if (protocol == PROTO_SSH) {
+                       const char *ssh = getenv("GIT_SSH");
+                       int putty = ssh && strcasestr(ssh, "plink");
+                       char *ssh_host = hostandport;
+                       const char *port = NULL;
+                       get_host_and_port(&ssh_host, &port);
+                       port = get_port_numeric(port);
+
+                       if (!ssh) ssh = "ssh";
+
+                       *arg++ = ssh;
+                       if (putty && !strcasestr(ssh, "tortoiseplink"))
+                               *arg++ = "-batch";
+                       if (port) {
+                               /* P is for PuTTY, p is for OpenSSH */
+                               *arg++ = putty ? "-P" : "-p";
+                               *arg++ = port;
+                       }
+                       *arg++ = ssh_host;
+               }       else {
+                       /* remove repo-local variables from the environment */
+                       conn->env = local_repo_env;
+                       conn->use_shell = 1;
                }
-               *arg++ = host;
-       }
-       else {
-               /* remove repo-local variables from the environment */
-               conn->env = local_repo_env;
-               conn->use_shell = 1;
-       }
-       *arg++ = cmd.buf;
-       *arg = NULL;
+               *arg++ = cmd.buf;
+               *arg = NULL;
 
-       if (start_command(conn))
-               die("unable to fork");
+               if (start_command(conn))
+                       die("unable to fork");
 
-       fd[0] = conn->out; /* read from child's stdout */
-       fd[1] = conn->in;  /* write to child's stdin */
-       strbuf_release(&cmd);
-       free(url);
-       if (free_path)
-               free(path);
+               fd[0] = conn->out; /* read from child's stdout */
+               fd[1] = conn->in;  /* write to child's stdin */
+               strbuf_release(&cmd);
+       }
+       free(hostandport);
+       free(path);
        return conn;
 }
 
index 64fb7dbbee8714c034c5e018b3b1b4f8c29f0ea7..c41a6850f1302e4d27af1066b53b20dd303f0d13 100644 (file)
--- a/connect.h
+++ b/connect.h
@@ -2,11 +2,13 @@
 #define CONNECT_H
 
 #define CONNECT_VERBOSE       (1u << 0)
+#define CONNECT_DIAG_URL      (1u << 1)
 extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags);
 extern int finish_connect(struct child_process *conn);
 extern int git_connection_is_socket(struct child_process *conn);
 extern int server_supports(const char *feature);
 extern int parse_feature_request(const char *features, const char *feature);
 extern const char *server_feature_value(const char *feature, int *len_ret);
+extern int url_is_local_not_ssh(const char *url);
 
 #endif
index 4c99dfb9038ca034d86b72cbe342373d12ae8cc6..4e23c650fe6341737fa8fb36070ce7999ba1f54b 100755 (executable)
@@ -1205,7 +1205,7 @@ class GitView(object):
 
                #The first parent always continue on the same line
                try:
-                       # check we alreay have the value
+                       # check we already have the value
                        tmp_node_pos = self.nodepos[commit.parent_sha1[0]]
                except KeyError:
                        self.colours[commit.parent_sha1[0]] = colour
index 476e0a2bc02d0708e01c63f6e0fc524a840d4c77..3f8d993afaca53024aa75b4118da9ee80e6a6313 100755 (executable)
@@ -1315,7 +1315,7 @@ sub get_mw_namespace_id {
        # Store "notANameSpace" as special value for inexisting namespaces
        my $store_id = ($id || 'notANameSpace');
 
-       # Store explicitely requested namespaces on disk
+       # Store explicitly requested namespaces on disk
        if (!exists $cached_mw_namespace_id{$name}) {
                run_git(qq(config --add remote.${remotename}.namespaceCache "${name}:${store_id}"));
                $cached_mw_namespace_id{$name} = 1;
index ca6860ff301163201a484f4e5ca1348410304719..3372b2af346ac23a73a7723ac6d0c81fb8c5e705 100755 (executable)
@@ -91,7 +91,7 @@ test_diff_directories () {
 # Check that <dir> contains exactly <N> files
 test_contains_N_files () {
        if test `ls -- "$1" | wc -l` -ne "$2"; then
-               echo "directory $1 sould contain $2 files"
+               echo "directory $1 should contain $2 files"
                echo "it contains these files:"
                ls "$1"
                false
index 4cfebe9c69bda210ba8de6882a3ed269415de559..5ba0684162474091e419d201dfcf73abdacbc842 100644 (file)
@@ -12,7 +12,7 @@ SERVER_ADDR=localhost
 TMP=/tmp
 DB_FILE=wikidb.sqlite
 
-# If LIGHTTPD is not set to true, the script will use the defaut
+# If LIGHTTPD is not set to true, the script will use the default
 # web server running in WIKI_DIR_INST.
 WIKI_DIR_INST=/var/www
 
index 34916c5e105812e36d659dfeeb8341e003e746bd..13608c07c674171ace754154c5d1cb7dea6c5e04 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -1278,11 +1278,11 @@ int main(int argc, char **argv)
                        make_service_overridable(arg + 18, 0);
                        continue;
                }
-               if (!prefixcmp(arg, "--informative-errors")) {
+               if (!strcmp(arg, "--informative-errors")) {
                        informative_errors = 1;
                        continue;
                }
-               if (!prefixcmp(arg, "--no-informative-errors")) {
+               if (!strcmp(arg, "--no-informative-errors")) {
                        informative_errors = 0;
                        continue;
                }
index 461cbf39b2affa71e27dd1a95c24d6c65a938d62..20ccc12e57b9499b0716c8295b4adea38d8d2a86 100644 (file)
@@ -14,6 +14,7 @@ struct fetch_pack_args {
                use_thin_pack:1,
                fetch_all:1,
                stdin_refs:1,
+               diag_url:1,
                verbose:1,
                no_progress:1,
                include_tag:1,
index 9f064b6f4f0c209a0315538e48049c2d013316df..73b4c14d4f631b811a20392684a87c6b97daedc7 100755 (executable)
@@ -137,7 +137,7 @@ bisect_start() {
                        # cogito usage, and cogito users should understand
                        # it relates to cg-seek.
                        [ -s "$GIT_DIR/head-name" ] &&
-                               die "$(gettext "won't bisect on seeked tree")"
+                               die "$(gettext "won't bisect on cg-seek'ed tree")"
                        start_head="${head#refs/heads/}"
                        ;;
                *)
index 3782c3b0cb4f9356790ae581c0d408dc4f4cae75..2016d9c6198957943a8bd2510e217fe72412062a 100755 (executable)
@@ -291,7 +291,7 @@ my $rc = GetOptions("h" => \$help,
                    "smtp-pass:s" => \$smtp_authpass,
                    "smtp-ssl" => sub { $smtp_encryption = 'ssl' },
                    "smtp-encryption=s" => \$smtp_encryption,
-                   "smtp-ssl-cert-path" => \$smtp_ssl_cert_path,
+                   "smtp-ssl-cert-path=s" => \$smtp_ssl_cert_path,
                    "smtp-debug:i" => \$debug_net_smtp,
                    "smtp-domain:s" => \$smtp_domain,
                    "identity=s" => \$identity,
@@ -1214,10 +1214,14 @@ X-Mailer: git-send-email $gitversion
                        $smtp_server_port ||= 465; # ssmtp
                        require Net::SMTP::SSL;
                        $smtp_domain ||= maildomain();
+                       require IO::Socket::SSL;
+                       # Net::SMTP::SSL->new() does not forward any SSL options
+                       IO::Socket::SSL::set_client_defaults(
+                               ssl_verify_params());
                        $smtp ||= Net::SMTP::SSL->new($smtp_server,
                                                      Hello => $smtp_domain,
                                                      Port => $smtp_server_port,
-                                                     ssl_verify_params());
+                                                     Debug => $debug_net_smtp);
                }
                else {
                        require Net::SMTP;
index 896f1c9b820b6627da8d591469172d749bf0e700..66f5f752c5fb6745ab409199deb775c4704ab3e6 100755 (executable)
@@ -612,11 +612,21 @@ cmd_init()
                fi
 
                # Copy "update" setting when it is not set yet
-               upd="$(git config -f .gitmodules submodule."$name".update)"
-               test -z "$upd" ||
-               test -n "$(git config submodule."$name".update)" ||
-               git config submodule."$name".update "$upd" ||
-               die "$(eval_gettext "Failed to register update mode for submodule path '\$displaypath'")"
+               if upd="$(git config -f .gitmodules submodule."$name".update)" &&
+                  test -n "$upd" &&
+                  test -z "$(git config submodule."$name".update)"
+               then
+                       case "$upd" in
+                       rebase | merge | none)
+                               ;; # known modes of updating
+                       *)
+                               echo >&2 "warning: unknown update mode '$upd' suggested for submodule '$name'"
+                               upd=none
+                               ;;
+                       esac
+                       git config submodule."$name".update "$upd" ||
+                       die "$(eval_gettext "Failed to register update mode for submodule path '\$displaypath'")"
+               fi
        done
 }
 
index 8534d91826f3cf05f810a28728ee8bd51649d819..1982631ca497002b746873cd62fabbc4b7f9d3ce 100644 (file)
@@ -134,6 +134,8 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in
                obj = ((struct tag *)obj)->tagged;
                if (!obj)
                        break;
+               if (!obj->parsed)
+                       parse_object(obj->sha1);
                add_name_decoration(DECORATION_REF_TAG, refname, obj);
        }
        return 0;
index 4cf2bd365a3e5e7a43b5cc9a23de1a5d3aafdbcd..87b3b82f1fd9baee7758159e5e3119b6da0655e3 100644 (file)
@@ -197,11 +197,11 @@ static unsigned prefix_pathspec(struct pathspec_item *item,
        magic |= short_magic;
        *p_short_magic = short_magic;
 
-       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specifed */
+       /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
        if (noglob_global && !(magic & PATHSPEC_GLOB))
                global_magic |= PATHSPEC_LITERAL;
 
-       /* --glob-pathspec is overriden by :(literal) */
+       /* --glob-pathspec is overridden by :(literal) */
        if ((global_magic & PATHSPEC_GLOB) && (magic & PATHSPEC_LITERAL))
                global_magic &= ~PATHSPEC_GLOB;
 
index b3bcd476daa7d4ab32c30c6fbd2f0a73ec9d0b4f..34e8af966c4a97bd3fafd5d9cfecbfb982f78897 100644 (file)
@@ -304,8 +304,12 @@ sub C {
        my ($self, $m, $deletions) = @_;
        my ($dir, $file) = split_path($m->{file_b});
        my $pbat = $self->ensure_path($dir, $deletions);
+       # workaround for a bug in svn serf backend (v1.8.5 and below):
+       # store third argument to ->add_file() in a local variable, to make it
+       # have the same lifetime as $fbat
+       my $upa = $self->url_path($m->{file_a});
        my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
-                               $self->url_path($m->{file_a}), $self->{r});
+                               $upa, $self->{r});
        print "\tC\t$m->{file_a} => $m->{file_b}\n" unless $::_q;
        $self->chg_file($fbat, $m);
        $self->close_file($fbat,undef,$self->{pool});
@@ -323,8 +327,10 @@ sub R {
        my ($self, $m, $deletions) = @_;
        my ($dir, $file) = split_path($m->{file_b});
        my $pbat = $self->ensure_path($dir, $deletions);
+       # workaround for a bug in svn serf backend, see comment in C() above
+       my $upa = $self->url_path($m->{file_a});
        my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
-                               $self->url_path($m->{file_a}), $self->{r});
+                               $upa, $self->{r});
        print "\tR\t$m->{file_a} => $m->{file_b}\n" unless $::_q;
        $self->apply_autoprops($file, $fbat);
        $self->chg_file($fbat, $m);
index 5e2d709e152d930fbc01633511241b404d2ce252..c0bbb65bf6aa3066da667aa5c69058f0e6b5ded2 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -72,7 +72,7 @@ msgstr "Archivformat"
 
 #: archive.c:328 builtin/log.c:1193
 msgid "prefix"
-msgstr "Prefix"
+msgstr "Präfix"
 
 #: archive.c:329
 msgid "prepend prefix to each pathname in the archive"
@@ -3716,7 +3716,7 @@ msgid ""
 msgstr ""
 "Eingabehilfe:\n"
 "1          - nummeriertes Element auswählen\n"
-"foo        - Element anhand eines eindeutigen Prefix auswählen\n"
+"foo        - Element anhand eines eindeutigen Präfix auswählen\n"
 "           - (leer) nichts auswählen"
 
 #: builtin/clean.c:298
@@ -3734,7 +3734,7 @@ msgstr ""
 "1          - einzelnes Element auswählen\n"
 "3-5        - Bereich von Elementen auswählen\n"
 "2-3,6-9    - mehrere Bereiche auswählen\n"
-"foo        - Element anhand eines eindeutigen Prefix auswählen\n"
+"foo        - Element anhand eines eindeutigen Präfix auswählen\n"
 "-...       - angegebenes Element abwählen\n"
 "*          - alle Elemente auswählen\n"
 "           - (leer) Auswahl beenden"
@@ -6452,7 +6452,7 @@ msgstr "kennzeichnet die Serie als n-te Fassung"
 
 #: builtin/log.c:1194
 msgid "Use [<prefix>] instead of [PATCH]"
-msgstr "verwendet [<Prefix>] anstatt [PATCH]"
+msgstr "verwendet [<Präfix>] anstatt [PATCH]"
 
 #: builtin/log.c:1197
 msgid "store resulting files in <dir>"
@@ -8182,7 +8182,7 @@ msgid ""
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
 msgstr ""
-"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<Prefix>] "
+"git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<Präfix>] "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<Datei>] (--empty | <Commit-Referenz1> [<Commit-Referenz2> "
 "[<Commit-Referenz3>]])"
@@ -9782,15 +9782,15 @@ msgstr "gibt Tag-Inhalte aus"
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr "git write-tree [--missing-ok] [--prefix=<Prefix>/]"
+msgstr "git write-tree [--missing-ok] [--prefix=<Präfix>/]"
 
 #: builtin/write-tree.c:26
 msgid "<prefix>/"
-msgstr "<Prefix>/"
+msgstr "<Präfix>/"
 
 #: builtin/write-tree.c:27
 msgid "write tree object for a subdirectory <prefix>"
-msgstr "schreibt das \"Tree\"-Objekt für ein Unterverzeichnis <Prefix>"
+msgstr "schreibt das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix>"
 
 #: builtin/write-tree.c:30
 msgid "only useful for debugging"
index d851807feb9849813635471d7099e67ed743a2d7..d7bb17cb663c2f47ad59d34ecea17c6cc977e815 100644 (file)
--- a/prompt.c
+++ b/prompt.c
@@ -22,6 +22,7 @@ static char *do_askpass(const char *cmd, const char *prompt)
        if (start_command(&pass))
                return NULL;
 
+       strbuf_reset(&buffer);
        if (strbuf_read(&buffer, pass.out, 20) < 0)
                err = 1;
 
@@ -38,7 +39,7 @@ static char *do_askpass(const char *cmd, const char *prompt)
 
        strbuf_setlen(&buffer, strcspn(buffer.buf, "\r\n"));
 
-       return strbuf_detach(&buffer, NULL);
+       return buffer.buf;
 }
 
 char *git_prompt(const char *prompt, int flags)
index 7dadd04cb75a9f681cab17f616600cf437fe82ba..06c809aeeb3a608c09247b4f2146eb246938d6bf 100644 (file)
@@ -807,15 +807,38 @@ void free_pack_by_name(const char *pack_name)
 static unsigned int get_max_fd_limit(void)
 {
 #ifdef RLIMIT_NOFILE
-       struct rlimit lim;
+       {
+               struct rlimit lim;
 
-       if (getrlimit(RLIMIT_NOFILE, &lim))
-               die_errno("cannot get RLIMIT_NOFILE");
+               if (!getrlimit(RLIMIT_NOFILE, &lim))
+                       return lim.rlim_cur;
+       }
+#endif
 
-       return lim.rlim_cur;
-#elif defined(_SC_OPEN_MAX)
-       return sysconf(_SC_OPEN_MAX);
-#elif defined(OPEN_MAX)
+#ifdef _SC_OPEN_MAX
+       {
+               long open_max = sysconf(_SC_OPEN_MAX);
+               if (0 < open_max)
+                       return open_max;
+               /*
+                * Otherwise, we got -1 for one of the two
+                * reasons:
+                *
+                * (1) sysconf() did not understand _SC_OPEN_MAX
+                *     and signaled an error with -1; or
+                * (2) sysconf() said there is no limit.
+                *
+                * We _could_ clear errno before calling sysconf() to
+                * tell these two cases apart and return a huge number
+                * in the latter case to let the caller cap it to a
+                * value that is not so selfish, but letting the
+                * fallback OPEN_MAX codepath take care of these cases
+                * is a lot simpler.
+                */
+       }
+#endif
+
+#ifdef OPEN_MAX
        return OPEN_MAX;
 #else
        return 1; /* see the caller ;-) */
@@ -2483,15 +2506,18 @@ static int sha1_loose_object_info(const unsigned char *sha1,
 
        /*
         * If we don't care about type or size, then we don't
-        * need to look inside the object at all.
+        * need to look inside the object at all. Note that we
+        * do not optimize out the stat call, even if the
+        * caller doesn't care about the disk-size, since our
+        * return value implicitly indicates whether the
+        * object even exists.
         */
        if (!oi->typep && !oi->sizep) {
-               if (oi->disk_sizep) {
-                       struct stat st;
-                       if (stat_sha1_file(sha1, &st) < 0)
-                               return -1;
+               struct stat st;
+               if (stat_sha1_file(sha1, &st) < 0)
+                       return -1;
+               if (oi->disk_sizep)
                        *oi->disk_sizep = st.st_size;
-               }
                return 0;
        }
 
@@ -2857,7 +2883,9 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename)
                /* Make sure the directory exists */
                memcpy(buffer, filename, dirlen);
                buffer[dirlen-1] = 0;
-               if (mkdir(buffer, 0777) || adjust_shared_perm(buffer))
+               if (mkdir(buffer, 0777) && errno != EEXIST)
+                       return -1;
+               if (adjust_shared_perm(buffer))
                        return -1;
 
                /* Try again */
index abc2c6f57fe29d124455227a16e241c49ae40c5c..ef079afc4638a4f02fa0c12f1d54ad622047ed56 100644 (file)
@@ -5,39 +5,39 @@
 # write the index and that together with -u it doesn't touch the work tree.
 #
 read_tree_must_succeed () {
-    git ls-files -s >pre-dry-run &&
-    git read-tree -n "$@" &&
-    git ls-files -s >post-dry-run &&
-    test_cmp pre-dry-run post-dry-run &&
-    git read-tree "$@"
+       git ls-files -s >pre-dry-run &&
+       git read-tree -n "$@" &&
+       git ls-files -s >post-dry-run &&
+       test_cmp pre-dry-run post-dry-run &&
+       git read-tree "$@"
 }
 
 read_tree_must_fail () {
-    git ls-files -s >pre-dry-run &&
-    test_must_fail git read-tree -n "$@" &&
-    git ls-files -s >post-dry-run &&
-    test_cmp pre-dry-run post-dry-run &&
-    test_must_fail git read-tree "$@"
+       git ls-files -s >pre-dry-run &&
+       test_must_fail git read-tree -n "$@" &&
+       git ls-files -s >post-dry-run &&
+       test_cmp pre-dry-run post-dry-run &&
+       test_must_fail git read-tree "$@"
 }
 
 read_tree_u_must_succeed () {
-    git ls-files -s >pre-dry-run &&
-    git diff-files -p >pre-dry-run-wt &&
-    git read-tree -n "$@" &&
-    git ls-files -s >post-dry-run &&
-    git diff-files -p >post-dry-run-wt &&
-    test_cmp pre-dry-run post-dry-run &&
-    test_cmp pre-dry-run-wt post-dry-run-wt &&
-    git read-tree "$@"
+       git ls-files -s >pre-dry-run &&
+       git diff-files -p >pre-dry-run-wt &&
+       git read-tree -n "$@" &&
+       git ls-files -s >post-dry-run &&
+       git diff-files -p >post-dry-run-wt &&
+       test_cmp pre-dry-run post-dry-run &&
+       test_cmp pre-dry-run-wt post-dry-run-wt &&
+       git read-tree "$@"
 }
 
 read_tree_u_must_fail () {
-    git ls-files -s >pre-dry-run &&
-    git diff-files -p >pre-dry-run-wt &&
-    test_must_fail git read-tree -n "$@" &&
-    git ls-files -s >post-dry-run &&
-    git diff-files -p >post-dry-run-wt &&
-    test_cmp pre-dry-run post-dry-run &&
-    test_cmp pre-dry-run-wt post-dry-run-wt &&
-    test_must_fail git read-tree "$@"
+       git ls-files -s >pre-dry-run &&
+       git diff-files -p >pre-dry-run-wt &&
+       test_must_fail git read-tree -n "$@" &&
+       git ls-files -s >post-dry-run &&
+       git diff-files -p >post-dry-run-wt &&
+       test_cmp pre-dry-run post-dry-run &&
+       test_cmp pre-dry-run-wt post-dry-run-wt &&
+       test_must_fail git read-tree "$@"
 }
index f53de79e565afcbe53a016a56a59b27831a3ce42..074568500a357d3bae69a953aa59155687483a10 100755 (executable)
@@ -8,84 +8,99 @@ test_description='read-tree -u --reset'
 # two-tree test
 
 test_expect_success 'setup' '
-  git init &&
-  mkdir df &&
-  echo content >df/file &&
-  git add df/file &&
-  git commit -m one &&
-  git ls-files >expect &&
-  rm -rf df &&
-  echo content >df &&
-  git add df &&
-  echo content >new &&
-  git add new &&
-  git commit -m two
+       git init &&
+       mkdir df &&
+       echo content >df/file &&
+       git add df/file &&
+       git commit -m one &&
+       git ls-files >expect &&
+       rm -rf df &&
+       echo content >df &&
+       git add df &&
+       echo content >new &&
+       git add new &&
+       git commit -m two
 '
 
 test_expect_success 'reset should work' '
-  read_tree_u_must_succeed -u --reset HEAD^ &&
-  git ls-files >actual &&
-  test_cmp expect actual
+       read_tree_u_must_succeed -u --reset HEAD^ &&
+       git ls-files >actual &&
+       test_cmp expect actual
 '
 
 test_expect_success 'reset should remove remnants from a failed merge' '
-  read_tree_u_must_succeed --reset -u HEAD &&
-  git ls-files -s >expect &&
-  sha1=$(git rev-parse :new) &&
-  (
-       echo "100644 $sha1 1    old"
-       echo "100644 $sha1 3    old"
-  ) | git update-index --index-info &&
-  >old &&
-  git ls-files -s &&
-  read_tree_u_must_succeed --reset -u HEAD &&
-  git ls-files -s >actual &&
-  ! test -f old
+       read_tree_u_must_succeed --reset -u HEAD &&
+       git ls-files -s >expect &&
+       sha1=$(git rev-parse :new) &&
+       (
+               echo "100644 $sha1 1    old"
+               echo "100644 $sha1 3    old"
+       ) | git update-index --index-info &&
+       >old &&
+       git ls-files -s &&
+       read_tree_u_must_succeed --reset -u HEAD &&
+       git ls-files -s >actual &&
+       ! test -f old
+'
+
+test_expect_success 'two-way reset should remove remnants too' '
+       read_tree_u_must_succeed --reset -u HEAD &&
+       git ls-files -s >expect &&
+       sha1=$(git rev-parse :new) &&
+       (
+               echo "100644 $sha1 1    old"
+               echo "100644 $sha1 3    old"
+       ) | git update-index --index-info &&
+       >old &&
+       git ls-files -s &&
+       read_tree_u_must_succeed --reset -u HEAD HEAD &&
+       git ls-files -s >actual &&
+       ! test -f old
 '
 
 test_expect_success 'Porcelain reset should remove remnants too' '
-  read_tree_u_must_succeed --reset -u HEAD &&
-  git ls-files -s >expect &&
-  sha1=$(git rev-parse :new) &&
-  (
-       echo "100644 $sha1 1    old"
-       echo "100644 $sha1 3    old"
-  ) | git update-index --index-info &&
-  >old &&
-  git ls-files -s &&
-  git reset --hard &&
-  git ls-files -s >actual &&
-  ! test -f old
+       read_tree_u_must_succeed --reset -u HEAD &&
+       git ls-files -s >expect &&
+       sha1=$(git rev-parse :new) &&
+       (
+               echo "100644 $sha1 1    old"
+               echo "100644 $sha1 3    old"
+       ) | git update-index --index-info &&
+       >old &&
+       git ls-files -s &&
+       git reset --hard &&
+       git ls-files -s >actual &&
+       ! test -f old
 '
 
 test_expect_success 'Porcelain checkout -f should remove remnants too' '
-  read_tree_u_must_succeed --reset -u HEAD &&
-  git ls-files -s >expect &&
-  sha1=$(git rev-parse :new) &&
-  (
-       echo "100644 $sha1 1    old"
-       echo "100644 $sha1 3    old"
-  ) | git update-index --index-info &&
-  >old &&
-  git ls-files -s &&
-  git checkout -f &&
-  git ls-files -s >actual &&
-  ! test -f old
+       read_tree_u_must_succeed --reset -u HEAD &&
+       git ls-files -s >expect &&
+       sha1=$(git rev-parse :new) &&
+       (
+               echo "100644 $sha1 1    old"
+               echo "100644 $sha1 3    old"
+       ) | git update-index --index-info &&
+       >old &&
+       git ls-files -s &&
+       git checkout -f &&
+       git ls-files -s >actual &&
+       ! test -f old
 '
 
 test_expect_success 'Porcelain checkout -f HEAD should remove remnants too' '
-  read_tree_u_must_succeed --reset -u HEAD &&
-  git ls-files -s >expect &&
-  sha1=$(git rev-parse :new) &&
-  (
-       echo "100644 $sha1 1    old"
-       echo "100644 $sha1 3    old"
-  ) | git update-index --index-info &&
-  >old &&
-  git ls-files -s &&
-  git checkout -f HEAD &&
-  git ls-files -s >actual &&
-  ! test -f old
+       read_tree_u_must_succeed --reset -u HEAD &&
+       git ls-files -s >expect &&
+       sha1=$(git rev-parse :new) &&
+       (
+               echo "100644 $sha1 1    old"
+               echo "100644 $sha1 3    old"
+       ) | git update-index --index-info &&
+       >old &&
+       git ls-files -s &&
+       git checkout -f HEAD &&
+       git ls-files -s >actual &&
+       ! test -f old
 '
 
 test_done
index a420742494024e127d4e4233153c7054e077e471..1687098355b710850a04769512320930d9b8b27b 100755 (executable)
@@ -85,6 +85,28 @@ $content"
                git cat-file --batch-check="%(objecttype) %(rest)" >actual &&
        test_cmp expect actual
     '
+
+    test -z "$content" ||
+    test_expect_success "--batch without type ($type)" '
+       {
+               echo "$size" &&
+               maybe_remove_timestamp "$content" $no_ts
+       } >expect &&
+       echo $sha1 | git cat-file --batch="%(objectsize)" >actual.full &&
+       maybe_remove_timestamp "$(cat actual.full)" $no_ts >actual &&
+       test_cmp expect actual
+    '
+
+    test -z "$content" ||
+    test_expect_success "--batch without size ($type)" '
+       {
+               echo "$type" &&
+               maybe_remove_timestamp "$content" $no_ts
+       } >expect &&
+       echo $sha1 | git cat-file --batch="%(objecttype)" >actual.full &&
+       maybe_remove_timestamp "$(cat actual.full)" $no_ts >actual &&
+       test_cmp expect actual
+    '
 }
 
 hello_content="Hello World"
@@ -194,6 +216,12 @@ test_expect_success "--batch-check for an emtpy line" '
     test " missing" = "$(echo | git cat-file --batch-check)"
 '
 
+test_expect_success 'empty --batch-check notices missing object' '
+       echo "$_z40 missing" >expect &&
+       echo "$_z40" | git cat-file --batch-check="" >actual &&
+       test_cmp expect actual
+'
+
 batch_input="$hello_sha1
 $commit_sha1
 $tag_sha1
index f950c101287c2f05bbd70c1faffbcf2cda1edbee..613d9bfe1bbb153d1c2e647aee26a60e07a6af86 100755 (executable)
@@ -196,4 +196,28 @@ test_expect_success 'dotdot is not an empty set' '
        test_cmp expect actual
 '
 
+test_expect_success 'arg before dashdash must be a revision (missing)' '
+       test_must_fail git rev-parse foobar -- 2>stderr &&
+       test_i18ngrep "bad revision" stderr
+'
+
+test_expect_success 'arg before dashdash must be a revision (file)' '
+       >foobar &&
+       test_must_fail git rev-parse foobar -- 2>stderr &&
+       test_i18ngrep "bad revision" stderr
+'
+
+test_expect_success 'arg before dashdash must be a revision (ambiguous)' '
+       >foobar &&
+       git update-ref refs/heads/foobar HEAD &&
+       {
+               # we do not want to use rev-parse here, because
+               # we are testing it
+               cat .git/refs/heads/foobar &&
+               printf "%s\n" --
+       } >expect &&
+       git rev-parse foobar -- >actual &&
+       test_cmp expect actual
+'
+
 test_done
index fb000411395d50639334c3c0395b2b975aa4bc12..2a6278bb333d2843ee617ff69227feae115aefea 100755 (executable)
@@ -310,4 +310,19 @@ EOF
        test_cmp expected actual
 '
 
+test_expect_success 'log decoration properly follows tag chain' '
+       git tag -a tag1 -m tag1 &&
+       git tag -a tag2 -m tag2 tag1 &&
+       git tag -d tag1 &&
+       git commit --amend -m shorter &&
+       git log --no-walk --tags --pretty="%H %d" --decorate=full >actual &&
+       cat <<EOF >expected &&
+6a908c10688b2503073c39c9ba26322c73902bb5  (tag: refs/tags/tag2)
+9f716384d92283fb915a4eee5073f030638e05f9  (tag: refs/tags/message-one)
+b87e4cccdb77336ea79d89224737be7ea8e95367  (tag: refs/tags/message-two)
+EOF
+       sort actual >actual1 &&
+       test_cmp expected actual1
+'
+
 test_done
index d87ddf73b7127bc624ca739653db9389831b817e..5b2b1c2c130387332778f6e49043b739dd2d7d21 100755 (executable)
@@ -531,5 +531,92 @@ test_expect_success 'shallow fetch with tags does not break the repository' '
                git fsck
        )
 '
+check_prot_path () {
+       cat >expected <<-EOF &&
+       Diag: url=$1
+       Diag: protocol=$2
+       Diag: path=$3
+       EOF
+       git fetch-pack --diag-url "$1" | grep -v hostandport= >actual &&
+       test_cmp expected actual
+}
+
+check_prot_host_path () {
+       cat >expected <<-EOF &&
+       Diag: url=$1
+       Diag: protocol=$2
+       Diag: hostandport=$3
+       Diag: path=$4
+       EOF
+       git fetch-pack --diag-url "$1" >actual &&
+       test_cmp expected actual
+}
+
+for r in repo re:po re/po
+do
+       # git or ssh with scheme
+       for p in "ssh+git" "git+ssh" git ssh
+       do
+               for h in host host:12 [::1] [::1]:23
+               do
+                       case "$p" in
+                       *ssh*)
+                               pp=ssh
+                               ;;
+                       *)
+                               pp=$p
+                       ;;
+                       esac
+                       test_expect_success "fetch-pack --diag-url $p://$h/$r" '
+                               check_prot_host_path $p://$h/$r $pp "$h" "/$r"
+                       '
+                       # "/~" -> "~" conversion
+                       test_expect_success "fetch-pack --diag-url $p://$h/~$r" '
+                               check_prot_host_path $p://$h/~$r $pp "$h" "~$r"
+                       '
+               done
+       done
+       # file with scheme
+       for p in file
+       do
+               test_expect_success "fetch-pack --diag-url $p://$h/$r" '
+                       check_prot_path $p://$h/$r $p "/$r"
+               '
+               # No "/~" -> "~" conversion for file
+               test_expect_success "fetch-pack --diag-url $p://$h/~$r" '
+                       check_prot_path $p://$h/~$r $p "/~$r"
+               '
+       done
+       # file without scheme
+       for h in nohost nohost:12 [::1] [::1]:23 [ [:aa
+       do
+               test_expect_success "fetch-pack --diag-url ./$h:$r" '
+                       check_prot_path ./$h:$r $p "./$h:$r"
+               '
+               # No "/~" -> "~" conversion for file
+               test_expect_success "fetch-pack --diag-url ./$p:$h/~$r" '
+               check_prot_path ./$p:$h/~$r $p "./$p:$h/~$r"
+               '
+       done
+       #ssh without scheme
+       p=ssh
+       for h in host [::1]
+       do
+               test_expect_success "fetch-pack --diag-url $h:$r" '
+                       check_prot_path $h:$r $p "$r"
+               '
+               # Do "/~" -> "~" conversion
+               test_expect_success "fetch-pack --diag-url $h:/~$r" '
+                       check_prot_host_path $h:/~$r $p "$h" "~$r"
+               '
+       done
+done
+
+test_expect_success MINGW 'fetch-pack --diag-url file://c:/repo' '
+       check_prot_path file://c:/repo file c:/repo
+'
+test_expect_success MINGW 'fetch-pack --diag-url c:repo' '
+       check_prot_path c:repo file c:repo
+'
 
 test_done
index 1d1c8755ead4e432744a82f0d7b8ed7dfc8a6510..62fbd7e6649d9215528a83249f1b46735de2237d 100755 (executable)
@@ -280,25 +280,26 @@ test_expect_success 'clone checking out a tag' '
        test_cmp fetch.expected fetch.actual
 '
 
-test_expect_success 'setup ssh wrapper' '
-       write_script "$TRASH_DIRECTORY/ssh-wrapper" <<-\EOF &&
-       echo >>"$TRASH_DIRECTORY/ssh-output" "ssh: $*" &&
-       # throw away all but the last argument, which should be the
-       # command
-       while test $# -gt 1; do shift; done
-       eval "$1"
-       EOF
-
-       GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" &&
-       export GIT_SSH &&
-       export TRASH_DIRECTORY
-'
-
-clear_ssh () {
-       >"$TRASH_DIRECTORY/ssh-output"
+setup_ssh_wrapper () {
+       test_expect_success 'setup ssh wrapper' '
+               write_script "$TRASH_DIRECTORY/ssh-wrapper" <<-\EOF &&
+               echo >>"$TRASH_DIRECTORY/ssh-output" "ssh: $*" &&
+               # throw away all but the last argument, which should be the
+               # command
+               while test $# -gt 1; do shift; done
+               eval "$1"
+               EOF
+               GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" &&
+               export GIT_SSH &&
+               export TRASH_DIRECTORY &&
+               >"$TRASH_DIRECTORY"/ssh-output
+       '
 }
 
 expect_ssh () {
+       test_when_finished '
+               (cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output)
+       ' &&
        {
                case "$1" in
                none)
@@ -310,25 +311,114 @@ expect_ssh () {
        (cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output)
 }
 
-test_expect_success 'cloning myhost:src uses ssh' '
-       clear_ssh &&
+setup_ssh_wrapper
+
+test_expect_success 'clone myhost:src uses ssh' '
        git clone myhost:src ssh-clone &&
        expect_ssh myhost src
 '
 
 test_expect_success NOT_MINGW,NOT_CYGWIN 'clone local path foo:bar' '
-       clear_ssh &&
        cp -R src "foo:bar" &&
-       git clone "./foo:bar" foobar &&
+       git clone "foo:bar" foobar &&
        expect_ssh none
 '
 
 test_expect_success 'bracketed hostnames are still ssh' '
-       clear_ssh &&
        git clone "[myhost:123]:src" ssh-bracket-clone &&
        expect_ssh myhost:123 src
 '
 
+counter=0
+# $1 url
+# $2 none|host
+# $3 path
+test_clone_url () {
+       counter=$(($counter + 1))
+       test_might_fail git clone "$1" tmp$counter &&
+       expect_ssh "$2" "$3"
+}
+
+test_expect_success NOT_MINGW 'clone c:temp is ssl' '
+       test_clone_url c:temp c temp
+'
+
+test_expect_success MINGW 'clone c:temp is dos drive' '
+       test_clone_url c:temp none
+'
+
+#ip v4
+for repo in rep rep/home/project 123
+do
+       test_expect_success "clone host:$repo" '
+               test_clone_url host:$repo host $repo
+       '
+done
+
+#ipv6
+for repo in rep rep/home/project 123
+do
+       test_expect_success "clone [::1]:$repo" '
+               test_clone_url [::1]:$repo ::1 $repo
+       '
+done
+#home directory
+test_expect_success "clone host:/~repo" '
+       test_clone_url host:/~repo host "~repo"
+'
+
+test_expect_success "clone [::1]:/~repo" '
+       test_clone_url [::1]:/~repo ::1 "~repo"
+'
+
+# Corner cases
+for url in foo/bar:baz [foo]bar/baz:qux [foo/bar]:baz
+do
+       test_expect_success "clone $url is not ssh" '
+               test_clone_url $url none
+       '
+done
+
+#with ssh:// scheme
+test_expect_success 'clone ssh://host.xz/home/user/repo' '
+       test_clone_url "ssh://host.xz/home/user/repo" host.xz "/home/user/repo"
+'
+
+# from home directory
+test_expect_success 'clone ssh://host.xz/~repo' '
+       test_clone_url "ssh://host.xz/~repo" host.xz "~repo"
+'
+
+# with port number
+test_expect_success 'clone ssh://host.xz:22/home/user/repo' '
+       test_clone_url "ssh://host.xz:22/home/user/repo" "-p 22 host.xz" "/home/user/repo"
+'
+
+# from home directory with port number
+test_expect_success 'clone ssh://host.xz:22/~repo' '
+       test_clone_url "ssh://host.xz:22/~repo" "-p 22 host.xz" "~repo"
+'
+
+#IPv6
+test_expect_success 'clone ssh://[::1]/home/user/repo' '
+       test_clone_url "ssh://[::1]/home/user/repo" "::1" "/home/user/repo"
+'
+
+#IPv6 from home directory
+test_expect_success 'clone ssh://[::1]/~repo' '
+       test_clone_url "ssh://[::1]/~repo" "::1" "~repo"
+'
+
+#IPv6 with port number
+test_expect_success 'clone ssh://[::1]:22/home/user/repo' '
+       test_clone_url "ssh://[::1]:22/home/user/repo" "-p 22 ::1" "/home/user/repo"
+'
+
+#IPv6 from home directory with port number
+test_expect_success 'clone ssh://[::1]:22/~repo' '
+       test_clone_url "ssh://[::1]:22/~repo" "-p 22 ::1" "~repo"
+'
+
 test_expect_success 'clone from a repository with two identical branches' '
 
        (
index 8d4a7fcb916f9669a9c9ef5b3668f881aff29217..a7c7ff5f4938c1fa7439e7c5a45321572bfc55fe 100755 (executable)
@@ -100,4 +100,10 @@ test_expect_success 'match_pathspec_depth matches :(icase)bar with empty prefix'
        test_cmp expect actual
 '
 
+test_expect_success '"git diff" can take magic :(icase) pathspec' '
+       echo FOO/BAR >expect &&
+       git diff --name-only HEAD^ HEAD -- ":(icase)foo/bar" >actual &&
+       test_cmp expect actual
+'
+
 test_done
index b90e985a48efbf8cdb16c6166356f6984ffbcea8..3bfdfed1f7774edb8a87864bdb6a021dc6a185ed 100755 (executable)
@@ -70,6 +70,35 @@ test_expect_success \
 rm -f idontexist untracked1 untracked2 \
      path0/idontexist path0/untracked1 path0/untracked2 \
      .git/index.lock
+rmdir path1
+
+test_expect_success \
+    'moving to absent target with trailing slash' \
+    'test_must_fail git mv path0/COPYING no-such-dir/ &&
+     test_must_fail git mv path0/COPYING no-such-dir// &&
+     git mv path0/ no-such-dir/ &&
+     test_path_is_dir no-such-dir'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
+
+test_expect_success \
+    'moving to existing untracked target with trailing slash' \
+    'mkdir path1 &&
+     git mv path0/ path1/ &&
+     test_path_is_dir path1/path0/'
+
+test_expect_success \
+    'moving to existing tracked target with trailing slash' \
+    'mkdir path2 &&
+     >path2/file && git add path2/file &&
+     git mv path1/path0/ path2/ &&
+     test_path_is_dir path2/path0/'
+
+test_expect_success \
+    'clean up' \
+    'git reset --hard'
 
 test_expect_success \
     'adding another file' \
index f0b33053ab01c692a4dda15c0f631aaa45fb81b9..0825a928dfa2a340f6fce6e2313324bd5d63ea7f 100755 (executable)
@@ -323,6 +323,21 @@ test_expect_success 'submodule update - command in .git/config catches failure'
        )
 '
 
+test_expect_success 'submodule init does not copy command into .git/config' '
+       (cd super &&
+        H=$(git ls-files -s submodule | cut -d" " -f2) &&
+        mkdir submodule1 &&
+        git update-index --add --cacheinfo 160000 $H submodule1 &&
+        git config -f .gitmodules submodule.submodule1.path submodule1 &&
+        git config -f .gitmodules submodule.submodule1.url ../submodule &&
+        git config -f .gitmodules submodule.submodule1.update !false &&
+        git submodule init submodule1 &&
+        echo "none" >expect &&
+        git config submodule.submodule1.update >actual &&
+        test_cmp expect actual
+       )
+'
+
 test_expect_success 'submodule init picks up rebase' '
        (cd super &&
         git config -f .gitmodules submodule.rebasing.update rebase &&
index da5bd3b5a585667dad97481df27049f0aa7415eb..2ddf28c984de99cb17884f76d68a708076f57e12 100755 (executable)
@@ -65,9 +65,35 @@ test_expect_success 'diff in message is retained without -v' '
        check_message diff
 '
 
-test_expect_failure 'diff in message is retained with -v' '
+test_expect_success 'diff in message is retained with -v' '
        git commit --amend -F diff -v &&
        check_message diff
 '
 
+test_expect_success 'submodule log is stripped out too with -v' '
+       git config diff.submodule log &&
+       git submodule add ./. sub &&
+       git commit -m "sub added" &&
+       (
+               cd sub &&
+               echo "more" >>file &&
+               git commit -a -m "submodule commit"
+       ) &&
+       (
+               GIT_EDITOR=cat &&
+               export GIT_EDITOR &&
+               test_must_fail git commit -a -v 2>err
+       ) &&
+       test_i18ngrep "Aborting commit due to empty commit message." err
+'
+
+test_expect_success 'verbose diff is stripped out with set core.commentChar' '
+       (
+               GIT_EDITOR=cat &&
+               export GIT_EDITOR &&
+               test_must_fail git -c core.commentchar=";" commit -a -v 2>err
+       ) &&
+       test_i18ngrep "Aborting commit due to empty commit message." err
+'
+
 test_done
index 7202b7777d804b75eb2ec54f666e81173690678c..5485e2ab1e86fd7f02c2078ed6505cdec292ee4f 100644 (file)
@@ -885,14 +885,6 @@ void transport_take_over(struct transport *transport,
        transport->cannot_reuse = 1;
 }
 
-static int is_local(const char *url)
-{
-       const char *colon = strchr(url, ':');
-       const char *slash = strchr(url, '/');
-       return !colon || (slash && slash < colon) ||
-               has_dos_drive_prefix(url);
-}
-
 static int is_file(const char *url)
 {
        struct stat buf;
@@ -941,7 +933,7 @@ struct transport *transport_get(struct remote *remote, const char *url)
                ret->fetch = fetch_objs_via_rsync;
                ret->push = rsync_transport_push;
                ret->smart_options = NULL;
-       } else if (is_local(url) && is_file(url) && is_bundle(url, 1)) {
+       } else if (url_is_local_not_ssh(url) && is_file(url) && is_bundle(url, 1)) {
                struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
                ret->data = data;
                ret->get_refs_list = get_refs_from_bundle;
@@ -1297,7 +1289,7 @@ char *transport_anonymize_url(const char *url)
        size_t anon_len, prefix_len = 0;
 
        anon_part = strchr(url, '@');
-       if (is_local(url) || !anon_part)
+       if (url_is_local_not_ssh(url) || !anon_part)
                goto literal_copy;
 
        anon_len = strlen(++anon_part);
index 35cb05e92bed9fb273747adc4718458b9f500898..ad3e9a04fe8ccb9286b94480f4484b0569f70a57 100644 (file)
@@ -1763,14 +1763,23 @@ int twoway_merge(const struct cache_entry * const *src,
                newtree = NULL;
 
        if (current) {
-               if ((!oldtree && !newtree) || /* 4 and 5 */
-                   (!oldtree && newtree &&
-                    same(current, newtree)) || /* 6 and 7 */
-                   (oldtree && newtree &&
-                    same(oldtree, newtree)) || /* 14 and 15 */
-                   (oldtree && newtree &&
-                    !same(oldtree, newtree) && /* 18 and 19 */
-                    same(current, newtree))) {
+               if (current->ce_flags & CE_CONFLICTED) {
+                       if (same(oldtree, newtree) || o->reset) {
+                               if (!newtree)
+                                       return deleted_entry(current, current, o);
+                               else
+                                       return merged_entry(newtree, current, o);
+                       }
+                       return o->gently ? -1 : reject_merge(current, o);
+               }
+               else if ((!oldtree && !newtree) || /* 4 and 5 */
+                        (!oldtree && newtree &&
+                         same(current, newtree)) || /* 6 and 7 */
+                        (oldtree && newtree &&
+                         same(oldtree, newtree)) || /* 14 and 15 */
+                        (oldtree && newtree &&
+                         !same(oldtree, newtree) && /* 18 and 19 */
+                         same(current, newtree))) {
                        return keep_entry(current, o);
                }
                else if (oldtree && !newtree && same(current, oldtree)) {
index 9a6aaafaf35bbd6d2a7a97589edfd9b0b12102c7..0cc56368bd8ccef90ff643ce091cae25007eeee7 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -133,7 +133,7 @@ void *xcalloc(size_t nmemb, size_t size)
 /*
  * Limit size of IO chunks, because huge chunks only cause pain.  OS X
  * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in
- * the absense of bugs, large chunks can result in bad latencies when
+ * the absence of bugs, large chunks can result in bad latencies when
  * you decide to kill the process.
  */
 #define MAX_IO_SIZE (8*1024*1024)
index b4e44baa2917dfcf33824c3d6fc08756886b9ae1..85390b813f12e2392b73dd6dffe8d1b41e838614 100644 (file)
@@ -16,6 +16,9 @@
 #include "column.h"
 #include "strbuf.h"
 
+static char cut_line[] =
+"------------------------ >8 ------------------------\n";
+
 static char default_wt_status_colors[][COLOR_MAXLEN] = {
        GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
        GIT_COLOR_GREEN,  /* WT_STATUS_UPDATED */
@@ -767,6 +770,18 @@ conclude:
        status_printf_ln(s, GIT_COLOR_NORMAL, "");
 }
 
+void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
+{
+       const char *p;
+       struct strbuf pattern = STRBUF_INIT;
+
+       strbuf_addf(&pattern, "%c %s", comment_line_char, cut_line);
+       p = strstr(buf->buf, pattern.buf);
+       if (p && (p == buf->buf || p[-1] == '\n'))
+               strbuf_setlen(buf, p - buf->buf);
+       strbuf_release(&pattern);
+}
+
 static void wt_status_print_verbose(struct wt_status *s)
 {
        struct rev_info rev;
@@ -787,10 +802,20 @@ static void wt_status_print_verbose(struct wt_status *s)
         * If we're not going to stdout, then we definitely don't
         * want color, since we are going to the commit message
         * file (and even the "auto" setting won't work, since it
-        * will have checked isatty on stdout).
+        * will have checked isatty on stdout). But we then do want
+        * to insert the scissor line here to reliably remove the
+        * diff before committing.
         */
-       if (s->fp != stdout)
+       if (s->fp != stdout) {
+               const char *explanation = _("Do not touch the line above.\nEverything below will be removed.");
+               struct strbuf buf = STRBUF_INIT;
+
                rev.diffopt.use_color = 0;
+               fprintf(s->fp, "%c %s", comment_line_char, cut_line);
+               strbuf_add_commented_lines(&buf, explanation, strlen(explanation));
+               fputs(buf.buf, s->fp);
+               strbuf_release(&buf);
+       }
        run_diff_index(&rev, 1);
 }
 
index 6c29e6f5e57f84eb7acdc3cf1ee621cc717fd5a9..30a481258366733ad5d6a65e3a9c3ae1ee74e833 100644 (file)
@@ -91,6 +91,7 @@ struct wt_status_state {
        unsigned char cherry_pick_head_sha1[20];
 };
 
+void wt_status_truncate_message_at_cut_line(struct strbuf *);
 void wt_status_prepare(struct wt_status *s);
 void wt_status_print(struct wt_status *s);
 void wt_status_collect(struct wt_status *s);