summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Documentation/RelNotes/1.9.3.txt21
-rw-r--r--Documentation/RelNotes/1.9.4.txt16
-rw-r--r--Documentation/RelNotes/2.0.0.txt98
-rw-r--r--Documentation/RelNotes/2.1.0.txt86
-rw-r--r--Documentation/config.txt17
-rw-r--r--Documentation/git-grep.txt3
-rw-r--r--Documentation/git-merge.txt5
-rw-r--r--Documentation/git-mergetool.txt8
-rw-r--r--Documentation/git-shell.txt2
-rw-r--r--Documentation/git-update-ref.txt18
-rw-r--r--Documentation/git.txt9
-rw-r--r--Documentation/revisions.txt4
-rw-r--r--Documentation/technical/api-builtin.txt13
-rw-r--r--Documentation/technical/api-hashmap.txt1
-rw-r--r--Documentation/technical/api-strbuf.txt9
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile14
l---------RelNotes2
-rw-r--r--builtin/apply.c12
-rw-r--r--builtin/blame.c896
-rw-r--r--builtin/checkout.c10
-rw-r--r--builtin/clone.c9
-rw-r--r--builtin/commit.c94
-rw-r--r--builtin/grep.c4
-rw-r--r--builtin/index-pack.c36
-rw-r--r--builtin/merge.c8
-rw-r--r--builtin/mv.c3
-rw-r--r--builtin/notes.c6
-rw-r--r--builtin/reflog.c2
-rw-r--r--builtin/rerere.c2
-rw-r--r--builtin/reset.c6
-rw-r--r--builtin/tag.c98
-rw-r--r--builtin/update-ref.c426
-rw-r--r--cache.h29
-rw-r--r--combine-diff.c168
-rw-r--r--compat/mmap.c4
-rw-r--r--compat/poll/poll.c2
-rw-r--r--compat/win32/alloca.h (renamed from compat/vcbuild/include/alloca.h)0
-rw-r--r--config.c16
-rw-r--r--config.mak.uname18
-rw-r--r--configure.ac8
-rw-r--r--contrib/completion/git-prompt.sh72
-rw-r--r--contrib/diffall/README31
-rwxr-xr-xcontrib/diffall/git-diffall257
-rw-r--r--contrib/examples/builtin-fetch--tool.c3
-rwxr-xr-xcontrib/mw-to-git/git-remote-mediawiki.perl7
-rwxr-xr-xcontrib/mw-to-git/t/install-wiki.sh10
-rwxr-xr-xcontrib/mw-to-git/t/t9363-mw-to-git-export-import.sh19
-rwxr-xr-xcontrib/mw-to-git/t/t9365-continuing-queries.sh2
-rwxr-xr-xcontrib/mw-to-git/t/test-gitmw-lib.sh8
-rw-r--r--contrib/remote-helpers/Makefile14
-rw-r--r--contrib/remote-helpers/README15
-rwxr-xr-xcontrib/remote-helpers/git-remote-bzr986
-rwxr-xr-xcontrib/remote-helpers/git-remote-hg1261
-rwxr-xr-xcontrib/remote-helpers/test-bzr.sh438
-rwxr-xr-xcontrib/remote-helpers/test-hg-bidi.sh243
-rwxr-xr-xcontrib/remote-helpers/test-hg-hg-git.sh542
-rwxr-xr-xcontrib/remote-helpers/test-hg.sh848
-rwxr-xr-xcontrib/subtree/t/t7900-subtree.sh2
-rwxr-xr-xcontrib/svn-fe/svnrdump_sim.py93
-rwxr-xr-xcontrib/thunderbird-patch-inline/appp.sh14
-rw-r--r--contrib/vim/README22
-rw-r--r--diff.c58
-rw-r--r--diff.h11
-rw-r--r--environment.c2
-rw-r--r--git-compat-util.h17
-rwxr-xr-xgit-gui/git-gui.sh4
-rwxr-xr-xgit-mergetool.sh14
-rwxr-xr-xgit-p4.py2
-rwxr-xr-xgit-pull.sh2
-rw-r--r--git-rebase--merge.sh4
-rwxr-xr-xgit-rebase.sh8
-rwxr-xr-xgit-request-pull.sh6
-rwxr-xr-xgit-send-email.perl16
-rw-r--r--git-sh-setup.sh2
-rwxr-xr-xgit-stash.sh2
-rwxr-xr-xgit-submodule.sh3
-rwxr-xr-xgit-web--browse.sh6
-rw-r--r--git.c2
-rw-r--r--grep.c5
-rw-r--r--imap-send.c45
-rw-r--r--merge-recursive.c6
-rw-r--r--mergetools/gvimdiff31
-rw-r--r--mergetools/vimdiff14
-rw-r--r--mergetools/vimdiff31
-rw-r--r--notes-cache.c2
-rw-r--r--notes-utils.c3
-rw-r--r--pager.c4
-rw-r--r--parse-options.h4
-rw-r--r--perl/Git/SVN.pm2
-rw-r--r--perl/Git/SVN/Log.pm2
-rw-r--r--po/bg.po5033
-rw-r--r--po/fr.po42
-rw-r--r--po/sv.po14
-rw-r--r--pretty.c4
-rw-r--r--read-cache.c47
-rw-r--r--refs.c216
-rw-r--r--refs.h100
-rw-r--r--sequencer.c4
-rw-r--r--strbuf.c11
-rwxr-xr-xt/lib-credential.sh2
-rw-r--r--t/lib-cvs.sh2
-rwxr-xr-xt/lib-gpg.sh2
-rwxr-xr-xt/perf/p5302-pack-index.sh2
-rwxr-xr-xt/t0001-init.sh12
-rwxr-xr-xt/t0010-racy-git.sh4
-rwxr-xr-xt/t0020-crlf.sh42
-rwxr-xr-xt/t0025-crlf-auto.sh38
-rwxr-xr-xt/t0026-eol-config.sh20
-rwxr-xr-xt/t0030-stripspace.sh20
-rwxr-xr-xt/t0300-credentials.sh2
-rwxr-xr-xt/t1000-read-tree-m-3way.sh4
-rwxr-xr-xt/t1001-read-tree-m-2way.sh18
-rwxr-xr-xt/t1002-read-tree-m-u-2way.sh10
-rwxr-xr-xt/t1003-read-tree-prefix.sh2
-rwxr-xr-xt/t1004-read-tree-m-u-wf.sh8
-rwxr-xr-xt/t1020-subdirectory.sh22
-rwxr-xr-xt/t1050-large.sh4
-rwxr-xr-xt/t1300-repo-config.sh10
-rwxr-xr-xt/t1400-update-ref.sh100
-rwxr-xr-xt/t1410-reflog.sh8
-rwxr-xr-xt/t3508-cherry-pick-many-commits.sh6
-rwxr-xr-xt/t3905-stash-include-untracked.sh4
-rwxr-xr-xt/t3910-mac-os-precompose.sh26
-rwxr-xr-xt/t4006-diff-mode.sh2
-rwxr-xr-xt/t4010-diff-pathspec.sh4
-rwxr-xr-xt/t4012-diff-binary.sh16
-rwxr-xr-xt/t4013-diff-various.sh6
-rwxr-xr-xt/t4014-format-patch.sh10
-rwxr-xr-xt/t4036-format-patch-signer-mime.sh2
-rwxr-xr-xt/t4038-diff-combined.sh2
-rwxr-xr-xt/t4057-diff-combined-paths.sh2
-rwxr-xr-xt/t4107-apply-ignore-whitespace.sh12
-rwxr-xr-xt/t4116-apply-reverse.sh12
-rwxr-xr-xt/t4119-apply-config.sh2
-rwxr-xr-xt/t4204-patch-id.sh4
-rwxr-xr-xt/t5000-tar-tree.sh6
-rwxr-xr-xt/t5150-request-pull.sh8
-rwxr-xr-xt/t5537-fetch-shallow.sh28
-rwxr-xr-xt/t6039-merge-ignorecase.sh53
-rwxr-xr-xt/t7004-tag.sh26
-rwxr-xr-xt/t7500-commit.sh11
-rwxr-xr-xt/t7501-commit.sh17
-rwxr-xr-xt/t7502-commit.sh7
-rwxr-xr-xt/t7800-difftool.sh2
-rwxr-xr-xt/t8003-blame-corner-cases.sh9
-rwxr-xr-xt/t9903-bash-prompt.sh6
-rw-r--r--tree-diff.c664
-rw-r--r--unicode_width.h288
-rwxr-xr-xupdate_unicode.sh37
-rw-r--r--utf8.c76
-rw-r--r--wrapper.c38
-rw-r--r--wt-status.c22
154 files changed, 6218 insertions, 8314 deletions
diff --git a/.gitignore b/.gitignore
index dc600f9..42294e5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -226,6 +226,7 @@
/config.mak.autogen
/config.mak.append
/configure
+/unicode
/tags
/TAGS
/cscope*
diff --git a/Documentation/RelNotes/1.9.3.txt b/Documentation/RelNotes/1.9.3.txt
new file mode 100644
index 0000000..17b05ca
--- /dev/null
+++ b/Documentation/RelNotes/1.9.3.txt
@@ -0,0 +1,21 @@
+Git v1.9.3 Release Notes
+========================
+
+Fixes since v1.9.2
+------------------
+
+ * "git p4" dealing with changes in binary files were broken by a
+ change in 1.9 release.
+
+ * The shell prompt script (in contrib/), when using the PROMPT_COMMAND
+ interface, used an unsafe construct when showing the branch name in
+ $PS1.
+
+ * "git rebase" used a POSIX shell construct FreeBSD /bin/sh does not
+ work well with.
+
+ * Some more Unicode codepoints defined in Unicode 6.3 as having
+ zero width have been taught to our display column counting logic.
+
+ * Some tests used shell constructs that did not work well on
+ FreeBSD.
diff --git a/Documentation/RelNotes/1.9.4.txt b/Documentation/RelNotes/1.9.4.txt
new file mode 100644
index 0000000..e1d1835
--- /dev/null
+++ b/Documentation/RelNotes/1.9.4.txt
@@ -0,0 +1,16 @@
+Git v1.9.4 Release Notes
+========================
+
+Fixes since v1.9.3
+------------------
+
+ * Commands that take pathspecs on the command line misbehaved when
+ the pathspec is given as an absolute pathname (which is a
+ practice not particularly encouraged) that points at a symbolic
+ link in the working tree.
+
+ * An earlier fix to the shell prompt script (in contrib/) for using
+ the PROMPT_COMMAND interface did not correctly check if the extra
+ code path needs to trigger, causing the branch name not to appear
+ when 'promptvars' option is disabled in bash or PROMPT_SUBST is
+ unset in zsh.
diff --git a/Documentation/RelNotes/2.0.0.txt b/Documentation/RelNotes/2.0.0.txt
index e6911ac..2617372 100644
--- a/Documentation/RelNotes/2.0.0.txt
+++ b/Documentation/RelNotes/2.0.0.txt
@@ -44,7 +44,7 @@ with "git diff-files --diff-filter=d").
The default prefix for "git svn" has changed in Git 2.0. For a long
time, "git svn" created its remote-tracking branches directly under
refs/remotes, but it now places them under refs/remotes/origin/ unless
-it is told otherwise with its --prefix option.
+it is told otherwise with its "--prefix" option.
Updates since v1.9 series
@@ -53,7 +53,11 @@ Updates since v1.9 series
UI, Workflows & Features
* The "multi-mail" post-receive hook (in contrib/) has been updated
- to a more recent version from the upstream.
+ to a more recent version from upstream.
+
+ * The "remote-hg/bzr" remote-helper interfaces (used to be in
+ contrib/) are no more. They are now maintained separately as
+ third-party plug-ins in their own repositories.
* "git gc --aggressive" learned "--depth" option and
"gc.aggressiveDepth" configuration variable to allow use of a less
@@ -63,12 +67,13 @@ UI, Workflows & Features
single strand-of-pearls is broken in its output.
* The "rev-parse --parseopt" mechanism used by scripted Porcelains to
- parse command line options and to give help text learned to take
+ parse command-line options and to give help text learned to take
the argv-help (the placeholder string for an option parameter,
e.g. "key-id" in "--gpg-sign=<key-id>").
* The pattern to find where the function begins in C/C++ used in
- "diff" and "grep -p" have been updated to help C++ source better.
+ "diff" and "grep -p" has been updated to improve viewing C++
+ sources.
* "git rebase" learned to interpret a lone "-" as "@{-1}", the
branch that we were previously on.
@@ -79,7 +84,7 @@ UI, Workflows & Features
"--sort=version:refname".
* Discard the accumulated "heuristics" to guess from which branch the
- result wants to be pulled from and make sure what the end user
+ result wants to be pulled from and make sure that what the end user
specified is not second-guessed by "git request-pull", to avoid
mistakes. When you pushed out your 'master' branch to your public
repository as 'for-linus', use the new "master:for-linus" syntax to
@@ -88,8 +93,8 @@ UI, Workflows & Features
* "git grep" learned to behave in a way similar to native grep when
"-h" (no header) and "-c" (count) options are given.
- * "git push" via transport-helper interface (e.g. remote-hg) has
- been updated to allow ref deletion in a way similar to the natively
+ * "git push" via transport-helper interface has been updated to
+ allow forced ref updates in a way similar to the natively
supported transports.
* The "simple" mode is the default for "git push".
@@ -98,7 +103,7 @@ UI, Workflows & Features
tree-wide operation even when run inside a subdirectory of a
working tree.
- * "git add <path> is the same as "git add -A <path>" now.
+ * "git add <path>" is the same as "git add -A <path>" now.
* "core.statinfo" configuration variable, which is a
never-advertised synonym to "core.checkstat", has been removed.
@@ -114,30 +119,30 @@ UI, Workflows & Features
* The progress indicators from various time-consuming commands have
been marked for i18n/l10n.
- * "git notes -C <blob>" diagnoses an attempt to use an object that
- is not a blob as an error.
+ * "git notes -C <blob>" diagnoses as an error an attempt to use an
+ object that is not a blob.
* "git config" learned to read from the standard input when "-" is
given as the value to its "--file" parameter (attempting an
- operation to update the configuration in the standard input of
- course is rejected).
+ operation to update the configuration in the standard input is
+ rejected, of course).
* Trailing whitespaces in .gitignore files, unless they are quoted
for fnmatch(3), e.g. "path\ ", are warned and ignored. Strictly
- speaking, this is a backward incompatible change, but very unlikely
+ speaking, this is a backward-incompatible change, but very unlikely
to bite any sane user and adjusting should be obvious and easy.
- * Many commands that create commits, e.g. "pull", "rebase",
- learned to take the --gpg-sign option on the command line.
+ * Many commands that create commits, e.g. "pull" and "rebase",
+ learned to take the "--gpg-sign" option on the command line.
* "git commit" can be told to always GPG sign the resulting commit
- by setting "commit.gpgsign" configuration variable to true (the
- command line option --no-gpg-sign should override it).
+ by setting the "commit.gpgsign" configuration variable to "true"
+ (the command-line option "--no-gpg-sign" should override it).
* "git pull" can be told to only accept fast-forward by setting the
- new "pull.ff" configuration.
+ new "pull.ff" configuration variable.
- * "git reset" learned "-N" option, which does not reset the index
+ * "git reset" learned the "-N" option, which does not reset the index
fully for paths the index knows about but the tree-ish the command
resets to does not (these paths are kept as intend-to-add entries).
@@ -152,15 +157,15 @@ Performance, Internal Implementation, etc.
* Uses of curl's "multi" interface and "easy" interface do not mix
well when we attempt to reuse outgoing connections. Teach the RPC
- over http code, used in the smart HTTP transport, not to use the
+ over HTTP code, used in the smart HTTP transport, not to use the
"easy" interface.
* The bitmap-index feature from JGit has been ported, which should
- significantly improve performance when serving objects form a
+ significantly improve performance when serving objects from a
repository that uses it.
* The way "git log --cc" shows a combined diff against multiple
- parents have been optimized.
+ parents has been optimized.
* The prefixcmp() and suffixcmp() functions are gone. Use
starts_with() and ends_with(), and also consider if skip_prefix()
@@ -179,27 +184,26 @@ Unless otherwise noted, all the fixes since v1.9 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).
+ * "git p4" was broken in 1.9 release to deal with changes in binary
+ files.
+ (merge 749b668 cl/p4-use-diff-tree later to maint).
+
* The shell prompt script (in contrib/), when using the PROMPT_COMMAND
interface, used an unsafe construct when showing the branch name in
$PS1.
- (merge 8976500 rh/prompt-pcmode-avoid-eval-on-refname later to maint).
-
- * The remote-helper interface to fast-import/fast-export via the
- transport-helper has been tightened to avoid leaving the import
- marks file from a failed/crashed run, as such a file that is out of
- sync with the reality confuses a later invocation of itself.
+ (merge 1e4119c8 rh/prompt-pcmode-avoid-eval-on-refname later to maint).
- * "git rebase" used a POSIX shell construct FreeBSD /bin/sh does not
+ * "git rebase" used a POSIX shell construct FreeBSD's /bin/sh does not
work well with.
(merge 8cd6596 km/avoid-non-function-return-in-rebase later to maint).
* zsh prompt (in contrib/) leaked unnecessary error messages.
- * bash completion (in contrib/) did not complete the refs and remotes
+ * Bash completion (in contrib/) did not complete the refs and remotes
correctly given "git pu<TAB>" when "pu" is aliased to "push".
- * Some more Unicode codepoints defined in Unicode 6.3 as having zero
- width have been taught to our display column counting logic.
+ * Some more Unicode code points, defined in Unicode 6.3 as having zero
+ width, have been taught to our display column counting logic.
(merge d813ab9 tb/unicode-6.3-zero-width later to maint).
* Some tests used shell constructs that did not work well on FreeBSD
@@ -213,7 +217,7 @@ notes for details).
* "git diff --no-index -Mq a b" fell into an infinite loop.
(merge ad1c3fb jc/fix-diff-no-index-diff-opt-parse later to maint).
- * "git fetch --prune", when the right-hand-side of multiple fetch
+ * "git fetch --prune", when the right-hand side of multiple fetch
refspecs overlap (e.g. storing "refs/heads/*" to
"refs/remotes/origin/*", while storing "refs/frotz/*" to
"refs/remotes/origin/fr/*"), aggressively thought that lack of
@@ -268,7 +272,7 @@ notes for details).
(merge 3c3e6f5 rr/doc-merge-strategies later to maint).
* Serving objects from a shallow repository needs to write a
- new file to hold the temporary shallow boundaries but it was not
+ new file to hold the temporary shallow boundaries, but it was not
cleaned when we exit due to die() or a signal.
(merge 7839632 jk/shallow-update-fix later to maint).
@@ -291,19 +295,19 @@ notes for details).
".git" tells us where it is.
(merge fcfec8b da/difftool-git-files later to maint).
- * "git push" did not pay attention to branch.*.pushremote if it is
- defined earlier than remote.pushdefault; the order of these two
+ * "git push" did not pay attention to "branch.*.pushremote" if it is
+ defined earlier than "remote.pushdefault"; the order of these two
variables in the configuration file should not matter, but it did
by mistake.
(merge 98b406f jk/remote-pushremote-config-reading later to maint).
- * Codepaths that parse timestamps in commit objects have been
+ * Code paths that parse timestamps in commit objects have been
tightened.
(merge f80d1f9 jk/commit-dates-parsing-fix later to maint).
* "git diff --external-diff" incorrectly fed the submodule directory
- in the working tree to the external diff driver when it knew it is
- the same as one of the versions being compared.
+ in the working tree to the external diff driver when it knew that it
+ is the same as one of the versions being compared.
(merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint).
* "git reset" needs to refresh the index when working in a working
@@ -314,7 +318,7 @@ notes for details).
* "git check-attr" when working on a repository with a working tree
did not work well when the working tree was specified via the
- --work-tree (and obviously with --git-dir) option.
+ "--work-tree" (and obviously with "--git-dir") option.
(merge cdbf623 jc/check-attr-honor-working-tree later to maint).
* "merge-recursive" was broken in 1.7.7 era and stopped working in
@@ -322,12 +326,12 @@ notes for details).
involved. This has been corrected.
(merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.)
- * "git rev-parse" was loose in rejecting command line arguments
+ * "git rev-parse" was loose in rejecting command-line arguments
that do not make sense, e.g. "--default" without the required
value for that option.
(merge a43219f ds/rev-parse-required-args later to maint.)
- * include.path variable (or any variable that expects a path that
+ * "include.path" variable (or any variable that expects a path that
can use ~username expansion) in the configuration file is not a
boolean, but the code failed to check it.
(merge 67beb60 jk/config-path-include-fix later to maint.)
@@ -336,23 +340,23 @@ notes for details).
the pathspec is given as an absolute pathname (which is a
practice not particularly encouraged) that points at a symbolic
link in the working tree.
- (merge later 655ee9e mw/symlinks to maint.)
+ (merge 6127ff6 mw/symlinks later to maint.)
* "git diff --quiet -- pathspec1 pathspec2" sometimes did not return
- correct status value.
+ the correct status value.
(merge f34b205 nd/diff-quiet-stat-dirty later to maint.)
* Attempting to deepen a shallow repository by fetching over smart
- HTTP transport failed in the protocol exchange, when no-done
+ HTTP transport failed in the protocol exchange, when the no-done
extension was used. The fetching side waited for the list of
- shallow boundary commits after the sending end stopped talking to
+ shallow boundary commits after the sending side stopped talking to
it.
(merge 0232852 nd/http-fetch-shallow-fix later to maint.)
* Allow "git cmd path/", when the 'path' is where a submodule is
bound to the top-level working tree, to match 'path', despite the
extra and unnecessary trailing slash (such a slash is often
- given by command line completion).
+ given by command-line completion).
(merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.)
* Documentation and in-code comments had many instances of mistaken
diff --git a/Documentation/RelNotes/2.1.0.txt b/Documentation/RelNotes/2.1.0.txt
new file mode 100644
index 0000000..ad53d0d
--- /dev/null
+++ b/Documentation/RelNotes/2.1.0.txt
@@ -0,0 +1,86 @@
+Git v2.1 Release Notes
+======================
+
+Updates since v2.0
+------------------
+
+UI, Workflows & Features
+
+ * "git commit --date=<date>" option learned to read from more
+ timestamp formats, including "--date=now".
+
+ * "git grep" learned grep.fullname configuration variable to force
+ "--full-name" to be default. This may cause regressions on
+ scripted users that do not expect this new behaviour.
+
+ * "git merge" without argument, even when there is an upstream
+ defined for the current branch, refused to run until
+ merge.defaultToUpstream is set to true. Flip the default of that
+ configuration variable to true.
+
+ * "git mergetool" learned to drive the vimdiff3 backend.
+
+ * mergetool.prompt used to default to 'true', always asking "do you
+ really want to run the tool on this path?". Among the two
+ purposes this prompt serves, ignore the use case to confirm that
+ the user wants to view particular path with the named tool, and
+ redefine the meaning of the prompt only to confirm the choice of
+ the tool made by the autodetection (for those who configured the
+ tool explicitly, the prompt shown for the latter purpose is
+ simply annoying).
+
+ Strictly speaking, this is a backward incompatible change and the
+ users need to explicitly set the variable to 'true' if they want
+ to resurrect the now-ignored use case.
+
+ * "git svn" learned to cope with malformed timestamps with only one
+ digit in the hour part, e.g. 2014-01-07T5:01:02.048176Z, emitted
+ by some broken subversion server implementations.
+
+
+Performance, Internal Implementation, etc.
+
+ * "git diff" that compares 3-or-more trees (e.g. parents and the
+ result of a merge) have been optimized.
+
+ * The API to update/delete references are being converted to handle
+ updates to multiple references in a transactional way. As an
+ example, "update-ref --stdin [-z]" has been updated to use this
+ API.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.0
+----------------
+
+Unless otherwise noted, all the fixes since v2.0 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * "--ignore-space-change" option of "git apply" ignored the spaces
+ at the beginning of line too aggressively, which is inconsistent
+ with the option of the same name "diff" and "git diff" have.
+ (merge 14d3bb4 jc/apply-ignore-whitespace later to maint).
+
+ * "git blame" miscounted number of columns needed to show localized
+ timestamps, resulting in jaggy left-side-edge of the source code
+ lines in its output.
+ (merge dd75553 jx/blame-align-relative-time later to maint).
+
+ * We used to disable threaded "git index-pack" on platforms without
+ thread-safe pread(); use a different workaround for such
+ platforms to allow threaded "git index-pack".
+ (merge 3953949 nd/index-pack-one-fd-per-thread later to maint).
+
+ * "git rerere forget" did not work well when merge.conflictstyle
+ was set to a non-default value.
+ (merge de3d8bb fc/rerere-conflict-style later to maint).
+
+ * "git status", even though it is a read-only operation, tries to
+ update the index with refreshed lstat(2) info to optimize future
+ accesses to the working tree opportunistically, but this could
+ race with a "read-write" operation that modify the index while it
+ is running. Detect such a race and avoid overwriting the index.
+ (merge 426ddee ym/fix-opportunistic-index-update-race later to maint).
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 1932e9b..a33c087 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -489,7 +489,7 @@ core.deltaBaseCacheLimit::
to avoid unpacking and decompressing frequently used base
objects multiple times.
+
-Default is 16 MiB on all platforms. This should be reasonable
+Default is 96 MiB on all platforms. This should be reasonable
for all users/operating systems, except on the largest projects.
You probably do not need to adjust this value.
+
@@ -558,14 +558,19 @@ core.pager::
configuration, then `$PAGER`, and then the default chosen at
compile time (usually 'less').
+
-When the `LESS` environment variable is unset, Git sets it to `FRSX`
+When the `LESS` environment variable is unset, Git sets it to `FRX`
(if `LESS` environment variable is set, Git does not change it at
all). If you want to selectively override Git's default setting
-for `LESS`, you can set `core.pager` to e.g. `less -+S`. This will
+for `LESS`, you can set `core.pager` to e.g. `less -S`. This will
be passed to the shell by Git, which will translate the final
-command to `LESS=FRSX less -+S`. The environment tells the command
-to set the `S` option to chop long lines but the command line
-resets it to the default to fold long lines.
+command to `LESS=FRX less -S`. The environment does not set the
+`S` option but the command line does, instructing less to truncate
+long lines. Similarly, setting `core.pager` to `less -+F` will
+deactivate the `F` option specified by the environment from the
+command-line, deactivating the "quit if one screen" behavior of
+`less`. One can specifically activate some flags for particular
+commands: for example, setting `pager.blame` to `less -S` enables
+line truncation only for `git blame`.
+
Likewise, when the `LV` environment variable is unset, Git sets it
to `-c`. You can override this setting by exporting `LV` with
diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt
index f837334..31811f1 100644
--- a/Documentation/git-grep.txt
+++ b/Documentation/git-grep.txt
@@ -53,6 +53,9 @@ grep.extendedRegexp::
option is ignored when the 'grep.patternType' option is set to a value
other than 'default'.
+grep.fullName::
+ If set to true, enable '--full-name' option by default.
+
OPTIONS
-------
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index a3c1fa3..cf2c374 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -101,9 +101,8 @@ commit or stash your changes before running 'git merge'.
Specifying more than one commit will create a merge with
more than two parents (affectionately called an Octopus merge).
+
-If no commit is given from the command line, and if `merge.defaultToUpstream`
-configuration variable is set, merge the remote-tracking branches
-that the current branch is configured to use as its upstream.
+If no commit is given from the command line, merge the remote-tracking
+branches that the current branch is configured to use as its upstream.
See also the configuration section of this manual page.
diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt
index 07137f2..e846c2e 100644
--- a/Documentation/git-mergetool.txt
+++ b/Documentation/git-mergetool.txt
@@ -71,11 +71,13 @@ success of the resolution after the custom tool has exited.
--no-prompt::
Don't prompt before each invocation of the merge resolution
program.
+ This is the default if the merge resolution program is
+ explicitly specified with the `--tool` option or with the
+ `merge.tool` configuration variable.
--prompt::
- Prompt before each invocation of the merge resolution program.
- This is the default behaviour; the option is provided to
- override any configuration settings.
+ Prompt before each invocation of the merge resolution program
+ to give the user a chance to skip the path.
TEMPORARY FILES
---------------
diff --git a/Documentation/git-shell.txt b/Documentation/git-shell.txt
index c35051b..e4bdd22 100644
--- a/Documentation/git-shell.txt
+++ b/Documentation/git-shell.txt
@@ -66,7 +66,7 @@ EXAMPLE
-------
To disable interactive logins, displaying a greeting instead:
-+
+
----------------
$ chsh -s /usr/bin/git-shell
$ mkdir $HOME/git-shell-commands
diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt
index 0a0a551..c8f5ae5 100644
--- a/Documentation/git-update-ref.txt
+++ b/Documentation/git-update-ref.txt
@@ -68,7 +68,12 @@ performs all modifications together. Specify commands of the form:
option SP <opt> LF
Quote fields containing whitespace as if they were strings in C source
-code. Alternatively, use `-z` to specify commands without quoting:
+code; i.e., surrounded by double-quotes and with backslash escapes.
+Use 40 "0" characters or the empty string to specify a zero value. To
+specify a missing value, omit the value and its preceding SP entirely.
+
+Alternatively, use `-z` to specify in NUL-terminated format, without
+quoting:
update SP <ref> NUL <newvalue> NUL [<oldvalue>] NUL
create SP <ref> NUL <newvalue> NUL
@@ -76,8 +81,12 @@ code. Alternatively, use `-z` to specify commands without quoting:
verify SP <ref> NUL [<oldvalue>] NUL
option SP <opt> NUL
-Lines of any other format or a repeated <ref> produce an error.
-Command meanings are:
+In this format, use 40 "0" to specify a zero value, and use the empty
+string to specify a missing value.
+
+In either format, values can be specified in any form that Git
+recognizes as an object name. Commands in any other format or a
+repeated <ref> produce an error. Command meanings are:
update::
Set <ref> to <newvalue> after verifying <oldvalue>, if given.
@@ -102,9 +111,6 @@ option::
The only valid option is `no-deref` to avoid dereferencing
a symbolic ref.
-Use 40 "0" or the empty string to specify a zero value, except that
-with `-z` an empty <oldvalue> is considered missing.
-
If all <ref>s can be locked with matching <oldvalue>s
simultaneously, all modifications are performed. Otherwise, no
modifications are performed. Note that while each individual
diff --git a/Documentation/git.txt b/Documentation/git.txt
index 35eb677..b075e0b 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,9 +43,16 @@ unreleased) version of Git, that is available from 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
-* link:v1.9.2/git.html[documentation for release 1.9.2]
+* link:v2.0.0/git.html[documentation for release 2.0]
* release notes for
+ link:RelNotes/2.0.0.txt[2.0.0].
+
+* link:v1.9.4/git.html[documentation for release 1.9.4]
+
+* release notes for
+ link:RelNotes/1.9.4.txt[1.9.4],
+ link:RelNotes/1.9.3.txt[1.9.3],
link:RelNotes/1.9.2.txt[1.9.2],
link:RelNotes/1.9.1.txt[1.9.1],
link:RelNotes/1.9.0.txt[1.9.0].
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 5a286d0..0796118 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -94,7 +94,9 @@ some output processing may assume ref names in UTF-8.
'<branchname>@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}'::
The suffix '@\{upstream\}' to a branchname (short form '<branchname>@\{u\}')
refers to the branch that the branch specified by branchname is set to build on
- top of. A missing branchname defaults to the current one.
+ top of (configured with `branch.<name>.remote` and
+ `branch.<name>.merge`). A missing branchname defaults to the
+ current one.
'<rev>{caret}', e.g. 'HEAD{caret}, v1.5.1{caret}0'::
A suffix '{caret}' to a revision parameter means the first parent of
diff --git a/Documentation/technical/api-builtin.txt b/Documentation/technical/api-builtin.txt
index e3d6e7a..22a39b9 100644
--- a/Documentation/technical/api-builtin.txt
+++ b/Documentation/technical/api-builtin.txt
@@ -22,11 +22,14 @@ Git:
where options is the bitwise-or of:
`RUN_SETUP`::
-
- Make sure there is a Git directory to work on, and if there is a
- work tree, chdir to the top of it if the command was invoked
- in a subdirectory. If there is no work tree, no chdir() is
- done.
+ If there is not a Git directory to work on, abort. If there
+ is a work tree, chdir to the top of it if the command was
+ invoked in a subdirectory. If there is no work tree, no
+ chdir() is done.
+
+`RUN_SETUP_GENTLY`::
+ If there is a Git directory, chdir as per RUN_SETUP, otherwise,
+ don't chdir anywhere.
`USE_PAGER`::
diff --git a/Documentation/technical/api-hashmap.txt b/Documentation/technical/api-hashmap.txt
index 42ca234..b977ae8 100644
--- a/Documentation/technical/api-hashmap.txt
+++ b/Documentation/technical/api-hashmap.txt
@@ -166,7 +166,6 @@ Usage example
-------------
Here's a simple usage example that maps long keys to double values.
-[source,c]
------------
struct hashmap map;
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index 3350d97..4396be9 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt
@@ -121,10 +121,19 @@ Functions
* Related to the contents of the buffer
+`strbuf_trim`::
+
+ Strip whitespace from the beginning and end of a string.
+ Equivalent to performing `strbuf_rtrim()` followed by `strbuf_ltrim()`.
+
`strbuf_rtrim`::
Strip whitespace from the end of a string.
+`strbuf_ltrim`::
+
+ Strip whitespace from the beginning of a string.
+
`strbuf_cmp`::
Compare two buffers. Returns an integer less than, equal to, or greater
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index d356425..40adbf7 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.0.0-rc2
+DEF_VER=v2.0.0.GIT
LF='
'
diff --git a/Makefile b/Makefile
index a53f3a8..07ea105 100644
--- a/Makefile
+++ b/Makefile
@@ -30,6 +30,8 @@ all::
# Define LIBPCREDIR=/foo/bar if your libpcre header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
+# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
+#
# Define NO_CURL if you do not have libcurl installed. git-http-fetch and
# git-http-push are not built, and you cannot use http:// and https://
# transports (neither smart nor dumb).
@@ -183,9 +185,6 @@ all::
# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
# This also implies NO_SETITIMER
#
-# Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
-# thread-safe. (e.g. compat/pread.c or cygwin)
-#
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
@@ -730,6 +729,7 @@ LIB_H += transport.h
LIB_H += tree-walk.h
LIB_H += tree.h
LIB_H += unpack-trees.h
+LIB_H += unicode_width.h
LIB_H += url.h
LIB_H += urlmatch.h
LIB_H += userdiff.h
@@ -1111,6 +1111,10 @@ ifdef USE_LIBPCRE
EXTLIBS += -lpcre
endif
+ifdef HAVE_ALLOCA_H
+ BASIC_CFLAGS += -DHAVE_ALLOCA_H
+endif
+
ifdef NO_CURL
BASIC_CFLAGS += -DNO_CURL
REMOTE_CURL_PRIMARY =
@@ -1339,10 +1343,6 @@ endif
ifdef NO_PREAD
COMPAT_CFLAGS += -DNO_PREAD
COMPAT_OBJS += compat/pread.o
- NO_THREAD_SAFE_PREAD = YesPlease
-endif
-ifdef NO_THREAD_SAFE_PREAD
- BASIC_CFLAGS += -DNO_THREAD_SAFE_PREAD
endif
ifdef NO_FAST_WORKING_DIRECTORY
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
diff --git a/RelNotes b/RelNotes
index e50885c..bf76091 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.0.0.txt \ No newline at end of file
+Documentation/RelNotes/2.1.0.txt \ No newline at end of file
diff --git a/builtin/apply.c b/builtin/apply.c
index 87439fa..9c5724e 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -300,11 +300,13 @@ static int fuzzy_matchlines(const char *s1, size_t n1,
while ((*last2 == '\r') || (*last2 == '\n'))
last2--;
- /* skip leading whitespace */
- while (isspace(*s1) && (s1 <= last1))
- s1++;
- while (isspace(*s2) && (s2 <= last2))
- s2++;
+ /* skip leading whitespaces, if both begin with whitespace */
+ if (s1 <= last1 && s2 <= last2 && isspace(*s1) && isspace(*s2)) {
+ while (isspace(*s1) && (s1 <= last1))
+ s1++;
+ while (isspace(*s2) && (s2 <= last2))
+ s2++;
+ }
/* early return if both lines are empty */
if ((s1 > last1) && (s2 > last2))
return 1;
diff --git a/builtin/blame.c b/builtin/blame.c
index 88cb799..a52a279 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -1,7 +1,8 @@
/*
* Blame
*
- * Copyright (c) 2006, Junio C Hamano
+ * Copyright (c) 2006, 2014 by its authors
+ * See COPYING for licensing conditions
*/
#include "cache.h"
@@ -18,7 +19,9 @@
#include "cache-tree.h"
#include "string-list.h"
#include "mailmap.h"
+#include "mergesort.h"
#include "parse-options.h"
+#include "prio-queue.h"
#include "utf8.h"
#include "userdiff.h"
#include "line-range.h"
@@ -83,11 +86,42 @@ static unsigned blame_copy_score;
*/
struct origin {
int refcnt;
+ /* Record preceding blame record for this blob */
struct origin *previous;
+ /* origins are put in a list linked via `next' hanging off the
+ * corresponding commit's util field in order to make finding
+ * them fast. The presence in this chain does not count
+ * towards the origin's reference count. It is tempting to
+ * let it count as long as the commit is pending examination,
+ * but even under circumstances where the commit will be
+ * present multiple times in the priority queue of unexamined
+ * commits, processing the first instance will not leave any
+ * work requiring the origin data for the second instance. An
+ * interspersed commit changing that would have to be
+ * preexisting with a different ancestry and with the same
+ * commit date in order to wedge itself between two instances
+ * of the same commit in the priority queue _and_ produce
+ * blame entries relevant for it. While we don't want to let
+ * us get tripped up by this case, it certainly does not seem
+ * worth optimizing for.
+ */
+ struct origin *next;
struct commit *commit;
+ /* `suspects' contains blame entries that may be attributed to
+ * this origin's commit or to parent commits. When a commit
+ * is being processed, all suspects will be moved, either by
+ * assigning them to an origin in a different commit, or by
+ * shipping them to the scoreboard's ent list because they
+ * cannot be attributed to a different commit.
+ */
+ struct blame_entry *suspects;
mmfile_t file;
unsigned char blob_sha1[20];
unsigned mode;
+ /* guilty gets set when shipping any suspects to the final
+ * blame list instead of other commits
+ */
+ char guilty;
char path[FLEX_ARRAY];
};
@@ -176,10 +210,22 @@ static inline struct origin *origin_incref(struct origin *o)
static void origin_decref(struct origin *o)
{
if (o && --o->refcnt <= 0) {
+ struct origin *p, *l = NULL;
if (o->previous)
origin_decref(o->previous);
free(o->file.ptr);
- free(o);
+ /* Should be present exactly once in commit chain */
+ for (p = o->commit->util; p; l = p, p = p->next) {
+ if (p == o) {
+ if (l)
+ l->next = p->next;
+ else
+ o->commit->util = p->next;
+ free(o);
+ return;
+ }
+ }
+ die("internal error in blame::origin_decref");
}
}
@@ -193,8 +239,12 @@ static void drop_origin_blob(struct origin *o)
/*
* Each group of lines is described by a blame_entry; it can be split
- * as we pass blame to the parents. They form a linked list in the
- * scoreboard structure, sorted by the target line number.
+ * as we pass blame to the parents. They are arranged in linked lists
+ * kept as `suspects' of some unprocessed origin, or entered (when the
+ * blame origin has been finalized) into the scoreboard structure.
+ * While the scoreboard structure is only sorted at the end of
+ * processing (according to final image line number), the lists
+ * attached to an origin are sorted by the target line number.
*/
struct blame_entry {
struct blame_entry *next;
@@ -210,15 +260,6 @@ struct blame_entry {
/* the commit that introduced this group into the final image */
struct origin *suspect;
- /* true if the suspect is truly guilty; false while we have not
- * checked if the group came from one of its parents.
- */
- char guilty;
-
- /* true if the entry has been scanned for copies in the current parent
- */
- char scanned;
-
/* the line number of the first line of this group in the
* suspect's file; internally all line numbers are 0 based.
*/
@@ -231,11 +272,112 @@ struct blame_entry {
};
/*
+ * Any merge of blames happens on lists of blames that arrived via
+ * different parents in a single suspect. In this case, we want to
+ * sort according to the suspect line numbers as opposed to the final
+ * image line numbers. The function body is somewhat longish because
+ * it avoids unnecessary writes.
+ */
+
+static struct blame_entry *blame_merge(struct blame_entry *list1,
+ struct blame_entry *list2)
+{
+ struct blame_entry *p1 = list1, *p2 = list2,
+ **tail = &list1;
+
+ if (!p1)
+ return p2;
+ if (!p2)
+ return p1;
+
+ if (p1->s_lno <= p2->s_lno) {
+ do {
+ tail = &p1->next;
+ if ((p1 = *tail) == NULL) {
+ *tail = p2;
+ return list1;
+ }
+ } while (p1->s_lno <= p2->s_lno);
+ }
+ for (;;) {
+ *tail = p2;
+ do {
+ tail = &p2->next;
+ if ((p2 = *tail) == NULL) {
+ *tail = p1;
+ return list1;
+ }
+ } while (p1->s_lno > p2->s_lno);
+ *tail = p1;
+ do {
+ tail = &p1->next;
+ if ((p1 = *tail) == NULL) {
+ *tail = p2;
+ return list1;
+ }
+ } while (p1->s_lno <= p2->s_lno);
+ }
+}
+
+static void *get_next_blame(const void *p)
+{
+ return ((struct blame_entry *)p)->next;
+}
+
+static void set_next_blame(void *p1, void *p2)
+{
+ ((struct blame_entry *)p1)->next = p2;
+}
+
+/*
+ * Final image line numbers are all different, so we don't need a
+ * three-way comparison here.
+ */
+
+static int compare_blame_final(const void *p1, const void *p2)
+{
+ return ((struct blame_entry *)p1)->lno > ((struct blame_entry *)p2)->lno
+ ? 1 : -1;
+}
+
+static int compare_blame_suspect(const void *p1, const void *p2)
+{
+ const struct blame_entry *s1 = p1, *s2 = p2;
+ /*
+ * to allow for collating suspects, we sort according to the
+ * respective pointer value as the primary sorting criterion.
+ * The actual relation is pretty unimportant as long as it
+ * establishes a total order. Comparing as integers gives us
+ * that.
+ */
+ if (s1->suspect != s2->suspect)
+ return (intptr_t)s1->suspect > (intptr_t)s2->suspect ? 1 : -1;
+ if (s1->s_lno == s2->s_lno)
+ return 0;
+ return s1->s_lno > s2->s_lno ? 1 : -1;
+}
+
+static struct blame_entry *blame_sort(struct blame_entry *head,
+ int (*compare_fn)(const void *, const void *))
+{
+ return llist_mergesort (head, get_next_blame, set_next_blame, compare_fn);
+}
+
+static int compare_commits_by_reverse_commit_date(const void *a,
+ const void *b,
+ void *c)
+{
+ return -compare_commits_by_commit_date(a, b, c);
+}
+
+/*
* The current state of the blame assignment.
*/
struct scoreboard {
/* the final commit (i.e. where we started digging from) */
struct commit *final;
+ /* Priority queue for commits with unassigned blame records */
+ struct prio_queue commits;
struct rev_info *revs;
const char *path;
@@ -268,7 +410,6 @@ static void coalesce(struct scoreboard *sb)
for (ent = sb->ent; ent && (next = ent->next); ent = next) {
if (ent->suspect == next->suspect &&
- ent->guilty == next->guilty &&
ent->s_lno + ent->num_lines == next->s_lno) {
ent->num_lines += next->num_lines;
ent->next = next->next;
@@ -284,6 +425,30 @@ static void coalesce(struct scoreboard *sb)
}
/*
+ * Merge the given sorted list of blames into a preexisting origin.
+ * If there were no previous blames to that commit, it is entered into
+ * the commit priority queue of the score board.
+ */
+
+static void queue_blames(struct scoreboard *sb, struct origin *porigin,
+ struct blame_entry *sorted)
+{
+ if (porigin->suspects)
+ porigin->suspects = blame_merge(porigin->suspects, sorted);
+ else {
+ struct origin *o;
+ for (o = porigin->commit->util; o; o = o->next) {
+ if (o->suspects) {
+ porigin->suspects = sorted;
+ return;
+ }
+ }
+ porigin->suspects = sorted;
+ prio_queue_put(&sb->commits, porigin->commit);
+ }
+}
+
+/*
* Given a commit and a path in it, create a new origin structure.
* The callers that add blame to the scoreboard should use
* get_origin() to obtain shared, refcounted copy instead of calling
@@ -295,23 +460,32 @@ static struct origin *make_origin(struct commit *commit, const char *path)
o = xcalloc(1, sizeof(*o) + strlen(path) + 1);
o->commit = commit;
o->refcnt = 1;
+ o->next = commit->util;
+ commit->util = o;
strcpy(o->path, path);
return o;
}
/*
* Locate an existing origin or create a new one.
+ * This moves the origin to front position in the commit util list.
*/
static struct origin *get_origin(struct scoreboard *sb,
struct commit *commit,
const char *path)
{
- struct blame_entry *e;
+ struct origin *o, *l;
- for (e = sb->ent; e; e = e->next) {
- if (e->suspect->commit == commit &&
- !strcmp(e->suspect->path, path))
- return origin_incref(e->suspect);
+ for (o = commit->util, l = NULL; o; l = o, o = o->next) {
+ if (!strcmp(o->path, path)) {
+ /* bump to front */
+ if (l) {
+ l->next = o->next;
+ o->next = commit->util;
+ commit->util = o;
+ }
+ return origin_incref(o);
+ }
}
return make_origin(commit, path);
}
@@ -350,41 +524,19 @@ static struct origin *find_origin(struct scoreboard *sb,
struct commit *parent,
struct origin *origin)
{
- struct origin *porigin = NULL;
+ struct origin *porigin;
struct diff_options diff_opts;
const char *paths[2];
- if (parent->util) {
- /*
- * Each commit object can cache one origin in that
- * commit. This is a freestanding copy of origin and
- * not refcounted.
- */
- struct origin *cached = parent->util;
- if (!strcmp(cached->path, origin->path)) {
+ /* First check any existing origins */
+ for (porigin = parent->util; porigin; porigin = porigin->next)
+ if (!strcmp(porigin->path, origin->path)) {
/*
* The same path between origin and its parent
* without renaming -- the most common case.
*/
- porigin = get_origin(sb, parent, cached->path);
-
- /*
- * If the origin was newly created (i.e. get_origin
- * would call make_origin if none is found in the
- * scoreboard), it does not know the blob_sha1/mode,
- * so copy it. Otherwise porigin was in the
- * scoreboard and already knows blob_sha1/mode.
- */
- if (porigin->refcnt == 1) {
- hashcpy(porigin->blob_sha1, cached->blob_sha1);
- porigin->mode = cached->mode;
- }
- return porigin;
+ return origin_incref (porigin);
}
- /* otherwise it was not very useful; free it */
- free(parent->util);
- parent->util = NULL;
- }
/* See if the origin->path is different between parent
* and origin first. Most of the time they are the
@@ -450,19 +602,6 @@ static struct origin *find_origin(struct scoreboard *sb,
}
diff_flush(&diff_opts);
free_pathspec(&diff_opts.pathspec);
- if (porigin) {
- /*
- * Create a freestanding copy that is not part of
- * the refcounted origin found in the scoreboard, and
- * cache it in the commit.
- */
- struct origin *cached;
-
- cached = make_origin(porigin->commit, porigin->path);
- hashcpy(cached->blob_sha1, porigin->blob_sha1);
- cached->mode = porigin->mode;
- parent->util = cached;
- }
return porigin;
}
@@ -509,46 +648,31 @@ static struct origin *find_rename(struct scoreboard *sb,
}
/*
- * Link in a new blame entry to the scoreboard. Entries that cover the
- * same line range have been removed from the scoreboard previously.
+ * Append a new blame entry to a given output queue.
*/
-static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
+static void add_blame_entry(struct blame_entry ***queue, struct blame_entry *e)
{
- struct blame_entry *ent, *prev = NULL;
-
origin_incref(e->suspect);
- for (ent = sb->ent; ent && ent->lno < e->lno; ent = ent->next)
- prev = ent;
-
- /* prev, if not NULL, is the last one that is below e */
-
- if (prev) {
- e->next = prev->next;
- prev->next = e;
- }
- else {
- e->next = sb->ent;
- sb->ent = e;
- }
+ e->next = **queue;
+ **queue = e;
+ *queue = &e->next;
}
/*
* src typically is on-stack; we want to copy the information in it to
- * a malloced blame_entry that is already on the linked list of the
- * scoreboard. The origin of dst loses a refcnt while the origin of src
- * gains one.
+ * a malloced blame_entry that gets added to the given queue. The
+ * origin of dst loses a refcnt.
*/
-static void dup_entry(struct blame_entry *dst, struct blame_entry *src)
+static void dup_entry(struct blame_entry ***queue,
+ struct blame_entry *dst, struct blame_entry *src)
{
- struct blame_entry *n;
-
- n = dst->next;
origin_incref(src->suspect);
origin_decref(dst->suspect);
memcpy(dst, src, sizeof(*src));
- dst->next = n;
- dst->score = 0;
+ dst->next = **queue;
+ **queue = dst;
+ *queue = &dst->next;
}
static const char *nth_line(struct scoreboard *sb, long lno)
@@ -620,10 +744,11 @@ static void split_overlap(struct blame_entry *split,
/*
* split_overlap() divided an existing blame e into up to three parts
- * in split. Adjust the linked list of blames in the scoreboard to
+ * in split. Any assigned blame is moved to queue to
* reflect the split.
*/
-static void split_blame(struct scoreboard *sb,
+static void split_blame(struct blame_entry ***blamed,
+ struct blame_entry ***unblamed,
struct blame_entry *split,
struct blame_entry *e)
{
@@ -631,61 +756,39 @@ static void split_blame(struct scoreboard *sb,
if (split[0].suspect && split[2].suspect) {
/* The first part (reuse storage for the existing entry e) */
- dup_entry(e, &split[0]);
+ dup_entry(unblamed, e, &split[0]);
/* The last part -- me */
new_entry = xmalloc(sizeof(*new_entry));
memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
- add_blame_entry(sb, new_entry);
+ add_blame_entry(unblamed, new_entry);
/* ... and the middle part -- parent */
new_entry = xmalloc(sizeof(*new_entry));
memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
- add_blame_entry(sb, new_entry);
+ add_blame_entry(blamed, new_entry);
}
else if (!split[0].suspect && !split[2].suspect)
/*
* The parent covers the entire area; reuse storage for
* e and replace it with the parent.
*/
- dup_entry(e, &split[1]);
+ dup_entry(blamed, e, &split[1]);
else if (split[0].suspect) {
/* me and then parent */
- dup_entry(e, &split[0]);
+ dup_entry(unblamed, e, &split[0]);
new_entry = xmalloc(sizeof(*new_entry));
memcpy(new_entry, &(split[1]), sizeof(struct blame_entry));
- add_blame_entry(sb, new_entry);
+ add_blame_entry(blamed, new_entry);
}
else {
/* parent and then me */
- dup_entry(e, &split[1]);
+ dup_entry(blamed, e, &split[1]);
new_entry = xmalloc(sizeof(*new_entry));
memcpy(new_entry, &(split[2]), sizeof(struct blame_entry));
- add_blame_entry(sb, new_entry);
- }
-
- if (DEBUG) { /* sanity */
- struct blame_entry *ent;
- int lno = sb->ent->lno, corrupt = 0;
-
- for (ent = sb->ent; ent; ent = ent->next) {
- if (lno != ent->lno)
- corrupt = 1;
- if (ent->s_lno < 0)
- corrupt = 1;
- lno += ent->num_lines;
- }
- if (corrupt) {
- lno = sb->ent->lno;
- for (ent = sb->ent; ent; ent = ent->next) {
- printf("L %8d l %8d n %8d\n",
- lno, ent->lno, ent->num_lines);
- lno = ent->lno + ent->num_lines;
- }
- die("oops");
- }
+ add_blame_entry(unblamed, new_entry);
}
}
@@ -702,74 +805,146 @@ static void decref_split(struct blame_entry *split)
}
/*
- * Helper for blame_chunk(). blame_entry e is known to overlap with
- * the patch hunk; split it and pass blame to the parent.
+ * reverse_blame reverses the list given in head, appending tail.
+ * That allows us to build lists in reverse order, then reverse them
+ * afterwards. This can be faster than building the list in proper
+ * order right away. The reason is that building in proper order
+ * requires writing a link in the _previous_ element, while building
+ * in reverse order just requires placing the list head into the
+ * _current_ element.
*/
-static void blame_overlap(struct scoreboard *sb, struct blame_entry *e,
- int tlno, int plno, int same,
- struct origin *parent)
-{
- struct blame_entry split[3];
-
- split_overlap(split, e, tlno, plno, same, parent);
- if (split[1].suspect)
- split_blame(sb, split, e);
- decref_split(split);
-}
-/*
- * Find the line number of the last line the target is suspected for.
- */
-static int find_last_in_target(struct scoreboard *sb, struct origin *target)
+static struct blame_entry *reverse_blame(struct blame_entry *head,
+ struct blame_entry *tail)
{
- struct blame_entry *e;
- int last_in_target = -1;
-
- for (e = sb->ent; e; e = e->next) {
- if (e->guilty || e->suspect != target)
- continue;
- if (last_in_target < e->s_lno + e->num_lines)
- last_in_target = e->s_lno + e->num_lines;
+ while (head) {
+ struct blame_entry *next = head->next;
+ head->next = tail;
+ tail = head;
+ head = next;
}
- return last_in_target;
+ return tail;
}
/*
* Process one hunk from the patch between the current suspect for
- * blame_entry e and its parent. Find and split the overlap, and
- * pass blame to the overlapping part to the parent.
+ * blame_entry e and its parent. This first blames any unfinished
+ * entries before the chunk (which is where target and parent start
+ * differing) on the parent, and then splits blame entries at the
+ * start and at the end of the difference region. Since use of -M and
+ * -C options may lead to overlapping/duplicate source line number
+ * ranges, all we can rely on from sorting/merging is the order of the
+ * first suspect line number.
*/
-static void blame_chunk(struct scoreboard *sb,
- int tlno, int plno, int same,
- struct origin *target, struct origin *parent)
+static void blame_chunk(struct blame_entry ***dstq, struct blame_entry ***srcq,
+ int tlno, int offset, int same,
+ struct origin *parent)
{
- struct blame_entry *e;
+ struct blame_entry *e = **srcq;
+ struct blame_entry *samep = NULL, *diffp = NULL;
- for (e = sb->ent; e; e = e->next) {
- if (e->guilty || e->suspect != target)
- continue;
- if (same <= e->s_lno)
- continue;
- if (tlno < e->s_lno + e->num_lines)
- blame_overlap(sb, e, tlno, plno, same, parent);
+ while (e && e->s_lno < tlno) {
+ struct blame_entry *next = e->next;
+ /*
+ * current record starts before differing portion. If
+ * it reaches into it, we need to split it up and
+ * examine the second part separately.
+ */
+ if (e->s_lno + e->num_lines > tlno) {
+ /* Move second half to a new record */
+ int len = tlno - e->s_lno;
+ struct blame_entry *n = xcalloc(1, sizeof (struct blame_entry));
+ n->suspect = e->suspect;
+ n->lno = e->lno + len;
+ n->s_lno = e->s_lno + len;
+ n->num_lines = e->num_lines - len;
+ e->num_lines = len;
+ e->score = 0;
+ /* Push new record to diffp */
+ n->next = diffp;
+ diffp = n;
+ } else
+ origin_decref(e->suspect);
+ /* Pass blame for everything before the differing
+ * chunk to the parent */
+ e->suspect = origin_incref(parent);
+ e->s_lno += offset;
+ e->next = samep;
+ samep = e;
+ e = next;
+ }
+ /*
+ * As we don't know how much of a common stretch after this
+ * diff will occur, the currently blamed parts are all that we
+ * can assign to the parent for now.
+ */
+
+ if (samep) {
+ **dstq = reverse_blame(samep, **dstq);
+ *dstq = &samep->next;
+ }
+ /*
+ * Prepend the split off portions: everything after e starts
+ * after the blameable portion.
+ */
+ e = reverse_blame(diffp, e);
+
+ /*
+ * Now retain records on the target while parts are different
+ * from the parent.
+ */
+ samep = NULL;
+ diffp = NULL;
+ while (e && e->s_lno < same) {
+ struct blame_entry *next = e->next;
+
+ /*
+ * If current record extends into sameness, need to split.
+ */
+ if (e->s_lno + e->num_lines > same) {
+ /*
+ * Move second half to a new record to be
+ * processed by later chunks
+ */
+ int len = same - e->s_lno;
+ struct blame_entry *n = xcalloc(1, sizeof (struct blame_entry));
+ n->suspect = origin_incref(e->suspect);
+ n->lno = e->lno + len;
+ n->s_lno = e->s_lno + len;
+ n->num_lines = e->num_lines - len;
+ e->num_lines = len;
+ e->score = 0;
+ /* Push new record to samep */
+ n->next = samep;
+ samep = n;
+ }
+ e->next = diffp;
+ diffp = e;
+ e = next;
}
+ **srcq = reverse_blame(diffp, reverse_blame(samep, e));
+ /* Move across elements that are in the unblamable portion */
+ if (diffp)
+ *srcq = &diffp->next;
}
struct blame_chunk_cb_data {
- struct scoreboard *sb;
- struct origin *target;
struct origin *parent;
- long plno;
- long tlno;
+ long offset;
+ struct blame_entry **dstq;
+ struct blame_entry **srcq;
};
+/* diff chunks are from parent to target */
static int blame_chunk_cb(long start_a, long count_a,
long start_b, long count_b, void *data)
{
struct blame_chunk_cb_data *d = data;
- blame_chunk(d->sb, d->tlno, d->plno, start_b, d->target, d->parent);
- d->plno = start_a + count_a;
- d->tlno = start_b + count_b;
+ if (start_a - start_b != d->offset)
+ die("internal error in blame::blame_chunk_cb");
+ blame_chunk(&d->dstq, &d->srcq, start_b, start_a - start_b,
+ start_b + count_b, d->parent);
+ d->offset = start_a + count_a - (start_b + count_b);
return 0;
}
@@ -778,29 +953,32 @@ static int blame_chunk_cb(long start_a, long count_a,
* for the lines it is suspected to its parent. Run diff to find
* which lines came from parent and pass blame for them.
*/
-static int pass_blame_to_parent(struct scoreboard *sb,
- struct origin *target,
- struct origin *parent)
+static void pass_blame_to_parent(struct scoreboard *sb,
+ struct origin *target,
+ struct origin *parent)
{
- int last_in_target;
mmfile_t file_p, file_o;
struct blame_chunk_cb_data d;
+ struct blame_entry *newdest = NULL;
- memset(&d, 0, sizeof(d));
- d.sb = sb; d.target = target; d.parent = parent;
- last_in_target = find_last_in_target(sb, target);
- if (last_in_target < 0)
- return 1; /* nothing remains for this target */
+ if (!target->suspects)
+ return; /* nothing remains for this target */
+
+ d.parent = parent;
+ d.offset = 0;
+ d.dstq = &newdest; d.srcq = &target->suspects;
fill_origin_blob(&sb->revs->diffopt, parent, &file_p);
fill_origin_blob(&sb->revs->diffopt, target, &file_o);
num_get_patch++;
diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d);
- /* The rest (i.e. anything after tlno) are the same as the parent */
- blame_chunk(sb, d.tlno, d.plno, last_in_target, target, parent);
+ /* The rest are the same as the parent */
+ blame_chunk(&d.dstq, &d.srcq, INT_MAX, d.offset, INT_MAX, parent);
+ *d.dstq = NULL;
+ queue_blames(sb, parent, newdest);
- return 0;
+ return;
}
/*
@@ -945,43 +1123,80 @@ static void find_copy_in_blob(struct scoreboard *sb,
handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split);
}
+/* Move all blame entries from list *source that have a score smaller
+ * than score_min to the front of list *small.
+ * Returns a pointer to the link pointing to the old head of the small list.
+ */
+
+static struct blame_entry **filter_small(struct scoreboard *sb,
+ struct blame_entry **small,
+ struct blame_entry **source,
+ unsigned score_min)
+{
+ struct blame_entry *p = *source;
+ struct blame_entry *oldsmall = *small;
+ while (p) {
+ if (ent_score(sb, p) <= score_min) {
+ *small = p;
+ small = &p->next;
+ p = *small;
+ } else {
+ *source = p;
+ source = &p->next;
+ p = *source;
+ }
+ }
+ *small = oldsmall;
+ *source = NULL;
+ return small;
+}
+
/*
* See if lines currently target is suspected for can be attributed to
* parent.
*/
-static int find_move_in_parent(struct scoreboard *sb,
- struct origin *target,
- struct origin *parent)
+static void find_move_in_parent(struct scoreboard *sb,
+ struct blame_entry ***blamed,
+ struct blame_entry **toosmall,
+ struct origin *target,
+ struct origin *parent)
{
- int last_in_target, made_progress;
struct blame_entry *e, split[3];
+ struct blame_entry *unblamed = target->suspects;
+ struct blame_entry *leftover = NULL;
mmfile_t file_p;
- last_in_target = find_last_in_target(sb, target);
- if (last_in_target < 0)
- return 1; /* nothing remains for this target */
+ if (!unblamed)
+ return; /* nothing remains for this target */
fill_origin_blob(&sb->revs->diffopt, parent, &file_p);
if (!file_p.ptr)
- return 0;
+ return;
- made_progress = 1;
- while (made_progress) {
- made_progress = 0;
- for (e = sb->ent; e; e = e->next) {
- if (e->guilty || e->suspect != target ||
- ent_score(sb, e) < blame_move_score)
- continue;
+ /* At each iteration, unblamed has a NULL-terminated list of
+ * entries that have not yet been tested for blame. leftover
+ * contains the reversed list of entries that have been tested
+ * without being assignable to the parent.
+ */
+ do {
+ struct blame_entry **unblamedtail = &unblamed;
+ struct blame_entry *next;
+ for (e = unblamed; e; e = next) {
+ next = e->next;
find_copy_in_blob(sb, e, parent, split, &file_p);
if (split[1].suspect &&
blame_move_score < ent_score(sb, &split[1])) {
- split_blame(sb, split, e);
- made_progress = 1;
+ split_blame(blamed, &unblamedtail, split, e);
+ } else {
+ e->next = leftover;
+ leftover = e;
}
decref_split(split);
}
- }
- return 0;
+ *unblamedtail = NULL;
+ toosmall = filter_small(sb, toosmall, &unblamed, blame_move_score);
+ } while (unblamed);
+ target->suspects = reverse_blame(leftover, NULL);
}
struct blame_list {
@@ -993,62 +1208,46 @@ struct blame_list {
* Count the number of entries the target is suspected for,
* and prepare a list of entry and the best split.
*/
-static struct blame_list *setup_blame_list(struct scoreboard *sb,
- struct origin *target,
- int min_score,
+static struct blame_list *setup_blame_list(struct blame_entry *unblamed,
int *num_ents_p)
{
struct blame_entry *e;
int num_ents, i;
struct blame_list *blame_list = NULL;
- for (e = sb->ent, num_ents = 0; e; e = e->next)
- if (!e->scanned && !e->guilty &&
- e->suspect == target &&
- min_score < ent_score(sb, e))
- num_ents++;
+ for (e = unblamed, num_ents = 0; e; e = e->next)
+ num_ents++;
if (num_ents) {
blame_list = xcalloc(num_ents, sizeof(struct blame_list));
- for (e = sb->ent, i = 0; e; e = e->next)
- if (!e->scanned && !e->guilty &&
- e->suspect == target &&
- min_score < ent_score(sb, e))
- blame_list[i++].ent = e;
+ for (e = unblamed, i = 0; e; e = e->next)
+ blame_list[i++].ent = e;
}
*num_ents_p = num_ents;
return blame_list;
}
/*
- * Reset the scanned status on all entries.
- */
-static void reset_scanned_flag(struct scoreboard *sb)
-{
- struct blame_entry *e;
- for (e = sb->ent; e; e = e->next)
- e->scanned = 0;
-}
-
-/*
* For lines target is suspected for, see if we can find code movement
* across file boundary from the parent commit. porigin is the path
* in the parent we already tried.
*/
-static int find_copy_in_parent(struct scoreboard *sb,
- struct origin *target,
- struct commit *parent,
- struct origin *porigin,
- int opt)
+static void find_copy_in_parent(struct scoreboard *sb,
+ struct blame_entry ***blamed,
+ struct blame_entry **toosmall,
+ struct origin *target,
+ struct commit *parent,
+ struct origin *porigin,
+ int opt)
{
struct diff_options diff_opts;
int i, j;
- int retval;
struct blame_list *blame_list;
int num_ents;
+ struct blame_entry *unblamed = target->suspects;
+ struct blame_entry *leftover = NULL;
- blame_list = setup_blame_list(sb, target, blame_copy_score, &num_ents);
- if (!blame_list)
- return 1; /* nothing remains for this target */
+ if (!unblamed)
+ return; /* nothing remains for this target */
diff_setup(&diff_opts);
DIFF_OPT_SET(&diff_opts, RECURSIVE);
@@ -1078,9 +1277,9 @@ static int find_copy_in_parent(struct scoreboard *sb,
if (!DIFF_OPT_TST(&diff_opts, FIND_COPIES_HARDER))
diffcore_std(&diff_opts);
- retval = 0;
- while (1) {
- int made_progress = 0;
+ do {
+ struct blame_entry **unblamedtail = &unblamed;
+ blame_list = setup_blame_list(unblamed, &num_ents);
for (i = 0; i < diff_queued_diff.nr; i++) {
struct diff_filepair *p = diff_queued_diff.queue[i];
@@ -1117,27 +1316,21 @@ static int find_copy_in_parent(struct scoreboard *sb,
struct blame_entry *split = blame_list[j].split;
if (split[1].suspect &&
blame_copy_score < ent_score(sb, &split[1])) {
- split_blame(sb, split, blame_list[j].ent);
- made_progress = 1;
+ split_blame(blamed, &unblamedtail, split,
+ blame_list[j].ent);
+ } else {
+ blame_list[j].ent->next = leftover;
+ leftover = blame_list[j].ent;
}
- else
- blame_list[j].ent->scanned = 1;
decref_split(split);
}
free(blame_list);
-
- if (!made_progress)
- break;
- blame_list = setup_blame_list(sb, target, blame_copy_score, &num_ents);
- if (!blame_list) {
- retval = 1;
- break;
- }
- }
- reset_scanned_flag(sb);
+ *unblamedtail = NULL;
+ toosmall = filter_small(sb, toosmall, &unblamed, blame_copy_score);
+ } while (unblamed);
+ target->suspects = reverse_blame(leftover, NULL);
diff_flush(&diff_opts);
free_pathspec(&diff_opts.pathspec);
- return retval;
}
/*
@@ -1147,20 +1340,21 @@ static int find_copy_in_parent(struct scoreboard *sb,
static void pass_whole_blame(struct scoreboard *sb,
struct origin *origin, struct origin *porigin)
{
- struct blame_entry *e;
+ struct blame_entry *e, *suspects;
if (!porigin->file.ptr && origin->file.ptr) {
/* Steal its file */
porigin->file = origin->file;
origin->file.ptr = NULL;
}
- for (e = sb->ent; e; e = e->next) {
- if (e->suspect != origin)
- continue;
+ suspects = origin->suspects;
+ origin->suspects = NULL;
+ for (e = suspects; e; e = e->next) {
origin_incref(porigin);
origin_decref(e->suspect);
e->suspect = porigin;
}
+ queue_blames(sb, porigin, suspects);
}
/*
@@ -1184,6 +1378,27 @@ static int num_scapegoats(struct rev_info *revs, struct commit *commit)
return cnt;
}
+/* Distribute collected unsorted blames to the respected sorted lists
+ * in the various origins.
+ */
+static void distribute_blame(struct scoreboard *sb, struct blame_entry *blamed)
+{
+ blamed = blame_sort(blamed, compare_blame_suspect);
+ while (blamed)
+ {
+ struct origin *porigin = blamed->suspect;
+ struct blame_entry *suspects = NULL;
+ do {
+ struct blame_entry *next = blamed->next;
+ blamed->next = suspects;
+ suspects = blamed;
+ blamed = next;
+ } while (blamed && blamed->suspect == porigin);
+ suspects = reverse_blame(suspects, NULL);
+ queue_blames(sb, porigin, suspects);
+ }
+}
+
#define MAXSG 16
static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
@@ -1194,6 +1409,8 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
struct commit_list *sg;
struct origin *sg_buf[MAXSG];
struct origin *porigin, **sg_origin = sg_buf;
+ struct blame_entry *toosmall = NULL;
+ struct blame_entry *blames, **blametail = &blames;
num_sg = num_scapegoats(revs, commit);
if (!num_sg)
@@ -1255,38 +1472,71 @@ static void pass_blame(struct scoreboard *sb, struct origin *origin, int opt)
origin_incref(porigin);
origin->previous = porigin;
}
- if (pass_blame_to_parent(sb, origin, porigin))
+ pass_blame_to_parent(sb, origin, porigin);
+ if (!origin->suspects)
goto finish;
}
/*
* Optionally find moves in parents' files.
*/
- if (opt & PICKAXE_BLAME_MOVE)
- for (i = 0, sg = first_scapegoat(revs, commit);
- i < num_sg && sg;
- sg = sg->next, i++) {
- struct origin *porigin = sg_origin[i];
- if (!porigin)
- continue;
- if (find_move_in_parent(sb, origin, porigin))
- goto finish;
+ if (opt & PICKAXE_BLAME_MOVE) {
+ filter_small(sb, &toosmall, &origin->suspects, blame_move_score);
+ if (origin->suspects) {
+ for (i = 0, sg = first_scapegoat(revs, commit);
+ i < num_sg && sg;
+ sg = sg->next, i++) {
+ struct origin *porigin = sg_origin[i];
+ if (!porigin)
+ continue;
+ find_move_in_parent(sb, &blametail, &toosmall, origin, porigin);
+ if (!origin->suspects)
+ break;
+ }
}
+ }
/*
* Optionally find copies from parents' files.
*/
- if (opt & PICKAXE_BLAME_COPY)
+ if (opt & PICKAXE_BLAME_COPY) {
+ if (blame_copy_score > blame_move_score)
+ filter_small(sb, &toosmall, &origin->suspects, blame_copy_score);
+ else if (blame_copy_score < blame_move_score) {
+ origin->suspects = blame_merge(origin->suspects, toosmall);
+ toosmall = NULL;
+ filter_small(sb, &toosmall, &origin->suspects, blame_copy_score);
+ }
+ if (!origin->suspects)
+ goto finish;
+
for (i = 0, sg = first_scapegoat(revs, commit);
i < num_sg && sg;
sg = sg->next, i++) {
struct origin *porigin = sg_origin[i];
- if (find_copy_in_parent(sb, origin, sg->item,
- porigin, opt))
+ find_copy_in_parent(sb, &blametail, &toosmall,
+ origin, sg->item, porigin, opt);
+ if (!origin->suspects)
goto finish;
}
+ }
- finish:
+finish:
+ *blametail = NULL;
+ distribute_blame(sb, blames);
+ /*
+ * prepend toosmall to origin->suspects
+ *
+ * There is no point in sorting: this ends up on a big
+ * unsorted list in the caller anyway.
+ */
+ if (toosmall) {
+ struct blame_entry **tail = &toosmall;
+ while (*tail)
+ tail = &(*tail)->next;
+ *tail = origin->suspects;
+ origin->suspects = toosmall;
+ }
for (i = 0; i < num_sg; i++) {
if (sg_origin[i]) {
drop_origin_blob(sg_origin[i]);
@@ -1481,14 +1731,11 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat)
}
/*
- * The blame_entry is found to be guilty for the range. Mark it
- * as such, and show it in incremental output.
+ * The blame_entry is found to be guilty for the range.
+ * Show it in incremental output.
*/
static void found_guilty_entry(struct blame_entry *ent)
{
- if (ent->guilty)
- return;
- ent->guilty = 1;
if (incremental) {
struct origin *suspect = ent->suspect;
@@ -1502,32 +1749,34 @@ static void found_guilty_entry(struct blame_entry *ent)
}
/*
- * The main loop -- while the scoreboard has lines whose true origin
- * is still unknown, pick one blame_entry, and allow its current
- * suspect to pass blames to its parents.
- */
+ * The main loop -- while we have blobs with lines whose true origin
+ * is still unknown, pick one blob, and allow its lines to pass blames
+ * to its parents. */
static void assign_blame(struct scoreboard *sb, int opt)
{
struct rev_info *revs = sb->revs;
+ struct commit *commit = prio_queue_get(&sb->commits);
- while (1) {
+ while (commit) {
struct blame_entry *ent;
- struct commit *commit;
- struct origin *suspect = NULL;
+ struct origin *suspect = commit->util;
/* find one suspect to break down */
- for (ent = sb->ent; !suspect && ent; ent = ent->next)
- if (!ent->guilty)
- suspect = ent->suspect;
- if (!suspect)
- return; /* all done */
+ while (suspect && !suspect->suspects)
+ suspect = suspect->next;
+
+ if (!suspect) {
+ commit = prio_queue_get(&sb->commits);
+ continue;
+ }
+
+ assert(commit == suspect->commit);
/*
* We will use this suspect later in the loop,
* so hold onto it in the meantime.
*/
origin_incref(suspect);
- commit = suspect->commit;
parse_commit(commit);
if (reverse ||
(!(commit->object.flags & UNINTERESTING) &&
@@ -1543,9 +1792,22 @@ static void assign_blame(struct scoreboard *sb, int opt)
commit->object.flags |= UNINTERESTING;
/* Take responsibility for the remaining entries */
- for (ent = sb->ent; ent; ent = ent->next)
- if (ent->suspect == suspect)
+ ent = suspect->suspects;
+ if (ent) {
+ suspect->guilty = 1;
+ for (;;) {
+ struct blame_entry *next = ent->next;
found_guilty_entry(ent);
+ if (next) {
+ ent = next;
+ continue;
+ }
+ ent->next = sb->ent;
+ sb->ent = suspect->suspects;
+ suspect->suspects = NULL;
+ break;
+ }
+ }
origin_decref(suspect);
if (DEBUG) /* sanity */
@@ -1556,22 +1818,29 @@ static void assign_blame(struct scoreboard *sb, int opt)
static const char *format_time(unsigned long time, const char *tz_str,
int show_raw_time)
{
- static char time_buf[128];
+ static struct strbuf time_buf = STRBUF_INIT;
+ strbuf_reset(&time_buf);
if (show_raw_time) {
- snprintf(time_buf, sizeof(time_buf), "%lu %s", time, tz_str);
+ strbuf_addf(&time_buf, "%lu %s", time, tz_str);
}
else {
const char *time_str;
- int time_len;
+ size_t time_width;
int tz;
tz = atoi(tz_str);
time_str = show_date(time, tz, blame_date_mode);
- time_len = strlen(time_str);
- memcpy(time_buf, time_str, time_len);
- memset(time_buf + time_len, ' ', blame_date_width - time_len);
+ strbuf_addstr(&time_buf, time_str);
+ /*
+ * Add space paddings to time_buf to display a fixed width
+ * string, and use time_width for display width calibration.
+ */
+ for (time_width = utf8_strwidth(time_str);
+ time_width < blame_date_width;
+ time_width++)
+ strbuf_addch(&time_buf, ' ');
}
- return time_buf;
+ return time_buf.buf;
}
#define OUTPUT_ANNOTATE_COMPAT 001
@@ -1602,9 +1871,8 @@ static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent,
char hex[41];
strcpy(hex, sha1_to_hex(suspect->commit->object.sha1));
- printf("%s%c%d %d %d\n",
+ printf("%s %d %d %d\n",
hex,
- ent->guilty ? ' ' : '*', /* purely for debugging */
ent->s_lno + 1,
ent->lno + 1,
ent->num_lines);
@@ -1717,17 +1985,16 @@ static void output(struct scoreboard *sb, int option)
if (option & OUTPUT_PORCELAIN) {
for (ent = sb->ent; ent; ent = ent->next) {
- struct blame_entry *oth;
- struct origin *suspect = ent->suspect;
- struct commit *commit = suspect->commit;
+ int count = 0;
+ struct origin *suspect;
+ struct commit *commit = ent->suspect->commit;
if (commit->object.flags & MORE_THAN_ONE_PATH)
continue;
- for (oth = ent->next; oth; oth = oth->next) {
- if ((oth->suspect->commit != commit) ||
- !strcmp(oth->suspect->path, suspect->path))
- continue;
- commit->object.flags |= MORE_THAN_ONE_PATH;
- break;
+ for (suspect = commit->util; suspect; suspect = suspect->next) {
+ if (suspect->guilty && count++) {
+ commit->object.flags |= MORE_THAN_ONE_PATH;
+ break;
+ }
}
}
}
@@ -2088,11 +2355,9 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
if (strbuf_read(&buf, 0, 0) < 0)
die_errno("failed to read from stdin");
}
- convert_to_git(path, buf.buf, buf.len, &buf, 0);
origin->file.ptr = buf.buf;
origin->file.size = buf.len;
pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_sha1);
- commit->util = origin;
/*
* Read the current index, replace the path entry with
@@ -2331,7 +2596,14 @@ parse_done:
blame_date_width = sizeof("2006-10-19");
break;
case DATE_RELATIVE:
- /* "normal" is used as the fallback for "relative" */
+ /* TRANSLATORS: This string is used to tell us the maximum
+ display width for a relative timestamp in "git blame"
+ output. For C locale, "4 years, 11 months ago", which
+ takes 22 places, is the longest among various forms of
+ relative timestamps, but your language may need more or
+ fewer display columns. */
+ blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
+ break;
case DATE_LOCAL:
case DATE_NORMAL:
blame_date_width = sizeof("Thu Oct 19 16:00:04 2006 -0700");
@@ -2403,12 +2675,16 @@ parse_done:
memset(&sb, 0, sizeof(sb));
sb.revs = &revs;
- if (!reverse)
+ if (!reverse) {
final_commit_name = prepare_final(&sb);
+ sb.commits.compare = compare_commits_by_commit_date;
+ }
else if (contents_from)
die("--contents and --children do not blend well.");
- else
+ else {
final_commit_name = prepare_initial(&sb);
+ sb.commits.compare = compare_commits_by_reverse_commit_date;
+ }
if (!sb.final) {
/*
@@ -2497,12 +2773,16 @@ parse_done:
ent->next = next;
origin_incref(o);
}
+
+ o->suspects = ent;
+ prio_queue_put(&sb.commits, o->commit);
+
origin_decref(o);
range_set_release(&ranges);
string_list_clear(&range_list, 0);
- sb.ent = ent;
+ sb.ent = NULL;
sb.path = path;
read_mailmap(&mailmap, NULL);
@@ -2515,6 +2795,8 @@ parse_done:
if (incremental)
return 0;
+ sb.ent = blame_sort(sb.ent, compare_blame_final);
+
coalesce(&sb);
if (!(output_option & OUTPUT_PORCELAIN))
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 07cf555..f1dc56e 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -624,7 +624,7 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
/* Nothing to do. */
} else if (opts->force_detach || !new->path) { /* No longer on any branch. */
update_ref(msg.buf, "HEAD", new->commit->object.sha1, NULL,
- REF_NODEREF, DIE_ON_ERR);
+ REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
if (!opts->quiet) {
if (old->path && advice_detached_head)
detach_advice(new->name);
@@ -651,12 +651,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
}
}
if (old->path && old->name) {
- char log_file[PATH_MAX], ref_file[PATH_MAX];
-
- git_snpath(log_file, sizeof(log_file), "logs/%s", old->path);
- git_snpath(ref_file, sizeof(ref_file), "%s", old->path);
- if (!file_exists(ref_file) && file_exists(log_file))
- remove_path(log_file);
+ if (!ref_exists(old->path) && reflog_exists(old->path))
+ delete_reflog(old->path);
}
}
remove_branch_state();
diff --git a/builtin/clone.c b/builtin/clone.c
index 9b3c04d..b12989d 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -521,7 +521,7 @@ static void write_followtags(const struct ref *refs, const char *msg)
if (!has_sha1_file(ref->old_sha1))
continue;
update_ref(msg, ref->name, ref->old_sha1,
- NULL, 0, DIE_ON_ERR);
+ NULL, 0, UPDATE_REFS_DIE_ON_ERR);
}
}
@@ -589,14 +589,15 @@ static void update_head(const struct ref *our, const struct ref *remote,
create_symref("HEAD", our->name, NULL);
if (!option_bare) {
const char *head = skip_prefix(our->name, "refs/heads/");
- update_ref(msg, "HEAD", our->old_sha1, NULL, 0, DIE_ON_ERR);
+ update_ref(msg, "HEAD", our->old_sha1, NULL, 0,
+ UPDATE_REFS_DIE_ON_ERR);
install_branch_config(0, head, option_origin, our->name);
}
} else if (our) {
struct commit *c = lookup_commit_reference(our->old_sha1);
/* --branch specifies a non-branch (i.e. tags), detach HEAD */
update_ref(msg, "HEAD", c->object.sha1,
- NULL, REF_NODEREF, DIE_ON_ERR);
+ NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
} else if (remote) {
/*
* We know remote HEAD points to a non-branch, or
@@ -604,7 +605,7 @@ static void update_head(const struct ref *our, const struct ref *remote,
* Detach HEAD in all these cases.
*/
update_ref(msg, "HEAD", remote->old_sha1,
- NULL, REF_NODEREF, DIE_ON_ERR);
+ NULL, REF_NODEREF, UPDATE_REFS_DIE_ON_ERR);
}
}
diff --git a/builtin/commit.c b/builtin/commit.c
index 9cfef6c..d28505a 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -526,10 +526,29 @@ static int sane_ident_split(struct ident_split *person)
return 1;
}
+static int parse_force_date(const char *in, char *out, int len)
+{
+ if (len < 1)
+ return -1;
+ *out++ = '@';
+ len--;
+
+ if (parse_date(in, out, len) < 0) {
+ int errors = 0;
+ unsigned long t = approxidate_careful(in, &errors);
+ if (errors)
+ return -1;
+ snprintf(out, len, "%lu", t);
+ }
+
+ return 0;
+}
+
static void determine_author_info(struct strbuf *author_ident)
{
char *name, *email, *date;
struct ident_split author;
+ char date_buf[64];
name = getenv("GIT_AUTHOR_NAME");
email = getenv("GIT_AUTHOR_EMAIL");
@@ -574,8 +593,12 @@ static void determine_author_info(struct strbuf *author_ident)
email = xstrndup(lb + 2, rb - (lb + 2));
}
- if (force_date)
- date = force_date;
+ if (force_date) {
+ if (parse_force_date(force_date, date_buf, sizeof(date_buf)))
+ die(_("invalid date format: %s"), force_date);
+ date = date_buf;
+ }
+
strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT));
if (!split_ident_line(&author, author_ident->buf, author_ident->len) &&
sane_ident_split(&author)) {
@@ -585,13 +608,16 @@ static void determine_author_info(struct strbuf *author_ident)
}
}
-static char *cut_ident_timestamp_part(char *string)
+static void split_ident_or_die(struct ident_split *id, const struct strbuf *buf)
+{
+ if (split_ident_line(id, buf->buf, buf->len) ||
+ !sane_ident_split(id))
+ die(_("Malformed ident string: '%s'"), buf->buf);
+}
+
+static int author_date_is_interesting(void)
{
- char *ket = strrchr(string, '>');
- if (!ket || ket[1] != ' ')
- die(_("Malformed ident string: '%s'"), string);
- *++ket = '\0';
- return ket;
+ return author_message || force_date;
}
static int prepare_to_commit(const char *index_file, const char *prefix,
@@ -650,9 +676,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
} else if (use_message) {
char *buffer;
buffer = strstr(use_message_buffer, "\n\n");
- if (!use_editor && (!buffer || buffer[2] == '\0'))
- die(_("commit has empty message"));
- strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
+ if (buffer)
+ strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
hook_arg1 = "commit";
hook_arg2 = use_message;
} else if (fixup_message) {
@@ -755,7 +780,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
if (use_editor && include_status) {
int ident_shown = 0;
int saved_color_setting;
- char *ai_tmp, *ci_tmp;
+ struct ident_split ci, ai;
+
if (whence != FROM_COMMIT) {
if (cleanup_mode == CLEANUP_SCISSORS)
wt_status_add_cut_line(s->fp);
@@ -795,32 +821,39 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
status_printf_ln(s, GIT_COLOR_NORMAL,
"%s", only_include_assumed);
- ai_tmp = cut_ident_timestamp_part(author_ident->buf);
- ci_tmp = cut_ident_timestamp_part(committer_ident.buf);
- if (strcmp(author_ident->buf, committer_ident.buf))
+ split_ident_or_die(&ai, author_ident);
+ split_ident_or_die(&ci, &committer_ident);
+
+ if (ident_cmp(&ai, &ci))
status_printf_ln(s, GIT_COLOR_NORMAL,
_("%s"
- "Author: %s"),
+ "Author: %.*s <%.*s>"),
ident_shown++ ? "" : "\n",
- author_ident->buf);
+ (int)(ai.name_end - ai.name_begin), ai.name_begin,
+ (int)(ai.mail_end - ai.mail_begin), ai.mail_begin);
+
+ if (author_date_is_interesting())
+ status_printf_ln(s, GIT_COLOR_NORMAL,
+ _("%s"
+ "Date: %s"),
+ ident_shown++ ? "" : "\n",
+ show_ident_date(&ai, DATE_NORMAL));
if (!committer_ident_sufficiently_given())
status_printf_ln(s, GIT_COLOR_NORMAL,
_("%s"
- "Committer: %s"),
+ "Committer: %.*s <%.*s>"),
ident_shown++ ? "" : "\n",
- committer_ident.buf);
+ (int)(ci.name_end - ci.name_begin), ci.name_begin,
+ (int)(ci.mail_end - ci.mail_begin), ci.mail_begin);
if (ident_shown)
- status_printf_ln(s, GIT_COLOR_NORMAL, "");
+ status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
saved_color_setting = s->use_color;
s->use_color = 0;
commitable = run_status(s->fp, index_file, prefix, 1, s);
s->use_color = saved_color_setting;
-
- *ai_tmp = ' ';
- *ci_tmp = ' ';
} else {
unsigned char sha1[20];
const char *parent = "HEAD";
@@ -1356,6 +1389,13 @@ static void print_summary(const char *prefix, const unsigned char *sha1,
strbuf_addstr(&format, "\n Author: ");
strbuf_addbuf_percentquote(&format, &author_ident);
}
+ if (author_date_is_interesting()) {
+ struct strbuf date = STRBUF_INIT;
+ format_commit_message(commit, "%ad", &date, &pctx);
+ strbuf_addstr(&format, "\n Date: ");
+ strbuf_addbuf_percentquote(&format, &date);
+ strbuf_release(&date);
+ }
if (!committer_ident_sufficiently_given()) {
strbuf_addstr(&format, "\n Committer: ");
strbuf_addbuf_percentquote(&format, &committer_ident);
@@ -1672,6 +1712,10 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
? NULL
: current_head->object.sha1,
0, NULL);
+ if (!ref_lock) {
+ rollback_index_files();
+ die(_("cannot lock HEAD ref"));
+ }
nl = strchr(sb.buf, '\n');
if (nl)
@@ -1681,10 +1725,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
strbuf_insert(&sb, 0, reflog_msg, strlen(reflog_msg));
strbuf_insert(&sb, strlen(reflog_msg), ": ", 2);
- if (!ref_lock) {
- rollback_index_files();
- die(_("cannot lock HEAD ref"));
- }
if (write_ref_sha1(ref_lock, sha1, sb.buf) < 0) {
rollback_index_files();
die(_("cannot update HEAD ref"));
diff --git a/builtin/grep.c b/builtin/grep.c
index 69ac2d8..43af5b7 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -361,9 +361,7 @@ static void run_pager(struct grep_opt *opt, const char *prefix)
argv[i] = path_list->items[i].string;
argv[path_list->nr] = NULL;
- if (prefix && chdir(prefix))
- die(_("Failed to chdir: %s"), prefix);
- status = run_command_v_opt(argv, RUN_USING_SHELL);
+ status = run_command_v_opt_cd_env(argv, RUN_USING_SHELL, prefix, NULL);
if (status)
exit(status);
free(argv);
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index b9f6e12..18f57de 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -40,17 +40,13 @@ struct base_data {
int ofs_first, ofs_last;
};
-#if !defined(NO_PTHREADS) && defined(NO_THREAD_SAFE_PREAD)
-/* pread() emulation is not thread-safe. Disable threading. */
-#define NO_PTHREADS
-#endif
-
struct thread_local {
#ifndef NO_PTHREADS
pthread_t thread;
#endif
struct base_data *base_cache;
size_t base_cache_used;
+ int pack_fd;
};
/*
@@ -91,7 +87,8 @@ static off_t consumed_bytes;
static unsigned deepest_delta;
static git_SHA_CTX input_ctx;
static uint32_t input_crc32;
-static int input_fd, output_fd, pack_fd;
+static int input_fd, output_fd;
+static const char *curr_pack;
#ifndef NO_PTHREADS
@@ -134,6 +131,7 @@ static inline void unlock_mutex(pthread_mutex_t *mutex)
*/
static void init_thread(void)
{
+ int i;
init_recursive_mutex(&read_mutex);
pthread_mutex_init(&counter_mutex, NULL);
pthread_mutex_init(&work_mutex, NULL);
@@ -141,11 +139,18 @@ static void init_thread(void)
pthread_mutex_init(&deepest_delta_mutex, NULL);
pthread_key_create(&key, NULL);
thread_data = xcalloc(nr_threads, sizeof(*thread_data));
+ for (i = 0; i < nr_threads; i++) {
+ thread_data[i].pack_fd = open(curr_pack, O_RDONLY);
+ if (thread_data[i].pack_fd == -1)
+ die_errno(_("unable to open %s"), curr_pack);
+ }
+
threads_active = 1;
}
static void cleanup_thread(void)
{
+ int i;
if (!threads_active)
return;
threads_active = 0;
@@ -154,6 +159,8 @@ static void cleanup_thread(void)
pthread_mutex_destroy(&work_mutex);
if (show_stat)
pthread_mutex_destroy(&deepest_delta_mutex);
+ for (i = 0; i < nr_threads; i++)
+ close(thread_data[i].pack_fd);
pthread_key_delete(key);
free(thread_data);
}
@@ -200,8 +207,13 @@ static unsigned check_object(struct object *obj)
if (!(obj->flags & FLAG_CHECKED)) {
unsigned long size;
int type = sha1_object_info(obj->sha1, &size);
- if (type != obj->type || type <= 0)
- die(_("object of unexpected type"));
+ if (type <= 0)
+ die(_("did not receive expected object %s"),
+ sha1_to_hex(obj->sha1));
+ if (type != obj->type)
+ die(_("object %s: expected type %s, found %s"),
+ sha1_to_hex(obj->sha1),
+ typename(obj->type), typename(type));
obj->flags |= FLAG_CHECKED;
return 1;
}
@@ -288,13 +300,13 @@ static const char *open_pack_file(const char *pack_name)
output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
if (output_fd < 0)
die_errno(_("unable to create '%s'"), pack_name);
- pack_fd = output_fd;
+ nothread_data.pack_fd = output_fd;
} else {
input_fd = open(pack_name, O_RDONLY);
if (input_fd < 0)
die_errno(_("cannot open packfile '%s'"), pack_name);
output_fd = -1;
- pack_fd = input_fd;
+ nothread_data.pack_fd = input_fd;
}
git_SHA1_Init(&input_ctx);
return pack_name;
@@ -542,7 +554,7 @@ static void *unpack_data(struct object_entry *obj,
do {
ssize_t n = (len < 64*1024) ? len : 64*1024;
- n = pread(pack_fd, inbuf, n, from);
+ n = xpread(get_thread_data()->pack_fd, inbuf, n, from);
if (n < 0)
die_errno(_("cannot pread pack file"));
if (!n)
@@ -1490,7 +1502,7 @@ static void show_pack_info(int stat_only)
int cmd_index_pack(int argc, const char **argv, const char *prefix)
{
int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
- const char *curr_pack, *curr_index;
+ const char *curr_index;
const char *index_name = NULL, *pack_name = NULL;
const char *keep_name = NULL, *keep_msg = NULL;
char *index_name_buf = NULL, *keep_name_buf = NULL;
diff --git a/builtin/merge.c b/builtin/merge.c
index 66d8843..428ca24 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -63,7 +63,7 @@ static int verbosity;
static int allow_rerere_auto;
static int abort_current_merge;
static int show_progress = -1;
-static int default_to_upstream;
+static int default_to_upstream = 1;
static const char *sign_commit;
static struct strategy all_strategy[] = {
@@ -398,7 +398,7 @@ static void finish(struct commit *head_commit,
const char *argv_gc_auto[] = { "gc", "--auto", NULL };
update_ref(reflog_message.buf, "HEAD",
new_head, head, 0,
- DIE_ON_ERR);
+ UPDATE_REFS_DIE_ON_ERR);
/*
* We ignore errors in 'gc --auto', since the
* user should see them.
@@ -1222,7 +1222,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
die(_("%s - not something we can merge"), argv[0]);
read_empty(remote_head->object.sha1, 0);
update_ref("initial pull", "HEAD", remote_head->object.sha1,
- NULL, 0, DIE_ON_ERR);
+ NULL, 0, UPDATE_REFS_DIE_ON_ERR);
goto done;
} else {
struct strbuf merge_names = STRBUF_INIT;
@@ -1339,7 +1339,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
}
update_ref("updating ORIG_HEAD", "ORIG_HEAD", head_commit->object.sha1,
- NULL, 0, DIE_ON_ERR);
+ NULL, 0, UPDATE_REFS_DIE_ON_ERR);
if (remoteheads && !common)
; /* No common ancestors found. We need a real merge. */
diff --git a/builtin/mv.c b/builtin/mv.c
index 2a7243f..180ef99 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -203,7 +203,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
}
} else if (cache_name_pos(src, length) < 0)
bad = _("not under version control");
- else if (lstat(dst, &st) == 0) {
+ else if (lstat(dst, &st) == 0 &&
+ (!ignore_case || strcasecmp(src, dst))) {
bad = _("destination exists");
if (force) {
/*
diff --git a/builtin/notes.c b/builtin/notes.c
index 39c8573..820c341 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -717,7 +717,7 @@ static int merge_commit(struct notes_merge_options *o)
strbuf_insert(&msg, 0, "notes: ", 7);
update_ref(msg.buf, o->local_ref, sha1,
is_null_sha1(parent_sha1) ? NULL : parent_sha1,
- 0, DIE_ON_ERR);
+ 0, UPDATE_REFS_DIE_ON_ERR);
free_notes(t);
strbuf_release(&msg);
@@ -812,11 +812,11 @@ static int merge(int argc, const char **argv, const char *prefix)
if (result >= 0) /* Merge resulted (trivially) in result_sha1 */
/* Update default notes ref with new commit */
update_ref(msg.buf, default_notes_ref(), result_sha1, NULL,
- 0, DIE_ON_ERR);
+ 0, UPDATE_REFS_DIE_ON_ERR);
else { /* Merge has unresolved conflicts */
/* Update .git/NOTES_MERGE_PARTIAL with partial merge result */
update_ref(msg.buf, "NOTES_MERGE_PARTIAL", result_sha1, NULL,
- 0, DIE_ON_ERR);
+ 0, UPDATE_REFS_DIE_ON_ERR);
/* Store ref-to-be-updated into .git/NOTES_MERGE_REF */
if (create_symref("NOTES_MERGE_REF", default_notes_ref(), NULL))
die("Failed to store link to current notes ref (%s)",
diff --git a/builtin/reflog.c b/builtin/reflog.c
index c12a9784..e8a8fb1 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -369,7 +369,7 @@ static int expire_reflog(const char *ref, const unsigned char *sha1, int unused,
if (!lock)
return error("cannot lock ref '%s'", ref);
log_file = git_pathdup("logs/%s", ref);
- if (!file_exists(log_file))
+ if (!reflog_exists(ref))
goto finish;
if (!cmd->dry_run) {
newlog_path = git_pathdup("logs/%s.lock", ref);
diff --git a/builtin/rerere.c b/builtin/rerere.c
index 4e51add..98eb8c5 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -60,6 +60,8 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, rerere_usage, 0);
+ git_config(git_xmerge_config, NULL);
+
if (autoupdate == 1)
flags = RERERE_AUTOUPDATE;
if (autoupdate == 0)
diff --git a/builtin/reset.c b/builtin/reset.c
index f4e0875..f368266 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -252,11 +252,13 @@ static int reset_refs(const char *rev, const unsigned char *sha1)
if (!get_sha1("HEAD", sha1_orig)) {
orig = sha1_orig;
set_reflog_message(&msg, "updating ORIG_HEAD", NULL);
- update_ref(msg.buf, "ORIG_HEAD", orig, old_orig, 0, MSG_ON_ERR);
+ update_ref(msg.buf, "ORIG_HEAD", orig, old_orig, 0,
+ UPDATE_REFS_MSG_ON_ERR);
} else if (old_orig)
delete_ref("ORIG_HEAD", old_orig, 0);
set_reflog_message(&msg, "updating HEAD", rev);
- update_ref_status = update_ref(msg.buf, "HEAD", sha1, orig, 0, MSG_ON_ERR);
+ update_ref_status = update_ref(msg.buf, "HEAD", sha1, orig, 0,
+ UPDATE_REFS_MSG_ON_ERR);
strbuf_release(&msg);
return update_ref_status;
}
diff --git a/builtin/tag.c b/builtin/tag.c
index 6c7c6bd..c6e8a71 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -80,11 +80,19 @@ static int in_commit_list(const struct commit_list *want, struct commit *c)
return 0;
}
-static int contains_recurse(struct commit *candidate,
+enum contains_result {
+ CONTAINS_UNKNOWN = -1,
+ CONTAINS_NO = 0,
+ CONTAINS_YES = 1,
+};
+
+/*
+ * Test whether the candidate or one of its parents is contained in the list.
+ * Do not recurse to find out, though, but return -1 if inconclusive.
+ */
+static enum contains_result contains_test(struct commit *candidate,
const struct commit_list *want)
{
- struct commit_list *p;
-
/* was it previously marked as containing a want commit? */
if (candidate->object.flags & TMP_MARK)
return 1;
@@ -92,26 +100,78 @@ static int contains_recurse(struct commit *candidate,
if (candidate->object.flags & UNINTERESTING)
return 0;
/* or are we it? */
- if (in_commit_list(want, candidate))
+ if (in_commit_list(want, candidate)) {
+ candidate->object.flags |= TMP_MARK;
return 1;
+ }
if (parse_commit(candidate) < 0)
return 0;
- /* Otherwise recurse and mark ourselves for future traversals. */
- for (p = candidate->parents; p; p = p->next) {
- if (contains_recurse(p->item, want)) {
- candidate->object.flags |= TMP_MARK;
- return 1;
- }
- }
- candidate->object.flags |= UNINTERESTING;
- return 0;
+ return -1;
}
-static int contains(struct commit *candidate, const struct commit_list *want)
+/*
+ * Mimicking the real stack, this stack lives on the heap, avoiding stack
+ * overflows.
+ *
+ * At each recursion step, the stack items points to the commits whose
+ * ancestors are to be inspected.
+ */
+struct stack {
+ int nr, alloc;
+ struct stack_entry {
+ struct commit *commit;
+ struct commit_list *parents;
+ } *stack;
+};
+
+static void push_to_stack(struct commit *candidate, struct stack *stack)
+{
+ int index = stack->nr++;
+ ALLOC_GROW(stack->stack, stack->nr, stack->alloc);
+ stack->stack[index].commit = candidate;
+ stack->stack[index].parents = candidate->parents;
+}
+
+static enum contains_result contains(struct commit *candidate,
+ const struct commit_list *want)
{
- return contains_recurse(candidate, want);
+ struct stack stack = { 0, 0, NULL };
+ int result = contains_test(candidate, want);
+
+ if (result != CONTAINS_UNKNOWN)
+ return result;
+
+ push_to_stack(candidate, &stack);
+ while (stack.nr) {
+ struct stack_entry *entry = &stack.stack[stack.nr - 1];
+ struct commit *commit = entry->commit;
+ struct commit_list *parents = entry->parents;
+
+ if (!parents) {
+ commit->object.flags |= UNINTERESTING;
+ stack.nr--;
+ }
+ /*
+ * If we just popped the stack, parents->item has been marked,
+ * therefore contains_test will return a meaningful 0 or 1.
+ */
+ else switch (contains_test(parents->item, want)) {
+ case CONTAINS_YES:
+ commit->object.flags |= TMP_MARK;
+ stack.nr--;
+ break;
+ case CONTAINS_NO:
+ entry->parents = parents->next;
+ break;
+ case CONTAINS_UNKNOWN:
+ push_to_stack(parents->item, &stack);
+ break;
+ }
+ }
+ free(stack.stack);
+ return contains_test(candidate, want);
}
static void show_tag_lines(const unsigned char *sha1, int lines)
@@ -278,11 +338,11 @@ static int do_sign(struct strbuf *buffer)
}
static const char tag_template[] =
- N_("\nWrite a tag message\n"
+ N_("\nWrite a message for tag:\n %s\n"
"Lines starting with '%c' will be ignored.\n");
static const char tag_template_nocleanup[] =
- N_("\nWrite a tag message\n"
+ N_("\nWrite a message for tag:\n %s\n"
"Lines starting with '%c' will be kept; you may remove them"
" yourself if you want to.\n");
@@ -378,9 +438,9 @@ static void create_tag(const unsigned char *object, const char *tag,
struct strbuf buf = STRBUF_INIT;
strbuf_addch(&buf, '\n');
if (opt->cleanup_mode == CLEANUP_ALL)
- strbuf_commented_addf(&buf, _(tag_template), comment_line_char);
+ strbuf_commented_addf(&buf, _(tag_template), tag, comment_line_char);
else
- strbuf_commented_addf(&buf, _(tag_template_nocleanup), comment_line_char);
+ strbuf_commented_addf(&buf, _(tag_template_nocleanup), tag, comment_line_char);
write_or_die(fd, buf.buf, buf.len);
strbuf_release(&buf);
}
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 5c208bb..405267f 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -12,238 +12,329 @@ static const char * const git_update_ref_usage[] = {
NULL
};
-static int updates_alloc;
-static int updates_count;
-static const struct ref_update **updates;
+static struct ref_transaction *transaction;
static char line_termination = '\n';
static int update_flags;
-static struct ref_update *update_alloc(void)
-{
- struct ref_update *update;
-
- /* Allocate and zero-init a struct ref_update */
- update = xcalloc(1, sizeof(*update));
- ALLOC_GROW(updates, updates_count + 1, updates_alloc);
- updates[updates_count++] = update;
-
- /* Store and reset accumulated options */
- update->flags = update_flags;
- update_flags = 0;
-
- return update;
-}
-
-static void update_store_ref_name(struct ref_update *update,
- const char *ref_name)
-{
- if (check_refname_format(ref_name, REFNAME_ALLOW_ONELEVEL))
- die("invalid ref format: %s", ref_name);
- update->ref_name = xstrdup(ref_name);
-}
-
-static void update_store_new_sha1(struct ref_update *update,
- const char *newvalue)
-{
- if (*newvalue && get_sha1(newvalue, update->new_sha1))
- die("invalid new value for ref %s: %s",
- update->ref_name, newvalue);
-}
-
-static void update_store_old_sha1(struct ref_update *update,
- const char *oldvalue)
-{
- if (*oldvalue && get_sha1(oldvalue, update->old_sha1))
- die("invalid old value for ref %s: %s",
- update->ref_name, oldvalue);
-
- /* We have an old value if non-empty, or if empty without -z */
- update->have_old = *oldvalue || line_termination;
-}
-
+/*
+ * Parse one whitespace- or NUL-terminated, possibly C-quoted argument
+ * and append the result to arg. Return a pointer to the terminator.
+ * Die if there is an error in how the argument is C-quoted. This
+ * function is only used if not -z.
+ */
static const char *parse_arg(const char *next, struct strbuf *arg)
{
- /* Parse SP-terminated, possibly C-quoted argument */
- if (*next != '"')
+ if (*next == '"') {
+ const char *orig = next;
+
+ if (unquote_c_style(arg, next, &next))
+ die("badly quoted argument: %s", orig);
+ if (*next && !isspace(*next))
+ die("unexpected character after quoted argument: %s", orig);
+ } else {
while (*next && !isspace(*next))
strbuf_addch(arg, *next++);
- else if (unquote_c_style(arg, next, &next))
- die("badly quoted argument: %s", next);
+ }
- /* Return position after the argument */
return next;
}
-static const char *parse_first_arg(const char *next, struct strbuf *arg)
+/*
+ * Parse the reference name immediately after "command SP". If not
+ * -z, then handle C-quoting. Return a pointer to a newly allocated
+ * string containing the name of the reference, or NULL if there was
+ * an error. Update *next to point at the character that terminates
+ * the argument. Die if C-quoting is malformed or the reference name
+ * is invalid.
+ */
+static char *parse_refname(struct strbuf *input, const char **next)
{
- /* Parse argument immediately after "command SP" */
- strbuf_reset(arg);
+ struct strbuf ref = STRBUF_INIT;
+
if (line_termination) {
/* Without -z, use the next argument */
- next = parse_arg(next, arg);
+ *next = parse_arg(*next, &ref);
} else {
- /* With -z, use rest of first NUL-terminated line */
- strbuf_addstr(arg, next);
- next = next + arg->len;
+ /* With -z, use everything up to the next NUL */
+ strbuf_addstr(&ref, *next);
+ *next += ref.len;
}
- return next;
+
+ if (!ref.len) {
+ strbuf_release(&ref);
+ return NULL;
+ }
+
+ if (check_refname_format(ref.buf, REFNAME_ALLOW_ONELEVEL))
+ die("invalid ref format: %s", ref.buf);
+
+ return strbuf_detach(&ref, NULL);
}
-static const char *parse_next_arg(const char *next, struct strbuf *arg)
+/*
+ * The value being parsed is <oldvalue> (as opposed to <newvalue>; the
+ * difference affects which error messages are generated):
+ */
+#define PARSE_SHA1_OLD 0x01
+
+/*
+ * For backwards compatibility, accept an empty string for update's
+ * <newvalue> in binary mode to be equivalent to specifying zeros.
+ */
+#define PARSE_SHA1_ALLOW_EMPTY 0x02
+
+/*
+ * Parse an argument separator followed by the next argument, if any.
+ * If there is an argument, convert it to a SHA-1, write it to sha1,
+ * set *next to point at the character terminating the argument, and
+ * return 0. If there is no argument at all (not even the empty
+ * string), return 1 and leave *next unchanged. If the value is
+ * provided but cannot be converted to a SHA-1, die. flags can
+ * include PARSE_SHA1_OLD and/or PARSE_SHA1_ALLOW_EMPTY.
+ */
+static int parse_next_sha1(struct strbuf *input, const char **next,
+ unsigned char *sha1,
+ const char *command, const char *refname,
+ int flags)
{
- /* Parse next SP-terminated or NUL-terminated argument, if any */
- strbuf_reset(arg);
+ struct strbuf arg = STRBUF_INIT;
+ int ret = 0;
+
+ if (*next == input->buf + input->len)
+ goto eof;
+
if (line_termination) {
/* Without -z, consume SP and use next argument */
- if (!*next)
- return NULL;
- if (*next != ' ')
- die("expected SP but got: %s", next);
- next = parse_arg(next + 1, arg);
+ if (!**next || **next == line_termination)
+ return 1;
+ if (**next != ' ')
+ die("%s %s: expected SP but got: %s",
+ command, refname, *next);
+ (*next)++;
+ *next = parse_arg(*next, &arg);
+ if (arg.len) {
+ if (get_sha1(arg.buf, sha1))
+ goto invalid;
+ } else {
+ /* Without -z, an empty value means all zeros: */
+ hashclr(sha1);
+ }
} else {
/* With -z, read the next NUL-terminated line */
- if (*next)
- die("expected NUL but got: %s", next);
- if (strbuf_getline(arg, stdin, '\0') == EOF)
- return NULL;
- next = arg->buf + arg->len;
+ if (**next)
+ die("%s %s: expected NUL but got: %s",
+ command, refname, *next);
+ (*next)++;
+ if (*next == input->buf + input->len)
+ goto eof;
+ strbuf_addstr(&arg, *next);
+ *next += arg.len;
+
+ if (arg.len) {
+ if (get_sha1(arg.buf, sha1))
+ goto invalid;
+ } else if (flags & PARSE_SHA1_ALLOW_EMPTY) {
+ /* With -z, treat an empty value as all zeros: */
+ warning("%s %s: missing <newvalue>, treating as zero",
+ command, refname);
+ hashclr(sha1);
+ } else {
+ /*
+ * With -z, an empty non-required value means
+ * unspecified:
+ */
+ ret = 1;
+ }
}
- return next;
+
+ strbuf_release(&arg);
+
+ return ret;
+
+ invalid:
+ die(flags & PARSE_SHA1_OLD ?
+ "%s %s: invalid <oldvalue>: %s" :
+ "%s %s: invalid <newvalue>: %s",
+ command, refname, arg.buf);
+
+ eof:
+ die(flags & PARSE_SHA1_OLD ?
+ "%s %s: unexpected end of input when reading <oldvalue>" :
+ "%s %s: unexpected end of input when reading <newvalue>",
+ command, refname);
}
-static void parse_cmd_update(const char *next)
+
+/*
+ * The following five parse_cmd_*() functions parse the corresponding
+ * command. In each case, next points at the character following the
+ * command name and the following space. They each return a pointer
+ * to the character terminating the command, and die with an
+ * explanatory message if there are any parsing problems. All of
+ * these functions handle either text or binary format input,
+ * depending on how line_termination is set.
+ */
+
+static const char *parse_cmd_update(struct strbuf *input, const char *next)
{
- struct strbuf ref = STRBUF_INIT;
- struct strbuf newvalue = STRBUF_INIT;
- struct strbuf oldvalue = STRBUF_INIT;
- struct ref_update *update;
+ char *refname;
+ unsigned char new_sha1[20];
+ unsigned char old_sha1[20];
+ int have_old;
- update = update_alloc();
+ refname = parse_refname(input, &next);
+ if (!refname)
+ die("update: missing <ref>");
- if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
- update_store_ref_name(update, ref.buf);
- else
- die("update line missing <ref>");
+ if (parse_next_sha1(input, &next, new_sha1, "update", refname,
+ PARSE_SHA1_ALLOW_EMPTY))
+ die("update %s: missing <newvalue>", refname);
- if ((next = parse_next_arg(next, &newvalue)) != NULL)
- update_store_new_sha1(update, newvalue.buf);
- else
- die("update %s missing <newvalue>", ref.buf);
+ have_old = !parse_next_sha1(input, &next, old_sha1, "update", refname,
+ PARSE_SHA1_OLD);
- if ((next = parse_next_arg(next, &oldvalue)) != NULL)
- update_store_old_sha1(update, oldvalue.buf);
- else if(!line_termination)
- die("update %s missing [<oldvalue>] NUL", ref.buf);
+ if (*next != line_termination)
+ die("update %s: extra input: %s", refname, next);
- if (next && *next)
- die("update %s has extra input: %s", ref.buf, next);
+ ref_transaction_update(transaction, refname, new_sha1, old_sha1,
+ update_flags, have_old);
+
+ update_flags = 0;
+ free(refname);
+
+ return next;
}
-static void parse_cmd_create(const char *next)
+static const char *parse_cmd_create(struct strbuf *input, const char *next)
{
- struct strbuf ref = STRBUF_INIT;
- struct strbuf newvalue = STRBUF_INIT;
- struct ref_update *update;
+ char *refname;
+ unsigned char new_sha1[20];
- update = update_alloc();
- update->have_old = 1;
+ refname = parse_refname(input, &next);
+ if (!refname)
+ die("create: missing <ref>");
- if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
- update_store_ref_name(update, ref.buf);
- else
- die("create line missing <ref>");
+ if (parse_next_sha1(input, &next, new_sha1, "create", refname, 0))
+ die("create %s: missing <newvalue>", refname);
- if ((next = parse_next_arg(next, &newvalue)) != NULL)
- update_store_new_sha1(update, newvalue.buf);
- else
- die("create %s missing <newvalue>", ref.buf);
- if (is_null_sha1(update->new_sha1))
- die("create %s given zero new value", ref.buf);
+ if (is_null_sha1(new_sha1))
+ die("create %s: zero <newvalue>", refname);
+
+ if (*next != line_termination)
+ die("create %s: extra input: %s", refname, next);
- if (next && *next)
- die("create %s has extra input: %s", ref.buf, next);
+ ref_transaction_create(transaction, refname, new_sha1, update_flags);
+
+ update_flags = 0;
+ free(refname);
+
+ return next;
}
-static void parse_cmd_delete(const char *next)
+static const char *parse_cmd_delete(struct strbuf *input, const char *next)
{
- struct strbuf ref = STRBUF_INIT;
- struct strbuf oldvalue = STRBUF_INIT;
- struct ref_update *update;
+ char *refname;
+ unsigned char old_sha1[20];
+ int have_old;
- update = update_alloc();
+ refname = parse_refname(input, &next);
+ if (!refname)
+ die("delete: missing <ref>");
- if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
- update_store_ref_name(update, ref.buf);
- else
- die("delete line missing <ref>");
+ if (parse_next_sha1(input, &next, old_sha1, "delete", refname,
+ PARSE_SHA1_OLD)) {
+ have_old = 0;
+ } else {
+ if (is_null_sha1(old_sha1))
+ die("delete %s: zero <oldvalue>", refname);
+ have_old = 1;
+ }
+
+ if (*next != line_termination)
+ die("delete %s: extra input: %s", refname, next);
- if ((next = parse_next_arg(next, &oldvalue)) != NULL)
- update_store_old_sha1(update, oldvalue.buf);
- else if(!line_termination)
- die("delete %s missing [<oldvalue>] NUL", ref.buf);
- if (update->have_old && is_null_sha1(update->old_sha1))
- die("delete %s given zero old value", ref.buf);
+ ref_transaction_delete(transaction, refname, old_sha1,
+ update_flags, have_old);
- if (next && *next)
- die("delete %s has extra input: %s", ref.buf, next);
+ update_flags = 0;
+ free(refname);
+
+ return next;
}
-static void parse_cmd_verify(const char *next)
+static const char *parse_cmd_verify(struct strbuf *input, const char *next)
{
- struct strbuf ref = STRBUF_INIT;
- struct strbuf value = STRBUF_INIT;
- struct ref_update *update;
+ char *refname;
+ unsigned char new_sha1[20];
+ unsigned char old_sha1[20];
+ int have_old;
+
+ refname = parse_refname(input, &next);
+ if (!refname)
+ die("verify: missing <ref>");
+
+ if (parse_next_sha1(input, &next, old_sha1, "verify", refname,
+ PARSE_SHA1_OLD)) {
+ hashclr(new_sha1);
+ have_old = 0;
+ } else {
+ hashcpy(new_sha1, old_sha1);
+ have_old = 1;
+ }
- update = update_alloc();
+ if (*next != line_termination)
+ die("verify %s: extra input: %s", refname, next);
- if ((next = parse_first_arg(next, &ref)) != NULL && ref.buf[0])
- update_store_ref_name(update, ref.buf);
- else
- die("verify line missing <ref>");
+ ref_transaction_update(transaction, refname, new_sha1, old_sha1,
+ update_flags, have_old);
- if ((next = parse_next_arg(next, &value)) != NULL) {
- update_store_old_sha1(update, value.buf);
- update_store_new_sha1(update, value.buf);
- } else if(!line_termination)
- die("verify %s missing [<oldvalue>] NUL", ref.buf);
+ update_flags = 0;
+ free(refname);
- if (next && *next)
- die("verify %s has extra input: %s", ref.buf, next);
+ return next;
}
-static void parse_cmd_option(const char *next)
+static const char *parse_cmd_option(struct strbuf *input, const char *next)
{
- if (!strcmp(next, "no-deref"))
+ if (!strncmp(next, "no-deref", 8) && next[8] == line_termination)
update_flags |= REF_NODEREF;
else
die("option unknown: %s", next);
+ return next + 8;
}
static void update_refs_stdin(void)
{
- struct strbuf cmd = STRBUF_INIT;
+ struct strbuf input = STRBUF_INIT;
+ const char *next;
+ if (strbuf_read(&input, 0, 1000) < 0)
+ die_errno("could not read from stdin");
+ next = input.buf;
/* Read each line dispatch its command */
- while (strbuf_getline(&cmd, stdin, line_termination) != EOF)
- if (!cmd.buf[0])
+ while (next < input.buf + input.len) {
+ if (*next == line_termination)
die("empty command in input");
- else if (isspace(*cmd.buf))
- die("whitespace before command: %s", cmd.buf);
- else if (starts_with(cmd.buf, "update "))
- parse_cmd_update(cmd.buf + 7);
- else if (starts_with(cmd.buf, "create "))
- parse_cmd_create(cmd.buf + 7);
- else if (starts_with(cmd.buf, "delete "))
- parse_cmd_delete(cmd.buf + 7);
- else if (starts_with(cmd.buf, "verify "))
- parse_cmd_verify(cmd.buf + 7);
- else if (starts_with(cmd.buf, "option "))
- parse_cmd_option(cmd.buf + 7);
+ else if (isspace(*next))
+ die("whitespace before command: %s", next);
+ else if (starts_with(next, "update "))
+ next = parse_cmd_update(&input, next + 7);
+ else if (starts_with(next, "create "))
+ next = parse_cmd_create(&input, next + 7);
+ else if (starts_with(next, "delete "))
+ next = parse_cmd_delete(&input, next + 7);
+ else if (starts_with(next, "verify "))
+ next = parse_cmd_verify(&input, next + 7);
+ else if (starts_with(next, "option "))
+ next = parse_cmd_option(&input, next + 7);
else
- die("unknown command: %s", cmd.buf);
+ die("unknown command: %s", next);
+
+ next++;
+ }
- strbuf_release(&cmd);
+ strbuf_release(&input);
}
int cmd_update_ref(int argc, const char **argv, const char *prefix)
@@ -268,12 +359,17 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
die("Refusing to perform update with empty message.");
if (read_stdin) {
+ int ret;
+ transaction = ref_transaction_begin();
+
if (delete || no_deref || argc > 0)
usage_with_options(git_update_ref_usage, options);
if (end_null)
line_termination = '\0';
update_refs_stdin();
- return update_refs(msg, updates, updates_count, DIE_ON_ERR);
+ ret = ref_transaction_commit(transaction, msg,
+ UPDATE_REFS_DIE_ON_ERR);
+ return ret;
}
if (end_null)
@@ -305,5 +401,5 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
return delete_ref(refname, oldval ? oldsha1 : NULL, flags);
else
return update_ref(msg, refname, sha1, oldval ? oldsha1 : NULL,
- flags, DIE_ON_ERR);
+ flags, UPDATE_REFS_DIE_ON_ERR);
}
diff --git a/cache.h b/cache.h
index 107ac61..8c6cdc2 100644
--- a/cache.h
+++ b/cache.h
@@ -75,6 +75,21 @@ unsigned long git_deflate_bound(git_zstream *, unsigned long);
#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK)
/*
+ * Some mode bits are also used internally for computations.
+ *
+ * They *must* not overlap with any valid modes, and they *must* not be emitted
+ * to outside world - i.e. appear on disk or network. In other words, it's just
+ * temporary fields, which we internally use, but they have to stay in-house.
+ *
+ * ( such approach is valid, as standard S_IF* fits into 16 bits, and in Git
+ * codebase mode is `unsigned int` which is assumed to be at least 32 bits )
+ */
+
+/* used internally in tree-diff */
+#define S_DIFFTREE_IFXMIN_NEQ 0x80000000
+
+
+/*
* Intensive research over the course of many years has shown that
* port 9418 is totally unused by anything else. Or
*
@@ -279,6 +294,7 @@ struct index_state {
initialized : 1;
struct hashmap name_hash;
struct hashmap dir_hash;
+ unsigned char sha1[20];
};
extern struct index_state the_index;
@@ -1046,6 +1062,13 @@ struct ident_split {
extern int split_ident_line(struct ident_split *, const char *, int);
/*
+ * Like show_date, but pull the timestamp and tz parameters from
+ * the ident_split. It will also sanity-check the values and produce
+ * a well-known sentinel date if they appear bogus.
+ */
+const char *show_ident_date(const struct ident_split *id, enum date_mode mode);
+
+/*
* Compare split idents for equality or strict ordering. Note that we
* compare only the ident part of the line, ignoring any timestamp.
*
@@ -1271,8 +1294,8 @@ extern int check_repository_format_version(const char *var, const char *value, v
extern int git_env_bool(const char *, int);
extern int git_config_system(void);
extern int config_error_nonbool(const char *);
-#if defined(__GNUC__) && ! defined(__clang__)
-#define config_error_nonbool(s) (config_error_nonbool(s), -1)
+#if defined(__GNUC__)
+#define config_error_nonbool(s) (config_error_nonbool(s), const_error())
#endif
extern const char *get_log_output_encoding(void);
extern const char *get_commit_output_encoding(void);
@@ -1322,6 +1345,8 @@ extern void fsync_or_die(int fd, const char *);
extern ssize_t read_in_full(int fd, void *buf, size_t count);
extern ssize_t write_in_full(int fd, const void *buf, size_t count);
+extern ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset);
+
static inline ssize_t write_str_in_full(int fd, const char *str)
{
return write_in_full(fd, str, strlen(str));
diff --git a/combine-diff.c b/combine-diff.c
index 24ca7e2..12764fb 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -1301,6 +1301,81 @@ static const char *path_path(void *obj)
return path->path;
}
+
+/* find set of paths that every parent touches */
+static struct combine_diff_path *find_paths_generic(const unsigned char *sha1,
+ const struct sha1_array *parents, struct diff_options *opt)
+{
+ struct combine_diff_path *paths = NULL;
+ int i, num_parent = parents->nr;
+
+ int output_format = opt->output_format;
+ const char *orderfile = opt->orderfile;
+
+ opt->output_format = DIFF_FORMAT_NO_OUTPUT;
+ /* tell diff_tree to emit paths in sorted (=tree) order */
+ opt->orderfile = NULL;
+
+ /* D(A,P1...Pn) = D(A,P1) ^ ... ^ D(A,Pn) (wrt paths) */
+ for (i = 0; i < num_parent; i++) {
+ /*
+ * show stat against the first parent even when doing
+ * combined diff.
+ */
+ int stat_opt = (output_format &
+ (DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT));
+ if (i == 0 && stat_opt)
+ opt->output_format = stat_opt;
+ else
+ opt->output_format = DIFF_FORMAT_NO_OUTPUT;
+ diff_tree_sha1(parents->sha1[i], sha1, "", opt);
+ diffcore_std(opt);
+ paths = intersect_paths(paths, i, num_parent);
+
+ /* if showing diff, show it in requested order */
+ if (opt->output_format != DIFF_FORMAT_NO_OUTPUT &&
+ orderfile) {
+ diffcore_order(orderfile);
+ }
+
+ diff_flush(opt);
+ }
+
+ opt->output_format = output_format;
+ opt->orderfile = orderfile;
+ return paths;
+}
+
+
+/*
+ * find set of paths that everybody touches, assuming diff is run without
+ * rename/copy detection, etc, comparing all trees simultaneously (= faster).
+ */
+static struct combine_diff_path *find_paths_multitree(
+ const unsigned char *sha1, const struct sha1_array *parents,
+ struct diff_options *opt)
+{
+ int i, nparent = parents->nr;
+ const unsigned char **parents_sha1;
+ struct combine_diff_path paths_head;
+ struct strbuf base;
+
+ parents_sha1 = xmalloc(nparent * sizeof(parents_sha1[0]));
+ for (i = 0; i < nparent; i++)
+ parents_sha1[i] = parents->sha1[i];
+
+ /* fake list head, so worker can assume it is non-NULL */
+ paths_head.next = NULL;
+
+ strbuf_init(&base, PATH_MAX);
+ diff_tree_paths(&paths_head, sha1, parents_sha1, nparent, &base, opt);
+
+ strbuf_release(&base);
+ free(parents_sha1);
+ return paths_head.next;
+}
+
+
void diff_tree_combined(const unsigned char *sha1,
const struct sha1_array *parents,
int dense,
@@ -1308,49 +1383,82 @@ void diff_tree_combined(const unsigned char *sha1,
{
struct diff_options *opt = &rev->diffopt;
struct diff_options diffopts;
- struct combine_diff_path *p, *paths = NULL;
+ struct combine_diff_path *p, *paths;
int i, num_paths, needsep, show_log_first, num_parent = parents->nr;
+ int need_generic_pathscan;
+
+ /* nothing to do, if no parents */
+ if (!num_parent)
+ return;
+
+ show_log_first = !!rev->loginfo && !rev->no_commit_id;
+ needsep = 0;
+ if (show_log_first) {
+ show_log(rev);
+
+ if (rev->verbose_header && opt->output_format)
+ printf("%s%c", diff_line_prefix(opt),
+ opt->line_termination);
+ }
diffopts = *opt;
copy_pathspec(&diffopts.pathspec, &opt->pathspec);
- diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
DIFF_OPT_SET(&diffopts, RECURSIVE);
DIFF_OPT_CLR(&diffopts, ALLOW_EXTERNAL);
- /* tell diff_tree to emit paths in sorted (=tree) order */
- diffopts.orderfile = NULL;
- show_log_first = !!rev->loginfo && !rev->no_commit_id;
- needsep = 0;
- /* find set of paths that everybody touches */
- for (i = 0; i < num_parent; i++) {
- /* show stat against the first parent even
+ /* find set of paths that everybody touches
+ *
+ * NOTE
+ *
+ * Diffcore transformations are bound to diff_filespec and logic
+ * comparing two entries - i.e. they do not apply directly to combine
+ * diff.
+ *
+ * If some of such transformations is requested - we launch generic
+ * path scanning, which works significantly slower compared to
+ * simultaneous all-trees-in-one-go scan in find_paths_multitree().
+ *
+ * TODO some of the filters could be ported to work on
+ * combine_diff_paths - i.e. all functionality that skips paths, so in
+ * theory, we could end up having only multitree path scanning.
+ *
+ * NOTE please keep this semantically in sync with diffcore_std()
+ */
+ need_generic_pathscan = opt->skip_stat_unmatch ||
+ DIFF_OPT_TST(opt, FOLLOW_RENAMES) ||
+ opt->break_opt != -1 ||
+ opt->detect_rename ||
+ opt->pickaxe ||
+ opt->filter;
+
+
+ if (need_generic_pathscan) {
+ /*
+ * NOTE generic case also handles --stat, as it computes
+ * diff(sha1,parent_i) for all i to do the job, specifically
+ * for parent0.
+ */
+ paths = find_paths_generic(sha1, parents, &diffopts);
+ }
+ else {
+ int stat_opt;
+ paths = find_paths_multitree(sha1, parents, &diffopts);
+
+ /*
+ * show stat against the first parent even
* when doing combined diff.
*/
- int stat_opt = (opt->output_format &
+ stat_opt = (opt->output_format &
(DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT));
- if (i == 0 && stat_opt)
+ if (stat_opt) {
diffopts.output_format = stat_opt;
- else
- diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
- diff_tree_sha1(parents->sha1[i], sha1, "", &diffopts);
- diffcore_std(&diffopts);
- paths = intersect_paths(paths, i, num_parent);
- if (show_log_first && i == 0) {
- show_log(rev);
-
- if (rev->verbose_header && opt->output_format)
- printf("%s%c", diff_line_prefix(opt),
- opt->line_termination);
+ diff_tree_sha1(parents->sha1[0], sha1, "", &diffopts);
+ diffcore_std(&diffopts);
+ if (opt->orderfile)
+ diffcore_order(opt->orderfile);
+ diff_flush(&diffopts);
}
-
- /* if showing diff, show it in requested order */
- if (diffopts.output_format != DIFF_FORMAT_NO_OUTPUT &&
- opt->orderfile) {
- diffcore_order(opt->orderfile);
- }
-
- diff_flush(&diffopts);
}
/* find out number of surviving paths */
diff --git a/compat/mmap.c b/compat/mmap.c
index c9d46d1..7f662fe 100644
--- a/compat/mmap.c
+++ b/compat/mmap.c
@@ -14,7 +14,7 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
}
while (n < length) {
- ssize_t count = pread(fd, (char *)start + n, length - n, offset + n);
+ ssize_t count = xpread(fd, (char *)start + n, length - n, offset + n);
if (count == 0) {
memset((char *)start+n, 0, length-n);
@@ -22,8 +22,6 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
}
if (count < 0) {
- if (errno == EAGAIN || errno == EINTR)
- continue;
free(start);
errno = EACCES;
return MAP_FAILED;
diff --git a/compat/poll/poll.c b/compat/poll/poll.c
index 31163f2..a9b41d8 100644
--- a/compat/poll/poll.c
+++ b/compat/poll/poll.c
@@ -605,7 +605,7 @@ restart:
if (!rc && timeout == INFTIM)
{
- SwitchToThread();
+ SleepEx (1, TRUE);
goto restart;
}
diff --git a/compat/vcbuild/include/alloca.h b/compat/win32/alloca.h
index c0d7985..c0d7985 100644
--- a/compat/vcbuild/include/alloca.h
+++ b/compat/win32/alloca.h
diff --git a/config.c b/config.c
index a30cb5c..c227aa8 100644
--- a/config.c
+++ b/config.c
@@ -1636,6 +1636,13 @@ int git_config_set_multivar_in_file(const char *config_filename,
MAP_PRIVATE, in_fd, 0);
close(in_fd);
+ if (fchmod(fd, st.st_mode & 07777) < 0) {
+ error("fchmod on %s failed: %s",
+ lock->filename, strerror(errno));
+ ret = CONFIG_NO_WRITE;
+ goto out_free;
+ }
+
if (store.seen == 0)
store.seen = 1;
@@ -1784,6 +1791,7 @@ int git_config_rename_section_in_file(const char *config_filename,
int out_fd;
char buf[1024];
FILE *config_file;
+ struct stat st;
if (new_name && !section_name_is_ok(new_name)) {
ret = error("invalid section name: %s", new_name);
@@ -1805,6 +1813,14 @@ int git_config_rename_section_in_file(const char *config_filename,
goto unlock_and_out;
}
+ fstat(fileno(config_file), &st);
+
+ if (fchmod(out_fd, st.st_mode & 07777) < 0) {
+ ret = error("fchmod on %s failed: %s",
+ lock->filename, strerror(errno));
+ goto out;
+ }
+
while (fgets(buf, sizeof(buf), config_file)) {
int i;
int length;
diff --git a/config.mak.uname b/config.mak.uname
index 23a8803..1ae675b 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -28,6 +28,7 @@ ifeq ($(uname_S),OSF1)
NO_NSEC = YesPlease
endif
ifeq ($(uname_S),Linux)
+ HAVE_ALLOCA_H = YesPlease
NO_STRLCPY = YesPlease
NO_MKSTEMPS = YesPlease
HAVE_PATHS_H = YesPlease
@@ -35,6 +36,7 @@ ifeq ($(uname_S),Linux)
HAVE_DEV_TTY = YesPlease
endif
ifeq ($(uname_S),GNU/kFreeBSD)
+ HAVE_ALLOCA_H = YesPlease
NO_STRLCPY = YesPlease
NO_MKSTEMPS = YesPlease
HAVE_PATHS_H = YesPlease
@@ -103,6 +105,7 @@ ifeq ($(uname_S),SunOS)
NEEDS_NSL = YesPlease
SHELL_PATH = /bin/bash
SANE_TOOL_PATH = /usr/xpg6/bin:/usr/xpg4/bin
+ HAVE_ALLOCA_H = YesPlease
NO_STRCASESTR = YesPlease
NO_MEMMEM = YesPlease
NO_MKDTEMP = YesPlease
@@ -145,7 +148,7 @@ ifeq ($(uname_S),SunOS)
endif
INSTALL = /usr/ucb/install
TAR = gtar
- BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__ -DHAVE_ALLOCA_H
+ BASIC_CFLAGS += -D__EXTENSIONS__ -D__sun__
endif
ifeq ($(uname_O),Cygwin)
ifeq ($(shell expr "$(uname_R)" : '1\.[1-6]\.'),4)
@@ -157,7 +160,6 @@ ifeq ($(uname_O),Cygwin)
NO_SYMLINK_HEAD = YesPlease
NO_IPV6 = YesPlease
OLD_ICONV = UnfortunatelyYes
- NO_THREAD_SAFE_PREAD = YesPlease
# There are conflicting reports about this.
# On some boxes NO_MMAP is needed, and not so elsewhere.
# Try commenting this out if you suspect MMAP is more efficient
@@ -165,6 +167,7 @@ ifeq ($(uname_O),Cygwin)
else
NO_REGEX = UnfortunatelyYes
endif
+ HAVE_ALLOCA_H = YesPlease
NEEDS_LIBICONV = YesPlease
NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
@@ -239,6 +242,7 @@ ifeq ($(uname_S),AIX)
endif
ifeq ($(uname_S),GNU)
# GNU/Hurd
+ HAVE_ALLOCA_H = YesPlease
NO_STRLCPY = YesPlease
NO_MKSTEMPS = YesPlease
HAVE_PATHS_H = YesPlease
@@ -313,6 +317,7 @@ endif
ifeq ($(uname_S),Windows)
GIT_VERSION := $(GIT_VERSION).MSVC
pathsep = ;
+ HAVE_ALLOCA_H = YesPlease
NO_PREAD = YesPlease
NEEDS_CRYPTO_WITH_SSL = YesPlease
NO_LIBGEN_H = YesPlease
@@ -357,17 +362,17 @@ ifeq ($(uname_S),Windows)
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
compat/win32/pthread.o compat/win32/syslog.o \
compat/win32/dirent.o
- COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
- BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
+ COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
+ BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj
PTHREAD_LIBS =
lib =
ifndef DEBUG
- BASIC_CFLAGS += -GL -Os -MT
+ BASIC_CFLAGS += -GL -Os -MD
BASIC_LDFLAGS += -LTCG
AR += -LTCG
else
- BASIC_CFLAGS += -Zi -MTd
+ BASIC_CFLAGS += -Zi -MDd
endif
X = .exe
endif
@@ -465,6 +470,7 @@ ifeq ($(uname_S),NONSTOP_KERNEL)
endif
ifneq (,$(findstring MINGW,$(uname_S)))
pathsep = ;
+ HAVE_ALLOCA_H = YesPlease
NO_PREAD = YesPlease
NEEDS_CRYPTO_WITH_SSL = YesPlease
NO_LIBGEN_H = YesPlease
diff --git a/configure.ac b/configure.ac
index b711254..4b1ae7c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -272,6 +272,14 @@ AS_HELP_STRING([], [ARG can be also prefix for libpcre library and hea
GIT_CONF_SUBST([LIBPCREDIR])
fi)
#
+# Define HAVE_ALLOCA_H if you have working alloca(3) defined in that header.
+AC_FUNC_ALLOCA
+case $ac_cv_working_alloca_h in
+ yes) HAVE_ALLOCA_H=YesPlease;;
+ *) HAVE_ALLOCA_H='';;
+esac
+GIT_CONF_SUBST([HAVE_ALLOCA_H])
+#
# Define NO_CURL if you do not have curl installed. git-http-pull and
# git-http-push are not built, and you cannot use http:// and https://
# transports.
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 96b8087..9d684b1 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -209,9 +209,7 @@ __git_ps1_show_upstream ()
if [[ -n "$count" && -n "$name" ]]; then
__git_ps1_upstream_name=$(git rev-parse \
--abbrev-ref "$upstream" 2>/dev/null)
- if [ $pcmode = yes ]; then
- # see the comments around the
- # __git_ps1_branch_name variable below
+ if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
p="$p \${__git_ps1_upstream_name}"
else
p="$p ${__git_ps1_upstream_name}"
@@ -270,7 +268,7 @@ __git_ps1_colorize_gitstring ()
r="$c_clear$r"
}
-eread ()
+__git_eread ()
{
f="$1"
shift
@@ -308,6 +306,43 @@ __git_ps1 ()
;;
esac
+ # ps1_expanded: This variable is set to 'yes' if the shell
+ # subjects the value of PS1 to parameter expansion:
+ #
+ # * bash does unless the promptvars option is disabled
+ # * zsh does not unless the PROMPT_SUBST option is set
+ # * POSIX shells always do
+ #
+ # If the shell would expand the contents of PS1 when drawing
+ # the prompt, a raw ref name must not be included in PS1.
+ # This protects the user from arbitrary code execution via
+ # specially crafted ref names. For example, a ref named
+ # 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
+ # shell to execute 'sudo rm -rf /' when the prompt is drawn.
+ #
+ # Instead, the ref name should be placed in a separate global
+ # variable (in the __git_ps1_* namespace to avoid colliding
+ # with the user's environment) and that variable should be
+ # referenced from PS1. For example:
+ #
+ # __git_ps1_foo=$(do_something_to_get_ref_name)
+ # PS1="...stuff...\${__git_ps1_foo}...stuff..."
+ #
+ # If the shell does not expand the contents of PS1, the raw
+ # ref name must be included in PS1.
+ #
+ # The value of this variable is only relevant when in pcmode.
+ #
+ # Assume that the shell follows the POSIX specification and
+ # expands PS1 unless determined otherwise. (This is more
+ # likely to be correct if the user has a non-bash, non-zsh
+ # shell and safer than the alternative if the assumption is
+ # incorrect.)
+ #
+ local ps1_expanded=yes
+ [ -z "$ZSH_VERSION" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
+ [ -z "$BASH_VERSION" ] || shopt -q promptvars || ps1_expanded=no
+
local repo_info rev_parse_exit_code
repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
--is-bare-repository --is-inside-work-tree \
@@ -339,9 +374,9 @@ __git_ps1 ()
local step=""
local total=""
if [ -d "$g/rebase-merge" ]; then
- eread "$g/rebase-merge/head-name" b
- eread "$g/rebase-merge/msgnum" step
- eread "$g/rebase-merge/end" total
+ __git_eread "$g/rebase-merge/head-name" b
+ __git_eread "$g/rebase-merge/msgnum" step
+ __git_eread "$g/rebase-merge/end" total
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
else
@@ -349,10 +384,10 @@ __git_ps1 ()
fi
else
if [ -d "$g/rebase-apply" ]; then
- eread "$g/rebase-apply/next" step
- eread "$g/rebase-apply/last" total
+ __git_eread "$g/rebase-apply/next" step
+ __git_eread "$g/rebase-apply/last" total
if [ -f "$g/rebase-apply/rebasing" ]; then
- eread "$g/rebase-apply/head-name" b
+ __git_eread "$g/rebase-apply/head-name" b
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
@@ -376,7 +411,7 @@ __git_ps1 ()
b="$(git symbolic-ref HEAD 2>/dev/null)"
else
local head=""
- if ! eread "$g/HEAD" head; then
+ if ! __git_eread "$g/HEAD" head; then
if [ $pcmode = yes ]; then
PS1="$ps1pc_start$ps1pc_end"
fi
@@ -457,21 +492,8 @@ __git_ps1 ()
fi
b=${b##refs/heads/}
- if [ $pcmode = yes ]; then
- # In pcmode (and only pcmode) the contents of
- # $gitstring are subject to expansion by the shell.
- # Avoid putting the raw ref name in the prompt to
- # protect the user from arbitrary code execution via
- # specially crafted ref names (e.g., a ref named
- # '$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' would execute
- # 'sudo rm -rf /' when the prompt is drawn). Instead,
- # put the ref name in a new global variable (in the
- # __git_ps1_* namespace to avoid colliding with the
- # user's environment) and reference that variable from
- # PS1.
+ if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
__git_ps1_branch_name=$b
- # note that the $ is escaped -- the variable will be
- # expanded later (when it's time to draw the prompt)
b="\${__git_ps1_branch_name}"
fi
diff --git a/contrib/diffall/README b/contrib/diffall/README
deleted file mode 100644
index 507f17d..0000000
--- a/contrib/diffall/README
+++ /dev/null
@@ -1,31 +0,0 @@
-The git-diffall script provides a directory based diff mechanism
-for git.
-
-To determine what diff viewer is used, the script requires either
-the 'diff.tool' or 'merge.tool' configuration option to be set.
-
-This script is compatible with most common forms used to specify a
-range of revisions to diff:
-
- 1. git diffall: shows diff between working tree and staged changes
- 2. git diffall --cached [<commit>]: shows diff between staged
- changes and HEAD (or other named commit)
- 3. git diffall <commit>: shows diff between working tree and named
- commit
- 4. git diffall <commit> <commit>: show diff between two named commits
- 5. git diffall <commit>..<commit>: same as above
- 6. git diffall <commit>...<commit>: show the changes on the branch
- containing and up to the second, starting at a common ancestor
- of both <commit>
-
-Note: all forms take an optional path limiter [-- <path>*]
-
-The '--extcmd=<command>' option allows the user to specify a custom
-command for viewing diffs. When given, configured defaults are
-ignored and the script runs $command $LOCAL $REMOTE. Additionally,
-$BASE is set in the environment.
-
-This script is based on an example provided by Thomas Rast on the
-Git list [1]:
-
-[1] http://thread.gmane.org/gmane.comp.version-control.git/124807
diff --git a/contrib/diffall/git-diffall b/contrib/diffall/git-diffall
deleted file mode 100755
index 84f2b65..0000000
--- a/contrib/diffall/git-diffall
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/bin/sh
-# Copyright 2010 - 2012, Tim Henigan <tim.henigan@gmail.com>
-#
-# Perform a directory diff between commits in the repository using
-# the external diff or merge tool specified in the user's config.
-
-USAGE='[--cached] [--copy-back] [-x|--extcmd=<command>] <commit>{0,2} [-- <path>*]
-
- --cached Compare to the index rather than the working tree.
-
- --copy-back Copy files back to the working tree when the diff
- tool exits (in case they were modified by the
- user). This option is only valid if the diff
- compared with the working tree.
-
- -x=<command>
- --extcmd=<command> Specify a custom command for viewing diffs.
- git-diffall ignores the configured defaults and
- runs $command $LOCAL $REMOTE when this option is
- specified. Additionally, $BASE is set in the
- environment.
-'
-
-SUBDIRECTORY_OK=1
-. "$(git --exec-path)/git-sh-setup"
-
-TOOL_MODE=diff
-. "$(git --exec-path)/git-mergetool--lib"
-
-merge_tool="$(get_merge_tool)"
-if test -z "$merge_tool"
-then
- echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set."
- usage
-fi
-
-start_dir=$(pwd)
-
-# All the file paths returned by the diff command are relative to the root
-# of the working copy. So if the script is called from a subdirectory, it
-# must switch to the root of working copy before trying to use those paths.
-cdup=$(git rev-parse --show-cdup) &&
-cd "$cdup" || {
- echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
- exit 1
-}
-
-# set up temp dir
-tmp=$(perl -e 'use File::Temp qw(tempdir);
- $t=tempdir("/tmp/git-diffall.XXXXX") or exit(1);
- print $t') || exit 1
-trap 'rm -rf "$tmp"' EXIT
-
-left=
-right=
-paths=
-dashdash_seen=
-compare_staged=
-merge_base=
-left_dir=
-right_dir=
-diff_tool=
-copy_back=
-
-while test $# != 0
-do
- case "$1" in
- -h|--h|--he|--hel|--help)
- usage
- ;;
- --cached)
- compare_staged=1
- ;;
- --copy-back)
- copy_back=1
- ;;
- -x|--e|--ex|--ext|--extc|--extcm|--extcmd)
- if test $# = 1
- then
- echo You must specify the tool for use with --extcmd
- usage
- else
- diff_tool=$2
- shift
- fi
- ;;
- --)
- dashdash_seen=1
- ;;
- -*)
- echo Invalid option: "$1"
- usage
- ;;
- *)
- # could be commit, commit range or path limiter
- case "$1" in
- *...*)
- left=${1%...*}
- right=${1#*...}
- merge_base=1
- ;;
- *..*)
- left=${1%..*}
- right=${1#*..}
- ;;
- *)
- if test -n "$dashdash_seen"
- then
- paths="$paths$1 "
- elif test -z "$left"
- then
- left=$1
- elif test -z "$right"
- then
- right=$1
- else
- paths="$paths$1 "
- fi
- ;;
- esac
- ;;
- esac
- shift
-done
-
-# Determine the set of files which changed
-if test -n "$left" && test -n "$right"
-then
- left_dir="cmt-$(git rev-parse --short $left)"
- right_dir="cmt-$(git rev-parse --short $right)"
-
- if test -n "$compare_staged"
- then
- usage
- elif test -n "$merge_base"
- then
- git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist"
- else
- git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist"
- fi
-elif test -n "$left"
-then
- left_dir="cmt-$(git rev-parse --short $left)"
-
- if test -n "$compare_staged"
- then
- right_dir="staged"
- git diff --name-only --cached "$left" -- $paths >"$tmp/filelist"
- else
- right_dir="working_tree"
- git diff --name-only "$left" -- $paths >"$tmp/filelist"
- fi
-else
- left_dir="HEAD"
-
- if test -n "$compare_staged"
- then
- right_dir="staged"
- git diff --name-only --cached -- $paths >"$tmp/filelist"
- else
- right_dir="working_tree"
- git diff --name-only -- $paths >"$tmp/filelist"
- fi
-fi
-
-# Exit immediately if there are no diffs
-if test ! -s "$tmp/filelist"
-then
- exit 0
-fi
-
-if test -n "$copy_back" && test "$right_dir" != "working_tree"
-then
- echo "--copy-back is only valid when diff includes the working tree."
- exit 1
-fi
-
-# Create the named tmp directories that will hold the files to be compared
-mkdir -p "$tmp/$left_dir" "$tmp/$right_dir"
-
-# Populate the tmp/right_dir directory with the files to be compared
-while read name
-do
- if test -n "$right"
- then
- ls_list=$(git ls-tree $right "$name")
- if test -n "$ls_list"
- then
- mkdir -p "$tmp/$right_dir/$(dirname "$name")"
- git show "$right":"$name" >"$tmp/$right_dir/$name" || true
- fi
- elif test -n "$compare_staged"
- then
- ls_list=$(git ls-files -- "$name")
- if test -n "$ls_list"
- then
- mkdir -p "$tmp/$right_dir/$(dirname "$name")"
- git show :"$name" >"$tmp/$right_dir/$name"
- fi
- else
- if test -e "$name"
- then
- mkdir -p "$tmp/$right_dir/$(dirname "$name")"
- cp "$name" "$tmp/$right_dir/$name"
- fi
- fi
-done < "$tmp/filelist"
-
-# Populate the tmp/left_dir directory with the files to be compared
-while read name
-do
- if test -n "$left"
- then
- ls_list=$(git ls-tree $left "$name")
- if test -n "$ls_list"
- then
- mkdir -p "$tmp/$left_dir/$(dirname "$name")"
- git show "$left":"$name" >"$tmp/$left_dir/$name" || true
- fi
- else
- if test -n "$compare_staged"
- then
- ls_list=$(git ls-tree HEAD "$name")
- if test -n "$ls_list"
- then
- mkdir -p "$tmp/$left_dir/$(dirname "$name")"
- git show HEAD:"$name" >"$tmp/$left_dir/$name"
- fi
- else
- mkdir -p "$tmp/$left_dir/$(dirname "$name")"
- git show :"$name" >"$tmp/$left_dir/$name"
- fi
- fi
-done < "$tmp/filelist"
-
-LOCAL="$tmp/$left_dir"
-REMOTE="$tmp/$right_dir"
-
-if test -n "$diff_tool"
-then
- export BASE
- eval $diff_tool '"$LOCAL"' '"$REMOTE"'
-else
- run_merge_tool "$merge_tool" false
-fi
-
-# Copy files back to the working dir, if requested
-if test -n "$copy_back" && test "$right_dir" = "working_tree"
-then
- cd "$start_dir"
- git_top_dir=$(git rev-parse --show-toplevel)
- find "$tmp/$right_dir" -type f |
- while read file
- do
- cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}"
- done
-fi
diff --git a/contrib/examples/builtin-fetch--tool.c b/contrib/examples/builtin-fetch--tool.c
index 8bc8c75..ee19166 100644
--- a/contrib/examples/builtin-fetch--tool.c
+++ b/contrib/examples/builtin-fetch--tool.c
@@ -31,7 +31,8 @@ static int update_ref_env(const char *action,
rla = "(reflog update)";
if (snprintf(msg, sizeof(msg), "%s: %s", rla, action) >= sizeof(msg))
warning("reflog message too long: %.*s...", 50, msg);
- return update_ref(msg, refname, sha1, oldval, 0, QUIET_ON_ERR);
+ return update_ref(msg, refname, sha1, oldval, 0,
+ UPDATE_REFS_QUIET_ON_ERR);
}
static int update_local_ref(const char *name,
diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/contrib/mw-to-git/git-remote-mediawiki.perl
index 3f8d993..8dd74a9 100755
--- a/contrib/mw-to-git/git-remote-mediawiki.perl
+++ b/contrib/mw-to-git/git-remote-mediawiki.perl
@@ -461,7 +461,12 @@ sub download_mw_mediafile {
my $response = $mediawiki->{ua}->get($download_url);
if ($response->code == HTTP_CODE_OK) {
- return $response->decoded_content;
+ # It is tempting to return
+ # $response->decoded_content({charset => "none"}), but
+ # when doing so, utf8::downgrade($content) fails with
+ # "Wide character in subroutine entry".
+ $response->decode();
+ return $response->content();
} else {
print {*STDERR} "Error downloading mediafile from :\n";
print {*STDERR} "URL: ${download_url}\n";
diff --git a/contrib/mw-to-git/t/install-wiki.sh b/contrib/mw-to-git/t/install-wiki.sh
index 70a53f6..c215213 100755
--- a/contrib/mw-to-git/t/install-wiki.sh
+++ b/contrib/mw-to-git/t/install-wiki.sh
@@ -20,6 +20,8 @@ usage () {
echo " install | -i : Install a wiki on your computer."
echo " delete | -d : Delete the wiki and all its pages and "
echo " content."
+ echo " start | -s : Start the previously configured lighttpd daemon"
+ echo " stop : Stop lighttpd daemon."
}
@@ -33,6 +35,14 @@ case "$1" in
wiki_delete
exit 0
;;
+ "start" | "-s")
+ start_lighttpd
+ exit
+ ;;
+ "stop")
+ stop_lighttpd
+ exit
+ ;;
"--help" | "-h")
usage
exit 0
diff --git a/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh b/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
index 5a03739..3ff3a09 100755
--- a/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
+++ b/contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
@@ -58,6 +58,25 @@ test_expect_success 'git clone works on previously created wiki with media files
test_cmp mw_dir_clone/Foo.txt mw_dir/Foo.txt
'
+test_expect_success 'git push can upload media (File:) files containing valid UTF-8' '
+ wiki_reset &&
+ git clone mediawiki::'"$WIKI_URL"' mw_dir &&
+ (
+ cd mw_dir &&
+ "$PERL_PATH" -e "print STDOUT \"UTF-8 content: éèàéê€.\";" >Bar.txt &&
+ git add Bar.txt &&
+ git commit -m "add a text file with UTF-8 content" &&
+ git push
+ )
+'
+
+test_expect_success 'git clone works on previously created wiki with media files containing valid UTF-8' '
+ test_when_finished "rm -rf mw_dir mw_dir_clone" &&
+ git clone -c remote.origin.mediaimport=true \
+ mediawiki::'"$WIKI_URL"' mw_dir_clone &&
+ test_cmp mw_dir_clone/Bar.txt mw_dir/Bar.txt
+'
+
test_expect_success 'git push & pull work with locally renamed media files' '
wiki_reset &&
git clone mediawiki::'"$WIKI_URL"' mw_dir &&
diff --git a/contrib/mw-to-git/t/t9365-continuing-queries.sh b/contrib/mw-to-git/t/t9365-continuing-queries.sh
index 27e267f..0164547 100755
--- a/contrib/mw-to-git/t/t9365-continuing-queries.sh
+++ b/contrib/mw-to-git/t/t9365-continuing-queries.sh
@@ -9,7 +9,7 @@ test_check_precond
test_expect_success 'creating page w/ >500 revisions' '
wiki_reset &&
- for i in `test_seq 501`
+ for i in $(test_seq 501)
do
echo "creating revision $i" &&
wiki_editpage foo "revision $i<br/>" true
diff --git a/contrib/mw-to-git/t/test-gitmw-lib.sh b/contrib/mw-to-git/t/test-gitmw-lib.sh
index 3372b2a..6546294 100755
--- a/contrib/mw-to-git/t/test-gitmw-lib.sh
+++ b/contrib/mw-to-git/t/test-gitmw-lib.sh
@@ -90,7 +90,7 @@ test_diff_directories () {
#
# Check that <dir> contains exactly <N> files
test_contains_N_files () {
- if test `ls -- "$1" | wc -l` -ne "$2"; then
+ if test $(ls -- "$1" | wc -l) -ne "$2"; then
echo "directory $1 should contain $2 files"
echo "it contains these files:"
ls "$1"
@@ -289,7 +289,6 @@ start_lighttpd () {
# Kill daemon lighttpd and removes files and folders associated.
stop_lighttpd () {
test -f "$WEB_TMP/pid" && kill $(cat "$WEB_TMP/pid")
- rm -rf "$WEB"
}
# Create the SQLite database of the MediaWiki. If the database file already
@@ -341,10 +340,10 @@ wiki_install () {
"http://download.wikimedia.org/mediawiki/$MW_VERSION_MAJOR/"\
"$MW_FILENAME. "\
"Please fix your connection and launch the script again."
- echo "$MW_FILENAME downloaded in `pwd`. "\
+ echo "$MW_FILENAME downloaded in $(pwd). "\
"You can delete it later if you want."
else
- echo "Reusing existing $MW_FILENAME downloaded in `pwd`."
+ echo "Reusing existing $MW_FILENAME downloaded in $(pwd)."
fi
archive_abs_path=$(pwd)/$MW_FILENAME
cd "$WIKI_DIR_INST/$WIKI_DIR_NAME/" ||
@@ -415,6 +414,7 @@ wiki_reset () {
wiki_delete () {
if test $LIGHTTPD = "true"; then
stop_lighttpd
+ rm -fr "$WEB"
else
# Delete the wiki's directory.
rm -rf "$WIKI_DIR_INST/$WIKI_DIR_NAME" ||
diff --git a/contrib/remote-helpers/Makefile b/contrib/remote-helpers/Makefile
deleted file mode 100644
index 239161d..0000000
--- a/contrib/remote-helpers/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-TESTS := $(wildcard test*.sh)
-
-export T := $(addprefix $(CURDIR)/,$(TESTS))
-export MAKE := $(MAKE) -e
-export PATH := $(CURDIR):$(PATH)
-export TEST_LINT := test-lint-executable test-lint-shell-syntax
-
-test:
- $(MAKE) -C ../../t $@
-
-$(TESTS):
- $(MAKE) -C ../../t $(CURDIR)/$@
-
-.PHONY: $(TESTS)
diff --git a/contrib/remote-helpers/README b/contrib/remote-helpers/README
new file mode 100644
index 0000000..ac72332
--- /dev/null
+++ b/contrib/remote-helpers/README
@@ -0,0 +1,15 @@
+The remote-helper bridges to access data stored in Mercurial and
+Bazaar are maintained outside the git.git tree in the repositories
+of their primary author:
+
+ https://github.com/felipec/git-remote-hg (for Mercurial)
+ https://github.com/felipec/git-remote-bzr (for Bazaar)
+
+You can pick a directory on your $PATH and download them from these
+repositories, e.g.:
+
+ $ wget -O $HOME/bin/git-remote-hg \
+ https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+ $ wget -O $HOME/bin/git-remote-bzr \
+ https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+ $ chmod +x $HOME/bin/git-remote-hg $HOME/bin/git-remote-bzr
diff --git a/contrib/remote-helpers/git-remote-bzr b/contrib/remote-helpers/git-remote-bzr
index 9abb58e..712a137 100755
--- a/contrib/remote-helpers/git-remote-bzr
+++ b/contrib/remote-helpers/git-remote-bzr
@@ -1,983 +1,13 @@
#!/usr/bin/env python
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-
-#
-# Just copy to your ~/bin, or anywhere in your $PATH.
-# Then you can clone with:
-# % git clone bzr::/path/to/bzr/repo/or/url
-#
-# For example:
-# % git clone bzr::$HOME/myrepo
-# or
-# % git clone bzr::lp:myrepo
-#
-# If you want to specify which branches you want to track (per repo):
-# % git config remote.origin.bzr-branches 'trunk, devel, test'
-#
-# Where 'origin' is the name of the repository you want to specify the
-# branches.
-#
-
-import sys
-
-import bzrlib
-if hasattr(bzrlib, "initialize"):
- bzrlib.initialize()
-
-import bzrlib.plugin
-bzrlib.plugin.load_plugins()
-
-import bzrlib.generate_ids
-import bzrlib.transport
-import bzrlib.errors
-import bzrlib.ui
-import bzrlib.urlutils
-import bzrlib.branch
import sys
-import os
-import json
-import re
-import StringIO
-import atexit, shutil, hashlib, urlparse, subprocess
-
-NAME_RE = re.compile('^([^<>]+)')
-AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
-EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
-RAW_AUTHOR_RE = re.compile('^(\w+) (.+)? <(.*)> (\d+) ([+-]\d+)')
-
-def die(msg, *args):
- sys.stderr.write('ERROR: %s\n' % (msg % args))
- sys.exit(1)
-
-def warn(msg, *args):
- sys.stderr.write('WARNING: %s\n' % (msg % args))
-
-def gittz(tz):
- return '%+03d%02d' % (tz / 3600, tz % 3600 / 60)
-
-def get_config(config):
- cmd = ['git', 'config', '--get', config]
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- output, _ = process.communicate()
- return output
-
-class Marks:
-
- def __init__(self, path):
- self.path = path
- self.tips = {}
- self.marks = {}
- self.rev_marks = {}
- self.last_mark = 0
- self.load()
-
- def load(self):
- if not os.path.exists(self.path):
- return
-
- tmp = json.load(open(self.path))
- self.tips = tmp['tips']
- self.marks = tmp['marks']
- self.last_mark = tmp['last-mark']
-
- for rev, mark in self.marks.iteritems():
- self.rev_marks[mark] = rev
-
- def dict(self):
- return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark }
-
- def store(self):
- json.dump(self.dict(), open(self.path, 'w'))
-
- def __str__(self):
- return str(self.dict())
-
- def from_rev(self, rev):
- return self.marks[rev]
-
- def to_rev(self, mark):
- return str(self.rev_marks[mark])
-
- def next_mark(self):
- self.last_mark += 1
- return self.last_mark
-
- def get_mark(self, rev):
- self.last_mark += 1
- self.marks[rev] = self.last_mark
- return self.last_mark
-
- def is_marked(self, rev):
- return rev in self.marks
-
- def new_mark(self, rev, mark):
- self.marks[rev] = mark
- self.rev_marks[mark] = rev
- self.last_mark = mark
-
- def get_tip(self, branch):
- try:
- return str(self.tips[branch])
- except KeyError:
- return None
-
- def set_tip(self, branch, tip):
- self.tips[branch] = tip
-
-class Parser:
-
- def __init__(self, repo):
- self.repo = repo
- self.line = self.get_line()
-
- def get_line(self):
- return sys.stdin.readline().strip()
-
- def __getitem__(self, i):
- return self.line.split()[i]
-
- def check(self, word):
- return self.line.startswith(word)
-
- def each_block(self, separator):
- while self.line != separator:
- yield self.line
- self.line = self.get_line()
-
- def __iter__(self):
- return self.each_block('')
-
- def next(self):
- self.line = self.get_line()
- if self.line == 'done':
- self.line = None
-
- def get_mark(self):
- i = self.line.index(':') + 1
- return int(self.line[i:])
-
- def get_data(self):
- if not self.check('data'):
- return None
- i = self.line.index(' ') + 1
- size = int(self.line[i:])
- return sys.stdin.read(size)
-
- def get_author(self):
- m = RAW_AUTHOR_RE.match(self.line)
- if not m:
- return None
- _, name, email, date, tz = m.groups()
- name = name.decode('utf-8')
- committer = '%s <%s>' % (name, email)
- tz = int(tz)
- tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
- return (committer, int(date), tz)
-
-def rev_to_mark(rev):
- return marks.from_rev(rev)
-
-def mark_to_rev(mark):
- return marks.to_rev(mark)
-
-def fixup_user(user):
- name = mail = None
- user = user.replace('"', '')
- m = AUTHOR_RE.match(user)
- if m:
- name = m.group(1)
- mail = m.group(2).strip()
- else:
- m = EMAIL_RE.match(user)
- if m:
- mail = m.group(1)
- else:
- m = NAME_RE.match(user)
- if m:
- name = m.group(1).strip()
-
- if not name:
- name = 'unknown'
- if not mail:
- mail = 'Unknown'
-
- return '%s <%s>' % (name, mail)
-
-def get_filechanges(cur, prev):
- modified = {}
- removed = {}
-
- changes = cur.changes_from(prev)
-
- def u(s):
- return s.encode('utf-8')
-
- for path, fid, kind in changes.added:
- modified[u(path)] = fid
- for path, fid, kind in changes.removed:
- removed[u(path)] = None
- for path, fid, kind, mod, _ in changes.modified:
- modified[u(path)] = fid
- for oldpath, newpath, fid, kind, mod, _ in changes.renamed:
- removed[u(oldpath)] = None
- if kind == 'directory':
- lst = cur.list_files(from_dir=newpath, recursive=True)
- for path, file_class, kind, fid, entry in lst:
- if kind != 'directory':
- modified[u(newpath + '/' + path)] = fid
- else:
- modified[u(newpath)] = fid
-
- return modified, removed
-
-def export_files(tree, files):
- final = []
- for path, fid in files.iteritems():
- kind = tree.kind(fid)
-
- h = tree.get_file_sha1(fid)
-
- if kind == 'symlink':
- d = tree.get_symlink_target(fid)
- mode = '120000'
- elif kind == 'file':
-
- if tree.is_executable(fid):
- mode = '100755'
- else:
- mode = '100644'
-
- # is the blob already exported?
- if h in filenodes:
- mark = filenodes[h]
- final.append((mode, mark, path))
- continue
-
- d = tree.get_file_text(fid)
- elif kind == 'directory':
- continue
- else:
- die("Unhandled kind '%s' for path '%s'" % (kind, path))
-
- mark = marks.next_mark()
- filenodes[h] = mark
-
- print "blob"
- print "mark :%u" % mark
- print "data %d" % len(d)
- print d
-
- final.append((mode, mark, path))
-
- return final
-
-def export_branch(repo, name):
- ref = '%s/heads/%s' % (prefix, name)
- tip = marks.get_tip(name)
-
- branch = get_remote_branch(name)
- repo = branch.repository
-
- branch.lock_read()
- revs = branch.iter_merge_sorted_revisions(None, tip, 'exclude', 'forward')
- try:
- tip_revno = branch.revision_id_to_revno(tip)
- last_revno, _ = branch.last_revision_info()
- total = last_revno - tip_revno
- except bzrlib.errors.NoSuchRevision:
- tip_revno = 0
- total = 0
-
- for revid, _, seq, _ in revs:
-
- if marks.is_marked(revid):
- continue
-
- rev = repo.get_revision(revid)
- revno = seq[0]
-
- parents = rev.parent_ids
- time = rev.timestamp
- tz = rev.timezone
- committer = rev.committer.encode('utf-8')
- committer = "%s %u %s" % (fixup_user(committer), time, gittz(tz))
- authors = rev.get_apparent_authors()
- if authors:
- author = authors[0].encode('utf-8')
- author = "%s %u %s" % (fixup_user(author), time, gittz(tz))
- else:
- author = committer
- msg = rev.message.encode('utf-8')
-
- msg += '\n'
-
- if len(parents) == 0:
- parent = bzrlib.revision.NULL_REVISION
- else:
- parent = parents[0]
-
- cur_tree = repo.revision_tree(revid)
- prev = repo.revision_tree(parent)
- modified, removed = get_filechanges(cur_tree, prev)
-
- modified_final = export_files(cur_tree, modified)
-
- if len(parents) == 0:
- print 'reset %s' % ref
-
- print "commit %s" % ref
- print "mark :%d" % (marks.get_mark(revid))
- print "author %s" % (author)
- print "committer %s" % (committer)
- print "data %d" % (len(msg))
- print msg
-
- for i, p in enumerate(parents):
- try:
- m = rev_to_mark(p)
- except KeyError:
- # ghost?
- continue
- if i == 0:
- print "from :%s" % m
- else:
- print "merge :%s" % m
-
- for f in removed:
- print "D %s" % (f,)
- for f in modified_final:
- print "M %s :%u %s" % f
- print
-
- if len(seq) > 1:
- # let's skip branch revisions from the progress report
- continue
-
- progress = (revno - tip_revno)
- if (progress % 100 == 0):
- if total:
- print "progress revision %d '%s' (%d/%d)" % (revno, name, progress, total)
- else:
- print "progress revision %d '%s' (%d)" % (revno, name, progress)
-
- branch.unlock()
-
- revid = branch.last_revision()
-
- # make sure the ref is updated
- print "reset %s" % ref
- print "from :%u" % rev_to_mark(revid)
- print
-
- marks.set_tip(name, revid)
-
-def export_tag(repo, name):
- ref = '%s/tags/%s' % (prefix, name)
- print "reset %s" % ref
- print "from :%u" % rev_to_mark(tags[name])
- print
-
-def do_import(parser):
- repo = parser.repo
- path = os.path.join(dirname, 'marks-git')
-
- print "feature done"
- if os.path.exists(path):
- print "feature import-marks=%s" % path
- print "feature export-marks=%s" % path
- print "feature force"
- sys.stdout.flush()
-
- while parser.check('import'):
- ref = parser[1]
- if ref.startswith('refs/heads/'):
- name = ref[len('refs/heads/'):]
- export_branch(repo, name)
- if ref.startswith('refs/tags/'):
- name = ref[len('refs/tags/'):]
- export_tag(repo, name)
- parser.next()
-
- print 'done'
-
- sys.stdout.flush()
-
-def parse_blob(parser):
- parser.next()
- mark = parser.get_mark()
- parser.next()
- data = parser.get_data()
- blob_marks[mark] = data
- parser.next()
-
-class CustomTree():
-
- def __init__(self, branch, revid, parents, files):
- self.updates = {}
- self.branch = branch
-
- def copy_tree(revid):
- files = files_cache[revid] = {}
- branch.lock_read()
- tree = branch.repository.revision_tree(revid)
- try:
- for path, entry in tree.iter_entries_by_dir():
- files[path] = [entry.file_id, None]
- finally:
- branch.unlock()
- return files
-
- if len(parents) == 0:
- self.base_id = bzrlib.revision.NULL_REVISION
- self.base_files = {}
- else:
- self.base_id = parents[0]
- self.base_files = files_cache.get(self.base_id, None)
- if not self.base_files:
- self.base_files = copy_tree(self.base_id)
-
- self.files = files_cache[revid] = self.base_files.copy()
- self.rev_files = {}
-
- for path, data in self.files.iteritems():
- fid, mark = data
- self.rev_files[fid] = [path, mark]
-
- for path, f in files.iteritems():
- fid, mark = self.files.get(path, [None, None])
- if not fid:
- fid = bzrlib.generate_ids.gen_file_id(path)
- f['path'] = path
- self.rev_files[fid] = [path, mark]
- self.updates[fid] = f
-
- def last_revision(self):
- return self.base_id
-
- def iter_changes(self):
- changes = []
-
- def get_parent(dirname, basename):
- parent_fid, mark = self.base_files.get(dirname, [None, None])
- if parent_fid:
- return parent_fid
- parent_fid, mark = self.files.get(dirname, [None, None])
- if parent_fid:
- return parent_fid
- if basename == '':
- return None
- fid = bzrlib.generate_ids.gen_file_id(path)
- add_entry(fid, dirname, 'directory')
- return fid
-
- def add_entry(fid, path, kind, mode=None):
- dirname, basename = os.path.split(path)
- parent_fid = get_parent(dirname, basename)
-
- executable = False
- if mode == '100755':
- executable = True
- elif mode == '120000':
- kind = 'symlink'
-
- change = (fid,
- (None, path),
- True,
- (False, True),
- (None, parent_fid),
- (None, basename),
- (None, kind),
- (None, executable))
- self.files[path] = [change[0], None]
- changes.append(change)
-
- def update_entry(fid, path, kind, mode=None):
- dirname, basename = os.path.split(path)
- parent_fid = get_parent(dirname, basename)
-
- executable = False
- if mode == '100755':
- executable = True
- elif mode == '120000':
- kind = 'symlink'
-
- change = (fid,
- (path, path),
- True,
- (True, True),
- (None, parent_fid),
- (None, basename),
- (None, kind),
- (None, executable))
- self.files[path] = [change[0], None]
- changes.append(change)
-
- def remove_entry(fid, path, kind):
- dirname, basename = os.path.split(path)
- parent_fid = get_parent(dirname, basename)
- change = (fid,
- (path, None),
- True,
- (True, False),
- (parent_fid, None),
- (None, None),
- (None, None),
- (None, None))
- del self.files[path]
- changes.append(change)
-
- for fid, f in self.updates.iteritems():
- path = f['path']
-
- if 'deleted' in f:
- remove_entry(fid, path, 'file')
- continue
-
- if path in self.base_files:
- update_entry(fid, path, 'file', f['mode'])
- else:
- add_entry(fid, path, 'file', f['mode'])
-
- self.files[path][1] = f['mark']
- self.rev_files[fid][1] = f['mark']
-
- return changes
-
- def get_content(self, file_id):
- path, mark = self.rev_files[file_id]
- if mark:
- return blob_marks[mark]
-
- # last resort
- tree = self.branch.repository.revision_tree(self.base_id)
- return tree.get_file_text(file_id)
-
- def get_file_with_stat(self, file_id, path=None):
- content = self.get_content(file_id)
- return (StringIO.StringIO(content), None)
-
- def get_symlink_target(self, file_id):
- return self.get_content(file_id)
-
- def id2path(self, file_id):
- path, mark = self.rev_files[file_id]
- return path
-
-def c_style_unescape(string):
- if string[0] == string[-1] == '"':
- return string.decode('string-escape')[1:-1]
- return string
-
-def parse_commit(parser):
- parents = []
-
- ref = parser[1]
- parser.next()
-
- if ref.startswith('refs/heads/'):
- name = ref[len('refs/heads/'):]
- branch = get_remote_branch(name)
- else:
- die('unknown ref')
-
- commit_mark = parser.get_mark()
- parser.next()
- author = parser.get_author()
- parser.next()
- committer = parser.get_author()
- parser.next()
- data = parser.get_data()
- parser.next()
- if parser.check('from'):
- parents.append(parser.get_mark())
- parser.next()
- while parser.check('merge'):
- parents.append(parser.get_mark())
- parser.next()
-
- # fast-export adds an extra newline
- if data[-1] == '\n':
- data = data[:-1]
-
- files = {}
-
- for line in parser:
- if parser.check('M'):
- t, m, mark_ref, path = line.split(' ', 3)
- mark = int(mark_ref[1:])
- f = { 'mode' : m, 'mark' : mark }
- elif parser.check('D'):
- t, path = line.split(' ', 1)
- f = { 'deleted' : True }
- else:
- die('Unknown file command: %s' % line)
- path = c_style_unescape(path).decode('utf-8')
- files[path] = f
-
- committer, date, tz = committer
- author, _, _ = author
- parents = [mark_to_rev(p) for p in parents]
- revid = bzrlib.generate_ids.gen_revision_id(committer, date)
- props = {}
- props['branch-nick'] = branch.nick
- props['authors'] = author
-
- mtree = CustomTree(branch, revid, parents, files)
- changes = mtree.iter_changes()
-
- branch.lock_write()
- try:
- builder = branch.get_commit_builder(parents, None, date, tz, committer, props, revid)
- try:
- list(builder.record_iter_changes(mtree, mtree.last_revision(), changes))
- builder.finish_inventory()
- builder.commit(data.decode('utf-8', 'replace'))
- except Exception, e:
- builder.abort()
- raise
- finally:
- branch.unlock()
-
- parsed_refs[ref] = revid
- marks.new_mark(revid, commit_mark)
-
-def parse_reset(parser):
- ref = parser[1]
- parser.next()
-
- # ugh
- if parser.check('commit'):
- parse_commit(parser)
- return
- if not parser.check('from'):
- return
- from_mark = parser.get_mark()
- parser.next()
-
- parsed_refs[ref] = mark_to_rev(from_mark)
-
-def do_export(parser):
- parser.next()
-
- for line in parser.each_block('done'):
- if parser.check('blob'):
- parse_blob(parser)
- elif parser.check('commit'):
- parse_commit(parser)
- elif parser.check('reset'):
- parse_reset(parser)
- elif parser.check('tag'):
- pass
- elif parser.check('feature'):
- pass
- else:
- die('unhandled export command: %s' % line)
-
- for ref, revid in parsed_refs.iteritems():
- if ref.startswith('refs/heads/'):
- name = ref[len('refs/heads/'):]
- branch = get_remote_branch(name)
- branch.generate_revision_history(revid, marks.get_tip(name))
-
- if name in peers:
- peer = bzrlib.branch.Branch.open(peers[name],
- possible_transports=transports)
- try:
- peer.bzrdir.push_branch(branch, revision_id=revid,
- overwrite=force)
- except bzrlib.errors.DivergedBranches:
- print "error %s non-fast forward" % ref
- continue
-
- try:
- wt = branch.bzrdir.open_workingtree()
- wt.update()
- except bzrlib.errors.NoWorkingTree:
- pass
- elif ref.startswith('refs/tags/'):
- # TODO: implement tag push
- print "error %s pushing tags not supported" % ref
- continue
- else:
- # transport-helper/fast-export bugs
- continue
-
- print "ok %s" % ref
-
- print
-
-def do_capabilities(parser):
- print "import"
- print "export"
- print "refspec refs/heads/*:%s/heads/*" % prefix
- print "refspec refs/tags/*:%s/tags/*" % prefix
-
- path = os.path.join(dirname, 'marks-git')
-
- if os.path.exists(path):
- print "*import-marks %s" % path
- print "*export-marks %s" % path
-
- print "option"
- print
-
-class InvalidOptionValue(Exception):
- pass
-
-def get_bool_option(val):
- if val == 'true':
- return True
- elif val == 'false':
- return False
- else:
- raise InvalidOptionValue()
-
-def do_option(parser):
- global force
- opt, val = parser[1:3]
- try:
- if opt == 'force':
- force = get_bool_option(val)
- print 'ok'
- else:
- print 'unsupported'
- except InvalidOptionValue:
- print "error '%s' is not a valid value for option '%s'" % (val, opt)
-
-def ref_is_valid(name):
- return not True in [c in name for c in '~^: \\']
-
-def do_list(parser):
- master_branch = None
-
- for name in branches:
- if not master_branch:
- master_branch = name
- print "? refs/heads/%s" % name
-
- branch = get_remote_branch(master_branch)
- branch.lock_read()
- for tag, revid in branch.tags.get_tag_dict().items():
- try:
- branch.revision_id_to_dotted_revno(revid)
- except bzrlib.errors.NoSuchRevision:
- continue
- if not ref_is_valid(tag):
- continue
- print "? refs/tags/%s" % tag
- tags[tag] = revid
- branch.unlock()
-
- print "@refs/heads/%s HEAD" % master_branch
- print
-
-def clone(path, remote_branch):
- try:
- bdir = bzrlib.bzrdir.BzrDir.create(path, possible_transports=transports)
- except bzrlib.errors.AlreadyControlDirError:
- bdir = bzrlib.bzrdir.BzrDir.open(path, possible_transports=transports)
- repo = bdir.find_repository()
- repo.fetch(remote_branch.repository)
- return remote_branch.sprout(bdir, repository=repo)
-
-def get_remote_branch(name):
- remote_branch = bzrlib.branch.Branch.open(branches[name],
- possible_transports=transports)
- if isinstance(remote_branch.bzrdir.root_transport, bzrlib.transport.local.LocalTransport):
- return remote_branch
-
- branch_path = os.path.join(dirname, 'clone', name)
-
- try:
- branch = bzrlib.branch.Branch.open(branch_path,
- possible_transports=transports)
- except bzrlib.errors.NotBranchError:
- # clone
- branch = clone(branch_path, remote_branch)
- else:
- # pull
- try:
- branch.pull(remote_branch, overwrite=True)
- except bzrlib.errors.DivergedBranches:
- # use remote branch for now
- return remote_branch
-
- return branch
-
-def find_branches(repo):
- transport = repo.bzrdir.root_transport
-
- for fn in transport.iter_files_recursive():
- if not fn.endswith('.bzr/branch-format'):
- continue
-
- name = subdir = fn[:-len('/.bzr/branch-format')]
- name = name if name != '' else 'master'
- name = name.replace('/', '+')
-
- try:
- cur = transport.clone(subdir)
- branch = bzrlib.branch.Branch.open_from_transport(cur)
- except bzrlib.errors.NotBranchError:
- continue
- else:
- yield name, branch.base
-
-def get_repo(url, alias):
- normal_url = bzrlib.urlutils.normalize_url(url)
- origin = bzrlib.bzrdir.BzrDir.open(url, possible_transports=transports)
- is_local = isinstance(origin.transport, bzrlib.transport.local.LocalTransport)
-
- shared_path = os.path.join(gitdir, 'bzr')
- try:
- shared_dir = bzrlib.bzrdir.BzrDir.open(shared_path,
- possible_transports=transports)
- except bzrlib.errors.NotBranchError:
- shared_dir = bzrlib.bzrdir.BzrDir.create(shared_path,
- possible_transports=transports)
- try:
- shared_repo = shared_dir.open_repository()
- except bzrlib.errors.NoRepositoryPresent:
- shared_repo = shared_dir.create_repository(shared=True)
-
- if not is_local:
- 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,
- possible_transports=transports)
- bdir.destroy_repository()
- except bzrlib.errors.NotBranchError:
- pass
- except bzrlib.errors.NoRepositoryPresent:
- pass
-
- wanted = get_config('remote.%s.bzr-branches' % alias).rstrip().split(', ')
- # stupid python
- wanted = [e for e in wanted if e]
- if not wanted:
- wanted = get_config('remote-bzr.branches').rstrip().split(', ')
- # stupid python
- wanted = [e for e in wanted if e]
-
- if not wanted:
- try:
- repo = origin.open_repository()
- if not repo.bzrdir.root_transport.listable():
- # this repository is not usable for us
- raise bzrlib.errors.NoRepositoryPresent(repo.bzrdir)
- except bzrlib.errors.NoRepositoryPresent:
- wanted = ['master']
-
- if wanted:
- def list_wanted(url, wanted):
- for name in wanted:
- subdir = name if name != 'master' else ''
- yield name, bzrlib.urlutils.join(url, subdir)
-
- branch_list = list_wanted(url, wanted)
- else:
- branch_list = find_branches(repo)
-
- for name, url in branch_list:
- if not is_local:
- peers[name] = url
- branches[name] = url
-
- return origin
-
-def fix_path(alias, orig_url):
- url = urlparse.urlparse(orig_url, 'file')
- if url.scheme != 'file' or os.path.isabs(url.path):
- return
- abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
- cmd = ['git', 'config', 'remote.%s.url' % alias, "bzr::%s" % abs_url]
- subprocess.call(cmd)
-
-def main(args):
- global marks, prefix, gitdir, dirname
- global tags, filenodes
- global blob_marks
- global parsed_refs
- global files_cache
- global is_tmp
- global branches, peers
- global transports
- global force
-
- marks = None
- is_tmp = False
- gitdir = os.environ.get('GIT_DIR', None)
-
- if len(args) < 3:
- die('Not enough arguments.')
-
- if not gitdir:
- die('GIT_DIR not set')
-
- alias = args[1]
- url = args[2]
-
- tags = {}
- filenodes = {}
- blob_marks = {}
- parsed_refs = {}
- files_cache = {}
- branches = {}
- peers = {}
- transports = []
- force = False
-
- if alias[5:] == url:
- is_tmp = True
- alias = hashlib.sha1(alias).hexdigest()
-
- prefix = 'refs/bzr/%s' % alias
- dirname = os.path.join(gitdir, 'bzr', alias)
-
- if not is_tmp:
- fix_path(alias, url)
-
- if not os.path.exists(dirname):
- os.makedirs(dirname)
-
- if hasattr(bzrlib.ui.ui_factory, 'be_quiet'):
- bzrlib.ui.ui_factory.be_quiet(True)
-
- repo = get_repo(url, alias)
-
- marks_path = os.path.join(dirname, 'marks-int')
- marks = Marks(marks_path)
-
- parser = Parser(repo)
- for line in parser:
- if parser.check('capabilities'):
- do_capabilities(parser)
- elif parser.check('list'):
- do_list(parser)
- elif parser.check('import'):
- do_import(parser)
- elif parser.check('export'):
- do_export(parser)
- elif parser.check('option'):
- do_option(parser)
- else:
- die('unhandled command: %s' % line)
- sys.stdout.flush()
-def bye():
- if not marks:
- return
- if not is_tmp:
- marks.store()
- else:
- shutil.rmtree(dirname)
+sys.stderr.write('WARNING: git-remote-bzr is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-bzr\n')
-atexit.register(bye)
-sys.exit(main(sys.argv))
+sys.stderr.write('''WARNING:
+WARNING: You can pick a directory on your $PATH and download it, e.g.:
+WARNING: $ wget -O $HOME/bin/git-remote-bzr \\
+WARNING: https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+WARNING: $ chmod +x $HOME/bin/git-remote-bzr
+''')
diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index 34cda02..4255ad6 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -1,1258 +1,13 @@
#!/usr/bin/env python
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Inspired by Rocco Rutte's hg-fast-export
-
-# Just copy to your ~/bin, or anywhere in your $PATH.
-# Then you can clone with:
-# git clone hg::/path/to/mercurial/repo/
-#
-# For remote repositories a local clone is stored in
-# "$GIT_DIR/hg/origin/clone/.hg/".
-
-from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery, util
-
-import re
import sys
-import os
-import json
-import shutil
-import subprocess
-import urllib
-import atexit
-import urlparse, hashlib
-import time as ptime
-
-#
-# If you want to see Mercurial revisions as Git commit notes:
-# git config core.notesRef refs/notes/hg
-#
-# If you are not in hg-git-compat mode and want to disable the tracking of
-# named branches:
-# git config --global remote-hg.track-branches false
-#
-# If you want the equivalent of hg's clone/pull--insecure option:
-# 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.
-# hg bookmarks are exported as git branches, hg branches are prefixed
-# with 'branches/', HEAD is a special case.
-#
-# hg:
-# Emulate hg-git.
-# Only hg bookmarks are exported as git branches.
-# Commits are modified to preserve hg information and allow bidirectionality.
-#
-
-NAME_RE = re.compile('^([^<>]+)')
-AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
-EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
-AUTHOR_HG_RE = re.compile('^(.*?) ?<(.*?)(?:>(.+)?)?$')
-RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.*)> (\d+) ([+-]\d+)')
-
-VERSION = 2
-
-def die(msg, *args):
- sys.stderr.write('ERROR: %s\n' % (msg % args))
- sys.exit(1)
-
-def warn(msg, *args):
- sys.stderr.write('WARNING: %s\n' % (msg % args))
-
-def gitmode(flags):
- return 'l' in flags and '120000' or 'x' in flags and '100755' or '100644'
-
-def gittz(tz):
- return '%+03d%02d' % (-tz / 3600, -tz % 3600 / 60)
-
-def hgmode(mode):
- m = { '100755': 'x', '120000': 'l' }
- return m.get(mode, '')
-
-def hghex(n):
- return node.hex(n)
-
-def hgbin(n):
- return node.bin(n)
-
-def hgref(ref):
- return ref.replace('___', ' ')
-
-def gitref(ref):
- return ref.replace(' ', '___')
-
-def check_version(*check):
- if not hg_version:
- return True
- return hg_version >= check
-
-def get_config(config):
- cmd = ['git', 'config', '--get', config]
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- 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, repo):
- self.path = path
- self.repo = repo
- self.clear()
- self.load()
-
- if self.version < VERSION:
- if self.version == 1:
- self.upgrade_one()
-
- # upgraded?
- if self.version < VERSION:
- self.clear()
- self.version = VERSION
-
- def clear(self):
- self.tips = {}
- self.marks = {}
- self.rev_marks = {}
- self.last_mark = 0
- self.version = 0
- self.last_note = 0
-
- def load(self):
- if not os.path.exists(self.path):
- return
-
- tmp = json.load(open(self.path))
-
- self.tips = tmp['tips']
- self.marks = tmp['marks']
- self.last_mark = tmp['last-mark']
- self.version = tmp.get('version', 1)
- self.last_note = tmp.get('last-note', 0)
-
- for rev, mark in self.marks.iteritems():
- self.rev_marks[mark] = rev
-
- def upgrade_one(self):
- def get_id(rev):
- return hghex(self.repo.changelog.node(int(rev)))
- self.tips = dict((name, get_id(rev)) for name, rev in self.tips.iteritems())
- self.marks = dict((get_id(rev), mark) for rev, mark in self.marks.iteritems())
- self.rev_marks = dict((mark, get_id(rev)) for mark, rev in self.rev_marks.iteritems())
- self.version = 2
-
- def dict(self):
- return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version, 'last-note' : self.last_note }
-
- def store(self):
- json.dump(self.dict(), open(self.path, 'w'))
-
- def __str__(self):
- return str(self.dict())
-
- def from_rev(self, rev):
- return self.marks[rev]
-
- def to_rev(self, mark):
- return str(self.rev_marks[mark])
-
- def next_mark(self):
- self.last_mark += 1
- return self.last_mark
-
- def get_mark(self, rev):
- self.last_mark += 1
- self.marks[rev] = self.last_mark
- return self.last_mark
-
- def new_mark(self, rev, mark):
- self.marks[rev] = mark
- self.rev_marks[mark] = rev
- self.last_mark = mark
-
- def is_marked(self, rev):
- return rev in self.marks
-
- def get_tip(self, branch):
- return str(self.tips[branch])
-
- def set_tip(self, branch, tip):
- self.tips[branch] = tip
-
-class Parser:
-
- def __init__(self, repo):
- self.repo = repo
- self.line = self.get_line()
-
- def get_line(self):
- return sys.stdin.readline().strip()
-
- def __getitem__(self, i):
- return self.line.split()[i]
-
- def check(self, word):
- return self.line.startswith(word)
-
- def each_block(self, separator):
- while self.line != separator:
- yield self.line
- self.line = self.get_line()
-
- def __iter__(self):
- return self.each_block('')
-
- def next(self):
- self.line = self.get_line()
- if self.line == 'done':
- self.line = None
-
- def get_mark(self):
- i = self.line.index(':') + 1
- return int(self.line[i:])
-
- def get_data(self):
- if not self.check('data'):
- return None
- i = self.line.index(' ') + 1
- size = int(self.line[i:])
- return sys.stdin.read(size)
-
- def get_author(self):
- ex = None
- m = RAW_AUTHOR_RE.match(self.line)
- if not m:
- return None
- _, name, email, date, tz = m.groups()
- if name and 'ext:' in name:
- m = re.match('^(.+?) ext:\((.+)\)$', name)
- if m:
- name = m.group(1)
- ex = urllib.unquote(m.group(2))
-
- if email != bad_mail:
- if name:
- user = '%s <%s>' % (name, email)
- else:
- user = '<%s>' % (email)
- else:
- user = name
-
- if ex:
- user += ex
-
- tz = int(tz)
- tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
- return (user, int(date), -tz)
-
-def fix_file_path(path):
- path = os.path.normpath(path)
- if not os.path.isabs(path):
- return path
- return os.path.relpath(path, '/')
-
-def export_files(files):
- final = []
- for f in files:
- fid = node.hex(f.filenode())
-
- if fid in filenodes:
- mark = filenodes[fid]
- else:
- mark = marks.next_mark()
- filenodes[fid] = mark
- d = f.data()
-
- print "blob"
- print "mark :%u" % mark
- print "data %d" % len(d)
- print d
-
- path = fix_file_path(f.path())
- final.append((gitmode(f.flags()), mark, path))
-
- return final
-
-def get_filechanges(repo, ctx, parent):
- modified = set()
- added = set()
- removed = set()
-
- # load earliest manifest first for caching reasons
- prev = parent.manifest().copy()
- cur = ctx.manifest()
-
- for fn in cur:
- if fn in prev:
- if (cur.flags(fn) != prev.flags(fn) or cur[fn] != prev[fn]):
- modified.add(fn)
- del prev[fn]
- else:
- added.add(fn)
- removed |= set(prev.keys())
-
- return added | modified, removed
-
-def fixup_user_git(user):
- name = mail = None
- user = user.replace('"', '')
- m = AUTHOR_RE.match(user)
- if m:
- name = m.group(1)
- mail = m.group(2).strip()
- else:
- m = EMAIL_RE.match(user)
- if m:
- mail = m.group(1)
- else:
- m = NAME_RE.match(user)
- if m:
- name = m.group(1).strip()
- return (name, mail)
-
-def fixup_user_hg(user):
- def sanitize(name):
- # stole this from hg-git
- return re.sub('[<>\n]', '?', name.lstrip('< ').rstrip('> '))
-
- m = AUTHOR_HG_RE.match(user)
- if m:
- name = sanitize(m.group(1))
- mail = sanitize(m.group(2))
- ex = m.group(3)
- if ex:
- name += ' ext:(' + urllib.quote(ex) + ')'
- else:
- name = sanitize(user)
- if '@' in user:
- mail = name
- else:
- mail = None
-
- return (name, mail)
-
-def fixup_user(user):
- if mode == 'git':
- name, mail = fixup_user_git(user)
- else:
- name, mail = fixup_user_hg(user)
-
- if not name:
- name = bad_name
- if not mail:
- mail = bad_mail
-
- return '%s <%s>' % (name, mail)
-
-def updatebookmarks(repo, peer):
- remotemarks = peer.listkeys('bookmarks')
- localmarks = repo._bookmarks
-
- if not remotemarks:
- return
-
- for k, v in remotemarks.iteritems():
- localmarks[k] = hgbin(v)
-
- if hasattr(localmarks, 'write'):
- localmarks.write()
- else:
- bookmarks.write(repo)
-
-def get_repo(url, alias):
- global peer
-
- myui = ui.ui()
- myui.setconfig('ui', 'interactive', 'off')
- myui.fout = sys.stderr
-
- if get_config_bool('remote-hg.insecure'):
- myui.setconfig('web', 'cacerts', '')
-
- extensions.loadall(myui)
-
- if hg.islocal(url) and not os.environ.get('GIT_REMOTE_HG_TEST_REMOTE'):
- repo = hg.repository(myui, url)
- if not os.path.exists(dirname):
- os.makedirs(dirname)
- else:
- shared_path = os.path.join(gitdir, 'hg')
-
- # check and upgrade old organization
- hg_path = os.path.join(shared_path, '.hg')
- if os.path.exists(shared_path) and not os.path.exists(hg_path):
- repos = os.listdir(shared_path)
- for x in repos:
- local_hg = os.path.join(shared_path, x, 'clone', '.hg')
- if not os.path.exists(local_hg):
- continue
- if not os.path.exists(hg_path):
- shutil.move(local_hg, hg_path)
- shutil.rmtree(os.path.join(shared_path, x, 'clone'))
-
- # setup shared repo (if not there)
- try:
- hg.peer(myui, {}, shared_path, create=True)
- except error.RepoError:
- pass
-
- if not os.path.exists(dirname):
- os.makedirs(dirname)
-
- local_path = os.path.join(dirname, 'clone')
- if not os.path.exists(local_path):
- hg.share(myui, shared_path, local_path, update=False)
- else:
- # make sure the shared path is always up-to-date
- util.writefile(os.path.join(local_path, '.hg', 'sharedpath'), hg_path)
-
- repo = hg.repository(myui, local_path)
- try:
- peer = hg.peer(myui, {}, url)
- except:
- die('Repository error')
- repo.pull(peer, heads=None, force=True)
-
- updatebookmarks(repo, peer)
-
- return repo
-
-def rev_to_mark(rev):
- return marks.from_rev(rev.hex())
-
-def mark_to_rev(mark):
- return marks.to_rev(mark)
-
-def export_ref(repo, name, kind, head):
- ename = '%s/%s' % (kind, name)
- try:
- tip = marks.get_tip(ename)
- tip = repo[tip].rev()
- except:
- tip = 0
-
- revs = xrange(tip, head.rev() + 1)
- total = len(revs)
-
- for rev in revs:
-
- c = repo[rev]
- node = c.node()
-
- if marks.is_marked(c.hex()):
- continue
-
- (manifest, user, (time, tz), files, desc, extra) = repo.changelog.read(node)
- rev_branch = extra['branch']
-
- author = "%s %d %s" % (fixup_user(user), time, gittz(tz))
- if 'committer' in extra:
- user, time, tz = extra['committer'].rsplit(' ', 2)
- committer = "%s %s %s" % (user, time, gittz(int(tz)))
- else:
- committer = author
-
- parents = [repo[p] for p in repo.changelog.parentrevs(rev) if p >= 0]
-
- if len(parents) == 0:
- modified = c.manifest().keys()
- removed = []
- else:
- modified, removed = get_filechanges(repo, c, parents[0])
-
- desc += '\n'
-
- if mode == 'hg':
- extra_msg = ''
-
- if rev_branch != 'default':
- extra_msg += 'branch : %s\n' % rev_branch
-
- renames = []
- for f in c.files():
- if f not in c.manifest():
- continue
- rename = c.filectx(f).renamed()
- if rename:
- renames.append((rename[0], f))
-
- for e in renames:
- extra_msg += "rename : %s => %s\n" % e
-
- for key, value in extra.iteritems():
- if key in ('author', 'committer', 'encoding', 'message', 'branch', 'hg-git'):
- continue
- else:
- extra_msg += "extra : %s : %s\n" % (key, urllib.quote(value))
-
- if extra_msg:
- desc += '\n--HG--\n' + extra_msg
-
- if len(parents) == 0 and rev:
- print 'reset %s/%s' % (prefix, ename)
-
- modified_final = export_files(c.filectx(f) for f in modified)
-
- print "commit %s/%s" % (prefix, ename)
- print "mark :%d" % (marks.get_mark(c.hex()))
- print "author %s" % (author)
- print "committer %s" % (committer)
- print "data %d" % (len(desc))
- print desc
-
- if len(parents) > 0:
- print "from :%s" % (rev_to_mark(parents[0]))
- if len(parents) > 1:
- print "merge :%s" % (rev_to_mark(parents[1]))
-
- for f in removed:
- print "D %s" % (fix_file_path(f))
- for f in modified_final:
- print "M %s :%u %s" % f
- print
-
- progress = (rev - tip)
- if (progress % 100 == 0):
- print "progress revision %d '%s' (%d/%d)" % (rev, name, progress, total)
-
- # make sure the ref is updated
- print "reset %s/%s" % (prefix, ename)
- print "from :%u" % rev_to_mark(head)
- print
-
- pending_revs = set(revs) - notes
- if pending_revs:
- note_mark = marks.next_mark()
- ref = "refs/notes/hg"
-
- print "commit %s" % ref
- print "mark :%d" % (note_mark)
- print "committer remote-hg <> %d %s" % (ptime.time(), gittz(ptime.timezone))
- desc = "Notes for %s\n" % (name)
- print "data %d" % (len(desc))
- print desc
- if marks.last_note:
- print "from :%u" % marks.last_note
-
- for rev in pending_revs:
- notes.add(rev)
- c = repo[rev]
- print "N inline :%u" % rev_to_mark(c)
- msg = c.hex()
- print "data %d" % (len(msg))
- print msg
- print
-
- marks.last_note = note_mark
-
- marks.set_tip(ename, head.hex())
-
-def export_tag(repo, tag):
- export_ref(repo, tag, 'tags', repo[hgref(tag)])
-
-def export_bookmark(repo, bmark):
- head = bmarks[hgref(bmark)]
- export_ref(repo, bmark, 'bookmarks', head)
-
-def export_branch(repo, branch):
- tip = get_branch_tip(repo, branch)
- head = repo[tip]
- export_ref(repo, branch, 'branches', head)
-
-def export_head(repo):
- export_ref(repo, g_head[0], 'bookmarks', g_head[1])
-
-def do_capabilities(parser):
- print "import"
- print "export"
- print "refspec refs/heads/branches/*:%s/branches/*" % prefix
- print "refspec refs/heads/*:%s/bookmarks/*" % prefix
- print "refspec refs/tags/*:%s/tags/*" % prefix
-
- path = os.path.join(dirname, 'marks-git')
-
- if os.path.exists(path):
- print "*import-marks %s" % path
- print "*export-marks %s" % path
- print "option"
-
- print
-
-def branch_tip(branch):
- return branches[branch][-1]
-
-def get_branch_tip(repo, branch):
- heads = branches.get(hgref(branch), None)
- if not heads:
- return None
-
- # verify there's only one head
- if (len(heads) > 1):
- warn("Branch '%s' has more than one head, consider merging" % branch)
- return branch_tip(hgref(branch))
-
- return heads[0]
-
-def list_head(repo, cur):
- global g_head, fake_bmark
-
- if 'default' not in branches:
- # empty repo
- return
-
- node = repo[branch_tip('default')]
- head = 'master' if not 'master' in bmarks else 'default'
- fake_bmark = head
- bmarks[head] = node
-
- head = gitref(head)
- print "@refs/heads/%s HEAD" % head
- g_head = (head, node)
-
-def do_list(parser):
- repo = parser.repo
- for bmark, node in bookmarks.listbookmarks(repo).iteritems():
- bmarks[bmark] = repo[node]
-
- cur = repo.dirstate.branch()
- orig = peer if peer else repo
-
- for branch, heads in orig.branchmap().iteritems():
- # only open heads
- heads = [h for h in heads if 'close' not in repo.changelog.read(h)[5]]
- if heads:
- branches[branch] = heads
-
- list_head(repo, cur)
-
- if track_branches:
- for branch in branches:
- print "? refs/heads/branches/%s" % gitref(branch)
-
- for bmark in bmarks:
- if bmarks[bmark].hex() == '0000000000000000000000000000000000000000':
- warn("Ignoring invalid bookmark '%s'", bmark)
- else:
- print "? refs/heads/%s" % gitref(bmark)
-
- for tag, node in repo.tagslist():
- if tag == 'tip':
- continue
- print "? refs/tags/%s" % gitref(tag)
-
- print
-
-def do_import(parser):
- repo = parser.repo
-
- path = os.path.join(dirname, 'marks-git')
-
- print "feature done"
- if os.path.exists(path):
- print "feature import-marks=%s" % path
- print "feature export-marks=%s" % path
- print "feature force"
- sys.stdout.flush()
-
- tmp = encoding.encoding
- encoding.encoding = 'utf-8'
-
- # lets get all the import lines
- while parser.check('import'):
- ref = parser[1]
-
- if (ref == 'HEAD'):
- export_head(repo)
- elif ref.startswith('refs/heads/branches/'):
- branch = ref[len('refs/heads/branches/'):]
- export_branch(repo, branch)
- elif ref.startswith('refs/heads/'):
- bmark = ref[len('refs/heads/'):]
- export_bookmark(repo, bmark)
- elif ref.startswith('refs/tags/'):
- tag = ref[len('refs/tags/'):]
- export_tag(repo, tag)
-
- parser.next()
-
- encoding.encoding = tmp
-
- print 'done'
-
-def parse_blob(parser):
- parser.next()
- mark = parser.get_mark()
- parser.next()
- data = parser.get_data()
- blob_marks[mark] = data
- parser.next()
-
-def get_merge_files(repo, p1, p2, files):
- for e in repo[p1].files():
- if e not in files:
- if e not in repo[p1].manifest():
- continue
- f = { 'ctx' : repo[p1][e] }
- files[e] = f
-
-def c_style_unescape(string):
- if string[0] == string[-1] == '"':
- return string.decode('string-escape')[1:-1]
- return string
-
-def parse_commit(parser):
- from_mark = merge_mark = None
-
- ref = parser[1]
- parser.next()
-
- commit_mark = parser.get_mark()
- parser.next()
- author = parser.get_author()
- parser.next()
- committer = parser.get_author()
- parser.next()
- data = parser.get_data()
- parser.next()
- if parser.check('from'):
- from_mark = parser.get_mark()
- parser.next()
- if parser.check('merge'):
- merge_mark = parser.get_mark()
- parser.next()
- if parser.check('merge'):
- die('octopus merges are not supported yet')
-
- # fast-export adds an extra newline
- if data[-1] == '\n':
- data = data[:-1]
-
- files = {}
-
- for line in parser:
- if parser.check('M'):
- t, m, mark_ref, path = line.split(' ', 3)
- mark = int(mark_ref[1:])
- f = { 'mode' : hgmode(m), 'data' : blob_marks[mark] }
- elif parser.check('D'):
- t, path = line.split(' ', 1)
- f = { 'deleted' : True }
- else:
- die('Unknown file command: %s' % line)
- path = c_style_unescape(path)
- files[path] = f
-
- # only export the commits if we are on an internal proxy repo
- if dry_run and not peer:
- parsed_refs[ref] = None
- return
-
- def getfilectx(repo, memctx, f):
- of = files[f]
- if 'deleted' in of:
- raise IOError
- if 'ctx' in of:
- return of['ctx']
- is_exec = of['mode'] == 'x'
- is_link = of['mode'] == 'l'
- rename = of.get('rename', None)
- return context.memfilectx(f, of['data'],
- is_link, is_exec, rename)
-
- repo = parser.repo
-
- user, date, tz = author
- extra = {}
-
- if committer != author:
- extra['committer'] = "%s %u %u" % committer
-
- if from_mark:
- p1 = mark_to_rev(from_mark)
- else:
- p1 = '0' * 40
-
- if merge_mark:
- p2 = mark_to_rev(merge_mark)
- else:
- p2 = '0' * 40
-
- #
- # If files changed from any of the parents, hg wants to know, but in git if
- # nothing changed from the first parent, nothing changed.
- #
- if merge_mark:
- get_merge_files(repo, p1, p2, files)
-
- # Check if the ref is supposed to be a named branch
- if ref.startswith('refs/heads/branches/'):
- branch = ref[len('refs/heads/branches/'):]
- extra['branch'] = hgref(branch)
-
- if mode == 'hg':
- i = data.find('\n--HG--\n')
- if i >= 0:
- tmp = data[i + len('\n--HG--\n'):].strip()
- for k, v in [e.split(' : ', 1) for e in tmp.split('\n')]:
- if k == 'rename':
- old, new = v.split(' => ', 1)
- files[new]['rename'] = old
- elif k == 'branch':
- extra[k] = v
- elif k == 'extra':
- ek, ev = v.split(' : ', 1)
- extra[ek] = urllib.unquote(ev)
- data = data[:i]
-
- ctx = context.memctx(repo, (p1, p2), data,
- files.keys(), getfilectx,
- user, (date, tz), extra)
-
- tmp = encoding.encoding
- encoding.encoding = 'utf-8'
-
- node = hghex(repo.commitctx(ctx))
-
- encoding.encoding = tmp
-
- parsed_refs[ref] = node
- marks.new_mark(node, commit_mark)
-
-def parse_reset(parser):
- ref = parser[1]
- parser.next()
- # ugh
- if parser.check('commit'):
- parse_commit(parser)
- return
- if not parser.check('from'):
- return
- from_mark = parser.get_mark()
- parser.next()
-
- try:
- rev = mark_to_rev(from_mark)
- except KeyError:
- rev = None
- parsed_refs[ref] = rev
-
-def parse_tag(parser):
- name = parser[1]
- parser.next()
- from_mark = parser.get_mark()
- parser.next()
- tagger = parser.get_author()
- parser.next()
- data = parser.get_data()
- parser.next()
-
- parsed_tags[name] = (tagger, data)
-
-def write_tag(repo, tag, node, msg, author):
- branch = repo[node].branch()
- tip = branch_tip(branch)
- tip = repo[tip]
-
- def getfilectx(repo, memctx, f):
- try:
- fctx = tip.filectx(f)
- data = fctx.data()
- except error.ManifestLookupError:
- data = ""
- content = data + "%s %s\n" % (node, tag)
- return context.memfilectx(f, content, False, False, None)
-
- p1 = tip.hex()
- p2 = '0' * 40
- if author:
- user, date, tz = author
- date_tz = (date, tz)
- else:
- cmd = ['git', 'var', 'GIT_COMMITTER_IDENT']
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- output, _ = process.communicate()
- m = re.match('^.* <.*>', output)
- if m:
- user = m.group(0)
- else:
- user = repo.ui.username()
- date_tz = None
-
- ctx = context.memctx(repo, (p1, p2), msg,
- ['.hgtags'], getfilectx,
- user, date_tz, {'branch' : branch})
-
- tmp = encoding.encoding
- encoding.encoding = 'utf-8'
-
- tagnode = repo.commitctx(ctx)
-
- encoding.encoding = tmp
-
- return (tagnode, branch)
-
-def checkheads_bmark(repo, ref, ctx):
- bmark = ref[len('refs/heads/'):]
- if not bmark in bmarks:
- # new bmark
- return True
-
- ctx_old = bmarks[bmark]
- ctx_new = ctx
- if not repo.changelog.descendant(ctx_old.rev(), ctx_new.rev()):
- if force_push:
- print "ok %s forced update" % ref
- else:
- print "error %s non-fast forward" % ref
- return False
-
- return True
-
-def checkheads(repo, remote, p_revs):
-
- remotemap = remote.branchmap()
- if not remotemap:
- # empty repo
- return True
-
- new = {}
- ret = True
-
- for node, ref in p_revs.iteritems():
- ctx = repo[node]
- branch = ctx.branch()
- if not branch in remotemap:
- # new branch
- continue
- if not ref.startswith('refs/heads/branches'):
- if ref.startswith('refs/heads/'):
- if not checkheads_bmark(repo, ref, ctx):
- ret = False
-
- # only check branches
- continue
- new.setdefault(branch, []).append(ctx.rev())
-
- for branch, heads in new.iteritems():
- old = [repo.changelog.rev(x) for x in remotemap[branch]]
- for rev in heads:
- if check_version(2, 3):
- ancestors = repo.changelog.ancestors([rev], stoprev=min(old))
- else:
- ancestors = repo.changelog.ancestors(rev)
- found = False
-
- for x in old:
- if x in ancestors:
- found = True
- break
-
- if found:
- continue
-
- node = repo.changelog.node(rev)
- ref = p_revs[node]
- if force_push:
- print "ok %s forced update" % ref
- else:
- print "error %s non-fast forward" % ref
- ret = False
-
- return ret
-
-def push_unsafe(repo, remote, parsed_refs, p_revs):
-
- force = force_push
-
- fci = discovery.findcommonincoming
- commoninc = fci(repo, remote, force=force)
- common, _, remoteheads = commoninc
-
- if not checkheads(repo, remote, p_revs):
- return None
-
- cg = repo.getbundle('push', heads=list(p_revs), common=common)
-
- unbundle = remote.capable('unbundle')
- if unbundle:
- if force:
- remoteheads = ['force']
- return remote.unbundle(cg, remoteheads, 'push')
- else:
- return remote.addchangegroup(cg, 'push', repo.url())
-
-def push(repo, remote, parsed_refs, p_revs):
- if hasattr(remote, 'canpush') and not remote.canpush():
- print "error cannot push"
-
- if not p_revs:
- # nothing to push
- return
-
- lock = None
- unbundle = remote.capable('unbundle')
- if not unbundle:
- lock = remote.lock()
- try:
- ret = push_unsafe(repo, remote, parsed_refs, p_revs)
- finally:
- if lock is not None:
- lock.release()
-
- return ret
-
-def check_tip(ref, kind, name, heads):
- try:
- ename = '%s/%s' % (kind, name)
- tip = marks.get_tip(ename)
- except KeyError:
- return True
- else:
- return tip in heads
-
-def do_export(parser):
- p_bmarks = []
- p_revs = {}
-
- parser.next()
-
- for line in parser.each_block('done'):
- if parser.check('blob'):
- parse_blob(parser)
- elif parser.check('commit'):
- parse_commit(parser)
- elif parser.check('reset'):
- parse_reset(parser)
- elif parser.check('tag'):
- parse_tag(parser)
- elif parser.check('feature'):
- pass
- else:
- die('unhandled export command: %s' % line)
-
- need_fetch = False
-
- for ref, node in parsed_refs.iteritems():
- bnode = hgbin(node) if node else None
- if ref.startswith('refs/heads/branches'):
- branch = ref[len('refs/heads/branches/'):]
- if branch in branches and bnode in branches[branch]:
- # up to date
- continue
-
- if peer:
- remotemap = peer.branchmap()
- if remotemap and branch in remotemap:
- heads = [hghex(e) for e in remotemap[branch]]
- if not check_tip(ref, 'branches', branch, heads):
- print "error %s fetch first" % ref
- need_fetch = True
- continue
-
- p_revs[bnode] = ref
- print "ok %s" % ref
- elif ref.startswith('refs/heads/'):
- bmark = ref[len('refs/heads/'):]
- new = node
- old = bmarks[bmark].hex() if bmark in bmarks else ''
-
- if old == new:
- continue
-
- print "ok %s" % ref
- if bmark != fake_bmark and \
- not (bmark == 'master' and bmark not in parser.repo._bookmarks):
- p_bmarks.append((ref, bmark, old, new))
-
- if peer:
- remote_old = peer.listkeys('bookmarks').get(bmark)
- if remote_old:
- if not check_tip(ref, 'bookmarks', bmark, remote_old):
- print "error %s fetch first" % ref
- need_fetch = True
- continue
-
- p_revs[bnode] = ref
- elif ref.startswith('refs/tags/'):
- if dry_run:
- print "ok %s" % ref
- continue
- tag = ref[len('refs/tags/'):]
- tag = hgref(tag)
- author, msg = parsed_tags.get(tag, (None, None))
- if mode == 'git':
- if not msg:
- msg = 'Added tag %s for changeset %s' % (tag, node[:12])
- tagnode, branch = write_tag(parser.repo, tag, node, msg, author)
- p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch)
- else:
- fp = parser.repo.opener('localtags', 'a')
- fp.write('%s %s\n' % (node, tag))
- fp.close()
- p_revs[bnode] = ref
- print "ok %s" % ref
- else:
- # transport-helper/fast-export bugs
- continue
-
- if need_fetch:
- print
- return
-
- if dry_run:
- if peer and not force_push:
- checkheads(parser.repo, peer, p_revs)
- print
- return
-
- if peer:
- if not push(parser.repo, peer, parsed_refs, p_revs):
- # do not update bookmarks
- print
- return
-
- # update remote bookmarks
- remote_bmarks = peer.listkeys('bookmarks')
- for ref, bmark, old, new in p_bmarks:
- if force_push:
- old = remote_bmarks.get(bmark, '')
- if not peer.pushkey('bookmarks', bmark, old, new):
- print "error %s" % ref
- else:
- # update local bookmarks
- for ref, bmark, old, new in p_bmarks:
- if not bookmarks.pushbookmark(parser.repo, bmark, old, new):
- print "error %s" % ref
-
- print
-
-def do_option(parser):
- global dry_run, force_push
- _, key, value = parser.line.split(' ')
- if key == 'dry-run':
- dry_run = (value == 'true')
- print 'ok'
- elif key == 'force':
- force_push = (value == 'true')
- print 'ok'
- else:
- print 'unsupported'
-
-def fix_path(alias, repo, orig_url):
- url = urlparse.urlparse(orig_url, 'file')
- if url.scheme != 'file' or os.path.isabs(os.path.expanduser(url.path)):
- return
- abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
- cmd = ['git', 'config', 'remote.%s.url' % alias, "hg::%s" % abs_url]
- subprocess.call(cmd)
-
-def main(args):
- global prefix, gitdir, dirname, branches, bmarks
- global marks, blob_marks, parsed_refs
- global peer, mode, bad_mail, bad_name
- global track_branches, force_push, is_tmp
- global parsed_tags
- global filenodes
- global fake_bmark, hg_version
- global dry_run
- global notes, alias
-
- marks = None
- is_tmp = False
- gitdir = os.environ.get('GIT_DIR', None)
-
- if len(args) < 3:
- die('Not enough arguments.')
-
- if not gitdir:
- die('GIT_DIR not set')
-
- alias = args[1]
- url = args[2]
- peer = None
-
- hg_git_compat = get_config_bool('remote-hg.hg-git-compat')
- track_branches = get_config_bool('remote-hg.track-branches', True)
- force_push = False
-
- if hg_git_compat:
- mode = 'hg'
- bad_mail = 'none@none'
- bad_name = ''
- else:
- mode = 'git'
- bad_mail = 'unknown'
- bad_name = 'Unknown'
-
- if alias[4:] == url:
- is_tmp = True
- alias = hashlib.sha1(alias).hexdigest()
-
- dirname = os.path.join(gitdir, 'hg', alias)
- branches = {}
- bmarks = {}
- blob_marks = {}
- parsed_refs = {}
- parsed_tags = {}
- filenodes = {}
- fake_bmark = None
- try:
- hg_version = tuple(int(e) for e in util.version().split('.'))
- except:
- hg_version = None
- dry_run = False
- notes = set()
-
- repo = get_repo(url, alias)
- prefix = 'refs/hg/%s' % alias
-
- if not is_tmp:
- fix_path(alias, peer or repo, url)
-
- marks_path = os.path.join(dirname, 'marks-hg')
- marks = Marks(marks_path, repo)
-
- 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'):
- do_capabilities(parser)
- elif parser.check('list'):
- do_list(parser)
- elif parser.check('import'):
- do_import(parser)
- elif parser.check('export'):
- do_export(parser)
- elif parser.check('option'):
- do_option(parser)
- else:
- die('unhandled command: %s' % line)
- sys.stdout.flush()
-def bye():
- if not marks:
- return
- if not is_tmp:
- marks.store()
- else:
- shutil.rmtree(dirname)
+sys.stderr.write('WARNING: git-remote-hg is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-hg\n')
-atexit.register(bye)
-sys.exit(main(sys.argv))
+sys.stderr.write('''WARNING:
+WARNING: You can pick a directory on your $PATH and download it, e.g.:
+WARNING: $ wget -O $HOME/bin/git-remote-hg \\
+WARNING: https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+WARNING: $ chmod +x $HOME/bin/git-remote-hg
+''')
diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh
deleted file mode 100755
index a4656ce..0000000
--- a/contrib/remote-helpers/test-bzr.sh
+++ /dev/null
@@ -1,438 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-
-test_description='Test remote-bzr'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-bzr tests; python not available'
- test_done
-fi
-
-if ! python -c 'import bzrlib'
-then
- skip_all='skipping remote-bzr tests; bzr not available'
- test_done
-fi
-
-check () {
- echo $3 >expected &&
- git --git-dir=$1/.git log --format='%s' -1 $2 >actual
- test_cmp expected actual
-}
-
-bzr whoami "A U Thor <author@example.com>"
-
-test_expect_success 'cloning' '
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
- echo one >content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- git clone "bzr::bzrrepo" gitrepo &&
- check gitrepo HEAD one
-'
-
-test_expect_success 'pulling' '
- (
- cd bzrrepo &&
- echo two >content &&
- bzr commit -m two
- ) &&
-
- (cd gitrepo && git pull) &&
-
- check gitrepo HEAD two
-'
-
-test_expect_success 'pushing' '
- (
- cd gitrepo &&
- echo three >content &&
- git commit -a -m three &&
- git push
- ) &&
-
- echo three >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-test_expect_success 'forced pushing' '
- (
- cd gitrepo &&
- echo three-new >content &&
- git commit -a --amend -m three-new &&
- git push -f
- ) &&
-
- (
- cd bzrrepo &&
- # the forced update overwrites the bzr branch but not the bzr
- # working directory (it tries to merge instead)
- bzr revert
- ) &&
-
- echo three-new >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-test_expect_success 'roundtrip' '
- (
- cd gitrepo &&
- git pull &&
- git log --format="%s" -1 origin/master >actual
- ) &&
- echo three-new >expected &&
- test_cmp expected actual &&
-
- (cd gitrepo && git push && git pull) &&
-
- (
- cd bzrrepo &&
- echo four >content &&
- bzr commit -m four
- ) &&
-
- (cd gitrepo && git pull && git push) &&
-
- check gitrepo HEAD four &&
-
- (
- cd gitrepo &&
- echo five >content &&
- git commit -a -m five &&
- git push && git pull
- ) &&
-
- (cd bzrrepo && bzr revert) &&
-
- echo five >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-cat >expected <<\EOF
-100644 blob 54f9d6da5c91d556e6b54340b1327573073030af content
-100755 blob 68769579c3eaadbe555379b9c3538e6628bae1eb executable
-120000 blob 6b584e8ece562ebffc15d38808cd6b98fc3d97ea link
-EOF
-
-test_expect_success 'special modes' '
- (
- cd bzrrepo &&
- echo exec >executable
- chmod +x executable &&
- bzr add executable
- bzr commit -m exec &&
- ln -s content link
- bzr add link
- bzr commit -m link &&
- mkdir dir &&
- bzr add dir &&
- bzr commit -m dir
- ) &&
-
- (
- cd gitrepo &&
- git pull
- git ls-tree HEAD >../actual
- ) &&
-
- test_cmp expected actual &&
-
- (
- cd gitrepo &&
- git cat-file -p HEAD:link >../actual
- ) &&
-
- printf content >expected &&
- test_cmp expected actual
-'
-
-cat >expected <<\EOF
-100644 blob 54f9d6da5c91d556e6b54340b1327573073030af content
-100755 blob 68769579c3eaadbe555379b9c3538e6628bae1eb executable
-120000 blob 6b584e8ece562ebffc15d38808cd6b98fc3d97ea link
-040000 tree 35c0caa46693cef62247ac89a680f0c5ce32b37b movedir-new
-EOF
-
-test_expect_success 'moving directory' '
- (
- cd bzrrepo &&
- mkdir movedir &&
- echo one >movedir/one &&
- echo two >movedir/two &&
- bzr add movedir &&
- bzr commit -m movedir &&
- bzr mv movedir movedir-new &&
- bzr commit -m movedir-new
- ) &&
-
- (
- cd gitrepo &&
- git pull &&
- git ls-tree HEAD >../actual
- ) &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'different authors' '
- (
- cd bzrrepo &&
- echo john >>content &&
- bzr commit -m john \
- --author "Jane Rey <jrey@example.com>" \
- --author "John Doe <jdoe@example.com>"
- ) &&
-
- (
- cd gitrepo &&
- git pull &&
- git show --format="%an <%ae>, %cn <%ce>" --quiet >../actual
- ) &&
-
- echo "Jane Rey <jrey@example.com>, A U Thor <author@example.com>" >expected &&
- test_cmp expected actual
-'
-
-# cleanup previous stuff
-rm -rf bzrrepo gitrepo
-
-test_expect_success 'fetch utf-8 filenames' '
- test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
-
- echo test >>"ærø" &&
- bzr add "ærø" &&
- echo test >>"ø~?" &&
- bzr add "ø~?" &&
- bzr commit -m add-utf-8 &&
- echo test >>"ærø" &&
- bzr commit -m test-utf-8 &&
- bzr rm "ø~?" &&
- bzr mv "ærø" "ø~?" &&
- bzr commit -m bzr-mv-utf-8
- ) &&
-
- (
- git clone "bzr::bzrrepo" gitrepo &&
- cd gitrepo &&
- git -c core.quotepath=false ls-files >../actual
- ) &&
- echo "ø~?" >expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'push utf-8 filenames' '
- test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" &&
-
- mkdir -p tmp && cd tmp &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
-
- echo one >>content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- (
- git clone "bzr::bzrrepo" gitrepo &&
- cd gitrepo &&
-
- echo test >>"ærø" &&
- git add "ærø" &&
- git commit -m utf-8 &&
-
- git push
- ) &&
-
- (cd bzrrepo && bzr ls >../actual) &&
- printf "content\nærø\n" >expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'pushing a merge' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
- echo one >content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- git clone "bzr::bzrrepo" gitrepo &&
-
- (
- cd bzrrepo &&
- echo two >content &&
- bzr commit -m two
- ) &&
-
- (
- cd gitrepo &&
- echo three >content &&
- git commit -a -m three &&
- git fetch &&
- git merge origin/master || true &&
- echo three >content &&
- git commit -a --no-edit &&
- git push
- ) &&
-
- echo three >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-cat >expected <<\EOF
-origin/HEAD
-origin/branch
-origin/trunk
-EOF
-
-test_expect_success 'proper bzr repo' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- bzr init-repo bzrrepo &&
-
- (
- bzr init bzrrepo/trunk &&
- cd bzrrepo/trunk &&
- echo one >>content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- (
- bzr branch bzrrepo/trunk bzrrepo/branch &&
- cd bzrrepo/branch &&
- echo two >>content &&
- bzr commit -m one
- ) &&
-
- (
- git clone "bzr::bzrrepo" gitrepo &&
- cd gitrepo &&
- git for-each-ref --format "%(refname:short)" refs/remotes/origin >../actual
- ) &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'strip' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
-
- echo one >>content &&
- bzr add content &&
- bzr commit -m one &&
-
- echo two >>content &&
- bzr commit -m two
- ) &&
-
- git clone "bzr::bzrrepo" gitrepo &&
-
- (
- cd bzrrepo &&
- bzr uncommit --force &&
-
- echo three >>content &&
- bzr commit -m three &&
-
- echo four >>content &&
- bzr commit -m four &&
- bzr log --line | sed -e "s/^[0-9][0-9]*: //" >../expected
- ) &&
-
- (
- cd gitrepo &&
- git fetch &&
- git log --format="%an %ad %s" --date=short origin/master >../actual
- ) &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'export utf-8 authors' '
- test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C && GIT_COMMITTER_NAME=\"C O Mitter\""
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- GIT_COMMITTER_NAME="Grégoire"
- export GIT_COMMITTER_NAME
-
- bzr init bzrrepo &&
-
- (
- git init gitrepo &&
- cd gitrepo &&
- echo greg >>content &&
- git add content &&
- git commit -m one &&
- git remote add bzr "bzr::../bzrrepo" &&
- git push bzr master
- ) &&
-
- (
- cd bzrrepo &&
- bzr log | grep "^committer: " >../actual
- ) &&
-
- echo "committer: Grégoire <committer@example.com>" >expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'push different author' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- bzr init bzrrepo &&
-
- (
- git init gitrepo &&
- cd gitrepo &&
- echo john >> content &&
- git add content &&
- git commit -m john --author "John Doe <jdoe@example.com>" &&
- git remote add bzr "bzr::../bzrrepo" &&
- git push bzr master
- ) &&
-
- (
- cd bzrrepo &&
- bzr log | grep "^author: " > ../actual
- ) &&
-
- echo "author: John Doe <jdoe@example.com>" > expected &&
- test_cmp expected actual
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh
deleted file mode 100755
index d86e147..0000000
--- a/contrib/remote-helpers/test-hg-bidi.sh
+++ /dev/null
@@ -1,243 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test bidirectionality of remote-hg'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-hg tests; python not available'
- test_done
-fi
-
-if ! python -c 'import mercurial'
-then
- skip_all='skipping remote-hg tests; mercurial not available'
- test_done
-fi
-
-# clone to a git repo
-git_clone () {
- git clone -q "hg::$1" $2
-}
-
-# clone to an hg repo
-hg_clone () {
- (
- hg init $2 &&
- cd $1 &&
- git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
- ) &&
-
- (cd $2 && hg -q update)
-}
-
-# push an hg repo
-hg_push () {
- (
- cd $2
- git checkout -q -b tmp &&
- git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
- git checkout -q @{-1} &&
- git branch -q -D tmp 2>/dev/null || true
- )
-}
-
-hg_log () {
- hg -R $1 log --graph --debug
-}
-
-setup () {
- (
- echo "[ui]"
- echo "username = A U Thor <author@example.com>"
- echo "[defaults]"
- echo "backout = -d \"0 0\""
- echo "commit = -d \"0 0\""
- echo "debugrawcommit = -d \"0 0\""
- echo "tag = -d \"0 0\""
- echo "[extensions]"
- echo "graphlog ="
- ) >>"$HOME"/.hgrc &&
- git config --global remote-hg.hg-git-compat true
- git config --global remote-hg.track-branches true
-
- HGEDITOR=/usr/bin/true
- GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
- GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
- export HGEDITOR GIT_AUTHOR_DATE GIT_COMMITTER_DATE
-}
-
-setup
-
-test_expect_success 'encoding' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add älphà" &&
-
- GIT_AUTHOR_NAME="tést èncödîng" &&
- export GIT_AUTHOR_NAME &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
-
- echo gamma >gamma &&
- git add gamma &&
- git commit -m "add gämmâ" &&
-
- : TODO git config i18n.commitencoding latin-1 &&
- echo delta >delta &&
- git add delta &&
- git commit -m "add déltà"
- ) &&
-
- hg_clone gitrepo hgrepo &&
- git_clone hgrepo gitrepo2 &&
- hg_clone gitrepo2 hgrepo2 &&
-
- HGENCODING=utf-8 hg_log hgrepo >expected &&
- HGENCODING=utf-8 hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'file removal' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta"
- mkdir foo &&
- echo blah >foo/bar &&
- git add foo &&
- git commit -m "add foo" &&
- git rm alpha &&
- git commit -m "remove alpha" &&
- git rm foo/bar &&
- git commit -m "remove foo/bar"
- ) &&
-
- hg_clone gitrepo hgrepo &&
- git_clone hgrepo gitrepo2 &&
- hg_clone gitrepo2 hgrepo2 &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'git tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- git config receive.denyCurrentBranch ignore &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git tag alpha &&
-
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
- git tag -a -m "added tag beta" beta
- ) &&
-
- hg_clone gitrepo hgrepo &&
- git_clone hgrepo gitrepo2 &&
- hg_clone gitrepo2 hgrepo2 &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'hg branch' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -q -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone gitrepo hgrepo &&
-
- cd hgrepo &&
- hg -q co default &&
- hg mv alpha beta &&
- hg -q commit -m "rename alpha to beta" &&
- hg branch gamma | grep -v "permanent and global" &&
- hg -q commit -m "started branch gamma"
- ) &&
-
- hg_push hgrepo gitrepo &&
- hg_clone gitrepo hgrepo2 &&
-
- : Back to the common revision &&
- (cd hgrepo && hg checkout default) &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'hg tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone gitrepo hgrepo &&
-
- cd hgrepo &&
- hg co default &&
- hg tag alpha
- ) &&
-
- hg_push hgrepo gitrepo &&
- hg_clone gitrepo hgrepo2 &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh
deleted file mode 100755
index b23909a..0000000
--- a/contrib/remote-helpers/test-hg-hg-git.sh
+++ /dev/null
@@ -1,542 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test remote-hg output compared to hg-git'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-hg tests; python not available'
- test_done
-fi
-
-if ! python -c 'import mercurial'
-then
- skip_all='skipping remote-hg tests; mercurial not available'
- test_done
-fi
-
-if ! python -c 'import hggit'
-then
- skip_all='skipping remote-hg tests; hg-git not available'
- test_done
-fi
-
-# clone to a git repo with git
-git_clone_git () {
- git clone -q "hg::$1" $2 &&
- (cd $2 && git checkout master && git branch -D default)
-}
-
-# clone to an hg repo with git
-hg_clone_git () {
- (
- hg init $2 &&
- hg -R $2 bookmark -i master &&
- cd $1 &&
- git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
- ) &&
-
- (cd $2 && hg -q update)
-}
-
-# clone to a git repo with hg
-git_clone_hg () {
- (
- git init -q $2 &&
- cd $1 &&
- hg bookmark -i -f -r tip master &&
- hg -q push -r master ../$2 || true
- )
-}
-
-# clone to an hg repo with hg
-hg_clone_hg () {
- hg -q clone $1 $2
-}
-
-# push an hg repo with git
-hg_push_git () {
- (
- cd $2
- git checkout -q -b tmp &&
- git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
- git branch -D default &&
- git checkout -q @{-1} &&
- git branch -q -D tmp 2>/dev/null || true
- )
-}
-
-# push an hg git repo with hg
-hg_push_hg () {
- (
- cd $1 &&
- hg -q push ../$2 || true
- )
-}
-
-hg_log () {
- hg -R $1 log --graph --debug >log &&
- grep -v 'tag: *default/' log
-}
-
-git_log () {
- git --git-dir=$1/.git fast-export --branches
-}
-
-setup () {
- (
- echo "[ui]"
- echo "username = A U Thor <author@example.com>"
- echo "[defaults]"
- echo "backout = -d \"0 0\""
- echo "commit = -d \"0 0\""
- echo "debugrawcommit = -d \"0 0\""
- echo "tag = -d \"0 0\""
- echo "[extensions]"
- echo "hgext.bookmarks ="
- echo "hggit ="
- echo "graphlog ="
- ) >>"$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=true
- HGMERGE=true
-
- GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
- GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
- export HGEDITOR HGMERGE GIT_AUTHOR_DATE GIT_COMMITTER_DATE
-}
-
-setup
-
-test_expect_success 'executable bit' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- chmod 0644 alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- chmod 0755 alpha &&
- git add alpha &&
- git commit -m "set executable bit" &&
- chmod 0644 alpha &&
- git add alpha &&
- git commit -m "clear executable bit"
- ) &&
-
- for x in hg git
- do
- (
- hg_clone_$x gitrepo hgrepo-$x &&
- cd hgrepo-$x &&
- hg_log . &&
- hg manifest -r 1 -v &&
- hg manifest -v
- ) >"output-$x" &&
-
- git_clone_$x hgrepo-$x gitrepo2-$x &&
- git_log gitrepo2-$x >"log-$x"
- done &&
-
- test_cmp output-hg output-git &&
- test_cmp log-hg log-git
-'
-
-test_expect_success 'symlink' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- ln -s alpha beta &&
- git add beta &&
- git commit -m "add beta"
- ) &&
-
- for x in hg git
- do
- (
- hg_clone_$x gitrepo hgrepo-$x &&
- cd hgrepo-$x &&
- hg_log . &&
- hg manifest -v
- ) >"output-$x" &&
-
- git_clone_$x hgrepo-$x gitrepo2-$x &&
- git_log gitrepo2-$x >"log-$x"
- done &&
-
- test_cmp output-hg output-git &&
- test_cmp log-hg log-git
-'
-
-test_expect_success 'merge conflict 1' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- hg init hgrepo1 &&
- cd hgrepo1 &&
- echo A >afile &&
- hg add afile &&
- hg ci -m "origin" &&
-
- echo B >afile &&
- hg ci -m "A->B" &&
-
- hg up -r0 &&
- echo C >afile &&
- hg ci -m "A->C" &&
-
- hg merge -r1 &&
- echo C >afile &&
- hg resolve -m afile &&
- hg ci -m "merge to C"
- ) &&
-
- for x in hg git
- do
- git_clone_$x hgrepo1 gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'merge conflict 2' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- hg init hgrepo1 &&
- cd hgrepo1 &&
- echo A >afile &&
- hg add afile &&
- hg ci -m "origin" &&
-
- echo B >afile &&
- hg ci -m "A->B" &&
-
- hg up -r0 &&
- echo C >afile &&
- hg ci -m "A->C" &&
-
- hg merge -r1 || true &&
- echo B >afile &&
- hg resolve -m afile &&
- hg ci -m "merge to B"
- ) &&
-
- for x in hg git
- do
- git_clone_$x hgrepo1 gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'converged merge' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- hg init hgrepo1 &&
- cd hgrepo1 &&
- echo A >afile &&
- hg add afile &&
- hg ci -m "origin" &&
-
- echo B >afile &&
- hg ci -m "A->B" &&
-
- echo C >afile &&
- hg ci -m "B->C" &&
-
- hg up -r0 &&
- echo C >afile &&
- hg ci -m "A->C" &&
-
- hg merge -r2 || true &&
- hg ci -m "merge"
- ) &&
-
- for x in hg git
- do
- git_clone_$x hgrepo1 gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'encoding' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add älphà" &&
-
- GIT_AUTHOR_NAME="tést èncödîng" &&
- export GIT_AUTHOR_NAME &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
-
- echo gamma >gamma &&
- git add gamma &&
- git commit -m "add gämmâ" &&
-
- : TODO git config i18n.commitencoding latin-1 &&
- echo delta >delta &&
- git add delta &&
- git commit -m "add déltà"
- ) &&
-
- for x in hg git
- do
- hg_clone_$x gitrepo hgrepo-$x &&
- git_clone_$x hgrepo-$x gitrepo2-$x &&
-
- HGENCODING=utf-8 hg_log hgrepo-$x >"hg-log-$x" &&
- git_log gitrepo2-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'file removal' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta"
- mkdir foo &&
- echo blah >foo/bar &&
- git add foo &&
- git commit -m "add foo" &&
- git rm alpha &&
- git commit -m "remove alpha" &&
- git rm foo/bar &&
- git commit -m "remove foo/bar"
- ) &&
-
- for x in hg git
- do
- (
- hg_clone_$x gitrepo hgrepo-$x &&
- cd hgrepo-$x &&
- hg_log . &&
- hg manifest -r 3 &&
- hg manifest
- ) >"output-$x" &&
-
- git_clone_$x hgrepo-$x gitrepo2-$x &&
- git_log gitrepo2-$x >"log-$x"
- done &&
-
- test_cmp output-hg output-git &&
- test_cmp log-hg log-git
-'
-
-test_expect_success 'git tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- git config receive.denyCurrentBranch ignore &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git tag alpha &&
-
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
- git tag -a -m "added tag beta" beta
- ) &&
-
- for x in hg git
- do
- hg_clone_$x gitrepo hgrepo-$x &&
- hg_log hgrepo-$x >"log-$x"
- done &&
-
- test_cmp log-hg log-git
-'
-
-test_expect_success 'hg author' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- for x in hg git
- do
- (
- git init -q gitrepo-$x &&
- cd gitrepo-$x &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone_$x gitrepo-$x hgrepo-$x &&
- cd hgrepo-$x &&
-
- hg co master &&
- echo beta >beta &&
- hg add beta &&
- hg commit -u "test" -m "add beta" &&
-
- echo gamma >>beta &&
- hg commit -u "test <test@example.com> (comment)" -m "modify beta" &&
-
- echo gamma >gamma &&
- hg add gamma &&
- hg commit -u "<test@example.com>" -m "add gamma" &&
-
- echo delta >delta &&
- hg add delta &&
- hg commit -u "name<test@example.com>" -m "add delta" &&
-
- echo epsilon >epsilon &&
- hg add epsilon &&
- hg commit -u "name <test@example.com" -m "add epsilon" &&
-
- echo zeta >zeta &&
- hg add zeta &&
- hg commit -u " test " -m "add zeta" &&
-
- echo eta >eta &&
- hg add eta &&
- hg commit -u "test < test@example.com >" -m "add eta" &&
-
- echo theta >theta &&
- hg add theta &&
- hg commit -u "test >test@example.com>" -m "add theta" &&
-
- echo iota >iota &&
- hg add iota &&
- hg commit -u "test <test <at> example <dot> com>" -m "add iota"
- ) &&
-
- hg_push_$x hgrepo-$x gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'hg branch' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- for x in hg git
- do
- (
- git init -q gitrepo-$x &&
- cd gitrepo-$x &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -q -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone_$x gitrepo-$x hgrepo-$x &&
-
- cd hgrepo-$x &&
- hg -q co master &&
- hg mv alpha beta &&
- hg -q commit -m "rename alpha to beta" &&
- hg branch gamma | grep -v "permanent and global" &&
- hg -q commit -m "started branch gamma"
- ) &&
-
- hg_push_$x hgrepo-$x gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'hg tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- for x in hg git
- do
- (
- git init -q gitrepo-$x &&
- cd gitrepo-$x &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone_$x gitrepo-$x hgrepo-$x &&
-
- cd hgrepo-$x &&
- hg co master &&
- hg tag alpha
- ) &&
-
- hg_push_$x hgrepo-$x gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
- (
- git --git-dir=gitrepo-$x/.git tag -l &&
- hg_log hgrepo2-$x &&
- cat hgrepo2-$x/.hgtags
- ) >"output-$x"
- done &&
-
- test_cmp output-hg output-git
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh
deleted file mode 100755
index 7d90056..0000000
--- a/contrib/remote-helpers/test-hg.sh
+++ /dev/null
@@ -1,848 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test remote-hg'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-hg tests; python not available'
- test_done
-fi
-
-if ! python -c 'import mercurial'
-then
- skip_all='skipping remote-hg tests; mercurial not available'
- test_done
-fi
-
-check () {
- echo $3 >expected &&
- git --git-dir=$1/.git log --format='%s' -1 $2 >actual
- test_cmp expected actual
-}
-
-check_branch () {
- if test -n "$3"
- then
- echo $3 >expected &&
- hg -R $1 log -r $2 --template '{desc}\n' >actual &&
- test_cmp expected actual
- else
- hg -R $1 branches >out &&
- ! grep $2 out
- fi
-}
-
-check_bookmark () {
- if test -n "$3"
- then
- echo $3 >expected &&
- hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' >actual &&
- test_cmp expected actual
- else
- hg -R $1 bookmarks >out &&
- ! grep $2 out
- fi
-}
-
-check_push () {
- expected_ret=$1 ret=0 ref_ret=0
-
- shift
- git push origin "$@" 2>error
- ret=$?
- cat error
-
- while IFS=':' read branch kind
- do
- case "$kind" in
- 'new')
- grep "^ \* \[new branch\] *${branch} -> ${branch}$" error || ref_ret=1
- ;;
- 'non-fast-forward')
- grep "^ ! \[rejected\] *${branch} -> ${branch} (non-fast-forward)$" error || ref_ret=1
- ;;
- 'fetch-first')
- grep "^ ! \[rejected\] *${branch} -> ${branch} (fetch first)$" error || ref_ret=1
- ;;
- 'forced-update')
- grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *${branch} -> ${branch} (forced update)$" error || ref_ret=1
- ;;
- '')
- grep "^ [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1
- ;;
- esac
- test $ref_ret -ne 0 && echo "match for '$branch' failed" && break
- done
-
- if test $expected_ret -ne $ret || test $ref_ret -ne 0
- then
- return 1
- fi
-
- return 0
-}
-
-setup () {
- (
- echo "[ui]"
- echo "username = H G Wells <wells@example.com>"
- echo "[extensions]"
- echo "mq ="
- ) >>"$HOME"/.hgrc &&
-
- GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" &&
- GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" &&
- export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
-}
-
-setup
-
-test_expect_success 'cloning' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD zero
-'
-
-test_expect_success 'cloning with branches' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg branch next &&
- echo next >content &&
- hg commit -m next
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo origin/branches/next next
-'
-
-test_expect_success 'cloning with bookmarks' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg checkout default &&
- hg bookmark feature-a &&
- echo feature-a >content &&
- hg commit -m feature-a
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo origin/feature-a feature-a
-'
-
-test_expect_success 'update bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg bookmark devel
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet devel &&
- echo devel >content &&
- git commit -a -m devel &&
- git push --quiet
- ) &&
-
- check_bookmark hgrepo devel devel
-'
-
-test_expect_success 'new bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet -b feature-b &&
- echo feature-b >content &&
- git commit -a -m feature-b &&
- git push --quiet origin feature-b
- ) &&
-
- check_bookmark hgrepo feature-b feature-b
-'
-
-# cleanup previous stuff
-rm -rf hgrepo
-
-author_test () {
- echo $1 >>content &&
- hg commit -u "$2" -m "add $1" &&
- echo "$3" >>../expected
-}
-
-test_expect_success 'authors' '
- test_when_finished "rm -rf hgrepo gitrepo" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- touch content &&
- hg add content &&
-
- >../expected &&
- author_test alpha "" "H G Wells <wells@example.com>" &&
- author_test beta "beta" "beta <unknown>" &&
- author_test gamma "gamma <test@example.com> (comment)" "gamma <test@example.com>" &&
- author_test delta "<delta@example.com>" "Unknown <delta@example.com>" &&
- author_test epsilon "epsilon<test@example.com>" "epsilon <test@example.com>" &&
- author_test zeta "zeta <test@example.com" "zeta <test@example.com>" &&
- author_test eta " eta " "eta <unknown>" &&
- author_test theta "theta < test@example.com >" "theta <test@example.com>" &&
- author_test iota "iota >test@example.com>" "iota <test@example.com>" &&
- author_test kappa "kappa < test <at> example <dot> com>" "kappa <unknown>" &&
- author_test lambda "lambda@example.com" "Unknown <lambda@example.com>" &&
- author_test mu "mu.mu@example.com" "Unknown <mu.mu@example.com>"
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'strip' '
- test_when_finished "rm -rf hgrepo gitrepo" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- echo one >>content &&
- hg add content &&
- hg commit -m one &&
-
- echo two >>content &&
- hg commit -m two
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- hg strip 1 &&
-
- echo three >>content &&
- hg commit -m three &&
-
- echo four >>content &&
- hg commit -m four
- ) &&
-
- (
- cd gitrepo &&
- git fetch &&
- git log --format="%s" origin/master >../actual
- ) &&
-
- hg -R hgrepo log --template "{desc}\n" >expected &&
- test_cmp actual expected
-'
-
-test_expect_success 'remote push with master bookmark' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- hg bookmark master &&
- echo one >content &&
- hg commit -m one
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- echo two >content &&
- git commit -a -m two &&
- git push
- ) &&
-
- check_branch hgrepo default two
-'
-
-cat >expected <<\EOF
-changeset: 0:6e2126489d3d
-tag: tip
-user: A U Thor <author@example.com>
-date: Mon Jan 01 00:00:00 2007 +0230
-summary: one
-
-EOF
-
-test_expect_success 'remote push from master branch' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- hg init hgrepo &&
-
- (
- git init gitrepo &&
- cd gitrepo &&
- git remote add origin "hg::../hgrepo" &&
- echo one >content &&
- git add content &&
- git commit -a -m one &&
- git push origin master
- ) &&
-
- hg -R hgrepo log >actual &&
- cat actual &&
- test_cmp expected actual &&
-
- check_branch hgrepo default one
-'
-
-GIT_REMOTE_HG_TEST_REMOTE=1
-export GIT_REMOTE_HG_TEST_REMOTE
-
-test_expect_success 'remote cloning' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD zero
-'
-
-test_expect_success 'moving remote clone' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- mv gitrepo gitrepo2 &&
- cd gitrepo2 &&
- git fetch
- )
-'
-
-test_expect_success 'remote update bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg bookmark devel
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet devel &&
- echo devel >content &&
- git commit -a -m devel &&
- git push --quiet
- ) &&
-
- check_bookmark hgrepo devel devel
-'
-
-test_expect_success 'remote new bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet -b feature-b &&
- echo feature-b >content &&
- git commit -a -m feature-b &&
- git push --quiet origin feature-b
- ) &&
-
- check_bookmark hgrepo feature-b feature-b
-'
-
-test_expect_success 'remote push diverged' '
- test_when_finished "rm -rf gitrepo*" &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- hg checkout default &&
- echo bump >content &&
- hg commit -m bump
- ) &&
-
- (
- cd gitrepo &&
- echo diverge >content &&
- git commit -a -m diverged &&
- check_push 1 <<-\EOF
- master:non-fast-forward
- EOF
- ) &&
-
- check_branch hgrepo default bump
-'
-
-test_expect_success 'remote update bookmark diverge' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg checkout tip^ &&
- hg bookmark diverge
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- echo "bump bookmark" >content &&
- hg commit -m "bump bookmark"
- ) &&
-
- (
- cd gitrepo &&
- git checkout --quiet diverge &&
- echo diverge >content &&
- git commit -a -m diverge &&
- check_push 1 <<-\EOF
- diverge:fetch-first
- EOF
- ) &&
-
- check_bookmark hgrepo diverge "bump bookmark"
-'
-
-test_expect_success 'remote new bookmark multiple branch head' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet -b feature-c HEAD^ &&
- echo feature-c >content &&
- git commit -a -m feature-c &&
- git push --quiet origin feature-c
- ) &&
-
- check_bookmark hgrepo feature-c feature-c
-'
-
-# cleanup previous stuff
-rm -rf hgrepo
-
-test_expect_success 'fetch special filenames' '
- test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- echo test >> "æ rø" &&
- hg add "æ rø" &&
- echo test >> "ø~?" &&
- hg add "ø~?" &&
- hg commit -m add-utf-8 &&
- echo test >> "æ rø" &&
- hg commit -m test-utf-8 &&
- hg rm "ø~?" &&
- hg mv "æ rø" "ø~?" &&
- hg commit -m hg-mv-utf-8
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git -c core.quotepath=false ls-files > ../actual
- ) &&
- echo "ø~?" > expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'push special filenames' '
- test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" &&
-
- mkdir -p tmp && cd tmp &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- echo one >> content &&
- hg add content &&
- hg commit -m one
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
-
- echo test >> "æ rø" &&
- git add "æ rø" &&
- git commit -m utf-8 &&
-
- git push
- ) &&
-
- (cd hgrepo &&
- hg update &&
- hg manifest > ../actual
- ) &&
-
- printf "content\næ rø\n" > expected &&
- test_cmp expected actual
-'
-
-setup_big_push () {
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- hg bookmark bad_bmark1 &&
- echo one >content &&
- hg commit -m one &&
- hg bookmark bad_bmark2 &&
- hg bookmark good_bmark &&
- hg bookmark -i good_bmark &&
- hg -q branch good_branch &&
- echo "good branch" >content &&
- hg commit -m "good branch" &&
- hg -q branch bad_branch &&
- echo "bad branch" >content &&
- hg commit -m "bad branch"
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd gitrepo &&
- echo two >content &&
- git commit -q -a -m two &&
-
- git checkout -q good_bmark &&
- echo three >content &&
- git commit -q -a -m three &&
-
- git checkout -q bad_bmark1 &&
- git reset --hard HEAD^ &&
- echo four >content &&
- git commit -q -a -m four &&
-
- git checkout -q bad_bmark2 &&
- git reset --hard HEAD^ &&
- echo five >content &&
- git commit -q -a -m five &&
-
- git checkout -q -b new_bmark master &&
- echo six >content &&
- git commit -q -a -m six &&
-
- git checkout -q branches/good_branch &&
- echo seven >content &&
- git commit -q -a -m seven &&
- echo eight >content &&
- git commit -q -a -m eight &&
-
- git checkout -q branches/bad_branch &&
- git reset --hard HEAD^ &&
- echo nine >content &&
- git commit -q -a -m nine &&
-
- git checkout -q -b branches/new_branch master &&
- echo ten >content &&
- git commit -q -a -m ten
- )
-}
-
-test_expect_success 'remote big push' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- setup_big_push
-
- (
- cd gitrepo &&
-
- check_push 1 --all <<-\EOF
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- bad_bmark1:non-fast-forward
- bad_bmark2:non-fast-forward
- branches/bad_branch:non-fast-forward
- EOF
- ) &&
-
- check_branch hgrepo default one &&
- check_branch hgrepo good_branch "good branch" &&
- check_branch hgrepo bad_branch "bad branch" &&
- check_branch hgrepo new_branch '' &&
- check_bookmark hgrepo good_bmark one &&
- check_bookmark hgrepo bad_bmark1 one &&
- check_bookmark hgrepo bad_bmark2 one &&
- check_bookmark hgrepo new_bmark ''
-'
-
-test_expect_success 'remote big push fetch first' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- hg bookmark bad_bmark &&
- hg bookmark good_bmark &&
- hg bookmark -i good_bmark &&
- hg -q branch good_branch &&
- echo "good branch" >content &&
- hg commit -m "good branch" &&
- hg -q branch bad_branch &&
- echo "bad branch" >content &&
- hg commit -m "bad branch"
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- hg bookmark -f bad_bmark &&
- echo update_bmark >content &&
- hg commit -m "update bmark"
- ) &&
-
- (
- cd gitrepo &&
- echo two >content &&
- git commit -q -a -m two &&
-
- git checkout -q good_bmark &&
- echo three >content &&
- git commit -q -a -m three &&
-
- git checkout -q bad_bmark &&
- echo four >content &&
- git commit -q -a -m four &&
-
- git checkout -q branches/bad_branch &&
- echo five >content &&
- git commit -q -a -m five &&
-
- check_push 1 --all <<-\EOF &&
- master
- good_bmark
- bad_bmark:fetch-first
- branches/bad_branch:festch-first
- EOF
-
- git fetch &&
-
- check_push 1 --all <<-\EOF
- master
- good_bmark
- bad_bmark:non-fast-forward
- branches/bad_branch:non-fast-forward
- EOF
- )
-'
-
-test_expect_success 'remote big push force' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- setup_big_push
-
- (
- cd gitrepo &&
-
- check_push 0 --force --all <<-\EOF
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- bad_bmark1:forced-update
- bad_bmark2:forced-update
- branches/bad_branch:forced-update
- EOF
- ) &&
-
- check_branch hgrepo default six &&
- check_branch hgrepo good_branch eight &&
- check_branch hgrepo bad_branch nine &&
- check_branch hgrepo new_branch ten &&
- check_bookmark hgrepo good_bmark three &&
- check_bookmark hgrepo bad_bmark1 four &&
- check_bookmark hgrepo bad_bmark2 five &&
- check_bookmark hgrepo new_bmark six
-'
-
-test_expect_success 'remote big push dry-run' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- setup_big_push
-
- (
- cd gitrepo &&
-
- check_push 1 --dry-run --all <<-\EOF &&
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- bad_bmark1:non-fast-forward
- bad_bmark2:non-fast-forward
- branches/bad_branch:non-fast-forward
- EOF
-
- check_push 0 --dry-run master good_bmark new_bmark branches/good_branch branches/new_branch <<-\EOF
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- EOF
- ) &&
-
- check_branch hgrepo default one &&
- check_branch hgrepo good_branch "good branch" &&
- check_branch hgrepo bad_branch "bad branch" &&
- check_branch hgrepo new_branch '' &&
- check_bookmark hgrepo good_bmark one &&
- check_bookmark hgrepo bad_bmark1 one &&
- check_bookmark hgrepo bad_bmark2 one &&
- check_bookmark hgrepo new_bmark ''
-'
-
-test_expect_success 'remote double failed push' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- echo one >content &&
- hg commit -m one
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git reset --hard HEAD^ &&
- echo two >content &&
- git commit -a -m two &&
- test_expect_code 1 git push &&
- test_expect_code 1 git push
- )
-'
-
-test_expect_success 'clone remote with master null bookmark, then push to the bookmark' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- hg init hgrepo &&
- (
- cd hgrepo &&
- echo a >a &&
- hg add a &&
- hg commit -m a &&
- hg bookmark -r null master
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD a &&
- (
- cd gitrepo &&
- git checkout --quiet -b master &&
- echo b >b &&
- git add b &&
- git commit -m b &&
- git push origin master
- )
-'
-
-test_expect_success 'clone remote with default null bookmark, then push to the bookmark' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- hg init hgrepo &&
- (
- cd hgrepo &&
- echo a >a &&
- hg add a &&
- hg commit -m a &&
- hg bookmark -r null -f default
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD a &&
- (
- cd gitrepo &&
- git checkout --quiet -b default &&
- echo b >b &&
- git add b &&
- git commit -m b &&
- git push origin default
- )
-'
-
-test_expect_success 'clone remote with generic null bookmark, then push to the bookmark' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- hg init hgrepo &&
- (
- cd hgrepo &&
- echo a >a &&
- hg add a &&
- hg commit -m a &&
- hg bookmark -r null bmark
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD a &&
- (
- cd gitrepo &&
- git checkout --quiet -b bmark &&
- git remote -v &&
- echo b >b &&
- git add b &&
- git commit -m b &&
- git push origin bmark
- )
-'
-
-test_done
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 66ce4b0..b22b710 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -76,7 +76,7 @@ test_expect_success 'add sub1' '
# Save this hash for testing later.
-subdir_hash=`git rev-parse HEAD`
+subdir_hash=$(git rev-parse HEAD)
test_expect_success 'add sub2' '
create sub2 &&
diff --git a/contrib/svn-fe/svnrdump_sim.py b/contrib/svn-fe/svnrdump_sim.py
index 4e78a1c..11ac6f6 100755
--- a/contrib/svn-fe/svnrdump_sim.py
+++ b/contrib/svn-fe/svnrdump_sim.py
@@ -5,53 +5,64 @@ of the specified revision range.
To simulate incremental imports the environment variable SVNRMAX can be set
to the highest revision that should be available.
"""
-import sys, os
+import sys
+import os
if sys.hexversion < 0x02040000:
- # The limiter is the ValueError() calls. This may be too conservative
- sys.stderr.write("svnrdump-sim.py: requires Python 2.4 or later.\n")
- sys.exit(1)
+ # The limiter is the ValueError() calls. This may be too conservative
+ sys.stderr.write("svnrdump-sim.py: requires Python 2.4 or later.\n")
+ sys.exit(1)
+
def getrevlimit():
- var = 'SVNRMAX'
- if var in os.environ:
- return os.environ[var]
- return None
+ var = 'SVNRMAX'
+ if var in os.environ:
+ return os.environ[var]
+ return None
+
def writedump(url, lower, upper):
- if url.startswith('sim://'):
- filename = url[6:]
- if filename[-1] == '/': filename = filename[:-1] #remove terminating slash
- else:
- raise ValueError('sim:// url required')
- f = open(filename, 'r');
- state = 'header'
- wroterev = False
- while(True):
- l = f.readline()
- if l == '': break
- if state == 'header' and l.startswith('Revision-number: '):
- state = 'prefix'
- if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
- state = 'selection'
- if not upper == 'HEAD' and state == 'selection' and l == 'Revision-number: %s\n' % upper:
- break;
+ if url.startswith('sim://'):
+ filename = url[6:]
+ if filename[-1] == '/':
+ filename = filename[:-1] # remove terminating slash
+ else:
+ raise ValueError('sim:// url required')
+ f = open(filename, 'r')
+ state = 'header'
+ wroterev = False
+ while(True):
+ l = f.readline()
+ if l == '':
+ break
+ if state == 'header' and l.startswith('Revision-number: '):
+ state = 'prefix'
+ if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
+ state = 'selection'
+ if not upper == 'HEAD' and state == 'selection' and \
+ l == 'Revision-number: %s\n' % upper:
+ break
- if state == 'header' or state == 'selection':
- if state == 'selection': wroterev = True
- sys.stdout.write(l)
- return wroterev
+ if state == 'header' or state == 'selection':
+ if state == 'selection':
+ wroterev = True
+ sys.stdout.write(l)
+ return wroterev
if __name__ == "__main__":
- if not (len(sys.argv) in (3, 4, 5)):
- print("usage: %s dump URL -rLOWER:UPPER")
- sys.exit(1)
- if not sys.argv[1] == 'dump': raise NotImplementedError('only "dump" is suppported.')
- url = sys.argv[2]
- r = ('0', 'HEAD')
- if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
- r = sys.argv[3][2:].lstrip().split(':')
- if not getrevlimit() is None: r[1] = getrevlimit()
- if writedump(url, r[0], r[1]): ret = 0
- else: ret = 1
- sys.exit(ret)
+ if not (len(sys.argv) in (3, 4, 5)):
+ print("usage: %s dump URL -rLOWER:UPPER")
+ sys.exit(1)
+ if not sys.argv[1] == 'dump':
+ raise NotImplementedError('only "dump" is suppported.')
+ url = sys.argv[2]
+ r = ('0', 'HEAD')
+ if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
+ r = sys.argv[3][2:].lstrip().split(':')
+ if not getrevlimit() is None:
+ r[1] = getrevlimit()
+ if writedump(url, r[0], r[1]):
+ ret = 0
+ else:
+ ret = 1
+ sys.exit(ret)
diff --git a/contrib/thunderbird-patch-inline/appp.sh b/contrib/thunderbird-patch-inline/appp.sh
index 5eb4a51..8dc73ec 100755
--- a/contrib/thunderbird-patch-inline/appp.sh
+++ b/contrib/thunderbird-patch-inline/appp.sh
@@ -10,7 +10,7 @@ CONFFILE=~/.appprc
SEP="-=-=-=-=-=-=-=-=-=# Don't remove this line #=-=-=-=-=-=-=-=-=-"
if [ -e "$CONFFILE" ] ; then
- LAST_DIR=`grep -m 1 "^LAST_DIR=" "${CONFFILE}"|sed -e 's/^LAST_DIR=//'`
+ LAST_DIR=$(grep -m 1 "^LAST_DIR=" "${CONFFILE}"|sed -e 's/^LAST_DIR=//')
cd "${LAST_DIR}"
else
cd > /dev/null
@@ -25,11 +25,11 @@ fi
cd - > /dev/null
-SUBJECT=`sed -n -e '/^Subject: /p' "${PATCH}"`
-HEADERS=`sed -e '/^'"${SEP}"'$/,$d' $1`
-BODY=`sed -e "1,/${SEP}/d" $1`
-CMT_MSG=`sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}"`
-DIFF=`sed -e '1,/^---$/d' "${PATCH}"`
+SUBJECT=$(sed -n -e '/^Subject: /p' "${PATCH}")
+HEADERS=$(sed -e '/^'"${SEP}"'$/,$d' $1)
+BODY=$(sed -e "1,/${SEP}/d" $1)
+CMT_MSG=$(sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}")
+DIFF=$(sed -e '1,/^---$/d' "${PATCH}")
CCS=`echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \
-e 's/^Signed-off-by: \(.*\)/\1,/gp'`
@@ -48,7 +48,7 @@ if [ "x${BODY}x" != "xx" ] ; then
fi
echo "$DIFF" >> $1
-LAST_DIR=`dirname "${PATCH}"`
+LAST_DIR=$(dirname "${PATCH}")
grep -v "^LAST_DIR=" "${CONFFILE}" > "${CONFFILE}_"
echo "LAST_DIR=${LAST_DIR}" >> "${CONFFILE}_"
diff --git a/contrib/vim/README b/contrib/vim/README
deleted file mode 100644
index 8f16d06..0000000
--- a/contrib/vim/README
+++ /dev/null
@@ -1,22 +0,0 @@
-Syntax highlighting for git commit messages, config files, etc. is
-included with the vim distribution as of vim 7.2, and should work
-automatically.
-
-If you have an older version of vim, you can get the latest syntax
-files from the vim project:
-
- http://ftp.vim.org/pub/vim/runtime/syntax/git.vim
- http://ftp.vim.org/pub/vim/runtime/syntax/gitcommit.vim
- http://ftp.vim.org/pub/vim/runtime/syntax/gitconfig.vim
- http://ftp.vim.org/pub/vim/runtime/syntax/gitrebase.vim
- http://ftp.vim.org/pub/vim/runtime/syntax/gitsendemail.vim
-
-These files are also available via FTP at the same location.
-
-To install:
-
- 1. Copy these files to vim's syntax directory $HOME/.vim/syntax
- 2. To auto-detect the editing of various git-related filetypes:
-
- $ curl http://ftp.vim.org/pub/vim/runtime/filetype.vim |
- sed -ne '/^" Git$/, /^$/ p' >>$HOME/.vim/filetype.vim
diff --git a/diff.c b/diff.c
index f72769a..f66716f 100644
--- a/diff.c
+++ b/diff.c
@@ -2880,6 +2880,16 @@ static struct diff_tempfile *prepare_temp_file(const char *name,
return temp;
}
+static void add_external_diff_name(struct argv_array *argv,
+ const char *name,
+ struct diff_filespec *df)
+{
+ struct diff_tempfile *temp = prepare_temp_file(name, df);
+ argv_array_push(argv, temp->name);
+ argv_array_push(argv, temp->hex);
+ argv_array_push(argv, temp->mode);
+}
+
/* An external diff command takes:
*
* diff-cmd name infile1 infile1-sha1 infile1-mode \
@@ -2896,48 +2906,32 @@ static void run_external_diff(const char *pgm,
struct diff_options *o)
{
struct argv_array argv = ARGV_ARRAY_INIT;
- int retval;
+ struct argv_array env = ARGV_ARRAY_INIT;
struct diff_queue_struct *q = &diff_queued_diff;
- const char *env[3] = { NULL };
- char env_counter[50];
- char env_total[50];
+
+ argv_array_push(&argv, pgm);
+ argv_array_push(&argv, name);
if (one && two) {
- struct diff_tempfile *temp_one, *temp_two;
- const char *othername = (other ? other : name);
- temp_one = prepare_temp_file(name, one);
- temp_two = prepare_temp_file(othername, two);
- argv_array_push(&argv, pgm);
- argv_array_push(&argv, name);
- argv_array_push(&argv, temp_one->name);
- argv_array_push(&argv, temp_one->hex);
- argv_array_push(&argv, temp_one->mode);
- argv_array_push(&argv, temp_two->name);
- argv_array_push(&argv, temp_two->hex);
- argv_array_push(&argv, temp_two->mode);
- if (other) {
+ add_external_diff_name(&argv, name, one);
+ if (!other)
+ add_external_diff_name(&argv, name, two);
+ else {
+ add_external_diff_name(&argv, other, two);
argv_array_push(&argv, other);
argv_array_push(&argv, xfrm_msg);
}
- } else {
- argv_array_push(&argv, pgm);
- argv_array_push(&argv, name);
}
- fflush(NULL);
- env[0] = env_counter;
- snprintf(env_counter, sizeof(env_counter), "GIT_DIFF_PATH_COUNTER=%d",
- ++o->diff_path_counter);
- env[1] = env_total;
- snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);
+ argv_array_pushf(&env, "GIT_DIFF_PATH_COUNTER=%d", ++o->diff_path_counter);
+ argv_array_pushf(&env, "GIT_DIFF_PATH_TOTAL=%d", q->nr);
+
+ if (run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env.argv))
+ die(_("external diff died, stopping at %s"), name);
- retval = run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env);
remove_tempfile();
argv_array_clear(&argv);
- if (retval) {
- fprintf(stderr, "external diff died, stopping at %s.\n", name);
- exit(1);
- }
+ argv_array_clear(&env);
}
static int similarity_index(struct diff_filepair *p)
@@ -3205,6 +3199,7 @@ void diff_setup(struct diff_options *options)
options->context = diff_context_default;
DIFF_OPT_SET(options, RENAME_EMPTY);
+ /* pathchange left =NULL by default */
options->change = diff_change;
options->add_remove = diff_addremove;
options->use_color = diff_use_color_default;
@@ -4749,6 +4744,7 @@ void diffcore_fix_diff_index(struct diff_options *options)
void diffcore_std(struct diff_options *options)
{
+ /* NOTE please keep the following in sync with diff_tree_combined() */
if (options->skip_stat_unmatch)
diffcore_skip_stat_unmatch(options);
if (!options->found_follow) {
diff --git a/diff.h b/diff.h
index a24a767..b4a624d 100644
--- a/diff.h
+++ b/diff.h
@@ -15,6 +15,10 @@ struct diff_filespec;
struct userdiff_driver;
struct sha1_array;
struct commit;
+struct combine_diff_path;
+
+typedef int (*pathchange_fn_t)(struct diff_options *options,
+ struct combine_diff_path *path);
typedef void (*change_fn_t)(struct diff_options *options,
unsigned old_mode, unsigned new_mode,
@@ -157,6 +161,7 @@ struct diff_options {
int close_file;
struct pathspec pathspec;
+ pathchange_fn_t pathchange;
change_fn_t change;
add_remove_fn_t add_remove;
diff_format_fn_t format_callback;
@@ -189,8 +194,10 @@ const char *diff_line_prefix(struct diff_options *);
extern const char mime_boundary_leader[];
-extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
- const char *base, struct diff_options *opt);
+extern struct combine_diff_path *diff_tree_paths(
+ struct combine_diff_path *p, const unsigned char *sha1,
+ const unsigned char **parent_sha1, int nparent,
+ struct strbuf *base, struct diff_options *opt);
extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new,
const char *base, struct diff_options *opt);
extern int diff_root_tree_sha1(const unsigned char *new, const char *base,
diff --git a/environment.c b/environment.c
index 5c4815d..37354c8 100644
--- a/environment.c
+++ b/environment.c
@@ -37,7 +37,7 @@ int core_compression_seen;
int fsync_object_files;
size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
-size_t delta_base_cache_limit = 16 * 1024 * 1024;
+size_t delta_base_cache_limit = 96 * 1024 * 1024;
unsigned long big_file_threshold = 512 * 1024 * 1024;
const char *pager_program;
int pager_use_color = 1;
diff --git a/git-compat-util.h b/git-compat-util.h
index f6d3a46..7849d31 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -330,8 +330,12 @@ extern void warning(const char *err, ...) __attribute__((format (printf, 1, 2)))
* trying to help gcc, anyway, it's OK; other compilers will fall back to
* using the function as usual.
*/
-#if defined(__GNUC__) && ! defined(__clang__)
-#define error(...) (error(__VA_ARGS__), -1)
+#if defined(__GNUC__)
+static inline int const_error(void)
+{
+ return -1;
+}
+#define error(...) (error(__VA_ARGS__), const_error())
#endif
extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
@@ -521,6 +525,14 @@ extern void release_pack_memory(size_t);
typedef void (*try_to_free_t)(size_t);
extern try_to_free_t set_try_to_free_routine(try_to_free_t);
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+# define xalloca(size) (alloca(size))
+# define xalloca_free(p) do {} while (0)
+#else
+# define xalloca(size) (xmalloc(size))
+# define xalloca_free(p) (free(p))
+#endif
extern char *xstrdup(const char *str);
extern void *xmalloc(size_t size);
extern void *xmallocz(size_t size);
@@ -531,6 +543,7 @@ extern void *xcalloc(size_t nmemb, size_t size);
extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
extern ssize_t xread(int fd, void *buf, size_t len);
extern ssize_t xwrite(int fd, const void *buf, size_t len);
+extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
extern int xdup(int fd);
extern FILE *xfdopen(int fd, const char *mode);
extern int xmkstemp(char *template);
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index cf2209b..6a8907e 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -1283,7 +1283,7 @@ load_config 0
apply_config
# v1.7.0 introduced --show-toplevel to return the canonical work-tree
-if {[package vsatisfies $_git_version 1.7.0]} {
+if {[package vsatisfies $_git_version 1.7.0-]} {
if { [is_Cygwin] } {
catch {set _gitworktree [exec cygpath --windows [git rev-parse --show-toplevel]]}
} else {
@@ -1539,7 +1539,7 @@ proc rescan_stage2 {fd after} {
close $fd
}
- if {[package vsatisfies $::_git_version 1.6.3]} {
+ if {[package vsatisfies $::_git_version 1.6.3-]} {
set ls_others [list --exclude-standard]
} else {
set ls_others [list --exclude-per-directory=.gitignore]
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 332528f..d08dc92 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -277,7 +277,7 @@ merge_file () {
echo "Normal merge conflict for '$MERGED':"
describe_file "$local_mode" "local" "$LOCAL"
describe_file "$remote_mode" "remote" "$REMOTE"
- if "$prompt" = true
+ if test "$guessed_merge_tool" = true || test "$prompt" = true
then
printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
read ans || return 1
@@ -315,7 +315,8 @@ merge_file () {
return 0
}
-prompt=$(git config --bool mergetool.prompt || echo true)
+prompt=$(git config --bool mergetool.prompt)
+guessed_merge_tool=false
while test $# != 0
do
@@ -373,7 +374,14 @@ prompt_after_failed_merge () {
if test -z "$merge_tool"
then
- merge_tool=$(get_merge_tool "$merge_tool") || exit
+ # Check if a merge tool has been configured
+ merge_tool=$(get_configured_merge_tool)
+ # Try to guess an appropriate merge tool if no tool has been set.
+ if test -z "$merge_tool"
+ then
+ merge_tool=$(guess_merge_tool) || exit
+ guessed_merge_tool=true
+ fi
fi
merge_keep_backup="$(git config --bool mergetool.keepBackup || echo true)"
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
diff --git a/git-p4.py b/git-p4.py
index 8d11b25..773cafc 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -1311,7 +1311,7 @@ class P4Submit(Command, P4UserMap):
else:
die("unknown modifier %s for %s" % (modifier, path))
- diffcmd = "git diff-tree -p \"%s\"" % (id)
+ diffcmd = "git diff-tree --full-index -p \"%s\"" % (id)
patchcmd = diffcmd + " | git apply "
tryPatchCmd = patchcmd + "--check -"
applyPatchCmd = patchcmd + "--check --apply -"
diff --git a/git-pull.sh b/git-pull.sh
index 6cd8ebc..cfc589d 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -108,7 +108,7 @@ do
-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
case "$#,$1" in
*,*=*)
- strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
+ strategy=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
1,*)
usage ;;
*)
diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh
index 71429fd..6d77b3c 100644
--- a/git-rebase--merge.sh
+++ b/git-rebase--merge.sh
@@ -24,7 +24,7 @@ continue_merge () {
die "$resolvemsg"
fi
- cmt=`cat "$state_dir/current"`
+ cmt=$(cat "$state_dir/current")
if ! git diff-index --quiet --ignore-submodules HEAD --
then
if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} --no-verify -C "$cmt"
@@ -143,7 +143,7 @@ echo "$onto_name" > "$state_dir/onto_name"
write_basic_state
msgnum=0
-for cmt in `git rev-list --reverse --no-merges "$revisions"`
+for cmt in $(git rev-list --reverse --no-merges "$revisions")
do
msgnum=$(($msgnum + 1))
echo "$cmt" > "$state_dir/cmt.$msgnum"
diff --git a/git-rebase.sh b/git-rebase.sh
index 4543815..5c7a0a1 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -457,8 +457,8 @@ then
else
if test -z "$onto"
then
- empty_tree=`git hash-object -t tree /dev/null`
- onto=`git commit-tree $empty_tree </dev/null`
+ empty_tree=$(git hash-object -t tree /dev/null)
+ onto=$(git commit-tree $empty_tree </dev/null)
squash_onto="$onto"
fi
unset upstream_name
@@ -516,10 +516,10 @@ case "$#" in
;;
0)
# Do not need to switch branches, we are already on it.
- if branch_name=`git symbolic-ref -q HEAD`
+ if branch_name=$(git symbolic-ref -q HEAD)
then
head_name=$branch_name
- branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
+ branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
else
head_name="detached HEAD"
branch_name=HEAD ;# detached
diff --git a/git-request-pull.sh b/git-request-pull.sh
index 5c15997..d5500fd 100755
--- a/git-request-pull.sh
+++ b/git-request-pull.sh
@@ -119,6 +119,12 @@ then
status=1
fi
+# Special case: turn "for_linus" to "tags/for_linus" when it is correct
+if test "$ref" = "refs/tags/$pretty_remote"
+then
+ pretty_remote=tags/$pretty_remote
+fi
+
url=$(git ls-remote --get-url "$url")
git show -s --format='The following changes since commit %H:
diff --git a/git-send-email.perl b/git-send-email.perl
index fdb0029..abd62b4 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -1113,6 +1113,18 @@ sub ssl_verify_params {
}
}
+sub file_name_is_absolute {
+ my ($path) = @_;
+
+ # msys does not grok DOS drive-prefixes
+ if ($^O eq 'msys') {
+ return ($path =~ m#^/# || $path =~ m#^[a-zA-Z]\:#)
+ }
+
+ require File::Spec::Functions;
+ return File::Spec::Functions::file_name_is_absolute($path);
+}
+
# Returns 1 if the message was sent, and 0 otherwise.
# In actuality, the whole program dies when there
# is an error sending a message.
@@ -1197,7 +1209,7 @@ X-Mailer: git-send-email $gitversion
if ($dry_run) {
# We don't want to send the email.
- } elsif ($smtp_server =~ m#^/#) {
+ } elsif (file_name_is_absolute($smtp_server)) {
my $pid = open my $sm, '|-';
defined $pid or die $!;
if (!$pid) {
@@ -1271,7 +1283,7 @@ X-Mailer: git-send-email $gitversion
printf (($dry_run ? "Dry-" : "")."Sent %s\n", $subject);
} else {
print (($dry_run ? "Dry-" : "")."OK. Log says:\n");
- if ($smtp_server !~ m#^/#) {
+ if (!file_name_is_absolute($smtp_server)) {
print "Server: $smtp_server\n";
print "MAIL FROM:<$raw_from>\n";
foreach my $entry (@recipients) {
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index 5f28b32..9447980 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -160,7 +160,7 @@ git_pager() {
else
GIT_PAGER=cat
fi
- : ${LESS=-FRSX}
+ : ${LESS=-FRX}
: ${LV=-c}
export LESS LV
diff --git a/git-stash.sh b/git-stash.sh
index 4798bcf..af549c7 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -13,7 +13,7 @@ USAGE="list [<options>]
SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
-START_DIR=`pwd`
+START_DIR=$(pwd)
. git-sh-setup
. git-sh-i18n
require_work_tree
diff --git a/git-submodule.sh b/git-submodule.sh
index b55d83a..e146b83 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -291,9 +291,6 @@ module_clone()
# resolve any symlinks that might be present in $PWD
a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
b=$(cd_to_toplevel && cd "$sm_path" && pwd)/
- # normalize Windows-style absolute paths to POSIX-style absolute paths
- case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
- case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
# Remove all common leading directories after a sanity check
if test "${a#$b}" != "$a" || test "${b#$a}" != "$b"; then
die "$(eval_gettext "Gitdir '\$a' is part of the submodule path '\$b' or vice versa")"
diff --git a/git-web--browse.sh b/git-web--browse.sh
index ebdfba6..ae15253 100755
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -59,7 +59,7 @@ do
-b|--browser*|-t|--tool*)
case "$#,$1" in
*,*=*)
- browser=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+ browser=$(expr "z$1" : 'z-[^=]*=\(.*\)')
;;
1,*)
usage ;;
@@ -71,7 +71,7 @@ do
-c|--config*)
case "$#,$1" in
*,*=*)
- conf=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+ conf=$(expr "z$1" : 'z-[^=]*=\(.*\)')
;;
1,*)
usage ;;
@@ -100,7 +100,7 @@ then
for opt in "$conf" "web.browser"
do
test -z "$opt" && continue
- browser="`git config $opt`"
+ browser="$(git config $opt)"
test -z "$browser" || break
done
if test -n "$browser" && ! valid_tool "$browser"; then
diff --git a/git.c b/git.c
index 9efd1a3..7780572 100644
--- a/git.c
+++ b/git.c
@@ -290,7 +290,7 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
if (!help) {
if (p->option & RUN_SETUP)
prefix = setup_git_directory();
- if (p->option & RUN_SETUP_GENTLY) {
+ else if (p->option & RUN_SETUP_GENTLY) {
int nongit_ok;
prefix = setup_git_directory_gently(&nongit_ok);
}
diff --git a/grep.c b/grep.c
index 4aef0a6..99217dc 100644
--- a/grep.c
+++ b/grep.c
@@ -86,6 +86,11 @@ int grep_config(const char *var, const char *value, void *cb)
return 0;
}
+ if (!strcmp(var, "grep.fullname")) {
+ opt->relative = !git_config_bool(var, value);
+ return 0;
+ }
+
if (!strcmp(var, "color.grep"))
opt->color = git_config_colorbool(var, value);
else if (!strcmp(var, "color.grep.context"))
diff --git a/imap-send.c b/imap-send.c
index 0bc6f7f..5c4f336 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -23,9 +23,9 @@
*/
#include "cache.h"
+#include "credential.h"
#include "exec_cmd.h"
#include "run-command.h"
-#include "prompt.h"
#ifdef NO_OPENSSL
typedef void *SSL;
#endif
@@ -946,6 +946,7 @@ static int auth_cram_md5(struct imap_store *ctx, struct imap_cmd *cmd, const cha
static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
{
+ struct credential cred = CREDENTIAL_INIT;
struct imap_store *ctx;
struct imap *imap;
char *arg, *rsp;
@@ -1096,25 +1097,23 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
}
#endif
imap_info("Logging in...\n");
- if (!srvc->user) {
- fprintf(stderr, "Skipping server %s, no user\n", srvc->host);
- goto bail;
- }
- if (!srvc->pass) {
- struct strbuf prompt = STRBUF_INIT;
- strbuf_addf(&prompt, "Password (%s@%s): ", srvc->user, srvc->host);
- arg = git_getpass(prompt.buf);
- strbuf_release(&prompt);
- if (!*arg) {
- fprintf(stderr, "Skipping account %s@%s, no password\n", srvc->user, srvc->host);
- goto bail;
- }
- /*
- * getpass() returns a pointer to a static buffer. make a copy
- * for long term storage.
- */
- srvc->pass = xstrdup(arg);
+ if (!srvc->user || !srvc->pass) {
+ cred.protocol = xstrdup(srvc->use_ssl ? "imaps" : "imap");
+ cred.host = xstrdup(srvc->host);
+
+ if (srvc->user)
+ cred.username = xstrdup(srvc->user);
+ if (srvc->pass)
+ cred.password = xstrdup(srvc->pass);
+
+ credential_fill(&cred);
+
+ if (!srvc->user)
+ srvc->user = xstrdup(cred.username);
+ if (!srvc->pass)
+ srvc->pass = xstrdup(cred.password);
}
+
if (CAP(NOLOGIN)) {
fprintf(stderr, "Skipping account %s@%s, server forbids LOGIN\n", srvc->user, srvc->host);
goto bail;
@@ -1153,10 +1152,18 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
}
} /* !preauth */
+ if (cred.username)
+ credential_approve(&cred);
+ credential_clear(&cred);
+
ctx->prefix = "";
return ctx;
bail:
+ if (cred.username)
+ credential_reject(&cred);
+ credential_clear(&cred);
+
imap_close_store(ctx);
return NULL;
}
diff --git a/merge-recursive.c b/merge-recursive.c
index 4177092..cab16fa 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -589,6 +589,12 @@ static int remove_file(struct merge_options *o, int clean,
return -1;
}
if (update_working_directory) {
+ if (ignore_case) {
+ struct cache_entry *ce;
+ ce = cache_file_exists(path, strlen(path), ignore_case);
+ if (ce && ce_stage(ce) == 0)
+ return 0;
+ }
if (remove_path(path))
return -1;
}
diff --git a/mergetools/gvimdiff3 b/mergetools/gvimdiff3
new file mode 100644
index 0000000..04a5bb0
--- /dev/null
+++ b/mergetools/gvimdiff3
@@ -0,0 +1 @@
+. "$MERGE_TOOLS_DIR/vimdiff"
diff --git a/mergetools/vimdiff b/mergetools/vimdiff
index 39d0327..1ddfbfc 100644
--- a/mergetools/vimdiff
+++ b/mergetools/vimdiff
@@ -20,16 +20,26 @@ merge_cmd () {
"$merge_tool_path" -f -d -c 'wincmd l' \
"$LOCAL" "$MERGED" "$REMOTE"
;;
+ gvimdiff3|vimdiff3)
+ if $base_present
+ then
+ "$merge_tool_path" -f -d -c 'hid | hid | hid' \
+ "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
+ else
+ "$merge_tool_path" -f -d -c 'hid | hid' \
+ "$LOCAL" "$REMOTE" "$MERGED"
+ fi
+ ;;
esac
check_unchanged
}
translate_merge_tool_path() {
case "$1" in
- gvimdiff|gvimdiff2)
+ gvimdiff|gvimdiff2|gvimdiff3)
echo gvim
;;
- vimdiff|vimdiff2)
+ vimdiff|vimdiff2|vimdiff3)
echo vim
;;
esac
diff --git a/mergetools/vimdiff3 b/mergetools/vimdiff3
new file mode 100644
index 0000000..04a5bb0
--- /dev/null
+++ b/mergetools/vimdiff3
@@ -0,0 +1 @@
+. "$MERGE_TOOLS_DIR/vimdiff"
diff --git a/notes-cache.c b/notes-cache.c
index eabe4a0..97dfd63 100644
--- a/notes-cache.c
+++ b/notes-cache.c
@@ -62,7 +62,7 @@ int notes_cache_write(struct notes_cache *c)
if (commit_tree(&msg, tree_sha1, NULL, commit_sha1, NULL, NULL) < 0)
return -1;
if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL,
- 0, QUIET_ON_ERR) < 0)
+ 0, UPDATE_REFS_QUIET_ON_ERR) < 0)
return -1;
return 0;
diff --git a/notes-utils.c b/notes-utils.c
index 4aa7023..a0b1d7b 100644
--- a/notes-utils.c
+++ b/notes-utils.c
@@ -48,7 +48,8 @@ void commit_notes(struct notes_tree *t, const char *msg)
create_notes_commit(t, NULL, &buf, commit_sha1);
strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
- update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);
+ update_ref(buf.buf, t->ref, commit_sha1, NULL, 0,
+ UPDATE_REFS_DIE_ON_ERR);
strbuf_release(&buf);
}
diff --git a/pager.c b/pager.c
index 0cc75a8..8b5cbc5 100644
--- a/pager.c
+++ b/pager.c
@@ -64,7 +64,7 @@ void setup_pager(void)
{
const char *pager = git_pager(isatty(1));
- if (!pager || pager_in_use())
+ if (!pager)
return;
/*
@@ -85,7 +85,7 @@ void setup_pager(void)
int i = 0;
if (!getenv("LESS"))
- env[i++] = "LESS=FRSX";
+ env[i++] = "LESS=FRX";
if (!getenv("LV"))
env[i++] = "LV=-c";
env[i] = NULL;
diff --git a/parse-options.h b/parse-options.h
index 3189676..7940bc7 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -176,8 +176,8 @@ extern NORETURN void usage_msg_opt(const char *msg,
extern int optbug(const struct option *opt, const char *reason);
extern int opterror(const struct option *opt, const char *reason, int flags);
-#if defined(__GNUC__) && ! defined(__clang__)
-#define opterror(o,r,f) (opterror((o),(r),(f)), -1)
+#if defined(__GNUC__)
+#define opterror(o,r,f) (opterror((o),(r),(f)), const_error())
#endif
/*----- incremental advanced APIs -----*/
diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm
index a59564f..09cff13 100644
--- a/perl/Git/SVN.pm
+++ b/perl/Git/SVN.pm
@@ -1321,7 +1321,7 @@ sub get_untracked {
sub parse_svn_date {
my $date = shift || return '+0000 1970-01-01 00:00:00';
my ($Y,$m,$d,$H,$M,$S) = ($date =~ /^(\d{4})\-(\d\d)\-(\d\d)T
- (\d\d)\:(\d\d)\:(\d\d)\.\d*Z$/x) or
+ (\d\d?)\:(\d\d)\:(\d\d)\.\d*Z$/x) or
croak "Unable to parse date: $date\n";
my $parsed_date; # Set next.
diff --git a/perl/Git/SVN/Log.pm b/perl/Git/SVN/Log.pm
index 34f2869..6641053 100644
--- a/perl/Git/SVN/Log.pm
+++ b/perl/Git/SVN/Log.pm
@@ -116,7 +116,7 @@ sub run_pager {
return;
}
open STDIN, '<&', $rfd or fatal "Can't redirect stdin: $!";
- $ENV{LESS} ||= 'FRSX';
+ $ENV{LESS} ||= 'FRX';
$ENV{LV} ||= '-c';
exec $pager or fatal "Can't run pager: $! ($pager)";
}
diff --git a/po/bg.po b/po/bg.po
index fb450b2..e862e10 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -14,6 +14,36 @@
# rebase пребазирам
# force (push) принудително изтласквам
# stash/index индекс
+# squash commits смачкване на подавания
+# root commit начално подаване
+# fixup вкарвам подаване в предното без следа
+# remote-tracking branch следящ клон
+# git bundle архив на git
+# bisect двоично търсене
+# am прилагам поредица от кръпки
+# working directory/tree — винаги работно дърво, git следи цялото дърво, а не директории
+# switch to branch прехвърлям се/преминавам към клон
+# sparse entry частично изтеглена директория/път
+# revision range диапазон на версиите
+# cover letter придружаващо писмо
+# reference repository еталонно хранилище
+# grafted repository хранилище с присаждане
+# thin pack съкратен пакет
+# stat (a file) получавам информация чрез „stat“ (за файл)
+# mixed reset смесено зануляване (индекса и указателя „HEAD“, без работното дърво)
+# soft reset меко зануляване (само указателя „HEAD“, без индекса и работното дърво)
+# hard reset пълно зануляване (указателя „HEAD“, индекса и работното дърво)
+# merge reset слято зануляване (целия индекс и отчасти работното дърво — без файловете с промени между работното дърво и индекса)
+# keep reset запазващо зануляване (отчасти индекса и работното дърво — файловете с промени от подаването и „HEAD“)
+# commit-ish указател към подаване
+# sequence последователност/поредица
+# whitespace symbol знаци за интервали
+# shortlog съкратения журнал
+# ----
+# FAILED to parse неуспешен анализ на... -> неразпозната стойност на
+#
+# ========================
+# „“…—
# ========================
# RECHECK
# ------------------------
@@ -25,70 +55,60 @@
# grep ^#: bg.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' > OUT
# sort -u OUT > UNIQUE
# for i in `cat UNIQUE`; do echo `grep "^$i$" OUT | wc -l` $i ; done | sort -nr > STATS
+#
# ========================
-# DONE strings
-# ------------------------
-# 222
-# ========================
-# REMAINING strings
+# FIND NON FULLY TRANSLATED
# ------------------------
-# 1988
+# msgattrib --untranslated bg.po > untranslated.po
+# msgattrib --only-fuzzy bg.po > fuzzy.po
+# msgcat.exe untranslated.po fuzzy.po > new.po
+# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
+#
# ========================
-# DONE alphabetical ordering
+# STRINGS statistics
# ------------------------
-#
-# advice, fsck, gc, help, parse-options, reflog, remote, rm, run-command
+# 1307t,0f,921u
#
# ========================
-# REMAINING alphabetical ordering
+# MOST IMPORTANT name asc ordering
# ------------------------
-#
-# add, apply, archive, attr, bisect--helper, blame, branch, bundle, cat-file, check-attr, check-ignore, check-mailmap,
-# checkout, checkout-index, clean, clone, column, commit, common-cmds, config, connected, count-objects, date, describe,
-# diff, diffcore-order, fast-export, fetch, fmt-merge-msg, for-each-ref, git, git-am, git-bisect, git-pull, git-rebase,
-# git-stash, git-submodule, gpg-interface, grep, hash-object, index-pack, init-db, log, ls-files, ls-tree, merge,
-# merge-base, merge-file, merge-recursive, mktree, mv, name-rev, notes, notes-utils, object, obstack, pack-objects,
-# pack-refs, pathspec, precompose_utf8, prune, prune-packed, push, read-tree, repack, replace, rerere, reset, revert,
-# rev-parse, sequencer, sha1_name, shortlog, show-branch, show-ref, submodule, symbolic-ref, tag, update-index,
-# update-ref, update-server-info, urlmatch, verify-pack, verify-tag, wrapper, write-tree, wt-status
-#
+# add, blame, branch, checkout, clone, commit, common-cmds, config, diff, fetch, fsck, gc, git-rebase, git-stash, grep, log, mv, parse-options, push, reflog, remote, reset, revert, rm, wt-status
#
# ========================
-# MOST IMPORTANT strings ordering
+# IMPORTANT strings desc, name asc ordering
# ------------------------
-# 144 [remote] 68 fetch 28 blame 16 [parse-options]
-# 137 commit 64 grep 27 git-rebase 12 [gc]
-# 115 branch 46 push 24 revert 12 [fsck]
-# 102 wt-status 38 add 21 common-cmds 3 reflog
-# 78 checkout 34 config 21 [rm]
-# 77 log 33 reset 21 mv
-# 69 clone 29 git-stash 13 diff
+# 111 apply 54 git-submodule 30 git-am 13 check-ignore 10 merge-file
+# 97 merge 39 init-db 30 describe 12 pathspec 10 merge-base
+# 64 tag 35 archive 29 git-bisect 12 name-rev 10 ls-tree
+# 55 merge-recursive 32 clean 14 show-ref 11 date 10 hash-object
#
# ========================
-# WHOLE STATISTICS strings ordering
+# WHOLE STATISTICS strings desc, name asc ordering
# ------------------------
-# 144 remote 54 git-submodule 27 ls-files 12 pathspec 8 replace 3 prune-packed
-# 137 commit 48 push 27 git-rebase 12 name-rev 8 git-pull 3 pack-refs
-# 115 branch 41 help 24 revert 12 gc 8 fmt-merge-msg 3 count-objects
-# 111 apply 40 pack-objects 24 mv 12 fsck 7 symbolic-ref 3 connected
-# 102 wt-status 39 init-db 21 rm 12 checkout-index 6 gpg-interface 3 bisect--helper
-# 100 notes 38 add 21 common-cmds 11 date 6 check-attr 2 verify-tag
-# 97 merge 35 archive 19 show-branch 11 column 5 write-tree 2 update-server-info
-# 78 checkout 34 config 19 read-tree 10 urlmatch 5 sha1_name 2 run-command
-# 77 log 33 reset 19 bundle 10 shortlog 5 rev-parse 2 rerere
-# 69 clone 32 clean 17 repack 10 merge-file 5 prune 2 obstack
-# 68 index-pack 30 git-am 16 parse-options 10 merge-base 4 wrapper 2 advice
-# 68 fetch 30 describe 14 submodule 10 ls-tree 4 notes-utils 1 precompose_utf8
-# 64 grep 29 git-stash 14 show-ref 10 hash-object 4 mktree 1 object
-# 58 tag 29 git-bisect 14 fast-export 10 for-each-ref 4 check-mailmap 1 git
-# 56 sequencer 28 update-index 13 diff 10 cat-file 3 verify-pack 1 diffcore-order
-# 55 merge-recursive 28 blame 13 check-ignore 9 update-ref 3 reflog 1 attr
+# 144 [remote] 47 [push] 26 [revert] 12 checkout-index 6 [prune] 2 [verify-tag]
+# 137 [commit] 46 pack-objects 24 [mv] 11 date 6 [gpg-interface] 2 [update-server-info]
+# 114 [branch] 41 [help] 23 repack 11 column 6 [check-attr] 2 [run-command]
+# 111 apply 39 init-db 21 [rm] 10 urlmatch 5 [write-tree] 2 [rerere]
+# 101 notes 36 [add] 21 [common-cmds] 10 shortlog 5 [sha1_name] 2 [read-cache]
+# 100 [wt-status] 35 [reset] 19 [show-branch] 10 merge-file 5 [rev-parse] 2 [obstack]
+# 97 merge 35 archive 19 read-tree 10 merge-base 4 [wrapper] 2 [advice]
+# 78 [checkout] 34 [config] 19 bundle 10 ls-tree 4 [prune-packed] 1 [unpack-trees]
+# 77 [log] 32 clean 16 [parse-options] 10 hash-object 4 [notes-utils] 1 [unpack-objects]
+# 69 [clone] 30 git-am 15 [fsck] 10 for-each-ref 4 [mktree] 1 [progress]
+# 68 index-pack 30 describe 14 show-ref 10 cat-file 4 [check-mailmap] 1 [precompose_utf8]
+# 68 [fetch] 29 [git-stash] 14 [gc] 9 [update-ref] 3 [verify-pack] 1 [object]
+# 64 tag 29 git-bisect 14 fast-export 9 [submodule] 3 [reflog] 1 [git]
+# 64 [grep] 28 update-index 13 [diff] 8 [replace] 3 [pack-refs] 1 [diffcore-rename]
+# 56 sequencer 28 [blame] 13 check-ignore 8 [git-pull] 3 [count-objects] 1 [diffcore-order]
+# 55 merge-recursive 27 ls-files 12 pathspec 8 [fmt-merge-msg] 3 [connected] 1 [attr]
+# 54 git-submodule 27 [git-rebase] 12 name-rev 7 [symbolic-ref] 3 [bisect--helper]
+#
msgid ""
msgstr ""
"Project-Id-Version: git master\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-01-18 07:42+0800\n"
-"PO-Revision-Date: 2014-01-28 19:05+0200\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-05-11 17:06+0300\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -97,16 +117,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: advice.c:57
+#: advice.c:55
#, c-format
msgid "hint: %.*s\n"
msgstr "Подсказка: %.*s\n"
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -135,76 +151,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr ""
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "пътят „%s“ не съвпада с никой файл"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr ""
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr ""
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
-msgstr ""
+msgstr "префикс"
-#: archive.c:329
+#: archive.c:330
msgid "prepend prefix to each pathname in the archive"
msgstr ""
-#: archive.c:330 builtin/archive.c:88 builtin/blame.c:2265
-#: builtin/blame.c:2266 builtin/config.c:58 builtin/fast-export.c:680
-#: builtin/fast-export.c:682 builtin/grep.c:716 builtin/hash-object.c:77
-#: builtin/ls-files.c:486 builtin/ls-files.c:489 builtin/notes.c:408
-#: builtin/notes.c:565 builtin/read-tree.c:108 parse-options.h:154
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "файл"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr ""
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr ""
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr ""
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr ""
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr ""
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr ""
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr ""
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
-msgstr ""
+msgstr "хранилище"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr ""
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr ""
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr ""
@@ -213,87 +229,88 @@ msgid ""
"Negative patterns are ignored in git attributes\n"
"Use '\\!' for literal leading exclamation."
msgstr ""
+"Отрицателните шаблони се игнорират в атрибутите на git.\n"
+"Ако ви трябва начална удивителна, ползвайте „\\!“."
#: branch.c:60
#, c-format
msgid "Not setting branch %s as its own upstream."
msgstr ""
+"Клонът „%s“ не може да служи като източник за собствената си синхронизация."
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr ""
+"Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“ чрез "
+"пребазиране."
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
-msgstr ""
+msgstr "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“."
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr ""
+"Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране."
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
-msgstr ""
+msgstr "Клонът „%s“ ще следи клона „%s“ от локалното хранилище."
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
+msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране."
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
-msgstr ""
+msgstr "Клонът „%s“ ще следи отдалечения указател „%s“."
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
+msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране."
-#: branch.c:98
+#: branch.c:100
#, c-format
msgid "Branch %s set up to track local ref %s."
-msgstr ""
-
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr ""
+msgstr "Клонът „%s“ ще следи локалния указател „%s“."
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
-msgstr ""
+msgstr "Няма следене: двусмислена информация за указателя „%s“"
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
-msgstr ""
+msgstr "„%s“ не е позволено име за клон."
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
-msgstr ""
+msgstr "Вече съществува клон с име „%s“."
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
-msgstr ""
+msgstr "Текущият клон не може да бъде принудително обновен."
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
+msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон."
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
+msgstr "заявеният отдалечен клон „%s“ не съществува"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -304,135 +321,142 @@ msgid ""
"will track its remote counterpart, you may want to use\n"
"\"git push -u\" to set the upstream config as you push."
msgstr ""
+"\n"
+"Ако искате да базирате работата си на клон от отдалечено хранилище, може \n"
+"да се наложи да изпълните „git fetch“, за да получите информацията за него.\n"
+"\n"
+"Ако искате да изтласкате нов, локален клон, който да следи отдалечен клон,\n"
+"може да използвате „git push -u“, за да настроите към кой клон да се "
+"изтласква."
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
-msgstr ""
+msgstr "Неправилно име на обект: „%s“"
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
-msgstr ""
+msgstr "Двусмислено име на обект: „%s“"
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
-msgstr ""
+msgstr "Неправилно място за начало на клон: „%s“"
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
-msgstr ""
+msgstr "Указателят не може да бъде заключен, за да бъде обновен"
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
-msgstr ""
+msgstr "Указателят не може да бъде записан"
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
-msgstr ""
+msgstr "Файлът „%s“ не изглежда да е архив на git версия 2"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr ""
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
-msgstr ""
+msgstr "„%s“ не може да се отвори"
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr ""
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
#: builtin/shortlog.c:158
msgid "revision walk setup failed"
-msgstr ""
+msgstr "неуспешно настройване на обхождането на версиите"
-#: bundle.c:187
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] ""
msgstr[1] ""
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr ""
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] ""
msgstr[1] ""
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr ""
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
-msgstr ""
+msgstr "непознат аргумент: %s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr ""
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr ""
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr ""
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr ""
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr ""
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr ""
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
-msgstr ""
+msgstr "„%s“ не може да се анализира"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
-msgstr ""
+msgstr "%s %s не е подаване!"
#: compat/obstack.c:406 compat/obstack.c:408
msgid "memory exhausted"
-msgstr ""
+msgstr "паметта свърши"
#: connected.c:70
msgid "Could not run 'git rev-list'"
-msgstr ""
+msgstr "Командата „git rev-list“ не може да бъде изпълнена."
#: connected.c:90
#, c-format
msgid "failed write to rev-list: %s"
-msgstr ""
+msgstr "неуспешен запис в списъка с версиите: %s"
#: connected.c:98
#, c-format
msgid "failed to close rev-list's stdin: %s"
-msgstr ""
+msgstr "стандартният вход на списъка с версиите не може да бъде затворен: %s"
#: date.c:95
msgid "in the future"
@@ -487,6 +511,7 @@ msgid_plural "%lu years"
msgstr[0] ""
msgstr[1] ""
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -504,22 +529,28 @@ msgstr[1] ""
#: diffcore-order.c:24
#, c-format
msgid "failed to read orderfile '%s'"
-msgstr ""
+msgstr "файлът с подредбата на съответствията „%s“ не може да бъде прочетен"
+
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Търсене на преименувания на обекти съчетани с промени"
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
msgstr ""
+" Неуспешно разпознаване на „%s“ като процент-праг за статистиката по "
+"директории\n"
#: diff.c:118
#, c-format
msgid " Unknown dirstat parameter '%s'\n"
-msgstr ""
+msgstr " Непознат параметър „%s“ за статистиката по директории'\n"
#: diff.c:213
#, c-format
msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
+msgstr "Непозната стойност „%s“ за настройката „diff.submodule“"
#: diff.c:263
#, c-format
@@ -527,70 +558,74 @@ msgid ""
"Found errors in 'diff.dirstat' config variable:\n"
"%s"
msgstr ""
+"Грешки в настройката „diff.dirstat“:\n"
+"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
"%s"
msgstr ""
+"Неразпознат параметър към опцията „--dirstat/-X“:\n"
+"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr ""
+msgstr "Неразпознат параметър към опцията „--submodule“: „%s“"
#: gpg-interface.c:59 gpg-interface.c:131
msgid "could not run gpg."
-msgstr ""
+msgstr "Програмата „gpg“ не може да бъде стартирана."
#: gpg-interface.c:71
msgid "gpg did not accept the data"
-msgstr ""
+msgstr "Програмата „gpg“ не прие подадените данни."
#: gpg-interface.c:82
msgid "gpg failed to sign the data"
-msgstr ""
+msgstr "Програмата „gpg“ не подписа данните."
#: gpg-interface.c:115
#, c-format
msgid "could not create temporary file '%s': %s"
-msgstr ""
+msgstr "Програмата „gpg“ не успя да създаде временния файл „%s“: %s"
#: gpg-interface.c:118
#, c-format
msgid "failed writing detached signature to '%s': %s"
-msgstr ""
+msgstr "Програмата „gpg“ не успя да запише самостоятелния подпис към „%s“: %s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
-msgstr ""
+msgstr "„%s“: файлът сочен от „%s“ не може да бъде прочетен"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
-msgstr ""
+msgstr "„%s“: „%s“"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
-msgstr ""
+msgstr "„%s“: изчитането на „%s“ върна по-малко байтове от заявените"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "налични команди на git от „%s“"
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "команди на git от други директории от пътя „$PATH“"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "Най-често употребяваните команди на git са:"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -599,11 +634,12 @@ msgstr ""
"Изглежда, че „%s“ е команда на git, но тя не може да\n"
"бъде изпълнена. Вероятно пакетът „git-%s“ е повреден."
-#: help.c:347
+# FIXME bad message
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Странно, изглежда, че на системата ви няма нито една команда на git."
-#: help.c:369
+#: help.c:368
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -614,17 +650,17 @@ msgstr ""
"съществува. Изпълнението автоматично продължава, като се счита, че имате "
"предвид „%s“"
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "след %0.1f секунди…"
-#: help.c:381
+#: help.c:380
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: „%s“ не е команда на git. Вижте изхода от „git --help“."
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -638,7 +674,7 @@ msgstr[1] ""
"\n"
"Команди с подобно име са:"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s — %s"
@@ -647,305 +683,305 @@ msgstr "%s: %s — %s"
msgid "failed to read the cache"
msgstr ""
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
-msgstr ""
+msgstr "неуспешно записване на новия индекс"
#: merge-recursive.c:190
#, c-format
msgid "(bad commit)\n"
msgstr ""
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr ""
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr ""
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr ""
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr ""
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ""
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr ""
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr ""
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr ""
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
-msgstr ""
+msgstr "директорията „%s“ не може да бъде отворена"
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr ""
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr ""
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr ""
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr ""
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr ""
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
"in tree."
msgstr ""
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
"in tree at %s."
msgstr ""
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
msgid "rename"
msgstr ""
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
-msgstr ""
+msgstr "преименуван"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr ""
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
"\"->\"%s\" in \"%s\"%s"
msgstr ""
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr ""
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr ""
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr ""
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr ""
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr ""
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr ""
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr ""
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
-msgstr ""
+msgstr "променен"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr ""
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr ""
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr ""
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr ""
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
-msgstr ""
+msgstr "ПОДМОДУЛ"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr ""
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
-msgstr ""
+msgstr "Изтриване на „%s“"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr ""
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr ""
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr ""
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr ""
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr ""
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr ""
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr ""
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr ""
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] ""
msgstr[1] ""
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr ""
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr ""
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr ""
#: notes-utils.c:40
msgid "Cannot commit uninitialized/unreferenced notes tree"
msgstr ""
+"Неинициализирано или нереферирано дърво за бележки не може да бъде подадено"
#: notes-utils.c:81
#, c-format
msgid "Bad notes.rewriteMode value: '%s'"
-msgstr ""
+msgstr "Лоша стойност за „notes.rewriteMode“: „%s“"
#: notes-utils.c:91
#, c-format
msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
msgstr ""
+"Бележките в „%s“ няма да бъдат презаписани, защото са извън „refs/notes/“."
#. TRANSLATORS: The first %s is the name of the
#. environment variable, the second %s is its value
#: notes-utils.c:118
#, c-format
msgid "Bad %s value: '%s'"
-msgstr ""
+msgstr "Зададена е лоша стойност на променливата „%s“: „%s“"
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
-msgstr ""
+msgstr "обектът „%s“ не може да бъде анализиран"
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "…"
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "употреба: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " или: %s"
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-ЧИСЛО"
@@ -993,11 +1029,6 @@ msgstr ""
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr ""
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
#: pathspec.c:353
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
@@ -1014,56 +1045,74 @@ msgid ""
"Perhaps you forgot to add either ':/' or '.' ?"
msgstr ""
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "действието завърши"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"Зададена е неправилна стойност на настройката „index.version“.\n"
+"Ще се ползва версия %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"Зададена е неправилна стойност на променливата на средата "
+"„GIT_INDEX_VERSION“.\n"
+"Ще се ползва версия %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“"
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "„%s“ обикновено следи „%s“, а не „%s“"
-#: remote.c:761
+#: remote.c:766
#, c-format
msgid "%s tracks both %s and %s"
msgstr "„%s“ следи както „%s“, така и „%s“"
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
msgid "Internal error"
msgstr "Вътрешна грешка"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr " (за да коригирате това използвайте „git branch --unset-upstream“)\n"
+msgstr " (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Клонът е актуализиран както „%s“.\n"
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Клонът ви е с %2$d подаване пред „%1$s“.\n"
msgstr[1] "Клонът ви е с %2$d подавания пред „%1$s“.\n"
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (публикувайте локалните си промени чрез „git push“)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1073,11 +1122,11 @@ msgstr[0] ""
msgstr[1] ""
"Клонът ви е с %2$d подавания след „%1$s“ и може да бъде тривиално слят.\n"
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (обновете локалния си клон чрез „git pull“)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1092,7 +1141,7 @@ msgstr[1] ""
"Текущият клон се е отделил от „%s“,\n"
"двата имат съответно по %d и %d несъвпадащи подавания.\n"
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (слейте отдалечения клон в локалния чрез „git pull“)\n"
@@ -1105,14 +1154,14 @@ msgstr "неуспешно отваряне на „/dev/null“"
msgid "dup2(%d,%d) failed"
msgstr "неуспешно изпълнение на dup2(%d,%d)"
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, c-format
msgid "Could not open '%s' for writing"
msgstr ""
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr ""
@@ -1130,7 +1179,7 @@ msgid ""
"and commit the result with 'git commit'"
msgstr ""
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr ""
@@ -1156,7 +1205,7 @@ msgstr ""
#: sequencer.c:325
#, c-format
msgid "%s: Unable to write new index file"
-msgstr ""
+msgstr "%s: новият индекс не може да бъде запазен"
#: sequencer.c:356
msgid "Could not resolve HEAD commit\n"
@@ -1166,184 +1215,184 @@ msgstr ""
msgid "Unable to update cache tree\n"
msgstr ""
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr ""
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr ""
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
-msgstr ""
+msgstr "Индексът не е слят."
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr ""
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr ""
-#: sequencer.c:525
+#: sequencer.c:532
#, c-format
msgid "Mainline was specified but commit %s is not a merge."
msgstr ""
#. TRANSLATORS: The first %s will be "revert" or
#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr ""
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr ""
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr ""
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr ""
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr ""
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr ""
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr ""
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr ""
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr ""
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr ""
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr ""
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr ""
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr ""
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr ""
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr ""
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr ""
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr ""
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr ""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr ""
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr ""
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr ""
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr ""
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr ""
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr ""
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr ""
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr ""
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr ""
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr ""
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr ""
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr ""
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr ""
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr ""
@@ -1359,80 +1408,76 @@ msgid ""
"examine these refs and maybe delete them. Turn this message off by\n"
"running \"git config advice.objectNameWarning false\""
msgstr ""
+"При нормална работа git никога не създава указатели, които завършват с 40\n"
+"шестнасетични знаци, защото те ще бъдат прескачани, когато указвате \n"
+"шестнайсетични знаци. Една възможност е такива указатели да са създадени\n"
+"по погрешка. Например:\n"
+"\n"
+" git checkout -b $BRANCH $(git rev-parse…)\n"
+"\n"
+"където стойността на променливата на средата BRANCH е празна, при което се\n"
+"създава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
+"да\n"
+"спрете това съобщение като изпълнете „git config advice.objectNameWarning "
+"false“"
-#: sha1_name.c:1109
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
-msgstr ""
+msgstr "Указателят „HEAD“ не сочи към клон"
-#: sha1_name.c:1112
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
-msgstr ""
+msgstr "Не съществува клон на име „%s“"
-#: sha1_name.c:1114
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
-msgstr ""
+msgstr "Не е зададен клон-източник за клона „%s“"
-#: sha1_name.c:1118
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
+msgstr "Клонът-източник „%s“ не е съхранен като следящ клон"
#: submodule.c:64 submodule.c:98
msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
msgstr ""
+"Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо "
+"коригирайте конфликтите"
#: submodule.c:68 submodule.c:102
#, c-format
msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
+msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
-msgstr ""
+msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен"
-#. Maybe the user already did that, don't error out here
#: submodule.c:109
#, c-format
msgid "Could not remove .gitmodules entry for %s"
-msgstr ""
-
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr ""
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr ""
+msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит"
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr ""
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
-msgstr ""
+msgstr "неуспешно добавяне в индекса на променения файл „.gitmodules“"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
-msgstr ""
+msgstr "Връзката в Git „%s“ не може да бъде създадена"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
-msgstr ""
+msgstr "В „%s“ не може да се зададе настройката „core.worktree“"
+
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Изтегляне на файлове"
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
@@ -1466,623 +1511,623 @@ msgstr ""
#: wrapper.c:422
#, c-format
msgid "unable to access '%s': %s"
-msgstr ""
+msgstr "няма достъп до „%s“: %s"
#: wrapper.c:443
#, c-format
msgid "unable to access '%s'"
-msgstr ""
+msgstr "няма достъп до „%s“"
#: wrapper.c:454
#, c-format
msgid "unable to look up current user in the passwd file: %s"
-msgstr ""
+msgstr "текущият потребител не може да бъде открит във файла „/etc/passwd“: %s"
#: wrapper.c:455
msgid "no such user"
-msgstr ""
+msgstr "такъв потребител не съществува"
#: wt-status.c:150
msgid "Unmerged paths:"
-msgstr ""
+msgstr "Неслети пътища:"
#: wt-status.c:177 wt-status.c:204
#, c-format
msgid " (use \"git reset %s <file>...\" to unstage)"
-msgstr ""
+msgstr " (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
#: wt-status.c:179 wt-status.c:206
msgid " (use \"git rm --cached <file>...\" to unstage)"
msgstr ""
+" (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)"
#: wt-status.c:183
msgid " (use \"git add <file>...\" to mark resolution)"
msgstr ""
+" (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)"
#: wt-status.c:185 wt-status.c:189
msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)"
msgstr ""
+" (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за "
+"конфликта)"
#: wt-status.c:187
msgid " (use \"git rm <file>...\" to mark resolution)"
msgstr ""
+" (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)"
#: wt-status.c:198
msgid "Changes to be committed:"
-msgstr ""
+msgstr "Промени, които ще бъдат подадени:"
#: wt-status.c:216
msgid "Changes not staged for commit:"
-msgstr ""
+msgstr "Промени, които не са в индекса за подаване:"
#: wt-status.c:220
msgid " (use \"git add <file>...\" to update what will be committed)"
msgstr ""
+" (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)"
#: wt-status.c:222
msgid " (use \"git add/rm <file>...\" to update what will be committed)"
msgstr ""
+" (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)"
#: wt-status.c:223
msgid ""
" (use \"git checkout -- <file>...\" to discard changes in working directory)"
msgstr ""
+" (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в "
+"работното дърво)"
#: wt-status.c:225
msgid " (commit or discard the untracked or modified content in submodules)"
msgstr ""
+" (подайте или отхвърлете неследеното или промененото съдържание в "
+"подмодулите)"
#: wt-status.c:237
#, c-format
msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
+" (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)"
-#: wt-status.c:254
-msgid "bug"
-msgstr ""
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
-msgstr ""
+msgstr "изтрити в двата случая:"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
-msgstr ""
+msgstr "добавени от вас:"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
-msgstr ""
+msgstr "изтрити от тях:"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
-msgstr ""
+msgstr "добавени от тях:"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
-msgstr ""
+msgstr "изтрити от нас:"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
-msgstr ""
+msgstr "добавени и в двата случая:"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
-msgstr ""
+msgstr "променени и в двата случая:"
-#: wt-status.c:275
-msgid "new file"
-msgstr ""
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено"
-#: wt-status.c:277
-msgid "copied"
-msgstr ""
+#: wt-status.c:274
+msgid "new file:"
+msgstr "нов файл:"
-#: wt-status.c:279
-msgid "deleted"
-msgstr ""
+#: wt-status.c:276
+msgid "copied:"
+msgstr "копиран:"
-#: wt-status.c:285
-msgid "typechange"
-msgstr ""
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "изтрит:"
-#: wt-status.c:287
-msgid "unknown"
-msgstr ""
+#: wt-status.c:280
+msgid "modified:"
+msgstr "променен:"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr ""
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "преименуван:"
+
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "смяна на вида:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "непозната промяна:"
-#: wt-status.c:336
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "неслят:"
+
+#: wt-status.c:370
msgid "new commits, "
-msgstr ""
+msgstr "нови подавания, "
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
-msgstr ""
+msgstr "променено съдържание, "
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
-msgstr ""
+msgstr "неследено съдържание, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
-msgstr ""
+msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
-msgstr ""
+msgstr "Подмодулите са променени, но не са обновени:"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
-msgstr ""
+msgstr "Промени в подмодулите за подаване:"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
msgstr ""
+"Не променяйте горния ред.\n"
+"Всичко отдолу ще бъде изтрито."
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
-msgstr ""
+msgstr "Някои пътища не са слети."
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git commit“)"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
-msgstr ""
+msgstr "Всички конфликти са решени, но продължавате сливането."
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
-msgstr ""
+msgstr " (използвайте „git commit“, за да завършите сливането)"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
-msgstr ""
+msgstr "В момента прилагате поредица от кръпки чрез „git am“."
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
-msgstr ""
+msgstr "Текущата кръпка е празна."
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git am --continue“)"
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
-msgstr ""
+msgstr " (използвайте „git am --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr ""
+" (използвайте „git am --abort“, за да възстановите първоначалния клон)"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
+msgstr "В момента пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
-msgstr ""
+msgstr "В момента пребазирате."
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и използвайте „git rebase --continue“)"
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
+msgstr " (използвайте „git rebase --skip“, за да пропуснете тази кръпка)"
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
+" (използвайте „git rebase --abort“, за да възстановите първоначалния клон)"
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
+msgstr " (всички конфликти са коригирани: изпълнете „git rebase --continue“)"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
+msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
-msgstr ""
+msgstr "В момента разделяте подаване докато пребазирате."
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
+" (След като работното ви дърво стане чисто, използвайте „git rebase --"
+"continue“)"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
+"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
-msgstr ""
+msgstr "В момента редактирате подаване докато пребазирате."
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
+" (използвайте „git commit --amend“, за да редактирате текущото подаване)"
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
+" (използвайте „git rebase --continue“, след като завършите промените си)"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
-msgstr ""
+msgstr "В момента отбирате подаването „%s“."
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
+" (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
+" (използвайте „git cherry-pick --abort“, за да отмените всички действия с "
+"отбиране)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
-msgstr ""
+msgstr "В момента отменяте подаване „%s“."
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git revert --continue“)"
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
+msgstr " (всички конфликти са коригирани, изпълнете „git revert --continue“)"
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr ""
+" (използвайте „git revert --abort“, за да преустановите отмяната на "
+"подаване)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
+msgstr "В момента търсите двоично, като сте стартирали от клон „%s“."
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
-msgstr ""
+msgstr "В момента търсите двоично."
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
+" (използвайте „git bisect reset“, за да се върнете към първоначалното "
+"състояние и клон)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
-msgstr ""
+msgstr "На клон "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
-msgstr ""
+msgstr "извършвате пребазиране върху "
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
-msgstr ""
+msgstr "Указателят „HEAD“ не е свързан и е на подаване "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
-msgstr ""
+msgstr "Указателят „HEAD“ не е свързан и е отделѐн от "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
-msgstr ""
+msgstr "Извън всички клони"
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
-msgstr ""
+msgstr "Първоначално подаване"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
-msgstr ""
+msgstr "Неследени файлове"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
-msgstr ""
+msgstr "Игнорирани файлове"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
"may speed it up, but you have to be careful not to forget to add\n"
"new files yourself (see 'git help status')."
msgstr ""
+"Бяха необходими %.2f секунди за изброяването на неследените файлове.\n"
+"Добавянето на опцията „-uno“ към командата „git status“, ще ускори\n"
+"нещата, но не трябва да забравяте ръчно да добавяте новите файлове.\n"
+"За повече подробности погледнете „git status help“."
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
-msgstr ""
+msgstr "Неследените файлове не са изведени%s"
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
-msgstr ""
+msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
-msgstr ""
+msgstr "Няма промени"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
+"към индекса за подаване не са добавени промени (използвайте „git add“ и/или "
+"„git commit -a“)\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
-msgstr ""
+msgstr "към индекса за подаване не са добавени промени\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
"track)\n"
msgstr ""
+"към индекса за подаване не са добавени промени, но има нови файлове "
+"(използвайте „git add“, за да започне тяхното следене)\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
-msgstr ""
+msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n"
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
+"липсват каквито и да е промени (създайте или копирайте файлове и използвайте "
+"„git add“, за да започне тяхното следене)\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
-msgstr ""
+msgstr "липсват каквито и да е промени\n"
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
+"липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и "
+"неследените файлове)\n"
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
-msgstr ""
+msgstr "липсват каквито и да е промени, работното дърво е чисто\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
-msgstr ""
+msgstr "HEAD (извън клон)"
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
-msgstr ""
+msgstr "Първоначално подаване на "
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
-msgstr ""
+msgstr "изтрит"
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
msgid "behind "
-msgstr ""
-
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr ""
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ""
+msgstr "назад с "
#: compat/precompose_utf8.c:55 builtin/clone.c:356
#, c-format
msgid "failed to unlink '%s'"
-msgstr ""
+msgstr "неуспешно изтриване на „%s“"
-#: builtin/add.c:20
+#: builtin/add.c:21
msgid "git add [options] [--] <pathspec>..."
-msgstr ""
-
-#.
-#. * To be consistent with "git add -p" and most Git
-#. * commands, we should default to being tree-wide, but
-#. * this is not the original behavior and can't be
-#. * changed until users trained themselves not to type
-#. * "git add -u" or "git add -A". For now, we warn and
-#. * keep the old behavior. Later, the behavior can be changed
-#. * to tree-wide, keeping the warning for a while, and
-#. * eventually we can drop the warning.
-#.
-#: builtin/add.c:58
-#, c-format
-msgid ""
-"The behavior of 'git add %s (or %s)' with no path argument from a\n"
-"subdirectory of the tree will change in Git 2.0 and should not be used "
-"anymore.\n"
-"To add content for the whole tree, run:\n"
-"\n"
-" git add %s :/\n"
-" (or git add %s :/)\n"
-"\n"
-"To restrict the command to the current directory, run:\n"
-"\n"
-" git add %s .\n"
-" (or git add %s .)\n"
-"\n"
-"With the current Git version, the command is restricted to the current "
-"directory.\n"
-msgstr ""
+msgstr "git add [ОПЦИИ] [--] ПЪТ…"
-#: builtin/add.c:100
-#, c-format
-msgid ""
-"You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-" ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n"
-msgstr ""
-
-#: builtin/add.c:144
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
-msgstr ""
+msgstr "неочакван изходен код при генериране на разлика: %c"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
-msgstr ""
+msgstr "неуспешно обновяване на файловете"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
-msgstr ""
+msgstr "изтриване на „%s“\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
-msgstr ""
+msgstr "Промени, които и след обновяването на индекса не са добавени към него:"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
-msgstr ""
+msgstr "Индексът не може да бъде прочетен"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
-msgstr ""
+msgstr "Файлът „%s“ не може да бъде отворен за запис."
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
-msgstr ""
+msgstr "Кръпката не може да бъде записана"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
-msgstr ""
+msgstr "Не може да се получи информация чрез „stat“ за файла „%s“"
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
-msgstr ""
+msgstr "Празна кръпка, преустановяване на действието."
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
-msgstr ""
+msgstr "Кръпката „%s“ не може да бъде приложена"
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
+"Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n"
-#: builtin/add.c:354 builtin/clean.c:875 builtin/fetch.c:93 builtin/mv.c:70
-#: builtin/prune-packed.c:77 builtin/push.c:506 builtin/remote.c:1344
+#: builtin/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr "пробно изпълнeние"
-#: builtin/add.c:355 builtin/apply.c:4410 builtin/check-ignore.c:19
-#: builtin/commit.c:1249 builtin/count-objects.c:95 builtin/fsck.c:612
+#: builtin/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
msgid "be verbose"
msgstr "повече подробности"
-#: builtin/add.c:357
+#: builtin/add.c:251
msgid "interactive picking"
-msgstr ""
+msgstr "интерактивно отбиране на промени"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
-msgstr ""
+msgstr "интерактивен избор на парчета код"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
-msgstr ""
+msgstr "редактиране на текущата разлика и прилагане"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
-msgstr ""
+msgstr "добавяне и на иначе игнорираните файлове"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
-msgstr ""
+msgstr "обновяване на следените файлове"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
-msgstr ""
+msgstr "отбелязване само на факта, че пътят ще бъде добавен по-късно"
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
-msgstr ""
+msgstr "добавяне на всички промени в следените и неследените файлове"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
+"игнориране на пътищата, които са изтрити от работното дърво (същото като „--"
+"no-all“)"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
-msgstr ""
+msgstr "без добавяне на нови файлове, само обновяване на индекса"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr ""
+"прескачане на файловете, които не могат да бъдат добавени поради грешки"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr ""
+"проверка, че при пробно изпълнение всички файлове, дори и изтритите, се "
+"игнорират"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
-msgstr ""
+msgstr "Използвайте опцията „-f“, ако наистина искате да ги добавите.\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
-msgstr ""
+msgstr "не са добавени файлове"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
-msgstr ""
+msgstr "неуспешно добавяне на файлове"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
-msgstr ""
+msgstr "опциите „-A“ и „-u“ са несъвместими"
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
+msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“"
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
-msgstr ""
+msgstr "Нищо не е зададено и нищо не е добавено.\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr ""
+msgstr "Вероятно искахте да използвате „git add .“?\n"
-#: builtin/add.c:492 builtin/check-ignore.c:172 builtin/clean.c:919
-#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:224 builtin/rm.c:299
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
msgid "index file corrupt"
msgstr "файлът с индекса е повреден"
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
-msgstr "Новият файл с индекса не може да бъде записан"
+msgstr "Новият индекс не може да бъде записан"
#: builtin/apply.c:57
msgid "git apply [options] [<patch>...]"
@@ -2177,17 +2222,17 @@ msgstr ""
msgid "deleted file %s still has contents"
msgstr ""
+# FIXME - double **??
#: builtin/apply.c:1725
#, c-format
msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
+msgstr "●● предупреждение: файлът „%s“ вече е празен, но не е изтрит"
#: builtin/apply.c:1871
#, c-format
msgid "corrupt binary patch at line %d: %.*s"
msgstr ""
-#. there has to be one hunk (forward hunk)
#: builtin/apply.c:1900
#, c-format
msgid "unrecognized binary patch at line %d"
@@ -2326,10 +2371,10 @@ msgstr ""
msgid "Checking patch %s..."
msgstr ""
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
-msgstr ""
+msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“"
#: builtin/apply.c:3823
#, c-format
@@ -2375,7 +2420,6 @@ msgstr ""
msgid "internal error"
msgstr ""
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2404,12 +2448,12 @@ msgstr ""
#: builtin/apply.c:4238
msgid "unable to read index file"
-msgstr ""
+msgstr "индексът не може да бъде записан"
#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
#: builtin/fetch.c:78
msgid "path"
-msgstr ""
+msgstr "път"
#: builtin/apply.c:4358
msgid "don't apply changes matching the given path"
@@ -2467,14 +2511,13 @@ msgstr ""
msgid "build a temporary index based on embedded index information"
msgstr ""
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
-msgstr ""
+msgstr "разделяне на пътищата с нулевия знак „NUL“"
#: builtin/apply.c:4392
-#, fuzzy
msgid "ensure at least <n> lines of context match"
-msgstr "<брой>"
+msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове"
#: builtin/apply.c:4393
msgid "action"
@@ -2588,132 +2631,150 @@ msgstr ""
#: builtin/bisect--helper.c:7
msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr ""
+msgstr "git bisect--helper --next-all [--no-checkout]"
#: builtin/bisect--helper.c:17
msgid "perform 'git bisect next'"
-msgstr ""
+msgstr "извършване на „git bisect next“"
#: builtin/bisect--helper.c:19
msgid "update BISECT_HEAD instead of checking out the current commit"
msgstr ""
+"обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване"
#: builtin/blame.c:27
msgid "git blame [options] [rev-opts] [rev] [--] file"
-msgstr ""
+msgstr "git blame [ОПЦИИ] [ОПЦИИ_ЗА_ВЕРСИЯТА] [ВЕРСИЯ] [--] ФАЙЛ"
#: builtin/blame.c:32
msgid "[rev-opts] are documented in git-rev-list(1)"
-msgstr ""
+msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)"
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
-msgstr ""
+msgstr "Извеждане на анотациите с намирането им, последователно"
-# FIXME
-#: builtin/blame.c:2250
+# FIXME SHA-1 -> SHA1
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr ""
+"Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията "
+"е изключена)"
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr ""
+"Началните подавания да не се считат за гранични (стандартно опцията е "
+"изключена)"
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
-msgstr ""
+msgstr "Извеждане на статистика за извършените действия"
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
-msgstr ""
+msgstr "Извеждане на допълнителна информация за определянето на анотациите"
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr ""
+"Извеждане на първоначалното име на файл (стандартно това е автоматично)"
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr ""
+"Извеждане на първоначалният номер на ред (стандартно опцията е изключена)"
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
-msgstr ""
+msgstr "Извеждане във формат за по-нататъшна обработка"
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr ""
+"Извеждане във формат за по-нататъшна обработка с информация на всеки ред"
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr ""
+"Използване на същия формат като „git-annotate“ (стандартно опцията е "
+"изключена)"
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
-msgstr ""
+msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)"
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
-msgstr ""
+msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)"
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
-msgstr ""
+msgstr "Без име на автор и време на промяна(стандартно опцията е изключена)"
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr ""
+"Извеждане на е-пощата на автора, а не името му (стандартно опцията е "
+"изключена)"
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
-msgstr ""
+msgstr "Без разлики в знаците за интервали"
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
-msgstr ""
+msgstr "Допълнителни изчисления за по-добри резултати"
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr ""
+msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“"
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
-msgstr ""
+msgstr "Използване на съдържанието на ФАЙЛа като крайно положение"
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
-msgstr ""
+msgstr "напасване на редовете"
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr ""
+"Търсене на копирани редове както в рамките на един файл, така и от един файл "
+"към друг"
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr ""
+"Търсене на преместени редове както в рамките на един файл, така и от един "
+"файл към друг"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
-msgstr ""
+msgstr "n,m"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr ""
+"Информация само за редовете в интервала от n до m включително. Броенето "
+"започва от 1"
#: builtin/branch.c:24
msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-r | -a] [--merged | --no-merged]"
#: builtin/branch.c:25
msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]"
#: builtin/branch.c:26
msgid "git branch [options] [-r] (-d | -D) <branchname>..."
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-r] (-d | -D) ИМЕ_НА_КЛОН…"
#: builtin/branch.c:27
msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
-msgstr ""
+msgstr "git branch [ОПЦИИ] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН"
#: builtin/branch.c:150
#, c-format
@@ -2721,6 +2782,8 @@ msgid ""
"deleting branch '%s' that has been merged to\n"
" '%s', but not yet merged to HEAD."
msgstr ""
+"изтриване на клона „%s“, който е слят към „%s“,\n"
+" но още не е слят към върха „HEAD“."
#: builtin/branch.c:154
#, c-format
@@ -2728,11 +2791,13 @@ msgid ""
"not deleting branch '%s' that is not yet merged to\n"
" '%s', even though it is merged to HEAD."
msgstr ""
+"отказване на изтриване на клона „%s“, който не е слят към\n"
+" „%s“, но е слят към върха „HEAD“."
#: builtin/branch.c:168
#, c-format
msgid "Couldn't look up commit object for '%s'"
-msgstr ""
+msgstr "Обектът-подаване за „%s“ не може да бъде открит"
#: builtin/branch.c:172
#, c-format
@@ -2740,336 +2805,346 @@ msgid ""
"The branch '%s' is not fully merged.\n"
"If you are sure you want to delete it, run 'git branch -D %s'."
msgstr ""
+"Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n"
+"да го изтриете, изпълнете „git branch -D %s“."
#: builtin/branch.c:185
msgid "Update of config-file failed"
-msgstr ""
+msgstr "Неуспешно обновяване на конфигурационния файл"
#: builtin/branch.c:213
msgid "cannot use -a with -d"
-msgstr ""
+msgstr "Опцията „-a“ е несъвместима с опцията „-d“"
#: builtin/branch.c:219
msgid "Couldn't look up commit object for HEAD"
-msgstr ""
+msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит"
#: builtin/branch.c:227
#, c-format
msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr ""
+msgstr "Не можете да изтриете клона „%s“, защото в момента е текущ."
#: builtin/branch.c:240
#, c-format
msgid "remote branch '%s' not found."
-msgstr ""
+msgstr "отдалеченият клон „%s“ не може да бъде открит."
#: builtin/branch.c:241
#, c-format
msgid "branch '%s' not found."
-msgstr ""
+msgstr "клонът „%s“ не може да бъде открит."
#: builtin/branch.c:255
#, c-format
msgid "Error deleting remote branch '%s'"
-msgstr ""
+msgstr "Грешка при изтриването на отдалечения клон „%s“"
#: builtin/branch.c:256
#, c-format
msgid "Error deleting branch '%s'"
-msgstr ""
+msgstr "Грешка при изтриването на клона „%s“"
#: builtin/branch.c:263
#, c-format
msgid "Deleted remote branch %s (was %s).\n"
-msgstr ""
+msgstr "Изтрит отдалечен клон „%s“ (той сочеше към „%s“).\n"
#: builtin/branch.c:264
#, c-format
msgid "Deleted branch %s (was %s).\n"
-msgstr ""
+msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n"
#: builtin/branch.c:366
#, c-format
msgid "branch '%s' does not point at a commit"
-msgstr ""
+msgstr "клонът „%s“ не сочи към подаване"
#: builtin/branch.c:454
#, c-format
msgid "[%s: gone]"
-msgstr ""
+msgstr "[%s: изтрит]"
#: builtin/branch.c:459
#, c-format
msgid "[%s]"
-msgstr ""
+msgstr "[%s]"
#: builtin/branch.c:464
#, c-format
msgid "[%s: behind %d]"
-msgstr ""
+msgstr "[%s: назад с %d]"
#: builtin/branch.c:466
#, c-format
msgid "[behind %d]"
-msgstr ""
+msgstr "[назад с %d]"
#: builtin/branch.c:470
#, c-format
msgid "[%s: ahead %d]"
-msgstr ""
+msgstr "[%s: напред с %d]"
#: builtin/branch.c:472
#, c-format
msgid "[ahead %d]"
-msgstr ""
+msgstr "[напред с %d]"
#: builtin/branch.c:475
#, c-format
msgid "[%s: ahead %d, behind %d]"
-msgstr ""
+msgstr "[%s: напред с %d, назад с %d]"
#: builtin/branch.c:478
#, c-format
msgid "[ahead %d, behind %d]"
-msgstr ""
+msgstr "[напред с %d, назад с %d]"
+# FIXME ** how many??
#: builtin/branch.c:502
msgid " **** invalid ref ****"
-msgstr ""
+msgstr " ●●●● неправилен указател ●●●●"
#: builtin/branch.c:594
#, c-format
msgid "(no branch, rebasing %s)"
-msgstr ""
+msgstr "(извън клон, пребазиране на „%s“)"
#: builtin/branch.c:597
#, c-format
msgid "(no branch, bisect started on %s)"
-msgstr ""
+msgstr "(извън клон, двоично търсене от „%s“)"
#: builtin/branch.c:600
#, c-format
msgid "(detached from %s)"
-msgstr ""
+msgstr "(състояние, несвързано към „%s“)"
#: builtin/branch.c:603
msgid "(no branch)"
-msgstr ""
+msgstr "(извън клон)"
#: builtin/branch.c:649
#, c-format
msgid "object '%s' does not point to a commit"
-msgstr ""
+msgstr "обектът „%s“ не сочи към подаване"
#: builtin/branch.c:681
msgid "some refs could not be read"
-msgstr ""
+msgstr "някои указатели не могат да бъдат прочетени"
#: builtin/branch.c:694
msgid "cannot rename the current branch while not on any."
msgstr ""
+"не можете да преименувате текущия клон, защото сте извън който и да е клон"
#: builtin/branch.c:704
#, c-format
msgid "Invalid branch name: '%s'"
-msgstr ""
+msgstr "Неправилно име на клон: „%s“"
#: builtin/branch.c:719
msgid "Branch rename failed"
-msgstr ""
+msgstr "Неуспешно преименуване на клон"
#: builtin/branch.c:723
#, c-format
msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
+msgstr "На клона с неправилно име „%s“ е дадено служебно име"
#: builtin/branch.c:727
#, c-format
msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
+msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е преименуван"
#: builtin/branch.c:734
msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
+msgstr "Клонът е преименуван, но конфигурационният файл не бе обновен"
#: builtin/branch.c:749
#, c-format
msgid "malformed object name %s"
-msgstr ""
+msgstr "неправилно име на обект „%s“"
#: builtin/branch.c:773
#, c-format
msgid "could not write branch description template: %s"
-msgstr ""
+msgstr "шаблонът за описание на клон не бе записан: „%s“"
#: builtin/branch.c:803
msgid "Generic options"
-msgstr ""
+msgstr "Общи настройки"
#: builtin/branch.c:805
msgid "show hash and subject, give twice for upstream branch"
msgstr ""
+"извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони"
#: builtin/branch.c:806
msgid "suppress informational messages"
-msgstr ""
+msgstr "без информационни съобщения"
#: builtin/branch.c:807
msgid "set up tracking mode (see git-pull(1))"
-msgstr ""
+msgstr "задаване на режима на следене (виж git-pull(1))"
#: builtin/branch.c:809
msgid "change upstream info"
-msgstr ""
+msgstr "смяна на следения клон"
#: builtin/branch.c:813
msgid "use colored output"
-msgstr ""
+msgstr "цветен изход"
#: builtin/branch.c:814
msgid "act on remote-tracking branches"
-msgstr ""
+msgstr "действие върху следящите клони"
#: builtin/branch.c:817 builtin/branch.c:823 builtin/branch.c:844
-#: builtin/branch.c:850 builtin/commit.c:1460 builtin/commit.c:1461
-#: builtin/commit.c:1462 builtin/commit.c:1463 builtin/tag.c:468
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
-msgstr ""
+msgstr "подаване"
#: builtin/branch.c:818 builtin/branch.c:824
msgid "print only branches that contain the commit"
-msgstr ""
+msgstr "извеждане само на клоните, които съдържат това подаване"
#: builtin/branch.c:830
msgid "Specific git-branch actions:"
-msgstr ""
+msgstr "Специални действия на „git-branch“:"
#: builtin/branch.c:831
msgid "list both remote-tracking and local branches"
-msgstr ""
+msgstr "извеждане както на следящите, така и на локалните клони"
#: builtin/branch.c:833
msgid "delete fully merged branch"
-msgstr ""
+msgstr "изтриване на клони, които са напълно слети"
#: builtin/branch.c:834
msgid "delete branch (even if not merged)"
-msgstr ""
+msgstr "изтриване и на клони, които не са напълно слети"
#: builtin/branch.c:835
msgid "move/rename a branch and its reflog"
msgstr ""
+"преместване/преименуване на клон и принадлежащият му журнал на указателите"
#: builtin/branch.c:836
msgid "move/rename a branch, even if target exists"
-msgstr ""
+msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име"
#: builtin/branch.c:837
msgid "list branch names"
-msgstr ""
+msgstr "извеждане на имената на клоните"
#: builtin/branch.c:838
msgid "create the branch's reflog"
-msgstr ""
+msgstr "създаване на журнала на указателите на клона"
#: builtin/branch.c:840
msgid "edit the description for the branch"
-msgstr ""
+msgstr "редактиране на описанието на клона"
#: builtin/branch.c:841
msgid "force creation (when already exists)"
-msgstr ""
+msgstr "принудително създаване, дори ако съществува клон с такова име"
#: builtin/branch.c:844
msgid "print only not merged branches"
-msgstr ""
+msgstr "извеждане само на неслетите клони"
#: builtin/branch.c:850
msgid "print only merged branches"
-msgstr ""
+msgstr "извеждане само на слетите клони"
#: builtin/branch.c:854
msgid "list branches in columns"
-msgstr ""
+msgstr "извеждане по колони"
#: builtin/branch.c:867
msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
+msgstr "Не може да се открие към какво сочи указателят „HEAD“"
#: builtin/branch.c:872 builtin/clone.c:635
msgid "HEAD not found below refs/heads!"
-msgstr ""
+msgstr "В директорията „refs/heads“ липсва файл „HEAD“"
#: builtin/branch.c:896
msgid "--column and --verbose are incompatible"
-msgstr ""
+msgstr "Опциите „--column“ и „--verbose“ са несъвместими"
#: builtin/branch.c:902 builtin/branch.c:941
msgid "branch name required"
-msgstr ""
+msgstr "Необходимо е име на клон"
#: builtin/branch.c:917
msgid "Cannot give description to detached HEAD"
-msgstr ""
+msgstr "Не може да зададете описание на „HEAD“ извън клон"
#: builtin/branch.c:922
msgid "cannot edit description of more than one branch"
-msgstr ""
+msgstr "Не може да редактирате описанието на повече от един клон едновременно"
#: builtin/branch.c:929
#, c-format
msgid "No commit on branch '%s' yet."
-msgstr ""
+msgstr "В клона „%s“ все още няма подавания."
#: builtin/branch.c:932
#, c-format
msgid "No branch named '%s'."
-msgstr ""
+msgstr "Липсва клон на име „%s“."
#: builtin/branch.c:947
msgid "too many branches for a rename operation"
-msgstr ""
+msgstr "Прекалено много клони за преименуване"
#: builtin/branch.c:952
msgid "too many branches to set new upstream"
-msgstr ""
+msgstr "Прекалено много клони за задаване на следене"
#: builtin/branch.c:956
#, c-format
msgid ""
"could not set upstream of HEAD to %s when it does not point to any branch."
msgstr ""
+"Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към "
+"никой клон."
#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
#, c-format
msgid "no such branch '%s'"
-msgstr ""
+msgstr "Няма клон на име „%s“."
#: builtin/branch.c:963
#, c-format
msgid "branch '%s' does not exist"
-msgstr ""
+msgstr "Не съществува клон на име „%s“."
#: builtin/branch.c:975
msgid "too many branches to unset upstream"
-msgstr ""
+msgstr "Прекалено много клони за махане на следене"
#: builtin/branch.c:979
msgid "could not unset upstream of HEAD when it does not point to any branch."
msgstr ""
+"Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон."
#: builtin/branch.c:985
#, c-format
msgid "Branch '%s' has no upstream information"
-msgstr ""
+msgstr "Няма информация клонът „%s“ да следи някой друг"
#: builtin/branch.c:999
msgid "it does not make sense to create 'HEAD' manually"
-msgstr ""
+msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“."
#: builtin/branch.c:1005
msgid "-a and -r options to 'git branch' do not make sense with a branch name"
-msgstr ""
+msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон"
#: builtin/branch.c:1008
#, c-format
@@ -3077,6 +3152,8 @@ msgid ""
"The --set-upstream flag is deprecated and will be removed. Consider using --"
"track or --set-upstream-to\n"
msgstr ""
+"Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. "
+"Използвайте „--track“ или „--set-upstream-to“\n"
#: builtin/branch.c:1025
#, c-format
@@ -3085,16 +3162,19 @@ msgid ""
"If you wanted to make '%s' track '%s', do this:\n"
"\n"
msgstr ""
+"\n"
+"За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n"
+"\n"
#: builtin/branch.c:1026
#, c-format
msgid " git branch -d %s\n"
-msgstr ""
+msgstr " git branch -d %s\n"
#: builtin/branch.c:1027
#, c-format
msgid " git branch --set-upstream-to %s\n"
-msgstr ""
+msgstr " git branch --set-upstream-to %s\n"
#: builtin/bundle.c:47
#, c-format
@@ -3109,71 +3189,71 @@ msgstr ""
msgid "Need a repository to unbundle."
msgstr ""
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr ""
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr ""
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr ""
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr ""
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr ""
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr ""
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr ""
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr ""
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr ""
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr ""
#: builtin/check-attr.c:11
msgid "git check-attr [-a | --all | attr...] [--] pathname..."
-msgstr ""
+msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…"
#: builtin/check-attr.c:12
msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"
-msgstr ""
+msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…] < СПИСЪК_С_ПЪТИЩА"
#: builtin/check-attr.c:19
msgid "report all attributes set on file"
-msgstr ""
+msgstr "извеждане на всички атрибути, зададени върху файл"
#: builtin/check-attr.c:20
msgid "use .gitattributes only from the index"
-msgstr ""
+msgstr "използване на файла „.gitattributes“ само от индекса"
#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
msgid "read file names from stdin"
-msgstr ""
+msgstr "изчитане на имената на файловете от стандартния вход"
#: builtin/check-attr.c:23 builtin/check-ignore.c:24
msgid "terminate input and output records by a NUL character"
-msgstr ""
+msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "без показване на напредъка"
@@ -3211,20 +3291,20 @@ msgstr ""
#: builtin/check-mailmap.c:8
msgid "git check-mailmap [options] <contact>..."
-msgstr ""
+msgstr "git check-mailmap [ОПЦИИ] КОНТАКТ…"
#: builtin/check-mailmap.c:13
msgid "also read contacts from stdin"
-msgstr ""
+msgstr "четене на контакти и от стандартния вход"
#: builtin/check-mailmap.c:24
#, c-format
msgid "unable to parse contact: %s"
-msgstr ""
+msgstr "контактът не може да бъде анализиран: %s"
#: builtin/check-mailmap.c:47
msgid "no contacts specified"
-msgstr ""
+msgstr "не са указани контакти"
#: builtin/checkout-index.c:126
msgid "git checkout-index [options] [--] [<file>...]"
@@ -3248,7 +3328,7 @@ msgstr ""
#: builtin/checkout-index.c:194
msgid "update stat information in the index file"
-msgstr ""
+msgstr "обновяване на информацията получена чрез „stat“ за файловете в индекса"
#: builtin/checkout-index.c:200
msgid "read list of paths from the standard input"
@@ -3272,112 +3352,115 @@ msgstr ""
#: builtin/checkout.c:25
msgid "git checkout [options] <branch>"
-msgstr ""
+msgstr "git checkout [ОПЦИИ] КЛОН"
#: builtin/checkout.c:26
msgid "git checkout [options] [<branch>] -- <file>..."
-msgstr ""
+msgstr "git checkout [ОПЦИИ] [КЛОН] -- ФАЙЛ…"
#: builtin/checkout.c:114 builtin/checkout.c:147
#, c-format
msgid "path '%s' does not have our version"
-msgstr ""
+msgstr "вашата версия липсва в пътя „%s“"
#: builtin/checkout.c:116 builtin/checkout.c:149
#, c-format
msgid "path '%s' does not have their version"
-msgstr ""
+msgstr "чуждата версия липсва в пътя „%s“"
+# FIXME SAME AS [1]
#: builtin/checkout.c:132
#, c-format
msgid "path '%s' does not have all necessary versions"
-msgstr ""
+msgstr "някоя от необходимите версии липсва в пътя „%s“"
+# FIXME SAME AS [1]
#: builtin/checkout.c:176
#, c-format
msgid "path '%s' does not have necessary versions"
-msgstr ""
+msgstr "някоя от необходимите версии липсва в пътя „%s“"
#: builtin/checkout.c:193
#, c-format
msgid "path '%s': cannot merge"
-msgstr ""
+msgstr "пътят „%s“ не може да бъде слян"
#: builtin/checkout.c:210
#, c-format
msgid "Unable to add merge result for '%s'"
-msgstr ""
+msgstr "Резултатът за „%s“ не може да бъде слян"
#: builtin/checkout.c:232 builtin/checkout.c:235 builtin/checkout.c:238
#: builtin/checkout.c:241
#, c-format
msgid "'%s' cannot be used with updating paths"
-msgstr ""
+msgstr "Опцията „%s“ е несъвместима с обновяването на пътища"
#: builtin/checkout.c:244 builtin/checkout.c:247
#, c-format
msgid "'%s' cannot be used with %s"
-msgstr ""
+msgstr "Опцията „%s“ е несъвместима с „%s“"
#: builtin/checkout.c:250
#, c-format
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
+"Невъзможно е едновременно да обновявате пътища и да се прехвърлите към клона "
+"„%s“."
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
-msgstr ""
+msgstr "повреден файл на индекса"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
-msgstr ""
+msgstr "пътят „%s“ не е слят"
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
-msgstr ""
+msgstr "първо трябва да коригирате индекса си"
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
-msgstr ""
+msgstr "Журналът на указателите за „%s“ не може да бъде създаден\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
-msgstr ""
+msgstr "Указателят „HEAD“ в момента сочи към"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
-msgstr ""
+msgstr "Зануляване на клона „%s“\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
-msgstr ""
+msgstr "Вече сте на „%s“\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
-msgstr ""
+msgstr "Преминаване към клона „%s“ и зануляване на промените\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
-msgstr ""
+msgstr "Преминахте към новия клон „%s“\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
-msgstr ""
+msgstr "Преминахте към клона „%s“\n"
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
-msgstr ""
+msgstr "… и още %d.\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3390,9 +3473,16 @@ msgid_plural ""
"\n"
"%s\n"
msgstr[0] ""
+"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подаване, което не е свързано към никой клон:\n"
+"\n"
+"%s\n"
msgstr[1] ""
+"ПРЕДУПРЕЖДЕНИЕ: изоставяте %d подавания, които не са свързани към никой "
+"клон:\n"
+"\n"
+"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3401,157 +3491,171 @@ msgid ""
" git branch new_branch_name %s\n"
"\n"
msgstr ""
+"Ако все пак искате да ги запазите, сега вероятно е най-подходящият момент "
+"да\n"
+"създадете нов клон с тях чрез командата:\n"
+"\n"
+" git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n"
+"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
-msgstr ""
+msgstr "вътрешна грешка при обхождането на версиите"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
-msgstr ""
+msgstr "Преди това „HEAD“ сочеше към"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
-msgstr ""
+msgstr "В момента сте на клон, който предстои да бъде създаден"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
-msgstr ""
+msgstr "очакваше се един указател, а сте подали %d."
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
-msgstr ""
+msgstr "неправилен указател: %s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
-msgstr ""
+msgstr "указателят не сочи към обект-дърво: %s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
-msgstr ""
+msgstr "задаването на път е несъвместимо с преминаването от един клон към друг"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
-msgstr ""
+msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
-msgstr ""
+msgstr "опцията „%s“ е несъвместима с „%s“"
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr ""
+"За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не "
+"е такъв"
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "клон"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
-msgstr ""
+msgstr "създаване и преминаване към нов клон"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
-msgstr ""
+msgstr "създаване/зануляване на клон и преминаване към него"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
-msgstr ""
+msgstr "създаване на журнал на указателите за нов клон"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
-msgstr ""
+msgstr "отделяне на указателя „HEAD“ към указаното подаване"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
-msgstr ""
+msgstr "задаване на кой клон бива следен при създаването на новия клон"
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr ""
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "НОВ_КЛОН"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
-msgstr ""
+msgstr "нов клон без родител"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
-msgstr ""
+msgstr "изтегляне на вашата версия на неслетите файлове"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
-msgstr ""
+msgstr "изтегляне на чуждата версия на неслетите файлове"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
-msgstr ""
+msgstr "принудително изтегляне (вашите промени ще бъдат занулени)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
-msgstr ""
+msgstr "извършване на тройно сливане с новия клон"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
-msgstr ""
+msgstr "обновяване на игнорираните файлове (стандартно)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "стил"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
-msgstr ""
+msgstr "действие при конфликт (сливане или тройна разлика)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
+msgstr "без ограничаване на изброените пътища само до частично изтеглените"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr ""
+"последващ опит за отгатване след неуспешен опит с „git checkout no-such-"
+"branch“"
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
-msgstr ""
+msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
-msgstr ""
+msgstr "опцията „--track“ изисква име на клон"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
-msgstr ""
+msgstr "Липсва име на клон, използвайте опцията „-b“"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
-msgstr ""
+msgstr "указан е неправилен път"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
"Did you intend to checkout '%s' which can not be resolved as commit?"
msgstr ""
+"Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n"
+"Дали не искате да изтеглите „%s“, който не сочи към подаване?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
+msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“"
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
msgstr ""
+"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“ са "
+"несъвместими\n"
+"с изтегляне от индекса."
#: builtin/clean.c:26
msgid ""
@@ -3583,7 +3687,7 @@ msgstr ""
msgid "failed to remove %s"
msgstr ""
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3591,7 +3695,7 @@ msgid ""
" - (empty) select nothing"
msgstr ""
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3603,35 +3707,35 @@ msgid ""
" - (empty) finish selecting"
msgstr ""
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr ""
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr ""
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr ""
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr ""
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr ""
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr ""
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3642,215 +3746,218 @@ msgid ""
"? - help for prompt selection"
msgstr ""
-#: builtin/clean.c:817
+# FIXME how many ***
+#: builtin/clean.c:818
msgid "*** Commands ***"
-msgstr ""
+msgstr "●●● Команди ●●●"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr ""
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] ""
msgstr[1] ""
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr ""
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr ""
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr ""
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr ""
-#: builtin/clean.c:879
+#: builtin/clean.c:880
msgid "remove whole directories"
msgstr ""
-#: builtin/clean.c:880 builtin/describe.c:420 builtin/grep.c:718
-#: builtin/ls-files.c:483 builtin/name-rev.c:314 builtin/show-ref.c:185
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
-msgstr ""
+msgstr "шаблон"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr ""
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr ""
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr ""
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr ""
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
#: builtin/clone.c:36
msgid "git clone [options] [--] <repo> [<dir>]"
-msgstr ""
+msgstr "git clone [ОПЦИИ] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
-msgstr ""
+msgstr "извеждане на напредъка"
#: builtin/clone.c:66
msgid "don't create a checkout"
-msgstr ""
+msgstr "без създаване на работно дърво"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
-msgstr ""
+msgstr "създаване на голо хранилище"
#: builtin/clone.c:71
msgid "create a mirror repository (implies bare)"
-msgstr ""
+msgstr "създаване на хранилище-огледало (това включва хранилището да е голо)"
#: builtin/clone.c:73
msgid "to clone from a local repository"
-msgstr ""
+msgstr "клониране от локално хранилище"
#: builtin/clone.c:75
msgid "don't use local hardlinks, always copy"
-msgstr ""
+msgstr "без твърди връзки, файловете винаги да се копират"
#: builtin/clone.c:77
msgid "setup as shared repository"
-msgstr ""
+msgstr "настройване за споделено хранилище"
#: builtin/clone.c:79 builtin/clone.c:81
msgid "initialize submodules in the clone"
-msgstr ""
+msgstr "инициализиране на подмодулите при това клониране"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
-msgstr ""
+msgstr "директория с шаблони"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
-msgstr ""
+msgstr "директория, която съдържа шаблоните, които да се ползват"
#: builtin/clone.c:85
msgid "reference repository"
-msgstr ""
+msgstr "еталонно хранилище"
#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
msgid "name"
-msgstr ""
+msgstr "ИМЕ"
#: builtin/clone.c:87
msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
+msgstr "използване на това ИМЕ вместо „origin“ при проследяване на клони"
#: builtin/clone.c:89
msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
+msgstr "изтегляне на този КЛОН, а не соченият от отдалечения указател „HEAD“"
#: builtin/clone.c:91
msgid "path to git-upload-pack on the remote"
-msgstr ""
+msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
-msgstr ""
+msgstr "ДЪЛБОЧИНА"
#: builtin/clone.c:93
msgid "create a shallow clone of that depth"
-msgstr ""
+msgstr "плитко клониране до тази ДЪЛБОЧИНА"
#: builtin/clone.c:95
msgid "clone only one branch, HEAD or --branch"
msgstr ""
+"клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично "
+"зададения с „--branch“"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
-msgstr ""
+msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
-msgstr ""
+msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво"
#: builtin/clone.c:98
msgid "key=value"
-msgstr ""
+msgstr "КЛЮЧ=СТОЙНОСТ"
#: builtin/clone.c:99
msgid "set config inside the new repository"
-msgstr ""
+msgstr "задаване на настройките на новото хранилище"
#: builtin/clone.c:252
#, c-format
msgid "reference repository '%s' is not a local repository."
-msgstr ""
+msgstr "еталонното хранилище „%s“ не е локално"
#: builtin/clone.c:256
#, c-format
msgid "reference repository '%s' is shallow"
-msgstr ""
+msgstr "еталонното хранилище „%s“ е плитко"
#: builtin/clone.c:259
#, c-format
msgid "reference repository '%s' is grafted"
-msgstr ""
+msgstr "еталонното хранилище „%s“ е с присаждане"
#: builtin/clone.c:321
#, c-format
msgid "failed to create directory '%s'"
-msgstr ""
+msgstr "директорията „%s“ не може да бъде създадена"
#: builtin/clone.c:323 builtin/diff.c:83
#, c-format
msgid "failed to stat '%s'"
-msgstr ""
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“"
#: builtin/clone.c:325
#, c-format
msgid "%s exists and is not a directory"
-msgstr ""
+msgstr "„%s“ съществува и не е директория"
#: builtin/clone.c:339
#, c-format
msgid "failed to stat %s\n"
-msgstr ""
+msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n"
#: builtin/clone.c:361
#, c-format
msgid "failed to create link '%s'"
-msgstr ""
+msgstr "връзката „%s“ не може да бъде създадена"
#: builtin/clone.c:365
#, c-format
msgid "failed to copy file to '%s'"
-msgstr ""
+msgstr "файлът не можа да бъде копиран като „%s“"
#: builtin/clone.c:388 builtin/clone.c:565
#, c-format
msgid "done.\n"
-msgstr ""
+msgstr "действието завърши.\n"
#: builtin/clone.c:401
msgid ""
@@ -3858,111 +3965,121 @@ msgid ""
"You can inspect what was checked out with 'git status'\n"
"and retry the checkout with 'git checkout -f HEAD'\n"
msgstr ""
+"Клонирането бе успешно за разлика от подготовката на работното дърво\n"
+"за определен клон. Все пак можете да проверите кои файлове и от кой\n"
+"клон в момента са изтеглени с командата „git status“. Можете да\n"
+"завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n"
#: builtin/clone.c:480
#, c-format
msgid "Could not find remote branch %s to clone."
msgstr ""
+"Клонът „%s“ от отдалеченото хранилище което клонирате,\n"
+"който следва да бъде изтеглен, не съществува."
#: builtin/clone.c:560
#, c-format
msgid "Checking connectivity... "
-msgstr ""
+msgstr "Проверка на връзката…"
#: builtin/clone.c:563
msgid "remote did not send all necessary objects"
-msgstr ""
+msgstr "отдалеченото хранилище не изпрати всички необходими обекти."
#: builtin/clone.c:626
msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
msgstr ""
+"указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n"
+"което не съществува. Не може да се изтегли определен клон.\n"
#: builtin/clone.c:657
msgid "unable to checkout working tree"
-msgstr ""
+msgstr "работното дърво не може да бъде подготвено"
#: builtin/clone.c:765
msgid "Too many arguments."
-msgstr ""
+msgstr "Прекалено много аргументи."
#: builtin/clone.c:769
msgid "You must specify a repository to clone."
-msgstr ""
+msgstr "Трябва да укажете кое хранилище искате да клонирате."
#: builtin/clone.c:780
#, c-format
msgid "--bare and --origin %s options are incompatible."
-msgstr ""
+msgstr "опциите „--bare“ и „--origin %s“ са несъвместими."
#: builtin/clone.c:783
msgid "--bare and --separate-git-dir are incompatible."
-msgstr ""
+msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими."
#: builtin/clone.c:796
#, c-format
msgid "repository '%s' does not exist"
-msgstr ""
+msgstr "не съществува хранилище „%s“"
#: builtin/clone.c:802
msgid "--depth is ignored in local clones; use file:// instead."
msgstr ""
+"При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата "
+"„file://“."
#: builtin/clone.c:805
msgid "source repository is shallow, ignoring --local"
-msgstr ""
+msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира"
#: builtin/clone.c:810
msgid "--local is ignored"
-msgstr ""
+msgstr "опцията „--local“ се игнорира"
#: builtin/clone.c:814 builtin/fetch.c:1119
#, c-format
msgid "depth %s is not a positive number"
-msgstr ""
+msgstr "дълбочината трябва да е положително цяло число, а не „%s“"
#: builtin/clone.c:824
#, c-format
msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
+msgstr "целевият път „%s“ съществува и не е празна директория."
#: builtin/clone.c:834
#, c-format
msgid "working tree '%s' already exists."
-msgstr ""
+msgstr "в „%s“ вече съществува работно дърво."
#: builtin/clone.c:847 builtin/clone.c:859
#, c-format
msgid "could not create leading directories of '%s'"
-msgstr ""
+msgstr "родителските директории на „%s“ не могат да бъдат създадени"
#: builtin/clone.c:850
#, c-format
msgid "could not create work tree dir '%s'."
-msgstr ""
+msgstr "работното дърво в „%s“ не може да бъде създадено."
#: builtin/clone.c:869
#, c-format
msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
+msgstr "Клониране и създаване на голо хранилище в „%s“…\n"
#: builtin/clone.c:871
#, c-format
msgid "Cloning into '%s'...\n"
-msgstr ""
+msgstr "Клониране и създаване на хранилище в „%s“…\n"
#: builtin/clone.c:906
#, c-format
msgid "Don't know how to clone %s"
-msgstr ""
+msgstr "Не се поддържа клониране на връзки от вида „%s“ "
#: builtin/clone.c:957 builtin/clone.c:965
#, c-format
msgid "Remote branch %s not found in upstream %s"
-msgstr ""
+msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“"
#: builtin/clone.c:968
msgid "You appear to have cloned an empty repository."
-msgstr ""
+msgstr "Изглежда клонирахте празно хранилище."
#: builtin/column.c:9
msgid "git column [options]"
@@ -3998,11 +4115,11 @@ msgstr ""
#: builtin/commit.c:36
msgid "git commit [options] [--] <pathspec>..."
-msgstr ""
+msgstr "git commit [ОПЦИИ] [--] ПЪТ…"
#: builtin/commit.c:41
msgid "git status [options] [--] <pathspec>..."
-msgstr ""
+msgstr "git status [ОПЦИИ] [--] ПЪТ…"
#: builtin/commit.c:46
msgid ""
@@ -4017,6 +4134,17 @@ msgid ""
"\n"
" git commit --amend --reset-author\n"
msgstr ""
+"Името и адресът за е-поща са настроени автоматично на базата на името на\n"
+"потребителя и името на машината. Проверете дали са верни. Можете да спрете\n"
+"това съобщение като изрично зададете стойностите:\n"
+"\n"
+" git config --global user.name \"Вашето Име\"\n"
+" git config --global user.email пенчо@example.com\n"
+"\n"
+"След като направите това, можете да коригирате информацията за автора на\n"
+"текущото подаване чрез:\n"
+"\n"
+" git commit --amend --reset-author\n"
#: builtin/commit.c:58
msgid ""
@@ -4024,6 +4152,11 @@ msgid ""
"it empty. You can repeat your command with --allow-empty, or you can\n"
"remove the commit entirely with \"git reset HEAD^\".\n"
msgstr ""
+"Поискахте да поправите последното си подаване. Това действие ще превърне\n"
+"подаването в празно. Можете или да го повторите като разрешите такива "
+"подавания\n"
+"с опцията „--allow-empty“, или да го изтриете от историята с командата:\n"
+"„git reset HEAD^“.\n"
#: builtin/commit.c:63
msgid ""
@@ -4033,10 +4166,16 @@ msgid ""
" git commit --allow-empty\n"
"\n"
msgstr ""
+"Предишното отбрано подаване вече е празно, като най-вероятната причина е\n"
+"корекция на конфликт. Ако все пак искате да го ползвате, използвайте "
+"командата:\n"
+"\n"
+" git commit --allow-empty\n"
+"\n"
#: builtin/commit.c:70
msgid "Otherwise, please use 'git reset'\n"
-msgstr ""
+msgstr "В противен случай използвайте командата „git reset“\n"
#: builtin/commit.c:73
msgid ""
@@ -4047,95 +4186,101 @@ msgid ""
"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
"the remaining commits.\n"
msgstr ""
+"Ако искате да прескочите това подаване, използвайте командата:\n"
+"\n"
+" git reset\n"
+"\n"
+"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
+"останалите подавания.\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
-msgstr ""
+msgstr "неуспешно изваждана на върховото дърво (HEAD tree object) от пакет"
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
-msgstr ""
+msgstr "неуспешно създаване на временен индекс"
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
-msgstr ""
+msgstr "неуспешно интерактивно добавяне"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
-msgstr ""
+msgstr "неуспешен запис на новия индекс"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
-msgstr ""
+msgstr "по време на сливане не може да се извърши частично подаване."
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
+msgstr "по време на отбиране не може да се извърши частично подаване."
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
-msgstr ""
+msgstr "индексът не може да бъде прочетен"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
-msgstr ""
+msgstr "временният индекс не може да бъде записан"
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
-msgstr ""
+msgstr "неправилно подаване: %s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
-msgstr ""
+msgstr "неправилен параметър към опцията „--author“"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
-msgstr ""
+msgstr "Неправилен низ за идентичност: „%s“"
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
-msgstr ""
+msgstr "следното подаване не може да бъде открито: %s"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
-msgstr ""
+msgstr "(изчитане на съобщението за подаване от стандартния вход)\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
-msgstr ""
+msgstr "съобщението за подаване не бе прочетено стандартния вход"
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
-msgstr ""
+msgstr "файлът със съобщението за подаване „%s“ не може да бъде прочетен"
#: builtin/commit.c:654
msgid "commit has empty message"
-msgstr ""
+msgstr "подаване с празно съобщение"
#: builtin/commit.c:670
msgid "could not read MERGE_MSG"
-msgstr ""
+msgstr "съобщението за сливане MERGE_MSG не може да бъде прочетено"
#: builtin/commit.c:674
msgid "could not read SQUASH_MSG"
-msgstr ""
+msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено"
#: builtin/commit.c:678
#, c-format
msgid "could not read '%s'"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде прочетен"
#: builtin/commit.c:749
msgid "could not write commit template"
-msgstr ""
+msgstr "шаблонът за подаване не може да бъде запазен"
# FIXME
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4144,9 +4289,14 @@ msgid ""
"\t%s\n"
"and try again.\n"
msgstr ""
+"\n"
+"Изглежда, че подавате сливане. Ако това не е така, изтрийте файла:\n"
+"\n"
+" %s\n"
+"и опитайте отново.\n"
# FIXME
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4155,681 +4305,724 @@ msgid ""
"\t%s\n"
"and try again.\n"
msgstr ""
+"\n"
+"Изглежда, че извършвате отбрано подаване. Ако това не е така, изтрийте "
+"файла:\n"
+"\n"
+" %s\n"
+"и опитайте отново.\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
"with '%c' will be ignored, and an empty message aborts the commit.\n"
msgstr ""
+"Въведете съобщението за подаване на промените. Редовете, които започват\n"
+"с „%c“ ще бъдат филтрирани, а празно съобщение отменя подаването.\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
"with '%c' will be kept; you may remove them yourself if you want to.\n"
"An empty message aborts the commit.\n"
msgstr ""
+"Въведете съобщението за подаване на промените. Редовете, които започват\n"
+"с „%c“ НЯМА да бъдат филтрирани, може да ги изтриете вие. Празно \n"
+"съобщение отменя подаването.\n"
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
-msgstr ""
+msgstr "%sАвтор: %s"
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
-msgstr ""
+msgstr "%sПодаващ: %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
-msgstr ""
+msgstr "Индексът не може да бъде прочетен"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
-msgstr ""
+msgstr "Грешка при изграждане на дърветата"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
+msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
-msgstr ""
+msgstr "Не е открит автор с име „%s“."
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
-msgstr ""
+msgstr "Неправилна стойност за неследените файлове: „%s“"
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
-msgstr ""
+msgstr "Опциите „--long“ и „-z“ са несъвместими."
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
-msgstr ""
+msgstr "Опциите „--reset-author“ и „--author“ са несъвместими."
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
-msgstr ""
+msgstr "Няма какво да бъде поправено."
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
+msgstr "В момента се извършва сливане, не можете да поправяте."
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
+msgstr "В момента се извършва отбиране на подаване, не можете да поправяте."
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
-msgstr ""
+msgstr "Опциите „--squash“ и „--fixup“ са несъвместими."
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr ""
+"Можете да използвате само една от опциите „-c“, „-C“, „-F“ и „--fixup“."
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
-msgstr ""
+msgstr "Опцията „-m“ е несъвместима с „-c“, „-C“, „-F“ и „--fixup“."
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
+"Опцията „--reset-author“ може да се използва само заедно с „-C“, „-c“ или\n"
+"„--amend“."
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
+"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ са\n"
+"несъвместими."
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
-msgstr ""
+msgstr "Опциите „--include“ и „--only“ изискват аргументи."
-#: builtin/commit.c:1124
+# FIXME bad message
+#: builtin/commit.c:1129
msgid "Clever... amending the last one with dirty index."
msgstr ""
+"Поправяте последното подаване докато индекса има проблеми. Това е лоша идея."
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr ""
+"Зададени са изрични пътища без опциите „-i“ или „-o“. Приема се, че все едно "
+"сте\n"
+"ползвали опцията „--only“ с ПЪТища…"
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
-msgstr ""
+msgstr "Несъществуващ режим на изчистване „%s“"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
-msgstr ""
+msgstr "Използването на пътища е несъвместимо със задаването на опцията „-a“."
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
-msgstr ""
+msgstr "кратка информация за състоянието"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
-msgstr ""
+msgstr "информация за клоните"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
-msgstr ""
+msgstr "формат на изхода за четене от програма"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
-msgstr ""
+msgstr "подробна информация за състоянието (стандартно)"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
-msgstr ""
+msgstr "разделяне на елементите с нулевия знак „NUL“"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
-msgstr ""
+msgstr "режим"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
+"извеждане на неследените файлове. Възможните режими са „all“ (подробна\n"
+"информация), „normal“ (кратка информация), „no“ (без неследените файлове).\n"
+"Стандартният режим е: „all“."
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
-msgstr ""
+msgstr "извеждане на игнорираните файлове"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "кога"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
msgstr ""
+"игнориране на промените в подмодулите. Опция с незадължителна стойност — "
+"една от\n"
+"„all“ (всички), „dirty“ (тези с неподадени промени), „untracked“ (неследени)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
-msgstr ""
+msgstr "извеждане на неследените файлове в колони"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
-msgstr ""
+msgstr "току що създаденото подаване не може да бъде открито"
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
-msgstr ""
+msgstr "току що създаденото подаване не може да бъде анализирано"
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
-msgstr ""
+msgstr "несвързан връх HEAD"
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
-msgstr ""
+msgstr " (начално подаване)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
-msgstr ""
+msgstr "без информация след успешно подаване"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
-msgstr ""
+msgstr "добавяне на разликата към шаблона за съобщението при подаване"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
-msgstr ""
+msgstr "Опции за съобщението при подаване"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
-msgstr ""
+msgstr "взимане та съобщението от файл"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
-msgstr ""
+msgstr "автор"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
-msgstr ""
+msgstr "задаване на автор за подаването"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "дата"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
msgid "override date for commit"
-msgstr ""
+msgstr "задаване на дата за подаването"
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
-msgstr ""
+msgstr "съобщение"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
-msgstr ""
+msgstr "съобщение при подаване"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
-msgstr ""
+msgstr "преизползване и редактиране на съобщението от указаното подаване"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
-msgstr ""
+msgstr "преизползване на съобщението от указаното подаване"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
+"използване на автоматичното съобщение при смачкване за вкарване на "
+"указаното\n"
+"подаване в предното без следа"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
+"използване на автоматичното съобщение при смачкване за смачкване на "
+"указаното\n"
+"подаване в предното"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr ""
+"смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
-msgstr ""
+msgstr "добавяне на поле за подпис — „Signed-off-by:“"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
-msgstr ""
+msgstr "използване на указания шаблонен файл"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
-msgstr ""
+msgstr "редактиране на подаване"
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
-msgstr ""
+msgstr "стандартно"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
-msgstr ""
+msgstr "кои празни знаци и #коментари да се махат от съобщенията"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
-msgstr ""
+msgstr "вмъкване на състоянието в шаблона за съобщението при подаване"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr ""
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
-msgstr ""
+msgstr "подписване на подаването с GPG"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
-msgstr ""
+msgstr "Опции за избор на файлове при подаване"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
-msgstr ""
+msgstr "подаване на всички променени файлове"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
-msgstr ""
+msgstr "добавяне на указаните файлове към индекса за подаване"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
-msgstr ""
+msgstr "интерактивно добавяне на файлове"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
-msgstr ""
+msgstr "интерактивно добавяне на промени"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
-msgstr ""
+msgstr "подаване само на указаните файлове"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
-msgstr ""
+msgstr "без изпълнение на куката преди подаване (pre-commit)"
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
-msgstr ""
+msgstr "отпечатване на това, което би било подадено"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
-msgstr ""
+msgstr "поправяне на предишното подаване"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
-msgstr ""
+msgstr "без изпълнение на куката след презаписване (post-rewrite)"
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
-msgstr ""
+msgstr "позволяване на празни подавания"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
-msgstr ""
+msgstr "позволяване на подавания с празни съобщения"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
-msgstr ""
+msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
-msgstr ""
+msgstr "файлът не може да бъде прочетен: „%s“"
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
+msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
-msgstr ""
+msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
-msgstr ""
+msgstr "съобщението за подаване не може да бъде прочетено: %s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
+msgstr "Неизвършване на подаване поради нередактирано съобщение.\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
+msgstr "Неизвършване на подаване поради празно съобщение.\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
-msgstr ""
+msgstr "обектът за подаването не може да бъде записан"
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
-msgstr ""
+msgstr "указателят към върха „HEAD“ не може да бъде заключен"
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
-msgstr ""
+msgstr "указателят към върха „HEAD“ не може да бъде обновен"
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
"not exceeded, and then \"git reset HEAD\" to recover."
msgstr ""
+"Хранилището е обновено, но новият файл за индекс „new_index“\n"
+"не е записан. Проверете дали не е препълнен диска или не сте\n"
+"превишили дисковата си квота. След това изпълнете „git reset HEAD“."
#: builtin/config.c:8
msgid "git config [options]"
-msgstr ""
+msgstr "git config [ОПЦИИ]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
-msgstr ""
+msgstr "Местоположение на конфигурационния файл"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
-msgstr ""
+msgstr "използване на глобалния конфигурационен файл"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
-msgstr ""
+msgstr "използване на системния конфигурационен файл"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
-msgstr ""
+msgstr "използване на конфигурационния файл на хранилището"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
-msgstr ""
+msgstr "използване на зададения конфигурационен файл"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
-msgstr ""
+msgstr "идентификатор на BLOB"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr ""
+"изчитане на конфигурацията от BLOB с този идентификатор на съдържанието"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
-msgstr ""
+msgstr "Действие"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
-msgstr ""
+msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
-msgstr ""
+msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr ""
+"извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО "
+"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
+msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr ""
+"замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ "
+"[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
-msgstr ""
+msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
-msgstr ""
+msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
-msgstr ""
+msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
-msgstr ""
+msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
-msgstr ""
+msgstr "изтриване на раздел: ИМЕ"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
-msgstr ""
+msgstr "изброяване на всички"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
-msgstr ""
+msgstr "отваряне на редактор"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
-msgstr ""
+msgstr "настройка"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
-msgstr ""
+msgstr "извеждане на зададения цвят на настройката: [стандартно]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr ""
+"извеждане на зададения цвят на настройката: [стандартният изход е терминал]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
-msgstr ""
+msgstr "Вид"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
-msgstr ""
+msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)"
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
-msgstr ""
+msgstr "СТОЙНОСТТА е цяло, десетично число"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
-msgstr ""
+msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
-msgstr ""
+msgstr "СТОЙНОСТТА е път (до файл или директория)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
-msgstr ""
+msgstr "Други"
-#: builtin/config.c:81
+# FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
-msgstr ""
+msgstr "разделяне на стойностите с нулевия знак „NUL“"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
-msgstr ""
+msgstr "при търсене да се уважат и директивите за включване"
#: builtin/count-objects.c:82
msgid "git count-objects [-v] [-H | --human-readable]"
-msgstr ""
+msgstr "git count-objects [-v] [-H | --human-readable]"
#: builtin/count-objects.c:97
msgid "print sizes in human readable format"
-msgstr ""
+msgstr "извеждане на размерите на обектите във формат лесно четим от хора"
+# FIXME ... instead of *???
#: builtin/describe.c:16
msgid "git describe [options] <commit-ish>*"
-msgstr ""
+msgstr "git describe [ОПЦИИ] указател към подаване…"
#: builtin/describe.c:17
msgid "git describe [options] --dirty"
msgstr ""
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr ""
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr ""
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr ""
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr ""
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr ""
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr ""
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr ""
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr ""
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
"However, there were unannotated tags: try --tags."
msgstr ""
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
"Try --always, or create some tags."
msgstr ""
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr ""
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
"gave up search at %s\n"
msgstr ""
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr ""
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr ""
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr ""
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr ""
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr ""
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr ""
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr ""
-#: builtin/describe.c:419
-#, fuzzy
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
-msgstr "<брой>"
+msgstr "да се търси само в този БРОЙ последни етикети (стандартно: 10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr ""
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr ""
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr ""
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr ""
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr ""
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr ""
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
-msgstr ""
+msgstr "опцията „--dirty“ е несъвместима с указател към подаване"
#: builtin/diff.c:85
#, c-format
msgid "'%s': not a regular file or symlink"
-msgstr ""
+msgstr "„%s“: не е нито обикновен файл, нито символна връзка"
#: builtin/diff.c:236
#, c-format
msgid "invalid option: %s"
-msgstr ""
+msgstr "неправилна опция: %s"
#: builtin/diff.c:357
msgid "Not a git repository"
-msgstr ""
+msgstr "Не е хранилище на Git"
#: builtin/diff.c:400
#, c-format
msgid "invalid object '%s' given."
-msgstr ""
+msgstr "зададен е неправилен обект „%s“."
#: builtin/diff.c:409
#, c-format
msgid "more than two blobs given: '%s'"
-msgstr ""
+msgstr "зададени са повече от 2 обекта: „%s“"
#: builtin/diff.c:416
#, c-format
msgid "unhandled object '%s' given."
-msgstr ""
+msgstr "зададен е неподдържан обект „%s“."
#: builtin/fast-export.c:22
msgid "git fast-export [rev-list-opts]"
msgstr ""
#: builtin/fast-export.c:673
-#, fuzzy
msgid "show progress after <n> objects"
-msgstr "<брой>"
+msgstr "съобщение за напредъка на всеки такъв БРОЙ обекта"
#: builtin/fast-export.c:675
msgid "select handling of signed tags"
@@ -4865,165 +5058,168 @@ msgstr ""
#: builtin/fetch.c:20
msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
+msgstr "git fetch [ОПЦИИ] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]"
#: builtin/fetch.c:21
msgid "git fetch [<options>] <group>"
-msgstr ""
+msgstr "git fetch [ОПЦИИ] ГРУПА"
#: builtin/fetch.c:22
msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
+msgstr "git fetch --multiple [ОПЦИИ] [(ХРАНИЛИЩЕ | ГРУПА)…]"
#: builtin/fetch.c:23
msgid "git fetch --all [<options>]"
-msgstr ""
+msgstr "git fetch --all [ОПЦИИ]"
#: builtin/fetch.c:75
msgid "fetch from all remotes"
-msgstr ""
+msgstr "доставяне от всички отдалечени хранилища"
#: builtin/fetch.c:77
msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
+msgstr "добавяне към вместо замяна на „.git/FETCH_HEAD“"
#: builtin/fetch.c:79
msgid "path to upload pack on remote end"
-msgstr ""
+msgstr "отдалечен път, където да се качи пакетът"
#: builtin/fetch.c:80
msgid "force overwrite of local branch"
-msgstr ""
+msgstr "принудително презаписване на локалния клон"
#: builtin/fetch.c:82
msgid "fetch from multiple remotes"
-msgstr ""
+msgstr "доставяне от множество отдалечени хранилища"
#: builtin/fetch.c:84
msgid "fetch all tags and associated objects"
-msgstr ""
+msgstr "доставяне на всички етикети и принадлежащи обекти"
#: builtin/fetch.c:86
msgid "do not fetch all tags (--no-tags)"
-msgstr ""
+msgstr "без доставянето на всички етикети „--no-tags“"
#: builtin/fetch.c:88
msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
+msgstr "окастряне на клоните следящи вече не съществуващи отдалечени клони"
#: builtin/fetch.c:89
msgid "on-demand"
-msgstr ""
+msgstr "при нужда"
#: builtin/fetch.c:90
msgid "control recursive fetching of submodules"
-msgstr ""
+msgstr "управление на рекурсивното доставяне на подмодулите"
#: builtin/fetch.c:94
msgid "keep downloaded pack"
-msgstr ""
+msgstr "запазване на изтеглените пакети с обекти"
#: builtin/fetch.c:96
msgid "allow updating of HEAD ref"
-msgstr ""
+msgstr "позволяване на обновяването на указателя „HEAD“"
#: builtin/fetch.c:99
msgid "deepen history of shallow clone"
-msgstr ""
+msgstr "задълбочаване на историята на плитко хранилище"
#: builtin/fetch.c:101
msgid "convert to a complete repository"
-msgstr ""
+msgstr "превръщане в пълно хранилище"
#: builtin/fetch.c:103 builtin/log.c:1197
msgid "dir"
-msgstr ""
+msgstr "директория"
#: builtin/fetch.c:104
msgid "prepend this to submodule path output"
-msgstr ""
+msgstr "добавяне на това пред пътя на подмодула"
#: builtin/fetch.c:107
msgid "default mode for recursion"
-msgstr ""
+msgstr "стандартен режим на рекурсия"
#: builtin/fetch.c:109
msgid "accept refs that update .git/shallow"
-msgstr ""
+msgstr "приемане на указатели, които обновяват „.git/shallow“"
#: builtin/fetch.c:347
msgid "Couldn't find remote ref HEAD"
-msgstr ""
+msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит"
#: builtin/fetch.c:411
#, c-format
msgid "object %s not found"
-msgstr ""
+msgstr "обектът „%s“ липсва"
#: builtin/fetch.c:416
msgid "[up to date]"
-msgstr ""
+msgstr "[актуализиран]"
+# FIXME - the signs
#: builtin/fetch.c:430
#, c-format
msgid "! %-*s %-*s -> %s (can't fetch in current branch)"
-msgstr ""
+msgstr "! %-*s %-*s -> %s (в текущия клон не може да се доставя)"
#: builtin/fetch.c:431 builtin/fetch.c:517
msgid "[rejected]"
-msgstr ""
+msgstr "[отхвърлен]"
#: builtin/fetch.c:442
msgid "[tag update]"
-msgstr ""
+msgstr "[обновяване на етикетите]"
#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
msgid " (unable to update local ref)"
-msgstr ""
+msgstr " (локалните указатели не могат да бъдат обновени)"
#: builtin/fetch.c:462
msgid "[new tag]"
-msgstr ""
+msgstr "[нов етикет]"
#: builtin/fetch.c:465
msgid "[new branch]"
-msgstr ""
+msgstr "[нов клон]"
#: builtin/fetch.c:468
msgid "[new ref]"
-msgstr ""
+msgstr "[нов указател]"
#: builtin/fetch.c:513
msgid "unable to update local ref"
-msgstr ""
+msgstr "локален указател не може да бъде обновен"
#: builtin/fetch.c:513
msgid "forced update"
-msgstr ""
+msgstr "принудително обновяване"
#: builtin/fetch.c:519
msgid "(non-fast-forward)"
-msgstr ""
+msgstr "(сливането не е тривиално)"
#: builtin/fetch.c:552 builtin/fetch.c:785
#, c-format
msgid "cannot open %s: %s\n"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде отворен: %s\n"
#: builtin/fetch.c:561
#, c-format
msgid "%s did not send all necessary objects\n"
-msgstr ""
+msgstr "хранилището „%s“ не изпрати всички необходими обекти\n"
#: builtin/fetch.c:579
#, c-format
msgid "reject %s because shallow roots are not allowed to be updated"
msgstr ""
+"отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат "
+"обновявани"
#: builtin/fetch.c:667 builtin/fetch.c:750
#, c-format
msgid "From %.*s\n"
-msgstr ""
+msgstr "От %.*s\n"
#: builtin/fetch.c:678
#, c-format
@@ -5031,20 +5227,23 @@ msgid ""
"some local refs could not be updated; try running\n"
" 'git remote prune %s' to remove any old, conflicting branches"
msgstr ""
+"някои локални указатели не могат да бъдат обновени. Изпълнете командата\n"
+" „git remote prune %s“, за да премахнете остарелите клони, които "
+"предизвикват конфликта"
#: builtin/fetch.c:730
#, c-format
msgid " (%s will become dangling)"
-msgstr ""
+msgstr " (обектът „%s“ ще се окаже извън клон)"
#: builtin/fetch.c:731
#, c-format
msgid " (%s has become dangling)"
-msgstr ""
+msgstr " (обектът „%s“ вече е извън клон)"
#: builtin/fetch.c:755
msgid "[deleted]"
-msgstr ""
+msgstr "[изтрит]"
#: builtin/fetch.c:756 builtin/remote.c:1050
msgid "(none)"
@@ -5054,98 +5253,103 @@ msgstr "(нищо)"
#, c-format
msgid "Refusing to fetch into current branch %s of non-bare repository"
msgstr ""
+"Не може да изтегляте в текущия клон „%s“, на хранилище, което не е голо"
#: builtin/fetch.c:794
#, c-format
msgid "Option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
+msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“"
#: builtin/fetch.c:797
#, c-format
msgid "Option \"%s\" is ignored for %s\n"
-msgstr ""
+msgstr "Опцията „%s“ се игнорира при „%s“\n"
#: builtin/fetch.c:853
#, c-format
msgid "Don't know how to fetch from %s"
-msgstr ""
+msgstr "Не се поддържа доставяне от „%s“"
#: builtin/fetch.c:1015
#, c-format
msgid "Fetching %s\n"
-msgstr ""
+msgstr "Доставяне на „%s“\n"
#: builtin/fetch.c:1017 builtin/remote.c:90
#, c-format
msgid "Could not fetch %s"
msgstr "„%s“ не може да се достави"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
msgstr ""
+"Не сте указали отдалечено хранилище. Задайте или адрес, или име\n"
+"на отдалечено хранилище, от където да се доставят новите версии."
#: builtin/fetch.c:1059
msgid "You need to specify a tag name."
-msgstr ""
+msgstr "Трябва да укажете име на етикет."
#: builtin/fetch.c:1107
msgid "--depth and --unshallow cannot be used together"
-msgstr ""
+msgstr "опциите „--depth“ и „--unshallow“ са несъвместими"
#: builtin/fetch.c:1109
msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
+msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище"
#: builtin/fetch.c:1132
msgid "fetch --all does not take a repository argument"
-msgstr ""
+msgstr "към „git fetch --all“ не можете да добавите хранилище аргумент"
#: builtin/fetch.c:1134
msgid "fetch --all does not make sense with refspecs"
msgstr ""
+"към „git fetch --all“ не можете да добавите указател на версия за аргумент"
#: builtin/fetch.c:1145
#, c-format
msgid "No such remote or remote group: %s"
-msgstr ""
+msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“"
#: builtin/fetch.c:1153
msgid "Fetching a group and specifying refspecs does not make sense"
-msgstr ""
+msgstr "Указването на група и указването на версия са несъвместими"
#: builtin/fmt-merge-msg.c:13
-#, fuzzy
msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
-msgstr "<брой>"
+msgstr "git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ]|--no-log] [--file ФАЙЛ]"
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/show-branch.c:654 builtin/show-ref.c:178
-#: builtin/tag.c:446 parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
-msgstr "брой"
+msgstr "БРОЙ"
#: builtin/fmt-merge-msg.c:664
-#, fuzzy
msgid "populate log with at most <n> entries from shortlog"
-msgstr "<брой>"
+msgstr ""
+"вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения "
+"журнал"
#: builtin/fmt-merge-msg.c:667
msgid "alias for --log (deprecated)"
-msgstr ""
+msgstr "синоним на „--log“ (остаряло)"
#: builtin/fmt-merge-msg.c:670
msgid "text"
-msgstr ""
+msgstr "ТЕКСТ"
#: builtin/fmt-merge-msg.c:671
msgid "use <text> as start of message"
-msgstr ""
+msgstr "за начало на съобщението да се ползва ТЕКСТ"
#: builtin/fmt-merge-msg.c:672
msgid "file to read from"
-msgstr ""
+msgstr "файл, от който да се чете"
#: builtin/for-each-ref.c:1063
msgid "git for-each-ref [options] [<pattern>]"
@@ -5168,17 +5372,16 @@ msgid "quote placeholders suitably for tcl"
msgstr ""
#: builtin/for-each-ref.c:1087
-#, fuzzy
msgid "show only <n> matched refs"
-msgstr "<брой>"
+msgstr "извеждане само на този БРОЙ напаснати указатели"
#: builtin/for-each-ref.c:1088 builtin/replace.c:177
msgid "format"
-msgstr ""
+msgstr "ФОРМАТ"
#: builtin/for-each-ref.c:1088
msgid "format to use for the output"
-msgstr ""
+msgstr "ФОРМАТ за изхода"
#: builtin/for-each-ref.c:1089
msgid "key"
@@ -5188,9 +5391,17 @@ msgstr ""
msgid "field name to sort on"
msgstr ""
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Проверка на връзката"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Проверка на директориите с обекти"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
-msgstr "git fsck [ОПЦИИ] [<ОБЕКТ>…]"
+msgstr "git fsck [ОПЦИИ] [ОБЕКТ…]"
#: builtin/fsck.c:613
msgid "show unreachable objects"
@@ -5212,13 +5423,12 @@ msgstr "показване на кореновите възли"
msgid "make index objects head nodes"
msgstr "задаване на обекти от индекса да са коренови"
+# FIXME bad message
#: builtin/fsck.c:618
-#, fuzzy
msgid "make reflogs head nodes (default)"
msgstr "проследяване на указателите от журнала като глави (стандартно)"
#: builtin/fsck.c:619
-#, fuzzy
msgid "also consider packs and alternate objects"
msgstr "допълнително да се проверяват пакетите и алтернативните обекти"
@@ -5234,51 +5444,61 @@ msgstr "запазване на обектите извън клоните в д
msgid "show progress"
msgstr "показване на напредъка"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Проверка на обектите"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [ОПЦИИ]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "Неправилна стойност за „%s“: „%s“"
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "прекалено дълга директория с обекти „%.*s“"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "окастряне на обектите, към които нищо не сочи"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "включване на автоматичното събиране на боклука (auto-gc)"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr ""
"изрично стартиране на събирането на боклука, дори и ако вече работи друго "
"събиране"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, c-format
-msgid ""
-"Auto packing the repository for optimum performance. You may also\n"
-"run \"git gc\" manually. See \"git help gc\" for more information.\n"
+msgid "Auto packing the repository in background for optimum performance.\n"
msgstr ""
-"Автоматично пакетиране на хранилището за най-добра производителност. Можете "
-"и\n"
-"ръчно да стартирате „git gc“. За подробности погледнете помощта: „git help "
-"gc“.\n"
+"Автоматично пакетиране на заден фон на хранилището за по-добра "
+"производителност.\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr ""
+"Вижте ръководството за повече информация как да изпълните „git help gc“.\n"
+
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5287,7 +5507,7 @@ msgstr ""
"процеса: %<PRIuMAX> (ако сте сигурни, че това не е вярно, това използвайте\n"
"опцията „--force“)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5297,236 +5517,248 @@ msgstr ""
#: builtin/grep.c:23
msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
+msgstr "git grep [ОПЦИИ] [-e] ШАБЛОН [ВЕРСИЯ…] [[--] ПЪТ…]"
#: builtin/grep.c:218
#, c-format
msgid "grep: failed to create thread: %s"
-msgstr ""
+msgstr "grep: неуспешно създаване на нишка: %s"
#: builtin/grep.c:365
#, c-format
msgid "Failed to chdir: %s"
-msgstr ""
+msgstr "Неуспешна смяна на директория: %s"
#: builtin/grep.c:443 builtin/grep.c:478
#, c-format
msgid "unable to read tree (%s)"
-msgstr ""
+msgstr "дървото не може да бъде прочетено (%s)"
#: builtin/grep.c:493
#, c-format
msgid "unable to grep from object of type %s"
-msgstr ""
+msgstr "не може да се изпълни „grep“ от обект от вида %s"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
-msgstr ""
+msgstr "опцията „%c“ очаква число за аргумент"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
-msgstr ""
+msgstr "„%s“ не може да бъде отворен"
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
-msgstr ""
+msgstr "търсене в индекса, а не в работното дърво"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
-msgstr ""
+msgstr "търсене и във файловете, които не са под управлението на git"
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
-msgstr ""
+msgstr "търсене и в следените, и в неследените файлове"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
-msgstr ""
+msgstr "търсене и в игнорираните файлове"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
-msgstr ""
+msgstr "извеждане на редовете, които не съвпадат"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
-msgstr ""
+msgstr "без значение на регистъра на буквите (главни/малки)"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
-msgstr ""
+msgstr "напасване на шаблоните само по границите на думите"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
-msgstr ""
+msgstr "обработване на двоичните файлове като текстови"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
-msgstr ""
+msgstr "прескачане на двоичните файлове"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr ""
+"обработване на двоичните файлове чрез филтри за преобразуване към текст"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
-msgstr ""
+msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
-msgstr ""
+msgstr "разширени регулярни изрази по POSIX"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
-msgstr ""
+msgstr "основни регулярни изрази по POSIX (стандартно)"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
-msgstr ""
+msgstr "шаблоните са дословни низове"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
-msgstr ""
+msgstr "регулярни изрази на Perl"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
-msgstr ""
+msgstr "извеждане на номерата на редовете"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
-msgstr ""
+msgstr "без извеждане на имената на файловете"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
-msgstr ""
+msgstr "извеждане на имената на файловете"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr ""
+"извеждане на относителните имена на файловете спрямо основната директория на "
+"хранилището"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
-msgstr ""
+msgstr "извеждане само на имената на файловете без напасващите редове"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
-msgstr ""
+msgstr "синоним на „--files-with-matches“"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr ""
+"извеждане само на имената на файловете, които не съдържат ред, напасващ на "
+"шаблона"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
-msgstr ""
+msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
-msgstr ""
+msgstr "извеждане на броя на съвпаденията вместо напасващите редове"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
-msgstr ""
+msgstr "оцветяване на напасванията"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
-msgstr ""
+msgstr "извеждане на празен ред между напасванията от различни файлове"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr ""
+"извеждане на името на файла само веднъж за всички напасвания от този файл"
-#: builtin/grep.c:703
-#, fuzzy
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове преди и след напасванията"
-#: builtin/grep.c:706
-#, fuzzy
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове преди напасванията"
-#: builtin/grep.c:708
-#, fuzzy
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове след напасванията"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
-msgstr ""
+msgstr "синоним на „-C БРОЙ“"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
-msgstr ""
+msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
-msgstr ""
+msgstr "извеждане на обхващащата функция"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
-msgstr ""
+msgstr "изчитане на шаблоните от файл"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
-msgstr ""
+msgstr "напасване на ШАБЛОН"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
-msgstr ""
+msgstr "комбиниране на шаблоните указани с опцията „-e“"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr ""
+"без извеждане на стандартния изход. Изходният код указва наличието на "
+"напасване"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr ""
+"извеждане на редове само от файловете, които напасват на всички шаблони"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
-msgstr ""
+msgstr "извеждане на дървото за анализ на регулярния израз"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
-msgstr ""
+msgstr "програма за обхождане"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
-msgstr ""
+msgstr "извеждане на съвпадащите файлове в програма за обхождане"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr ""
+"позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази "
+"опция)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
-msgstr ""
+msgstr "извеждане на начина на употреба на командата"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
-msgstr ""
+msgstr "липсва шаблон."
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr ""
+"опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво"
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
-msgstr ""
+msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“."
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
+"опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии."
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr ""
+"опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени "
+"файлове."
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
-msgstr ""
+msgstr "опцията „--cached“ е несъвместима със задаване на дърво."
#: builtin/hash-object.c:60
msgid ""
@@ -5538,7 +5770,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr ""
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr ""
@@ -5777,8 +6009,8 @@ msgstr ""
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr ""
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr ""
@@ -5895,7 +6127,7 @@ msgstr ""
#: builtin/index-pack.c:1325
msgid "cannot store index file"
-msgstr ""
+msgstr "файлът за индекса не може да бъде съхранен"
#: builtin/index-pack.c:1358
#, c-format
@@ -6044,424 +6276,435 @@ msgstr ""
msgid "unable to move %s to %s"
msgstr ""
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. TRANSLATORS: The first '%s' is either "Reinitialized
+#. existing" or "Initialized empty", the second " shared" or
+#. "", and the last '%s%s' is the verbatim directory name.
+#: builtin/init-db.c:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr ""
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr ""
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr ""
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr ""
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr ""
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
"shared[=<permissions>]] [directory]"
msgstr ""
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr ""
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
msgid "specify that the git repository is to be shared amongst several users"
msgstr ""
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
-msgstr ""
+msgstr "без извеждане на информация"
-#: builtin/init-db.c:522 builtin/init-db.c:529
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr ""
-#: builtin/init-db.c:533
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr ""
-#: builtin/init-db.c:555
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
"dir=<directory>)"
msgstr ""
-#: builtin/init-db.c:579
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr ""
-#: builtin/init-db.c:586
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr ""
#: builtin/log.c:41
msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
-msgstr ""
+msgstr "git log [ОПЦИИ] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]\n"
#: builtin/log.c:42
msgid " or: git show [options] <object>..."
-msgstr ""
+msgstr " или: git show [ОПЦИИ] ОБЕКТ…"
#: builtin/log.c:125
msgid "suppress diff output"
-msgstr ""
+msgstr "без извеждане на разликите"
#: builtin/log.c:126
msgid "show source"
-msgstr ""
+msgstr "извеждане на изходния код"
#: builtin/log.c:127
msgid "Use mail map file"
msgstr ""
+"Използване на файл за съответствията на имената и адресите на е-поща („."
+"mailmap“)"
#: builtin/log.c:128
msgid "decorate options"
-msgstr ""
+msgstr "настройки на форма̀та на извежданата информация"
#: builtin/log.c:231
#, c-format
msgid "Final output: %d %s\n"
-msgstr ""
+msgstr "Резултат: %d %s\n"
#: builtin/log.c:473 builtin/log.c:565
#, c-format
msgid "Could not read object %s"
-msgstr ""
+msgstr "Обектът не може да бъде прочетен: %s"
#: builtin/log.c:589
#, c-format
msgid "Unknown type: %d"
-msgstr ""
+msgstr "Неизвестен вид: %d"
#: builtin/log.c:689
msgid "format.headers without value"
-msgstr ""
+msgstr "не е зададена стойност на „format.headers“"
#: builtin/log.c:771
msgid "name of output directory is too long"
-msgstr ""
+msgstr "прекалено дълго име на директорията за изходната информация"
#: builtin/log.c:787
#, c-format
msgid "Cannot open patch file %s"
-msgstr ""
+msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
#: builtin/log.c:801
msgid "Need exactly one range."
-msgstr ""
+msgstr "Трябва да зададете точно един диапазон."
#: builtin/log.c:809
msgid "Not a range."
-msgstr ""
+msgstr "Не е диапазон."
#: builtin/log.c:911
msgid "Cover letter needs email format"
-msgstr ""
+msgstr "Придружаващото писмо трябва да е форматирано като е-писмо"
#: builtin/log.c:987
#, c-format
msgid "insane in-reply-to: %s"
-msgstr ""
+msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s"
#: builtin/log.c:1015
msgid "git format-patch [options] [<since> | <revision range>]"
-msgstr ""
+msgstr "git format-patch [ОПЦИИ] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]"
+# FIXME message
#: builtin/log.c:1060
msgid "Two output directories?"
msgstr ""
+"Можете да укажете максимум една директория за изход, а сте задали поне две."
#: builtin/log.c:1175
msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
+msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка"
#: builtin/log.c:1178
msgid "use [PATCH] even with multiple patches"
-msgstr ""
+msgstr "номерация „[PATCH]“ дори и при множество кръпки"
#: builtin/log.c:1182
msgid "print patches to standard out"
-msgstr ""
+msgstr "извеждане на кръпките на стандартния изход"
#: builtin/log.c:1184
msgid "generate a cover letter"
-msgstr ""
+msgstr "създаване на придружаващо писмо"
#: builtin/log.c:1186
msgid "use simple number sequence for output file names"
-msgstr ""
+msgstr "проста числова последователност за имената на файловете-кръпки"
#: builtin/log.c:1187
msgid "sfx"
-msgstr ""
+msgstr "ЗНАЦИ"
#: builtin/log.c:1188
msgid "use <sfx> instead of '.patch'"
-msgstr ""
+msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“"
#: builtin/log.c:1190
-#, fuzzy
msgid "start numbering patches at <n> instead of 1"
-msgstr "<брой>"
+msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1"
#: builtin/log.c:1192
msgid "mark the series as Nth re-roll"
-msgstr ""
+msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки"
#: builtin/log.c:1194
msgid "Use [<prefix>] instead of [PATCH]"
-msgstr ""
+msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“"
#: builtin/log.c:1197
msgid "store resulting files in <dir>"
-msgstr ""
+msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
#: builtin/log.c:1200
msgid "don't strip/add [PATCH]"
-msgstr ""
+msgstr "без добавяне/махане на префикса „[PATCH]“"
#: builtin/log.c:1203
msgid "don't output binary diffs"
-msgstr ""
+msgstr "без извеждане на разлики между двоични файлове"
#: builtin/log.c:1205
msgid "don't include a patch matching a commit upstream"
-msgstr ""
+msgstr "да не се включват кръпки, които присъстват в следения клон"
#: builtin/log.c:1207
msgid "show patch format instead of default (patch + stat)"
msgstr ""
+"извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)"
#: builtin/log.c:1209
msgid "Messaging"
-msgstr ""
+msgstr "Опции при изпращане"
#: builtin/log.c:1210
msgid "header"
-msgstr ""
+msgstr "ЗАГЛАВНА_ЧАСТ"
#: builtin/log.c:1211
msgid "add email header"
-msgstr ""
+msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ"
#: builtin/log.c:1212 builtin/log.c:1214
msgid "email"
-msgstr ""
+msgstr "Е-ПОЩА"
#: builtin/log.c:1212
msgid "add To: header"
-msgstr ""
+msgstr "добавяне на заглавна част „To:“ (до)"
#: builtin/log.c:1214
msgid "add Cc: header"
-msgstr ""
+msgstr "добавяне на заглавна част „Cc:“ (и до)"
#: builtin/log.c:1216
msgid "ident"
-msgstr ""
+msgstr "ИДЕНТИЧНОСТ"
#: builtin/log.c:1217
msgid "set From address to <ident> (or committer ident if absent)"
msgstr ""
+"задаване на адреса в заглавната част „From“ да е тази ИДЕНТИЧНОСТ. Ако не е "
+"зададена такава, се взима адреса на подаващия"
#: builtin/log.c:1219
msgid "message-id"
-msgstr ""
+msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
#: builtin/log.c:1220
msgid "make first mail a reply to <message-id>"
msgstr ""
+"първото съобщение да е в отговор на е-писмото с този "
+"ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ"
#: builtin/log.c:1221 builtin/log.c:1224
msgid "boundary"
-msgstr ""
+msgstr "граница"
#: builtin/log.c:1222
msgid "attach the patch"
-msgstr ""
+msgstr "прикрепяне на кръпката"
#: builtin/log.c:1225
msgid "inline the patch"
-msgstr ""
+msgstr "включване на кръпката в текста на писмата"
#: builtin/log.c:1229
msgid "enable message threading, styles: shallow, deep"
msgstr ""
+"използване на нишки за съобщенията. Стилът е „shallow“ (плитък) или "
+"„deep“ (дълбок)"
#: builtin/log.c:1231
msgid "signature"
-msgstr ""
+msgstr "подпис"
#: builtin/log.c:1232
msgid "add a signature"
-msgstr ""
+msgstr "добавяне на поле за подпис"
#: builtin/log.c:1233
msgid "don't print the patch filenames"
-msgstr ""
+msgstr "без извеждане на имената на кръпките"
#: builtin/log.c:1307
#, c-format
msgid "invalid ident line: %s"
-msgstr ""
+msgstr "грешна идентичност: %s"
#: builtin/log.c:1322
msgid "-n and -k are mutually exclusive."
-msgstr ""
+msgstr "опциите „-n“ и „-k“ са несъвместими."
#: builtin/log.c:1324
msgid "--subject-prefix and -k are mutually exclusive."
-msgstr ""
+msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими."
#: builtin/log.c:1332
msgid "--name-only does not make sense"
-msgstr ""
+msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки"
#: builtin/log.c:1334
msgid "--name-status does not make sense"
-msgstr ""
+msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки"
#: builtin/log.c:1336
msgid "--check does not make sense"
-msgstr ""
+msgstr "опцията „--check“ е несъвместима с генерирането на кръпки"
#: builtin/log.c:1359
msgid "standard output, or directory, which one?"
msgstr ""
+"изходът може да или стандартният, или да е в директория, но не и двете."
#: builtin/log.c:1361
#, c-format
msgid "Could not create directory '%s'"
-msgstr ""
+msgstr "Папката „%s“ не може да бъде създадена"
#: builtin/log.c:1509
msgid "Failed to create output files"
-msgstr ""
+msgstr "Изходните файлове не могат да бъдат създадени"
#: builtin/log.c:1558
msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
+msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]"
#: builtin/log.c:1613
#, c-format
msgid ""
"Could not find a tracked remote branch, please specify <upstream> manually.\n"
msgstr ""
+"Следеният отдалечен клон не бе открит, затова изрично задайте "
+"ОТДАЛЕЧЕН_КЛОН.\n"
#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
#, c-format
msgid "Unknown commit %s"
-msgstr ""
+msgstr "Непознато подаване „%s“"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr ""
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr ""
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr ""
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr ""
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr ""
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr ""
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr ""
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr ""
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr ""
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr ""
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr ""
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr ""
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr ""
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr ""
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr ""
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr ""
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr ""
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr ""
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr ""
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr ""
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr ""
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr ""
@@ -6483,7 +6726,7 @@ msgstr ""
#: builtin/ls-tree.c:133
msgid "terminate entries with NUL byte"
-msgstr ""
+msgstr "разделяне на обектите с нулевия знак „NUL“"
#: builtin/ls-tree.c:134
msgid "include object size"
@@ -6545,9 +6788,10 @@ msgid "(synonym to --stat)"
msgstr ""
#: builtin/merge.c:197
-#, fuzzy
msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr "<брой>"
+msgstr ""
+"добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението "
+"за подаване"
#: builtin/merge.c:200
msgid "create a single commit instead of doing a merge"
@@ -6573,9 +6817,9 @@ msgstr ""
msgid "Verify that the named commit has a valid GPG signature"
msgstr ""
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
-msgstr ""
+msgstr "стратегия"
#: builtin/merge.c:213
msgid "merge strategy to use"
@@ -6646,35 +6890,35 @@ msgstr ""
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr ""
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
-msgstr ""
+msgstr "Командата „git write-tree“ не успя да запише обект-дърво"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr ""
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr ""
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr ""
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr ""
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6684,157 +6928,162 @@ msgid ""
"the commit.\n"
msgstr ""
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr ""
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr ""
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr ""
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr ""
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr ""
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr ""
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr ""
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr ""
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
msgstr ""
+"Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n"
+"Подайте промените си, преди да започнете ново сливане."
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
+msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)."
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
msgstr ""
+"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
+"съществува). Подайте промените си, преди да започнете ново сливане."
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr ""
+"Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n"
+"съществува)."
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr ""
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr ""
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr ""
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr ""
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr ""
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr ""
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr ""
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr ""
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr ""
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr ""
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr ""
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr ""
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr ""
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr ""
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr ""
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr ""
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr ""
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr ""
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -6917,108 +7166,109 @@ msgstr ""
msgid "set labels for file1/orig_file/file2"
msgstr ""
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
-msgstr ""
+msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
-msgstr ""
+msgstr "входните записа са разделени с нулевия знак „NUL“"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
-msgstr ""
+msgstr "разрешаване на липсващи обекти"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
-msgstr ""
+msgstr "разрешаване на създаването на повече от едно дърво"
#: builtin/mv.c:15
msgid "git mv [options] <source>... <destination>"
-msgstr ""
+msgstr "git mv [ОПЦИИ] ОБЕКТ… ЦЕЛ"
#: builtin/mv.c:71
msgid "force move/rename even if target exists"
-msgstr ""
+msgstr "принудително преместване/преименуване дори целта да съществува"
#: builtin/mv.c:72
msgid "skip move/rename errors"
-msgstr ""
+msgstr "прескачане на грешките при преместване/преименуване"
#: builtin/mv.c:122
#, c-format
msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
+msgstr "Проверка на преименуването на обект от „%s“ на „%s“\n"
#: builtin/mv.c:126
msgid "bad source"
-msgstr ""
+msgstr "неправилен обект"
#: builtin/mv.c:129
msgid "can not move directory into itself"
-msgstr ""
+msgstr "директория не може да се премести в себе си"
#: builtin/mv.c:132
msgid "cannot move directory over file"
-msgstr ""
+msgstr "директория не може да се премести върху файл"
+# FIXME message<
#: builtin/mv.c:138
#, c-format
msgid "Huh? Directory %s is in index and no submodule?"
-msgstr ""
+msgstr "Директорията „%s“ е в индекса, но не е подмодул"
#: builtin/mv.c:140 builtin/rm.c:318
msgid "Please, stage your changes to .gitmodules or stash them to proceed"
msgstr ""
-"За да продължите или вкарайте промените по файла „.gitmodules“ в индекса, "
-"или\n"
-"ги скътайте"
+"За да продължите или вкарайте промените по файла „.gitmodules“ в индекса,\n"
+"или ги скатайте"
+# FIXME message
#: builtin/mv.c:156
#, c-format
msgid "Huh? %.*s is in index?"
-msgstr ""
+msgstr "„%.*s“ вече е в индекса"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
-msgstr ""
+msgstr "първоначалната директория е празна"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
-msgstr ""
+msgstr "не е под контрола на Git"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
-msgstr ""
+msgstr "целта съществува"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
-msgstr ""
+msgstr "презаписване на „%s“"
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
-msgstr ""
+msgstr "Презаписването е невъзможно"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
-msgstr ""
+msgstr "множество източници за една цел"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
-msgstr ""
+msgstr "целевата директория не съществува"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
-msgstr ""
+msgstr "%s, обект: „%s“, цел: „%s“"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
-msgstr ""
+msgstr "Преименуване на „%s“ на „%s“\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "неуспешно преименуване на „%s“"
@@ -7183,7 +7433,7 @@ msgstr ""
msgid "failed to finish 'show' for object '%s'"
msgstr ""
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr ""
@@ -7192,7 +7442,7 @@ msgstr ""
msgid "Please supply the note contents using either -m or -F option"
msgstr ""
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr ""
@@ -7206,20 +7456,20 @@ msgstr ""
msgid "The note contents has been left in %s"
msgstr ""
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr ""
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, c-format
msgid "could not open or read '%s'"
msgstr ""
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr ""
@@ -7229,355 +7479,391 @@ msgstr ""
msgid "Failed to read object '%s'."
msgstr ""
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr ""
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr ""
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr ""
-#: builtin/notes.c:371 builtin/notes.c:425 builtin/notes.c:498
-#: builtin/notes.c:510 builtin/notes.c:583 builtin/notes.c:630
-#: builtin/notes.c:904
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr ""
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr ""
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr ""
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
msgid "note contents in a file"
msgstr ""
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr ""
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr ""
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr ""
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr ""
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, c-format
msgid ""
"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
"existing notes"
msgstr ""
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr ""
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr ""
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr ""
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr ""
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
"existing notes"
msgstr ""
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr ""
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, c-format
msgid ""
"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
"Please use 'git notes add -f -m/-F/-c/-C' instead.\n"
msgstr ""
-#: builtin/notes.c:735
+#: builtin/notes.c:739
msgid "General options"
msgstr ""
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr ""
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
msgstr ""
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr ""
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr ""
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr ""
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr ""
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr ""
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr ""
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr ""
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
msgstr ""
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr ""
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "Непозната подкоманда: %s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr ""
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr ""
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr ""
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Записване на обектите"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Компресиране на обектите"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr ""
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr ""
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr ""
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr ""
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr ""
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr ""
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr ""
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr ""
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr ""
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr ""
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr ""
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr ""
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr ""
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr ""
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr ""
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr ""
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr ""
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr ""
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr ""
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr ""
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr ""
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr ""
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr ""
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr ""
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr ""
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr ""
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr ""
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr ""
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "време"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr ""
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr ""
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr ""
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr ""
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr ""
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr ""
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Преброяване на обектите"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
-msgstr ""
+msgstr "git pack-refs [ОПЦИИ]"
#: builtin/pack-refs.c:14
msgid "pack everything"
-msgstr ""
+msgstr "пакетиране на всичко"
#: builtin/pack-refs.c:15
msgid "prune loose refs (default)"
-msgstr ""
+msgstr "окастряне на недостижимите указатели (стандартно)"
#: builtin/prune-packed.c:7
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
-msgstr ""
+msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Изтриване на повтарящите се обекти"
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr ""
+msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
#: builtin/prune.c:142
msgid "do not remove, show only"
-msgstr ""
+msgstr "само извеждане без действително окастряне"
#: builtin/prune.c:143
msgid "report pruned objects"
-msgstr ""
+msgstr "информация за окастрените обекти"
#: builtin/prune.c:146
msgid "expire objects older than <time>"
-msgstr ""
+msgstr "окастряне на обектите по-стари от това ВРЕМЕ"
#: builtin/push.c:14
msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
+msgstr "git push [ОПЦИИ] [ХРАНИЛИЩЕ [УКАЗАТЕЛ_НА_ВЕРСИЯ…]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
-msgstr ""
+msgstr "съкращение за етикет без ЕТИКЕТ"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
-msgstr ""
+msgstr "опцията „--delete“ приема за цел само прости имена на указатели"
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
msgstr ""
+"\n"
+"За да включите тази опция за постоянно вижте документацията за настройката "
+"„push.default“ в „git help config“."
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7591,8 +7877,18 @@ msgid ""
" git push %s %s\n"
"%s"
msgstr ""
+"Името на текущия клон се различава от името на клона, който той следи.\n"
+"За да изтласкате към следения клон използвайте командата:\n"
+"\n"
+" git push %s HEAD:%s\n"
+"\n"
+"За да изтласкате към отдалечения клон с име като локалния, използвайте "
+"командата:\n"
+"\n"
+" git push %s %s\n"
+"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7601,8 +7897,12 @@ msgid ""
"\n"
" git push %s HEAD:<name-of-remote-branch>\n"
msgstr ""
+"В момента не сте на никой клон. За да изтласкате историята до състоянието,\n"
+"сочено в момента от указателя „HEAD“, използвайте командата:\n"
+"\n"
+" git push %s HEAD:ИМЕ_НА_ОТДАЛЕЧЕНИЯ_КЛОН\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7610,25 +7910,36 @@ msgid ""
"\n"
" git push --set-upstream %s %s\n"
msgstr ""
+"Не е зададен отдалечен клон, който текущият клон „%s“ да следи.\n"
+"За да изтласкате локалния клон към отдалечен и същевременно да зададете\n"
+"втория като този, който първият следи, използвайте командата:\n"
+"\n"
+" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr ""
+"Текущият клон „%s“ следи няколко отдалечени клона, не можете просто да "
+"изтласкате."
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
"your current branch '%s', without telling me what to push\n"
"to update which remote branch."
msgstr ""
+"Изтласквате към отдалечения клон „%s“, който не е следен от текущия клон "
+"„%s“.\n"
+"Трябва да укажете коя версия да се изтласка, за обновяване на отдалечения "
+"клон."
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7639,7 +7950,7 @@ msgid ""
"When push.default is set to 'matching', git will push local branches\n"
"to the remote branches that already exist with the same name.\n"
"\n"
-"In Git 2.0, Git will default to the more conservative 'simple'\n"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -7648,37 +7959,71 @@ msgid ""
"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
"'current' instead of 'simple' if you sometimes use older versions of Git)"
msgstr ""
+"Настройката „push.default“ не е зададена. Стойността ѝ по подразбиране е "
+"сменена\n"
+"в Git 2.0 от „matching“ (всички съвпадащи клони) на „simple“ (само текущия\n"
+"клон). За да подтиснете това съобщение и да използвате традиционното "
+"поведение\n"
+"на Git 1.x, изпълнете командата:\n"
+"\n"
+" git config --global push.default matching\n"
+"\n"
+"За да подтиснете това съобщение и да използвате новото поведение на Git 2."
+"x,\n"
+"изпълнете командата:\n"
+"\n"
+" git config --global push.default simple\n"
+"\n"
+"Когато настройката „push.default“ е „matching“, git ще изтласка всички "
+"локални\n"
+"клони, които имат отдалечен аналог със същото име.\n"
+"\n"
+"От версия 2.0 Git стандартно започва да ползва по-консервативния вариант\n"
+"„simple“, при който „push“ изтласква само текущия клон към отдалечения, "
+"следен\n"
+"клон — същия, който „git pull“ използва, за да обнови текущия.\n"
+"\n"
+"За повече информация погледнете „git help config“ и потърсете „push."
+"default“.\n"
+"Новата стойност „simple“ бе въведена с версия 1.7.11 на Git. Ако понякога\n"
+"ползвате стари версии на Git, задайте стойност „current“ вместо „simple“."
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
+"Не сте указали версия за подаване, а настройката „push.default“ не е "
+"зададена."
-#: builtin/push.c:281
+#: builtin/push.c:280
msgid ""
"Updates were rejected because the tip of your current branch is behind\n"
"its remote counterpart. Integrate the remote changes (e.g.\n"
"'git pull ...') before pushing again.\n"
"See the 'Note about fast-forwards' in 'git push --help' for details."
msgstr ""
+"Обновяването е отхвърлено, защото върхът на текущия ви клон е преди върха "
+"на\n"
+"отдалечения клон. Внесете отдалечените промени (напр. с командата „git "
+"pull…“),\n"
+"преди отново да изтласкате промените. За повече информация вижте раздела\n"
+"„Note about fast-forwards“ в страницата от ръководството „git push --help“."
-#: builtin/push.c:287
-msgid ""
-"Updates were rejected because a pushed branch tip is behind its remote\n"
-"counterpart. If you did not intend to push that branch, you may want to\n"
-"specify branches to push or set the 'push.default' configuration variable\n"
-"to 'simple', 'current' or 'upstream' to push only the current branch."
-msgstr ""
-
-#: builtin/push.c:293
+#: builtin/push.c:286
msgid ""
"Updates were rejected because a pushed branch tip is behind its remote\n"
"counterpart. Check out this branch and integrate the remote changes\n"
"(e.g. 'git pull ...') before pushing again.\n"
"See the 'Note about fast-forwards' in 'git push --help' for details."
msgstr ""
+"Обновяването е отхвърлено, защото върха на изтласквания клон е преди върха "
+"на\n"
+"отдалечения клон. Проверете клона и внесете отдалечените промени (напр. с\n"
+"командата „git pull…“), преди отново да изтласкате промените. За повече\n"
+"информация вижте раздела „Note about fast-forwards“ в страницата от\n"
+"ръководството „git push --help“."
-#: builtin/push.c:299
+#: builtin/push.c:292
msgid ""
"Updates were rejected because the remote contains work that you do\n"
"not have locally. This is usually caused by another repository pushing\n"
@@ -7686,34 +8031,51 @@ msgid ""
"(e.g., 'git pull ...') before pushing again.\n"
"See the 'Note about fast-forwards' in 'git push --help' for details."
msgstr ""
+"Обновяването е отхвърлено, защото хранилището, към което изтласквате, "
+"съдържа\n"
+"промени, които липсват в локалното хранилище. Най-честата причина за това "
+"е,\n"
+"че някой друг е изтласквал към същия клон. Първо внесете отдалечените "
+"промени\n"
+"(напр. с командата „git pull…“), преди отново да изтласкате промените.\n"
+"За повече информация вижте раздела „Note about fast-forwards“ в страницата "
+"от\n"
+"ръководството „git push --help“."
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr ""
+"Изтласкването е отхвърлено, защото в отдалеченото хранилище съществува "
+"етикет,\n"
+"който ще припокриете с етикет от вашето хранилище."
-#: builtin/push.c:309
+#: builtin/push.c:302
msgid ""
"You cannot update a remote ref that points at a non-commit object,\n"
"or update a remote ref to make it point at a non-commit object,\n"
"without using the '--force' option.\n"
msgstr ""
+"Не можете да обновите отдалечен указател, който вече сочи към обект, който "
+"не е\n"
+"подаване, както и тепърва да го промените да сочи към подобен обект, без да\n"
+"укажете опцията опцията „--force“.\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
-msgstr ""
+msgstr "Изтласкване към „%s“\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
-msgstr ""
+msgstr "част от указателите не бяха изтласкани към „%s“"
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
-msgstr ""
+msgstr "неправилно указано хранилище „%s“"
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -7725,98 +8087,111 @@ msgid ""
"\n"
" git push <name>\n"
msgstr ""
+"Не е указано хранилище, към което да се изтласква.\n"
+"Или укажете адреса на командния ред, или настройте отдалечено хранилище с "
+"командата:\n"
+"\n"
+" git remote add ИМЕ АДРЕС\n"
+"\n"
+"и след това изтласкайте, като укажете името на отдалеченото хранилище:\n"
+"\n"
+" git push ИМЕ\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
-msgstr ""
+msgstr "опциите „--all“ и „--tags“ са несъвместими"
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
-msgstr ""
+msgstr "опцията „--all“ е несъвместима с указването на версия"
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
-msgstr ""
+msgstr "опциите „--mirror“ и „--tags“ са несъвместими"
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
-msgstr ""
+msgstr "опцията „--mirror“ е несъвместима с указването на версия"
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
-msgstr ""
+msgstr "опциите „--all“ и „--mirror“ са несъвместими"
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
-msgstr ""
+msgstr "хранилище"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
-msgstr ""
+msgstr "изтласкване на всички указатели"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
-msgstr ""
+msgstr "огледално копие на всички указатели"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
-msgstr ""
+msgstr "изтриване на указателите"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
+msgstr "изтласкване на етикетите (несъвместимо с опциите „--all“ и „--mirror“)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
-msgstr ""
+msgstr "принудително обновяване"
-#: builtin/push.c:510
+# # FIXME double check this
+#: builtin/push.c:493
msgid "refname>:<expect"
-msgstr ""
+msgstr "УКАЗАТЕЛ>:<ОЧАКВАНА_СТОЙНОСТ"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
-msgstr ""
+msgstr "УКАЗАТЕЛят трябва първоначално да е с тази ОЧАКВАНА_СТОЙНОСТ"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
-msgstr ""
+msgstr "проверка"
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
-msgstr ""
+msgstr "управление на рекурсивното изтласкване на подмодулите"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
-msgstr ""
+msgstr "използване на съкратени пакети"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
-msgstr ""
+msgstr "програма за получаването на пакети"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
-msgstr ""
+msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
-msgstr ""
+msgstr "окастряне на указателите, които са премахнати от локалното хранилище"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
-msgstr ""
+msgstr "без изпълнение на куката преди изтласкване (pre-push)"
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr ""
+"изтласкване на липсващите в отдалеченото хранилище, но свързани с текущото "
+"изтласкване, етикети"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr ""
+"опцията „--delete“ е несъвместима с опциите „--all“, „--mirror“ и „--tags“"
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
-msgstr ""
+msgstr "опцията „--delete“ изисква поне един указател на версия"
#: builtin/read-tree.c:36
msgid ""
@@ -7909,92 +8284,93 @@ msgid ""
"git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--"
"mirror=<fetch|push>] <name> <url>"
msgstr ""
-"git remote add [-t <КЛОН>] [-m <ОСНОВЕН_КЛОН>] [-f] [--tags|--no-tags] [--"
-"mirror=<fetch|push>] <ИМЕ> <АДРЕС>"
+"git remote add [-t КЛОН] [-m ОСНОВЕН_КЛОН] [-f] [--tags|--no-tags] [--"
+"mirror=<fetch|push>] ИМЕ АДРЕС"
#: builtin/remote.c:14 builtin/remote.c:33
msgid "git remote rename <old> <new>"
-msgstr "git remote rename <СТАРО_ИМЕ> <НОВО_ИМЕ>"
+msgstr "git remote rename СТАРО_ИМЕ НОВО_ИМЕ"
#: builtin/remote.c:15 builtin/remote.c:38
msgid "git remote remove <name>"
-msgstr "git remote remove <ИМЕ>"
+msgstr "git remote remove ИМЕ"
#: builtin/remote.c:16
msgid "git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"
-msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete |<КЛОН>)"
+msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
#: builtin/remote.c:17
msgid "git remote [-v | --verbose] show [-n] <name>"
-msgstr "git remote [-v | --verbose] show [-n] <ИМЕ>"
+msgstr "git remote [-v | --verbose] show [-n] ИМЕ"
#: builtin/remote.c:18
msgid "git remote prune [-n | --dry-run] <name>"
-msgstr "git remote prune [-n | --dry-run] <ИМЕ>"
+msgstr "git remote prune [-n | --dry-run] ИМЕ"
#: builtin/remote.c:19
msgid ""
"git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"
msgstr ""
-"git remote [-v | --verbose] update [-p | --prune] [(<ГРУПА> | "
-"<ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ>)…]"
+"git remote [-v | --verbose] update [-p | --prune] [(ГРУПА | "
+"ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ)…]"
#: builtin/remote.c:20
msgid "git remote set-branches [--add] <name> <branch>..."
-msgstr "git remote set-branches [--add] <ИМЕ> <КЛОН>…"
+msgstr "git remote set-branches [--add] ИМЕ КЛОН…"
#: builtin/remote.c:21 builtin/remote.c:69
msgid "git remote set-url [--push] <name> <newurl> [<oldurl>]"
-msgstr "git remote set-url [--push] <ИМЕ> <НОВ_АДРЕС> [<СТАР_АДРЕС>]"
+msgstr "git remote set-url [--push] ИМЕ НОВ_АДРЕС [СТАР_АДРЕС]"
#: builtin/remote.c:22 builtin/remote.c:70
msgid "git remote set-url --add <name> <newurl>"
-msgstr "git remote set-url --add <ИМЕ> <НОВ_АДРЕС>"
+msgstr "git remote set-url --add ИМЕ НОВ_АДРЕС"
#: builtin/remote.c:23 builtin/remote.c:71
msgid "git remote set-url --delete <name> <url>"
-msgstr "git remote set-url --delete <ИМЕ> <АДРЕС>"
+msgstr "git remote set-url --delete ИМЕ АДРЕС"
#: builtin/remote.c:28
msgid "git remote add [<options>] <name> <url>"
-msgstr "git remote add [<ОПЦИИ>] <ИМЕ> <АДРЕС>"
+msgstr "git remote add [ОПЦИИ] ИМЕ АДРЕС"
#: builtin/remote.c:43
msgid "git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"
-msgstr "git remote set-head <ИМЕ> (-a | --auto | -d | --delete | <КЛОН>)"
+msgstr "git remote set-head ИМЕ (-a | --auto | -d | --delete | КЛОН)"
#: builtin/remote.c:48
msgid "git remote set-branches <name> <branch>..."
-msgstr "git remote set-branches <ИМЕ> <КЛОН>…"
+msgstr "git remote set-branches ИМЕ КЛОН…"
#: builtin/remote.c:49
msgid "git remote set-branches --add <name> <branch>..."
-msgstr "git remote set-branches --add <ИМЕ> <КЛОН>…"
+msgstr "git remote set-branches --add ИМЕ КЛОН…"
#: builtin/remote.c:54
msgid "git remote show [<options>] <name>"
-msgstr "git remote show [<ОПЦИИ>] <ИМЕ>"
+msgstr "git remote show [ОПЦИИ] ИМЕ"
#: builtin/remote.c:59
msgid "git remote prune [<options>] <name>"
-msgstr "git remote prune [<ОПЦИИ>] <ИМЕ>"
+msgstr "git remote prune [ОПЦИИ] ИМЕ"
#: builtin/remote.c:64
msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr "git remote update [<ОПЦИИ>] [<ГРУПА> | <ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ>]…"
+msgstr "git remote update [ОПЦИИ] [ГРУПА | ОТДАЛЕЧЕНО_ХРАНИЛИЩЕ]…"
#: builtin/remote.c:88
#, c-format
msgid "Updating %s"
msgstr "Обновяване на „%s“"
+# FIXME tabulator
#: builtin/remote.c:120
msgid ""
"--mirror is dangerous and deprecated; please\n"
"\t use --mirror=fetch or --mirror=push instead"
msgstr ""
"Използването само на „--mirror“ е опасно. Вместо това\n"
-"\tползвайте „--mirror=fetch“ или „--mirror=push“"
+"ползвайте „--mirror=fetch“ или „--mirror=push“"
#: builtin/remote.c:137
#, c-format
@@ -8087,14 +8463,14 @@ msgstr "Такова отдалечено хранилище няма: %s"
#: builtin/remote.c:651
#, c-format
msgid "Could not rename config section '%s' to '%s'"
-msgstr "Секцията в настройките „%s“ не може да бъде преименувана на „%s“"
+msgstr "Разделът „%s“ в настройките не може да бъде преименуван на „%s“"
#: builtin/remote.c:657 builtin/remote.c:794
#, c-format
msgid "Could not remove config section '%s'"
-msgstr "Секцията в настройките „%s“ не може да бъде изтрита"
+msgstr "Разделът „%s“ в настройките не може да бъде изтрит"
-# FIXME
+# FIXME tabulator
#: builtin/remote.c:672
#, c-format
msgid ""
@@ -8109,12 +8485,12 @@ msgstr ""
#: builtin/remote.c:678
#, c-format
msgid "Could not append '%s'"
-msgstr "Секцията „%s“ не може да бъде добавена в настройките"
+msgstr "Разделът „%s“ не може да бъде добавен в настройките"
#: builtin/remote.c:689
#, c-format
msgid "Could not set '%s'"
-msgstr "Секцията „%s“ не може да бъде зададена в настройките"
+msgstr "Разделът „%s“ не може да бъде зададен в настройките"
#: builtin/remote.c:711
#, c-format
@@ -8158,6 +8534,7 @@ msgstr " следен"
msgid " stale (use 'git remote prune' to remove)"
msgstr " стар (изтрийте чрез „git remote prune“)"
+# FIXME
#: builtin/remote.c:945
msgid " ???"
msgstr " неясно"
@@ -8240,7 +8617,7 @@ msgstr "без заявки към отдалечените хранилища"
#: builtin/remote.c:1171
#, c-format
msgid "* remote %s"
-msgstr "* отдалечено хранилище „%s“"
+msgstr "● отдалечено хранилище „%s“"
#: builtin/remote.c:1172
#, c-format
@@ -8299,11 +8676,11 @@ msgstr[1] " Локалните указатели, настроени за „g
#: builtin/remote.c:1252
msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr "задаване на refs/remotes/<ИМЕ>/HEAD според отдалеченото хранилище"
+msgstr "задаване на refs/remotes/ИМЕ/HEAD според отдалеченото хранилище"
#: builtin/remote.c:1254
msgid "delete refs/remotes/<name>/HEAD"
-msgstr "изтриване на refs/remotes/<ИМЕ>/HEAD"
+msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
#: builtin/remote.c:1269
msgid "Cannot determine remote HEAD"
@@ -8352,12 +8729,12 @@ msgstr "адрес: %s"
#: builtin/remote.c:1328
#, c-format
msgid " * [would prune] %s"
-msgstr " * [ще бъде окастрено] %s"
+msgstr " ● [ще бъде окастрено] %s"
#: builtin/remote.c:1331
#, c-format
msgid " * [pruned] %s"
-msgstr " * [окастрено] %s"
+msgstr " ● [окастрено] %s"
#: builtin/remote.c:1374
msgid "prune remotes after fetching"
@@ -8402,7 +8779,7 @@ msgstr "Неправилен (стар) формат за адрес: %s"
msgid "No such URL found: %s"
msgstr "Такъв адрес не е открит: %s"
-# MEANING
+# FIXME CHECK MEANING
#: builtin/remote.c:1550
msgid "Will not delete all non-push URLs"
msgstr "Никой от адресите, които не са за изтласкване, няма да се изтрие"
@@ -8411,242 +8788,269 @@ msgstr "Никой от адресите, които не са за изтлас
msgid "be verbose; must be placed before a subcommand"
msgstr "повече подробности. Поставя се пред под