Merge branch 'nd/clone-connectivity-shortcut' (early part) into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 28 Jun 2013 17:00:00 +0000 (10:00 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Jun 2013 17:00:00 +0000 (10:00 -0700)
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.

* 'nd/clone-connectivity-shortcut' (early part):
fetch-pack: prepare updated shallow file before fetching the pack
clone: let the user know when check_everything_connected is run

85 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.txt
Documentation/diff-options.txt
Documentation/git-am.txt
Documentation/git-archive.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-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-revert.txt
Documentation/git-submodule.txt
Documentation/git-svn.txt
Documentation/git-update-index.txt
Documentation/git.txt
Documentation/gitrepository-layout.txt
Documentation/glossary-content.txt
Documentation/technical/pack-protocol.txt
Documentation/urls.txt
GIT-VERSION-GEN
RelNotes
branch.c
builtin/checkout.c
builtin/commit.c
builtin/config.c
builtin/push.c
combine-diff.c
compat/mingw.c
config.c
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-bzr.sh
contrib/remote-helpers/test-hg-hg-git.sh
contrib/subtree/git-subtree.sh
dir.c
git-compat-util.h
git-difftool.perl
git-svn.perl
gitk-git/gitk
gitk-git/po/sv.po
perl/Git/SVN/Editor.pm
perl/Git/SVN/Fetcher.pm
perl/Git/SVN/Prompt.pm
perl/Git/SVN/Ra.pm
revision.c
revision.h
sha1_file.c
sha1_name.c
submodule.c
t/README
t/t0070-fundamental.sh
t/t0100-previous.sh
t/t2024-checkout-dwim.sh [new file with mode: 0755]
t/t3001-ls-files-others-exclude.sh
t/t3200-branch.sh
t/t4038-diff-combined.sh
t/t5500-fetch-pack.sh
t/t6019-rev-list-ancestry-path.sh
t/t7201-co.sh
t/t7502-commit.sh
t/t7800-difftool.sh
t/t9114-git-svn-dcommit-merge.sh
t/t9147-git-svn-include-paths.sh [new file with mode: 0755]
t/t9161-git-svn-mergeinfo-push.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
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..47ae496
--- /dev/null
@@ -0,0 +1,54 @@
+Git v1.8.3.2 Release Notes
+==========================
+
+Fixes since v1.8.3.1
+--------------------
+
+ * "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.
index 0fdb84068b9a2197d92e22039da549a6bd5fe485..ead568e7f157132a5030ca9052fc0b36707522f6 100644 (file)
@@ -41,12 +41,20 @@ Updates since v1.8.2
 
 Foreign interface
 
- * remote-hg and remote-bzr helpers (in contrib/) have been updated;
-   especially, the latter has been accelerated to help Emacs folks,
+ * remote-hg and remote-bzr helpers (in contrib/ since v1.8.2) have
+   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
 
+ * A handful of updates applied to gitk, including an addition of
+   "revert" action, showing dates in tags in a nicer way, making
+   colors configurable, and support for -G'pickaxe' search.
+
  * The prompt string generator (in contrib/completion/) learned to
    show how many changes there are in total and how many have been
    replayed during a "git rebase" session.
@@ -106,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"
@@ -118,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
@@ -236,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
@@ -259,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,
@@ -304,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..b8a9b863751cc7fa4e763e61926982359633acc8 100644 (file)
@@ -480,7 +480,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 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..d88a6fcb29395ac200930191518fdbceca78bbd4 100644 (file)
@@ -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 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 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 7706d41c8704679c00a302306651628e5b99d1c1..aad452f1697b92713a032c36bf40477c51008f04 100644 (file)
@@ -85,6 +85,10 @@ COMMANDS
        When passed to 'init' or 'clone' this regular expression will
        be preserved as a config key.  See 'fetch' for a description
        of '--ignore-paths'.
+--include-paths=<regex>;;
+       When passed to 'init' or 'clone' this regular expression will
+       be preserved as a config key.  See 'fetch' for a description
+       of '--include-paths'.
 --no-minimize-url;;
        When tracking multiple directories (using --stdlayout,
        --branches, or --tags options), git svn will attempt to connect
@@ -146,6 +150,14 @@ Skip "branches" and "tags" of first level directories;;
 ------------------------------------------------------------------------
 --
 
+--include-paths=<regex>;;
+       This allows one to specify a Perl regular expression that will
+       cause the inclusion of only matching paths from checkout from SVN.
+       The '--include-paths' option should match for every 'fetch'
+       (including automatic fetches due to 'clone', 'dcommit',
+       'rebase', etc) on a given repository. '--ignore-paths' takes
+       precedence over '--include-paths'.
+
 --log-window-size=<n>;;
     Fetch <n> log entries per request when scanning Subversion history.
     The default is 100. For very large Subversion repositories, larger
@@ -259,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
@@ -286,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'.
@@ -1020,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..443d88ff12362b044054524270f99cb6e975f01a 100644 (file)
@@ -43,6 +43,12 @@ 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.1/git.html[documentation for release 1.8.3.1]
+
+* release notes for
+  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
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 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 7a24aca9d69d66b9cf2b485355acd5da33f71289..eeecb5d9fcd43298e4c5ab7c7d6c0015b70a86c4 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 GVF=GIT-VERSION-FILE
-DEF_VER=v1.8.3-rc1
+DEF_VER=v1.8.3.1
 
 LF='
 '
index 80b7e388ad321ea679e2b14ce4f18972da35156c..9277723427b7c33b741af3e109c6fef3bb5bda27 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.2.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 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 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 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..3e8bb17831aa5f2f39ee3a07eeebdda90ae39556 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
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..830ee14b437ca74a3db9e56ea8cedff78b7964b6 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");
@@ -954,23 +954,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 b97162f38196d82b2f39f2b151e279d0569f8440..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")"
@@ -2451,7 +2451,7 @@ _git_svn ()
                        --no-metadata --use-svm-props --use-svnsync-props
                        --log-window-size= --no-checkout --quiet
                        --repack-flags --use-log-author --localtime
-                       --ignore-paths= $remote_opts
+                       --ignore-paths= --include-paths= $remote_opts
                        "
                local init_opts="
                        --template= --shared= --trunk= --tags=
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 d9c32f4864745320b6594d614849035db0c95606..5dfa070b64e6e4607adaa436d4aa839c9de5f9e4 100755 (executable)
@@ -328,7 +328,7 @@ test_expect_success 'strip' '
 
   echo four >> content &&
   bzr commit -m four &&
-  bzr log --line | sed -e "s/^[0-9]\+: //" > ../expected
+  bzr log --line | sed -e "s/^[0-9][0-9]*: //" > ../expected
   ) &&
 
   (cd gitrepo &&
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..10daa8b0eb3352305347354d09ef443993af7809 100755 (executable)
@@ -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
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 e955bb5e8b3101cc8c753cf541beabf5cd037b39..c1f8a477fb96730612e1ddd06294270a4651649f 100644 (file)
@@ -692,8 +692,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 6c7bd95032b890d2f79cff0d18ac6aa688a74757..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);
 
@@ -126,6 +126,7 @@ sub _req_svn {
                     'config-dir=s' => \$Git::SVN::Ra::config_dir,
                     'no-auth-cache' => \$Git::SVN::Prompt::_no_auth_cache,
                     'ignore-paths=s' => \$Git::SVN::Fetcher::_ignore_regex,
+                    'include-paths=s' => \$Git::SVN::Fetcher::_include_regex,
                     'ignore-refs=s' => \$Git::SVN::Ra::_ignore_refs_regex );
 my %fc_opts = ( 'follow-parent|follow!' => \$Git::SVN::_follow_parent,
                'authors-file|A=s' => \$_authors,
@@ -202,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 } ],
@@ -210,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,
@@ -470,6 +473,9 @@ sub do_git_init_db {
        my $ignore_paths_regex = \$Git::SVN::Fetcher::_ignore_regex;
        command_noisy('config', "$pfx.ignore-paths", $$ignore_paths_regex)
                if defined $$ignore_paths_regex;
+       my $include_paths_regex = \$Git::SVN::Fetcher::_include_regex;
+       command_noisy('config', "$pfx.include-paths", $$include_paths_regex)
+               if defined $$include_paths_regex;
        my $ignore_refs_regex = \$Git::SVN::Ra::_ignore_refs_regex;
        command_noisy('config', "$pfx.ignore-refs", $$ignore_refs_regex)
                if defined $$ignore_refs_regex;
@@ -669,12 +675,14 @@ sub merge_revs_into_hash {
 }
 
 sub merge_merge_info {
-       my ($mergeinfo_one, $mergeinfo_two) = @_;
+       my ($mergeinfo_one, $mergeinfo_two, $ignore_branch) = @_;
        my %result_hash = ();
 
        merge_revs_into_hash(\%result_hash, $mergeinfo_one);
        merge_revs_into_hash(\%result_hash, $mergeinfo_two);
 
+       delete $result_hash{$ignore_branch} if $ignore_branch;
+
        my $result = '';
        # Sort below is for consistency's sake
        for my $branchname (sort keys(%result_hash)) {
@@ -695,6 +703,7 @@ sub populate_merge_info {
                my $all_parents_ok = 1;
                my $aggregate_mergeinfo = '';
                my $rooturl = $gs->repos_root;
+               my ($target_branch) = $gs->full_pushurl =~ /^\Q$rooturl\E(.*)/;
 
                if (defined($rewritten_parent)) {
                        # Replace first parent with newly-rewritten version
@@ -726,7 +735,8 @@ sub populate_merge_info {
                        # Merge previous mergeinfo values
                        $aggregate_mergeinfo =
                                merge_merge_info($aggregate_mergeinfo,
-                                                                $par_mergeinfo, 0);
+                                                               $par_mergeinfo,
+                                                               $target_branch);
 
                        next if $parent eq $parents[0]; # Skip first parent
                        # Add new changes being placed in tree by merge
@@ -769,7 +779,8 @@ sub populate_merge_info {
                        my $newmergeinfo = "$branchpath:" . join(',', @revsin);
                        $aggregate_mergeinfo =
                                merge_merge_info($aggregate_mergeinfo,
-                                                                $newmergeinfo, 1);
+                                                               $newmergeinfo,
+                                                               $target_branch);
                }
                if ($all_parents_ok and $aggregate_mergeinfo) {
                        return $aggregate_mergeinfo;
@@ -1163,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;
@@ -1170,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";
index b3706fc9b9bef1361f6872b00905443dea584a7d..5cd00d80fe2fb80a07a59b7e5327f8ff6c29d8f6 100755 (executable)
@@ -1998,6 +1998,9 @@ proc mca {str} {
     return [string map {&& & & {}} [mc $str]]
 }
 
+proc cleardropsel {w} {
+    $w selection clear
+}
 proc makedroplist {w varname args} {
     global use_ttk
     if {$use_ttk} {
@@ -2007,7 +2010,9 @@ proc makedroplist {w varname args} {
             if {$cx > $width} {set width $cx}
         }
        set gm [ttk::combobox $w -width $width -state readonly\
-                   -textvariable $varname -values $args]
+                   -textvariable $varname -values $args \
+                   -exportselection false]
+       bind $gm <<ComboboxSelected>> [list $gm selection clear]
     } else {
        set gm [eval [linsert $args 0 tk_optionMenu $w $varname]]
     }
@@ -2026,6 +2031,9 @@ proc makewindow {} {
     global highlight_files gdttype
     global searchstring sstring
     global bgcolor fgcolor bglist fglist diffcolors selectbgcolor
+    global uifgcolor uifgdisabledcolor
+    global filesepbgcolor filesepfgcolor
+    global mergecolors foundbgcolor currentsearchhitbgcolor
     global headctxmenu progresscanv progressitem progresscoords statusw
     global fprogitem fprogcoord lastprogupdate progupdatepending
     global rprogitem rprogcoord rownumsel numcommits
@@ -2177,10 +2185,10 @@ proc makewindow {} {
        0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,
        0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};
     }
-    image create bitmap bm-left -data $bm_left_data
-    image create bitmap bm-left-gray -data $bm_left_data -foreground "#999"
-    image create bitmap bm-right -data $bm_right_data
-    image create bitmap bm-right-gray -data $bm_right_data -foreground "#999"
+    image create bitmap bm-left -data $bm_left_data -foreground $uifgcolor
+    image create bitmap bm-left-gray -data $bm_left_data -foreground $uifgdisabledcolor
+    image create bitmap bm-right -data $bm_right_data -foreground $uifgcolor
+    image create bitmap bm-right-gray -data $bm_right_data -foreground $uifgdisabledcolor
 
     ${NS}::button .tf.bar.leftbut -command goback -state disabled -width 26
     if {$use_ttk} {
@@ -2245,7 +2253,8 @@ proc makewindow {} {
     set gm [makedroplist .tf.lbar.gdttype gdttype \
                [mc "containing:"] \
                [mc "touching paths:"] \
-               [mc "adding/removing string:"]]
+               [mc "adding/removing string:"] \
+               [mc "changing lines matching:"]]
     trace add variable gdttype write gdttype_change
     pack .tf.lbar.gdttype -side left -fill y
 
@@ -2349,32 +2358,32 @@ proc makewindow {} {
     lappend fglist $ctext
 
     $ctext tag conf comment -wrap $wrapcomment
-    $ctext tag conf filesep -font textfontbold -back "#aaaaaa"
+    $ctext tag conf filesep -font textfontbold -fore $filesepfgcolor -back $filesepbgcolor
     $ctext tag conf hunksep -fore [lindex $diffcolors 2]
     $ctext tag conf d0 -fore [lindex $diffcolors 0]
     $ctext tag conf dresult -fore [lindex $diffcolors 1]
-    $ctext tag conf m0 -fore red
-    $ctext tag conf m1 -fore blue
-    $ctext tag conf m2 -fore green
-    $ctext tag conf m3 -fore purple
-    $ctext tag conf m4 -fore brown
-    $ctext tag conf m5 -fore "#009090"
-    $ctext tag conf m6 -fore magenta
-    $ctext tag conf m7 -fore "#808000"
-    $ctext tag conf m8 -fore "#009000"
-    $ctext tag conf m9 -fore "#ff0080"
-    $ctext tag conf m10 -fore cyan
-    $ctext tag conf m11 -fore "#b07070"
-    $ctext tag conf m12 -fore "#70b0f0"
-    $ctext tag conf m13 -fore "#70f0b0"
-    $ctext tag conf m14 -fore "#f0b070"
-    $ctext tag conf m15 -fore "#ff70b0"
+    $ctext tag conf m0 -fore [lindex $mergecolors 0]
+    $ctext tag conf m1 -fore [lindex $mergecolors 1]
+    $ctext tag conf m2 -fore [lindex $mergecolors 2]
+    $ctext tag conf m3 -fore [lindex $mergecolors 3]
+    $ctext tag conf m4 -fore [lindex $mergecolors 4]
+    $ctext tag conf m5 -fore [lindex $mergecolors 5]
+    $ctext tag conf m6 -fore [lindex $mergecolors 6]
+    $ctext tag conf m7 -fore [lindex $mergecolors 7]
+    $ctext tag conf m8 -fore [lindex $mergecolors 8]
+    $ctext tag conf m9 -fore [lindex $mergecolors 9]
+    $ctext tag conf m10 -fore [lindex $mergecolors 10]
+    $ctext tag conf m11 -fore [lindex $mergecolors 11]
+    $ctext tag conf m12 -fore [lindex $mergecolors 12]
+    $ctext tag conf m13 -fore [lindex $mergecolors 13]
+    $ctext tag conf m14 -fore [lindex $mergecolors 14]
+    $ctext tag conf m15 -fore [lindex $mergecolors 15]
     $ctext tag conf mmax -fore darkgrey
     set mergemax 16
     $ctext tag conf mresult -font textfontbold
     $ctext tag conf msep -font textfontbold
-    $ctext tag conf found -back yellow
-    $ctext tag conf currentsearchhit -back orange
+    $ctext tag conf found -back $foundbgcolor
+    $ctext tag conf currentsearchhit -back $currentsearchhitbgcolor
     $ctext tag conf wwrap -wrap word
 
     .pwbottom add .bleft
@@ -2559,6 +2568,7 @@ proc makewindow {} {
        {mc "Compare with marked commit" command compare_commits}
        {mc "Diff this -> marked commit" command {diffvsmark 0}}
        {mc "Diff marked commit -> this" command {diffvsmark 1}}
+       {mc "Revert this commit" command revert}
     }
     $rowctxmenu configure -tearoff 0
 
@@ -2721,6 +2731,14 @@ proc savestuff {w} {
     global viewname viewfiles viewargs viewargscmd viewperm nextviewnum
     global cmitmode wrapcomment datetimeformat limitdiffs
     global colors uicolor bgcolor fgcolor diffcolors diffcontext selectbgcolor
+    global uifgcolor uifgdisabledcolor
+    global headbgcolor headfgcolor headoutlinecolor remotebgcolor
+    global tagbgcolor tagfgcolor tagoutlinecolor
+    global reflinecolor filesepbgcolor filesepfgcolor
+    global mergecolors foundbgcolor currentsearchhitbgcolor
+    global linehoverbgcolor linehoverfgcolor linehoveroutlinecolor circlecolors
+    global mainheadcirclecolor workingfilescirclecolor indexcirclecolor
+    global linkfgcolor circleoutlinecolor
     global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk
     global hideremotes want_ttk maxrefs
 
@@ -2753,13 +2771,37 @@ proc savestuff {w} {
        puts $f [list set want_ttk $want_ttk]
        puts $f [list set bgcolor $bgcolor]
        puts $f [list set fgcolor $fgcolor]
+       puts $f [list set uifgcolor $uifgcolor]
+       puts $f [list set uifgdisabledcolor $uifgdisabledcolor]
        puts $f [list set colors $colors]
        puts $f [list set diffcolors $diffcolors]
+       puts $f [list set mergecolors $mergecolors]
        puts $f [list set markbgcolor $markbgcolor]
        puts $f [list set diffcontext $diffcontext]
        puts $f [list set selectbgcolor $selectbgcolor]
+       puts $f [list set foundbgcolor $foundbgcolor]
+       puts $f [list set currentsearchhitbgcolor $currentsearchhitbgcolor]
        puts $f [list set extdifftool $extdifftool]
        puts $f [list set perfile_attrs $perfile_attrs]
+       puts $f [list set headbgcolor $headbgcolor]
+       puts $f [list set headfgcolor $headfgcolor]
+       puts $f [list set headoutlinecolor $headoutlinecolor]
+       puts $f [list set remotebgcolor $remotebgcolor]
+       puts $f [list set tagbgcolor $tagbgcolor]
+       puts $f [list set tagfgcolor $tagfgcolor]
+       puts $f [list set tagoutlinecolor $tagoutlinecolor]
+       puts $f [list set reflinecolor $reflinecolor]
+       puts $f [list set filesepbgcolor $filesepbgcolor]
+       puts $f [list set filesepfgcolor $filesepfgcolor]
+       puts $f [list set linehoverbgcolor $linehoverbgcolor]
+       puts $f [list set linehoverfgcolor $linehoverfgcolor]
+       puts $f [list set linehoveroutlinecolor $linehoveroutlinecolor]
+       puts $f [list set mainheadcirclecolor $mainheadcirclecolor]
+       puts $f [list set workingfilescirclecolor $workingfilescirclecolor]
+       puts $f [list set indexcirclecolor $indexcirclecolor]
+       puts $f [list set circlecolors $circlecolors]
+       puts $f [list set linkfgcolor $linkfgcolor]
+       puts $f [list set circleoutlinecolor $circleoutlinecolor]
 
        puts $f "set geometry(main) [wm geometry .]"
        puts $f "set geometry(state) [wm state .]"
@@ -4617,6 +4659,8 @@ proc do_file_hl {serial} {
        set gdtargs [concat -- $relative_paths]
     } elseif {$gdttype eq [mc "adding/removing string:"]} {
        set gdtargs [list "-S$highlight_files"]
+    } elseif {$gdttype eq [mc "changing lines matching:"]} {
+       set gdtargs [list "-G$highlight_files"]
     } else {
        # must be "containing:", i.e. we're searching commit info
        return
@@ -5925,15 +5969,17 @@ proc drawcmittext {id row col} {
     global linehtag linentag linedtag selectedline
     global canvxmax boldids boldnameids fgcolor markedid
     global mainheadid nullid nullid2 circleitem circlecolors ctxbut
+    global mainheadcirclecolor workingfilescirclecolor indexcirclecolor
+    global circleoutlinecolor
 
     # listed is 0 for boundary, 1 for normal, 2 for negative, 3 for left, 4 for right
     set listed $cmitlisted($curview,$id)
     if {$id eq $nullid} {
-       set ofill red
+       set ofill $workingfilescirclecolor
     } elseif {$id eq $nullid2} {
-       set ofill green
+       set ofill $indexcirclecolor
     } elseif {$id eq $mainheadid} {
-       set ofill yellow
+       set ofill $mainheadcirclecolor
     } else {
        set ofill [lindex $circlecolors $listed]
     }
@@ -5943,21 +5989,21 @@ proc drawcmittext {id row col} {
     if {$listed <= 2} {
        set t [$canv create oval [expr {$x - $orad}] [expr {$y - $orad}] \
                   [expr {$x + $orad - 1}] [expr {$y + $orad - 1}] \
-                  -fill $ofill -outline $fgcolor -width 1 -tags circle]
+                  -fill $ofill -outline $circleoutlinecolor -width 1 -tags circle]
     } elseif {$listed == 3} {
        # triangle pointing left for left-side commits
        set t [$canv create polygon \
                   [expr {$x - $orad}] $y \
                   [expr {$x + $orad - 1}] [expr {$y - $orad}] \
                   [expr {$x + $orad - 1}] [expr {$y + $orad - 1}] \
-                  -fill $ofill -outline $fgcolor -width 1 -tags circle]
+                  -fill $ofill -outline $circleoutlinecolor -width 1 -tags circle]
     } else {
        # triangle pointing right for right-side commits
        set t [$canv create polygon \
                   [expr {$x + $orad - 1}] $y \
                   [expr {$x - $orad}] [expr {$y - $orad}] \
                   [expr {$x - $orad}] [expr {$y + $orad - 1}] \
-                  -fill $ofill -outline $fgcolor -width 1 -tags circle]
+                  -fill $ofill -outline $circleoutlinecolor -width 1 -tags circle]
     }
     set circleitem($row) $t
     $canv raise $t
@@ -6345,6 +6391,9 @@ proc drawtags {id x xt y1} {
     global idtags idheads idotherrefs mainhead
     global linespc lthickness
     global canv rowtextx curview fgcolor bgcolor ctxbut
+    global headbgcolor headfgcolor headoutlinecolor remotebgcolor
+    global tagbgcolor tagfgcolor tagoutlinecolor
+    global reflinecolor
 
     set marks {}
     set ntags 0
@@ -6382,7 +6431,7 @@ proc drawtags {id x xt y1} {
        set xt [expr {$xt + $delta + $wid + $lthickness + $linespc}]
     }
     set t [$canv create line $x $y1 [lindex $xvals end] $y1 \
-              -width $lthickness -fill black -tags tag.$id]
+              -width $lthickness -fill $reflinecolor -tags tag.$id]
     $canv lower $t
     foreach tag $marks x $xvals wid $wvals {
        set tag_quoted [string map {% %%} $tag]
@@ -6393,13 +6442,14 @@ proc drawtags {id x xt y1} {
            # draw a tag
            set t [$canv create polygon $x [expr {$yt + $delta}] $xl $yt \
                       $xr $yt $xr $yb $xl $yb $x [expr {$yb - $delta}] \
-                      -width 1 -outline black -fill yellow -tags tag.$id]
+                      -width 1 -outline $tagoutlinecolor -fill $tagbgcolor \
+                      -tags tag.$id]
            $canv bind $t <1> [list showtag $tag_quoted 1]
            set rowtextx([rowofcommit $id]) [expr {$xr + $linespc}]
        } else {
            # draw a head or other ref
            if {[incr nheads -1] >= 0} {
-               set col green
+               set col $headbgcolor
                if {$tag eq $mainhead} {
                    set font mainfontbold
                }
@@ -6415,10 +6465,10 @@ proc drawtags {id x xt y1} {
                set yti [expr {$yt + 1}]
                set xri [expr {$x + $rwid}]
                $canv create polygon $xi $yti $xri $yti $xri $yb $xi $yb \
-                       -width 0 -fill "#ffddaa" -tags tag.$id
+                       -width 0 -fill $remotebgcolor -tags tag.$id
            }
        }
-       set t [$canv create text $xl $y1 -anchor w -text $tag -fill $fgcolor \
+       set t [$canv create text $xl $y1 -anchor w -text $tag -fill $headfgcolor \
                   -font $font -tags [list tag.$id text]]
        if {$ntags >= 0} {
            $canv bind $t <1> [list showtag $tag_quoted 1]
@@ -6799,6 +6849,7 @@ proc appendwithlinks {text tags} {
 
 proc setlink {id lk} {
     global curview ctext pendinglinks
+    global linkfgcolor
 
     if {[string range $id 0 1] eq "-g"} {
       set id [string range $id 2 end]
@@ -6816,7 +6867,7 @@ proc setlink {id lk} {
        set known [commitinview $id $curview]
     }
     if {$known} {
-       $ctext tag conf $lk -foreground blue -underline 1
+       $ctext tag conf $lk -foreground $linkfgcolor -underline 1
        $ctext tag bind $lk <1> [list selbyid $id]
        $ctext tag bind $lk <Enter> {linkcursor %W 1}
        $ctext tag bind $lk <Leave> {linkcursor %W -1}
@@ -7571,9 +7622,13 @@ proc diffcmd {ids flags} {
 }
 
 proc gettreediffs {ids} {
-    global treediff treepending
+    global treediff treepending limitdiffs vfilelimit curview
 
-    if {[catch {set gdtf [open [diffcmd $ids {--no-commit-id}] r]}]} return
+    set cmd [diffcmd $ids {--no-commit-id}]
+    if {$limitdiffs && $vfilelimit($curview) ne {}} {
+           set cmd [concat $cmd -- $vfilelimit($curview)]
+    }
+    if {[catch {set gdtf [open $cmd r]}]} return
 
     set treepending $ids
     set treediff {}
@@ -7617,17 +7672,7 @@ proc gettreediffline {gdtf ids} {
        return [expr {$nr >= $max? 2: 1}]
     }
     close $gdtf
-    if {$limitdiffs && $vfilelimit($curview) ne {}} {
-       set flist {}
-       foreach f $treediff {
-           if {[path_filter $vfilelimit($curview) $f]} {
-               lappend flist $f
-           }
-       }
-       set treediffs($ids) $flist
-    } else {
-       set treediffs($ids) $treediff
-    }
+    set treediffs($ids) $treediff
     unset treepending
     if {$cmitmode eq "tree" && [llength $diffids] == 1} {
        gettree $diffids
@@ -8459,6 +8504,8 @@ proc lineleave {id} {
 proc linehover {} {
     global hoverx hovery hoverid hovertimer
     global canv linespc lthickness
+    global linehoverbgcolor linehoverfgcolor linehoveroutlinecolor
+
     global commitinfo
 
     set text [lindex $commitinfo($hoverid) 0]
@@ -8472,10 +8519,11 @@ proc linehover {} {
     set x1 [expr {$x + [font measure mainfont $text] + 2 * $lthickness}]
     set y1 [expr {$y + $linespc + 2 * $lthickness}]
     set t [$canv create rectangle $x0 $y0 $x1 $y1 \
-              -fill \#ffff80 -outline black -width 1 -tags hover]
+              -fill $linehoverbgcolor -outline $linehoveroutlinecolor \
+              -width 1 -tags hover]
     $canv raise $t
     set t [$canv create text $x $y -anchor nw -text $text -tags hover \
-              -font mainfont]
+              -font mainfont -fill $linehoverfgcolor]
     $canv raise $t
 }
 
@@ -9039,12 +9087,13 @@ proc domktag {} {
 proc redrawtags {id} {
     global canv linehtag idpos currentid curview cmitlisted markedid
     global canvxmax iddrawn circleitem mainheadid circlecolors
+    global mainheadcirclecolor
 
     if {![commitinview $id $curview]} return
     if {![info exists iddrawn($id)]} return
     set row [rowofcommit $id]
     if {$id eq $mainheadid} {
-       set ofill yellow
+       set ofill $mainheadcirclecolor
     } else {
        set ofill [lindex $circlecolors $cmitlisted($curview,$id)]
     }
@@ -9301,6 +9350,67 @@ proc cherrypick {} {
     notbusy cherrypick
 }
 
+proc revert {} {
+    global rowmenuid curview
+    global mainhead mainheadid
+    global gitdir
+
+    set oldhead [exec git rev-parse HEAD]
+    set dheads [descheads $rowmenuid]
+    if { $dheads eq {} || [lsearch -exact $dheads $oldhead] == -1 } {
+       set ok [confirm_popup [mc "Commit %s is not\
+           included in branch %s -- really revert it?" \
+                      [string range $rowmenuid 0 7] $mainhead]]
+       if {!$ok} return
+    }
+    nowbusy revert [mc "Reverting"]
+    update
+
+    if [catch {exec git revert --no-edit $rowmenuid} err] {
+        notbusy revert
+        if [regexp {files would be overwritten by merge:(\n(( |\t)+[^\n]+\n)+)}\
+                $err match files] {
+            regsub {\n( |\t)+} $files "\n" files
+            error_popup [mc "Revert failed because of local changes to\
+                the following files:%s Please commit, reset or stash \
+                your changes and try again." $files]
+        } elseif [regexp {error: could not revert} $err] {
+            if [confirm_popup [mc "Revert failed because of merge conflict.\n\
+                Do you wish to run git citool to resolve it?"]] {
+                # Force citool to read MERGE_MSG
+                file delete [file join $gitdir "GITGUI_MSG"]
+                exec_citool {} $rowmenuid
+            }
+        } else { error_popup $err }
+        run updatecommits
+        return
+    }
+
+    set newhead [exec git rev-parse HEAD]
+    if { $newhead eq $oldhead } {
+        notbusy revert
+        error_popup [mc "No changes committed"]
+        return
+    }
+
+    addnewchild $newhead $oldhead
+
+    if [commitinview $oldhead $curview] {
+        # XXX this isn't right if we have a path limit...
+        insertrow $newhead $oldhead $curview
+        if {$mainhead ne {}} {
+            movehead $newhead $mainhead
+            movedhead $newhead $mainhead
+        }
+        set mainheadid $newhead
+        redrawtags $oldhead
+        redrawtags $newhead
+        selbyid $newhead
+    }
+
+    notbusy revert
+}
+
 proc resethead {} {
     global mainhead rowmenuid confirm_ok resettype NS
 
@@ -10780,7 +10890,7 @@ proc showtag {tag isnew} {
     set linknum 0
     if {![info exists cached_tagcontent($tag)]} {
        catch {
-           set cached_tagcontent($tag) [exec git cat-file tag $tag]
+           set cached_tagcontent($tag) [exec git cat-file -p $tag]
        }
     }
     if {[info exists cached_tagcontent($tag)]} {
@@ -11641,6 +11751,15 @@ if {[catch {package require Tk 8.4} err]} {
     exit 1
 }
 
+# on OSX bring the current Wish process window to front
+if {[tk windowingsystem] eq "aqua"} {
+    exec osascript -e [format {
+        tell application "System Events"
+            set frontmost of processes whose unix id is %d to true
+        end tell
+    } [pid] ]
+}
+
 # Unset GIT_TRACE var if set
 if { [info exists ::env(GIT_TRACE)] } {
     unset ::env(GIT_TRACE)
@@ -11728,22 +11847,47 @@ if {[tk windowingsystem] eq "aqua"} {
 set colors {green red blue magenta darkgrey brown orange}
 if {[tk windowingsystem] eq "win32"} {
     set uicolor SystemButtonFace
+    set uifgcolor SystemButtonText
+    set uifgdisabledcolor SystemDisabledText
     set bgcolor SystemWindow
-    set fgcolor SystemButtonText
+    set fgcolor SystemWindowText
     set selectbgcolor SystemHighlight
 } else {
     set uicolor grey85
+    set uifgcolor black
+    set uifgdisabledcolor "#999"
     set bgcolor white
     set fgcolor black
     set selectbgcolor gray85
 }
 set diffcolors {red "#00a000" blue}
 set diffcontext 3
+set mergecolors {red blue green purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"}
 set ignorespace 0
 set worddiff ""
 set markbgcolor "#e0e0ff"
 
+set headbgcolor green
+set headfgcolor black
+set headoutlinecolor black
+set remotebgcolor #ffddaa
+set tagbgcolor yellow
+set tagfgcolor black
+set tagoutlinecolor black
+set reflinecolor black
+set filesepbgcolor #aaaaaa
+set filesepfgcolor black
+set linehoverbgcolor #ffff80
+set linehoverfgcolor black
+set linehoveroutlinecolor black
+set mainheadcirclecolor yellow
+set workingfilescirclecolor red
+set indexcirclecolor green
 set circlecolors {white blue gray blue blue}
+set linkfgcolor blue
+set circleoutlinecolor $fgcolor
+set foundbgcolor yellow
+set currentsearchhitbgcolor orange
 
 # button for popping up context menus
 if {[tk windowingsystem] eq "aqua"} {
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 fa0d3c6cddfa7a36745c576ba69e484675238593..b3bcd476daa7d4ab32c30c6fbd2f0a73ec9d0b4f 100644 (file)
@@ -499,6 +499,8 @@ sub apply_diff {
 1;
 __END__
 
+=head1 NAME
+
 Git::SVN::Editor - commit driver for "git svn set-tree" and dcommit
 
 =head1 SYNOPSIS
index 046a7a2f31cf923f634bd8b516b3da38ff989a46..bd174189b98fda05f781697be26db94c9cd53364 100644 (file)
@@ -1,6 +1,7 @@
 package Git::SVN::Fetcher;
-use vars qw/@ISA $_ignore_regex $_preserve_empty_dirs $_placeholder_filename
-            @deleted_gpath %added_placeholder $repo_id/;
+use vars qw/@ISA $_ignore_regex $_include_regex $_preserve_empty_dirs
+            $_placeholder_filename @deleted_gpath %added_placeholder
+            $repo_id/;
 use strict;
 use warnings;
 use SVN::Delta;
@@ -33,6 +34,10 @@ sub new {
        my $v = eval { command_oneline('config', '--get', $k) };
        $self->{ignore_regex} = $v;
 
+       $k = "svn-remote.$repo_id.include-paths";
+       $v = eval { command_oneline('config', '--get', $k) };
+       $self->{include_regex} = $v;
+
        $k = "svn-remote.$repo_id.preserve-empty-dirs";
        $v = eval { command_oneline('config', '--get', '--bool', $k) };
        if ($v && $v eq 'true') {
@@ -117,11 +122,18 @@ sub in_dot_git {
 }
 
 # return value: 0 -- don't ignore, 1 -- ignore
+# This will also check whether the path is explicitly included
 sub is_path_ignored {
        my ($self, $path) = @_;
        return 1 if in_dot_git($path);
        return 1 if defined($self->{ignore_regex}) &&
                    $path =~ m!$self->{ignore_regex}!;
+       return 0 if defined($self->{include_regex}) &&
+                   $path =~ m!$self->{include_regex}!;
+       return 0 if defined($_include_regex) &&
+                   $path =~ m!$_include_regex!;
+       return 1 if defined($self->{include_regex});
+       return 1 if defined($_include_regex);
        return 0 unless defined($_ignore_regex);
        return 1 if $path =~ m!$_ignore_regex!o;
        return 0;
@@ -512,6 +524,8 @@ sub stash_placeholder_list {
 1;
 __END__
 
+=head1 NAME
+
 Git::SVN::Fetcher - tree delta consumer for "git svn fetch"
 
 =head1 SYNOPSIS
index 74daa7a597fcf55a649a4e90367b1e783a74fcd5..e940b08505f1488efbe257201b3881b7e00a0a2a 100644 (file)
@@ -125,6 +125,8 @@ sub _read_password {
 1;
 __END__
 
+=head1 NAME
+
 Git::SVN::Prompt - authentication callbacks for git-svn
 
 =head1 SYNOPSIS
index 6a212eb7a8182acc00eb597d2100310b7855738a..75ecc425b6ebbf2cb1941b6b6bca78f8d0b70d62 100644 (file)
@@ -627,6 +627,8 @@ sub skip_unknown_revs {
 1;
 __END__
 
+=head1 NAME
+
 Git::SVN::Ra - Subversion remote access functions for git-svn
 
 =head1 SYNOPSIS
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 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..371a49d98d27098753016e23fa8a379ed7b72176 100644 (file)
@@ -1055,9 +1055,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 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 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
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 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 557b073b36248522445b6bd7343b4af16b9a7611..fd2598e60190fe04381652c7dfe997e01b4ea0c5 100755 (executable)
@@ -380,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 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 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 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 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/t9147-git-svn-include-paths.sh b/t/t9147-git-svn-include-paths.sh
new file mode 100755 (executable)
index 0000000..a90ff58
--- /dev/null
@@ -0,0 +1,149 @@
+#!/bin/sh
+#
+# Copyright (c) 2013 Paul Walmsley - based on t9134 by Vitaly Shukela
+#
+
+test_description='git svn property tests'
+. ./lib-git-svn.sh
+
+test_expect_success 'setup test repository' '
+       svn_cmd co "$svnrepo" s &&
+       (
+               cd s &&
+               mkdir qqq www xxx &&
+               echo test_qqq > qqq/test_qqq.txt &&
+               echo test_www > www/test_www.txt &&
+               echo test_xxx > xxx/test_xxx.txt &&
+               svn_cmd add qqq &&
+               svn_cmd add www &&
+               svn_cmd add xxx &&
+               svn_cmd commit -m "create some files" &&
+               svn_cmd up &&
+               echo hi >> www/test_www.txt &&
+               svn_cmd commit -m "modify www/test_www.txt" &&
+               svn_cmd up
+       )
+'
+
+test_expect_success 'clone an SVN repository with filter to include qqq directory' '
+       git svn clone --include-paths="qqq" "$svnrepo" g &&
+       echo test_qqq > expect &&
+       for i in g/*/*.txt; do cat $i >> expect2; done &&
+       test_cmp expect expect2
+'
+
+
+test_expect_success 'init+fetch an SVN repository with included qqq directory' '
+       git svn init "$svnrepo" c &&
+       ( cd c && git svn fetch --include-paths="qqq" ) &&
+       rm expect2 &&
+       echo test_qqq > expect &&
+       for i in c/*/*.txt; do cat $i >> expect2; done &&
+       test_cmp expect expect2
+'
+
+test_expect_success 'verify include-paths config saved by clone' '
+       (
+           cd g &&
+           git config --get svn-remote.svn.include-paths | fgrep "qqq"
+       )
+'
+
+test_expect_success 'SVN-side change outside of www' '
+       (
+               cd s &&
+               echo b >> qqq/test_qqq.txt &&
+               svn_cmd commit -m "SVN-side change outside of www" &&
+               svn_cmd up &&
+               svn_cmd log -v | fgrep "SVN-side change outside of www"
+       )
+'
+
+test_expect_success 'update git svn-cloned repo (config include)' '
+       (
+               cd g &&
+               git svn rebase &&
+               printf "test_qqq\nb\n" > expect &&
+               for i in */*.txt; do cat $i >> expect2; done &&
+               test_cmp expect2 expect &&
+               rm expect expect2
+       )
+'
+
+test_expect_success 'update git svn-cloned repo (option include)' '
+       (
+               cd c &&
+               git svn rebase --include-paths="qqq" &&
+               printf "test_qqq\nb\n" > expect &&
+               for i in */*.txt; do cat $i >> expect2; done &&
+               test_cmp expect2 expect &&
+               rm expect expect2
+       )
+'
+
+test_expect_success 'SVN-side change inside of ignored www' '
+       (
+               cd s &&
+               echo zaq >> www/test_www.txt
+               svn_cmd commit -m "SVN-side change inside of www/test_www.txt" &&
+               svn_cmd up &&
+               svn_cmd log -v | fgrep "SVN-side change inside of www/test_www.txt"
+       )
+'
+
+test_expect_success 'update git svn-cloned repo (config include)' '
+       (
+               cd g &&
+               git svn rebase &&
+               printf "test_qqq\nb\n" > expect &&
+               for i in */*.txt; do cat $i >> expect2; done &&
+               test_cmp expect2 expect &&
+               rm expect expect2
+       )
+'
+
+test_expect_success 'update git svn-cloned repo (option include)' '
+       (
+               cd c &&
+               git svn rebase --include-paths="qqq" &&
+               printf "test_qqq\nb\n" > expect &&
+               for i in */*.txt; do cat $i >> expect2; done &&
+               test_cmp expect2 expect &&
+               rm expect expect2
+       )
+'
+
+test_expect_success 'SVN-side change in and out of included qqq' '
+       (
+               cd s &&
+               echo cvf >> www/test_www.txt
+               echo ygg >> qqq/test_qqq.txt
+               svn_cmd commit -m "SVN-side change in and out of ignored www" &&
+               svn_cmd up &&
+               svn_cmd log -v | fgrep "SVN-side change in and out of ignored www"
+       )
+'
+
+test_expect_success 'update git svn-cloned repo again (config include)' '
+       (
+               cd g &&
+               git svn rebase &&
+               printf "test_qqq\nb\nygg\n" > expect &&
+               for i in */*.txt; do cat $i >> expect2; done &&
+               test_cmp expect2 expect &&
+               rm expect expect2
+       )
+'
+
+test_expect_success 'update git svn-cloned repo again (option include)' '
+       (
+               cd c &&
+               git svn rebase --include-paths="qqq" &&
+               printf "test_qqq\nb\nygg\n" > expect &&
+               for i in */*.txt; do cat $i >> expect2; done &&
+               test_cmp expect2 expect &&
+               rm expect expect2
+       )
+'
+
+test_done
index 6ef0c0bde368d10ca9739ecbcd157b862b00b0c8..1eab7015c7fce6fb9a41b52dc4bb1a173455a4d6 100755 (executable)
@@ -88,7 +88,6 @@ test_expect_success 'check reintegration mergeinfo' '
        test "$mergeinfo" = "/branches/svnb1:2-4,7-9,13-18
 /branches/svnb2:3,8,16-17
 /branches/svnb3:4,9
-/branches/svnb4:5-6,10-12
 /branches/svnb5:6,11"
        '
 
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 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;
 }