]> asedeno.scripts.mit.edu Git - git.git/commitdiff
Merge branch 'tr/rfc-reset-doc' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 20 Aug 2010 19:53:07 +0000 (12:53 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Aug 2010 19:53:07 +0000 (12:53 -0700)
* tr/rfc-reset-doc:
  Documentation/reset: move "undo permanently" example behind "make topic"
  Documentation/reset: reorder examples to match description
  Documentation/reset: promote 'examples' one section up
  Documentation/reset: separate options by mode
  Documentation/git-reset: reorder modes for soft-mixed-hard progression

93 files changed:
Documentation/RelNotes-1.7.0.7.txt [new file with mode: 0644]
Documentation/RelNotes-1.7.1.2.txt
Documentation/RelNotes-1.7.2.1.txt [new file with mode: 0644]
Documentation/RelNotes-1.7.2.2.txt [new file with mode: 0644]
Documentation/RelNotes-1.7.2.txt
Documentation/config.txt
Documentation/diff-options.txt
Documentation/git-add.txt
Documentation/git-apply.txt
Documentation/git-log.txt
Documentation/git-ls-files.txt
Documentation/git-mergetool.txt
Documentation/git-notes.txt
Documentation/git-prune.txt
Documentation/git-push.txt
Documentation/git-read-tree.txt
Documentation/git-request-pull.txt
Documentation/git-rev-parse.txt
Documentation/git-show-ref.txt
Documentation/git-submodule.txt
Documentation/git.txt
Documentation/pretty-options.txt
GIT-VERSION-GEN
INSTALL
Makefile
RelNotes
base85.c
builtin/add.c
builtin/check-ref-format.c
builtin/commit.c
builtin/diff.c
builtin/fetch.c
builtin/help.c
builtin/index-pack.c
builtin/notes.c
builtin/prune.c
builtin/push.c
cache.h
contrib/hooks/post-receive-email
contrib/svn-fe/.gitignore [new file with mode: 0644]
contrib/svn-fe/Makefile [new file with mode: 0644]
contrib/svn-fe/svn-fe.c [new file with mode: 0644]
contrib/svn-fe/svn-fe.txt [new file with mode: 0644]
diff.c
diffcore.h
dir.c
dir.h
fast-import.c
git-compat-util.h
git-gui/git-gui.sh
git-gui/lib/blame.tcl
git-gui/lib/choose_repository.tcl
git-gui/lib/diff.tcl
git-gui/lib/option.tcl
git-gui/lib/shortcut.tcl
git-gui/lib/status_bar.tcl
git-gui/lib/win32.tcl
git-gui/windows/git-gui.sh
git-instaweb.sh
git-rebase--interactive.sh
git-rebase.sh
git-submodule.sh
git-svn.perl
git-web--browse.sh
git.c
gitweb/gitweb.perl
http.h
imap-send.c
path.c
remote-curl.c
server-info.c
setup.c
sha1_name.c
t/Makefile
t/README
t/lib-git-svn.sh
t/lib-httpd.sh
t/t1300-repo-config.sh
t/t1402-check-ref-format.sh
t/t2017-checkout-orphan.sh
t/t3200-branch.sh
t/t3301-notes.sh
t/t3404-rebase-interactive.sh
t/t3418-rebase-continue.sh [new file with mode: 0755]
t/t3700-add.sh
t/t4045-diff-relative.sh [new file with mode: 0755]
t/t5541-http-push.sh
t/t6050-replace.sh
t/t7003-filter-branch.sh
t/t7400-submodule-basic.sh
t/t9300-fast-import.sh
t/test-lib.sh
wrapper.c

diff --git a/Documentation/RelNotes-1.7.0.7.txt b/Documentation/RelNotes-1.7.0.7.txt
new file mode 100644 (file)
index 0000000..d0cb7ca
--- /dev/null
@@ -0,0 +1,16 @@
+Git v1.7.0.7 Release Notes
+==========================
+
+Fixes since v1.7.0.6
+--------------------
+
+ * "make NO_CURL=NoThanks install" was broken.
+
+ * An overlong line after ".gitdir: " in a git file caused out of bounds
+   access to an array on the stack.
+
+ * "git config --path conf.var" to attempt to expand a variable conf.var
+   that uses "~/" short-hand segfaulted when $HOME environment variable
+   was not set.
+
+And other minor fixes and documentation updates.
index 46b6a960c799a5324b48ea2e266eaab5187ded24..61ba14e262a450c47d1490f4eedadbf8031fd3ed 100644 (file)
@@ -17,3 +17,12 @@ Fixes since v1.7.1.1
 
  * "git rev-parse --parseopt --stop-at-non-option" did not stop at non option
    when --keep-dashdash was in effect.
+
+ * An overlong line after ".gitdir: " in a git file caused out of bounds
+   access to an array on the stack.
+
+ * "git config --path conf.var" to attempt to expand a variable conf.var
+   that uses "~/" short-hand segfaulted when $HOME environment variable
+   was not set.
+
+And other minor fixes and documentation updates.
diff --git a/Documentation/RelNotes-1.7.2.1.txt b/Documentation/RelNotes-1.7.2.1.txt
new file mode 100644 (file)
index 0000000..1103c47
--- /dev/null
@@ -0,0 +1,25 @@
+Git v1.7.2.1 Release Notes
+==========================
+
+Fixes since v1.7.2
+------------------
+
+ * "git instaweb" wasn't useful when your Apache was installed under a
+   name other than apache2 (e.g. "httpd").
+
+ * Similarly, "git web--browse" (invoked by "git help -w") learned that
+   chrome browser is sometimes called google-chrome.
+
+ * An overlong line after ".gitdir: " in a git file caused out of bounds
+   access to an array on the stack.
+
+ * "git config --path conf.var" to attempt to expand a variable conf.var
+   that uses "~/" short-hand segfaulted when $HOME environment variable
+   was not set.
+
+ * Documentation on Cygwin failed to build.
+
+ * The error message from "git pull blarg" when 'blarg' is an unknown
+   remote name has been improved.
+
+And other minor fixes and documentation updates.
diff --git a/Documentation/RelNotes-1.7.2.2.txt b/Documentation/RelNotes-1.7.2.2.txt
new file mode 100644 (file)
index 0000000..71eb6a8
--- /dev/null
@@ -0,0 +1,22 @@
+Git v1.7.2.2 Release Notes
+==========================
+
+Fixes since v1.7.2.1
+--------------------
+
+ * Object transfer over smart http transport deadlocked the client when
+   the remote HTTP server returned a failure, instead of erroring it out.
+
+ * git-gui honors custom textconv filters when showing diff and blame;
+
+ * git diff --relative=subdir (without the necessary trailing /) did not
+   work well;
+
+ * "git diff-files -p --submodule" was recently broken;
+
+ * "git checkout -b n ':/token'" did not work;
+
+ * "git index-pack" (hence "git fetch/clone/pull/push") enabled the object
+   replacement machinery by mistake (it never should have);
+
+And other minor fixes and documentation updates.
index f24b3876af6e2edbfdd7e8af2eff445fb8e6f85d..15cf01178c1f653230c8f718ef7024b147ecacf9 100644 (file)
@@ -1,5 +1,5 @@
-Git v1.7.2 Release Notes (draft)
-================================
+Git v1.7.2 Release Notes
+========================
 
 Updates since v1.7.1
 --------------------
@@ -123,6 +123,8 @@ Updates since v1.7.1
 
  * The test harness has been updated to produce TAP-friendly output.
 
+ * Many documentation improvement patches are also included.
+
 
 Fixes since v1.7.1
 ------------------
@@ -147,9 +149,3 @@ release, unless otherwise noted.
 
  * "git read-tree -m A B" used to switch to branch B while retaining
    local changes added an incorrect cache-tree information (b1f47514).
-
---
-exec >/var/tmp/1
-O=v1.7.2-rc2-17-gc9a9766
-echo O=$(git describe HEAD)
-git shortlog --no-merges HEAD ^maint ^$O
index e75434b3ef2d81fa8dafd552d4b689eb84eea441..f81fb918dac03bc6084f84d818ba08caacd39fc1 100644 (file)
@@ -1558,6 +1558,10 @@ receive.denyDeletes::
        If set to true, git-receive-pack will deny a ref update that deletes
        the ref. Use this to prevent such a ref deletion via a push.
 
+receive.denyDeleteCurrent::
+       If set to true, git-receive-pack will deny a ref update that
+       deletes the currently checked out branch of a non-bare repository.
+
 receive.denyCurrentBranch::
        If set to true or "refuse", git-receive-pack will deny a ref update
        to the currently checked out branch of a non-bare repository.
index 2371262b10aad44391406e126a1a8027b543fd49..eecedaab6e172f227f2451f4b3d35c9e6e99bf1e 100644 (file)
@@ -206,10 +206,29 @@ endif::git-format-patch[]
        the diff-patch output format.  Non default number of
        digits can be specified with `--abbrev=<n>`.
 
--B::
-       Break complete rewrite changes into pairs of delete and create.
-
--M::
+-B[<n>][/<m>]::
+       Break complete rewrite changes into pairs of delete and
+       create. This serves two purposes:
++
+It affects the way a change that amounts to a total rewrite of a file
+not as a series of deletion and insertion mixed together with a very
+few lines that happen to match textually as the context, but as a
+single deletion of everything old followed by a single insertion of
+everything new, and the number `m` controls this aspect of the -B
+option (defaults to 60%). `-B/70%` specifies that less than 30% of the
+original should remain in the result for git to consider it a total
+rewrite (i.e. otherwise the resulting patch will be a series of
+deletion and insertion mixed together with context lines).
++
+When used with -M, a totally-rewritten file is also considered as the
+source of a rename (usually -M only considers a file that disappeared
+as the source of a rename), and the number `n` controls this aspect of
+the -B option (defaults to 50%). `-B20%` specifies that a change with
+addition and deletion compared to 20% or more of the file's size are
+eligible for being picked up as a possible source of a rename to
+another file.
+
+-M[<n>]::
 ifndef::git-log[]
        Detect renames.
 endif::git-log[]
@@ -218,9 +237,15 @@ ifdef::git-log[]
        For following files across renames while traversing history, see
        `--follow`.
 endif::git-log[]
+       If `n` is specified, it is a is a threshold on the similarity
+       index (i.e. amount of addition/deletions compared to the
+       file's size). For example, `-M90%` means git should consider a
+       delete/add pair to be a rename if more than 90% of the file
+       hasn't changed.
 
--C::
+-C[<n>]::
        Detect copies as well as renames.  See also `--find-copies-harder`.
+       If `n` is specified, it has the same meaning as for `-M<n>`.
 
 ifndef::git-format-patch[]
 --diff-filter=[ACDMRTUXB*]::
index 74741a42f409a7af5c60584a0d3b7a0be851811c..e22a62f06592c7d233fc06da022962cae59d105a 100644 (file)
@@ -10,7 +10,8 @@ SYNOPSIS
 [verse]
 'git add' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
          [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]
-         [--refresh] [--ignore-errors] [--] [<filepattern>...]
+         [--refresh] [--ignore-errors] [--ignore-missing] [--]
+         [<filepattern>...]
 
 DESCRIPTION
 -----------
@@ -57,7 +58,8 @@ OPTIONS
 
 -n::
 --dry-run::
-        Don't actually add the file(s), just show if they exist.
+       Don't actually add the file(s), just show if they exist and/or will
+       be ignored.
 
 -v::
 --verbose::
@@ -131,6 +133,12 @@ subdirectories.
        them, do not abort the operation, but continue adding the
        others. The command shall still exit with non-zero status.
 
+--ignore-missing::
+       This option can only be used together with --dry-run. By using
+       this option the user can check if any of the given files would
+       be ignored, no matter if they are already present in the work
+       tree or not.
+
 \--::
        This option can be used to separate command-line options from
        the list of files, (useful when filenames might be mistaken
index 8463439ac5047d5f1921db4d6f2d765e7728c73b..4a74b23d403d970643fcb8e0438ab6649f54e54c 100644 (file)
@@ -26,6 +26,10 @@ with the `--cache` option the patch is only applied to the index.
 Without these options, the command applies the patch only to files,
 and does not require them to be in a git repository.
 
+This command applies the patch but does not create a commit.  Use
+linkgit:git-am[1] to create commits from patches generated by
+linkgit:git-format-patch[1] and/or received by email.
+
 OPTIONS
 -------
 <patch>...::
@@ -242,6 +246,12 @@ If `--index` is not specified, then the submodule commits in the patch
 are ignored and only the absence or presence of the corresponding
 subdirectory is checked and (if possible) updated.
 
+
+SEE ALSO
+--------
+linkgit:git-am[1].
+
+
 Author
 ------
 Written by Linus Torvalds <torvalds@osdl.org>
index e970664fe1a47c3f35f0f7c60b6c8f9781caed31..c213bdbdc500b1117805bc84cb2a0f31eeff3bcd 100644 (file)
@@ -55,6 +55,9 @@ OPTIONS
        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.
 
 --log-size::
        Before the log message print out its size in bytes. Intended
index 3521637b582687978c088dc463e8784817a92217..bd919f2dfddc0165f7749e425a9b1d393558d46f 100644 (file)
@@ -106,8 +106,16 @@ OPTIONS
        with `-s` or `-u` options does not make any sense.
 
 -t::
-       Identify the file status with the following tags (followed by
-       a space) at the start of each line:
+       This feature is semi-deprecated. For scripting purpose,
+       linkgit:git-status[1] `--porcelain` and
+       linkgit:git-diff-files[1] `--name-status` are almost always
+       superior alternatives, and users should look at
+       linkgit:git-status[1] `--short` or linkgit:git-diff[1]
+       `--name-status` for more user-friendly alternatives.
++
+This option identifies the file status with the following tags (followed by
+a space) at the start of each line:
+
        H::     cached
        S::     skip-worktree
        M::     unmerged
index 55735faf7b58dfa56f7a7b93b5e0d7f19b98a808..e4ed0161467866f731c89eb48e64453051c64281 100644 (file)
@@ -72,6 +72,16 @@ success of the resolution after the custom tool has exited.
        This is the default behaviour; the option is provided to
        override any configuration settings.
 
+TEMPORARY FILES
+---------------
+`git mergetool` creates `*.orig` backup files while resolving merges.
+These are safe to remove once a file has been merged and its
+`git mergetool` session has completed.
+
+Setting the `mergetool.keepBackup` configuration variable to `false`
+causes `git mergetool` to automatically remove the backup as files
+are successfully merged.
+
 Author
 ------
 Written by Theodore Y Ts'o <tytso@mit.edu>
index 5540af5d1667aad16ac11c53593921733c4af56f..2981d8c5efd4e7e0f65d051cfe3b28d3430e3213 100644 (file)
@@ -129,10 +129,12 @@ OPTIONS
        is taken to be in `refs/notes/` if it is not qualified.
 
 -n::
+--dry-run::
        Do not remove anything; just report the object names whose notes
        would be removed.
 
 -v::
+--verbose::
        Report all object names whose notes are removed.
 
 
index 15cfb7a8dc8e5e6eb25ee58b8fe15d89ad62dc8a..4d673a56864ca88de0e98f54a6de469e99ea0f44 100644 (file)
@@ -31,10 +31,12 @@ OPTIONS
 -------
 
 -n::
+--dry-run::
        Do not remove anything; just report what it would
        remove.
 
 -v::
+--verbose::
        Report all removed objects.
 
 \--::
index b68abff28a0fe27fbcb2bbffa2296cffb1297eaf..658ff2ff67f23e9a9d2942e38528dba415139ac3 100644 (file)
@@ -200,16 +200,29 @@ summary::
        For a successfully pushed ref, the summary shows the old and new
        values of the ref in a form suitable for using as an argument to
        `git log` (this is `<old>..<new>` in most cases, and
-       `<old>...<new>` for forced non-fast-forward updates). For a
-       failed update, more details are given for the failure.
-       The string `rejected` indicates that git did not try to send the
-       ref at all (typically because it is not a fast-forward). The
-       string `remote rejected` indicates that the remote end refused
-       the update; this rejection is typically caused by a hook on the
-       remote side. The string `remote failure` indicates that the
-       remote end did not report the successful update of the ref
-       (perhaps because of a temporary error on the remote side, a
-       break in the network connection, or other transient error).
+       `<old>...<new>` for forced non-fast-forward updates).
++
+For a failed update, more details are given:
++
+--
+rejected::
+       Git did not try to send the ref at all, typically because it
+       is not a fast-forward and you did not force the update.
+
+remote rejected::
+       The remote end refused the update.  Usually caused by a hook
+       on the remote side, or because the remote repository has one
+       of the following safety options in effect:
+       `receive.denyCurrentBranch` (for pushes to the checked out
+       branch), `receive.denyNonFastForwards` (for forced
+       non-fast-forward updates), `receive.denyDeletes` or
+       `receive.denyDeleteCurrent`.  See linkgit:git-config[1].
+
+remote failure::
+       The remote end did not report the successful update of the ref,
+       perhaps because of a temporary error on the remote side, a
+       break in the network connection, or other transient error.
+--
 
 from::
        The name of the local ref being pushed, minus its
index f6037c4f6a7c6988a9a497455e555979d44e2600..2e78da448f30ad260cb7683a5610f424d0c5ffea 100644 (file)
@@ -412,6 +412,13 @@ turn `core.sparseCheckout` on in order to have sparse checkout
 support.
 
 
+BUGS
+----
+In order to match a directory with $GIT_DIR/info/sparse-checkout,
+trailing slash must be used. The form without trailing slash, while
+works with .gitignore, does not work with sparse checkout.
+
+
 SEE ALSO
 --------
 linkgit:git-write-tree[1]; linkgit:git-ls-files[1];
index 19335fddae2b706cd785258a8c02a5595c525667..400f61f6e24947525e51b7e5d808378819945205 100644 (file)
@@ -7,7 +7,7 @@ git-request-pull - Generates a summary of pending changes
 
 SYNOPSIS
 --------
-'git request-pull' <start> <url> [<end>]
+'git request-pull' [-p] <start> <url> [<end>]
 
 DESCRIPTION
 -----------
@@ -17,6 +17,9 @@ the given URL in the generated summary.
 
 OPTIONS
 -------
+-p::
+       Show patch text
+
 <start>::
        Commit to start at.
 
index 0727f431c6dc01296b04cc93204ba37d16b5a32b..be4c0533603443cd9b4df5bf732bbcdd31802a11 100644 (file)
@@ -184,10 +184,13 @@ scripts the same facilities C builtins have. It works as an option normalizer
 (e.g. splits single switches aggregate values), a bit like `getopt(1)` does.
 
 It takes on the standard input the specification of the options to parse and
-understand, and echoes on the standard output a line suitable for `sh(1)` `eval`
+understand, and echoes on the standard output a string suitable for `sh(1)` `eval`
 to replace the arguments with normalized ones.  In case of error, it outputs
 usage on the standard error stream, and exits with code 129.
 
+Note: Make sure you quote the result when passing it to `eval`.  See
+below for an example.
+
 Input Format
 ~~~~~~~~~~~~
 
@@ -244,7 +247,7 @@ bar=      some cool option --bar with an argument
   An option group Header
 C?        option C with an optional argument"
 
-eval `echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?`
+eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)"
 ------------
 
 SQ-QUOTE
index 3f9d9c6db39e030c82e1159043c45c834a47012c..75780d7d63894e220bf938da0b4f5dca40d6301d 100644 (file)
@@ -163,9 +163,15 @@ flag, so you can do
 
 to get a listing of all tags together with what they dereference.
 
+FILES
+-----
+`.git/refs/*`, `.git/packed-refs`
+
 SEE ALSO
 --------
-linkgit:git-ls-remote[1]
+linkgit:git-ls-remote[1],
+linkgit:git-update-ref[1],
+linkgit:gitrepository-layout[5]
 
 AUTHORS
 -------
index 76a832a3ac893111b2d17333e6bc99b7903b47a8..1ed331c599d4b492b0dec112332bb83db5506d74 100644 (file)
@@ -9,7 +9,7 @@ git-submodule - Initialize, update or inspect submodules
 SYNOPSIS
 --------
 [verse]
-'git submodule' [--quiet] add [-b branch]
+'git submodule' [--quiet] add [-b branch] [-f|--force]
              [--reference <repository>] [--] <repository> [<path>]
 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] init [--] [<path>...]
@@ -95,10 +95,6 @@ is the superproject and submodule repositories will be kept
 together in the same relative location, and only the
 superproject's URL needs to be provided: git-submodule will correctly
 locate the submodule using the relative URL in .gitmodules.
-+
-The submodule will be added with "git add --force <path>". I.e. git
-doesn't care if the new path is in a `gitignore`. Your invocation of
-"git submodule add" is considered enough to override it.
 
 status::
        Show the status of the submodules. This will print the SHA-1 of the
@@ -187,6 +183,11 @@ OPTIONS
 --branch::
        Branch of repository to add as submodule.
 
+-f::
+--force::
+       This option is only valid for the add command.
+       Allow adding an otherwise ignored submodule path.
+
 --cached::
        This option is only valid for status and summary commands.  These
        commands typically use the commit found in the submodule HEAD, but
index 12066ab3fc2ba37c0a9eb291d40e1fb4a985714b..531789321c3b09f522f3284b736b8c65227c31b4 100644 (file)
@@ -44,15 +44,24 @@ unreleased) version of git, that is available from 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
-* link:v1.7.1.1/git.html[documentation for release 1.7.1.1]
+* link:v1.7.2.2/git.html[documentation for release 1.7.2.2]
 
 * release notes for
+  link:RelNotes-1.7.2.2.txt[1.7.2.2],
+  link:RelNotes-1.7.2.1.txt[1.7.2.1],
+  link:RelNotes-1.7.2.txt[1.7.2].
+
+* link:v1.7.1.2/git.html[documentation for release 1.7.1.2]
+
+* release notes for
+  link:RelNotes-1.7.1.2.txt[1.7.1.2],
   link:RelNotes-1.7.1.1.txt[1.7.1.1],
   link:RelNotes-1.7.1.txt[1.7.1].
 
-* link:v1.7.0.6/git.html[documentation for release 1.7.0.6]
+* link:v1.7.0.7/git.html[documentation for release 1.7.0.7]
 
 * release notes for
+  link:RelNotes-1.7.0.7.txt[1.7.0.7],
   link:RelNotes-1.7.0.6.txt[1.7.0.6],
   link:RelNotes-1.7.0.5.txt[1.7.0.5],
   link:RelNotes-1.7.0.4.txt[1.7.0.4],
@@ -719,6 +728,13 @@ The documentation for git suite was started by David Greaves
 <david@dgreaves.com>, and later enhanced greatly by the
 contributors on the git-list <git@vger.kernel.org>.
 
+Reporting Bugs
+--------------
+
+Report bugs to the Git mailing list <git@vger.kernel.org> where the
+development and maintenance is primarily done.  You do not have to be
+subscribed to the list to send a message there.
+
 SEE ALSO
 --------
 linkgit:gittutorial[7], linkgit:gittutorial-2[7],
index d78e121c76ef12b2d72fbdf1558fa967dfdba85b..9b6f3899ec28fb431c1f3969bf5bfb717c12f346 100644 (file)
@@ -1,5 +1,5 @@
 --pretty[='<format>']::
---format[='<format>']::
+--format='<format>'::
 
        Pretty-print the contents of the commit logs in a given format,
        where '<format>' can be one of 'oneline', 'short', 'medium',
index e45513dee938dde3a8428a833fb43023b04ca95b..2c4f44bfb627f5b36264b9a8702ac9b2214cdf0b 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.7.1.GIT
+DEF_VER=v1.7.2.2
 
 LF='
 '
diff --git a/INSTALL b/INSTALL
index 61086ab1204a4304cb1d84eeea9d1649878ac9e1..59200b730ec00a63f981691f7fd37f2eacb11653 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -157,3 +157,36 @@ Issues of note:
    It has been reported that docbook-xsl version 1.72 and 1.73 are
    buggy; 1.72 misformats manual pages for callouts, and 1.73 needs
    the patch in contrib/patches/docbook-xsl-manpages-charmap.patch
+
+   Users attempting to build the documentation on Cygwin may need to ensure
+   that the /etc/xml/catalog file looks something like this:
+
+   <?xml version="1.0"?>
+   <!DOCTYPE catalog PUBLIC
+      "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN"
+      "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"
+   >
+   <catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+     <rewriteURI
+       uriStartString = "http://docbook.sourceforge.net/release/xsl/current"
+       rewritePrefix = "/usr/share/sgml/docbook/xsl-stylesheets"
+     />
+     <rewriteURI
+       uriStartString="http://www.oasis-open.org/docbook/xml/4.5"
+       rewritePrefix="/usr/share/sgml/docbook/xml-dtd-4.5"
+     />
+  </catalog>
+
+  This can be achieved with the following two xmlcatalog commands:
+
+  xmlcatalog --noout \
+     --add rewriteURI \
+        http://docbook.sourceforge.net/release/xsl/current \
+        /usr/share/sgml/docbook/xsl-stylesheets \
+     /etc/xml/catalog
+
+  xmlcatalog --noout \
+     --add rewriteURI \
+         http://www.oasis-open.org/docbook/xml/4.5/xsl/current \
+         /usr/share/sgml/docbook/xml-dtd-4.5 \
+     /etc/xml/catalog
index bc3c57058faba66f6a7a947e1e9642f47053b5bb..e151516532ebddbba6ca09aca15f0f4ff45ecb9b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1854,8 +1854,9 @@ builtin/prune.o builtin/reflog.o reachable.o: reachable.h
 builtin/commit.o builtin/revert.o wt-status.o: wt-status.h
 builtin/tar-tree.o archive-tar.o: tar.h
 builtin/pack-objects.o: thread-utils.h
+connect.o transport.o http-backend.o: url.h
 http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h
-http.o http-walker.o http-push.o remote-curl.o: http.h
+http.o http-walker.o http-push.o http-fetch.o remote-curl.o: http.h
 
 xdiff-interface.o $(XDIFF_OBJS): \
        xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
@@ -2254,6 +2255,7 @@ check-docs::
                documented,gitglossary | \
                documented,githooks | \
                documented,gitrepository-layout | \
+               documented,gitrevisions | \
                documented,gittutorial | \
                documented,gittutorial-2 | \
                documented,git-bisect-lk2009 | \
index 3da01a5622c0b6c581a701dbb5421fb84e87df80..028ad79e1f7226088102667085ca5ceb43c4d442 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes-1.7.2.txt
\ No newline at end of file
+Documentation/RelNotes-1.7.2.2.txt
\ No newline at end of file
index e459feebbf90c6557dbf3ff913f83a57a8afb210..781b5754f0e533008694e71ac7cfe2e52b2d0ac6 100644 (file)
--- a/base85.c
+++ b/base85.c
@@ -7,9 +7,9 @@
 #define say1(a,b) fprintf(stderr, a, b)
 #define say2(a,b,c) fprintf(stderr, a, b, c)
 #else
-#define say(a) do {} while(0)
-#define say1(a,b) do {} while(0)
-#define say2(a,b,c) do {} while(0)
+#define say(a) do { /* nothing */ } while (0)
+#define say1(a,b) do { /* nothing */ } while (0)
+#define say2(a,b,c) do { /* nothing */ } while (0)
 #endif
 
 static const char en85[] = {
index 17149cfeedcc39956dc55f8b72acc1227fed5213..56a4e0af6b35ea9f6d86accad27a1c87bc5ad0d9 100644 (file)
@@ -310,7 +310,7 @@ static const char ignore_error[] =
 "The following paths are ignored by one of your .gitignore files:\n";
 
 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
-static int ignore_add_errors, addremove, intent_to_add;
+static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0;
 
 static struct option builtin_add_options[] = {
        OPT__DRY_RUN(&show_only),
@@ -325,6 +325,7 @@ static struct option builtin_add_options[] = {
        OPT_BOOLEAN('A', "all", &addremove, "add all, noticing removal of tracked files"),
        OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"),
        OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"),
+       OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, "check if - even missing - files are ignored in dry run"),
        OPT_END(),
 };
 
@@ -385,6 +386,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
        if (addremove && take_worktree_changes)
                die("-A and -u are mutually incompatible");
+       if (!show_only && ignore_missing)
+               die("Option --ignore-missing can only be used together with --dry-run");
        if ((addremove || take_worktree_changes) && !argc) {
                static const char *here[2] = { ".", NULL };
                argc = 1;
@@ -441,9 +444,14 @@ int cmd_add(int argc, const char **argv, const char *prefix)
                        seen = find_used_pathspec(pathspec);
                for (i = 0; pathspec[i]; i++) {
                        if (!seen[i] && pathspec[i][0]
-                           && !file_exists(pathspec[i]))
-                               die("pathspec '%s' did not match any files",
-                                   pathspec[i]);
+                           && !file_exists(pathspec[i])) {
+                               if (ignore_missing) {
+                                       if (excluded(&dir, pathspec[i], DT_UNKNOWN))
+                                               dir_add_ignored(&dir, pathspec[i], strlen(pathspec[i]));
+                               } else
+                                       die("pathspec '%s' did not match any files",
+                                           pathspec[i]);
+                       }
                }
                free(seen);
        }
index b106c65d80dfc8fe794d46e34ea1ff78b04f3056..ae3f28115a7a4d65d8bb6f284cd1ececa4f9c2ef 100644 (file)
@@ -33,28 +33,38 @@ static void collapse_slashes(char *dst, const char *src)
        *dst = '\0';
 }
 
+static int check_ref_format_branch(const char *arg)
+{
+       struct strbuf sb = STRBUF_INIT;
+       int nongit;
+
+       setup_git_directory_gently(&nongit);
+       if (strbuf_check_branch_ref(&sb, arg))
+               die("'%s' is not a valid branch name", arg);
+       printf("%s\n", sb.buf + 11);
+       return 0;
+}
+
+static int check_ref_format_print(const char *arg)
+{
+       char *refname = xmalloc(strlen(arg) + 1);
+
+       if (check_ref_format(arg))
+               return 1;
+       collapse_slashes(refname, arg);
+       printf("%s\n", refname);
+       return 0;
+}
+
 int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
 {
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage(builtin_check_ref_format_usage);
 
-       if (argc == 3 && !strcmp(argv[1], "--branch")) {
-               struct strbuf sb = STRBUF_INIT;
-
-               if (strbuf_check_branch_ref(&sb, argv[2]))
-                       die("'%s' is not a valid branch name", argv[2]);
-               printf("%s\n", sb.buf + 11);
-               exit(0);
-       }
-       if (argc == 3 && !strcmp(argv[1], "--print")) {
-               char *refname = xmalloc(strlen(argv[2]) + 1);
-
-               if (check_ref_format(argv[2]))
-                       exit(1);
-               collapse_slashes(refname, argv[2]);
-               printf("%s\n", refname);
-               exit(0);
-       }
+       if (argc == 3 && !strcmp(argv[1], "--branch"))
+               return check_ref_format_branch(argv[2]);
+       if (argc == 3 && !strcmp(argv[1], "--print"))
+               return check_ref_format_print(argv[2]);
        if (argc != 2)
                usage(builtin_check_ref_format_usage);
        return !!check_ref_format(argv[1]);
index a78dbd83bf04c7080487b8508321d79d848e9b1f..2bb30c0e80f8948b28599da06c94c8c66b5733c7 100644 (file)
@@ -147,7 +147,7 @@ static struct option builtin_commit_options[] = {
                    "terminate entries with NUL"),
        OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"),
        OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"),
-       { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
+       { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
        /* end commit contents options */
 
        { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL,
index bb128631a919aa93bea31d7d6cb5e811427844f3..89ae89cde1e6d8a0a2e02209f5396263a81bda5b 100644 (file)
@@ -408,19 +408,6 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
        else if (ents == 2)
                result = builtin_diff_tree(&rev, argc, argv, ent);
        else if (ent[0].item->flags & UNINTERESTING) {
-               /*
-                * Perhaps the user gave us A...B, which expands
-                * to a list of negative merge bases followed by
-                * A (symmetric-left) and B?  Let's make sure...
-                */
-               for (i = 1; i < ents; i++)
-                       if (!(ent[i].item->flags & UNINTERESTING))
-                               break;
-               if (ents != i + 2 ||
-                   (ent[i+1].item->flags & UNINTERESTING) ||
-                   (!(ent[i].item->flags & SYMMETRIC_LEFT)) ||
-                   (ent[i+1].item->flags & SYMMETRIC_LEFT))
-                       die("what do you mean by that?");
                /*
                 * diff A...B where there is at least one merge base
                 * between A and B.  We have ent[0] == merge-base,
index 6eb1dfea092e2873c5910bf4389d3b071786d8b0..1b67f5fda55896635e91852657259b47e722c889 100644 (file)
@@ -845,7 +845,8 @@ static int fetch_one(struct remote *remote, int argc, const char **argv)
        int exit_code;
 
        if (!remote)
-               die("Where do you want to fetch from today?");
+               die("No remote repository specified.  Please, specify either a URL or a\n"
+                   "remote name from which new revisions should be fetched.");
 
        transport = transport_get(remote, NULL);
        transport_set_verbosity(transport, verbosity, progress);
index a9836b00aec8df68e7a615dce83d3c60f73e242f..61ff79839bc4778451425d0ae1cfd199247954a1 100644 (file)
@@ -120,7 +120,7 @@ static void exec_woman_emacs(const char *path, const char *page)
                if (!path)
                        path = "emacsclient";
                strbuf_addf(&man_page, "(woman \"%s\")", page);
-               execlp(path, "emacsclient", "-e", man_page.buf, NULL);
+               execlp(path, "emacsclient", "-e", man_page.buf, (char *)NULL);
                warning("failed to exec '%s': %s", path, strerror(errno));
        }
 }
@@ -148,7 +148,7 @@ static void exec_man_konqueror(const char *path, const char *page)
                } else
                        path = "kfmclient";
                strbuf_addf(&man_page, "man:%s(1)", page);
-               execlp(path, filename, "newTab", man_page.buf, NULL);
+               execlp(path, filename, "newTab", man_page.buf, (char *)NULL);
                warning("failed to exec '%s': %s", path, strerror(errno));
        }
 }
@@ -157,7 +157,7 @@ static void exec_man_man(const char *path, const char *page)
 {
        if (!path)
                path = "man";
-       execlp(path, "man", page, NULL);
+       execlp(path, "man", page, (char *)NULL);
        warning("failed to exec '%s': %s", path, strerror(errno));
 }
 
@@ -165,7 +165,7 @@ static void exec_man_cmd(const char *cmd, const char *page)
 {
        struct strbuf shell_cmd = STRBUF_INIT;
        strbuf_addf(&shell_cmd, "%s %s", cmd, page);
-       execl("/bin/sh", "sh", "-c", shell_cmd.buf, NULL);
+       execl("/bin/sh", "sh", "-c", shell_cmd.buf, (char *)NULL);
        warning("failed to exec '%s': %s", cmd, strerror(errno));
 }
 
@@ -372,7 +372,7 @@ static void show_info_page(const char *git_cmd)
 {
        const char *page = cmd_to_page(git_cmd);
        setenv("INFOPATH", system_path(GIT_INFO_PATH), 1);
-       execlp("info", "info", "gitman", page, NULL);
+       execlp("info", "info", "gitman", page, (char *)NULL);
        die("no info viewer handled the request");
 }
 
@@ -398,7 +398,7 @@ static void get_html_page_path(struct strbuf *page_path, const char *page)
 #ifndef open_html
 static void open_html(const char *path)
 {
-       execl_git_cmd("web--browse", "-c", "help.browser", path, NULL);
+       execl_git_cmd("web--browse", "-c", "help.browser", path, (char *)NULL);
 }
 #endif
 
index a89ae831dd6251d7332e06470273d30fd9cb31eb..fad76bf7a84a6a103de20732752119d5245e9638 100644 (file)
@@ -884,6 +884,8 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage(index_pack_usage);
 
+       read_replace_refs = 0;
+
        /*
         * We wish to read the repository's config file if any, and
         * for that it is necessary to call setup_git_directory_gently().
index 190005f3cd44a35a6fffb20b1e4c74622b4d93f7..fbc347c9f09e0da4ba43982a5f7b29882080f150 100644 (file)
@@ -798,8 +798,9 @@ static int prune(int argc, const char **argv, const char *prefix)
        struct notes_tree *t;
        int show_only = 0, verbose = 0;
        struct option options[] = {
-               OPT_BOOLEAN('n', NULL, &show_only, "do not remove, show only"),
-               OPT_BOOLEAN('v', NULL, &verbose, "report pruned notes"),
+               OPT_BOOLEAN('n', "dry-run", &show_only,
+                           "do not remove, show only"),
+               OPT_BOOLEAN('v', "verbose", &verbose, "report pruned notes"),
                OPT_END()
        };
 
index 81f915ec315eb75e529fed8f2f6bab436755f598..99218ba49e2c6ea7ff7185e6397bb73bca213a66 100644 (file)
@@ -125,10 +125,9 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
 {
        struct rev_info revs;
        const struct option options[] = {
-               OPT_BOOLEAN('n', NULL, &show_only,
+               OPT_BOOLEAN('n', "dry-run", &show_only,
                            "do not remove, show only"),
-               OPT_BOOLEAN('v', NULL, &verbose,
-                       "report pruned objects"),
+               OPT_BOOLEAN('v', "verbose", &verbose, "report pruned objects"),
                OPT_DATE(0, "expire", &expire,
                         "expire objects older than <time>"),
                OPT_END()
index f4358b9d230f6d8d7a9a67fdfbc60279c5ec71ee..69bc2f27ac414ce3532f6babcc68671b0b95d65a 100644 (file)
@@ -130,8 +130,8 @@ static int push_with_options(struct transport *transport, int flags)
 
        if (nonfastforward && advice_push_nonfastforward) {
                fprintf(stderr, "To prevent you from losing history, non-fast-forward updates were rejected\n"
-                               "Merge the remote changes before pushing again.  See the 'Note about\n"
-                               "fast-forwards' section of 'git push --help' for details.\n");
+                               "Merge the remote changes (e.g. 'git pull') before pushing again.  See the\n"
+                               "'Note about fast-forwards' section of 'git push --help' for details.\n");
        }
 
        return 1;
diff --git a/cache.h b/cache.h
index c9fa3df7f5b343ecea980ceb423e7c23d2eb22b2..1e690d1240fb0fb752c0f0660c4c2dff2102e37f 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -449,7 +449,7 @@ extern int init_db(const char *template_dir, unsigned int flags);
                                alloc = alloc_nr(alloc); \
                        x = xrealloc((x), alloc * sizeof(*(x))); \
                } \
-       } while(0)
+       } while (0)
 
 /* Initialize and use the cache information */
 extern int read_index(struct index_state *);
index 30ae63d74da065a31cced0b161708680f39c04c0..09c524105cfa5fca3a5a860bbbed35f5eff84f79 100755 (executable)
@@ -203,7 +203,7 @@ generate_email_header()
        # Generate header
        cat <<-EOF
        To: $recipients
-       Subject: ${emailprefix}$projectdesc $refname_type, $short_refname, ${change_type}d. $describe
+       Subject: ${emailprefix}$projectdesc $refname_type $short_refname ${change_type}d. $describe
        X-Git-Refname: $refname
        X-Git-Reftype: $refname_type
        X-Git-Oldrev: $oldrev
diff --git a/contrib/svn-fe/.gitignore b/contrib/svn-fe/.gitignore
new file mode 100644 (file)
index 0000000..02a7791
--- /dev/null
@@ -0,0 +1,4 @@
+/*.xml
+/*.1
+/*.html
+/svn-fe
diff --git a/contrib/svn-fe/Makefile b/contrib/svn-fe/Makefile
new file mode 100644 (file)
index 0000000..360d8da
--- /dev/null
@@ -0,0 +1,63 @@
+all:: svn-fe$X
+
+CC = gcc
+RM = rm -f
+MV = mv
+
+CFLAGS = -g -O2 -Wall
+LDFLAGS =
+ALL_CFLAGS = $(CFLAGS)
+ALL_LDFLAGS = $(LDFLAGS)
+EXTLIBS =
+
+GIT_LIB = ../../libgit.a
+VCSSVN_LIB = ../../vcs-svn/lib.a
+LIBS = $(VCSSVN_LIB) $(GIT_LIB) $(EXTLIBS)
+
+QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
+QUIET_SUBDIR1 =
+
+ifneq ($(findstring $(MAKEFLAGS),w),w)
+PRINT_DIR = --no-print-directory
+else # "make -w"
+NO_SUBDIR = :
+endif
+
+ifneq ($(findstring $(MAKEFLAGS),s),s)
+ifndef V
+       QUIET_CC      = @echo '   ' CC $@;
+       QUIET_LINK    = @echo '   ' LINK $@;
+       QUIET_SUBDIR0 = +@subdir=
+       QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
+                       $(MAKE) $(PRINT_DIR) -C $$subdir
+endif
+endif
+
+svn-fe$X: svn-fe.o $(VCSSVN_LIB) $(GIT_LIB)
+       $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ svn-fe.o \
+               $(ALL_LDFLAGS) $(LIBS)
+
+svn-fe.o: svn-fe.c ../../vcs-svn/svndump.h
+       $(QUIET_CC)$(CC) -I../../vcs-svn -o $*.o -c $(ALL_CFLAGS) $<
+
+svn-fe.html: svn-fe.txt
+       $(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \
+               MAN_TXT=../contrib/svn-fe/svn-fe.txt \
+               ../contrib/svn-fe/$@
+
+svn-fe.1: svn-fe.txt
+       $(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \
+               MAN_TXT=../contrib/svn-fe/svn-fe.txt \
+               ../contrib/svn-fe/$@
+       $(MV) ../../Documentation/svn-fe.1 .
+
+../../vcs-svn/lib.a: FORCE
+       $(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) vcs-svn/lib.a
+
+../../libgit.a: FORCE
+       $(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) libgit.a
+
+clean:
+       $(RM) svn-fe$X svn-fe.o svn-fe.html svn-fe.xml svn-fe.1
+
+.PHONY: all clean FORCE
diff --git a/contrib/svn-fe/svn-fe.c b/contrib/svn-fe/svn-fe.c
new file mode 100644 (file)
index 0000000..e9b9ba4
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * This file is in the public domain.
+ * You may freely use, modify, distribute, and relicense it.
+ */
+
+#include <stdlib.h>
+#include "svndump.h"
+
+int main(int argc, char **argv)
+{
+       svndump_init(NULL);
+       svndump_read((argc > 1) ? argv[1] : NULL);
+       svndump_reset();
+       return 0;
+}
diff --git a/contrib/svn-fe/svn-fe.txt b/contrib/svn-fe/svn-fe.txt
new file mode 100644 (file)
index 0000000..de30f83
--- /dev/null
@@ -0,0 +1,66 @@
+svn-fe(1)
+=========
+
+NAME
+----
+svn-fe - convert an SVN "dumpfile" to a fast-import stream
+
+SYNOPSIS
+--------
+svnadmin dump --incremental REPO | svn-fe [url] | git fast-import
+
+DESCRIPTION
+-----------
+
+Converts a Subversion dumpfile (version: 2) into input suitable for
+git-fast-import(1) and similar importers. REPO is a path to a
+Subversion repository mirrored on the local disk. Remote Subversion
+repositories can be mirrored on local disk using the `svnsync`
+command.
+
+INPUT FORMAT
+------------
+Subversion's repository dump format is documented in full in
+`notes/dump-load-format.txt` from the Subversion source tree.
+Files in this format can be generated using the 'svnadmin dump' or
+'svk admin dump' command.
+
+OUTPUT FORMAT
+-------------
+The fast-import format is documented by the git-fast-import(1)
+manual page.
+
+NOTES
+-----
+Subversion dumps do not record a separate author and committer for
+each revision, nor a separate display name and email address for
+each author.  Like git-svn(1), 'svn-fe' will use the name
+
+---------
+user <user@UUID>
+---------
+
+as committer, where 'user' is the value of the `svn:author` property
+and 'UUID' the repository's identifier.
+
+To support incremental imports, 'svn-fe' will put a `git-svn-id`
+line at the end of each commit log message if passed an url on the
+command line.  This line has the form `git-svn-id: URL@REVNO UUID`.
+
+Empty directories and unknown properties are silently discarded.
+
+The resulting repository will generally require further processing
+to put each project in its own repository and to separate the history
+of each branch.  The 'git filter-branch --subdirectory-filter' command
+may be useful for this purpose.
+
+BUGS
+----
+Litters the current working directory with .bin files for
+persistence. Will be fixed when the svn-fe infrastructure is aware of
+a Git working directory.
+
+SEE ALSO
+--------
+git-svn(1), svn2git(1), svk(1), git-filter-branch(1), git-fast-import(1),
+https://svn.apache.org/repos/asf/subversion/trunk/notes/dump-load-format.txt
diff --git a/diff.c b/diff.c
index 17873f3d9e88fccbf98e790d243397dcc4ccb24b..bf65892f78f84a31b6bf87b0f82cfc5938485862 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2704,10 +2704,16 @@ static void diff_fill_sha1_info(struct diff_filespec *one)
 static void strip_prefix(int prefix_length, const char **namep, const char **otherp)
 {
        /* Strip the prefix but do not molest /dev/null and absolute paths */
-       if (*namep && **namep != '/')
+       if (*namep && **namep != '/') {
                *namep += prefix_length;
-       if (*otherp && **otherp != '/')
+               if (**namep == '/')
+                       ++*namep;
+       }
+       if (*otherp && **otherp != '/') {
                *otherp += prefix_length;
+               if (**otherp == '/')
+                       ++*otherp;
+       }
 }
 
 static void run_diff(struct diff_filepair *p, struct diff_options *o)
@@ -2814,7 +2820,6 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)
 void diff_setup(struct diff_options *options)
 {
        memset(options, 0, sizeof(*options));
-       memset(&diff_queued_diff, 0, sizeof(diff_queued_diff));
 
        options->file = stdout;
 
index 491bea0b44963461cfce30b07ec96a9005a3c910..05ebc115a13df5c1b80128489619d753ed107a6f 100644 (file)
@@ -18,7 +18,7 @@
 #define MAX_SCORE 60000.0
 #define DEFAULT_RENAME_SCORE 30000 /* rename/copy similarity minimum (50%) */
 #define DEFAULT_BREAK_SCORE  30000 /* minimum for break to happen (50%) */
-#define DEFAULT_MERGE_SCORE  36000 /* maximum for break-merge to happen 60%) */
+#define DEFAULT_MERGE_SCORE  36000 /* maximum for break-merge to happen (60%) */
 
 #define MINIMUM_BREAK_SIZE     400 /* do not break a file smaller than this */
 
@@ -98,7 +98,7 @@ struct diff_queue_struct {
                (q)->queue = NULL; \
                (q)->nr = (q)->alloc = 0; \
                (q)->run = 0; \
-       } while(0);
+       } while (0)
 
 extern struct diff_queue_struct diff_queued_diff;
 extern struct diff_filepair *diff_queue(struct diff_queue_struct *,
@@ -118,9 +118,9 @@ void diff_debug_filespec(struct diff_filespec *, int, const char *);
 void diff_debug_filepair(const struct diff_filepair *, int);
 void diff_debug_queue(const char *, struct diff_queue_struct *);
 #else
-#define diff_debug_filespec(a,b,c) do {} while(0)
-#define diff_debug_filepair(a,b) do {} while(0)
-#define diff_debug_queue(a,b) do {} while(0)
+#define diff_debug_filespec(a,b,c) do { /* nothing */ } while (0)
+#define diff_debug_filepair(a,b) do { /* nothing */ } while (0)
+#define diff_debug_queue(a,b) do { /* nothing */ } while (0)
 #endif
 
 extern int diffcore_count_changes(struct diff_filespec *src,
diff --git a/dir.c b/dir.c
index 151ea670d961d39394990f122469557b6f217de3..133f472a1e73786e781c1021eea17e543858937f 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -453,7 +453,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathna
        return dir->entries[dir->nr++] = dir_entry_new(pathname, len);
 }
 
-static struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
+struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
 {
        if (!cache_name_is_other(pathname, len))
                return NULL;
diff --git a/dir.h b/dir.h
index 3bead5f0e25a864c34f515b7bff4c89b55ce84fe..278d84cdf7df01c33a45e6dc9c20592cecff9d85 100644 (file)
--- a/dir.h
+++ b/dir.h
@@ -72,6 +72,7 @@ extern int read_directory(struct dir_struct *, const char *path, int len, const
 extern int excluded_from_list(const char *pathname, int pathlen, const char *basename,
                              int *dtype, struct exclude_list *el);
 extern int excluded(struct dir_struct *, const char *, int *);
+struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len);
 extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen,
                                          char **buf_p, struct exclude_list *which, int check_index);
 extern void add_excludes_from_file(struct dir_struct *, const char *fname);
index 1e5d66ed0ab3b605de670758887b13f146bdd8a5..ddad289dae37c2115f57f88dc207f0d2fa6ab1f3 100644 (file)
@@ -1666,7 +1666,7 @@ static void dump_marks_helper(FILE *f,
        if (m->shift) {
                for (k = 0; k < 1024; k++) {
                        if (m->data.sets[k])
-                               dump_marks_helper(f, (base + k) << m->shift,
+                               dump_marks_helper(f, base + (k << m->shift),
                                        m->data.sets[k]);
                }
        } else {
index 02a73eeb667e798fca29de25fed6b0b2900f6912..fe845ae639767dc8f56a9196a7faefb468737bba 100644 (file)
@@ -388,6 +388,8 @@ extern int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1);
 
 static inline size_t xsize_t(off_t len)
 {
+       if (len > (size_t) len)
+               die("Cannot handle files this big");
        return (size_t)len;
 }
 
index 7d5451198cb109e1d3e30e3e33f1557bbd8b12c0..bb104895a94450a2ade7446c8fda52910bae0868 100755 (executable)
@@ -38,7 +38,7 @@ if {[catch {package require Tcl 8.4} err]
        tk_messageBox \
                -icon error \
                -type ok \
-               -title [mc "git-gui: fatal error"] \
+               -title "git-gui: fatal error" \
                -message $err
        exit 1
 }
@@ -269,6 +269,17 @@ proc is_config_true {name} {
        }
 }
 
+proc is_config_false {name} {
+       global repo_config
+       if {[catch {set v $repo_config($name)}]} {
+               return 0
+       } elseif {$v eq {false} || $v eq {0} || $v eq {no}} {
+               return 1
+       } else {
+               return 0
+       }
+}
+
 proc get_config {name} {
        global repo_config
        if {[catch {set v $repo_config($name)}]} {
@@ -323,6 +334,8 @@ proc _trace_exec {cmd} {
        puts stderr $d
 }
 
+#'"  fix poor old emacs font-lock mode
+
 proc _git_cmd {name} {
        global _git_cmd_path
 
@@ -416,6 +429,9 @@ proc _lappend_nice {cmd_var} {
 
        if {![info exists _nice]} {
                set _nice [_which nice]
+               if {[catch {exec $_nice git version}]} {
+                       set _nice {}
+               }
        }
        if {$_nice ne {}} {
                lappend cmd $_nice
@@ -634,6 +650,7 @@ proc rmsel_tag {text} {
        return $text
 }
 
+wm withdraw .
 set root_exists 0
 bind . <Visibility> {
        bind . <Visibility> {}
@@ -782,6 +799,7 @@ set default_config(user.email) {}
 
 set default_config(gui.encoding) [encoding system]
 set default_config(gui.matchtrackingbranch) false
+set default_config(gui.textconv) true
 set default_config(gui.pruneduringfetch) false
 set default_config(gui.trustmtime) false
 set default_config(gui.fastcopyblame) false
@@ -1155,6 +1173,9 @@ apply_config
 # try to set work tree from environment, falling back to core.worktree
 if {[catch { set _gitworktree $env(GIT_WORK_TREE) }]} {
        set _gitworktree [get_config core.worktree]
+       if {$_gitworktree eq ""} {
+               set _gitworktree [file dirname [file normalize $_gitdir]]
+       }
 }
 if {$_prefix ne {}} {
        if {$_gitworktree eq {}} {
@@ -2098,7 +2119,7 @@ proc do_explore {} {
                # freedesktop.org-conforming system is our best shot
                set explorer "xdg-open"
        }
-       eval exec $explorer $_gitworktree &
+       eval exec $explorer [list [file nativename $_gitworktree]] &
 }
 
 set is_quitting 0
@@ -2901,6 +2922,7 @@ blame {
                set current_branch $head
        }
 
+       wm deiconify .
        switch -- $subcommand {
        browser {
                if {$jump_spec ne {}} usage
@@ -3405,6 +3427,19 @@ lappend diff_actions [list $ctxmsm entryconf [$ctxmsm index last] -state]
 $ctxmsm add separator
 create_common_diff_popup $ctxmsm
 
+proc has_textconv {path} {
+       if {[is_config_false gui.textconv]} {
+               return 0
+       }
+       set filter [gitattr $path diff set]
+       set textconv [get_config [join [list diff $filter textconv] .]]
+       if {$filter ne {set} && $textconv ne {}} {
+               return 1
+       } else {
+               return 0
+       }
+}
+
 proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
        global current_diff_path file_states
        set ::cursorX $x
@@ -3440,7 +3475,8 @@ proc popup_diff_menu {ctxm ctxmmg ctxmsm x y X Y} {
                        || {__} eq $state
                        || {_O} eq $state
                        || {_T} eq $state
-                       || {T_} eq $state} {
+                       || {T_} eq $state
+                       || [has_textconv $current_diff_path]} {
                        set s disabled
                } else {
                        set s normal
@@ -3460,29 +3496,44 @@ $main_status show [mc "Initializing..."]
 
 # -- Load geometry
 #
-catch {
-set gm $repo_config(gui.geometry)
-wm geometry . [lindex $gm 0]
-if {$use_ttk} {
-       .vpane sashpos 0 [lindex $gm 1]
-       .vpane.files sashpos 0 [lindex $gm 2]
-} else {
-       .vpane sash place 0 \
-               [lindex $gm 1] \
-               [lindex [.vpane sash coord 0] 1]
-       .vpane.files sash place 0 \
-               [lindex [.vpane.files sash coord 0] 0] \
-               [lindex $gm 2]
+proc on_ttk_pane_mapped {w pane pos} {
+       bind $w <Map> {}
+       after 0 [list after idle [list $w sashpos $pane $pos]]
+}
+proc on_tk_pane_mapped {w pane x y} {
+       bind $w <Map> {}
+       after 0 [list after idle [list $w sash place $pane $x $y]]
+}
+proc on_application_mapped {} {
+       global repo_config use_ttk
+       bind . <Map> {}
+       set gm $repo_config(gui.geometry)
+       if {$use_ttk} {
+               bind .vpane <Map> \
+                   [list on_ttk_pane_mapped %W 0 [lindex $gm 1]]
+               bind .vpane.files <Map> \
+                   [list on_ttk_pane_mapped %W 0 [lindex $gm 2]]
+       } else {
+               bind .vpane <Map> \
+                   [list on_tk_pane_mapped %W 0 \
+                        [lindex $gm 1] \
+                        [lindex [.vpane sash coord 0] 1]]
+               bind .vpane.files <Map> \
+                   [list on_tk_pane_mapped %W 0 \
+                        [lindex [.vpane.files sash coord 0] 0] \
+                        [lindex $gm 2]]
+       }
+       wm geometry . [lindex $gm 0]
 }
-unset gm
+if {[info exists repo_config(gui.geometry)]} {
+       bind . <Map> [list on_application_mapped]
+       wm geometry . [lindex $repo_config(gui.geometry) 0]
 }
 
 # -- Load window state
 #
-catch {
-set gws $repo_config(gui.wmstate)
-wm state . $gws
-unset gws
+if {[info exists repo_config(gui.wmstate)]} {
+       catch {wm state . $repo_config(gui.wmstate)}
 }
 
 # -- Key Bindings
index 786b50b8c2b6f877d1d1a3a86d27368281ec2ae8..2137ec9684d0acdb386e6b50e1b41aa7705c9746 100644 (file)
@@ -449,11 +449,28 @@ method _load {jump} {
 
        $status show [mc "Reading %s..." "$commit:[escape_path $path]"]
        $w_path conf -text [escape_path $path]
+
+       set do_textconv 0
+       if {![is_config_false gui.textconv] && [git-version >= 1.7.2]} {
+               set filter [gitattr $path diff set]
+               set textconv [get_config [join [list diff $filter textconv] .]]
+               if {$filter ne {set} && $textconv ne {}} {
+                       set do_textconv 1
+               }
+       }
        if {$commit eq {}} {
-               set fd [open $path r]
+               if {$do_textconv ne 0} {
+                       set fd [open |[list $textconv $path] r]
+               } else {
+                       set fd [open $path r]
+               }
                fconfigure $fd -eofchar {}
        } else {
-               set fd [git_read cat-file blob "$commit:$path"]
+               if {$do_textconv ne 0} {
+                       set fd [git_read cat-file --textconv "$commit:$path"]
+               } else {
+                       set fd [git_read cat-file blob "$commit:$path"]
+               }
        }
        fconfigure $fd \
                -blocking 0 \
index 64f06748b612721143e851824e30987575010be2..fae119286d3d4511d1b362fb05a8fab775e80a40 100644 (file)
@@ -100,12 +100,17 @@ constructor pick {} {
        $opts insert end [mc "Clone Existing Repository"] link_clone
        $opts insert end "\n"
        if {$m_repo ne {}} {
+               if {[tk windowingsystem] eq "win32"} {
+                       set key L
+               } else {
+                       set key C
+               }
                $m_repo add command \
                        -command [cb _next clone] \
-                       -accelerator $M1T-C \
+                       -accelerator $M1T-$key \
                        -label [mc "Clone..."]
-               bind $top <$M1B-c> [cb _next clone]
-               bind $top <$M1B-C> [cb _next clone]
+               bind $top <$M1B-[string tolower $key]> [cb _next clone]
+               bind $top <$M1B-[string toupper $key]> [cb _next clone]
        }
 
        $opts tag conf link_open -foreground blue -underline 1
index ec8c11eeb7912e2e49e48f467ffc27fd9fc5f919..c628750276303fca620c9292463c4c59690c764f 100644 (file)
@@ -55,7 +55,7 @@ proc handle_empty_diff {} {
 
        set path $current_diff_path
        set s $file_states($path)
-       if {[lindex $s 0] ne {_M}} return
+       if {[lindex $s 0] ne {_M} || [has_textconv $path]} return
 
        # Prevent infinite rescan loops
        incr diff_empty_count
@@ -280,6 +280,9 @@ proc start_show_diff {cont_info {add_opts {}}} {
                        lappend cmd diff-files
                }
        }
+       if {![is_config_false gui.textconv] && [git-version >= 1.6.1]} {
+               lappend cmd --textconv
+       }
 
        if {[string match {160000 *} [lindex $s 2]]
         || [string match {160000 *} [lindex $s 3]]} {
index d4c5e45c8a7ade900753cb7eb5caf977e6e4ae2a..3807c8d28324a277204db9191e99ddb856041c22 100644 (file)
@@ -148,6 +148,7 @@ proc do_options {} {
                {b gui.trustmtime  {mc "Trust File Modification Timestamps"}}
                {b gui.pruneduringfetch {mc "Prune Tracking Branches During Fetch"}}
                {b gui.matchtrackingbranch {mc "Match Tracking Branches"}}
+               {b gui.textconv {mc "Use Textconv For Diffs and Blames"}}
                {b gui.fastcopyblame {mc "Blame Copy Only On Changed Files"}}
                {i-20..200 gui.copyblamethreshold {mc "Minimum Letters To Blame Copy On"}}
                {i-0..300 gui.blamehistoryctx {mc "Blame History Context Radius (days)"}}
index 79c1888e11d210eed962eebdf67793a7367dff5a..78878ef89d11210d614fc8b3d2957705611bdaa3 100644 (file)
@@ -16,7 +16,7 @@ proc do_windows_shortcut {} {
                                        [info nameofexecutable] \
                                        [file normalize $::argv0] \
                                        ] \
-                                       [file normalize [$_gitworktree]]
+                                       [file normalize $_gitworktree]
                        } err]} {
                        error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
                }
@@ -57,7 +57,7 @@ proc do_cygwin_shortcut {} {
                                        $sh -c \
                                        "CHERE_INVOKING=1 source /etc/profile;[sq $me] &" \
                                        ] \
-                                       [file normalize [$_gitworktree]]
+                                       [file normalize $_gitworktree]
                        } err]} {
                        error_popup [strcat [mc "Cannot write shortcut:"] "\n\n$err"]
                }
index 5fe3aad382f43a30a099a106f7d51f136eda0652..95cb44991fc5b018805d6091c4f98ce7ae0ccf52 100644 (file)
@@ -39,6 +39,7 @@ method _oneline_pack {} {
 }
 
 constructor two_line {path} {
+       global NS
        set w $path
        set w_l $w.l
        set w_c $w.c
index d7f93d045d1a2b3a14d2fdb4907697622b5973a8..db91ab84a56d79be6a5497f885a9181f368b9cf2 100644 (file)
@@ -18,9 +18,9 @@ proc win32_create_lnk {lnk_path lnk_exec lnk_dir} {
        eval [list exec wscript.exe \
                /E:jscript \
                /nologo \
-               [file join $oguilib win32_shortcut.js] \
+               [file nativename [file join $oguilib win32_shortcut.js]] \
                $lnk_path \
-               [file join $oguilib git-gui.ico] \
+               [file nativename [file join $oguilib git-gui.ico]] \
                $lnk_dir \
                $lnk_exec] $lnk_args
 }
index 66bbb2f8faaf83bc87819a9e288a0592f400e147..b1845c505500a0f079b2299de07d481c6b2550c4 100644 (file)
@@ -13,10 +13,11 @@ if { $argc >=2 && [lindex $argv 0] == "--working-dir" } {
        incr argc -2
 }
 
-set bindir [file dirname \
+set basedir [file dirname \
             [file dirname \
              [file dirname [info script]]]]
-set bindir [file join $bindir bin]
+set bindir [file join $basedir bin]
+set bindir "$bindir;[file join $basedir mingw bin]"
 regsub -all ";" $bindir "\\;" bindir
 set env(PATH) "$bindir;$env(PATH)"
 unset bindir
index 6635fbefdf2a06e556716f91a70181ecf4f3252a..b7342e22c88993756e7beb6582a896087e52a034 100755 (executable)
@@ -43,7 +43,8 @@ test -z "$port" && port=1234
 
 resolve_full_httpd () {
        case "$httpd" in
-       *apache2*|*lighttpd*)
+       *apache2*|*lighttpd*|*httpd*)
+               # yes, *httpd* covers *lighttpd* above, but it is there for clarity
                # ensure that the apache2/lighttpd command ends with "-f"
                if ! echo "$httpd" | sane_grep -- '-f *$' >/dev/null 2>&1
                then
@@ -300,7 +301,13 @@ EOF
 }
 
 apache2_conf () {
-       test -z "$module_path" && module_path=/usr/lib/apache2/modules
+       if test -z "$module_path"
+       then
+               test -d "/usr/lib/httpd/modules" &&
+                       module_path="/usr/lib/httpd/modules"
+               test -d "/usr/lib/apache2/modules" &&
+                       module_path="/usr/lib/apache2/modules"
+       fi
        bind=
        test x"$local" = xtrue && bind='127.0.0.1:'
        echo 'text/css css' > "$fqgitdir/mime.types"
@@ -314,8 +321,10 @@ PidFile "$fqgitdir/pid"
 Listen $bind$port
 EOF
 
-       for mod in mime dir; do
-               if test -e $module_path/mod_${mod}.so; then
+       for mod in mime dir env log_config
+       do
+               if test -e $module_path/mod_${mod}.so
+               then
                        echo "LoadModule ${mod}_module " \
                             "$module_path/mod_${mod}.so" >> "$conf"
                fi
@@ -334,7 +343,7 @@ EOF
                cat >> "$conf" <<EOF
 LoadModule perl_module $module_path/mod_perl.so
 PerlPassEnv GIT_DIR
-PerlPassEnv GIT_EXEC_DIR
+PerlPassEnv GIT_EXEC_PATH
 PerlPassEnv GITWEB_CONFIG
 <Location /gitweb.cgi>
        SetHandler perl-script
@@ -364,6 +373,9 @@ EOF
                        echo "ScriptSock logs/gitweb.sock" >> "$conf"
                fi
                cat >> "$conf" <<EOF
+PassEnv GIT_DIR
+PassEnv GIT_EXEC_PATH
+PassEnv GITWEB_CONFIG
 AddHandler cgi-script .cgi
 <Location /gitweb.cgi>
        Options +ExecCGI
@@ -560,7 +572,7 @@ case "$httpd" in
 *lighttpd*)
        lighttpd_conf
        ;;
-*apache2*)
+*apache2*|*httpd*)
        apache2_conf
        ;;
 webrick)
index 31e68603f4e8124fd67f42c8aae6033a792892cb..b94c2a03867ddcd1fa0c2051f81cf14547b550f0 100755 (executable)
@@ -119,7 +119,7 @@ run 'git rebase --continue'"
 export GIT_CHERRY_PICK_HELP
 
 warn () {
-       echo "$*" >&2
+       printf '%s\n' "$*" >&2
 }
 
 output () {
@@ -606,7 +606,7 @@ skip_unnecessary_picks () {
                        fd=1
                        ;;
                esac
-               echo "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd
+               printf '%s\n' "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd
        done <"$TODO" >"$TODO.new" 3>>"$DONE" &&
        mv -f "$TODO".new "$TODO" &&
        case "$(peek_next_command)" in
@@ -649,12 +649,12 @@ rearrange_squash () {
                case " $used" in
                *" $sha1 "*) continue ;;
                esac
-               echo "$pick $sha1 $message"
+               printf '%s\n' "$pick $sha1 $message"
                while read -r squash action msg
                do
                        case "$message" in
                        "$msg"*)
-                               echo "$action $squash $action! $msg"
+                               printf '%s\n' "$action $squash $action! $msg"
                                used="$used$squash "
                                ;;
                        esac
@@ -895,7 +895,7 @@ first and then run 'git rebase --continue' again."
                do
                        if test t != "$PRESERVE_MERGES"
                        then
-                               echo "pick $shortsha1 $rest" >> "$TODO"
+                               printf '%s\n' "pick $shortsha1 $rest" >> "$TODO"
                        else
                                sha1=$(git rev-parse $shortsha1)
                                if test -z "$REBASE_ROOT"
@@ -914,7 +914,7 @@ first and then run 'git rebase --continue' again."
                                if test f = "$preserve"
                                then
                                        touch "$REWRITTEN"/$sha1
-                                       echo "pick $shortsha1 $rest" >> "$TODO"
+                                       printf '%s\n' "pick $shortsha1 $rest" >> "$TODO"
                                fi
                        fi
                done
index ab4afa7dee377707484e7f76c7d44ac955f09397..1d38afdb10e24e11dc5428c5a38c27fe2c773a4d 100755 (executable)
@@ -208,6 +208,7 @@ do
                test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply ||
                        die "No rebase in progress?"
 
+               git update-index --ignore-submodules --refresh &&
                git diff-files --quiet --ignore-submodules || {
                        echo "You must edit all merge conflicts and then"
                        echo "mark them as resolved using git add"
@@ -345,7 +346,7 @@ do
        --root)
                rebase_root=t
                ;;
-       -f|--f|--fo|--for|--forc|force|--force-r|--force-re|--force-reb|--force-reba|--force-rebas|--force-rebase|--no-ff)
+       -f|--f|--fo|--for|--forc|--force|--force-r|--force-re|--force-reb|--force-reba|--force-rebas|--force-rebase|--no-ff)
                force_rebase=t
                ;;
        --rerere-autoupdate|--no-rerere-autoupdate)
index ad2417d1b0827b80ec884009447adada0ddb8173..170186f4946859e04d6a0b4ce248dd17bc877b31 100755 (executable)
@@ -5,7 +5,7 @@
 # Copyright (c) 2007 Lars Hjemli
 
 dashless=$(basename "$0" | sed -e 's/-/ /')
-USAGE="[--quiet] add [-b branch] [--reference <repository>] [--] <repository> [<path>]
+USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <repository> [<path>]
    or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] init [--] [<path>...]
    or: $dashless [--quiet] update [--init] [-N|--no-fetch] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
@@ -19,6 +19,7 @@ require_work_tree
 
 command=
 branch=
+force=
 reference=
 cached=
 recursive=
@@ -133,6 +134,9 @@ cmd_add()
                        branch=$2
                        shift
                        ;;
+               -f | --force)
+                       force=$1
+                       ;;
                -q|--quiet)
                        GIT_QUIET=1
                        ;;
@@ -201,6 +205,14 @@ cmd_add()
        git ls-files --error-unmatch "$path" > /dev/null 2>&1 &&
        die "'$path' already exists in the index"
 
+       if test -z "$force" && ! git add --dry-run --ignore-missing "$path" > /dev/null 2>&1
+       then
+               echo >&2 "The following path is ignored by one of your .gitignore files:" &&
+               echo >&2 $path &&
+               echo >&2 "Use -f if you really want to add it."
+               exit 1
+       fi
+
        # perhaps the path exists and is already a git repo, else clone it
        if test -e "$path"
        then
@@ -234,7 +246,7 @@ cmd_add()
                ) || die "Unable to checkout submodule '$path'"
        fi
 
-       git add --force "$path" ||
+       git add $force "$path" ||
        die "Failed to add submodule '$path'"
 
        git config -f .gitmodules submodule."$path".path "$path" &&
index 19d6848d0e7754b9afb9fdbbac6fce31286468a5..c4163584a93ba594141aa8af99948fc8929605d7 100755 (executable)
@@ -3169,6 +3169,22 @@ sub has_no_changes {
                        LIST_CACHE => 'FAULT',
                ;
        }
+
+       sub unmemoize_svn_mergeinfo_functions {
+               return if not $memoized;
+               $memoized = 0;
+
+               Memoize::unmemoize 'lookup_svn_merge';
+               Memoize::unmemoize 'check_cherry_pick';
+               Memoize::unmemoize 'has_no_changes';
+       }
+}
+
+END {
+       # Force cache writeout explicitly instead of waiting for
+       # global destruction to avoid segfault in Storable:
+       # http://rt.cpan.org/Public/Bug/Display.html?id=36087
+       unmemoize_svn_mergeinfo_functions();
 }
 
 sub parents_exclude {
index dbded76aaf5499dd116e5ad22f95d4518b79c0d8..3fc4166b25714911b6b1294c7439da1e237e4918 100755 (executable)
@@ -31,7 +31,7 @@ valid_custom_tool()
 
 valid_tool() {
        case "$1" in
-               firefox | iceweasel | chrome | chromium | konqueror | w3m | links | lynx | dillo | open | start)
+               firefox | iceweasel | chrome | google-chrome | chromium | konqueror | w3m | links | lynx | dillo | open | start)
                        ;; # happy
                *)
                        valid_custom_tool "$1" || return 1
@@ -103,7 +103,7 @@ fi
 
 if test -z "$browser" ; then
     if test -n "$DISPLAY"; then
-       browser_candidates="firefox iceweasel chrome chromium konqueror w3m links lynx dillo"
+       browser_candidates="firefox iceweasel google-chrome chrome chromium konqueror w3m links lynx dillo"
        if test "$KDE_FULL_SESSION" = "true"; then
            browser_candidates="konqueror $browser_candidates"
        fi
@@ -146,7 +146,7 @@ case "$browser" in
        test "$vers" -lt 2 && NEWTAB=''
        "$browser_path" $NEWTAB "$@" &
        ;;
-    chrome|chromium)
+    google-chrome|chrome|chromium)
        # Actual command for chromium is chromium-browser.
        # No need to specify newTab. It's default in chromium
        eval "$browser_path" "$@" &
diff --git a/git.c b/git.c
index 17538117a5ccfd48129a873697d8674e86f512f5..f37028b3b722e6203ae8dac1ccf40a94421597d2 100644 (file)
--- a/git.c
+++ b/git.c
@@ -8,8 +8,8 @@ const char git_usage_string[] =
        "git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]\n"
        "           [-p|--paginate|--no-pager] [--no-replace-objects]\n"
        "           [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]\n"
-       "           [-c name=value\n"
-       "           [--help] COMMAND [ARGS]";
+       "           [-c name=value] [--help]\n"
+       "           COMMAND [ARGS]";
 
 const char git_more_info_string[] =
        "See 'git help COMMAND' for more information on a specific command.";
index cedc3573136922d424971ef2a16feeb82496c37d..6deec87e5d26b963902f80049ca0e34f76daa0bc 100755 (executable)
@@ -6522,12 +6522,13 @@ sub git_search {
                        $paging_nav .= " &sdot; next";
                }
 
-               if ($#commitlist >= 100) {
-               }
-
                git_print_page_nav('','', $hash,$co{'tree'},$hash, $paging_nav);
                git_print_header_div('commit', esc_html($co{'title'}), $hash);
-               git_search_grep_body(\@commitlist, 0, 99, $next_link);
+               if ($page == 0 && !@commitlist) {
+                       print "<p>No match.</p>\n";
+               } else {
+                       git_search_grep_body(\@commitlist, 0, 99, $next_link);
+               }
        }
 
        if ($searchtype eq 'pickaxe') {
diff --git a/http.h b/http.h
index a0b59015948c3b9736dd6c09fd9137f7ecd4f59a..173f74c8298c3fa3989f88b06e2085127fe96db8 100644 (file)
--- a/http.h
+++ b/http.h
 #endif
 
 #if LIBCURL_VERSION_NUM < 0x070704
-#define curl_global_cleanup() do { /* nothing */ } while(0)
+#define curl_global_cleanup() do { /* nothing */ } while (0)
 #endif
 #if LIBCURL_VERSION_NUM < 0x070800
-#define curl_global_init(a) do { /* nothing */ } while(0)
+#define curl_global_init(a) do { /* nothing */ } while (0)
 #endif
 
 #if (LIBCURL_VERSION_NUM < 0x070c04) || (LIBCURL_VERSION_NUM == 0x071000)
index 1a577a0a094342315bd3f68e8d13ef7f57a22f50..71506a8dd3ed07fe44c487a644ce9a42b94a7578 100644 (file)
@@ -543,9 +543,13 @@ static struct imap_cmd *v_issue_imap_cmd(struct imap_store *ctx,
        while (imap->literal_pending)
                get_cmd_result(ctx, NULL);
 
-       bufl = nfsnprintf(buf, sizeof(buf), cmd->cb.data ? CAP(LITERALPLUS) ?
-                          "%d %s{%d+}\r\n" : "%d %s{%d}\r\n" : "%d %s\r\n",
-                          cmd->tag, cmd->cmd, cmd->cb.dlen);
+       if (!cmd->cb.data)
+               bufl = nfsnprintf(buf, sizeof(buf), "%d %s\r\n", cmd->tag, cmd->cmd);
+       else
+               bufl = nfsnprintf(buf, sizeof(buf), "%d %s{%d%s}\r\n",
+                                 cmd->tag, cmd->cmd, cmd->cb.dlen,
+                                 CAP(LITERALPLUS) ? "+" : "");
+
        if (Verbose) {
                if (imap->num_in_progress)
                        printf("(%d in progress) ", imap->num_in_progress);
@@ -1086,7 +1090,7 @@ static struct store *imap_open_store(struct imap_server_conf *srvc)
                int gai;
                char portstr[6];
 
-               snprintf(portstr, sizeof(portstr), "%hu", srvc->port);
+               snprintf(portstr, sizeof(portstr), "%d", srvc->port);
 
                memset(&hints, 0, sizeof(hints));
                hints.ai_socktype = SOCK_STREAM;
diff --git a/path.c b/path.c
index b4c8d917229a4187f36a76f43603fc036e65632e..6b23023095d7e1a5cfc1aef8db6d6e5fb56b32de 100644 (file)
--- a/path.c
+++ b/path.c
@@ -316,6 +316,8 @@ char *expand_user_path(const char *path)
                size_t username_len = first_slash - username;
                if (username_len == 0) {
                        const char *home = getenv("HOME");
+                       if (!home)
+                               goto return_null;
                        strbuf_add(&user_path, home, strlen(home));
                } else {
                        struct passwd *pw = getpw_str(username, username_len);
index 24fbb9a9b972c1078b3688b2d0683c9704e09ee6..04d4813e4183c675b54aba942cd078d8ff632053 100644 (file)
@@ -528,11 +528,12 @@ static int rpc_service(struct rpc_state *rpc, struct discovery *heads)
                rpc->len = n;
                err |= post_rpc(rpc);
        }
-       strbuf_read(&rpc->result, client.out, 0);
 
        close(client.in);
-       close(client.out);
        client.in = -1;
+       strbuf_read(&rpc->result, client.out, 0);
+
+       close(client.out);
        client.out = -1;
 
        err |= finish_command(&client);
index 4098ca2b5c166c32cfe4aea9d1bff2e6593e9a60..9ec744e9f2da294a21ac02b46f0ea0b35889ae54 100644 (file)
@@ -113,11 +113,8 @@ static int read_pack_info_file(const char *infofile)
                                goto out_stale;
                        break;
                case 'D': /* we used to emit D but that was misguided. */
-                       goto out_stale;
-                       break;
                case 'T': /* we used to emit T but nobody uses it. */
                        goto out_stale;
-                       break;
                default:
                        error("unrecognized: %s", line);
                        break;
diff --git a/setup.c b/setup.c
index 87c21f02e0e3bedb42305bbfe2b4223885d4250f..276916052795c5ffa872b57a7e6723edc71dfdc4 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -170,6 +170,8 @@ static int is_git_directory(const char *suspect)
        char path[PATH_MAX];
        size_t len = strlen(suspect);
 
+       if (PATH_MAX <= len + strlen("/objects"))
+               die("Too long path: %.*s", 60, suspect);
        strcpy(path, suspect);
        if (getenv(DB_ENVIRONMENT)) {
                if (access(getenv(DB_ENVIRONMENT), X_OK))
index 4f2af8da934b125f2c09ceb4d8185dabc58f7831..4af94fa59806c570c177a68139b54d46772d68a5 100644 (file)
@@ -659,6 +659,16 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1)
        return get_short_sha1(name, len, sha1, 0);
 }
 
+/*
+ * This interprets names like ':/Initial revision of "git"' by searching
+ * through history and returning the first commit whose message starts
+ * the given regular expression.
+ *
+ * For future extension, ':/!' is reserved. If you want to match a message
+ * beginning with a '!', you have to repeat the exclamation mark.
+ */
+#define ONELINE_SEEN (1u<<20)
+
 static int handle_one_ref(const char *path,
                const unsigned char *sha1, int flag, void *cb_data)
 {
@@ -674,19 +684,10 @@ static int handle_one_ref(const char *path,
        if (object->type != OBJ_COMMIT)
                return 0;
        insert_by_date((struct commit *)object, list);
+       object->flags |= ONELINE_SEEN;
        return 0;
 }
 
-/*
- * This interprets names like ':/Initial revision of "git"' by searching
- * through history and returning the first commit whose message matches
- * the given regular expression.
- *
- * For future extension, ':/!' is reserved. If you want to match a message
- * beginning with a '!', you have to repeat the exclamation mark.
- */
-
-#define ONELINE_SEEN (1u<<20)
 static int get_sha1_oneline(const char *prefix, unsigned char *sha1)
 {
        struct commit_list *list = NULL, *backup = NULL, *l;
index f9de24b4d2baa9fad1d6caa72fea651da78d6878..cf5f9e2e1eb17c442220464d06374e6c529f8629 100644 (file)
@@ -36,7 +36,7 @@ aggregate-results-and-cleanup: $(T)
        $(MAKE) clean
 
 aggregate-results:
-       for f in test-results/t*-*; do \
+       for f in test-results/t*-*.counts; do \
                echo "$$f"; \
        done | '$(SHELL_PATH_SQ)' ./aggregate-results.sh
 
index b906ceb4766a283ae6b22bd037f9e1619feb12d1..0d1183c3e69904e9e3543d757f14f10c629e199b 100644 (file)
--- a/t/README
+++ b/t/README
@@ -259,11 +259,11 @@ Do:
        test ...
 
    That way all of the commands in your tests will succeed or fail. If
-   you must ignore the return value of something (e.g. the return
-   value of export is unportable) it's best to indicate so explicitly
-   with a semicolon:
+   you must ignore the return value of something (e.g., the return
+   after unsetting a variable that was already unset is unportable) it's
+   best to indicate so explicitly with a semicolon:
 
-       export HLAGH;
+       unset HLAGH;
        git merge hla &&
        git push gh &&
        test ...
@@ -451,8 +451,10 @@ library for your script to use.
  - test_must_fail <git-command>
 
    Run a git command and ensure it fails in a controlled way.  Use
-   this instead of "! <git-command>" to fail when git commands
-   segfault.
+   this instead of "! <git-command>".  When git-command dies due to a
+   segfault, test_must_fail diagnoses it as an error; "! <git-command>"
+   treats it as just another expected failure, which would let such a
+   bug go unnoticed.
 
  - test_might_fail <git-command>
 
index c3f6676ca2c4a37cbe1cf2779e97a678c1345559..92d6d319428223de9205d4d162e3806aedee855b 100644 (file)
@@ -16,7 +16,6 @@ fi
 GIT_DIR=$PWD/.git
 GIT_SVN_DIR=$GIT_DIR/svn/refs/remotes/git-svn
 SVN_TREE=$GIT_SVN_DIR/svn-tree
-PERL=${PERL:-perl}
 
 svn >/dev/null 2>&1
 if test $? -ne 1
@@ -30,7 +29,7 @@ export svnrepo
 svnconf=$PWD/svnconf
 export svnconf
 
-$PERL -w -e "
+"$PERL_PATH" -w -e "
 use SVN::Core;
 use SVN::Repos;
 \$SVN::Core::VERSION gt '1.1.0' or exit(42);
@@ -130,7 +129,7 @@ stop_httpd () {
 }
 
 convert_to_rev_db () {
-       $PERL -w -- - "$@" <<\EOF
+       "$PERL_PATH" -w -- - "$@" <<\EOF
 use strict;
 @ARGV == 2 or die "Usage: convert_to_rev_db <input> <output>";
 open my $wr, '+>', $ARGV[1] or die "$!: couldn't open: $ARGV[1]";
index 71effc5becd09d1289361767f6f54af8f1594627..e733f6516fdf98e48d5c7cd36ecc89d36166eea1 100644 (file)
@@ -145,7 +145,7 @@ test_http_push_nonff() {
                echo "changed" > path2 &&
                git commit -a -m path2 --amend &&
 
-               !(git push -v origin >output 2>&1) &&
+               test_must_fail git push -v origin >output 2>&1 &&
                (cd "$REMOTE_REPO" &&
                 test $HEAD = $(git rev-parse --verify HEAD))
        '
index 64f05080b65c2b9506d1e34748b47ee721026aef..074f2f2e3e57f76b01f16502998e95b493676711 100755 (executable)
@@ -707,19 +707,41 @@ test_expect_success 'set --path' '
        git config --path path.trailingtilde "foo~" &&
        test_cmp expect .git/config'
 
+if test "${HOME+set}"
+then
+       test_set_prereq HOMEVAR
+fi
+
 cat >expect <<EOF
 $HOME/
 /dev/null
 foo~
 EOF
 
-test_expect_success 'get --path' '
+test_expect_success HOMEVAR 'get --path' '
        git config --get --path path.home > result &&
        git config --get --path path.normal >> result &&
        git config --get --path path.trailingtilde >> result &&
        test_cmp expect result
 '
 
+cat >expect <<\EOF
+/dev/null
+foo~
+EOF
+
+test_expect_success 'get --path copes with unset $HOME' '
+       (
+               unset HOME;
+               test_must_fail git config --get --path path.home \
+                       >result 2>msg &&
+               git config --get --path path.normal >>result &&
+               git config --get --path path.trailingtilde >>result
+       ) &&
+       grep "[Ff]ailed to expand.*~/" msg &&
+       test_cmp expect result
+'
+
 rm .git/config
 
 git config quote.leading " test"
index eb45afb018f6e3849204b44cce06ae1a4e2e29aa..782e75d00091ebf1fda93ca5dc8e532289a15638 100755 (executable)
@@ -41,6 +41,23 @@ test_expect_success "check-ref-format --branch @{-1}" '
        refname2=$(git check-ref-format --branch @{-2}) &&
        test "$refname2" = master'
 
+test_expect_success 'check-ref-format --branch from subdir' '
+       mkdir subdir &&
+
+       T=$(git write-tree) &&
+       sha1=$(echo A | git commit-tree $T) &&
+       git update-ref refs/heads/master $sha1 &&
+       git update-ref refs/remotes/origin/master $sha1
+       git checkout master &&
+       git checkout origin/master &&
+       git checkout master &&
+       refname=$(
+               cd subdir &&
+               git check-ref-format --branch @{-1}
+       ) &&
+       test "$refname" = "$sha1"
+'
+
 valid_ref_normalized() {
        test_expect_success "ref name '$1' simplifies to '$2'" "
                refname=\$(git check-ref-format --print '$1') &&
index be88d4b5ee86b75eb0e5654404064f712192d0a9..2d2f63f22ee59d8dc24dafaa5224928ad62dea0c 100755 (executable)
@@ -68,41 +68,34 @@ test_expect_success '--orphan makes reflog by default' '
        git checkout master &&
        git config --unset core.logAllRefUpdates &&
        git checkout --orphan delta &&
-       ! test -f .git/logs/refs/heads/delta &&
-       test_must_fail PAGER= git reflog show delta &&
+       test_must_fail git rev-parse --verify delta@{0} &&
        git commit -m Delta &&
-       test -f .git/logs/refs/heads/delta &&
-       PAGER= git reflog show delta
+       git rev-parse --verify delta@{0}
 '
 
 test_expect_success '--orphan does not make reflog when core.logAllRefUpdates = false' '
        git checkout master &&
        git config core.logAllRefUpdates false &&
        git checkout --orphan epsilon &&
-       ! test -f .git/logs/refs/heads/epsilon &&
-       test_must_fail PAGER= git reflog show epsilon &&
+       test_must_fail git rev-parse --verify epsilon@{0} &&
        git commit -m Epsilon &&
-       ! test -f .git/logs/refs/heads/epsilon &&
-       test_must_fail PAGER= git reflog show epsilon
+       test_must_fail git rev-parse --verify epsilon@{0}
 '
 
 test_expect_success '--orphan with -l makes reflog when core.logAllRefUpdates = false' '
        git checkout master &&
        git checkout -l --orphan zeta &&
-       test -f .git/logs/refs/heads/zeta &&
-       test_must_fail PAGER= git reflog show zeta &&
+       test_must_fail git rev-parse --verify zeta@{0} &&
        git commit -m Zeta &&
-       PAGER= git reflog show zeta
+       git rev-parse --verify zeta@{0}
 '
 
 test_expect_success 'giving up --orphan not committed when -l and core.logAllRefUpdates = false deletes reflog' '
        git checkout master &&
        git checkout -l --orphan eta &&
-       test -f .git/logs/refs/heads/eta &&
-       test_must_fail PAGER= git reflog show eta &&
+       test_must_fail git rev-parse --verify eta@{0} &&
        git checkout master &&
-       ! test -f .git/logs/refs/heads/eta &&
-       test_must_fail PAGER= git reflog show eta
+       test_must_fail git rev-parse --verify eta@{0}
 '
 
 test_expect_success '--orphan is rejected with an existing name' '
index 859b99abf1cc62c966322fcfc552c0a7eb7356df..f54a533456d74a3eb2f745dbc77c8ad5a5ae960f 100755 (executable)
@@ -228,24 +228,21 @@ test_expect_success 'checkout -b makes reflog by default' '
        git checkout master &&
        git config --unset core.logAllRefUpdates &&
        git checkout -b alpha &&
-       test -f .git/logs/refs/heads/alpha &&
-       PAGER= git reflog show alpha
+       git rev-parse --verify alpha@{0}
 '
 
 test_expect_success 'checkout -b does not make reflog when core.logAllRefUpdates = false' '
        git checkout master &&
        git config core.logAllRefUpdates false &&
        git checkout -b beta &&
-       ! test -f .git/logs/refs/heads/beta &&
-       test_must_fail PAGER= git reflog show beta
+       test_must_fail git rev-parse --verify beta@{0}
 '
 
 test_expect_success 'checkout -b with -l makes reflog when core.logAllRefUpdates = false' '
        git checkout master &&
        git checkout -lb gamma &&
        git config --unset core.logAllRefUpdates &&
-       test -f .git/logs/refs/heads/gamma &&
-       PAGER= git reflog show gamma
+       git rev-parse --verify gamma@{0}
 '
 
 test_expect_success 'avoid ambiguous track' '
index 2d67a40fc16385b8bee37968f4058b094a174a98..1d82f79ee07e8f9317bc23c49cdf941af36ce3ff 100755 (executable)
@@ -693,7 +693,11 @@ test_expect_success 'create note from non-existing note with "git notes add -c"
        git add a10 &&
        test_tick &&
        git commit -m 10th &&
-       test_must_fail MSG="yet another note" git notes add -c deadbeef &&
+       (
+               MSG="yet another note" &&
+               export MSG &&
+               test_must_fail git notes add -c deadbeef
+       ) &&
        test_must_fail git notes list HEAD
 '
 
index 47ca88fc5231a5e0689b43a35eb660285a73190d..9f03ce699e8f4c3c654065deae675d1a7b259c74 100755 (executable)
@@ -637,13 +637,19 @@ test_expect_success 'set up commits with funny messages' '
        git commit -a -m "end with slash\\" &&
        echo >>file1 &&
        test_tick &&
+       git commit -a -m "something (\000) that looks like octal" &&
+       echo >>file1 &&
+       test_tick &&
+       git commit -a -m "something (\n) that looks like a newline" &&
+       echo >>file1 &&
+       test_tick &&
        git commit -a -m "another commit"
 '
 
 test_expect_success 'rebase-i history with funny messages' '
        git rev-list A..funny >expect &&
        test_tick &&
-       FAKE_LINES="1 2" git rebase -i A &&
+       FAKE_LINES="1 2 3 4" git rebase -i A &&
        git rev-list A.. >actual &&
        test_cmp expect actual
 '
diff --git a/t/t3418-rebase-continue.sh b/t/t3418-rebase-continue.sh
new file mode 100755 (executable)
index 0000000..3b0d273
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+test_description='git rebase --continue tests'
+
+. ./test-lib.sh
+
+. "$TEST_DIRECTORY"/lib-rebase.sh
+
+set_fake_editor
+
+test_expect_success 'setup' '
+       test_commit "commit-new-file-F1" F1 1 &&
+       test_commit "commit-new-file-F2" F2 2 &&
+
+       git checkout -b topic HEAD^ &&
+       test_commit "commit-new-file-F2-on-topic-branch" F2 22 &&
+
+       git checkout master
+'
+
+test_expect_success 'interactive rebase --continue works with touched file' '
+       rm -fr .git/rebase-* &&
+       git reset --hard &&
+       git checkout master &&
+
+       FAKE_LINES="edit 1" git rebase -i HEAD^ &&
+       test-chmtime =-60 F1 &&
+       git rebase --continue
+'
+
+test_expect_success 'non-interactive rebase --continue works with touched file' '
+       rm -fr .git/rebase-* &&
+       git reset --hard &&
+       git checkout master &&
+
+       test_must_fail git rebase --onto master master topic &&
+       echo "Resolved" >F2 &&
+       git add F2 &&
+       test-chmtime =-60 F1 &&
+       git rebase --continue
+'
+
+test_done
index 6f031af9f35e4d6350e8e6dd4619d55c66214aa6..7d7140db380225bfffd3b64c125e2599b6be77c2 100755 (executable)
@@ -260,4 +260,32 @@ test_expect_success '"add non-existent" should fail' '
        ! (git ls-files | grep "non-existent")
 '
 
+test_expect_success 'git add --dry-run of existing changed file' "
+       echo new >>track-this &&
+       git add --dry-run track-this >actual 2>&1 &&
+       echo \"add 'track-this'\" | test_cmp - actual
+"
+
+test_expect_success 'git add --dry-run of non-existing file' "
+       echo ignored-file >>.gitignore &&
+       test_must_fail git add --dry-run track-this ignored-file >actual 2>&1 &&
+       echo \"fatal: pathspec 'ignored-file' did not match any files\" | test_cmp - actual
+"
+
+cat >expect.err <<\EOF
+The following paths are ignored by one of your .gitignore files:
+ignored-file
+Use -f if you really want to add them.
+fatal: no files added
+EOF
+cat >expect.out <<\EOF
+add 'track-this'
+EOF
+
+test_expect_success 'git add --dry-run --ignore-missing of non-existing file' '
+       test_must_fail git add --dry-run --ignore-missing track-this ignored-file >actual.out 2>actual.err &&
+       test_cmp expect.out actual.out &&
+       test_cmp expect.err actual.err
+'
+
 test_done
diff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh
new file mode 100755 (executable)
index 0000000..8a3c63b
--- /dev/null
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+test_description='diff --relative tests'
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+       git commit --allow-empty -m empty &&
+       echo content >file1 &&
+       mkdir subdir &&
+       echo other content >subdir/file2 &&
+       git add . &&
+       git commit -m one
+'
+
+check_diff() {
+expect=$1; shift
+cat >expected <<EOF
+diff --git a/$expect b/$expect
+new file mode 100644
+index 0000000..25c05ef
+--- /dev/null
++++ b/$expect
+@@ -0,0 +1 @@
++other content
+EOF
+test_expect_success "-p $*" "
+       git diff -p $* HEAD^ >actual &&
+       test_cmp expected actual
+"
+}
+
+check_stat() {
+expect=$1; shift
+cat >expected <<EOF
+ $expect |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+EOF
+test_expect_success "--stat $*" "
+       git diff --stat $* HEAD^ >actual &&
+       test_cmp expected actual
+"
+}
+
+check_raw() {
+expect=$1; shift
+cat >expected <<EOF
+:000000 100644 0000000000000000000000000000000000000000 25c05ef3639d2d270e7fe765a67668f098092bc5 A     $expect
+EOF
+test_expect_success "--raw $*" "
+       git diff --no-abbrev --raw $* HEAD^ >actual &&
+       test_cmp expected actual
+"
+}
+
+for type in diff stat raw; do
+       check_$type file2 --relative=subdir/
+       check_$type file2 --relative=subdir
+       check_$type dir/file2 --relative=sub
+done
+
+test_done
index 504884b9f8fab3bfa34e3dc97d3dc7aad297e626..b0c2a2c3aea811ec023423bdb486de5412fa79c5 100755 (executable)
@@ -128,7 +128,7 @@ test_expect_success 'push fails for non-fast-forward refs unmatched by remote he
 
        # push master too; this ensures there is at least one '"'push'"' command to
        # the remote helper and triggers interaction with the helper.
-       !(git push -v origin +master master:retsam >output 2>&1) &&
+       test_must_fail git push -v origin +master master:retsam >output 2>&1 &&
 
        grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *master -> master (forced update)$" output &&
        grep "^ ! \[rejected\] *master -> retsam (non-fast-forward)$" output &&
index 203ffdb17a914654d35416575b6797a2825ce4e6..4185b7ca1d3679b458d16753581fe78e3b68b376 100755 (executable)
@@ -219,6 +219,12 @@ test_expect_success 'bisect and replacements' '
      git bisect reset
 '
 
+test_expect_success 'index-pack and replacements' '
+       git --no-replace-objects rev-list --objects HEAD |
+       git --no-replace-objects pack-objects test- &&
+       git index-pack test-*.pack
+'
+
 #
 #
 test_done
index 0da13a8d6b8f75ba041a353dfc6a356c1e8bbed0..2c55801ee8b88b2d97968a24706dcfdab824668b 100755 (executable)
@@ -143,11 +143,12 @@ test_expect_success 'more setup' '
 test_expect_success 'use index-filter to move into a subdirectory' '
        git branch directorymoved &&
        git filter-branch -f --index-filter \
-                "git ls-files -s | sed \"s-\\t-&newsubdir/-\" |
+                "git ls-files -s | sed \"s-    -&newsubdir/-\" |
                  GIT_INDEX_FILE=\$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
                  mv \"\$GIT_INDEX_FILE.new\" \"\$GIT_INDEX_FILE\"" directorymoved &&
-       test -z "$(git diff HEAD directorymoved:newsubdir)"'
+       git diff --exit-code HEAD directorymoved:newsubdir
+'
 
 test_expect_success 'stops when msg filter fails' '
        old=$(git rev-parse HEAD) &&
index d9f27859932c33e126fa64c5c1fb80963dabb97a..9bda97058499ecab88dc6de7551d7909e1ad5a2e 100755 (executable)
@@ -86,25 +86,28 @@ test_expect_success 'submodule add' '
        test_cmp empty untracked
 '
 
-test_expect_success 'submodule add to .gitignored path' '
-       echo "refs/heads/master" >expect &&
-       >empty &&
-
+test_expect_success 'submodule add to .gitignored path fails' '
        (
                cd addtest-ignore &&
+               cat <<-\EOF >expect &&
+               The following path is ignored by one of your .gitignore files:
+               submod
+               Use -f if you really want to add it.
+               EOF
                # Does not use test_commit due to the ignore
                echo "*" > .gitignore &&
                git add --force .gitignore &&
                git commit -m"Ignore everything" &&
-               git submodule add "$submodurl" submod &&
-               git submodule init
-       ) &&
+               ! git submodule add "$submodurl" submod >actual 2>&1 &&
+               test_cmp expect actual
+       )
+'
 
-       rm -f heads head untracked &&
-       inspect addtest/submod ../.. &&
-       test_cmp expect heads &&
-       test_cmp expect head &&
-       test_cmp empty untracked
+test_expect_success 'submodule add to .gitignored path with --force' '
+       (
+               cd addtest-ignore &&
+               git submodule add --force "$submodurl" submod
+       )
 '
 
 test_expect_success 'submodule add --branch' '
index 131f03298809ad193cc75ab77deda6daaf713d1f..2aeed7bd0601a0587f99250377001be6287772e5 100755 (executable)
@@ -166,6 +166,63 @@ test_expect_success \
         test `git rev-parse --verify master:file2` \
            = `git rev-parse --verify verify--import-marks:copy-of-file2`'
 
+test_tick
+mt=$(git hash-object --stdin < /dev/null)
+: >input.blob
+: >marks.exp
+: >tree.exp
+
+cat >input.commit <<EOF
+commit refs/heads/verify--dump-marks
+committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+data <<COMMIT
+test the sparse array dumping routines with exponentially growing marks
+COMMIT
+EOF
+
+i=0
+l=4
+m=6
+n=7
+while test "$i" -lt 27; do
+    cat >>input.blob <<EOF
+blob
+mark :$l
+data 0
+blob
+mark :$m
+data 0
+blob
+mark :$n
+data 0
+EOF
+    echo "M 100644 :$l l$i" >>input.commit
+    echo "M 100644 :$m m$i" >>input.commit
+    echo "M 100644 :$n n$i" >>input.commit
+
+    echo ":$l $mt" >>marks.exp
+    echo ":$m $mt" >>marks.exp
+    echo ":$n $mt" >>marks.exp
+
+    printf "100644 blob $mt\tl$i\n" >>tree.exp
+    printf "100644 blob $mt\tm$i\n" >>tree.exp
+    printf "100644 blob $mt\tn$i\n" >>tree.exp
+
+    l=$(($l + $l))
+    m=$(($m + $m))
+    n=$(($l + $n))
+
+    i=$((1 + $i))
+done
+
+sort tree.exp > tree.exp_s
+
+test_expect_success 'A: export marks with large values' '
+       cat input.blob input.commit | git fast-import --export-marks=marks.large &&
+       git ls-tree refs/heads/verify--dump-marks >tree.out &&
+       test_cmp tree.exp_s tree.out &&
+       test_cmp marks.exp marks.large'
+
 ###
 ### series B
 ###
index db8371cb170c5924512a5626681f485ea3cf6884..e8f21d577ce4da474e2a9545a667ff5dc6dc145f 100644 (file)
@@ -127,14 +127,13 @@ do
        -v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
                verbose=t; shift ;;
        -q|--q|--qu|--qui|--quie|--quiet)
-               quiet=t; shift ;;
+               # Ignore --quiet under a TAP::Harness. Saying how many tests
+               # passed without the ok/not ok details is always an error.
+               test -z "$HARNESS_ACTIVE" && quiet=t; shift ;;
        --with-dashes)
                with_dashes=t; shift ;;
        --no-color)
                color=; shift ;;
-       --no-python)
-               # noop now...
-               shift ;;
        --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
                valgrind=t; verbose=t; shift ;;
        --tee)
@@ -636,7 +635,7 @@ test_done () {
        GIT_EXIT_OK=t
        test_results_dir="$TEST_DIRECTORY/test-results"
        mkdir -p "$test_results_dir"
-       test_results_path="$test_results_dir/${0%.sh}-$$"
+       test_results_path="$test_results_dir/${0%.sh}-$$.counts"
 
        echo "total $test_count" >> $test_results_path
        echo "success $test_success" >> $test_results_path
index afb4f6f773a3ed909433778f4b4da3740ded2b18..fd8ead33ed72c37e690ee1fc5b8568f629c95145 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -40,7 +40,8 @@ void *xmalloc(size_t size)
                if (!ret && !size)
                        ret = malloc(1);
                if (!ret)
-                       die("Out of memory, malloc failed");
+                       die("Out of memory, malloc failed (tried to allocate %lu bytes)",
+                           (unsigned long)size);
        }
 #ifdef XMALLOC_POISON
        memset(ret, 0xA5, size);