]> asedeno.scripts.mit.edu Git - git.git/commitdiff
Merge branch 'ml/completion-zsh'
authorJunio C Hamano <gitster@pobox.com>
Wed, 27 Oct 2010 04:39:03 +0000 (21:39 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 27 Oct 2010 04:39:03 +0000 (21:39 -0700)
* ml/completion-zsh:
  completion: make compatible with zsh

341 files changed:
.mailmap
Documentation/CodingGuidelines
Documentation/RelNotes/1.5.0.1.txt [moved from Documentation/RelNotes-1.5.0.1.txt with 100% similarity]
Documentation/RelNotes/1.5.0.2.txt [moved from Documentation/RelNotes-1.5.0.2.txt with 100% similarity]
Documentation/RelNotes/1.5.0.3.txt [moved from Documentation/RelNotes-1.5.0.3.txt with 100% similarity]
Documentation/RelNotes/1.5.0.4.txt [moved from Documentation/RelNotes-1.5.0.4.txt with 100% similarity]
Documentation/RelNotes/1.5.0.5.txt [moved from Documentation/RelNotes-1.5.0.5.txt with 100% similarity]
Documentation/RelNotes/1.5.0.6.txt [moved from Documentation/RelNotes-1.5.0.6.txt with 100% similarity]
Documentation/RelNotes/1.5.0.7.txt [moved from Documentation/RelNotes-1.5.0.7.txt with 100% similarity]
Documentation/RelNotes/1.5.0.txt [moved from Documentation/RelNotes-1.5.0.txt with 100% similarity]
Documentation/RelNotes/1.5.1.1.txt [moved from Documentation/RelNotes-1.5.1.1.txt with 100% similarity]
Documentation/RelNotes/1.5.1.2.txt [moved from Documentation/RelNotes-1.5.1.2.txt with 100% similarity]
Documentation/RelNotes/1.5.1.3.txt [moved from Documentation/RelNotes-1.5.1.3.txt with 100% similarity]
Documentation/RelNotes/1.5.1.4.txt [moved from Documentation/RelNotes-1.5.1.4.txt with 100% similarity]
Documentation/RelNotes/1.5.1.5.txt [moved from Documentation/RelNotes-1.5.1.5.txt with 100% similarity]
Documentation/RelNotes/1.5.1.6.txt [moved from Documentation/RelNotes-1.5.1.6.txt with 100% similarity]
Documentation/RelNotes/1.5.1.txt [moved from Documentation/RelNotes-1.5.1.txt with 100% similarity]
Documentation/RelNotes/1.5.2.1.txt [moved from Documentation/RelNotes-1.5.2.1.txt with 100% similarity]
Documentation/RelNotes/1.5.2.2.txt [moved from Documentation/RelNotes-1.5.2.2.txt with 100% similarity]
Documentation/RelNotes/1.5.2.3.txt [moved from Documentation/RelNotes-1.5.2.3.txt with 100% similarity]
Documentation/RelNotes/1.5.2.4.txt [moved from Documentation/RelNotes-1.5.2.4.txt with 100% similarity]
Documentation/RelNotes/1.5.2.5.txt [moved from Documentation/RelNotes-1.5.2.5.txt with 100% similarity]
Documentation/RelNotes/1.5.2.txt [moved from Documentation/RelNotes-1.5.2.txt with 100% similarity]
Documentation/RelNotes/1.5.3.1.txt [moved from Documentation/RelNotes-1.5.3.1.txt with 100% similarity]
Documentation/RelNotes/1.5.3.2.txt [moved from Documentation/RelNotes-1.5.3.2.txt with 100% similarity]
Documentation/RelNotes/1.5.3.3.txt [moved from Documentation/RelNotes-1.5.3.3.txt with 100% similarity]
Documentation/RelNotes/1.5.3.4.txt [moved from Documentation/RelNotes-1.5.3.4.txt with 100% similarity]
Documentation/RelNotes/1.5.3.5.txt [moved from Documentation/RelNotes-1.5.3.5.txt with 100% similarity]
Documentation/RelNotes/1.5.3.6.txt [moved from Documentation/RelNotes-1.5.3.6.txt with 100% similarity]
Documentation/RelNotes/1.5.3.7.txt [moved from Documentation/RelNotes-1.5.3.7.txt with 100% similarity]
Documentation/RelNotes/1.5.3.8.txt [moved from Documentation/RelNotes-1.5.3.8.txt with 100% similarity]
Documentation/RelNotes/1.5.3.txt [moved from Documentation/RelNotes-1.5.3.txt with 100% similarity]
Documentation/RelNotes/1.5.4.1.txt [moved from Documentation/RelNotes-1.5.4.1.txt with 100% similarity]
Documentation/RelNotes/1.5.4.2.txt [moved from Documentation/RelNotes-1.5.4.2.txt with 100% similarity]
Documentation/RelNotes/1.5.4.3.txt [moved from Documentation/RelNotes-1.5.4.3.txt with 100% similarity]
Documentation/RelNotes/1.5.4.4.txt [moved from Documentation/RelNotes-1.5.4.4.txt with 100% similarity]
Documentation/RelNotes/1.5.4.5.txt [moved from Documentation/RelNotes-1.5.4.5.txt with 100% similarity]
Documentation/RelNotes/1.5.4.6.txt [moved from Documentation/RelNotes-1.5.4.6.txt with 100% similarity]
Documentation/RelNotes/1.5.4.7.txt [moved from Documentation/RelNotes-1.5.4.7.txt with 100% similarity]
Documentation/RelNotes/1.5.4.txt [moved from Documentation/RelNotes-1.5.4.txt with 100% similarity]
Documentation/RelNotes/1.5.5.1.txt [moved from Documentation/RelNotes-1.5.5.1.txt with 100% similarity]
Documentation/RelNotes/1.5.5.2.txt [moved from Documentation/RelNotes-1.5.5.2.txt with 100% similarity]
Documentation/RelNotes/1.5.5.3.txt [moved from Documentation/RelNotes-1.5.5.3.txt with 100% similarity]
Documentation/RelNotes/1.5.5.4.txt [moved from Documentation/RelNotes-1.5.5.4.txt with 100% similarity]
Documentation/RelNotes/1.5.5.5.txt [moved from Documentation/RelNotes-1.5.5.5.txt with 100% similarity]
Documentation/RelNotes/1.5.5.6.txt [moved from Documentation/RelNotes-1.5.5.6.txt with 100% similarity]
Documentation/RelNotes/1.5.5.txt [moved from Documentation/RelNotes-1.5.5.txt with 100% similarity]
Documentation/RelNotes/1.5.6.1.txt [moved from Documentation/RelNotes-1.5.6.1.txt with 100% similarity]
Documentation/RelNotes/1.5.6.2.txt [moved from Documentation/RelNotes-1.5.6.2.txt with 100% similarity]
Documentation/RelNotes/1.5.6.3.txt [moved from Documentation/RelNotes-1.5.6.3.txt with 100% similarity]
Documentation/RelNotes/1.5.6.4.txt [moved from Documentation/RelNotes-1.5.6.4.txt with 100% similarity]
Documentation/RelNotes/1.5.6.5.txt [moved from Documentation/RelNotes-1.5.6.5.txt with 100% similarity]
Documentation/RelNotes/1.5.6.6.txt [moved from Documentation/RelNotes-1.5.6.6.txt with 100% similarity]
Documentation/RelNotes/1.5.6.txt [moved from Documentation/RelNotes-1.5.6.txt with 100% similarity]
Documentation/RelNotes/1.6.0.1.txt [moved from Documentation/RelNotes-1.6.0.1.txt with 100% similarity]
Documentation/RelNotes/1.6.0.2.txt [moved from Documentation/RelNotes-1.6.0.2.txt with 100% similarity]
Documentation/RelNotes/1.6.0.3.txt [moved from Documentation/RelNotes-1.6.0.3.txt with 100% similarity]
Documentation/RelNotes/1.6.0.4.txt [moved from Documentation/RelNotes-1.6.0.4.txt with 100% similarity]
Documentation/RelNotes/1.6.0.5.txt [moved from Documentation/RelNotes-1.6.0.5.txt with 100% similarity]
Documentation/RelNotes/1.6.0.6.txt [moved from Documentation/RelNotes-1.6.0.6.txt with 100% similarity]
Documentation/RelNotes/1.6.0.txt [moved from Documentation/RelNotes-1.6.0.txt with 100% similarity]
Documentation/RelNotes/1.6.1.1.txt [moved from Documentation/RelNotes-1.6.1.1.txt with 100% similarity]
Documentation/RelNotes/1.6.1.2.txt [moved from Documentation/RelNotes-1.6.1.2.txt with 100% similarity]
Documentation/RelNotes/1.6.1.3.txt [moved from Documentation/RelNotes-1.6.1.3.txt with 100% similarity]
Documentation/RelNotes/1.6.1.4.txt [moved from Documentation/RelNotes-1.6.1.4.txt with 100% similarity]
Documentation/RelNotes/1.6.1.txt [moved from Documentation/RelNotes-1.6.1.txt with 100% similarity]
Documentation/RelNotes/1.6.2.1.txt [moved from Documentation/RelNotes-1.6.2.1.txt with 100% similarity]
Documentation/RelNotes/1.6.2.2.txt [moved from Documentation/RelNotes-1.6.2.2.txt with 100% similarity]
Documentation/RelNotes/1.6.2.3.txt [moved from Documentation/RelNotes-1.6.2.3.txt with 100% similarity]
Documentation/RelNotes/1.6.2.4.txt [moved from Documentation/RelNotes-1.6.2.4.txt with 100% similarity]
Documentation/RelNotes/1.6.2.5.txt [moved from Documentation/RelNotes-1.6.2.5.txt with 100% similarity]
Documentation/RelNotes/1.6.2.txt [moved from Documentation/RelNotes-1.6.2.txt with 100% similarity]
Documentation/RelNotes/1.6.3.1.txt [moved from Documentation/RelNotes-1.6.3.1.txt with 100% similarity]
Documentation/RelNotes/1.6.3.2.txt [moved from Documentation/RelNotes-1.6.3.2.txt with 100% similarity]
Documentation/RelNotes/1.6.3.3.txt [moved from Documentation/RelNotes-1.6.3.3.txt with 100% similarity]
Documentation/RelNotes/1.6.3.4.txt [moved from Documentation/RelNotes-1.6.3.4.txt with 100% similarity]
Documentation/RelNotes/1.6.3.txt [moved from Documentation/RelNotes-1.6.3.txt with 100% similarity]
Documentation/RelNotes/1.6.4.1.txt [moved from Documentation/RelNotes-1.6.4.1.txt with 100% similarity]
Documentation/RelNotes/1.6.4.2.txt [moved from Documentation/RelNotes-1.6.4.2.txt with 100% similarity]
Documentation/RelNotes/1.6.4.3.txt [moved from Documentation/RelNotes-1.6.4.3.txt with 100% similarity]
Documentation/RelNotes/1.6.4.4.txt [moved from Documentation/RelNotes-1.6.4.4.txt with 100% similarity]
Documentation/RelNotes/1.6.4.txt [moved from Documentation/RelNotes-1.6.4.txt with 100% similarity]
Documentation/RelNotes/1.6.5.1.txt [moved from Documentation/RelNotes-1.6.5.1.txt with 100% similarity]
Documentation/RelNotes/1.6.5.2.txt [moved from Documentation/RelNotes-1.6.5.2.txt with 100% similarity]
Documentation/RelNotes/1.6.5.3.txt [moved from Documentation/RelNotes-1.6.5.3.txt with 100% similarity]
Documentation/RelNotes/1.6.5.4.txt [moved from Documentation/RelNotes-1.6.5.4.txt with 100% similarity]
Documentation/RelNotes/1.6.5.5.txt [moved from Documentation/RelNotes-1.6.5.5.txt with 100% similarity]
Documentation/RelNotes/1.6.5.6.txt [moved from Documentation/RelNotes-1.6.5.6.txt with 100% similarity]
Documentation/RelNotes/1.6.5.7.txt [moved from Documentation/RelNotes-1.6.5.7.txt with 100% similarity]
Documentation/RelNotes/1.6.5.8.txt [moved from Documentation/RelNotes-1.6.5.8.txt with 100% similarity]
Documentation/RelNotes/1.6.5.txt [moved from Documentation/RelNotes-1.6.5.txt with 100% similarity]
Documentation/RelNotes/1.6.6.1.txt [moved from Documentation/RelNotes-1.6.6.1.txt with 100% similarity]
Documentation/RelNotes/1.6.6.2.txt [moved from Documentation/RelNotes-1.6.6.2.txt with 100% similarity]
Documentation/RelNotes/1.6.6.txt [moved from Documentation/RelNotes-1.6.6.txt with 100% similarity]
Documentation/RelNotes/1.7.0.1.txt [moved from Documentation/RelNotes-1.7.0.1.txt with 100% similarity]
Documentation/RelNotes/1.7.0.2.txt [moved from Documentation/RelNotes-1.7.0.2.txt with 100% similarity]
Documentation/RelNotes/1.7.0.3.txt [moved from Documentation/RelNotes-1.7.0.3.txt with 100% similarity]
Documentation/RelNotes/1.7.0.4.txt [moved from Documentation/RelNotes-1.7.0.4.txt with 100% similarity]
Documentation/RelNotes/1.7.0.5.txt [moved from Documentation/RelNotes-1.7.0.5.txt with 100% similarity]
Documentation/RelNotes/1.7.0.6.txt [moved from Documentation/RelNotes-1.7.0.6.txt with 100% similarity]
Documentation/RelNotes/1.7.0.7.txt [moved from Documentation/RelNotes-1.7.0.7.txt with 100% similarity]
Documentation/RelNotes/1.7.0.txt [moved from Documentation/RelNotes-1.7.0.txt with 100% similarity]
Documentation/RelNotes/1.7.1.1.txt [moved from Documentation/RelNotes-1.7.1.1.txt with 100% similarity]
Documentation/RelNotes/1.7.1.2.txt [moved from Documentation/RelNotes-1.7.1.2.txt with 100% similarity]
Documentation/RelNotes/1.7.1.txt [moved from Documentation/RelNotes-1.7.1.txt with 100% similarity]
Documentation/RelNotes/1.7.2.1.txt [moved from Documentation/RelNotes-1.7.2.1.txt with 100% similarity]
Documentation/RelNotes/1.7.2.2.txt [moved from Documentation/RelNotes-1.7.2.2.txt with 100% similarity]
Documentation/RelNotes/1.7.2.3.txt [moved from Documentation/RelNotes-1.7.2.3.txt with 100% similarity]
Documentation/RelNotes/1.7.2.txt [moved from Documentation/RelNotes-1.7.2.txt with 100% similarity]
Documentation/RelNotes/1.7.3.1.txt [new file with mode: 0644]
Documentation/RelNotes/1.7.3.2.txt [new file with mode: 0644]
Documentation/RelNotes/1.7.3.txt [moved from Documentation/RelNotes-1.7.3.txt with 74% similarity]
Documentation/RelNotes/1.7.4.txt [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/config.txt
Documentation/diff-generate-patch.txt
Documentation/diff-options.txt
Documentation/git-am.txt
Documentation/git-apply.txt
Documentation/git-archimport.txt
Documentation/git-archive.txt
Documentation/git-bundle.txt
Documentation/git-cat-file.txt
Documentation/git-check-ref-format.txt
Documentation/git-checkout-index.txt
Documentation/git-checkout.txt
Documentation/git-cherry-pick.txt
Documentation/git-clone.txt
Documentation/git-commit-tree.txt
Documentation/git-cvsexportcommit.txt
Documentation/git-cvsserver.txt
Documentation/git-daemon.txt
Documentation/git-diff.txt
Documentation/git-fast-export.txt
Documentation/git-fast-import.txt
Documentation/git-fetch.txt
Documentation/git-filter-branch.txt
Documentation/git-fmt-merge-msg.txt
Documentation/git-for-each-ref.txt
Documentation/git-format-patch.txt
Documentation/git-index-pack.txt
Documentation/git-init.txt
Documentation/git-log.txt
Documentation/git-ls-files.txt
Documentation/git-ls-tree.txt
Documentation/git-mailsplit.txt
Documentation/git-mergetool.txt
Documentation/git-pack-objects.txt
Documentation/git-push.txt
Documentation/git-read-tree.txt
Documentation/git-reflog.txt
Documentation/git-relink.txt
Documentation/git-remote.txt
Documentation/git-repack.txt
Documentation/git-reset.txt
Documentation/git-rev-list.txt
Documentation/git-rev-parse.txt
Documentation/git-revert.txt
Documentation/git-send-email.txt
Documentation/git-shell.txt
Documentation/git-shortlog.txt
Documentation/git-show-branch.txt
Documentation/git-show-ref.txt
Documentation/git-show.txt
Documentation/git-svn.txt
Documentation/git-update-index.txt
Documentation/git-web--browse.txt
Documentation/git.txt
Documentation/gitattributes.txt
Documentation/gitcore-tutorial.txt
Documentation/gitdiffcore.txt
Documentation/gitk.txt
Documentation/install-webdoc.sh
Documentation/merge-config.txt
Documentation/merge-options.txt
Documentation/merge-strategies.txt
Documentation/pretty-options.txt
Documentation/rev-list-options.txt
Documentation/revisions.txt
Documentation/user-manual.txt
GIT-VERSION-GEN
Makefile
RelNotes
abspath.c
archive.c
attr.c
builtin.h
builtin/bundle.c
builtin/checkout-index.c
builtin/checkout.c
builtin/commit-tree.c
builtin/fetch.c
builtin/fmt-merge-msg.c
builtin/grep.c
builtin/index-pack.c
builtin/init-db.c
builtin/log.c
builtin/ls-files.c
builtin/ls-tree.c
builtin/mailsplit.c
builtin/merge.c
builtin/pack-objects.c
builtin/read-tree.c
builtin/remote.c
builtin/rev-list.c
builtin/revert.c
builtin/show-branch.c
builtin/unpack-objects.c
builtin/update-index.c
bundle.c
cache.h
compat/mingw.c
compat/mingw.h
configure.ac
connect.c
contrib/completion/git-completion.bash
contrib/examples/git-svnimport.perl
contrib/git-shell-commands/README [new file with mode: 0644]
contrib/git-shell-commands/help [new file with mode: 0755]
contrib/git-shell-commands/list [new file with mode: 0755]
contrib/workdir/git-new-workdir
daemon.c
diff.c
diff.h
diffcore-pickaxe.c
diffcore.h
dir.c
environment.c
fast-import.c
git-am.sh
git-compat-util.h
git-cvsimport.perl
git-cvsserver.perl
git-filter-branch.sh
git-gui/GIT-VERSION-GEN
git-gui/Makefile
git-gui/git-gui--askpass
git-gui/git-gui.sh
git-gui/lib/blame.tcl
git-gui/po/sv.po
git-merge-octopus.sh
git-rebase--interactive.sh
git-rebase.sh
git-relink.perl
git-repack.sh
git-send-email.perl
git-sh-setup.sh
git-stash.sh
git-svn.perl
git.c
git_remote_helpers/setup.cfg [new file with mode: 0644]
gitweb/Makefile
gitweb/README
gitweb/gitweb.perl
grep.c
grep.h
merge-recursive.c
sha1_name.c
shell.c
strbuf.c
strbuf.h
t/annotate-tests.sh
t/gitweb-lib.sh
t/t0003-attributes.sh
t/t0004-unwritable.sh
t/t1020-subdirectory.sh
t/t1300-repo-config.sh
t/t1302-repo-version.sh
t/t1450-fsck.sh
t/t1503-rev-parse-verify.sh
t/t1509-root-worktree.sh
t/t2016-checkout-patch.sh
t/t2101-update-index-reupdate.sh
t/t2105-update-index-gitfile.sh
t/t3020-ls-files-error-unmatch.sh
t/t3030-merge-recursive.sh
t/t3060-ls-files-with-tree.sh
t/t3100-ls-tree-restrict.sh
t/t3101-ls-tree-dirname.sh
t/t3409-rebase-preserve-merges.sh
t/t3415-rebase-autosquash.sh
t/t3506-cherry-pick-ff.sh
t/t3903-stash.sh
t/t4013-diff-various.sh
t/t4013/diff.log_-GF_-p_--pickaxe-all_master [new file with mode: 0644]
t/t4013/diff.log_-GF_-p_master [new file with mode: 0644]
t/t4013/diff.log_-GF_master [new file with mode: 0644]
t/t4014-format-patch.sh
t/t4018-diff-funcname.sh
t/t4041-diff-submodule-option.sh
t/t5000-tar-tree.sh
t/t5503-tagfollow.sh
t/t5510-fetch.sh
t/t5560-http-backend-noserver.sh
t/t556x_common
t/t5704-bundle.sh
t/t6038-merge-text-auto.sh
t/t6050-replace.sh
t/t6200-fmt-merge-msg.sh
t/t7003-filter-branch.sh
t/t7008-grep-binary.sh
t/t7300-clean.sh
t/t7400-submodule-basic.sh
t/t7401-submodule-summary.sh
t/t7810-grep.sh
t/t9001-send-email.sh
t/t9100-git-svn-basic.sh
t/t9101-git-svn-props.sh
t/t9102-git-svn-deep-rmdir.sh
t/t9104-git-svn-follow-parent.sh
t/t9105-git-svn-commit-diff.sh
t/t9106-git-svn-commit-diff-clobber.sh
t/t9107-git-svn-migrate.sh
t/t9114-git-svn-dcommit-merge.sh
t/t9115-git-svn-dcommit-funky-renames.sh
t/t9116-git-svn-log.sh
t/t9119-git-svn-info.sh
t/t9120-git-svn-clone-with-percent-escapes.sh
t/t9123-git-svn-rebuild-with-rewriteroot.sh
t/t9125-git-svn-multi-glob-branch-names.sh
t/t9127-git-svn-partial-rebuild.sh
t/t9128-git-svn-cmd-branch.sh
t/t9131-git-svn-empty-symlink.sh
t/t9137-git-svn-dcommit-clobber-series.sh
t/t9157-git-svn-fetch-merge.sh [new file with mode: 0755]
t/t9300-fast-import.sh
t/t9401-git-cvsserver-crlf.sh
t/t9500-gitweb-standalone-no-errors.sh
t/t9600-cvsimport.sh
t/t9603-cvsimport-patchsets.sh
t/test-lib.sh
tree-diff.c
upload-pack.c
userdiff.c
vcs-svn/fast_export.c
vcs-svn/svndump.c
wt-status.c
xdiff-interface.c
xdiff/xmacros.h
xdiff/xmerge.c
xdiff/xutils.c

index a8091eb5dfa430bf1b0537da47a31e7cf88d8622..19c87262322cf5acc9d4fd5fa06f96eb3e988049 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -36,7 +36,7 @@ Lars Doelle <lars.doelle@on-line ! de>
 Lars Doelle <lars.doelle@on-line.de>
 Li Hong <leehong@pku.edu.cn>
 Lukas Sandström <lukass@etek.chalmers.se>
-Martin Langhoff <martin@catalyst.net.nz>
+Martin Langhoff <martin@laptop.org>
 Michael Coleman <tutufan@gmail.com>
 Michael J Gruber <git@drmicha.warpmail.net> <michaeljgruber+gmane@fastmail.fm>
 Michael W. Olson <mwolson@gnu.org>
index b8bf618a30fd32a014e41e1ba9914f5e652bdefd..09ffc46563cba1057b37ba4a5701858fb95c5dda 100644 (file)
@@ -35,21 +35,28 @@ For shell scripts specifically (not exhaustive):
    properly nests.  It should have been the way Bourne spelled
    it from day one, but unfortunately isn't.
 
- - We use ${parameter-word} and its [-=?+] siblings, and their
-   colon'ed "unset or null" form.
+ - We use POSIX compliant parameter substitutions and avoid bashisms;
+   namely:
 
- We use ${parameter#word} and its [#%] siblings, and their
-   doubled "longest matching" form.
  - We use ${parameter-word} and its [-=?+] siblings, and their
+     colon'ed "unset or null" form.
 
- - We use Arithmetic Expansion $(( ... )).
+   - We use ${parameter#word} and its [#%] siblings, and their
+     doubled "longest matching" form.
+
+   - No "Substring Expansion" ${parameter:offset:length}.
 
- No "Substring Expansion" ${parameter:offset:length}.
  - No shell arrays.
 
- No shell arrays.
  - No strlen ${#parameter}.
 
- - No strlen ${#parameter}.
+   - No pattern replacement ${parameter/pattern/string}.
+
+ - We use Arithmetic Expansion $(( ... )).
 
- - No regexp ${parameter/pattern/string}.
+ - Inside Arithmetic Expansion, spell shell variables with $ in front
+   of them, as some shells do not grok $((x)) while accepting $(($x))
+   just fine (e.g. dash older than 0.5.4).
 
  - We do not use Process Substitution <(list) or >(list).
 
diff --git a/Documentation/RelNotes/1.7.3.1.txt b/Documentation/RelNotes/1.7.3.1.txt
new file mode 100644 (file)
index 0000000..002c93b
--- /dev/null
@@ -0,0 +1,14 @@
+Git v1.7.3.1 Release Notes
+==========================
+
+Fixes since v1.7.3
+------------------
+
+ * "git stash show stash@{$n}" was accidentally broken in 1.7.3 ("git
+   stash show" without any argument still worked, though).
+
+ * "git stash branch $branch stash@{$n}" was accidentally broken in
+   1.7.3 and started dropping the named stash even when branch creation
+   failed.
+
+And other minor fixes and documentation updates.
diff --git a/Documentation/RelNotes/1.7.3.2.txt b/Documentation/RelNotes/1.7.3.2.txt
new file mode 100644 (file)
index 0000000..5c93b85
--- /dev/null
@@ -0,0 +1,5 @@
+Git v1.7.3.2 Release Notes
+==========================
+
+This is primarily to push out many documentation fixes accumulated since
+the 1.7.3.1 release.
similarity index 74%
rename from Documentation/RelNotes-1.7.3.txt
rename to Documentation/RelNotes/1.7.3.txt
index 3512bbb238efd4284b3e06f7c18b0f4231569d75..309c33181f8600d1a17a6cebb06703b8bb4225e0 100644 (file)
@@ -1,10 +1,11 @@
-Git v1.7.3 Release Notes (draft)
-================================
+Git v1.7.3 Release Notes
+========================
 
 Updates since v1.7.2
 --------------------
 
- * git-gui got various updates and a new maintainer, Pat Thoyts.
+ * git-gui, now at version 0.13.0, got various updates and a new
+   maintainer, Pat Thoyts.
 
  * Gitweb allows its configuration to change per each request; it used to
    read the configuration once upon startup.
@@ -60,14 +61,16 @@ release, unless otherwise noted.
  * "git fetch" and friends were accidentally broken for url with "+" in
    its path, e.g. "git://git.gnome.org/gtk+".
 
----
-exec >/var/tmp/1
-echo O=$(git describe master)
-O=v1.7.2.2-268-g7e42332
-O=v1.7.2
-git shortlog --no-merges $O..master ^maint
-exit 0
+ * "git fetch $url" (i.e. without refspecs) was broken for quite some
+   time, if the current branch happen to be tracking some remote.
 
-What did we want to do with...
+ * "git ls-tree dir dirgarbage", when "dir" was a directory,
+   incorrectly recursed into "dir".
 
-1e3d411 (Enable custom schemes for column colors in the graph API, 2010-07-13)
+ * "git note remove" created unnecessary extra commit when named object
+   did not have any note to begin with.
+
+ * "git rebase" did not work well if you had diff.noprefix configured.
+
+ * "git -c foo=bar subcmd" did not work well for subcmd that is not
+   implemented as a built-in command.
diff --git a/Documentation/RelNotes/1.7.4.txt b/Documentation/RelNotes/1.7.4.txt
new file mode 100644 (file)
index 0000000..05e8a43
--- /dev/null
@@ -0,0 +1,54 @@
+Git v1.7.4 Release Notes (draft)
+================================
+
+Updates since v1.7.3
+--------------------
+
+ * The option parsers of various commands that create new branch (or
+   rename existing ones to a new name) were too loose and users were
+   allowed to call a branch with a name that begins with a dash by
+   creative abuse of their command line options, which only lead to
+   burn themselves.  The name of a branch cannot begin with a dash
+   now.
+
+ * System-wide fallback default attributes can be stored in
+   /etc/gitattributes; core.attributesfile configuration variable can
+   be used to customize the path to this file.
+
+ * "git diff" and "git grep" learned how functions and subroutines
+   in Fortran look like.
+
+ * "git log -G<pattern>" limits the output to commits whose change has
+   added or deleted lines that match the given pattern.
+
+ * "git read-tree" with no argument as a way to empty the index is
+   deprecated; we might want to remove it in the future.  Users can
+   use the new --empty option to be more explicit instead.
+
+ * "git merge --log" used to limit the resulting merge log to 20
+   entries; this is now customizable by giving e.g. "--log=47".
+
+ * you can extend "git shell", which is often used on boxes that allow
+   git-only login over ssh as login shell, with custom set of
+   commands.
+
+Also contains various documentation updates.
+
+
+Fixes since v1.7.3
+------------------
+
+All of the fixes in v1.7.3.X maintenance series are included in this
+release, unless otherwise noted.
+
+ * "git log --author=me --author=her" did not find commits written by
+   me or by her; instead it looked for commits written by me and by
+   her, which is impossible.
+
+
+---
+exec >/var/tmp/1
+O=v1.7.3
+O=v1.7.3.1-42-g34289ec
+echo O=$(git describe master)
+git shortlog --no-merges ^maint ^$O master
index ece3c77482b3ff006b973f1ed90b708e26556862..72741ebda12de8fbf786f12531d70ab465eecf42 100644 (file)
@@ -264,12 +264,21 @@ the change to its true author (see (2) above).
 Also notice that a real name is used in the Signed-off-by: line. Please
 don't hide your real name.
 
-Some people also put extra tags at the end.
-
-"Acked-by:" says that the patch was reviewed by the person who
-is more familiar with the issues and the area the patch attempts
-to modify.  "Tested-by:" says the patch was tested by the person
-and found to have the desired effect.
+If you like, you can put extra tags at the end:
+
+1. "Reported-by:" is used to to credit someone who found the bug that
+   the patch attempts to fix.
+2. "Acked-by:" says that the person who is more familiar with the area
+   the patch attempts to modify liked the patch.
+3. "Reviewed-by:", unlike the other tags, can only be offered by the
+   reviewer and means that she is completely satisfied that the patch
+   is ready for application.  It is usually offered only after a
+   detailed review.
+4. "Tested-by:" is used to indicate that the person applied the patch
+   and found it to have the desired effect.
+
+You can also create your own tag or use one that's in common usage
+such as "Thanks-to:", "Based-on-patch-by:", or "Mentored-by:".
 
 ------------------------------------------------
 An ideal patch flow
index d294dd6dcd29bf4bad21a51011d85c7d2cf85f19..538ebb5e2ecc58f1ddcb7adb44ded3b027555ec2 100644 (file)
@@ -459,6 +459,12 @@ core.askpass::
        prompt. The external program shall be given a suitable prompt as
        command line argument and write the password on its STDOUT.
 
+core.attributesfile::
+       In addition to '.gitattributes' (per-directory) and
+       '.git/info/attributes', git looks into this file for attributes
+       (see linkgit:gitattributes[5]). Path expansions are made the same
+       way as for `core.excludesfile`.
+
 core.editor::
        Commands such as `commit` and `tag` that lets you edit
        messages by launching an editor uses the value of this
@@ -813,8 +819,6 @@ diff.mnemonicprefix::
        standard "a/" and "b/" depending on what is being compared.  When
        this configuration is in effect, reverse diff output also swaps
        the order of the prefixes:
-diff.noprefix::
-       If set, 'git diff' does not show any source or destination prefix.
 `git diff`;;
        compares the (i)ndex and the (w)ork tree;
 `git diff HEAD`;;
@@ -826,6 +830,9 @@ diff.noprefix::
 `git diff --no-index a b`;;
        compares two non-git things (1) and (2).
 
+diff.noprefix::
+       If set, 'git diff' does not show any source or destination prefix.
+
 diff.renameLimit::
        The number of files to consider when performing the copy/rename
        detection; equivalent to the 'git diff' option '-l'.
@@ -1465,6 +1472,10 @@ pack.compression::
        not set,  defaults to -1, the zlib default, which is "a default
        compromise between speed and compression (currently equivalent
        to level 6)."
++
+Note that changing the compression level will not automatically recompress
+all existing objects. You can force recompression by passing the -F option
+to linkgit:git-repack[1].
 
 pack.deltaCacheSize::
        The maximum memory in bytes used for caching deltas in
@@ -1549,12 +1560,12 @@ push.default::
        no refspec is implied by any of the options given on the command
        line. Possible values are:
 +
-* `nothing` do not push anything.
-* `matching` push all matching branches.
+* `nothing` do not push anything.
+* `matching` push all matching branches.
   All branches having the same name in both ends are considered to be
   matching. This is the default.
-* `tracking` push the current branch to its upstream branch.
-* `current` push the current branch to a branch of the same name.
+* `tracking` push the current branch to its upstream branch.
+* `current` push the current branch to a branch of the same name.
 
 rebase.stat::
        Whether to show a diffstat of what changed upstream since the last
@@ -1726,6 +1737,7 @@ sendemail.to::
 sendemail.smtpdomain::
 sendemail.smtpserver::
 sendemail.smtpserverport::
+sendemail.smtpserveroption::
 sendemail.smtpuser::
 sendemail.thread::
 sendemail.validate::
@@ -1754,9 +1766,9 @@ status.showUntrackedFiles::
        the untracked files. Possible values are:
 +
 --
-       - 'no'     - Show no untracked files
-       - 'normal' - Shows untracked files and directories
-       - 'all'    - Shows also individual files in untracked directories.
+* `no` - Show no untracked files.
+* `normal` - Show untracked files and directories.
+* `all` - Show also individual files in untracked directories.
 --
 +
 If this variable is not specified, it defaults to 'normal'.
index 8f9a2412fd44c80f2bf8d63271e2897ebeb3ddeb..3ac2beac6229955dc2534c428238c3d5ff57d25d 100644 (file)
@@ -9,16 +9,15 @@ patch file.  You can customize the creation of such patches via the
 GIT_EXTERNAL_DIFF and the GIT_DIFF_OPTS environment variables.
 
 What the -p option produces is slightly different from the traditional
-diff format.
+diff format:
 
-1.   It is preceded with a "git diff" header, that looks like
-     this:
+1.   It is preceded with a "git diff" header that looks like this:
 
        diff --git a/file1 b/file2
 +
 The `a/` and `b/` filenames are the same unless rename/copy is
 involved.  Especially, even for a creation or a deletion,
-`/dev/null` is _not_ used in place of `a/` or `b/` filenames.
+`/dev/null` is _not_ used in place of the `a/` or `b/` filenames.
 +
 When rename/copy is involved, `file1` and `file2` show the
 name of the source file of the rename/copy and the name of
@@ -37,18 +36,39 @@ the file that rename/copy produces, respectively.
        similarity index <number>
        dissimilarity index <number>
        index <hash>..<hash> <mode>
-
-3.  TAB, LF, double quote and backslash characters in pathnames
-    are represented as `\t`, `\n`, `\"` and `\\`, respectively.
-    If there is need for such substitution then the whole
-    pathname is put in double quotes.
-
++
+File modes are printed as 6-digit octal numbers including the file type
+and file permission bits.
++
+Path names in extended headers do not include the `a/` and `b/` prefixes.
++
 The similarity index is the percentage of unchanged lines, and
 the dissimilarity index is the percentage of changed lines.  It
 is a rounded down integer, followed by a percent sign.  The
 similarity index value of 100% is thus reserved for two equal
 files, while 100% dissimilarity means that no line from the old
 file made it into the new one.
++
+The index line includes the SHA-1 checksum before and after the change.
+The <mode> is included if the file mode does not change; otherwise,
+separate lines indicate the old and the new mode.
+
+3.  TAB, LF, double quote and backslash characters in pathnames
+    are represented as `\t`, `\n`, `\"` and `\\`, respectively.
+    If there is need for such substitution then the whole
+    pathname is put in double quotes.
+
+4.  All the `file1` files in the output refer to files before the
+    commit, and all the `file2` files refer to files after the commit.
+    It is incorrect to apply each change to each file sequentially.  For
+    example, this patch will swap a and b:
+
+      diff --git a/a b/b
+      rename from a
+      rename to b
+      diff --git a/b b/a
+      rename from b
+      rename to a
 
 
 combined diff format
index 4656a97e6012796f182a725e14c13dc03f71bba2..e954af0ad6c20707c2bf950a021fa1296e2582ea 100644 (file)
@@ -48,9 +48,9 @@ endif::git-format-patch[]
 --patience::
        Generate a diff using the "patience diff" algorithm.
 
---stat[=width[,name-width]]::
+--stat[=<width>[,<name-width>]]::
        Generate a diffstat.  You can override the default
-       output width for 80-column terminal by `--stat=width`.
+       output width for 80-column terminal by `--stat=<width>`.
        The width of the filename part can be controlled by
        giving another width to it separated by a comma.
 
@@ -66,14 +66,14 @@ endif::git-format-patch[]
        number of modified files, as well as number of added and deleted
        lines.
 
---dirstat[=limit]::
+--dirstat[=<limit>]::
        Output the distribution of relative amount of changes (number of lines added or
        removed) for each sub-directory. Directories with changes below
        a cut-off percent (3% by default) are not shown. The cut-off percent
-       can be set with `--dirstat=limit`. Changes in a child directory is not
+       can be set with `--dirstat=<limit>`. Changes in a child directory are not
        counted for the parent directory, unless `--cumulative` is used.
 
---dirstat-by-file[=limit]::
+--dirstat-by-file[=<limit>]::
        Same as `--dirstat`, but counts changed files instead of lines.
 
 --summary::
@@ -248,13 +248,13 @@ endif::git-log[]
        If `n` is specified, it has the same meaning as for `-M<n>`.
 
 ifndef::git-format-patch[]
---diff-filter=[ACDMRTUXB*]::
+--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]::
        Select only files that are Added (`A`), Copied (`C`),
        Deleted (`D`), Modified (`M`), Renamed (`R`), have their
        type (i.e. regular file, symlink, submodule, ...) changed (`T`),
        are Unmerged (`U`), are
        Unknown (`X`), or have had their pairing Broken (`B`).
-       Any combination of the filter characters may be used.
+       Any combination of the filter characters (including none) can be used.
        When `*` (All-or-none) is added to the combination, all
        paths are selected if there is any file that matches
        other criteria in the comparison; if there is no file
@@ -284,8 +284,12 @@ ifndef::git-format-patch[]
        appearing in diff output; see the 'pickaxe' entry in
        linkgit:gitdiffcore[7] for more details.
 
+-G<regex>::
+       Look for differences whose added or removed line matches
+       the given <regex>.
+
 --pickaxe-all::
-       When `-S` finds a change, show all the changes in that
+       When `-S` or `-G` finds a change, show all the changes in that
        changeset, not just the files that contain the change
        in <string>.
 
index 9e62f8778f6590328de4d9c0c7c08044e8019eac..51297d09ecdd3468ecd87a4f7aa6fac2b8ef6224 100644 (file)
@@ -14,7 +14,7 @@ SYNOPSIS
         [--ignore-date] [--ignore-space-change | --ignore-whitespace]
         [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
         [--reject] [-q | --quiet] [--scissors | --no-scissors]
-        [<mbox> | <Maildir>...]
+        [(<mbox> | <Maildir>)...]
 'git am' (--continue | --skip | --abort)
 
 DESCRIPTION
@@ -25,7 +25,7 @@ current branch.
 
 OPTIONS
 -------
-<mbox>|<Maildir>...::
+(<mbox>|<Maildir>)...::
        The list of mailbox files to read patches from. If you do not
        supply this argument, the command reads from the standard input.
        If you supply directories, they will be treated as Maildirs.
index 4a74b23d403d970643fcb8e0438ab6649f54e54c..881652f4904c102104cfe0a0b1de07dbfc32da3f 100644 (file)
@@ -12,10 +12,10 @@ SYNOPSIS
 'git apply' [--stat] [--numstat] [--summary] [--check] [--index]
          [--apply] [--no-add] [--build-fake-ancestor=<file>] [-R | --reverse]
          [--allow-binary-replacement | --binary] [--reject] [-z]
-         [-pNUM] [-CNUM] [--inaccurate-eof] [--recount] [--cached]
+         [-p<n>] [-C<n>] [--inaccurate-eof] [--recount] [--cached]
          [--ignore-space-change | --ignore-whitespace ]
-         [--whitespace=<nowarn|warn|fix|error|error-all>]
-         [--exclude=PATH] [--include=PATH] [--directory=<root>]
+         [--whitespace=(nowarn|warn|fix|error|error-all)]
+         [--exclude=<path>] [--include=<path>] [--directory=<root>]
          [--verbose] [<patch>...]
 
 DESCRIPTION
index 4f358c8d6c3320c5ef0a78d6c4d155535433f3d0..2411ce5bfe05a14ed45c1546c3d1a6d92b39d8eb 100644 (file)
@@ -109,7 +109,7 @@ OPTIONS
 
 Author
 ------
-Written by Martin Langhoff <martin@catalyst.net.nz>.
+Written by Martin Langhoff <martin@laptop.org>.
 
 Documentation
 --------------
index 8d3e66626f7561b0ba7f8140288cfc15167bdc14..4163a1bcb1643e7f05b6a79034ac9f63135d6ac9 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
 'git archive' [--format=<fmt>] [--list] [--prefix=<prefix>/] [<extra>]
              [-o | --output=<file>] [--worktree-attributes]
              [--remote=<repo> [--exec=<git-upload-archive>]] <tree-ish>
-             [path...]
+             [<path>...]
 
 DESCRIPTION
 -----------
@@ -73,7 +73,7 @@ OPTIONS
 <tree-ish>::
        The tree or commit to produce an archive for.
 
-path::
+<path>::
        Without an optional path parameter, all files and subdirectories
        of the current working directory are included in the archive.
        If one or more paths are specified, only these are included.
index 38e59afb34effd84da6d8a79da67e5ad3ae45c5a..6266a3a6020db72c8629ad521dfedccc9d790a03 100644 (file)
@@ -11,8 +11,8 @@ SYNOPSIS
 [verse]
 'git bundle' create <file> <git-rev-list-args>
 'git bundle' verify <file>
-'git bundle' list-heads <file> [refname...]
-'git bundle' unbundle <file> [refname...]
+'git bundle' list-heads <file> [<refname>...]
+'git bundle' unbundle <file> [<refname>...]
 
 DESCRIPTION
 -----------
@@ -68,7 +68,7 @@ unbundle <file>::
        packaged.
 
 
-[refname...]::
+[<refname>...]::
        A list of references used to limit the references reported as
        available. This is principally of use to 'git fetch', which
        expects to receive only those references asked for and not
index a3f56b07fd251cbd121c28189d1f9018b892b48e..544ba7ba218550ac1b09d9c95dc6f60ac604f7e8 100644 (file)
@@ -27,7 +27,7 @@ OPTIONS
 <object>::
        The name of the object to show.
        For a more complete list of ways to spell object names, see
-       the "SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
+       the "SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].
 
 -t::
        Instead of the content, show the object type identified by
index f5c2e0601db6782b2a8690c687611b93da935024..205d83dd0b281d59e0f53284d29846c8eb58a246 100644 (file)
@@ -49,7 +49,7 @@ git imposes the following rules on how references are named:
 These rules make it easy for shell script based tools to parse
 reference names, pathname expansion by the shell when a reference name is used
 unquoted (by mistake), and also avoids ambiguities in certain
-reference name expressions (see linkgit:gitrevisions[1]):
+reference name expressions (see linkgit:gitrevisions[7]):
 
 . A double-dot `..` is often used as in `ref1..ref2`, and in some
   contexts this notation means `{caret}ref1 ref2` (i.e. not in
index 62f9ab24c97875df6f053aa11f8f5cde56377175..0c0a9c14bc8e78ada9fb9b7174fcb90698e497a0 100644 (file)
@@ -13,7 +13,7 @@ SYNOPSIS
                   [--stage=<number>|all]
                   [--temp]
                   [-z] [--stdin]
-                  [--] [<file>]*
+                  [--] [<file>...]
 
 DESCRIPTION
 -----------
index f88e9977d1137da0449736f5f8fe6746b42437e1..22d36114df68963811a80a6c311a98b1a26d88d3 100644 (file)
@@ -45,14 +45,14 @@ successful.
 
 'git checkout' [--patch] [<tree-ish>] [--] <pathspec>...::
 
-       When <paths> or `--patch` are given, 'git checkout' *not* switch
-       branches.  It updates the named paths in the working tree from
-       the index file or from a named <tree-ish> (most often a commit).  In
-       this case, the `-b` and `--track` options are meaningless and giving
-       either of them results in an error. The <tree-ish> argument can be
-       used to specify a specific tree-ish (i.e. commit, tag or tree)
-       to update the index for the given paths before updating the
-       working tree.
+       When <paths> or `--patch` are given, 'git checkout' does *not*
+       switch branches.  It updates the named paths in the working tree
+       from the index file or from a named <tree-ish> (most often a
+       commit).  In this case, the `-b` and `--track` options are
+       meaningless and giving either of them results in an error.  The
+       <tree-ish> argument can be used to specify a specific tree-ish
+       (i.e.  commit, tag or tree) to update the index for the given
+       paths before updating the working tree.
 +
 The index may contain unmerged entries because of a previous failed merge.
 By default, if you try to check out such an entry from the index, the
index 2cef579316ba11e68d65dc4d7309f2e56a465b3d..3c96fa8c86c34df2dced6cd9ec8a391ee3b7208e 100644 (file)
@@ -21,7 +21,7 @@ OPTIONS
 <commit>...::
        Commits to cherry-pick.
        For a more complete list of ways to spell commits, see
-       linkgit:gitrevisions[1].
+       linkgit:gitrevisions[7].
        Sets of commits can be passed but no traversal is done by
        default, as if the '--no-walk' option was specified, see
        linkgit:git-rev-list[1].
index dc7d3d17b151d05827925fdcd2806945e2e278cb..ab7293351d283e7ee3a8275c534c3667d6b4d696 100644 (file)
@@ -128,7 +128,12 @@ objects from the source repository into a pack in the cloned repository.
        configuration variables are created.
 
 --mirror::
-       Set up a mirror of the remote repository.  This implies `--bare`.
+       Set up a mirror of the source repository.  This implies `--bare`.
+       Compared to `--bare`, `--mirror` not only maps local branches of the
+       source to local branches of the target, it maps all refs (including
+       remote branches, notes etc.) and sets up a refspec configuration such
+       that all these refs are overwritten by a `git remote update` in the
+       target repository.
 
 --origin <name>::
 -o <name>::
index 349366ee1e2c414aed87745d2c717ea9a2149367..5dcf4278fc497e4d72093069bdcd18b4ecff0949 100644 (file)
@@ -8,7 +8,7 @@ git-commit-tree - Create a new commit object
 
 SYNOPSIS
 --------
-'git commit-tree' <tree> [-p <parent commit>]* < changelog
+'git commit-tree' <tree> [(-p <parent commit>)...] < changelog
 
 DESCRIPTION
 -----------
index b2696efae95b20b693251a9d9785405218285084..d25661eb215c8bd2002933a48dd6ad5ea360459a 100644 (file)
@@ -114,11 +114,11 @@ $ git cherry cvshead myhead | sed -n 's/^+ //p' | xargs -l1 git cvsexportcommit
 
 Author
 ------
-Written by Martin Langhoff <martin@catalyst.net.nz> and others.
+Written by Martin Langhoff <martin@laptop.org> and others.
 
 Documentation
 --------------
-Documentation by Martin Langhoff <martin@catalyst.net.nz> and others.
+Documentation by Martin Langhoff <martin@laptop.org> and others.
 
 GIT
 ---
index f4472c61dbb297d61053ef2e8503ad7c56d06148..70cbb2cae7b60a5c6514d0990da91ed5b23e0827 100644 (file)
@@ -399,13 +399,13 @@ This program is copyright The Open University UK - 2006.
 Authors:
 
 - Martyn Smith    <martyn@catalyst.net.nz>
-- Martin Langhoff <martin@catalyst.net.nz>
+- Martin Langhoff <martin@laptop.org>
 
 with ideas and patches from participants of the git-list <git@vger.kernel.org>.
 
 Documentation
 --------------
-Documentation by Martyn Smith <martyn@catalyst.net.nz>, Martin Langhoff <martin@catalyst.net.nz>, and Matthias Urlichs <smurf@smurf.noris.de>.
+Documentation by Martyn Smith <martyn@catalyst.net.nz>, Martin Langhoff <martin@laptop.org>, and Matthias Urlichs <smurf@smurf.noris.de>.
 
 GIT
 ---
index 01c9f8eb9eff634fe8ab99908c62207ebecd5e31..2f0ddf6fe817ab7b59fb5f5276ba688447661ee3 100644 (file)
@@ -9,15 +9,15 @@ SYNOPSIS
 --------
 [verse]
 'git daemon' [--verbose] [--syslog] [--export-all]
-            [--timeout=n] [--init-timeout=n] [--max-connections=n]
-            [--strict-paths] [--base-path=path] [--base-path-relaxed]
-            [--user-path | --user-path=path]
-            [--interpolated-path=pathtemplate]
-            [--reuseaddr] [--detach] [--pid-file=file]
-            [--enable=service] [--disable=service]
-            [--allow-override=service] [--forbid-override=service]
-            [--inetd | [--listen=host_or_ipaddr] [--port=n] [--user=user [--group=group]]
-            [directory...]
+            [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]
+            [--strict-paths] [--base-path=<path>] [--base-path-relaxed]
+            [--user-path | --user-path=<path>]
+            [--interpolated-path=<pathtemplate>]
+            [--reuseaddr] [--detach] [--pid-file=<file>]
+            [--enable=<service>] [--disable=<service>]
+            [--allow-override=<service>] [--forbid-override=<service>]
+            [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>] [--user=<user> [--group=<group>]]
+            [<directory>...]
 
 DESCRIPTION
 -----------
@@ -48,7 +48,7 @@ OPTIONS
        'git daemon' will refuse to start when this option is enabled and no
        whitelist is specified.
 
---base-path=path::
+--base-path=<path>::
        Remap all the path requests as relative to the given path.
        This is sort of "GIT root" - if you run 'git daemon' with
        '--base-path=/srv/git' on example.com, then if you later try to pull
@@ -61,7 +61,7 @@ OPTIONS
        This is useful for switching to --base-path usage, while still
        allowing the old paths.
 
---interpolated-path=pathtemplate::
+--interpolated-path=<pathtemplate>::
        To support virtual hosting, an interpolated path template can be
        used to dynamically construct alternate paths.  The template
        supports %H for the target hostname as supplied by the client but
@@ -80,27 +80,27 @@ OPTIONS
        Have the server run as an inetd service. Implies --syslog.
        Incompatible with --port, --listen, --user and --group options.
 
---listen=host_or_ipaddr::
+--listen=<host_or_ipaddr>::
        Listen on a specific IP address or hostname.  IP addresses can
        be either an IPv4 address or an IPv6 address if supported.  If IPv6
        is not supported, then --listen=hostname is also not supported and
        --listen must be given an IPv4 address.
        Incompatible with '--inetd' option.
 
---port=n::
+--port=<n>::
        Listen on an alternative port.  Incompatible with '--inetd' option.
 
---init-timeout=n::
+--init-timeout=<n>::
        Timeout between the moment the connection is established and the
        client request is received (typically a rather low value, since
        that should be basically immediate).
 
---timeout=n::
+--timeout=<n>::
        Timeout for specific client sub-requests. This includes the time
        it takes for the server to process the sub-request and the time spent
        waiting for the next client's request.
 
---max-connections=n::
+--max-connections=<n>::
        Maximum number of concurrent clients, defaults to 32.  Set it to
        zero for no limit.
 
@@ -109,7 +109,7 @@ OPTIONS
        --verbose, thus by default only error conditions will be logged.
 
 --user-path::
---user-path=path::
+--user-path=<path>::
        Allow {tilde}user notation to be used in requests.  When
        specified with no parameter, requests to
        git://host/{tilde}alice/foo is taken as a request to access
@@ -129,12 +129,12 @@ OPTIONS
 --detach::
        Detach from the shell. Implies --syslog.
 
---pid-file=file::
+--pid-file=<file>::
        Save the process id in 'file'.  Ignored when the daemon
        is run under `--inetd`.
 
---user=user::
---group=group::
+--user=<user>::
+--group=<group>::
        Change daemon's uid and gid before entering the service loop.
        When only `--user` is given without `--group`, the
        primary group ID for the user is used.  The values of
@@ -145,16 +145,16 @@ Giving these options is an error when used with `--inetd`; use
 the facility of inet daemon to achieve the same before spawning
 'git daemon' if needed.
 
---enable=service::
---disable=service::
+--enable=<service>::
+--disable=<service>::
        Enable/disable the service site-wide per default.  Note
        that a service disabled site-wide can still be enabled
        per repository if it is marked overridable and the
        repository enables the service with a configuration
        item.
 
---allow-override=service::
---forbid-override=service::
+--allow-override=<service>::
+--forbid-override=<service>::
        Allow/forbid overriding the site-wide default with per
        repository configuration.  By default, all the services
        are overridable.
index 08fd4099addac3959e5aedbd1a0668367f07bb21..dd1fb32786f6f467a1c46f2643fbc54d0390f2ec 100644 (file)
@@ -23,9 +23,9 @@ tree and the index file, or the index file and the working tree.
        further add to the index but you still haven't.  You can
        stage these changes by using linkgit:git-add[1].
 +
-If exactly two paths are given, and at least one is untracked,
-compare the two files / directories. This behavior can be
-forced by --no-index.
+If exactly two paths are given and at least one points outside
+the current repository, 'git diff' will compare the two files /
+directories. This behavior can be forced by --no-index.
 
 'git diff' [--options] --cached [<commit>] [--] [<path>...]::
 
@@ -64,15 +64,16 @@ forced by --no-index.
 
 Just in case if you are doing something exotic, it should be
 noted that all of the <commit> in the above description, except
-for the last two forms that use ".." notations, can be any
-<tree-ish>.
+in the last two forms that use ".." notations, can be any
+<tree>.  The third form ('git diff <commit> <commit>') can also
+be used to compare two <blob> objects.
 
 For a more complete list of ways to spell <commit>, see
-"SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
+"SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].
 However, "diff" is about comparing two _endpoints_, not ranges,
 and the range notations ("<commit>..<commit>" and
 "<commit>\...<commit>") do not mean a range as defined in the
-"SPECIFYING RANGES" section in linkgit:gitrevisions[1].
+"SPECIFYING RANGES" section in linkgit:gitrevisions[7].
 
 OPTIONS
 -------
@@ -159,8 +160,12 @@ rewrites (very expensive).
 
 SEE ALSO
 --------
-linkgit:git-difftool[1]::
-       Show changes using common diff tools
+diff(1),
+linkgit:git-difftool[1],
+linkgit:git-log[1],
+linkgit:gitdiffcore[7],
+linkgit:git-format-patch[1],
+linkgit:git-apply[1]
 
 Author
 ------
index fcad1132767021a03a88cf084d5eaf4ae8780792..e05b686b1e4784290e40993469a2c5fab9b4ce5d 100644 (file)
@@ -96,7 +96,7 @@ marks the same across runs.
        in the commit (as opposed to just listing the files which are
        different from the commit's first parent).
 
-[git-rev-list-args...]::
+[<git-rev-list-args>...]::
        A list of arguments, acceptable to 'git rev-parse' and
        'git rev-list', that specifies the specific objects and references
        to export.  For example, `master{tilde}10..master` causes the
index 966ba4f21337e72f7be0a5b852e76a8b12192f7f..5d0c245e38ff751d8c40a6eb6d5b17b80930d526 100644 (file)
@@ -439,7 +439,7 @@ Marks must be declared (via `mark`) before they can be used.
 * A complete 40 byte or abbreviated commit SHA-1 in hex.
 
 * Any valid Git SHA-1 expression that resolves to a commit.  See
-  ``SPECIFYING REVISIONS'' in linkgit:gitrevisions[1] for details.
+  ``SPECIFYING REVISIONS'' in linkgit:gitrevisions[7] for details.
 
 The special case of restarting an incremental import from the
 current branch value should be written as:
@@ -524,6 +524,9 @@ start with double quote (`"`).
 If an `LF` or double quote must be encoded into `<path>` shell-style
 quoting should be used, e.g. `"path/with\n and \" in it"`.
 
+Additionally, in `040000` mode, `<path>` may also be an empty string
+(`""`) to specify the root of the tree.
+
 The value of `<path>` must be in canonical form. That is it must not:
 
 * contain an empty directory component (e.g. `foo//bar` is invalid),
index 400fe7f956961ba0ddf09d2dcc6e539adec7ff74..d159e88292cbab575be8153b381fffd1f4c85b6b 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
 
 'git fetch' [<options>] <group>
 
-'git fetch' --multiple [<options>] [<repository> | <group>]...
+'git fetch' --multiple [<options>] [(<repository> | <group>)...]
 
 'git fetch' --all [<options>]
 
index 020028cf9a54540f5e0e403b52e08dd2921a644e..796e7489ff7ee573a65647f4de33df932bd1bea1 100644 (file)
@@ -81,7 +81,7 @@ OPTIONS
        This filter may be used if you only need to modify the environment
        in which the commit will be performed.  Specifically, you might
        want to rewrite the author/committer name/email/time environment
-       variables (see linkgit:git-commit[1] for details).  Do not forget
+       variables (see linkgit:git-commit-tree[1] for details).  Do not forget
        to re-export the variables.
 
 --tree-filter <command>::
@@ -117,7 +117,7 @@ OPTIONS
        This is the filter for performing the commit.
        If this filter is specified, it will be called instead of the
        'git commit-tree' command, with arguments of the form
-       "<TREE_ID> [-p <PARENT_COMMIT_ID>]..." and the log message on
+       "<TREE_ID> [(-p <PARENT_COMMIT_ID>)...]" and the log message on
        stdin.  The commit id is expected on stdout.
 +
 As a special extension, the commit filter may emit multiple
@@ -159,18 +159,7 @@ to other tags will be rewritten to point to the underlying commit.
 --subdirectory-filter <directory>::
        Only look at the history which touches the given subdirectory.
        The result will contain that directory (and only that) as its
-       project root.  Implies --remap-to-ancestor.
-
---remap-to-ancestor::
-       Rewrite refs to the nearest rewritten ancestor instead of
-       ignoring them.
-+
-Normally, positive refs on the command line are only changed if the
-commit they point to was rewritten.  However, you can limit the extent
-of this rewriting by using linkgit:rev-list[1] arguments, e.g., path
-limiters.  Refs pointing to such excluded commits would then normally
-be ignored.  With this option, they are instead rewritten to point at
-the nearest ancestor that was not excluded.
+       project root. Implies <<Remap_to_ancestor>>.
 
 --prune-empty::
        Some kind of filters will generate empty commits, that left the tree
@@ -204,7 +193,18 @@ the nearest ancestor that was not excluded.
        Arguments for 'git rev-list'.  All positive refs included by
        these options are rewritten.  You may also specify options
        such as '--all', but you must use '--' to separate them from
-       the 'git filter-branch' options.
+       the 'git filter-branch' options. Implies <<Remap_to_ancestor>>.
+
+
+[[Remap_to_ancestor]]
+Remap to ancestor
+~~~~~~~~~~~~~~~~~
+
+By using linkgit:rev-list[1] arguments, e.g., path limiters, you can limit the
+set of revisions which get rewritten. However, positive refs on the command
+line are distinguished: we don't let them be excluded by such limiters. For
+this purpose, they are instead rewritten to point at the nearest ancestor that
+was not excluded.
 
 
 Examples
index 302f56b88941cfaa002a8b75c078335bf8d86276..40dba8c0a9f308064f67d8f38ce8a22b2a42a77c 100644 (file)
@@ -9,8 +9,8 @@ git-fmt-merge-msg - Produce a merge commit message
 SYNOPSIS
 --------
 [verse]
-'git fmt-merge-msg' [-m <message>] [--log | --no-log] <$GIT_DIR/FETCH_HEAD
-'git fmt-merge-msg' [-m <message>] [--log | --no-log] -F <file>
+'git fmt-merge-msg' [-m <message>] [--log[=<n>] | --no-log] <$GIT_DIR/FETCH_HEAD
+'git fmt-merge-msg' [-m <message>] [--log[=<n>] | --no-log] -F <file>
 
 DESCRIPTION
 -----------
@@ -24,10 +24,12 @@ automatically invoking 'git merge'.
 OPTIONS
 -------
 
---log::
+--log[=<n>]::
        In addition to branch names, populate the log message with
        one-line descriptions from the actual commits that are being
-       merged.
+       merged.  At most <n> commits from each merge parent will be
+       used (20 if <n> is omitted).  This overrides the `merge.log`
+       configuration variable.
 
 --no-log::
        Do not list one-line descriptions from the actual commits being
@@ -52,8 +54,10 @@ CONFIGURATION
 -------------
 
 merge.log::
-       Whether to include summaries of merged commits in newly
-       merge commit messages. False by default.
+       In addition to branch names, populate the log message with at
+       most the specified number of one-line descriptions from the
+       actual commits that are being merged.  Defaults to false, and
+       true is a synoym for 20.
 
 merge.summary::
        Synonym to `merge.log`; this is deprecated and will be removed in
index d66fd9d2314774a0b31eadb23f8c00c199276d84..fac1cf55e51ff289167270de4f248dad959741c6 100644 (file)
@@ -9,7 +9,7 @@ SYNOPSIS
 --------
 [verse]
 'git for-each-ref' [--count=<count>] [--shell|--perl|--python|--tcl]
-                  [--sort=<key>]* [--format=<format>] [<pattern>...]
+                  [(--sort=<key>)...] [--format=<format>] [<pattern>...]
 
 DESCRIPTION
 -----------
index 4b3f5ba5358da469feff4e861e69717f16e81d21..9dcafc6d4442b6db66df642e92336537395b9919 100644 (file)
@@ -39,7 +39,7 @@ There are two ways to specify which commits to operate on.
    that leads to the <since> to be output.
 
 2. Generic <revision range> expression (see "SPECIFYING
-   REVISIONS" section in linkgit:gitrevisions[1]) means the
+   REVISIONS" section in linkgit:gitrevisions[7]) means the
    commits in the specified range.
 
 The first rule takes precedence in the case of a single <commit>.  To
@@ -74,7 +74,7 @@ OPTIONS
 include::diff-options.txt[]
 
 -<n>::
-       Limits the number of patches to prepare.
+       Prepare patches from the topmost <n> commits.
 
 -o <dir>::
 --output-directory <dir>::
index f3ccc72f0d68f03cd7b3fb6a36aabc8d7c7772a1..c2bb81042c80dbf93b7a651c47fc177358132f97 100644 (file)
@@ -59,10 +59,10 @@ OPTIONS
        the newly constructed pack and index before refs can be
        updated to use objects contained in the pack.
 
---keep='why'::
+--keep=<msg>::
        Like --keep create a .keep file before moving the index into
        its final destination, but rather than creating an empty file
-       place 'why' followed by an LF into the .keep file.  The 'why'
+       place '<msg>' followed by an LF into the .keep file.  The '<msg>'
        message can later be searched for within all .keep files to
        locate any which have outlived their usefulness.
 
index 246b07ebf94394d2079c2acc3e8c1a2e6c40bba9..00d4a124c918e7548628140646f698b9e37ab87a 100644 (file)
@@ -31,7 +31,7 @@ current working directory.
 Specify the directory from which templates will be used.  (See the "TEMPLATE
 DIRECTORY" section below.)
 
---shared[={false|true|umask|group|all|world|everybody|0xxx}]::
+--shared[=(false|true|umask|group|all|world|everybody|0xxx)]::
 
 Specify that the git repository is to be shared amongst several users.  This
 allows users belonging to the same group to push into that
index c213bdbdc500b1117805bc84cb2a0f31eeff3bcd..6d40f0011b0fd297e5676c8479e46989d7f47696 100644 (file)
@@ -31,7 +31,7 @@ OPTIONS
        either <since> or <until> is omitted, it defaults to
        `HEAD`, i.e. the tip of the current branch.
        For a more complete list of ways to spell <since>
-       and <until>, see linkgit:gitrevisions[1].
+       and <until>, see linkgit:gitrevisions[7].
 
 --follow::
        Continue listing the history of a file beyond renames
index 15aee2f9532e66e46c83e4cef908c0a4f87fadd9..86abd1345178d4c5d2362509fc075de80d2fc7e3 100644 (file)
@@ -17,7 +17,7 @@ SYNOPSIS
                [--exclude-per-directory=<file>]
                [--exclude-standard]
                [--error-unmatch] [--with-tree=<tree-ish>]
-               [--full-name] [--abbrev] [--] [<file>]*
+               [--full-name] [--abbrev] [--] [<file>...]
 
 DESCRIPTION
 -----------
@@ -79,15 +79,16 @@ OPTIONS
 
 -x <pattern>::
 --exclude=<pattern>::
-       Skips files matching pattern.
-       Note that pattern is a shell wildcard pattern.
+       Skip untracked files matching pattern.
+       Note that pattern is a shell wildcard pattern. See EXCLUDE PATTERNS
+       below for more information.
 
 -X <file>::
 --exclude-from=<file>::
-       exclude patterns are read from <file>; 1 per line.
+       Read exclude patterns from <file>; 1 per line.
 
 --exclude-per-directory=<file>::
-       read additional exclude patterns that apply only to the
+       Read additional exclude patterns that apply only to the
        directory and its subdirectories in <file>.
 
 --exclude-standard::
@@ -192,7 +193,7 @@ These exclude patterns come from these places, in order:
      file containing a list of patterns.  Patterns are ordered
      in the same order they appear in the file.
 
-  3. command line flag --exclude-per-directory=<name> specifies
+  3. The command line flag --exclude-per-directory=<name> specifies
      a name of the file in each directory 'git ls-files'
      examines, normally `.gitignore`.  Files in deeper
      directories take precedence.  Patterns are ordered in the
index 1f89d3680043cc98ad39facb1f43ae770ff66e14..76ed625e7b2fe503d3fb2262371ecd4de006411f 100644 (file)
@@ -10,8 +10,8 @@ SYNOPSIS
 --------
 [verse]
 'git ls-tree' [-d] [-r] [-t] [-l] [-z]
-           [--name-only] [--name-status] [--full-name] [--full-tree] [--abbrev=[<n>]]
-           <tree-ish> [paths...]
+           [--name-only] [--name-status] [--full-name] [--full-tree] [--abbrev[=<n>]]
+           <tree-ish> [<path>...]
 
 DESCRIPTION
 -----------
@@ -19,11 +19,11 @@ Lists the contents of a given tree object, like what "/bin/ls -a" does
 in the current working directory.  Note that:
 
  - the behaviour is slightly different from that of "/bin/ls" in that the
-   'paths' denote just a list of patterns to match, e.g. so specifying
+   '<path>' denotes just a list of patterns to match, e.g. so specifying
    directory name (without '-r') will behave differently, and order of the
    arguments does not matter.
 
- - the behaviour is similar to that of "/bin/ls" in that the 'paths' is
+ - the behaviour is similar to that of "/bin/ls" in that the '<path>' is
    taken as relative to the current working directory.  E.g. when you are
    in a directory 'sub' that has a directory 'dir', you can run 'git
    ls-tree -r HEAD dir' to list the contents of the tree (that is
@@ -72,7 +72,7 @@ OPTIONS
        Do not limit the listing to the current working directory.
        Implies --full-name.
 
-paths::
+[<path>...]::
        When paths are given, show them (note that this isn't really raw
        pathnames, but rather a list of patterns to match).  Otherwise
        implicitly uses the root level of the tree as the sole path argument.
index a634485281154cb665c8168cc3469dc0f5051697..71912a19a4dcda5f2b76d1c06b4c9ef5051265e3 100644 (file)
@@ -7,7 +7,7 @@ git-mailsplit - Simple UNIX mbox splitter program
 
 SYNOPSIS
 --------
-'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] -o<directory> [--] [<mbox>|<Maildir>...]
+'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] -o<directory> [--] [(<mbox>|<Maildir>)...]
 
 DESCRIPTION
 -----------
index e4ed0161467866f731c89eb48e64453051c64281..1f75a848ba36728eeaa67e5cbbc209075393193b 100644 (file)
@@ -7,7 +7,7 @@ git-mergetool - Run merge conflict resolution tools to resolve merge conflicts
 
 SYNOPSIS
 --------
-'git mergetool' [--tool=<tool>] [-y|--no-prompt|--prompt] [<file>]...
+'git mergetool' [--tool=<tool>] [-y|--no-prompt|--prompt] [<file>...]
 
 DESCRIPTION
 -----------
index 8ed09c0b3cfc0fff2dbb8907fdc00e027c2c6d33..65eff66afe5990efc4af4f141809f355b7111bd3 100644 (file)
@@ -11,8 +11,8 @@ SYNOPSIS
 [verse]
 'git pack-objects' [-q | --progress | --all-progress] [--all-progress-implied]
        [--no-reuse-delta] [--delta-base-offset] [--non-empty]
-       [--local] [--incremental] [--window=N] [--depth=N]
-       [--revs [--unpacked | --all]*] [--stdout | base-name]
+       [--local] [--incremental] [--window=<n>] [--depth=<n>]
+       [--revs [--unpacked | --all]] [--stdout | base-name]
        [--keep-true-parents] < object-list
 
 
@@ -82,8 +82,8 @@ base-name::
        reference was included in the resulting packfile.  This
        can be useful to send new tags to native git clients.
 
---window=[N]::
---depth=[N]::
+--window=<n>::
+--depth=<n>::
        These two options affect how the objects contained in
        the pack are stored using delta compression.  The
        objects are first internally sorted by type, size and
@@ -95,10 +95,10 @@ base-name::
        times to get to the necessary object.
        The default value for --window is 10 and --depth is 50.
 
---window-memory=[N]::
+--window-memory=<n>::
        This option provides an additional limit on top of `--window`;
        the window size will dynamically scale down so as to not take
-       up more than N bytes in memory.  This is useful in
+       up more than '<n>' bytes in memory.  This is useful in
        repositories with a mix of large and small objects to not run
        out of memory with a large window, but still be able to take
        advantage of the large window for the smaller objects.  The
@@ -106,7 +106,7 @@ base-name::
        `--window-memory=0` makes memory usage unlimited, which is the
        default.
 
---max-pack-size=[N]::
+--max-pack-size=<n>::
        Maximum size of each output pack file. The size can be suffixed with
        "k", "m", or "g". The minimum size allowed is limited to 1 MiB.
        If specified,  multiple packfiles may be created.
@@ -171,7 +171,7 @@ base-name::
        wholesale enforcement of a different compression level on the
        packed data is desired.
 
---compression=[N]::
+--compression=<n>::
        Specifies compression level for newly-compressed data in the
        generated pack.  If not specified,  pack compression level is
        determined first by pack.compression,  then by core.compression,
index 020955ff5a8635e385208a6a89b1ad71125fb205..e11660a2e651b385251bef4f45dc36f212fa58bf 100644 (file)
@@ -41,7 +41,7 @@ OPTIONS[[OPTIONS]]
 +
 The <src> is often the name of the branch you would want to push, but
 it can be any arbitrary "SHA-1 expression", such as `master~4` or
-`HEAD` (see linkgit:gitrevisions[1]).
+`HEAD` (see linkgit:gitrevisions[7]).
 +
 The <dst> tells which ref on the remote side is updated with this
 push. Arbitrary expressions cannot be used here, an actual ref must
index 2e78da448f30ad260cb7683a5610f424d0c5ffea..e88e9c2d55d19844ca56bc2d5b7b683e329b6fb8 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 'git read-tree' [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>]
                [-u [--exclude-per-directory=<gitignore>] | -i]]
                [--index-output=<file>] [--no-sparse-checkout]
-               <tree-ish1> [<tree-ish2> [<tree-ish3>]]
+               (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])
 
 
 DESCRIPTION
@@ -114,6 +114,10 @@ OPTIONS
        Disable sparse checkout support even if `core.sparseCheckout`
        is true.
 
+--empty::
+       Instead of reading tree object(s) into the index, just empty
+       it.
+
 <tree-ish#>::
        The id of the tree object(s) to be read/merged.
 
index 5a0451aaf377d13590d6112a9ee8cf51e217a21d..e50bd9b68d80e9be997de80252dec5afbb7452b4 100644 (file)
@@ -40,7 +40,7 @@ see linkgit:git-log[1].
 The reflog is useful in various git commands, to specify the old value
 of a reference. For example, `HEAD@\{2\}` means "where HEAD used to be
 two moves ago", `master@\{one.week.ago\}` means "where master used to
-point to one week ago", and so on. See linkgit:gitrevisions[1] for
+point to one week ago", and so on. See linkgit:gitrevisions[7] for
 more details.
 
 To delete single entries from the reflog, use the subcommand "delete"
index 8a5842bb937a0f8f89a561566d1d7ce129edc4b0..8fc809f82b2fae71f5cf6315dec707b649931382 100644 (file)
@@ -7,7 +7,7 @@ git-relink - Hardlink common objects in local repositories
 
 SYNOPSIS
 --------
-'git relink' [--safe] <dir> [<dir>]* <master_dir>
+'git relink' [--safe] <dir>... <master_dir>
 
 DESCRIPTION
 -----------
index aa021b0cb803a9cd9f08566f6a6fe407eb025e4b..0d28febe1b44fff289b772a0e0fb6e74a010b9eb 100644 (file)
@@ -20,7 +20,7 @@ SYNOPSIS
 'git remote set-url --delete' [--push] <name> <url>
 'git remote' [-v | --verbose] 'show' [-n] <name>
 'git remote prune' [-n | --dry-run] <name>
-'git remote' [-v | --verbose] 'update' [-p | --prune] [group | remote]...
+'git remote' [-v | --verbose] 'update' [-p | --prune] [(<group> | <remote>)...]
 
 DESCRIPTION
 -----------
index 8c67d1724f705c94fb8faf6801ee2bc7cd459629..27f7865b061cc96398f7aa052d162723e1f9255e 100644 (file)
@@ -8,7 +8,7 @@ git-repack - Pack unpacked objects in a repository
 
 SYNOPSIS
 --------
-'git repack' [-a] [-A] [-d] [-f] [-l] [-n] [-q] [--window=N] [--depth=N]
+'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [--window=<n>] [--depth=<n>]
 
 DESCRIPTION
 -----------
@@ -62,6 +62,10 @@ other objects in that pack they already have locally.
        linkgit:git-pack-objects[1].
 
 -f::
+       Pass the `--no-reuse-delta` option to `git-pack-objects`, see
+       linkgit:git-pack-objects[1].
+
+-F::
        Pass the `--no-reuse-object` option to `git-pack-objects`, see
        linkgit:git-pack-objects[1].
 
@@ -76,8 +80,8 @@ other objects in that pack they already have locally.
        this repository (or a direct copy of it)
        over HTTP or FTP.  See linkgit:git-update-server-info[1].
 
---window=[N]::
---depth=[N]::
+--window=<n>::
+--depth=<n>::
        These two options affect how the objects contained in the pack are
        stored using delta compression. The objects are first internally
        sorted by type, size and optionally names and compared against the
@@ -87,10 +91,10 @@ other objects in that pack they already have locally.
        to be applied that many times to get to the necessary object.
        The default value for --window is 10 and --depth is 50.
 
---window-memory=[N]::
+--window-memory=<n>::
        This option provides an additional limit on top of `--window`;
        the window size will dynamically scale down so as to not take
-       up more than N bytes in memory.  This is useful in
+       up more than '<n>' bytes in memory.  This is useful in
        repositories with a mix of large and small objects to not run
        out of memory with a large window, but still be able to take
        advantage of the large window for the smaller objects.  The
@@ -98,7 +102,7 @@ other objects in that pack they already have locally.
        `--window-memory=0` makes memory usage unlimited, which is the
        default.
 
---max-pack-size=[N]::
+--max-pack-size=<n>::
        Maximum size of each output pack file. The size can be suffixed with
        "k", "m", or "g". The minimum size allowed is limited to 1 MiB.
        If specified,  multiple packfiles may be created.
index 9cf31485feec4b03850edb1f2f3a4b765245f4cc..fd72976371cee0fcd25e3419138eb13382dc6ab8 100644 (file)
@@ -15,17 +15,24 @@ SYNOPSIS
 DESCRIPTION
 -----------
 In the first and second form, copy entries from <commit> to the index.
-In the third form, set the current branch to <commit>, optionally
-modifying index and worktree to match.  The <commit> defaults to HEAD
+In the third form, set the current branch head (HEAD) to <commit>, optionally
+modifying index and working tree to match.  The <commit> defaults to HEAD
 in all forms.
 
 'git reset' [-q] [<commit>] [--] <paths>...::
        This form resets the index entries for all <paths> to their
-       state at the <commit>.  (It does not affect the worktree, nor
+       state at <commit>.  (It does not affect the working tree, nor
        the current branch.)
 +
 This means that `git reset <paths>` is the opposite of `git add
 <paths>`.
++
+After running `git reset <paths>` to update the index entry, you can
+use linkgit:git-checkout[1] to check the contents out of the index to
+the working tree.
+Alternatively, using linkgit:git-checkout[1] and specifying a commit, you
+can copy the contents of a path out of a commit to the index and to the
+working tree in one go.
 
 'git reset' --patch|-p [<commit>] [--] [<paths>...]::
        Interactively select hunks in the difference between the index
@@ -36,16 +43,17 @@ This means that `git reset -p` is the opposite of `git add -p` (see
 linkgit:git-add[1]).
 
 'git reset' [--<mode>] [<commit>]::
-       This form points the current branch to <commit> and then
-       updates index and working tree according to <mode>, which must
-       be one of the following:
+       This form resets the current branch head to <commit> and
+       possibly updates the index (resetting it to the tree of <commit>) and
+       the working tree depending on <mode>, which
+       must be one of the following:
 +
 --
 --soft::
-       Does not touch the index file nor the working tree at allbut
-       requires them to be in a good order. This leaves all your changed
-       files "Changes to be committed", as 'git status' would
-       put it.
+       Does not touch the index file nor the working tree at all (but
+       resets the head to <commit>, just like all modes do). This leaves
+       all your changed files "Changes to be committed", as 'git status'
+       would put it.
 
 --mixed::
        Resets the index but not the working tree (i.e., the changed files
@@ -53,22 +61,30 @@ linkgit:git-add[1]).
        been updated. This is the default action.
 
 --hard::
-       Matches the working tree and index to that of the tree being
-       switched to. Any changes to tracked files in the working tree
-       since <commit> are lost.
+       Resets the index and working tree. Any changes to tracked files in the
+       working tree since <commit> are discarded.
 
 --merge::
-       Resets the index to match the tree recorded by the named commit,
-       and updates the files that are different between the named commit
-       and the current commit in the working tree.
+       Resets the index and updates the files in the working tree that are
+       different between <commit> and HEAD, but keeps those which are
+       different between the index and working tree (i.e. which have changes
+       which have not been added).
+       If a file that is different between <commit> and the index has unstaged
+       changes, reset is aborted.
++
+In other words, --merge does something like a 'git read-tree -u -m <commit>',
+but carries forward unmerged index entries.
 
 --keep::
-       Reset the index to the given commit, keeping local changes in
-       the working tree since the current commit, while updating
-       working tree files without local changes to what appears in
-       the given commit.  If a file that is different between the
-       current commit and the given commit has local changes, reset
-       is aborted.
+       Resets the index, updates files in the working tree that are
+       different between <commit> and HEAD, but keeps those
+       which are different between HEAD and the working tree (i.e.
+       which have local changes).
+       If a file that is different between <commit> and HEAD has local changes,
+       reset is aborted.
++
+In other words, --keep does a 2-way merge between <commit> and HEAD followed by
+'git reset --mixed <commit>'.
 --
 
 If you want to undo a commit other than the latest on a branch,
@@ -184,7 +200,7 @@ tip of the current branch in ORIG_HEAD, so resetting hard to it
 brings your index file and the working tree back to that state,
 and resets the tip of the branch to that commit.
 
-Undo a merge or pull inside a dirty work tree::
+Undo a merge or pull inside a dirty working tree::
 +
 ------------
 $ git pull                         <1>
@@ -257,7 +273,7 @@ Suppose you are working on something and you commit it, and then you
 continue working a bit more, but now you think that what you have in
 your working tree should be in another branch that has nothing to do
 with what you committed previously. You can start a new branch and
-reset it while keeping the changes in your work tree.
+reset it while keeping the changes in your working tree.
 +
 ------------
 $ git tag start
@@ -294,8 +310,10 @@ In these tables, A, B, C and D are some different states of a
 file. For example, the first line of the first table means that if a
 file is in state A in the working tree, in state B in the index, in
 state C in HEAD and in state D in the target, then "git reset --soft
-target" will put the file in state A in the working tree, in state B
-in the index and in state D in HEAD.
+target" will leave the file in the working tree in state A and in the
+index in state B.  It resets (i.e. moves) the HEAD (i.e. the tip of
+the current branch, if you are on one) to "target" (which has the file
+in state D).
 
       working index HEAD target         working index HEAD
       ----------------------------------------------------
@@ -346,11 +364,11 @@ in the index and in state D in HEAD.
                                --keep   B       C     C
 
 "reset --merge" is meant to be used when resetting out of a conflicted
-merge. Any mergy operation guarantees that the work tree file that is
+merge. Any mergy operation guarantees that the working tree file that is
 involved in the merge does not have local change wrt the index before
-it starts, and that it writes the result out to the work tree. So if
+it starts, and that it writes the result out to the working tree. So if
 we see some difference between the index and the target and also
-between the index and the work tree, then it means that we are not
+between the index and the working tree, then it means that we are not
 resetting out from a state that a mergy operation left after failing
 with a conflict. That is why we disallow --merge option in this case.
 
index 173f3fc78599f268c1e483c4d1abe51e95ad0e59..8e1e32908c31ddb8cb07046a25bcdb6dd38d74f5 100644 (file)
@@ -9,10 +9,10 @@ git-rev-list - Lists commit objects in reverse chronological order
 SYNOPSIS
 --------
 [verse]
-'git rev-list' [ \--max-count=number ]
-            [ \--skip=number ]
-            [ \--max-age=timestamp ]
-            [ \--min-age=timestamp ]
+'git rev-list' [ \--max-count=<number> ]
+            [ \--skip=<number> ]
+            [ \--max-age=<timestamp> ]
+            [ \--min-age=<timestamp> ]
             [ \--sparse ]
             [ \--merges ]
             [ \--no-merges ]
@@ -21,10 +21,10 @@ SYNOPSIS
             [ \--full-history ]
             [ \--not ]
             [ \--all ]
-            [ \--branches[=pattern] ]
-            [ \--tags[=pattern] ]
-            [ \--remotes[=pattern] ]
-            [ \--glob=glob-pattern ]
+            [ \--branches[=<pattern>] ]
+            [ \--tags[=<pattern>] ]
+            [ \--remotes[=<pattern>] ]
+            [ \--glob=<glob-pattern> ]
             [ \--stdin ]
             [ \--quiet ]
             [ \--topo-order ]
@@ -37,7 +37,7 @@ SYNOPSIS
             [ \--regexp-ignore-case | -i ]
             [ \--extended-regexp | -E ]
             [ \--fixed-strings | -F ]
-            [ \--date={local|relative|default|iso|rfc|short} ]
+            [ \--date=(local|relative|default|iso|rfc|short) ]
             [ [\--objects | \--objects-edge] [ \--unpacked ] ]
             [ \--pretty | \--header ]
             [ \--bisect ]
index 341ca90c6e2b40676d4be360118176a39955b11c..4a27643c1ea0e908a0a54b84f668d5a80f6d7100 100644 (file)
@@ -95,7 +95,7 @@ OPTIONS
        unfortunately named tag "master"), and show them as full
        refnames (e.g. "refs/heads/master").
 
---abbrev-ref[={strict|loose}]::
+--abbrev-ref[=(strict|loose)]::
        A non-ambiguous short name of the objects name.
        The option core.warnAmbiguousRefs is used to select the strict
        abbreviation mode.
index b7d9ef7e4726db40f3b0d1ec9474494bb6e07dcf..f40984d144e4ca276f84fc81a74c4ae726dcf497 100644 (file)
@@ -31,7 +31,7 @@ OPTIONS
 <commit>...::
        Commits to revert.
        For a more complete list of ways to spell commit names, see
-       linkgit:gitrevisions[1].
+       linkgit:gitrevisions[7].
        Sets of commits can also be given but no traversal is done by
        default, see linkgit:git-rev-list[1] and its '--no-walk'
        option.
index c283084272090c28d5529d200a1147c9f57c639b..cde404a461fc80a97d3af392eb8520b6361a5118 100644 (file)
@@ -165,6 +165,15 @@ user is prompted for a password while the input is masked for privacy.
        are also accepted. The port can also be set with the
        'sendemail.smtpserverport' configuration variable.
 
+--smtp-server-option=<option>::
+       If set, specifies the outgoing SMTP server option to use.
+       Default value can be specified by the 'sendemail.smtpserveroption'
+       configuration option.
++
+The --smtp-server-option option must be repeated for each option you want
+to pass to the server. Likewise, different lines in the configuration files
+must be used for each option.
+
 --smtp-ssl::
        Legacy alias for '--smtp-encryption ssl'.
 
index 0f3ad811cfa41e65a3d807a5eb766ce2a66a7831..6403126a029bf43acaa219296353f7ab1f2040a0 100644 (file)
@@ -3,24 +3,30 @@ git-shell(1)
 
 NAME
 ----
-git-shell - Restricted login shell for GIT-only SSH access
+git-shell - Restricted login shell for Git-only SSH access
 
 
 SYNOPSIS
 --------
-'$(git --exec-path)/git-shell' -c <command> <argument>
+'git shell' [-c <command> <argument>]
 
 DESCRIPTION
 -----------
-This is meant to be used as a login shell for SSH accounts you want
-to restrict to GIT pull/push access only. It permits execution only
-of server-side GIT commands implementing the pull/push functionality.
-The commands can be executed only by the '-c' option; the shell is not
-interactive.
-
-Currently, only four commands are permitted to be called, 'git-receive-pack'
-'git-upload-pack' and 'git-upload-archive' with a single required argument, or
-'cvs server' (to invoke 'git-cvsserver').
+
+A login shell for SSH accounts to provide restricted Git access. When
+'-c' is given, the program executes <command> non-interactively;
+<command> can be one of 'git receive-pack', 'git upload-pack', 'git
+upload-archive', 'cvs server', or a command in COMMAND_DIR. The shell
+is started in interactive mode when no arguments are given; in this
+case, COMMAND_DIR must exist, and any of the executables in it can be
+invoked.
+
+'cvs server' is a special command which executes git-cvsserver.
+
+COMMAND_DIR is the path "$HOME/git-shell-commands". The user must have
+read and execute permissions to the directory in order to execute the
+programs in it. The programs are executed with a cwd of $HOME, and
+<argument> is parsed as a command-line string.
 
 Author
 ------
index bc1ac77495347967c941298e2da38f76d5d124c6..5cc3baf48dcbf86e976d5d4407831a6d0ceb108f 100644 (file)
@@ -44,7 +44,7 @@ OPTIONS
 --email::
        Show the email address of each author.
 
---format[='<format>']::
+--format[=<format>]::
        Instead of the commit subject, use some other information to
        describe each commit.  '<format>' can be any string accepted
        by the `--format` option of 'git log', such as '{asterisk} [%h] %s'.
index 64532633406bedb431c4c6755101ce117e71388f..3b0c88271a80ad9dfc989dcb44247479f09431bf 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
                [--current] [--color[=<when>] | --no-color] [--sparse]
                [--more=<n> | --list | --independent | --merge-base]
                [--no-name | --sha1-name] [--topics]
-               [<rev> | <glob>]...
+               [(<rev> | <glob>)...]
 
 'git show-branch' (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]
 
@@ -32,7 +32,7 @@ no <rev> nor <glob> is given on the command line.
 OPTIONS
 -------
 <rev>::
-       Arbitrary extended SHA1 expression (see linkgit:gitrevisions[1])
+       Arbitrary extended SHA1 expression (see linkgit:gitrevisions[7])
        that typically names a branch head or a tag.
 
 <glob>::
index 4696af743321d78d9e1d17115d29222f17cb4d55..be0ec189af45e1006134e5607bb76a7b6ad20699 100644 (file)
@@ -84,7 +84,11 @@ OPTIONS
 
 <pattern>...::
 
-       Show references matching one or more patterns.
+       Show references matching one or more patterns. Patterns are matched from
+       the end of the full name, and only complete parts are matched, e.g.
+       'master' matches 'refs/heads/master', 'refs/remotes/origin/master',
+       'refs/tags/jedi/master' but not 'refs/heads/mymaster' nor
+       'refs/remotes/master/jedi'.
 
 OUTPUT
 ------
index 0002bfb0455b38eecf6b29da6a2464058ba42c57..2049c60f75aeb5ae325a49e3eb3c7e7132fec193 100644 (file)
@@ -36,7 +36,7 @@ OPTIONS
 <object>...::
        The names of objects to show.
        For a more complete list of ways to spell object names, see
-       "SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
+       "SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].
 
 include::pretty-options.txt[]
 
index 4b84d08fc87c13f6db371ecc52710bd09865d784..139d314ba54c4e7897ffcf257a1fd847eb7939fa 100644 (file)
@@ -56,6 +56,8 @@ COMMANDS
        as well, they take precedence.
 --no-metadata;;
        Set the 'noMetadata' option in the [svn-remote] config.
+       This option is not recommended, please read the 'svn.noMetadata'
+       section of this manpage before using this option.
 --use-svm-props;;
        Set the 'useSvmProps' option in the [svn-remote] config.
 --use-svnsync-props;;
@@ -436,7 +438,7 @@ git rebase --onto remotes/git-svn A^ master
 OPTIONS
 -------
 
---shared[={false|true|umask|group|all|world|everybody}]::
+--shared[=(false|true|umask|group|all|world|everybody)]::
 --template=<template_directory>::
        Only used with the 'init' command.
        These are passed directly to 'git init'.
@@ -597,13 +599,22 @@ svn.noMetadata::
 svn-remote.<name>.noMetadata::
        This gets rid of the 'git-svn-id:' lines at the end of every commit.
 +
-If you lose your .git/svn/git-svn/.rev_db file, 'git svn' will not
-be able to rebuild it and you won't be able to fetch again,
-either.  This is fine for one-shot imports.
+This option can only be used for one-shot imports as 'git svn'
+will not be able to fetch again without metadata. Additionally,
+if you lose your .git/svn/**/.rev_map.* files, 'git svn' will not
+be able to rebuild them.
 +
 The 'git svn log' command will not work on repositories using
 this, either.  Using this conflicts with the 'useSvmProps'
 option for (hopefully) obvious reasons.
++
+This option is NOT recommended as it makes it difficult to track down
+old references to SVN revision numbers in existing documentation, bug
+reports and archives.  If you plan to eventually migrate from SVN to git
+and are certain about dropping SVN history, consider
+linkgit:git-filter-branch[1] instead.  filter-branch also allows
+reformating of metadata for ease-of-reading and rewriting authorship
+info for non-"svn.authorsFile" users.
 
 svn.useSvmProps::
 svn-remote.<name>.useSvmProps::
index 74d1d49dbffda60a00f6c195d77020b5ec7be979..1ca56c85aa66b96dc1774b77ba1e117d93847033 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
 'git update-index'
             [--add] [--remove | --force-remove] [--replace]
             [--refresh] [-q] [--unmerged] [--ignore-missing]
-            [--cacheinfo <mode> <object> <file>]*
+            [(--cacheinfo <mode> <object> <file>)...]
             [--chmod=(+|-)x]
             [--assume-unchanged | --no-assume-unchanged]
             [--skip-worktree | --no-skip-worktree]
@@ -21,7 +21,7 @@ SYNOPSIS
             [--info-only] [--index-info]
             [-z] [--stdin]
             [--verbose]
-            [--] [<file>]*
+            [--] [<file>...]
 
 DESCRIPTION
 -----------
@@ -144,8 +144,8 @@ you will need to handle the situation manually.
         Report what is being added and removed from index.
 
 -z::
-       Only meaningful with `--stdin`; paths are separated with
-       NUL character instead of LF.
+       Only meaningful with `--stdin` or `--index-info`; paths are
+       separated with NUL character instead of LF.
 
 \--::
        Do not interpret any more arguments as options.
index e1586c78c3d271c78bcf26827cf10ff234fcba62..51e8e0af1e7ff37ce4abfe53b6d52e9935b536a8 100644 (file)
@@ -32,19 +32,19 @@ Custom commands may also be specified.
 
 OPTIONS
 -------
--b BROWSER::
---browser=BROWSER::
-       Use the specified BROWSER. It must be in the list of supported
+-b <browser>::
+--browser=<browser>::
+       Use the specified browser. It must be in the list of supported
        browsers.
 
--t BROWSER::
---tool=BROWSER::
+-t <browser>::
+--tool=<browser>::
        Same as above.
 
--c CONF.VAR::
---config=CONF.VAR::
+-c <conf.var>::
+--config=<conf.var>::
        CONF.VAR is looked up in the git config files. If it's set,
-       then its value specify the browser that should be used.
+       then its value specifies the browser that should be used.
 
 CONFIGURATION VARIABLES
 -----------------------
index e341075078f4511d2a40dca0a2c8ae1d342e6b17..0c897df6a71ddb5e7f4e960300c2b336ede5aab2 100644 (file)
@@ -9,11 +9,11 @@ git - the stupid content tracker
 SYNOPSIS
 --------
 [verse]
-'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]
+'git' [--version] [--exec-path[=<path>]] [--html-path]
     [-p|--paginate|--no-pager] [--no-replace-objects]
-    [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]
-    [-c name=value]
-    [--help] COMMAND [ARGS]
+    [--bare] [--git-dir=<path>] [--work-tree=<path>]
+    [-c <name>=<value>]
+    [--help] <command> [<args>]
 
 DESCRIPTION
 -----------
@@ -28,7 +28,7 @@ also want to read linkgit:gitcvs-migration[7].  See
 the link:user-manual.html[Git User's Manual] for a more in-depth
 introduction.
 
-The COMMAND is either a name of a Git command (see below) or an alias
+The '<command>' is either a name of a Git command (see below) or an alias
 as defined in the configuration file (see linkgit:git-config[1]).
 
 Formatted and hyperlinked version of the latest git
@@ -44,176 +44,183 @@ 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.3.2/git.html[documentation for release 1.7.3.2]
+
+* release notes for
+  link:RelNotes/1.7.3.2.txt[1.7.3.2],
+  link:RelNotes/1.7.3.1.txt[1.7.3.1],
+  link:RelNotes/1.7.3.txt[1.7.3].
+
 * link:v1.7.2.3/git.html[documentation for release 1.7.2.3]
 
 * release notes for
-  link:RelNotes-1.7.2.3.txt[1.7.2.3],
-  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:RelNotes/1.7.2.3.txt[1.7.2.3],
+  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: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.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],
-  link:RelNotes-1.7.0.3.txt[1.7.0.3],
-  link:RelNotes-1.7.0.2.txt[1.7.0.2],
-  link:RelNotes-1.7.0.1.txt[1.7.0.1],
-  link:RelNotes-1.7.0.txt[1.7.0].
+  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],
+  link:RelNotes/1.7.0.3.txt[1.7.0.3],
+  link:RelNotes/1.7.0.2.txt[1.7.0.2],
+  link:RelNotes/1.7.0.1.txt[1.7.0.1],
+  link:RelNotes/1.7.0.txt[1.7.0].
 
 * link:v1.6.6.2/git.html[documentation for release 1.6.6.2]
 
 * release notes for
-  link:RelNotes-1.6.6.2.txt[1.6.6.2],
-  link:RelNotes-1.6.6.1.txt[1.6.6.1],
-  link:RelNotes-1.6.6.txt[1.6.6].
+  link:RelNotes/1.6.6.2.txt[1.6.6.2],
+  link:RelNotes/1.6.6.1.txt[1.6.6.1],
+  link:RelNotes/1.6.6.txt[1.6.6].
 
 * link:v1.6.5.8/git.html[documentation for release 1.6.5.8]
 
 * release notes for
-  link:RelNotes-1.6.5.8.txt[1.6.5.8],
-  link:RelNotes-1.6.5.7.txt[1.6.5.7],
-  link:RelNotes-1.6.5.6.txt[1.6.5.6],
-  link:RelNotes-1.6.5.5.txt[1.6.5.5],
-  link:RelNotes-1.6.5.4.txt[1.6.5.4],
-  link:RelNotes-1.6.5.3.txt[1.6.5.3],
-  link:RelNotes-1.6.5.2.txt[1.6.5.2],
-  link:RelNotes-1.6.5.1.txt[1.6.5.1],
-  link:RelNotes-1.6.5.txt[1.6.5].
+  link:RelNotes/1.6.5.8.txt[1.6.5.8],
+  link:RelNotes/1.6.5.7.txt[1.6.5.7],
+  link:RelNotes/1.6.5.6.txt[1.6.5.6],
+  link:RelNotes/1.6.5.5.txt[1.6.5.5],
+  link:RelNotes/1.6.5.4.txt[1.6.5.4],
+  link:RelNotes/1.6.5.3.txt[1.6.5.3],
+  link:RelNotes/1.6.5.2.txt[1.6.5.2],
+  link:RelNotes/1.6.5.1.txt[1.6.5.1],
+  link:RelNotes/1.6.5.txt[1.6.5].
 
 * link:v1.6.4.4/git.html[documentation for release 1.6.4.4]
 
 * release notes for
-  link:RelNotes-1.6.4.4.txt[1.6.4.4],
-  link:RelNotes-1.6.4.3.txt[1.6.4.3],
-  link:RelNotes-1.6.4.2.txt[1.6.4.2],
-  link:RelNotes-1.6.4.1.txt[1.6.4.1],
-  link:RelNotes-1.6.4.txt[1.6.4].
+  link:RelNotes/1.6.4.4.txt[1.6.4.4],
+  link:RelNotes/1.6.4.3.txt[1.6.4.3],
+  link:RelNotes/1.6.4.2.txt[1.6.4.2],
+  link:RelNotes/1.6.4.1.txt[1.6.4.1],
+  link:RelNotes/1.6.4.txt[1.6.4].
 
 * link:v1.6.3.4/git.html[documentation for release 1.6.3.4]
 
 * release notes for
-  link:RelNotes-1.6.3.4.txt[1.6.3.4],
-  link:RelNotes-1.6.3.3.txt[1.6.3.3],
-  link:RelNotes-1.6.3.2.txt[1.6.3.2],
-  link:RelNotes-1.6.3.1.txt[1.6.3.1],
-  link:RelNotes-1.6.3.txt[1.6.3].
+  link:RelNotes/1.6.3.4.txt[1.6.3.4],
+  link:RelNotes/1.6.3.3.txt[1.6.3.3],
+  link:RelNotes/1.6.3.2.txt[1.6.3.2],
+  link:RelNotes/1.6.3.1.txt[1.6.3.1],
+  link:RelNotes/1.6.3.txt[1.6.3].
 
 * release notes for
-  link:RelNotes-1.6.2.5.txt[1.6.2.5],
-  link:RelNotes-1.6.2.4.txt[1.6.2.4],
-  link:RelNotes-1.6.2.3.txt[1.6.2.3],
-  link:RelNotes-1.6.2.2.txt[1.6.2.2],
-  link:RelNotes-1.6.2.1.txt[1.6.2.1],
-  link:RelNotes-1.6.2.txt[1.6.2].
+  link:RelNotes/1.6.2.5.txt[1.6.2.5],
+  link:RelNotes/1.6.2.4.txt[1.6.2.4],
+  link:RelNotes/1.6.2.3.txt[1.6.2.3],
+  link:RelNotes/1.6.2.2.txt[1.6.2.2],
+  link:RelNotes/1.6.2.1.txt[1.6.2.1],
+  link:RelNotes/1.6.2.txt[1.6.2].
 
 * link:v1.6.1.3/git.html[documentation for release 1.6.1.3]
 
 * release notes for
-  link:RelNotes-1.6.1.3.txt[1.6.1.3],
-  link:RelNotes-1.6.1.2.txt[1.6.1.2],
-  link:RelNotes-1.6.1.1.txt[1.6.1.1],
-  link:RelNotes-1.6.1.txt[1.6.1].
+  link:RelNotes/1.6.1.3.txt[1.6.1.3],
+  link:RelNotes/1.6.1.2.txt[1.6.1.2],
+  link:RelNotes/1.6.1.1.txt[1.6.1.1],
+  link:RelNotes/1.6.1.txt[1.6.1].
 
 * link:v1.6.0.6/git.html[documentation for release 1.6.0.6]
 
 * release notes for
-  link:RelNotes-1.6.0.6.txt[1.6.0.6],
-  link:RelNotes-1.6.0.5.txt[1.6.0.5],
-  link:RelNotes-1.6.0.4.txt[1.6.0.4],
-  link:RelNotes-1.6.0.3.txt[1.6.0.3],
-  link:RelNotes-1.6.0.2.txt[1.6.0.2],
-  link:RelNotes-1.6.0.1.txt[1.6.0.1],
-  link:RelNotes-1.6.0.txt[1.6.0].
+  link:RelNotes/1.6.0.6.txt[1.6.0.6],
+  link:RelNotes/1.6.0.5.txt[1.6.0.5],
+  link:RelNotes/1.6.0.4.txt[1.6.0.4],
+  link:RelNotes/1.6.0.3.txt[1.6.0.3],
+  link:RelNotes/1.6.0.2.txt[1.6.0.2],
+  link:RelNotes/1.6.0.1.txt[1.6.0.1],
+  link:RelNotes/1.6.0.txt[1.6.0].
 
 * link:v1.5.6.6/git.html[documentation for release 1.5.6.6]
 
 * release notes for
-  link:RelNotes-1.5.6.6.txt[1.5.6.6],
-  link:RelNotes-1.5.6.5.txt[1.5.6.5],
-  link:RelNotes-1.5.6.4.txt[1.5.6.4],
-  link:RelNotes-1.5.6.3.txt[1.5.6.3],
-  link:RelNotes-1.5.6.2.txt[1.5.6.2],
-  link:RelNotes-1.5.6.1.txt[1.5.6.1],
-  link:RelNotes-1.5.6.txt[1.5.6].
+  link:RelNotes/1.5.6.6.txt[1.5.6.6],
+  link:RelNotes/1.5.6.5.txt[1.5.6.5],
+  link:RelNotes/1.5.6.4.txt[1.5.6.4],
+  link:RelNotes/1.5.6.3.txt[1.5.6.3],
+  link:RelNotes/1.5.6.2.txt[1.5.6.2],
+  link:RelNotes/1.5.6.1.txt[1.5.6.1],
+  link:RelNotes/1.5.6.txt[1.5.6].
 
 * link:v1.5.5.6/git.html[documentation for release 1.5.5.6]
 
 * release notes for
-  link:RelNotes-1.5.5.6.txt[1.5.5.6],
-  link:RelNotes-1.5.5.5.txt[1.5.5.5],
-  link:RelNotes-1.5.5.4.txt[1.5.5.4],
-  link:RelNotes-1.5.5.3.txt[1.5.5.3],
-  link:RelNotes-1.5.5.2.txt[1.5.5.2],
-  link:RelNotes-1.5.5.1.txt[1.5.5.1],
-  link:RelNotes-1.5.5.txt[1.5.5].
+  link:RelNotes/1.5.5.6.txt[1.5.5.6],
+  link:RelNotes/1.5.5.5.txt[1.5.5.5],
+  link:RelNotes/1.5.5.4.txt[1.5.5.4],
+  link:RelNotes/1.5.5.3.txt[1.5.5.3],
+  link:RelNotes/1.5.5.2.txt[1.5.5.2],
+  link:RelNotes/1.5.5.1.txt[1.5.5.1],
+  link:RelNotes/1.5.5.txt[1.5.5].
 
 * link:v1.5.4.7/git.html[documentation for release 1.5.4.7]
 
 * release notes for
-  link:RelNotes-1.5.4.7.txt[1.5.4.7],
-  link:RelNotes-1.5.4.6.txt[1.5.4.6],
-  link:RelNotes-1.5.4.5.txt[1.5.4.5],
-  link:RelNotes-1.5.4.4.txt[1.5.4.4],
-  link:RelNotes-1.5.4.3.txt[1.5.4.3],
-  link:RelNotes-1.5.4.2.txt[1.5.4.2],
-  link:RelNotes-1.5.4.1.txt[1.5.4.1],
-  link:RelNotes-1.5.4.txt[1.5.4].
+  link:RelNotes/1.5.4.7.txt[1.5.4.7],
+  link:RelNotes/1.5.4.6.txt[1.5.4.6],
+  link:RelNotes/1.5.4.5.txt[1.5.4.5],
+  link:RelNotes/1.5.4.4.txt[1.5.4.4],
+  link:RelNotes/1.5.4.3.txt[1.5.4.3],
+  link:RelNotes/1.5.4.2.txt[1.5.4.2],
+  link:RelNotes/1.5.4.1.txt[1.5.4.1],
+  link:RelNotes/1.5.4.txt[1.5.4].
 
 * link:v1.5.3.8/git.html[documentation for release 1.5.3.8]
 
 * release notes for
-  link:RelNotes-1.5.3.8.txt[1.5.3.8],
-  link:RelNotes-1.5.3.7.txt[1.5.3.7],
-  link:RelNotes-1.5.3.6.txt[1.5.3.6],
-  link:RelNotes-1.5.3.5.txt[1.5.3.5],
-  link:RelNotes-1.5.3.4.txt[1.5.3.4],
-  link:RelNotes-1.5.3.3.txt[1.5.3.3],
-  link:RelNotes-1.5.3.2.txt[1.5.3.2],
-  link:RelNotes-1.5.3.1.txt[1.5.3.1],
-  link:RelNotes-1.5.3.txt[1.5.3].
+  link:RelNotes/1.5.3.8.txt[1.5.3.8],
+  link:RelNotes/1.5.3.7.txt[1.5.3.7],
+  link:RelNotes/1.5.3.6.txt[1.5.3.6],
+  link:RelNotes/1.5.3.5.txt[1.5.3.5],
+  link:RelNotes/1.5.3.4.txt[1.5.3.4],
+  link:RelNotes/1.5.3.3.txt[1.5.3.3],
+  link:RelNotes/1.5.3.2.txt[1.5.3.2],
+  link:RelNotes/1.5.3.1.txt[1.5.3.1],
+  link:RelNotes/1.5.3.txt[1.5.3].
 
 * link:v1.5.2.5/git.html[documentation for release 1.5.2.5]
 
 * release notes for
-  link:RelNotes-1.5.2.5.txt[1.5.2.5],
-  link:RelNotes-1.5.2.4.txt[1.5.2.4],
-  link:RelNotes-1.5.2.3.txt[1.5.2.3],
-  link:RelNotes-1.5.2.2.txt[1.5.2.2],
-  link:RelNotes-1.5.2.1.txt[1.5.2.1],
-  link:RelNotes-1.5.2.txt[1.5.2].
+  link:RelNotes/1.5.2.5.txt[1.5.2.5],
+  link:RelNotes/1.5.2.4.txt[1.5.2.4],
+  link:RelNotes/1.5.2.3.txt[1.5.2.3],
+  link:RelNotes/1.5.2.2.txt[1.5.2.2],
+  link:RelNotes/1.5.2.1.txt[1.5.2.1],
+  link:RelNotes/1.5.2.txt[1.5.2].
 
 * link:v1.5.1.6/git.html[documentation for release 1.5.1.6]
 
 * release notes for
-  link:RelNotes-1.5.1.6.txt[1.5.1.6],
-  link:RelNotes-1.5.1.5.txt[1.5.1.5],
-  link:RelNotes-1.5.1.4.txt[1.5.1.4],
-  link:RelNotes-1.5.1.3.txt[1.5.1.3],
-  link:RelNotes-1.5.1.2.txt[1.5.1.2],
-  link:RelNotes-1.5.1.1.txt[1.5.1.1],
-  link:RelNotes-1.5.1.txt[1.5.1].
+  link:RelNotes/1.5.1.6.txt[1.5.1.6],
+  link:RelNotes/1.5.1.5.txt[1.5.1.5],
+  link:RelNotes/1.5.1.4.txt[1.5.1.4],
+  link:RelNotes/1.5.1.3.txt[1.5.1.3],
+  link:RelNotes/1.5.1.2.txt[1.5.1.2],
+  link:RelNotes/1.5.1.1.txt[1.5.1.1],
+  link:RelNotes/1.5.1.txt[1.5.1].
 
 * link:v1.5.0.7/git.html[documentation for release 1.5.0.7]
 
 * release notes for
-  link:RelNotes-1.5.0.7.txt[1.5.0.7],
-  link:RelNotes-1.5.0.6.txt[1.5.0.6],
-  link:RelNotes-1.5.0.5.txt[1.5.0.5],
-  link:RelNotes-1.5.0.3.txt[1.5.0.3],
-  link:RelNotes-1.5.0.2.txt[1.5.0.2],
-  link:RelNotes-1.5.0.1.txt[1.5.0.1],
-  link:RelNotes-1.5.0.txt[1.5.0].
+  link:RelNotes/1.5.0.7.txt[1.5.0.7],
+  link:RelNotes/1.5.0.6.txt[1.5.0.6],
+  link:RelNotes/1.5.0.5.txt[1.5.0.5],
+  link:RelNotes/1.5.0.3.txt[1.5.0.3],
+  link:RelNotes/1.5.0.2.txt[1.5.0.2],
+  link:RelNotes/1.5.0.1.txt[1.5.0.1],
+  link:RelNotes/1.5.0.txt[1.5.0].
 
 * documentation for release link:v1.4.4.4/git.html[1.4.4.4],
   link:v1.3.3/git.html[1.3.3],
@@ -246,7 +253,7 @@ help ...`.
        The <name> is expected in the same format as listed by
        'git config' (subkeys separated by dots).
 
---exec-path::
+--exec-path[=<path>]::
        Path to wherever your core git programs are installed.
        This can also be controlled by setting the GIT_EXEC_PATH
        environment variable. If no path is given, 'git' will print
@@ -489,7 +496,7 @@ HEAD::
        (i.e. the contents of `$GIT_DIR/refs/heads/<head>`).
 
 For a more complete list of ways to spell object names, see
-"SPECIFYING REVISIONS" section in linkgit:gitrevisions[1].
+"SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].
 
 
 File/Directory Structure
index e5a27d875eb63dbfeccbf5357983f5c94668ffeb..c80ca5da4387e44f42b3bfd54132efc1def881b6 100644 (file)
@@ -62,14 +62,21 @@ consults `$GIT_DIR/info/attributes` file (which has the highest
 precedence), `.gitattributes` file in the same directory as the
 path in question, and its parent directories up to the toplevel of the
 work tree (the further the directory that contains `.gitattributes`
-is from the path in question, the lower its precedence).
+is from the path in question, the lower its precedence). Finally
+global and system-wide files are considered (they have the lowest
+precedence).
 
 If you wish to affect only a single repository (i.e., to assign
-attributes to files that are particular to one user's workflow), then
+attributes to files that are particular to
+one user's workflow for that repository), then
 attributes should be placed in the `$GIT_DIR/info/attributes` file.
 Attributes which should be version-controlled and distributed to other
 repositories (i.e., attributes of interest to all users) should go into
-`.gitattributes` files.
+`.gitattributes` files. Attributes that should affect all repositories
+for a single user should be placed in a file specified by the
+`core.attributesfile` configuration option (see linkgit:git-config[1]).
+Attributes for all users on a system should be placed in the
+`$(prefix)/etc/gitattributes` file.
 
 Sometimes you would need to override an setting of an attribute
 for a path to `unspecified` state.  This can be done by listing
@@ -477,6 +484,8 @@ patterns are available:
 
 - `csharp` suitable for source code in the C# language.
 
+- `fortran` suitable for source code in the Fortran language.
+
 - `html` suitable for HTML/XHTML documents.
 
 - `java` suitable for source code in the Java language.
index 5e9c5ebba3e3239f61195155448c960cfe476463..c27d086f68432d094a0fa7c1f9da353d6d3a0513 100644 (file)
@@ -971,7 +971,7 @@ commits from the master branch.  The string inside brackets
 before the commit log message is a short name you can use to
 name the commit.  In the above example, 'master' and 'mybranch'
 are branch heads.  'master^' is the first parent of 'master'
-branch head.  Please see linkgit:gitrevisions[1] if you want to
+branch head.  Please see linkgit:gitrevisions[7] if you want to
 see more complex cases.
 
 [NOTE]
index 5d91a7e5b3a40cbf41f03a81799c162775c36607..6af29a4603de57e0040c4bcd819b831dd6649f92 100644 (file)
@@ -227,9 +227,9 @@ changes that touch a specified string, and is controlled by the
 commands.
 
 When diffcore-pickaxe is in use, it checks if there are
-filepairs whose "result" side has the specified string and
-whose "origin" side does not.  Such a filepair represents "the
-string appeared in this changeset".  It also checks for the
+filepairs whose "result" side and whose "origin" side have
+different number of specified string.  Such a filepair represents
+"the string appeared in this changeset".  It also checks for the
 opposite case that loses the specified string.
 
 When `\--pickaxe-all` is not in effect, diffcore-pickaxe leaves
index 05ac1c79f768352be8756eeb483e71f0d09131de..e21bac4f3f16a6d0c0b1ff6d3062e8464e182e7f 100644 (file)
@@ -69,7 +69,7 @@ frequently used options.
        the form "'<from>'..'<to>'" to show all revisions between '<from>' and
        back to '<to>'. Note, more advanced revision selection can be applied.
        For a more complete list of ways to spell object names, see
-       linkgit:gitrevisions[1].
+       linkgit:gitrevisions[7].
 
 <path>...::
 
index 37e67d1a14aa6f8ef5c8914054c03cc6f5cc762b..76d69a907b48a961906e0b85c59a75e9c0c8986d 100755 (executable)
@@ -6,7 +6,7 @@ for h in \
        *.txt *.html \
        howto/*.txt howto/*.html \
        technical/*.txt technical/*.html \
-       RelNotes-*.txt *.css
+       RelNotes/*.txt *.css
 do
        if test ! -f "$h"
        then
@@ -30,7 +30,7 @@ for th in \
 do
        h=`expr "$th" : "$strip_leading"'\(.*\)'`
        case "$h" in
-       index.html) continue ;;
+       RelNotes-*.txt | index.html) continue ;;
        esac
        test -f "$h" && continue
        echo >&2 "# rm -f $th"
index b72f5339704e89087992b7d6060e88f43b9d661b..92772e7c4eb8921d3b2763fe1b533c380bd2b92b 100644 (file)
@@ -7,8 +7,10 @@ merge.conflictstyle::
        marker and the original text before the `=======` marker.
 
 merge.log::
-       Whether to include summaries of merged commits in newly created
-       merge commit messages. False by default.
+       In addition to branch names, populate the log message with at
+       most the specified number of one-line descriptions from the
+       actual commits that are being merged.  Defaults to false, and
+       true is a synoym for 20.
 
 merge.renameLimit::
        The number of files to consider when performing rename detection
index 722d704ff2de1abd3d77a18ca396ba96d5cab6bc..e33e0f8e110879a0cd6fe81d97ee6044290e5cfa 100644 (file)
@@ -16,11 +16,11 @@ inspect and further tweak the merge result before committing.
 With --no-ff Generate a merge commit even if the merge
 resolved as a fast-forward.
 
---log::
+--log[=<n>]::
 --no-log::
        In addition to branch names, populate the log message with
-       one-line descriptions from the actual commits that are being
-       merged.
+       one-line descriptions from at most <n> actual commits that are being
+       merged. See also linkgit:git-fmt-merge-msg[1].
 +
 With --no-log do not list one-line descriptions from the
 actual commits being merged.
index 049313d6015758fb3e95c21fecc40e021e8aa4bd..8676e26ca20311196d069ab28c08c913271c7631 100644 (file)
@@ -52,7 +52,7 @@ no-renormalize;;
        Disables the `renormalize` option.  This overrides the
        `merge.renormalize` configuration variable.
 
-subtree[=path];;
+subtree[=<path>];;
        This option is a more advanced form of 'subtree' strategy, where
        the strategy makes a guess on how two trees must be shifted to
        match with each other when merging.  Instead, the specified path
index 9b6f3899ec28fb431c1f3969bf5bfb717c12f346..50923e2ce9a5bdc3bcabb072a67921c6cf8171c1 100644 (file)
@@ -1,5 +1,5 @@
---pretty[='<format>']::
---format='<format>'::
+--pretty[=<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 e2237ae4a0a80b0e5aa22cbb13aa5a01ce4fb891..7a42567060bc4c79e5eef00e4cc01a90c9ab39a4 100644 (file)
@@ -13,7 +13,7 @@ include::pretty-options.txt[]
 
        Synonym for `--date=relative`.
 
---date={relative,local,default,iso,rfc,short,raw}::
+--date=(relative|local|default|iso|rfc|short|raw)::
 
        Only takes effect for dates shown in human-readable format, such
        as when using "--pretty". `log.date` config variable sets a default
@@ -45,13 +45,13 @@ endif::git-rev-list[]
 
 --parents::
 
-       Print the parents of the commit.  Also enables parent
-       rewriting, see 'History Simplification' below.
+       Print also the parents of the commit (in the form "commit parent...").
+       Also enables parent rewriting, see 'History Simplification' below.
 
 --children::
 
-       Print the children of the commit.  Also enables parent
-       rewriting, see 'History Simplification' below.
+       Print also the children of the commit (in the form "commit child...").
+       Also enables parent rewriting, see 'History Simplification' below.
 
 ifdef::git-rev-list[]
 --timestamp::
@@ -246,29 +246,29 @@ endif::git-rev-list[]
        Pretend as if all the refs in `refs/` are listed on the
        command line as '<commit>'.
 
---branches[=pattern]::
+--branches[=<pattern>]::
 
        Pretend as if all the refs in `refs/heads` are listed
-       on the command line as '<commit>'. If `pattern` is given, limit
+       on the command line as '<commit>'. If '<pattern>' is given, limit
        branches to ones matching given shell glob. If pattern lacks '?',
        '*', or '[', '/*' at the end is implied.
 
---tags[=pattern]::
+--tags[=<pattern>]::
 
        Pretend as if all the refs in `refs/tags` are listed
-       on the command line as '<commit>'. If `pattern` is given, limit
+       on the command line as '<commit>'. If '<pattern>' is given, limit
        tags to ones matching given shell glob. If pattern lacks '?', '*',
        or '[', '/*' at the end is implied.
 
---remotes[=pattern]::
+--remotes[=<pattern>]::
 
        Pretend as if all the refs in `refs/remotes` are listed
-       on the command line as '<commit>'. If `pattern`is given, limit
+       on the command line as '<commit>'. If '<pattern>' is given, limit
        remote tracking branches to ones matching given shell glob.
        If pattern lacks '?', '*', or '[', '/*' at the end is implied.
 
---glob=glob-pattern::
-       Pretend as if all the refs matching shell glob `glob-pattern`
+--glob=<glob-pattern>::
+       Pretend as if all the refs matching shell glob '<glob-pattern>'
        are listed on the command line as '<commit>'. Leading 'refs/',
        is automatically prepended if missing. If pattern lacks '?', '*',
        or '[', '/*' at the end is implied.
index fe846f043ca30fdfc3bc93b2dbba75154bd38804..3d4b79c480e2c84150bee96392ee2dd2a4b7d3ea 100644 (file)
@@ -107,11 +107,13 @@ the `$GIT_DIR/refs` directory or from the `$GIT_DIR/packed-refs` file.
   found.
 
 * A colon, followed by a slash, followed by a text (e.g. `:/fix nasty bug`): this names
-  a commit whose commit message starts with the specified text.
+  a commit whose commit message matches the specified regular expression.
   This name returns the youngest matching commit which is
   reachable from any ref.  If the commit message starts with a
   '!', you have to repeat that;  the special sequence ':/!',
   followed by something else than '!' is reserved for now.
+  The regular expression can match any part of the commit message. To
+  match messages starting with a string, one can use e.g. `:/^foo`.
 
 * A suffix ':' followed by a path (e.g. `HEAD:README`); this names the blob or tree
   at the given path in the tree-ish object named by the part
index fecc4eb5b3b853f4781c769fff8337e8bb6c3500..fc56da677cb0ed3d9243bfb928686b60df213243 100644 (file)
@@ -397,7 +397,7 @@ is usually a shortcut for the HEAD branch in the repository "origin".
 For the complete list of paths which git checks for references, and
 the order it uses to decide which to choose when there are multiple
 references with the same shorthand name, see the "SPECIFYING
-REVISIONS" section of linkgit:gitrevisions[1].
+REVISIONS" section of linkgit:gitrevisions[7].
 
 [[Updating-a-repository-With-git-fetch]]
 Updating a repository with git fetch
@@ -568,7 +568,7 @@ We have seen several ways of naming commits already:
        - HEAD: refers to the head of the current branch
 
 There are many more; see the "SPECIFYING REVISIONS" section of the
-linkgit:gitrevisions[1] man page for the complete list of ways to
+linkgit:gitrevisions[7] man page for the complete list of ways to
 name revisions.  Some examples:
 
 -------------------------------------------------
@@ -909,7 +909,7 @@ commits reachable from some head but not from any tag in the repository:
 $ gitk $( git show-ref --heads ) --not  $( git show-ref --tags )
 -------------------------------------------------
 
-(See linkgit:gitrevisions[1] for explanations of commit-selecting
+(See linkgit:gitrevisions[7] for explanations of commit-selecting
 syntax such as `--not`.)
 
 [[making-a-release]]
@@ -955,7 +955,7 @@ echo "git diff --stat --summary -M v$last v$new > ../diffstat-$new"
 and then he just cut-and-pastes the output commands after verifying that
 they look OK.
 
-[[Finding-comments-With-given-Content]]
+[[Finding-commits-With-given-Content]]
 Finding commits referencing a file with given content
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -1635,7 +1635,7 @@ you've checked out.
 The reflogs are kept by default for 30 days, after which they may be
 pruned.  See linkgit:git-reflog[1] and linkgit:git-gc[1] to learn
 how to control this pruning, and see the "SPECIFYING REVISIONS"
-section of linkgit:gitrevisions[1] for details.
+section of linkgit:gitrevisions[7] for details.
 
 Note that the reflog history is very different from normal git history.
 While normal history is shared by every repository that works on the
@@ -2171,11 +2171,14 @@ $ git push mytree release
 
 Now to apply some patches from the community.  Think of a short
 snappy name for a branch to hold this patch (or related group of
-patches), and create a new branch from the current tip of Linus's
-branch:
+patches), and create a new branch from a recent stable tag of
+Linus's branch. Picking a stable base for your branch will:
+1) help you: by avoiding inclusion of unrelated and perhaps lightly
+tested changes
+2) help future bug hunters that use "git bisect" to find problems
 
 -------------------------------------------------
-$ git checkout -b speed-up-spinlocks origin
+$ git checkout -b speed-up-spinlocks v2.6.35
 -------------------------------------------------
 
 Now you apply the patch(es), run some tests, and commit the change(s).  If
@@ -2439,9 +2442,9 @@ You have performed no merges into mywork, so it is just a simple linear
 sequence of patches on top of "origin":
 
 ................................................
- o--o--o <-- origin
+ o--o--O <-- origin
         \
-         o--o--o <-- mywork
+        a--b--c <-- mywork
 ................................................
 
 Some more interesting work has been done in the upstream project, and
@@ -3850,7 +3853,7 @@ You create a commit object by giving it the tree that describes the
 state at the time of the commit, and a list of parents:
 
 -------------------------------------------------
-$ git commit-tree <tree> -p <parent> [-p <parent2> ..]
+$ git commit-tree <tree> -p <parent> [(-p <parent2>)...]
 -------------------------------------------------
 
 and then giving the reason for the commit on stdin (either through
index f6d301a10f7b57edb623de8d5a78c90f4fbc71a7..d441d88d6fbd6d98bb617e5cf5d2bd7704f86a45 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.7.2.GIT
+DEF_VER=v1.7.3.GIT
 
 LF='
 '
index 8b7c243473bf317ac06c94d53899a01dde91f500..1f1ce04edf0b87f6fdbd579052d5ccaa538e6b93 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -270,6 +270,7 @@ STRIP ?= strip
 #   infodir
 #   htmldir
 #   ETC_GITCONFIG (but not sysconfdir)
+#   ETC_GITATTRIBUTES
 # can be specified as a relative path some/where/else;
 # this is interpreted as relative to $(prefix) and "git" at
 # runtime figures out where they are based on the path to the executable.
@@ -288,9 +289,11 @@ htmldir = share/doc/git-doc
 ifeq ($(prefix),/usr)
 sysconfdir = /etc
 ETC_GITCONFIG = $(sysconfdir)/gitconfig
+ETC_GITATTRIBUTES = $(sysconfdir)/gitattributes
 else
 sysconfdir = $(prefix)/etc
 ETC_GITCONFIG = etc/gitconfig
+ETC_GITATTRIBUTES = etc/gitattributes
 endif
 lib = lib
 # DESTDIR=
@@ -390,6 +393,8 @@ SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
          $(patsubst %.py,%,$(SCRIPT_PYTHON)) \
          git-instaweb
 
+ETAGS_TARGET = TAGS
+
 # Empty...
 EXTRA_PROGRAMS =
 
@@ -982,6 +987,7 @@ ifeq ($(uname_S),IRIX)
        # NO_MMAP.  If you suspect that your compiler is not affected by this
        # issue, comment out the NO_MMAP statement.
        NO_MMAP = YesPlease
+       NO_REGEX = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
        SHELL_PATH = /usr/gnu/bin/bash
        NEEDS_LIBGEN = YesPlease
@@ -1000,6 +1006,7 @@ ifeq ($(uname_S),IRIX64)
        # NO_MMAP.  If you suspect that your compiler is not affected by this
        # issue, comment out the NO_MMAP statement.
        NO_MMAP = YesPlease
+       NO_REGEX = YesPlease
        SNPRINTF_RETURNS_BOGUS = YesPlease
        SHELL_PATH=/usr/gnu/bin/bash
        NEEDS_LIBGEN = YesPlease
@@ -1120,6 +1127,7 @@ ifneq (,$(findstring MINGW,$(uname_S)))
        NO_REGEX = YesPlease
        NO_PYTHON = YesPlease
        BLK_SHA1 = YesPlease
+       ETAGS_TARGET = ETAGS
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/fnmatch -Icompat/win32
        COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\"
        COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/winansi.o \
@@ -1463,7 +1471,7 @@ ifdef NO_REGEX
 endif
 
 ifdef USE_NED_ALLOCATOR
-       COMPAT_CFLAGS += -DUSE_NED_ALLOCATOR -DOVERRIDE_STRDUP -DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR -Icompat/nedmalloc
+       COMPAT_CFLAGS += -Icompat/nedmalloc
        COMPAT_OBJS += compat/nedmalloc/nedmalloc.o
 endif
 
@@ -1518,6 +1526,7 @@ endif
 
 SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER))
 ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC_GITCONFIG))
+ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
 
 DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
 bindir_SQ = $(subst ','\'',$(bindir))
@@ -1896,6 +1905,8 @@ builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \
 
 config.s config.o: EXTRA_CPPFLAGS = -DETC_GITCONFIG='"$(ETC_GITCONFIG_SQ)"'
 
+attr.s attr.o: EXTRA_CPPFLAGS = -DETC_GITATTRIBUTES='"$(ETC_GITATTRIBUTES_SQ)"'
+
 http.s http.o: EXTRA_CPPFLAGS = -DGIT_HTTP_USER_AGENT='"git/$(GIT_VERSION)"'
 
 ifdef NO_EXPAT
@@ -1906,6 +1917,11 @@ ifdef NO_REGEX
 compat/regex/regex.o: EXTRA_CPPFLAGS = -DGAWK -DNO_MBSUPPORT
 endif
 
+ifdef USE_NED_ALLOCATOR
+compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \
+       -DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR
+endif
+
 git-%$X: %.o $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
 
@@ -1954,11 +1970,11 @@ info:
 pdf:
        $(MAKE) -C Documentation pdf
 
-TAGS:
-       $(RM) TAGS
-       $(FIND) . -name '*.[hcS]' -print | xargs etags -a
+$(ETAGS_TARGET): FORCE
+       $(RM) $(ETAGS_TARGET)
+       $(FIND) . -name '*.[hcS]' -print | xargs etags -a -o $(ETAGS_TARGET)
 
-tags:
+tags: FORCE
        $(RM) tags
        $(FIND) . -name '*.[hcS]' -print | xargs ctags -a
 
@@ -1967,7 +1983,7 @@ cscope:
        $(FIND) . -name '*.[hcS]' -print | xargs cscope -b
 
 ### Detect prefix changes
-TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):\
+TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS)):\
              $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)
 
 GIT-CFLAGS: FORCE
@@ -2228,7 +2244,7 @@ clean:
        $(RM) $(TEST_PROGRAMS)
        $(RM) -r bin-wrappers
        $(RM) -r $(dep_dirs)
-       $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags cscope*
+       $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h $(ETAGS_TARGET) tags cscope*
        $(RM) -r autom4te.cache
        $(RM) config.log config.mak.autogen config.mak.append config.status config.cache
        $(RM) -r $(GIT_TARNAME) .doc-tmp-dir
@@ -2252,7 +2268,7 @@ endif
 
 .PHONY: all install clean strip
 .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
-.PHONY: FORCE TAGS tags cscope
+.PHONY: FORCE cscope
 
 ### Check documentation
 #
index 0e11dea6d0d1b888ddfc2825bb197aae8027d459..b942e499449d97aeb50c73ca2bdc1c6e6d528743 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes-1.7.3.txt
\ No newline at end of file
+Documentation/RelNotes/1.7.4.txt
\ No newline at end of file
index c91a29cb298a3ad792ff8745f3e8e0eb28d71678..91ca00f05f7d648fa801a36b78c749f9d691ba43 100644 (file)
--- a/abspath.c
+++ b/abspath.c
@@ -108,10 +108,14 @@ const char *make_nonrelative_path(const char *path)
                if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
                        die("Too long path: %.*s", 60, path);
        } else {
+               size_t len;
+               const char *fmt;
                const char *cwd = get_pwd_cwd();
                if (!cwd)
                        die_errno("Cannot determine the current working directory");
-               if (snprintf(buf, PATH_MAX, "%s/%s", cwd, path) >= PATH_MAX)
+               len = strlen(cwd);
+               fmt = (len > 0 && is_dir_sep(cwd[len-1])) ? "%s%s" : "%s/%s";
+               if (snprintf(buf, PATH_MAX, fmt, cwd, path) >= PATH_MAX)
                        die("Too long path: %.*s", 60, path);
        }
        return buf;
index edd68534fa847ad839fe8554e6864b39de4fcde0..f59afda6ffda02920a50cabe1eb3e764221199ba 100644 (file)
--- a/archive.c
+++ b/archive.c
@@ -7,9 +7,9 @@
 #include "unpack-trees.h"
 
 static char const * const archive_usage[] = {
-       "git archive [options] <tree-ish> [path...]",
+       "git archive [options] <tree-ish> [<path>...]",
        "git archive --list",
-       "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [path...]",
+       "git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]",
        "git archive --remote <repo> [--exec <cmd>] --list",
        NULL
 };
diff --git a/attr.c b/attr.c
index 8ba606c933088e27ac08aabb546b764745f8187e..6aff6951d38d7f672aeb9851eca88c6e5a26b950 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -1,5 +1,6 @@
 #define NO_THE_INDEX_COMPATIBILITY_MACROS
 #include "cache.h"
+#include "exec_cmd.h"
 #include "attr.h"
 
 const char git_attr__true[] = "(builtin)true";
@@ -10,6 +11,8 @@ static const char git_attr__unknown[] = "(builtin)unknown";
 #define ATTR__UNSET NULL
 #define ATTR__UNKNOWN git_attr__unknown
 
+static const char *attributes_file;
+
 /*
  * The basic design decision here is that we are not going to have
  * insanely large number of attributes.
@@ -462,6 +465,32 @@ static void drop_attr_stack(void)
        }
 }
 
+const char *git_etc_gitattributes(void)
+{
+       static const char *system_wide;
+       if (!system_wide)
+               system_wide = system_path(ETC_GITATTRIBUTES);
+       return system_wide;
+}
+
+int git_attr_system(void)
+{
+       return !git_env_bool("GIT_ATTR_NOSYSTEM", 0);
+}
+
+int git_attr_global(void)
+{
+       return !git_env_bool("GIT_ATTR_NOGLOBAL", 0);
+}
+
+static int git_attr_config(const char *var, const char *value, void *dummy)
+{
+       if (!strcmp(var, "core.attributesfile"))
+               return git_config_pathname(&attributes_file, var, value);
+
+       return 0;
+}
+
 static void bootstrap_attr_stack(void)
 {
        if (!attr_stack) {
@@ -472,6 +501,25 @@ static void bootstrap_attr_stack(void)
                elem->prev = attr_stack;
                attr_stack = elem;
 
+               if (git_attr_system()) {
+                       elem = read_attr_from_file(git_etc_gitattributes(), 1);
+                       if (elem) {
+                               elem->origin = NULL;
+                               elem->prev = attr_stack;
+                               attr_stack = elem;
+                       }
+               }
+
+               git_config(git_attr_config, NULL);
+               if (git_attr_global() && attributes_file) {
+                       elem = read_attr_from_file(attributes_file, 1);
+                       if (elem) {
+                               elem->origin = NULL;
+                               elem->prev = attr_stack;
+                               attr_stack = elem;
+                       }
+               }
+
                if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
                        elem = read_attr(GITATTRIBUTES_FILE, 1);
                        elem->origin = strdup("");
@@ -499,7 +547,9 @@ static void prepare_attr_stack(const char *path, int dirlen)
 
        /*
         * At the bottom of the attribute stack is the built-in
-        * set of attribute definitions.  Then, contents from
+        * set of attribute definitions, followed by the contents
+        * of $(prefix)/etc/gitattributes and a file specified by
+        * core.attributesfile.  Then, contents from
         * .gitattribute files from directories closer to the
         * root to the ones in deeper directories are pushed
         * to the stack.  Finally, at the very top of the stack
index 0398d247400e55f2a2ededc054902374c7516d5b..f2a25a084736e573f560672fabc9c6214997f437 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -7,14 +7,15 @@
 #include "commit.h"
 #include "notes.h"
 
+#define DEFAULT_MERGE_LOG_LEN 20
+
 extern const char git_version_string[];
 extern const char git_usage_string[];
 extern const char git_more_info_string[];
 
 extern void prune_packed_objects(int);
-extern int fmt_merge_msg(int merge_summary, struct strbuf *in,
-       struct strbuf *out);
-extern int fmt_merge_msg_shortlog(struct strbuf *in, struct strbuf *out);
+extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
+                        int merge_title, int shortlog_len);
 extern int commit_notes(struct notes_tree *t, const char *msg);
 
 struct notes_rewrite_cfg {
index 80649ba0b28846d09b49a791dd25af9a2907f75f..9b87fb9ac2505e746ae34db34740cdfb3cfde127 100644 (file)
@@ -12,8 +12,8 @@
 static const char builtin_bundle_usage[] =
   "git bundle create <file> <git-rev-list args>\n"
   "   or: git bundle verify <file>\n"
-  "   or: git bundle list-heads <file> [refname...]\n"
-  "   or: git bundle unbundle <file> [refname...]";
+  "   or: git bundle list-heads <file> [<refname>...]\n"
+  "   or: git bundle unbundle <file> [<refname>...]";
 
 int cmd_bundle(int argc, const char **argv, const char *prefix)
 {
index a7a5ee10f32d52c7555f85f2dcf6c567425488dd..65cbee0552b8e2d5ed7cfd57781031d72c1cdd98 100644 (file)
@@ -155,7 +155,7 @@ static void checkout_all(const char *prefix, int prefix_length)
 }
 
 static const char * const builtin_checkout_index_usage[] = {
-       "git checkout-index [options] [--] <file>...",
+       "git checkout-index [options] [--] [<file>...]",
        NULL
 };
 
index 560eae17159290c5adcefd2e2e2da5825ac6b75d..a54583b3a4936b341820cf5c639e5647ce456a5a 100644 (file)
@@ -691,16 +691,16 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                           "create and checkout a new branch"),
                OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
                           "create/reset and checkout a branch"),
-               OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "log for new branch"),
-               OPT_SET_INT('t', "track",  &opts.track, "track",
+               OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"),
+               OPT_SET_INT('t', "track",  &opts.track, "set upstream info for new branch",
                        BRANCH_TRACK_EXPLICIT),
                OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
-               OPT_SET_INT('2', "ours", &opts.writeout_stage, "stage",
+               OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files",
                            2),
-               OPT_SET_INT('3', "theirs", &opts.writeout_stage, "stage",
+               OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files",
                            3),
-               OPT_BOOLEAN('f', "force", &opts.force, "force"),
-               OPT_BOOLEAN('m', "merge", &opts.merge, "merge"),
+               OPT_BOOLEAN('f', "force", &opts.force, "force checkout (throw away local modifications)"),
+               OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"),
                OPT_STRING(0, "conflict", &conflict_style, "style",
                           "conflict style (merge or diff3)"),
                OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
index 87f0591c2f68a03e06c73b352282426b803450ba..d083795e26e7893c6b7d466f9bcf2be1311cfeb2 100644 (file)
@@ -9,7 +9,7 @@
 #include "builtin.h"
 #include "utf8.h"
 
-static const char commit_tree_usage[] = "git commit-tree <sha1> [-p <sha1>]* < changelog";
+static const char commit_tree_usage[] = "git commit-tree <sha1> [(-p <sha1>)...] < changelog";
 
 static void new_parent(struct commit *parent, struct commit_list **parents_p)
 {
@@ -56,10 +56,12 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
        if (strbuf_read(&buffer, 0, 0) < 0)
                die_errno("git commit-tree: failed to read");
 
-       if (!commit_tree(buffer.buf, tree_sha1, parents, commit_sha1, NULL)) {
-               printf("%s\n", sha1_to_hex(commit_sha1));
-               return 0;
-       }
-       else
+       if (commit_tree(buffer.buf, tree_sha1, parents, commit_sha1, NULL)) {
+               strbuf_release(&buffer);
                return 1;
+       }
+
+       printf("%s\n", sha1_to_hex(commit_sha1));
+       strbuf_release(&buffer);
+       return 0;
 }
index fccc9cbea38091805d656d1cbf608ae3318ea3f8..d35f000c034964ed600b1d8d45e2ef9260abcfb6 100644 (file)
@@ -16,7 +16,7 @@
 static const char * const builtin_fetch_usage[] = {
        "git fetch [<options>] [<repository> [<refspec>...]]",
        "git fetch [<options>] <group>",
-       "git fetch --multiple [<options>] [<repository> | <group>]...",
+       "git fetch --multiple [<options>] [(<repository> | <group>)...]",
        "git fetch --all [<options>]",
        NULL
 };
@@ -148,6 +148,7 @@ static struct ref *get_ref_map(struct transport *transport,
                int has_merge = branch_has_merge_config(branch);
                if (remote &&
                    (remote->fetch_refspec_nr ||
+                    /* Note: has_merge implies non-NULL branch->remote_name */
                     (has_merge && !strcmp(branch->remote_name, remote->name)))) {
                        for (i = 0; i < remote->fetch_refspec_nr; i++) {
                                get_fetch_map(remote_refs, &remote->fetch[i], &tail, 0);
@@ -162,6 +163,8 @@ static struct ref *get_ref_map(struct transport *transport,
                         * if the remote we're fetching from is the same
                         * as given in branch.<name>.remote, we add the
                         * ref given in branch.<name>.merge, too.
+                        *
+                        * Note: has_merge implies non-NULL branch->remote_name
                         */
                        if (has_merge &&
                            !strcmp(branch->remote_name, remote->name))
index e7e12eea250691a2c0d70964d1fffea0923dd292..78c77742b6e6863b1eb4d61750ae253710223aa2 100644 (file)
@@ -7,21 +7,22 @@
 #include "string-list.h"
 
 static const char * const fmt_merge_msg_usage[] = {
-       "git fmt-merge-msg [-m <message>] [--log|--no-log] [--file <file>]",
+       "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]",
        NULL
 };
 
-static int merge_summary;
+static int shortlog_len;
 
 static int fmt_merge_msg_config(const char *key, const char *value, void *cb)
 {
-       static int found_merge_log = 0;
-       if (!strcmp("merge.log", key)) {
-               found_merge_log = 1;
-               merge_summary = git_config_bool(key, value);
+       if (!strcmp(key, "merge.log") || !strcmp(key, "merge.summary")) {
+               int is_bool;
+               shortlog_len = git_config_bool_or_int(key, value, &is_bool);
+               if (!is_bool && shortlog_len < 0)
+                       return error("%s: negative length %s", key, value);
+               if (is_bool && shortlog_len)
+                       shortlog_len = DEFAULT_MERGE_LOG_LEN;
        }
-       if (!found_merge_log && !strcmp("merge.summary", key))
-               merge_summary = git_config_bool(key, value);
        return 0;
 }
 
@@ -255,9 +256,9 @@ static void do_fmt_merge_msg_title(struct strbuf *out,
                strbuf_addf(out, " into %s\n", current_branch);
 }
 
-static int do_fmt_merge_msg(int merge_title, int merge_summary,
-       struct strbuf *in, struct strbuf *out) {
-       int limit = 20, i = 0, pos = 0;
+static int do_fmt_merge_msg(int merge_title, struct strbuf *in,
+       struct strbuf *out, int shortlog_len) {
+       int i = 0, pos = 0;
        unsigned char head_sha1[20];
        const char *current_branch;
 
@@ -288,7 +289,7 @@ static int do_fmt_merge_msg(int merge_title, int merge_summary,
        if (merge_title)
                do_fmt_merge_msg_title(out, current_branch);
 
-       if (merge_summary) {
+       if (shortlog_len) {
                struct commit *head;
                struct rev_info rev;
 
@@ -303,17 +304,14 @@ static int do_fmt_merge_msg(int merge_title, int merge_summary,
 
                for (i = 0; i < origins.nr; i++)
                        shortlog(origins.items[i].string, origins.items[i].util,
-                                       head, &rev, limit, out);
+                                       head, &rev, shortlog_len, out);
        }
        return 0;
 }
 
-int fmt_merge_msg(int merge_summary, struct strbuf *in, struct strbuf *out) {
-       return do_fmt_merge_msg(1, merge_summary, in, out);
-}
-
-int fmt_merge_msg_shortlog(struct strbuf *in, struct strbuf *out) {
-       return do_fmt_merge_msg(0, 1, in, out);
+int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
+                 int merge_title, int shortlog_len) {
+       return do_fmt_merge_msg(merge_title, in, out, shortlog_len);
 }
 
 int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
@@ -321,10 +319,13 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
        const char *inpath = NULL;
        const char *message = NULL;
        struct option options[] = {
-               OPT_BOOLEAN(0, "log",     &merge_summary, "populate log with the shortlog"),
-               { OPTION_BOOLEAN, 0, "summary", &merge_summary, NULL,
+               { OPTION_INTEGER, 0, "log", &shortlog_len, "n",
+                 "populate log with at most <n> entries from shortlog",
+                 PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
+               { OPTION_INTEGER, 0, "summary", &shortlog_len, "n",
                  "alias for --log (deprecated)",
-                 PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
+                 PARSE_OPT_OPTARG | PARSE_OPT_HIDDEN, NULL,
+                 DEFAULT_MERGE_LOG_LEN },
                OPT_STRING('m', "message", &message, "text",
                        "use <text> as start of message"),
                OPT_FILENAME('F', "file", &inpath, "file to read from"),
@@ -340,12 +341,14 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
                             0);
        if (argc > 0)
                usage_with_options(fmt_merge_msg_usage, options);
-       if (message && !merge_summary) {
+       if (message && !shortlog_len) {
                char nl = '\n';
                write_in_full(STDOUT_FILENO, message, strlen(message));
                write_in_full(STDOUT_FILENO, &nl, 1);
                return 0;
        }
+       if (shortlog_len < 0)
+               die("Negative --log=%d", shortlog_len);
 
        if (inpath && strcmp(inpath, "-")) {
                in = fopen(inpath, "r");
@@ -355,12 +358,13 @@ int cmd_fmt_merge_msg(int argc, const char **argv, const char *prefix)
 
        if (strbuf_read(&input, fileno(in), 0) < 0)
                die_errno("could not read input file");
-       if (message) {
+
+       if (message)
                strbuf_addstr(&output, message);
-               ret = fmt_merge_msg_shortlog(&input, &output);
-       } else {
-               ret = fmt_merge_msg(merge_summary, &input, &output);
-       }
+       ret = fmt_merge_msg(&input, &output,
+                           message ? 0 : 1,
+                           shortlog_len);
+
        if (ret)
                return ret;
        write_in_full(STDOUT_FILENO, output.buf, output.len);
index da32f3df34da7af3cdcb0a9dd6aa66061bdfe927..3d5f6ace97b806fd7dba9f8c5d62abcdbd903681 100644 (file)
@@ -24,7 +24,7 @@
 #endif
 
 static char const * const grep_usage[] = {
-       "git grep [options] [-e] <pattern> [<rev>...] [[--] path...]",
+       "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
        NULL
 };
 
index 2e680d7a7ac3495c9d6bd10e0fa6a6ae28bb8670..8dc5c0b5410d4bb57607bab690126f22d954dd7a 100644 (file)
@@ -11,7 +11,7 @@
 #include "exec_cmd.h"
 
 static const char index_pack_usage[] =
-"git index-pack [-v] [-o <index-file>] [{ --keep | --keep=<msg> }] [--strict] { <pack-file> | --stdin [--fix-thin] [<pack-file>] }";
+"git index-pack [-v] [-o <index-file>] [ --keep | --keep=<msg> ] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
 
 struct object_entry
 {
@@ -161,7 +161,7 @@ static void use(int bytes)
        input_offset += bytes;
 
        /* make sure off_t is sufficiently large not to wrap */
-       if (consumed_bytes > consumed_bytes + bytes)
+       if (signed_add_overflows(consumed_bytes, bytes))
                die("pack too large for current definition of off_t");
        consumed_bytes += bytes;
 }
index 0271285fad6ad532a6133838f7188498476fd77b..9d4886c71675f2bc50671ea284875ebae9a34735 100644 (file)
@@ -294,11 +294,26 @@ static int create_default_files(const char *template_path)
        return reinit;
 }
 
+static void create_object_directory(void)
+{
+       const char *object_directory = get_object_directory();
+       int len = strlen(object_directory);
+       char *path = xmalloc(len + 40);
+
+       memcpy(path, object_directory, len);
+
+       safe_create_dir(object_directory, 1);
+       strcpy(path+len, "/pack");
+       safe_create_dir(path, 1);
+       strcpy(path+len, "/info");
+       safe_create_dir(path, 1);
+
+       free(path);
+}
+
 int init_db(const char *template_dir, unsigned int flags)
 {
-       const char *sha1_dir;
-       char *path;
-       int len, reinit;
+       int reinit;
 
        safe_create_dir(get_git_dir(), 0);
 
@@ -313,16 +328,7 @@ int init_db(const char *template_dir, unsigned int flags)
 
        reinit = create_default_files(template_dir);
 
-       sha1_dir = get_object_directory();
-       len = strlen(sha1_dir);
-       path = xmalloc(len + 40);
-       memcpy(path, sha1_dir, len);
-
-       safe_create_dir(sha1_dir, 1);
-       strcpy(path+len, "/pack");
-       safe_create_dir(path, 1);
-       strcpy(path+len, "/info");
-       safe_create_dir(path, 1);
+       create_object_directory();
 
        if (shared_repository) {
                char buf[10];
index eaa1ee0fa71a344af747dec038c6a5907c8273a5..22d12903ac06597979f30d0fd94267fc543afa29 100644 (file)
@@ -1056,8 +1056,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
        rev.commit_format = CMIT_FMT_EMAIL;
        rev.verbose_header = 1;
        rev.diff = 1;
-       rev.combine_merges = 0;
-       rev.ignore_merges = 1;
+       rev.no_merges = 1;
        DIFF_OPT_SET(&rev.diffopt, RECURSIVE);
        rev.subject_prefix = fmt_patch_subject_prefix;
        memset(&s_r_opt, 0, sizeof(s_r_opt));
@@ -1228,10 +1227,6 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
                        continue;
                }
 
-               /* ignore merges */
-               if (commit->parents && commit->parents->next)
-                       continue;
-
                if (ignore_if_in_upstream &&
                                has_commit_patch_id(commit, &ids))
                        continue;
index bb4f612b3d48c453d551f251b65887beb283ec7b..6a307ab784a25c9f8d201392f79c7146a4a8eece 100644 (file)
@@ -424,7 +424,7 @@ int report_path_error(const char *ps_matched, const char **pathspec, int prefix_
 }
 
 static const char * const ls_files_usage[] = {
-       "git ls-files [options] [<file>]*",
+       "git ls-files [options] [<file>...]",
        NULL
 };
 
index dc86b0d9a997f98ad43ca2897055a92b8a3eb7d0..f73e6bd9626a0e929a513fed1fd1227c28732ec7 100644 (file)
@@ -24,7 +24,7 @@ static int chomp_prefix;
 static const char *ls_tree_prefix;
 
 static const  char * const ls_tree_usage[] = {
-       "git ls-tree [<options>] <tree-ish> [path...]",
+       "git ls-tree [<options>] <tree-ish> [<path>...]",
        NULL
 };
 
@@ -52,6 +52,8 @@ static int show_recursive(const char *base, int baselen, const char *pathname)
                speclen = strlen(spec);
                if (speclen <= len)
                        continue;
+               if (spec[len] && spec[len] != '/')
+                       continue;
                if (memcmp(pathname, spec, len))
                        continue;
                return 1;
index 99654d02221c13ff98f268ad2dee99f16e794750..2d4327801e4f7766328389311c87dd63d4c5f8e4 100644 (file)
@@ -10,7 +10,7 @@
 #include "strbuf.h"
 
 static const char git_mailsplit_usage[] =
-"git mailsplit [-d<prec>] [-f<n>] [-b] [--keep-cr] -o<directory> [<mbox>|<Maildir>...]";
+"git mailsplit [-d<prec>] [-f<n>] [-b] [--keep-cr] -o<directory> [(<mbox>|<Maildir>)...]";
 
 static int is_from_line(const char *line, int len)
 {
index 5f65c0c8a6eacd4c6d05602ad9de2821ec62a034..2dba3b9901cbdca9aee279339ecd3537e15e39da 100644 (file)
@@ -42,7 +42,7 @@ static const char * const builtin_merge_usage[] = {
        NULL
 };
 
-static int show_diffstat = 1, option_log, squash;
+static int show_diffstat = 1, shortlog_len, squash;
 static int option_commit = 1, allow_fast_forward = 1;
 static int fast_forward_only;
 static int allow_trivial = 1, have_message;
@@ -177,8 +177,9 @@ static struct option builtin_merge_options[] = {
        OPT_BOOLEAN(0, "stat", &show_diffstat,
                "show a diffstat at the end of the merge"),
        OPT_BOOLEAN(0, "summary", &show_diffstat, "(synonym to --stat)"),
-       OPT_BOOLEAN(0, "log", &option_log,
-               "add list of one-line log to merge commit message"),
+       { OPTION_INTEGER, 0, "log", &shortlog_len, "n",
+         "add (at most <n>) entries from shortlog to merge commit message",
+         PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
        OPT_BOOLEAN(0, "squash", &squash,
                "create a single commit instead of doing a merge"),
        OPT_BOOLEAN(0, "commit", &option_commit,
@@ -504,10 +505,17 @@ static int git_merge_config(const char *k, const char *v, void *cb)
                return git_config_string(&pull_twohead, k, v);
        else if (!strcmp(k, "pull.octopus"))
                return git_config_string(&pull_octopus, k, v);
-       else if (!strcmp(k, "merge.log") || !strcmp(k, "merge.summary"))
-               option_log = git_config_bool(k, v);
        else if (!strcmp(k, "merge.renormalize"))
                option_renormalize = git_config_bool(k, v);
+       else if (!strcmp(k, "merge.log") || !strcmp(k, "merge.summary")) {
+               int is_bool;
+               shortlog_len = git_config_bool_or_int(k, v, &is_bool);
+               if (!is_bool && shortlog_len < 0)
+                       return error("%s: negative length %s", k, v);
+               if (is_bool && shortlog_len)
+                       shortlog_len = DEFAULT_MERGE_LOG_LEN;
+               return 0;
+       }
        return git_diff_ui_config(k, v, cb);
 }
 
@@ -1012,14 +1020,12 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
                for (i = 0; i < argc; i++)
                        merge_name(argv[i], &merge_names);
 
-               if (have_message && option_log)
-                       fmt_merge_msg_shortlog(&merge_names, &merge_msg);
-               else if (!have_message)
-                       fmt_merge_msg(option_log, &merge_names, &merge_msg);
-
-
-               if (!(have_message && !option_log) && merge_msg.len)
-                       strbuf_setlen(&merge_msg, merge_msg.len-1);
+               if (!have_message || shortlog_len) {
+                       fmt_merge_msg(&merge_names, &merge_msg, !have_message,
+                                     shortlog_len);
+                       if (merge_msg.len)
+                               strbuf_setlen(&merge_msg, merge_msg.len - 1);
+               }
        }
 
        if (head_invalid || !argc)
index 0e8167311884d38c48a9421bf8aede89e7f2c22d..f8eba53c82242d0c435524ab9ffab70ba2e2d5ad 100644 (file)
 #endif
 
 static const char pack_usage[] =
-  "git pack-objects [{ -q | --progress | --all-progress }]\n"
+  "git pack-objects [ -q | --progress | --all-progress ]\n"
   "        [--all-progress-implied]\n"
-  "        [--max-pack-size=N] [--local] [--incremental]\n"
-  "        [--window=N] [--window-memory=N] [--depth=N]\n"
+  "        [--max-pack-size=<n>] [--local] [--incremental]\n"
+  "        [--window=<n>] [--window-memory=<n>] [--depth=<n>]\n"
   "        [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset]\n"
-  "        [--threads=N] [--non-empty] [--revs [--unpacked | --all]*]\n"
+  "        [--threads=<n>] [--non-empty] [--revs [--unpacked | --all]]\n"
   "        [--reflog] [--stdout | base-name] [--include-tag]\n"
-  "        [--keep-unreachable | --unpack-unreachable \n"
-  "        [<ref-list | <object-list]";
+  "        [--keep-unreachable | --unpack-unreachable]\n"
+  "        [< ref-list | < object-list]";
 
 struct object_entry {
        struct pack_idx_entry idx;
@@ -431,7 +431,7 @@ static int write_one(struct sha1file *f,
        written_list[nr_written++] = &e->idx;
 
        /* make sure off_t is sufficiently large not to wrap */
-       if (*offset > *offset + size)
+       if (signed_add_overflows(*offset, size))
                die("pack too large for current definition of off_t");
        *offset += size;
        return 1;
index 9ad1e66916545dd2aeeb110661e56edfa5921019..eb1e3e7467ac722f4b6cc1da03f7671d21abc676 100644 (file)
@@ -16,6 +16,7 @@
 #include "resolve-undo.h"
 
 static int nr_trees;
+static int read_empty;
 static struct tree *trees[MAX_UNPACK_TREES];
 
 static int list_tree(unsigned char *sha1)
@@ -32,7 +33,7 @@ static int list_tree(unsigned char *sha1)
 }
 
 static const char * const read_tree_usage[] = {
-       "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] <tree-ish1> [<tree-ish2> [<tree-ish3>]]",
+       "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])",
        NULL
 };
 
@@ -106,6 +107,8 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                { OPTION_CALLBACK, 0, "index-output", NULL, "FILE",
                  "write resulting index to <FILE>",
                  PARSE_OPT_NONEG, index_output_cb },
+               OPT_SET_INT(0, "empty", &read_empty,
+                           "only empty the index", 1),
                OPT__VERBOSE(&opts.verbose_update),
                OPT_GROUP("Merging"),
                OPT_SET_INT('m', NULL, &opts.merge,
@@ -166,6 +169,11 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
                        die("failed to unpack tree object %s", arg);
                stage++;
        }
+       if (nr_trees == 0 && !read_empty)
+               warning("read-tree: emptying the index with no arguments is deprecated; use --empty");
+       else if (nr_trees > 0 && read_empty)
+               die("passing trees as arguments contradicts --empty");
+
        if (1 < opts.index_only + opts.update)
                die("-u and -i at the same time makes no sense");
        if ((opts.update||opts.index_only) && !opts.merge)
index 48e0a6bf260cab18d44058ade554e3a9d5946b93..e9a6e09257f445b1c26833dd9fae89518369daa7 100644 (file)
@@ -15,7 +15,7 @@ static const char * const builtin_remote_usage[] = {
        "git remote set-head <name> (-a | -d | <branch>)",
        "git remote [-v | --verbose] show [-n] <name>",
        "git remote prune [-n | --dry-run] <name>",
-       "git remote [-v | --verbose] update [-p | --prune] [group | remote]",
+       "git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]",
        "git remote set-branches <name> [--add] <branch>...",
        "git remote set-url <name> <newurl> [<oldurl>]",
        "git remote set-url --add <name> <newurl>",
index efe9360e2fdb9aac3bae0c61c85531041f24708a..158ce1111af12db1445d82cfa5728bc19837570d 100644 (file)
@@ -11,9 +11,9 @@
 static const char rev_list_usage[] =
 "git rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
 "  limiting output:\n"
-"    --max-count=nr\n"
-"    --max-age=epoch\n"
-"    --min-age=epoch\n"
+"    --max-count=<n>\n"
+"    --max-age=<epoch>\n"
+"    --min-age=<epoch>\n"
 "    --sparse\n"
 "    --no-merges\n"
 "    --remove-empty\n"
@@ -33,7 +33,7 @@ static const char rev_list_usage[] =
 "    --objects | --objects-edge\n"
 "    --unpacked\n"
 "    --header | --pretty\n"
-"    --abbrev=nr | --no-abbrev\n"
+"    --abbrev=<n> | --no-abbrev\n"
 "    --abbrev-commit\n"
 "    --left-right\n"
 "  special purpose:\n"
index 4b47ace36b51566acb5b748f679070f02cbbf568..57b51e4a0e148062e1945d640b81559d65e4c2ba 100644 (file)
@@ -442,7 +442,7 @@ static int do_pick_commit(void)
        else
                parent = commit->parents->item;
 
-       if (allow_ff && !hashcmp(parent->object.sha1, head))
+       if (allow_ff && parent && !hashcmp(parent->object.sha1, head))
                return fast_forward_to(commit->object.sha1, head);
 
        if (parent && parse_commit(parent) < 0)
index e8719aa9e9f47c30b697332925fcdd206fdfd55c..8663ccaa99299447a42da64f9f2c77f772996902 100644 (file)
@@ -6,7 +6,7 @@
 #include "parse-options.h"
 
 static const char* show_branch_usage[] = {
-    "git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [<rev> | <glob>]...",
+    "git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]",
     "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]",
     NULL
 };
index 685566e0b5e458c510fdf989744d63dda29e28f0..f63973c9143c4109a3d1e40df9ec66a32498fe00 100644 (file)
@@ -83,7 +83,7 @@ static void use(int bytes)
        offset += bytes;
 
        /* make sure off_t is sufficiently large not to wrap */
-       if (consumed_bytes > consumed_bytes + bytes)
+       if (signed_add_overflows(consumed_bytes, bytes))
                die("pack too large for current definition of off_t");
        consumed_bytes += bytes;
 }
index 3ab214d24e537865875d6d1e3acd8cf6b019ff22..62d9f3f0fa358058fcf54e4fcbd4c3101b1279db 100644 (file)
@@ -398,7 +398,7 @@ static void read_index_info(int line_termination)
 }
 
 static const char update_index_usage[] =
-"git update-index [-q] [--add] [--replace] [--remove] [--unmerged] [--refresh] [--really-refresh] [--cacheinfo] [--chmod=(+|-)x] [--assume-unchanged] [--skip-worktree|--no-skip-worktree] [--info-only] [--force-remove] [--stdin] [--index-info] [--unresolve] [--again | -g] [--ignore-missing] [-z] [--verbose] [--] <file>...";
+"git update-index [-q] [--add] [--replace] [--remove] [--unmerged] [--refresh] [--really-refresh] [--cacheinfo] [--chmod=(+|-)x] [--assume-unchanged] [--skip-worktree|--no-skip-worktree] [--info-only] [--force-remove] [--stdin] [--index-info] [--unresolve] [--again | -g] [--ignore-missing] [-z] [--verbose] [--] [<file>...]";
 
 static unsigned char head_sha1[20];
 static unsigned char merge_head_sha1[20];
index ff97adcb891caf98dcc655e71e29eaec5dae0135..65ea26bdb8c2cef671030c3a62d87d84612e8144 100644 (file)
--- a/bundle.c
+++ b/bundle.c
@@ -372,8 +372,10 @@ int create_bundle(struct bundle_header *header, const char *path,
        close(rls.in);
        if (finish_command(&rls))
                return error ("pack-objects died");
-       if (!bundle_to_stdout)
-               commit_lock_file(&lock);
+       if (!bundle_to_stdout) {
+               if (commit_lock_file(&lock))
+                       die_errno("cannot create '%s'", path);
+       }
        return 0;
 }
 
diff --git a/cache.h b/cache.h
index 2ef2fa3a5e166d94e5e981ca7c76afad13236e7e..33decd942d4985c8efc1c75fd3fa2f4adf4a56ca 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -277,9 +277,16 @@ static inline int ce_to_dtype(const struct cache_entry *ce)
        else
                return DT_UNKNOWN;
 }
-#define canon_mode(mode) \
-       (S_ISREG(mode) ? (S_IFREG | ce_permissions(mode)) : \
-       S_ISLNK(mode) ? S_IFLNK : S_ISDIR(mode) ? S_IFDIR : S_IFGITLINK)
+static inline unsigned int canon_mode(unsigned int mode)
+{
+       if (S_ISREG(mode))
+               return S_IFREG | ce_permissions(mode);
+       if (S_ISLNK(mode))
+               return S_IFLNK;
+       if (S_ISDIR(mode))
+               return S_IFDIR;
+       return S_IFGITLINK;
+}
 
 #define flexible_size(STRUCT,len) ((offsetof(struct STRUCT,name) + (len) + 8) & ~7)
 #define cache_entry_size(len) flexible_size(cache_entry,len)
@@ -438,7 +445,7 @@ extern int init_db(const char *template_dir, unsigned int flags);
  * at least 'nr' entries; the number of entries currently allocated
  * is 'alloc', using the standard growing factor alloc_nr() macro.
  *
- * DO NOT USE any expression with side-effect for 'x' or 'alloc'.
+ * DO NOT USE any expression with side-effect for 'x', 'nr', or 'alloc'.
  */
 #define ALLOC_GROW(x, nr, alloc) \
        do { \
index f2d9e1fd974b7271366da09370e10fafd2c50f08..6590f33cc8157f61ff7b6e0f6330bacf465ad39c 100644 (file)
@@ -127,7 +127,7 @@ int mingw_open (const char *filename, int oflags, ...)
        mode = va_arg(args, int);
        va_end(args);
 
-       if (!strcmp(filename, "/dev/null"))
+       if (filename && !strcmp(filename, "/dev/null"))
                filename = "nul";
 
        fd = open(filename, oflags, mode);
@@ -160,7 +160,7 @@ ssize_t mingw_write(int fd, const void *buf, size_t count)
 #undef fopen
 FILE *mingw_fopen (const char *filename, const char *otype)
 {
-       if (!strcmp(filename, "/dev/null"))
+       if (filename && !strcmp(filename, "/dev/null"))
                filename = "nul";
        return fopen(filename, otype);
 }
@@ -192,8 +192,11 @@ static inline time_t filetime_to_time_t(const FILETIME *ft)
 /* We keep the do_lstat code in a separate function to avoid recursion.
  * When a path ends with a slash, the stat will fail with ENOENT. In
  * this case, we strip the trailing slashes and stat again.
+ *
+ * If follow is true then act like stat() and report on the link
+ * target. Otherwise report on the link itself.
  */
-static int do_lstat(const char *file_name, struct stat *buf)
+static int do_lstat(int follow, const char *file_name, struct stat *buf)
 {
        WIN32_FILE_ATTRIBUTE_DATA fdata;
 
@@ -209,6 +212,25 @@ static int do_lstat(const char *file_name, struct stat *buf)
                buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
                buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
                buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
+               if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
+                       WIN32_FIND_DATAA findbuf;
+                       HANDLE handle = FindFirstFileA(file_name, &findbuf);
+                       if (handle != INVALID_HANDLE_VALUE) {
+                               if ((findbuf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
+                                               (findbuf.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) {
+                                       if (follow) {
+                                               char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
+                                               buf->st_size = readlink(file_name, buffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
+                                       } else {
+                                               buf->st_mode = S_IFLNK;
+                                       }
+                                       buf->st_mode |= S_IREAD;
+                                       if (!(findbuf.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
+                                               buf->st_mode |= S_IWRITE;
+                               }
+                               FindClose(handle);
+                       }
+               }
                return 0;
        }
        return -1;
@@ -220,12 +242,12 @@ static int do_lstat(const char *file_name, struct stat *buf)
  * complete. Note that Git stat()s are redirected to mingw_lstat()
  * too, since Windows doesn't really handle symlinks that well.
  */
-int mingw_lstat(const char *file_name, struct stat *buf)
+static int do_stat_internal(int follow, const char *file_name, struct stat *buf)
 {
        int namelen;
        static char alt_name[PATH_MAX];
 
-       if (!do_lstat(file_name, buf))
+       if (!do_lstat(follow, file_name, buf))
                return 0;
 
        /* if file_name ended in a '/', Windows returned ENOENT;
@@ -244,7 +266,16 @@ int mingw_lstat(const char *file_name, struct stat *buf)
 
        memcpy(alt_name, file_name, namelen);
        alt_name[namelen] = 0;
-       return do_lstat(alt_name, buf);
+       return do_lstat(follow, alt_name, buf);
+}
+
+int mingw_lstat(const char *file_name, struct stat *buf)
+{
+       return do_stat_internal(0, file_name, buf);
+}
+int mingw_stat(const char *file_name, struct stat *buf)
+{
+       return do_stat_internal(1, file_name, buf);
 }
 
 #undef fstat
@@ -873,6 +904,11 @@ void mingw_execvp(const char *cmd, char *const *argv)
        free_path_split(path);
 }
 
+void mingw_execv(const char *cmd, char *const *argv)
+{
+       mingw_execve(cmd, argv, environ);
+}
+
 static char **copy_environ(void)
 {
        char **env;
@@ -1386,6 +1422,7 @@ void mingw_open_html(const char *unixpath)
                        const char *, const char *, const char *, INT);
        T ShellExecute;
        HMODULE shell32;
+       int r;
 
        shell32 = LoadLibrary("shell32.dll");
        if (!shell32)
@@ -1395,9 +1432,12 @@ void mingw_open_html(const char *unixpath)
                die("cannot run browser");
 
        printf("Launching default browser to display HTML ...\n");
-       ShellExecute(NULL, "open", htmlpath, NULL, "\\", 0);
-
+       r = (int)ShellExecute(NULL, "open", htmlpath, NULL, "\\", SW_SHOWNORMAL);
        FreeLibrary(shell32);
+       /* see the MSDN documentation referring to the result codes here */
+       if (r <= 32) {
+               die("failed to launch browser for %.*s", MAX_PATH, unixpath);
+       }
 }
 
 int link(const char *oldpath, const char *newpath)
index 3b2477be5f658be665f19a12b48cc47fa07d1c6b..83e35e833b7f214e5d10a3e74a75fb17d80c2e13 100644 (file)
@@ -6,17 +6,30 @@
  */
 
 typedef int pid_t;
+typedef int uid_t;
 #define hstrerror strerror
 
 #define S_IFLNK    0120000 /* Symbolic link */
 #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK)
 #define S_ISSOCK(x) 0
+
+#ifndef _STAT_H_
+#define S_IRUSR 0
+#define S_IWUSR 0
+#define S_IXUSR 0
+#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
+#endif
 #define S_IRGRP 0
 #define S_IWGRP 0
 #define S_IXGRP 0
-#define S_ISGID 0
+#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
 #define S_IROTH 0
+#define S_IWOTH 0
 #define S_IXOTH 0
+#define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
+#define S_ISUID 0
+#define S_ISGID 0
+#define S_ISVTX 0
 
 #define WIFEXITED(x) 1
 #define WIFSIGNALED(x) 0
@@ -65,6 +78,12 @@ struct itimerval {
 };
 #define ITIMER_REAL 0
 
+/*
+ * sanitize preprocessor namespace polluted by Windows headers defining
+ * macros which collide with git local versions
+ */
+#undef HELP_COMMAND /* from winuser.h */
+
 /*
  * trivial stubs
  */
@@ -75,17 +94,17 @@ static inline int symlink(const char *oldpath, const char *newpath)
 { errno = ENOSYS; return -1; }
 static inline int fchmod(int fildes, mode_t mode)
 { errno = ENOSYS; return -1; }
-static inline int fork(void)
+static inline pid_t fork(void)
 { errno = ENOSYS; return -1; }
 static inline unsigned int alarm(unsigned int seconds)
 { return 0; }
 static inline int fsync(int fd)
 { return _commit(fd); }
-static inline int getppid(void)
+static inline pid_t getppid(void)
 { return 1; }
 static inline void sync(void)
 {}
-static inline int getuid()
+static inline uid_t getuid(void)
 { return 1; }
 static inline struct passwd *getpwnam(const char *name)
 { return NULL; }
@@ -117,7 +136,7 @@ static inline int mingw_unlink(const char *pathname)
 }
 #define unlink mingw_unlink
 
-static inline int waitpid(pid_t pid, int *status, unsigned options)
+static inline pid_t waitpid(pid_t pid, int *status, unsigned options)
 {
        if (options == 0)
                return _cwait(status, pid, 0);
@@ -158,7 +177,7 @@ int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
 struct tm *gmtime_r(const time_t *timep, struct tm *result);
 struct tm *localtime_r(const time_t *timep, struct tm *result);
 int getpagesize(void); /* defined in MinGW's libgcc.a */
-struct passwd *getpwuid(int uid);
+struct passwd *getpwuid(uid_t uid);
 int setitimer(int type, struct itimerval *in, struct itimerval *out);
 int sigaction(int sig, struct sigaction *in, struct sigaction *out);
 int link(const char *oldpath, const char *newpath);
@@ -222,10 +241,11 @@ int mingw_getpagesize(void);
 #ifndef ALREADY_DECLARED_STAT_FUNCS
 #define stat _stati64
 int mingw_lstat(const char *file_name, struct stat *buf);
+int mingw_stat(const char *file_name, struct stat *buf);
 int mingw_fstat(int fd, struct stat *buf);
 #define fstat mingw_fstat
 #define lstat mingw_lstat
-#define _stati64(x,y) mingw_lstat(x,y)
+#define _stati64(x,y) mingw_stat(x,y)
 #endif
 
 int mingw_utime(const char *file_name, const struct utimbuf *times);
@@ -236,6 +256,8 @@ pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
                     int fhin, int fhout, int fherr);
 void mingw_execvp(const char *cmd, char *const *argv);
 #define execvp mingw_execvp
+void mingw_execv(const char *cmd, char *const *argv);
+#define execv mingw_execv
 
 static inline unsigned int git_ntohl(unsigned int x)
 { return (unsigned int)ntohl(x); }
index 56731c35c9d1b5e2d2c82cdff51ab496dcbac7f5..cc55b6d4f741948f3bd05c6299fabdb9f21d7f95 100644 (file)
@@ -282,7 +282,15 @@ GIT_PARSE_WITH(iconv))
 GIT_PARSE_WITH_SET_MAKE_VAR(gitconfig, ETC_GITCONFIG,
                        Use VALUE instead of /etc/gitconfig as the
                        global git configuration file.
-                       If VALUE is not fully qualified it will be interpretted
+                       If VALUE is not fully qualified it will be interpreted
+                       as a path relative to the computed prefix at runtime.)
+
+#
+# Allow user to set ETC_GITATTRIBUTES variable
+GIT_PARSE_WITH_SET_MAKE_VAR(gitattributes, ETC_GITATTRIBUTES,
+                       Use VALUE instead of /etc/gitattributes as the
+                       global git attributes file.
+                       If VALUE is not fully qualified it will be interpreted
                        as a path relative to the computed prefix at runtime.)
 
 #
index 3450cabd0e3281e0eeedeb35d331b95bf95f5afb..57dc20c43ca1ba205ec0a18e263f9dde081390f4 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -631,8 +631,12 @@ char *git_getpass(const char *prompt)
                askpass = askpass_program;
        if (!askpass)
                askpass = getenv("SSH_ASKPASS");
-       if (!askpass || !(*askpass))
-               return getpass(prompt);
+       if (!askpass || !(*askpass)) {
+               char *result = getpass(prompt);
+               if (!result)
+                       die_errno("Could not read password");
+               return result;
+       }
 
        args[0] = askpass;
        args[1] = prompt;
index feab651be83c490a213e97a27fa0fff6820ad9a6..64341d53cc7b5d6369ecc76cf7063c156b3ebdab 100755 (executable)
@@ -1131,7 +1131,7 @@ _git_diff ()
        case "$cur" in
        --*)
                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
-                       --base --ours --theirs
+                       --base --ours --theirs --no-index
                        $__git_diff_common_options
                        "
                return
index 4576c4a862c8ea0565a67eccdae6ef1ac4d9af9a..6c4cab363361e0e87111984c3803f7ee29526c3d 100755 (executable)
@@ -289,7 +289,7 @@ my $current_rev = $opt_s || 1;
 unless(-d $git_dir) {
        system("git init");
        die "Cannot init the GIT db at $git_tree: $?\n" if $?;
-       system("git read-tree");
+       system("git read-tree --empty");
        die "Cannot init an empty tree: $?\n" if $?;
 
        $last_branch = $opt_o;
diff --git a/contrib/git-shell-commands/README b/contrib/git-shell-commands/README
new file mode 100644 (file)
index 0000000..438463b
--- /dev/null
@@ -0,0 +1,18 @@
+Sample programs callable through git-shell.  Place a directory named
+'git-shell-commands' in the home directory of a user whose shell is
+git-shell.  Then anyone logging in as that user will be able to run
+executables in the 'git-shell-commands' directory.
+
+Provided commands:
+
+help: Prints out the names of available commands.  When run
+interactively, git-shell will automatically run 'help' on startup,
+provided it exists.
+
+list: Displays any bare repository whose name ends with ".git" under
+user's home directory.  No other git repositories are visible,
+although they might be clonable through git-shell.  'list' is designed
+to minimize the number of calls to git that must be made in finding
+available repositories; if your setup has additional repositories that
+should be user-discoverable, you may wish to modify 'list'
+accordingly.
diff --git a/contrib/git-shell-commands/help b/contrib/git-shell-commands/help
new file mode 100755 (executable)
index 0000000..535770c
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if tty -s
+then
+       echo "Run 'help' for help, or 'exit' to leave.  Available commands:"
+else
+       echo "Run 'help' for help.  Available commands:"
+fi
+
+cd "$(dirname "$0")"
+
+for cmd in *
+do
+       case "$cmd" in
+       help) ;;
+       *) [ -f "$cmd" ] && [ -x "$cmd" ] && echo "$cmd" ;;
+       esac
+done
diff --git a/contrib/git-shell-commands/list b/contrib/git-shell-commands/list
new file mode 100755 (executable)
index 0000000..6f89938
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+print_if_bare_repo='
+       if "$(git --git-dir="$1" rev-parse --is-bare-repository)" = true
+       then
+               printf "%s\n" "${1#./}"
+       fi
+'
+
+find -type d -name "*.git" -exec sh -c "$print_if_bare_repo" -- \{} \; -prune 2>/dev/null
index 3ad2c0cea56392fb941282ec6225c5f9a3ce05ea..75e8b258177f7f04dadcac125f2bf7ebea4d0f81 100755 (executable)
@@ -42,7 +42,7 @@ then
 fi
 
 # don't link to a workdir
-if test -L "$git_dir/config"
+if test -h "$git_dir/config"
 then
        die "\"$orig_git\" is a working directory only, please specify" \
                "a complete repository."
index e22a2b7fa5f6fcfc5b26541a21c10d3c8b7eda81..9326d3a1fa05f4878a21b58a623d07428f7230fe 100644 (file)
--- a/daemon.c
+++ b/daemon.c
@@ -20,15 +20,15 @@ static int reuseaddr;
 
 static const char daemon_usage[] =
 "git daemon [--verbose] [--syslog] [--export-all]\n"
-"           [--timeout=n] [--init-timeout=n] [--max-connections=n]\n"
-"           [--strict-paths] [--base-path=path] [--base-path-relaxed]\n"
-"           [--user-path | --user-path=path]\n"
-"           [--interpolated-path=path]\n"
-"           [--reuseaddr] [--detach] [--pid-file=file]\n"
-"           [--[enable|disable|allow-override|forbid-override]=service]\n"
-"           [--inetd | [--listen=host_or_ipaddr] [--port=n]\n"
-"                      [--user=user [--group=group]]\n"
-"           [directory...]";
+"           [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]\n"
+"           [--strict-paths] [--base-path=<path>] [--base-path-relaxed]\n"
+"           [--user-path | --user-path=<path>]\n"
+"           [--interpolated-path=<path>]\n"
+"           [--reuseaddr] [--detach] [--pid-file=<file>]\n"
+"           [--(enable|disable|allow-override|forbid-override)=<service>]\n"
+"           [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n"
+"                      [--user=<user> [--group=<group>]]\n"
+"           [<directory>...]";
 
 /* List of acceptable pathname prefixes */
 static char **ok_paths;
diff --git a/diff.c b/diff.c
index 144f2aaba85682ef44d307d2b015fd918336879b..ba57bfab1748ea6a6401105421d298c236bc7ef3 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -919,7 +919,10 @@ static void free_diff_words_data(struct emit_callback *ecbdata)
                free (ecbdata->diff_words->minus.orig);
                free (ecbdata->diff_words->plus.text.ptr);
                free (ecbdata->diff_words->plus.orig);
-               free(ecbdata->diff_words->word_regex);
+               if (ecbdata->diff_words->word_regex) {
+                       regfree(ecbdata->diff_words->word_regex);
+                       free(ecbdata->diff_words->word_regex);
+               }
                free(ecbdata->diff_words);
                ecbdata->diff_words = NULL;
        }
@@ -3268,12 +3271,17 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
        }
        else if ((argcount = short_opt('S', av, &optarg))) {
                options->pickaxe = optarg;
+               options->pickaxe_opts |= DIFF_PICKAXE_KIND_S;
+               return argcount;
+       } else if ((argcount = short_opt('G', av, &optarg))) {
+               options->pickaxe = optarg;
+               options->pickaxe_opts |= DIFF_PICKAXE_KIND_G;
                return argcount;
        }
        else if (!strcmp(arg, "--pickaxe-all"))
-               options->pickaxe_opts = DIFF_PICKAXE_ALL;
+               options->pickaxe_opts |= DIFF_PICKAXE_ALL;
        else if (!strcmp(arg, "--pickaxe-regex"))
-               options->pickaxe_opts = DIFF_PICKAXE_REGEX;
+               options->pickaxe_opts |= DIFF_PICKAXE_REGEX;
        else if ((argcount = short_opt('O', av, &optarg))) {
                options->orderfile = optarg;
                return argcount;
@@ -3307,7 +3315,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
        else if ((argcount = parse_long_opt("output", av, &optarg))) {
                options->file = fopen(optarg, "w");
                if (!options->file)
-                       die_errno("Could not open '%s'", arg + strlen("--output="));
+                       die_errno("Could not open '%s'", optarg);
                options->close_file = 1;
                return argcount;
        } else
@@ -3524,7 +3532,7 @@ static void diff_flush_stat(struct diff_filepair *p, struct diff_options *o,
 
        if ((DIFF_FILE_VALID(p->one) && S_ISDIR(p->one->mode)) ||
            (DIFF_FILE_VALID(p->two) && S_ISDIR(p->two->mode)))
-               return; /* no tree diffs in patch format */
+               return; /* no useful stat for tree diffs */
 
        run_diffstat(p, o, diffstat);
 }
@@ -3537,7 +3545,7 @@ static void diff_flush_checkdiff(struct diff_filepair *p,
 
        if ((DIFF_FILE_VALID(p->one) && S_ISDIR(p->one->mode)) ||
            (DIFF_FILE_VALID(p->two) && S_ISDIR(p->two->mode)))
-               return; /* no tree diffs in patch format */
+               return; /* nothing to check in tree diffs */
 
        run_checkdiff(p, o);
 }
@@ -4173,7 +4181,7 @@ void diffcore_std(struct diff_options *options)
                        diffcore_merge_broken();
        }
        if (options->pickaxe)
-               diffcore_pickaxe(options->pickaxe, options->pickaxe_opts);
+               diffcore_pickaxe(options);
        if (options->orderfile)
                diffcore_order(options->orderfile);
        if (!options->found_follow)
diff --git a/diff.h b/diff.h
index bf2f44d840735684c89f654ee6f3b3a935af2c55..1fd44f5e47604b94c28a673e6cadc6ec870da9df 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -238,6 +238,9 @@ extern int diff_setup_done(struct diff_options *);
 #define DIFF_PICKAXE_ALL       1
 #define DIFF_PICKAXE_REGEX     2
 
+#define DIFF_PICKAXE_KIND_S    4 /* traditional plumbing counter */
+#define DIFF_PICKAXE_KIND_G    8 /* grep in the patch */
+
 extern void diffcore_std(struct diff_options *);
 extern void diffcore_fix_diff_index(struct diff_options *);
 
index 929de15aa9228099b3a772be788d746e440a9e8c..ea03b9107eb2e85dd4a4c5ad93ac08dfe7e1c9f0 100644 (file)
@@ -1,9 +1,148 @@
 /*
  * Copyright (C) 2005 Junio C Hamano
+ * Copyright (C) 2010 Google Inc.
  */
 #include "cache.h"
 #include "diff.h"
 #include "diffcore.h"
+#include "xdiff-interface.h"
+
+struct diffgrep_cb {
+       regex_t *regexp;
+       int hit;
+};
+
+static void diffgrep_consume(void *priv, char *line, unsigned long len)
+{
+       struct diffgrep_cb *data = priv;
+       regmatch_t regmatch;
+       int hold;
+
+       if (line[0] != '+' && line[0] != '-')
+               return;
+       if (data->hit)
+               /*
+                * NEEDSWORK: we should have a way to terminate the
+                * caller early.
+                */
+               return;
+       /* Yuck -- line ought to be "const char *"! */
+       hold = line[len];
+       line[len] = '\0';
+       data->hit = !regexec(data->regexp, line + 1, 1, &regmatch, 0);
+       line[len] = hold;
+}
+
+static void fill_one(struct diff_filespec *one,
+                    mmfile_t *mf, struct userdiff_driver **textconv)
+{
+       if (DIFF_FILE_VALID(one)) {
+               *textconv = get_textconv(one);
+               mf->size = fill_textconv(*textconv, one, &mf->ptr);
+       } else {
+               memset(mf, 0, sizeof(*mf));
+       }
+}
+
+static int diff_grep(struct diff_filepair *p, regex_t *regexp, struct diff_options *o)
+{
+       regmatch_t regmatch;
+       struct userdiff_driver *textconv_one = NULL;
+       struct userdiff_driver *textconv_two = NULL;
+       mmfile_t mf1, mf2;
+       int hit;
+
+       if (diff_unmodified_pair(p))
+               return 0;
+
+       fill_one(p->one, &mf1, &textconv_one);
+       fill_one(p->two, &mf2, &textconv_two);
+
+       if (!mf1.ptr) {
+               if (!mf2.ptr)
+                       return 0; /* ignore unmerged */
+               /* created "two" -- does it have what we are looking for? */
+               hit = !regexec(regexp, p->two->data, 1, &regmatch, 0);
+       } else if (!mf2.ptr) {
+               /* removed "one" -- did it have what we are looking for? */
+               hit = !regexec(regexp, p->one->data, 1, &regmatch, 0);
+       } else {
+               /*
+                * We have both sides; need to run textual diff and see if
+                * the pattern appears on added/deleted lines.
+                */
+               struct diffgrep_cb ecbdata;
+               xpparam_t xpp;
+               xdemitconf_t xecfg;
+
+               memset(&xpp, 0, sizeof(xpp));
+               memset(&xecfg, 0, sizeof(xecfg));
+               ecbdata.regexp = regexp;
+               ecbdata.hit = 0;
+               xecfg.ctxlen = o->context;
+               xecfg.interhunkctxlen = o->interhunkcontext;
+               xdi_diff_outf(&mf1, &mf2, diffgrep_consume, &ecbdata,
+                             &xpp, &xecfg);
+               hit = ecbdata.hit;
+       }
+       if (textconv_one)
+               free(mf1.ptr);
+       if (textconv_two)
+               free(mf2.ptr);
+       return hit;
+}
+
+static void diffcore_pickaxe_grep(struct diff_options *o)
+{
+       struct diff_queue_struct *q = &diff_queued_diff;
+       int i, has_changes, err;
+       regex_t regex;
+       struct diff_queue_struct outq;
+       outq.queue = NULL;
+       outq.nr = outq.alloc = 0;
+
+       err = regcomp(&regex, o->pickaxe, REG_EXTENDED | REG_NEWLINE);
+       if (err) {
+               char errbuf[1024];
+               regerror(err, &regex, errbuf, 1024);
+               regfree(&regex);
+               die("invalid log-grep regex: %s", errbuf);
+       }
+
+       if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
+               /* Showing the whole changeset if needle exists */
+               for (i = has_changes = 0; !has_changes && i < q->nr; i++) {
+                       struct diff_filepair *p = q->queue[i];
+                       if (diff_grep(p, &regex, o))
+                               has_changes++;
+               }
+               if (has_changes)
+                       return; /* do not munge the queue */
+
+               /*
+                * Otherwise we will clear the whole queue by copying
+                * the empty outq at the end of this function, but
+                * first clear the current entries in the queue.
+                */
+               for (i = 0; i < q->nr; i++)
+                       diff_free_filepair(q->queue[i]);
+       } else {
+               /* Showing only the filepairs that has the needle */
+               for (i = 0; i < q->nr; i++) {
+                       struct diff_filepair *p = q->queue[i];
+                       if (diff_grep(p, &regex, o))
+                               diff_q(&outq, p);
+                       else
+                               diff_free_filepair(p);
+               }
+       }
+
+       regfree(&regex);
+
+       free(q->queue);
+       *q = outq;
+       return;
+}
 
 static unsigned int contains(struct diff_filespec *one,
                             const char *needle, unsigned long len,
@@ -48,8 +187,10 @@ static unsigned int contains(struct diff_filespec *one,
        return cnt;
 }
 
-void diffcore_pickaxe(const char *needle, int opts)
+static void diffcore_pickaxe_count(struct diff_options *o)
 {
+       const char *needle = o->pickaxe;
+       int opts = o->pickaxe_opts;
        struct diff_queue_struct *q = &diff_queued_diff;
        unsigned long len = strlen(needle);
        int i, has_changes;
@@ -128,11 +269,19 @@ void diffcore_pickaxe(const char *needle, int opts)
                                diff_free_filepair(p);
                }
 
-       if (opts & DIFF_PICKAXE_REGEX) {
+       if (opts & DIFF_PICKAXE_REGEX)
                regfree(&regex);
-       }
 
        free(q->queue);
        *q = outq;
        return;
 }
+
+void diffcore_pickaxe(struct diff_options *o)
+{
+       /* Might want to warn when both S and G are on; I don't care... */
+       if (o->pickaxe_opts & DIFF_PICKAXE_KIND_G)
+               diffcore_pickaxe_grep(o);
+       else
+               diffcore_pickaxe_count(o);
+}
index 8b3241ad137f5934e32336cd1caf8d99ca11d1f5..b8f1fdecf4d9e5e8f8e834eb55a374f1af8352fd 100644 (file)
@@ -107,7 +107,7 @@ extern void diff_q(struct diff_queue_struct *, struct diff_filepair *);
 extern void diffcore_break(int);
 extern void diffcore_rename(struct diff_options *);
 extern void diffcore_merge_broken(void);
-extern void diffcore_pickaxe(const char *needle, int opts);
+extern void diffcore_pickaxe(struct diff_options *);
 extern void diffcore_order(const char *orderfile);
 
 #define DIFF_DEBUG 0
diff --git a/dir.c b/dir.c
index 133f472a1e73786e781c1021eea17e543858937f..d1e5e5e5bfaea81cb46fc3e3f57df31c6ef1eb2a 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -232,7 +232,7 @@ int add_excludes_from_file_to_list(const char *fname,
 {
        struct stat st;
        int fd, i;
-       size_t size;
+       size_t size = 0;
        char *buf, *entry;
 
        fd = open(fname, O_RDONLY);
index 2d0c3153791d7cceffb12f50dd5a7716b8c0a8c0..de5581fe51d532231b0121bd2ef2e46669015bda 100644 (file)
@@ -64,7 +64,7 @@ char *git_work_tree_cfg;
 static char *work_tree;
 
 static const char *git_dir;
-static char *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file;
+static char *git_object_dir, *git_index_file, *git_graft_file;
 
 /*
  * Repository-local GIT_* environment variables
@@ -87,8 +87,10 @@ const char * const local_repo_env[LOCAL_REPO_ENV_SIZE + 1] = {
 static void setup_git_env(void)
 {
        git_dir = getenv(GIT_DIR_ENVIRONMENT);
-       if (!git_dir)
+       if (!git_dir) {
                git_dir = read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT);
+               git_dir = git_dir ? xstrdup(git_dir) : NULL;
+       }
        if (!git_dir)
                git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
        git_object_dir = getenv(DB_ENVIRONMENT);
@@ -96,8 +98,6 @@ static void setup_git_env(void)
                git_object_dir = xmalloc(strlen(git_dir) + 9);
                sprintf(git_object_dir, "%s/objects", git_dir);
        }
-       git_refs_dir = xmalloc(strlen(git_dir) + 6);
-       sprintf(git_refs_dir, "%s/refs", git_dir);
        git_index_file = getenv(INDEX_ENVIRONMENT);
        if (!git_index_file) {
                git_index_file = xmalloc(strlen(git_dir) + 7);
index 2317b0fe7509b957577234890135509143c0872b..77549ebd6fbfbea051901d4ab474eebc8e2dbdbd 100644 (file)
@@ -1454,6 +1454,15 @@ static int tree_content_set(
                n = slash1 - p;
        else
                n = strlen(p);
+       if (!slash1 && !n) {
+               if (!S_ISDIR(mode))
+                       die("Root cannot be a non-directory");
+               hashcpy(root->versions[1].sha1, sha1);
+               if (root->tree)
+                       release_tree_content_recursive(root->tree);
+               root->tree = subtree;
+               return 1;
+       }
        if (!n)
                die("Empty path component found in input");
        if (!slash1 && !S_ISDIR(mode) && subtree)
@@ -2884,7 +2893,7 @@ static int git_pack_config(const char *k, const char *v, void *cb)
 }
 
 static const char fast_import_usage[] =
-"git fast-import [--date-format=f] [--max-pack-size=n] [--big-file-threshold=n] [--depth=n] [--active-branches=n] [--export-marks=marks.file]";
+"git fast-import [--date-format=<f>] [--max-pack-size=<n>] [--big-file-threshold=<n>] [--depth=<n>] [--active-branches=<n>] [--export-marks=<marks.file>]";
 
 static void parse_argv(void)
 {
index e7f008c7baae2ff484e16882e199b6b9d75195aa..df09b42840b7675e135605f9108894ce93e6d477 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -5,7 +5,7 @@
 SUBDIRECTORY_OK=Yes
 OPTIONS_KEEPDASHDASH=
 OPTIONS_SPEC="\
-git am [options] [<mbox>|<Maildir>...]
+git am [options] [(<mbox>|<Maildir>)...]
 git am [options] (--resolved | --skip | --abort)
 --
 i,interactive   run interactively
@@ -137,7 +137,7 @@ It does not apply to blobs recorded in its index."
     export GITHEAD_$his_tree
     if test -n "$GIT_QUIET"
     then
-           export GIT_MERGE_VERBOSITY=0
+           GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
     fi
     git-merge-recursive $orig_tree -- HEAD $his_tree || {
            git rerere $allow_rerere_autoupdate
@@ -444,12 +444,12 @@ else
                                set x
                                first=
                        }
-                       case "$arg" in
-                       /*)
-                               set "$@" "$arg" ;;
-                       *)
-                               set "$@" "$prefix$arg" ;;
-                       esac
+                       if is_absolute_path "$arg"
+                       then
+                               set "$@" "$arg"
+                       else
+                               set "$@" "$prefix$arg"
+                       fi
                done
                shift
        fi
index 877096ecb09e524174ff22db3722d6428f43bcf4..2af8d3edbe35dce35e940c5cccb91f9e06ebeff8 100644 (file)
 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
 #define bitsizeof(x)  (CHAR_BIT * sizeof(x))
 
+#define maximum_signed_value_of_type(a) \
+    (INTMAX_MAX >> (bitsizeof(intmax_t) - bitsizeof(a)))
+
+/*
+ * Signed integer overflow is undefined in C, so here's a helper macro
+ * to detect if the sum of two integers will overflow.
+ *
+ * Requires: a >= 0, typeof(a) equals typeof(b)
+ */
+#define signed_add_overflows(a, b) \
+    ((b) > maximum_signed_value_of_type(a) - (a))
+
 #ifdef __GNUC__
 #define TYPEOF(x) (__typeof__(x))
 #else
@@ -160,6 +172,10 @@ extern char *gitbasename(char *);
 #define PRIx32 "x"
 #endif
 
+#ifndef PRIo32
+#define PRIo32 "o"
+#endif
+
 #ifndef PATH_SEP
 #define PATH_SEP ':'
 #endif
index 9e03eee4586ca3b7476b56f66e9dcf6ffe3088cf..7ab7bbc9ea324021241c4f4779e66f320c7f0ed8 100755 (executable)
@@ -611,7 +611,7 @@ my %index; # holds filenames of one index per branch
 unless (-d $git_dir) {
        system(qw(git init));
        die "Cannot init the GIT db at $git_tree: $?\n" if $?;
-       system(qw(git read-tree));
+       system(qw(git read-tree --empty));
        die "Cannot init an empty tree: $?\n" if $?;
 
        $last_branch = $opt_o;
index e9f3037df351ceed0262a8995f19903464163af8..bd19b855330b62c867a5e76be512563ee17db779 100755 (executable)
@@ -8,7 +8,7 @@
 #### Copyright The Open University UK - 2006.
 ####
 #### Authors: Martyn Smith    <martyn@catalyst.net.nz>
-####          Martin Langhoff <martin@catalyst.net.nz>
+####          Martin Langhoff <martin@laptop.org>
 ####
 ####
 #### Released under the GNU Public License, version 2.
@@ -2680,7 +2680,7 @@ package GITCVS::log;
 #### Copyright The Open University UK - 2006.
 ####
 #### Authors: Martyn Smith    <martyn@catalyst.net.nz>
-####          Martin Langhoff <martin@catalyst.net.nz>
+####          Martin Langhoff <martin@laptop.org>
 ####
 ####
 
@@ -2847,7 +2847,7 @@ package GITCVS::updater;
 #### Copyright The Open University UK - 2006.
 ####
 #### Authors: Martyn Smith    <martyn@catalyst.net.nz>
-####          Martin Langhoff <martin@catalyst.net.nz>
+####          Martin Langhoff <martin@laptop.org>
 ####
 ####
 
index 88fb0f070e5f32c62ae47f90f1f27ffeef836d8f..962a93b586571eb6fc60aae53c77f6e6b9fb281f 100755 (executable)
@@ -139,6 +139,7 @@ do
                continue
                ;;
        --remap-to-ancestor)
+               # deprecated ($remap_to_ancestor is set now automatically)
                shift
                remap_to_ancestor=t
                continue
@@ -265,7 +266,14 @@ mkdir ../map || die "Could not create map/ directory"
 
 # we need "--" only if there are no path arguments in $@
 nonrevs=$(git rev-parse --no-revs "$@") || exit
-test -z "$nonrevs" && dashdash=-- || dashdash=
+if test -z "$nonrevs"
+then
+       dashdash=--
+else
+       dashdash=
+       remap_to_ancestor=t
+fi
+
 rev_args=$(git rev-parse --revs-only "$@")
 
 case "$filter_subdir" in
index b3f937eace99ce1e25afbdbea678e9f6926dbc75..1fb4d9b4b7393d2c803457365127692fb093338f 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=0.12.GITGUI
+DEF_VER=0.13.GITGUI
 
 LF='
 '
index 197b55edf3eeeaec345d88227825cc550e6de72d..e22ba5c321dc47fdf512f30c5e6c741c41fb99eb 100644 (file)
@@ -215,6 +215,7 @@ endif
 $(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS
        $(QUIET_GEN)rm -f $@ $@+ && \
        sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
+               -e 's|@@SHELL_PATH@@|$(SHELL_PATH_SQ)|' \
                -e '1,30s|^ argv0=$$0| argv0=$(GITGUI_SCRIPT)|' \
                -e '1,30s|^ exec wish | exec '\''$(TCLTK_PATH_SED)'\'' |' \
                -e 's/@@GITGUI_VERSION@@/$(GITGUI_VERSION)/g' \
index 12e117ecb11afabef1d0d751ebee442ce515dc1e..4277f30c4116faf2788243af4ec23f1d077698e8 100755 (executable)
@@ -5,6 +5,8 @@ exec wish "$0" -- "$@"
 # This is a trivial implementation of an SSH_ASKPASS handler.
 # Git-gui uses this script if none are already configured.
 
+package require Tk
+
 set answer {}
 set yesno  0
 set rc     255
@@ -30,16 +32,20 @@ if {!$yesno} {
 
 frame .b
 button .b.ok     -text OK     -command finish
-button .b.cancel -text Cancel -command {destroy .}
+button .b.cancel -text Cancel -command cancel
 
 pack .b.ok -side left -expand 1
 pack .b.cancel -side right -expand 1
 pack .b -side bottom -fill x -padx 10 -pady 10
 
 bind . <Visibility> {focus -force .e}
-bind . <Key-Return> finish
-bind . <Key-Escape> {destroy .}
-bind . <Destroy>    {exit $rc}
+bind . <Key-Return> [list .b.ok invoke]
+bind . <Key-Escape> [list .b.cancel invoke]
+bind . <Destroy>    {set rc $rc}
+
+proc cancel {} {
+       set ::rc 255
+}
 
 proc finish {} {
        if {$::yesno} {
@@ -50,10 +56,11 @@ proc finish {} {
                }
        }
 
-       set ::rc 0
        puts $::answer
-       destroy .
+       set ::rc 0
 }
 
 wm title . "OpenSSH"
 tk::PlaceWindow .
+vwait rc
+exit $rc
index bb104895a94450a2ade7446c8fda52910bae0868..4617f29c26726c2cd438f160be21a8422e66b352 100755 (executable)
@@ -10,8 +10,8 @@
  exec wish "$argv0" -- "$@"
 
 set appvers {@@GITGUI_VERSION@@}
-set copyright [encoding convertfrom utf-8 {
-Copyright Â© 2006, 2007 Shawn Pearce, et. al.
+set copyright [string map [list (c) \u00a9] {
+Copyright (c) 2006-2010 Shawn Pearce, et. al.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -128,6 +128,7 @@ set _githtmldir {}
 set _reponame {}
 set _iscygwin {}
 set _search_path {}
+set _shellpath {@@SHELL_PATH@@}
 
 set _trace [lsearch -exact $argv --trace]
 if {$_trace >= 0} {
@@ -137,6 +138,18 @@ if {$_trace >= 0} {
        set _trace 0
 }
 
+proc shellpath {} {
+       global _shellpath env
+       if {[string match @@* $_shellpath]} {
+               if {[info exists env(SHELL)]} {
+                       return $env(SHELL)
+               } else {
+                       return /bin/sh
+               }
+       }
+       return $_shellpath
+}
+
 proc appname {} {
        global _appname
        return $_appname
@@ -2845,7 +2858,13 @@ bind all <$M1B-Key-W> {destroy [winfo toplevel %W]}
 
 set subcommand_args {}
 proc usage {} {
-       puts stderr "usage: $::argv0 $::subcommand $::subcommand_args"
+       set s "usage: $::argv0 $::subcommand $::subcommand_args"
+       if {[tk windowingsystem] eq "win32"} {
+               wm withdraw .
+               tk_messageBox -icon info -title "Usage" -message $s
+       } else {
+               puts stderr $s
+       }
        exit 1
 }
 
@@ -2938,7 +2957,12 @@ blame {
        }
        blame   {
                if {$head eq {} && ![file exists $path]} {
-                       puts stderr [mc "fatal: cannot stat path %s: No such file or directory" $path]
+                       catch {wm withdraw .}
+                       tk_messageBox \
+                               -icon error \
+                               -type ok \
+                               -title [mc "git-gui: fatal error"] \
+                               -message [mc "fatal: cannot stat path %s: No such file or directory" $path]
                        exit 1
                }
                blame::new $head $path $jump_spec
index 2137ec9684d0acdb386e6b50e1b41aa7705c9746..61e358f960ca949cac5664c67442b82d0afca65f 100644 (file)
@@ -460,7 +460,14 @@ method _load {jump} {
        }
        if {$commit eq {}} {
                if {$do_textconv ne 0} {
-                       set fd [open |[list $textconv $path] r]
+                       # Run textconv with sh -c "..." to allow it to
+                       # contain command + arguments. On windows, just
+                       # call the filter command.
+                       if {![file executable [shellpath]]} {
+                               set fd [open |[linsert $textconv end $path] r]
+                       } else {
+                               set fd [open |[list [shellpath] -c "$textconv \"\$0\"" $path] r]
+                       }
                } else {
                        set fd [open $path r]
                }
index d8d73acf2cdc770a794fa348aace0963dd7844ff..8bd3c5d75feea3dfe310adbfab705d8045aa8367 100644 (file)
@@ -8,41 +8,41 @@ msgid ""
 msgstr ""
 "Project-Id-Version: sv\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-26 15:47-0800\n"
-"PO-Revision-Date: 2010-01-28 13:57+0100\n"
+"POT-Creation-Date: 2010-09-12 21:11+0100\n"
+"PO-Revision-Date: 2010-09-12 21:12+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit"
 
-#: git-gui.sh:41 git-gui.sh:793 git-gui.sh:807 git-gui.sh:820 git-gui.sh:903
-#: git-gui.sh:922
-msgid "git-gui: fatal error"
-msgstr "git-gui: Ã¶desdigert fel"
-
-#: git-gui.sh:743
+#: git-gui.sh:781
 #, tcl-format
 msgid "Invalid font specified in %s:"
 msgstr "Ogiltigt teckensnitt angivet i %s:"
 
-#: git-gui.sh:779
+#: git-gui.sh:831
 msgid "Main Font"
 msgstr "Huvudteckensnitt"
 
-#: git-gui.sh:780
+#: git-gui.sh:832
 msgid "Diff/Console Font"
 msgstr "Diff/konsolteckensnitt"
 
-#: git-gui.sh:794
+#: git-gui.sh:845 git-gui.sh:859 git-gui.sh:872 git-gui.sh:955 git-gui.sh:974
+#: git-gui.sh:2964
+msgid "git-gui: fatal error"
+msgstr "git-gui: Ã¶desdigert fel"
+
+#: git-gui.sh:846
 msgid "Cannot find git in PATH."
 msgstr "Hittar inte git i PATH."
 
-#: git-gui.sh:821
+#: git-gui.sh:873
 msgid "Cannot parse Git version string:"
 msgstr "Kan inte tolka versionssträng frÃ¥n Git:"
 
-#: git-gui.sh:839
+#: git-gui.sh:891
 #, tcl-format
 msgid ""
 "Git version cannot be determined.\n"
@@ -61,478 +61,478 @@ msgstr ""
 "\n"
 "Anta att \"%s\" Ã¤r version 1.5.0?\n"
 
-#: git-gui.sh:1128
+#: git-gui.sh:1180
 msgid "Git directory not found:"
 msgstr "Git-katalogen hittades inte:"
 
-#: git-gui.sh:1146
+#: git-gui.sh:1201
 msgid "Cannot move to top of working directory:"
 msgstr "Kan inte gÃ¥ till början pÃ¥ arbetskatalogen:"
 
-#: git-gui.sh:1154
+#: git-gui.sh:1209
 msgid "Cannot use bare repository:"
 msgstr "Kan inte använda naket arkiv:"
 
-#: git-gui.sh:1162
+#: git-gui.sh:1217
 msgid "No working directory"
 msgstr "Ingen arbetskatalog"
 
-#: git-gui.sh:1334 lib/checkout_op.tcl:306
+#: git-gui.sh:1389 lib/checkout_op.tcl:306
 msgid "Refreshing file status..."
 msgstr "Uppdaterar filstatus..."
 
-#: git-gui.sh:1390
+#: git-gui.sh:1445
 msgid "Scanning for modified files ..."
 msgstr "Söker efter Ã¤ndrade filer..."
 
-#: git-gui.sh:1454
+#: git-gui.sh:1509
 msgid "Calling prepare-commit-msg hook..."
 msgstr ""
 "Anropar kroken för förberedelse av incheckningsmeddelande (prepare-commit-"
 "msg)..."
 
-#: git-gui.sh:1471
+#: git-gui.sh:1526
 msgid "Commit declined by prepare-commit-msg hook."
 msgstr ""
 "Incheckningen avvisades av kroken för förberedelse av incheckningsmeddelande "
 "(prepare-commit-msg)."
 
-#: git-gui.sh:1629 lib/browser.tcl:246
+#: git-gui.sh:1684 lib/browser.tcl:246
 msgid "Ready."
 msgstr "Klar."
 
-#: git-gui.sh:1787
+#: git-gui.sh:1842
 #, tcl-format
 msgid "Displaying only %s of %s files."
 msgstr "Visar endast %s av %s filer."
 
-#: git-gui.sh:1913
+#: git-gui.sh:1968
 msgid "Unmodified"
 msgstr "Oförändrade"
 
-#: git-gui.sh:1915
+#: git-gui.sh:1970
 msgid "Modified, not staged"
 msgstr "Förändrade, ej köade"
 
-#: git-gui.sh:1916 git-gui.sh:1924
+#: git-gui.sh:1971 git-gui.sh:1979
 msgid "Staged for commit"
 msgstr "Köade för incheckning"
 
-#: git-gui.sh:1917 git-gui.sh:1925
+#: git-gui.sh:1972 git-gui.sh:1980
 msgid "Portions staged for commit"
 msgstr "Delar köade för incheckning"
 
-#: git-gui.sh:1918 git-gui.sh:1926
+#: git-gui.sh:1973 git-gui.sh:1981
 msgid "Staged for commit, missing"
 msgstr "Köade för incheckning, saknade"
 
-#: git-gui.sh:1920
+#: git-gui.sh:1975
 msgid "File type changed, not staged"
 msgstr "Filtyp Ã¤ndrad, ej köade"
 
-#: git-gui.sh:1921
+#: git-gui.sh:1976
 msgid "File type changed, staged"
 msgstr "Filtyp Ã¤ndrad, köade"
 
-#: git-gui.sh:1923
+#: git-gui.sh:1978
 msgid "Untracked, not staged"
 msgstr "Ej spÃ¥rade, ej köade"
 
-#: git-gui.sh:1928
+#: git-gui.sh:1983
 msgid "Missing"
 msgstr "Saknade"
 
-#: git-gui.sh:1929
+#: git-gui.sh:1984
 msgid "Staged for removal"
 msgstr "Köade för borttagning"
 
-#: git-gui.sh:1930
+#: git-gui.sh:1985
 msgid "Staged for removal, still present"
 msgstr "Köade för borttagning, fortfarande närvarande"
 
-#: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935
-#: git-gui.sh:1936 git-gui.sh:1937
+#: git-gui.sh:1987 git-gui.sh:1988 git-gui.sh:1989 git-gui.sh:1990
+#: git-gui.sh:1991 git-gui.sh:1992
 msgid "Requires merge resolution"
 msgstr "Kräver konflikthantering efter sammanslagning"
 
-#: git-gui.sh:1972
+#: git-gui.sh:2027
 msgid "Starting gitk... please wait..."
 msgstr "Startar gitk... vänta..."
 
-#: git-gui.sh:1984
+#: git-gui.sh:2039
 msgid "Couldn't find gitk in PATH"
 msgstr "Hittade inte gitk i PATH."
 
-#: git-gui.sh:2043
+#: git-gui.sh:2098
 msgid "Couldn't find git gui in PATH"
 msgstr "Hittade inte git gui i PATH."
 
-#: git-gui.sh:2455 lib/choose_repository.tcl:36
+#: git-gui.sh:2515 lib/choose_repository.tcl:36
 msgid "Repository"
 msgstr "Arkiv"
 
-#: git-gui.sh:2456
+#: git-gui.sh:2516
 msgid "Edit"
 msgstr "Redigera"
 
-#: git-gui.sh:2458 lib/choose_rev.tcl:561
+#: git-gui.sh:2518 lib/choose_rev.tcl:566
 msgid "Branch"
 msgstr "Gren"
 
-#: git-gui.sh:2461 lib/choose_rev.tcl:548
+#: git-gui.sh:2521 lib/choose_rev.tcl:553
 msgid "Commit@@noun"
 msgstr "Incheckning"
 
-#: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
+#: git-gui.sh:2524 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
 msgid "Merge"
 msgstr "SlÃ¥ ihop"
 
-#: git-gui.sh:2465 lib/choose_rev.tcl:557
+#: git-gui.sh:2525 lib/choose_rev.tcl:562
 msgid "Remote"
 msgstr "Fjärrarkiv"
 
-#: git-gui.sh:2468
+#: git-gui.sh:2528
 msgid "Tools"
 msgstr "Verktyg"
 
-#: git-gui.sh:2477
+#: git-gui.sh:2537
 msgid "Explore Working Copy"
 msgstr "Utforska arbetskopia"
 
-#: git-gui.sh:2483
+#: git-gui.sh:2543
 msgid "Browse Current Branch's Files"
 msgstr "Bläddra i grenens filer"
 
-#: git-gui.sh:2487
+#: git-gui.sh:2547
 msgid "Browse Branch Files..."
 msgstr "Bläddra filer pÃ¥ gren..."
 
-#: git-gui.sh:2492
+#: git-gui.sh:2552
 msgid "Visualize Current Branch's History"
 msgstr "Visualisera grenens historik"
 
-#: git-gui.sh:2496
+#: git-gui.sh:2556
 msgid "Visualize All Branch History"
 msgstr "Visualisera alla grenars historik"
 
-#: git-gui.sh:2503
+#: git-gui.sh:2563
 #, tcl-format
 msgid "Browse %s's Files"
 msgstr "Bläddra i filer för %s"
 
-#: git-gui.sh:2505
+#: git-gui.sh:2565
 #, tcl-format
 msgid "Visualize %s's History"
 msgstr "Visualisera historik för %s"
 
-#: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67
+#: git-gui.sh:2570 lib/database.tcl:40 lib/database.tcl:66
 msgid "Database Statistics"
 msgstr "Databasstatistik"
 
-#: git-gui.sh:2513 lib/database.tcl:34
+#: git-gui.sh:2573 lib/database.tcl:33
 msgid "Compress Database"
 msgstr "Komprimera databas"
 
-#: git-gui.sh:2516
+#: git-gui.sh:2576
 msgid "Verify Database"
 msgstr "Verifiera databas"
 
-#: git-gui.sh:2523 git-gui.sh:2527 git-gui.sh:2531 lib/shortcut.tcl:8
+#: git-gui.sh:2583 git-gui.sh:2587 git-gui.sh:2591 lib/shortcut.tcl:8
 #: lib/shortcut.tcl:40 lib/shortcut.tcl:72
 msgid "Create Desktop Icon"
 msgstr "Skapa skrivbordsikon"
 
-#: git-gui.sh:2539 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191
+#: git-gui.sh:2599 lib/choose_repository.tcl:188 lib/choose_repository.tcl:196
 msgid "Quit"
 msgstr "Avsluta"
 
-#: git-gui.sh:2547
+#: git-gui.sh:2607
 msgid "Undo"
 msgstr "Ã…ngra"
 
-#: git-gui.sh:2550
+#: git-gui.sh:2610
 msgid "Redo"
 msgstr "Gör om"
 
-#: git-gui.sh:2554 git-gui.sh:3109
+#: git-gui.sh:2614 git-gui.sh:3190
 msgid "Cut"
 msgstr "Klipp ut"
 
-#: git-gui.sh:2557 git-gui.sh:3112 git-gui.sh:3186 git-gui.sh:3259
+#: git-gui.sh:2617 git-gui.sh:3193 git-gui.sh:3267 git-gui.sh:3340
 #: lib/console.tcl:69
 msgid "Copy"
 msgstr "Kopiera"
 
-#: git-gui.sh:2560 git-gui.sh:3115
+#: git-gui.sh:2620 git-gui.sh:3196
 msgid "Paste"
 msgstr "Klistra in"
 
-#: git-gui.sh:2563 git-gui.sh:3118 lib/branch_delete.tcl:26
-#: lib/remote_branch_delete.tcl:38
+#: git-gui.sh:2623 git-gui.sh:3199 lib/branch_delete.tcl:28
+#: lib/remote_branch_delete.tcl:39
 msgid "Delete"
 msgstr "Ta bort"
 
-#: git-gui.sh:2567 git-gui.sh:3122 git-gui.sh:3263 lib/console.tcl:71
+#: git-gui.sh:2627 git-gui.sh:3203 git-gui.sh:3344 lib/console.tcl:71
 msgid "Select All"
 msgstr "Markera alla"
 
-#: git-gui.sh:2576
+#: git-gui.sh:2636
 msgid "Create..."
 msgstr "Skapa..."
 
-#: git-gui.sh:2582
+#: git-gui.sh:2642
 msgid "Checkout..."
 msgstr "Checka ut..."
 
-#: git-gui.sh:2588
+#: git-gui.sh:2648
 msgid "Rename..."
 msgstr "Byt namn..."
 
-#: git-gui.sh:2593
+#: git-gui.sh:2653
 msgid "Delete..."
 msgstr "Ta bort..."
 
-#: git-gui.sh:2598
+#: git-gui.sh:2658
 msgid "Reset..."
 msgstr "Ã…terställ..."
 
-#: git-gui.sh:2608
+#: git-gui.sh:2668
 msgid "Done"
 msgstr "Färdig"
 
-#: git-gui.sh:2610
+#: git-gui.sh:2670
 msgid "Commit@@verb"
 msgstr "Checka in"
 
-#: git-gui.sh:2619 git-gui.sh:3050
+#: git-gui.sh:2679 git-gui.sh:3131
 msgid "New Commit"
 msgstr "Ny incheckning"
 
-#: git-gui.sh:2627 git-gui.sh:3057
+#: git-gui.sh:2687 git-gui.sh:3138
 msgid "Amend Last Commit"
 msgstr "Lägg till föregÃ¥ende incheckning"
 
-#: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99
+#: git-gui.sh:2697 git-gui.sh:3092 lib/remote_branch_delete.tcl:101
 msgid "Rescan"
 msgstr "Sök pÃ¥ nytt"
 
-#: git-gui.sh:2643
+#: git-gui.sh:2703
 msgid "Stage To Commit"
 msgstr "Köa för incheckning"
 
-#: git-gui.sh:2649
+#: git-gui.sh:2709
 msgid "Stage Changed Files To Commit"
 msgstr "Köa Ã¤ndrade filer för incheckning"
 
-#: git-gui.sh:2655
+#: git-gui.sh:2715
 msgid "Unstage From Commit"
 msgstr "Ta bort frÃ¥n incheckningskö"
 
-#: git-gui.sh:2661 lib/index.tcl:412
+#: git-gui.sh:2721 lib/index.tcl:415
 msgid "Revert Changes"
 msgstr "Ã…terställ Ã¤ndringar"
 
-#: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341
+#: git-gui.sh:2729 git-gui.sh:3391 git-gui.sh:3422
 msgid "Show Less Context"
 msgstr "Visa mindre sammanhang"
 
-#: git-gui.sh:2673 git-gui.sh:3314 git-gui.sh:3345
+#: git-gui.sh:2733 git-gui.sh:3395 git-gui.sh:3426
 msgid "Show More Context"
 msgstr "Visa mer sammanhang"
 
-#: git-gui.sh:2680 git-gui.sh:3024 git-gui.sh:3133
+#: git-gui.sh:2740 git-gui.sh:3105 git-gui.sh:3214
 msgid "Sign Off"
 msgstr "Skriv under"
 
-#: git-gui.sh:2696
+#: git-gui.sh:2756
 msgid "Local Merge..."
 msgstr "Lokal sammanslagning..."
 
-#: git-gui.sh:2701
+#: git-gui.sh:2761
 msgid "Abort Merge..."
 msgstr "Avbryt sammanslagning..."
 
-#: git-gui.sh:2713 git-gui.sh:2741
+#: git-gui.sh:2773 git-gui.sh:2801
 msgid "Add..."
 msgstr "Lägg till..."
 
-#: git-gui.sh:2717
+#: git-gui.sh:2777
 msgid "Push..."
 msgstr "Sänd..."
 
-#: git-gui.sh:2721
+#: git-gui.sh:2781
 msgid "Delete Branch..."
 msgstr "Ta bort gren..."
 
-#: git-gui.sh:2731 git-gui.sh:3292
+#: git-gui.sh:2791 git-gui.sh:3373
 msgid "Options..."
 msgstr "Alternativ..."
 
-#: git-gui.sh:2742
+#: git-gui.sh:2802
 msgid "Remove..."
 msgstr "Ta bort..."
 
-#: git-gui.sh:2751 lib/choose_repository.tcl:50
+#: git-gui.sh:2811 lib/choose_repository.tcl:50
 msgid "Help"
 msgstr "Hjälp"
 
-#: git-gui.sh:2755 git-gui.sh:2759 lib/about.tcl:14
+#: git-gui.sh:2815 git-gui.sh:2819 lib/about.tcl:14
 #: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53
 #, tcl-format
 msgid "About %s"
 msgstr "Om %s"
 
-#: git-gui.sh:2783
+#: git-gui.sh:2843
 msgid "Online Documentation"
 msgstr "Webbdokumentation"
 
-#: git-gui.sh:2786 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
+#: git-gui.sh:2846 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
 msgid "Show SSH Key"
 msgstr "Visa SSH-nyckel"
 
-#: git-gui.sh:2893
+#: git-gui.sh:2965
 #, tcl-format
 msgid "fatal: cannot stat path %s: No such file or directory"
 msgstr ""
 "ödesdigert: kunde inte ta status pÃ¥ sökvägen %s: Fil eller katalog saknas"
 
-#: git-gui.sh:2926
+#: git-gui.sh:2997
 msgid "Current Branch:"
 msgstr "Aktuell gren:"
 
-#: git-gui.sh:2947
+#: git-gui.sh:3023
 msgid "Staged Changes (Will Commit)"
 msgstr "Köade Ã¤ndringar (kommer att checkas in)"
 
-#: git-gui.sh:2967
+#: git-gui.sh:3043
 msgid "Unstaged Changes"
 msgstr "Oköade Ã¤ndringar"
 
-#: git-gui.sh:3017
+#: git-gui.sh:3098
 msgid "Stage Changed"
 msgstr "Köa Ã¤ndrade"
 
-#: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193
+#: git-gui.sh:3117 lib/transport.tcl:107 lib/transport.tcl:196
 msgid "Push"
 msgstr "Sänd"
 
-#: git-gui.sh:3071
+#: git-gui.sh:3152
 msgid "Initial Commit Message:"
 msgstr "Inledande incheckningsmeddelande:"
 
-#: git-gui.sh:3072
+#: git-gui.sh:3153
 msgid "Amended Commit Message:"
 msgstr "Utökat incheckningsmeddelande:"
 
-#: git-gui.sh:3073
+#: git-gui.sh:3154
 msgid "Amended Initial Commit Message:"
 msgstr "Utökat inledande incheckningsmeddelande:"
 
-#: git-gui.sh:3074
+#: git-gui.sh:3155
 msgid "Amended Merge Commit Message:"
 msgstr "Utökat incheckningsmeddelande för sammanslagning:"
 
-#: git-gui.sh:3075
+#: git-gui.sh:3156
 msgid "Merge Commit Message:"
 msgstr "Incheckningsmeddelande för sammanslagning:"
 
-#: git-gui.sh:3076
+#: git-gui.sh:3157
 msgid "Commit Message:"
 msgstr "Incheckningsmeddelande:"
 
-#: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73
+#: git-gui.sh:3206 git-gui.sh:3348 lib/console.tcl:73
 msgid "Copy All"
 msgstr "Kopiera alla"
 
-#: git-gui.sh:3149 lib/blame.tcl:104
+#: git-gui.sh:3230 lib/blame.tcl:104
 msgid "File:"
 msgstr "Fil:"
 
-#: git-gui.sh:3255
+#: git-gui.sh:3336
 msgid "Refresh"
 msgstr "Uppdatera"
 
-#: git-gui.sh:3276
+#: git-gui.sh:3357
 msgid "Decrease Font Size"
 msgstr "Minska teckensnittsstorlek"
 
-#: git-gui.sh:3280
+#: git-gui.sh:3361
 msgid "Increase Font Size"
 msgstr "Öka teckensnittsstorlek"
 
-#: git-gui.sh:3288 lib/blame.tcl:281
+#: git-gui.sh:3369 lib/blame.tcl:281
 msgid "Encoding"
 msgstr "Teckenkodning"
 
-#: git-gui.sh:3299
+#: git-gui.sh:3380
 msgid "Apply/Reverse Hunk"
 msgstr "Använd/Ã¥terställ del"
 
-#: git-gui.sh:3304
+#: git-gui.sh:3385
 msgid "Apply/Reverse Line"
 msgstr "Använd/Ã¥terställ rad"
 
-#: git-gui.sh:3323
+#: git-gui.sh:3404
 msgid "Run Merge Tool"
 msgstr "Starta verktyg för sammanslagning"
 
-#: git-gui.sh:3328
+#: git-gui.sh:3409
 msgid "Use Remote Version"
 msgstr "Använd versionen frÃ¥n fjärrarkivet"
 
-#: git-gui.sh:3332
+#: git-gui.sh:3413
 msgid "Use Local Version"
 msgstr "Använd lokala versionen"
 
-#: git-gui.sh:3336
+#: git-gui.sh:3417
 msgid "Revert To Base"
 msgstr "Ã…terställ till basversionen"
 
-#: git-gui.sh:3354
+#: git-gui.sh:3435
 msgid "Visualize These Changes In The Submodule"
 msgstr "Visualisera Ã¤ndringarna i undermodulen"
 
-#: git-gui.sh:3358
+#: git-gui.sh:3439
 msgid "Visualize Current Branch History In The Submodule"
 msgstr "Visualisera grenens historik i undermodulen"
 
-#: git-gui.sh:3362
+#: git-gui.sh:3443
 msgid "Visualize All Branch History In The Submodule"
 msgstr "Visualisera alla grenars historik i undermodulen"
 
-#: git-gui.sh:3367
+#: git-gui.sh:3448
 msgid "Start git gui In The Submodule"
 msgstr "Starta git gui i undermodulen"
 
-#: git-gui.sh:3389
+#: git-gui.sh:3483
 msgid "Unstage Hunk From Commit"
 msgstr "Ta bort del ur incheckningskö"
 
-#: git-gui.sh:3391
+#: git-gui.sh:3485
 msgid "Unstage Lines From Commit"
 msgstr "Ta bort rader ur incheckningskö"
 
-#: git-gui.sh:3393
+#: git-gui.sh:3487
 msgid "Unstage Line From Commit"
 msgstr "Ta bort rad ur incheckningskö"
 
-#: git-gui.sh:3396
+#: git-gui.sh:3490
 msgid "Stage Hunk For Commit"
 msgstr "Ställ del i incheckningskö"
 
-#: git-gui.sh:3398
+#: git-gui.sh:3492
 msgid "Stage Lines For Commit"
 msgstr "Ställ rader i incheckningskö"
 
-#: git-gui.sh:3400
+#: git-gui.sh:3494
 msgid "Stage Line For Commit"
 msgstr "Ställ rad i incheckningskö"
 
-#: git-gui.sh:3424
+#: git-gui.sh:3519
 msgid "Initializing..."
 msgstr "Initierar..."
 
-#: git-gui.sh:3541
+#: git-gui.sh:3658
 #, tcl-format
 msgid ""
 "Possible environment issues exist.\n"
@@ -549,7 +549,7 @@ msgstr ""
 "av %s:\n"
 "\n"
 
-#: git-gui.sh:3570
+#: git-gui.sh:3687
 msgid ""
 "\n"
 "This is due to a known issue with the\n"
@@ -559,7 +559,7 @@ msgstr ""
 "Detta beror pÃ¥ ett känt problem med\n"
 "Tcl-binären som följer med Cygwin."
 
-#: git-gui.sh:3575
+#: git-gui.sh:3692
 #, tcl-format
 msgid ""
 "\n"
@@ -613,132 +613,132 @@ msgstr "Klandra föräldraincheckning"
 msgid "Reading %s..."
 msgstr "Läser %s..."
 
-#: lib/blame.tcl:557
+#: lib/blame.tcl:581
 msgid "Loading copy/move tracking annotations..."
 msgstr "Läser annoteringar för kopiering/flyttning..."
 
-#: lib/blame.tcl:577
+#: lib/blame.tcl:601
 msgid "lines annotated"
 msgstr "rader annoterade"
 
-#: lib/blame.tcl:769
+#: lib/blame.tcl:793
 msgid "Loading original location annotations..."
 msgstr "Läser in annotering av originalplacering..."
 
-#: lib/blame.tcl:772
+#: lib/blame.tcl:796
 msgid "Annotation complete."
 msgstr "Annotering fullbordad."
 
-#: lib/blame.tcl:802
+#: lib/blame.tcl:826
 msgid "Busy"
 msgstr "Upptagen"
 
-#: lib/blame.tcl:803
+#: lib/blame.tcl:827
 msgid "Annotation process is already running."
 msgstr "Annoteringsprocess körs redan."
 
-#: lib/blame.tcl:842
+#: lib/blame.tcl:866
 msgid "Running thorough copy detection..."
 msgstr "Kör grundlig kopieringsigenkänning..."
 
-#: lib/blame.tcl:910
+#: lib/blame.tcl:934
 msgid "Loading annotation..."
 msgstr "Läser in annotering..."
 
-#: lib/blame.tcl:963
+#: lib/blame.tcl:987
 msgid "Author:"
 msgstr "Författare:"
 
-#: lib/blame.tcl:967
+#: lib/blame.tcl:991
 msgid "Committer:"
 msgstr "Incheckare:"
 
-#: lib/blame.tcl:972
+#: lib/blame.tcl:996
 msgid "Original File:"
 msgstr "Ursprunglig fil:"
 
-#: lib/blame.tcl:1020
+#: lib/blame.tcl:1044
 msgid "Cannot find HEAD commit:"
 msgstr "Hittar inte incheckning för HEAD:"
 
-#: lib/blame.tcl:1075
+#: lib/blame.tcl:1099
 msgid "Cannot find parent commit:"
 msgstr "Hittar inte föräldraincheckning:"
 
-#: lib/blame.tcl:1090
+#: lib/blame.tcl:1114
 msgid "Unable to display parent"
 msgstr "Kan inte visa förälder"
 
-#: lib/blame.tcl:1091 lib/diff.tcl:320
+#: lib/blame.tcl:1115 lib/diff.tcl:323
 msgid "Error loading diff:"
 msgstr "Fel vid inläsning av differens:"
 
-#: lib/blame.tcl:1231
+#: lib/blame.tcl:1255
 msgid "Originally By:"
 msgstr "Ursprungligen av:"
 
-#: lib/blame.tcl:1237
+#: lib/blame.tcl:1261
 msgid "In File:"
 msgstr "I filen:"
 
-#: lib/blame.tcl:1242
+#: lib/blame.tcl:1266
 msgid "Copied Or Moved Here By:"
 msgstr "Kopierad eller flyttad hit av:"
 
-#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19
+#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
 msgid "Checkout Branch"
 msgstr "Checka ut gren"
 
-#: lib/branch_checkout.tcl:23
+#: lib/branch_checkout.tcl:26
 msgid "Checkout"
 msgstr "Checka ut"
 
-#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35
-#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282
-#: lib/checkout_op.tcl:579 lib/choose_font.tcl:43 lib/merge.tcl:172
-#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42
-#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352
-#: lib/transport.tcl:108
+#: lib/branch_checkout.tcl:30 lib/branch_create.tcl:37
+#: lib/branch_delete.tcl:34 lib/branch_rename.tcl:32 lib/browser.tcl:286
+#: lib/checkout_op.tcl:579 lib/choose_font.tcl:45 lib/merge.tcl:172
+#: lib/option.tcl:127 lib/remote_add.tcl:34 lib/remote_branch_delete.tcl:43
+#: lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345
+#: lib/transport.tcl:111
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328
+#: lib/branch_checkout.tcl:35 lib/browser.tcl:291 lib/tools_dlg.tcl:321
 msgid "Revision"
 msgstr "Revision"
 
-#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280
+#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 lib/option.tcl:287
 msgid "Options"
 msgstr "Alternativ"
 
-#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92
+#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
 msgid "Fetch Tracking Branch"
 msgstr "Hämta spÃ¥rande gren"
 
-#: lib/branch_checkout.tcl:44
+#: lib/branch_checkout.tcl:47
 msgid "Detach From Local Branch"
 msgstr "Koppla bort frÃ¥n lokal gren"
 
-#: lib/branch_create.tcl:22
+#: lib/branch_create.tcl:23
 msgid "Create Branch"
 msgstr "Skapa gren"
 
-#: lib/branch_create.tcl:27
+#: lib/branch_create.tcl:28
 msgid "Create New Branch"
 msgstr "Skapa ny gren"
 
-#: lib/branch_create.tcl:31 lib/choose_repository.tcl:381
+#: lib/branch_create.tcl:33 lib/choose_repository.tcl:389
 msgid "Create"
 msgstr "Skapa"
 
-#: lib/branch_create.tcl:40
+#: lib/branch_create.tcl:42
 msgid "Branch Name"
 msgstr "Namn pÃ¥ gren"
 
-#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50
+#: lib/branch_create.tcl:44 lib/remote_add.tcl:41 lib/tools_dlg.tcl:51
 msgid "Name:"
 msgstr "Namn:"
 
-#: lib/branch_create.tcl:58
+#: lib/branch_create.tcl:57
 msgid "Match Tracking Branch Name"
 msgstr "Använd namn pÃ¥ spÃ¥rad gren"
 
@@ -766,41 +766,41 @@ msgstr "Ã…terställ"
 msgid "Checkout After Creation"
 msgstr "Checka ut när skapad"
 
-#: lib/branch_create.tcl:131
+#: lib/branch_create.tcl:132
 msgid "Please select a tracking branch."
 msgstr "Välj en gren att spÃ¥ra."
 
-#: lib/branch_create.tcl:140
+#: lib/branch_create.tcl:141
 #, tcl-format
 msgid "Tracking branch %s is not a branch in the remote repository."
 msgstr "Den spÃ¥rade grenen %s Ã¤r inte en gren i fjärrarkivet."
 
-#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86
+#: lib/branch_create.tcl:154 lib/branch_rename.tcl:92
 msgid "Please supply a branch name."
 msgstr "Ange ett namn för grenen."
 
-#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106
+#: lib/branch_create.tcl:165 lib/branch_rename.tcl:112
 #, tcl-format
 msgid "'%s' is not an acceptable branch name."
 msgstr "\"%s\" kan inte användas som namn pÃ¥ grenen."
 
-#: lib/branch_delete.tcl:15
+#: lib/branch_delete.tcl:16
 msgid "Delete Branch"
 msgstr "Ta bort gren"
 
-#: lib/branch_delete.tcl:20
+#: lib/branch_delete.tcl:21
 msgid "Delete Local Branch"
 msgstr "Ta bort lokal gren"
 
-#: lib/branch_delete.tcl:37
+#: lib/branch_delete.tcl:39
 msgid "Local Branches"
 msgstr "Lokala grenar"
 
-#: lib/branch_delete.tcl:52
+#: lib/branch_delete.tcl:51
 msgid "Delete Only If Merged Into"
 msgstr "Ta bara bort om sammanslagen med"
 
-#: lib/branch_delete.tcl:54 lib/remote_branch_delete.tcl:119
+#: lib/branch_delete.tcl:53 lib/remote_branch_delete.tcl:120
 msgid "Always (Do not perform merge checks)"
 msgstr "Alltid (utför inte sammanslagningstest)"
 
@@ -809,7 +809,7 @@ msgstr "Alltid (utför inte sammanslagningstest)"
 msgid "The following branches are not completely merged into %s:"
 msgstr "Följande grenar Ã¤r inte till fullo sammanslagna med %s:"
 
-#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:217
+#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:218
 msgid ""
 "Recovering deleted branches is difficult.\n"
 "\n"
@@ -828,32 +828,32 @@ msgstr ""
 "Kunde inte ta bort grenar:\n"
 "%s"
 
-#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22
+#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
 msgid "Rename Branch"
 msgstr "Byt namn pÃ¥ gren"
 
-#: lib/branch_rename.tcl:26
+#: lib/branch_rename.tcl:28
 msgid "Rename"
 msgstr "Byt namn"
 
-#: lib/branch_rename.tcl:36
+#: lib/branch_rename.tcl:38
 msgid "Branch:"
 msgstr "Gren:"
 
-#: lib/branch_rename.tcl:39
+#: lib/branch_rename.tcl:46
 msgid "New Name:"
 msgstr "Nytt namn:"
 
-#: lib/branch_rename.tcl:75
+#: lib/branch_rename.tcl:81
 msgid "Please select a branch to rename."
 msgstr "Välj en gren att byta namn pÃ¥."
 
-#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202
+#: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202
 #, tcl-format
 msgid "Branch '%s' already exists."
 msgstr "Grenen \"%s\" finns redan."
 
-#: lib/branch_rename.tcl:117
+#: lib/branch_rename.tcl:123
 #, tcl-format
 msgid "Failed to rename '%s'."
 msgstr "Kunde inte byta namn pÃ¥ \"%s\"."
@@ -862,7 +862,7 @@ msgstr "Kunde inte byta namn pÃ¥ \"%s\"."
 msgid "Starting..."
 msgstr "Startar..."
 
-#: lib/browser.tcl:26
+#: lib/browser.tcl:27
 msgid "File Browser"
 msgstr "Filbläddrare"
 
@@ -875,13 +875,13 @@ msgstr "Läser %s..."
 msgid "[Up To Parent]"
 msgstr "[Upp till förälder]"
 
-#: lib/browser.tcl:267 lib/browser.tcl:273
+#: lib/browser.tcl:269 lib/browser.tcl:276
 msgid "Browse Branch Files"
 msgstr "Bläddra filer pÃ¥ grenen"
 
-#: lib/browser.tcl:278 lib/choose_repository.tcl:398
-#: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497
-#: lib/choose_repository.tcl:1028
+#: lib/browser.tcl:282 lib/choose_repository.tcl:404
+#: lib/choose_repository.tcl:491 lib/choose_repository.tcl:500
+#: lib/choose_repository.tcl:1027
 msgid "Browse"
 msgstr "Bläddra"
 
@@ -895,8 +895,8 @@ msgstr "Hämtar %s frÃ¥n %s"
 msgid "fatal: Cannot resolve %s"
 msgstr "ödesdigert: Kunde inte slÃ¥ upp %s"
 
-#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:31
-#: lib/sshkey.tcl:53
+#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30
+#: lib/sshkey.tcl:55
 msgid "Close"
 msgstr "Stäng"
 
@@ -1008,7 +1008,7 @@ msgstr "Det kanske inte Ã¤r sÃ¥ enkelt att Ã¥terskapa förlorade incheckningar."
 msgid "Reset '%s'?"
 msgstr "Ã…terställa \"%s\"?"
 
-#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343
+#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:336
 msgid "Visualize"
 msgstr "Visualisera"
 
@@ -1029,23 +1029,23 @@ msgstr ""
 "\n"
 "Detta skulle inte ha hänt. %s kommer nu stängas och ge upp."
 
-#: lib/choose_font.tcl:39
+#: lib/choose_font.tcl:41
 msgid "Select"
 msgstr "Välj"
 
-#: lib/choose_font.tcl:53
+#: lib/choose_font.tcl:55
 msgid "Font Family"
 msgstr "Teckensnittsfamilj"
 
-#: lib/choose_font.tcl:74
+#: lib/choose_font.tcl:76
 msgid "Font Size"
 msgstr "Storlek"
 
-#: lib/choose_font.tcl:91
+#: lib/choose_font.tcl:93
 msgid "Font Example"
 msgstr "Exempel"
 
-#: lib/choose_font.tcl:103
+#: lib/choose_font.tcl:105
 msgid ""
 "This is example text.\n"
 "If you like this text, it can be your font."
@@ -1057,7 +1057,7 @@ msgstr ""
 msgid "Git Gui"
 msgstr "Git Gui"
 
-#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:386
+#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:394
 msgid "Create New Repository"
 msgstr "Skapa nytt arkiv"
 
@@ -1065,76 +1065,76 @@ msgstr "Skapa nytt arkiv"
 msgid "New..."
 msgstr "Nytt..."
 
-#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471
+#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:478
 msgid "Clone Existing Repository"
 msgstr "Klona befintligt arkiv"
 
-#: lib/choose_repository.tcl:106
+#: lib/choose_repository.tcl:111
 msgid "Clone..."
 msgstr "Klona..."
 
-#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016
+#: lib/choose_repository.tcl:118 lib/choose_repository.tcl:1017
 msgid "Open Existing Repository"
 msgstr "Öppna befintligt arkiv"
 
-#: lib/choose_repository.tcl:119
+#: lib/choose_repository.tcl:124
 msgid "Open..."
 msgstr "Öppna..."
 
-#: lib/choose_repository.tcl:132
+#: lib/choose_repository.tcl:137
 msgid "Recent Repositories"
 msgstr "Senaste arkiven"
 
-#: lib/choose_repository.tcl:138
+#: lib/choose_repository.tcl:143
 msgid "Open Recent Repository:"
 msgstr "Öppna tidigare arkiv:"
 
-#: lib/choose_repository.tcl:306 lib/choose_repository.tcl:313
-#: lib/choose_repository.tcl:320
+#: lib/choose_repository.tcl:313 lib/choose_repository.tcl:320
+#: lib/choose_repository.tcl:327
 #, tcl-format
 msgid "Failed to create repository %s:"
 msgstr "Kunde inte skapa arkivet %s:"
 
-#: lib/choose_repository.tcl:391
+#: lib/choose_repository.tcl:399
 msgid "Directory:"
 msgstr "Katalog:"
 
-#: lib/choose_repository.tcl:423 lib/choose_repository.tcl:550
-#: lib/choose_repository.tcl:1052
+#: lib/choose_repository.tcl:429 lib/choose_repository.tcl:550
+#: lib/choose_repository.tcl:1051
 msgid "Git Repository"
 msgstr "Gitarkiv"
 
-#: lib/choose_repository.tcl:448
+#: lib/choose_repository.tcl:454
 #, tcl-format
 msgid "Directory %s already exists."
 msgstr "Katalogen %s finns redan."
 
-#: lib/choose_repository.tcl:452
+#: lib/choose_repository.tcl:458
 #, tcl-format
 msgid "File %s already exists."
 msgstr "Filen %s finns redan."
 
-#: lib/choose_repository.tcl:466
+#: lib/choose_repository.tcl:473
 msgid "Clone"
 msgstr "Klona"
 
-#: lib/choose_repository.tcl:479
+#: lib/choose_repository.tcl:486
 msgid "Source Location:"
 msgstr "Plats för källkod:"
 
-#: lib/choose_repository.tcl:490
+#: lib/choose_repository.tcl:495
 msgid "Target Directory:"
 msgstr "MÃ¥lkatalog:"
 
-#: lib/choose_repository.tcl:502
+#: lib/choose_repository.tcl:505
 msgid "Clone Type:"
 msgstr "Typ av klon:"
 
-#: lib/choose_repository.tcl:508
+#: lib/choose_repository.tcl:510
 msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
 msgstr "Standard (snabb, semiredundant, hÃ¥rda länkar)"
 
-#: lib/choose_repository.tcl:514
+#: lib/choose_repository.tcl:515
 msgid "Full Copy (Slower, Redundant Backup)"
 msgstr "Full kopia (lÃ¥ngsammare, redundant säkerhetskopia)"
 
@@ -1144,7 +1144,7 @@ msgstr "Delad (snabbast, rekommenderas ej, ingen säkerhetskopia)"
 
 #: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603
 #: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819
-#: lib/choose_repository.tcl:1058 lib/choose_repository.tcl:1066
+#: lib/choose_repository.tcl:1057 lib/choose_repository.tcl:1065
 #, tcl-format
 msgid "Not a Git repository: %s"
 msgstr "Inte ett Gitarkiv: %s"
@@ -1258,8 +1258,8 @@ msgstr "Kunde inte slÃ¥ upp %s till nÃ¥gon incheckning."
 msgid "Creating working directory"
 msgstr "Skapar arbetskatalog"
 
-#: lib/choose_repository.tcl:939 lib/index.tcl:67 lib/index.tcl:130
-#: lib/index.tcl:198
+#: lib/choose_repository.tcl:939 lib/index.tcl:70 lib/index.tcl:133
+#: lib/index.tcl:201
 msgid "files"
 msgstr "filer"
 
@@ -1267,20 +1267,20 @@ msgstr "filer"
 msgid "Initial file checkout failed."
 msgstr "Inledande filutcheckning misslyckades."
 
-#: lib/choose_repository.tcl:1011
+#: lib/choose_repository.tcl:1012
 msgid "Open"
 msgstr "Öppna"
 
-#: lib/choose_repository.tcl:1021
+#: lib/choose_repository.tcl:1022
 msgid "Repository:"
 msgstr "Arkiv:"
 
-#: lib/choose_repository.tcl:1072
+#: lib/choose_repository.tcl:1071
 #, tcl-format
 msgid "Failed to open repository %s:"
 msgstr "Kunde inte Ã¶ppna arkivet %s:"
 
-#: lib/choose_rev.tcl:53
+#: lib/choose_rev.tcl:52
 msgid "This Detached Checkout"
 msgstr "Denna frÃ¥nkopplade utcheckning"
 
@@ -1288,36 +1288,36 @@ msgstr "Denna frÃ¥nkopplade utcheckning"
 msgid "Revision Expression:"
 msgstr "Revisionsuttryck:"
 
-#: lib/choose_rev.tcl:74
+#: lib/choose_rev.tcl:72
 msgid "Local Branch"
 msgstr "Lokal gren"
 
-#: lib/choose_rev.tcl:79
+#: lib/choose_rev.tcl:77
 msgid "Tracking Branch"
 msgstr "SpÃ¥rande gren"
 
-#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:543
 msgid "Tag"
 msgstr "Tagg"
 
-#: lib/choose_rev.tcl:317
+#: lib/choose_rev.tcl:321
 #, tcl-format
 msgid "Invalid revision: %s"
 msgstr "Ogiltig revision: %s"
 
-#: lib/choose_rev.tcl:338
+#: lib/choose_rev.tcl:342
 msgid "No revision selected."
 msgstr "Ingen revision vald."
 
-#: lib/choose_rev.tcl:346
+#: lib/choose_rev.tcl:350
 msgid "Revision expression is empty."
 msgstr "Revisionsuttrycket Ã¤r tomt."
 
-#: lib/choose_rev.tcl:531
+#: lib/choose_rev.tcl:536
 msgid "Updated"
 msgstr "Uppdaterad"
 
-#: lib/choose_rev.tcl:559
+#: lib/choose_rev.tcl:564
 msgid "URL"
 msgstr "Webbadress"
 
@@ -1508,31 +1508,31 @@ msgstr "Lyckades"
 msgid "Error: Command Failed"
 msgstr "Fel: Kommando misslyckades"
 
-#: lib/database.tcl:43
+#: lib/database.tcl:42
 msgid "Number of loose objects"
 msgstr "Antal lösa objekt"
 
-#: lib/database.tcl:44
+#: lib/database.tcl:43
 msgid "Disk space used by loose objects"
 msgstr "Diskutrymme använt av lösa objekt"
 
-#: lib/database.tcl:45
+#: lib/database.tcl:44
 msgid "Number of packed objects"
 msgstr "Antal packade objekt"
 
-#: lib/database.tcl:46
+#: lib/database.tcl:45
 msgid "Number of packs"
 msgstr "Antal paket"
 
-#: lib/database.tcl:47
+#: lib/database.tcl:46
 msgid "Disk space used by packed objects"
 msgstr "Diskutrymme använt av packade objekt"
 
-#: lib/database.tcl:48
+#: lib/database.tcl:47
 msgid "Packed objects waiting for pruning"
 msgstr "Packade objekt som väntar pÃ¥ städning"
 
-#: lib/database.tcl:49
+#: lib/database.tcl:48
 msgid "Garbage files"
 msgstr "Skräpfiler"
 
@@ -1618,7 +1618,7 @@ msgstr "LOKAL:\n"
 msgid "REMOTE:\n"
 msgstr "FJÄRR:\n"
 
-#: lib/diff.tcl:202 lib/diff.tcl:319
+#: lib/diff.tcl:202 lib/diff.tcl:322
 #, tcl-format
 msgid "Unable to display %s"
 msgstr "Kan inte visa %s"
@@ -1655,19 +1655,19 @@ msgstr ""
 "* Den ospÃ¥rade filen klipptes här av %s.\n"
 "* För att se hela filen, använd ett externt redigeringsprogram.\n"
 
-#: lib/diff.tcl:482
+#: lib/diff.tcl:485
 msgid "Failed to unstage selected hunk."
 msgstr "Kunde inte ta bort den valda delen frÃ¥n kön."
 
-#: lib/diff.tcl:489
+#: lib/diff.tcl:492
 msgid "Failed to stage selected hunk."
 msgstr "Kunde inte lägga till den valda delen till kön."
 
-#: lib/diff.tcl:568
+#: lib/diff.tcl:571
 msgid "Failed to unstage selected line."
 msgstr "Kunde inte ta bort den valda raden frÃ¥n kön."
 
-#: lib/diff.tcl:576
+#: lib/diff.tcl:579
 msgid "Failed to stage selected line."
 msgstr "Kunde inte lägga till den valda raden till kön."
 
@@ -1684,7 +1684,7 @@ msgstr "Systemets (%s)"
 msgid "Other"
 msgstr "Annan"
 
-#: lib/error.tcl:20 lib/error.tcl:114
+#: lib/error.tcl:20 lib/error.tcl:116
 msgid "error"
 msgstr "fel"
 
@@ -1692,7 +1692,7 @@ msgstr "fel"
 msgid "warning"
 msgstr "varning"
 
-#: lib/error.tcl:94
+#: lib/error.tcl:96
 msgid "You must correct the above errors before committing."
 msgstr "Du mÃ¥ste rätta till felen ovan innan du checkar in."
 
@@ -1700,11 +1700,11 @@ msgstr "Du mÃ¥ste rätta till felen ovan innan du checkar in."
 msgid "Unable to unlock the index."
 msgstr "Kunde inte lÃ¥sa upp indexet."
 
-#: lib/index.tcl:15
+#: lib/index.tcl:17
 msgid "Index Error"
 msgstr "Indexfel"
 
-#: lib/index.tcl:17
+#: lib/index.tcl:19
 msgid ""
 "Updating the Git index failed.  A rescan will be automatically started to "
 "resynchronize git-gui."
@@ -1712,52 +1712,52 @@ msgstr ""
 "Misslyckades med att uppdatera Gitindexet. En omsökning kommer att startas "
 "automatiskt för att synkronisera om git-gui."
 
-#: lib/index.tcl:28
+#: lib/index.tcl:30
 msgid "Continue"
 msgstr "Forstätt"
 
-#: lib/index.tcl:31
+#: lib/index.tcl:33
 msgid "Unlock Index"
 msgstr "LÃ¥s upp index"
 
-#: lib/index.tcl:289
+#: lib/index.tcl:292
 #, tcl-format
 msgid "Unstaging %s from commit"
 msgstr "Tar bort %s för incheckningskön"
 
-#: lib/index.tcl:328
+#: lib/index.tcl:331
 msgid "Ready to commit."
 msgstr "Redo att checka in."
 
-#: lib/index.tcl:341
+#: lib/index.tcl:344
 #, tcl-format
 msgid "Adding %s"
 msgstr "Lägger till %s"
 
-#: lib/index.tcl:398
+#: lib/index.tcl:401
 #, tcl-format
 msgid "Revert changes in file %s?"
 msgstr "Ã…terställ Ã¤ndringarna i filen %s?"
 
-#: lib/index.tcl:400
+#: lib/index.tcl:403
 #, tcl-format
 msgid "Revert changes in these %i files?"
 msgstr "Ã…terställ Ã¤ndringarna i dessa %i filer?"
 
-#: lib/index.tcl:408
+#: lib/index.tcl:411
 msgid "Any unstaged changes will be permanently lost by the revert."
 msgstr ""
 "Alla oköade Ã¤ndringar kommer permanent gÃ¥ förlorade vid Ã¥terställningen."
 
-#: lib/index.tcl:411
+#: lib/index.tcl:414
 msgid "Do Nothing"
 msgstr "Gör ingenting"
 
-#: lib/index.tcl:429
+#: lib/index.tcl:432
 msgid "Reverting selected files"
 msgstr "Ã…terställer valda filer"
 
-#: lib/index.tcl:433
+#: lib/index.tcl:436
 #, tcl-format
 msgid "Reverting %s"
 msgstr "Ã…terställer %s"
@@ -2004,145 +2004,133 @@ msgstr "Den globala teckenkodningen \"%s\" Ã¤r ogiltig"
 msgid "Invalid repo encoding '%s'"
 msgstr "Arkivets teckenkodning \"%s\" Ã¤r ogiltig"
 
-#: lib/option.tcl:117
+#: lib/option.tcl:119
 msgid "Restore Defaults"
 msgstr "Ã…terställ standardvärden"
 
-#: lib/option.tcl:121
+#: lib/option.tcl:123
 msgid "Save"
 msgstr "Spara"
 
-#: lib/option.tcl:131
+#: lib/option.tcl:133
 #, tcl-format
 msgid "%s Repository"
 msgstr "Arkivet %s"
 
-#: lib/option.tcl:132
+#: lib/option.tcl:134
 msgid "Global (All Repositories)"
 msgstr "Globalt (alla arkiv)"
 
-#: lib/option.tcl:138
+#: lib/option.tcl:140
 msgid "User Name"
 msgstr "Användarnamn"
 
-#: lib/option.tcl:139
+#: lib/option.tcl:141
 msgid "Email Address"
 msgstr "E-postadress"
 
-#: lib/option.tcl:141
+#: lib/option.tcl:143
 msgid "Summarize Merge Commits"
 msgstr "Summera sammanslagningsincheckningar"
 
-#: lib/option.tcl:142
+#: lib/option.tcl:144
 msgid "Merge Verbosity"
 msgstr "Pratsamhet för sammanslagningar"
 
-#: lib/option.tcl:143
+#: lib/option.tcl:145
 msgid "Show Diffstat After Merge"
 msgstr "Visa diffstatistik efter sammanslagning"
 
-#: lib/option.tcl:144
+#: lib/option.tcl:146
 msgid "Use Merge Tool"
 msgstr "Använd verktyg för sammanslagning"
 
-#: lib/option.tcl:146
+#: lib/option.tcl:148
 msgid "Trust File Modification Timestamps"
 msgstr "Lita pÃ¥ filändringstidsstämplar"
 
-#: lib/option.tcl:147
+#: lib/option.tcl:149
 msgid "Prune Tracking Branches During Fetch"
 msgstr "Städa spÃ¥rade grenar vid hämtning"
 
-#: lib/option.tcl:148
+#: lib/option.tcl:150
 msgid "Match Tracking Branches"
 msgstr "Matcha spÃ¥rade grenar"
 
-#: lib/option.tcl:149
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "Använd Textconv för diff och klandring"
+
+#: lib/option.tcl:152
 msgid "Blame Copy Only On Changed Files"
 msgstr "Klandra kopiering bara i Ã¤ndrade filer"
 
-#: lib/option.tcl:150
+#: lib/option.tcl:153
 msgid "Minimum Letters To Blame Copy On"
 msgstr "Minsta antal tecken att klandra kopiering för"
 
-#: lib/option.tcl:151
+#: lib/option.tcl:154
 msgid "Blame History Context Radius (days)"
 msgstr "Historikradie för klandring (dagar)"
 
-#: lib/option.tcl:152
+#: lib/option.tcl:155
 msgid "Number of Diff Context Lines"
 msgstr "Antal rader sammanhang i differenser"
 
-#: lib/option.tcl:153
+#: lib/option.tcl:156
 msgid "Commit Message Text Width"
 msgstr "Textbredd för incheckningsmeddelande"
 
-#: lib/option.tcl:154
+#: lib/option.tcl:157
 msgid "New Branch Name Template"
 msgstr "Mall för namn pÃ¥ nya grenar"
 
-#: lib/option.tcl:155
+#: lib/option.tcl:158
 msgid "Default File Contents Encoding"
 msgstr "Standardteckenkodning för filinnehÃ¥ll"
 
-#: lib/option.tcl:203
+#: lib/option.tcl:204
 msgid "Change"
 msgstr "Ändra"
 
-#: lib/option.tcl:230
+#: lib/option.tcl:231
 msgid "Spelling Dictionary:"
 msgstr "Stavningsordlista:"
 
-#: lib/option.tcl:254
+#: lib/option.tcl:261
 msgid "Change Font"
 msgstr "Byt teckensnitt"
 
-#: lib/option.tcl:258
+#: lib/option.tcl:265
 #, tcl-format
 msgid "Choose %s"
 msgstr "Välj %s"
 
-#: lib/option.tcl:264
+#: lib/option.tcl:271
 msgid "pt."
 msgstr "p."
 
-#: lib/option.tcl:278
+#: lib/option.tcl:285
 msgid "Preferences"
 msgstr "Inställningar"
 
-#: lib/option.tcl:314
+#: lib/option.tcl:322
 msgid "Failed to completely save options:"
 msgstr "Misslyckades med att helt spara alternativ:"
 
-#: lib/remote.tcl:163
-msgid "Remove Remote"
-msgstr "Ta bort fjärrarkiv"
-
-#: lib/remote.tcl:168
-msgid "Prune from"
-msgstr "Ta bort frÃ¥n"
-
-#: lib/remote.tcl:173
-msgid "Fetch from"
-msgstr "Hämta frÃ¥n"
-
-#: lib/remote.tcl:215
-msgid "Push to"
-msgstr "Sänd till"
-
-#: lib/remote_add.tcl:19
+#: lib/remote_add.tcl:20
 msgid "Add Remote"
 msgstr "Lägg till fjärrarkiv"
 
-#: lib/remote_add.tcl:24
+#: lib/remote_add.tcl:25
 msgid "Add New Remote"
 msgstr "Lägg till nytt fjärrarkiv"
 
-#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36
+#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
 msgid "Add"
 msgstr "Lägg till"
 
-#: lib/remote_add.tcl:37
+#: lib/remote_add.tcl:39
 msgid "Remote Details"
 msgstr "Detaljer för fjärrarkiv"
 
@@ -2150,58 +2138,58 @@ msgstr "Detaljer för fjärrarkiv"
 msgid "Location:"
 msgstr "Plats:"
 
-#: lib/remote_add.tcl:62
+#: lib/remote_add.tcl:60
 msgid "Further Action"
 msgstr "Ytterligare Ã¥tgärd"
 
-#: lib/remote_add.tcl:65
+#: lib/remote_add.tcl:63
 msgid "Fetch Immediately"
 msgstr "Hämta omedelbart"
 
-#: lib/remote_add.tcl:71
+#: lib/remote_add.tcl:69
 msgid "Initialize Remote Repository and Push"
 msgstr "Initiera fjärrarkiv och sänd till"
 
-#: lib/remote_add.tcl:77
+#: lib/remote_add.tcl:75
 msgid "Do Nothing Else Now"
 msgstr "Gör ingent mer nu"
 
-#: lib/remote_add.tcl:101
+#: lib/remote_add.tcl:100
 msgid "Please supply a remote name."
 msgstr "Ange ett namn för fjärrarkivet."
 
-#: lib/remote_add.tcl:114
+#: lib/remote_add.tcl:113
 #, tcl-format
 msgid "'%s' is not an acceptable remote name."
 msgstr "\"%s\" kan inte användas som namn pÃ¥ fjärrarkivet."
 
-#: lib/remote_add.tcl:125
+#: lib/remote_add.tcl:124
 #, tcl-format
 msgid "Failed to add remote '%s' of location '%s'."
 msgstr "Kunde inte lägga till fjärrarkivet \"%s\" pÃ¥ platsen \"%s\"."
 
-#: lib/remote_add.tcl:133 lib/transport.tcl:6
+#: lib/remote_add.tcl:132 lib/transport.tcl:6
 #, tcl-format
 msgid "fetch %s"
 msgstr "hämta %s"
 
-#: lib/remote_add.tcl:134
+#: lib/remote_add.tcl:133
 #, tcl-format
 msgid "Fetching the %s"
 msgstr "Hämtar %s"
 
-#: lib/remote_add.tcl:157
+#: lib/remote_add.tcl:156
 #, tcl-format
 msgid "Do not know how to initialize repository at location '%s'."
 msgstr "Vet inte hur arkivet pÃ¥ platsen \"%s\" skall initieras."
 
-#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63
+#: lib/remote_add.tcl:162 lib/transport.tcl:25 lib/transport.tcl:63
 #: lib/transport.tcl:81
 #, tcl-format
 msgid "push %s"
 msgstr "sänd %s"
 
-#: lib/remote_add.tcl:164
+#: lib/remote_add.tcl:163
 #, tcl-format
 msgid "Setting up the %s (at %s)"
 msgstr "Konfigurerar %s (pÃ¥ %s)"
@@ -2210,35 +2198,35 @@ msgstr "Konfigurerar %s (pÃ¥ %s)"
 msgid "Delete Branch Remotely"
 msgstr "Ta bort gren frÃ¥n fjärrarkiv"
 
-#: lib/remote_branch_delete.tcl:47
+#: lib/remote_branch_delete.tcl:48
 msgid "From Repository"
 msgstr "FrÃ¥n arkiv"
 
-#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134
+#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:134
 msgid "Remote:"
 msgstr "Fjärrarkiv:"
 
-#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149
+#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:154
 msgid "Arbitrary Location:"
 msgstr "Godtycklig plats:"
 
-#: lib/remote_branch_delete.tcl:84
+#: lib/remote_branch_delete.tcl:88
 msgid "Branches"
 msgstr "Grenar"
 
-#: lib/remote_branch_delete.tcl:109
+#: lib/remote_branch_delete.tcl:110
 msgid "Delete Only If"
 msgstr "Ta endast bort om"
 
-#: lib/remote_branch_delete.tcl:111
+#: lib/remote_branch_delete.tcl:112
 msgid "Merged Into:"
 msgstr "Sammanslagen i:"
 
-#: lib/remote_branch_delete.tcl:152
+#: lib/remote_branch_delete.tcl:153
 msgid "A branch is required for 'Merged Into'."
 msgstr "En gren krävs för \"Sammanslagen i\"."
 
-#: lib/remote_branch_delete.tcl:184
+#: lib/remote_branch_delete.tcl:185
 #, tcl-format
 msgid ""
 "The following branches are not completely merged into %s:\n"
@@ -2249,7 +2237,7 @@ msgstr ""
 "\n"
 " - %s"
 
-#: lib/remote_branch_delete.tcl:189
+#: lib/remote_branch_delete.tcl:190
 #, tcl-format
 msgid ""
 "One or more of the merge tests failed because you have not fetched the "
@@ -2258,37 +2246,53 @@ msgstr ""
 "En eller flera av sammanslagningstesterna misslyckades eftersom du inte har "
 "hämtat de nödvändiga incheckningarna. Försök hämta frÃ¥n %s först."
 
-#: lib/remote_branch_delete.tcl:207
+#: lib/remote_branch_delete.tcl:208
 msgid "Please select one or more branches to delete."
 msgstr "Välj en eller flera grenar att ta bort."
 
-#: lib/remote_branch_delete.tcl:226
+#: lib/remote_branch_delete.tcl:227
 #, tcl-format
 msgid "Deleting branches from %s"
 msgstr "Tar bort grenar frÃ¥n %s"
 
-#: lib/remote_branch_delete.tcl:292
+#: lib/remote_branch_delete.tcl:293
 msgid "No repository selected."
 msgstr "Inget arkiv markerat."
 
-#: lib/remote_branch_delete.tcl:297
+#: lib/remote_branch_delete.tcl:298
 #, tcl-format
 msgid "Scanning %s..."
 msgstr "Söker %s..."
 
-#: lib/search.tcl:21
+#: lib/remote.tcl:163
+msgid "Remove Remote"
+msgstr "Ta bort fjärrarkiv"
+
+#: lib/remote.tcl:168
+msgid "Prune from"
+msgstr "Ta bort frÃ¥n"
+
+#: lib/remote.tcl:173
+msgid "Fetch from"
+msgstr "Hämta frÃ¥n"
+
+#: lib/remote.tcl:215
+msgid "Push to"
+msgstr "Sänd till"
+
+#: lib/search.tcl:22
 msgid "Find:"
 msgstr "Sök:"
 
-#: lib/search.tcl:23
+#: lib/search.tcl:24
 msgid "Next"
 msgstr "Nästa"
 
-#: lib/search.tcl:24
+#: lib/search.tcl:25
 msgid "Prev"
 msgstr "Föreg"
 
-#: lib/search.tcl:25
+#: lib/search.tcl:26
 msgid "Case-Sensitive"
 msgstr "Skilj pÃ¥ VERSALER/gemener"
 
@@ -2350,19 +2354,19 @@ msgstr "Hittade Ã¶ppen nyckel i: %s"
 msgid "Generate Key"
 msgstr "Skapa nyckel"
 
-#: lib/sshkey.tcl:56
+#: lib/sshkey.tcl:58
 msgid "Copy To Clipboard"
 msgstr "Kopiera till Urklipp"
 
-#: lib/sshkey.tcl:70
+#: lib/sshkey.tcl:72
 msgid "Your OpenSSH Public Key"
 msgstr "Din Ã¶ppna OpenSSH-nyckel"
 
-#: lib/sshkey.tcl:78
+#: lib/sshkey.tcl:80
 msgid "Generating..."
 msgstr "Skapar..."
 
-#: lib/sshkey.tcl:84
+#: lib/sshkey.tcl:86
 #, tcl-format
 msgid ""
 "Could not start ssh-keygen:\n"
@@ -2373,54 +2377,24 @@ msgstr ""
 "\n"
 "%s"
 
-#: lib/sshkey.tcl:111
+#: lib/sshkey.tcl:113
 msgid "Generation failed."
 msgstr "Misslyckades med att skapa."
 
-#: lib/sshkey.tcl:118
+#: lib/sshkey.tcl:120
 msgid "Generation succeded, but no keys found."
 msgstr "Lyckades skapa nyckeln, men hittar inte nÃ¥gon nyckel."
 
-#: lib/sshkey.tcl:121
+#: lib/sshkey.tcl:123
 #, tcl-format
 msgid "Your key is in: %s"
 msgstr "Din nyckel finns i: %s"
 
-#: lib/status_bar.tcl:83
+#: lib/status_bar.tcl:86
 #, tcl-format
 msgid "%s ... %*i of %*i %s (%3i%%)"
 msgstr "%s... %*i av %*i %s (%3i%%)"
 
-#: lib/tools.tcl:75
-#, tcl-format
-msgid "Running %s requires a selected file."
-msgstr "För att starta %s mÃ¥ste du välja en fil."
-
-#: lib/tools.tcl:90
-#, tcl-format
-msgid "Are you sure you want to run %s?"
-msgstr "Är du säker pÃ¥ att du vill starta %s?"
-
-#: lib/tools.tcl:110
-#, tcl-format
-msgid "Tool: %s"
-msgstr "Verktyg: %s"
-
-#: lib/tools.tcl:111
-#, tcl-format
-msgid "Running: %s"
-msgstr "Exekverar: %s"
-
-#: lib/tools.tcl:149
-#, tcl-format
-msgid "Tool completed successfully: %s"
-msgstr "Verktyget avslutades framgÃ¥ngsrikt: %s"
-
-#: lib/tools.tcl:151
-#, tcl-format
-msgid "Tool failed: %s"
-msgstr "Verktyget misslyckades: %s"
-
 #: lib/tools_dlg.tcl:22
 msgid "Add Tool"
 msgstr "Lägg till verktyg"
@@ -2429,52 +2403,52 @@ msgstr "Lägg till verktyg"
 msgid "Add New Tool Command"
 msgstr "Lägg till nytt verktygskommando"
 
-#: lib/tools_dlg.tcl:33
+#: lib/tools_dlg.tcl:34
 msgid "Add globally"
 msgstr "Lägg till globalt"
 
-#: lib/tools_dlg.tcl:45
+#: lib/tools_dlg.tcl:46
 msgid "Tool Details"
 msgstr "Detaljer för verktyg"
 
-#: lib/tools_dlg.tcl:48
+#: lib/tools_dlg.tcl:49
 msgid "Use '/' separators to create a submenu tree:"
 msgstr "Använd \"/\"-avdelare för att skapa ett undermenyträd:"
 
-#: lib/tools_dlg.tcl:61
+#: lib/tools_dlg.tcl:60
 msgid "Command:"
 msgstr "Kommando:"
 
-#: lib/tools_dlg.tcl:74
+#: lib/tools_dlg.tcl:71
 msgid "Show a dialog before running"
 msgstr "Visa dialog innan programmet startas"
 
-#: lib/tools_dlg.tcl:80
+#: lib/tools_dlg.tcl:77
 msgid "Ask the user to select a revision (sets $REVISION)"
 msgstr "Be användaren välja en version (sätter $REVISION)"
 
-#: lib/tools_dlg.tcl:85
+#: lib/tools_dlg.tcl:82
 msgid "Ask the user for additional arguments (sets $ARGS)"
 msgstr "Be användaren om ytterligare parametrar (sätter $ARGS)"
 
-#: lib/tools_dlg.tcl:92
+#: lib/tools_dlg.tcl:89
 msgid "Don't show the command output window"
 msgstr "Visa inte kommandots utdatafönster"
 
-#: lib/tools_dlg.tcl:97
+#: lib/tools_dlg.tcl:94
 msgid "Run only if a diff is selected ($FILENAME not empty)"
 msgstr "Kör endast om en diff har markerats ($FILENAME Ã¤r inte tomt)"
 
-#: lib/tools_dlg.tcl:121
+#: lib/tools_dlg.tcl:118
 msgid "Please supply a name for the tool."
 msgstr "Ange ett namn för verktyget."
 
-#: lib/tools_dlg.tcl:129
+#: lib/tools_dlg.tcl:126
 #, tcl-format
 msgid "Tool '%s' already exists."
 msgstr "Verktyget \"%s\" finns redan."
 
-#: lib/tools_dlg.tcl:151
+#: lib/tools_dlg.tcl:148
 #, tcl-format
 msgid ""
 "Could not add tool:\n"
@@ -2483,35 +2457,65 @@ msgstr ""
 "Kunde inte lägga till verktyget:\n"
 "%s"
 
-#: lib/tools_dlg.tcl:190
+#: lib/tools_dlg.tcl:187
 msgid "Remove Tool"
 msgstr "Ta bort verktyg"
 
-#: lib/tools_dlg.tcl:196
+#: lib/tools_dlg.tcl:193
 msgid "Remove Tool Commands"
 msgstr "Ta bort verktygskommandon"
 
-#: lib/tools_dlg.tcl:200
+#: lib/tools_dlg.tcl:198
 msgid "Remove"
 msgstr "Ta bort"
 
-#: lib/tools_dlg.tcl:236
+#: lib/tools_dlg.tcl:231
 msgid "(Blue denotes repository-local tools)"
 msgstr "(BlÃ¥tt anger verktyg lokala för arkivet)"
 
-#: lib/tools_dlg.tcl:297
+#: lib/tools_dlg.tcl:292
 #, tcl-format
 msgid "Run Command: %s"
 msgstr "Kör kommandot: %s"
 
-#: lib/tools_dlg.tcl:311
+#: lib/tools_dlg.tcl:306
 msgid "Arguments"
 msgstr "Argument"
 
-#: lib/tools_dlg.tcl:348
+#: lib/tools_dlg.tcl:341
 msgid "OK"
 msgstr "OK"
 
+#: lib/tools.tcl:75
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "För att starta %s mÃ¥ste du välja en fil."
+
+#: lib/tools.tcl:90
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "Är du säker pÃ¥ att du vill starta %s?"
+
+#: lib/tools.tcl:110
+#, tcl-format
+msgid "Tool: %s"
+msgstr "Verktyg: %s"
+
+#: lib/tools.tcl:111
+#, tcl-format
+msgid "Running: %s"
+msgstr "Exekverar: %s"
+
+#: lib/tools.tcl:149
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "Verktyget avslutades framgÃ¥ngsrikt: %s"
+
+#: lib/tools.tcl:151
+#, tcl-format
+msgid "Tool failed: %s"
+msgstr "Verktyget misslyckades: %s"
+
 #: lib/transport.tcl:7
 #, tcl-format
 msgid "Fetching new changes from %s"
@@ -2542,11 +2546,11 @@ msgstr "Speglar till %s"
 msgid "Pushing %s %s to %s"
 msgstr "Sänder %s %s till %s"
 
-#: lib/transport.tcl:100
+#: lib/transport.tcl:102
 msgid "Push Branches"
 msgstr "Sänd grenar"
 
-#: lib/transport.tcl:114
+#: lib/transport.tcl:117
 msgid "Source Branches"
 msgstr "Källgrenar"
 
@@ -2554,19 +2558,19 @@ msgstr "Källgrenar"
 msgid "Destination Repository"
 msgstr "Destinationsarkiv"
 
-#: lib/transport.tcl:169
+#: lib/transport.tcl:172
 msgid "Transfer Options"
 msgstr "Överföringsalternativ"
 
-#: lib/transport.tcl:171
+#: lib/transport.tcl:174
 msgid "Force overwrite existing branch (may discard changes)"
 msgstr "Tvinga Ã¶verskrivning av befintlig gren (kan kasta bort Ã¤ndringar)"
 
-#: lib/transport.tcl:175
+#: lib/transport.tcl:178
 msgid "Use thin pack (for slow network connections)"
 msgstr "Använd tunt paket (för lÃ¥ngsamma nätverksanslutningar)"
 
-#: lib/transport.tcl:179
+#: lib/transport.tcl:182
 msgid "Include tags"
 msgstr "Ta med taggar"
 
index 615753c83c38f4a97752d5ca3400beeef4acd5f1..8643f74cb09f278c37851c418e839c7d160f36ca 100755 (executable)
@@ -61,6 +61,11 @@ do
        esac
 
        eval pretty_name=\${GITHEAD_$SHA1:-$SHA1}
+       if test "$SHA1" = "$pretty_name"
+       then
+               SHA1_UP="$(echo "$SHA1" | tr a-z A-Z)"
+               eval pretty_name=\${GITHEAD_$SHA1_UP:-$pretty_name}
+       fi
        common=$(git merge-base --all $SHA1 $MRC) ||
                die "Unable to find common commit with $pretty_name"
 
index eb2dff55f81b6726340ce26db93bb161087a4857..a27952d9fdfb517f684b7d304831bf74d0ce237b 100755 (executable)
@@ -626,7 +626,7 @@ skip_unnecessary_picks () {
                case "$fd,$command" in
                3,pick|3,p)
                        # pick a commit whose parent is current $ONTO -> skip
-                       sha1=$(printf '%s' "$rest" | cut -d ' ' -f 1)
+                       sha1=${rest%% *}
                        case "$(git rev-parse --verify --quiet "$sha1"^)" in
                        "$ONTO"*)
                                ONTO=$sha1
index 7508463b30e7d1659ac9423a19d195e494600bd3..e5df23bb8350d6d155bdf1ac9a5be4c9fdc29326 100755 (executable)
@@ -111,7 +111,7 @@ call_merge () {
        export GITHEAD_$cmt GITHEAD_$hd
        if test -n "$GIT_QUIET"
        then
-               export GIT_MERGE_VERBOSITY=1
+               GIT_MERGE_VERBOSITY=1 && export GIT_MERGE_VERBOSITY
        fi
        eval 'git-merge-$strategy' $strategy_opts '"$cmt^" -- "$hd" "$cmt"'
        rv=$?
@@ -566,6 +566,7 @@ fi
 if test -z "$do_merge"
 then
        git format-patch -k --stdout --full-index --ignore-if-in-upstream \
+               --src-prefix=a/ --dst-prefix=b/ \
                --no-renames $root_flag "$revisions" |
        git am $git_am_opt --rebasing --resolvemsg="$RESOLVEMSG" &&
        move_to_original_branch
index 937c69a74858a8a3c63bb41a23705b579df1b3a3..c2a0ef8d5a2794a45908cbcfff1b419ebfc17f8e 100755 (executable)
@@ -163,7 +163,7 @@ sub link_two_files($$) {
 
 
 sub usage() {
-       print("Usage: git relink [--safe] <dir> [<dir> ...] <master_dir> \n");
+       print("Usage: git relink [--safe] <dir>... <master_dir> \n");
        print("All directories should contain a .git/objects/ subdirectory.\n");
        print("Options\n");
        print("\t--safe\t" .
index 1eb3bca352f38ec3807383cc5fff7f7e62731b2b..769baaf7e11277db47f4e897aea82c1581201c6b 100755 (executable)
@@ -10,7 +10,8 @@ git repack [options]
 a               pack everything in a single pack
 A               same as -a, and turn unreachable objects loose
 d               remove redundant packs, and run git-prune-packed
-f               pass --no-reuse-object to git-pack-objects
+f               pass --no-reuse-delta to git-pack-objects
+F               pass --no-reuse-object to git-pack-objects
 n               do not run git-update-server-info
 q,quiet         be quiet
 l               pass --local to git-pack-objects
@@ -34,7 +35,8 @@ do
                unpack_unreachable=--unpack-unreachable ;;
        -d)     remove_redundant=t ;;
        -q)     GIT_QUIET=t ;;
-       -f)     no_reuse=--no-reuse-object ;;
+       -f)     no_reuse=--no-reuse-delta ;;
+       -F)     no_reuse=--no-reuse-object ;;
        -l)     local=--local ;;
        --max-pack-size|--window|--window-memory|--depth)
                extra="$extra $1=$2"; shift ;;
index 6dab3bf6a74bb52c7294e33dbac5bf87b51a9fdf..458e86afdedfbad45f12ec1910735c617ffbe8c7 100755 (executable)
@@ -24,6 +24,7 @@ use Text::ParseWords;
 use Data::Dumper;
 use Term::ANSIColor;
 use File::Temp qw/ tempdir tempfile /;
+use File::Spec::Functions qw(catfile);
 use Error qw(:try);
 use Git;
 
@@ -60,6 +61,7 @@ git send-email [options] <file | directory | rev-list options >
     --envelope-sender       <str>  * Email envelope sender.
     --smtp-server       <str:int>  * Outgoing SMTP server to use. The port
                                      is optional. Default 'localhost'.
+    --smtp-server-option    <str>  * Outgoing SMTP server option to use.
     --smtp-server-port      <int>  * Outgoing SMTP server port.
     --smtp-user             <str>  * Username for SMTP-AUTH.
     --smtp-pass             <str>  * Password for SMTP-AUTH; not necessary.
@@ -85,6 +87,7 @@ git send-email [options] <file | directory | rev-list options >
     --[no-]validate                * Perform patch sanity checks. Default on.
     --[no-]format-patch            * understand any non optional arguments as
                                      `git format-patch` ones.
+    --force                        * Send even if safety checks would prevent it.
 
 EOT
        exit(1);
@@ -162,6 +165,7 @@ if ($@) {
 my ($quiet, $dry_run) = (0, 0);
 my $format_patch;
 my $compose_filename;
+my $force = 0;
 
 # Handle interactive edition of files.
 my $multiedit;
@@ -188,8 +192,9 @@ sub do_edit {
 
 # Variables with corresponding config settings
 my ($thread, $chain_reply_to, $suppress_from, $signed_off_by_cc, $cc_cmd);
-my ($smtp_server, $smtp_server_port, $smtp_authuser, $smtp_encryption);
-my ($identity, $aliasfiletype, @alias_files, @smtp_host_parts, $smtp_domain);
+my ($smtp_server, $smtp_server_port, @smtp_server_options);
+my ($smtp_authuser, $smtp_encryption);
+my ($identity, $aliasfiletype, @alias_files, $smtp_domain);
 my ($validate, $confirm);
 my (@suppress_cc);
 my ($auto_8bit_encoding);
@@ -210,9 +215,10 @@ my %config_bool_settings = (
 my %config_settings = (
     "smtpserver" => \$smtp_server,
     "smtpserverport" => \$smtp_server_port,
+    "smtpserveroption" => \@smtp_server_options,
     "smtpuser" => \$smtp_authuser,
     "smtppass" => \$smtp_authpass,
-       "smtpdomain" => \$smtp_domain,
+    "smtpdomain" => \$smtp_domain,
     "to" => \@to,
     "cc" => \@initial_cc,
     "cccmd" => \$cc_cmd,
@@ -279,6 +285,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
                    "no-bcc" => \$no_bcc,
                    "chain-reply-to!" => \$chain_reply_to,
                    "smtp-server=s" => \$smtp_server,
+                   "smtp-server-option=s" => \@smtp_server_options,
                    "smtp-server-port=s" => \$smtp_server_port,
                    "smtp-user=s" => \$smtp_authuser,
                    "smtp-pass:s" => \$smtp_authpass,
@@ -301,6 +308,7 @@ my $rc = GetOptions("sender|from=s" => \$sender,
                    "validate!" => \$validate,
                    "format-patch!" => \$format_patch,
                    "8bit-encoding=s" => \$auto_8bit_encoding,
+                   "force" => \$force,
         );
 
 unless ($rc) {
@@ -511,7 +519,7 @@ while (defined(my $f = shift @ARGV)) {
                opendir(DH,$f)
                        or die "Failed to opendir $f: $!";
 
-               push @files, grep { -f $_ } map { +$f . "/" . $_ }
+               push @files, grep { -f $_ } map { catfile($f, $_) }
                                sort readdir(DH);
                closedir(DH);
        } elsif ((-f $f or -p $f) and !check_file_rev_conflict($f)) {
@@ -702,6 +710,16 @@ if (!defined $auto_8bit_encoding && scalar %broken_encoding) {
                                  default => "UTF-8");
 }
 
+if (!$force) {
+       for my $f (@files) {
+               if (get_patch_subject($f) =~ /\*\*\* SUBJECT HERE \*\*\*/) {
+                       die "Refusing to send because the patch\n\t$f\n"
+                               . "has the template subject '*** SUBJECT HERE ***'. "
+                               . "Pass --force if you really want to send.\n";
+               }
+       }
+}
+
 my $prompting = 0;
 if (!defined $sender) {
        $sender = $repoauthor || $repocommitter || '';
@@ -895,7 +913,7 @@ sub sanitize_address {
 
 sub valid_fqdn {
        my $domain = shift;
-       return !($^O eq 'darwin' && $domain =~ /\.local$/) && $domain =~ /\./;
+       return defined $domain && !($^O eq 'darwin' && $domain =~ /\.local$/) && $domain =~ /\./;
 }
 
 sub maildomain_net {
@@ -1015,6 +1033,8 @@ X-Mailer: git-send-email $gitversion
                }
        }
 
+       unshift (@sendmail_parameters, @smtp_server_options);
+
        if ($dry_run) {
                # We don't want to send the email.
        } elsif ($smtp_server =~ m#^/#) {
index 6131670860514c215a6b9b7417dd05c3124e81b4..ae031a1375e9c674d80b9fa3d3d3b76780deaf9f 100644 (file)
@@ -151,17 +151,14 @@ get_author_ident_from_commit () {
                s/'\''/'\''\\'\'\''/g
                h
                s/^author \([^<]*\) <[^>]*> .*$/\1/
-               s/'\''/'\''\'\'\''/g
                s/.*/GIT_AUTHOR_NAME='\''&'\''/p
 
                g
                s/^author [^<]* <\([^>]*\)> .*$/\1/
-               s/'\''/'\''\'\'\''/g
                s/.*/GIT_AUTHOR_EMAIL='\''&'\''/p
 
                g
                s/^author [^<]* <[^>]*> \(.*\)$/\1/
-               s/'\''/'\''\'\'\''/g
                s/.*/GIT_AUTHOR_DATE='\''&'\''/p
 
                q
@@ -209,5 +206,20 @@ case $(uname -s) in
        find () {
                /usr/bin/find "$@"
        }
+       is_absolute_path () {
+               case "$1" in
+               [/\\]* | [A-Za-z]:*)
+                       return 0 ;;
+               esac
+               return 1
+       }
        ;;
+*)
+       is_absolute_path () {
+               case "$1" in
+               /*)
+                       return 0 ;;
+               esac
+               return 1
+       }
 esac
index 7ce818bd1baecfb48447f862bb2654ccbd3cf2ff..7561b374d2ec90fe774e98e39a121a1a3a3cdfa9 100755 (executable)
@@ -265,28 +265,21 @@ parse_flags_and_rev()
        i_tree=
 
        REV=$(git rev-parse --no-flags --symbolic "$@" 2>/dev/null)
-       FLAGS=$(git rev-parse --no-revs -- "$@" 2>/dev/null)
-
-       set -- $FLAGS
 
        FLAGS=
-       while test $# -ne 0
+       for opt
        do
-               case "$1" in
+               case "$opt" in
                        -q|--quiet)
                                GIT_QUIET=-t
                        ;;
                        --index)
                                INDEX_OPTION=--index
                        ;;
-                       --)
-                               :
-                       ;;
-                       *)
-                               FLAGS="${FLAGS}${FLAGS:+ }$1"
+                       -*)
+                               FLAGS="${FLAGS}${FLAGS:+ }$opt"
                        ;;
                esac
-               shift
        done
 
        set -- $REV
@@ -380,7 +373,7 @@ apply_stash () {
 
        if test -n "$GIT_QUIET"
        then
-               export GIT_MERGE_VERBOSITY=0
+               GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
        fi
        if git merge-recursive $b_tree -- $c_tree $w_tree
        then
@@ -439,9 +432,9 @@ apply_to_branch () {
        assert_stash_like "$@"
 
        git checkout -b $branch $REV^ &&
-       apply_stash "$@"
-
-       test -z "$IS_STASH_REF" || drop_stash "$@"
+       apply_stash "$@" && {
+               test -z "$IS_STASH_REF" || drop_stash "$@"
+       }
 }
 
 PARSE_CACHE='--not-parsed'
index 9b046b693fe82c992b3844bf6e8f79214dfa7a59..18cfb2466d11aa28a795e3dabac70e236061fbe9 100755 (executable)
@@ -1513,7 +1513,8 @@ sub cmt_sha2rev_batch {
 
 sub working_head_info {
        my ($head, $refs) = @_;
-       my @args = ('log', '--no-color', '--first-parent', '--pretty=medium');
+       my @args = qw/log --no-color --no-decorate --first-parent
+                     --pretty=medium/;
        my ($fh, $ctx) = command_output_pipe(@args, $head);
        my $hash;
        my %max;
@@ -3118,9 +3119,10 @@ sub _rev_list {
 sub check_cherry_pick {
        my $base = shift;
        my $tip = shift;
+       my $parents = shift;
        my @ranges = @_;
        my %commits = map { $_ => 1 }
-               _rev_list("--no-merges", $tip, "--not", $base);
+               _rev_list("--no-merges", $tip, "--not", $base, @$parents);
        for my $range ( @ranges ) {
                delete @commits{_rev_list($range)};
        }
@@ -3296,6 +3298,7 @@ sub find_extra_svn_parents {
                # double check that there are no missing non-merge commits
                my (@incomplete) = check_cherry_pick(
                        $merge_base, $merge_tip,
+                       $parents,
                        @$ranges,
                       );
 
diff --git a/git.c b/git.c
index 50a14013c5a87fed200df0a5a4ec6db0f1e2c223..0409ac9fd3f1ea36680189e07116e58b2630ccad 100644 (file)
--- a/git.c
+++ b/git.c
@@ -6,14 +6,14 @@
 #include "run-command.h"
 
 const char git_usage_string[] =
-       "git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]\n"
+       "git [--version] [--exec-path[=<path>]] [--html-path]\n"
        "           [-p|--paginate|--no-pager] [--no-replace-objects]\n"
-       "           [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]\n"
+       "           [--bare] [--git-dir=<path>] [--work-tree=<path>]\n"
        "           [-c name=value] [--help]\n"
-       "           COMMAND [ARGS]";
+       "           <command> [<args>]";
 
 const char git_more_info_string[] =
-       "See 'git help COMMAND' for more information on a specific command.";
+       "See 'git help <command>' for more information on a specific command.";
 
 static struct startup_info git_startup_info;
 static int use_pager = -1;
diff --git a/git_remote_helpers/setup.cfg b/git_remote_helpers/setup.cfg
new file mode 100644 (file)
index 0000000..4bff887
--- /dev/null
@@ -0,0 +1,3 @@
+[build]
+build_purelib = build/lib
+build_platlib = build/lib
index 2fb7c2d77bbd5f2041341822859dce51ae504d83..e32ee76309606c82abcac483f8801968916047f2 100644 (file)
@@ -35,6 +35,7 @@ GITWEB_FAVICON = static/git-favicon.png
 GITWEB_JS = static/gitweb.js
 GITWEB_SITE_HEADER =
 GITWEB_SITE_FOOTER =
+HIGHLIGHT_BIN = highlight
 
 # include user config
 -include ../config.mak.autogen
@@ -129,7 +130,8 @@ GITWEB_REPLACE = \
        -e 's|++GITWEB_FAVICON++|$(GITWEB_FAVICON)|g' \
        -e 's|++GITWEB_JS++|$(GITWEB_JS)|g' \
        -e 's|++GITWEB_SITE_HEADER++|$(GITWEB_SITE_HEADER)|g' \
-       -e 's|++GITWEB_SITE_FOOTER++|$(GITWEB_SITE_FOOTER)|g'
+       -e 's|++GITWEB_SITE_FOOTER++|$(GITWEB_SITE_FOOTER)|g' \
+       -e 's|++HIGHLIGHT_BIN++|$(HIGHLIGHT_BIN)|g'
 
 GITWEB-BUILD-OPTIONS: FORCE
        @rm -f $@+
index d4811987965e5a5036b7ed71e32d93578579073a..bf3664f2b7b7b4b5177d172c6b99a84940244469 100644 (file)
@@ -114,6 +114,11 @@ You can specify the following configuration variables when building GIT:
    when gitweb.cgi is executed, then the file specified in the environment
    variable will be loaded instead of the file specified when gitweb.cgi was
    created.  [Default: /etc/gitweb.conf]
+ * HIGHLIGHT_BIN
+   Path to the highlight executable to use (must be the one from
+   http://www.andre-simon.de due to assumptions about parameters and output).
+   Useful if highlight is not installed on your webserver's PATH.
+   [Default: highlight]
 
 
 Runtime gitweb configuration
@@ -236,7 +241,11 @@ not include variables usually directly set during build):
    If server load exceed this value then return "503 Service Unavailable" error.
    Server load is taken to be 0 if gitweb cannot determine its value.  Set it to
    undefined value to turn it off.  The default is 300.
-
+ * $highlight_bin
+   Path to the highlight executable to use (must be the one from
+   http://www.andre-simon.de due to assumptions about parameters and output).
+   Useful if highlight is not installed on your webserver's PATH.
+   [Default: highlight]
 
 Projects list file format
 ~~~~~~~~~~~~~~~~~~~~~~~~~
index a85e2f63197649bff4842ea2970448205618c104..8d7e4c5e49f41c7d864a3399f40deda722c1aa2d 100755 (executable)
@@ -165,6 +165,12 @@ our @diff_opts = ('-M'); # taken from git_commit
 # the gitweb domain.
 our $prevent_xss = 0;
 
+# Path to the highlight executable to use (must be the one from
+# http://www.andre-simon.de due to assumptions about parameters and output).
+# Useful if highlight is not installed on your webserver's PATH.
+# [Default: highlight]
+our $highlight_bin = "++HIGHLIGHT_BIN++";
+
 # information about snapshot formats that gitweb is capable of serving
 our %known_snapshot_formats = (
        # name => {
@@ -774,10 +780,10 @@ sub evaluate_path_info {
                'history',
        );
 
-       # we want to catch
+       # we want to catch, among others
        # [$hash_parent_base[:$file_parent]..]$hash_parent[:$file_name]
        my ($parentrefname, $parentpathname, $refname, $pathname) =
-               ($path_info =~ /^(?:(.+?)(?::(.+))?\.\.)?(.+?)(?::(.+))?$/);
+               ($path_info =~ /^(?:(.+?)(?::(.+))?\.\.)?([^:]+?)?(?::(.+))?$/);
 
        # first, analyze the 'current' part
        if (defined $pathname) {
@@ -813,8 +819,15 @@ sub evaluate_path_info {
                # hash_base instead. It should also be noted that hand-crafted
                # links having 'history' as an action and no pathname or hash
                # set will fail, but that happens regardless of PATH_INFO.
-               $input_params{'action'} ||= "shortlog";
-               if (grep { $_ eq $input_params{'action'} } @wants_base) {
+               if (defined $parentrefname) {
+                       # if there is parent let the default be 'shortlog' action
+                       # (for http://git.example.com/repo.git/A..B links); if there
+                       # is no parent, dispatch will detect type of object and set
+                       # action appropriately if required (if action is not set)
+                       $input_params{'action'} ||= "shortlog";
+               }
+               if ($input_params{'action'} &&
+                   grep { $_ eq $input_params{'action'} } @wants_base) {
                        $input_params{'hash_base'} ||= $refname;
                } else {
                        $input_params{'hash'} ||= $refname;
@@ -3360,7 +3373,8 @@ sub run_highlighter {
        close $fd
                or die_error(404, "Reading blob failed");
        open $fd, quote_command(git_cmd(), "cat-file", "blob", $hash)." | ".
-                 "highlight --xhtml --fragment --syntax $syntax |"
+                 quote_command($highlight_bin).
+                 " --xhtml --fragment --syntax $syntax |"
                or die_error(500, "Couldn't open file or run syntax highlighter");
        return $fd;
 }
diff --git a/grep.c b/grep.c
index 82fb349be6f6ef8211d4828101cd8e88bcbb304f..63c4280cac9a87f867451c0d9787d1fe21ea9c2d 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -189,30 +189,74 @@ static struct grep_expr *compile_pattern_expr(struct grep_pat **list)
        return compile_pattern_or(list);
 }
 
-void compile_grep_patterns(struct grep_opt *opt)
+static struct grep_expr *grep_true_expr(void)
+{
+       struct grep_expr *z = xcalloc(1, sizeof(*z));
+       z->node = GREP_NODE_TRUE;
+       return z;
+}
+
+static struct grep_expr *grep_or_expr(struct grep_expr *left, struct grep_expr *right)
+{
+       struct grep_expr *z = xcalloc(1, sizeof(*z));
+       z->node = GREP_NODE_OR;
+       z->u.binary.left = left;
+       z->u.binary.right = right;
+       return z;
+}
+
+static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
 {
        struct grep_pat *p;
-       struct grep_expr *header_expr = NULL;
-
-       if (opt->header_list) {
-               p = opt->header_list;
-               header_expr = compile_pattern_expr(&p);
-               if (p)
-                       die("incomplete pattern expression: %s", p->pattern);
-               for (p = opt->header_list; p; p = p->next) {
-                       switch (p->token) {
-                       case GREP_PATTERN: /* atom */
-                       case GREP_PATTERN_HEAD:
-                       case GREP_PATTERN_BODY:
-                               compile_regexp(p, opt);
-                               break;
-                       default:
-                               opt->extended = 1;
-                               break;
-                       }
+       struct grep_expr *header_expr;
+       struct grep_expr *(header_group[GREP_HEADER_FIELD_MAX]);
+       enum grep_header_field fld;
+
+       if (!opt->header_list)
+               return NULL;
+       p = opt->header_list;
+       for (p = opt->header_list; p; p = p->next) {
+               if (p->token != GREP_PATTERN_HEAD)
+                       die("bug: a non-header pattern in grep header list.");
+               if (p->field < 0 || GREP_HEADER_FIELD_MAX <= p->field)
+                       die("bug: unknown header field %d", p->field);
+               compile_regexp(p, opt);
+       }
+
+       for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++)
+               header_group[fld] = NULL;
+
+       for (p = opt->header_list; p; p = p->next) {
+               struct grep_expr *h;
+               struct grep_pat *pp = p;
+
+               h = compile_pattern_atom(&pp);
+               if (!h || pp != p->next)
+                       die("bug: malformed header expr");
+               if (!header_group[p->field]) {
+                       header_group[p->field] = h;
+                       continue;
                }
+               header_group[p->field] = grep_or_expr(h, header_group[p->field]);
        }
 
+       header_expr = NULL;
+
+       for (fld = 0; fld < GREP_HEADER_FIELD_MAX; fld++) {
+               if (!header_group[fld])
+                       continue;
+               if (!header_expr)
+                       header_expr = grep_true_expr();
+               header_expr = grep_or_expr(header_group[fld], header_expr);
+       }
+       return header_expr;
+}
+
+void compile_grep_patterns(struct grep_opt *opt)
+{
+       struct grep_pat *p;
+       struct grep_expr *header_expr = prep_header_patterns(opt);
+
        for (p = opt->pattern_list; p; p = p->next) {
                switch (p->token) {
                case GREP_PATTERN: /* atom */
@@ -231,9 +275,6 @@ void compile_grep_patterns(struct grep_opt *opt)
        else if (!opt->extended)
                return;
 
-       /* Then bundle them up in an expression.
-        * A classic recursive descent parser would do.
-        */
        p = opt->pattern_list;
        if (p)
                opt->pattern_expression = compile_pattern_expr(&p);
@@ -243,22 +284,18 @@ void compile_grep_patterns(struct grep_opt *opt)
        if (!header_expr)
                return;
 
-       if (opt->pattern_expression) {
-               struct grep_expr *z;
-               z = xcalloc(1, sizeof(*z));
-               z->node = GREP_NODE_OR;
-               z->u.binary.left = opt->pattern_expression;
-               z->u.binary.right = header_expr;
-               opt->pattern_expression = z;
-       } else {
+       if (!opt->pattern_expression)
                opt->pattern_expression = header_expr;
-       }
+       else
+               opt->pattern_expression = grep_or_expr(opt->pattern_expression,
+                                                      header_expr);
        opt->all_match = 1;
 }
 
 static void free_pattern_expr(struct grep_expr *x)
 {
        switch (x->node) {
+       case GREP_NODE_TRUE:
        case GREP_NODE_ATOM:
                break;
        case GREP_NODE_NOT:
@@ -487,6 +524,9 @@ static int match_expr_eval(struct grep_expr *x, char *bol, char *eol,
        if (!x)
                die("Not a valid grep expression");
        switch (x->node) {
+       case GREP_NODE_TRUE:
+               h = 1;
+               break;
        case GREP_NODE_ATOM:
                h = match_one_pattern(x->u.atom, bol, eol, ctx, &match, 0);
                break;
diff --git a/grep.h b/grep.h
index efa8cff980af2b2c06dad080876637d16b5c4985..06621fe663545af52fbc42827a8374ab5bd42f38 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -22,6 +22,7 @@ enum grep_header_field {
        GREP_HEADER_AUTHOR = 0,
        GREP_HEADER_COMMITTER
 };
+#define GREP_HEADER_FIELD_MAX (GREP_HEADER_COMMITTER + 1)
 
 struct grep_pat {
        struct grep_pat *next;
@@ -41,6 +42,7 @@ enum grep_expr_node {
        GREP_NODE_ATOM,
        GREP_NODE_NOT,
        GREP_NODE_AND,
+       GREP_NODE_TRUE,
        GREP_NODE_OR
 };
 
index 20e1779428ee553a940592c09bbabe9ca9800a39..c5746988196b8139ca3234f8b30d03af56d33324 100644 (file)
@@ -955,6 +955,12 @@ static int process_renames(struct merge_options *o,
                                                        ren1->pair->two : NULL,
                                                        branch1 == o->branch1 ?
                                                        NULL : ren1->pair->two, 1);
+                       } else if ((dst_other.mode == ren1->pair->two->mode) &&
+                                  sha_eq(dst_other.sha1, ren1->pair->two->sha1)) {
+                               /* Added file on the other side
+                                  identical to the file being
+                                  renamed: clean merge */
+                               update_file(o, 1, ren1->pair->two->sha1, ren1->pair->two->mode, ren1_dst);
                        } else if (!sha_eq(dst_other.sha1, null_sha1)) {
                                const char *new_path;
                                clean_merge = 0;
index 7b7e61719fa63e41917b41240061c68e3cbabf01..484081de82928108a23a714a76ea88693e56bdd1 100644 (file)
@@ -1062,6 +1062,7 @@ int get_sha1_with_context_1(const char *name, unsigned char *sha1,
        /* sha1:path --> object name of path in ent sha1
         * :path -> object name of path in index
         * :[0-3]:path -> object name of path in index at stage
+        * :/foo -> recent commit matching foo
         */
        if (name[0] == ':') {
                int stage = 0;
diff --git a/shell.c b/shell.c
index e4864e04da3b0e237342c2ca0548c0ec0082c171..dea4cfdd2c230af6afd6233cacfa5c776a9962f9 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -2,6 +2,10 @@
 #include "quote.h"
 #include "exec_cmd.h"
 #include "strbuf.h"
+#include "run-command.h"
+
+#define COMMAND_DIR "git-shell-commands"
+#define HELP_COMMAND COMMAND_DIR "/help"
 
 static int do_generic_cmd(const char *me, char *arg)
 {
@@ -33,6 +37,86 @@ static int do_cvs_cmd(const char *me, char *arg)
        return execv_git_cmd(cvsserver_argv);
 }
 
+static int is_valid_cmd_name(const char *cmd)
+{
+       /* Test command contains no . or / characters */
+       return cmd[strcspn(cmd, "./")] == '\0';
+}
+
+static char *make_cmd(const char *prog)
+{
+       char *prefix = xmalloc((strlen(prog) + strlen(COMMAND_DIR) + 2));
+       strcpy(prefix, COMMAND_DIR);
+       strcat(prefix, "/");
+       strcat(prefix, prog);
+       return prefix;
+}
+
+static void cd_to_homedir(void)
+{
+       const char *home = getenv("HOME");
+       if (!home)
+               die("could not determine user's home directory; HOME is unset");
+       if (chdir(home) == -1)
+               die("could not chdir to user's home directory");
+}
+
+static void run_shell(void)
+{
+       int done = 0;
+       static const char *help_argv[] = { HELP_COMMAND, NULL };
+       /* Print help if enabled */
+       run_command_v_opt(help_argv, RUN_SILENT_EXEC_FAILURE);
+
+       do {
+               struct strbuf line = STRBUF_INIT;
+               const char *prog;
+               char *full_cmd;
+               char *rawargs;
+               char *split_args;
+               const char **argv;
+               int code;
+               int count;
+
+               fprintf(stderr, "git> ");
+               if (strbuf_getline(&line, stdin, '\n') == EOF) {
+                       fprintf(stderr, "\n");
+                       strbuf_release(&line);
+                       break;
+               }
+               strbuf_trim(&line);
+               rawargs = strbuf_detach(&line, NULL);
+               split_args = xstrdup(rawargs);
+               count = split_cmdline(split_args, &argv);
+               if (count < 0) {
+                       fprintf(stderr, "invalid command format '%s': %s\n", rawargs,
+                               split_cmdline_strerror(count));
+                       free(split_args);
+                       free(rawargs);
+                       continue;
+               }
+
+               prog = argv[0];
+               if (!strcmp(prog, "")) {
+               } else if (!strcmp(prog, "quit") || !strcmp(prog, "logout") ||
+                          !strcmp(prog, "exit") || !strcmp(prog, "bye")) {
+                       done = 1;
+               } else if (is_valid_cmd_name(prog)) {
+                       full_cmd = make_cmd(prog);
+                       argv[0] = full_cmd;
+                       code = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE);
+                       if (code == -1 && errno == ENOENT) {
+                               fprintf(stderr, "unrecognized command '%s'\n", prog);
+                       }
+                       free(full_cmd);
+               } else {
+                       fprintf(stderr, "invalid command format '%s'\n", prog);
+               }
+
+               free(argv);
+               free(rawargs);
+       } while (!done);
+}
 
 static struct commands {
        const char *name;
@@ -48,8 +132,10 @@ static struct commands {
 int main(int argc, char **argv)
 {
        char *prog;
+       const char **user_argv;
        struct commands *cmd;
        int devnull_fd;
+       int count;
 
        /*
         * Always open file descriptors 0/1/2 to avoid clobbering files
@@ -66,17 +152,28 @@ int main(int argc, char **argv)
        /*
         * Special hack to pretend to be a CVS server
         */
-       if (argc == 2 && !strcmp(argv[1], "cvs server"))
+       if (argc == 2 && !strcmp(argv[1], "cvs server")) {
                argv--;
+       } else if (argc == 1) {
+               /* Allow the user to run an interactive shell */
+               cd_to_homedir();
+               if (access(COMMAND_DIR, R_OK | X_OK) == -1) {
+                       die("Interactive git shell is not enabled.\n"
+                           "hint: ~/" COMMAND_DIR " should exist "
+                           "and have read and execute access.");
+               }
+               run_shell();
+               exit(0);
+       } else if (argc != 3 || strcmp(argv[1], "-c")) {
+               /*
+                * We do not accept any other modes except "-c" followed by
+                * "cmd arg", where "cmd" is a very limited subset of git
+                * commands or a command in the COMMAND_DIR
+                */
+               die("Run with no arguments or with -c cmd");
+       }
 
-       /*
-        * We do not accept anything but "-c" followed by "cmd arg",
-        * where "cmd" is a very limited subset of git commands.
-        */
-       else if (argc != 3 || strcmp(argv[1], "-c"))
-               die("What do you think I am? A shell?");
-
-       prog = argv[2];
+       prog = xstrdup(argv[2]);
        if (!strncmp(prog, "git", 3) && isspace(prog[3]))
                /* Accept "git foo" as if the caller said "git-foo". */
                prog[3] = '-';
@@ -99,5 +196,21 @@ int main(int argc, char **argv)
                }
                exit(cmd->exec(cmd->name, arg));
        }
-       die("unrecognized command '%s'", prog);
+
+       cd_to_homedir();
+       count = split_cmdline(prog, &user_argv);
+       if (count >= 0) {
+               if (is_valid_cmd_name(user_argv[0])) {
+                       prog = make_cmd(user_argv[0]);
+                       user_argv[0] = prog;
+                       execv(user_argv[0], (char *const *) user_argv);
+               }
+               free(prog);
+               free(user_argv);
+               die("unrecognized command '%s'", argv[2]);
+       } else {
+               free(prog);
+               die("invalid command format '%s': %s", argv[2],
+                   split_cmdline_strerror(count));
+       }
 }
index bc3a0802ea7e7b1743602972de182391b4bf0b3f..65b4cf43434a8b7327565d0e0f87d5378d098f99 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -399,6 +399,8 @@ int strbuf_branchname(struct strbuf *sb, const char *name)
 int strbuf_check_branch_ref(struct strbuf *sb, const char *name)
 {
        strbuf_branchname(sb, name);
+       if (name[0] == '-')
+               return CHECK_REF_FORMAT_ERROR;
        strbuf_splice(sb, 0, 0, "refs/heads/", 11);
        return check_ref_format(sb->buf);
 }
index fac2dbc24fc654e58840727204043a198d065921..675a91f93821421aa79de51857b22a4960da8ec1 100644 (file)
--- a/strbuf.h
+++ b/strbuf.h
@@ -16,7 +16,7 @@
  *
  * 2. the ->buf member is a byte array that has at least ->len + 1 bytes
  *    allocated. The extra byte is used to store a '\0', allowing the ->buf
- *    member to be a valid C-string. Every strbuf function ensure this
+ *    member to be a valid C-string. Every strbuf function ensures this
  *    invariant is preserved.
  *
  *    Note that it is OK to "play" with the buffer directly if you work it
index 396b9653a3ad80490cf360c86a910edff58862a2..141b60cdcbf4c8f70813e090a950c5d736853a8e 100644 (file)
@@ -8,27 +8,27 @@ check_count () {
        $PROG file $head >.result || return 1
        cat .result | perl -e '
                my %expect = (@ARGV);
-               my %count = ();
+               my %count = map { $_ => 0 } keys %expect;
                while (<STDIN>) {
                        if (/^[0-9a-f]+\t\(([^\t]+)\t/) {
                                my $author = $1;
                                for ($author) { s/^\s*//; s/\s*$//; }
-                               if (exists $expect{$author}) {
-                                       $count{$author}++;
-                               }
+                               $count{$author}++;
                        }
                }
                my $bad = 0;
                while (my ($author, $count) = each %count) {
                        my $ok;
-                       if ($expect{$author} != $count) {
+                       my $value = 0;
+                       $value = $expect{$author} if defined $expect{$author};
+                       if ($value != $count) {
                                $bad = 1;
                                $ok = "bad";
                        }
                        else {
                                $ok = "good";
                        }
-                       print STDERR "Author $author (expected $expect{$author}, attributed $count) $ok\n";
+                       print STDERR "Author $author (expected $value, attributed $count) $ok\n";
                }
                exit($bad);
        ' "$@"
index 81ef2a0969d98f05ce22cd8a06fcb55a7af9aee8..8c490c87071cc71228d1811d6e08cf542bf11d2e 100644 (file)
@@ -19,9 +19,9 @@ our \$site_name = '[localhost]';
 our \$site_header = '';
 our \$site_footer = '';
 our \$home_text = 'indextext.html';
-our @stylesheets = ('file:///$TEST_DIRECTORY/../gitweb/static/gitweb.css');
-our \$logo = 'file:///$TEST_DIRECTORY/../gitweb/static/git-logo.png';
-our \$favicon = 'file:///$TEST_DIRECTORY/../gitweb/static/git-favicon.png';
+our @stylesheets = ('file:///$GIT_BUILD_DIR/gitweb/static/gitweb.css');
+our \$logo = 'file:///$GIT_BUILD_DIR/gitweb/static/git-logo.png';
+our \$favicon = 'file:///$GIT_BUILD_DIR/gitweb/static/git-favicon.png';
 our \$projects_list = '';
 our \$export_ok = '';
 our \$strict_export = '';
@@ -38,7 +38,7 @@ gitweb_run () {
        GATEWAY_INTERFACE='CGI/1.1'
        HTTP_ACCEPT='*/*'
        REQUEST_METHOD='GET'
-       SCRIPT_NAME="$TEST_DIRECTORY/../gitweb/gitweb.perl"
+       SCRIPT_NAME="$GIT_BUILD_DIR/gitweb/gitweb.perl"
        QUERY_STRING=""$1""
        PATH_INFO=""$2""
        export GATEWAY_INTERFACE HTTP_ACCEPT REQUEST_METHOD \
@@ -81,8 +81,8 @@ if ! test_have_prereq PERL; then
 fi
 
 perl -MEncode -e 'decode_utf8("", Encode::FB_CROAK)' >/dev/null 2>&1 || {
-    skip_all='skipping gitweb tests, perl version is too old'
-    test_done
+       skip_all='skipping gitweb tests, perl version is too old'
+       test_done
 }
 
 gitweb_init
index de38c7f7aab16a0c2766ef020a3fc03fadece555..25205ac0ee5397452428a02698a35d04f72cd501 100755 (executable)
@@ -36,6 +36,9 @@ test_expect_success 'setup' '
                echo "d/* test=a/b/d/*"
                echo "d/yes notest"
        ) >a/b/.gitattributes
+       (
+               echo "global test=global"
+       ) >$HOME/global-gitattributes
 
 '
 
@@ -57,6 +60,16 @@ test_expect_success 'attribute test' '
 
 '
 
+test_expect_success 'core.attributesfile' '
+       attr_check global unspecified &&
+       git config core.attributesfile "$HOME/global-gitattributes" &&
+       attr_check global global &&
+       git config core.attributesfile "~/global-gitattributes" &&
+       attr_check global global &&
+       echo "global test=precedence" >> .gitattributes &&
+       attr_check global precedence
+'
+
 test_expect_success 'attribute test: read paths from stdin' '
 
        cat <<EOF > expect
index 385b1265de53829053bae40f111a0bf30004b98b..e3137d638ee5bb07b9278c1a9b90a207ad024a08 100755 (executable)
@@ -16,53 +16,29 @@ test_expect_success setup '
 '
 
 test_expect_success POSIXPERM,SANITY 'write-tree should notice unwritable repository' '
-
-       (
-               chmod a-w .git/objects .git/objects/?? &&
-               test_must_fail git write-tree
-       )
-       status=$?
-       chmod 775 .git/objects .git/objects/??
-       (exit $status)
-
+       test_when_finished "chmod 775 .git/objects .git/objects/??" &&
+       chmod a-w .git/objects .git/objects/?? &&
+       test_must_fail git write-tree
 '
 
 test_expect_success POSIXPERM,SANITY 'commit should notice unwritable repository' '
-
-       (
-               chmod a-w .git/objects .git/objects/?? &&
-               test_must_fail git commit -m second
-       )
-       status=$?
-       chmod 775 .git/objects .git/objects/??
-       (exit $status)
-
+       test_when_finished "chmod 775 .git/objects .git/objects/??" &&
+       chmod a-w .git/objects .git/objects/?? &&
+       test_must_fail git commit -m second
 '
 
 test_expect_success POSIXPERM,SANITY 'update-index should notice unwritable repository' '
-
-       (
-               echo 6O >file &&
-               chmod a-w .git/objects .git/objects/?? &&
-               test_must_fail git update-index file
-       )
-       status=$?
-       chmod 775 .git/objects .git/objects/??
-       (exit $status)
-
+       test_when_finished "chmod 775 .git/objects .git/objects/??" &&
+       echo 6O >file &&
+       chmod a-w .git/objects .git/objects/?? &&
+       test_must_fail git update-index file
 '
 
 test_expect_success POSIXPERM,SANITY 'add should notice unwritable repository' '
-
-       (
-               echo b >file &&
-               chmod a-w .git/objects .git/objects/?? &&
-               test_must_fail git add file
-       )
-       status=$?
-       chmod 775 .git/objects .git/objects/??
-       (exit $status)
-
+       test_when_finished "chmod 775 .git/objects .git/objects/??" &&
+       echo b >file &&
+       chmod a-w .git/objects .git/objects/?? &&
+       test_must_fail git add file
 '
 
 test_done
index 56874996a6df278202c0bc476abec4bca3ce99c5..a3ac33801a28fe7bd2ce67d4d4ae306c1050f5c1 100755 (executable)
@@ -16,24 +16,23 @@ test_expect_success setup '
        cp one original.one &&
        cp dir/two original.two
 '
-HERE=`pwd`
 LF='
 '
 
 test_expect_success 'update-index and ls-files' '
-       cd "$HERE" &&
        git update-index --add one &&
        case "`git ls-files`" in
        one) echo pass one ;;
        *) echo bad one; exit 1 ;;
        esac &&
-       cd dir &&
-       git update-index --add two &&
-       case "`git ls-files`" in
-       two) echo pass two ;;
-       *) echo bad two; exit 1 ;;
-       esac &&
-       cd .. &&
+       (
+               cd dir &&
+               git update-index --add two &&
+               case "`git ls-files`" in
+               two) echo pass two ;;
+               *) echo bad two; exit 1 ;;
+               esac
+       ) &&
        case "`git ls-files`" in
        dir/two"$LF"one) echo pass both ;;
        *) echo bad; exit 1 ;;
@@ -41,20 +40,20 @@ test_expect_success 'update-index and ls-files' '
 '
 
 test_expect_success 'cat-file' '
-       cd "$HERE" &&
        two=`git ls-files -s dir/two` &&
        two=`expr "$two" : "[0-7]* \\([0-9a-f]*\\)"` &&
        echo "$two" &&
        git cat-file -p "$two" >actual &&
        cmp dir/two actual &&
-       cd dir &&
-       git cat-file -p "$two" >actual &&
-       cmp two actual
+       (
+               cd dir &&
+               git cat-file -p "$two" >actual &&
+               cmp two actual
+       )
 '
 rm -f actual dir/actual
 
 test_expect_success 'diff-files' '
-       cd "$HERE" &&
        echo a >>one &&
        echo d >>dir/two &&
        case "`git diff-files --name-only`" in
@@ -62,77 +61,88 @@ test_expect_success 'diff-files' '
        *) echo bad top; exit 1 ;;
        esac &&
        # diff should not omit leading paths
-       cd dir &&
-       case "`git diff-files --name-only`" in
-       dir/two"$LF"one) echo pass subdir ;;
-       *) echo bad subdir; exit 1 ;;
-       esac &&
-       case "`git diff-files --name-only .`" in
-       dir/two) echo pass subdir limited ;;
-       *) echo bad subdir limited; exit 1 ;;
-       esac
+       (
+               cd dir &&
+               case "`git diff-files --name-only`" in
+               dir/two"$LF"one) echo pass subdir ;;
+               *) echo bad subdir; exit 1 ;;
+               esac &&
+               case "`git diff-files --name-only .`" in
+               dir/two) echo pass subdir limited ;;
+               *) echo bad subdir limited; exit 1 ;;
+               esac
+       )
 '
 
 test_expect_success 'write-tree' '
-       cd "$HERE" &&
        top=`git write-tree` &&
        echo $top &&
-       cd dir &&
-       sub=`git write-tree` &&
-       echo $sub &&
-       test "z$top" = "z$sub"
+       (
+               cd dir &&
+               sub=`git write-tree` &&
+               echo $sub &&
+               test "z$top" = "z$sub"
+       )
 '
 
 test_expect_success 'checkout-index' '
-       cd "$HERE" &&
        git checkout-index -f -u one &&
        cmp one original.one &&
-       cd dir &&
-       git checkout-index -f -u two &&
-       cmp two ../original.two
+       (
+               cd dir &&
+               git checkout-index -f -u two &&
+               cmp two ../original.two
+       )
 '
 
 test_expect_success 'read-tree' '
-       cd "$HERE" &&
        rm -f one dir/two &&
        tree=`git write-tree` &&
        git read-tree --reset -u "$tree" &&
        cmp one original.one &&
        cmp dir/two original.two &&
-       cd dir &&
-       rm -f two &&
-       git read-tree --reset -u "$tree" &&
-       cmp two ../original.two &&
-       cmp ../one ../original.one
+       (
+               cd dir &&
+               rm -f two &&
+               git read-tree --reset -u "$tree" &&
+               cmp two ../original.two &&
+               cmp ../one ../original.one
+       )
 '
 
 test_expect_success 'no file/rev ambiguity check inside .git' '
-       cd "$HERE" &&
        git commit -a -m 1 &&
-       cd "$HERE"/.git &&
-       git show -s HEAD
+       (
+               cd .git &&
+               git show -s HEAD
+       )
 '
 
 test_expect_success 'no file/rev ambiguity check inside a bare repo' '
-       cd "$HERE" &&
        git clone -s --bare .git foo.git &&
-       cd foo.git && GIT_DIR=. git show -s HEAD
+       (
+               cd foo.git &&
+               GIT_DIR=. git show -s HEAD
+       )
 '
 
 # This still does not work as it should...
 : test_expect_success 'no file/rev ambiguity check inside a bare repo' '
-       cd "$HERE" &&
        git clone -s --bare .git foo.git &&
-       cd foo.git && git show -s HEAD
+       (
+               cd foo.git &&
+               git show -s HEAD
+       )
 '
 
 test_expect_success SYMLINKS 'detection should not be fooled by a symlink' '
-       cd "$HERE" &&
        rm -fr foo.git &&
        git clone -s .git another &&
        ln -s another yetanother &&
-       cd yetanother/.git &&
-       git show -s HEAD
+       (
+               cd yetanother/.git &&
+               git show -s HEAD
+       )
 '
 
 test_done
index 074f2f2e3e57f76b01f16502998e95b493676711..d0ab8ffe1b91a7fa37dfc7939cb3d5ae2c3cc100 100755 (executable)
@@ -701,13 +701,13 @@ cat >expect <<\EOF
        trailingtilde = foo~
 EOF
 
-test_expect_success 'set --path' '
+test_expect_success NOT_MINGW 'set --path' '
        git config --path path.home "~/" &&
        git config --path path.normal "/dev/null" &&
        git config --path path.trailingtilde "foo~" &&
        test_cmp expect .git/config'
 
-if test "${HOME+set}"
+if test_have_prereq NOT_MINGW && test "${HOME+set}"
 then
        test_set_prereq HOMEVAR
 fi
@@ -730,7 +730,7 @@ cat >expect <<\EOF
 foo~
 EOF
 
-test_expect_success 'get --path copes with unset $HOME' '
+test_expect_success NOT_MINGW 'get --path copes with unset $HOME' '
        (
                unset HOME;
                test_must_fail git config --get --path path.home \
index 8d305b43725f8cf60e7ee802df1923feb98eeae5..a6bf1bf4d6182f0883ea858e28aa8a9b3dd79024 100755 (executable)
@@ -7,41 +7,64 @@ test_description='Test repository version check'
 
 . ./test-lib.sh
 
-cat >test.patch <<EOF
-diff --git a/test.txt b/test.txt
-new file mode 100644
---- /dev/null
-+++ b/test.txt
-@@ -0,0 +1 @@
-+123
-EOF
+test_expect_success 'setup' '
+       cat >test.patch <<-\EOF &&
+       diff --git a/test.txt b/test.txt
+       new file mode 100644
+       --- /dev/null
+       +++ b/test.txt
+       @@ -0,0 +1 @@
+       +123
+       EOF
 
-test_create_repo "test"
-test_create_repo "test2"
-
-GIT_CONFIG=test2/.git/config git config core.repositoryformatversion 99 || exit 1
+       test_create_repo "test" &&
+       test_create_repo "test2" &&
+       GIT_CONFIG=test2/.git/config git config core.repositoryformatversion 99
+'
 
 test_expect_success 'gitdir selection on normal repos' '
-       (test "$(git config core.repositoryformatversion)" = 0 &&
-       cd test &&
-       test "$(git config core.repositoryformatversion)" = 0)'
+       echo 0 >expect &&
+       git config core.repositoryformatversion >actual &&
+       (
+               cd test &&
+               git config core.repositoryformatversion >../actual2
+       ) &&
+       test_cmp expect actual &&
+       test_cmp expect actual2
+'
 
-# Make sure it would stop at test2, not trash
 test_expect_success 'gitdir selection on unsupported repo' '
-       (cd test2 &&
-       test "$(git config core.repositoryformatversion)" = 99)'
+       # Make sure it would stop at test2, not trash
+       echo 99 >expect &&
+       (
+               cd test2 &&
+               git config core.repositoryformatversion >../actual
+       )
+       test_cmp expect actual
+'
 
 test_expect_success 'gitdir not required mode' '
-       (git apply --stat test.patch &&
-       cd test && git apply --stat ../test.patch &&
-       cd ../test2 && git apply --stat ../test.patch)'
-
-test_expect_success 'gitdir required mode on normal repos' '
-       (git apply --check --index test.patch &&
-       cd test && git apply --check --index ../test.patch)'
+       git apply --stat test.patch &&
+       (
+               cd test &&
+               git apply --stat ../test.patch
+       ) &&
+       (
+               cd test2 &&
+               git apply --stat ../test.patch
+       )
+'
 
-test_expect_success 'gitdir required mode on unsupported repo' '
-       (cd test2 && test_must_fail git apply --check --index ../test.patch)
+test_expect_success 'gitdir required mode' '
+       git apply --check --index test.patch &&
+       (
+               cd test &&
+               git apply --check --index ../test.patch
+       ) &&
+       (
+               cd test2 &&
+               test_must_fail git apply --check --index ../test.patch
+       )
 '
 
 test_done
index 759cf12e16bcddc3dab9d6b3ad8abd5590245a94..1be415e334330b2fea398cc58a0f054b6b876da1 100755 (executable)
@@ -1,21 +1,23 @@
 #!/bin/sh
 
-test_description='git fsck random collection of tests'
+test_description='git fsck random collection of tests
+
+* (HEAD) B
+* (master) A
+'
 
 . ./test-lib.sh
 
 test_expect_success setup '
+       git config gc.auto 0 &&
        git config i18n.commitencoding ISO-8859-1 &&
        test_commit A fileA one &&
        git config --unset i18n.commitencoding &&
        git checkout HEAD^0 &&
        test_commit B fileB two &&
        git tag -d A B &&
-       git reflog expire --expire=now --all
-'
-
-test_expect_success 'HEAD is part of refs' '
-       test 0 = $(git fsck | wc -l)
+       git reflog expire --expire=now --all &&
+       >empty
 '
 
 test_expect_success 'loose objects borrowed from alternate are not missing' '
@@ -25,110 +27,132 @@ test_expect_success 'loose objects borrowed from alternate are not missing' '
                git init &&
                echo ../../../.git/objects >.git/objects/info/alternates &&
                test_commit C fileC one &&
-               git fsck >out &&
-               ! grep "missing blob" out
-       )
+               git fsck >../out 2>&1
+       ) &&
+       {
+               grep -v dangling out >actual ||
+               :
+       } &&
+       test_cmp empty actual
 '
 
-test_expect_success 'valid objects appear valid' '
-       { git fsck 2>out; true; } &&
-       ! grep error out &&
-       ! grep fatal out
+test_expect_success 'HEAD is part of refs, valid objects appear valid' '
+       git fsck >actual 2>&1 &&
+       test_cmp empty actual
 '
 
 # Corruption tests follow.  Make sure to remove all traces of the
 # specific corruption you test afterwards, lest a later test trip over
 # it.
 
+test_expect_success 'setup: helpers for corruption tests' '
+       sha1_file() {
+               echo "$*" | sed "s#..#.git/objects/&/#"
+       } &&
+
+       remove_object() {
+               file=$(sha1_file "$*") &&
+               test -e "$file" &&
+               rm -f "$file"
+       }
+'
+
 test_expect_success 'object with bad sha1' '
        sha=$(echo blob | git hash-object -w --stdin) &&
-       echo $sha &&
        old=$(echo $sha | sed "s+^..+&/+") &&
        new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
        sha="$(dirname $new)$(basename $new)"
        mv .git/objects/$old .git/objects/$new &&
+       test_when_finished "remove_object $sha" &&
        git update-index --add --cacheinfo 100644 $sha foo &&
+       test_when_finished "git read-tree -u --reset HEAD" &&
        tree=$(git write-tree) &&
+       test_when_finished "remove_object $tree" &&
        cmt=$(echo bogus | git commit-tree $tree) &&
+       test_when_finished "remove_object $cmt" &&
        git update-ref refs/heads/bogus $cmt &&
-       (git fsck 2>out; true) &&
-       grep "$sha.*corrupt" out &&
-       rm -f .git/objects/$new &&
-       git update-ref -d refs/heads/bogus &&
-       git read-tree -u --reset HEAD
+       test_when_finished "git update-ref -d refs/heads/bogus" &&
+
+       test_might_fail git fsck 2>out &&
+       cat out &&
+       grep "$sha.*corrupt" out
 '
 
 test_expect_success 'branch pointing to non-commit' '
-       git rev-parse HEAD^{tree} > .git/refs/heads/invalid &&
+       git rev-parse HEAD^{tree} >.git/refs/heads/invalid &&
+       test_when_finished "git update-ref -d refs/heads/invalid" &&
        git fsck 2>out &&
-       grep "not a commit" out &&
-       git update-ref -d refs/heads/invalid
+       cat out &&
+       grep "not a commit" out
 '
 
-new=nothing
 test_expect_success 'email without @ is okay' '
        git cat-file commit HEAD >basis &&
        sed "s/@/AT/" basis >okay &&
        new=$(git hash-object -t commit -w --stdin <okay) &&
-       echo "$new" &&
+       test_when_finished "remove_object $new" &&
        git update-ref refs/heads/bogus "$new" &&
+       test_when_finished "git update-ref -d refs/heads/bogus" &&
        git fsck 2>out &&
        cat out &&
-       ! grep "error in commit $new" out
+       ! grep "commit $new" out
 '
-git update-ref -d refs/heads/bogus
-rm -f ".git/objects/$new"
 
-new=nothing
 test_expect_success 'email with embedded > is not okay' '
        git cat-file commit HEAD >basis &&
        sed "s/@[a-z]/&>/" basis >bad-email &&
        new=$(git hash-object -t commit -w --stdin <bad-email) &&
-       echo "$new" &&
+       test_when_finished "remove_object $new" &&
        git update-ref refs/heads/bogus "$new" &&
+       test_when_finished "git update-ref -d refs/heads/bogus" &&
        git fsck 2>out &&
        cat out &&
        grep "error in commit $new" out
 '
-git update-ref -d refs/heads/bogus
-rm -f ".git/objects/$new"
-
-cat > invalid-tag <<EOF
-object ffffffffffffffffffffffffffffffffffffffff
-type commit
-tag invalid
-tagger T A Gger <tagger@example.com> 1234567890 -0000
-
-This is an invalid tag.
-EOF
 
 test_expect_success 'tag pointing to nonexistent' '
-       tag=$(git hash-object -t tag -w --stdin < invalid-tag) &&
-       echo $tag > .git/refs/tags/invalid &&
+       cat >invalid-tag <<-\EOF
+       object ffffffffffffffffffffffffffffffffffffffff
+       type commit
+       tag invalid
+       tagger T A Gger <tagger@example.com> 1234567890 -0000
+
+       This is an invalid tag.
+       EOF
+
+       tag=$(git hash-object -t tag -w --stdin <invalid-tag) &&
+       test_when_finished "remove_object $tag" &&
+       echo $tag >.git/refs/tags/invalid &&
+       test_when_finished "git update-ref -d refs/tags/invalid" &&
        test_must_fail git fsck --tags >out &&
        cat out &&
-       grep "broken link" out &&
-       rm .git/refs/tags/invalid
+       grep "broken link" out
 '
 
-cat > wrong-tag <<EOF
-object $(echo blob | git hash-object -w --stdin)
-type commit
-tag wrong
-tagger T A Gger <tagger@example.com> 1234567890 -0000
-
-This is an invalid tag.
-EOF
-
 test_expect_success 'tag pointing to something else than its type' '
-       tag=$(git hash-object -t tag -w --stdin < wrong-tag) &&
-       echo $tag > .git/refs/tags/wrong &&
+       sha=$(echo blob | git hash-object -w --stdin) &&
+       test_when_finished "remove_object $sha" &&
+       cat >wrong-tag <<-EOF &&
+       object $sha
+       type commit
+       tag wrong
+       tagger T A Gger <tagger@example.com> 1234567890 -0000
+
+       This is an invalid tag.
+       EOF
+
+       tag=$(git hash-object -t tag -w --stdin <wrong-tag) &&
+       test_when_finished "remove_object $tag" &&
+       echo $tag >.git/refs/tags/wrong &&
+       test_when_finished "git update-ref -d refs/tags/wrong" &&
        test_must_fail git fsck --tags 2>out &&
        cat out &&
-       grep "error in tag.*broken links" out &&
-       rm .git/refs/tags/wrong
+       grep "error in tag.*broken links" out
 '
 
-
+test_expect_success 'cleaned up' '
+       git fsck >actual 2>&1 &&
+       test_cmp empty actual
+'
 
 test_done
index 100f857b168b1d8b88ea1a1e7e31ba42a2beee6c..813cc1b3e29ec840deb63ad9c3c1dffd2187cdc5 100755 (executable)
@@ -106,8 +106,8 @@ test_expect_success 'use --default' '
 
 test_expect_success 'master@{n} for various n' '
        N=$(git reflog | wc -l) &&
-       Nm1=$((N-1)) &&
-       Np1=$((N+1)) &&
+       Nm1=$(($N-1)) &&
+       Np1=$(($N+1)) &&
        git rev-parse --verify master@{0} &&
        git rev-parse --verify master@{1} &&
        git rev-parse --verify master@{$Nm1} &&
index 7f60fd0b2e8904ec231975df3d65e66c9363ff45..335420fd87f87727f323156f461e520374b7da0b 100755 (executable)
@@ -134,8 +134,8 @@ cat >ls.expected <<EOF
 100644 $ONE_SHA1 0     me
 EOF
 
-export GIT_DIR="$TRASH_DIRECTORY/.git"
-export GIT_WORK_TREE=/
+GIT_DIR="$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
 
 test_vars 'abs gitdir, root' "$GIT_DIR" "/" ""
 test_foobar_root
@@ -154,24 +154,24 @@ say "GIT_DIR relative, GIT_WORK_TREE set"
 
 test_expect_success 'go to /' 'cd /'
 
-export GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git"
-export GIT_WORK_TREE=/
+GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
 
 test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
 test_foobar_root
 
 test_expect_success 'go to /foo' 'cd /foo'
 
-export GIT_DIR="../$TRASH_DIRECTORY/.git"
-export GIT_WORK_TREE=/
+GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
 
 test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
 test_foobar_foo
 
 test_expect_success 'go to /foo/bar' 'cd /foo/bar'
 
-export GIT_DIR="../../$TRASH_DIRECTORY/.git"
-export GIT_WORK_TREE=/
+GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=/ && export GIT_WORK_TREE
 
 test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
 test_foobar_foobar
@@ -180,24 +180,24 @@ say "GIT_DIR relative, GIT_WORK_TREE relative"
 
 test_expect_success 'go to /' 'cd /'
 
-export GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git"
-export GIT_WORK_TREE=.
+GIT_DIR="$(echo $TRASH_DIRECTORY|sed 's,^/,,')/.git" && export GIT_DIR
+GIT_WORK_TREE=. && export GIT_WORK_TREE
 
 test_vars 'rel gitdir, root' "$GIT_DIR" "/" ""
 test_foobar_root
 
 test_expect_success 'go to /' 'cd /foo'
 
-export GIT_DIR="../$TRASH_DIRECTORY/.git"
-export GIT_WORK_TREE=..
+GIT_DIR="../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=.. && export GIT_WORK_TREE
 
 test_vars 'rel gitdir, foo' "$TRASH_DIRECTORY/.git" "/" "foo/"
 test_foobar_foo
 
 test_expect_success 'go to /foo/bar' 'cd /foo/bar'
 
-export GIT_DIR="../../$TRASH_DIRECTORY/.git"
-export GIT_WORK_TREE=../..
+GIT_DIR="../../$TRASH_DIRECTORY/.git" && export GIT_DIR
+GIT_WORK_TREE=../.. && export GIT_WORK_TREE
 
 test_vars 'rel gitdir, foo/bar' "$TRASH_DIRECTORY/.git" "/" "foo/bar/"
 test_foobar_foobar
index 7657ec190c2620b1eda03522c0f392a2c6f78f5a..a463b13b27fec87e0f4adb1154fea26b0eee73d9 100755 (executable)
@@ -52,7 +52,7 @@ test_expect_success PERL 'git checkout -p HEAD with NO staged changes: apply' '
 '
 
 test_expect_success PERL 'git checkout -p HEAD with change already staged' '
-       set_state dir/foo index index
+       set_state dir/foo index index &&
        # the third n is to get out in case it mistakenly does not apply
        (echo n; echo y; echo n) | git checkout -p HEAD &&
        verify_saved_state bar &&
index 648184fd983512be57b46fb5903b42e4de5e4704..76ad7c344c0546603fb198a9ffb907d6142cbe84 100755 (executable)
@@ -63,10 +63,10 @@ cat > expected <<\EOF
 EOF
 test_expect_success 'update-index --update from subdir' \
        'echo not so happy >file2 &&
-       cd dir1 &&
+       (cd dir1 &&
        cat ../file2 >file3 &&
-       git update-index --again &&
-       cd .. &&
+       git update-index --again
+       ) &&
        git ls-files -s >current &&
        cmp current expected'
 
index 641607d89ae400f5fbce9dba0f42ee185d3ecd6a..a7f3d47aec2591f9da19ce24b2796005ddf87096 100755 (executable)
@@ -13,7 +13,7 @@ test_expect_success 'submodule with absolute .git file' '
        (cd sub1 &&
         git init &&
         REAL="$(pwd)/.real" &&
-        mv .git "$REAL"
+        mv .git "$REAL" &&
         echo "gitdir: $REAL" >.git &&
         test_commit first)
 '
index a7d8187169a36f708bd7dc39d97604dd9cc21565..ca01053bcc88806aae9abde5892b8c163b3936d0 100755 (executable)
@@ -26,4 +26,3 @@ test_expect_success \
     'git ls-files --error-unmatch foo bar'
 
 test_done
-1
index efe2900a372601848248de33188bda292185ba40..e66e550b2449e76435a0bf16c6a9889c0794f858 100755 (executable)
@@ -23,6 +23,8 @@ test_expect_success 'setup 1' '
        git branch df-3 &&
        git branch remove &&
        git branch submod &&
+       git branch copy &&
+       git branch rename &&
 
        echo hello >>a &&
        cp a d/e &&
@@ -248,6 +250,22 @@ test_expect_success 'setup 7' '
        git commit -m "make d/ a submodule"
 '
 
+test_expect_success 'setup 8' '
+       git checkout rename &&
+       git mv a e &&
+       git add e &&
+       test_tick &&
+       git commit -m "rename a->e"
+'
+
+test_expect_success 'setup 9' '
+       git checkout copy &&
+       cp a e &&
+       git add e &&
+       test_tick &&
+       git commit -m "copy a->e"
+'
+
 test_expect_success 'merge-recursive simple' '
 
        rm -fr [abcd] &&
@@ -580,4 +598,21 @@ test_expect_failure 'merge-recursive simple w/submodule result' '
        test_cmp expected actual
 '
 
+test_expect_success 'merge-recursive copy vs. rename' '
+       git checkout -f copy &&
+       git merge rename &&
+       ( git ls-tree -r HEAD && git ls-files -s ) >actual &&
+       (
+               echo "100644 blob $o0   b"
+               echo "100644 blob $o0   c"
+               echo "100644 blob $o0   d/e"
+               echo "100644 blob $o0   e"
+               echo "100644 $o0 0      b"
+               echo "100644 $o0 0      c"
+               echo "100644 $o0 0      d/e"
+               echo "100644 $o0 0      e"
+       ) >expected &&
+       test_cmp expected actual
+'
+
 test_done
index 3ce501bb9794900b99fbbf2f2ccfbb330f7947a7..61c1f53d1b75302be60396d2e01ccd5da5b6e5b4 100755 (executable)
@@ -53,17 +53,15 @@ test_expect_success setup '
        git add .
 '
 
-# We have to run from a sub-directory to trigger prune_path
-# Then we finally get to run our --with-tree test
-cd sub
-
 test_expect_success 'git -ls-files --with-tree should succeed from subdir' '
-
-       git ls-files --with-tree=HEAD~1 >../output
-
+       # We have to run from a sub-directory to trigger prune_path
+       # Then we finally get to run our --with-tree test
+       (
+               cd sub &&
+               git ls-files --with-tree=HEAD~1 >../output
+       )
 '
 
-cd ..
 test_expect_success \
     'git -ls-files --with-tree should add entries from named tree.' \
     'test_cmp expected output'
index eee0d344d24623ad9928366729c8efaea699fcd7..81d90b66c50e75323a44aaf5e2e067d5a3569e6a 100755 (executable)
@@ -165,4 +165,13 @@ test_expect_success \
 EOF
      test_output'
 
+test_expect_success \
+    'ls-tree with one path a prefix of the other' \
+    'git ls-tree $tree path2/baz path2/bazbo >current &&
+     make_expected <<\EOF &&
+040000 tree X  path2/baz
+120000 blob X  path2/bazbo
+EOF
+     test_output'
+
 test_done
index 06654c6f82fb6cfe955b91bcbd4a5fa064c73e70..026f9f89d916fdd0547c58aed7bcba7f06850023 100755 (executable)
@@ -21,33 +21,32 @@ entries.  Also test odd filename and missing entries handling.
 '
 . ./test-lib.sh
 
-test_expect_success \
-    'setup' \
-    'echo 111 >1.txt &&
-     echo 222 >2.txt &&
-     mkdir path0 path0/a path0/a/b path0/a/b/c &&
-     echo 111 >path0/a/b/c/1.txt &&
-     mkdir path1 path1/b path1/b/c &&
-     echo 111 >path1/b/c/1.txt &&
-     mkdir path2 &&
-     echo 111 >path2/1.txt &&
-     mkdir path3 &&
-     echo 111 >path3/1.txt &&
-     echo 222 >path3/2.txt &&
-     find *.txt path* \( -type f -o -type l \) -print |
-     xargs git update-index --add &&
-     tree=`git write-tree` &&
-     echo $tree'
+test_expect_success 'setup' '
+       echo 111 >1.txt &&
+       echo 222 >2.txt &&
+       mkdir path0 path0/a path0/a/b path0/a/b/c &&
+       echo 111 >path0/a/b/c/1.txt &&
+       mkdir path1 path1/b path1/b/c &&
+       echo 111 >path1/b/c/1.txt &&
+       mkdir path2 &&
+       echo 111 >path2/1.txt &&
+       mkdir path3 &&
+       echo 111 >path3/1.txt &&
+       echo 222 >path3/2.txt &&
+       find *.txt path* \( -type f -o -type l \) -print |
+       xargs git update-index --add &&
+       tree=`git write-tree` &&
+       echo $tree
+'
 
 test_output () {
-    sed -e "s/ $_x40   / X     /" <current >check
-    test_cmp expected check
+       sed -e "s/ $_x40        / X     /" <current >check &&
+       test_cmp expected check
 }
 
-test_expect_success \
-    'ls-tree plain' \
-    'git ls-tree $tree >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree plain' '
+       git ls-tree $tree >current &&
+       cat >expected <<\EOF &&
 100644 blob X  1.txt
 100644 blob X  2.txt
 040000 tree X  path0
@@ -55,13 +54,13 @@ test_expect_success \
 040000 tree X  path2
 040000 tree X  path3
 EOF
-     test_output'
+       test_output
+'
 
 # Recursive does not show tree nodes anymore...
-test_expect_success \
-    'ls-tree recursive' \
-    'git ls-tree -r $tree >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree recursive' '
+       git ls-tree -r $tree >current &&
+       cat >expected <<\EOF &&
 100644 blob X  1.txt
 100644 blob X  2.txt
 100644 blob X  path0/a/b/c/1.txt
@@ -70,68 +69,71 @@ test_expect_success \
 100644 blob X  path3/1.txt
 100644 blob X  path3/2.txt
 EOF
-     test_output'
+       test_output
+'
 
-test_expect_success \
-    'ls-tree filter 1.txt' \
-    'git ls-tree $tree 1.txt >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree filter 1.txt' '
+       git ls-tree $tree 1.txt >current &&
+       cat >expected <<\EOF &&
 100644 blob X  1.txt
 EOF
-     test_output'
+       test_output
+'
 
-test_expect_success \
-    'ls-tree filter path1/b/c/1.txt' \
-    'git ls-tree $tree path1/b/c/1.txt >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree filter path1/b/c/1.txt' '
+       git ls-tree $tree path1/b/c/1.txt >current &&
+       cat >expected <<\EOF &&
 100644 blob X  path1/b/c/1.txt
 EOF
-     test_output'
+       test_output
+'
 
-test_expect_success \
-    'ls-tree filter all 1.txt files' \
-    'git ls-tree $tree 1.txt path0/a/b/c/1.txt path1/b/c/1.txt path2/1.txt path3/1.txt >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree filter all 1.txt files' '
+       git ls-tree $tree 1.txt path0/a/b/c/1.txt \
+               path1/b/c/1.txt path2/1.txt path3/1.txt >current &&
+       cat >expected <<\EOF &&
 100644 blob X  1.txt
 100644 blob X  path0/a/b/c/1.txt
 100644 blob X  path1/b/c/1.txt
 100644 blob X  path2/1.txt
 100644 blob X  path3/1.txt
 EOF
-     test_output'
+       test_output
+'
 
 # I am not so sure about this one after ls-tree doing pathspec match.
 # Having both path0/a and path0/a/b/c makes path0/a redundant, and
 # it behaves as if path0/a/b/c, path1/b/c, path2 and path3 are specified.
-test_expect_success \
-    'ls-tree filter directories' \
-    'git ls-tree $tree path3 path2 path0/a/b/c path1/b/c path0/a >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree filter directories' '
+       git ls-tree $tree path3 path2 path0/a/b/c path1/b/c path0/a >current &&
+       cat >expected <<\EOF &&
 040000 tree X  path0/a/b/c
 040000 tree X  path1/b/c
 040000 tree X  path2
 040000 tree X  path3
 EOF
-     test_output'
+       test_output
+'
 
 # Again, duplicates are filtered away so this is equivalent to
 # having 1.txt and path3
-test_expect_success \
-    'ls-tree filter odd names' \
-    'git ls-tree $tree 1.txt ./1.txt .//1.txt path3/1.txt path3/./1.txt path3 path3// >current &&
-     cat >expected <<\EOF &&
+test_expect_success 'ls-tree filter odd names' '
+       git ls-tree $tree 1.txt ./1.txt .//1.txt \
+               path3/1.txt path3/./1.txt path3 path3// >current &&
+       cat >expected <<\EOF &&
 100644 blob X  1.txt
 100644 blob X  path3/1.txt
 100644 blob X  path3/2.txt
 EOF
-     test_output'
+       test_output
+'
 
-test_expect_success \
-    'ls-tree filter missing files and extra slashes' \
-    'git ls-tree $tree 1.txt/ abc.txt path3//23.txt path3/2.txt/// >current &&
-     cat >expected <<\EOF &&
-EOF
-     test_output'
+test_expect_success 'ls-tree filter missing files and extra slashes' '
+       git ls-tree $tree 1.txt/ abc.txt \
+               path3//23.txt path3/2.txt/// >current &&
+       >expected &&
+       test_output
+'
 
 test_expect_success 'ls-tree filter is leading path match' '
        git ls-tree $tree pa path3/a >current &&
@@ -198,7 +200,7 @@ EOF
 '
 
 test_expect_success 'ls-tree --name-only' '
-       git ls-tree --name-only $tree >current
+       git ls-tree --name-only $tree >current &&
        cat >expected <<\EOF &&
 1.txt
 2.txt
@@ -211,7 +213,7 @@ EOF
 '
 
 test_expect_success 'ls-tree --name-only -r' '
-       git ls-tree --name-only -r $tree >current
+       git ls-tree --name-only -r $tree >current &&
        cat >expected <<\EOF &&
 1.txt
 2.txt
index 8f785e7957519eaa3dd1ef946c905054c4fa0e6c..74161a42ec34c2d33780a80425ec1be5a4028f03 100755 (executable)
@@ -42,23 +42,24 @@ test_expect_success 'setup for merge-preserving rebase' \
        git commit -a -m "Modify A2" &&
 
        git clone ./. clone1 &&
-       cd clone1 &&
+       (cd clone1 &&
        git checkout -b topic origin/topic &&
-       git merge origin/master &&
-       cd .. &&
+       git merge origin/master
+       ) &&
 
        echo Fifth > B &&
        git add B &&
        git commit -m "Add different B" &&
 
        git clone ./. clone2 &&
-       cd clone2 &&
-       git checkout -b topic origin/topic &&
-       test_must_fail git merge origin/master &&
-       echo Resolved > B &&
-       git add B &&
-       git commit -m "Merge origin/master into topic" &&
-       cd .. &&
+       (
+               cd clone2 &&
+               git checkout -b topic origin/topic &&
+               test_must_fail git merge origin/master &&
+               echo Resolved >B &&
+               git add B &&
+               git commit -m "Merge origin/master into topic"
+       ) &&
 
        git checkout topic &&
        echo Fourth >> B &&
index 37cb89ab53055099db3d5f774d00ade1c4da6c69..fd2184ce7159122ae8d1d65f5a228a7b91c5e02a 100755 (executable)
@@ -26,7 +26,7 @@ test_auto_fixup() {
        echo 1 >file1 &&
        git add -u &&
        test_tick &&
-       git commit -m "fixup! first"
+       git commit -m "fixup! first" &&
 
        git tag $1 &&
        test_tick &&
@@ -55,7 +55,7 @@ test_auto_squash() {
        echo 1 >file1 &&
        git add -u &&
        test_tick &&
-       git commit -m "squash! first"
+       git commit -m "squash! first" &&
 
        git tag $1 &&
        test_tick &&
@@ -84,7 +84,7 @@ test_expect_success 'misspelled auto squash' '
        echo 1 >file1 &&
        git add -u &&
        test_tick &&
-       git commit -m "squash! forst"
+       git commit -m "squash! forst" &&
        git tag final-missquash &&
        test_tick &&
        git rebase --autosquash -i HEAD^^^ &&
index e17ae712b1078333fa191b97764177016bc01b84..51ca391e472441d2d503e721795d609bfaad1100 100755 (executable)
@@ -95,4 +95,14 @@ test_expect_success 'cherry pick a merge relative to nonexistent parent with --f
        test_must_fail git cherry-pick --ff -m 3 C
 '
 
+test_expect_success 'cherry pick a root commit with --ff' '
+       git reset --hard first -- &&
+       git rm file1 &&
+       echo first >file2 &&
+       git add file2 &&
+       git commit --amend -m "file2" &&
+       git cherry-pick --ff first &&
+       test "$(git rev-parse --verify HEAD)" = "1df192cd8bc58a2b275d842cede4d221ad9000d1"
+'
+
 test_done
index d99f27a12f40d73094ef286a067f3c6771e61865..903a122efe0c54cb44eb6c3e7ed04bdbab81439d 100755 (executable)
@@ -69,9 +69,10 @@ test_expect_success 'apply stashed changes (including index)' '
 test_expect_success 'unstashing in a subdirectory' '
        git reset --hard HEAD &&
        mkdir subdir &&
-       cd subdir &&
-       git stash apply &&
-       cd ..
+       (
+               cd subdir &&
+               git stash apply
+       )
 '
 
 test_expect_success 'drop top stash' '
@@ -415,8 +416,37 @@ test_expect_success 'stash show - stashes on stack, stash-like argument' '
        echo bar >> file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
-       git stash show ${STASH_ID}
+       cat >expected <<-EOF &&
+        file |    1 +
+        1 files changed, 1 insertions(+), 0 deletions(-)
+       EOF
+       git stash show ${STASH_ID} >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'stash show -p - stashes on stack, stash-like argument' '
+       git stash clear &&
+       test_when_finished "git reset --hard HEAD" &&
+       git reset --hard &&
+       echo foo >> file &&
+       git stash &&
+       test_when_finished "git stash drop" &&
+       echo bar >> file &&
+       STASH_ID=$(git stash create) &&
+       git reset --hard &&
+       cat >expected <<-EOF &&
+       diff --git a/file b/file
+       index 7601807..935fbd3 100644
+       --- a/file
+       +++ b/file
+       @@ -1 +1,2 @@
+        baz
+       +bar
+       EOF
+       git stash show -p ${STASH_ID} >actual &&
+       test_cmp expected actual
 '
+
 test_expect_success 'stash show - no stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
@@ -424,7 +454,32 @@ test_expect_success 'stash show - no stashes on stack, stash-like argument' '
        echo foo >> file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
-       git stash show ${STASH_ID}
+       cat >expected <<-EOF &&
+        file |    1 +
+        1 files changed, 1 insertions(+), 0 deletions(-)
+       EOF
+       git stash show ${STASH_ID} >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'stash show -p - no stashes on stack, stash-like argument' '
+       git stash clear &&
+       test_when_finished "git reset --hard HEAD" &&
+       git reset --hard &&
+       echo foo >> file &&
+       STASH_ID=$(git stash create) &&
+       git reset --hard &&
+       cat >expected <<-EOF &&
+       diff --git a/file b/file
+       index 7601807..71b52c4 100644
+       --- a/file
+       +++ b/file
+       @@ -1 +1,2 @@
+        baz
+       +foo
+       EOF
+       git stash show -p ${STASH_ID} >actual &&
+       test_cmp expected actual
 '
 
 test_expect_success 'stash drop - fail early if specified stash is not a stash reference' '
@@ -490,4 +545,15 @@ test_expect_success 'invalid ref of the form stash@{n}, n >= N' '
        git stash drop
 '
 
+test_expect_success 'stash branch should not drop the stash if the branch exists' '
+       git stash clear &&
+       echo foo >file &&
+       git add file &&
+       git commit -m initial &&
+       echo bar >file &&
+       git stash &&
+       test_must_fail git stash branch master stash@{0} &&
+       git rev-parse stash@{0} --
+'
+
 test_done
index 19857f4326aa491a4c7d292900a0a766e7c45f80..9a665205884fcdb1c5888558d6edf960e335e013 100755 (executable)
@@ -210,6 +210,9 @@ log -m -p master
 log -SF master
 log -S F master
 log -SF -p master
+log -GF master
+log -GF -p master
+log -GF -p --pickaxe-all master
 log --decorate --all
 log --decorate=full --all
 
diff --git a/t/t4013/diff.log_-GF_-p_--pickaxe-all_master b/t/t4013/diff.log_-GF_-p_--pickaxe-all_master
new file mode 100644 (file)
index 0000000..d36f880
--- /dev/null
@@ -0,0 +1,27 @@
+$ git log -GF -p --pickaxe-all master
+commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
+Author: A U Thor <author@example.com>
+Date:   Mon Jun 26 00:02:00 2006 +0000
+
+    Third
+
+diff --git a/dir/sub b/dir/sub
+index 8422d40..cead32e 100644
+--- a/dir/sub
++++ b/dir/sub
+@@ -2,3 +2,5 @@ A
+ B
+ C
+ D
++E
++F
+diff --git a/file1 b/file1
+new file mode 100644
+index 0000000..b1e6722
+--- /dev/null
++++ b/file1
+@@ -0,0 +1,3 @@
++A
++B
++C
+$
diff --git a/t/t4013/diff.log_-GF_-p_master b/t/t4013/diff.log_-GF_-p_master
new file mode 100644 (file)
index 0000000..9d93f2c
--- /dev/null
@@ -0,0 +1,18 @@
+$ git log -GF -p master
+commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
+Author: A U Thor <author@example.com>
+Date:   Mon Jun 26 00:02:00 2006 +0000
+
+    Third
+
+diff --git a/dir/sub b/dir/sub
+index 8422d40..cead32e 100644
+--- a/dir/sub
++++ b/dir/sub
+@@ -2,3 +2,5 @@ A
+ B
+ C
+ D
++E
++F
+$
diff --git a/t/t4013/diff.log_-GF_master b/t/t4013/diff.log_-GF_master
new file mode 100644 (file)
index 0000000..4c6708d
--- /dev/null
@@ -0,0 +1,7 @@
+$ git log -GF master
+commit 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0
+Author: A U Thor <author@example.com>
+Date:   Mon Jun 26 00:02:00 2006 +0000
+
+    Third
+$
index f87434b9f8e0d520813389e6ea7c94f74222767b..07bf6eb49dd2879758f64a8c09a0ae8d7e54dd45 100755 (executable)
@@ -12,24 +12,29 @@ test_expect_success setup '
        for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i"; done >file &&
        cat file >elif &&
        git add file elif &&
+       test_tick &&
        git commit -m Initial &&
        git checkout -b side &&
 
        for i in 1 2 5 6 A B C 7 8 9 10; do echo "$i"; done >file &&
        test_chmod +x elif &&
+       test_tick &&
        git commit -m "Side changes #1" &&
 
        for i in D E F; do echo "$i"; done >>file &&
        git update-index file &&
+       test_tick &&
        git commit -m "Side changes #2" &&
        git tag C2 &&
 
        for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >file &&
        git update-index file &&
+       test_tick &&
        git commit -m "Side changes #3 with \\n backslash-n in it." &&
 
        git checkout master &&
        git diff-tree -p C2 | git apply --index &&
+       test_tick &&
        git commit -m "Master accepts moral equivalent of #2"
 
 '
@@ -51,6 +56,22 @@ test_expect_success "format-patch --ignore-if-in-upstream" '
 
 '
 
+test_expect_success "format-patch doesn't consider merge commits" '
+
+       git checkout -b slave master &&
+       echo "Another line" >>file &&
+       test_tick &&
+       git commit -am "Slave change #1" &&
+       echo "Yet another line" >>file &&
+       test_tick &&
+       git commit -am "Slave change #2" &&
+       git checkout -b merger master &&
+       test_tick &&
+       git merge --no-ff slave &&
+       cnt=`git format-patch -3 --stdout | grep "^From " | wc -l` &&
+       test $cnt = 3
+'
+
 test_expect_success "format-patch result applies" '
 
        git checkout -b rebuild-0 master &&
index 61de8a2718df8a7b0b0661d7ba47ade133d66ab8..0a61b57b5f6f00ae4c0734a34ce45c0ba1fcf098 100755 (executable)
@@ -32,13 +32,18 @@ EOF
 
 sed 's/beer\\/beer,\\/' < Beer.java > Beer-correct.java
 
-builtin_patterns="bibtex cpp csharp html java objc pascal php python ruby tex"
+builtin_patterns="bibtex cpp csharp fortran html java objc pascal php python ruby tex"
 for p in $builtin_patterns
 do
        test_expect_success "builtin $p pattern compiles" '
                echo "*.java diff=$p" > .gitattributes &&
-               ! ( git diff --no-index Beer.java Beer-correct.java 2>&1 |
-                       grep "fatal" > /dev/null )
+               ! { git diff --no-index Beer.java Beer-correct.java 2>&1 |
+                       grep "fatal" > /dev/null; }
+       '
+       test_expect_success "builtin $p wordRegex pattern compiles" '
+               ! { git diff --no-index --word-diff \
+                       Beer.java Beer-correct.java 2>&1 |
+                       grep "fatal" > /dev/null; }
        '
 done
 
index 8e391cf9a72c6518217526155cbea93d74b9e626..995bdfafecedf6b629acdb3300732a4bb691f23c 100755 (executable)
@@ -85,10 +85,11 @@ EOF
 "
 
 commit_file sm1 &&
-cd sm1 &&
-git reset --hard HEAD~2 >/dev/null &&
-head3=$(git rev-parse --verify HEAD | cut -c1-7) &&
-cd ..
+head3=$(
+       cd sm1 &&
+       git reset --hard HEAD~2 >/dev/null &&
+       git rev-parse --verify HEAD | cut -c1-7
+)
 
 test_expect_success 'modified submodule(backward)' "
        git diff-index -p --submodule=log HEAD >actual &&
index 27bfba55bd9631a666ee382b343c3c04af1ad26d..cff1b3e0502e96ff6232611ef70c24752a970a96 100755 (executable)
@@ -94,7 +94,7 @@ test_expect_success 'git archive with --output' \
     'git archive --output=b4.tar HEAD &&
     test_cmp b.tar b4.tar'
 
-test_expect_success 'git archive --remote' \
+test_expect_success NOT_MINGW 'git archive --remote' \
     'git archive --remote=. HEAD >b5.tar &&
     test_cmp b.tar b5.tar'
 
index 8a298a655fa007fbd9a43d6212b53f749c980eb6..aa0ada01476b89f3f284dda42f892155496f3467 100755 (executable)
@@ -4,14 +4,9 @@ test_description='test automatic tag following'
 
 . ./test-lib.sh
 
-case $(uname -s) in
-*MINGW*)
+if ! test_have_prereq NOT_MINGW; then
        say "GIT_DEBUG_SEND_PACK not supported - skipping tests"
-       ;;
-*)
-       test_set_prereq NOT_MINGW
-       ;;
-esac
+fi
 
 # End state of the repository:
 #
index 8fbd894e7f4bee135156486a3e67af90cf78a63a..9a884751ec73ff721d658ebb69cbfe1f0270be85 100755 (executable)
@@ -21,27 +21,30 @@ test_expect_success setup '
 
 test_expect_success "clone and setup child repos" '
        git clone . one &&
-       cd one &&
-       echo >file updated by one &&
-       git commit -a -m "updated by one" &&
-       cd .. &&
+       (
+               cd one &&
+               echo >file updated by one &&
+               git commit -a -m "updated by one"
+       ) &&
        git clone . two &&
-       cd two &&
-       git config branch.master.remote one &&
-       git config remote.one.url ../one/.git/ &&
-       git config remote.one.fetch refs/heads/master:refs/heads/one &&
-       cd .. &&
+       (
+               cd two &&
+               git config branch.master.remote one &&
+               git config remote.one.url ../one/.git/ &&
+               git config remote.one.fetch refs/heads/master:refs/heads/one
+       ) &&
        git clone . three &&
-       cd three &&
-       git config branch.master.remote two &&
-       git config branch.master.merge refs/heads/one &&
-       mkdir -p .git/remotes &&
-       {
-               echo "URL: ../two/.git/"
-               echo "Pull: refs/heads/master:refs/heads/two"
-               echo "Pull: refs/heads/one:refs/heads/one"
-       } >.git/remotes/two &&
-       cd .. &&
+       (
+               cd three &&
+               git config branch.master.remote two &&
+               git config branch.master.merge refs/heads/one &&
+               mkdir -p .git/remotes &&
+               {
+                       echo "URL: ../two/.git/"
+                       echo "Pull: refs/heads/master:refs/heads/two"
+                       echo "Pull: refs/heads/one:refs/heads/one"
+               } >.git/remotes/two
+       ) &&
        git clone . bundle &&
        git clone . seven
 '
@@ -240,10 +243,36 @@ test_expect_success 'fetch with a non-applying branch.<name>.merge' '
        git fetch blub
 '
 
-test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge' '
+# URL supplied to fetch does not match the url of the configured branch's remote
+test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [1]' '
+       one_head=$(cd one && git rev-parse HEAD) &&
+       this_head=$(git rev-parse HEAD) &&
+       git update-ref -d FETCH_HEAD &&
+       git fetch one &&
+       test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
+       test $this_head = "$(git rev-parse --verify HEAD)"
+'
+
+# URL supplied to fetch matches the url of the configured branch's remote and
+# the merge spec matches the branch the remote HEAD points to
+test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [2]' '
+       one_ref=$(cd one && git symbolic-ref HEAD) &&
+       git config branch.master.remote blub &&
+       git config branch.master.merge "$one_ref" &&
+       git update-ref -d FETCH_HEAD &&
+       git fetch one &&
+       test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
+       test $this_head = "$(git rev-parse --verify HEAD)"
+'
+
+# URL supplied to fetch matches the url of the configured branch's remote, but
+# the merge spec does not match the branch the remote HEAD points to
+test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [3]' '
+       git config branch.master.merge "${one_ref}_not" &&
        git update-ref -d FETCH_HEAD &&
        git fetch one &&
-       git rev-parse --verify FETCH_HEAD
+       test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
+       test $this_head = "$(git rev-parse --verify HEAD)"
 '
 
 # the strange name is: a\!'b
index 44885b850c4a1c3a09b8b078a643cf7cd8918213..0ad7ce07c4550ed28a22743a3c543e16f4d4c558 100755 (executable)
@@ -5,16 +5,17 @@ test_description='test git-http-backend-noserver'
 
 HTTPD_DOCUMENT_ROOT_PATH="$TRASH_DIRECTORY"
 
+test_have_prereq MINGW && export GREP_OPTIONS=-U
+
 run_backend() {
        echo "$2" |
        QUERY_STRING="${1#*\?}" \
-       GIT_PROJECT_ROOT="$HTTPD_DOCUMENT_ROOT_PATH" \
-       PATH_INFO="${1%%\?*}" \
+       PATH_TRANSLATED="$HTTPD_DOCUMENT_ROOT_PATH/${1%%\?*}" \
        git http-backend >act.out 2>act.err
 }
 
 GET() {
-       export REQUEST_METHOD="GET" &&
+       REQUEST_METHOD="GET" && export REQUEST_METHOD &&
        run_backend "/repo.git/$1" &&
        unset REQUEST_METHOD &&
        if ! grep "Status" act.out >act
@@ -26,8 +27,8 @@ GET() {
 }
 
 POST() {
-       export REQUEST_METHOD="POST" &&
-       export CONTENT_TYPE="application/x-$1-request" &&
+       REQUEST_METHOD="POST" && export REQUEST_METHOD &&
+       CONTENT_TYPE="application/x-$1-request" && export CONTENT_TYPE &&
        run_backend "/repo.git/$1" "$2" &&
        unset REQUEST_METHOD &&
        unset CONTENT_TYPE &&
@@ -46,7 +47,7 @@ log_div() {
 . "$TEST_DIRECTORY"/t556x_common
 
 expect_aliased() {
-       export REQUEST_METHOD="GET" &&
+       REQUEST_METHOD="GET" && export REQUEST_METHOD &&
        if test $1 = 0; then
                run_backend "$2"
        else
index be024e551c977355d8611c2134a4eda97a2bcc7d..51287d89d8deb27ae2ae49fec84268422377eb29 100755 (executable)
@@ -50,7 +50,7 @@ get_static_files() {
 }
 
 SMART=smart
-export GIT_HTTP_EXPORT_ALL=1
+GIT_HTTP_EXPORT_ALL=1 && export GIT_HTTP_EXPORT_ALL
 test_expect_success 'direct refs/heads/master not found' '
        log_div "refs/heads/master"
        GET refs/heads/master "404 Not Found"
@@ -73,7 +73,7 @@ test_expect_success 'export if git-daemon-export-ok' '
         get_static_files "200 OK"
 '
 SMART=smart
-export GIT_HTTP_EXPORT_ALL=1
+GIT_HTTP_EXPORT_ALL=1 && export GIT_HTTP_EXPORT_ALL
 test_expect_success 'static file if http.getanyfile true is ok' '
        log_div "getanyfile true"
        config http.getanyfile true &&
index ddc3dc52f497d05e20cf4034d544df6d08632935..728ccd88c3d69f06bff2c3593ddc325f9186402c 100755 (executable)
@@ -30,6 +30,13 @@ test_expect_success 'tags can be excluded by rev-list options' '
 
 '
 
+test_expect_success 'die if bundle file cannot be created' '
+
+       mkdir adir &&
+       test_must_fail git bundle create adir --all
+
+'
+
 test_expect_failure 'bundle --stdin' '
 
        echo master | git bundle create stdin-bundle.bdl --stdin &&
index 52d0dc4bb8f80393c79935f9c951b5323287e41c..460bf741b594d4d6b7f2220ac0f1a0d28c653619 100755 (executable)
@@ -14,6 +14,8 @@ test_description='CRLF merge conflict across text=auto change
 
 . ./test-lib.sh
 
+test_have_prereq MINGW && SED_OPTIONS=-b
+
 test_expect_success setup '
        git config core.autocrlf false &&
 
@@ -60,7 +62,7 @@ test_expect_success setup '
 
 test_expect_success 'set up fuzz_conflict() helper' '
        fuzz_conflict() {
-               sed -e "s/^\([<>=]......\) .*/\1/" "$@"
+               sed $SED_OPTIONS -e "s/^\([<>=]......\) .*/\1/" "$@"
        }
 '
 
index dd917d76da4f30ee8079caa17766c71513670d2e..95b180f4693658504fa44d8199efc2a31e85b43d 100755 (executable)
@@ -104,17 +104,18 @@ test_expect_success '"git fsck" works' '
 test_expect_success 'repack, clone and fetch work' '
      git repack -a -d &&
      git clone --no-hardlinks . clone_dir &&
-     cd clone_dir &&
-     git show HEAD~5 | grep "A U Thor" &&
-     git show $HASH2 | grep "A U Thor" &&
-     git cat-file commit $R &&
-     git repack -a -d &&
-     test_must_fail git cat-file commit $R &&
-     git fetch ../ "refs/replace/*:refs/replace/*" &&
-     git show HEAD~5 | grep "O Thor" &&
-     git show $HASH2 | grep "O Thor" &&
-     git cat-file commit $R &&
-     cd ..
+     (
+         cd clone_dir &&
+         git show HEAD~5 | grep "A U Thor" &&
+         git show $HASH2 | grep "A U Thor" &&
+         git cat-file commit $R &&
+         git repack -a -d &&
+         test_must_fail git cat-file commit $R &&
+         git fetch ../ "refs/replace/*:refs/replace/*" &&
+         git show HEAD~5 | grep "O Thor" &&
+         git show $HASH2 | grep "O Thor" &&
+         git cat-file commit $R
+     )
 '
 
 test_expect_success '"git replace" listing and deleting' '
@@ -177,10 +178,11 @@ test_expect_success 'create parallel branch without the bug' '
 
 test_expect_success 'push to cloned repo' '
      git push cloned $HASH6^:refs/heads/parallel &&
-     cd clone_dir &&
-     git checkout parallel &&
-     git log --pretty=oneline | grep $PARA2 &&
-     cd ..
+     (
+         cd clone_dir &&
+         git checkout parallel &&
+         git log --pretty=oneline | grep $PARA2
+     )
 '
 
 test_expect_success 'push branch with replacement' '
@@ -191,20 +193,29 @@ test_expect_success 'push branch with replacement' '
      git show $HASH6~2 | grep "O Thor" &&
      git show $PARA3 | grep "O Thor" &&
      git push cloned $HASH6^:refs/heads/parallel2 &&
-     cd clone_dir &&
-     git checkout parallel2 &&
-     git log --pretty=oneline | grep $PARA3 &&
-     git show $PARA3 | grep "A U Thor" &&
-     cd ..
+     (
+         cd clone_dir &&
+         git checkout parallel2 &&
+         git log --pretty=oneline | grep $PARA3 &&
+         git show $PARA3 | grep "A U Thor"
+     )
 '
 
 test_expect_success 'fetch branch with replacement' '
      git branch tofetch $HASH6 &&
-     cd clone_dir &&
-     git fetch origin refs/heads/tofetch:refs/heads/parallel3
-     git log --pretty=oneline parallel3 | grep $PARA3
-     git show $PARA3 | grep "A U Thor"
-     cd ..
+     (
+         cd clone_dir &&
+         git fetch origin refs/heads/tofetch:refs/heads/parallel3 &&
+         git log --pretty=oneline parallel3 > output.txt &&
+         ! grep $PARA3 output.txt &&
+         git show $PARA3 > para3.txt &&
+         grep "A U Thor" para3.txt &&
+         git fetch origin "refs/replace/*:refs/replace/*" &&
+         git log --pretty=oneline parallel3 > output.txt &&
+         grep $PARA3 output.txt &&
+         git show $PARA3 > para3.txt &&
+         grep "O Thor" para3.txt
+     )
 '
 
 test_expect_success 'bisect and replacements' '
index 71f6cad3c2b8e8ed0b16d292f4922760901702ef..9a168069217ef8d82173e563a04eaefe58d99f2a 100755 (executable)
@@ -129,6 +129,97 @@ test_expect_success '[merge] summary/log configuration' '
        test_cmp expected actual2
 '
 
+test_expect_success 'setup: clear [merge] configuration' '
+       test_might_fail git config --unset-all merge.log &&
+       test_might_fail git config --unset-all merge.summary
+'
+
+test_expect_success 'setup FETCH_HEAD' '
+       git checkout master &&
+       test_tick &&
+       git fetch . left
+'
+
+test_expect_success 'merge.log=3 limits shortlog length' '
+       cat >expected <<-EOF &&
+       Merge branch ${apos}left${apos}
+
+       * left: (5 commits)
+         Left #5
+         Left #4
+         Left #3
+         ...
+       EOF
+
+       git -c merge.log=3 fmt-merge-msg <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'merge.log=5 shows all 5 commits' '
+       cat >expected <<-EOF &&
+       Merge branch ${apos}left${apos}
+
+       * left:
+         Left #5
+         Left #4
+         Left #3
+         Common #2
+         Common #1
+       EOF
+
+       git -c merge.log=5 fmt-merge-msg <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'merge.log=0 disables shortlog' '
+       echo "Merge branch ${apos}left${apos}" >expected
+       git -c merge.log=0 fmt-merge-msg <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success '--log=3 limits shortlog length' '
+       cat >expected <<-EOF &&
+       Merge branch ${apos}left${apos}
+
+       * left: (5 commits)
+         Left #5
+         Left #4
+         Left #3
+         ...
+       EOF
+
+       git fmt-merge-msg --log=3 <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success '--log=5 shows all 5 commits' '
+       cat >expected <<-EOF &&
+       Merge branch ${apos}left${apos}
+
+       * left:
+         Left #5
+         Left #4
+         Left #3
+         Common #2
+         Common #1
+       EOF
+
+       git fmt-merge-msg --log=5 <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success '--no-log disables shortlog' '
+       echo "Merge branch ${apos}left${apos}" >expected &&
+       git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success '--log=0 disables shortlog' '
+       echo "Merge branch ${apos}left${apos}" >expected &&
+       git fmt-merge-msg --no-log <.git/FETCH_HEAD >actual &&
+       test_cmp expected actual
+'
+
 test_expect_success 'fmt-merge-msg -m' '
        echo "Sync with left" >expected &&
        cat >expected.log <<-EOF &&
index 2c55801ee8b88b2d97968a24706dcfdab824668b..e0227730deb88413301b37501fdb165a2c90460e 100755 (executable)
@@ -3,31 +3,34 @@
 test_description='git filter-branch'
 . ./test-lib.sh
 
-make_commit () {
-       lower=$(echo $1 | tr '[A-Z]' '[a-z]')
-       echo $lower > $lower
-       git add $lower
-       test_tick
-       git commit -m $1
-       git tag $1
-}
-
 test_expect_success 'setup' '
-       make_commit A
-       make_commit B
-       git checkout -b branch B
-       make_commit D
-       mkdir dir
-       make_commit dir/D
-       make_commit E
-       git checkout master
-       make_commit C
-       git checkout branch
-       git merge C
-       git tag F
-       make_commit G
-       make_commit H
-'
+       test_commit A &&
+       test_commit B &&
+       git checkout -b branch B &&
+       test_commit D &&
+       mkdir dir &&
+       test_commit dir/D &&
+       test_commit E &&
+       git checkout master &&
+       test_commit C &&
+       git checkout branch &&
+       git merge C &&
+       git tag F &&
+       test_commit G &&
+       test_commit H
+'
+# * (HEAD, branch) H
+# * G
+# *   Merge commit 'C' into branch
+# |\
+# | * (master) C
+# * | E
+# * | dir/D
+# * | D
+# |/
+# * B
+# * A
+
 
 H=$(git rev-parse H)
 
@@ -65,14 +68,14 @@ test_expect_success 'Fail if commit filter fails' '
 '
 
 test_expect_success 'rewrite, renaming a specific file' '
-       git filter-branch -f --tree-filter "mv d doh || :" HEAD
+       git filter-branch -f --tree-filter "mv D.t doh || :" HEAD
 '
 
 test_expect_success 'test that the file was renamed' '
-       test d = "$(git show HEAD:doh --)" &&
-       ! test -f d &&
+       test D = "$(git show HEAD:doh --)" &&
+       ! test -f D.t &&
        test -f doh &&
-       test d = "$(cat doh)"
+       test D = "$(cat doh)"
 '
 
 test_expect_success 'rewrite, renaming a specific directory' '
@@ -80,18 +83,18 @@ test_expect_success 'rewrite, renaming a specific directory' '
 '
 
 test_expect_success 'test that the directory was renamed' '
-       test dir/d = "$(git show HEAD:diroh/d --)" &&
+       test dir/D = "$(git show HEAD:diroh/D.t --)" &&
        ! test -d dir &&
        test -d diroh &&
        ! test -d diroh/dir &&
-       test -f diroh/d &&
-       test dir/d = "$(cat diroh/d)"
+       test -f diroh/D.t &&
+       test dir/D = "$(cat diroh/D.t)"
 '
 
 git tag oldD HEAD~4
 test_expect_success 'rewrite one branch, keeping a side branch' '
        git branch modD oldD &&
-       git filter-branch -f --tree-filter "mv b boh || :" D..modD
+       git filter-branch -f --tree-filter "mv B.t boh || :" D..modD
 '
 
 test_expect_success 'common ancestor is still common (unchanged)' '
@@ -104,13 +107,13 @@ test_expect_success 'filter subdirectory only' '
        git add subdir/new &&
        test_tick &&
        git commit -m "subdir" &&
-       echo H > a &&
+       echo H > A.t &&
        test_tick &&
-       git commit -m "not subdir" a &&
+       git commit -m "not subdir" A.t &&
        echo A > subdir/new &&
        test_tick &&
        git commit -m "again subdir" subdir/new &&
-       git rm a &&
+       git rm A.t &&
        test_tick &&
        git commit -m "again not subdir" &&
        git branch sub &&
@@ -134,7 +137,7 @@ test_expect_success 'more setup' '
        git add subdir/new &&
        test_tick &&
        git commit -m "subdir on master" subdir/new &&
-       git rm a &&
+       git rm A.t &&
        test_tick &&
        git commit -m "again subdir on master" &&
        git merge branch
@@ -283,8 +286,8 @@ test_expect_success 'Tag name filtering allows slashes in tag names' '
 
 test_expect_success 'Prune empty commits' '
        git rev-list HEAD > expect &&
-       make_commit to_remove &&
-       git filter-branch -f --index-filter "git update-index --remove to_remove" --prune-empty HEAD &&
+       test_commit to_remove &&
+       git filter-branch -f --index-filter "git update-index --remove to_remove.t" --prune-empty HEAD &&
        git rev-list HEAD > actual &&
        test_cmp expect actual
 '
@@ -307,6 +310,24 @@ test_expect_success '--remap-to-ancestor with filename filters' '
        test $orig_invariant = $(git rev-parse invariant)
 '
 
+test_expect_success 'automatic remapping to ancestor with filename filters' '
+       git checkout master &&
+       git reset --hard A &&
+       test_commit add-foo2 foo 1 &&
+       git branch moved-foo2 &&
+       test_commit add-bar2 bar a &&
+       git branch invariant2 &&
+       orig_invariant=$(git rev-parse invariant2) &&
+       git branch moved-bar2 &&
+       test_commit change-foo2 foo 2 &&
+       git filter-branch -f \
+               moved-foo2 moved-bar2 A..master \
+               -- -- foo &&
+       test $(git rev-parse moved-foo2) = $(git rev-parse moved-bar2) &&
+       test $(git rev-parse moved-foo2) = $(git rev-parse master^) &&
+       test $orig_invariant = $(git rev-parse invariant2)
+'
+
 test_expect_success 'setup submodule' '
        rm -fr ?* .git &&
        git init &&
index c0f9f3f70568794222c50f43f1f09be3bda62bf9..e058d184d1c072bd3078fe17ad41f1026f093201 100755 (executable)
@@ -5,7 +5,7 @@ test_description='git grep in binary files'
 . ./test-lib.sh
 
 test_expect_success 'setup' "
-       printf 'binary\000file\n' >a &&
+       echo 'binaryQfile' | q_to_nul >a &&
        git add a &&
        git commit -m.
 "
@@ -70,32 +70,32 @@ test_expect_failure 'git grep .fi a' '
 '
 
 test_expect_success 'git grep -F y<NUL>f a' "
-       printf 'y\000f' >f &&
+       printf 'yQf' | q_to_nul >f &&
        git grep -f f -F a
 "
 
 test_expect_success 'git grep -F y<NUL>x a' "
-       printf 'y\000x' >f &&
+       printf 'yQx' | q_to_nul >f &&
        test_must_fail git grep -f f -F a
 "
 
 test_expect_success 'git grep -Fi Y<NUL>f a' "
-       printf 'Y\000f' >f &&
+       printf 'YQf' | q_to_nul >f &&
        git grep -f f -Fi a
 "
 
 test_expect_failure 'git grep -Fi Y<NUL>x a' "
-       printf 'Y\000x' >f &&
+       printf 'YQx' | q_to_nul >f &&
        test_must_fail git grep -f f -Fi a
 "
 
 test_expect_success 'git grep y<NUL>f a' "
-       printf 'y\000f' >f &&
+       printf 'yQf' | q_to_nul >f &&
        git grep -f f a
 "
 
 test_expect_failure 'git grep y<NUL>x a' "
-       printf 'y\000x' >f &&
+       printf 'yQx' | q_to_nul >f &&
        test_must_fail git grep -f f a
 "
 
index 7dbbea13aca1835d6e9a1a8fb6ab2a5babf1b68a..6c776e9bec78ab1cf960293d8c796e9de13045b5 100755 (executable)
@@ -443,7 +443,7 @@ test_expect_success 'git clean -e' '
        (
                cd repo &&
                git init &&
-               touch 1 2 3 known &&
+               touch known 1 2 3 &&
                git add known &&
                git clean -f -e 1 -e 2 &&
                test -e 1 &&
index 9bda97058499ecab88dc6de7551d7909e1ad5a2e..782b0a3ece7724bf8df7cf4d405715a42ad21d44 100755 (executable)
@@ -413,12 +413,13 @@ test_expect_success 'submodule <invalid-path> warns' '
 
 test_expect_success 'add submodules without specifying an explicit path' '
        mkdir repo &&
-       cd repo &&
-       git init &&
-       echo r >r &&
-       git add r &&
-       git commit -m "repo commit 1" &&
-       cd .. &&
+       (
+               cd repo &&
+               git init &&
+               echo r >r &&
+               git add r &&
+               git commit -m "repo commit 1"
+       ) &&
        git clone --bare repo/ bare.git &&
        cd addtest &&
        git submodule add "$submodurl/repo" &&
index cee319da0ae6ef9ec3b220adbb178e116713db2a..294584452bbc3226e631ce0b81c546b04cd8d992 100755 (executable)
@@ -66,10 +66,11 @@ EOF
 "
 
 commit_file sm1 &&
-cd sm1 &&
-git reset --hard HEAD~2 >/dev/null &&
-head3=$(git rev-parse --verify HEAD | cut -c1-7) &&
-cd ..
+head3=$(
+       cd sm1 &&
+       git reset --hard HEAD~2 >/dev/null &&
+       git rev-parse --verify HEAD | cut -c1-7
+)
 
 test_expect_success 'modified submodule(backward)' "
     git submodule summary >actual &&
index 023f225a4b1f22c66fb291a76690564696d56035..50658845ca8769e963cfc13b20efb892f1f63cc0 100755 (executable)
@@ -324,8 +324,13 @@ test_expect_success 'log grep setup' '
 
        echo a >>file &&
        test_tick &&
-       git commit -a -m "third"
+       git commit -a -m "third" &&
 
+       echo a >>file &&
+       test_tick &&
+       GIT_AUTHOR_NAME="Night Fall" \
+       GIT_AUTHOR_EMAIL="nitfol@frobozz.com" \
+       git commit -a -m "fourth"
 '
 
 test_expect_success 'log grep (1)' '
@@ -372,6 +377,28 @@ test_expect_success 'log --grep --author implicitly uses all-match' '
        test_cmp expect actual
 '
 
+test_expect_success 'log with multiple --author uses union' '
+       git log --author="Thor" --author="Aster" --format=%s >actual &&
+       {
+           echo third && echo second && echo initial
+       } >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'log with --grep and multiple --author uses all-match' '
+       git log --author="Thor" --author="Night" --grep=i --format=%s >actual &&
+       {
+           echo third && echo initial
+       } >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'log with --grep and multiple --author uses all-match' '
+       git log --author="Thor" --author="Night" --grep=q --format=%s >actual &&
+       >expect &&
+       test_cmp expect actual
+'
+
 test_expect_success 'grep with CE_VALID file' '
        git update-index --assume-unchanged t/t &&
        rm t/t &&
index 71b3df9b55d7009def5ea11ff519cae4f28dea6d..a298eb04373f622473e3d33c9a46c6734f8a8fc8 100755 (executable)
@@ -279,7 +279,7 @@ test_expect_success $PREREQ 'Invalid In-Reply-To' '
                --to=nobody@example.com \
                --in-reply-to=" " \
                --smtp-server="$(pwd)/fake.sendmail" \
-               $patches
+               $patches \
                2>errors
        ! grep "^In-Reply-To: < *>" msgtxt1
 '
@@ -1032,4 +1032,40 @@ test_expect_success $PREREQ '--8bit-encoding also treats subject' '
        test_cmp expected actual
 '
 
+# Note that the patches in this test are deliberately out of order; we
+# want to make sure it works even if the cover-letter is not in the
+# first mail.
+test_expect_success 'refusing to send cover letter template' '
+       clean_fake_sendmail &&
+       rm -fr outdir &&
+       git format-patch --cover-letter -2 -o outdir &&
+       test_must_fail git send-email \
+         --from="Example <nobody@example.com>" \
+         --to=nobody@example.com \
+         --smtp-server="$(pwd)/fake.sendmail" \
+         outdir/0002-*.patch \
+         outdir/0000-*.patch \
+         outdir/0001-*.patch \
+         2>errors >out &&
+       grep "SUBJECT HERE" errors &&
+       test -z "$(ls msgtxt*)"
+'
+
+test_expect_success '--force sends cover letter template anyway' '
+       clean_fake_sendmail &&
+       rm -fr outdir &&
+       git format-patch --cover-letter -2 -o outdir &&
+       git send-email \
+         --force \
+         --from="Example <nobody@example.com>" \
+         --to=nobody@example.com \
+         --smtp-server="$(pwd)/fake.sendmail" \
+         outdir/0002-*.patch \
+         outdir/0000-*.patch \
+         outdir/0001-*.patch \
+         2>errors >out &&
+       ! grep "SUBJECT HERE" errors &&
+       test -n "$(ls msgtxt*)"
+'
+
 test_done
index d5adae640b0b92e049de3c5d5e8996e1db06bcc4..b041516a1d6316dd36657b582c15100c0a7359d0 100755 (executable)
@@ -22,17 +22,18 @@ esac
 test_expect_success \
     'initialize git svn' '
        mkdir import &&
-       cd import &&
-       echo foo > foo &&
-       ln -s foo foo.link
-       mkdir -p dir/a/b/c/d/e &&
-       echo "deep dir" > dir/a/b/c/d/e/file &&
-       mkdir bar &&
-       echo "zzz" > bar/zzz &&
-       echo "#!/bin/sh" > exec.sh &&
-       chmod +x exec.sh &&
-       svn_cmd import -m "import for git svn" . "$svnrepo" >/dev/null &&
-       cd .. &&
+       (
+               cd import &&
+               echo foo >foo &&
+               ln -s foo foo.link
+               mkdir -p dir/a/b/c/d/e &&
+               echo "deep dir" >dir/a/b/c/d/e/file &&
+               mkdir bar &&
+               echo "zzz" >bar/zzz &&
+               echo "#!/bin/sh" >exec.sh &&
+               chmod +x exec.sh &&
+               svn_cmd import -m "import for git svn" . "$svnrepo" >/dev/null
+       ) &&
        rm -rf import &&
        git svn init "$svnrepo"'
 
@@ -142,7 +143,7 @@ test_expect_success "$name" '
        git svn set-tree --find-copies-harder --rmdir \
                ${remotes_git_svn}..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
-       test -L "$SVN_TREE"/exec.sh'
+       test -h "$SVN_TREE"/exec.sh'
 
 name='new symlink is added to a file that was also just made executable'
 
@@ -155,7 +156,7 @@ test_expect_success "$name" '
                ${remotes_git_svn}..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test -x "$SVN_TREE"/bar/zzz &&
-       test -L "$SVN_TREE"/exec-2.sh'
+       test -h "$SVN_TREE"/exec-2.sh'
 
 name='modify a symlink to become a file'
 test_expect_success "$name" '
@@ -168,7 +169,7 @@ test_expect_success "$name" '
                ${remotes_git_svn}..mybranch5 &&
        svn_cmd up "$SVN_TREE" &&
        test -f "$SVN_TREE"/exec-2.sh &&
-       test ! -L "$SVN_TREE"/exec-2.sh &&
+       test ! -h "$SVN_TREE"/exec-2.sh &&
        test_cmp help "$SVN_TREE"/exec-2.sh'
 
 name="commit with UTF-8 message: locale: $GIT_SVN_LC_ALL"
index 929499e996bc33d96ebab0b01ebcac8240e689b7..8869f5018ecd06636dc3e722cb518af88a6919d9 100755 (executable)
@@ -53,8 +53,9 @@ cd ..
 
 rm -rf import
 test_expect_success 'checkout working copy from svn' 'svn co "$svnrepo" test_wc'
-test_expect_success 'setup some commits to svn' \
-       'cd test_wc &&
+test_expect_success 'setup some commits to svn' '
+       (
+               cd test_wc &&
                echo Greetings >> kw.c &&
                poke kw.c &&
                svn_cmd commit -m "Not yet an Id" &&
@@ -63,8 +64,9 @@ test_expect_success 'setup some commits to svn' \
                svn_cmd commit -m "Modified file, but still not yet an Id" &&
                svn_cmd propset svn:keywords Id kw.c &&
                poke kw.c &&
-               svn_cmd commit -m "Propset Id" &&
-       cd ..'
+               svn_cmd commit -m "Propset Id"
+       )
+'
 
 test_expect_success 'initialize git svn' 'git svn init "$svnrepo"'
 test_expect_success 'fetch revisions from svn' 'git svn fetch'
@@ -81,13 +83,15 @@ expect='/* $Id$ */'
 got="`sed -ne 2p kw.c`"
 test_expect_success 'raw $Id$ found in kw.c' "test '$expect' = '$got'"
 
-test_expect_success "propset CR on crlf files" \
-       'cd test_wc &&
+test_expect_success "propset CR on crlf files" '
+       (
+               cd test_wc &&
                svn_cmd propset svn:eol-style CR empty &&
                svn_cmd propset svn:eol-style CR crlf &&
                svn_cmd propset svn:eol-style CR ne_crlf &&
-               svn_cmd commit -m "propset CR on crlf files" &&
-        cd ..'
+               svn_cmd commit -m "propset CR on crlf files"
+        )
+'
 
 test_expect_success 'fetch and pull latest from svn and checkout a new wc' \
        'git svn fetch &&
@@ -137,19 +141,20 @@ cat > show-ignore.expect <<\EOF
 EOF
 
 test_expect_success 'test show-ignore' "
-       cd test_wc &&
-       mkdir -p deeply/nested/directory &&
-       touch deeply/nested/directory/.keep &&
-       svn_cmd add deeply &&
-       svn_cmd up &&
-       svn_cmd propset -R svn:ignore '
+       (
+               cd test_wc &&
+               mkdir -p deeply/nested/directory &&
+               touch deeply/nested/directory/.keep &&
+               svn_cmd add deeply &&
+               svn_cmd up &&
+               svn_cmd propset -R svn:ignore '
 no-such-file*
 ' .
-       svn_cmd commit -m 'propset svn:ignore'
-       cd .. &&
+               svn_cmd commit -m 'propset svn:ignore'
+       ) &&
        git svn show-ignore > show-ignore.got &&
        cmp show-ignore.expect show-ignore.got
-       "
+"
 
 cat >create-ignore.expect <<\EOF
 /no-such-file*
index 028fb19e09bbb9e2720e95a5e0b4ddb221f4a0e1..eb70f4839ccb065425b5ad8d40b270178dedef1b 100755 (executable)
@@ -4,13 +4,14 @@ test_description='git svn rmdir'
 
 test_expect_success 'initialize repo' '
        mkdir import &&
-       cd import &&
-       mkdir -p deeply/nested/directory/number/1 &&
-       mkdir -p deeply/nested/directory/number/2 &&
-       echo foo > deeply/nested/directory/number/1/file &&
-       echo foo > deeply/nested/directory/number/2/another &&
-       svn_cmd import -m "import for git svn" . "$svnrepo" &&
-       cd ..
+       (
+               cd import &&
+               mkdir -p deeply/nested/directory/number/1 &&
+               mkdir -p deeply/nested/directory/number/2 &&
+               echo foo >deeply/nested/directory/number/1/file &&
+               echo foo >deeply/nested/directory/number/2/another &&
+               svn_cmd import -m "import for git svn" . "$svnrepo"
+       )
        '
 
 test_expect_success 'mirror via git svn' '
index bbfd7f4793ab41118e7060bf7c0512309f81a546..f7f3c5ab8ef8dd822a51d6c97281ba077c511642 100755 (executable)
@@ -8,22 +8,24 @@ test_description='git svn fetching'
 
 test_expect_success 'initialize repo' '
        mkdir import &&
-       cd import &&
-       mkdir -p trunk &&
-       echo hello > trunk/readme &&
-       svn_cmd import -m "initial" . "$svnrepo" &&
-       cd .. &&
+       (
+               cd import &&
+               mkdir -p trunk &&
+               echo hello >trunk/readme &&
+               svn_cmd import -m "initial" . "$svnrepo"
+       ) &&
        svn_cmd co "$svnrepo" wc &&
-       cd wc &&
-       echo world >> trunk/readme &&
-       poke trunk/readme &&
-       svn_cmd commit -m "another commit" &&
-       svn_cmd up &&
-       svn_cmd mv trunk thunk &&
-       echo goodbye >> thunk/readme &&
-       poke thunk/readme &&
-       svn_cmd commit -m "bye now" &&
-       cd ..
+       (
+               cd wc &&
+               echo world >>trunk/readme &&
+               poke trunk/readme &&
+               svn_cmd commit -m "another commit" &&
+               svn_cmd up &&
+               svn_cmd mv trunk thunk &&
+               echo goodbye >>thunk/readme &&
+               poke thunk/readme &&
+               svn_cmd commit -m "bye now"
+       )
        '
 
 test_expect_success 'init and fetch a moved directory' '
@@ -83,16 +85,17 @@ test_expect_success 'follow larger parent' '
         '
 
 test_expect_success 'follow higher-level parent' '
-        svn mkdir -m "follow higher-level parent" "$svnrepo"/blob &&
-        svn co "$svnrepo"/blob blob &&
-        cd blob &&
-                echo hi > hi &&
-                svn add hi &&
-                svn commit -m "hihi" &&
-                cd ..
-        svn mkdir -m "new glob at top level" "$svnrepo"/glob &&
-        svn mv -m "move blob down a level" "$svnrepo"/blob "$svnrepo"/glob/blob &&
-        git svn init --minimize-url -i blob "$svnrepo"/glob/blob &&
+       svn mkdir -m "follow higher-level parent" "$svnrepo"/blob &&
+       svn co "$svnrepo"/blob blob &&
+       (
+               cd blob &&
+               echo hi > hi &&
+               svn add hi &&
+               svn commit -m "hihi"
+       ) &&
+       svn mkdir -m "new glob at top level" "$svnrepo"/glob &&
+       svn mv -m "move blob down a level" "$svnrepo"/blob "$svnrepo"/glob/blob &&
+       git svn init --minimize-url -i blob "$svnrepo"/glob/blob &&
         git svn fetch -i blob
         '
 
@@ -117,18 +120,23 @@ test_expect_success 'follow-parent avoids deleting relevant info' '
           import/trunk/subversion/bindings/swig/perl/t/larger-parent &&
          echo "bad delete test 2" > \
           import/trunk/subversion/bindings/swig/perl/another-larger &&
-       cd import &&
-         svn import -m "r9270 test" . "$svnrepo"/r9270 &&
-       cd .. &&
+       (
+               cd import &&
+               svn import -m "r9270 test" . "$svnrepo"/r9270
+       ) &&
        svn_cmd co "$svnrepo"/r9270/trunk/subversion/bindings/swig/perl r9270 &&
-       cd r9270 &&
-         svn mkdir native &&
-         svn mv t native/t &&
-         for i in a b c; do svn mv $i.pm native/$i.pm; done &&
-         echo z >> native/t/c.t &&
-         poke native/t/c.t &&
-         svn commit -m "reorg test" &&
-       cd .. &&
+       (
+               cd r9270 &&
+               svn mkdir native &&
+               svn mv t native/t &&
+               for i in a b c
+               do
+                       svn mv $i.pm native/$i.pm
+               done &&
+               echo z >>native/t/c.t &&
+               poke native/t/c.t &&
+               svn commit -m "reorg test"
+       ) &&
        git svn init --minimize-url -i r9270-t \
          "$svnrepo"/r9270/trunk/subversion/bindings/swig/perl/native/t &&
        git svn fetch -i r9270-t &&
index dd48e9cba832a06a34fd1e2c895bb1b19792168f..5d0afeae6caf03ca34d7ef883baed512bcbcec51 100755 (executable)
@@ -6,10 +6,11 @@ test_description='git svn commit-diff'
 
 test_expect_success 'initialize repo' '
        mkdir import &&
-       cd import &&
-       echo hello > readme &&
-       svn_cmd import -m "initial" . "$svnrepo" &&
-       cd .. &&
+       (
+               cd import &&
+               echo hello >readme &&
+               svn_cmd import -m "initial" . "$svnrepo"
+       ) &&
        echo hello > readme &&
        git update-index --add readme &&
        git commit -a -m "initial" &&
index 12f21b700ec5216b6aeaa886f862d3e3b1f6682f..f6d7ac7c5f67871ce332716561ea6aba7a6f920f 100755 (executable)
@@ -6,21 +6,23 @@ test_description='git svn commit-diff clobber'
 
 test_expect_success 'initialize repo' '
        mkdir import &&
-       cd import &&
-       echo initial > file &&
-       svn_cmd import -m "initial" . "$svnrepo" &&
-       cd .. &&
+       (
+               cd import &&
+               echo initial >file &&
+               svn_cmd import -m "initial" . "$svnrepo"
+       ) &&
        echo initial > file &&
        git update-index --add file &&
        git commit -a -m "initial"
        '
 test_expect_success 'commit change from svn side' '
        svn_cmd co "$svnrepo" t.svn &&
-       cd t.svn &&
-       echo second line from svn >> file &&
-       poke file &&
-       svn_cmd commit -m "second line from svn" &&
-       cd .. &&
+       (
+               cd t.svn &&
+               echo second line from svn >>file &&
+               poke file &&
+               svn_cmd commit -m "second line from svn"
+       ) &&
        rm -rf t.svn
        '
 
@@ -44,11 +46,12 @@ test_expect_success 'dcommit fails to commit because of conflict' '
        git svn fetch &&
        git reset --hard refs/${remotes_git_svn} &&
        svn_cmd co "$svnrepo" t.svn &&
-       cd t.svn &&
-       echo fourth line from svn >> file &&
-       poke file &&
-       svn_cmd commit -m "fourth line from svn" &&
-       cd .. &&
+       (
+               cd t.svn &&
+               echo fourth line from svn >>file &&
+               poke file &&
+               svn_cmd commit -m "fourth line from svn"
+       ) &&
        rm -rf t.svn &&
        echo "fourth line from git" >> file &&
        git commit -a -m "fourth line from git" &&
@@ -68,11 +71,12 @@ test_expect_success 'dcommit does the svn equivalent of an index merge' "
 
 test_expect_success 'commit another change from svn side' '
        svn_cmd co "$svnrepo" t.svn &&
-       cd t.svn &&
-               echo third line from svn >> file &&
+       (
+               cd t.svn &&
+               echo third line from svn >>file &&
                poke file &&
-               svn_cmd commit -m "third line from svn" &&
-       cd .. &&
+               svn_cmd commit -m "third line from svn"
+       ) &&
        rm -rf t.svn
        '
 
index 901b8e09fbc6660456311c04b4b88c20e108c313..289fc313fb737ac7895580fd8407cff758b085e7 100755 (executable)
@@ -6,14 +6,16 @@ test_description='git svn metadata migrations from previous versions'
 test_expect_success 'setup old-looking metadata' '
        cp "$GIT_DIR"/config "$GIT_DIR"/config-old-git-svn &&
        mkdir import &&
-       cd import &&
-               for i in trunk branches/a branches/b \
-                        tags/0.1 tags/0.2 tags/0.3; do
-                       mkdir -p $i && \
-                       echo hello >> $i/README || exit 1
-               done && \
+       (
+               cd import &&
+               for i in trunk branches/a branches/b tags/0.1 tags/0.2 tags/0.3
+               do
+                       mkdir -p $i &&
+                       echo hello >>$i/README ||
+                       exit 1
+               done &&
                svn_cmd import -m test . "$svnrepo"
-               cd .. &&
+       ) &&
        git svn init "$svnrepo" &&
        git svn fetch &&
        rm -rf "$GIT_DIR"/svn &&
index 84f7c9b4bb00931b57740be32ce7ee29bbb26694..3077851015879fc147ded9bb573d02c13967eec9 100755 (executable)
@@ -37,11 +37,12 @@ EOF
 test_expect_success 'setup svn repository' '
        svn_cmd co "$svnrepo" mysvnwork &&
        mkdir -p mysvnwork/trunk &&
-       cd mysvnwork &&
-               big_text_block >> trunk/README &&
+       (
+               cd mysvnwork &&
+               big_text_block >>trunk/README &&
                svn_cmd add trunk &&
-               svn_cmd ci -m "first commit" trunk &&
-               cd ..
+               svn_cmd ci -m "first commit" trunk
+       )
        '
 
 test_expect_success 'setup git mirror and merge' '
index 767799e7a70b91ef6f4e3f4007529f1cb0fd919c..6a48e4042996549e40843186783e2215beee9cca 100755 (executable)
@@ -61,11 +61,12 @@ test_expect_success 'add a file with plus signs' '
 
 test_expect_success 'clone the repository to test rebase' '
        git svn clone "$svnrepo" test-rebase &&
-       cd test-rebase &&
-               echo test-rebase > test-rebase &&
+       (
+               cd test-rebase &&
+               echo test-rebase >test-rebase &&
                git add test-rebase &&
-               git commit -m test-rebase &&
-               cd ..
+               git commit -m test-rebase
+       )
        '
 
 test_expect_success 'make a commit to test rebase' '
index 0374a7476bcc5b254aa1464d468434ae3205f114..5d477e4bdadd2168d0331e2ab809c5c86c8fa532 100755 (executable)
@@ -8,14 +8,16 @@ test_description='git svn log tests'
 
 test_expect_success 'setup repository and import' '
        mkdir import &&
-       cd import &&
-               for i in trunk branches/a branches/b \
-                        tags/0.1 tags/0.2 tags/0.3; do
-                       mkdir -p $i && \
-                       echo hello >> $i/README || exit 1
-               done && \
+       (
+               cd import &&
+               for i in trunk branches/a branches/b tags/0.1 tags/0.2 tags/0.3
+               do
+                       mkdir -p $i &&
+                       echo hello >>$i/README ||
+                       exit 1
+               done &&
                svn_cmd import -m test . "$svnrepo"
-               cd .. &&
+       ) &&
        git svn init "$svnrepo" -T trunk -b branches -t tags &&
        git svn fetch &&
        git reset --hard trunk &&
index 5fb94fb3d61c2e26dcd448ac5106ec0f9a3a2283..f3f397cdda4766ce6c02beac13e492d406ca14c4 100755 (executable)
@@ -39,27 +39,30 @@ quoted_svnrepo="$(echo $svnrepo | sed 's/ /%20/')"
 
 test_expect_success 'setup repository and import' '
        mkdir info &&
-       cd info &&
-               echo FIRST > A &&
-               echo one > file &&
+       (
+               cd info &&
+               echo FIRST >A &&
+               echo one >file &&
                ln -s file symlink-file &&
                mkdir directory &&
                touch directory/.placeholder &&
                ln -s directory symlink-directory &&
-               svn_cmd import -m "initial" . "$svnrepo" &&
-       cd .. &&
+               svn_cmd import -m "initial" . "$svnrepo"
+       ) &&
        svn_cmd co "$svnrepo" svnwc &&
-       cd svnwc &&
-               echo foo > foo &&
+       (
+               cd svnwc &&
+               echo foo >foo &&
                svn_cmd add foo &&
                svn_cmd commit -m "change outside directory" &&
-               svn_cmd update &&
-       cd .. &&
+               svn_cmd update
+       ) &&
        mkdir gitwc &&
-       cd gitwc &&
+       (
+               cd gitwc &&
                git svn init "$svnrepo" &&
-               git svn fetch &&
-       cd .. &&
+               git svn fetch
+       ) &&
        ptouch gitwc/file svnwc/file &&
        ptouch gitwc/directory svnwc/directory &&
        ptouch gitwc/symlink-file svnwc/symlink-file &&
@@ -138,14 +141,16 @@ test_expect_success 'info --url symlink-directory' '
 
 test_expect_success 'info added-file' "
        echo two > gitwc/added-file &&
-       cd gitwc &&
-               git add added-file &&
-       cd .. &&
+       (
+               cd gitwc &&
+               git add added-file
+       ) &&
        cp gitwc/added-file svnwc/added-file &&
        ptouch gitwc/added-file svnwc/added-file &&
-       cd svnwc &&
-               svn_cmd add added-file > /dev/null &&
-       cd .. &&
+       (
+               cd svnwc &&
+               svn_cmd add added-file > /dev/null
+       ) &&
        (cd svnwc; svn info added-file) > expected.info-added-file &&
        (cd gitwc; git svn info added-file) > actual.info-added-file &&
        test_cmp expected.info-added-file actual.info-added-file
@@ -160,12 +165,14 @@ test_expect_success 'info added-directory' "
        mkdir gitwc/added-directory svnwc/added-directory &&
        ptouch gitwc/added-directory svnwc/added-directory &&
        touch gitwc/added-directory/.placeholder &&
-       cd svnwc &&
-               svn_cmd add added-directory > /dev/null &&
-       cd .. &&
-       cd gitwc &&
-               git add added-directory &&
-       cd .. &&
+       (
+               cd svnwc &&
+               svn_cmd add added-directory > /dev/null
+       ) &&
+       (
+               cd gitwc &&
+               git add added-directory
+       ) &&
        (cd svnwc; svn info added-directory) \
                > expected.info-added-directory &&
        (cd gitwc; git svn info added-directory) \
@@ -179,14 +186,16 @@ test_expect_success 'info --url added-directory' '
        '
 
 test_expect_success 'info added-symlink-file' "
-       cd gitwc &&
+       (
+               cd gitwc &&
                ln -s added-file added-symlink-file &&
-               git add added-symlink-file &&
-       cd .. &&
-       cd svnwc &&
+               git add added-symlink-file
+       ) &&
+       (
+               cd svnwc &&
                ln -s added-file added-symlink-file &&
-               svn_cmd add added-symlink-file > /dev/null &&
-       cd .. &&
+               svn_cmd add added-symlink-file > /dev/null
+       ) &&
        ptouch gitwc/added-symlink-file svnwc/added-symlink-file &&
        (cd svnwc; svn info added-symlink-file) \
                > expected.info-added-symlink-file &&
@@ -202,14 +211,16 @@ test_expect_success 'info --url added-symlink-file' '
        '
 
 test_expect_success 'info added-symlink-directory' "
-       cd gitwc &&
+       (
+               cd gitwc &&
                ln -s added-directory added-symlink-directory &&
-               git add added-symlink-directory &&
-       cd .. &&
-       cd svnwc &&
+               git add added-symlink-directory
+       ) &&
+       (
+               cd svnwc &&
                ln -s added-directory added-symlink-directory &&
-               svn_cmd add added-symlink-directory > /dev/null &&
-       cd .. &&
+               svn_cmd add added-symlink-directory > /dev/null
+       ) &&
        ptouch gitwc/added-symlink-directory svnwc/added-symlink-directory &&
        (cd svnwc; svn info added-symlink-directory) \
                > expected.info-added-symlink-directory &&
@@ -230,12 +241,14 @@ test_expect_success 'info --url added-symlink-directory' '
 # simply reuses the Last Changed Date.
 
 test_expect_success 'info deleted-file' "
-       cd gitwc &&
-               git rm -f file > /dev/null &&
-       cd .. &&
-       cd svnwc &&
-               svn_cmd rm --force file > /dev/null &&
-       cd .. &&
+       (
+               cd gitwc &&
+               git rm -f file > /dev/null
+       ) &&
+       (
+               cd svnwc &&
+               svn_cmd rm --force file > /dev/null
+       ) &&
        (cd svnwc; svn info file) |
        sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \
                > expected.info-deleted-file &&
@@ -251,12 +264,14 @@ test_expect_success 'info --url file (deleted)' '
        '
 
 test_expect_success 'info deleted-directory' "
-       cd gitwc &&
-               git rm -r -f directory > /dev/null &&
-       cd .. &&
-       cd svnwc &&
-               svn_cmd rm --force directory > /dev/null &&
-       cd .. &&
+       (
+               cd gitwc &&
+               git rm -r -f directory > /dev/null
+       ) &&
+       (
+               cd svnwc &&
+               svn_cmd rm --force directory > /dev/null
+       ) &&
        (cd svnwc; svn info directory) |
        sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \
                > expected.info-deleted-directory &&
@@ -272,12 +287,14 @@ test_expect_success 'info --url directory (deleted)' '
        '
 
 test_expect_success 'info deleted-symlink-file' "
-       cd gitwc &&
-               git rm -f symlink-file > /dev/null &&
-       cd .. &&
-       cd svnwc &&
-               svn_cmd rm --force symlink-file > /dev/null &&
-       cd .. &&
+       (
+               cd gitwc &&
+               git rm -f symlink-file > /dev/null
+       ) &&
+       (
+               cd svnwc &&
+               svn_cmd rm --force symlink-file > /dev/null
+       ) &&
        (cd svnwc; svn info symlink-file) |
        sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \
                > expected.info-deleted-symlink-file &&
@@ -294,12 +311,14 @@ test_expect_success 'info --url symlink-file (deleted)' '
        '
 
 test_expect_success 'info deleted-symlink-directory' "
-       cd gitwc &&
-               git rm -f symlink-directory > /dev/null &&
-       cd .. &&
-       cd svnwc &&
-               svn_cmd rm --force symlink-directory > /dev/null &&
-       cd .. &&
+       (
+               cd gitwc &&
+               git rm -f symlink-directory > /dev/null
+       ) &&
+       (
+               cd svnwc &&
+               svn_cmd rm --force symlink-directory > /dev/null
+       ) &&
        (cd svnwc; svn info symlink-directory) |
        sed -e 's/^\(Text Last Updated:\).*/\1 TEXT-LAST-UPDATED-STRING/' \
                 > expected.info-deleted-symlink-directory &&
@@ -346,9 +365,10 @@ test_expect_success 'info --url unknown-directory' '
        '
 
 test_expect_success 'info unknown-symlink-file' "
-       cd gitwc &&
-               ln -s unknown-file unknown-symlink-file &&
-       cd .. &&
+       (
+               cd gitwc &&
+               ln -s unknown-file unknown-symlink-file
+       ) &&
        (cd gitwc; test_must_fail git svn info unknown-symlink-file) \
                 2> actual.info-unknown-symlink-file &&
        grep unknown-symlink-file actual.info-unknown-symlink-file
@@ -361,9 +381,10 @@ test_expect_success 'info --url unknown-symlink-file' '
        '
 
 test_expect_success 'info unknown-symlink-directory' "
-       cd gitwc &&
-               ln -s unknown-directory unknown-symlink-directory &&
-       cd .. &&
+       (
+               cd gitwc &&
+               ln -s unknown-directory unknown-symlink-directory
+       ) &&
        (cd gitwc; test_must_fail git svn info unknown-symlink-directory) \
                 2> actual.info-unknown-symlink-directory &&
        grep unknown-symlink-directory actual.info-unknown-symlink-directory
index 9d9ebd533cbcbcfc1e23be51bad1e63f4f08c53b..1d92c05035f8fe68885a6338ceca4307f19e8663 100755 (executable)
@@ -20,9 +20,10 @@ test_expect_success 'setup svnrepo' '
 
 test_expect_success 'test clone with percent escapes' '
        git svn clone "$svnrepo/pr%20ject" clone &&
-       cd clone &&
-               git rev-parse refs/${remotes_git_svn} &&
-       cd ..
+       (
+               cd clone &&
+               git rev-parse refs/${remotes_git_svn}
+       )
 '
 
 # SVN works either way, so should we...
index 045521615c64d1ae938524b0424e1e4260ca8c54..0ed90d982d28810c4f7a018fab3d2f8699b78d95 100755 (executable)
@@ -8,10 +8,10 @@ test_description='git svn respects rewriteRoot during rebuild'
 . ./lib-git-svn.sh
 
 mkdir import
-cd import
+(cd import
        touch foo
        svn_cmd import -m 'import for git svn' . "$svnrepo" >/dev/null
-cd ..
+)
 rm -rf import
 
 test_expect_success 'init, fetch and checkout repository' '
index c19418614fc8946b5be5f0014559e53fcc15c060..096abd1fe5e37444a442e698a5d5734823a45798 100755 (executable)
@@ -19,19 +19,19 @@ test_expect_success 'setup svnrepo' '
 test_expect_success 'test clone with multi-glob in branch names' '
        git svn clone -T trunk -b branches/*/* -t tags \
                      "$svnrepo/project" project &&
-       cd project &&
+       (cd project &&
                git rev-parse "refs/remotes/v14.1/beta" &&
-               git rev-parse "refs/remotes/v14.1/gold" &&
-       cd ..
+               git rev-parse "refs/remotes/v14.1/gold"
+       )
        '
 
 test_expect_success 'test dcommit to multi-globbed branch' "
-       cd project &&
+       (cd project &&
        git reset --hard 'refs/remotes/v14.1/gold' &&
        echo hello >> foo &&
        git commit -m 'hello' -- foo &&
-       git svn dcommit &&
-       cd ..
+       git svn dcommit
+       )
        "
 
 test_done
index 4aab8ecc142d9719fd83b064445fa297cc10a520..2e4789d061fe084024b621708ee27e629c2a004a 100755 (executable)
@@ -9,27 +9,27 @@ test_description='git svn partial-rebuild tests'
 test_expect_success 'initialize svnrepo' '
        mkdir import &&
        (
-               cd import &&
+               (cd import &&
                mkdir trunk branches tags &&
-               cd trunk &&
-               echo foo > foo &&
-               cd .. &&
+               (cd trunk &&
+               echo foo > foo
+               ) &&
                svn_cmd import -m "import for git-svn" . "$svnrepo" >/dev/null &&
                svn_cmd copy "$svnrepo"/trunk "$svnrepo"/branches/a \
-                       -m "created branch a" &&
-               cd .. &&
+                       -m "created branch a"
+               ) &&
                rm -rf import &&
                svn_cmd co "$svnrepo"/trunk trunk &&
-               cd trunk &&
+               (cd trunk &&
                echo bar >> foo &&
-               svn_cmd ci -m "updated trunk" &&
-               cd .. &&
+               svn_cmd ci -m "updated trunk"
+               ) &&
                svn_cmd co "$svnrepo"/branches/a a &&
-               cd a &&
+               (cd a &&
                echo baz >> a &&
                svn_cmd add a &&
-               svn_cmd ci -m "updated a" &&
-               cd .. &&
+               svn_cmd ci -m "updated a"
+               ) &&
                git svn init --stdlayout "$svnrepo"
        )
 '
@@ -41,11 +41,11 @@ test_expect_success 'import an early SVN revision into git' '
 test_expect_success 'make full git mirror of SVN' '
        mkdir mirror &&
        (
-               cd mirror &&
+               (cd mirror &&
                git init &&
                git svn init --stdlayout "$svnrepo" &&
-               git svn fetch &&
-               cd ..
+               git svn fetch
+               )
        )
 '
 
index 807e494a3af4eb889711cbd7bb8d20c160557301..4b034a67f305622f146e66914139e58045e2457e 100755 (executable)
@@ -9,19 +9,19 @@ test_description='git svn partial-rebuild tests'
 test_expect_success 'initialize svnrepo' '
        mkdir import &&
        (
-               cd import &&
+               (cd import &&
                mkdir trunk branches tags &&
-               cd trunk &&
-               echo foo > foo &&
-               cd .. &&
-               svn_cmd import -m "import for git-svn" . "$svnrepo" >/dev/null &&
-               cd .. &&
+               (cd trunk &&
+               echo foo > foo
+               ) &&
+               svn_cmd import -m "import for git-svn" . "$svnrepo" >/dev/null
+               ) &&
                rm -rf import &&
                svn_cmd co "$svnrepo"/trunk trunk &&
-               cd trunk &&
+               (cd trunk &&
                echo bar >> foo &&
-               svn_cmd ci -m "updated trunk" &&
-               cd .. &&
+               svn_cmd ci -m "updated trunk"
+               ) &&
                rm -rf trunk
        )
 '
index 9a24a65b64111b4540db28315fedd4efd3b19ae7..f762038f0ea95ce0f9d411ff6f494088ee1fc22c 100755 (executable)
@@ -88,7 +88,7 @@ test_expect_success 'enable broken symlink workaround' \
 test_expect_success '"bar" is an empty file' 'test -f x/bar && ! test -s x/bar'
 test_expect_success 'get "bar" => symlink fix from svn' \
                '(cd x && git svn rebase)'
-test_expect_success SYMLINKS '"bar" becomes a symlink' 'test -L x/bar'
+test_expect_success SYMLINKS '"bar" becomes a symlink' 'test -h x/bar'
 
 
 test_expect_success 'clone using git svn' 'git svn clone -r1 "$svnrepo" y'
index 636ca0abb965ad2462a2e1e1ebea2a4183aa19e6..d60da63f7aced3e13a411eee661509ae3790e68f 100755 (executable)
@@ -6,10 +6,10 @@ test_description='git svn dcommit clobber series'
 
 test_expect_success 'initialize repo' '
        mkdir import &&
-       cd import &&
+       (cd import &&
        awk "BEGIN { for (i = 1; i < 64; i++) { print i } }" > file
-       svn_cmd import -m "initial" . "$svnrepo" &&
-       cd .. &&
+       svn_cmd import -m "initial" . "$svnrepo"
+       ) &&
        git svn init "$svnrepo" &&
        git svn fetch &&
        test -e file
@@ -19,14 +19,14 @@ test_expect_success '(supposedly) non-conflicting change from SVN' '
        test x"`sed -n -e 58p < file`" = x58 &&
        test x"`sed -n -e 61p < file`" = x61 &&
        svn_cmd co "$svnrepo" tmp &&
-       cd tmp &&
+       (cd tmp &&
                perl -i.bak -p -e "s/^58$/5588/" file &&
                perl -i.bak -p -e "s/^61$/6611/" file &&
                poke file &&
                test x"`sed -n -e 58p < file`" = x5588 &&
                test x"`sed -n -e 61p < file`" = x6611 &&
-               svn_cmd commit -m "58 => 5588, 61 => 6611" &&
-               cd ..
+               svn_cmd commit -m "58 => 5588, 61 => 6611"
+       )
        '
 
 test_expect_success 'some unrelated changes to git' "
diff --git a/t/t9157-git-svn-fetch-merge.sh b/t/t9157-git-svn-fetch-merge.sh
new file mode 100755 (executable)
index 0000000..da582c5
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh
+#
+# Copyright (c) 2010 Steven Walter
+#
+
+test_description='git svn merge detection'
+. ./lib-git-svn.sh
+
+test_expect_success 'initialize source svn repo' '
+       svn_cmd mkdir -m x "$svnrepo"/trunk &&
+       svn_cmd mkdir -m x "$svnrepo"/branches &&
+       svn_cmd co "$svnrepo"/trunk "$SVN_TREE" &&
+       (
+               cd "$SVN_TREE" &&
+               touch foo &&
+               svn add foo &&
+               svn commit -m "initial commit" &&
+               svn cp -m branch "$svnrepo"/trunk "$svnrepo"/branches/branch1 &&
+               touch bar &&
+               svn add bar &&
+               svn commit -m x &&
+               svn cp -m branch "$svnrepo"/trunk "$svnrepo"/branches/branch2 &&
+               svn switch "$svnrepo"/branches/branch1 &&
+               touch baz &&
+               svn add baz &&
+               svn commit -m x &&
+               svn switch "$svnrepo"/trunk &&
+               svn merge "$svnrepo"/branches/branch1 &&
+               svn commit -m "merge" &&
+               svn switch "$svnrepo"/branches/branch1 &&
+               svn commit -m x &&
+               svn switch "$svnrepo"/branches/branch2 &&
+               svn merge "$svnrepo"/branches/branch1 &&
+               svn commit -m "merge branch1" &&
+               svn switch "$svnrepo"/trunk &&
+               svn merge "$svnrepo"/branches/branch2 &&
+               svn resolved baz &&
+               svn commit -m "merge branch2"
+       ) &&
+       rm -rf "$SVN_TREE"
+'
+
+test_expect_success 'clone svn repo' '
+       git svn init -s "$svnrepo" &&
+       git svn fetch
+'
+
+test_expect_success 'verify merge commit' 'git rev-parse HEAD^2'
+
+test_done
index 96d07f183377f8822257cb3a1dad29023b391462..3c0cf0509d2cfe3afc0316ed50ea85cb0d2d14de 100755 (executable)
@@ -874,6 +874,27 @@ test_expect_success \
         git diff-tree -C --find-copies-harder -r N4^ N4 >actual &&
         compare_diff_raw expect actual'
 
+test_expect_success \
+       'N: copy root directory by tree hash' \
+       'cat >expect <<-\EOF &&
+       :100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D      file3/newf
+       :100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D      file3/oldf
+       EOF
+        root=$(git rev-parse refs/heads/branch^0^{tree}) &&
+        cat >input <<-INPUT_END &&
+       commit refs/heads/N6
+       committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+       data <<COMMIT
+       copy root directory by tree hash
+       COMMIT
+
+       from refs/heads/branch^0
+       M 040000 $root ""
+       INPUT_END
+        git fast-import <input &&
+        git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
+        compare_diff_raw expect actual'
+
 test_expect_success \
        'N: modify copied tree' \
        'cat >expect <<-\EOF &&
@@ -1110,11 +1131,10 @@ test_expect_success \
        'P: supermodule & submodule mix' \
        'git fast-import <input &&
         git checkout subuse1 &&
-        rm -rf sub && mkdir sub && cd sub &&
+        rm -rf sub && mkdir sub && (cd sub &&
         git init &&
         git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
-        git checkout master &&
-        cd .. &&
+        git checkout master) &&
         git submodule init &&
         git submodule update'
 
index 925bd0fbedf9865cef834460969c0a9fd2262437..1bbfd824e50ba44f6684cbce3f220a99f17f6cc6 100755 (executable)
@@ -129,21 +129,22 @@ test_expect_success 'cvs co (use attributes)' '
 '
 
 test_expect_success 'adding files' '
-    cd cvswork/subdir &&
+    (cd cvswork &&
+    (cd subdir &&
     echo "more text" > src.c &&
     GIT_CONFIG="$git_config" cvs -Q add src.c >cvs.log 2>&1 &&
     marked_as . src.c "" &&
-    echo "psuedo-binary" > temp.bin &&
-    cd .. &&
+    echo "psuedo-binary" > temp.bin
+    ) &&
     GIT_CONFIG="$git_config" cvs -Q add subdir/temp.bin >cvs.log 2>&1 &&
     marked_as subdir temp.bin "-kb" &&
     cd subdir &&
     GIT_CONFIG="$git_config" cvs -Q ci -m "adding files" >cvs.log 2>&1 &&
     marked_as . temp.bin "-kb" &&
     marked_as . src.c ""
+    )
 '
 
-cd "$WORKDIR"
 test_expect_success 'updating' '
     git pull gitcvs.git &&
     echo 'hi' > subdir/newfile.bin &&
@@ -153,9 +154,9 @@ test_expect_success 'updating' '
     git add subdir/newfile.bin subdir/file.h subdir/newfile.c binfile.bin &&
     git commit -q -m "Add and change some files" &&
     git push gitcvs.git >/dev/null &&
-    cd cvswork &&
-    GIT_CONFIG="$git_config" cvs -Q update &&
-    cd .. &&
+    (cd cvswork &&
+    GIT_CONFIG="$git_config" cvs -Q update
+    ) &&
     marked_as cvswork textfile.c "" &&
     marked_as cvswork binfile.bin -kb &&
     marked_as cvswork .gitattributes "" &&
@@ -233,35 +234,35 @@ test_expect_success 'cvs co another copy (guess)' '
 '
 
 test_expect_success 'add text (guess)' '
-    cd cvswork &&
+    (cd cvswork &&
     echo "simpleText" > simpleText.c &&
-    GIT_CONFIG="$git_config" cvs -Q add simpleText.c &&
-    cd .. &&
+    GIT_CONFIG="$git_config" cvs -Q add simpleText.c
+    ) &&
     marked_as cvswork simpleText.c ""
 '
 
 test_expect_success 'add bin (guess)' '
-    cd cvswork &&
+    (cd cvswork &&
     echo "simpleBin: NUL: Q <- there" | q_to_nul > simpleBin.bin &&
-    GIT_CONFIG="$git_config" cvs -Q add simpleBin.bin &&
-    cd .. &&
+    GIT_CONFIG="$git_config" cvs -Q add simpleBin.bin
+    ) &&
     marked_as cvswork simpleBin.bin -kb
 '
 
 test_expect_success 'remove files (guess)' '
-    cd cvswork &&
+    (cd cvswork &&
     GIT_CONFIG="$git_config" cvs -Q rm -f subdir/file.h &&
-    cd subdir &&
-    GIT_CONFIG="$git_config" cvs -Q rm -f withCr.bin &&
-    cd ../.. &&
+    (cd subdir &&
+    GIT_CONFIG="$git_config" cvs -Q rm -f withCr.bin
+    )) &&
     marked_as cvswork/subdir withCr.bin -kb &&
     marked_as cvswork/subdir file.h ""
 '
 
 test_expect_success 'cvs ci (guess)' '
-    cd cvswork &&
-    GIT_CONFIG="$git_config" cvs -Q ci -m "add/rm files" >cvs.log 2>&1 &&
-    cd .. &&
+    (cd cvswork &&
+    GIT_CONFIG="$git_config" cvs -Q ci -m "add/rm files" >cvs.log 2>&1
+    ) &&
     marked_as cvswork textfile.c "" &&
     marked_as cvswork binfile.bin -kb &&
     marked_as cvswork .gitattributes "" &&
@@ -278,9 +279,9 @@ test_expect_success 'cvs ci (guess)' '
 '
 
 test_expect_success 'update subdir of other copy (guess)' '
-    cd cvswork2/subdir &&
-    GIT_CONFIG="$git_config" cvs -Q update &&
-    cd ../.. &&
+    (cd cvswork2/subdir &&
+    GIT_CONFIG="$git_config" cvs -Q update
+    ) &&
     marked_as cvswork2 textfile.c "" &&
     marked_as cvswork2 binfile.bin -kb &&
     marked_as cvswork2 .gitattributes "" &&
@@ -304,11 +305,11 @@ test_expect_success 'update/merge full other copy (guess)' '
     git add multilineTxt.c &&
     git commit -q -m "modify multiline file" >> "${WORKDIR}/marked.log" &&
     git push gitcvs.git >/dev/null &&
-    cd cvswork2 &&
+    (cd cvswork2 &&
     sed "s/1/replaced_1/" < multilineTxt.c > ml.temp &&
     mv ml.temp multilineTxt.c &&
-    GIT_CONFIG="$git_config" cvs update > cvs.log 2>&1 &&
-    cd .. &&
+    GIT_CONFIG="$git_config" cvs update > cvs.log 2>&1
+    ) &&
     marked_as cvswork2 textfile.c "" &&
     marked_as cvswork2 binfile.bin -kb &&
     marked_as cvswork2 .gitattributes "" &&
index 4f2b9b062b08302aedab42dcdd0a33776559c05e..21cd286bb7abf33c944a8758ce8d702e83ca2022 100755 (executable)
@@ -650,25 +650,26 @@ test_debug 'cat gitweb.log'
 # ----------------------------------------------------------------------
 # syntax highlighting
 
-cat >>gitweb_config.perl <<\EOF
-$feature{'highlight'}{'override'} = 1;
-EOF
 
 highlight --version >/dev/null 2>&1
 if [ $? -eq 127 ]; then
        say "Skipping syntax highlighting test, because 'highlight' was not found"
 else
        test_set_prereq HIGHLIGHT
+       cat >>gitweb_config.perl <<-\EOF
+       our $highlight_bin = "highlight";
+       $feature{'highlight'}{'override'} = 1;
+       EOF
 fi
 
 test_expect_success HIGHLIGHT \
-       'syntax highlighting (no highlight)' \
+       'syntax highlighting (no highlight, unknown syntax)' \
        'git config gitweb.highlight yes &&
         gitweb_run "p=.git;a=blob;f=file"'
 test_debug 'cat gitweb.log'
 
 test_expect_success HIGHLIGHT \
-       'syntax highlighting (highlighted)' \
+       'syntax highlighting (highlighted, shell script)' \
        'git config gitweb.highlight yes &&
         echo "#!/usr/bin/sh" > test.sh &&
         git add test.sh &&
index 559ce417954e1ef8276efc860ca63eb0bdcce284..432b82e3d5a361d0eba329f5d5c56c17009738db 100755 (executable)
@@ -14,7 +14,7 @@ test_expect_success PERL 'setup a cvs module' '
 
        mkdir "$CVSROOT/module" &&
        $CVS co -d module-cvs module &&
-       cd module-cvs &&
+       (cd module-cvs &&
        cat <<EOF >o_fortuna &&
 O Fortuna
 velut luna
@@ -38,8 +38,8 @@ add "O Fortuna" lyrics
 
 These public domain lyrics make an excellent sample text.
 EOF
-       $CVS commit -F message &&
-       cd ..
+       $CVS commit -F message
+       )
 '
 
 test_expect_success PERL 'import a trivial module' '
@@ -49,7 +49,7 @@ test_expect_success PERL 'import a trivial module' '
 
 '
 
-test_expect_success PERL 'pack refs' 'cd module-git && git gc && cd ..'
+test_expect_success PERL 'pack refs' '(cd module-git && git gc)'
 
 test_expect_success PERL 'initial import has correct .git/cvs-revisions' '
 
@@ -59,8 +59,7 @@ test_expect_success PERL 'initial import has correct .git/cvs-revisions' '
 '
 
 test_expect_success PERL 'update cvs module' '
-
-       cd module-cvs &&
+       (cd module-cvs &&
        cat <<EOF >o_fortuna &&
 O Fortune,
 like the moon
@@ -83,16 +82,16 @@ translate to English
 
 My Latin is terrible.
 EOF
-       $CVS commit -F message &&
-       cd ..
+       $CVS commit -F message
+       )
 '
 
 test_expect_success PERL 'update git module' '
 
-       cd module-git &&
+       (cd module-git &&
        git cvsimport -a -R -z 0 module &&
-       git merge origin &&
-       cd .. &&
+       git merge origin
+       ) &&
        test_cmp module-cvs/o_fortuna module-git/o_fortuna
 
 '
@@ -107,21 +106,20 @@ test_expect_success PERL 'update has correct .git/cvs-revisions' '
 
 test_expect_success PERL 'update cvs module' '
 
-       cd module-cvs &&
+       (cd module-cvs &&
                echo 1 >tick &&
                $CVS add tick &&
                $CVS commit -m 1
-       cd ..
-
+       )
 '
 
 test_expect_success PERL 'cvsimport.module config works' '
 
-       cd module-git &&
+       (cd module-git &&
                git config cvsimport.module module &&
                git cvsimport -a -R -z0 &&
-               git merge origin &&
-       cd .. &&
+               git merge origin
+       ) &&
        test_cmp module-cvs/tick module-git/tick
 
 '
@@ -138,12 +136,12 @@ test_expect_success PERL 'second update has correct .git/cvs-revisions' '
 test_expect_success PERL 'import from a CVS working tree' '
 
        $CVS co -d import-from-wt module &&
-       cd import-from-wt &&
+       (cd import-from-wt &&
                git cvsimport -a -z0 &&
                echo 1 >expect &&
                git log -1 --pretty=format:%s%n >actual &&
-               test_cmp actual expect &&
-       cd ..
+               test_cmp actual expect
+       )
 
 '
 
index 93c4fa885eeff16c57a58d8dc4fa7537cde54ea9..52034c8f77abd2eb0079866331c49a2f5f34e20d 100755 (executable)
@@ -19,12 +19,12 @@ setup_cvs_test_repository t9603
 test_expect_failure 'import with criss cross times on revisions' '
 
     git cvsimport -p"-x" -C module-git module &&
-    cd module-git &&
+    (cd module-git &&
         git log --pretty=format:%s > ../actual-master &&
         git log A~2..A --pretty="format:%s %ad" -- > ../actual-A &&
         echo "" >> ../actual-master &&
-        echo "" >> ../actual-A &&
-    cd .. &&
+       echo "" >> ../actual-A
+    ) &&
     echo "Rev 4
 Rev 3
 Rev 2
index 830e5e7360350a424a2fe6016a03c913209f7557..2af8f10c837fd8c1543cf17d877ae0684cbc61a4 100644 (file)
@@ -970,11 +970,13 @@ case $(uname -s) in
        # no POSIX permissions
        # backslashes in pathspec are converted to '/'
        # exec does not inherit the PID
+       test_set_prereq MINGW
        ;;
 *)
        test_set_prereq POSIXPERM
        test_set_prereq BSLASHPSPEC
        test_set_prereq EXECKEEPSPID
+       test_set_prereq NOT_MINGW
        ;;
 esac
 
index cd659c6fe447b6fcdedee2843113feb358f23849..12c9a88884ec3bb70a1744e44235c578a44e08e6 100644 (file)
@@ -85,6 +85,8 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const
 /*
  * Is a tree entry interesting given the pathspec we have?
  *
+ * Pre-condition: baselen == 0 || base[baselen-1] == '/'
+ *
  * Return:
  *  - 2 for "yes, and all subsequent entries will be"
  *  - 1 for yes
@@ -101,7 +103,7 @@ static int tree_entry_interesting(struct tree_desc *desc, const char *base, int
        int never_interesting = -1;
 
        if (!opt->nr_paths)
-               return 1;
+               return 2;
 
        sha1 = tree_entry_extract(desc, &path, &mode);
 
@@ -257,19 +259,12 @@ static void show_entry(struct diff_options *opt, const char *prefix, struct tree
        }
 }
 
-static void skip_uninteresting(struct tree_desc *t, const char *base, int baselen, struct diff_options *opt)
+static void skip_uninteresting(struct tree_desc *t, const char *base, int baselen, struct diff_options *opt, int *all_interesting)
 {
-       int all_interesting = 0;
        while (t->size) {
-               int show;
-
-               if (all_interesting)
-                       show = 1;
-               else {
-                       show = tree_entry_interesting(t, base, baselen, opt);
-                       if (show == 2)
-                               all_interesting = 1;
-               }
+               int show = tree_entry_interesting(t, base, baselen, opt);
+               if (show == 2)
+                       *all_interesting = 1;
                if (!show) {
                        update_tree_entry(t);
                        continue;
@@ -284,14 +279,20 @@ static void skip_uninteresting(struct tree_desc *t, const char *base, int basele
 int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt)
 {
        int baselen = strlen(base);
+       int all_t1_interesting = 0;
+       int all_t2_interesting = 0;
 
        for (;;) {
                if (DIFF_OPT_TST(opt, QUICK) &&
                    DIFF_OPT_TST(opt, HAS_CHANGES))
                        break;
                if (opt->nr_paths) {
-                       skip_uninteresting(t1, base, baselen, opt);
-                       skip_uninteresting(t2, base, baselen, opt);
+                       if (!all_t1_interesting)
+                               skip_uninteresting(t1, base, baselen, opt,
+                                                  &all_t1_interesting);
+                       if (!all_t2_interesting)
+                               skip_uninteresting(t2, base, baselen, opt,
+                                                  &all_t2_interesting);
                }
                if (!t1->size) {
                        if (!t2->size)
index 92f9530c6572a212c12ac917d774736286325e52..f05e4229d0d3a3ed34b4bba6636f4d333c74dc22 100644 (file)
@@ -11,7 +11,7 @@
 #include "list-objects.h"
 #include "run-command.h"
 
-static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=nn] <dir>";
+static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
 
 /* bits #0..7 in revision.h, #8..10 in commit.c */
 #define THEY_HAVE      (1u << 11)
index e5522159b362811346b4306246391e960a4e7041..f9e05b548c2fdbc349a1d47d81619e266ec9fb83 100644 (file)
@@ -9,7 +9,23 @@ static int drivers_alloc;
 
 #define PATTERNS(name, pattern, word_regex)                    \
        { name, NULL, -1, { pattern, REG_EXTENDED }, word_regex }
+#define IPATTERN(name, pattern, word_regex)                    \
+       { name, NULL, -1, { pattern, REG_EXTENDED | REG_ICASE }, word_regex }
 static struct userdiff_driver builtin_drivers[] = {
+IPATTERN("fortran",
+        "!^([C*]|[ \t]*!)\n"
+        "!^[ \t]*MODULE[ \t]+PROCEDURE[ \t]\n"
+        "^[ \t]*((END[ \t]+)?(PROGRAM|MODULE|BLOCK[ \t]+DATA"
+               "|([^'\" \t]+[ \t]+)*(SUBROUTINE|FUNCTION))[ \t]+[A-Z].*)$",
+        /* -- */
+        "[a-zA-Z][a-zA-Z0-9_]*"
+        "|\\.([Ee][Qq]|[Nn][Ee]|[Gg][TtEe]|[Ll][TtEe]|[Tt][Rr][Uu][Ee]|[Ff][Aa][Ll][Ss][Ee]|[Aa][Nn][Dd]|[Oo][Rr]|[Nn]?[Ee][Qq][Vv]|[Nn][Oo][Tt])\\."
+        /* numbers and format statements like 2E14.4, or ES12.6, 9X.
+         * Don't worry about format statements without leading digits since
+         * they would have been matched above as a variable anyway. */
+        "|[-+]?[0-9.]+([AaIiDdEeFfLlTtXx][Ss]?[-+]?[0-9.]*)?(_[a-zA-Z0-9][a-zA-Z0-9_]*)?"
+        "|//|\\*\\*|::|[/<>=]="
+        "|[^[:space:]]|[\x80-\xff]+"),
 PATTERNS("html", "^[ \t]*(<[Hh][1-6][ \t].*>.*)$",
         "[^<>= \t]+|[^[:space:]]|[\x80-\xff]+"),
 PATTERNS("java",
@@ -101,6 +117,7 @@ PATTERNS("csharp",
 { "default", NULL, -1, { NULL, 0 } },
 };
 #undef PATTERNS
+#undef IPATTERN
 
 static struct userdiff_driver driver_true = {
        "diff=true",
index 256a0522b2b8484fa27d8730addee0591ea09195..6cfa256a3702332205faab546a405f6810cc16bd 100644 (file)
@@ -25,7 +25,7 @@ void fast_export_modify(uint32_t depth, uint32_t *path, uint32_t mode,
                        uint32_t mark)
 {
        /* Mode must be 100644, 100755, 120000, or 160000. */
-       printf("M %06o :%d ", mode, mark);
+       printf("M %06"PRIo32" :%"PRIu32" ", mode, mark);
        pool_print_seq(depth, path, '/', stdout);
        putchar('\n');
 }
@@ -38,7 +38,8 @@ void fast_export_commit(uint32_t revision, uint32_t author, char *log,
        if (!log)
                log = "";
        if (~uuid && ~url) {
-               snprintf(gitsvnline, MAX_GITSVN_LINE_LEN, "\n\ngit-svn-id: %s@%d %s\n",
+               snprintf(gitsvnline, MAX_GITSVN_LINE_LEN,
+                               "\n\ngit-svn-id: %s@%"PRIu32" %s\n",
                                 pool_fetch(url), revision, pool_fetch(uuid));
        } else {
                *gitsvnline = '\0';
@@ -59,7 +60,7 @@ void fast_export_commit(uint32_t revision, uint32_t author, char *log,
        repo_diff(revision - 1, revision);
        fputc('\n', stdout);
 
-       printf("progress Imported commit %d.\n\n", revision);
+       printf("progress Imported commit %"PRIu32".\n\n", revision);
 }
 
 void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len)
@@ -69,7 +70,7 @@ void fast_export_blob(uint32_t mode, uint32_t mark, uint32_t len)
                buffer_skip_bytes(5);
                len -= 5;
        }
-       printf("blob\nmark :%d\ndata %d\n", mark, len);
+       printf("blob\nmark :%"PRIu32"\ndata %"PRIu32"\n", mark, len);
        buffer_copy_bytes(len);
        fputc('\n', stdout);
 }
index 630eeb53b7d75f71bdf91cbdf45f428d0a14eb35..53d0215d2d8f38fee589321890c9305c8da4d2c5 100644 (file)
@@ -257,7 +257,7 @@ void svndump_read(const char *url)
                                handle_node();
                                active_ctx = REV_CTX;
                        } else {
-                               fprintf(stderr, "Unexpected content length header: %d\n", len);
+                               fprintf(stderr, "Unexpected content length header: %"PRIu32"\n", len);
                                buffer_skip_bytes(len);
                        }
                }
index 54b6b03b9cc4e168e6b6429679b61dc2a1d5197b..fc2438f60b0e0e87772db2a9f3e407f351bb03d0 100644 (file)
@@ -390,11 +390,9 @@ static void wt_status_collect_untracked(struct wt_status *s)
        fill_directory(&dir, s->pathspec);
        for (i = 0; i < dir.nr; i++) {
                struct dir_entry *ent = dir.entries[i];
-               if (!cache_name_is_other(ent->name, ent->len))
-                       continue;
-               if (!match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
-                       continue;
-               string_list_insert(&s->untracked, ent->name);
+               if (cache_name_is_other(ent->name, ent->len) &&
+                   match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
+                       string_list_insert(&s->untracked, ent->name);
                free(ent);
        }
 
@@ -404,11 +402,9 @@ static void wt_status_collect_untracked(struct wt_status *s)
                fill_directory(&dir, s->pathspec);
                for (i = 0; i < dir.nr; i++) {
                        struct dir_entry *ent = dir.entries[i];
-                       if (!cache_name_is_other(ent->name, ent->len))
-                               continue;
-                       if (!match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
-                               continue;
-                       string_list_insert(&s->ignored, ent->name);
+                       if (cache_name_is_other(ent->name, ent->len) &&
+                           match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
+                               string_list_insert(&s->ignored, ent->name);
                        free(ent);
                }
        }
index cd2285de1cb1faa9f7c6c97dd22210f20bb046a3..e1e054e4d982de30d8a9c8c4109c6d62448f62a9 100644 (file)
@@ -286,9 +286,8 @@ static long ff_regexp(const char *line, long len,
        result = pmatch[i].rm_eo - pmatch[i].rm_so;
        if (result > buffer_size)
                result = buffer_size;
-       else
-               while (result > 0 && (isspace(line[result - 1])))
-                       result--;
+       while (result > 0 && (isspace(line[result - 1])))
+               result--;
        memcpy(buffer, line, result);
  fail:
        free(line_buffer);
index 8ef232cfad12d706aaafe705bf16c546f3597182..165a895a93e04b33ca7c8f3839ee85e0eccb4a07 100644 (file)
@@ -30,6 +30,7 @@
 #define XDL_MAX(a, b) ((a) > (b) ? (a): (b))
 #define XDL_ABS(v) ((v) >= 0 ? (v): -(v))
 #define XDL_ISDIGIT(c) ((c) >= '0' && (c) <= '9')
+#define XDL_ISSPACE(c) (isspace((unsigned char)(c)))
 #define XDL_ADDBITS(v,b)       ((v) + ((v) >> (b)))
 #define XDL_MASKBITS(b)                ((1UL << (b)) - 1)
 #define XDL_HASHLONG(v,b)      (XDL_ADDBITS((unsigned long)(v), b) & XDL_MASKBITS(b))
index 6d6fc1bc5e01be7305ec5101f43645a1dce69bd3..9e13b25abc90350de4488276074dc282edc216b1 100644 (file)
@@ -336,7 +336,7 @@ static int xdl_refine_conflicts(xdfenv_t *xe1, xdfenv_t *xe2, xdmerge_t *m,
 static int line_contains_alnum(const char *ptr, long size)
 {
        while (size--)
-               if (isalnum(*(ptr++)))
+               if (isalnum((unsigned char)*(ptr++)))
                        return 1;
        return 0;
 }
index 22f9bd692c2706136b4938bbcb2e0fc3dab212b8..ab6503460f760356a393a3c7b3b8438213e1ee94 100644 (file)
@@ -211,18 +211,18 @@ int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags)
                        if (l1[i1++] != l2[i2++])
                                return 0;
                skip_ws:
-                       while (i1 < s1 && isspace(l1[i1]))
+                       while (i1 < s1 && XDL_ISSPACE(l1[i1]))
                                i1++;
-                       while (i2 < s2 && isspace(l2[i2]))
+                       while (i2 < s2 && XDL_ISSPACE(l2[i2]))
                                i2++;
                }
        } else if (flags & XDF_IGNORE_WHITESPACE_CHANGE) {
                while (i1 < s1 && i2 < s2) {
-                       if (isspace(l1[i1]) && isspace(l2[i2])) {
+                       if (XDL_ISSPACE(l1[i1]) && XDL_ISSPACE(l2[i2])) {
                                /* Skip matching spaces and try again */
-                               while (i1 < s1 && isspace(l1[i1]))
+                               while (i1 < s1 && XDL_ISSPACE(l1[i1]))
                                        i1++;
-                               while (i2 < s2 && isspace(l2[i2]))
+                               while (i2 < s2 && XDL_ISSPACE(l2[i2]))
                                        i2++;
                                continue;
                        }
@@ -241,13 +241,13 @@ int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags)
         * while there still are characters remaining on both lines.
         */
        if (i1 < s1) {
-               while (i1 < s1 && isspace(l1[i1]))
+               while (i1 < s1 && XDL_ISSPACE(l1[i1]))
                        i1++;
                if (s1 != i1)
                        return 0;
        }
        if (i2 < s2) {
-               while (i2 < s2 && isspace(l2[i2]))
+               while (i2 < s2 && XDL_ISSPACE(l2[i2]))
                        i2++;
                return (s2 == i2);
        }
@@ -260,10 +260,10 @@ static unsigned long xdl_hash_record_with_whitespace(char const **data,
        char const *ptr = *data;
 
        for (; ptr < top && *ptr != '\n'; ptr++) {
-               if (isspace(*ptr)) {
+               if (XDL_ISSPACE(*ptr)) {
                        const char *ptr2 = ptr;
                        int at_eol;
-                       while (ptr + 1 < top && isspace(ptr[1])
+                       while (ptr + 1 < top && XDL_ISSPACE(ptr[1])
                                        && ptr[1] != '\n')
                                ptr++;
                        at_eol = (top <= ptr + 1 || ptr[1] == '\n');