Merge branch 'tr/coverage' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 19 Jul 2013 17:38:18 +0000 (10:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Jul 2013 17:38:18 +0000 (10:38 -0700)
The test coverage framework was left broken for some time.

* tr/coverage:
coverage: build coverage-untested-functions by default
coverage: set DEFAULT_TEST_TARGET to avoid using prove
coverage: do not delete .gcno files before building
coverage: split build target into compile and test

120 files changed:
Documentation/CodingGuidelines
Documentation/RelNotes/1.8.3.1.txt [new file with mode: 0644]
Documentation/RelNotes/1.8.3.2.txt [new file with mode: 0644]
Documentation/RelNotes/1.8.3.3.txt [new file with mode: 0644]
Documentation/RelNotes/1.8.3.txt
Documentation/diff-options.txt
Documentation/git-am.txt
Documentation/git-archive.txt
Documentation/git-check-ignore.txt
Documentation/git-check-ref-format.txt
Documentation/git-checkout.txt
Documentation/git-clone.txt
Documentation/git-commit.txt
Documentation/git-config.txt
Documentation/git-daemon.txt
Documentation/git-diff-index.txt
Documentation/git-difftool.txt
Documentation/git-fast-export.txt
Documentation/git-fetch-pack.txt
Documentation/git-fmt-merge-msg.txt
Documentation/git-fsck.txt
Documentation/git-grep.txt
Documentation/git-mailinfo.txt
Documentation/git-merge.txt
Documentation/git-mergetool.txt
Documentation/git-push.txt
Documentation/git-remote.txt
Documentation/git-reset.txt
Documentation/git-revert.txt
Documentation/git-submodule.txt
Documentation/git-svn.txt
Documentation/git-update-index.txt
Documentation/git.txt
Documentation/gitdiffcore.txt
Documentation/gitrepository-layout.txt
Documentation/glossary-content.txt
Documentation/merge-options.txt
Documentation/technical/pack-protocol.txt
Documentation/urls.txt
GIT-VERSION-GEN
Makefile
RelNotes
branch.c
builtin/apply.c
builtin/checkout.c
builtin/clone.c
builtin/commit.c
builtin/config.c
builtin/merge.c
builtin/push.c
combine-diff.c
commit.h
compat/clipped-write.c [new file with mode: 0644]
compat/mingw.c
config.c
config.mak.uname
configure.ac
contrib/completion/git-completion.bash
contrib/completion/git-prompt.sh
contrib/remote-helpers/git-remote-bzr
contrib/remote-helpers/git-remote-hg
contrib/remote-helpers/test-hg-hg-git.sh
contrib/subtree/git-subtree.sh
diffcore-pickaxe.c
dir.c
fetch-pack.c
fixup-builtins [deleted file]
git-compat-util.h
git-difftool.perl
git-pull.sh
git-send-email.perl
git-submodule.sh
git-svn.perl
git.c
gitk-git/po/sv.po
gitweb/gitweb.perl
help.c
help.h
http.c
imap-send.c
read-cache.c
revision.c
revision.h
sequencer.c
sha1_file.c
sha1_name.c
shallow.c
submodule.c
t/README
t/lib-rebase.sh
t/t0070-fundamental.sh
t/t0100-previous.sh
t/t1507-rev-parse-upstream.sh
t/t2024-checkout-dwim.sh [new file with mode: 0755]
t/t3001-ls-files-others-exclude.sh
t/t3070-wildmatch.sh
t/t3200-branch.sh
t/t4038-diff-combined.sh
t/t4111-apply-subdir.sh
t/t4202-log.sh
t/t5004-archive-corner-cases.sh
t/t5004/empty-with-pax-header.tar [new file with mode: 0644]
t/t5500-fetch-pack.sh
t/t5520-pull.sh
t/t5551-http-fetch.sh
t/t6019-rev-list-ancestry-path.sh
t/t7011-skip-worktree-reading.sh
t/t7201-co.sh
t/t7400-submodule-basic.sh
t/t7500-commit.sh
t/t7502-commit.sh
t/t7800-difftool.sh
t/t9001-send-email.sh
t/t9114-git-svn-dcommit-merge.sh
t/t9167-git-svn-cmd-branch-subproject.sh [new file with mode: 0755]
t/t9903-bash-prompt.sh
templates/hooks--pre-push.sample [changed mode: 0644->0755]
upload-pack.c
wildmatch.c
wrapper.c
index 7e4d5716a62bf59e8f072163ebac3064dad323ae..559d5f9ebf6fefe57b403327ed3e06942d0b822b 100644 (file)
@@ -237,8 +237,10 @@ For Python scripts:
 
 Writing Documentation:
 
- Most (if not all) of the documentation pages are written in AsciiDoc
- and processed into HTML output and manpages.
+ Most (if not all) of the documentation pages are written in the
+ AsciiDoc format in *.txt files (e.g. Documentation/git.txt), and
+ processed into HTML and manpages (e.g. git.html and git.1 in the
+ same directory).
 
  Every user-visible change should be reflected in the documentation.
  The same general rule as for code applies -- imitate the existing
diff --git a/Documentation/RelNotes/1.8.3.1.txt b/Documentation/RelNotes/1.8.3.1.txt
new file mode 100644 (file)
index 0000000..fc3ea18
--- /dev/null
@@ -0,0 +1,14 @@
+Git v1.8.3.1 Release Notes
+========================
+
+Fixes since v1.8.3
+------------------
+
+ * When $HOME is misconfigured to point at an unreadable directory, we
+   used to complain and die. The check has been loosened.
+
+ * Handling of negative exclude pattern for directories "!dir" was
+   broken in the update to v1.8.3.
+
+Also contains a handful of trivial code clean-ups, documentation
+updates, updates to the test suite, etc.
diff --git a/Documentation/RelNotes/1.8.3.2.txt b/Documentation/RelNotes/1.8.3.2.txt
new file mode 100644 (file)
index 0000000..26ae142
--- /dev/null
@@ -0,0 +1,59 @@
+Git v1.8.3.2 Release Notes
+==========================
+
+Fixes since v1.8.3.1
+--------------------
+
+ * Cloning with "git clone --depth N" while fetch.fsckobjects (or
+   transfer.fsckobjects) is set to true did not tell the cut-off
+   points of the shallow history to the process that validates the
+   objects and the history received, causing the validation to fail.
+
+ * "git checkout foo" DWIMs the intended "upstream" and turns it into
+   "git checkout -t -b foo remotes/origin/foo". This codepath has been
+   updated to correctly take existing remote definitions into account.
+
+ * "git fetch" into a shallow repository from a repository that does
+   not know about the shallow boundary commits (e.g. a different fork
+   from the repository the current shallow repository was cloned from)
+   did not work correctly.
+
+ * "git subtree" (in contrib/) had one codepath with loose error
+   checks to lose data at the remote side.
+
+ * "git log --ancestry-path A...B" did not work as expected, as it did
+   not pay attention to the fact that the merge base between A and B
+   was the bottom of the range being specified.
+
+ * "git diff -c -p" was not showing a deleted line from a hunk when
+   another hunk immediately begins where the earlier one ends.
+
+ * "git merge @{-1}~22" was rewritten to "git merge frotz@{1}~22"
+   incorrectly when your previous branch was "frotz" (it should be
+   rewritten to "git merge frotz~22" instead).
+
+ * "git commit --allow-empty-message -m ''" should not start an
+   editor.
+
+ * "git push --[no-]verify" was not documented.
+
+ * An entry for "file://" scheme in the enumeration of URL types Git
+   can take in the HTML documentation was made into a clickable link
+   by mistake.
+
+ * zsh prompt script that borrowed from bash prompt script did not
+   work due to slight differences in array variable notation between
+   these two shells.
+
+ * The bash prompt code (in contrib/) displayed the name of the branch
+   being rebased when "rebase -i/-m/-p" modes are in use, but not the
+   plain vanilla "rebase".
+
+ * "git push $there HEAD:branch" did not resolve HEAD early enough, so
+   it was easy to flip it around while push is still going on and push
+   out a branch that the user did not originally intended when the
+   command was started.
+
+ * "difftool --dir-diff" did not copy back changes made by the
+   end-user in the diff tool backend to the working tree in some
+   cases.
diff --git a/Documentation/RelNotes/1.8.3.3.txt b/Documentation/RelNotes/1.8.3.3.txt
new file mode 100644 (file)
index 0000000..9ba4f4d
--- /dev/null
@@ -0,0 +1,47 @@
+Git v1.8.3.3 Release Notes
+==========================
+
+Fixes since v1.8.3.2
+--------------------
+
+ * "git apply" parsed patches that add new files, generated by programs
+   other than Git, incorrectly.  This is an old breakage in v1.7.11.
+
+ * Older cURL wanted piece of memory we call it with to be stable, but
+   we updated the auth material after handing it to a call.
+
+ * "git pull" into nothing trashed "local changes" that were in the
+   index.
+
+ * Many "git submodule" operations did not work on a submodule at a
+   path whose name is not in ASCII.
+
+ * "cherry-pick" had a small leak in its error codepath.
+
+ * Logic used by git-send-email to suppress cc mishandled names like
+   "A U. Thor" <author@example.xz>, where the human readable part
+   needs to be quoted (the user input may not have the double quotes
+   around the name, and comparison was done between quoted and
+   unquoted strings).  It also mishandled names that need RFC2047
+   quoting.
+
+ * "gitweb" forgot to clear a global variable $search_regexp upon each
+   request, mistakenly carrying over the previous search to a new one
+   when used as a persistent CGI.
+
+ * The wildmatch engine did not honor WM_CASEFOLD option correctly.
+
+ * "git log -c --follow $path" segfaulted upon hitting the commit that
+   renamed the $path being followed.
+
+ * When a reflog notation is used for implicit "current branch",
+   e.g. "git log @{u}", we did not say which branch and worse said
+   "branch ''" in the error messages.
+
+ * Mac OS X does not like to write(2) more than INT_MAX number of
+   bytes; work it around by chopping write(2) into smaller pieces.
+
+ * Newer MacOS X encourages the programs to compile and link with
+   their CommonCrypto, not with OpenSSL.
+
+Also contains various minor documentation updates.
index 468947cc1a81ca3d1280eed5e62e7b77f9aa6fe4..ead568e7f157132a5030ca9052fc0b36707522f6 100644 (file)
@@ -42,8 +42,11 @@ Updates since v1.8.2
 Foreign interface
 
  * remote-hg and remote-bzr helpers (in contrib/ since v1.8.2) have
-   been updated; especially, the latter has been accelerated to help
-   Emacs folks, whose primary SCM seems to be stagnating.
+   been updated; especially, the latter has been done in an
+   accelerated schedule (read: we may not have merged to this release
+   if we were following the usual "cook sufficiently in next before
+   unleashing it to the world" workflow) in order to help Emacs folks,
+   whose primary SCM seems to be stagnating.
 
 
 UI, Workflows & Features
@@ -111,9 +114,10 @@ UI, Workflows & Features
    of erroneous inputs was suboptimal and has been improved.
 
  * When the interactive access to git-shell is not enabled, it issues
-   a message meant to help the system administrator to enable it.
-   An explicit way to help the end users who connect to the service by
-   issuing custom messages to refuse such an access has been added.
+   a message meant to help the system administrator to enable it.  An
+   explicit way has been added to issue custom messages to refuse an
+   access over the network to help the end users who connect to the
+   service expecting an interactive shell.
 
  * In addition to the case where the user edits the log message with
    the "e)dit" option of "am -i", replace the "Applying: this patch"
@@ -123,8 +127,8 @@ UI, Workflows & Features
  * "git status" suggests users to look into using --untracked=no option
    when it takes too long.
 
- * "git status" shows a bit more information during a
-   rebase/bisect session.
+ * "git status" shows a bit more information during a rebase/bisect
+   session.
 
  * "git fetch" learned to fetch a commit at the tip of an unadvertised
    ref by specifying a raw object name from the command line when the
@@ -241,7 +245,6 @@ details).
 
  * Various subcommands of "git remote" simply ignored extraneous
    command line arguments instead of diagnosing them as errors.
-   (merge b17dd3f tr/remote-tighten-commandline-parsing later to maint).
 
  * When receive-pack detects an error in the pack header it received in
    order to decide which of unpack-objects or index-pack to run, it
@@ -264,7 +267,6 @@ details).
    buffer around as human readable object names.  This was not a huge
    problem but was exposed by a new change that uses these names in
    error output.
-   (merge 70d26c6 tr/copy-revisions-from-stdin later to maint).
 
  * Smart-capable HTTP servers were not restricted via the
    GIT_NAMESPACE mechanism when talking with commit-walking clients,
@@ -309,11 +311,9 @@ details).
 
  * Fix a 1.8.1.x regression that stopped matching "dir" (without a
    trailing slash) to a directory "dir".
-   (merge efa5f82 jc/directory-attrs-regression-fix later to maint-1.8.1).
 
  * "git apply --whitespace=fix" was not prepared to see a line getting
    longer after fixing whitespaces (e.g. tab-in-indent aka Python).
-   (merge 329b26e jc/apply-ws-fix-tab-in-indent later to maint-1.8.1).
 
  * The prompt string generator (in contrib/completion/) did not notice
    when we are in a middle of a "git revert" session.
index 104579dc75128811e475d408035569ac09f3283b..a85288f23ef13512042a783460c5dfcd347b83f1 100644 (file)
@@ -383,14 +383,36 @@ ifndef::git-format-patch[]
        that matches other criteria, nothing is selected.
 
 -S<string>::
-       Look for differences that introduce or remove an instance of
-       <string>. Note that this is different than the string simply
-       appearing in diff output; see the 'pickaxe' entry in
-       linkgit:gitdiffcore[7] for more details.
+       Look for differences that change the number of occurrences of
+       the specified string (i.e. addition/deletion) in a file.
+       Intended for the scripter's use.
++
+It is useful when you're looking for an exact block of code (like a
+struct), and want to know the history of that block since it first
+came into being: use the feature iteratively to feed the interesting
+block in the preimage back into `-S`, and keep going until you get the
+very first version of the block.
 
 -G<regex>::
-       Look for differences whose added or removed line matches
-       the given <regex>.
+       Look for differences whose patch text contains added/removed
+       lines that match <regex>.
++
+To illustrate the difference between `-S<regex> --pickaxe-regex` and
+`-G<regex>`, consider a commit with the following diff in the same
+file:
++
+----
++    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
+...
+-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);
+----
++
+While `git log -G"regexec\(regexp"` will show this commit, `git log
+-S"regexec\(regexp" --pickaxe-regex` will not (because the number of
+occurrences of that string did not change).
++
+See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
+information.
 
 --pickaxe-all::
        When `-S` or `-G` finds a change, show all the changes in that
@@ -398,8 +420,8 @@ ifndef::git-format-patch[]
        in <string>.
 
 --pickaxe-regex::
-       Make the <string> not a plain string but an extended POSIX
-       regex to match.
+       Treat the <string> given to `-S` as an extended POSIX regular
+       expression to match.
 endif::git-format-patch[]
 
 -O<orderfile>::
@@ -480,7 +502,7 @@ endif::git-format-patch[]
 
 --ignore-submodules[=<when>]::
        Ignore changes to submodules in the diff generation. <when> can be
-       either "none", "untracked", "dirty" or "all", which is the default
+       either "none", "untracked", "dirty" or "all", which is the default.
        Using "none" will consider the submodule modified when it either contains
        untracked or modified files or its HEAD differs from the commit recorded
        in the superproject and can be used to override any settings of the
index 19d57a80f572c221c6a4d678a0673996416c5208..5bbe7b6d10de652658871048329c5dd60f1e12e0 100644 (file)
@@ -9,12 +9,12 @@ git-am - Apply a series of patches from a mailbox
 SYNOPSIS
 --------
 [verse]
-'git am' [--signoff] [--keep] [--keep-cr | --no-keep-cr] [--utf8 | --no-utf8]
+'git am' [--signoff] [--keep] [--[no-]keep-cr] [--[no-]utf8]
         [--3way] [--interactive] [--committer-date-is-author-date]
         [--ignore-date] [--ignore-space-change | --ignore-whitespace]
         [--whitespace=<option>] [-C<n>] [-p<n>] [--directory=<dir>]
         [--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
-        [--scissors | --no-scissors]
+        [--[no-]scissors]
         [(<mbox> | <Maildir>)...]
 'git am' (--continue | --skip | --abort)
 
@@ -43,8 +43,7 @@ OPTIONS
 --keep-non-patch::
        Pass `-b` flag to 'git mailinfo' (see linkgit:git-mailinfo[1]).
 
---keep-cr::
---no-keep-cr::
+--[no-]keep-cr::
        With `--keep-cr`, call 'git mailsplit' (see linkgit:git-mailsplit[1])
        with the same option, to prevent it from stripping CR at the end of
        lines. `am.keepcr` configuration variable can be used to specify the
index 250e5228a35165e72f2f55fd347941c3a2a1d08c..b97aaab4edfc33f407f7d167f015b174c2ddccb5 100644 (file)
@@ -10,7 +10,7 @@ SYNOPSIS
 --------
 [verse]
 'git archive' [--format=<fmt>] [--list] [--prefix=<prefix>/] [<extra>]
-             [-o | --output=<file>] [--worktree-attributes]
+             [-o <file> | --output=<file>] [--worktree-attributes]
              [--remote=<repo> [--exec=<git-upload-archive>]] <tree-ish>
              [<path>...]
 
index 854e4d0c425a9396bdb71dc84093f43156b04cd5..7f5601bda510d8474afcfafffada3633b7e39f1c 100644 (file)
@@ -82,7 +82,7 @@ SEE ALSO
 --------
 linkgit:gitignore[5]
 linkgit:gitconfig[5]
-linkgit:git-ls-files[5]
+linkgit:git-ls-files[1]
 
 GIT
 ---
index ec1739a896074c96bd94603592ca72bcee0b927f..a49be1bab49ddcdb65e4b45b578bd183a94657a5 100644 (file)
@@ -83,8 +83,7 @@ typed the branch name.
 
 OPTIONS
 -------
---allow-onelevel::
---no-allow-onelevel::
+--[no-]allow-onelevel::
        Controls whether one-level refnames are accepted (i.e.,
        refnames that do not contain multiple `/`-separated
        components).  The default is `--no-allow-onelevel`.
index 23a9413525d4f90435c4996af4d4866b326783bb..ca118ac6bfff9f837d06de37f99f457f6d38916b 100644 (file)
@@ -131,9 +131,9 @@ entries; instead, unmerged entries are ignored.
        "--track" in linkgit:git-branch[1] for details.
 +
 If no '-b' option is given, the name of the new branch will be
-derived from the remote-tracking branch.  If "remotes/" or "refs/remotes/"
-is prefixed it is stripped away, and then the part up to the
-next slash (which would be the nickname of the remote) is removed.
+derived from the remote-tracking branch, by looking at the local part of
+the refspec configured for the corresponding remote, and then stripping
+the initial part up to the "*".
 This would tell us to use "hack" as the local branch when branching
 off of "origin/hack" (or "remotes/origin/hack", or even
 "refs/remotes/origin/hack").  If the given name has no slash, or the above
index 5c16e317f66f326fac0dd0e5d70e26152aee66d3..a0727d7759aefef4dede0fb40008b7b1ee957b2d 100644 (file)
@@ -14,7 +14,7 @@ SYNOPSIS
          [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
          [--separate-git-dir <git dir>]
          [--depth <depth>] [--[no-]single-branch]
-         [--recursive|--recurse-submodules] [--] <repository>
+         [--recursive | --recurse-submodules] [--] <repository>
          [<directory>]
 
 DESCRIPTION
@@ -188,7 +188,7 @@ objects from the source repository into a pack in the cloned repository.
        with a long history, and would want to send in fixes
        as patches.
 
---single-branch::
+--[no-]single-branch::
        Clone only the history leading to the tip of a single branch,
        either specified by the `--branch` option or the primary
        branch remote's `HEAD` points at. When creating a shallow
index 8172938653552c0b4cc3f3154195a7d83721a5a3..1a7616c73a204f69bca98d0ff7f4cdfda20ba420 100644 (file)
@@ -12,7 +12,7 @@ SYNOPSIS
           [--dry-run] [(-c | -C | --fixup | --squash) <commit>]
           [-F <file> | -m <msg>] [--reset-author] [--allow-empty]
           [--allow-empty-message] [--no-verify] [-e] [--author=<author>]
-          [--date=<date>] [--cleanup=<mode>] [--status | --no-status]
+          [--date=<date>] [--cleanup=<mode>] [--[no-]status]
           [-i | -o] [-S[<keyid>]] [--] [<file>...]
 
 DESCRIPTION
index 9ae2508f3fb79b9da5fb4481a4fe2120f4a082b1..606f00c3b89479477f3bee619309de4f11bffa53 100644 (file)
@@ -82,7 +82,7 @@ OPTIONS
 --get::
        Get the value for a given key (optionally filtered by a regex
        matching the value). Returns error code 1 if the key was not
-       found and error code 2 if multiple key values were found.
+       found and the last value if multiple key values were found.
 
 --get-all::
        Like get, but does not fail if the number of values for the key
@@ -186,8 +186,7 @@ See also <<FILES>>.
        Opens an editor to modify the specified config file; either
        '--system', '--global', or repository (default).
 
---includes::
---no-includes::
+--[no-]includes::
        Respect `include.*` directives in config files when looking up
        values. Defaults to on.
 
index bfb106cccd5880f0cd40b03059aa79a5569acb63..223f7315236be845a158f63d5909804f965837ba 100644 (file)
@@ -16,8 +16,10 @@ SYNOPSIS
             [--reuseaddr] [--detach] [--pid-file=<file>]
             [--enable=<service>] [--disable=<service>]
             [--allow-override=<service>] [--forbid-override=<service>]
-            [--access-hook=<path>]
-            [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>] [--user=<user> [--group=<group>]]
+            [--access-hook=<path>] [--[no-]informative-errors]
+            [--inetd |
+             [--listen=<host_or_ipaddr>] [--port=<n>]
+             [--user=<user> [--group=<group>]]]
             [<directory>...]
 
 DESCRIPTION
@@ -169,8 +171,7 @@ Git configuration files in that directory are readable by `<user>`.
        repository configuration.  By default, all the services
        are overridable.
 
---informative-errors::
---no-informative-errors::
+--[no-]informative-errors::
        When informative errors are turned on, git-daemon will report
        more verbose errors to the client, differentiating conditions
        like "no such repository" from "repository not exported". This
index c0b7c581add35e24128a6b7e9aa79a50f914aad5..a86cf62e68999f698c1a49edab207a9721c6dfaf 100644 (file)
@@ -3,7 +3,7 @@ git-diff-index(1)
 
 NAME
 ----
-git-diff-index - Compares content and mode of blobs between the index and repository
+git-diff-index - Compare a tree to the working tree or index
 
 
 SYNOPSIS
@@ -13,11 +13,11 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-Compares the content and mode of the blobs found via a tree
-object with the content of the current index and, optionally
-ignoring the stat state of the file on disk.  When paths are
-specified, compares only those named paths.  Otherwise all
-entries in the index are compared.
+Compares the content and mode of the blobs found in a tree object
+with the corresponding tracked files in the working tree, or with the
+corresponding paths in the index.  When <path> arguments are present,
+compares only paths matching those patterns.  Otherwise all tracked
+files are compared.
 
 OPTIONS
 -------
index 8361e6e4e3d2d4829d3ce3c6f3ec4a2ac974e86e..11887e63a05904d95f7d07d51b818721b33c0b66 100644 (file)
@@ -69,8 +69,7 @@ with custom merge tool commands and has the same value as `$MERGED`.
 --tool-help::
        Print a list of diff tools that may be used with `--tool`.
 
---symlinks::
---no-symlinks::
+--[no-]symlinks::
        'git difftool''s default behavior is create symlinks to the
        working tree when run in `--dir-diff` mode and the right-hand
        side of the comparison yields the same content as the file in
index 03fc8c39d8607677533b72c39b11e14151ac5b60..efb03806f507789877219f87217841d6deb5cd26 100644 (file)
@@ -106,11 +106,11 @@ marks the same across runs.
        different from the commit's first parent).
 
 [<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~10..master` causes the
-       current master reference to be exported along with all objects
-       added since its 10th ancestor commit.
+       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~10..master` causes the
+       current master reference to be exported along with all objects
+       added since its 10th ancestor commit.
 
 EXAMPLES
 --------
index b81e90d8e70722e0da690ab5afa1bca4ad356b68..1e717543470c0440a72812a046bcadf0e52e4953 100644 (file)
@@ -10,9 +10,9 @@ SYNOPSIS
 --------
 [verse]
 'git fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag]
-                               [--upload-pack=<git-upload-pack>]
-                               [--depth=<n>] [--no-progress]
-                               [-v] [<host>:]<directory> [<refs>...]
+       [--upload-pack=<git-upload-pack>]
+       [--depth=<n>] [--no-progress]
+       [-v] [<host>:]<directory> [<refs>...]
 
 DESCRIPTION
 -----------
index 3a0f55ec8e273545af3a92a9b886511ac79ba73c..bb1232a52c4f0e4995f1fd38737461165772c239 100644 (file)
@@ -35,8 +35,7 @@ OPTIONS
        Do not list one-line descriptions from the actual commits being
        merged.
 
---summary::
---no-summary::
+--[no-]summary::
        Synonyms to --log and --no-log; these are deprecated and will be
        removed in the future.
 
index e5878bd97be849046951b06235fa19bf8aef7b1c..25c431d3c552d523c79473cf10867a3cab00c259 100644 (file)
@@ -30,8 +30,7 @@ index file, all SHA-1 references in `refs` namespace, and all reflogs
        Print out objects that exist but that aren't reachable from any
        of the reference nodes.
 
---dangling::
---no-dangling::
+--[no-]dangling::
        Print objects that exist but that are never 'directly' used (default).
        `--no-dangling` can be used to omit this information from the output.
 
@@ -78,8 +77,7 @@ index file, all SHA-1 references in `refs` namespace, and all reflogs
        a blob, the contents are written into the file, rather than
        its object name.
 
---progress::
---no-progress::
+--[no-]progress::
        Progress status is reported on the standard error stream by
        default when it is attached to a terminal, unless
        --no-progress or --verbose is specified. --progress forces
index 50d46e1a7bae054d7c1afdeb01b9174a3a9c7002..8497aa4494778134cad5ca2c2b11fb1c824e2a24 100644 (file)
@@ -25,7 +25,7 @@ SYNOPSIS
           [-W | --function-context]
           [-f <file>] [-e] <pattern>
           [--and|--or|--not|(|)|-e <pattern>...]
-          [ [--exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
+          [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>...]
           [--] [<pathspec>...]
 
 DESCRIPTION
index 97e7a8e9e7cc01bc350d57ca66e08f5ed96221de..164a3c6ede9be2c3a42cf0ba3612403114d4dde5 100644 (file)
@@ -9,7 +9,7 @@ git-mailinfo - Extracts patch and authorship from a single e-mail message
 SYNOPSIS
 --------
 [verse]
-'git mailinfo' [-k|-b] [-u | --encoding=<encoding> | -n] [--scissors] <msg> <patch>
+'git mailinfo' [-k|-b] [-u | --encoding=<encoding> | -n] [--[no-]scissors] <msg> <patch>
 
 
 DESCRIPTION
index 42391f2ae76aa579605470b6cad8cf4812f29aae..67ca99cd92e371ae7518d4574e2a8507d78e0823 100644 (file)
@@ -76,8 +76,7 @@ The 'git fmt-merge-msg' command can be
 used to give a good default for automated 'git merge'
 invocations.
 
---rerere-autoupdate::
---no-rerere-autoupdate::
+--[no-]rerere-autoupdate::
        Allow the rerere mechanism to update the index with the
        result of auto-conflict resolution if possible.
 
index 6b563c500f660486951cbcac62876bbda5cc3975..07137f252b0fd57a671ef69884bea893cdd7767c 100644 (file)
@@ -8,7 +8,7 @@ git-mergetool - Run merge conflict resolution tools to resolve merge conflicts
 SYNOPSIS
 --------
 [verse]
-'git mergetool' [--tool=<tool>] [-y|--no-prompt|--prompt] [<file>...]
+'git mergetool' [--tool=<tool>] [-y | --[no-]prompt] [<file>...]
 
 DESCRIPTION
 -----------
index eb2883c94cfad91efcc1f70bbdbc1609a3702d3b..df5be268ba69f34fe5e91c3148f8af8c1e0091d6 100644 (file)
@@ -11,7 +11,7 @@ SYNOPSIS
 [verse]
 'git push' [--all | --mirror | --tags] [--follow-tags] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
           [--repo=<repository>] [-f | --force] [--prune] [-v | --verbose] [-u | --set-upstream]
-          [<repository> [<refspec>...]]
+          [--no-verify] [<repository> [<refspec>...]]
 
 DESCRIPTION
 -----------
@@ -162,8 +162,7 @@ useful if you write an alias or script around 'git push'.
        linkgit:git-pull[1] and other commands. For more information,
        see 'branch.<name>.merge' in linkgit:git-config[1].
 
---thin::
---no-thin::
+--[no-]thin::
        These options are passed to linkgit:git-send-pack[1]. A thin transfer
        significantly reduces the amount of sent data when the sender and
        receiver share many of the same objects in common. The default is
@@ -196,6 +195,11 @@ useful if you write an alias or script around 'git push'.
        be pushed. If on-demand was not able to push all necessary
        revisions it will also be aborted and exit with non-zero status.
 
+--[no-]verify::
+       Toggle the pre-push hook (see linkgit:githooks[5]).  The
+       default is \--verify, giving the hook a chance to prevent the
+       push.  With \--no-verify, the hook is bypassed completely.
+
 
 include::urls-remotes.txt[]
 
index 7a6f3546803b8a6d71e44f5123a43397ace1f543..581bb4c413fb70956430bb7359bbee3bbc1a24e6 100644 (file)
@@ -10,7 +10,7 @@ SYNOPSIS
 --------
 [verse]
 'git remote' [-v | --verbose]
-'git remote add' [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url>
+'git remote add' [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
 'git remote rename' <old> <new>
 'git remote remove' <name>
 'git remote set-head' <name> (-a | -d | <branch>)
index a404b47b7bf80ef85e5f34595044090b7025f32c..f445cb38fa26a6daa62b5be7f65122948ca669ab 100644 (file)
@@ -9,7 +9,7 @@ SYNOPSIS
 --------
 [verse]
 'git reset' [-q] [<tree-ish>] [--] <paths>...
-'git reset' (--patch | -p) [<tree-sh>] [--] [<paths>...]
+'git reset' (--patch | -p) [<tree-ish>] [--] [<paths>...]
 'git reset' [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
 
 DESCRIPTION
index 70152e8b1eb31e5ed6e7da889a424bc65c1f16c2..f79c9d858301353043fe0878bee268d8eacde189 100644 (file)
@@ -8,7 +8,7 @@ git-revert - Revert some existing commits
 SYNOPSIS
 --------
 [verse]
-'git revert' [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit>...
+'git revert' [--[no-]edit] [-n] [-m parent-number] [-s] <commit>...
 'git revert' --continue
 'git revert' --quit
 'git revert' --abort
index 74d5bdc59d58f743bc6f5cb5f7f9ee24d384d5c8..e5767134b1a2a84c284e87c900948e4530b25576 100644 (file)
@@ -77,6 +77,8 @@ argument <path> is the relative location for the cloned submodule
 to exist in the superproject. If <path> is not given, the
 "humanish" part of the source repository is used ("repo" for
 "/path/to/repo.git" and "foo" for "host.xz:foo/.git").
+The <path> is also used as the submodule's logical name in its
+configuration entries unless `--name` is used to specify a logical name.
 +
 <repository> is the URL of the new submodule's origin repository.
 This may be either an absolute URL, or (if it begins with ./
@@ -124,8 +126,10 @@ linkgit:git-status[1] and linkgit:git-diff[1] will provide that information
 too (and can also report changes to a submodule's work tree).
 
 init::
-       Initialize the submodules, i.e. register each submodule name
-       and url found in .gitmodules into .git/config.
+       Initialize the submodules recorded in the index (which were
+       added and committed elsewhere) by copying submodule
+       names and urls from .gitmodules to .git/config.
+       Optional <path> arguments limit which submodules will be initialized.
        It will also copy the value of `submodule.$name.update` into
        .git/config.
        The key used in .git/config is `submodule.$name.url`.
index 58b6d540ca6173e03bbc2dc01686f5483e01ae27..aad452f1697b92713a032c36bf40477c51008f04 100644 (file)
@@ -271,13 +271,15 @@ first have already been pushed into SVN.
        Create a tag by using the tags_subdir instead of the branches_subdir
        specified during git svn init.
 
--d;;
---destination;;
+-d<path>;;
+--destination=<path>;;
+
        If more than one --branches (or --tags) option was given to the 'init'
        or 'clone' command, you must provide the location of the branch (or
-       tag) you wish to create in the SVN repository.  The value of this
-       option must match one of the paths specified by a --branches (or
-       --tags) option.  You can see these paths with the commands
+       tag) you wish to create in the SVN repository.  <path> specifies which
+       path to use to create the branch or tag and should match the pattern
+       on the left-hand side of one of the configured branches or tags
+       refspecs.  You can see these refspecs with the commands
 +
        git config --get-all svn-remote.<name>.branches
        git config --get-all svn-remote.<name>.tags
@@ -298,6 +300,11 @@ where <name> is the name of the SVN repository as specified by the -R option to
        git config --get-all svn-remote.<name>.commiturl
 +
 
+--parents;;
+       Create parent folders. This parameter is equivalent to the parameter
+       --parents on svn cp commands and is useful for non-standard repository
+       layouts.
+
 'tag'::
        Create a tag in the SVN repository. This is a shorthand for
        'branch -t'.
@@ -1032,6 +1039,25 @@ comma-separated list of names within braces. For example:
        tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
 ------------------------------------------------------------------------
 
+Multiple fetch, branches, and tags keys are supported:
+
+------------------------------------------------------------------------
+[svn-remote "messy-repo"]
+       url = http://server.org/svn
+       fetch = trunk/project-a:refs/remotes/project-a/trunk
+       fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
+       branches = branches/server/*:refs/remotes/project-a/branches/*
+       branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
+       tags = tags/server/*:refs/remotes/project-a/tags/*
+------------------------------------------------------------------------
+
+Creating a branch in such a configuration requires disambiguating which
+location to use using the -d or --destination flag:
+
+------------------------------------------------------------------------
+$ git svn branch -d branches/server release-2-3-0
+------------------------------------------------------------------------
+
 Note that git-svn keeps track of the highest revision in which a branch
 or tag has appeared. If the subset of branches or tags is changed after
 fetching, then .git/svn/.metadata must be manually edited to remove (or
index 670e9fb2c2baa1ce40415d273c08d5b137868432..e0a87029cdfe9fadd9edd4cc493bedd6b5044ac3 100644 (file)
@@ -14,8 +14,8 @@ SYNOPSIS
             [--refresh] [-q] [--unmerged] [--ignore-missing]
             [(--cacheinfo <mode> <object> <file>)...]
             [--chmod=(+|-)x]
-            [--assume-unchanged | --no-assume-unchanged]
-            [--skip-worktree | --no-skip-worktree]
+            [--[no-]assume-unchanged]
+            [--[no-]skip-worktree]
             [--ignore-submodules]
             [--really-refresh] [--unresolve] [--again | -g]
             [--info-only] [--index-info]
@@ -77,8 +77,7 @@ OPTIONS
 --chmod=(+|-)x::
         Set the execute permissions on the updated files.
 
---assume-unchanged::
---no-assume-unchanged::
+--[no-]assume-unchanged::
        When these flags are specified, the object names recorded
        for the paths are not updated.  Instead, these options
        set and unset the "assume unchanged" bit for the
@@ -102,8 +101,7 @@ you will need to handle the situation manually.
        Like '--refresh', but checks stat information unconditionally,
        without regard to the "assume unchanged" setting.
 
---skip-worktree::
---no-skip-worktree::
+--[no-]skip-worktree::
        When one of these flags is specified, the object name recorded
        for the paths are not updated. Instead, these options
        set and unset the "skip-worktree" bit for the paths. See
index 9e302b0a60552c4297cb94018dad49169505bd35..1f783028bc99349a404d8ad6427c704ccbd1ab81 100644 (file)
@@ -43,6 +43,14 @@ unreleased) version of Git, that is available from 'master'
 branch of the `git.git` repository.
 Documentation for older releases are available here:
 
+* link:v1.8.3.3/git.html[documentation for release 1.8.3.3]
+
+* release notes for
+  link:RelNotes/1.8.3.3.txt[1.8.3.3],
+  link:RelNotes/1.8.3.2.txt[1.8.3.2],
+  link:RelNotes/1.8.3.1.txt[1.8.3.1],
+  link:RelNotes/1.8.3.txt[1.8.3].
+
 * link:v1.8.2.3/git.html[documentation for release 1.8.2.3]
 
 * release notes for
@@ -677,9 +685,7 @@ Git so take care if using Cogito etc.
        The '--git-dir' command-line option also sets this value.
 
 'GIT_WORK_TREE'::
-       Set the path to the working tree.  The value will not be
-       used in combination with repositories found automatically in
-       a .git directory (i.e. $GIT_DIR is not set).
+       Set the path to the root of the working tree.
        This can also be controlled by the '--work-tree' command line
        option and the core.worktree configuration variable.
 
index 568d75783ae28576087e30e170aa6400a3017c44..c8b3e51c84a58d6f9e4a0ba324f9071cc125881f 100644 (file)
@@ -222,26 +222,35 @@ version prefixed with '+'.
 diffcore-pickaxe: For Detecting Addition/Deletion of Specified String
 ---------------------------------------------------------------------
 
-This transformation is used to find filepairs that represent
-changes that touch a specified string, and is controlled by the
--S option and the `--pickaxe-all` option to the 'git diff-*'
-commands.
-
-When diffcore-pickaxe is in use, it checks if there are
-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
-only such filepairs that touch the specified string in its
-output.  When `--pickaxe-all` is used, diffcore-pickaxe leaves all
-filepairs intact if there is such a filepair, or makes the
-output empty otherwise.  The latter behaviour is designed to
-make reviewing of the changes in the context of the whole
+This transformation limits the set of filepairs to those that change
+specified strings between the preimage and the postimage in a certain
+way.  -S<block of text> and -G<regular expression> options are used to
+specify different ways these strings are sought.
+
+"-S<block of text>" detects filepairs whose preimage and postimage
+have different number of occurrences of the specified block of text.
+By definition, it will not detect in-file moves.  Also, when a
+changeset moves a file wholesale without affecting the interesting
+string, diffcore-rename kicks in as usual, and `-S` omits the filepair
+(since the number of occurrences of that string didn't change in that
+rename-detected filepair).  When used with `--pickaxe-regex`, treat
+the <block of text> as an extended POSIX regular expression to match,
+instead of a literal string.
+
+"-G<regular expression>" (mnemonic: grep) detects filepairs whose
+textual diff has an added or a deleted line that matches the given
+regular expression.  This means that it will detect in-file (or what
+rename-detection considers the same file) moves, which is noise.  The
+implementation runs diff twice and greps, and this can be quite
+expensive.
+
+When `-S` or `-G` are used without `--pickaxe-all`, only filepairs
+that match their respective criterion are kept in the output.  When
+`--pickaxe-all` is used, if even one filepair matches their respective
+criterion in a changeset, the entire changeset is kept.  This behavior
+is designed to make reviewing changes in the context of the whole
 changeset easier.
 
-
 diffcore-order: For Sorting the Output Based on Filenames
 ---------------------------------------------------------
 
index d6f3393c5f5e4e8b564e702a06c632262847ee9d..aa03882ddb119d2e61da50079a72e1a6ab12f636 100644 (file)
@@ -211,6 +211,9 @@ shallow::
        and maintained by shallow clone mechanism.  See `--depth`
        option to linkgit:git-clone[1] and linkgit:git-fetch[1].
 
+modules::
+       Contains the git-repositories of the submodules.
+
 SEE ALSO
 --------
 linkgit:git-init[1],
index 68a18e14975fadb0cba7ba19e45438887a65bd4f..db2a74df934f3acd93521e42510b6cd00c9eed6f 100644 (file)
@@ -400,12 +400,13 @@ should not be combined with other pathspec.
        <<def_ref,ref>> and local ref.
 
 [[def_remote_tracking_branch]]remote-tracking branch::
-       A regular Git <<def_branch,branch>> that is used to follow changes from
-       another <<def_repository,repository>>. A remote-tracking
-       branch should not contain direct modifications or have local commits
-       made to it. A remote-tracking branch can usually be
-       identified as the right-hand-side <<def_ref,ref>> in a Pull:
-       <<def_refspec,refspec>>.
+       A <<def_ref,ref>> that is used to follow changes from another
+       <<def_repository,repository>>. It typically looks like
+       'refs/remotes/foo/bar' (indicating that it tracks a branch named
+       'bar' in a remote named 'foo'), and matches the right-hand-side of
+       a configured fetch <<def_refspec,refspec>>. A remote-tracking
+       branch should not contain direct modifications or have local
+       commits made to it.
 
 [[def_repository]]repository::
        A collection of <<def_ref,refs>> together with an
index 2adccf8fec71c10f8223490f1be4b2a215ace5ea..afba8d4f3b2dcc952310c270daf26e01f8b30800 100644 (file)
@@ -8,12 +8,13 @@ failed and do not autocommit, to give the user a chance to
 inspect and further tweak the merge result before committing.
 
 --edit::
+-e::
 --no-edit::
        Invoke an editor before committing successful mechanical merge to
        further edit the auto-generated merge message, so that the user
        can explain and justify the merge. The `--no-edit` option can be
        used to accept the auto-generated message (this is generally
-       discouraged). The `--edit` option is still useful if you are
+       discouraged). The `--edit` (or `-e`) option is still useful if you are
        giving a draft message with the `-m` option from the command line
        and want to edit it in the editor.
 +
index f1a51edf47f94f45ce916f7800924e6f135800e2..b898e97988311fe411c02f9f3fe45608e862a71a 100644 (file)
@@ -228,8 +228,7 @@ obtained through ref discovery.
 The client MUST write all obj-ids which it only has shallow copies
 of (meaning that it does not have the parents of a commit) as
 'shallow' lines so that the server is aware of the limitations of
-the client's history. Clients MUST NOT mention an obj-id which
-it does not know exists on the server.
+the client's history.
 
 The client now sends the maximum commit history depth it wants for
 this transaction, which is the number of commits it wants from the
index 3ca122faedd01cfbd61bf07dbc245b04f40f2b23..60ba30011773804a04d5236a4917382615120cfe 100644 (file)
@@ -33,7 +33,7 @@ For local repositories, also supported by Git natively, the following
 syntaxes may be used:
 
 - /path/to/repo.git/
-- file:///path/to/repo.git/
+- \file:///path/to/repo.git/
 
 ifndef::git-clone[]
 These two syntaxes are mostly equivalent, except when cloning, when
index d44408d0cf603c879b2d7fa05d2362ee27f23c67..8ddaa16ac1ee8936cde50a75e30905c62d0709d7 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.8.3-rc2
+DEF_VER=v1.8.3.3
 
 LF='
 '
index 6f9d1c7c0f0d0ce99742cf6a7ecd2b9dc929d430..14a38cc42216c5347287d4338a53092bcd8271c6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -69,6 +69,9 @@ all::
 # Define NO_MSGFMT_EXTENDED_OPTIONS if your implementation of msgfmt
 # doesn't support GNU extensions like --check and --statistics
 #
+# Define NEEDS_CLIPPED_WRITE if your write(2) cannot write more than
+# INT_MAX bytes at once (e.g. MacOS X).
+#
 # Define HAVE_PATHS_H if you have paths.h and want to use the default PATH
 # it specifies.
 #
@@ -137,6 +140,10 @@ all::
 # specify your own (or DarwinPort's) include directories and
 # library directories by defining CFLAGS and LDFLAGS appropriately.
 #
+# Define NO_APPLE_COMMON_CRYPTO if you are building on Darwin/Mac OS X
+# and do not want to use Apple's CommonCrypto library.  This allows you
+# to provide your own OpenSSL library, for example from MacPorts.
+#
 # Define BLK_SHA1 environment variable to make use of the bundled
 # optimized C SHA1 routine.
 #
@@ -1054,6 +1061,11 @@ ifeq ($(uname_S),Darwin)
                        BASIC_LDFLAGS += -L/opt/local/lib
                endif
        endif
+       ifndef NO_APPLE_COMMON_CRYPTO
+               APPLE_COMMON_CRYPTO = YesPlease
+               COMPAT_CFLAGS += -DAPPLE_COMMON_CRYPTO
+       endif
+       NO_REGEX = YesPlease
        PTHREAD_LIBS =
 endif
 
@@ -1387,11 +1399,17 @@ ifdef PPC_SHA1
        SHA1_HEADER = "ppc/sha1.h"
        LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o
        LIB_H += ppc/sha1.h
+else
+ifdef APPLE_COMMON_CRYPTO
+       COMPAT_CFLAGS += -DCOMMON_DIGEST_FOR_OPENSSL
+       SHA1_HEADER = <CommonCrypto/CommonDigest.h>
 else
        SHA1_HEADER = <openssl/sha.h>
        EXTLIBS += $(LIB_4_CRYPTO)
 endif
 endif
+endif
+
 ifdef NO_PERL_MAKEMAKER
        export NO_PERL_MAKEMAKER
 endif
@@ -1466,6 +1484,11 @@ ifndef NO_MSGFMT_EXTENDED_OPTIONS
        MSGFMT += --check --statistics
 endif
 
+ifdef NEEDS_CLIPPED_WRITE
+       BASIC_CFLAGS += -DNEEDS_CLIPPED_WRITE
+       COMPAT_OBJS += compat/clipped-write.o
+endif
+
 ifneq (,$(XDL_FAST_HASH))
        BASIC_CFLAGS += -DXDL_FAST_HASH
 endif
@@ -2262,9 +2285,6 @@ check: common-cmds.h
                exit 1; \
        fi
 
-remove-dashes:
-       ./fixup-builtins $(BUILT_INS) $(PROGRAMS) $(SCRIPTS)
-
 ### Installation rules
 
 ifneq ($(filter /%,$(firstword $(template_dir))),)
index 80b7e388ad321ea679e2b14ce4f18972da35156c..a5201213ac9907a441253399dc1021859f92bf5d 120000 (symlink)
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/1.8.3.txt
\ No newline at end of file
+Documentation/RelNotes/1.8.3.3.txt
\ No newline at end of file
index 97c72bfe7043701132a2710bf03c5ce3ee109ba5..c5c6984cb5266c27d3c13aa6e6aacaab56e112c0 100644 (file)
--- a/branch.c
+++ b/branch.c
@@ -197,6 +197,21 @@ int validate_new_branchname(const char *name, struct strbuf *ref,
        return 1;
 }
 
+static int check_tracking_branch(struct remote *remote, void *cb_data)
+{
+       char *tracking_branch = cb_data;
+       struct refspec query;
+       memset(&query, 0, sizeof(struct refspec));
+       query.dst = tracking_branch;
+       return !(remote_find_tracking(remote, &query) ||
+                prefixcmp(query.src, "refs/heads/"));
+}
+
+static int validate_remote_tracking_branch(char *ref)
+{
+       return !for_each_remote(check_tracking_branch, ref);
+}
+
 static const char upstream_not_branch[] =
 N_("Cannot setup tracking information; starting point '%s' is not a branch.");
 static const char upstream_missing[] =
@@ -259,7 +274,7 @@ void create_branch(const char *head,
        case 1:
                /* Unique completion -- good, only if it is a real branch */
                if (prefixcmp(real_ref, "refs/heads/") &&
-                   prefixcmp(real_ref, "refs/remotes/")) {
+                   validate_remote_tracking_branch(real_ref)) {
                        if (explicit_tracking)
                                die(_(upstream_not_branch), start_name);
                        else
index 30eefc3c7b390800e9452a06da18208d2fef4f11..3979f8bf3de8bc82b1d546f063728094d6ac974b 100644 (file)
@@ -906,7 +906,7 @@ static void parse_traditional_patch(const char *first, const char *second, struc
                        patch->old_name = name;
                } else {
                        patch->old_name = name;
-                       patch->new_name = xstrdup(name);
+                       patch->new_name = null_strdup(name);
                }
        }
        if (!name)
index 81b4419da51f3211129833a472048d897385bca4..f5b50e520feb42c50cd1783871eb63d009e0a0e0 100644 (file)
@@ -825,38 +825,40 @@ static int git_checkout_config(const char *var, const char *value, void *cb)
 }
 
 struct tracking_name_data {
-       const char *name;
-       char *remote;
+       /* const */ char *src_ref;
+       char *dst_ref;
+       unsigned char *dst_sha1;
        int unique;
 };
 
-static int check_tracking_name(const char *refname, const unsigned char *sha1,
-                              int flags, void *cb_data)
+static int check_tracking_name(struct remote *remote, void *cb_data)
 {
        struct tracking_name_data *cb = cb_data;
-       const char *slash;
-
-       if (prefixcmp(refname, "refs/remotes/"))
-               return 0;
-       slash = strchr(refname + 13, '/');
-       if (!slash || strcmp(slash + 1, cb->name))
+       struct refspec query;
+       memset(&query, 0, sizeof(struct refspec));
+       query.src = cb->src_ref;
+       if (remote_find_tracking(remote, &query) ||
+           get_sha1(query.dst, cb->dst_sha1))
                return 0;
-       if (cb->remote) {
+       if (cb->dst_ref) {
                cb->unique = 0;
                return 0;
        }
-       cb->remote = xstrdup(refname);
+       cb->dst_ref = xstrdup(query.dst);
        return 0;
 }
 
-static const char *unique_tracking_name(const char *name)
+static const char *unique_tracking_name(const char *name, unsigned char *sha1)
 {
-       struct tracking_name_data cb_data = { NULL, NULL, 1 };
-       cb_data.name = name;
-       for_each_ref(check_tracking_name, &cb_data);
+       struct tracking_name_data cb_data = { NULL, NULL, NULL, 1 };
+       char src_ref[PATH_MAX];
+       snprintf(src_ref, PATH_MAX, "refs/heads/%s", name);
+       cb_data.src_ref = src_ref;
+       cb_data.dst_sha1 = sha1;
+       for_each_remote(check_tracking_name, &cb_data);
        if (cb_data.unique)
-               return cb_data.remote;
-       free(cb_data.remote);
+               return cb_data.dst_ref;
+       free(cb_data.dst_ref);
        return NULL;
 }
 
@@ -919,8 +921,8 @@ static int parse_branchname_arg(int argc, const char **argv,
                if (dwim_new_local_branch_ok &&
                    !check_filename(NULL, arg) &&
                    argc == 1) {
-                       const char *remote = unique_tracking_name(arg);
-                       if (!remote || get_sha1(remote, rev))
+                       const char *remote = unique_tracking_name(arg, rev);
+                       if (!remote)
                                return argcount;
                        *new_branch = arg;
                        arg = remote;
index 035ab649504d69a83f87b854582c8003a2dcb905..dad426598962b2f1a00158ac7eeb05b7958d68ed 100644 (file)
@@ -546,8 +546,12 @@ static void update_remote_refs(const struct ref *refs,
 {
        const struct ref *rm = mapped_refs;
 
+       if (0 <= option_verbosity)
+               printf(_("Checking connectivity... "));
        if (check_everything_connected(iterate_ref_map, 0, &rm))
                die(_("remote did not send all necessary objects"));
+       if (0 <= option_verbosity)
+               printf(_("done\n"));
 
        if (refs) {
                write_remote_refs(mapped_refs);
index d2f30d960a71e41da88d6cc4201cbdca168b8648..1621dfcd4008fc5853fc078a32bf9eefb6c52023 100644 (file)
@@ -107,7 +107,7 @@ static const char *cleanup_arg;
 
 static enum commit_whence whence;
 static int use_editor = 1, include_status = 1;
-static int show_ignored_in_status;
+static int show_ignored_in_status, have_option_m;
 static const char *only_include_assumed;
 static struct strbuf message = STRBUF_INIT;
 
@@ -121,9 +121,11 @@ static enum {
 static int opt_parse_m(const struct option *opt, const char *arg, int unset)
 {
        struct strbuf *buf = opt->value;
-       if (unset)
+       if (unset) {
+               have_option_m = 0;
                strbuf_setlen(buf, 0);
-       else {
+       } else {
+               have_option_m = 1;
                if (buf->len)
                        strbuf_addch(buf, '\n');
                strbuf_addstr(buf, arg);
@@ -975,7 +977,7 @@ static int parse_and_validate_options(int argc, const char *argv[],
        if (force_author && renew_authorship)
                die(_("Using both --reset-author and --author does not make sense"));
 
-       if (logfile || message.len || use_message || fixup_message)
+       if (logfile || have_option_m || use_message || fixup_message)
                use_editor = 0;
        if (0 <= edit_flag)
                use_editor = edit_flag;
index 33c9bf9d84f514330f12de5cbd9dfb610a1b16de..19ffcaf18776e8b100ee3f57c7ca7447436c5476 100644 (file)
@@ -379,8 +379,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                         */
                        die("$HOME not set");
 
-               if (access_or_warn(user_config, R_OK) &&
-                   xdg_config && !access_or_warn(xdg_config, R_OK))
+               if (access_or_warn(user_config, R_OK, 0) &&
+                   xdg_config && !access_or_warn(xdg_config, R_OK, 0))
                        given_config_file = xdg_config;
                else
                        given_config_file = user_config;
index 3e2daa37c367560450217cfae5cbb717bfb508af..2ebe732896c1b3bfd920941b5182b793468c0afe 100644 (file)
@@ -1054,7 +1054,8 @@ static struct commit_list *collect_parents(struct commit *head_commit,
        for (i = 0; i < argc; i++) {
                struct commit *commit = get_merge_parent(argv[i]);
                if (!commit)
-                       die(_("%s - not something we can merge"), argv[i]);
+                       help_unknown_ref(argv[i], "merge",
+                                        "not something we can merge");
                remotes = &commit_list_insert(commit, remotes)->next;
        }
        *remotes = NULL;
index 909c34dfda984be86fba2013fedc3fdb10b5e2f1..2d84d10720fad88becdfe957f3770a2c44ac0a8f 100644 (file)
@@ -113,17 +113,19 @@ static NORETURN int die_push_simple(struct branch *branch, struct remote *remote
            remote->name, branch->name, advice_maybe);
 }
 
+static const char message_detached_head_die[] =
+       N_("You are not currently on a branch.\n"
+          "To push the history leading to the current (detached HEAD)\n"
+          "state now, use\n"
+          "\n"
+          "    git push %s HEAD:<name-of-remote-branch>\n");
+
 static void setup_push_upstream(struct remote *remote, int simple)
 {
        struct strbuf refspec = STRBUF_INIT;
        struct branch *branch = branch_get(NULL);
        if (!branch)
-               die(_("You are not currently on a branch.\n"
-                   "To push the history leading to the current (detached HEAD)\n"
-                   "state now, use\n"
-                   "\n"
-                   "    git push %s HEAD:<name-of-remote-branch>\n"),
-                   remote->name);
+               die(_(message_detached_head_die), remote->name);
        if (!branch->merge_nr || !branch->merge || !branch->remote_name)
                die(_("The current branch %s has no upstream branch.\n"
                    "To push the current branch and set the remote as upstream, use\n"
@@ -173,6 +175,8 @@ static void warn_unspecified_push_default_configuration(void)
 
 static void setup_default_push_refspecs(struct remote *remote)
 {
+       struct branch *branch;
+
        switch (push_default) {
        default:
        case PUSH_DEFAULT_UNSPECIFIED:
@@ -192,7 +196,10 @@ static void setup_default_push_refspecs(struct remote *remote)
                break;
 
        case PUSH_DEFAULT_CURRENT:
-               add_refspec("HEAD");
+               branch = branch_get(NULL);
+               if (!branch)
+                       die(_(message_detached_head_die), remote->name);
+               add_refspec(branch->name);
                break;
 
        case PUSH_DEFAULT_NOTHING:
index 77d7872aafe659045e9ec228de97e87c9cea00a1..6dc06093d3c1eb6f3ab7a9cc79f0f192e16dc617 100644 (file)
@@ -518,8 +518,11 @@ static int give_context(struct sline *sline, unsigned long cnt, int num_parent)
                unsigned long k;
 
                /* Paint a few lines before the first interesting line. */
-               while (j < i)
-                       sline[j++].flag |= mark | no_pre_delete;
+               while (j < i) {
+                       if (!(sline[j].flag & mark))
+                               sline[j].flag |= no_pre_delete;
+                       sline[j++].flag |= mark;
+               }
 
        again:
                /* we know up to i is to be included.  where does the
@@ -1302,6 +1305,7 @@ void diff_tree_combined(const unsigned char *sha1,
        int i, num_paths, needsep, show_log_first, num_parent = parents->nr;
 
        diffopts = *opt;
+       diff_tree_setup_paths(diffopts.pathspec.raw, &diffopts);
        diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
        DIFF_OPT_SET(&diffopts, RECURSIVE);
        DIFF_OPT_CLR(&diffopts, ALLOW_EXTERNAL);
@@ -1372,6 +1376,8 @@ void diff_tree_combined(const unsigned char *sha1,
                paths = paths->next;
                free(tmp);
        }
+
+       diff_tree_release_paths(&diffopts);
 }
 
 void diff_tree_combined_merge(const struct commit *commit, int dense,
index 67bd5091be0b34bfea075cd60281d22cf5b34768..6e9c7cd9d5da7d24d4810b36039681f184325932 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -176,6 +176,8 @@ extern int for_each_commit_graft(each_commit_graft_fn, void *);
 extern int is_repository_shallow(void);
 extern struct commit_list *get_shallow_commits(struct object_array *heads,
                int depth, int shallow_flag, int not_shallow_flag);
+extern void check_shallow_file_for_update(void);
+extern void set_alternate_shallow_file(const char *path);
 
 int is_descendant_of(struct commit *, struct commit_list *);
 int in_merge_bases(struct commit *, struct commit *);
diff --git a/compat/clipped-write.c b/compat/clipped-write.c
new file mode 100644 (file)
index 0000000..b8f98ff
--- /dev/null
@@ -0,0 +1,13 @@
+#include "../git-compat-util.h"
+#undef write
+
+/*
+ * Version of write that will write at most INT_MAX bytes.
+ * Workaround a xnu bug on Mac OS X
+ */
+ssize_t clipped_write(int fildes, const void *buf, size_t nbyte)
+{
+       if (nbyte > INT_MAX)
+               nbyte = INT_MAX;
+       return write(fildes, buf, nbyte);
+}
index b67362558046f354b167fe185369b3d2b98879c1..dae30a081c03b28aa7b89489ffd01b6ce24e8070 100644 (file)
@@ -1677,14 +1677,16 @@ int sigaction(int sig, struct sigaction *in, struct sigaction *out)
 #undef signal
 sig_handler_t mingw_signal(int sig, sig_handler_t handler)
 {
-       sig_handler_t old = timer_fn;
+       sig_handler_t old;
 
        switch (sig) {
        case SIGALRM:
+               old = timer_fn;
                timer_fn = handler;
                break;
 
        case SIGINT:
+               old = sigint_fn;
                sigint_fn = handler;
                break;
 
index aefd80b12a079d4a3c91d43c8a2c33ed6fbd0a38..7a85ebdbae79cf13305ebc821fafcd21a67c16d4 100644 (file)
--- a/config.c
+++ b/config.c
@@ -58,7 +58,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc
                path = buf.buf;
        }
 
-       if (!access_or_die(path, R_OK)) {
+       if (!access_or_die(path, R_OK, 0)) {
                if (++inc->depth > MAX_INCLUDE_DEPTH)
                        die(include_depth_advice, MAX_INCLUDE_DEPTH, path,
                            cf && cf->name ? cf->name : "the command line");
@@ -566,7 +566,20 @@ static int git_default_core_config(const char *var, const char *value)
                trust_ctime = git_config_bool(var, value);
                return 0;
        }
-       if (!strcmp(var, "core.statinfo")) {
+       if (!strcmp(var, "core.statinfo") ||
+           !strcmp(var, "core.checkstat")) {
+               /*
+                * NEEDSWORK: statinfo was a typo in v1.8.2 that has
+                * never been advertised.  we will remove it at Git
+                * 2.0 boundary.
+                */
+               if (!strcmp(var, "core.statinfo")) {
+                       static int warned;
+                       if (!warned++) {
+                               warning("'core.statinfo' will be removed in Git 2.0; "
+                                       "use 'core.checkstat' instead.");
+                       }
+               }
                if (!strcasecmp(value, "default"))
                        check_stat = 1;
                else if (!strcasecmp(value, "minimal"))
@@ -954,23 +967,23 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
 
        home_config_paths(&user_config, &xdg_config, "config");
 
-       if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK)) {
+       if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
                ret += git_config_from_file(fn, git_etc_gitconfig(),
                                            data);
                found += 1;
        }
 
-       if (xdg_config && !access_or_die(xdg_config, R_OK)) {
+       if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) {
                ret += git_config_from_file(fn, xdg_config, data);
                found += 1;
        }
 
-       if (user_config && !access_or_die(user_config, R_OK)) {
+       if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) {
                ret += git_config_from_file(fn, user_config, data);
                found += 1;
        }
 
-       if (repo_config && !access_or_die(repo_config, R_OK)) {
+       if (repo_config && !access_or_die(repo_config, R_OK, 0)) {
                ret += git_config_from_file(fn, repo_config, data);
                found += 1;
        }
index d78fd3df5b211130ba8ff77197a3f852c32aab86..174703b67cc75fc48fd3bf5345468e9eeca89fc2 100644 (file)
@@ -95,6 +95,7 @@ ifeq ($(uname_S),Darwin)
        NO_MEMMEM = YesPlease
        USE_ST_TIMESPEC = YesPlease
        HAVE_DEV_TTY = YesPlease
+       NEEDS_CLIPPED_WRITE = YesPlease
        COMPAT_OBJS += compat/precompose_utf8.o
        BASIC_CFLAGS += -DPRECOMPOSE_UNICODE
 endif
index f3462d9c81f12ea07229128f6bef7a4ff3fcfe10..2f433939dc9d9001c7ace83bfeadf567eb90c30c 100644 (file)
@@ -193,7 +193,7 @@ AC_ARG_ENABLE([pthreads],
   [FLAGS is the value to pass to the compiler to enable POSIX Threads.]
   [The default if FLAGS is not specified is to try first -pthread]
   [and then -lpthread.]
-  [--without-pthreads will disable threading.])],
+  [--disable-pthreads will disable threading.])],
 [
 if test "x$enableval" = "xyes"; then
    AC_MSG_NOTICE([Will try -pthread then -lpthread to enable POSIX Threads])
index a98c2fd2de4dbd7ed659daee9303389be91bf8ac..ecf58e032873d8619158af907118969a2cdd3746 100644 (file)
@@ -1246,7 +1246,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary
                        --no-prefix --src-prefix= --dst-prefix=
                        --inter-hunk-context=
                        --patience --histogram --minimal
-                       --raw
+                       --raw --word-diff
                        --dirstat --dirstat= --dirstat-by-file
                        --dirstat-by-file= --cumulative
                        --diff-algorithm=
@@ -1831,7 +1831,7 @@ _git_config ()
                local remote="${prev#remote.}"
                remote="${remote%.fetch}"
                if [ -z "$cur" ]; then
-                       __gitcompadd "refs/heads/" "" "" ""
+                       __gitcomp_nl "refs/heads/" "" "" ""
                        return
                fi
                __gitcomp_nl "$(__git_refs_remotes "$remote")"
index eaf5c369aacde207cbad4c9df9574e7b26634bb7..54e48299ae795b7a3a50cf09f850faa16b87e692 100644 (file)
@@ -124,7 +124,7 @@ __git_ps1_show_upstream ()
                        fi
                        ;;
                svn-remote.*.url)
-                       svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
+                       svn_remote[$((${#svn_remote[@]} + 1))]="$value"
                        svn_url_pattern+="\\|$value"
                        upstream=svn+git # default upstream is SVN if available, else git
                        ;;
@@ -146,10 +146,11 @@ __git_ps1_show_upstream ()
        svn*)
                # get the upstream from the "git-svn-id: ..." in a commit message
                # (git-svn uses essentially the same procedure internally)
-               local svn_upstream=($(git log --first-parent -1 \
+               local -a svn_upstream
+               svn_upstream=($(git log --first-parent -1 \
                                        --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
                if [[ 0 -ne ${#svn_upstream[@]} ]]; then
-                       svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
+                       svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
                        svn_upstream=${svn_upstream%@*}
                        local n_stop="${#svn_remote[@]}"
                        for ((n=1; n <= n_stop; n++)); do
@@ -279,6 +280,7 @@ __git_ps1 ()
                                step=$(cat "$g/rebase-apply/next")
                                total=$(cat "$g/rebase-apply/last")
                                if [ -f "$g/rebase-apply/rebasing" ]; then
+                                       b="$(cat "$g/rebase-apply/head-name")"
                                        r="|REBASE"
                                elif [ -f "$g/rebase-apply/applying" ]; then
                                        r="|AM"
@@ -295,6 +297,7 @@ __git_ps1 ()
                                r="|BISECTING"
                        fi
 
+                       test -n "$b" ||
                        b="$(git symbolic-ref HEAD 2>/dev/null)" || {
                                detached=yes
                                b="$(
index 3e452af1dc1e3a2c6f67d10c1cea403709564671..10300c63d1a71aecd0f8d2273d276f36773e6b1e 100755 (executable)
@@ -31,6 +31,7 @@ import bzrlib.transport
 import bzrlib.errors
 import bzrlib.ui
 import bzrlib.urlutils
+import bzrlib.branch
 
 import sys
 import os
@@ -788,7 +789,7 @@ def get_remote_branch(origin, remote_branch, name):
     return branch
 
 def find_branches(repo, wanted):
-    transport = repo.user_transport
+    transport = repo.bzrdir.root_transport
 
     for fn in transport.iter_files_recursive():
         if not fn.endswith('.bzr/branch-format'):
@@ -830,9 +831,21 @@ def get_repo(url, alias):
         clone_path = os.path.join(dirname, 'clone')
         if not os.path.exists(clone_path):
             os.mkdir(clone_path)
+        else:
+            # check and remove old organization
+            try:
+                bdir = bzrlib.bzrdir.BzrDir.open(clone_path)
+                bdir.destroy_repository()
+            except bzrlib.errors.NotBranchError:
+                pass
+            except bzrlib.errors.NoRepositoryPresent:
+                pass
 
     try:
         repo = origin.open_repository()
+        if not repo.user_transport.listable():
+            # this repository is not usable for us
+            raise bzrlib.errors.NoRepositoryPresent(repo.bzrdir)
     except bzrlib.errors.NoRepositoryPresent:
         # branch
 
@@ -912,7 +925,8 @@ def main(args):
     if not os.path.exists(dirname):
         os.makedirs(dirname)
 
-    bzrlib.ui.ui_factory.be_quiet(True)
+    if hasattr(bzrlib.ui.ui_factory, 'be_quiet'):
+        bzrlib.ui.ui_factory.be_quiet(True)
 
     repo = get_repo(url, alias)
 
index 96ad30d5126702629841e9bc16abfbf07fbe9546..1dd3d7030efa7e6a3e25a45d019938e2d8f8d890 100755 (executable)
@@ -24,9 +24,6 @@ import urllib
 import atexit
 import urlparse, hashlib
 
-#
-# If you want to switch to hg-git compatibility mode:
-# git config --global remote-hg.hg-git-compat true
 #
 # If you are not in hg-git-compat mode and want to disable the tracking of
 # named branches:
@@ -36,7 +33,10 @@ import urlparse, hashlib
 # git config --global remote-hg.force-push false
 #
 # If you want the equivalent of hg's clone/pull--insecure option:
-# git config remote-hg.insecure true
+# git config --global remote-hg.insecure true
+#
+# If you want to switch to hg-git compatibility mode:
+# git config --global remote-hg.hg-git-compat true
 #
 # git:
 # Sensible defaults for git.
@@ -87,6 +87,15 @@ def get_config(config):
     output, _ = process.communicate()
     return output
 
+def get_config_bool(config, default=False):
+    value = get_config(config).rstrip('\n')
+    if value == "true":
+        return True
+    elif value == "false":
+        return False
+    else:
+        return default
+
 class Marks:
 
     def __init__(self, path):
@@ -327,11 +336,8 @@ def get_repo(url, alias):
     myui.setconfig('ui', 'interactive', 'off')
     myui.fout = sys.stderr
 
-    try:
-        if get_config('remote-hg.insecure') == 'true\n':
-            myui.setconfig('web', 'cacerts', '')
-    except subprocess.CalledProcessError:
-        pass
+    if get_config_bool('remote-hg.insecure'):
+        myui.setconfig('web', 'cacerts', '')
 
     try:
         mod = extensions.load(myui, 'hgext.schemes', None)
@@ -538,7 +544,7 @@ def list_head(repo, cur):
     g_head = (head, node)
 
 def do_list(parser):
-    global branches, bmarks, mode, track_branches
+    global branches, bmarks, track_branches
 
     repo = parser.repo
     for bmark, node in bookmarks.listbookmarks(repo).iteritems():
@@ -850,7 +856,7 @@ def do_export(parser):
             continue
 
     if peer:
-        parser.repo.push(peer, force=force_push)
+        parser.repo.push(peer, force=force_push, newbranch=True)
 
     # handle bookmarks
     for bmark, node in p_bmarks:
@@ -867,7 +873,8 @@ def do_export(parser):
 
         if bmark == 'master' and 'master' not in parser.repo._bookmarks:
             # fake bookmark
-            pass
+            print "ok %s" % ref
+            continue
         elif bookmarks.pushbookmark(parser.repo, bmark, old, new):
             # updated locally
             pass
@@ -906,20 +913,9 @@ def main(args):
     url = args[2]
     peer = None
 
-    hg_git_compat = False
-    track_branches = True
-    force_push = True
-
-    try:
-        if get_config('remote-hg.hg-git-compat') == 'true\n':
-            hg_git_compat = True
-            track_branches = False
-        if get_config('remote-hg.track-branches') == 'false\n':
-            track_branches = False
-        if get_config('remote-hg.force-push') == 'false\n':
-            force_push = False
-    except subprocess.CalledProcessError:
-        pass
+    hg_git_compat = get_config_bool('remote-hg.hg-git-compat')
+    track_branches = get_config_bool('remote-hg.track-branches', True)
+    force_push = get_config_bool('remote-hg.force-push')
 
     if hg_git_compat:
         mode = 'hg'
@@ -958,6 +954,10 @@ def main(args):
     marks_path = os.path.join(dirname, 'marks-hg')
     marks = Marks(marks_path)
 
+    if sys.platform == 'win32':
+        import msvcrt
+        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+
     parser = Parser(repo)
     for line in parser:
         if parser.check('capabilities'):
index 84403415f87d9126ab090e8264a8053a7fbfe47a..7f579c843680897ce065bca92fe60fd29aff23b2 100755 (executable)
@@ -102,6 +102,7 @@ setup () {
        ) >> "$HOME"/.hgrc &&
        git config --global receive.denycurrentbranch warn
        git config --global remote-hg.hg-git-compat true
+       git config --global remote-hg.track-branches false
 
        HGEDITOR=/usr/bin/true
 
@@ -455,8 +456,6 @@ test_expect_success 'hg author' '
                git_log gitrepo-$x > git-log-$x
        done &&
 
-       test_cmp git-log-hg git-log-git &&
-
        test_cmp hg-log-hg hg-log-git &&
        test_cmp git-log-hg git-log-git
 '
index 8a23f58ba04c4b1402c66d03db69d0c109c90b58..51ae932e5edc54db32fca93e8f6f8aca1bea32f4 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 #
 # git-subtree.sh: split/join git repositories in subdirectories of this one
 #
@@ -715,7 +715,8 @@ cmd_push()
            repository=$1
            refspec=$2
            echo "git push using: " $repository $refspec
-           git push $repository $(git subtree split --prefix=$prefix):refs/heads/$refspec
+           localrev=$(git subtree split --prefix="$prefix") || die
+           git push $repository $localrev:refs/heads/$refspec
        else
            die "'$dir' must already exist. Try 'git subtree add'."
        fi
index 63722f86dca4c00389d6f305fd8aa1af8ef8ed6c..c97ac9b463fc1248b2dfe70d5fdf1dc1679e2bf8 100644 (file)
@@ -122,7 +122,7 @@ static void diffcore_pickaxe_grep(struct diff_options *o)
                char errbuf[1024];
                regerror(err, &regex, errbuf, 1024);
                regfree(&regex);
-               die("invalid log-grep regex: %s", errbuf);
+               die("invalid regex: %s", errbuf);
        }
 
        pickaxe(&diff_queued_diff, o, &regex, NULL, diff_grep);
@@ -246,7 +246,7 @@ static void diffcore_pickaxe_count(struct diff_options *o)
                        char errbuf[1024];
                        regerror(err, &regex, errbuf, 1024);
                        regfree(&regex);
-                       die("invalid pickaxe regex: %s", errbuf);
+                       die("invalid regex: %s", errbuf);
                }
                regexp = &regex;
        } else {
diff --git a/dir.c b/dir.c
index a5926fbd1aeafd468860da7dbd3d8a5d5999a650..897c87403e978ab2123ce088cf2d3265e21d7dde 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -821,6 +821,9 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)
                                dir->basebuf, stk->baselen - 1,
                                dir->basebuf + current, &dt);
                        dir->basebuf[stk->baselen - 1] = '/';
+                       if (dir->exclude &&
+                           dir->exclude->flags & EXC_FLAG_NEGATIVE)
+                               dir->exclude = NULL;
                        if (dir->exclude) {
                                dir->basebuf[stk->baselen] = 0;
                                dir->exclude_stack = stk;
@@ -1542,9 +1545,9 @@ void setup_standard_excludes(struct dir_struct *dir)
                home_config_paths(NULL, &xdg_path, "ignore");
                excludes_file = xdg_path;
        }
-       if (!access_or_warn(path, R_OK))
+       if (!access_or_warn(path, R_OK, 0))
                add_excludes_from_file(dir, path);
-       if (excludes_file && !access_or_warn(excludes_file, R_OK))
+       if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
                add_excludes_from_file(dir, excludes_file);
 }
 
index f156dd4fac30cda4e09c508b7091cdb8d96917e2..6b5467c6dec9645f53d83cdad2467a158db622c0 100644 (file)
@@ -20,6 +20,8 @@ static int no_done;
 static int fetch_fsck_objects = -1;
 static int transfer_fsck_objects = -1;
 static int agent_supported;
+static struct lock_file shallow_lock;
+static const char *alternate_shallow_file;
 
 #define COMPLETE       (1U << 0)
 #define COMMON         (1U << 1)
@@ -683,7 +685,7 @@ static int get_pack(struct fetch_pack_args *args,
                    int xd[2], char **pack_lockfile)
 {
        struct async demux;
-       const char *argv[20];
+       const char *argv[22];
        char keep_arg[256];
        char hdr_arg[256];
        const char **av;
@@ -724,6 +726,11 @@ static int get_pack(struct fetch_pack_args *args,
                        do_keep = 1;
        }
 
+       if (alternate_shallow_file) {
+               *av++ = "--shallow-file";
+               *av++ = alternate_shallow_file;
+       }
+
        if (do_keep) {
                if (pack_lockfile)
                        cmd.out = -1;
@@ -779,6 +786,27 @@ static int cmp_ref_by_name(const void *a_, const void *b_)
        return strcmp(a->name, b->name);
 }
 
+static void setup_alternate_shallow(void)
+{
+       struct strbuf sb = STRBUF_INIT;
+       int fd;
+
+       check_shallow_file_for_update();
+       fd = hold_lock_file_for_update(&shallow_lock, git_path("shallow"),
+                                      LOCK_DIE_ON_ERROR);
+       if (write_shallow_commits(&sb, 0)) {
+               if (write_in_full(fd, sb.buf, sb.len) != sb.len)
+                       die_errno("failed to write to %s", shallow_lock.filename);
+               alternate_shallow_file = shallow_lock.filename;
+       } else
+               /*
+                * is_repository_shallow() sees empty string as "no
+                * shallow file".
+                */
+               alternate_shallow_file = "";
+       strbuf_release(&sb);
+}
+
 static struct ref *do_fetch_pack(struct fetch_pack_args *args,
                                 int fd[2],
                                 const struct ref *orig_ref,
@@ -858,6 +886,8 @@ static struct ref *do_fetch_pack(struct fetch_pack_args *args,
 
        if (args->stateless_rpc)
                packet_flush(fd[1]);
+       if (args->depth > 0)
+               setup_alternate_shallow();
        if (get_pack(args, fd, pack_lockfile))
                die("git fetch-pack: fetch failed.");
 
@@ -936,15 +966,9 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
                       struct ref **sought, int nr_sought,
                       char **pack_lockfile)
 {
-       struct stat st;
        struct ref *ref_cpy;
 
        fetch_pack_setup();
-       if (args->depth > 0) {
-               if (stat(git_path("shallow"), &st))
-                       st.st_mtime = 0;
-       }
-
        if (nr_sought)
                nr_sought = remove_duplicates_in_refs(sought, nr_sought);
 
@@ -954,35 +978,12 @@ struct ref *fetch_pack(struct fetch_pack_args *args,
        }
        ref_cpy = do_fetch_pack(args, fd, ref, sought, nr_sought, pack_lockfile);
 
-       if (args->depth > 0) {
-               static struct lock_file lock;
-               struct cache_time mtime;
-               struct strbuf sb = STRBUF_INIT;
-               char *shallow = git_path("shallow");
-               int fd;
-
-               mtime.sec = st.st_mtime;
-               mtime.nsec = ST_MTIME_NSEC(st);
-               if (stat(shallow, &st)) {
-                       if (mtime.sec)
-                               die("shallow file was removed during fetch");
-               } else if (st.st_mtime != mtime.sec
-#ifdef USE_NSEC
-                               || ST_MTIME_NSEC(st) != mtime.nsec
-#endif
-                         )
-                       die("shallow file was changed during fetch");
-
-               fd = hold_lock_file_for_update(&lock, shallow,
-                                              LOCK_DIE_ON_ERROR);
-               if (!write_shallow_commits(&sb, 0)
-                || write_in_full(fd, sb.buf, sb.len) != sb.len) {
-                       unlink_or_warn(shallow);
-                       rollback_lock_file(&lock);
-               } else {
-                       commit_lock_file(&lock);
-               }
-               strbuf_release(&sb);
+       if (alternate_shallow_file) {
+               if (*alternate_shallow_file == '\0') { /* --unshallow */
+                       unlink_or_warn(git_path("shallow"));
+                       rollback_lock_file(&shallow_lock);
+               } else
+                       commit_lock_file(&shallow_lock);
        }
 
        reprepare_packed_git();
diff --git a/fixup-builtins b/fixup-builtins
deleted file mode 100755 (executable)
index 63dfa4c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-while [ "$1" ]
-do
-       if [ "$1" != "git-sh-setup" -a "$1" != "git-parse-remote" -a "$1" != "git-svn" ]; then
-               old="$1"
-               new=$(echo "$1" | sed 's/git-/git /')
-               echo "Converting '$old' to '$new'"
-               sed -i "s/\\<$old\\>/$new/g" $(git ls-files '*.sh')
-       fi
-       shift
-done
-
-sed -i 's/git merge-one-file/git-merge-one-file/g
-s/git rebase-todo/git-rebase-todo/g' $(git ls-files '*.sh')
-git update-index --refresh >& /dev/null
-exit 0
index e955bb5e8b3101cc8c753cf541beabf5cd037b39..660b7f012ac8a94a25da818c0ec6667ff3378add 100644 (file)
@@ -185,6 +185,11 @@ int get_st_mode_bits(const char *path, int *mode);
 #define probe_utf8_pathname_composition(a,b)
 #endif
 
+#ifdef NEEDS_CLIPPED_WRITE
+ssize_t clipped_write(int fildes, const void *buf, size_t nbyte);
+#define write(x,y,z) clipped_write((x),(y),(z))
+#endif
+
 #ifdef MKDIR_WO_TRAILING_SLASH
 #define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b))
 extern int compat_mkdir_wo_trailing_slash(const char*, mode_t);
@@ -692,8 +697,9 @@ int remove_or_warn(unsigned int mode, const char *path);
  * Call access(2), but warn for any error except "missing file"
  * (ENOENT or ENOTDIR).
  */
-int access_or_warn(const char *path, int mode);
-int access_or_die(const char *path, int mode);
+#define ACCESS_EACCES_OK (1U << 0)
+int access_or_warn(const char *path, int mode, unsigned flag);
+int access_or_die(const char *path, int mode, unsigned flag);
 
 /* Warn on an inaccessible file that ought to be accessible */
 void warn_on_inaccessible(const char *path);
index 67802922ccc41fa2993c1bce4ea1a3d2899c7a40..e57d3d1295a5ba0a9c02c19df512c909a0631baa 100755 (executable)
@@ -85,11 +85,13 @@ sub exit_cleanup
 
 sub use_wt_file
 {
-       my ($repo, $workdir, $file, $sha1, $symlinks) = @_;
+       my ($repo, $workdir, $file, $sha1) = @_;
        my $null_sha1 = '0' x 40;
 
-       if ($sha1 ne $null_sha1 and not $symlinks) {
-               return 0;
+       if (! -e "$workdir/$file") {
+               # If the file doesn't exist in the working tree, we cannot
+               # use it.
+               return (0, $null_sha1);
        }
 
        my $wt_sha1 = $repo->command_oneline('hash-object', "$workdir/$file");
@@ -207,8 +209,7 @@ sub setup_dir_diff
 
                if ($rmode ne $null_mode) {
                        my ($use, $wt_sha1) = use_wt_file($repo, $workdir,
-                                                         $dst_path, $rsha1,
-                                                         $symlinks);
+                                                         $dst_path, $rsha1);
                        if ($use) {
                                push @working_tree, $dst_path;
                                $wtindex .= "$rmode $wt_sha1\t$dst_path\0";
index 638aabb7b347e2afeb9bf327902de9e3702cd9d4..6828e2c7157fd80905e864b475c11ccc7a330e03 100755 (executable)
@@ -266,10 +266,17 @@ case "$merge_head" in
        ;;
 esac
 
+# Pulling into unborn branch: a shorthand for branching off
+# FETCH_HEAD, for lazy typers.
 if test -z "$orig_head"
 then
-       git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
-       git read-tree -m -u HEAD || exit 1
+       # Two-way merge: we claim the index is based on an empty tree,
+       # and try to fast-forward to HEAD.  This ensures we will not
+       # lose index/worktree changes that the user already made on
+       # the unborn branch.
+       empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+       git read-tree -m -u $empty_tree $merge_head &&
+       git update-ref -m "initial pull" HEAD $merge_head "$curr_head"
        exit
 fi
 
index bd13cc812d2a0115edcdd2c3ec146665ddfc5e29..cd93490c871be5200b356e6392707be0ff34e9e9 100755 (executable)
@@ -760,6 +760,11 @@ sub file_declares_8bit_cte {
        $sender = $repoauthor || $repocommitter || '';
 }
 
+# $sender could be an already sanitized address
+# (e.g. sendemail.from could be manually sanitized by user).
+# But it's a no-op to run sanitize_address on an already sanitized address.
+$sender = sanitize_address($sender);
+
 my $prompting = 0;
 if (!@initial_to && !defined $to_cmd) {
        my $to = ask("Who should the emails be sent to (if any)? ",
@@ -1113,10 +1118,9 @@ sub send_message {
        if ($cc ne '') {
                $ccline = "\nCc: $cc";
        }
-       my $sanitized_sender = sanitize_address($sender);
        make_message_id() unless defined($message_id);
 
-       my $header = "From: $sanitized_sender
+       my $header = "From: $sender
 To: $to${ccline}
 Subject: $subject
 Date: $date
@@ -1133,7 +1137,7 @@ sub send_message {
        }
 
        my @sendmail_parameters = ('-i', @recipients);
-       my $raw_from = $sanitized_sender;
+       my $raw_from = $sender;
        if (defined $envelope_sender && $envelope_sender ne "auto") {
                $raw_from = $envelope_sender;
        }
@@ -1270,6 +1274,7 @@ sub send_message {
        open my $fh, "<", $t or die "can't open file $t";
 
        my $author = undef;
+       my $sauthor = undef;
        my $author_encoding;
        my $has_content_type;
        my $body_encoding;
@@ -1308,8 +1313,9 @@ sub send_message {
                        }
                        elsif (/^From:\s+(.*)$/i) {
                                ($author, $author_encoding) = unquote_rfc2047($1);
+                               $sauthor = sanitize_address($author);
                                next if $suppress_cc{'author'};
-                               next if $suppress_cc{'self'} and $author eq $sender;
+                               next if $suppress_cc{'self'} and $sauthor eq $sender;
                                printf("(mbox) Adding cc: %s from line '%s'\n",
                                        $1, $_) unless $quiet;
                                push @cc, $1;
@@ -1323,7 +1329,9 @@ sub send_message {
                        }
                        elsif (/^Cc:\s+(.*)$/i) {
                                foreach my $addr (parse_address_line($1)) {
-                                       if (unquote_rfc2047($addr) eq $sender) {
+                                       my $qaddr = unquote_rfc2047($addr);
+                                       my $saddr = sanitize_address($qaddr);
+                                       if ($saddr eq $sender) {
                                                next if ($suppress_cc{'self'});
                                        } else {
                                                next if ($suppress_cc{'cc'});
@@ -1370,7 +1378,8 @@ sub send_message {
                        chomp;
                        my ($what, $c) = ($1, $2);
                        chomp $c;
-                       if ($c eq $sender) {
+                       my $sc = sanitize_address($c);
+                       if ($sc eq $sender) {
                                next if ($suppress_cc{'self'});
                        } else {
                                next if $suppress_cc{'sob'} and $what =~ /Signed-off-by/i;
@@ -1400,7 +1409,7 @@ sub send_message {
                $subject = quote_subject($subject, $auto_8bit_encoding);
        }
 
-       if (defined $author and $author ne $sender) {
+       if (defined $sauthor and $sauthor ne $sender) {
                $message = "From: $author\n\n$message";
                if (defined $author_encoding) {
                        if ($has_content_type) {
@@ -1454,7 +1463,6 @@ sub send_message {
 sub recipients_cmd {
        my ($prefix, $what, $cmd, $file) = @_;
 
-       my $sanitized_sender = sanitize_address($sender);
        my @addresses = ();
        open my $fh, "-|", "$cmd \Q$file\E"
            or die "($prefix) Could not execute '$cmd'";
@@ -1462,7 +1470,7 @@ sub recipients_cmd {
                $address =~ s/^\s*//g;
                $address =~ s/\s*$//g;
                $address = sanitize_address($address);
-               next if ($address eq $sanitized_sender and $suppress_from);
+               next if ($address eq $sender and $suppress_cc{'self'});
                push @addresses, $address;
                printf("($prefix) Adding %s: %s from: '%s'\n",
                       $what, $address, $cmd) unless $quiet;
index 79bfaac9d4cb9a04e5e1fd7675d740cf9fc27e87..48bdf843244503df247e0dbdef3c5541cd9eb48e 100755 (executable)
@@ -113,7 +113,7 @@ resolve_relative_url ()
 module_list()
 {
        (
-               git ls-files --error-unmatch --stage -- "$@" ||
+               git ls-files -z --error-unmatch --stage -- "$@" ||
                echo "unmatched pathspec exists"
        ) |
        perl -e '
@@ -121,6 +121,7 @@ module_list()
        my ($null_sha1) = ("0" x 40);
        my @out = ();
        my $unmatched = 0;
+       $/ = "\0";
        while (<STDIN>) {
                if (/^unmatched pathspec/) {
                        $unmatched = 1;
index ccabe065f3d2b7c18b0104bf3c9e568b5ab4011b..d070de012c3a04ca621782f047425318ff246ca6 100755 (executable)
@@ -113,7 +113,7 @@ sub _req_svn {
        $_template, $_shared,
        $_version, $_fetch_all, $_no_rebase, $_fetch_parent,
        $_before, $_after,
-       $_merge, $_strategy, $_preserve_merges, $_dry_run, $_local,
+       $_merge, $_strategy, $_preserve_merges, $_dry_run, $_parents, $_local,
        $_prefix, $_no_checkout, $_url, $_verbose,
        $_commit_url, $_tag, $_merge_info, $_interactive);
 
@@ -203,6 +203,7 @@ sub _req_svn {
                    { 'message|m=s' => \$_message,
                      'destination|d=s' => \$_branch_dest,
                      'dry-run|n' => \$_dry_run,
+                     'parents' => \$_parents,
                      'tag|t' => \$_tag,
                      'username=s' => \$Git::SVN::Prompt::_username,
                      'commit-url=s' => \$_commit_url } ],
@@ -211,6 +212,7 @@ sub _req_svn {
                 { 'message|m=s' => \$_message,
                   'destination|d=s' => \$_branch_dest,
                   'dry-run|n' => \$_dry_run,
+                  'parents' => \$_parents,
                   'username=s' => \$Git::SVN::Prompt::_username,
                   'commit-url=s' => \$_commit_url } ],
        'set-tree' => [ \&cmd_set_tree,
@@ -1172,6 +1174,10 @@ sub cmd_branch {
                $ctx->ls($dst, 'HEAD', 0);
        } and die "branch ${branch_name} already exists\n";
 
+       if ($_parents) {
+               mk_parent_dirs($ctx, $dst);
+       }
+
        print "Copying ${src} at r${rev} to ${dst}...\n";
        $ctx->copy($src, $rev, $dst)
                unless $_dry_run;
@@ -1179,6 +1185,17 @@ sub cmd_branch {
        $gs->fetch_all;
 }
 
+sub mk_parent_dirs {
+       my ($ctx, $parent) = @_;
+       $parent =~ s{/[^/]*$}{};
+
+       if (!eval{$ctx->ls($parent, 'HEAD', 0)}) {
+               mk_parent_dirs($ctx, $parent);
+               print "Creating parent folder ${parent} ...\n";
+               $ctx->mkdir($parent) unless $_dry_run;
+       }
+}
+
 sub cmd_find_rev {
        my $revision_or_hash = shift or die "SVN or git revision required ",
                                            "as a command-line argument\n";
diff --git a/git.c b/git.c
index 1ada169d5cff3051effee33c6f9ba5b9be15b2e6..88eef5a7cc6d36f6e17f4855945116dd6f1b0681 100644 (file)
--- a/git.c
+++ b/git.c
@@ -4,6 +4,7 @@
 #include "help.h"
 #include "quote.h"
 #include "run-command.h"
+#include "commit.h"
 
 const char git_usage_string[] =
        "git [--version] [--help] [-c name=value]\n"
@@ -146,6 +147,12 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
                        setenv(GIT_LITERAL_PATHSPECS_ENVIRONMENT, "0", 1);
                        if (envchanged)
                                *envchanged = 1;
+               } else if (!strcmp(cmd, "--shallow-file")) {
+                       (*argv)++;
+                       (*argc)--;
+                       set_alternate_shallow_file((*argv)[0]);
+                       if (envchanged)
+                               *envchanged = 1;
                } else {
                        fprintf(stderr, "Unknown option: %s\n", cmd);
                        usage(git_usage_string);
index 8cc98dc0794d6a6fae196b4fa17b922ca5394436..df95e01b9042217148a5d9a12cc426b769355c38 100644 (file)
@@ -1,16 +1,16 @@
 # Swedish translation for gitk
-# Copyright (C) 2005-2012 Paul Mackerras
+# Copyright (C) 2005-2013 Paul Mackerras
 # This file is distributed under the same license as the gitk package.
 #
 # Mikael Magnusson <mikachu@gmail.com>, 2008.
-# Peter Krefting <peter@softwolves.pp.se>, 2008, 2009, 2010, 2012.
+# Peter Krefting <peter@softwolves.pp.se>, 2008, 2009, 2010, 2012, 2013.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: sv\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-10-03 08:09+0100\n"
-"PO-Revision-Date: 2012-10-03 08:13+0100\n"
+"POT-Creation-Date: 2013-05-16 08:06+0100\n"
+"PO-Revision-Date: 2013-05-16 08:12+0100\n"
 "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
@@ -22,11 +22,11 @@ msgstr ""
 msgid "Couldn't get list of unmerged files:"
 msgstr "Kunde inte hämta lista över ej sammanslagna filer:"
 
-#: gitk:210 gitk:2317
+#: gitk:210 gitk:2334
 msgid "Color words"
 msgstr "Färga ord"
 
-#: gitk:215 gitk:2317 gitk:7888 gitk:7921
+#: gitk:215 gitk:2334 gitk:7977 gitk:8010
 msgid "Markup words"
 msgstr "Märk upp ord"
 
@@ -60,11 +60,11 @@ msgstr "Fel vid körning av git log:"
 msgid "Reading"
 msgstr "Läser"
 
-#: gitk:484 gitk:4353
+#: gitk:484 gitk:4409
 msgid "Reading commits..."
 msgstr "Läser incheckningar..."
 
-#: gitk:487 gitk:1625 gitk:4356
+#: gitk:487 gitk:1625 gitk:4412
 msgid "No commits selected"
 msgstr "Inga incheckningar markerade"
 
@@ -80,278 +80,286 @@ msgstr "Ingen incheckningsinformation är tillgänglig"
 msgid "mc"
 msgstr "mc"
 
-#: gitk:1911 gitk:4146 gitk:9282 gitk:10824 gitk:11100
+#: gitk:1911 gitk:4202 gitk:9437 gitk:10979 gitk:11258
 msgid "OK"
 msgstr "OK"
 
-#: gitk:1913 gitk:4148 gitk:8871 gitk:8950 gitk:9065 gitk:9114 gitk:9284
-#: gitk:10825 gitk:11101
+#: gitk:1913 gitk:4204 gitk:8964 gitk:9043 gitk:9159 gitk:9208 gitk:9439
+#: gitk:10980 gitk:11259
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: gitk:2040
+#: gitk:2048
 msgid "Update"
 msgstr "Uppdatera"
 
-#: gitk:2041
+#: gitk:2049
 msgid "Reload"
 msgstr "Ladda om"
 
-#: gitk:2042
+#: gitk:2050
 msgid "Reread references"
 msgstr "Läs om referenser"
 
-#: gitk:2043
+#: gitk:2051
 msgid "List references"
 msgstr "Visa referenser"
 
-#: gitk:2045
+#: gitk:2053
 msgid "Start git gui"
 msgstr "Starta git gui"
 
-#: gitk:2047
+#: gitk:2055
 msgid "Quit"
 msgstr "Avsluta"
 
-#: gitk:2039
+#: gitk:2047
 msgid "File"
 msgstr "Arkiv"
 
-#: gitk:2051
+#: gitk:2059
 msgid "Preferences"
 msgstr "Inställningar"
 
-#: gitk:2050
+#: gitk:2058
 msgid "Edit"
 msgstr "Redigera"
 
-#: gitk:2055
+#: gitk:2063
 msgid "New view..."
 msgstr "Ny vy..."
 
-#: gitk:2056
+#: gitk:2064
 msgid "Edit view..."
 msgstr "Ändra vy..."
 
-#: gitk:2057
+#: gitk:2065
 msgid "Delete view"
 msgstr "Ta bort vy"
 
-#: gitk:2059
+#: gitk:2067
 msgid "All files"
 msgstr "Alla filer"
 
-#: gitk:2054 gitk:3899
+#: gitk:2062 gitk:3955
 msgid "View"
 msgstr "Visa"
 
-#: gitk:2064 gitk:2074 gitk:2869
+#: gitk:2072 gitk:2082 gitk:2925
 msgid "About gitk"
 msgstr "Om gitk"
 
-#: gitk:2065 gitk:2079
+#: gitk:2073 gitk:2087
 msgid "Key bindings"
 msgstr "Tangentbordsbindningar"
 
-#: gitk:2063 gitk:2078
+#: gitk:2071 gitk:2086
 msgid "Help"
 msgstr "Hjälp"
 
-#: gitk:2156 gitk:8330
+#: gitk:2164 gitk:8420
 msgid "SHA1 ID:"
 msgstr "SHA1-id:"
 
-#: gitk:2192
+#: gitk:2208
 msgid "Row"
 msgstr "Rad"
 
-#: gitk:2230
+#: gitk:2246
 msgid "Find"
 msgstr "Sök"
 
-#: gitk:2231
+#: gitk:2247
 msgid "next"
 msgstr "nästa"
 
-#: gitk:2232
+#: gitk:2248
 msgid "prev"
 msgstr "föreg"
 
-#: gitk:2233
+#: gitk:2249
 msgid "commit"
 msgstr "incheckning"
 
-#: gitk:2236 gitk:2238 gitk:4514 gitk:4537 gitk:4561 gitk:6528 gitk:6600
-#: gitk:6685
+#: gitk:2252 gitk:2254 gitk:4570 gitk:4593 gitk:4617 gitk:6592 gitk:6664
+#: gitk:6749
 msgid "containing:"
 msgstr "som innehåller:"
 
-#: gitk:2239 gitk:3381 gitk:3386 gitk:4590
+#: gitk:2255 gitk:3437 gitk:3442 gitk:4646
 msgid "touching paths:"
 msgstr "som rör sökväg:"
 
-#: gitk:2240 gitk:4604
+#: gitk:2256 gitk:4660
 msgid "adding/removing string:"
 msgstr "som lägger/till tar bort sträng:"
 
-#: gitk:2249 gitk:2251 gitk:4593
+#: gitk:2257 gitk:4662
+msgid "changing lines matching:"
+msgstr "ändrar rader som matchar:"
+
+#: gitk:2266 gitk:2268 gitk:4649
 msgid "Exact"
 msgstr "Exakt"
 
-#: gitk:2251 gitk:4679 gitk:6496
+#: gitk:2268 gitk:4737 gitk:6560
 msgid "IgnCase"
 msgstr "IgnVersaler"
 
-#: gitk:2251 gitk:4563 gitk:4677 gitk:6492
+#: gitk:2268 gitk:4619 gitk:4735 gitk:6556
 msgid "Regexp"
 msgstr "Reg.uttr."
 
-#: gitk:2253 gitk:2254 gitk:4699 gitk:4729 gitk:4736 gitk:6621 gitk:6689
+#: gitk:2270 gitk:2271 gitk:4757 gitk:4787 gitk:4794 gitk:6685 gitk:6753
 msgid "All fields"
 msgstr "Alla fält"
 
-#: gitk:2254 gitk:4696 gitk:4729 gitk:6559
+#: gitk:2271 gitk:4754 gitk:4787 gitk:6623
 msgid "Headline"
 msgstr "Rubrik"
 
-#: gitk:2255 gitk:4696 gitk:6559 gitk:6689 gitk:7126
+#: gitk:2272 gitk:4754 gitk:6623 gitk:6753 gitk:7221
 msgid "Comments"
 msgstr "Kommentarer"
 
-#: gitk:2255 gitk:4696 gitk:4701 gitk:4736 gitk:6559 gitk:7061 gitk:8505
-#: gitk:8520
+#: gitk:2272 gitk:4754 gitk:4759 gitk:4794 gitk:6623 gitk:7156 gitk:8598
+#: gitk:8613
 msgid "Author"
 msgstr "Författare"
 
-#: gitk:2255 gitk:4696 gitk:6559 gitk:7063
+#: gitk:2272 gitk:4754 gitk:6623 gitk:7158
 msgid "Committer"
 msgstr "Incheckare"
 
-#: gitk:2286
+#: gitk:2303
 msgid "Search"
 msgstr "Sök"
 
-#: gitk:2294
+#: gitk:2311
 msgid "Diff"
 msgstr "Diff"
 
-#: gitk:2296
+#: gitk:2313
 msgid "Old version"
 msgstr "Gammal version"
 
-#: gitk:2298
+#: gitk:2315
 msgid "New version"
 msgstr "Ny version"
 
-#: gitk:2300
+#: gitk:2317
 msgid "Lines of context"
 msgstr "Rader sammanhang"
 
-#: gitk:2310
+#: gitk:2327
 msgid "Ignore space change"
 msgstr "Ignorera ändringar i blanksteg"
 
-#: gitk:2314 gitk:2316 gitk:7646 gitk:7874
+#: gitk:2331 gitk:2333 gitk:7735 gitk:7963
 msgid "Line diff"
 msgstr "Rad-diff"
 
-#: gitk:2379
+#: gitk:2397
 msgid "Patch"
 msgstr "Patch"
 
-#: gitk:2381
+#: gitk:2399
 msgid "Tree"
 msgstr "Träd"
 
-#: gitk:2540 gitk:2559
+#: gitk:2557 gitk:2577
 msgid "Diff this -> selected"
 msgstr "Diff denna -> markerad"
 
-#: gitk:2541 gitk:2560
+#: gitk:2558 gitk:2578
 msgid "Diff selected -> this"
 msgstr "Diff markerad -> denna"
 
-#: gitk:2542 gitk:2561
+#: gitk:2559 gitk:2579
 msgid "Make patch"
 msgstr "Skapa patch"
 
-#: gitk:2543 gitk:8929
+#: gitk:2560 gitk:9022
 msgid "Create tag"
 msgstr "Skapa tagg"
 
-#: gitk:2544 gitk:9045
+#: gitk:2561 gitk:9139
 msgid "Write commit to file"
 msgstr "Skriv incheckning till fil"
 
-#: gitk:2545 gitk:9102
+#: gitk:2562 gitk:9196
 msgid "Create new branch"
 msgstr "Skapa ny gren"
 
-#: gitk:2546
+#: gitk:2563
 msgid "Cherry-pick this commit"
 msgstr "Plocka denna incheckning"
 
-#: gitk:2547
+#: gitk:2564
 msgid "Reset HEAD branch to here"
 msgstr "Återställ HEAD-grenen hit"
 
-#: gitk:2548
+#: gitk:2565
 msgid "Mark this commit"
 msgstr "Markera denna incheckning"
 
-#: gitk:2549
+#: gitk:2566
 msgid "Return to mark"
 msgstr "Återgå till markering"
 
-#: gitk:2550
+#: gitk:2567
 msgid "Find descendant of this and mark"
 msgstr "Hitta efterföljare till denna och markera"
 
-#: gitk:2551
+#: gitk:2568
 msgid "Compare with marked commit"
 msgstr "Jämför med markerad incheckning"
 
-#: gitk:2552 gitk:2562
+#: gitk:2569 gitk:2580
 msgid "Diff this -> marked commit"
 msgstr "Diff denna -> markerad incheckning"
 
-#: gitk:2553 gitk:2563
+#: gitk:2570 gitk:2581
 msgid "Diff marked commit -> this"
 msgstr "Diff markerad incheckning -> denna"
 
-#: gitk:2569
+#: gitk:2571
+msgid "Revert this commit"
+msgstr "Ångra denna incheckning"
+
+#: gitk:2587
 msgid "Check out this branch"
 msgstr "Checka ut denna gren"
 
-#: gitk:2570
+#: gitk:2588
 msgid "Remove this branch"
 msgstr "Ta bort denna gren"
 
-#: gitk:2577
+#: gitk:2595
 msgid "Highlight this too"
 msgstr "Markera även detta"
 
-#: gitk:2578
+#: gitk:2596
 msgid "Highlight this only"
 msgstr "Markera bara detta"
 
-#: gitk:2579
+#: gitk:2597
 msgid "External diff"
 msgstr "Extern diff"
 
-#: gitk:2580
+#: gitk:2598
 msgid "Blame parent commit"
 msgstr "Klandra föräldraincheckning"
 
-#: gitk:2587
+#: gitk:2605
 msgid "Show origin of this line"
 msgstr "Visa ursprunget för den här raden"
 
-#: gitk:2588
+#: gitk:2606
 msgid "Run git gui blame on this line"
 msgstr "Kör git gui blame på den här raden"
 
-#: gitk:2871
+#: gitk:2927
 msgid ""
 "\n"
 "Gitk - a commit viewer for git\n"
@@ -367,302 +375,302 @@ msgstr ""
 "\n"
 "Använd och vidareförmedla enligt villkoren i GNU General Public License"
 
-#: gitk:2879 gitk:2944 gitk:9468
+#: gitk:2935 gitk:3000 gitk:9623
 msgid "Close"
 msgstr "Stäng"
 
-#: gitk:2900
+#: gitk:2956
 msgid "Gitk key bindings"
 msgstr "Tangentbordsbindningar för Gitk"
 
-#: gitk:2903
+#: gitk:2959
 msgid "Gitk key bindings:"
 msgstr "Tangentbordsbindningar för Gitk:"
 
-#: gitk:2905
+#: gitk:2961
 #, tcl-format
 msgid "<%s-Q>\t\tQuit"
 msgstr "<%s-Q>\t\tAvsluta"
 
-#: gitk:2906
+#: gitk:2962
 #, tcl-format
 msgid "<%s-W>\t\tClose window"
 msgstr "<%s-W>\t\tStäng fönster"
 
-#: gitk:2907
+#: gitk:2963
 msgid "<Home>\t\tMove to first commit"
 msgstr "<Home>\t\tGå till första incheckning"
 
-#: gitk:2908
+#: gitk:2964
 msgid "<End>\t\tMove to last commit"
 msgstr "<End>\t\tGå till sista incheckning"
 
-#: gitk:2909
+#: gitk:2965
 msgid "<Up>, p, k\tMove up one commit"
 msgstr "<Upp>, p, k\tGå en incheckning upp"
 
-#: gitk:2910
+#: gitk:2966
 msgid "<Down>, n, j\tMove down one commit"
 msgstr "<Ned>, n, j\tGå en incheckning ned"
 
-#: gitk:2911
+#: gitk:2967
 msgid "<Left>, z, h\tGo back in history list"
 msgstr "<Vänster>, z, h\tGå bakåt i historiken"
 
-#: gitk:2912
+#: gitk:2968
 msgid "<Right>, x, l\tGo forward in history list"
 msgstr "<Höger>, x, l\tGå framåt i historiken"
 
-#: gitk:2913
+#: gitk:2969
 msgid "<PageUp>\tMove up one page in commit list"
 msgstr "<PageUp>\tGå upp en sida i incheckningslistan"
 
-#: gitk:2914
+#: gitk:2970
 msgid "<PageDown>\tMove down one page in commit list"
 msgstr "<PageDown>\tGå ned en sida i incheckningslistan"
 
-#: gitk:2915
+#: gitk:2971
 #, tcl-format
 msgid "<%s-Home>\tScroll to top of commit list"
 msgstr "<%s-Home>\tRulla till början av incheckningslistan"
 
-#: gitk:2916
+#: gitk:2972
 #, tcl-format
 msgid "<%s-End>\tScroll to bottom of commit list"
 msgstr "<%s-End>\tRulla till slutet av incheckningslistan"
 
-#: gitk:2917
+#: gitk:2973
 #, tcl-format
 msgid "<%s-Up>\tScroll commit list up one line"
 msgstr "<%s-Upp>\tRulla incheckningslistan upp ett steg"
 
-#: gitk:2918
+#: gitk:2974
 #, tcl-format
 msgid "<%s-Down>\tScroll commit list down one line"
 msgstr "<%s-Ned>\tRulla incheckningslistan ned ett steg"
 
-#: gitk:2919
+#: gitk:2975
 #, tcl-format
 msgid "<%s-PageUp>\tScroll commit list up one page"
 msgstr "<%s-PageUp>\tRulla incheckningslistan upp en sida"
 
-#: gitk:2920
+#: gitk:2976
 #, tcl-format
 msgid "<%s-PageDown>\tScroll commit list down one page"
 msgstr "<%s-PageDown>\tRulla incheckningslistan ned en sida"
 
-#: gitk:2921
+#: gitk:2977
 msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
 msgstr "<Skift-Upp>\tSök bakåt (uppåt, senare incheckningar)"
 
-#: gitk:2922
+#: gitk:2978
 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
 msgstr "<Skift-Ned>\tSök framåt (nedåt, tidigare incheckningar)"
 
-#: gitk:2923
+#: gitk:2979
 msgid "<Delete>, b\tScroll diff view up one page"
 msgstr "<Delete>, b\tRulla diffvisningen upp en sida"
 
-#: gitk:2924
+#: gitk:2980
 msgid "<Backspace>\tScroll diff view up one page"
 msgstr "<Baksteg>\tRulla diffvisningen upp en sida"
 
-#: gitk:2925
+#: gitk:2981
 msgid "<Space>\t\tScroll diff view down one page"
 msgstr "<Blanksteg>\tRulla diffvisningen ned en sida"
 
-#: gitk:2926
+#: gitk:2982
 msgid "u\t\tScroll diff view up 18 lines"
 msgstr "u\t\tRulla diffvisningen upp 18 rader"
 
-#: gitk:2927
+#: gitk:2983
 msgid "d\t\tScroll diff view down 18 lines"
 msgstr "d\t\tRulla diffvisningen ned 18 rader"
 
-#: gitk:2928
+#: gitk:2984
 #, tcl-format
 msgid "<%s-F>\t\tFind"
 msgstr "<%s-F>\t\tSök"
 
-#: gitk:2929
+#: gitk:2985
 #, tcl-format
 msgid "<%s-G>\t\tMove to next find hit"
 msgstr "<%s-G>\t\tGå till nästa sökträff"
 
-#: gitk:2930
+#: gitk:2986
 msgid "<Return>\tMove to next find hit"
 msgstr "<Return>\t\tGå till nästa sökträff"
 
-#: gitk:2931
+#: gitk:2987
 msgid "/\t\tFocus the search box"
 msgstr "/\t\tFokusera sökrutan"
 
-#: gitk:2932
+#: gitk:2988
 msgid "?\t\tMove to previous find hit"
 msgstr "?\t\tGå till föregående sökträff"
 
-#: gitk:2933
+#: gitk:2989
 msgid "f\t\tScroll diff view to next file"
 msgstr "f\t\tRulla diffvisningen till nästa fil"
 
-#: gitk:2934
+#: gitk:2990
 #, tcl-format
 msgid "<%s-S>\t\tSearch for next hit in diff view"
 msgstr "<%s-S>\t\tGå till nästa sökträff i diffvisningen"
 
-#: gitk:2935
+#: gitk:2991
 #, tcl-format
 msgid "<%s-R>\t\tSearch for previous hit in diff view"
 msgstr "<%s-R>\t\tGå till föregående sökträff i diffvisningen"
 
-#: gitk:2936
+#: gitk:2992
 #, tcl-format
 msgid "<%s-KP+>\tIncrease font size"
 msgstr "<%s-Num+>\tÖka teckenstorlek"
 
-#: gitk:2937
+#: gitk:2993
 #, tcl-format
 msgid "<%s-plus>\tIncrease font size"
 msgstr "<%s-plus>\tÖka teckenstorlek"
 
-#: gitk:2938
+#: gitk:2994
 #, tcl-format
 msgid "<%s-KP->\tDecrease font size"
 msgstr "<%s-Num->\tMinska teckenstorlek"
 
-#: gitk:2939
+#: gitk:2995
 #, tcl-format
 msgid "<%s-minus>\tDecrease font size"
 msgstr "<%s-minus>\tMinska teckenstorlek"
 
-#: gitk:2940
+#: gitk:2996
 msgid "<F5>\t\tUpdate"
 msgstr "<F5>\t\tUppdatera"
 
-#: gitk:3395 gitk:3404
+#: gitk:3451 gitk:3460
 #, tcl-format
 msgid "Error creating temporary directory %s:"
 msgstr "Fel vid skapande av temporär katalog %s:"
 
-#: gitk:3417
+#: gitk:3473
 #, tcl-format
 msgid "Error getting \"%s\" from %s:"
 msgstr "Fel vid hämtning av  \"%s\" från %s:"
 
-#: gitk:3480
+#: gitk:3536
 msgid "command failed:"
 msgstr "kommando misslyckades:"
 
-#: gitk:3629
+#: gitk:3685
 msgid "No such commit"
 msgstr "Incheckning saknas"
 
-#: gitk:3643
+#: gitk:3699
 msgid "git gui blame: command failed:"
 msgstr "git gui blame: kommando misslyckades:"
 
-#: gitk:3674
+#: gitk:3730
 #, tcl-format
 msgid "Couldn't read merge head: %s"
 msgstr "Kunde inte läsa sammanslagningshuvud: %s"
 
-#: gitk:3682
+#: gitk:3738
 #, tcl-format
 msgid "Error reading index: %s"
 msgstr "Fel vid läsning av index: %s"
 
-#: gitk:3707
+#: gitk:3763
 #, tcl-format
 msgid "Couldn't start git blame: %s"
 msgstr "Kunde inte starta git blame: %s"
 
-#: gitk:3710 gitk:6527
+#: gitk:3766 gitk:6591
 msgid "Searching"
 msgstr "Söker"
 
-#: gitk:3742
+#: gitk:3798
 #, tcl-format
 msgid "Error running git blame: %s"
 msgstr "Fel vid körning av git blame: %s"
 
-#: gitk:3770
+#: gitk:3826
 #, tcl-format
 msgid "That line comes from commit %s,  which is not in this view"
 msgstr "Raden kommer från incheckningen %s, som inte finns i denna vy"
 
-#: gitk:3784
+#: gitk:3840
 msgid "External diff viewer failed:"
 msgstr "Externt diff-verktyg misslyckades:"
 
-#: gitk:3902
+#: gitk:3958
 msgid "Gitk view definition"
 msgstr "Definition av Gitk-vy"
 
-#: gitk:3906
+#: gitk:3962
 msgid "Remember this view"
 msgstr "Spara denna vy"
 
-#: gitk:3907
+#: gitk:3963
 msgid "References (space separated list):"
 msgstr "Referenser (blankstegsavdelad lista):"
 
-#: gitk:3908
+#: gitk:3964
 msgid "Branches & tags:"
 msgstr "Grenar & taggar:"
 
-#: gitk:3909
+#: gitk:3965
 msgid "All refs"
 msgstr "Alla referenser"
 
-#: gitk:3910
+#: gitk:3966
 msgid "All (local) branches"
 msgstr "Alla (lokala) grenar"
 
-#: gitk:3911
+#: gitk:3967
 msgid "All tags"
 msgstr "Alla taggar"
 
-#: gitk:3912
+#: gitk:3968
 msgid "All remote-tracking branches"
 msgstr "Alla fjärrspårande grenar"
 
-#: gitk:3913
+#: gitk:3969
 msgid "Commit Info (regular expressions):"
 msgstr "Incheckningsinfo (reguljära uttryck):"
 
-#: gitk:3914
+#: gitk:3970
 msgid "Author:"
 msgstr "Författare:"
 
-#: gitk:3915
+#: gitk:3971
 msgid "Committer:"
 msgstr "Incheckare:"
 
-#: gitk:3916
+#: gitk:3972
 msgid "Commit Message:"
 msgstr "Incheckningsmeddelande:"
 
-#: gitk:3917
+#: gitk:3973
 msgid "Matches all Commit Info criteria"
 msgstr "Motsvarar alla kriterier för incheckningsinfo"
 
-#: gitk:3918
+#: gitk:3974
 msgid "Changes to Files:"
 msgstr "Ändringar av filer:"
 
-#: gitk:3919
+#: gitk:3975
 msgid "Fixed String"
 msgstr "Fast sträng"
 
-#: gitk:3920
+#: gitk:3976
 msgid "Regular Expression"
 msgstr "Reguljärt uttryck"
 
-#: gitk:3921
+#: gitk:3977
 msgid "Search string:"
 msgstr "Söksträng:"
 
-#: gitk:3922
+#: gitk:3978
 msgid ""
 "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
@@ -670,197 +678,201 @@ msgstr ""
 "Incheckingsdatum (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 "
 "15:27:38\"):"
 
-#: gitk:3923
+#: gitk:3979
 msgid "Since:"
 msgstr "Från:"
 
-#: gitk:3924
+#: gitk:3980
 msgid "Until:"
 msgstr "Till:"
 
-#: gitk:3925
+#: gitk:3981
 msgid "Limit and/or skip a number of revisions (positive integer):"
 msgstr "Begränsa och/eller hoppa över ett antal revisioner (positivt heltal):"
 
-#: gitk:3926
+#: gitk:3982
 msgid "Number to show:"
 msgstr "Antal att visa:"
 
-#: gitk:3927
+#: gitk:3983
 msgid "Number to skip:"
 msgstr "Antal att hoppa över:"
 
-#: gitk:3928
+#: gitk:3984
 msgid "Miscellaneous options:"
 msgstr "Diverse alternativ:"
 
-#: gitk:3929
+#: gitk:3985
 msgid "Strictly sort by date"
 msgstr "Strikt datumsortering"
 
-#: gitk:3930
+#: gitk:3986
 msgid "Mark branch sides"
 msgstr "Markera sidogrenar"
 
-#: gitk:3931
+#: gitk:3987
 msgid "Limit to first parent"
 msgstr "Begränsa till första förälder"
 
-#: gitk:3932
+#: gitk:3988
 msgid "Simple history"
 msgstr "Enkel historik"
 
-#: gitk:3933
+#: gitk:3989
 msgid "Additional arguments to git log:"
 msgstr "Ytterligare argument till git log:"
 
-#: gitk:3934
+#: gitk:3990
 msgid "Enter files and directories to include, one per line:"
 msgstr "Ange filer och kataloger att ta med, en per rad:"
 
-#: gitk:3935
+#: gitk:3991
 msgid "Command to generate more commits to include:"
 msgstr "Kommando för att generera fler incheckningar att ta med:"
 
-#: gitk:4059
+#: gitk:4115
 msgid "Gitk: edit view"
 msgstr "Gitk: redigera vy"
 
-#: gitk:4067
+#: gitk:4123
 msgid "-- criteria for selecting revisions"
 msgstr " - kriterier för val av revisioner"
 
-#: gitk:4072
+#: gitk:4128
 msgid "View Name"
 msgstr "Namn på vy"
 
-#: gitk:4147
+#: gitk:4203
 msgid "Apply (F5)"
 msgstr "Använd (F5)"
 
-#: gitk:4185
+#: gitk:4241
 msgid "Error in commit selection arguments:"
 msgstr "Fel i argument för val av incheckningar:"
 
-#: gitk:4238 gitk:4290 gitk:4749 gitk:4763 gitk:6027 gitk:11849 gitk:11850
+#: gitk:4294 gitk:4346 gitk:4807 gitk:4821 gitk:6087 gitk:12041 gitk:12042
 msgid "None"
 msgstr "Inget"
 
-#: gitk:4846 gitk:4851
+#: gitk:4904 gitk:4909
 msgid "Descendant"
 msgstr "Avkomling"
 
-#: gitk:4847
+#: gitk:4905
 msgid "Not descendant"
 msgstr "Inte avkomling"
 
-#: gitk:4854 gitk:4859
+#: gitk:4912 gitk:4917
 msgid "Ancestor"
 msgstr "Förfader"
 
-#: gitk:4855
+#: gitk:4913
 msgid "Not ancestor"
 msgstr "Inte förfader"
 
-#: gitk:5145
+#: gitk:5203
 msgid "Local changes checked in to index but not committed"
 msgstr "Lokala ändringar sparade i indexet men inte incheckade"
 
-#: gitk:5181
+#: gitk:5239
 msgid "Local uncommitted changes, not checked in to index"
 msgstr "Lokala ändringar, ej sparade i indexet"
 
-#: gitk:6882
+#: gitk:6971
+msgid "and many more"
+msgstr "med många flera"
+
+#: gitk:6974
 msgid "many"
 msgstr "många"
 
-#: gitk:7065
+#: gitk:7160
 msgid "Tags:"
 msgstr "Taggar:"
 
-#: gitk:7082 gitk:7088 gitk:8500
+#: gitk:7177 gitk:7183 gitk:8593
 msgid "Parent"
 msgstr "Förälder"
 
-#: gitk:7093
+#: gitk:7188
 msgid "Child"
 msgstr "Barn"
 
-#: gitk:7102
+#: gitk:7197
 msgid "Branch"
 msgstr "Gren"
 
-#: gitk:7105
+#: gitk:7200
 msgid "Follows"
 msgstr "Följer"
 
-#: gitk:7108
+#: gitk:7203
 msgid "Precedes"
 msgstr "Föregår"
 
-#: gitk:7653
+#: gitk:7742
 #, tcl-format
 msgid "Error getting diffs: %s"
 msgstr "Fel vid hämtning av diff: %s"
 
-#: gitk:8328
+#: gitk:8418
 msgid "Goto:"
 msgstr "Gå till:"
 
-#: gitk:8349
+#: gitk:8439
 #, tcl-format
 msgid "Short SHA1 id %s is ambiguous"
 msgstr "Förkortat SHA1-id %s är tvetydigt"
 
-#: gitk:8356
+#: gitk:8446
 #, tcl-format
 msgid "Revision %s is not known"
 msgstr "Revisionen %s är inte känd"
 
-#: gitk:8366
+#: gitk:8456
 #, tcl-format
 msgid "SHA1 id %s is not known"
 msgstr "SHA-id:t %s är inte känt"
 
-#: gitk:8368
+#: gitk:8458
 #, tcl-format
 msgid "Revision %s is not in the current view"
 msgstr "Revisionen %s finns inte i den nuvarande vyn"
 
-#: gitk:8507 gitk:8522
+#: gitk:8600 gitk:8615
 msgid "Date"
 msgstr "Datum"
 
-#: gitk:8510
+#: gitk:8603
 msgid "Children"
 msgstr "Barn"
 
-#: gitk:8573
+#: gitk:8666
 #, tcl-format
 msgid "Reset %s branch to here"
 msgstr "Återställ grenen %s hit"
 
-#: gitk:8575
+#: gitk:8668
 msgid "Detached head: can't reset"
 msgstr "Frånkopplad head: kan inte återställa"
 
-#: gitk:8680 gitk:8686
+#: gitk:8773 gitk:8779
 msgid "Skipping merge commit "
 msgstr "Hoppar över sammanslagningsincheckning "
 
-#: gitk:8695 gitk:8700
+#: gitk:8788 gitk:8793
 msgid "Error getting patch ID for "
 msgstr "Fel vid hämtning av patch-id för "
 
-#: gitk:8696 gitk:8701
+#: gitk:8789 gitk:8794
 msgid " - stopping\n"
 msgstr " - stannar\n"
 
-#: gitk:8706 gitk:8709 gitk:8717 gitk:8731 gitk:8740
+#: gitk:8799 gitk:8802 gitk:8810 gitk:8824 gitk:8833
 msgid "Commit "
 msgstr "Incheckning "
 
-#: gitk:8710
+#: gitk:8803
 msgid ""
 " is the same patch as\n"
 "       "
@@ -868,7 +880,7 @@ msgstr ""
 " är samma patch som\n"
 "       "
 
-#: gitk:8718
+#: gitk:8811
 msgid ""
 " differs from\n"
 "       "
@@ -876,7 +888,7 @@ msgstr ""
 " skiljer sig från\n"
 "       "
 
-#: gitk:8720
+#: gitk:8813
 msgid ""
 "Diff of commits:\n"
 "\n"
@@ -884,131 +896,131 @@ msgstr ""
 "Skillnad mellan incheckningar:\n"
 "\n"
 
-#: gitk:8732 gitk:8741
+#: gitk:8825 gitk:8834
 #, tcl-format
 msgid " has %s children - stopping\n"
 msgstr " har %s barn - stannar\n"
 
-#: gitk:8760
+#: gitk:8853
 #, tcl-format
 msgid "Error writing commit to file: %s"
 msgstr "Fel vid skrivning av incheckning till fil: %s"
 
-#: gitk:8766
+#: gitk:8859
 #, tcl-format
 msgid "Error diffing commits: %s"
 msgstr "Fel vid jämförelse av incheckningar: %s"
 
-#: gitk:8812
+#: gitk:8905
 msgid "Top"
 msgstr "Topp"
 
-#: gitk:8813
+#: gitk:8906
 msgid "From"
 msgstr "Från"
 
-#: gitk:8818
+#: gitk:8911
 msgid "To"
 msgstr "Till"
 
-#: gitk:8842
+#: gitk:8935
 msgid "Generate patch"
 msgstr "Generera patch"
 
-#: gitk:8844
+#: gitk:8937
 msgid "From:"
 msgstr "Från:"
 
-#: gitk:8853
+#: gitk:8946
 msgid "To:"
 msgstr "Till:"
 
-#: gitk:8862
+#: gitk:8955
 msgid "Reverse"
 msgstr "Vänd"
 
-#: gitk:8864 gitk:9059
+#: gitk:8957 gitk:9153
 msgid "Output file:"
 msgstr "Utdatafil:"
 
-#: gitk:8870
+#: gitk:8963
 msgid "Generate"
 msgstr "Generera"
 
-#: gitk:8908
+#: gitk:9001
 msgid "Error creating patch:"
 msgstr "Fel vid generering av patch:"
 
-#: gitk:8931 gitk:9047 gitk:9104
+#: gitk:9024 gitk:9141 gitk:9198
 msgid "ID:"
 msgstr "Id:"
 
-#: gitk:8940
+#: gitk:9033
 msgid "Tag name:"
 msgstr "Taggnamn:"
 
-#: gitk:8943
+#: gitk:9036
 msgid "Tag message is optional"
 msgstr "Taggmeddelandet är valfritt"
 
-#: gitk:8945
+#: gitk:9038
 msgid "Tag message:"
 msgstr "Taggmeddelande:"
 
-#: gitk:8949 gitk:9113
+#: gitk:9042 gitk:9207
 msgid "Create"
 msgstr "Skapa"
 
-#: gitk:8967
+#: gitk:9060
 msgid "No tag name specified"
 msgstr "Inget taggnamn angavs"
 
-#: gitk:8971
+#: gitk:9064
 #, tcl-format
 msgid "Tag \"%s\" already exists"
 msgstr "Taggen \"%s\" finns redan"
 
-#: gitk:8981
+#: gitk:9074
 msgid "Error creating tag:"
 msgstr "Fel vid skapande av tagg:"
 
-#: gitk:9056
+#: gitk:9150
 msgid "Command:"
 msgstr "Kommando:"
 
-#: gitk:9064
+#: gitk:9158
 msgid "Write"
 msgstr "Skriv"
 
-#: gitk:9082
+#: gitk:9176
 msgid "Error writing commit:"
 msgstr "Fel vid skrivning av incheckning:"
 
-#: gitk:9109
+#: gitk:9203
 msgid "Name:"
 msgstr "Namn:"
 
-#: gitk:9132
+#: gitk:9226
 msgid "Please specify a name for the new branch"
 msgstr "Ange ett namn för den nya grenen"
 
-#: gitk:9137
+#: gitk:9231
 #, tcl-format
 msgid "Branch '%s' already exists. Overwrite?"
 msgstr "Grenen \"%s\" finns redan. Skriva över?"
 
-#: gitk:9204
+#: gitk:9298
 #, tcl-format
 msgid "Commit %s is already included in branch %s -- really re-apply it?"
 msgstr ""
 "Incheckningen %s finns redan på grenen %s -- skall den verkligen appliceras "
 "på nytt?"
 
-#: gitk:9209
+#: gitk:9303
 msgid "Cherry-picking"
 msgstr "Plockar"
 
-#: gitk:9218
+#: gitk:9312
 #, tcl-format
 msgid ""
 "Cherry-pick failed because of local changes to file '%s'.\n"
@@ -1018,7 +1030,7 @@ msgstr ""
 "Checka in, återställ eller spara undan (stash) dina ändringar och försök "
 "igen."
 
-#: gitk:9224
+#: gitk:9318
 msgid ""
 "Cherry-pick failed because of merge conflict.\n"
 "Do you wish to run git citool to resolve it?"
@@ -1026,32 +1038,59 @@ msgstr ""
 "Cherry-pick misslyckades på grund av en sammanslagningskonflikt.\n"
 "Vill du köra git citool för att lösa den?"
 
-#: gitk:9240
+#: gitk:9334 gitk:9392
 msgid "No changes committed"
 msgstr "Inga ändringar incheckade"
 
-#: gitk:9266
+#: gitk:9361
+#, tcl-format
+msgid "Commit %s is not included in branch %s -- really revert it?"
+msgstr "Incheckningen %s finns inte på grenen %s -- vill du verkligen ångra?"
+
+#: gitk:9366
+msgid "Reverting"
+msgstr "Ångrar"
+
+#: gitk:9374
+#, tcl-format
+msgid ""
+"Revert failed because of local changes to the following files:%s Please "
+"commit, reset or stash  your changes and try again."
+msgstr ""
+"Misslyckades med att ångra på grund av lokala ändringar i följande filer:%s. "
+"Checka in, återställ eller spara undan (stash) dina ändringar och försök "
+"igen."
+
+#: gitk:9378
+msgid ""
+"Revert failed because of merge conflict.\n"
+" Do you wish to run git citool to resolve it?"
+msgstr ""
+"Misslyckades med att ångra på grund av en sammanslagningskonflikt.\n"
+" Vill du köra git citool för att lösa den?"
+
+#: gitk:9421
 msgid "Confirm reset"
 msgstr "Bekräfta återställning"
 
-#: gitk:9268
+#: gitk:9423
 #, tcl-format
 msgid "Reset branch %s to %s?"
 msgstr "Återställa grenen %s till %s?"
 
-#: gitk:9270
+#: gitk:9425
 msgid "Reset type:"
 msgstr "Typ av återställning:"
 
-#: gitk:9273
+#: gitk:9428
 msgid "Soft: Leave working tree and index untouched"
 msgstr "Mjuk: Rör inte utcheckning och index"
 
-#: gitk:9276
+#: gitk:9431
 msgid "Mixed: Leave working tree untouched, reset index"
 msgstr "Blandad: Rör inte utcheckning, återställ index"
 
-#: gitk:9279
+#: gitk:9434
 msgid ""
 "Hard: Reset working tree and index\n"
 "(discard ALL local changes)"
@@ -1059,19 +1098,19 @@ msgstr ""
 "Hård: Återställ utcheckning och index\n"
 "(förkastar ALLA lokala ändringar)"
 
-#: gitk:9296
+#: gitk:9451
 msgid "Resetting"
 msgstr "Återställer"
 
-#: gitk:9356
+#: gitk:9511
 msgid "Checking out"
 msgstr "Checkar ut"
 
-#: gitk:9409
+#: gitk:9564
 msgid "Cannot delete the currently checked-out branch"
 msgstr "Kan inte ta bort den just nu utcheckade grenen"
 
-#: gitk:9415
+#: gitk:9570
 #, tcl-format
 msgid ""
 "The commits on branch %s aren't on any other branch.\n"
@@ -1080,16 +1119,16 @@ msgstr ""
 "Incheckningarna på grenen %s existerar inte på någon annan gren.\n"
 "Vill du verkligen ta bort grenen %s?"
 
-#: gitk:9446
+#: gitk:9601
 #, tcl-format
 msgid "Tags and heads: %s"
 msgstr "Taggar och huvuden: %s"
 
-#: gitk:9461
+#: gitk:9616
 msgid "Filter"
 msgstr "Filter"
 
-#: gitk:9757
+#: gitk:9912
 msgid ""
 "Error reading commit topology information; branch and preceding/following "
 "tag information will be incomplete."
@@ -1097,210 +1136,214 @@ msgstr ""
 "Fel vid läsning av information om incheckningstopologi; information om "
 "grenar och föregående/senare taggar kommer inte vara komplett."
 
-#: gitk:10744
+#: gitk:10899
 msgid "Tag"
 msgstr "Tagg"
 
-#: gitk:10744
+#: gitk:10899
 msgid "Id"
 msgstr "Id"
 
-#: gitk:10793
+#: gitk:10948
 msgid "Gitk font chooser"
 msgstr "Teckensnittsväljare för Gitk"
 
-#: gitk:10810
+#: gitk:10965
 msgid "B"
 msgstr "F"
 
-#: gitk:10813
+#: gitk:10968
 msgid "I"
 msgstr "K"
 
-#: gitk:10931
+#: gitk:11086
 msgid "Commit list display options"
 msgstr "Alternativ för incheckningslistvy"
 
-#: gitk:10934
+#: gitk:11089
 msgid "Maximum graph width (lines)"
 msgstr "Maximal grafbredd (rader)"
 
-#: gitk:10937
+#: gitk:11092
 #, tcl-format
 msgid "Maximum graph width (% of pane)"
 msgstr "Maximal grafbredd (% av ruta)"
 
-#: gitk:10940
+#: gitk:11095
 msgid "Show local changes"
 msgstr "Visa lokala ändringar"
 
-#: gitk:10943
+#: gitk:11098
 msgid "Auto-select SHA1 (length)"
 msgstr "Välj SHA1 (längd) automatiskt"
 
-#: gitk:10947
+#: gitk:11102
 msgid "Hide remote refs"
 msgstr "Dölj fjärr-referenser"
 
-#: gitk:10951
+#: gitk:11106
 msgid "Diff display options"
 msgstr "Alternativ för diffvy"
 
-#: gitk:10953
+#: gitk:11108
 msgid "Tab spacing"
 msgstr "Blanksteg för tabulatortecken"
 
-#: gitk:10956
-msgid "Display nearby tags"
-msgstr "Visa närliggande taggar"
+#: gitk:11111
+msgid "Display nearby tags/heads"
+msgstr "Visa närliggande taggar/huvuden"
+
+#: gitk:11114
+msgid "Maximum # tags/heads to show"
+msgstr "Maximalt antal taggar/huvuden att visa"
 
-#: gitk:10959
+#: gitk:11117
 msgid "Limit diffs to listed paths"
 msgstr "Begränsa diff till listade sökvägar"
 
-#: gitk:10962
+#: gitk:11120
 msgid "Support per-file encodings"
 msgstr "Stöd för filspecifika teckenkodningar"
 
-#: gitk:10968 gitk:11115
+#: gitk:11126 gitk:11273
 msgid "External diff tool"
 msgstr "Externt diff-verktyg"
 
-#: gitk:10969
+#: gitk:11127
 msgid "Choose..."
 msgstr "Välj..."
 
-#: gitk:10974
+#: gitk:11132
 msgid "General options"
 msgstr "Allmänna inställningar"
 
-#: gitk:10977
+#: gitk:11135
 msgid "Use themed widgets"
 msgstr "Använd tema på fönsterelement"
 
-#: gitk:10979
+#: gitk:11137
 msgid "(change requires restart)"
 msgstr "(ändringen kräver omstart)"
 
-#: gitk:10981
+#: gitk:11139
 msgid "(currently unavailable)"
 msgstr "(för närvarande inte tillgängligt)"
 
-#: gitk:10992
+#: gitk:11150
 msgid "Colors: press to choose"
 msgstr "Färger: tryck för att välja"
 
-#: gitk:10995
+#: gitk:11153
 msgid "Interface"
 msgstr "Gränssnitt"
 
-#: gitk:10996
+#: gitk:11154
 msgid "interface"
 msgstr "gränssnitt"
 
-#: gitk:10999
+#: gitk:11157
 msgid "Background"
 msgstr "Bakgrund"
 
-#: gitk:11000 gitk:11030
+#: gitk:11158 gitk:11188
 msgid "background"
 msgstr "bakgrund"
 
-#: gitk:11003
+#: gitk:11161
 msgid "Foreground"
 msgstr "Förgrund"
 
-#: gitk:11004
+#: gitk:11162
 msgid "foreground"
 msgstr "förgrund"
 
-#: gitk:11007
+#: gitk:11165
 msgid "Diff: old lines"
 msgstr "Diff: gamla rader"
 
-#: gitk:11008
+#: gitk:11166
 msgid "diff old lines"
 msgstr "diff gamla rader"
 
-#: gitk:11012
+#: gitk:11170
 msgid "Diff: new lines"
 msgstr "Diff: nya rader"
 
-#: gitk:11013
+#: gitk:11171
 msgid "diff new lines"
 msgstr "diff nya rader"
 
-#: gitk:11017
+#: gitk:11175
 msgid "Diff: hunk header"
 msgstr "Diff: delhuvud"
 
-#: gitk:11019
+#: gitk:11177
 msgid "diff hunk header"
 msgstr "diff delhuvud"
 
-#: gitk:11023
+#: gitk:11181
 msgid "Marked line bg"
 msgstr "Markerad rad bakgrund"
 
-#: gitk:11025
+#: gitk:11183
 msgid "marked line background"
 msgstr "markerad rad bakgrund"
 
-#: gitk:11029
+#: gitk:11187
 msgid "Select bg"
 msgstr "Markerad bakgrund"
 
-#: gitk:11038
+#: gitk:11196
 msgid "Fonts: press to choose"
 msgstr "Teckensnitt: tryck för att välja"
 
-#: gitk:11040
+#: gitk:11198
 msgid "Main font"
 msgstr "Huvudteckensnitt"
 
-#: gitk:11041
+#: gitk:11199
 msgid "Diff display font"
 msgstr "Teckensnitt för diffvisning"
 
-#: gitk:11042
+#: gitk:11200
 msgid "User interface font"
 msgstr "Teckensnitt för användargränssnitt"
 
-#: gitk:11064
+#: gitk:11222
 msgid "Gitk preferences"
 msgstr "Inställningar för Gitk"
 
-#: gitk:11073
+#: gitk:11231
 msgid "General"
 msgstr "Allmänt"
 
-#: gitk:11074
+#: gitk:11232
 msgid "Colors"
 msgstr "Färger"
 
-#: gitk:11075
+#: gitk:11233
 msgid "Fonts"
 msgstr "Teckensnitt"
 
-#: gitk:11125
+#: gitk:11283
 #, tcl-format
 msgid "Gitk: choose color for %s"
 msgstr "Gitk: välj färg för %s"
 
-#: gitk:11745
+#: gitk:11937
 msgid "Cannot find a git repository here."
 msgstr "Hittar inget git-arkiv här."
 
-#: gitk:11792
+#: gitk:11984
 #, tcl-format
 msgid "Ambiguous argument '%s': both revision and filename"
 msgstr "Tvetydigt argument \"%s\": både revision och filnamn"
 
-#: gitk:11804
+#: gitk:11996
 msgid "Bad arguments to gitk:"
 msgstr "Felaktiga argument till gitk:"
 
-#: gitk:11907
+#: gitk:12099
 msgid "Command line"
 msgstr "Kommandorad"
 
index 80950c018d54f3bbb7b700286b4923d39cbe2d00..8d69ada04291e308e39e999d49278b7af602f28f 100755 (executable)
@@ -1086,7 +1086,7 @@ sub evaluate_and_validate_params {
        our $search_use_regexp = $input_params{'search_use_regexp'};
 
        our $searchtext = $input_params{'searchtext'};
-       our $search_regexp;
+       our $search_regexp = undef;
        if (defined $searchtext) {
                if (length($searchtext) < 2) {
                        die_error(403, "At least two characters are required for search parameter");
diff --git a/help.c b/help.c
index 02ba043319932411e90121d4147f25395782dfb5..bebfce96e637fe2444fb8bd13f69c3d9cc147dd2 100644 (file)
--- a/help.c
+++ b/help.c
@@ -7,6 +7,7 @@
 #include "string-list.h"
 #include "column.h"
 #include "version.h"
+#include "refs.h"
 
 void add_cmdname(struct cmdnames *cmds, const char *name, int len)
 {
@@ -404,3 +405,52 @@ int cmd_version(int argc, const char **argv, const char *prefix)
        printf("git version %s\n", git_version_string);
        return 0;
 }
+
+struct similar_ref_cb {
+       const char *base_ref;
+       struct string_list *similar_refs;
+};
+
+static int append_similar_ref(const char *refname, const unsigned char *sha1,
+                             int flags, void *cb_data)
+{
+       struct similar_ref_cb *cb = (struct similar_ref_cb *)(cb_data);
+       char *branch = strrchr(refname, '/') + 1;
+       /* A remote branch of the same name is deemed similar */
+       if (!prefixcmp(refname, "refs/remotes/") &&
+           !strcmp(branch, cb->base_ref))
+               string_list_append(cb->similar_refs,
+                                  refname + strlen("refs/remotes/"));
+       return 0;
+}
+
+static struct string_list guess_refs(const char *ref)
+{
+       struct similar_ref_cb ref_cb;
+       struct string_list similar_refs = STRING_LIST_INIT_NODUP;
+
+       ref_cb.base_ref = ref;
+       ref_cb.similar_refs = &similar_refs;
+       for_each_ref(append_similar_ref, &ref_cb);
+       return similar_refs;
+}
+
+void help_unknown_ref(const char *ref, const char *cmd, const char *error)
+{
+       int i;
+       struct string_list suggested_refs = guess_refs(ref);
+
+       fprintf_ln(stderr, _("%s: %s - %s"), cmd, ref, error);
+
+       if (suggested_refs.nr > 0) {
+               fprintf_ln(stderr,
+                          Q_("\nDid you mean this?",
+                             "\nDid you mean one of these?",
+                             suggested_refs.nr));
+               for (i = 0; i < suggested_refs.nr; i++)
+                       fprintf(stderr, "\t%s\n", suggested_refs.items[i].string);
+       }
+
+       string_list_clear(&suggested_refs, 0);
+       exit(1);
+}
diff --git a/help.h b/help.h
index 0ae5a124a3af9912d551caed909aac77acc59b0b..b21d7c94e8ce429ac1f58bd566c69e154d84d6a0 100644 (file)
--- a/help.h
+++ b/help.h
@@ -27,4 +27,9 @@ extern void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes);
 extern int is_in_cmdlist(struct cmdnames *cmds, const char *name);
 extern void list_commands(unsigned int colopts, struct cmdnames *main_cmds, struct cmdnames *other_cmds);
 
+/*
+ * call this to die(), when it is suspected that the user mistyped a
+ * ref to the command, to give suggested "correct" refs.
+ */
+extern void help_unknown_ref(const char *ref, const char *cmd, const char *error);
 #endif /* HELP_H */
diff --git a/http.c b/http.c
index 92aba59082a4ed9aa0c92d8522793abcd332e279..2d086aedfac9a8ea384c53f3b1963149b880ed31 100644 (file)
--- a/http.c
+++ b/http.c
@@ -228,9 +228,15 @@ static void init_curl_http_auth(CURL *result)
 #else
        {
                static struct strbuf up = STRBUF_INIT;
-               strbuf_reset(&up);
-               strbuf_addf(&up, "%s:%s",
-                           http_auth.username, http_auth.password);
+               /*
+                * Note that we assume we only ever have a single set of
+                * credentials in a given program run, so we do not have
+                * to worry about updating this buffer, only setting its
+                * initial value.
+                */
+               if (!up.len)
+                       strbuf_addf(&up, "%s:%s",
+                               http_auth.username, http_auth.password);
                curl_easy_setopt(result, CURLOPT_USERPWD, up.buf);
        }
 #endif
index d9bcfb44dc334d86363fd60b576fcc2e2121f971..d6b65e204c6009e5c30f358810198319b70eda25 100644 (file)
 #ifdef NO_OPENSSL
 typedef void *SSL;
 #else
+#ifdef APPLE_COMMON_CRYPTO
+#include <CommonCrypto/CommonHMAC.h>
+#define HMAC_CTX CCHmacContext
+#define HMAC_Init(hmac, key, len, algo) CCHmacInit(hmac, algo, key, len)
+#define HMAC_Update CCHmacUpdate
+#define HMAC_Final(hmac, hash, ptr) CCHmacFinal(hmac, hash)
+#define HMAC_CTX_cleanup(ignore)
+#define EVP_md5() kCCHmacAlgMD5
+#else
 #include <openssl/evp.h>
 #include <openssl/hmac.h>
+#endif
 #include <openssl/x509v3.h>
 #endif
 
index 04ed561bfe7dd8fbf1988190f95eb1cc3530ff58..7040e7962bc598d706f1c37dff953bd52c7ab42f 100644 (file)
@@ -626,7 +626,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
                        if (*ptr == '/') {
                                struct cache_entry *foundce;
                                ++ptr;
-                               foundce = index_name_exists(&the_index, ce->name, ptr - ce->name, ignore_case);
+                               foundce = index_name_exists(istate, ce->name, ptr - ce->name, ignore_case);
                                if (foundce) {
                                        memcpy((void *)startPtr, foundce->name + (startPtr - ce->name), ptr - startPtr);
                                        startPtr = ptr;
@@ -979,7 +979,7 @@ int add_index_entry(struct index_state *istate, struct cache_entry *ce, int opti
        if (istate->cache_nr == istate->cache_alloc) {
                istate->cache_alloc = alloc_nr(istate->cache_alloc);
                istate->cache = xrealloc(istate->cache,
-                                       istate->cache_alloc * sizeof(struct cache_entry *));
+                                       istate->cache_alloc * sizeof(*istate->cache));
        }
 
        /* Add it in.. */
@@ -1449,7 +1449,7 @@ int read_index_from(struct index_state *istate, const char *path)
        istate->version = ntohl(hdr->hdr_version);
        istate->cache_nr = ntohl(hdr->hdr_entries);
        istate->cache_alloc = alloc_nr(istate->cache_nr);
-       istate->cache = xcalloc(istate->cache_alloc, sizeof(struct cache_entry *));
+       istate->cache = xcalloc(istate->cache_alloc, sizeof(*istate->cache));
        istate->initialized = 1;
 
        if (istate->version == 4)
index a67b615bfc7001ac28e339db1d91ea46a1b125b5..7f7a8ab7cb38eaceeb177472385a4a5fcfabe91c 100644 (file)
@@ -915,6 +915,19 @@ static void add_rev_cmdline(struct rev_info *revs,
        info->nr++;
 }
 
+static void add_rev_cmdline_list(struct rev_info *revs,
+                                struct commit_list *commit_list,
+                                int whence,
+                                unsigned flags)
+{
+       while (commit_list) {
+               struct object *object = &commit_list->item->object;
+               add_rev_cmdline(revs, object, sha1_to_hex(object->sha1),
+                               whence, flags);
+               commit_list = commit_list->next;
+       }
+}
+
 struct all_refs_cb {
        int all_flags;
        int warned_bad_reflog;
@@ -1092,6 +1105,7 @@ static void prepare_show_merge(struct rev_info *revs)
        add_pending_object(revs, &head->object, "HEAD");
        add_pending_object(revs, &other->object, "MERGE_HEAD");
        bases = get_merge_bases(head, other, 1);
+       add_rev_cmdline_list(revs, bases, REV_CMD_MERGE_BASE, UNINTERESTING);
        add_pending_commit_list(revs, bases, UNINTERESTING);
        free_commit_list(bases);
        head->object.flags |= SYMMETRIC_LEFT;
@@ -1179,6 +1193,9 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 
                        if (symmetric) {
                                exclude = get_merge_bases(a, b, 1);
+                               add_rev_cmdline_list(revs, exclude,
+                                                    REV_CMD_MERGE_BASE,
+                                                    flags_exclude);
                                add_pending_commit_list(revs, exclude,
                                                        flags_exclude);
                                free_commit_list(exclude);
index 01bd2b7c07719c9628bba13e34b581dc1fdbc0af..878a5556fd5e1c82f0fc35e1669e33623397ceeb 100644 (file)
@@ -35,6 +35,7 @@ struct rev_cmdline_info {
                        REV_CMD_PARENTS_ONLY,
                        REV_CMD_LEFT,
                        REV_CMD_RIGHT,
+                       REV_CMD_MERGE_BASE,
                        REV_CMD_REV
                } whence;
                unsigned flags;
index ab6f8a722d1dfa8f9633d8c046aad26ef4d0404e..f7be7d8be66992567fe2140c6aecdd3cc6140d38 100644 (file)
@@ -474,7 +474,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
        struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
        char *defmsg = NULL;
        struct strbuf msgbuf = STRBUF_INIT;
-       int res, unborn = 0;
+       int res, unborn = 0, allow;
 
        if (opts->no_commit) {
                /*
@@ -624,14 +624,18 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
                      msg.subject);
                print_advice(res == 1, opts);
                rerere(opts->allow_rerere_auto);
-       } else {
-               int allow = allow_empty(opts, commit);
-               if (allow < 0)
-                       return allow;
-               if (!opts->no_commit)
-                       res = run_git_commit(defmsg, opts, allow);
+               goto leave;
+       }
+
+       allow = allow_empty(opts, commit);
+       if (allow < 0) {
+               res = allow;
+               goto leave;
        }
+       if (!opts->no_commit)
+               res = run_git_commit(defmsg, opts, allow);
 
+leave:
        free_message(&msg);
        free(defmsg);
 
index 67e815b2db00e4d406693f82e96b11bb701509a5..b114cc922d4abce741b56e9da11fbef1382b4008 100644 (file)
@@ -2138,7 +2138,7 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
                if (!data)
                        die("failed to apply delta");
 
-               free (delta_data);
+               free(delta_data);
        }
 
        *final_type = type;
index 3820f28ae757cce54a95014629ade4f7feb56efc..b3a90e6f051e8b75458055144829ea72bbe29970 100644 (file)
@@ -517,12 +517,21 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
                }
                if (read_ref_at(real_ref, at_time, nth, sha1, NULL,
                                &co_time, &co_tz, &co_cnt)) {
+                       if (!len) {
+                               if (!prefixcmp(real_ref, "refs/heads/")) {
+                                       str = real_ref + 11;
+                                       len = strlen(real_ref + 11);
+                               } else {
+                                       /* detached HEAD */
+                                       str = "HEAD";
+                                       len = 4;
+                               }
+                       }
                        if (at_time)
                                warning("Log for '%.*s' only goes "
                                        "back to %s.", len, str,
                                        show_date(co_time, co_tz, DATE_RFC2822));
                        else {
-                               free(real_ref);
                                die("Log for '%.*s' only has %d entries.",
                                    len, str, co_cnt);
                        }
@@ -1033,14 +1042,15 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
         * points to something different than a branch.
         */
        if (!upstream)
-               return error(_("HEAD does not point to a branch"));
+               die(_("HEAD does not point to a branch"));
        if (!upstream->merge || !upstream->merge[0]->dst) {
                if (!ref_exists(upstream->refname))
-                       return error(_("No such branch: '%s'"), cp);
-               if (!upstream->merge)
-                       return error(_("No upstream configured for branch '%s'"),
-                                    upstream->name);
-               return error(
+                       die(_("No such branch: '%s'"), cp);
+               if (!upstream->merge) {
+                       die(_("No upstream configured for branch '%s'"),
+                               upstream->name);
+               }
+               die(
                        _("Upstream branch '%s' not stored as a remote-tracking branch"),
                        upstream->merge[0]->src);
        }
@@ -1055,9 +1065,13 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
 int strbuf_branchname(struct strbuf *sb, const char *name)
 {
        int len = strlen(name);
-       if (interpret_branch_name(name, sb) == len)
+       int used = interpret_branch_name(name, sb);
+
+       if (used == len)
                return 0;
-       strbuf_add(sb, name, len);
+       if (used < 0)
+               used = 0;
+       strbuf_add(sb, name + used, len - used);
        return len;
 }
 
index 6be915f38f1fe8dbe0a22c4cd8ae2569331f483f..cbe2526d8c2b2643957eea2729a16269a7a74fab 100644 (file)
--- a/shallow.c
+++ b/shallow.c
@@ -3,6 +3,16 @@
 #include "tag.h"
 
 static int is_shallow = -1;
+static struct stat shallow_stat;
+static char *alternate_shallow_file;
+
+void set_alternate_shallow_file(const char *path)
+{
+       if (is_shallow != -1)
+               die("BUG: is_repository_shallow must not be called before set_alternate_shallow_file");
+       free(alternate_shallow_file);
+       alternate_shallow_file = path ? xstrdup(path) : NULL;
+}
 
 int register_shallow(const unsigned char *sha1)
 {
@@ -21,12 +31,21 @@ int is_repository_shallow(void)
 {
        FILE *fp;
        char buf[1024];
+       const char *path = alternate_shallow_file;
 
        if (is_shallow >= 0)
                return is_shallow;
 
-       fp = fopen(git_path("shallow"), "r");
-       if (!fp) {
+       if (!path)
+               path = git_path("shallow");
+       /*
+        * fetch-pack sets '--shallow-file ""' as an indicator that no
+        * shallow file should be used. We could just open it and it
+        * will likely fail. But let's do an explicit check instead.
+        */
+       if (!*path ||
+           stat(path, &shallow_stat) ||
+           (fp = fopen(path, "r")) == NULL) {
                is_shallow = 0;
                return is_shallow;
        }
@@ -108,3 +127,22 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth,
 
        return result;
 }
+
+void check_shallow_file_for_update(void)
+{
+       struct stat st;
+
+       if (!is_shallow)
+               return;
+       else if (is_shallow == -1)
+               die("BUG: shallow must be initialized by now");
+
+       if (stat(git_path("shallow"), &st))
+               die("shallow file was removed during fetch");
+       else if (st.st_mtime != shallow_stat.st_mtime
+#ifdef USE_NSEC
+                || ST_MTIME_NSEC(st) != ST_MTIME_NSEC(shallow_stat)
+#endif
+                  )
+               die("shallow file was changed during fetch");
+}
index e728025f60dbf7f3df87b7104af6410832ddb653..1821a5b3160bd3a3e60f328b50b56a0208b2df9c 100644 (file)
@@ -603,9 +603,8 @@ int fetch_populated_submodules(const struct argv_array *options,
        if (!work_tree)
                goto out;
 
-       if (!the_index.initialized)
-               if (read_cache() < 0)
-                       die("index file corrupt");
+       if (read_cache() < 0)
+               die("index file corrupt");
 
        argv_array_push(&argv, "fetch");
        for (i = 0; i < options->argc; i++)
index e669bb31b9aa2513a6f71de9fd066a21a0a3bde7..35b3c5c2faec0ed543dde460a30de63c48e5f1e7 100644 (file)
--- a/t/README
+++ b/t/README
@@ -324,6 +324,9 @@ Don't:
    use 'test_must_fail git cmd'.  This will signal a failure if git
    dies in an unexpected way (e.g. segfault).
 
+   On the other hand, don't use test_must_fail for running regular
+   platform commands; just use '! cmd'.
+
  - use perl without spelling it as "$PERL_PATH". This is to help our
    friends on Windows where the platform Perl often adds CR before
    the end of line, and they bundle Git with a version of Perl that
index 6ccf7970916b58748aedcce7e583eed2dee782d3..8098a88c823d691a4e349cd544e19f9b340b7650 100644 (file)
@@ -17,6 +17,8 @@
 #       ("squash", "fixup", "edit", or "reword") and the SHA1 taken
 #       from the specified line.
 #
+#   "exec_cmd_with_args" -- add an "exec cmd with args" line.
+#
 #   "#" -- Add a comment line.
 #
 #   ">" -- Add a blank line.
index da2c504e53e37840f71790d6b262106b7b57d697..986b2a8f2664b1734964049a5b24fc50cf938cfe 100755 (executable)
@@ -17,7 +17,7 @@ test_expect_success 'mktemp to nonexistent directory prints filename' '
        grep "doesnotexist/test" err
 '
 
-test_expect_success POSIXPERM 'mktemp to unwritable directory prints filename' '
+test_expect_success POSIXPERM,SANITY 'mktemp to unwritable directory prints filename' '
        mkdir cannotwrite &&
        chmod -w cannotwrite &&
        test_when_finished "chmod +w cannotwrite" &&
index 315b9b3f10cfae0186afca6f8024d73cce0a19e2..e0a69402324fed3c2fd7ca9495f5735742766108 100755 (executable)
@@ -27,6 +27,7 @@ test_expect_success 'merge @{-1}' '
        test_commit B &&
        git checkout A &&
        test_commit C &&
+       test_commit D &&
        git branch -f master B &&
        git branch -f other &&
        git checkout other &&
@@ -35,14 +36,24 @@ test_expect_success 'merge @{-1}' '
        git cat-file commit HEAD | grep "Merge branch '\''other'\''"
 '
 
-test_expect_success 'merge @{-1} when there is not enough switches yet' '
+test_expect_success 'merge @{-1}~1' '
+       git checkout master &&
+       git reset --hard B &&
+       git checkout other &&
+       git checkout master &&
+       git merge @{-1}~1 &&
+       git cat-file commit HEAD >actual &&
+       grep "Merge branch '\''other'\''" actual
+'
+
+test_expect_success 'merge @{-100} before checking out that many branches yet' '
        git reflog expire --expire=now &&
        git checkout -f master &&
        git reset --hard B &&
        git branch -f other C &&
        git checkout other &&
        git checkout master &&
-       test_must_fail git merge @{-12}
+       test_must_fail git merge @{-100}
 '
 
 test_done
index b27a7209f7401706f3b0a37b495fc0cb3a07c29e..2a19e797eb7cffba28deb4e99b3708c5b26602ae 100755 (executable)
@@ -129,8 +129,7 @@ test_expect_success 'branch@{u} works when tracking a local branch' '
 
 test_expect_success 'branch@{u} error message when no upstream' '
        cat >expect <<-EOF &&
-       error: No upstream configured for branch ${sq}non-tracking${sq}
-       fatal: Needed a single revision
+       fatal: No upstream configured for branch ${sq}non-tracking${sq}
        EOF
        error_message non-tracking@{u} 2>actual &&
        test_i18ncmp expect actual
@@ -138,8 +137,7 @@ test_expect_success 'branch@{u} error message when no upstream' '
 
 test_expect_success '@{u} error message when no upstream' '
        cat >expect <<-EOF &&
-       error: No upstream configured for branch ${sq}master${sq}
-       fatal: Needed a single revision
+       fatal: No upstream configured for branch ${sq}master${sq}
        EOF
        test_must_fail git rev-parse --verify @{u} 2>actual &&
        test_i18ncmp expect actual
@@ -147,8 +145,7 @@ test_expect_success '@{u} error message when no upstream' '
 
 test_expect_success 'branch@{u} error message with misspelt branch' '
        cat >expect <<-EOF &&
-       error: No such branch: ${sq}no-such-branch${sq}
-       fatal: Needed a single revision
+       fatal: No such branch: ${sq}no-such-branch${sq}
        EOF
        error_message no-such-branch@{u} 2>actual &&
        test_i18ncmp expect actual
@@ -156,8 +153,7 @@ test_expect_success 'branch@{u} error message with misspelt branch' '
 
 test_expect_success '@{u} error message when not on a branch' '
        cat >expect <<-EOF &&
-       error: HEAD does not point to a branch
-       fatal: Needed a single revision
+       fatal: HEAD does not point to a branch
        EOF
        git checkout HEAD^0 &&
        test_must_fail git rev-parse --verify @{u} 2>actual &&
@@ -166,8 +162,7 @@ test_expect_success '@{u} error message when not on a branch' '
 
 test_expect_success 'branch@{u} error message if upstream branch not fetched' '
        cat >expect <<-EOF &&
-       error: Upstream branch ${sq}refs/heads/side${sq} not stored as a remote-tracking branch
-       fatal: Needed a single revision
+       fatal: Upstream branch ${sq}refs/heads/side${sq} not stored as a remote-tracking branch
        EOF
        error_message bad-upstream@{u} 2>actual &&
        test_i18ncmp expect actual
diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh
new file mode 100755 (executable)
index 0000000..dee55e4
--- /dev/null
@@ -0,0 +1,167 @@
+#!/bin/sh
+
+test_description='checkout <branch>
+
+Ensures that checkout on an unborn branch does what the user expects'
+
+. ./test-lib.sh
+
+# Is the current branch "refs/heads/$1"?
+test_branch () {
+       printf "%s\n" "refs/heads/$1" >expect.HEAD &&
+       git symbolic-ref HEAD >actual.HEAD &&
+       test_cmp expect.HEAD actual.HEAD
+}
+
+# Is branch "refs/heads/$1" set to pull from "$2/$3"?
+test_branch_upstream () {
+       printf "%s\n" "$2" "refs/heads/$3" >expect.upstream &&
+       {
+               git config "branch.$1.remote" &&
+               git config "branch.$1.merge"
+       } >actual.upstream &&
+       test_cmp expect.upstream actual.upstream
+}
+
+test_expect_success 'setup' '
+       test_commit my_master &&
+       git init repo_a &&
+       (
+               cd repo_a &&
+               test_commit a_master &&
+               git checkout -b foo &&
+               test_commit a_foo &&
+               git checkout -b bar &&
+               test_commit a_bar
+       ) &&
+       git init repo_b &&
+       (
+               cd repo_b &&
+               test_commit b_master &&
+               git checkout -b foo &&
+               test_commit b_foo &&
+               git checkout -b baz &&
+               test_commit b_baz
+       ) &&
+       git remote add repo_a repo_a &&
+       git remote add repo_b repo_b &&
+       git config remote.repo_b.fetch \
+               "+refs/heads/*:refs/remotes/other_b/*" &&
+       git fetch --all
+'
+
+test_expect_success 'checkout of non-existing branch fails' '
+       git checkout -B master &&
+       test_might_fail git branch -D xyzzy &&
+
+       test_must_fail git checkout xyzzy &&
+       test_must_fail git rev-parse --verify refs/heads/xyzzy &&
+       test_branch master
+'
+
+test_expect_success 'checkout of branch from multiple remotes fails #1' '
+       git checkout -B master &&
+       test_might_fail git branch -D foo &&
+
+       test_must_fail git checkout foo &&
+       test_must_fail git rev-parse --verify refs/heads/foo &&
+       test_branch master
+'
+
+test_expect_success 'checkout of branch from a single remote succeeds #1' '
+       git checkout -B master &&
+       test_might_fail git branch -D bar &&
+
+       git checkout bar &&
+       test_branch bar &&
+       test_cmp_rev remotes/repo_a/bar HEAD &&
+       test_branch_upstream bar repo_a bar
+'
+
+test_expect_success 'checkout of branch from a single remote succeeds #2' '
+       git checkout -B master &&
+       test_might_fail git branch -D baz &&
+
+       git checkout baz &&
+       test_branch baz &&
+       test_cmp_rev remotes/other_b/baz HEAD &&
+       test_branch_upstream baz repo_b baz
+'
+
+test_expect_success '--no-guess suppresses branch auto-vivification' '
+       git checkout -B master &&
+       test_might_fail git branch -D bar &&
+
+       test_must_fail git checkout --no-guess bar &&
+       test_must_fail git rev-parse --verify refs/heads/bar &&
+       test_branch master
+'
+
+test_expect_success 'setup more remotes with unconventional refspecs' '
+       git checkout -B master &&
+       git init repo_c &&
+       (
+               cd repo_c &&
+               test_commit c_master &&
+               git checkout -b bar &&
+               test_commit c_bar
+               git checkout -b spam &&
+               test_commit c_spam
+       ) &&
+       git init repo_d &&
+       (
+               cd repo_d &&
+               test_commit d_master &&
+               git checkout -b baz &&
+               test_commit f_baz
+               git checkout -b eggs &&
+               test_commit c_eggs
+       ) &&
+       git remote add repo_c repo_c &&
+       git config remote.repo_c.fetch \
+               "+refs/heads/*:refs/remotes/extra_dir/repo_c/extra_dir/*" &&
+       git remote add repo_d repo_d &&
+       git config remote.repo_d.fetch \
+               "+refs/heads/*:refs/repo_d/*" &&
+       git fetch --all
+'
+
+test_expect_success 'checkout of branch from multiple remotes fails #2' '
+       git checkout -B master &&
+       test_might_fail git branch -D bar &&
+
+       test_must_fail git checkout bar &&
+       test_must_fail git rev-parse --verify refs/heads/bar &&
+       test_branch master
+'
+
+test_expect_success 'checkout of branch from multiple remotes fails #3' '
+       git checkout -B master &&
+       test_might_fail git branch -D baz &&
+
+       test_must_fail git checkout baz &&
+       test_must_fail git rev-parse --verify refs/heads/baz &&
+       test_branch master
+'
+
+test_expect_success 'checkout of branch from a single remote succeeds #3' '
+       git checkout -B master &&
+       test_might_fail git branch -D spam &&
+
+       git checkout spam &&
+       test_branch spam &&
+       test_cmp_rev refs/remotes/extra_dir/repo_c/extra_dir/spam HEAD &&
+       test_branch_upstream spam repo_c spam
+'
+
+test_expect_success 'checkout of branch from a single remote succeeds #4' '
+       git checkout -B master &&
+       test_might_fail git branch -D eggs &&
+
+       git checkout eggs &&
+       test_branch eggs &&
+       test_cmp_rev refs/repo_d/eggs HEAD &&
+       test_branch_upstream eggs repo_d eggs
+'
+
+test_done
index 4e3735f0cb28d2b545f59a2464ea74bea4b626a1..f0421c09c700bc1203d2ef563c54157e94c83b33 100755 (executable)
@@ -175,6 +175,24 @@ test_expect_success 'negated exclude matches can override previous ones' '
        grep "^a.1" output
 '
 
+test_expect_success 'excluded directory overrides content patterns' '
+
+       git ls-files --others --exclude="one" --exclude="!one/a.1" >output &&
+       if grep "^one/a.1" output
+       then
+               false
+       fi
+'
+
+test_expect_success 'negated directory doesn'\''t affect content patterns' '
+
+       git ls-files --others --exclude="!one" --exclude="one/a.1" >output &&
+       if grep "^one/a.1" output
+       then
+               false
+       fi
+'
+
 test_expect_success 'subdirectory ignore (setup)' '
        mkdir -p top/l1/l2 &&
        (
index 4c37057ddf4a6796c88dba45f0123da1a44fb4af..38446a0e872e90fb008d6d42784a1892bab214e9 100755 (executable)
@@ -6,20 +6,20 @@ test_description='wildmatch tests'
 
 match() {
     if [ $1 = 1 ]; then
-       test_expect_success "wildmatch:    match '$3' '$4'" "
+       test_expect_success "wildmatch:     match '$3' '$4'" "
            test-wildmatch wildmatch '$3' '$4'
        "
     else
-       test_expect_success "wildmatch: no match '$3' '$4'" "
+       test_expect_success "wildmatch:  no match '$3' '$4'" "
            ! test-wildmatch wildmatch '$3' '$4'
        "
     fi
     if [ $2 = 1 ]; then
-       test_expect_success "fnmatch:      match '$3' '$4'" "
+       test_expect_success "fnmatch:       match '$3' '$4'" "
            test-wildmatch fnmatch '$3' '$4'
        "
     elif [ $2 = 0 ]; then
-       test_expect_success "fnmatch:   no match '$3' '$4'" "
+       test_expect_success "fnmatch:    no match '$3' '$4'" "
            ! test-wildmatch fnmatch '$3' '$4'
        "
 #    else
@@ -29,13 +29,25 @@ match() {
     fi
 }
 
+imatch() {
+    if [ $1 = 1 ]; then
+       test_expect_success "iwildmatch:    match '$2' '$3'" "
+           test-wildmatch iwildmatch '$2' '$3'
+       "
+    else
+       test_expect_success "iwildmatch: no match '$2' '$3'" "
+           ! test-wildmatch iwildmatch '$2' '$3'
+       "
+    fi
+}
+
 pathmatch() {
     if [ $1 = 1 ]; then
-       test_expect_success "pathmatch:    match '$2' '$3'" "
+       test_expect_success "pathmatch:     match '$2' '$3'" "
            test-wildmatch pathmatch '$2' '$3'
        "
     else
-       test_expect_success "pathmatch: no match '$2' '$3'" "
+       test_expect_success "pathmatch:  no match '$2' '$3'" "
            ! test-wildmatch pathmatch '$2' '$3'
        "
     fi
@@ -235,4 +247,35 @@ pathmatch 1 abcXdefXghi '*X*i'
 pathmatch 1 ab/cXd/efXg/hi '*/*X*/*/*i'
 pathmatch 1 ab/cXd/efXg/hi '*Xg*i'
 
+# Case-sensitivy features
+match 0 x 'a' '[A-Z]'
+match 1 x 'A' '[A-Z]'
+match 0 x 'A' '[a-z]'
+match 1 x 'a' '[a-z]'
+match 0 x 'a' '[[:upper:]]'
+match 1 x 'A' '[[:upper:]]'
+match 0 x 'A' '[[:lower:]]'
+match 1 x 'a' '[[:lower:]]'
+match 0 x 'A' '[B-Za]'
+match 1 x 'a' '[B-Za]'
+match 0 x 'A' '[B-a]'
+match 1 x 'a' '[B-a]'
+match 0 x 'z' '[Z-y]'
+match 1 x 'Z' '[Z-y]'
+
+imatch 1 'a' '[A-Z]'
+imatch 1 'A' '[A-Z]'
+imatch 1 'A' '[a-z]'
+imatch 1 'a' '[a-z]'
+imatch 1 'a' '[[:upper:]]'
+imatch 1 'A' '[[:upper:]]'
+imatch 1 'A' '[[:lower:]]'
+imatch 1 'a' '[[:lower:]]'
+imatch 1 'A' '[B-Za]'
+imatch 1 'a' '[B-Za]'
+imatch 1 'A' '[B-a]'
+imatch 1 'a' '[B-a]'
+imatch 1 'z' '[Z-y]'
+imatch 1 'Z' '[Z-y]'
+
 test_done
index d969f0ecd85a6907f219d141cad2c00c4b5a89f8..44ec6a45f473ffe47aca6945c0e0aab445728f67 100755 (executable)
@@ -317,13 +317,13 @@ test_expect_success 'test tracking setup (non-wildcard, matching)' '
        test $(git config branch.my4.merge) = refs/heads/master
 '
 
-test_expect_success 'test tracking setup (non-wildcard, not matching)' '
+test_expect_success 'tracking setup fails on non-matching refspec' '
        git config remote.local.url . &&
        git config remote.local.fetch refs/heads/s:refs/remotes/local/s &&
        (git show-ref -q refs/remotes/local/master || git fetch local) &&
-       git branch --track my5 local/master &&
-       ! test "$(git config branch.my5.remote)" = local &&
-       ! test "$(git config branch.my5.merge)" = refs/heads/master
+       test_must_fail git branch --track my5 local/master &&
+       test_must_fail git config branch.my5.remote &&
+       test_must_fail git config branch.my5.merge
 '
 
 test_expect_success 'test tracking setup via config' '
index 1261dbbdf5869b671e36cd7128bfde61fd67b8de..1019d7b35fcb350761a44cf4ccd5ae156ce8d577 100755 (executable)
@@ -353,4 +353,52 @@ test_expect_failure 'combine diff coalesce three parents' '
        compare_diff_patch expected actual
 '
 
+# Test for a bug reported at
+# http://thread.gmane.org/gmane.comp.version-control.git/224410
+# where a delete lines were missing from combined diff output when they
+# occurred exactly before the context lines of a later change.
+test_expect_success 'combine diff missing delete bug' '
+       git commit -m initial --allow-empty &&
+       cat <<-\EOF >test &&
+       1
+       2
+       3
+       4
+       EOF
+       git add test &&
+       git commit -a -m side1 &&
+       git checkout -B side1 &&
+       git checkout HEAD^ &&
+       cat <<-\EOF >test &&
+       0
+       1
+       2
+       3
+       4modified
+       EOF
+       git add test &&
+       git commit -m side2 &&
+       git branch -f side2 &&
+       test_must_fail git merge --no-commit side1 &&
+       cat <<-\EOF >test &&
+       1
+       2
+       3
+       4modified
+       EOF
+       git add test &&
+       git commit -a -m merge &&
+       git diff-tree -c -p HEAD >actual.tmp &&
+       sed -e "1,/^@@@/d" < actual.tmp >actual &&
+       tr -d Q <<-\EOF >expected &&
+       - 0
+         1
+         2
+         3
+        -4
+        +4modified
+       EOF
+       compare_diff_patch expected actual
+'
+
 test_done
index 7c398432bad761c1b38c6d15548bed0c389221fd..1618a6dbc7c718677cf669b5f6fc96f2682992fb 100755 (executable)
@@ -86,6 +86,20 @@ test_expect_success 'apply --index from subdir of toplevel' '
        test_cmp expected sub/dir/file
 '
 
+test_expect_success 'apply half-broken patch from subdir of toplevel' '
+       (
+               cd sub/dir &&
+               test_must_fail git apply <<-EOF
+               --- sub/dir/file
+               +++ sub/dir/file
+               @@ -1,0 +1,0 @@
+               --- file_in_root
+               +++ file_in_root
+               @@ -1,0 +1,0 @@
+               EOF
+       )
+'
+
 test_expect_success 'apply from .git dir' '
        cp postimage expected &&
        cp preimage .git/file &&
index 9243a979933997286bb6004bd7b224bad1bbc5cc..cb03d287698f110b66e69636348caccdbe6a94f8 100755 (executable)
@@ -530,6 +530,20 @@ test_expect_success 'show added path under "--follow -M"' '
        )
 '
 
+test_expect_success 'git log -c --follow' '
+       test_create_repo follow-c &&
+       (
+               cd follow-c &&
+               test_commit initial file original &&
+               git rm file &&
+               test_commit rename file2 original &&
+               git reset --hard initial &&
+               test_commit modify file foo &&
+               git merge -m merge rename &&
+               git log -c --follow file2
+       )
+'
+
 cat >expect <<\EOF
 *   commit COMMIT_OBJECT_NAME
 |\  Merge: MERGE_PARENTS
index 8d1bbd356ac9a22021db0cdbd14544fbcf3c9246..67f3b54bed3545417d1f6186f6f42452cb55dc87 100755 (executable)
@@ -27,6 +27,21 @@ check_dir() {
        test_cmp expect actual
 }
 
+
+# bsdtar/libarchive versions before 3.1.3 consider a tar file with a
+# global pax header that is not followed by a file record as corrupt.
+if "$TAR" tf "$TEST_DIRECTORY"/t5004/empty-with-pax-header.tar >/dev/null 2>&1
+then
+       test_set_prereq HEADER_ONLY_TAR_OK
+fi
+
+test_expect_success HEADER_ONLY_TAR_OK 'tar archive of commit with empty tree' '
+       git archive --format=tar HEAD >empty-with-pax-header.tar &&
+       make_dir extract &&
+       "$TAR" xf empty-with-pax-header.tar -C extract &&
+       check_dir extract
+'
+
 test_expect_success 'tar archive of empty tree is empty' '
        git archive --format=tar HEAD: >empty.tar &&
        perl -e "print \"\\0\" x 10240" >10knuls.tar &&
diff --git a/t/t5004/empty-with-pax-header.tar b/t/t5004/empty-with-pax-header.tar
new file mode 100644 (file)
index 0000000..da9e39e
Binary files /dev/null and b/t/t5004/empty-with-pax-header.tar differ
index d574085696e81522669119c9b7480ba4c682c968..fd2598e60190fe04381652c7dfe997e01b4ea0c5 100755 (executable)
@@ -135,6 +135,13 @@ test_expect_success 'clone shallow depth 1' '
        test "`git --git-dir=shallow0/.git rev-list --count HEAD`" = 1
 '
 
+test_expect_success 'clone shallow depth 1 with fsck' '
+       git config --global fetch.fsckobjects true &&
+       git clone --no-single-branch --depth 1 "file://$(pwd)/." shallow0fsck &&
+       test "`git --git-dir=shallow0fsck/.git rev-list --count HEAD`" = 1 &&
+       git config --global --unset fetch.fsckobjects
+'
+
 test_expect_success 'clone shallow' '
        git clone --no-single-branch --depth 2 "file://$(pwd)/." shallow
 '
@@ -373,6 +380,20 @@ test_expect_success 'clone shallow with packed refs' '
        test_cmp count8.expected count8.actual
 '
 
+test_expect_success 'fetch in shallow repo unreachable shallow objects' '
+       (
+               git clone --bare --branch B --single-branch "file://$(pwd)/." no-reflog &&
+               git clone --depth 1 "file://$(pwd)/no-reflog" shallow9 &&
+               cd no-reflog &&
+               git tag -d TAGB1 TAGB2 &&
+               git update-ref refs/heads/B B~~ &&
+               git gc --prune=now &&
+               cd ../shallow9 &&
+               git fetch origin &&
+               git fsck --no-dangling
+       )
+'
+
 test_expect_success 'setup tests for the --stdin parameter' '
        for head in C D E F
        do
index 6af6c63350383e049082e61d3c8133af79d5a749..ed4d9c83181bc45456074f053ed5a0f137fc7e27 100755 (executable)
@@ -57,6 +57,35 @@ test_expect_success 'pulling into void does not overwrite untracked files' '
        )
 '
 
+test_expect_success 'pulling into void does not overwrite staged files' '
+       git init cloned-staged-colliding &&
+       (
+               cd cloned-staged-colliding &&
+               echo "alternate content" >file &&
+               git add file &&
+               test_must_fail git pull .. master &&
+               echo "alternate content" >expect &&
+               test_cmp expect file &&
+               git cat-file blob :file >file.index &&
+               test_cmp expect file.index
+       )
+'
+
+
+test_expect_success 'pulling into void does not remove new staged files' '
+       git init cloned-staged-new &&
+       (
+               cd cloned-staged-new &&
+               echo "new tracked file" >newfile &&
+               git add newfile &&
+               git pull .. master &&
+               echo "new tracked file" >expect &&
+               test_cmp expect newfile &&
+               git cat-file blob :newfile >newfile.index &&
+               test_cmp expect newfile.index
+       )
+'
+
 test_expect_success 'test . as a remote' '
 
        git branch copy master &&
index b23efbbfd9586670f1eeee114a1335b9dad4d97f..55a866af803452e164e2c11c421b1e63f62d2e1e 100755 (executable)
@@ -209,13 +209,17 @@ test_expect_success EXPENSIVE 'create 50,000 tags in the repo' '
 
        # now assign tags to all the dangling commits we created above
        tag=$("$PERL_PATH" -e "print \"bla\" x 30") &&
-       sed -e "s/^:\(.\+\) \(.\+\)$/\2 refs\/tags\/$tag-\1/" <marks >>packed-refs
+       sed -e "s|^:\([^ ]*\) \(.*\)$|\2 refs/tags/$tag-\1|" <marks >>packed-refs
        )
 '
 
 test_expect_success EXPENSIVE 'clone the 50,000 tag repo to check OS command line overflow' '
        git clone $HTTPD_URL/smart/repo.git too-many-refs 2>err &&
-       test_line_count = 0 err
+       test_line_count = 0 err &&
+       (
+               cd too-many-refs &&
+               test $(git for-each-ref refs/tags | wc -l) = 50000
+       )
 '
 
 stop_httpd
index 39b4cb0ecdc8801b355b815a0566c6e2df5c5a39..dd5b0e55d26b0f9258ae47425050083abe385fc0 100755 (executable)
@@ -13,6 +13,9 @@ test_description='--ancestry-path'
 #
 #  D..M -- M.t                 == M
 #  --ancestry-path D..M -- M.t == M
+#
+#  F...I                 == F G H I
+#  --ancestry-path F...I == F H I
 
 . ./test-lib.sh
 
@@ -63,13 +66,29 @@ test_expect_success 'rev-list D..M -- M.t' '
        test_cmp expect actual
 '
 
-test_expect_success 'rev-list --ancestry-patch D..M -- M.t' '
+test_expect_success 'rev-list --ancestry-path D..M -- M.t' '
        echo M >expect &&
        git rev-list --ancestry-path --format=%s D..M -- M.t |
        sed -e "/^commit /d" >actual &&
        test_cmp expect actual
 '
 
+test_expect_success 'rev-list F...I' '
+       for c in F G H I; do echo $c; done >expect &&
+       git rev-list --format=%s F...I |
+       sed -e "/^commit /d" |
+       sort >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'rev-list --ancestry-path F...I' '
+       for c in F H I; do echo $c; done >expect &&
+       git rev-list --ancestry-path --format=%s F...I |
+       sed -e "/^commit /d" |
+       sort >actual &&
+       test_cmp expect actual
+'
+
 #   b---bc
 #  / \ /
 # a   X
index 8f3b54d826f5a9c8e7b08df7f6a58398b5a62480..88d60c1ce2933141c0800a76fdebca9037803258 100755 (executable)
@@ -91,12 +91,12 @@ test_expect_success 'update-index --remove' '
        test_cmp expected 1
 '
 
-test_expect_success 'ls-files --delete' '
+test_expect_success 'ls-files --deleted' '
        setup_absent &&
        test -z "$(git ls-files -d)"
 '
 
-test_expect_success 'ls-files --delete' '
+test_expect_success 'ls-files --deleted' '
        setup_dirty &&
        test -z "$(git ls-files -d)"
 '
index be9672e5a0222f0a796f400b2c22c615fff195a4..0c9ec0ad44ef4e3239e67a0c9e9ecc1340dcee8a 100755 (executable)
@@ -431,6 +431,7 @@ test_expect_success 'detach a symbolic link HEAD' '
 
 test_expect_success \
     'checkout with --track fakes a sensible -b <name>' '
+    git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" &&
     git update-ref refs/remotes/origin/koala/bear renamer &&
 
     git checkout --track origin/koala/bear &&
index ff265353a375d02bb578fed29ea00f07dc08a6fc..7e2342130938c4d476f7d97464da9d8388479d98 100755 (executable)
@@ -868,4 +868,19 @@ test_expect_success 'submodule deinit fails when submodule has a .git directory
        test -n "$(git config --get-regexp "submodule\.example\.")"
 '
 
+test_expect_success 'submodule with UTF-8 name' '
+       svname=$(printf "\303\245 \303\244\303\266") &&
+       mkdir "$svname" &&
+       (
+               cd "$svname" &&
+               git init &&
+               >sub &&
+               git add sub &&
+               git commit -m "init sub"
+       ) &&
+       test_config core.precomposeunicode true &&
+       git submodule add ./"$svname" &&
+       git submodule >&2 &&
+       test -n "$(git submodule | grep "$svname")"
+'
 test_done
index 436b7b606e3eab09a0dd8c1b67ab90e43c24dffc..bdc1f295030b61fd6d4fc0ef672dffa99c027d8b 100755 (executable)
@@ -13,9 +13,9 @@ commit_msg_is () {
        expect=commit_msg_is.expect
        actual=commit_msg_is.actual
 
-       printf "%s" "$(git log --pretty=format:%s%b -1)" >$expect &&
-       printf "%s" "$1" >$actual &&
-       test_i18ncmp $expect $actual
+       printf "%s" "$(git log --pretty=format:%s%b -1)" >"$actual" &&
+       printf "%s" "$1" >"$expect" &&
+       test_i18ncmp "$expect" "$actual"
 }
 
 # A sanity check to see if commit is working at all.
index a4938b1e4549d5082362ec3f5513ffe91f210d39..6313da2cdd979c6264e7a255711c6e444b768b96 100755 (executable)
@@ -361,6 +361,23 @@ test_expect_success !AUTOIDENT 'do not fire editor when committer is bogus' '
        test_cmp expect .git/result
 '
 
+test_expect_success 'do not fire editor if -m <msg> was given' '
+       echo tick >file &&
+       git add file &&
+       echo "editor not started" >.git/result &&
+       (GIT_EDITOR="\"$(pwd)/.git/FAKE_EDITOR\"" git commit -m tick) &&
+       test "$(cat .git/result)" = "editor not started"
+'
+
+test_expect_success 'do not fire editor if -m "" was given' '
+       echo tock >file &&
+       git add file &&
+       echo "editor not started" >.git/result &&
+       (GIT_EDITOR="\"$(pwd)/.git/FAKE_EDITOR\"" \
+        git commit -m "" --allow-empty-message) &&
+       test "$(cat .git/result)" = "editor not started"
+'
+
 test_expect_success 'do not fire editor in the presence of conflicts' '
 
        git clean -f &&
index a6bd99eaf51943a899aa5e5801479b0a84b6b692..2418528487624bf5497af71c9958a84e0a50328f 100755 (executable)
@@ -356,6 +356,13 @@ run_dir_diff_test 'difftool --dir-diff from subdirectory' '
        )
 '
 
+run_dir_diff_test 'difftool --dir-diff when worktree file is missing' '
+       test_when_finished git reset --hard &&
+       rm file2 &&
+       git difftool --dir-diff $symlinks --extcmd ls branch master >output &&
+       grep file2 output
+'
+
 write_script .git/CHECK_SYMLINKS <<\EOF
 for f in file file2 sub/sub
 do
@@ -378,6 +385,25 @@ test_expect_success PERL,SYMLINKS 'difftool --dir-diff --symlink without unstage
        test_cmp actual expect
 '
 
+write_script modify-right-file <<\EOF
+echo "new content" >"$2/file"
+EOF
+
+run_dir_diff_test 'difftool --dir-diff syncs worktree with unstaged change' '
+       test_when_finished git reset --hard &&
+       echo "orig content" >file &&
+       git difftool -d $symlinks --extcmd "$(pwd)/modify-right-file" branch &&
+       echo "new content" >expect &&
+       test_cmp expect file
+'
+
+run_dir_diff_test 'difftool --dir-diff syncs worktree without unstaged change' '
+       test_when_finished git reset --hard &&
+       git difftool -d $symlinks --extcmd "$(pwd)/modify-right-file" branch &&
+       echo "new content" >expect &&
+       test_cmp expect file
+'
+
 write_script modify-file <<\EOF
 echo "new content" >file
 EOF
index ebd5c5db45c8816f39b2d8c60775f455ab9c48aa..d6f0271866173be0fdaf6d1308b1027e882f9b30 100755 (executable)
@@ -171,6 +171,81 @@ Result: OK
 EOF
 "
 
+test_suppress_self () {
+       test_commit $3 &&
+       test_when_finished "git reset --hard HEAD^" &&
+
+       write_script cccmd-sed <<-EOF &&
+               sed -n -e s/^cccmd--//p "\$1"
+       EOF
+
+       git commit --amend --author="$1 <$2>" -F - &&
+       clean_fake_sendmail &&
+       git format-patch --stdout -1 >"suppress-self-$3.patch" &&
+
+       git send-email --from="$1 <$2>" \
+               --to=nobody@example.com \
+               --cc-cmd=./cccmd-sed \
+               --suppress-cc=self \
+               --smtp-server="$(pwd)/fake.sendmail" \
+               suppress-self-$3.patch &&
+
+       mv msgtxt1 msgtxt1-$3 &&
+       sed -e '/^$/q' msgtxt1-$3 >"msghdr1-$3" &&
+       >"expected-no-cc-$3" &&
+
+       (grep '^Cc:' msghdr1-$3 >"actual-no-cc-$3";
+        test_cmp expected-no-cc-$3 actual-no-cc-$3)
+}
+
+test_suppress_self_unquoted () {
+       test_suppress_self "$1" "$2" "unquoted-$3" <<-EOF
+               test suppress-cc.self unquoted-$3 with name $1 email $2
+
+               unquoted-$3
+
+               cccmd--$1 <$2>
+
+               Cc: $1 <$2>
+               Signed-off-by: $1 <$2>
+       EOF
+}
+
+test_suppress_self_quoted () {
+       test_suppress_self "$1" "$2" "quoted-$3" <<-EOF
+               test suppress-cc.self quoted-$3 with name $1 email $2
+
+               quoted-$3
+
+               cccmd--"$1" <$2>
+
+               Cc: $1 <$2>
+               Cc: "$1" <$2>
+               Signed-off-by: $1 <$2>
+               Signed-off-by: "$1" <$2>
+       EOF
+}
+
+test_expect_success $PREREQ 'self name is suppressed' "
+       test_suppress_self_unquoted 'A U Thor' 'author@example.com' \
+               'self_name_suppressed'
+"
+
+test_expect_success $PREREQ 'self name with dot is suppressed' "
+       test_suppress_self_quoted 'A U. Thor' 'author@example.com' \
+               'self_name_dot_suppressed'
+"
+
+test_expect_success $PREREQ 'non-ascii self name is suppressed' "
+       test_suppress_self_quoted 'Füñný Nâmé' 'odd_?=mail@example.com' \
+               'non_ascii_self_suppressed'
+"
+
+test_expect_success $PREREQ 'sanitized self name is suppressed' "
+       test_suppress_self_unquoted '\"A U. Thor\"' 'author@example.com' \
+               'self_name_sanitized_suppressed'
+"
+
 test_expect_success $PREREQ 'Show all headers' '
        git send-email \
                --dry-run \
@@ -881,6 +956,20 @@ test_expect_success $PREREQ 'utf8 author is correctly passed on' '
        grep "^From: Füñný Nâmé <odd_?=mail@example.com>" msgtxt1
 '
 
+test_expect_success $PREREQ 'utf8 sender is not duplicated' '
+       clean_fake_sendmail &&
+       test_commit weird_sender &&
+       test_when_finished "git reset --hard HEAD^" &&
+       git commit --amend --author "Füñný Nâmé <odd_?=mail@example.com>" &&
+       git format-patch --stdout -1 >funny_name.patch &&
+       git send-email --from="Füñný Nâmé <odd_?=mail@example.com>" \
+         --to=nobody@example.com \
+         --smtp-server="$(pwd)/fake.sendmail" \
+         funny_name.patch &&
+       grep "^From: " msgtxt1 >msgfrom &&
+       test_line_count = 1 msgfrom
+'
+
 test_expect_success $PREREQ 'sendemail.composeencoding works' '
        clean_fake_sendmail &&
        git config sendemail.composeencoding iso-8859-1 &&
index 3077851015879fc147ded9bb573d02c13967eec9..f524d2f383212c7d5fb02103cc08c3cdde2519fc 100755 (executable)
@@ -48,7 +48,7 @@ test_expect_success 'setup svn repository' '
 test_expect_success 'setup git mirror and merge' '
        git svn init "$svnrepo" -t tags -T trunk -b branches &&
        git svn fetch &&
-       git checkout --track -b svn remotes/trunk &&
+       git checkout -b svn remotes/trunk &&
        git checkout -b merge &&
        echo new file > new_file &&
        git add new_file &&
diff --git a/t/t9167-git-svn-cmd-branch-subproject.sh b/t/t9167-git-svn-cmd-branch-subproject.sh
new file mode 100755 (executable)
index 0000000..53def87
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# Copyright (c) 2013 Tobias Schulte
+#
+
+test_description='git svn branch for subproject clones'
+. ./lib-git-svn.sh
+
+test_expect_success 'initialize svnrepo' '
+       mkdir import &&
+       (
+               cd import &&
+               mkdir -p trunk/project branches tags &&
+               (
+                       cd trunk/project &&
+                       echo foo > foo
+               ) &&
+               svn_cmd import -m "import for git-svn" . "$svnrepo" >/dev/null
+       ) &&
+       rm -rf import &&
+       svn_cmd co "$svnrepo"/trunk/project trunk/project &&
+       (
+               cd trunk/project &&
+               echo bar >> foo &&
+               svn_cmd ci -m "updated trunk"
+       ) &&
+       rm -rf trunk
+'
+
+test_expect_success 'import into git' '
+       git svn init --trunk=trunk/project --branches=branches/*/project \
+               --tags=tags/*/project "$svnrepo" &&
+       git svn fetch &&
+       git checkout remotes/trunk
+'
+
+test_expect_success 'git svn branch tests' '
+       test_must_fail git svn branch a &&
+       git svn branch --parents a &&
+       test_must_fail git svn branch -t tag1 &&
+       git svn branch --parents -t tag1 &&
+       test_must_fail git svn branch --tag tag2 &&
+       git svn branch --parents --tag tag2 &&
+       test_must_fail git svn tag tag3 &&
+       git svn tag --parents tag3
+'
+
+test_done
index 083b319ed11132ae03c1f653f1ba13149f5a1ebe..15521cc4f9be68ccd105916cee1322041682e8d5 100755 (executable)
@@ -276,7 +276,7 @@ test_expect_success 'prompt - rebase merge' '
 '
 
 test_expect_success 'prompt - rebase' '
-       printf " ((t2)|REBASE 1/3)" > expected &&
+       printf " (b2|REBASE 1/3)" > expected &&
        git checkout b2 &&
        test_when_finished "git checkout master" &&
        test_must_fail git rebase b1 b2 &&
old mode 100644 (file)
new mode 100755 (executable)
index bfa6279cc418278079bd95854adfe8d8301b6788..127e59a6037a14ad63648a727e873fe4a9e38381 100644 (file)
@@ -592,7 +592,7 @@ static void receive_needs(void)
                                die("invalid shallow line: %s", line);
                        object = parse_object(sha1);
                        if (!object)
-                               die("did not find object for %s", line);
+                               continue;
                        if (object->type != OBJ_COMMIT)
                                die("invalid shallow object %s", sha1_to_hex(sha1));
                        if (!(object->flags & CLIENT_SHALLOW)) {
index 7192bdc1b880728a81b33a38091cca8de6a30445..f91ba99f32c047e5f3238668ae83de647ab92df2 100644 (file)
@@ -196,6 +196,11 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                        }
                                        if (t_ch <= p_ch && t_ch >= prev_ch)
                                                matched = 1;
+                                       else if ((flags & WM_CASEFOLD) && ISLOWER(t_ch)) {
+                                               uchar t_ch_upper = toupper(t_ch);
+                                               if (t_ch_upper <= p_ch && t_ch_upper >= prev_ch)
+                                                       matched = 1;
+                                       }
                                        p_ch = 0; /* This makes "prev_ch" get set to 0. */
                                } else if (p_ch == '[' && p[1] == ':') {
                                        const uchar *s;
@@ -245,6 +250,8 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
                                        } else if (CC_EQ(s,i, "upper")) {
                                                if (ISUPPER(t_ch))
                                                        matched = 1;
+                                               else if ((flags & WM_CASEFOLD) && ISLOWER(t_ch))
+                                                       matched = 1;
                                        } else if (CC_EQ(s,i, "xdigit")) {
                                                if (ISXDIGIT(t_ch))
                                                        matched = 1;
index bac59d2c41bae7441038b30728c696b6280f4c2d..dd7ecbb115edd979f657e2e209126d364e6ccfac 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -408,18 +408,24 @@ void warn_on_inaccessible(const char *path)
        warning(_("unable to access '%s': %s"), path, strerror(errno));
 }
 
-int access_or_warn(const char *path, int mode)
+static int access_error_is_ok(int err, unsigned flag)
+{
+       return err == ENOENT || err == ENOTDIR ||
+               ((flag & ACCESS_EACCES_OK) && err == EACCES);
+}
+
+int access_or_warn(const char *path, int mode, unsigned flag)
 {
        int ret = access(path, mode);
-       if (ret && errno != ENOENT && errno != ENOTDIR)
+       if (ret && !access_error_is_ok(errno, flag))
                warn_on_inaccessible(path);
        return ret;
 }
 
-int access_or_die(const char *path, int mode)
+int access_or_die(const char *path, int mode, unsigned flag)
 {
        int ret = access(path, mode);
-       if (ret && errno != ENOENT && errno != ENOTDIR)
+       if (ret && !access_error_is_ok(errno, flag))
                die_errno(_("unable to access '%s'"), path);
        return ret;
 }