diff --git a/.gitignore b/.gitignore index 1c2f832138..5087ce1eb7 100644 --- a/.gitignore +++ b/.gitignore @@ -187,6 +187,7 @@ /test-dump-cache-tree /test-dump-split-index /test-dump-untracked-cache +/test-fake-ssh /test-scrap-cache-tree /test-genrandom /test-hashmap diff --git a/.travis.yml b/.travis.yml index c3bf9c6d4d..78e433ba71 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,11 @@ language: c +sudo: false + +cache: + directories: + - $HOME/travis-cache + os: - linux - osx @@ -15,12 +21,12 @@ addons: env: global: + - DEVELOPER=1 - P4_VERSION="15.2" - GIT_LFS_VERSION="1.1.0" - DEFAULT_TEST_TARGET=prove - - GIT_PROVE_OPTS="--timer --jobs 3" + - GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save" - GIT_TEST_OPTS="--verbose --tee" - - CFLAGS="-g -O2 -Wall -Werror" - GIT_TEST_CLONE_2GB=YesPlease # t9810 occasionally fails on Travis CI OS X # t9816 occasionally fails with "TAP out of sequence errors" on Travis CI OS X @@ -67,6 +73,8 @@ before_install: p4 -V | grep Rev.; echo "$(tput setaf 6)Git-LFS Version$(tput sgr0)"; git-lfs version; + mkdir -p $HOME/travis-cache; + ln -s $HOME/travis-cache/.prove t/.prove; before_script: make --jobs=2 diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index c6e536f180..0ddd36879a 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -171,6 +171,11 @@ For C programs: - We try to keep to at most 80 characters per line. + - As a Git developer we assume you have a reasonably modern compiler + and we recommend you to enable the DEVELOPER makefile knob to + ensure your patch is clear of all compiler warnings we care about, + by e.g. "echo DEVELOPER=1 >>config.mak". + - We try to support a wide range of C compilers to compile Git with, including old ones. That means that you should not use C99 initializers, even if a lot of compilers grok it. diff --git a/Documentation/RelNotes/2.4.11.txt b/Documentation/RelNotes/2.4.11.txt new file mode 100644 index 0000000000..723360295c --- /dev/null +++ b/Documentation/RelNotes/2.4.11.txt @@ -0,0 +1,11 @@ +Git v2.4.11 Release Notes +========================= + +Fixes since v2.4.10 +------------------- + + * Bugfix patches were backported from the 'master' front to plug heap + corruption holes, to catch integer overflow in the computation of + pathname lengths, and to get rid of the name_path API. Both of + these would have resulted in writing over an under-allocated buffer + when formulating pathnames while tree traversal. diff --git a/Documentation/RelNotes/2.5.5.txt b/Documentation/RelNotes/2.5.5.txt new file mode 100644 index 0000000000..37eae9a2d9 --- /dev/null +++ b/Documentation/RelNotes/2.5.5.txt @@ -0,0 +1,11 @@ +Git v2.5.5 Release Notes +======================== + +Fixes since v2.5.4 +------------------ + + * Bugfix patches were backported from the 'master' front to plug heap + corruption holes, to catch integer overflow in the computation of + pathname lengths, and to get rid of the name_path API. Both of + these would have resulted in writing over an under-allocated buffer + when formulating pathnames while tree traversal. diff --git a/Documentation/RelNotes/2.6.5.txt b/Documentation/RelNotes/2.6.5.txt index e1b75fb30e..f0924b62e0 100644 --- a/Documentation/RelNotes/2.6.5.txt +++ b/Documentation/RelNotes/2.6.5.txt @@ -21,5 +21,38 @@ Fixes since v2.6.4 NULL. This gives a compiler an excuse to declare that tree will never be NULL and apply a wrong optimization. Avoid it. + * The helper used to iterate over loose object directories to prune + stale objects did not closedir() immediately when it is done with a + directory--a callback such as the one used for "git prune" may want + to do rmdir(), but it would fail on open directory on platforms + such as WinXP. + + * "git p4" used to import Perforce CLs that touch only paths outside + the client spec as empty commits. It has been corrected to ignore + them instead, with a new configuration git-p4.keepEmptyCommits as a + backward compatibility knob. + + * The exit code of git-fsck did not reflect some types of errors + found in packed objects, which has been corrected. + + * The completion script (in contrib/) used to list "git column" + (which is not an end-user facing command) as one of the choices + + * Improve error reporting when SMTP TLS fails. + + * When getpwuid() on the system returned NULL (e.g. the user is not + in the /etc/passwd file or other uid-to-name mappings), the + codepath to find who the user is to record it in the reflog barfed + and died. Loosen the check in this codepath, which already accepts + questionable ident string (e.g. host part of the e-mail address is + obviously bogus), and in general when we operate fmt_ident() function + in non-strict mode. + + * "git symbolic-ref" forgot to report a failure with its exit status. + + * History traversal with "git log --source" that starts with an + annotated tag failed to report the tag as "source", due to an + old regression in the command line parser back in v2.2 days. + Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/2.6.6.txt b/Documentation/RelNotes/2.6.6.txt new file mode 100644 index 0000000000..023ad85ec6 --- /dev/null +++ b/Documentation/RelNotes/2.6.6.txt @@ -0,0 +1,11 @@ +Git v2.6.6 Release Notes +======================== + +Fixes since v2.6.5 +------------------ + + * Bugfix patches were backported from the 'master' front to plug heap + corruption holes, to catch integer overflow in the computation of + pathname lengths, and to get rid of the name_path API. Both of + these would have resulted in writing over an under-allocated buffer + when formulating pathnames while tree traversal. diff --git a/Documentation/RelNotes/2.7.0.txt b/Documentation/RelNotes/2.7.0.txt index 29b4cfe0bf..563dadc57e 100644 --- a/Documentation/RelNotes/2.7.0.txt +++ b/Documentation/RelNotes/2.7.0.txt @@ -6,6 +6,10 @@ Updates since v2.6 UI, Workflows & Features + * The appearance of "gitk", particularly on high DPI monitors, have + been improved. "gitk" also comes with an undated translation for + Swedish and Japanese. + * "git remote" learned "get-url" subcommand to show the URL for a given remote name used for fetching and pushing. @@ -22,7 +26,7 @@ UI, Workflows & Features * Users who are too busy to type three extra keystrokes to ask for "git stash show -p" can now set stash.showPatch configuration - varible to true to always see the actual patch, not just the list + variable to true to always see the actual patch, not just the list of paths affected with feel for the extent of damage via diffstat. * "quiltimport" allows to specify the series file by honoring the @@ -65,7 +69,7 @@ UI, Workflows & Features a superset of "--no-progress". Extend the command to support the usual "--[no-]progress". - * The semantics of tranfer.hideRefs configuration variable have been + * The semantics of transfer.hideRefs configuration variable have been extended to work better with the ref "namespace" feature that lets you throw unrelated bunches of repositories in a single physical repository and virtually serve them as separate ones. @@ -79,6 +83,12 @@ UI, Workflows & Features * The credential-cache daemon can be told to ignore SIGHUP to work around issue when running Git from inside emacs. + * "git push" learned new configuration for doing "--recurse-submodules" + on each push. + + * "format-patch" has learned a new option to zero-out the commit + object name on the mbox "From " line. + Performance, Internal Implementation, Development Support etc. @@ -100,7 +110,6 @@ Performance, Internal Implementation, Development Support etc. * The debugging infrastructure for pkt-line based communication has been improved to mark the side-band communication specifically. - (merge fd89433 jk/async-pkt-line later to maint). * Update "git branch" that list existing branches, using the ref-filter API that is shared with "git tag" and "git @@ -162,6 +171,9 @@ Performance, Internal Implementation, Development Support etc. git/git (including build-status for pull requests that people open). + * The write(2) emulation for Windows learned to set errno to EPIPE + when necessary. + Also contains various documentation updates and code clean-ups. @@ -356,12 +368,47 @@ notes for details). * A build without NO_IPv6 used to use gethostbyname() when guessing user's hostname, instead of getaddrinfo() that is used in other codepaths in such a build. - (merge 00bce77 ep/ident-with-getaddrinfo later to maint). - * The exit code of git-fsck didnot reflect some types of errors found - in packed objects, which has been corrected. - (merge 8c24d83 dt/fsck-verify-pack-error later to maint). + * The exit code of git-fsck did not reflect some types of errors + found in packed objects, which has been corrected. + + * The helper used to iterate over loose object directories to prune + stale objects did not closedir() immediately when it is done with a + directory--a callback such as the one used for "git prune" may want + to do rmdir(), but it would fail on open directory on platforms + such as WinXP. + + * "git p4" used to import Perforce CLs that touch only paths outside + the client spec as empty commits. It has been corrected to ignore + them instead, with a new configuration git-p4.keepEmptyCommits as a + backward compatibility knob. + + * The completion script (in contrib/) used to list "git column" + (which is not an end-user facing command) as one of the choices + (merge 160fcdb sg/completion-no-column later to maint). + + * The error reporting from "git send-email", when SMTP TLS fails, has + been improved. + (merge 9d60524 jk/send-email-ssl-errors later to maint). + + * When getpwuid() on the system returned NULL (e.g. the user is not + in the /etc/passwd file or other uid-to-name mappings), the + codepath to find who the user is to record it in the reflog barfed + and died. Loosen the check in this codepath, which already accepts + questionable ident string (e.g. host part of the e-mail address is + obviously bogus), and in general when we operate fmt_ident() function + in non-strict mode. + (merge 92bcbb9 jk/ident-loosen-getpwuid later to maint). + + * "git symbolic-ref" forgot to report a failure with its exit status. + (merge f91b273 jk/symbolic-ref-maint later to maint). + + * History traversal with "git log --source" that starts with an + annotated tag failed to report the tag as "source", due to an + old regression in the command line parser back in v2.2 days. + (merge 728350b jk/pending-keep-tag-name later to maint). + + * "git p4" when interacting with multiple depots at the same time + used to incorrectly drop changes. * Code clean-up, minor fixes etc. - (merge 15ed07d jc/rerere later to maint). - (merge 147875f sb/submodule-config-parse later to maint). diff --git a/Documentation/RelNotes/2.7.1.txt b/Documentation/RelNotes/2.7.1.txt new file mode 100644 index 0000000000..6553d69e33 --- /dev/null +++ b/Documentation/RelNotes/2.7.1.txt @@ -0,0 +1,87 @@ +Git v2.7.1 Release Notes +======================== + +Fixes since v2.7 +---------------- + + * An earlier change in 2.5.x-era broke users' hooks and aliases by + exporting GIT_WORK_TREE to point at the root of the working tree, + interfering when they tried to use a different working tree without + setting GIT_WORK_TREE environment themselves. + + * The "exclude_list" structure has the usual "alloc, nr" pair of + fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot + to reset 'alloc' to 0 when it cleared 'nr' to discard the managed + array. + + * "git send-email" was confused by escaped quotes stored in the alias + files saved by "mutt", which has been corrected. + + * A few unportable C construct have been spotted by clang compiler + and have been fixed. + + * The documentation has been updated to hint the connection between + the '--signoff' option and DCO. + + * "git reflog" incorrectly assumed that all objects that used to be + at the tip of a ref must be commits, which caused it to segfault. + + * The ignore mechanism saw a few regressions around untracked file + listing and sparse checkout selection areas in 2.7.0; the change + that is responsible for the regression has been reverted. + + * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR + (e.g. COMMIT_EDITMSG) that is meant to be left after the command is + done. This however did not work well if the repository is set to + be shared with core.sharedRepository and the umask of the previous + user is tighter. They have been made to work better by calling + unlink(2) and retrying after fopen(3) fails with EPERM. + + * Asking gitweb for a nonexistent commit left a warning in the server + log. + + * "git rebase", unlike all other callers of "gc --auto", did not + ignore the exit code from "gc --auto". + + * Many codepaths that run "gc --auto" before exiting kept packfiles + mapped and left the file descriptors to them open, which was not + friendly to systems that cannot remove files that are open. They + now close the packs before doing so. + + * A recent optimization to filter-branch in v2.7.0 introduced a + regression when --prune-empty filter is used, which has been + corrected. + + * The description for SANITY prerequisite the test suite uses has + been clarified both in the comment and in the implementation. + + * "git tag" started listing a tag "foo" as "tags/foo" when a branch + named "foo" exists in the same repository; remove this unnecessary + disambiguation, which is a regression introduced in v2.7.0. + + * The way "git svn" uses auth parameter was broken by Subversion + 1.9.0 and later. + + * The "split" subcommand of "git subtree" (in contrib/) incorrectly + skipped merges when it shouldn't, which was corrected. + + * A few options of "git diff" did not work well when the command was + run from a subdirectory. + + * dirname() emulation has been added, as Msys2 lacks it. + + * The underlying machinery used by "ls-files -o" and other commands + have been taught not to create empty submodule ref cache for a + directory that is not a submodule. This removes a ton of wasted + CPU cycles. + + * Drop a few old "todo" items by deciding that the change one of them + suggests is not such a good idea, and doing the change the other + one suggested to do. + + * Documentation for "git fetch --depth" has been updated for clarity. + + * The command line completion learned a handful of additional options + and command specific syntax. + +Also includes a handful of documentation and test updates. diff --git a/Documentation/RelNotes/2.7.2.txt b/Documentation/RelNotes/2.7.2.txt new file mode 100644 index 0000000000..4feef76704 --- /dev/null +++ b/Documentation/RelNotes/2.7.2.txt @@ -0,0 +1,41 @@ +Git v2.7.2 Release Notes +======================== + +Fixes since v2.7.1 +------------------ + + * The low-level merge machinery has been taught to use CRLF line + termination when inserting conflict markers to merged contents that + are themselves CRLF line-terminated. + + * "git worktree" had a broken code that attempted to auto-fix + possible inconsistency that results from end-users moving a + worktree to different places without telling Git (the original + repository needs to maintain backpointers to its worktrees, but + "mv" run by end-users who are not familiar with that fact will + obviously not adjust them), which actually made things worse + when triggered. + + * "git push --force-with-lease" has been taught to report if the push + needed to force (or fast-forwarded). + + * The emulated "yes" command used in our test scripts has been + tweaked not to spend too much time generating unnecessary output + that is not used, to help those who test on Windows where it would + not stop until it fills the pipe buffer due to lack of SIGPIPE. + + * The vimdiff backend for "git mergetool" has been tweaked to arrange + and number buffers in the order that would match the expectation of + majority of people who read left to right, then top down and assign + buffers 1 2 3 4 "mentally" to local base remote merge windows based + on that order. + + * The documentation for "git clean" has been corrected; it mentioned + that .git/modules/* are removed by giving two "-f", which has never + been the case. + + * Paths that have been told the index about with "add -N" are not + quite yet in the index, but a few commands behaved as if they + already are in a harmful way. + +Also includes tiny documentation and test updates. diff --git a/Documentation/RelNotes/2.7.3.txt b/Documentation/RelNotes/2.7.3.txt new file mode 100644 index 0000000000..6adf038915 --- /dev/null +++ b/Documentation/RelNotes/2.7.3.txt @@ -0,0 +1,62 @@ +Git v2.7.3 Release Notes +======================== + +Fixes since v2.7.2 +------------------ + + * Traditionally, the tests that try commands that work on the + contents in the working tree were named with "worktree" in their + filenames, but with the recent addition of "git worktree" + subcommand, whose tests are also named similarly, it has become + harder to tell them apart. The traditional tests have been renamed + to use "work-tree" instead in an attempt to differentiate them. + + * Many codepaths forget to check return value from git_config_set(); + the function is made to die() to make sure we do not proceed when + setting a configuration variable failed. + + * Handling of errors while writing into our internal asynchronous + process has been made more robust, which reduces flakiness in our + tests. + + * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a + rev, i.e. the object named by the the pathname with wildcard + characters in a tree object. + + * "git rev-parse --git-common-dir" used in the worktree feature + misbehaved when run from a subdirectory. + + * The "v(iew)" subcommand of the interactive "git am -i" command was + broken in 2.6.0 timeframe when the command was rewritten in C. + + * "git merge-tree" used to mishandle "both sides added" conflict with + its own "create a fake ancestor file that has the common parts of + what both sides have added and do a 3-way merge" logic; this has + been updated to use the usual "3-way merge with an empty blob as + the fake common ancestor file" approach used in the rest of the + system. + + * The memory ownership rule of fill_textconv() API, which was a bit + tricky, has been documented a bit better. + + * The documentation did not clearly state that the 'simple' mode is + now the default for "git push" when push.default configuration is + not set. + + * Recent versions of GNU grep are pickier when their input contains + arbitrary binary data, which some of our tests uses. Rewrite the + tests to sidestep the problem. + + * A helper function "git submodule" uses since v2.7.0 to list the + modules that match the pathspec argument given to its subcommands + (e.g. "submodule add ") has been fixed. + + * "git config section.var value" to set a value in per-repository + configuration file failed when it was run outside any repository, + but didn't say the reason correctly. + + * The code to read the pack data using the offsets stored in the pack + idx file has been made more carefully check the validity of the + data in the idx. + +Also includes documentation and test updates. diff --git a/Documentation/RelNotes/2.7.4.txt b/Documentation/RelNotes/2.7.4.txt new file mode 100644 index 0000000000..883ae896fe --- /dev/null +++ b/Documentation/RelNotes/2.7.4.txt @@ -0,0 +1,11 @@ +Git v2.7.4 Release Notes +======================== + +Fixes since v2.7.3 +------------------ + + * Bugfix patches were backported from the 'master' front to plug heap + corruption holes, to catch integer overflow in the computation of + pathname lengths, and to get rid of the name_path API. Both of + these would have resulted in writing over an under-allocated buffer + when formulating pathnames while tree traversal. diff --git a/Documentation/RelNotes/2.8.0.txt b/Documentation/RelNotes/2.8.0.txt new file mode 100644 index 0000000000..25079710fa --- /dev/null +++ b/Documentation/RelNotes/2.8.0.txt @@ -0,0 +1,439 @@ +Git 2.8 Release Notes +===================== + +Backward compatibility note +--------------------------- + +The rsync:// transport has been removed. + + +Updates since v2.7 +------------------ + +UI, Workflows & Features + + * It turns out "git clone" over rsync transport has been broken when + the source repository has packed references for a long time, and + nobody noticed nor complained about it. + + * "push" learned that its "--delete" option can be shortened to + "-d", just like "branch --delete" and "branch -d" are the same + thing. + + * "git blame" learned to produce the progress eye-candy when it takes + too much time before emitting the first line of the result. + + * "git grep" can now be configured (or told from the command line) + how many threads to use when searching in the working tree files. + + * Some "git notes" operations, e.g. "git log --notes=", should + be able to read notes from any tree-ish that is shaped like a notes + tree, but the notes infrastructure required that the argument must + be a ref under refs/notes/. Loosen it to require a valid ref only + when the operation would update the notes (in which case we must + have a place to store the updated notes tree, iow, a ref). + + * "git grep" by default does not fall back to its "--no-index" + behavior outside a directory under Git's control (otherwise the + user may by mistake end up running a huge recursive search); with a + new configuration (set in $HOME/.gitconfig--by definition this + cannot be set in the config file per project), this safety can be + disabled. + + * "git pull --rebase" has been extended to allow invoking + "rebase -i". + + * "git p4" learned to cope with the type of a file getting changed. + + * "git format-patch" learned to notice format.outputDirectory + configuration variable. This allows "-o " option to be + omitted on the command line if you always use the same directory in + your workflow. + + * "interpret-trailers" has been taught to optionally update a file in + place, instead of always writing the result to the standard output. + + * Many commands that read files that are expected to contain text + that is generated (or can be edited) by the end user to control + their behavior (e.g. "git grep -f ") have been updated + to be more tolerant to lines that are terminated with CRLF (they + used to treat such a line to contain payload that ends with CR, + which is usually not what the users expect). + + * "git notes merge" used to limit the source of the merged notes tree + to somewhere under refs/notes/ hierarchy, which was too limiting + when inventing a workflow to exchange notes with remote + repositories using remote-tracking notes trees (located in e.g. + refs/remote-notes/ or somesuch). + + * "git ls-files" learned a new "--eol" option to help diagnose + end-of-line problems. + + * "ls-remote" learned an option to show which branch the remote + repository advertises as its primary by pointing its HEAD at. + + * New http.proxyAuthMethod configuration variable can be used to + specify what authentication method to use, as a way to work around + proxies that do not give error response expected by libcurl when + CURLAUTH_ANY is used. Also, the codepath for proxy authentication + has been taught to use credential API to store the authentication + material in user's keyrings. + + * Update the untracked cache subsystem and change its primary UI from + "git update-index" to "git config". + + * There were a few "now I am doing this thing" progress messages in + the TCP connection code that can be triggered by setting a verbose + option internally in the code, but "git fetch -v" and friends never + passed the verbose option down to that codepath. + + * Clean/smudge filters defined in a configuration file of lower + precedence can now be overridden to be a pass-through no-op by + setting the variable to an empty string. + + * A new "^{/!-}" notation can be used to name a + commit that is reachable from that does not match the + given . + + * The "user.useConfigOnly" configuration variable can be used to + force the user to always set user.email & user.name configuration + variables, serving as a reminder for those who work on multiple + projects and do not want to put these in their $HOME/.gitconfig. + + * "git fetch" and friends that make network connections can now be + told to only use ipv4 (or ipv6). + + * Some authentication methods do not need username or password, but + libcurl needs some hint that it needs to perform authentication. + Supplying an empty username and password string is a valid way to + do so, but you can set the http.[.]emptyAuth configuration + variable to achieve the same, if you find it cleaner. + + * You can now set http.[.]pinnedpubkey to specify the pinned + public key when building with recent enough versions of libcURL. + + * The configuration system has been taught to phrase where it found a + bad configuration variable in a better way in its error messages. + "git config" learnt a new "--show-origin" option to indicate where + the values come from. + + * The "credential-cache" daemon process used to run in whatever + directory it happened to start in, but this made umount(2)ing the + filesystem that houses the repository harder; now the process + chdir()s to the directory that house its own socket on startup. + + * When "git submodule update" did not result in fetching the commit + object in the submodule that is referenced by the superproject, the + command learned to retry another fetch, specifically asking for + that commit that may not be connected to the refs it usually + fetches. + + * "git merge-recursive" learned "--no-renames" option to disable its + rename detection logic. + + * Across the transition at around Git version 2.0, the user used to + get a pretty loud warning when running "git push" without setting + push.default configuration variable. We no longer warn because the + transition was completed a long time ago. + + * README has been renamed to README.md and its contents got tweaked + slightly to make it easier on the eyes. + + +Performance, Internal Implementation, Development Support etc. + + * Add a framework to spawn a group of processes in parallel, and use + it to run "git fetch --recurse-submodules" in parallel. + + * A slight update to the Makefile to mark ".PHONY" targets as such + correctly. + + * In-core storage of the reverse index for .pack files (which lets + you go from a pack offset to an object name) has been streamlined. + + * d95138e6 (setup: set env $GIT_WORK_TREE when work tree is set, like + $GIT_DIR, 2015-06-26) attempted to work around a glitch in alias + handling by overwriting GIT_WORK_TREE environment variable to + affect subprocesses when set_git_work_tree() gets called, which + resulted in a rather unpleasant regression to "clone" and "init". + Try to address the same issue by always restoring the environment + and respawning the real underlying command when handling alias. + + * The low-level code that is used to create symbolic references has + been updated to share more code with the code that deals with + normal references. + + * strbuf_getline() and friends have been redefined to make it easier + to identify which callsite of (new) strbuf_getline_lf() should + allow and silently ignore carriage-return at the end of the line to + help users on DOSsy systems. + + * "git shortlog" used to accumulate various pieces of information + regardless of what was asked to be shown in the final output. It + has been optimized by noticing what need not to be collected + (e.g. there is no need to collect the log messages when showing + only the number of changes). + + * "git checkout $branch" (and other operations that share the same + underlying machinery) has been optimized. + + * Automated tests in Travis CI environment has been optimized by + persisting runtime statistics of previous "prove" run, executing + tests that take longer before other ones; this reduces the total + wallclock time. + + * Test scripts have been updated to remove assumptions that are not + portable between Git for POSIX and Git for Windows, or to skip ones + with expectations that are not satisfiable on Git for Windows. + + * Some calls to strcpy(3) triggers a false warning from static + analyzers that are less intelligent than humans, and reducing the + number of these false hits helps us notice real issues. A few + calls to strcpy(3) in a couple of protrams that are already safe + has been rewritten to avoid false warnings. + + * The "name_path" API was an attempt to reduce the need to construct + the full path out of a series of path components while walking a + tree hierarchy, but over time made less efficient because the path + needs to be flattened, e.g. to be compared with another path that + is already flat. The API has been removed and its users have been + rewritten to simplify the overall code complexity. + + * Help those who debug http(s) part of the system. + (merge 0054045 sp/remote-curl-ssl-strerror later to maint). + + * The internal API to interact with "remote.*" configuration + variables has been streamlined. + + * The ref-filter's format-parsing code has been refactored, in + preparation for "branch --format" and friends. + + * Traditionally, the tests that try commands that work on the + contents in the working tree were named with "worktree" in their + filenames, but with the recent addition of "git worktree" + subcommand, whose tests are also named similarly, it has become + harder to tell them apart. The traditional tests have been renamed + to use "work-tree" instead in an attempt to differentiate them. + (merge 5549029 mg/work-tree-tests later to maint). + + * Many codepaths forget to check return value from git_config_set(); + the function is made to die() to make sure we do not proceed when + setting a configuration variable failed. + (merge 3d18064 ps/config-error later to maint). + + * Handling of errors while writing into our internal asynchronous + process has been made more robust, which reduces flakiness in our + tests. + (merge 43f3afc jk/epipe-in-async later to maint). + + * There is a new DEVELOPER knob that enables many compiler warning + options in the Makefile. + + * The way the test scripts configure the Apache web server has been + updated to work also for Apache 2.4 running on RedHat derived + distros. + + * Out of maintenance gcc on OSX 10.6 fails to compile the code in + 'master'; work it around by using clang by default on the platform. + + * The "name_path" API was an attempt to reduce the need to construct + the full path out of a series of path components while walking a + tree hierarchy, but over time made less efficient because the path + needs to be flattened, e.g. to be compared with another path that + is already flat, in many cases. The API has been removed and its + users have been rewritten to simplify the overall code complexity. + This incidentally also closes some heap-corruption holes. + + * Recent versions of GNU grep is pickier than before to decide if a + file is "binary" and refuse to give line-oriented hits when we + expect it to, unless explicitly told with "-a" option. As our + scripted Porcelains use sane_grep wrapper for line-oriented data, + even when the line may contain non-ASCII payload we took from + end-user data, use "grep -a" to implement sane_grep wrapper when + using an implementation of "grep" that takes the "-a" option. + + + +Also contains various documentation updates and code clean-ups. + + +Fixes since v2.7 +---------------- + +Unless otherwise noted, all the fixes since v2.7 in the maintenance +track are contained in this release (see the maintenance releases' +notes for details). + + * An earlier change in 2.5.x-era broke users' hooks and aliases by + exporting GIT_WORK_TREE to point at the root of the working tree, + interfering when they tried to use a different working tree without + setting GIT_WORK_TREE environment themselves. + + * The "exclude_list" structure has the usual "alloc, nr" pair of + fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot + to reset 'alloc' to 0 when it cleared 'nr' to discard the managed + array. + + * Paths that have been told the index about with "add -N" are not + quite yet in the index, but a few commands behaved as if they + already are in a harmful way. + + * "git send-email" was confused by escaped quotes stored in the alias + files saved by "mutt", which has been corrected. + + * A few non-portable C construct have been spotted by clang compiler + and have been fixed. + + * The documentation has been updated to hint the connection between + the '--signoff' option and DCO. + + * "git reflog" incorrectly assumed that all objects that used to be + at the tip of a ref must be commits, which caused it to segfault. + + * The ignore mechanism saw a few regressions around untracked file + listing and sparse checkout selection areas in 2.7.0; the change + that is responsible for the regression has been reverted. + + * Some codepaths used fopen(3) when opening a fixed path in $GIT_DIR + (e.g. COMMIT_EDITMSG) that is meant to be left after the command is + done. This however did not work well if the repository is set to + be shared with core.sharedRepository and the umask of the previous + user is tighter. They have been made to work better by calling + unlink(2) and retrying after fopen(3) fails with EPERM. + + * Asking gitweb for a nonexistent commit left a warning in the server + log. + + Somebody may want to follow this up with an additional test, perhaps? + IIRC, we do test that no Perl warnings are given to the server log, + so this should have been caught if our test coverage were good. + + * "git rebase", unlike all other callers of "gc --auto", did not + ignore the exit code from "gc --auto". + + * Many codepaths that run "gc --auto" before exiting kept packfiles + mapped and left the file descriptors to them open, which was not + friendly to systems that cannot remove files that are open. They + now close the packs before doing so. + + * A recent optimization to filter-branch in v2.7.0 introduced a + regression when --prune-empty filter is used, which has been + corrected. + + * The description for SANITY prerequisite the test suite uses has + been clarified both in the comment and in the implementation. + + * "git tag" started listing a tag "foo" as "tags/foo" when a branch + named "foo" exists in the same repository; remove this unnecessary + disambiguation, which is a regression introduced in v2.7.0. + + * The way "git svn" uses auth parameter was broken by Subversion + 1.9.0 and later. + + * The "split" subcommand of "git subtree" (in contrib/) incorrectly + skipped merges when it shouldn't, which was corrected. + + * A few options of "git diff" did not work well when the command was + run from a subdirectory. + + * The command line completion learned a handful of additional options + and command specific syntax. + + * dirname() emulation has been added, as Msys2 lacks it. + + * The underlying machinery used by "ls-files -o" and other commands + has been taught not to create empty submodule ref cache for a + directory that is not a submodule. This removes a ton of wasted + CPU cycles. + + * "git worktree" had a broken code that attempted to auto-fix + possible inconsistency that results from end-users moving a + worktree to different places without telling Git (the original + repository needs to maintain back-pointers to its worktrees, + but "mv" run by end-users who are not familiar with that fact + will obviously not adjust them), which actually made things + worse when triggered. + + * The low-level merge machinery has been taught to use CRLF line + termination when inserting conflict markers to merged contents that + are themselves CRLF line-terminated. + + * "git push --force-with-lease" has been taught to report if the push + needed to force (or fast-forwarded). + + * The emulated "yes" command used in our test scripts has been + tweaked not to spend too much time generating unnecessary output + that is not used, to help those who test on Windows where it would + not stop until it fills the pipe buffer due to lack of SIGPIPE. + + * The documentation for "git clean" has been corrected; it mentioned + that .git/modules/* are removed by giving two "-f", which has never + been the case. + + * The vimdiff backend for "git mergetool" has been tweaked to arrange + and number buffers in the order that would match the expectation of + majority of people who read left to right, then top down and assign + buffers 1 2 3 4 "mentally" to local base remote merge windows based + on that order. + + * "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a + rev, i.e. the object named by the the pathname with wildcard + characters in a tree object. + (merge aac4fac nd/dwim-wildcards-as-pathspecs later to maint). + + * "git rev-parse --git-common-dir" used in the worktree feature + misbehaved when run from a subdirectory. + (merge 17f1365 nd/git-common-dir-fix later to maint). + + * "git worktree add -B " did not work. + + * The "v(iew)" subcommand of the interactive "git am -i" command was + broken in 2.6.0 timeframe when the command was rewritten in C. + (merge 708b8cc jc/am-i-v-fix later to maint). + + * "git merge-tree" used to mishandle "both sides added" conflict with + its own "create a fake ancestor file that has the common parts of + what both sides have added and do a 3-way merge" logic; this has + been updated to use the usual "3-way merge with an empty blob as + the fake common ancestor file" approach used in the rest of the + system. + (merge 907681e jk/no-diff-emit-common later to maint). + + * The memory ownership rule of fill_textconv() API, which was a bit + tricky, has been documented a bit better. + (merge a64e6a4 jk/more-comments-on-textconv later to maint). + + * Update various codepaths to avoid manually-counted malloc(). + (merge 08c95df jk/tighten-alloc later to maint). + + * The documentation did not clearly state that the 'simple' mode is + now the default for "git push" when push.default configuration is + not set. + (merge f6b1fb3 mm/push-simple-doc later to maint). + + * Recent versions of GNU grep are pickier when their input contains + arbitrary binary data, which some of our tests uses. Rewrite the + tests to sidestep the problem. + (merge 3b1442d jk/grep-binary-workaround-in-test later to maint). + + * A helper function "git submodule" uses since v2.7.0 to list the + modules that match the pathspec argument given to its subcommands + (e.g. "submodule add ") has been fixed. + (merge 2b56bb7 sb/submodule-module-list-fix later to maint). + + * "git config section.var value" to set a value in per-repository + configuration file failed when it was run outside any repository, + but didn't say the reason correctly. + (merge 638fa62 js/config-set-in-non-repository later to maint). + + * The code to read the pack data using the offsets stored in the pack + idx file has been made more carefully check the validity of the + data in the idx. + (merge 7465feb jk/pack-idx-corruption-safety later to maint). + + * Other minor clean-ups and documentation updates + (merge f459823 ak/extract-argv0-last-dir-sep later to maint). + (merge 63ca1c0 ak/git-strip-extension-from-dashed-command later to maint). + (merge 4867f11 ps/plug-xdl-merge-leak later to maint). + (merge 4938686 dt/initial-ref-xn-commit-doc later to maint). + (merge 9537f21 ma/update-hooks-sample-typofix later to maint). diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index 760eab7428..02cb6845cd 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -69,6 +69,13 @@ include::line-range-format.txt[] iso format is used. For supported values, see the discussion of the --date option at linkgit:git-log[1]. +--[no-]progress:: + Progress status is reported on the standard error stream + by default when it is attached to a terminal. This flag + enables progress reporting even if not attached to a + terminal. Can't use `--progress` together with `--porcelain` + or `--incremental`. + -M||:: Detect moved or copied lines within a file. When a commit moves or copies a block of lines (e.g. the original file diff --git a/Documentation/config.txt b/Documentation/config.txt index 3b02732caa..59d7046f8e 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -308,6 +308,15 @@ core.trustctime:: crawlers and some backup systems). See linkgit:git-update-index[1]. True by default. +core.untrackedCache:: + Determines what to do about the untracked cache feature of the + index. It will be kept, if this variable is unset or set to + `keep`. It will automatically be added if set to `true`. And + it will automatically be removed, if set to `false`. Before + setting it to `true`, you should check that mtime is working + properly on your system. + See linkgit:git-update-index[1]. `keep` by default. + core.checkStat:: Determines which stat fields to match between the index and work tree. The user can set this to 'default' or @@ -870,6 +879,8 @@ When preserve, also pass `--preserve-merges` along to 'git rebase' so that locally committed merge commits will not be flattened by running 'git pull'. + +When the value is `interactive`, the rebase is run in interactive mode. ++ *NOTE*: this is a possibly dangerous operation; do *not* use it unless you understand the implications (see linkgit:git-rebase[1] for details). @@ -1243,6 +1254,10 @@ format.coverLetter:: format-patch is invoked, but in addition can be set to "auto", to generate a cover-letter only when there's more than one patch. +format.outputDirectory:: + Set a custom directory to store the resulting files instead of the + current working directory. + filter..clean:: The command which is used to convert the content of a worktree file to a blob upon checkin. See linkgit:gitattributes[5] for @@ -1450,6 +1465,14 @@ grep.extendedRegexp:: option is ignored when the 'grep.patternType' option is set to a value other than 'default'. +grep.threads:: + Number of grep worker threads to use. + See `grep.threads` in linkgit:git-grep[1] for more information. + +grep.fallbackToNoIndex:: + If set to true, fall back to git grep --no-index if git grep + is executed outside of a git repository. Defaults to false. + gpg.program:: Use this custom program instead of "gpg" found on $PATH when making or verifying a PGP signature. The program must support the @@ -1596,9 +1619,40 @@ help.htmlPath:: http.proxy:: Override the HTTP proxy, normally configured using the 'http_proxy', - 'https_proxy', and 'all_proxy' environment variables (see - `curl(1)`). This can be overridden on a per-remote basis; see - remote..proxy + 'https_proxy', and 'all_proxy' environment variables (see `curl(1)`). In + addition to the syntax understood by curl, it is possible to specify a + proxy string with a user name but no password, in which case git will + attempt to acquire one in the same way it does for other credentials. See + linkgit:gitcredentials[7] for more information. The syntax thus is + '[protocol://][user[:password]@]proxyhost[:port]'. This can be overridden + on a per-remote basis; see remote..proxy + +http.proxyAuthMethod:: + Set the method with which to authenticate against the HTTP proxy. This + only takes effect if the configured proxy string contains a user name part + (i.e. is of the form 'user@host' or 'user@host:port'). This can be + overridden on a per-remote basis; see `remote..proxyAuthMethod`. + Both can be overridden by the 'GIT_HTTP_PROXY_AUTHMETHOD' environment + variable. Possible values are: ++ +-- +* `anyauth` - Automatically pick a suitable authentication method. It is + assumed that the proxy answers an unauthenticated request with a 407 + status code and one or more Proxy-authenticate headers with supported + authentication methods. This is the default. +* `basic` - HTTP Basic authentication +* `digest` - HTTP Digest authentication; this prevents the password from being + transmitted to the proxy in clear text +* `negotiate` - GSS-Negotiate authentication (compare the --negotiate option + of `curl(1)`) +* `ntlm` - NTLM authentication (compare the --ntlm option of `curl(1)`) +-- + +http.emptyAuth:: + Attempt authentication without seeking a username or password. This + can be used to attempt GSS-Negotiate authentication without specifying + a username in the URL, as libcurl normally requires a username for + authentication. http.cookieFile:: File containing previously stored cookie lines which should be used @@ -1679,6 +1733,14 @@ http.sslCAPath:: with when fetching or pushing over HTTPS. Can be overridden by the 'GIT_SSL_CAPATH' environment variable. +http.pinnedpubkey:: + Public key of the https service. It may either be the filename of + a PEM or DER encoded public key file or a string starting with + 'sha256//' followed by the base64 encoded sha256 hash of the + public key. See also libcurl 'CURLOPT_PINNEDPUBLICKEY'. git will + exit with an error if this option is set but not supported by + cURL. + http.sslTry:: Attempt to use AUTH SSL/TLS and encrypted data transfers when connecting via regular FTP protocol. This might be needed @@ -2074,7 +2136,7 @@ pack.indexVersion:: larger than 2 GB. + If you have an old Git that does not understand the version 2 `*.idx` file, -cloning or fetching over a non native protocol (e.g. "http" and "rsync") +cloning or fetching over a non native protocol (e.g. "http") that will copy both `*.pack` file and corresponding `*.idx` file from the other side may give you a repository that cannot be accessed with your older version of Git. If the `*.pack` file is smaller than 2 GB, however, @@ -2149,6 +2211,8 @@ When preserve, also pass `--preserve-merges` along to 'git rebase' so that locally committed merge commits will not be flattened by running 'git pull'. + +When the value is `interactive`, the rebase is run in interactive mode. ++ *NOTE*: this is a possibly dangerous operation; do *not* use it unless you understand the implications (see linkgit:git-rebase[1] for details). @@ -2229,6 +2293,20 @@ push.gpgSign:: override a value from a lower-priority config file. An explicit command-line flag always overrides this config option. +push.recurseSubmodules:: + Make sure all submodule commits used by the revisions to be pushed + are available on a remote-tracking branch. If the value is 'check' + then Git will verify that all submodule commits that changed in the + revisions to be pushed are available on at least one remote of the + submodule. If any commits are missing, the push will be aborted and + exit with non-zero status. If the value is 'on-demand' then all + submodules that changed in the revisions to be pushed will be + pushed. If on-demand was not able to push all necessary revisions + it will also be aborted and exit with non-zero status. If the value + is 'no' then default behavior of ignoring submodules when pushing + is retained. You may override this configuration at time of push by + specifying '--recurse-submodules=check|on-demand|no'. + rebase.stat:: Whether to show a diffstat of what changed upstream since the last rebase. False by default. @@ -2393,6 +2471,11 @@ remote..proxy:: the proxy to use for that remote. Set to the empty string to disable proxying for that remote. +remote..proxyAuthMethod:: + For remotes that require curl (http, https and ftp), the method to use for + authenticating against the proxy in use (probably set in + `remote..proxy`). See `http.proxyAuthMethod`. + remote..fetch:: The default set of "refspec" for linkgit:git-fetch[1]. See linkgit:git-fetch[1]. @@ -2767,6 +2850,16 @@ user.name:: Can be overridden by the 'GIT_AUTHOR_NAME' and 'GIT_COMMITTER_NAME' environment variables. See linkgit:git-commit-tree[1]. +user.useConfigOnly:: + Instruct Git to avoid trying to guess defaults for 'user.email' + and 'user.name', and instead retrieve the values only from the + configuration. For example, if you have multiple email addresses + and would like to use a different one for each repository, then + with this configuration option set to `true` in the global config + along with a name, Git will prompt you to set up an email before + making new commits in a newly cloned repository. + Defaults to `false`. + user.signingKey:: If linkgit:git-tag[1] or linkgit:git-commit[1] is not selecting the key you want it to automatically when creating a signed tag or diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt index 6b109f687a..036edfb099 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -8,10 +8,11 @@ option old data in `.git/FETCH_HEAD` will be overwritten. --depth=:: - Deepen or shorten the history of a 'shallow' repository created by - `git clone` with `--depth=` option (see linkgit:git-clone[1]) - to the specified number of commits from the tip of each remote - branch history. Tags for the deepened commits are not fetched. + Limit fetching to the specified number of commits from the tip of + each remote branch history. If fetching to a 'shallow' repository + created by `git clone` with `--depth=` option (see + linkgit:git-clone[1]), deepen or shorten the history to the specified + number of commits. Tags for the deepened commits are not fetched. --unshallow:: If the source repository is complete, convert a shallow @@ -157,3 +158,11 @@ endif::git-pull[] by default when it is attached to a terminal, unless -q is specified. This flag forces progress status even if the standard error stream is not directed to a terminal. + +-4:: +--ipv4:: + Use IPv4 addresses only, ignoring IPv6 addresses. + +-6:: +--ipv6:: + Use IPv6 addresses only, ignoring IPv4 addresses. diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index fe5282f130..6a96a669c2 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -24,7 +24,7 @@ remove paths that do not exist in the working tree anymore. The "index" holds a snapshot of the content of the working tree, and it is this snapshot that is taken as the contents of the next commit. Thus -after making any changes to the working directory, and before running +after making any changes to the working tree, and before running the commit command, you must use the `add` command to add any new or modified files to the index. diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 452c1feb23..13cdd7f3b6 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -35,6 +35,7 @@ OPTIONS --signoff:: Add a `Signed-off-by:` line to the commit message, using the committer identity of yourself. + See the signoff option in linkgit:git-commit[1] for more information. -k:: --keep:: diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index e6e947c808..ba5417567c 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -10,7 +10,8 @@ SYNOPSIS [verse] 'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L ] [-S ] [-M] [-C] [-C] [-C] [--since=] - [--abbrev=] [ | --contents | --reverse ] [--] + [--progress] [--abbrev=] [ | --contents | --reverse ] + [--] DESCRIPTION ----------- diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt index 0417562eb7..3a8120c3b3 100644 --- a/Documentation/git-bundle.txt +++ b/Documentation/git-bundle.txt @@ -20,7 +20,7 @@ DESCRIPTION Some workflows require that one or more branches of development on one machine be replicated on another machine, but the two machines cannot be directly connected, and therefore the interactive Git protocols (git, -ssh, rsync, http) cannot be used. This command provides support for +ssh, http) cannot be used. This command provides support for 'git fetch' and 'git pull' to operate by packaging objects and references in an archive at the originating machine, then importing those into another repository using 'git fetch' and 'git pull' diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 77da29a474..6154e57238 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -100,6 +100,7 @@ effect to your index in a row. -s:: --signoff:: Add Signed-off-by line at the end of the commit message. + See the signoff option in linkgit:git-commit[1] for more information. -S[]:: --gpg-sign[=]:: diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt index 641681f61a..51a7e26a8e 100644 --- a/Documentation/git-clean.txt +++ b/Documentation/git-clean.txt @@ -37,9 +37,7 @@ OPTIONS to false, 'git clean' will refuse to delete files or directories unless given -f, -n or -i. Git will refuse to delete directories with .git sub directory or file unless a second -f - is given. This affects also git submodules where the storage area - of the removed submodule under .git/modules/ is not removed until - -f is given twice. + is given. -i:: --interactive:: diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 6db7b6d370..45d74be297 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -115,8 +115,7 @@ objects from the source repository into a pack in the cloned repository. --quiet:: -q:: Operate quietly. Progress is not reported to the standard - error stream. This flag is also passed to the `rsync' - command when given. + error stream. --verbose:: -v:: @@ -190,15 +189,14 @@ objects from the source repository into a pack in the cloned repository. --depth :: Create a 'shallow' clone with a history truncated to the - specified number of revisions. + specified number of commits. Implies `--single-branch` unless + `--no-single-branch` is given to fetch the histories near the + tips of all branches. --[no-]single-branch:: Clone only the history leading to the tip of a single branch, either specified by the `--branch` option or the primary - branch remote's `HEAD` points at. When creating a shallow - clone with the `--depth` option, this is the default, unless - `--no-single-branch` is given to fetch the histories near the - tips of all branches. + branch remote's `HEAD` points at. Further fetches into the resulting repository will only update the remote-tracking branch for the branch this option was used for the initial cloning. If the HEAD at the remote did not point at any diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 7f34a5b331..9ec6b3cc17 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -154,7 +154,11 @@ OPTIONS -s:: --signoff:: Add Signed-off-by line by the committer at the end of the commit - log message. + log message. The meaning of a signoff depends on the project, + but it typically certifies that committer has + the rights to submit this work under the same license and + agrees to a Developer Certificate of Origin + (see http://developercertificate.org/ for more information). -n:: --no-verify:: diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 2608ca74ac..153b2d89b5 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -9,18 +9,18 @@ git-config - Get and set repository or global options SYNOPSIS -------- [verse] -'git config' [] [type] [-z|--null] name [value [value_regex]] +'git config' [] [type] [--show-origin] [-z|--null] name [value [value_regex]] 'git config' [] [type] --add name value 'git config' [] [type] --replace-all name value [value_regex] -'git config' [] [type] [-z|--null] --get name [value_regex] -'git config' [] [type] [-z|--null] --get-all name [value_regex] -'git config' [] [type] [-z|--null] [--name-only] --get-regexp name_regex [value_regex] +'git config' [] [type] [--show-origin] [-z|--null] --get name [value_regex] +'git config' [] [type] [--show-origin] [-z|--null] --get-all name [value_regex] +'git config' [] [type] [--show-origin] [-z|--null] [--name-only] --get-regexp name_regex [value_regex] 'git config' [] [type] [-z|--null] --get-urlmatch name URL 'git config' [] --unset name [value_regex] 'git config' [] --unset-all name [value_regex] 'git config' [] --rename-section old_name new_name 'git config' [] --remove-section name -'git config' [] [-z|--null] [--name-only] -l | --list +'git config' [] [--show-origin] [-z|--null] [--name-only] -l | --list 'git config' [] --get-color name [default] 'git config' [] --get-colorbool name [stdout-is-tty] 'git config' [] -e | --edit @@ -194,6 +194,12 @@ See also <>. Output only the names of config variables for `--list` or `--get-regexp`. +--show-origin:: + Augment the output of all queried config options with the + origin type (file, standard input, blob, command line) and + the actual origin (config file path, ref, or blob id if + applicable). + --get-colorbool name [stdout-is-tty]:: Find the color setting for `name` (e.g. `color.diff`) and output @@ -219,7 +225,9 @@ See also <>. --[no-]includes:: Respect `include.*` directives in config files when looking up - values. Defaults to on. + values. Defaults to `off` when a specific file is given (e.g., + using `--file`, `--global`, etc) and `on` when searching all + config files. [[FILES]] FILES diff --git a/Documentation/git-credential-cache.txt b/Documentation/git-credential-cache.txt index 89b730632d..96208f822e 100644 --- a/Documentation/git-credential-cache.txt +++ b/Documentation/git-credential-cache.txt @@ -36,7 +36,7 @@ OPTIONS cache daemon if one is not started). Defaults to `~/.git-credential-cache/socket`. If your home directory is on a network-mounted filesystem, you may need to change this to a - local filesystem. + local filesystem. You must specify an absolute path. CONTROLLING THE DAEMON ---------------------- diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index c6f073cea4..012e8f9a08 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -92,7 +92,11 @@ refname:: The name of the ref (the part after $GIT_DIR/). For a non-ambiguous short name of the ref append `:short`. The option core.warnAmbiguousRefs is used to select the strict - abbreviation mode. + abbreviation mode. If `strip=` is appended, strips `` + slash-separated path components from the front of the refname + (e.g., `%(refname:strip=2)` turns `refs/tags/foo` into `foo`. + `` must be a positive integer. If a displayed ref has fewer + components than ``, the command aborts with an error. objecttype:: The type of the object (`blob`, `tree`, `commit`, `tag`). @@ -129,19 +133,28 @@ color:: align:: Left-, middle-, or right-align the content between - %(align:...) and %(end). The "align:" is followed by `` - and `` in any order separated by a comma, where the - `` is either left, right or middle, default being - left and `` is the total length of the content with - alignment. If the contents length is more than the width then - no alignment is performed. If used with '--quote' everything - in between %(align:...) and %(end) is quoted, but if nested - then only the topmost level performs quoting. + %(align:...) and %(end). The "align:" is followed by + `width=` and `position=` in any order + separated by a comma, where the `` is either left, + right or middle, default being left and `` is the total + length of the content with alignment. For brevity, the + "width=" and/or "position=" prefixes may be omitted, and bare + and used instead. For instance, + `%(align:,)`. If the contents length is more + than the width then no alignment is performed. If used with + '--quote' everything in between %(align:...) and %(end) is + quoted, but if nested then only the topmost level performs + quoting. In addition to the above, for commit and tag objects, the header field names (`tree`, `parent`, `object`, `type`, and `tag`) can be used to specify the value in the header field. +For commit and tag objects, the special `creatordate` and `creator` +fields will correspond to the appropriate date or name-email-date tuple +from the `committer` or `tagger` fields depending on the object type. +These are intended for working on a mix of annotated and lightweight tags. + Fields that have name-email-date tuple as its value (`author`, `committer`, and `tagger`) can be suffixed with `name`, `email`, and `date` to extract the named component. @@ -153,8 +166,8 @@ line is 'contents:body', where body is all of the lines after the first blank line. The optional GPG signature is `contents:signature`. The first `N` lines of the message is obtained using `contents:lines=N`. -For sorting purposes, fields with numeric values sort in numeric -order (`objectsize`, `authordate`, `committerdate`, `taggerdate`). +For sorting purposes, fields with numeric values sort in numeric order +(`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`). All other fields are used to sort in their byte-value order. There is also an option to sort by versions, this can be done by using diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 4035649117..6821441d7d 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -57,7 +57,11 @@ The names of the output files are printed to standard output, unless the `--stdout` option is specified. If `-o` is specified, output files are created in . Otherwise -they are created in the current working directory. +they are created in the current working directory. The default path +can be set with the 'format.outputDirectory' configuration option. +The `-o` option takes precedence over `format.outputDirectory`. +To store patches in the current working directory even when +`format.outputDirectory` points elsewhere, use `-o .`. By default, the subject of a single patch is "[PATCH] " followed by the concatenation of lines from the commit message up to the first blank @@ -109,6 +113,7 @@ include::diff-options.txt[] --signoff:: Add `Signed-off-by:` line to the commit message, using the committer identity of yourself. + See the signoff option in linkgit:git-commit[1] for more information. --stdout:: Print all commits to the standard output in mbox format, @@ -256,6 +261,10 @@ you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`. using this option cannot be applied properly, but they are still useful for code review. +--zero-commit:: + Output an all-zero hash in each patch's From header instead + of the hash of the commit. + --root:: Treat the revision argument as a , even if it is just a single commit (that would normally be treated as a diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index 4a44d6da13..cb0f6cf678 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -23,6 +23,7 @@ SYNOPSIS [--break] [--heading] [-p | --show-function] [-A ] [-B ] [-C ] [-W | --function-context] + [--threads ] [-f ] [-e] [--and|--or|--not|(|)|-e ...] [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | ...] @@ -53,9 +54,17 @@ grep.extendedRegexp:: option is ignored when the 'grep.patternType' option is set to a value other than 'default'. +grep.threads:: + Number of grep worker threads to use. If unset (or set to 0), + 8 threads are used by default (for now). + grep.fullName:: If set to true, enable '--full-name' option by default. +grep.fallbackToNoIndex:: + If set to true, fall back to git grep --no-index if git grep + is executed outside of a git repository. Defaults to false. + OPTIONS ------- @@ -227,6 +236,10 @@ OPTIONS effectively showing the whole function in which the match was found. +--threads :: + Number of grep worker threads to use. + See `grep.threads` in 'CONFIGURATION' for more information. + -f :: Read patterns from , one per line. diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt index 0ecd497c4d..a77b901f1d 100644 --- a/Documentation/git-interpret-trailers.txt +++ b/Documentation/git-interpret-trailers.txt @@ -8,7 +8,7 @@ git-interpret-trailers - help add structured information into commit messages SYNOPSIS -------- [verse] -'git interpret-trailers' [--trim-empty] [(--trailer [(=|:)])...] [...] +'git interpret-trailers' [--in-place] [--trim-empty] [(--trailer [(=|:)])...] [...] DESCRIPTION ----------- @@ -64,6 +64,9 @@ folding rules, the encoding rules and probably many other rules. OPTIONS ------- +--in-place:: + Edit the files in place. + --trim-empty:: If the part of any trailer contains only whitespace, the whole trailer will be removed from the resulting message. @@ -216,6 +219,25 @@ Signed-off-by: Alice Signed-off-by: Bob ------------ +* Use the '--in-place' option to edit a message file in place: ++ +------------ +$ cat msg.txt +subject + +message + +Signed-off-by: Bob +$ git interpret-trailers --trailer 'Acked-by: Alice ' --in-place msg.txt +$ cat msg.txt +subject + +message + +Signed-off-by: Bob +Acked-by: Alice +------------ + * Extract the last commit as a patch, and add a 'Cc' and a 'Reviewed-by' trailer to it: + diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index e26f01fb1d..75c3f4157d 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -12,6 +12,7 @@ SYNOPSIS 'git ls-files' [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])* + [--eol] [-x |--exclude=] [-X |--exclude-from=] [--exclude-per-directory=] @@ -147,6 +148,24 @@ a space) at the start of each line: possible for manual inspection; the exact format may change at any time. +--eol:: + Show and of files. + is the file content identification used by Git when + the "text" attribute is "auto" (or not set and core.autocrlf is not false). + is either "-text", "none", "lf", "crlf", "mixed" or "". ++ +"" means the file is not a regular file, it is not in the index or +not accessible in the working tree. ++ + is the attribute that is used when checking out or committing, +it is either "", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf". +Note: Currently Git does not support "text=auto eol=lf" or "text=auto eol=crlf", +that may change in the future. ++ +Both the in the index ("i/") +and in the working tree ("w/") are shown for regular files, +followed by the ("attr/"). + \--:: Do not interpret any more arguments as options. @@ -161,6 +180,9 @@ which case it outputs: [ ] +'git ls-files --eol' will show + i/w/attr/ + 'git ls-files --unmerged' and 'git ls-files --stage' can be used to examine detailed information on unmerged paths. diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt index d510c05e11..5f2628c8f8 100644 --- a/Documentation/git-ls-remote.txt +++ b/Documentation/git-ls-remote.txt @@ -9,8 +9,9 @@ git-ls-remote - List references in a remote repository SYNOPSIS -------- [verse] -'git ls-remote' [--heads] [--tags] [--upload-pack=] - [--exit-code] [...] +'git ls-remote' [--heads] [--tags] [--refs] [--upload-pack=] + [-q | --quiet] [--exit-code] [--get-url] + [--symref] [ [...]] DESCRIPTION ----------- @@ -29,6 +30,13 @@ OPTIONS both, references stored in refs/heads and refs/tags are displayed. +--refs:: + Do not show peeled tags or pseudorefs like HEAD in the output. + +-q:: +--quiet:: + Do not print remote URL to stderr. + --upload-pack=:: Specify the full path of 'git-upload-pack' on the remote host. This allows listing references from repositories accessed via @@ -46,6 +54,12 @@ OPTIONS "url..insteadOf" config setting (See linkgit:git-config[1]) and exit without talking to the remote. +--symref:: + In addition to the object pointed by it, show the underlying + ref pointed by it when showing a symbolic ref. Currently, + upload-pack only shows the symref HEAD, so it will be the only + one shown by ls-remote. + :: The "remote" repository to query. This parameter can be either a URL or the name of a remote (see the GIT URLS and diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index c3ff7d0d9b..35e3170918 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -515,20 +515,18 @@ git-p4.pathEncoding:: Git expects paths encoded as UTF-8. Use this config to tell git-p4 what encoding Perforce had used for the paths. This encoding is used to transcode the paths to UTF-8. As an example, Perforce on Windows - often uses “cp1252” to encode path names. + often uses "cp1252" to encode path names. git-p4.largeFileSystem:: Specify the system that is used for large (binary) files. Please note that large file systems do not support the 'git p4 submit' command. - Only Git LFS [1] is implemented right now. Download - and install the Git LFS command line extension to use this option - and configure it like this: + Only Git LFS is implemented right now (see https://git-lfs.github.com/ + for more information). Download and install the Git LFS command line + extension to use this option and configure it like this: + ------------- git config git-p4.largeFileSystem GitLFS ------------- -+ - [1] https://git-lfs.github.com/ git-p4.largeFileExtensions:: All files matching a file extension in the list will be processed @@ -549,6 +547,10 @@ git-p4.largeFilePush:: Boolean variable which defines if large files are automatically pushed to a server. +git-p4.keepEmptyCommits:: + A changelist that contains only excluded files will be imported + as an empty commit if this boolean option is set to true. + Submit variables ~~~~~~~~~~~~~~~~ git-p4.detectRenames:: diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index 93c72a29ce..a62a2a615d 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -101,7 +101,7 @@ Options related to merging include::merge-options.txt[] -r:: ---rebase[=false|true|preserve]:: +--rebase[=false|true|preserve|interactive]:: When true, rebase the current branch on top of the upstream branch after fetching. If there is a remote-tracking branch corresponding to the upstream branch and the upstream branch @@ -113,6 +113,8 @@ to `git rebase` so that locally created merge commits will not be flattened. + When false, merge the current branch into the upstream branch. + +When `interactive`, enable the interactive mode of rebase. ++ See `pull.rebase`, `branch..rebase` and `branch.autoSetupRebase` in linkgit:git-config[1] if you want to make `git pull` always use `--rebase` instead of merging. diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 85a4d7d6d5..cf6ee4a4df 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -10,7 +10,7 @@ SYNOPSIS -------- [verse] 'git push' [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=] - [--repo=] [-f | --force] [--prune] [-v | --verbose] + [--repo=] [-f | --force] [-d | --delete] [--prune] [-v | --verbose] [-u | --set-upstream] [--[no-]signed|--sign=(true|false|if-asked)] [--force-with-lease[=[:]]] @@ -37,6 +37,13 @@ the default `` by consulting `remote.*.push` configuration, and if it is not found, honors `push.default` configuration to decide what to push (See linkgit:git-config[1] for the meaning of `push.default`). +When neither the command-line nor the configuration specify what to +push, the default behavior is used, which corresponds to the `simple` +value for `push.default`: the current branch is pushed to the +corresponding upstream branch, but as a safety measure, the push is +aborted if the upstream branch does not have the same name as the +local one. + OPTIONS[[OPTIONS]] ------------------ @@ -257,22 +264,33 @@ origin +master` to force a push to the `master` branch). See the is specified. This flag forces progress status even if the standard error stream is not directed to a terminal. ---recurse-submodules=check|on-demand:: - Make sure all submodule commits used by the revisions to be - pushed are available on a remote-tracking branch. If 'check' is - used Git will verify that all submodule commits that changed in - the revisions to be pushed are available on at least one remote - of the submodule. If any commits are missing the push will be - aborted and exit with non-zero status. If 'on-demand' is used - all submodules that changed in the revisions to be pushed will - be pushed. If on-demand was not able to push all necessary - revisions it will also be aborted and exit with non-zero status. +--no-recurse-submodules:: +--recurse-submodules=check|on-demand|no:: + May be used to make sure all submodule commits used by the + revisions to be pushed are available on a remote-tracking branch. + If 'check' is used Git will verify that all submodule commits that + changed in the revisions to be pushed are available on at least one + remote of the submodule. If any commits are missing the push will + be aborted and exit with non-zero status. If 'on-demand' is used + all submodules that changed in the revisions to be pushed will be + pushed. If on-demand was not able to push all necessary revisions + it will also be aborted and exit with non-zero status. A value of + 'no' or using '--no-recurse-submodules' can be used to override the + push.recurseSubmodules configuration variable when no submodule + recursion is required. --[no-]verify:: Toggle the pre-push hook (see linkgit:githooks[5]). The default is --verify, giving the hook a chance to prevent the push. With --no-verify, the hook is bypassed completely. +-4:: +--ipv4:: + Use IPv4 addresses only, ignoring IPv6 addresses. + +-6:: +--ipv6:: + Use IPv6 addresses only, ignoring IPv4 addresses. include::urls-remotes.txt[] diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 6cca8bb51d..6ed610a031 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -3,7 +3,7 @@ git-rebase(1) NAME ---- -git-rebase - Forward-port local commits to the updated upstream head +git-rebase - Reapply commits on top of another base tip SYNOPSIS -------- diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt index 0e0bd363d6..af230d0647 100644 --- a/Documentation/git-repack.txt +++ b/Documentation/git-repack.txt @@ -133,7 +133,7 @@ By default, the command passes `--delta-base-offset` option to 'git pack-objects'; this typically results in slightly smaller packs, but the generated packs are incompatible with versions of Git older than version 1.4.4. If you need to share your repository with such ancient Git -versions, either directly or via the dumb http or rsync protocol, then you +versions, either directly or via the dumb http protocol, then you need to set the configuration variable `repack.UseDeltaBaseOffset` to "false" and repack. Access from old Git versions over the native protocol is unaffected by this option as the conversion is performed on the fly diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index b15139ffdc..573616a04a 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -89,6 +89,7 @@ effect to your index in a row. -s:: --signoff:: Add Signed-off-by line at the end of the commit message. + See the signoff option in linkgit:git-commit[1] for more information. --strategy=:: Use the given merge strategy. Should only be used once. diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 0c0f60b20e..fb23a98a17 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -1034,6 +1034,8 @@ listed below are allowed: url = http://server.org/svn fetch = trunk/project-a:refs/remotes/project-a/trunk branches = branches/*/project-a:refs/remotes/project-a/branches/* + branches = branches/release_*:refs/remotes/project-a/branches/release_* + branches = branches/re*se:refs/remotes/project-a/branches/* tags = tags/*/project-a:refs/remotes/project-a/tags/* ------------------------------------------------------------------------ @@ -1044,6 +1046,16 @@ independent path component (surrounded by '/' or EOL). This type of configuration is not automatically created by 'init' and should be manually entered with a text-editor or using 'git config'. +Also note that only one asterisk is allowed per word. For example: + + branches = branches/re*se:refs/remotes/project-a/branches/* + +will match branches 'release', 'rese', 're123se', however + + branches = branches/re*s*e:refs/remotes/project-a/branches/* + +will produce an error. + It is also possible to fetch a subset of branches or tags by using a comma-separated list of names within braces. For example: diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index 7220e5eca1..abab4814ec 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -163,7 +163,7 @@ This option is only applicable when listing tags without annotation lines. A string that interpolates `%(fieldname)` from the object pointed at by a ref being shown. The format is the same as that of linkgit:git-for-each-ref[1]. When unspecified, - defaults to `%(refname:short)`. + defaults to `%(refname:strip=2)`. --[no-]merged []:: Only list tags whose tips are reachable, or not reachable diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index f4e5a85351..c6cbed189c 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -18,7 +18,7 @@ SYNOPSIS [--[no-]skip-worktree] [--ignore-submodules] [--[no-]split-index] - [--[no-|force-]untracked-cache] + [--[no-|test-|force-]untracked-cache] [--really-refresh] [--unresolve] [--again | -g] [--info-only] [--index-info] [-z] [--stdin] [--index-version ] @@ -174,17 +174,30 @@ may not support it yet. --untracked-cache:: --no-untracked-cache:: - Enable or disable untracked cache extension. This could speed - up for commands that involve determining untracked files such - as `git status`. The underlying operating system and file - system must change `st_mtime` field of a directory if files - are added or deleted in that directory. + Enable or disable untracked cache feature. Please use + `--test-untracked-cache` before enabling it. ++ +These options take effect whatever the value of the `core.untrackedCache` +configuration variable (see linkgit:git-config[1]). But a warning is +emitted when the change goes against the configured value, as the +configured value will take effect next time the index is read and this +will remove the intended effect of the option. + +--test-untracked-cache:: + Only perform tests on the working directory to make sure + untracked cache can be used. You have to manually enable + untracked cache using `--untracked-cache` or + `--force-untracked-cache` or the `core.untrackedCache` + configuration variable afterwards if you really want to use + it. If a test fails the exit code is 1 and a message + explains what is not working as needed, otherwise the exit + code is 0 and OK is printed. --force-untracked-cache:: - For safety, `--untracked-cache` performs tests on the working - directory to make sure untracked cache can be used. These - tests can take a few seconds. `--force-untracked-cache` can be - used to skip the tests. + Same as `--untracked-cache`. Provided for backwards + compatibility with older versions of Git where + `--untracked-cache` used to imply `--test-untracked-cache` but + this option would enable the extension unconditionally. \--:: Do not interpret any more arguments as options. @@ -375,6 +388,37 @@ Although this bit looks similar to assume-unchanged bit, its goal is different from assume-unchanged bit's. Skip-worktree also takes precedence over assume-unchanged bit when both are set. +Untracked cache +--------------- + +This cache is meant to speed up commands that involve determining +untracked files such as `git status`. + +This feature works by recording the mtime of the working tree +directories and then omitting reading directories and stat calls +against files in those directories whose mtime hasn't changed. For +this to work the underlying operating system and file system must +change the `st_mtime` field of directories if files in the directory +are added, modified or deleted. + +You can test whether the filesystem supports that with the +`--test-untracked-cache` option. The `--untracked-cache` option used +to implicitly perform that test in older versions of Git, but that's +no longer the case. + +If you want to enable (or disable) this feature, it is easier to use +the `core.untrackedCache` configuration variable (see +linkgit:git-config[1]) than using the `--untracked-cache` option to +`git update-index` in each repository, especially if you want to do so +across all repositories you use, because you can set the configuration +variable to `true` (or `false`) in your `$HOME/.gitconfig` just once +and have it affect all repositories you touch. + +When the `core.untrackedCache` configuration variable is changed, the +untracked cache is added to or removed from the index the next time a +command reads the index; while when `--[no-|force-]untracked-cache` +are used, the untracked cache is immediately added to or removed from +the index. Configuration ------------- @@ -400,6 +444,9 @@ It can be useful when the inode change time is regularly modified by something outside Git (file system crawlers and backup systems use ctime for marking files processed) (see linkgit:git-config[1]). +The untracked cache extension can be enabled by the +`core.untrackedCache` configuration variable (see +linkgit:git-config[1]). SEE ALSO -------- diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 5b9ad0429c..62c76c1c89 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -32,11 +32,9 @@ The working tree's administrative files in the repository (see `git worktree prune` in the main or any linked working tree to clean up any stale administrative files. -If you move a linked working tree to another file system, or -within a file system that does not support hard links, you need to run -at least one git command inside the linked working tree -(e.g. `git status`) in order to update its administrative files in the -repository so that they do not get automatically pruned. +If you move a linked working tree, you need to manually update the +administrative files so that they do not get pruned automatically. See +section "DETAILS" for more information. If a linked working tree is stored on a portable device or network share which is not always mounted, you can prevent its administrative files from @@ -137,6 +135,13 @@ thumb is do not make any assumption about whether a path belongs to $GIT_DIR or $GIT_COMMON_DIR when you need to directly access something inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path. +If you move a linked working tree, you need to update the 'gitdir' file +in the entry's directory. For example, if a linked working tree is moved +to `/newpath/test-next` and its `.git` file points to +`/path/main/.git/worktrees/test-next`, then update +`/path/main/.git/worktrees/test-next/gitdir` to reference `/newpath/test-next` +instead. + To prevent a $GIT_DIR/worktrees entry from being pruned (which can be useful in some situations, such as when the entry's working tree is stored on a portable device), add a file named diff --git a/Documentation/git.txt b/Documentation/git.txt index cbf157be43..adc940bf75 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,27 +43,44 @@ unreleased) version of Git, that is available from the 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v2.6.4/git.html[documentation for release 2.6.4] +* link:v2.8.0/git.html[documentation for release 2.8] * release notes for + link:RelNotes/2.8.0.txt[2.8]. + +* link:v2.7.3/git.html[documentation for release 2.7.3] + +* release notes for + link:RelNotes/2.7.3.txt[2.7.3], + link:RelNotes/2.7.2.txt[2.7.2], + link:RelNotes/2.7.1.txt[2.7.1], + link:RelNotes/2.7.0.txt[2.7]. + +* link:v2.6.6/git.html[documentation for release 2.6.6] + +* release notes for + link:RelNotes/2.6.6.txt[2.6.6], + link:RelNotes/2.6.5.txt[2.6.5], link:RelNotes/2.6.4.txt[2.6.4], link:RelNotes/2.6.3.txt[2.6.3], link:RelNotes/2.6.2.txt[2.6.2], link:RelNotes/2.6.1.txt[2.6.1], link:RelNotes/2.6.0.txt[2.6]. -* link:v2.5.4/git.html[documentation for release 2.5.4] +* link:v2.5.5/git.html[documentation for release 2.5.5] * release notes for + link:RelNotes/2.5.5.txt[2.5.5], link:RelNotes/2.5.4.txt[2.5.4], link:RelNotes/2.5.3.txt[2.5.3], link:RelNotes/2.5.2.txt[2.5.2], link:RelNotes/2.5.1.txt[2.5.1], link:RelNotes/2.5.0.txt[2.5]. -* link:v2.4.10/git.html[documentation for release 2.4.10] +* link:v2.4.11/git.html[documentation for release 2.4.11] * release notes for + link:RelNotes/2.4.11.txt[2.4.11], link:RelNotes/2.4.10.txt[2.4.10], link:RelNotes/2.4.9.txt[2.4.9], link:RelNotes/2.4.8.txt[2.4.8], @@ -1115,9 +1132,7 @@ of clones and fetches. connection (or proxy, if configured) - `ssh`: git over ssh (including `host:path` syntax, - `git+ssh://`, etc). - - - `rsync`: git over rsync + `ssh://`, etc). - `http`: git over http, both "smart http" and "dumb http". Note that this does _not_ include `https`; if you want both, diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt index 36e9ab3e16..15b3bfa8db 100644 --- a/Documentation/gitcore-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -710,7 +710,7 @@ files). Again, this can all be simplified with ---------------- -$ git clone rsync://rsync.kernel.org/pub/scm/git/git.git/ my-git +$ git clone git://git.kernel.org/pub/scm/git/git.git/ my-git $ cd my-git $ git checkout ---------------- @@ -1011,20 +1011,6 @@ $ git fetch One of the following transports can be used to name the repository to download from: -Rsync:: - `rsync://remote.machine/path/to/repo.git/` -+ -Rsync transport is usable for both uploading and downloading, -but is completely unaware of what git does, and can produce -unexpected results when you download from the public repository -while the repository owner is uploading into it via `rsync` -transport. Most notably, it could update the files under -`refs/` which holds the object name of the topmost commits -before uploading the files in `objects/` -- the downloader would -obtain head commit object name while that object itself is still -not available in the repository. For this reason, it is -considered deprecated. - SSH:: `remote.machine:/path/to/repo.git/` or + @@ -1430,7 +1416,7 @@ while, depending on how active your project is. When a repository is synchronized via `git push` and `git pull` objects packed in the source repository are usually stored -unpacked in the destination, unless rsync transport is used. +unpacked in the destination. While this allows you to use different packing strategies on both ends, it also means you may need to repack both repositories every once in a while. diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt index 7ba0ac965d..a2f59b194c 100644 --- a/Documentation/githooks.txt +++ b/Documentation/githooks.txt @@ -397,7 +397,7 @@ preceding SP is also omitted. Currently, no commands pass any 'extra-info'. The hook always runs after the automatic note copying (see -"notes.rewrite." in linkgit:git-config.txt[1]) has happened, and +"notes.rewrite." in linkgit:git-config[1]) has happened, and thus has access to these notes. The following command-specific comments apply: diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 79a1948a0b..473623d631 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -82,12 +82,12 @@ PATTERN FORMAT - An optional prefix "`!`" which negates the pattern; any matching file excluded by a previous pattern will become - included again. + included again. It is not possible to re-include a file if a parent + directory of that file is excluded. Git doesn't list excluded + directories for performance reasons, so any patterns on contained + files have no effect, no matter where they are defined. Put a backslash ("`\`") in front of the first "`!`" for patterns that begin with a literal "`!`", for example, "`\!important!.txt`". - It is possible to re-include a file if a parent directory of that - file is excluded if certain conditions are met. See section NOTES - for detail. - If the pattern ends with a slash, it is removed for the purpose of the following description, but it would only find @@ -141,21 +141,6 @@ not tracked by Git remain untracked. To stop tracking a file that is currently tracked, use 'git rm --cached'. -To re-include files or directories when their parent directory is -excluded, the following conditions must be met: - - - The rules to exclude a directory and re-include a subset back must - be in the same .gitignore file. - - - The directory part in the re-include rules must be literal (i.e. no - wildcards) - - - The rules to exclude the parent directory must not end with a - trailing slash. - - - The rules to exclude the parent directory must have at least one - slash. - EXAMPLES -------- diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.txt index b00c67df46..b3b58d324e 100644 --- a/Documentation/gittutorial.txt +++ b/Documentation/gittutorial.txt @@ -451,7 +451,7 @@ perform clones and pulls using the ssh protocol: bob$ git clone alice.org:/home/alice/project myrepo ------------------------------------- -Alternatively, Git has a native protocol, or can use rsync or http; +Alternatively, Git has a native protocol, or can use http; see linkgit:git-pull[1] for details. Git can also be used in a CVS-like mode, with a central repository diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt index e225974253..cafc284359 100644 --- a/Documentation/glossary-content.txt +++ b/Documentation/glossary-content.txt @@ -531,6 +531,11 @@ The most notable example is `HEAD`. "Secure Hash Algorithm 1"; a cryptographic hash function. In the context of Git used as a synonym for <>. +[[def_shallow_clone]]shallow clone:: + Mostly a synonym to <> + but the phrase makes it more explicit that it was created by + running `git clone --depth=...` command. + [[def_shallow_repository]]shallow repository:: A shallow <> has an incomplete history some of whose <> have <> cauterized away (in other diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt index 7bbd19b300..2eb92b9327 100644 --- a/Documentation/merge-strategies.txt +++ b/Documentation/merge-strategies.txt @@ -81,9 +81,17 @@ no-renormalize;; Disables the `renormalize` option. This overrides the `merge.renormalize` configuration variable. +no-renames;; + Turn off rename detection. + See also linkgit:git-diff[1] `--no-renames`. + +find-renames[=];; + Turn on rename detection, optionally setting the similarity + threshold. This is the default. + See also linkgit:git-diff[1] `--find-renames`. + rename-threshold=;; - Controls the similarity threshold used for rename detection. - See also linkgit:git-diff[1] `-M`. + Deprecated synonym for `find-renames=`. subtree[=];; This option is a more advanced form of 'subtree' strategy, where diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt index 4b659ac1a6..54b88b6dca 100644 --- a/Documentation/pretty-options.txt +++ b/Documentation/pretty-options.txt @@ -43,7 +43,7 @@ people using 80-column terminals. commit may be copied to the output. ifndef::git-rev-list[] ---notes[=]:: +--notes[=]:: Show the notes (see linkgit:git-notes[1]) that annotate the commit, when showing the commit log message. This is the default for `git log`, `git show` and `git whatchanged` commands when @@ -54,8 +54,8 @@ By default, the notes shown are from the notes refs listed in the 'core.notesRef' and 'notes.displayRef' variables (or corresponding environment overrides). See linkgit:git-config[1] for more details. + -With an optional '' argument, show this notes ref instead of the -default notes ref(s). The ref specifies the full refname when it begins +With an optional '' argument, use the treeish to find the notes +to display. The treeish can specify the full refname when it begins with `refs/notes/`; when it begins with `notes/`, `refs/` and otherwise `refs/notes/` is prefixed to form a full name of the ref. + @@ -71,7 +71,7 @@ being displayed. Examples: "--notes=foo" will show only notes from "--notes --notes=foo --no-notes --notes=bar" will only show notes from "refs/notes/bar". ---show-notes[=]:: +--show-notes[=]:: --[no-]standard-notes:: These options are deprecated. Use the above --notes/--no-notes options instead. diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index d85e303364..19314e3b7f 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -61,11 +61,11 @@ some output processing may assume ref names in UTF-8. '@':: '@' alone is a shortcut for 'HEAD'. -'@\{\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}':: +'@{}', e.g. 'master@\{yesterday\}', 'HEAD@{5 minutes ago}':: A ref followed by the suffix '@' with a date specification enclosed in a brace - pair (e.g. '\{yesterday\}', '\{1 month 2 weeks 3 days 1 hour 1 - second ago\}' or '\{1979-02-26 18:30:00\}') specifies the value + pair (e.g. '\{yesterday\}', '{1 month 2 weeks 3 days 1 hour 1 + second ago}' or '{1979-02-26 18:30:00}') specifies the value of the ref at a prior point in time. This suffix may only be used immediately following a ref name and the ref must have an existing log ('$GIT_DIR/logs/'). Note that this looks up the state @@ -73,7 +73,7 @@ some output processing may assume ref names in UTF-8. 'master' branch last week. If you want to look at commits made during certain times, see '--since' and '--until'. -'@\{\}', e.g. 'master@\{1\}':: +'@{}', e.g. 'master@\{1\}':: A ref followed by the suffix '@' with an ordinal specification enclosed in a brace pair (e.g. '\{1\}', '\{15\}') specifies the n-th prior value of that ref. For example 'master@\{1\}' @@ -82,13 +82,13 @@ some output processing may assume ref names in UTF-8. immediately following a ref name and the ref must have an existing log ('$GIT_DIR/logs/'). -'@\{\}', e.g. '@\{1\}':: +'@{}', e.g. '@\{1\}':: You can use the '@' construct with an empty ref part to get at a reflog entry of the current branch. For example, if you are on branch 'blabla' then '@\{1\}' means the same as 'blabla@\{1\}'. -'@\{-\}', e.g. '@\{-1\}':: - The construct '@\{-\}' means the th branch/commit checked out +'@{-}', e.g. '@{-1}':: + The construct '@{-}' means the th branch/commit checked out before the current one. '@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}':: @@ -139,7 +139,7 @@ from one location and push to another. In a non-triangular workflow, '{caret}1{caret}1{caret}1'. See below for an illustration of the usage of this form. -'{caret}\{\}', e.g. 'v0.99.8{caret}\{commit\}':: +'{caret}{}', e.g. 'v0.99.8{caret}\{commit\}':: A suffix '{caret}' followed by an object type name enclosed in brace pair means dereference the object at '' recursively until an object of type '' is found or the object cannot be @@ -159,13 +159,13 @@ it does not have to be dereferenced even once to get to an object. 'rev{caret}\{tag\}' can be used to ensure that 'rev' identifies an existing tag object. -'{caret}\{\}', e.g. 'v0.99.8{caret}\{\}':: +'{caret}{}', e.g. 'v0.99.8{caret}{}':: A suffix '{caret}' followed by an empty brace pair means the object could be a tag, and dereference the tag recursively until a non-tag object is found. -'{caret}\{/\}', e.g. 'HEAD^{/fix nasty bug}':: +'{caret}{/}', e.g. 'HEAD^{/fix nasty bug}':: A suffix '{caret}' to a revision parameter, followed by a brace pair that contains a text led by a slash, is the same as the ':/fix nasty bug' syntax below except that @@ -176,11 +176,12 @@ existing tag object. A colon, followed by a slash, followed by a text, names a commit whose commit message matches the specified regular expression. This name returns the youngest matching commit which is - reachable from any ref. If the commit message starts with a - '!' you have to repeat that; the special sequence ':/!', - followed by something else than '!', is reserved for now. - The regular expression can match any part of the commit message. To - match messages starting with a string, one can use e.g. ':/^foo'. + reachable from any ref. The regular expression can match any part of the + commit message. To match messages starting with a string, one can use + e.g. ':/^foo'. The special sequence ':/!' is reserved for modifiers to what + is matched. ':/!-foo' performs a negative match, while ':/!!foo' matches a + literal '!' character, followed by 'foo'. Any other sequence beginning with + ':/!' is reserved for now. ':', e.g. 'HEAD:README', ':README', 'master:./README':: A suffix ':' followed by a path names the blob or tree diff --git a/Documentation/technical/api-argv-array.txt b/Documentation/technical/api-argv-array.txt index 8076172a08..cfc063018c 100644 --- a/Documentation/technical/api-argv-array.txt +++ b/Documentation/technical/api-argv-array.txt @@ -56,3 +56,10 @@ Functions `argv_array_clear`:: Free all memory associated with the array and return it to the initial, empty state. + +`argv_array_detach`:: + Disconnect the `argv` member from the `argv_array` struct and + return it. The caller is responsible for freeing the memory used + by the array, and by the strings it references. After detaching, + the `argv_array` is in a reinitialized state and can be pushed + into again. diff --git a/Documentation/technical/api-remote.txt b/Documentation/technical/api-remote.txt index 2cfdd224a8..f10941b2e8 100644 --- a/Documentation/technical/api-remote.txt +++ b/Documentation/technical/api-remote.txt @@ -51,6 +51,10 @@ struct remote The proxy to use for curl (http, https, ftp, etc.) URLs. +`http_proxy_authmethod`:: + + The method used for authenticating against `http_proxy`. + struct remotes can be found by name with remote_get(), and iterated through with for_each_remote(). remote_get(NULL) will return the default remote, given the current branch and configuration. diff --git a/Documentation/urls.txt b/Documentation/urls.txt index 9ccb24677e..b05da95788 100644 --- a/Documentation/urls.txt +++ b/Documentation/urls.txt @@ -7,9 +7,8 @@ Depending on the transport protocol, some of this information may be absent. Git supports ssh, git, http, and https protocols (in addition, ftp, -and ftps can be used for fetching and rsync can be used for fetching -and pushing, but these are inefficient and deprecated; do not use -them). +and ftps can be used for fetching, but this is inefficient and +deprecated; do not use it). The native transport (i.e. git:// URL) does no authentication and should be used with caution on unsecured networks. @@ -20,7 +19,6 @@ The following syntaxes may be used with them: - git://host.xz{startsb}:port{endsb}/path/to/repo.git/ - http{startsb}s{endsb}://host.xz{startsb}:port{endsb}/path/to/repo.git/ - ftp{startsb}s{endsb}://host.xz{startsb}:port{endsb}/path/to/repo.git/ -- rsync://host.xz/path/to/repo.git/ An alternative scp-like syntax may also be used with the ssh protocol: diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 1c790ac74a..5e07454572 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -2125,8 +2125,37 @@ Allowing web browsing of a repository ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The gitweb cgi script provides users an easy way to browse your -project's files and history without having to install Git; see the file -gitweb/INSTALL in the Git source tree for instructions on setting it up. +project's revisions, file contents and logs without having to install +Git. Features like RSS/Atom feeds and blame/annotation details may +optionally be enabled. + +The linkgit:git-instaweb[1] command provides a simple way to start +browsing the repository using gitweb. The default server when using +instaweb is lighttpd. + +See the file gitweb/INSTALL in the Git source tree and +linkgit:gitweb[1] for instructions on details setting up a permanent +installation with a CGI or Perl capable server. + +[[how-to-get-a-git-repository-with-minimal-history]] +How to get a Git repository with minimal history +------------------------------------------------ + +A <>, with its truncated +history, is useful when one is interested only in recent history +of a project and getting full history from the upstream is +expensive. + +A <> is created by specifying +the linkgit:git-clone[1] `--depth` switch. The depth can later be +changed with the linkgit:git-fetch[1] `--depth` switch, or full +history restored with `--unshallow`. + +Merging inside a <> will work as long +as a merge base is in the recent history. +Otherwise, it will be like merging unrelated histories and may +have to result in huge conflicts. This limitation may make such +a repository unsuitable to be used in merge based workflows. [[sharing-development-examples]] Examples @@ -4636,23 +4665,15 @@ Scan email archives for other stuff left out Scan man pages to see if any assume more background than this manual provides. -Simplify beginning by suggesting disconnected head instead of -temporary branch creation? - Add more good examples. Entire sections of just cookbook examples might be a good idea; maybe make an "advanced examples" section a standard end-of-chapter section? Include cross-references to the glossary, where appropriate. -Document shallow clones? See draft 1.5.0 release notes for some -documentation. - Add a section on working with other version control systems, including CVS, Subversion, and just imports of series of release tarballs. -More details on gitweb? - Write a chapter on using plumbing and writing scripts. Alternates, clone -reference, etc. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 29c43c21e1..4e9450b3ae 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.7.0-rc0 +DEF_VER=v2.8.0 LF=' ' diff --git a/Makefile b/Makefile index fd19b544c2..2742a6977c 100644 --- a/Makefile +++ b/Makefile @@ -264,6 +264,9 @@ all:: # # Define NO_TCLTK if you do not want Tcl/Tk GUI. # +# Define SANE_TEXT_GREP to "-a" if you use recent versions of GNU grep +# and egrep that are pickier when their input contains non-ASCII data. +# # The TCL_PATH variable governs the location of the Tcl interpreter # used to optimize git-gui for your system. Only used if NO_TCLTK # is not set. Defaults to the bare 'tclsh'. @@ -380,6 +383,18 @@ ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS) ALL_LDFLAGS = $(LDFLAGS) STRIP ?= strip +ifdef DEVELOPER +CFLAGS += -Werror \ + -Wdeclaration-after-statement \ + -Wno-format-zero-length \ + -Wold-style-definition \ + -Woverflow \ + -Wpointer-arith \ + -Wstrict-prototypes \ + -Wunused \ + -Wvla +endif + # Create as necessary, replace existing, make ranlib unneeded. ARFLAGS = rcs @@ -583,6 +598,7 @@ TEST_PROGRAMS_NEED_X += test-delta TEST_PROGRAMS_NEED_X += test-dump-cache-tree TEST_PROGRAMS_NEED_X += test-dump-split-index TEST_PROGRAMS_NEED_X += test-dump-untracked-cache +TEST_PROGRAMS_NEED_X += test-fake-ssh TEST_PROGRAMS_NEED_X += test-genrandom TEST_PROGRAMS_NEED_X += test-hashmap TEST_PROGRAMS_NEED_X += test-index-version @@ -1727,7 +1743,7 @@ common-cmds.h: $(wildcard Documentation/git-*.txt) SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\ $(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\ - $(gitwebdir_SQ):$(PERL_PATH_SQ) + $(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP) define cmd_munge_script $(RM) $@ $@+ && \ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ @@ -1739,6 +1755,7 @@ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ -e $(BROKEN_PATH_FIX) \ -e 's|@@GITWEBDIR@@|$(gitwebdir_SQ)|g' \ -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \ + -e 's|@@SANE_TEXT_GREP@@|$(SANE_TEXT_GREP)|g' \ $@.sh >$@+ endef @@ -2025,6 +2042,7 @@ $(VCSSVN_LIB): $(VCSSVN_OBJS) export DEFAULT_EDITOR DEFAULT_PAGER +.PHONY: doc man html info pdf doc: $(MAKE) -C Documentation all @@ -2068,6 +2086,7 @@ po/git.pot: $(GENERATED_H) FORCE $(LOCALIZED_PERL) mv $@+ $@ +.PHONY: pot pot: po/git.pot POFILES := $(wildcard po/*.po) @@ -2277,6 +2296,7 @@ mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir)) install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X) +.PHONY: profile-install profile-fast-install profile-install: profile $(MAKE) install @@ -2343,6 +2363,8 @@ endif done && \ ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" +.PHONY: install-gitweb install-doc install-man install-html install-info install-pdf +.PHONY: quick-install-doc quick-install-man quick-install-html install-gitweb: $(MAKE) -C gitweb install @@ -2402,6 +2424,7 @@ rpm: dist htmldocs = git-htmldocs-$(GIT_VERSION) manpages = git-manpages-$(GIT_VERSION) +.PHONY: dist-doc distclean dist-doc: $(RM) -r .doc-tmp-dir mkdir .doc-tmp-dir @@ -2470,6 +2493,8 @@ ALL_COMMANDS += git ALL_COMMANDS += gitk ALL_COMMANDS += gitweb ALL_COMMANDS += git-gui git-citool + +.PHONY: check-docs check-docs:: @(for v in $(ALL_COMMANDS); \ do \ @@ -2514,6 +2539,7 @@ check-builtins:: ### Test suite coverage testing # .PHONY: coverage coverage-clean coverage-compile coverage-test coverage-report +.PHONY: coverage-untested-functions cover_db cover_db_html .PHONY: coverage-clean-results coverage: diff --git a/README b/README.md similarity index 65% rename from README rename to README.md index 1083735d1c..d1ffbb6170 100644 --- a/README +++ b/README.md @@ -1,19 +1,5 @@ -//////////////////////////////////////////////////////////////// - - Git - the stupid content tracker - -//////////////////////////////////////////////////////////////// - -"git" can mean anything, depending on your mood. - - - random three-letter combination that is pronounceable, and not - actually used by any common UNIX command. The fact that it is a - mispronunciation of "get" may or may not be relevant. - - stupid. contemptible and despicable. simple. Take your pick from the - dictionary of slang. - - "global information tracker": you're in a good mood, and it actually - works for you. Angels sing, and a light suddenly fills the room. - - "goddamn idiotic truckload of sh*t": when it breaks +Git - fast, scalable, distributed revision control system +========================================================= Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations @@ -24,27 +10,27 @@ License version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net. -Please read the file INSTALL for installation instructions. +Please read the file [INSTALL][] for installation instructions. -See Documentation/gittutorial.txt to get started, then see -Documentation/giteveryday.txt for a useful minimum set of commands, and -Documentation/git-commandname.txt for documentation of each command. +Many Git online resources are accessible from http://git-scm.com/ +including full documentation and Git related tools. + +See [Documentation/gittutorial.txt][] to get started, then see +[Documentation/giteveryday.txt][] for a useful minimum set of commands, and +[Documentation/git-commandname.txt][] for documentation of each command. If git has been correctly installed, then the tutorial can also be read with "man gittutorial" or "git help tutorial", and the documentation of each command with "man git-commandname" or "git help commandname". -CVS users may also want to read Documentation/gitcvs-migration.txt +CVS users may also want to read [Documentation/gitcvs-migration.txt][] ("man gitcvs-migration" or "git help cvs-migration" if git is installed). -Many Git online resources are accessible from http://git-scm.com/ -including full documentation and Git related tools. - The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read -Documentation/SubmittingPatches for instructions on patch submission). +[Documentation/SubmittingPatches][] for instructions on patch submission). To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org. The mailing list archives are available at http://news.gmane.org/gmane.comp.version-control.git/, @@ -54,3 +40,23 @@ The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks. + +The name "git" was given by Linus Torvalds when he wrote the very +first version. He described the tool as "the stupid content tracker" +and the name as (depending on your mood): + + - random three-letter combination that is pronounceable, and not + actually used by any common UNIX command. The fact that it is a + mispronunciation of "get" may or may not be relevant. + - stupid. contemptible and despicable. simple. Take your pick from the + dictionary of slang. + - "global information tracker": you're in a good mood, and it actually + works for you. Angels sing, and a light suddenly fills the room. + - "goddamn idiotic truckload of sh*t": when it breaks + +[INSTALL]: INSTALL +[Documentation/gittutorial.txt]: Documentation/gittutorial.txt +[Documentation/giteveryday.txt]: Documentation/giteveryday.txt +[Documentation/git-commandname.txt]: Documentation/git-commandname.txt +[Documentation/gitcvs-migration.txt]: Documentation/gitcvs-migration.txt +[Documentation/SubmittingPatches]: Documentation/SubmittingPatches diff --git a/RelNotes b/RelNotes index 3ba13ce253..7db30403c3 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes/2.7.0.txt \ No newline at end of file +Documentation/RelNotes/2.8.0.txt \ No newline at end of file diff --git a/alias.c b/alias.c index a11229db9e..3b90397a99 100644 --- a/alias.c +++ b/alias.c @@ -23,7 +23,7 @@ int split_cmdline(char *cmdline, const char ***argv) int src, dst, count = 0, size = 16; char quoted = 0; - *argv = xmalloc(sizeof(**argv) * size); + ALLOC_ARRAY(*argv, size); /* split alias_string */ (*argv)[count++] = cmdline; diff --git a/archive.c b/archive.c index 0687afae43..5d735ae603 100644 --- a/archive.c +++ b/archive.c @@ -171,8 +171,8 @@ static void queue_directory(const unsigned char *sha1, unsigned mode, int stage, struct archiver_context *c) { struct directory *d; - size_t len = base->len + 1 + strlen(filename) + 1; - d = xmalloc(sizeof(*d) + len); + size_t len = st_add4(base->len, 1, strlen(filename), 1); + d = xmalloc(st_add(sizeof(*d), len)); d->up = c->bottom; d->baselen = base->len; d->mode = mode; diff --git a/argv-array.c b/argv-array.c index eaed47712b..5d370fa336 100644 --- a/argv-array.c +++ b/argv-array.c @@ -74,3 +74,14 @@ void argv_array_clear(struct argv_array *array) } argv_array_init(array); } + +const char **argv_array_detach(struct argv_array *array) +{ + if (array->argv == empty_argv) + return xcalloc(1, sizeof(const char *)); + else { + const char **ret = array->argv; + argv_array_init(array); + return ret; + } +} diff --git a/argv-array.h b/argv-array.h index a2fa0aa606..29056e49a1 100644 --- a/argv-array.h +++ b/argv-array.h @@ -20,5 +20,6 @@ void argv_array_pushl(struct argv_array *, ...); void argv_array_pushv(struct argv_array *, const char **); void argv_array_pop(struct argv_array *); void argv_array_clear(struct argv_array *); +const char **argv_array_detach(struct argv_array *); #endif /* ARGV_ARRAY_H */ diff --git a/attr.c b/attr.c index 086c08dcfa..6537a433da 100644 --- a/attr.c +++ b/attr.c @@ -93,9 +93,7 @@ static struct git_attr *git_attr_internal(const char *name, int len) if (invalid_attr_name(name, len)) return NULL; - a = xmalloc(sizeof(*a) + len + 1); - memcpy(a->name, name, len); - a->name[len] = 0; + FLEX_ALLOC_MEM(a, name, name, len); a->h = hval; a->next = git_attr_hash[pos]; a->attr_nr = attr_nr++; @@ -799,7 +797,7 @@ int git_all_attrs(const char *path, int *num, struct git_attr_check **check) ++count; } *num = count; - *check = xmalloc(sizeof(**check) * count); + ALLOC_ARRAY(*check, count); j = 0; for (i = 0; i < attr_nr; i++) { const char *value = check_all_attr[i].value; diff --git a/bisect.c b/bisect.c index 42aa7aa6aa..7996c2907b 100644 --- a/bisect.c +++ b/bisect.c @@ -440,7 +440,7 @@ static void read_bisect_paths(struct argv_array *array) if (!fp) die_errno("Could not open file '%s'", filename); - while (strbuf_getline(&str, fp, '\n') != EOF) { + while (strbuf_getline_lf(&str, fp) != EOF) { strbuf_trim(&str); if (sq_dequote_to_argv_array(str.buf, array)) die("Badly quoted content in file '%s': %s", @@ -668,7 +668,7 @@ static int is_expected_rev(const struct object_id *oid) if (!fp) return 0; - if (strbuf_getline(&str, fp, '\n') != EOF) + if (strbuf_getline_lf(&str, fp) != EOF) res = !strcmp(str.buf, oid_to_hex(oid)); strbuf_release(&str); @@ -708,10 +708,10 @@ static struct commit *get_commit_reference(const unsigned char *sha1) static struct commit **get_bad_and_good_commits(int *rev_nr) { - int len = 1 + good_revs.nr; - struct commit **rev = xmalloc(len * sizeof(*rev)); + struct commit **rev; int i, n = 0; + ALLOC_ARRAY(rev, 1 + good_revs.nr); rev[n++] = get_commit_reference(current_bad_oid->hash); for (i = 0; i < good_revs.nr; i++) rev[n++] = get_commit_reference(good_revs.sha1[i]); @@ -914,9 +914,9 @@ void read_bisect_terms(const char **read_bad, const char **read_good) strerror(errno)); } } else { - strbuf_getline(&str, fp, '\n'); + strbuf_getline_lf(&str, fp); *read_bad = strbuf_detach(&str, NULL); - strbuf_getline(&str, fp, '\n'); + strbuf_getline_lf(&str, fp); *read_good = strbuf_detach(&str, NULL); } strbuf_release(&str); diff --git a/branch.c b/branch.c index 7ff3f20496..c50ea42172 100644 --- a/branch.c +++ b/branch.c @@ -49,7 +49,13 @@ static int should_setup_rebase(const char *origin) return 0; } -void install_branch_config(int flag, const char *local, const char *origin, const char *remote) +static const char tracking_advice[] = +N_("\n" +"After fixing the error cause you may try to fix up\n" +"the remote tracking information by invoking\n" +"\"git branch --set-upstream-to=%s%s%s\"."); + +int install_branch_config(int flag, const char *local, const char *origin, const char *remote) { const char *shortname = NULL; struct strbuf key = STRBUF_INIT; @@ -60,20 +66,23 @@ void install_branch_config(int flag, const char *local, const char *origin, cons && !origin) { warning(_("Not setting branch %s as its own upstream."), local); - return; + return 0; } strbuf_addf(&key, "branch.%s.remote", local); - git_config_set(key.buf, origin ? origin : "."); + if (git_config_set_gently(key.buf, origin ? origin : ".") < 0) + goto out_err; strbuf_reset(&key); strbuf_addf(&key, "branch.%s.merge", local); - git_config_set(key.buf, remote); + if (git_config_set_gently(key.buf, remote) < 0) + goto out_err; if (rebasing) { strbuf_reset(&key); strbuf_addf(&key, "branch.%s.rebase", local); - git_config_set(key.buf, "true"); + if (git_config_set_gently(key.buf, "true") < 0) + goto out_err; } strbuf_release(&key); @@ -102,6 +111,19 @@ void install_branch_config(int flag, const char *local, const char *origin, cons local, remote); } } + + return 0; + +out_err: + strbuf_release(&key); + error(_("Unable to write upstream branch configuration")); + + advise(_(tracking_advice), + origin ? origin : "", + origin ? "/" : "", + shortname ? shortname : remote); + + return -1; } /* @@ -109,8 +131,8 @@ void install_branch_config(int flag, const char *local, const char *origin, cons * to infer the settings for branch..{remote,merge} from the * config. */ -static int setup_tracking(const char *new_ref, const char *orig_ref, - enum branch_track track, int quiet) +static void setup_tracking(const char *new_ref, const char *orig_ref, + enum branch_track track, int quiet) { struct tracking tracking; int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE; @@ -118,7 +140,7 @@ static int setup_tracking(const char *new_ref, const char *orig_ref, memset(&tracking, 0, sizeof(tracking)); tracking.spec.dst = (char *)orig_ref; if (for_each_remote(find_tracked_branch, &tracking)) - return 1; + return; if (!tracking.matches) switch (track) { @@ -127,18 +149,18 @@ static int setup_tracking(const char *new_ref, const char *orig_ref, case BRANCH_TRACK_OVERRIDE: break; default: - return 1; + return; } if (tracking.matches > 1) - return error(_("Not tracking: ambiguous information for ref %s"), - orig_ref); + die(_("Not tracking: ambiguous information for ref %s"), + orig_ref); - install_branch_config(config_flags, new_ref, tracking.remote, - tracking.src ? tracking.src : orig_ref); + if (install_branch_config(config_flags, new_ref, tracking.remote, + tracking.src ? tracking.src : orig_ref) < 0) + exit(-1); free(tracking.src); - return 0; } int read_branch_desc(struct strbuf *buf, const char *branch_name) diff --git a/branch.h b/branch.h index 58aa45fe72..78ad4387cd 100644 --- a/branch.h +++ b/branch.h @@ -43,9 +43,10 @@ void remove_branch_state(void); /* * Configure local branch "local" as downstream to branch "remote" * from remote "origin". Used by git branch --set-upstream. + * Returns 0 on success. */ #define BRANCH_CONFIG_VERBOSE 01 -extern void install_branch_config(int flag, const char *local, const char *origin, const char *remote); +extern int install_branch_config(int flag, const char *local, const char *origin, const char *remote); /* * Read branch description diff --git a/builtin/am.c b/builtin/am.c index 9fb42fdd71..d003939bc5 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -45,21 +45,6 @@ static int is_empty_file(const char *filename) return !st.st_size; } -/** - * Like strbuf_getline(), but treats both '\n' and "\r\n" as line terminators. - */ -static int strbuf_getline_crlf(struct strbuf *sb, FILE *fp) -{ - if (strbuf_getwholeline(sb, fp, '\n')) - return EOF; - if (sb->buf[sb->len - 1] == '\n') { - strbuf_setlen(sb, sb->len - 1); - if (sb->len > 0 && sb->buf[sb->len - 1] == '\r') - strbuf_setlen(sb, sb->len - 1); - } - return 0; -} - /** * Returns the length of the first line of msg. */ @@ -284,7 +269,7 @@ static char *read_shell_var(FILE *fp, const char *key) struct strbuf sb = STRBUF_INIT; const char *str; - if (strbuf_getline(&sb, fp, '\n')) + if (strbuf_getline_lf(&sb, fp)) goto fail; if (!skip_prefix(sb.buf, key, &str)) @@ -573,7 +558,7 @@ static int copy_notes_for_rebase(const struct am_state *state) fp = xfopen(am_path(state, "rewritten"), "r"); - while (!strbuf_getline(&sb, fp, '\n')) { + while (!strbuf_getline_lf(&sb, fp)) { unsigned char from_obj[GIT_SHA1_RAWSZ], to_obj[GIT_SHA1_RAWSZ]; if (sb.len != GIT_SHA1_HEXSZ * 2 + 1) { @@ -628,7 +613,7 @@ static int is_mail(FILE *fp) if (regcomp(®ex, header_regex, REG_NOSUB | REG_EXTENDED)) die("invalid pattern: %s", header_regex); - while (!strbuf_getline_crlf(&sb, fp)) { + while (!strbuf_getline(&sb, fp)) { if (!sb.len) break; /* End of header */ @@ -675,7 +660,7 @@ static int detect_patch_format(const char **paths) fp = xfopen(*paths, "r"); - while (!strbuf_getline_crlf(&l1, fp)) { + while (!strbuf_getline(&l1, fp)) { if (l1.len) break; } @@ -696,9 +681,9 @@ static int detect_patch_format(const char **paths) } strbuf_reset(&l2); - strbuf_getline_crlf(&l2, fp); + strbuf_getline(&l2, fp); strbuf_reset(&l3); - strbuf_getline_crlf(&l3, fp); + strbuf_getline(&l3, fp); /* * If the second line is empty and the third is a From, Author or Date @@ -817,7 +802,7 @@ static int stgit_patch_to_mail(FILE *out, FILE *in, int keep_cr) struct strbuf sb = STRBUF_INIT; int subject_printed = 0; - while (!strbuf_getline(&sb, in, '\n')) { + while (!strbuf_getline_lf(&sb, in)) { const char *str; if (str_isspace(sb.buf)) @@ -875,7 +860,7 @@ static int split_mail_stgit_series(struct am_state *state, const char **paths, return error(_("could not open '%s' for reading: %s"), *paths, strerror(errno)); - while (!strbuf_getline(&sb, fp, '\n')) { + while (!strbuf_getline_lf(&sb, fp)) { if (*sb.buf == '#') continue; /* skip comment lines */ @@ -900,7 +885,7 @@ static int hg_patch_to_mail(FILE *out, FILE *in, int keep_cr) { struct strbuf sb = STRBUF_INIT; - while (!strbuf_getline(&sb, in, '\n')) { + while (!strbuf_getline_lf(&sb, in)) { const char *str; if (skip_prefix(sb.buf, "# User ", &str)) @@ -1317,7 +1302,7 @@ static int parse_mail(struct am_state *state, const char *mail) /* Extract message and author information */ fp = xfopen(am_path(state, "info"), "r"); - while (!strbuf_getline(&sb, fp, '\n')) { + while (!strbuf_getline_lf(&sb, fp)) { const char *x; if (skip_prefix(sb.buf, "Subject: ", &x)) { @@ -1383,7 +1368,7 @@ static int get_mail_commit_sha1(unsigned char *commit_id, const char *mail) FILE *fp = xfopen(mail, "r"); const char *x; - if (strbuf_getline(&sb, fp, '\n')) + if (strbuf_getline_lf(&sb, fp)) return -1; if (!skip_prefix(sb.buf, "From ", &x)) @@ -1657,7 +1642,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa init_revisions(&rev_info, NULL); rev_info.diffopt.output_format = DIFF_FORMAT_NAME_STATUS; - diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1); + diff_opt_parse(&rev_info.diffopt, &diff_filter_str, 1, rev_info.prefix); add_pending_sha1(&rev_info, "HEAD", our_tree, 0); diff_setup_done(&rev_info.diffopt); run_diff_index(&rev_info, 1); @@ -1821,7 +1806,7 @@ static int do_interactive(struct am_state *state) if (!pager) pager = "cat"; - argv_array_push(&cp.args, pager); + prepare_pager_args(&cp, pager); argv_array_push(&cp.args, am_path(state, "patch")); run_command(&cp); } @@ -1939,6 +1924,7 @@ next: */ if (!state->rebasing) { am_destroy(state); + close_all_packs(); run_command_v_opt(argv_gc_auto, RUN_GIT_CMD); } } diff --git a/builtin/apply.c b/builtin/apply.c index deb1364fa8..42c610e2ec 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -2632,7 +2632,7 @@ static void update_image(struct image *img, insert_count = postimage->len; /* Adjust the contents */ - result = xmalloc(img->len + insert_count - remove_count + 1); + result = xmalloc(st_add3(st_sub(img->len, remove_count), insert_count, 1)); memcpy(result, img->buf, applied_at); memcpy(result + applied_at, postimage->buf, postimage->len); memcpy(result + applied_at + postimage->len, @@ -4464,16 +4464,6 @@ static int option_parse_p(const struct option *opt, return 0; } -static int option_parse_z(const struct option *opt, - const char *arg, int unset) -{ - if (unset) - line_termination = '\n'; - else - line_termination = 0; - return 0; -} - static int option_parse_space_change(const struct option *opt, const char *arg, int unset) { @@ -4546,9 +4536,9 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) N_( "attempt three-way merge if a patch does not apply")), OPT_FILENAME(0, "build-fake-ancestor", &fake_ancestor, N_("build a temporary index based on embedded index information")), - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, + /* Think twice before adding "--nul" synonym to this */ + OPT_SET_INT('z', NULL, &line_termination, + N_("paths are separated with NUL character"), '\0'), OPT_INTEGER('C', NULL, &p_context, N_("ensure at least lines of context match")), { OPTION_CALLBACK, 0, "whitespace", &whitespace_option, N_("action"), diff --git a/builtin/blame.c b/builtin/blame.c index 1df13cf7f4..e982fb8137 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -28,6 +28,7 @@ #include "line-range.h" #include "line-log.h" #include "dir.h" +#include "progress.h" static char blame_usage[] = N_("git blame [] [] [] [--] "); @@ -50,6 +51,7 @@ static int incremental; static int xdl_opts; static int abbrev = -1; static int no_whole_file_rename; +static int show_progress; static struct date_mode blame_date_mode = { DATE_ISO8601 }; static size_t blame_date_width; @@ -127,6 +129,11 @@ struct origin { char path[FLEX_ARRAY]; }; +struct progress_info { + struct progress *progress; + int blamed_lines; +}; + static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen, xdl_emit_hunk_consume_func_t hunk_func, void *cb_data) { @@ -459,13 +466,11 @@ static void queue_blames(struct scoreboard *sb, struct origin *porigin, static struct origin *make_origin(struct commit *commit, const char *path) { struct origin *o; - size_t pathlen = strlen(path) + 1; - o = xcalloc(1, sizeof(*o) + pathlen); + FLEX_ALLOC_STR(o, path, path); o->commit = commit; o->refcnt = 1; o->next = commit->util; commit->util = o; - memcpy(o->path, path, pathlen); /* includes NUL */ return o; } @@ -1746,7 +1751,8 @@ static int emit_one_suspect_detail(struct origin *suspect, int repeat) * 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) +static void found_guilty_entry(struct blame_entry *ent, + struct progress_info *pi) { if (incremental) { struct origin *suspect = ent->suspect; @@ -1758,6 +1764,8 @@ static void found_guilty_entry(struct blame_entry *ent) write_filename_info(suspect->path); maybe_flush_or_die(stdout, "stdout"); } + pi->blamed_lines += ent->num_lines; + display_progress(pi->progress, pi->blamed_lines); } /* @@ -1768,6 +1776,11 @@ static void assign_blame(struct scoreboard *sb, int opt) { struct rev_info *revs = sb->revs; struct commit *commit = prio_queue_get(&sb->commits); + struct progress_info pi = { NULL, 0 }; + + if (show_progress) + pi.progress = start_progress_delay(_("Blaming lines"), + sb->num_lines, 50, 1); while (commit) { struct blame_entry *ent; @@ -1809,7 +1822,7 @@ static void assign_blame(struct scoreboard *sb, int opt) suspect->guilty = 1; for (;;) { struct blame_entry *next = ent->next; - found_guilty_entry(ent); + found_guilty_entry(ent, &pi); if (next) { ent = next; continue; @@ -1825,6 +1838,8 @@ static void assign_blame(struct scoreboard *sb, int opt) if (DEBUG) /* sanity */ sanity_check_refcnt(sb); } + + stop_progress(&pi.progress); } static const char *format_time(unsigned long time, const char *tz_str, @@ -2042,7 +2057,8 @@ static int prepare_lines(struct scoreboard *sb) for (p = buf; p < end; p = get_next_line(p, end)) num++; - sb->lineno = lineno = xmalloc(sizeof(*sb->lineno) * (num + 1)); + ALLOC_ARRAY(sb->lineno, num + 1); + lineno = sb->lineno; for (p = buf; p < end; p = get_next_line(p, end)) *lineno++ = p - buf; @@ -2392,11 +2408,6 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, ce->ce_mode = create_ce_mode(mode); add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); - /* - * We are not going to write this out, so this does not matter - * right now, but someday we might optimize diff-index --cached - * with cache-tree information. - */ cache_tree_invalidate_path(&the_index, path); return commit; @@ -2520,6 +2531,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) OPT_BOOL('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")), OPT_BOOL(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")), OPT_BOOL(0, "show-stats", &show_stats, N_("Show work cost statistics")), + OPT_BOOL(0, "progress", &show_progress, N_("Force progress reporting")), OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE), OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME), OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER), @@ -2555,6 +2567,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) save_commit_buffer = 0; dashdash_pos = 0; + show_progress = -1; parse_options_start(&ctx, argc, argv, prefix, options, PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_ARGV0); @@ -2579,6 +2592,13 @@ parse_done: DIFF_OPT_CLR(&revs.diffopt, FOLLOW_RENAMES); argc = parse_options_end(&ctx); + if (incremental || (output_option & OUTPUT_PORCELAIN)) { + if (show_progress > 0) + die("--progress can't be used with --incremental or porcelain formats"); + show_progress = 0; + } else if (show_progress < 0) + show_progress = isatty(2); + if (0 < abbrev) /* one more abbrev length is needed for the boundary commit */ abbrev++; @@ -2828,11 +2848,11 @@ parse_done: read_mailmap(&mailmap, NULL); + assign_blame(&sb, opt); + if (!incremental) setup_pager(); - assign_blame(&sb, opt); - free(final_commit_name); if (incremental) diff --git a/builtin/branch.c b/builtin/branch.c index 3f6c825db1..7b45b6bd6b 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -570,7 +570,6 @@ static const char edit_description[] = "BRANCH_DESCRIPTION"; static int edit_branch_description(const char *branch_name) { - int status; struct strbuf buf = STRBUF_INIT; struct strbuf name = STRBUF_INIT; @@ -595,11 +594,11 @@ static int edit_branch_description(const char *branch_name) strbuf_stripspace(&buf, 1); strbuf_addf(&name, "branch.%s.description", branch_name); - status = git_config_set(name.buf, buf.len ? buf.buf : NULL); + git_config_set(name.buf, buf.len ? buf.buf : NULL); strbuf_release(&name); strbuf_release(&buf); - return status; + return 0; } int cmd_branch(int argc, const char **argv, const char *prefix) diff --git a/builtin/cat-file.c b/builtin/cat-file.c index c0fd8dbb1c..54db1184a0 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -401,7 +401,7 @@ static int batch_objects(struct batch_options *opt) save_warning = warn_on_object_refname_ambiguity; warn_on_object_refname_ambiguity = 0; - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline(&buf, stdin) != EOF) { if (data.split_on_whitespace) { /* * Split at first whitespace, tying off the beginning diff --git a/builtin/check-attr.c b/builtin/check-attr.c index 265c9ba022..53a5a18c16 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -72,23 +72,23 @@ static void check_attr(const char *prefix, int cnt, static void check_attr_stdin_paths(const char *prefix, int cnt, struct git_attr_check *check) { - struct strbuf buf, nbuf; - int line_termination = nul_term_line ? 0 : '\n'; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; + strbuf_getline_fn getline_fn; - strbuf_init(&buf, 0); - strbuf_init(&nbuf, 0); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } check_attr(prefix, cnt, check, buf.buf); maybe_flush_or_die(stdout, "attribute to stdout"); } strbuf_release(&buf); - strbuf_release(&nbuf); + strbuf_release(&unquoted); } static NORETURN void error_with_usage(const char *msg) diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 43f361797a..1d73d3ca3d 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -115,19 +115,19 @@ static int check_ignore(struct dir_struct *dir, static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) { - struct strbuf buf, nbuf; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; char *pathspec[2] = { NULL, NULL }; - int line_termination = nul_term_line ? 0 : '\n'; + strbuf_getline_fn getline_fn; int num_ignored = 0; - strbuf_init(&buf, 0); - strbuf_init(&nbuf, 0); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } pathspec[0] = buf.buf; num_ignored += check_ignore(dir, prefix, @@ -135,7 +135,7 @@ static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) maybe_flush_or_die(stdout, "check-ignore to stdout"); } strbuf_release(&buf); - strbuf_release(&nbuf); + strbuf_release(&unquoted); return num_ignored; } diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c index eaaea546d3..cf0f54f6b9 100644 --- a/builtin/check-mailmap.c +++ b/builtin/check-mailmap.c @@ -54,7 +54,7 @@ int cmd_check_mailmap(int argc, const char **argv, const char *prefix) if (use_stdin) { struct strbuf buf = STRBUF_INIT; - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline_lf(&buf, stdin) != EOF) { check_mailmap(&mailmap, buf.buf); maybe_flush_or_die(stdout, "stdout"); } diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c index fd915d5984..eac499450f 100644 --- a/builtin/check-ref-format.c +++ b/builtin/check-ref-format.c @@ -20,7 +20,7 @@ static const char builtin_check_ref_format_usage[] = */ static char *collapse_slashes(const char *refname) { - char *ret = xmalloc(strlen(refname) + 1); + char *ret = xmallocz(strlen(refname)); char ch; char prev = '/'; char *cp = ret; diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 8028c3768f..92c69672e9 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -11,7 +11,7 @@ #include "parse-options.h" #define CHECKOUT_ALL 4 -static int line_termination = '\n'; +static int nul_term_line; static int checkout_stage; /* default to checkout stage0 */ static int to_tempfile; static char topath[4][TEMPORARY_FILENAME_LENGTH + 1]; @@ -35,7 +35,8 @@ static void write_tempfile_record(const char *name, const char *prefix) fputs(topath[checkout_stage], stdout); putchar('\t'); - write_name_quoted_relative(name, prefix, stdout, line_termination); + write_name_quoted_relative(name, prefix, stdout, + nul_term_line ? '\0' : '\n'); for (i = 0; i < 4; i++) { topath[i][0] = 0; @@ -129,36 +130,6 @@ static const char * const builtin_checkout_index_usage[] = { static struct lock_file lock_file; -static int option_parse_u(const struct option *opt, - const char *arg, int unset) -{ - int *newfd = opt->value; - - state.refresh_cache = 1; - state.istate = &the_index; - if (*newfd < 0) - *newfd = hold_locked_index(&lock_file, 1); - return 0; -} - -static int option_parse_z(const struct option *opt, - const char *arg, int unset) -{ - if (unset) - line_termination = '\n'; - else - line_termination = 0; - return 0; -} - -static int option_parse_prefix(const struct option *opt, - const char *arg, int unset) -{ - state.base_dir = arg; - state.base_dir_len = strlen(arg); - return 0; -} - static int option_parse_stage(const struct option *opt, const char *arg, int unset) { @@ -170,7 +141,7 @@ static int option_parse_stage(const struct option *opt, if ('1' <= ch && ch <= '3') checkout_stage = arg[0] - '0'; else - die("stage should be between 1 and 3 or all"); + die(_("stage should be between 1 and 3 or all")); } return 0; } @@ -183,6 +154,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) int read_from_stdin = 0; int prefix_length; int force = 0, quiet = 0, not_new = 0; + int index_opt = 0; struct option builtin_checkout_index_options[] = { OPT_BOOL('a', "all", &all, N_("check out all files in the index")), @@ -191,22 +163,19 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) N_("no warning for existing files and files not in index")), OPT_BOOL('n', "no-create", ¬_new, N_("don't checkout new files")), - { OPTION_CALLBACK, 'u', "index", &newfd, NULL, - N_("update stat information in the index file"), - PARSE_OPT_NOARG, option_parse_u }, - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, + OPT_BOOL('u', "index", &index_opt, + N_("update stat information in the index file")), + OPT_BOOL('z', NULL, &nul_term_line, + N_("paths are separated with NUL character")), OPT_BOOL(0, "stdin", &read_from_stdin, N_("read list of paths from the standard input")), OPT_BOOL(0, "temp", &to_tempfile, N_("write the content to temporary files")), - OPT_CALLBACK(0, "prefix", NULL, N_("string"), - N_("when creating files, prepend "), - option_parse_prefix), - OPT_CALLBACK(0, "stage", NULL, NULL, + OPT_STRING(0, "prefix", &state.base_dir, N_("string"), + N_("when creating files, prepend ")), + { OPTION_CALLBACK, 0, "stage", NULL, "1-3|all", N_("copy out the files from named stage"), - option_parse_stage), + PARSE_OPT_NONEG, option_parse_stage }, OPT_END() }; @@ -214,7 +183,6 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) usage_with_options(builtin_checkout_index_usage, builtin_checkout_index_options); git_config(git_default_config, NULL); - state.base_dir = ""; prefix_length = prefix ? strlen(prefix) : 0; if (read_cache() < 0) { @@ -227,15 +195,17 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) state.quiet = quiet; state.not_new = not_new; - if (state.base_dir_len || to_tempfile) { - /* when --prefix is specified we do not - * want to update cache. - */ - if (state.refresh_cache) { - rollback_lock_file(&lock_file); - newfd = -1; - } - state.refresh_cache = 0; + if (!state.base_dir) + state.base_dir = ""; + state.base_dir_len = strlen(state.base_dir); + + /* + * when --prefix is specified we do not want to update cache. + */ + if (index_opt && !state.base_dir_len && !to_tempfile) { + state.refresh_cache = 1; + state.istate = &the_index; + newfd = hold_locked_index(&lock_file, 1); } /* Check out named files first */ @@ -253,24 +223,27 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) } if (read_from_stdin) { - struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; + strbuf_getline_fn getline_fn; if (all) die("git checkout-index: don't mix '--all' and '--stdin'"); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { char *p; - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } p = prefix_path(prefix, prefix_length, buf.buf); checkout_file(p, prefix); free(p); } - strbuf_release(&nbuf); + strbuf_release(&unquoted); strbuf_release(&buf); } diff --git a/builtin/checkout.c b/builtin/checkout.c index e8110a9243..efcbd8f6b5 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -661,7 +661,8 @@ static void update_refs_for_switch(const struct checkout_opts *opts, describe_detached_head(_("HEAD is now at"), new->commit); } } else if (new->path) { /* Switch branches. */ - create_symref("HEAD", new->path, msg.buf); + if (create_symref("HEAD", new->path, msg.buf) < 0) + die(_("unable to update HEAD")); if (!opts->quiet) { if (old->path && !strcmp(new->path, old->path)) { if (opts->new_branch_force) @@ -981,7 +982,8 @@ static int parse_branchname_arg(int argc, const char **argv, */ int recover_with_dwim = dwim_new_local_branch_ok; - if (check_filename(NULL, arg) && !has_dash_dash) + if (!has_dash_dash && + (check_filename(NULL, arg) || !no_wildcard(arg))) recover_with_dwim = 0; /* * Accept "git checkout foo" and "git checkout foo --" diff --git a/builtin/clean.c b/builtin/clean.c index d7acb94a95..0371010afb 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -147,30 +147,6 @@ static int exclude_cb(const struct option *opt, const char *arg, int unset) return 0; } -/* - * Return 1 if the given path is the root of a git repository or - * submodule else 0. Will not return 1 for bare repositories with the - * exception of creating a bare repository in "foo/.git" and calling - * is_git_repository("foo"). - */ -static int is_git_repository(struct strbuf *path) -{ - int ret = 0; - int gitfile_error; - size_t orig_path_len = path->len; - assert(orig_path_len != 0); - strbuf_complete(path, '/'); - strbuf_addstr(path, ".git"); - if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf)) - ret = 1; - if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED || - gitfile_error == READ_GITFILE_ERR_READ_FAILED) - ret = 1; /* This could be a real .git file, take the - * safe option and avoid cleaning */ - strbuf_setlen(path, orig_path_len); - return ret; -} - static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag, int dry_run, int quiet, int *dir_gone) { @@ -182,7 +158,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag, *dir_gone = 1; - if ((force_flag & REMOVE_DIR_KEEP_NESTED_GIT) && is_git_repository(path)) { + if ((force_flag & REMOVE_DIR_KEEP_NESTED_GIT) && is_nonbare_repository_dir(path)) { if (!quiet) { quote_path_relative(path->buf, prefix, "ed); printf(dry_run ? _(msg_would_skip_git_dir) : _(msg_skip_git_dir), @@ -567,7 +543,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff) int eof = 0; int i; - chosen = xmalloc(sizeof(int) * stuff->nr); + ALLOC_ARRAY(chosen, stuff->nr); /* set chosen as uninitialized */ for (i = 0; i < stuff->nr; i++) chosen[i] = -1; @@ -594,7 +570,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff) clean_get_color(CLEAN_COLOR_RESET)); } - if (strbuf_getline(&choice, stdin, '\n') != EOF) { + if (strbuf_getline_lf(&choice, stdin) != EOF) { strbuf_trim(&choice); } else { eof = 1; @@ -639,7 +615,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff) nr += chosen[i]; } - result = xcalloc(nr + 1, sizeof(int)); + result = xcalloc(st_add(nr, 1), sizeof(int)); for (i = 0; i < stuff->nr && j < nr; i++) { if (chosen[i]) result[j++] = i; @@ -676,7 +652,7 @@ static int filter_by_patterns_cmd(void) clean_print_color(CLEAN_COLOR_PROMPT); printf(_("Input ignore patterns>> ")); clean_print_color(CLEAN_COLOR_RESET); - if (strbuf_getline(&confirm, stdin, '\n') != EOF) + if (strbuf_getline_lf(&confirm, stdin) != EOF) strbuf_trim(&confirm); else putchar('\n'); @@ -774,7 +750,7 @@ static int ask_each_cmd(void) qname = quote_path_relative(item->string, NULL, &buf); /* TRANSLATORS: Make sure to keep [y/N] as is */ printf(_("Remove %s [y/N]? "), qname); - if (strbuf_getline(&confirm, stdin, '\n') != EOF) { + if (strbuf_getline_lf(&confirm, stdin) != EOF) { strbuf_trim(&confirm); } else { putchar('\n'); diff --git a/builtin/clone.c b/builtin/clone.c index b004fb4e00..6576ecf343 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -47,6 +47,7 @@ static const char *real_git_dir; static char *option_upload_pack = "git-upload-pack"; static int option_verbosity; static int option_progress = -1; +static enum transport_family family; static struct string_list option_config; static struct string_list option_reference; static int option_dissociate; @@ -95,6 +96,10 @@ static struct option builtin_clone_options[] = { N_("separate git dir from working tree")), OPT_STRING_LIST('c', "config", &option_config, N_("key=value"), N_("set config inside the new repository")), + OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"), + TRANSPORT_FAMILY_IPV4), + OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"), + TRANSPORT_FAMILY_IPV6), OPT_END() }; @@ -230,8 +235,8 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare) strip_suffix_mem(start, &len, is_bundle ? ".bundle" : ".git"); if (!len || (len == 1 && *start == '/')) - die("No directory name could be guessed.\n" - "Please specify a directory on the command line"); + die(_("No directory name could be guessed.\n" + "Please specify a directory on the command line")); if (is_bare) dir = xstrfmt("%.*s.git", (int)len, start); @@ -338,7 +343,7 @@ static void copy_alternates(struct strbuf *src, struct strbuf *dst, FILE *in = fopen(src->buf, "r"); struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, in, '\n') != EOF) { + while (strbuf_getline(&line, in) != EOF) { char *abs_path; if (!line.len || line.buf[0] == '#') continue; @@ -635,9 +640,11 @@ static void update_remote_refs(const struct ref *refs, struct strbuf head_ref = STRBUF_INIT; strbuf_addstr(&head_ref, branch_top); strbuf_addstr(&head_ref, "HEAD"); - create_symref(head_ref.buf, - remote_head_points_at->peer_ref->name, - msg); + if (create_symref(head_ref.buf, + remote_head_points_at->peer_ref->name, + msg) < 0) + die(_("unable to update %s"), head_ref.buf); + strbuf_release(&head_ref); } } @@ -647,7 +654,8 @@ static void update_head(const struct ref *our, const struct ref *remote, const char *head; if (our && skip_prefix(our->name, "refs/heads/", &head)) { /* Local default branch link */ - create_symref("HEAD", our->name, NULL); + if (create_symref("HEAD", our->name, NULL) < 0) + die(_("unable to update HEAD")); if (!option_bare) { update_ref(msg, "HEAD", our->old_oid.hash, NULL, 0, UPDATE_REFS_DIE_ON_ERR); @@ -739,7 +747,7 @@ static int checkout(void) static int write_one_config(const char *key, const char *value, void *data) { - return git_config_set_multivar(key, value ? value : "true", "^$", 0); + return git_config_set_multivar_gently(key, value ? value : "true", "^$", 0); } static void write_config(struct string_list *config) @@ -749,7 +757,7 @@ static void write_config(struct string_list *config) for (i = 0; i < config->nr; i++) { if (git_config_parse_parameter(config->items[i].string, write_one_config, NULL) < 0) - die("unable to write parameters to config file"); + die(_("unable to write parameters to config file")); } } @@ -974,6 +982,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) remote = remote_get(option_origin); transport = transport_get(remote, remote->url[0]); transport_set_verbosity(transport, option_verbosity, option_progress); + transport->family = family; path = get_repo_path(remote->url[0], &is_bundle); is_local = option_local != 0 && path && !is_bundle; diff --git a/builtin/column.c b/builtin/column.c index 449413c8a8..33314b4d71 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -51,7 +51,7 @@ int cmd_column(int argc, const char **argv, const char *prefix) die(_("--command must be the first argument")); } finalize_colopts(&colopts, -1); - while (!strbuf_getline(&sb, stdin, '\n')) + while (!strbuf_getline(&sb, stdin)) string_list_append(&list, sb.buf); print_columns(&list, colopts, &copts); diff --git a/builtin/commit.c b/builtin/commit.c index d054f84960..b3bd2d4181 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -761,7 +761,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix, hook_arg2 = ""; } - s->fp = fopen(git_path(commit_editmsg), "w"); + s->fp = fopen_for_writing(git_path(commit_editmsg)); if (s->fp == NULL) die_errno(_("could not open '%s'"), git_path(commit_editmsg)); @@ -1690,7 +1690,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (fp == NULL) die_errno(_("could not open '%s' for reading"), git_path_merge_head()); - while (strbuf_getline(&m, fp, '\n') != EOF) { + while (strbuf_getline_lf(&m, fp) != EOF) { struct commit *parent; parent = get_merge_parent(m.buf); diff --git a/builtin/config.c b/builtin/config.c index adc772786a..ca9f834ae6 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -3,6 +3,7 @@ #include "color.h" #include "parse-options.h" #include "urlmatch.h" +#include "quote.h" static const char *const builtin_config_usage[] = { N_("git config []"), @@ -27,6 +28,7 @@ static int actions, types; static const char *get_color_slot, *get_colorbool_slot; static int end_null; static int respect_includes = -1; +static int show_origin; #define ACTION_GET (1<<0) #define ACTION_GET_ALL (1<<1) @@ -81,6 +83,7 @@ static struct option builtin_config_options[] = { OPT_BOOL('z', "null", &end_null, N_("terminate values with NUL byte")), OPT_BOOL(0, "name-only", &omit_values, N_("show variable names only")), OPT_BOOL(0, "includes", &respect_includes, N_("respect include directives on lookup")), + OPT_BOOL(0, "show-origin", &show_origin, N_("show origin of config (file, standard input, blob, command line)")), OPT_END(), }; @@ -91,8 +94,28 @@ static void check_argc(int argc, int min, int max) { usage_with_options(builtin_config_usage, builtin_config_options); } +static void show_config_origin(struct strbuf *buf) +{ + const char term = end_null ? '\0' : '\t'; + + strbuf_addstr(buf, current_config_origin_type()); + strbuf_addch(buf, ':'); + if (end_null) + strbuf_addstr(buf, current_config_name()); + else + quote_c_style(current_config_name(), buf, NULL, 0); + strbuf_addch(buf, term); +} + static int show_all_config(const char *key_, const char *value_, void *cb) { + if (show_origin) { + struct strbuf buf = STRBUF_INIT; + show_config_origin(&buf); + /* Use fwrite as "buf" can contain \0's if "end_null" is set. */ + fwrite(buf.buf, 1, buf.len, stdout); + strbuf_release(&buf); + } if (!omit_values && value_) printf("%s%c%s%c", key_, delim, value_, term); else @@ -108,6 +131,8 @@ struct strbuf_list { static int format_config(struct strbuf *buf, const char *key_, const char *value_) { + if (show_origin) + show_config_origin(buf); if (show_keys) strbuf_addstr(buf, key_); if (!omit_values) { @@ -352,6 +377,9 @@ static int get_colorbool(const char *var, int print) static void check_write(void) { + if (!given_config_source.file && !startup_info->have_repository) + die("not in a git directory"); + if (given_config_source.use_stdin) die("writing to stdin is not supported"); @@ -538,6 +566,14 @@ int cmd_config(int argc, const char **argv, const char *prefix) error("--name-only is only applicable to --list or --get-regexp"); usage_with_options(builtin_config_usage, builtin_config_options); } + + if (show_origin && !(actions & + (ACTION_GET|ACTION_GET_ALL|ACTION_GET_REGEXP|ACTION_LIST))) { + error("--show-origin is only applicable to --get, --get-all, " + "--get-regexp, and --list."); + usage_with_options(builtin_config_usage, builtin_config_options); + } + if (actions == ACTION_LIST) { check_argc(argc, 0, 0); if (git_config_with_options(show_all_config, NULL, @@ -582,7 +618,7 @@ int cmd_config(int argc, const char **argv, const char *prefix) check_write(); check_argc(argc, 2, 2); value = normalize_value(argv[0], argv[1]); - ret = git_config_set_in_file(given_config_source.file, argv[0], value); + ret = git_config_set_in_file_gently(given_config_source.file, argv[0], value); if (ret == CONFIG_NOTHING_SET) error("cannot overwrite multiple values with a single value\n" " Use a regexp, --add or --replace-all to change %s.", argv[0]); @@ -592,23 +628,23 @@ int cmd_config(int argc, const char **argv, const char *prefix) check_write(); check_argc(argc, 2, 3); value = normalize_value(argv[0], argv[1]); - return git_config_set_multivar_in_file(given_config_source.file, - argv[0], value, argv[2], 0); + return git_config_set_multivar_in_file_gently(given_config_source.file, + argv[0], value, argv[2], 0); } else if (actions == ACTION_ADD) { check_write(); check_argc(argc, 2, 2); value = normalize_value(argv[0], argv[1]); - return git_config_set_multivar_in_file(given_config_source.file, - argv[0], value, - CONFIG_REGEX_NONE, 0); + return git_config_set_multivar_in_file_gently(given_config_source.file, + argv[0], value, + CONFIG_REGEX_NONE, 0); } else if (actions == ACTION_REPLACE_ALL) { check_write(); check_argc(argc, 2, 3); value = normalize_value(argv[0], argv[1]); - return git_config_set_multivar_in_file(given_config_source.file, - argv[0], value, argv[2], 1); + return git_config_set_multivar_in_file_gently(given_config_source.file, + argv[0], value, argv[2], 1); } else if (actions == ACTION_GET) { check_argc(argc, 1, 2); @@ -634,17 +670,17 @@ int cmd_config(int argc, const char **argv, const char *prefix) check_write(); check_argc(argc, 1, 2); if (argc == 2) - return git_config_set_multivar_in_file(given_config_source.file, - argv[0], NULL, argv[1], 0); + return git_config_set_multivar_in_file_gently(given_config_source.file, + argv[0], NULL, argv[1], 0); else - return git_config_set_in_file(given_config_source.file, - argv[0], NULL); + return git_config_set_in_file_gently(given_config_source.file, + argv[0], NULL); } else if (actions == ACTION_UNSET_ALL) { check_write(); check_argc(argc, 1, 2); - return git_config_set_multivar_in_file(given_config_source.file, - argv[0], NULL, argv[1], 1); + return git_config_set_multivar_in_file_gently(given_config_source.file, + argv[0], NULL, argv[1], 1); } else if (actions == ACTION_RENAME_SECTION) { int ret; diff --git a/builtin/diff.c b/builtin/diff.c index ed0acca91f..52c98a9217 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -341,7 +341,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) } if (no_index) /* If this is a no-index diff, just run it and exit there. */ - diff_no_index(&rev, argc, argv, prefix); + diff_no_index(&rev, argc, argv); /* Otherwise, we are doing the usual "git" diff */ rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index; diff --git a/builtin/fast-export.c b/builtin/fast-export.c index d9ac5d8410..8164b581a6 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -880,7 +880,7 @@ static void export_marks(char *file) FILE *f; int e = 0; - f = fopen(file, "w"); + f = fopen_for_writing(file); if (!f) die_errno("Unable to open marks file %s for writing.", file); @@ -1021,7 +1021,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix) const char **refspecs_str; int i; - refspecs_str = xmalloc(sizeof(*refspecs_str) * refspecs_list.nr); + ALLOC_ARRAY(refspecs_str, refspecs_list.nr); for (i = 0; i < refspecs_list.nr; i++) refspecs_str[i] = refspecs_list.items[i].string; diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index cf3019e05b..79a611fda1 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -10,33 +10,24 @@ static const char fetch_pack_usage[] = "[--include-tag] [--upload-pack=] [--depth=] " "[--no-progress] [--diag-url] [-v] [:] [...]"; -static void add_sought_entry_mem(struct ref ***sought, int *nr, int *alloc, - const char *name, int namelen) +static void add_sought_entry(struct ref ***sought, int *nr, int *alloc, + const char *name) { - struct ref *ref = xcalloc(1, sizeof(*ref) + namelen + 1); + struct ref *ref; struct object_id oid; - const int chunksz = GIT_SHA1_HEXSZ + 1; - if (namelen > chunksz && name[chunksz - 1] == ' ' && - !get_oid_hex(name, &oid)) { - oidcpy(&ref->old_oid, &oid); - name += chunksz; - namelen -= chunksz; - } + if (!get_oid_hex(name, &oid) && name[GIT_SHA1_HEXSZ] == ' ') + name += GIT_SHA1_HEXSZ + 1; + else + oidclr(&oid); - memcpy(ref->name, name, namelen); - ref->name[namelen] = '\0'; + ref = alloc_ref(name); + oidcpy(&ref->old_oid, &oid); (*nr)++; ALLOC_GROW(*sought, *nr, *alloc); (*sought)[*nr - 1] = ref; } -static void add_sought_entry(struct ref ***sought, int *nr, int *alloc, - const char *string) -{ - add_sought_entry_mem(sought, nr, alloc, string, strlen(string)); -} - int cmd_fetch_pack(int argc, const char **argv, const char *prefix) { int i, ret; @@ -158,7 +149,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) else { /* read from stdin one ref per line, until EOF */ struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, stdin, '\n') != EOF) + while (strbuf_getline_lf(&line, stdin) != EOF) add_sought_entry(&sought, &nr_sought, &alloc_sought, line.buf); strbuf_release(&line); } diff --git a/builtin/fetch.c b/builtin/fetch.c index 5aa1c2de44..f8455bde7a 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -38,6 +38,7 @@ static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosit static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT; static int tags = TAGS_DEFAULT, unshallow, update_shallow; static int max_children = -1; +static enum transport_family family; static const char *depth; static const char *upload_pack; static struct strbuf default_rla = STRBUF_INIT; @@ -127,6 +128,10 @@ static struct option builtin_fetch_options[] = { N_("accept refs that update .git/shallow")), { OPTION_CALLBACK, 0, "refmap", NULL, N_("refmap"), N_("specify fetch refmap"), PARSE_OPT_NONEG, parse_refmap_arg }, + OPT_SET_INT('4', "ipv4", &family, N_("use IPv4 addresses only"), + TRANSPORT_FAMILY_IPV4), + OPT_SET_INT('6', "ipv6", &family, N_("use IPv6 addresses only"), + TRANSPORT_FAMILY_IPV6), OPT_END() }; @@ -840,7 +845,7 @@ static void check_not_current_branch(struct ref *ref_map) static int truncate_fetch_head(void) { const char *filename = git_path_fetch_head(); - FILE *fp = fopen(filename, "w"); + FILE *fp = fopen_for_writing(filename); if (!fp) return error(_("cannot open %s: %s\n"), filename, strerror(errno)); @@ -864,6 +869,7 @@ static struct transport *prepare_transport(struct remote *remote) struct transport *transport; transport = transport_get(remote, NULL); transport_set_verbosity(transport, verbosity, progress); + transport->family = family; if (upload_pack) set_option(transport, TRANS_OPT_UPLOADPACK, upload_pack); if (keep) @@ -1016,10 +1022,9 @@ static int add_remote_or_group(const char *name, struct string_list *list) git_config(get_remote_group, &g); if (list->nr == prev_nr) { - struct remote *remote; - if (!remote_is_configured(name)) + struct remote *remote = remote_get(name); + if (!remote_is_configured(remote)) return 0; - remote = remote_get(name); string_list_append(list, remote->name); } return 1; @@ -1110,7 +1115,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv) if (argc > 0) { int j = 0; int i; - refs = xcalloc(argc + 1, sizeof(const char *)); + refs = xcalloc(st_add(argc, 1), sizeof(const char *)); for (i = 0; i < argc; i++) { if (!strcmp(argv[i], "tag")) { i++; @@ -1225,6 +1230,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) list.strdup_strings = 1; string_list_clear(&list, 0); + close_all_packs(); + argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL); if (verbosity < 0) argv_array_push(&argv_gc_auto, "--quiet"); diff --git a/builtin/grep.c b/builtin/grep.c index 4229cae390..aa7435f380 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -24,11 +24,11 @@ static char const * const grep_usage[] = { NULL }; -static int use_threads = 1; +#define GREP_NUM_THREADS_DEFAULT 8 +static int num_threads; #ifndef NO_PTHREADS -#define THREADS 8 -static pthread_t threads[THREADS]; +static pthread_t *threads; /* We use one producer thread and THREADS consumer * threads. The producer adds struct work_items to 'todo' and the @@ -63,13 +63,13 @@ static pthread_mutex_t grep_mutex; static inline void grep_lock(void) { - if (use_threads) + if (num_threads) pthread_mutex_lock(&grep_mutex); } static inline void grep_unlock(void) { - if (use_threads) + if (num_threads) pthread_mutex_unlock(&grep_mutex); } @@ -206,7 +206,8 @@ static void start_threads(struct grep_opt *opt) strbuf_init(&todo[i].out, 0); } - for (i = 0; i < ARRAY_SIZE(threads); i++) { + threads = xcalloc(num_threads, sizeof(*threads)); + for (i = 0; i < num_threads; i++) { int err; struct grep_opt *o = grep_opt_dup(opt); o->output = strbuf_out; @@ -238,12 +239,14 @@ static int wait_all(void) pthread_cond_broadcast(&cond_add); grep_unlock(); - for (i = 0; i < ARRAY_SIZE(threads); i++) { + for (i = 0; i < num_threads; i++) { void *h; pthread_join(threads[i], &h); hit |= (int) (intptr_t) h; } + free(threads); + pthread_mutex_destroy(&grep_mutex); pthread_mutex_destroy(&grep_read_mutex); pthread_mutex_destroy(&grep_attr_mutex); @@ -267,6 +270,14 @@ static int grep_cmd_config(const char *var, const char *value, void *cb) int st = grep_config(var, value, cb); if (git_color_default_config(var, value, cb) < 0) st = -1; + + if (!strcmp(var, "grep.threads")) { + num_threads = git_config_int(var, value); + if (num_threads < 0) + die(_("invalid number of threads specified (%d) for %s"), + num_threads, var); + } + return st; } @@ -294,7 +305,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, } #ifndef NO_PTHREADS - if (use_threads) { + if (num_threads) { add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); return 0; @@ -323,7 +334,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) strbuf_addstr(&buf, filename); #ifndef NO_PTHREADS - if (use_threads) { + if (num_threads) { add_work(opt, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); return 0; @@ -354,17 +365,17 @@ static void append_path(struct grep_opt *opt, const void *data, size_t len) static void run_pager(struct grep_opt *opt, const char *prefix) { struct string_list *path_list = opt->output_priv; - const char **argv = xmalloc(sizeof(const char *) * (path_list->nr + 1)); + struct child_process child = CHILD_PROCESS_INIT; int i, status; for (i = 0; i < path_list->nr; i++) - argv[i] = path_list->items[i].string; - argv[path_list->nr] = NULL; + argv_array_push(&child.args, path_list->items[i].string); + child.dir = prefix; + child.use_shell = 1; - status = run_command_v_opt_cd_env(argv, RUN_USING_SHELL, prefix, NULL); + status = run_command(&child); if (status) exit(status); - free(argv); } static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int cached) @@ -375,7 +386,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int for (nr = 0; nr < active_nr; nr++) { const struct cache_entry *ce = active_cache[nr]; - if (!S_ISREG(ce->ce_mode)) + if (!S_ISREG(ce->ce_mode) || ce_intent_to_add(ce)) continue; if (!ce_path_match(ce, pathspec, NULL)) continue; @@ -562,7 +573,7 @@ static int file_callback(const struct option *opt, const char *arg, int unset) patterns = from_stdin ? stdin : fopen(arg, "r"); if (!patterns) die_errno(_("cannot open '%s'"), arg); - while (strbuf_getline(&sb, patterns, '\n') == 0) { + while (strbuf_getline(&sb, patterns) == 0) { /* ignore empty line like grep does */ if (sb.len == 0) continue; @@ -697,6 +708,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) N_("show context lines before matches")), OPT_INTEGER('A', "after-context", &opt.post_context, N_("show context lines after matches")), + OPT_INTEGER(0, "threads", &num_threads, + N_("use worker threads")), OPT_NUMBER_CALLBACK(&opt, N_("shortcut for -C NUM"), context_callback), OPT_BOOL('p', "show-function", &opt.funcname, @@ -755,9 +768,15 @@ int cmd_grep(int argc, const char **argv, const char *prefix) PARSE_OPT_STOP_AT_NON_OPTION); grep_commit_pattern_type(pattern_type_arg, &opt); - if (use_index && !startup_info->have_repository) - /* die the same way as if we did it at the beginning */ - setup_git_directory(); + if (use_index && !startup_info->have_repository) { + int fallback = 0; + git_config_get_bool("grep.fallbacktonoindex", &fallback); + if (fallback) + use_index = 0; + else + /* die the same way as if we did it at the beginning */ + setup_git_directory(); + } /* * skip a -- separator; we know it cannot be @@ -786,7 +805,6 @@ int cmd_grep(int argc, const char **argv, const char *prefix) opt.output_priv = &path_list; opt.output = append_path; string_list_append(&path_list, show_in_pager); - use_threads = 0; } if (!opt.pattern_list) @@ -817,14 +835,18 @@ int cmd_grep(int argc, const char **argv, const char *prefix) } #ifndef NO_PTHREADS - if (list.nr || cached || online_cpus() == 1) - use_threads = 0; + if (list.nr || cached || show_in_pager) + num_threads = 0; + else if (num_threads == 0) + num_threads = GREP_NUM_THREADS_DEFAULT; + else if (num_threads < 0) + die(_("invalid number of threads specified (%d)"), num_threads); #else - use_threads = 0; + num_threads = 0; #endif #ifndef NO_PTHREADS - if (use_threads) { + if (num_threads) { if (!(opt.name_only || opt.unmatch_name_only || opt.count) && (opt.pre_context || opt.post_context || opt.file_break || opt.funcbody)) @@ -894,7 +916,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) hit = grep_objects(&opt, &pathspec, &list); } - if (use_threads) + if (num_threads) hit |= wait_all(); if (hit && show_in_pager) run_pager(&opt, prefix); diff --git a/builtin/hash-object.c b/builtin/hash-object.c index 43b098b76c..f7d3567dd0 100644 --- a/builtin/hash-object.c +++ b/builtin/hash-object.c @@ -58,20 +58,21 @@ static void hash_object(const char *path, const char *type, const char *vpath, static void hash_stdin_paths(const char *type, int no_filters, unsigned flags, int literally) { - struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline(&buf, stdin) != EOF) { if (buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } hash_object(buf.buf, type, no_filters ? NULL : buf.buf, flags, literally); } strbuf_release(&buf); - strbuf_release(&nbuf); + strbuf_release(&unquoted); } int cmd_hash_object(int argc, const char **argv, const char *prefix) diff --git a/builtin/help.c b/builtin/help.c index 1cd0c1ee44..3c55ce4563 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -171,12 +171,10 @@ static void exec_man_cmd(const char *cmd, const char *page) static void add_man_viewer(const char *name) { struct man_viewer_list **p = &man_viewer_list; - size_t len = strlen(name); while (*p) p = &((*p)->next); - *p = xcalloc(1, (sizeof(**p) + len + 1)); - memcpy((*p)->name, name, len); /* NUL-terminated by xcalloc */ + FLEX_ALLOC_STR(*p, name, name); } static int supported_man_viewer(const char *name, size_t len) @@ -190,9 +188,8 @@ static void do_add_man_viewer_info(const char *name, size_t len, const char *value) { - struct man_viewer_info_list *new = xcalloc(1, sizeof(*new) + len + 1); - - memcpy(new->name, name, len); /* NUL-terminated by xcalloc */ + struct man_viewer_info_list *new; + FLEX_ALLOC_MEM(new, name, name, len); new->info = xstrdup(value); new->next = man_viewer_info_list; man_viewer_info_list = new; diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 6a01509587..45245199ae 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1346,7 +1346,7 @@ static void fix_unresolved_deltas(struct sha1file *f) * before deltas depending on them, a good heuristic is to start * resolving deltas in the same order as their position in the pack. */ - sorted_by_pos = xmalloc(nr_ref_deltas * sizeof(*sorted_by_pos)); + ALLOC_ARRAY(sorted_by_pos, nr_ref_deltas); for (i = 0; i < nr_ref_deltas; i++) sorted_by_pos[i] = &ref_deltas[i]; qsort(sorted_by_pos, nr_ref_deltas, sizeof(*sorted_by_pos), delta_pos_compare); @@ -1514,6 +1514,7 @@ static void read_v2_anomalous_offsets(struct packed_git *p, if (!(off & 0x80000000)) continue; off = off & 0x7fffffff; + check_pack_index_ptr(p, &idx2[off * 2]); if (idx2[off * 2]) continue; /* @@ -1744,9 +1745,9 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) curr_pack = open_pack_file(pack_name); parse_pack_header(); - objects = xcalloc(nr_objects + 1, sizeof(struct object_entry)); + objects = xcalloc(st_add(nr_objects, 1), sizeof(struct object_entry)); if (show_stat) - obj_stat = xcalloc(nr_objects + 1, sizeof(struct object_stat)); + obj_stat = xcalloc(st_add(nr_objects, 1), sizeof(struct object_stat)); ofs_deltas = xcalloc(nr_objects, sizeof(struct ofs_delta_entry)); parse_pack_objects(pack_sha1); resolve_deltas(); @@ -1759,7 +1760,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (show_stat) show_pack_info(stat_only); - idx_objects = xmalloc((nr_objects) * sizeof(struct pack_idx_entry *)); + ALLOC_ARRAY(idx_objects, nr_objects); for (i = 0; i < nr_objects; i++) idx_objects[i] = &objects[i].idx; curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_sha1); diff --git a/builtin/init-db.c b/builtin/init-db.c index 07229d60f1..6223b7d46a 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -250,7 +250,7 @@ static int create_default_files(const char *template_path) git_config_set("core.bare", "false"); /* allow template config file to override the default */ if (log_all_ref_updates == -1) - git_config_set("core.logallrefupdates", "true"); + git_config_set("core.logallrefupdates", "true"); if (needs_work_tree_config(get_git_dir(), work_tree)) git_config_set("core.worktree", work_tree); } diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c index 46838d24a9..b99ae4be88 100644 --- a/builtin/interpret-trailers.c +++ b/builtin/interpret-trailers.c @@ -12,16 +12,18 @@ #include "trailer.h" static const char * const git_interpret_trailers_usage[] = { - N_("git interpret-trailers [--trim-empty] [(--trailer [(=|:)])...] [...]"), + N_("git interpret-trailers [--in-place] [--trim-empty] [(--trailer [(=|:)])...] [...]"), NULL }; int cmd_interpret_trailers(int argc, const char **argv, const char *prefix) { + int in_place = 0; int trim_empty = 0; struct string_list trailers = STRING_LIST_INIT_DUP; struct option options[] = { + OPT_BOOL(0, "in-place", &in_place, N_("edit files in place")), OPT_BOOL(0, "trim-empty", &trim_empty, N_("trim empty trailers")), OPT_STRING_LIST(0, "trailer", &trailers, N_("trailer"), N_("trailer(s) to add")), @@ -34,9 +36,12 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix) if (argc) { int i; for (i = 0; i < argc; i++) - process_trailers(argv[i], trim_empty, &trailers); - } else - process_trailers(NULL, trim_empty, &trailers); + process_trailers(argv[i], in_place, trim_empty, &trailers); + } else { + if (in_place) + die(_("no input file given for in-place editing")); + process_trailers(NULL, in_place, trim_empty, &trailers); + } string_list_clear(&trailers, 0); diff --git a/builtin/log.c b/builtin/log.c index 069bd3a909..0d738d6ddc 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -699,6 +699,7 @@ static int do_signoff; static const char *signature = git_version_string; static const char *signature_file; static int config_cover_letter; +static const char *config_output_directory; enum { COVER_UNSET, @@ -777,6 +778,8 @@ static int git_format_config(const char *var, const char *value, void *cb) config_cover_letter = git_config_bool(var, value) ? COVER_ON : COVER_OFF; return 0; } + if (!strcmp(var, "format.outputdirectory")) + return git_config_string(&config_output_directory, var, value); return git_log_config(var, value, cb); } @@ -1196,6 +1199,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) int cover_letter = -1; int boundary_count = 0; int no_binary_diff = 0; + int zero_commit = 0; struct commit *origin = NULL; const char *in_reply_to = NULL; struct patch_ids ids; @@ -1236,6 +1240,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback }, OPT_BOOL(0, "no-binary", &no_binary_diff, N_("don't output binary diffs")), + OPT_BOOL(0, "zero-commit", &zero_commit, + N_("output all-zero hash in From header")), OPT_BOOL(0, "ignore-if-in-upstream", &ignore_if_in_upstream, N_("don't include a patch matching a commit upstream")), { OPTION_SET_INT, 'p', "no-stat", &use_patch_format, NULL, @@ -1380,12 +1386,17 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) /* Always generate a patch */ rev.diffopt.output_format |= DIFF_FORMAT_PATCH; + rev.zero_commit = zero_commit; + if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff) DIFF_OPT_SET(&rev.diffopt, BINARY); if (rev.show_notes) init_display_notes(&rev.notes_opt); + if (!output_directory && !use_stdout) + output_directory = config_output_directory; + if (!use_stdout) output_directory = set_outdir(prefix, output_directory); else diff --git a/builtin/ls-files.c b/builtin/ls-files.c index b6a7cb0c7c..f02e3d23bb 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -27,6 +27,7 @@ static int show_killed; static int show_valid_bit; static int line_terminator = '\n'; static int debug_mode; +static int show_eol; static const char *prefix; static int max_prefix_len; @@ -47,6 +48,23 @@ static const char *tag_modified = ""; static const char *tag_skip_worktree = ""; static const char *tag_resolve_undo = ""; +static void write_eolinfo(const struct cache_entry *ce, const char *path) +{ + if (!show_eol) + return; + else { + struct stat st; + const char *i_txt = ""; + const char *w_txt = ""; + const char *a_txt = get_convert_attr_ascii(path); + if (ce && S_ISREG(ce->ce_mode)) + i_txt = get_cached_convert_stats_ascii(ce->name); + if (!lstat(path, &st) && S_ISREG(st.st_mode)) + w_txt = get_wt_convert_stats_ascii(path); + printf("i/%-5s w/%-5s attr/%-17s\t", i_txt, w_txt, a_txt); + } +} + static void write_name(const char *name) { /* @@ -68,6 +86,7 @@ static void show_dir_entry(const char *tag, struct dir_entry *ent) return; fputs(tag, stdout); + write_eolinfo(NULL, ent->name); write_name(ent->name); } @@ -170,6 +189,7 @@ static void show_ce_entry(const char *tag, const struct cache_entry *ce) find_unique_abbrev(ce->sha1,abbrev), ce_stage(ce)); } + write_eolinfo(ce, ce->name); write_name(ce->name); if (debug_mode) { const struct stat_data *sd = &ce->ce_stat_data; @@ -359,14 +379,6 @@ static const char * const ls_files_usage[] = { NULL }; -static int option_parse_z(const struct option *opt, - const char *arg, int unset) -{ - line_terminator = unset ? '\n' : '\0'; - - return 0; -} - static int option_parse_exclude(const struct option *opt, const char *arg, int unset) { @@ -408,9 +420,9 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) struct exclude_list *el; struct string_list exclude_list = STRING_LIST_INIT_NODUP; struct option builtin_ls_files_options[] = { - { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - N_("paths are separated with NUL character"), - PARSE_OPT_NOARG, option_parse_z }, + /* Think twice before adding "--nul" synonym to this */ + OPT_SET_INT('z', NULL, &line_terminator, + N_("paths are separated with NUL character"), '\0'), OPT_BOOL('t', NULL, &show_tag, N_("identify the file status with tags")), OPT_BOOL('v', NULL, &show_valid_bit, @@ -433,6 +445,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) OPT_BIT(0, "directory", &dir.flags, N_("show 'other' directories' names only"), DIR_SHOW_OTHER_DIRECTORIES), + OPT_BOOL(0, "eol", &show_eol, N_("show line endings of files")), OPT_NEGBIT(0, "empty-directory", &dir.flags, N_("don't show empty directories"), DIR_HIDE_EMPTY_DIRECTORIES), diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index fa65a8448a..66cdd45cc1 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -3,9 +3,12 @@ #include "transport.h" #include "remote.h" -static const char ls_remote_usage[] = -"git ls-remote [--heads] [--tags] [--upload-pack=]\n" -" [-q | --quiet] [--exit-code] [--get-url] [ [...]]"; +static const char * const ls_remote_usage[] = { + N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=]\n" + " [-q | --quiet] [--exit-code] [--get-url]\n" + " [--symref] [ [...]]"), + NULL +}; /* * Is there one among the list of patterns that match the tail part @@ -30,12 +33,12 @@ static int tail_match(const char **pattern, const char *path) int cmd_ls_remote(int argc, const char **argv, const char *prefix) { - int i; const char *dest = NULL; unsigned flags = 0; int get_url = 0; int quiet = 0; int status = 0; + int show_symref_target = 0; const char *uploadpack = NULL; const char **pattern = NULL; @@ -43,59 +46,36 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) struct transport *transport; const struct ref *ref; - if (argc == 2 && !strcmp("-h", argv[1])) - usage(ls_remote_usage); + struct option options[] = { + OPT__QUIET(&quiet, N_("do not print remote URL")), + OPT_STRING(0, "upload-pack", &uploadpack, N_("exec"), + N_("path of git-upload-pack on the remote host")), + { OPTION_STRING, 0, "exec", &uploadpack, N_("exec"), + N_("path of git-upload-pack on the remote host"), + PARSE_OPT_HIDDEN }, + OPT_BIT('t', "tags", &flags, N_("limit to tags"), REF_TAGS), + OPT_BIT('h', "heads", &flags, N_("limit to heads"), REF_HEADS), + OPT_BIT(0, "refs", &flags, N_("do not show peeled tags"), REF_NORMAL), + OPT_BOOL(0, "get-url", &get_url, + N_("take url..insteadOf into account")), + OPT_SET_INT(0, "exit-code", &status, + N_("exit with exit code 2 if no matching refs are found"), 2), + OPT_BOOL(0, "symref", &show_symref_target, + N_("show underlying ref in addition to the object pointed by it")), + OPT_END() + }; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; + argc = parse_options(argc, argv, prefix, options, ls_remote_usage, + PARSE_OPT_STOP_AT_NON_OPTION); + dest = argv[0]; - if (*arg == '-') { - if (starts_with(arg, "--upload-pack=")) { - uploadpack = arg + 14; - continue; - } - if (starts_with(arg, "--exec=")) { - uploadpack = arg + 7; - continue; - } - if (!strcmp("--tags", arg) || !strcmp("-t", arg)) { - flags |= REF_TAGS; - continue; - } - if (!strcmp("--heads", arg) || !strcmp("-h", arg)) { - flags |= REF_HEADS; - continue; - } - if (!strcmp("--refs", arg)) { - flags |= REF_NORMAL; - continue; - } - if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) { - quiet = 1; - continue; - } - if (!strcmp("--get-url", arg)) { - get_url = 1; - continue; - } - if (!strcmp("--exit-code", arg)) { - /* return this code if no refs are reported */ - status = 2; - continue; - } - usage(ls_remote_usage); - } - dest = arg; - i++; - break; + if (argc > 1) { + int i; + pattern = xcalloc(argc, sizeof(const char *)); + for (i = 1; i < argc; i++) + pattern[i - 1] = xstrfmt("*/%s", argv[i]); } - if (argv[i]) { - int j; - pattern = xcalloc(argc - i + 1, sizeof(const char *)); - for (j = i; j < argc; j++) - pattern[j - i] = xstrfmt("*/%s", argv[j]); - } remote = remote_get(dest); if (!remote) { if (dest) @@ -125,7 +105,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) continue; if (!tail_match(pattern, ref->name)) continue; - printf("%s %s\n", oid_to_hex(&ref->old_oid), ref->name); + if (show_symref_target && ref->symref) + printf("ref: %s\t%s\n", ref->symref, ref->name); + printf("%s\t%s\n", oid_to_hex(&ref->old_oid), ref->name); status = 0; /* we found something */ } return status; diff --git a/builtin/merge-base.c b/builtin/merge-base.c index a8911626c2..c0d1822eb3 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -252,7 +252,7 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) if (argc < 2) usage_with_options(merge_base_usage, options); - rev = xmalloc(argc * sizeof(*rev)); + ALLOC_ARRAY(rev, argc); while (argc-- > 0) rev[rev_nr++] = get_commit_reference(*argv++); return show_merge_base(rev, rev_nr, show_all); diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c index d4f0cbd451..ca570041df 100644 --- a/builtin/merge-tree.c +++ b/builtin/merge-tree.c @@ -174,7 +174,7 @@ static struct merge_list *create_entry(unsigned stage, unsigned mode, const unsi static char *traverse_path(const struct traverse_info *info, const struct name_entry *n) { - char *path = xmalloc(traverse_path_len(info, n) + 1); + char *path = xmallocz(traverse_path_len(info, n)); return make_traverse_path(path, info, n); } diff --git a/builtin/merge.c b/builtin/merge.c index 15bf95b3ac..101ffeff4c 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -404,6 +404,7 @@ static void finish(struct commit *head_commit, * We ignore errors in 'gc --auto', since the * user should see them. */ + close_all_packs(); run_command_v_opt(argv_gc_auto, RUN_GIT_CMD); } } @@ -938,7 +939,7 @@ static int setup_with_upstream(const char ***argv) if (!branch->merge_nr) die(_("No default upstream defined for the current branch.")); - args = xcalloc(branch->merge_nr + 1, sizeof(char *)); + args = xcalloc(st_add(branch->merge_nr, 1), sizeof(char *)); for (i = 0; i < branch->merge_nr; i++) { if (!branch->merge[i]->dst) die(_("No remote-tracking branch for %s from %s"), diff --git a/builtin/mktree.c b/builtin/mktree.c index a964d6be52..4282b62c59 100644 --- a/builtin/mktree.c +++ b/builtin/mktree.c @@ -19,16 +19,17 @@ static int alloc, used; static void append_to_tree(unsigned mode, unsigned char *sha1, char *path) { struct treeent *ent; - int len = strlen(path); + size_t len = strlen(path); if (strchr(path, '/')) die("path %s contains slash", path); - ALLOC_GROW(entries, used + 1, alloc); - ent = entries[used++] = xmalloc(sizeof(**entries) + len + 1); + FLEX_ALLOC_MEM(ent, name, path, len); ent->mode = mode; ent->len = len; hashcpy(ent->sha1, sha1); - memcpy(ent->name, path, len+1); + + ALLOC_GROW(entries, used + 1, alloc); + entries[used++] = ent; } static int ent_compare(const void *a_, const void *b_) @@ -65,7 +66,7 @@ static const char *mktree_usage[] = { NULL }; -static void mktree_line(char *buf, size_t len, int line_termination, int allow_missing) +static void mktree_line(char *buf, size_t len, int nul_term_line, int allow_missing) { char *ptr, *ntr; unsigned mode; @@ -97,7 +98,7 @@ static void mktree_line(char *buf, size_t len, int line_termination, int allow_m *ntr++ = 0; /* now at the beginning of SHA1 */ path = ntr + 41; /* at the beginning of name */ - if (line_termination && path[0] == '"') { + if (!nul_term_line && path[0] == '"') { struct strbuf p_uq = STRBUF_INIT; if (unquote_c_style(&p_uq, path, NULL)) die("invalid quoting"); @@ -141,23 +142,25 @@ int cmd_mktree(int ac, const char **av, const char *prefix) { struct strbuf sb = STRBUF_INIT; unsigned char sha1[20]; - int line_termination = '\n'; + int nul_term_line = 0; int allow_missing = 0; int is_batch_mode = 0; int got_eof = 0; + strbuf_getline_fn getline_fn; const struct option option[] = { - OPT_SET_INT('z', NULL, &line_termination, N_("input is NUL terminated"), '\0'), + OPT_BOOL('z', NULL, &nul_term_line, N_("input is NUL terminated")), OPT_SET_INT( 0 , "missing", &allow_missing, N_("allow missing objects"), 1), OPT_SET_INT( 0 , "batch", &is_batch_mode, N_("allow creation of more than one tree"), 1), OPT_END() }; ac = parse_options(ac, av, prefix, option, mktree_usage, 0); + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; while (!got_eof) { while (1) { - if (strbuf_getline(&sb, stdin, line_termination) == EOF) { + if (getline_fn(&sb, stdin) == EOF) { got_eof = 1; break; } @@ -167,7 +170,7 @@ int cmd_mktree(int ac, const char **av, const char *prefix) break; die("input format error: (blank line only valid in batch mode)"); } - mktree_line(sb.buf, sb.len, line_termination, allow_missing); + mktree_line(sb.buf, sb.len, nul_term_line, allow_missing); } if (is_batch_mode && got_eof && used < 1) { /* diff --git a/builtin/mv.c b/builtin/mv.c index d1d43168ae..aeae855e2b 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -24,7 +24,8 @@ static const char **internal_copy_pathspec(const char *prefix, int count, unsigned flags) { int i; - const char **result = xmalloc((count + 1) * sizeof(const char *)); + const char **result; + ALLOC_ARRAY(result, count + 1); memcpy(result, pathspec, count * sizeof(const char *)); result[count] = NULL; for (i = 0; i < count; i++) { @@ -47,9 +48,9 @@ static const char **internal_copy_pathspec(const char *prefix, static const char *add_slash(const char *path) { - int len = strlen(path); + size_t len = strlen(path); if (path[len - 1] != '/') { - char *with_slash = xmalloc(len + 2); + char *with_slash = xmalloc(st_add(len, 2)); memcpy(with_slash, path, len); with_slash[len++] = '/'; with_slash[len] = 0; diff --git a/builtin/notes.c b/builtin/notes.c index 52aa9af74b..ed6f2222f4 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -286,11 +286,11 @@ static int notes_copy_from_stdin(int force, const char *rewrite_cmd) if (!c) return 0; } else { - init_notes(NULL, NULL, NULL, 0); + init_notes(NULL, NULL, NULL, NOTES_INIT_WRITABLE); t = &default_notes_tree; } - while (strbuf_getline(&buf, stdin, '\n') != EOF) { + while (strbuf_getline_lf(&buf, stdin) != EOF) { unsigned char from_obj[20], to_obj[20]; struct strbuf **split; int err; @@ -329,15 +329,18 @@ static int notes_copy_from_stdin(int force, const char *rewrite_cmd) return ret; } -static struct notes_tree *init_notes_check(const char *subcommand) +static struct notes_tree *init_notes_check(const char *subcommand, + int flags) { struct notes_tree *t; - init_notes(NULL, NULL, NULL, 0); + const char *ref; + init_notes(NULL, NULL, NULL, flags); t = &default_notes_tree; - if (!starts_with(t->ref, "refs/notes/")) + ref = (flags & NOTES_INIT_WRITABLE) ? t->update_ref : t->ref; + if (!starts_with(ref, "refs/notes/")) die("Refusing to %s notes in %s (outside of refs/notes/)", - subcommand, t->ref); + subcommand, ref); return t; } @@ -360,7 +363,7 @@ static int list(int argc, const char **argv, const char *prefix) usage_with_options(git_notes_list_usage, options); } - t = init_notes_check("list"); + t = init_notes_check("list", 0); if (argc) { if (get_sha1(argv[0], object)) die(_("Failed to resolve '%s' as a valid ref."), argv[0]); @@ -420,7 +423,7 @@ static int add(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check("add"); + t = init_notes_check("add", NOTES_INIT_WRITABLE); note = get_note(t, object); if (note) { @@ -511,7 +514,7 @@ static int copy(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check("copy"); + t = init_notes_check("copy", NOTES_INIT_WRITABLE); note = get_note(t, object); if (note) { @@ -589,7 +592,7 @@ static int append_edit(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check(argv[0]); + t = init_notes_check(argv[0], NOTES_INIT_WRITABLE); note = get_note(t, object); prepare_note_data(object, &d, edit ? note : NULL); @@ -652,7 +655,7 @@ static int show(int argc, const char **argv, const char *prefix) if (get_sha1(object_ref, object)) die(_("Failed to resolve '%s' as a valid ref."), object_ref); - t = init_notes_check("show"); + t = init_notes_check("show", 0); note = get_note(t, object); if (!note) @@ -806,10 +809,10 @@ static int merge(int argc, const char **argv, const char *prefix) o.local_ref = default_notes_ref(); strbuf_addstr(&remote_ref, argv[0]); - expand_notes_ref(&remote_ref); + expand_loose_notes_ref(&remote_ref); o.remote_ref = remote_ref.buf; - t = init_notes_check("merge"); + t = init_notes_check("merge", NOTES_INIT_WRITABLE); if (strategy) { if (parse_notes_merge_strategy(strategy, &o.strategy)) { @@ -901,7 +904,7 @@ static int remove_cmd(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, git_notes_remove_usage, 0); - t = init_notes_check("remove"); + t = init_notes_check("remove", NOTES_INIT_WRITABLE); if (!argc && !from_stdin) { retval = remove_one_note(t, "HEAD", flag); @@ -943,7 +946,7 @@ static int prune(int argc, const char **argv, const char *prefix) usage_with_options(git_notes_prune_usage, options); } - t = init_notes_check("prune"); + t = init_notes_check("prune", NOTES_INIT_WRITABLE); prune_notes(t, (verbose ? NOTES_PRUNE_VERBOSE : 0) | (show_only ? NOTES_PRUNE_VERBOSE|NOTES_PRUNE_DRYRUN : 0) ); diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 4dae5b11c2..a27de5b323 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -624,7 +624,7 @@ static struct object_entry **compute_write_order(void) { unsigned int i, wo_end, last_untagged; - struct object_entry **wo = xmalloc(to_pack.nr_objects * sizeof(*wo)); + struct object_entry **wo; struct object_entry *objects = to_pack.objects; for (i = 0; i < to_pack.nr_objects; i++) { @@ -657,6 +657,7 @@ static struct object_entry **compute_write_order(void) * Give the objects in the original recency order until * we see a tagged tip. */ + ALLOC_ARRAY(wo, to_pack.nr_objects); for (i = wo_end = 0; i < to_pack.nr_objects; i++) { if (objects[i].tagged) break; @@ -769,7 +770,7 @@ static void write_pack_file(void) if (progress > pack_to_stdout) progress_state = start_progress(_("Writing objects"), nr_result); - written_list = xmalloc(to_pack.nr_objects * sizeof(*written_list)); + ALLOC_ARRAY(written_list, to_pack.nr_objects); write_order = compute_write_order(); do { @@ -2129,7 +2130,7 @@ static void prepare_pack(int window, int depth) if (!to_pack.nr_objects || !window || !depth) return; - delta_list = xmalloc(to_pack.nr_objects * sizeof(*delta_list)); + ALLOC_ARRAY(delta_list, to_pack.nr_objects); nr_deltas = n = 0; for (i = 0; i < to_pack.nr_objects; i++) { @@ -2284,21 +2285,11 @@ static void show_commit(struct commit *commit, void *data) index_commit_for_bitmap(commit); } -static void show_object(struct object *obj, - const struct name_path *path, const char *last, - void *data) +static void show_object(struct object *obj, const char *name, void *data) { - char *name = path_name(path, last); - add_preferred_base_object(name); add_object_entry(obj->oid.hash, obj->type, name, 0); obj->flags |= OBJECT_ADDED; - - /* - * We will have generated the hash from the name, - * but not saved a pointer to it - we can free it - */ - free((char *)name); } static void show_edge(struct commit *commit) @@ -2480,8 +2471,7 @@ static int get_object_list_from_bitmap(struct rev_info *revs) } static void record_recent_object(struct object *obj, - const struct name_path *path, - const char *last, + const char *name, void *data) { sha1_array_append(&recent_objects, obj->oid.hash); diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c index d0532f66b1..72c815844d 100644 --- a/builtin/pack-redundant.c +++ b/builtin/pack-redundant.c @@ -53,7 +53,7 @@ static inline struct llist_item *llist_item_get(void) free_nodes = free_nodes->next; } else { int i = 1; - new = xmalloc(sizeof(struct llist_item) * BLKSIZE); + ALLOC_ARRAY(new, BLKSIZE); for (; i < BLKSIZE; i++) llist_item_put(&new[i]); } diff --git a/builtin/pull.c b/builtin/pull.c index 9e3c73809f..10eff03967 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -22,7 +22,8 @@ enum rebase_type { REBASE_INVALID = -1, REBASE_FALSE = 0, REBASE_TRUE, - REBASE_PRESERVE + REBASE_PRESERVE, + REBASE_INTERACTIVE }; /** @@ -42,6 +43,8 @@ static enum rebase_type parse_config_rebase(const char *key, const char *value, return REBASE_TRUE; else if (!strcmp(value, "preserve")) return REBASE_PRESERVE; + else if (!strcmp(value, "interactive")) + return REBASE_INTERACTIVE; if (fatal) die(_("Invalid value for %s: %s"), key, value); @@ -113,7 +116,7 @@ static struct option pull_options[] = { /* Options passed to git-merge or git-rebase */ OPT_GROUP(N_("Options related to merging")), { OPTION_CALLBACK, 'r', "rebase", &opt_rebase, - "false|true|preserve", + "false|true|preserve|interactive", N_("incorporate changes by rebasing rather than merging"), PARSE_OPT_OPTARG, parse_opt_rebase }, OPT_PASSTHRU('n', NULL, &opt_diffstat, NULL, @@ -382,7 +385,7 @@ static void get_merge_heads(struct sha1_array *merge_heads) if (!(fp = fopen(filename, "r"))) die_errno(_("could not open '%s' for reading"), filename); - while (strbuf_getline(&sb, fp, '\n') != EOF) { + while (strbuf_getline_lf(&sb, fp) != EOF) { if (get_sha1_hex(sb.buf, sha1)) continue; /* invalid line: does not start with SHA1 */ if (starts_with(sb.buf + GIT_SHA1_HEXSZ, "\tnot-for-merge\t")) @@ -778,6 +781,8 @@ static int run_rebase(const unsigned char *curr_head, /* Options passed to git-rebase */ if (opt_rebase == REBASE_PRESERVE) argv_array_push(&args, "--preserve-merges"); + else if (opt_rebase == REBASE_INTERACTIVE) + argv_array_push(&args, "--interactive"); if (opt_diffstat) argv_array_push(&args, opt_diffstat); argv_array_pushv(&args, opt_strategies.argv); diff --git a/builtin/push.c b/builtin/push.c index 3bda430b6b..4e9e4dbab2 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -9,6 +9,7 @@ #include "transport.h" #include "parse-options.h" #include "submodule.h" +#include "submodule-config.h" #include "send-pack.h" static const char * const push_usage[] = { @@ -21,6 +22,8 @@ static int deleterefs; static const char *receivepack; static int verbosity; static int progress = -1; +static int recurse_submodules = RECURSE_SUBMODULES_DEFAULT; +static enum transport_family family; static struct push_cas_option cas; @@ -202,37 +205,6 @@ static void setup_push_current(struct remote *remote, struct branch *branch) add_refspec(branch->name); } -static char warn_unspecified_push_default_msg[] = -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 traditional behavior, use:\n" - "\n" - " git config --global push.default matching\n" - "\n" - "To squelch this message and adopt the new behavior now, use:\n" - "\n" - " git config --global push.default simple\n" - "\n" - "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" - "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" - "See 'git help config' and search for 'push.default' for further information.\n" - "(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)"); - -static void warn_unspecified_push_default_configuration(void) -{ - static int warn_once; - - if (warn_once++) - return; - warning("%s\n", _(warn_unspecified_push_default_msg)); -} - static int is_workflow_triangular(struct remote *remote) { struct remote *fetch_remote = remote_get(NULL); @@ -251,9 +223,6 @@ static void setup_default_push_refspecs(struct remote *remote) break; case PUSH_DEFAULT_UNSPECIFIED: - warn_unspecified_push_default_configuration(); - /* fallthru */ - case PUSH_DEFAULT_SIMPLE: if (triangular) setup_push_current(remote, branch); @@ -344,6 +313,7 @@ static int push_with_options(struct transport *transport, int flags) unsigned int reject_reasons; transport_set_verbosity(transport, verbosity, progress); + transport->family = family; if (receivepack) transport_set_option(transport, @@ -452,22 +422,14 @@ static int do_push(const char *repo, int flags) static int option_parse_recurse_submodules(const struct option *opt, const char *arg, int unset) { - int *flags = opt->value; + int *recurse_submodules = opt->value; - if (*flags & (TRANSPORT_RECURSE_SUBMODULES_CHECK | - TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND)) - die("%s can only be used once.", opt->long_name); - - if (arg) { - if (!strcmp(arg, "check")) - *flags |= TRANSPORT_RECURSE_SUBMODULES_CHECK; - else if (!strcmp(arg, "on-demand")) - *flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND; - else - die("bad %s argument: %s", opt->long_name, arg); - } else - die("option %s needs an argument (check|on-demand)", - opt->long_name); + if (unset) + *recurse_submodules = RECURSE_SUBMODULES_OFF; + else if (arg) + *recurse_submodules = parse_push_recurse_submodules_arg(opt->long_name, arg); + else + die("%s missing parameter", opt->long_name); return 0; } @@ -522,6 +484,10 @@ static int git_push_config(const char *k, const char *v, void *cb) return error("Invalid value for '%s'", k); } } + } else if (!strcmp(k, "push.recursesubmodules")) { + const char *value; + if (!git_config_get_value("push.recursesubmodules", &value)) + recurse_submodules = parse_push_recurse_submodules_arg(k, value); } return git_default_config(k, v, NULL); @@ -540,7 +506,7 @@ int cmd_push(int argc, const char **argv, const char *prefix) OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL), OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"), (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)), - OPT_BOOL( 0, "delete", &deleterefs, N_("delete refs")), + OPT_BOOL('d', "delete", &deleterefs, N_("delete refs")), OPT_BOOL( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")), OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN), OPT_BIT( 0, "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN), @@ -549,7 +515,7 @@ int cmd_push(int argc, const char **argv, const char *prefix) 0, CAS_OPT_NAME, &cas, N_("refname>:next) { + argv_array_push(&proc.args, hook); + for (cmd = commands; cmd; cmd = cmd->next) { if (cmd->error_string || cmd->did_not_exist) continue; - argv[argc] = xstrdup(cmd->ref_name); - argc++; + argv_array_push(&proc.args, cmd->ref_name); } - argv[argc] = NULL; proc.no_stdin = 1; proc.stdout_to_stderr = 1; proc.err = use_sideband ? -1 : 0; - proc.argv = argv; if (!start_command(&proc)) { if (use_sideband) @@ -1378,7 +1372,7 @@ static struct command **queue_command(struct command **tail, refname = line + 82; reflen = linelen - 82; - cmd = xcalloc(1, sizeof(struct command) + reflen + 1); + cmd = xcalloc(1, st_add3(sizeof(struct command), reflen, 1)); hashcpy(cmd->old_sha1, old_sha1); hashcpy(cmd->new_sha1, new_sha1); memcpy(cmd->ref_name, refname, reflen); @@ -1597,8 +1591,7 @@ static void prepare_shallow_update(struct command *commands, { int i, j, k, bitmap_size = (si->ref->nr + 31) / 32; - si->used_shallow = xmalloc(sizeof(*si->used_shallow) * - si->shallow->nr); + ALLOC_ARRAY(si->used_shallow, si->shallow->nr); assign_shallow_commits_to_refs(si, si->used_shallow, NULL); si->need_reachability_test = @@ -1618,7 +1611,7 @@ static void prepare_shallow_update(struct command *commands, continue; si->need_reachability_test[i]++; for (k = 0; k < 32; k++) - if (si->used_shallow[i][j] & (1 << k)) + if (si->used_shallow[i][j] & (1U << k)) si->shallow_ref[j * 32 + k]++; } @@ -1664,7 +1657,7 @@ static void update_shallow_info(struct command *commands, return; } - ref_status = xmalloc(sizeof(*ref_status) * ref->nr); + ALLOC_ARRAY(ref_status, ref->nr); assign_shallow_commits_to_refs(si, NULL, ref_status); for (cmd = commands; cmd; cmd = cmd->next) { if (is_null_sha1(cmd->new_sha1)) @@ -1796,6 +1789,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix) "gc", "--auto", "--quiet", NULL, }; int opt = RUN_GIT_CMD | RUN_COMMAND_STDOUT_TO_STDERR; + close_all_packs(); run_command_v_opt(argv_gc_auto, opt); } if (auto_update_server_info) diff --git a/builtin/reflog.c b/builtin/reflog.c index f39960e5e4..2d46b6482a 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -382,11 +382,9 @@ static int collect_reflog(const char *ref, const struct object_id *oid, int unus { struct collected_reflog *e; struct collect_reflog_cb *cb = cb_data; - size_t namelen = strlen(ref); - e = xmalloc(sizeof(*e) + namelen + 1); + FLEX_ALLOC_STR(e, reflog, ref); hashcpy(e->sha1, oid->hash); - memcpy(e->reflog, ref, namelen + 1); ALLOC_GROW(cb->e, cb->nr + 1, cb->alloc); cb->e[cb->nr++] = e; return 0; @@ -396,7 +394,6 @@ static struct reflog_expire_cfg { struct reflog_expire_cfg *next; unsigned long expire_total; unsigned long expire_unreachable; - size_t len; char pattern[FLEX_ARRAY]; } *reflog_expire_cfg, **reflog_expire_cfg_tail; @@ -408,13 +405,11 @@ static struct reflog_expire_cfg *find_cfg_ent(const char *pattern, size_t len) reflog_expire_cfg_tail = &reflog_expire_cfg; for (ent = reflog_expire_cfg; ent; ent = ent->next) - if (ent->len == len && - !memcmp(ent->pattern, pattern, len)) + if (!strncmp(ent->pattern, pattern, len) && + ent->pattern[len] == '\0') return ent; - ent = xcalloc(1, (sizeof(*ent) + len)); - memcpy(ent->pattern, pattern, len); - ent->len = len; + FLEX_ALLOC_MEM(ent, pattern, pattern, len); *reflog_expire_cfg_tail = ent; reflog_expire_cfg_tail = &(ent->next); return ent; diff --git a/builtin/remote-ext.c b/builtin/remote-ext.c index e3cd25d580..7457c743e8 100644 --- a/builtin/remote-ext.c +++ b/builtin/remote-ext.c @@ -114,30 +114,14 @@ static char *strip_escapes(const char *str, const char *service, } } -/* Should be enough... */ -#define MAXARGUMENTS 256 - -static const char **parse_argv(const char *arg, const char *service) +static void parse_argv(struct argv_array *out, const char *arg, const char *service) { - int arguments = 0; - int i; - const char **ret; - char *temparray[MAXARGUMENTS + 1]; - while (*arg) { - char *expanded; - if (arguments == MAXARGUMENTS) - die("remote-ext command has too many arguments"); - expanded = strip_escapes(arg, service, &arg); + char *expanded = strip_escapes(arg, service, &arg); if (expanded) - temparray[arguments++] = expanded; + argv_array_push(out, expanded); + free(expanded); } - - ret = xmalloc((arguments + 1) * sizeof(char *)); - for (i = 0; i < arguments; i++) - ret[i] = temparray[i]; - ret[arguments] = NULL; - return ret; } static void send_git_request(int stdin_fd, const char *serv, const char *repo, @@ -158,7 +142,7 @@ static int run_child(const char *arg, const char *service) child.in = -1; child.out = -1; child.err = 0; - child.argv = parse_argv(arg, service); + parse_argv(&child.args, arg, service); if (start_command(&child) < 0) die("Can't run specified command"); diff --git a/builtin/remote.c b/builtin/remote.c index 6694cf20ef..fda5c2e53d 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -108,8 +108,8 @@ enum { #define MIRROR_PUSH 2 #define MIRROR_BOTH (MIRROR_FETCH|MIRROR_PUSH) -static int add_branch(const char *key, const char *branchname, - const char *remotename, int mirror, struct strbuf *tmp) +static void add_branch(const char *key, const char *branchname, + const char *remotename, int mirror, struct strbuf *tmp) { strbuf_reset(tmp); strbuf_addch(tmp, '+'); @@ -119,7 +119,7 @@ static int add_branch(const char *key, const char *branchname, else strbuf_addf(tmp, "refs/heads/%s:refs/remotes/%s/%s", branchname, remotename, branchname); - return git_config_set_multivar(key, tmp->buf, "^$", 0); + git_config_set_multivar(key, tmp->buf, "^$", 0); } static const char mirror_advice[] = @@ -186,10 +186,7 @@ static int add(int argc, const char **argv) url = argv[1]; remote = remote_get(name); - if (remote && (remote->url_nr > 1 || - (strcmp(name, remote->url[0]) && - strcmp(url, remote->url[0])) || - remote->fetch_refspec_nr)) + if (remote_is_configured(remote)) die(_("remote %s already exists."), name); strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name); @@ -197,8 +194,7 @@ static int add(int argc, const char **argv) die(_("'%s' is not a valid remote name"), name); strbuf_addf(&buf, "remote.%s.url", name); - if (git_config_set(buf.buf, url)) - return 1; + git_config_set(buf.buf, url); if (!mirror || mirror & MIRROR_FETCH) { strbuf_reset(&buf); @@ -206,25 +202,22 @@ static int add(int argc, const char **argv) if (track.nr == 0) string_list_append(&track, "*"); for (i = 0; i < track.nr; i++) { - if (add_branch(buf.buf, track.items[i].string, - name, mirror, &buf2)) - return 1; + add_branch(buf.buf, track.items[i].string, + name, mirror, &buf2); } } if (mirror & MIRROR_PUSH) { strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.mirror", name); - if (git_config_set(buf.buf, "true")) - return 1; + git_config_set(buf.buf, "true"); } if (fetch_tags != TAGS_DEFAULT) { strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.tagopt", name); - if (git_config_set(buf.buf, - fetch_tags == TAGS_SET ? "--tags" : "--no-tags")) - return 1; + git_config_set(buf.buf, + fetch_tags == TAGS_SET ? "--tags" : "--no-tags"); } if (fetch && fetch_remote(name)) @@ -251,7 +244,7 @@ static int add(int argc, const char **argv) struct branch_info { char *remote_name; struct string_list merge; - int rebase; + enum { NO_REBASE, NORMAL_REBASE, INTERACTIVE_REBASE } rebase; }; static struct string_list branch_list; @@ -311,7 +304,9 @@ static int config_read_branches(const char *key, const char *value, void *cb) if (v >= 0) info->rebase = v; else if (!strcmp(value, "preserve")) - info->rebase = 1; + info->rebase = NORMAL_REBASE; + else if (!strcmp(value, "interactive")) + info->rebase = INTERACTIVE_REBASE; } } return 0; @@ -590,25 +585,20 @@ static int migrate_file(struct remote *remote) strbuf_addf(&buf, "remote.%s.url", remote->name); for (i = 0; i < remote->url_nr; i++) - if (git_config_set_multivar(buf.buf, remote->url[i], "^$", 0)) - return error(_("Could not append '%s' to '%s'"), - remote->url[i], buf.buf); + git_config_set_multivar(buf.buf, remote->url[i], "^$", 0); strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.push", remote->name); for (i = 0; i < remote->push_refspec_nr; i++) - if (git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0)) - return error(_("Could not append '%s' to '%s'"), - remote->push_refspec[i], buf.buf); + git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0); strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.fetch", remote->name); for (i = 0; i < remote->fetch_refspec_nr; i++) - if (git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0)) - return error(_("Could not append '%s' to '%s'"), - remote->fetch_refspec[i], buf.buf); + git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0); if (remote->origin == REMOTE_REMOTES) unlink_or_warn(git_path("remotes/%s", remote->name)); else if (remote->origin == REMOTE_BRANCHES) unlink_or_warn(git_path("branches/%s", remote->name)); + return 0; } @@ -632,14 +622,14 @@ static int mv(int argc, const char **argv) rename.remote_branches = &remote_branches; oldremote = remote_get(rename.old); - if (!oldremote) + if (!remote_is_configured(oldremote)) die(_("No such remote: %s"), rename.old); if (!strcmp(rename.old, rename.new) && oldremote->origin != REMOTE_CONFIG) return migrate_file(oldremote); newremote = remote_get(rename.new); - if (newremote && (newremote->url_nr > 1 || newremote->fetch_refspec_nr)) + if (remote_is_configured(newremote)) die(_("remote %s already exists."), rename.new); strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new); @@ -655,8 +645,7 @@ static int mv(int argc, const char **argv) strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.fetch", rename.new); - if (git_config_set_multivar(buf.buf, NULL, NULL, 1)) - return error(_("Could not remove config section '%s'"), buf.buf); + git_config_set_multivar(buf.buf, NULL, NULL, 1); strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old); for (i = 0; i < oldremote->fetch_refspec_nr; i++) { char *ptr; @@ -676,8 +665,7 @@ static int mv(int argc, const char **argv) "\tPlease update the configuration manually if necessary."), buf2.buf); - if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0)) - return error(_("Could not append '%s'"), buf.buf); + git_config_set_multivar(buf.buf, buf2.buf, "^$", 0); } read_branches(); @@ -687,9 +675,7 @@ static int mv(int argc, const char **argv) if (info->remote_name && !strcmp(info->remote_name, rename.old)) { strbuf_reset(&buf); strbuf_addf(&buf, "branch.%s.remote", item->string); - if (git_config_set(buf.buf, rename.new)) { - return error(_("Could not set '%s'"), buf.buf); - } + git_config_set(buf.buf, rename.new); } } @@ -771,7 +757,7 @@ static int rm(int argc, const char **argv) usage_with_options(builtin_remote_rm_usage, options); remote = remote_get(argv[1]); - if (!remote) + if (!remote_is_configured(remote)) die(_("No such remote: %s"), argv[1]); known_remotes.to_delete = remote; @@ -787,10 +773,7 @@ static int rm(int argc, const char **argv) strbuf_reset(&buf); strbuf_addf(&buf, "branch.%s.%s", item->string, *k); - if (git_config_set(buf.buf, NULL)) { - strbuf_release(&buf); - return -1; - } + git_config_set(buf.buf, NULL); } } } @@ -980,7 +963,9 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data) printf(" %-*s ", show_info->width, item->string); if (branch_info->rebase) { - printf_ln(_("rebases onto remote %s"), merge->items[0].string); + printf_ln(_(branch_info->rebase == INTERACTIVE_REBASE ? + "rebases interactively onto remote %s" : + "rebases onto remote %s"), merge->items[0].string); return 0; } else if (show_info->any_rebase) { printf_ln(_(" merges with remote %s"), merge->items[0].string); @@ -1409,24 +1394,20 @@ static int update(int argc, const char **argv) static int remove_all_fetch_refspecs(const char *remote, const char *key) { - return git_config_set_multivar(key, NULL, NULL, 1); + return git_config_set_multivar_gently(key, NULL, NULL, 1); } -static int add_branches(struct remote *remote, const char **branches, - const char *key) +static void add_branches(struct remote *remote, const char **branches, + const char *key) { const char *remotename = remote->name; int mirror = remote->mirror; struct strbuf refspec = STRBUF_INIT; for (; *branches; branches++) - if (add_branch(key, *branches, remotename, mirror, &refspec)) { - strbuf_release(&refspec); - return 1; - } + add_branch(key, *branches, remotename, mirror, &refspec); strbuf_release(&refspec); - return 0; } static int set_remote_branches(const char *remotename, const char **branches, @@ -1437,18 +1418,15 @@ static int set_remote_branches(const char *remotename, const char **branches, strbuf_addf(&key, "remote.%s.fetch", remotename); - if (!remote_is_configured(remotename)) - die(_("No such remote '%s'"), remotename); remote = remote_get(remotename); + if (!remote_is_configured(remote)) + die(_("No such remote '%s'"), remotename); if (!add_mode && remove_all_fetch_refspecs(remotename, key.buf)) { strbuf_release(&key); return 1; } - if (add_branches(remote, branches, key.buf)) { - strbuf_release(&key); - return 1; - } + add_branches(remote, branches, key.buf); strbuf_release(&key); return 0; @@ -1494,9 +1472,9 @@ static int get_url(int argc, const char **argv) remotename = argv[0]; - if (!remote_is_configured(remotename)) - die(_("No such remote '%s'"), remotename); remote = remote_get(remotename); + if (!remote_is_configured(remote)) + die(_("No such remote '%s'"), remotename); url_nr = 0; if (push_mode) { @@ -1562,9 +1540,9 @@ static int set_url(int argc, const char **argv) if (delete_mode) oldurl = newurl; - if (!remote_is_configured(remotename)) - die(_("No such remote '%s'"), remotename); remote = remote_get(remotename); + if (!remote_is_configured(remote)) + die(_("No such remote '%s'"), remotename); if (push_mode) { strbuf_addf(&name_buf, "remote.%s.pushurl", remotename); @@ -1580,10 +1558,11 @@ static int set_url(int argc, const char **argv) if ((!oldurl && !delete_mode) || add_mode) { if (add_mode) git_config_set_multivar(name_buf.buf, newurl, - "^$", 0); + "^$", 0); else git_config_set(name_buf.buf, newurl); strbuf_release(&name_buf); + return 0; } diff --git a/builtin/repack.c b/builtin/repack.c index 945611006a..858db38f52 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -266,7 +266,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix) return ret; out = xfdopen(cmd.out, "r"); - while (strbuf_getline(&line, out, '\n') != EOF) { + while (strbuf_getline_lf(&line, out) != EOF) { if (line.len != 40) die("repack: Expecting 40 character sha1 lines only from pack-objects."); string_list_append(&names, line.buf); diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 3aa89a1a3c..275da0d647 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -177,9 +177,7 @@ static void finish_commit(struct commit *commit, void *data) free_commit_buffer(commit); } -static void finish_object(struct object *obj, - const struct name_path *path, const char *name, - void *cb_data) +static void finish_object(struct object *obj, const char *name, void *cb_data) { struct rev_list_info *info = cb_data; if (obj->type == OBJ_BLOB && !has_object_file(&obj->oid)) @@ -188,15 +186,13 @@ static void finish_object(struct object *obj, parse_object(obj->oid.hash); } -static void show_object(struct object *obj, - const struct name_path *path, const char *component, - void *cb_data) +static void show_object(struct object *obj, const char *name, void *cb_data) { struct rev_list_info *info = cb_data; - finish_object(obj, path, component, cb_data); + finish_object(obj, name, cb_data); if (info->flags & REV_LIST_QUIET) return; - show_object_with_name(stdout, obj, path, component); + show_object_with_name(stdout, obj, name); } static void show_edge(struct commit *commit) diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 7e074aad40..cf8487b3b9 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -383,7 +383,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) /* get the usage up to the first line with a -- on it */ for (;;) { - if (strbuf_getline(&sb, stdin, '\n') == EOF) + if (strbuf_getline(&sb, stdin) == EOF) die("premature end of input"); ALLOC_GROW(usage, unb + 1, usz); if (!strcmp("--", sb.buf)) { @@ -396,7 +396,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) } /* parse: (|,|)[*=?!]*? SP+ */ - while (strbuf_getline(&sb, stdin, '\n') != EOF) { + while (strbuf_getline(&sb, stdin) != EOF) { const char *s; const char *help; struct option *o; @@ -763,7 +763,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) continue; } if (!strcmp(arg, "--git-common-dir")) { - puts(get_git_common_dir()); + const char *pfx = prefix ? prefix : ""; + puts(prefix_filename(pfx, strlen(pfx), get_git_common_dir())); continue; } if (!strcmp(arg, "--resolve-git-dir")) { diff --git a/builtin/rm.c b/builtin/rm.c index 80b972f92f..8829b09d0b 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -211,7 +211,7 @@ static int check_local_mod(unsigned char *head, int index_only) * "intent to add" entry. */ if (local_changes && staged_changes) { - if (!index_only || !(ce->ce_flags & CE_INTENT_TO_ADD)) + if (!index_only || !ce_intent_to_add(ce)) string_list_append(&files_staged, name); } else if (!index_only) { diff --git a/builtin/send-pack.c b/builtin/send-pack.c index f6e5d643c1..5b9dd6a9d8 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -212,7 +212,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) argv_array_push(&all_refspecs, buf); } else { struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, stdin, '\n') != EOF) + while (strbuf_getline(&line, stdin) != EOF) argv_array_push(&all_refspecs, line.buf); strbuf_release(&line); } diff --git a/builtin/shortlog.c b/builtin/shortlog.c index 35ebd17f80..bfc082e584 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -14,7 +14,26 @@ static char const * const shortlog_usage[] = { NULL }; -static int compare_by_number(const void *a1, const void *a2) +/* + * The util field of our string_list_items will contain one of two things: + * + * - if --summary is not in use, it will point to a string list of the + * oneline subjects assigned to this author + * + * - if --summary is in use, we don't need that list; we only need to know + * its size. So we abuse the pointer slot to store our integer counter. + * + * This macro accesses the latter. + */ +#define UTIL_TO_INT(x) ((intptr_t)(x)->util) + +static int compare_by_counter(const void *a1, const void *a2) +{ + const struct string_list_item *i1 = a1, *i2 = a2; + return UTIL_TO_INT(i2) - UTIL_TO_INT(i1); +} + +static int compare_by_list(const void *a1, const void *a2) { const struct string_list_item *i1 = a1, *i2 = a2; const struct string_list *l1 = i1->util, *l2 = i2->util; @@ -31,13 +50,9 @@ static void insert_one_record(struct shortlog *log, const char *author, const char *oneline) { - const char *dot3 = log->common_repo_prefix; - char *buffer, *p; struct string_list_item *item; const char *mailbuf, *namebuf; size_t namelen, maillen; - const char *eol; - struct strbuf subject = STRBUF_INIT; struct strbuf namemailbuf = STRBUF_INIT; struct ident_split ident; @@ -56,98 +71,95 @@ static void insert_one_record(struct shortlog *log, strbuf_addf(&namemailbuf, " <%.*s>", (int)maillen, mailbuf); item = string_list_insert(&log->list, namemailbuf.buf); - if (item->util == NULL) - item->util = xcalloc(1, sizeof(struct string_list)); - /* Skip any leading whitespace, including any blank lines. */ - while (*oneline && isspace(*oneline)) - oneline++; - eol = strchr(oneline, '\n'); - if (!eol) - eol = oneline + strlen(oneline); - if (starts_with(oneline, "[PATCH")) { - char *eob = strchr(oneline, ']'); - if (eob && (!eol || eob < eol)) - oneline = eob + 1; - } - while (*oneline && isspace(*oneline) && *oneline != '\n') - oneline++; - format_subject(&subject, oneline, " "); - buffer = strbuf_detach(&subject, NULL); + if (log->summary) + item->util = (void *)(UTIL_TO_INT(item) + 1); + else { + const char *dot3 = log->common_repo_prefix; + char *buffer, *p; + struct strbuf subject = STRBUF_INIT; + const char *eol; - if (dot3) { - int dot3len = strlen(dot3); - if (dot3len > 5) { - while ((p = strstr(buffer, dot3)) != NULL) { - int taillen = strlen(p) - dot3len; - memcpy(p, "/.../", 5); - memmove(p + 5, p + dot3len, taillen + 1); + /* Skip any leading whitespace, including any blank lines. */ + while (*oneline && isspace(*oneline)) + oneline++; + eol = strchr(oneline, '\n'); + if (!eol) + eol = oneline + strlen(oneline); + if (starts_with(oneline, "[PATCH")) { + char *eob = strchr(oneline, ']'); + if (eob && (!eol || eob < eol)) + oneline = eob + 1; + } + while (*oneline && isspace(*oneline) && *oneline != '\n') + oneline++; + format_subject(&subject, oneline, " "); + buffer = strbuf_detach(&subject, NULL); + + if (dot3) { + int dot3len = strlen(dot3); + if (dot3len > 5) { + while ((p = strstr(buffer, dot3)) != NULL) { + int taillen = strlen(p) - dot3len; + memcpy(p, "/.../", 5); + memmove(p + 5, p + dot3len, taillen + 1); + } } } - } - string_list_append(item->util, buffer); + if (item->util == NULL) + item->util = xcalloc(1, sizeof(struct string_list)); + string_list_append(item->util, buffer); + } } static void read_from_stdin(struct shortlog *log) { - char author[1024], oneline[1024]; + struct strbuf author = STRBUF_INIT; + struct strbuf oneline = STRBUF_INIT; - while (fgets(author, sizeof(author), stdin) != NULL) { - if (!(author[0] == 'A' || author[0] == 'a') || - !starts_with(author + 1, "uthor: ")) + while (strbuf_getline_lf(&author, stdin) != EOF) { + const char *v; + if (!skip_prefix(author.buf, "Author: ", &v) && + !skip_prefix(author.buf, "author ", &v)) continue; - while (fgets(oneline, sizeof(oneline), stdin) && - oneline[0] != '\n') + while (strbuf_getline_lf(&oneline, stdin) != EOF && + oneline.len) ; /* discard headers */ - while (fgets(oneline, sizeof(oneline), stdin) && - oneline[0] == '\n') + while (strbuf_getline_lf(&oneline, stdin) != EOF && + !oneline.len) ; /* discard blanks */ - insert_one_record(log, author + 8, oneline); + insert_one_record(log, v, oneline.buf); } + strbuf_release(&author); + strbuf_release(&oneline); } void shortlog_add_commit(struct shortlog *log, struct commit *commit) { - const char *author = NULL, *buffer; - struct strbuf buf = STRBUF_INIT; - struct strbuf ufbuf = STRBUF_INIT; + struct strbuf author = STRBUF_INIT; + struct strbuf oneline = STRBUF_INIT; + struct pretty_print_context ctx = {0}; - pp_commit_easy(CMIT_FMT_RAW, commit, &buf); - buffer = buf.buf; - while (*buffer && *buffer != '\n') { - const char *eol = strchr(buffer, '\n'); + ctx.fmt = CMIT_FMT_USERFORMAT; + ctx.abbrev = log->abbrev; + ctx.subject = ""; + ctx.after_subject = ""; + ctx.date_mode.type = DATE_NORMAL; + ctx.output_encoding = get_log_output_encoding(); - if (eol == NULL) - eol = buffer + strlen(buffer); + format_commit_message(commit, "%an <%ae>", &author, &ctx); + if (!log->summary) { + if (log->user_format) + pretty_print_commit(&ctx, commit, &oneline); else - eol++; + format_commit_message(commit, "%s", &oneline, &ctx); + } - if (starts_with(buffer, "author ")) - author = buffer + 7; - buffer = eol; - } - if (!author) { - warning(_("Missing author: %s"), - oid_to_hex(&commit->object.oid)); - return; - } - if (log->user_format) { - struct pretty_print_context ctx = {0}; - ctx.fmt = CMIT_FMT_USERFORMAT; - ctx.abbrev = log->abbrev; - ctx.subject = ""; - ctx.after_subject = ""; - ctx.date_mode.type = DATE_NORMAL; - ctx.output_encoding = get_log_output_encoding(); - pretty_print_commit(&ctx, commit, &ufbuf); - buffer = ufbuf.buf; - } else if (*buffer) { - buffer++; - } - insert_one_record(log, author, !*buffer ? "" : buffer); - strbuf_release(&ufbuf); - strbuf_release(&buf); + insert_one_record(log, author.buf, oneline.len ? oneline.buf : ""); + + strbuf_release(&author); + strbuf_release(&oneline); } static void get_from_rev(struct rev_info *rev, struct shortlog *log) @@ -294,14 +306,14 @@ void shortlog_output(struct shortlog *log) if (log->sort_by_number) qsort(log->list.items, log->list.nr, sizeof(struct string_list_item), - compare_by_number); + log->summary ? compare_by_counter : compare_by_list); for (i = 0; i < log->list.nr; i++) { - struct string_list *onelines = log->list.items[i].util; - + const struct string_list_item *item = &log->list.items[i]; if (log->summary) { - printf("%6d\t%s\n", onelines->nr, log->list.items[i].string); + printf("%6d\t%s\n", (int)UTIL_TO_INT(item), item->string); } else { - printf("%s (%d):\n", log->list.items[i].string, onelines->nr); + struct string_list *onelines = item->util; + printf("%s (%d):\n", item->string, onelines->nr); for (j = onelines->nr - 1; j >= 0; j--) { const char *msg = onelines->items[j].string; @@ -314,11 +326,11 @@ void shortlog_output(struct shortlog *log) printf(" %s\n", msg); } putchar('\n'); + onelines->strdup_strings = 1; + string_list_clear(onelines, 0); + free(onelines); } - onelines->strdup_strings = 1; - string_list_clear(onelines, 0); - free(onelines); log->list.items[i].util = NULL; } diff --git a/builtin/stripspace.c b/builtin/stripspace.c index 7ff8434f7c..15e716ef43 100644 --- a/builtin/stripspace.c +++ b/builtin/stripspace.c @@ -35,7 +35,7 @@ int cmd_stripspace(int argc, const char **argv, const char *prefix) N_("skip and remove all lines starting with comment character"), STRIP_COMMENTS), OPT_CMDMODE('c', "comment-lines", &mode, - N_("prepend comment character and blank to each line"), + N_("prepend comment character and space to each line"), COMMENT_LINES), OPT_END() }; diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index a39ad1be99..864dd18786 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -22,17 +22,12 @@ static int module_list_compute(int argc, const char **argv, struct module_list *list) { int i, result = 0; - char *max_prefix, *ps_matched = NULL; - int max_prefix_len; + char *ps_matched = NULL; parse_pathspec(pathspec, 0, PATHSPEC_PREFER_FULL | PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP, prefix, argv); - /* Find common prefix for all pathspec's */ - max_prefix = common_prefix(pathspec); - max_prefix_len = max_prefix ? strlen(max_prefix) : 0; - if (pathspec->nr) ps_matched = xcalloc(pathspec->nr, 1); @@ -42,9 +37,9 @@ static int module_list_compute(int argc, const char **argv, for (i = 0; i < active_nr; i++) { const struct cache_entry *ce = active_cache[i]; - if (!S_ISGITLINK(ce->ce_mode) || - !match_pathspec(pathspec, ce->name, ce_namelen(ce), - max_prefix_len, ps_matched, 1)) + if (!match_pathspec(pathspec, ce->name, ce_namelen(ce), + 0, ps_matched, 1) || + !S_ISGITLINK(ce->ce_mode)) continue; ALLOC_GROW(list->entries, list->nr + 1, list->alloc); @@ -57,7 +52,6 @@ static int module_list_compute(int argc, const char **argv, */ i++; } - free(max_prefix); if (ps_matched && report_path_error(ps_matched, pathspec, prefix)) result = -1; diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index ce0fde705c..9c29a64e43 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -67,7 +67,7 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) if (!strcmp(argv[0], "HEAD") && !starts_with(argv[1], "refs/")) die("Refusing to point HEAD outside of refs/"); - create_symref(argv[0], argv[1], msg); + ret = !!create_symref(argv[0], argv[1], msg); break; default: usage_with_options(git_symbolic_ref_usage, options); diff --git a/builtin/tag.c b/builtin/tag.c index 8db8c87e57..1705c94665 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -44,11 +44,11 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, con if (!format) { if (filter->lines) { to_free = xstrfmt("%s %%(contents:lines=%d)", - "%(align:15)%(refname:short)%(end)", + "%(align:15)%(refname:strip=2)%(end)", filter->lines); format = to_free; } else - format = "%(refname:short)"; + format = "%(refname:strip=2)"; } verify_ref_format(format); diff --git a/builtin/update-index.c b/builtin/update-index.c index 7431938fa6..1c94ca59bf 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -35,6 +35,15 @@ static int mark_skip_worktree_only; #define UNMARK_FLAG 2 static struct strbuf mtime_dir = STRBUF_INIT; +/* Untracked cache mode */ +enum uc_mode { + UC_UNSPECIFIED = -1, + UC_DISABLE = 0, + UC_ENABLE, + UC_TEST, + UC_FORCE +}; + __attribute__((format (printf, 1, 2))) static void report(const char *fmt, ...) { @@ -121,7 +130,7 @@ static int test_if_untracked_cache_is_supported(void) if (!mkdtemp(mtime_dir.buf)) die_errno("Could not make temporary directory"); - fprintf(stderr, _("Testing ")); + fprintf(stderr, _("Testing mtime in '%s' "), xgetcwd()); atexit(remove_test_directory); xstat_mtime_dir(&st); fill_stat_data(&base, &st); @@ -468,12 +477,14 @@ static void update_one(const char *path) report("add '%s'", path); } -static void read_index_info(int line_termination) +static void read_index_info(int nul_term_line) { struct strbuf buf = STRBUF_INIT; struct strbuf uq = STRBUF_INIT; + strbuf_getline_fn getline_fn; - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; + while (getline_fn(&buf, stdin) != EOF) { char *ptr, *tab; char *path_name; unsigned char sha1[20]; @@ -522,7 +533,7 @@ static void read_index_info(int line_termination) goto bad_line; path_name = ptr; - if (line_termination && path_name[0] == '"') { + if (!nul_term_line && path_name[0] == '"') { strbuf_reset(&uq); if (unquote_c_style(&uq, path_name, NULL)) { die("git update-index: bad quoting of path name"); @@ -844,12 +855,12 @@ static int cacheinfo_callback(struct parse_opt_ctx_t *ctx, static int stdin_cacheinfo_callback(struct parse_opt_ctx_t *ctx, const struct option *opt, int unset) { - int *line_termination = opt->value; + int *nul_term_line = opt->value; if (ctx->argc != 1) return error("option '%s' must be the last argument", opt->long_name); allow_add = allow_replace = allow_remove = 1; - read_index_info(*line_termination); + read_index_info(*nul_term_line); return 0; } @@ -901,8 +912,8 @@ static int reupdate_callback(struct parse_opt_ctx_t *ctx, int cmd_update_index(int argc, const char **argv, const char *prefix) { - int newfd, entries, has_errors = 0, line_termination = '\n'; - int untracked_cache = -1; + int newfd, entries, has_errors = 0, nul_term_line = 0; + enum uc_mode untracked_cache = UC_UNSPECIFIED; int read_from_stdin = 0; int prefix_length = prefix ? strlen(prefix) : 0; int preferred_index_format = 0; @@ -912,6 +923,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) int split_index = -1; struct lock_file *lock_file; struct parse_opt_ctx_t ctx; + strbuf_getline_fn getline_fn; int parseopt_state = PARSE_OPT_UNKNOWN; struct option options[] = { OPT_BIT('q', NULL, &refresh_args.flags, @@ -963,13 +975,13 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) N_("add to index only; do not add content to object database"), 1), OPT_SET_INT(0, "force-remove", &force_remove, N_("remove named paths even if present in worktree"), 1), - OPT_SET_INT('z', NULL, &line_termination, - N_("with --stdin: input lines are terminated by null bytes"), '\0'), + OPT_BOOL('z', NULL, &nul_term_line, + N_("with --stdin: input lines are terminated by null bytes")), {OPTION_LOWLEVEL_CALLBACK, 0, "stdin", &read_from_stdin, NULL, N_("read list of paths to be updated from standard input"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) stdin_callback}, - {OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &line_termination, NULL, + {OPTION_LOWLEVEL_CALLBACK, 0, "index-info", &nul_term_line, NULL, N_("add entries from standard input to the index"), PARSE_OPT_NONEG | PARSE_OPT_NOARG, (parse_opt_cb *) stdin_cacheinfo_callback}, @@ -996,8 +1008,10 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) N_("enable or disable split index")), OPT_BOOL(0, "untracked-cache", &untracked_cache, N_("enable/disable untracked cache")), + OPT_SET_INT(0, "test-untracked-cache", &untracked_cache, + N_("test if the filesystem supports untracked cache"), UC_TEST), OPT_SET_INT(0, "force-untracked-cache", &untracked_cache, - N_("enable untracked cache without testing the filesystem"), 2), + N_("enable untracked cache without testing the filesystem"), UC_FORCE), OPT_END() }; @@ -1057,6 +1071,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) } } argc = parse_options_end(&ctx); + + getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; if (preferred_index_format) { if (preferred_index_format < INDEX_FORMAT_LB || INDEX_FORMAT_UB < preferred_index_format) @@ -1070,16 +1086,17 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) } if (read_from_stdin) { - struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; + struct strbuf buf = STRBUF_INIT; + struct strbuf unquoted = STRBUF_INIT; setup_work_tree(); - while (strbuf_getline(&buf, stdin, line_termination) != EOF) { + while (getline_fn(&buf, stdin) != EOF) { char *p; - if (line_termination && buf.buf[0] == '"') { - strbuf_reset(&nbuf); - if (unquote_c_style(&nbuf, buf.buf, NULL)) + if (!nul_term_line && buf.buf[0] == '"') { + strbuf_reset(&unquoted); + if (unquote_c_style(&unquoted, buf.buf, NULL)) die("line is badly quoted"); - strbuf_swap(&buf, &nbuf); + strbuf_swap(&buf, &unquoted); } p = prefix_path(prefix, prefix_length, buf.buf); update_one(p); @@ -1087,7 +1104,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) chmod_path(set_executable_bit, p); free(p); } - strbuf_release(&nbuf); + strbuf_release(&unquoted); strbuf_release(&buf); } @@ -1104,27 +1121,32 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) the_index.split_index = NULL; the_index.cache_changed |= SOMETHING_CHANGED; } - if (untracked_cache > 0) { - struct untracked_cache *uc; - if (untracked_cache < 2) { - setup_work_tree(); - if (!test_if_untracked_cache_is_supported()) - return 1; - } - if (!the_index.untracked) { - uc = xcalloc(1, sizeof(*uc)); - strbuf_init(&uc->ident, 100); - uc->exclude_per_dir = ".gitignore"; - /* should be the same flags used by git-status */ - uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; - the_index.untracked = uc; - } - add_untracked_ident(the_index.untracked); - the_index.cache_changed |= UNTRACKED_CHANGED; - } else if (!untracked_cache && the_index.untracked) { - the_index.untracked = NULL; - the_index.cache_changed |= UNTRACKED_CHANGED; + switch (untracked_cache) { + case UC_UNSPECIFIED: + break; + case UC_DISABLE: + if (git_config_get_untracked_cache() == 1) + warning("core.untrackedCache is set to true; " + "remove or change it, if you really want to " + "disable the untracked cache"); + remove_untracked_cache(&the_index); + report(_("Untracked cache disabled")); + break; + case UC_TEST: + setup_work_tree(); + return !test_if_untracked_cache_is_supported(); + case UC_ENABLE: + case UC_FORCE: + if (git_config_get_untracked_cache() == 0) + warning("core.untrackedCache is set to false; " + "remove or change it, if you really want to " + "enable the untracked cache"); + add_untracked_cache(&the_index); + report(_("Untracked cache enabled for '%s'"), get_git_work_tree()); + break; + default: + die("Bug: bad untracked_cache value: %d", untracked_cache); } if (active_cache_changed) { diff --git a/builtin/worktree.c b/builtin/worktree.c index 475b9581a5..38b56096bd 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -52,7 +52,7 @@ static int prune_worktree(const char *id, struct strbuf *reason) return 1; } len = st.st_size; - path = xmalloc(len + 1); + path = xmallocz(len); read_in_full(fd, path, len); close(fd); while (len && (path[len - 1] == '\n' || path[len - 1] == '\r')) @@ -201,9 +201,7 @@ static int add_worktree(const char *path, const char *refname, die(_("'%s' already exists"), path); /* is 'refname' a branch or commit? */ - if (opts->force_new_branch) /* definitely a branch */ - ; - else if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) && + if (!opts->detach && !strbuf_check_branch_ref(&symref, refname) && ref_exists(symref.buf)) { /* it's a branch */ if (!opts->force) die_if_checked_out(symref.buf); @@ -336,9 +334,18 @@ static int add(int ac, const char **av, const char *prefix) branch = ac < 2 ? "HEAD" : av[1]; opts.force_new_branch = !!new_branch_force; - if (opts.force_new_branch) + if (opts.force_new_branch) { + struct strbuf symref = STRBUF_INIT; + opts.new_branch = new_branch_force; + if (!opts.force && + !strbuf_check_branch_ref(&symref, opts.new_branch) && + ref_exists(symref.buf)) + die_if_checked_out(symref.buf); + strbuf_release(&symref); + } + if (ac < 2 && !opts.new_branch && !opts.detach) { int n; const char *s = worktree_basename(path, &n); diff --git a/cache-tree.c b/cache-tree.c index a59e6f1e1f..3ebf9c3aa4 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -79,11 +79,9 @@ static struct cache_tree_sub *find_subtree(struct cache_tree *it, ALLOC_GROW(it->down, it->subtree_nr + 1, it->subtree_alloc); it->subtree_nr++; - down = xmalloc(sizeof(*down) + pathlen + 1); + FLEX_ALLOC_MEM(down, name, path, pathlen); down->cache_tree = NULL; down->namelen = pathlen; - memcpy(down->name, path, pathlen); - down->name[pathlen] = 0; if (pos < it->subtree_nr) memmove(it->down + pos + 1, @@ -377,7 +375,7 @@ static int update_one(struct cache_tree *it, * they are not part of generated trees. Invalidate up * to root to force cache-tree users to read elsewhere. */ - if (ce->ce_flags & CE_INTENT_TO_ADD) { + if (ce_intent_to_add(ce)) { to_invalidate = 1; continue; } diff --git a/cache.h b/cache.h index 5ab6cb50a6..b829410f6d 100644 --- a/cache.h +++ b/cache.h @@ -9,6 +9,7 @@ #include "convert.h" #include "trace.h" #include "string-list.h" +#include "pack-revindex.h" #include SHA1_HEADER #ifndef platform_SHA_CTX @@ -214,7 +215,7 @@ struct cache_entry { #define CE_INTENT_TO_ADD (1 << 29) #define CE_SKIP_WORKTREE (1 << 30) /* CE_EXTENDED2 is for future extension */ -#define CE_EXTENDED2 (1 << 31) +#define CE_EXTENDED2 (1U << 31) #define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD | CE_SKIP_WORKTREE) @@ -228,7 +229,9 @@ struct cache_entry { #error "CE_EXTENDED_FLAGS out of range" #endif +/* Forward structure decls */ struct pathspec; +struct child_process; /* * Copy the sha1 and stat state of a cache entry from one to @@ -259,6 +262,7 @@ static inline unsigned create_ce_flags(unsigned stage) #define ce_uptodate(ce) ((ce)->ce_flags & CE_UPTODATE) #define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE) #define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE) +#define ce_intent_to_add(ce) ((ce)->ce_flags & CE_INTENT_TO_ADD) #define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644) static inline unsigned int create_ce_mode(unsigned int mode) @@ -456,7 +460,6 @@ extern char *git_work_tree_cfg; extern int is_inside_work_tree(void); extern const char *get_git_dir(void); extern const char *get_git_common_dir(void); -extern int is_git_directory(const char *path); extern char *get_object_directory(void); extern char *get_index_file(void); extern char *get_graft_file(void); @@ -467,6 +470,25 @@ extern const char *get_git_namespace(void); extern const char *strip_namespace(const char *namespaced_ref); extern const char *get_git_work_tree(void); +/* + * Return true if the given path is a git directory; note that this _just_ + * looks at the directory itself. If you want to know whether "foo/.git" + * is a repository, you must feed that path, not just "foo". + */ +extern int is_git_directory(const char *path); + +/* + * Return 1 if the given path is the root of a git repository or + * submodule, else 0. Will not return 1 for bare repositories with the + * exception of creating a bare repository in "foo/.git" and calling + * is_git_repository("foo"). + * + * If we run into read errors, we err on the side of saying "yes, it is", + * as we usually consider sub-repos precious, and would prefer to err on the + * side of not disrupting or deleting them. + */ +extern int is_nonbare_repository_dir(struct strbuf *path); + #define READ_GITFILE_ERR_STAT_FAILED 1 #define READ_GITFILE_ERR_NOT_A_FILE 2 #define READ_GITFILE_ERR_OPEN_FAILED 3 @@ -831,6 +853,7 @@ extern const char *find_unique_abbrev(const unsigned char *sha1, int len); extern int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len); extern const unsigned char null_sha1[GIT_SHA1_RAWSZ]; +extern const struct object_id null_oid; static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2) { @@ -1298,6 +1321,7 @@ extern struct packed_git { freshened:1, do_not_close:1; unsigned char sha1[20]; + struct revindex_entry *revindex; /* something like ".git/objects/pack/xxxxx.pack" */ char pack_name[FLEX_ARRAY]; /* more */ } *packed_git; @@ -1345,6 +1369,16 @@ extern void free_pack_by_name(const char *); extern void clear_delta_base_cache(void); extern struct packed_git *add_packed_git(const char *path, size_t path_len, int local); +/* + * Make sure that a pointer access into an mmap'd index file is within bounds, + * and can provide at least 8 bytes of data. + * + * Note that this is only necessary for variable-length segments of the file + * (like the 64-bit extended offset table), as we compare the size to the + * fixed-length parts when we open the file. + */ +extern void check_pack_index_ptr(const struct packed_git *p, const void *ptr); + /* * Return the SHA-1 of the nth object within the specified packfile. * Open the index if it is not already open. The return value points @@ -1465,7 +1499,7 @@ extern int update_server_info(int); /* git_config_parse_key() returns these negated: */ #define CONFIG_INVALID_KEY 1 #define CONFIG_NO_SECTION_OR_NAME 2 -/* git_config_set(), git_config_set_multivar() return the above or these: */ +/* git_config_set_gently(), git_config_set_multivar_gently() return the above or these: */ #define CONFIG_NO_LOCK -1 #define CONFIG_INVALID_FILE 3 #define CONFIG_NO_WRITE 4 @@ -1484,8 +1518,8 @@ struct git_config_source { typedef int (*config_fn_t)(const char *, const char *, void *); extern int git_default_config(const char *, const char *, void *); extern int git_config_from_file(config_fn_t fn, const char *, void *); -extern int git_config_from_buf(config_fn_t fn, const char *name, - const char *buf, size_t len, void *data); +extern int git_config_from_mem(config_fn_t fn, const char *origin_type, + const char *name, const char *buf, size_t len, void *data); extern void git_config_push_parameter(const char *text); extern int git_config_from_parameters(config_fn_t fn, void *data); extern void git_config(config_fn_t fn, void *); @@ -1503,12 +1537,16 @@ extern int git_config_bool(const char *, const char *); extern int git_config_maybe_bool(const char *, const char *); extern int git_config_string(const char **, const char *, const char *); extern int git_config_pathname(const char **, const char *, const char *); -extern int git_config_set_in_file(const char *, const char *, const char *); -extern int git_config_set(const char *, const char *); +extern int git_config_set_in_file_gently(const char *, const char *, const char *); +extern void git_config_set_in_file(const char *, const char *, const char *); +extern int git_config_set_gently(const char *, const char *); +extern void git_config_set(const char *, const char *); extern int git_config_parse_key(const char *, char **, int *); extern int git_config_key_is_valid(const char *key); -extern int git_config_set_multivar(const char *, const char *, const char *, int); -extern int git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int); +extern int git_config_set_multivar_gently(const char *, const char *, const char *, int); +extern void git_config_set_multivar(const char *, const char *, const char *, int); +extern int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, int); +extern void git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int); extern int git_config_rename_section(const char *, const char *); extern int git_config_rename_section_in_file(const char *, const char *, const char *); extern const char *git_etc_gitconfig(void); @@ -1524,6 +1562,8 @@ extern const char *get_log_output_encoding(void); extern const char *get_commit_output_encoding(void); extern int git_config_parse_parameter(const char *, config_fn_t fn, void *data); +extern const char *current_config_origin_type(void); +extern const char *current_config_name(void); struct config_include_data { int depth; @@ -1602,6 +1642,14 @@ extern int git_config_get_bool(const char *key, int *dest); extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest); extern int git_config_get_maybe_bool(const char *key, int *dest); extern int git_config_get_pathname(const char *key, const char **dest); +extern int git_config_get_untracked_cache(void); + +/* + * This is a hack for test programs like test-dump-untracked-cache to + * ensure that they do not modify the untracked cache when reading it. + * Do not use it otherwise! + */ +extern int ignore_untracked_cache_config; struct key_value_info { const char *filename; @@ -1655,6 +1703,7 @@ extern int pager_use_color; extern int term_columns(void); extern int decimal_width(uintmax_t); extern int check_pager_config(const char *cmd); +extern void prepare_pager_args(struct child_process *, const char *pager); extern const char *editor_program; extern const char *askpass_program; diff --git a/column.c b/column.c index 786abe62b0..d55ead18ef 100644 --- a/column.c +++ b/column.c @@ -164,7 +164,7 @@ static void display_table(const struct string_list *list, data.colopts = colopts; data.opts = *opts; - data.len = xmalloc(sizeof(*data.len) * list->nr); + ALLOC_ARRAY(data.len, list->nr); for (i = 0; i < list->nr; i++) data.len[i] = item_length(colopts, list->items[i].string); @@ -173,9 +173,8 @@ static void display_table(const struct string_list *list, if (colopts & COL_DENSE) shrink_columns(&data); - empty_cell = xmalloc(initial_width + 1); + empty_cell = xmallocz(initial_width); memset(empty_cell, ' ', initial_width); - empty_cell[initial_width] = '\0'; for (y = 0; y < data.rows; y++) { for (x = 0; x < data.cols; x++) if (display_cell(&data, initial_width, empty_cell, x, y)) diff --git a/combine-diff.c b/combine-diff.c index 55713049a4..0e1d4b0893 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -189,11 +189,11 @@ static struct lline *coalesce_lines(struct lline *base, int *lenbase, * - Else if we have NEW, insert newend lline into base and * consume newend */ - lcs = xcalloc(origbaselen + 1, sizeof(int*)); - directions = xcalloc(origbaselen + 1, sizeof(enum coalesce_direction*)); + lcs = xcalloc(st_add(origbaselen, 1), sizeof(int*)); + directions = xcalloc(st_add(origbaselen, 1), sizeof(enum coalesce_direction*)); for (i = 0; i < origbaselen + 1; i++) { - lcs[i] = xcalloc(lennew + 1, sizeof(int)); - directions[i] = xcalloc(lennew + 1, sizeof(enum coalesce_direction)); + lcs[i] = xcalloc(st_add(lennew, 1), sizeof(int)); + directions[i] = xcalloc(st_add(lennew, 1), sizeof(enum coalesce_direction)); directions[i][0] = BASE; } for (j = 1; j < lennew + 1; j++) @@ -319,7 +319,7 @@ static void append_lost(struct sline *sline, int n, const char *line, int len) if (line[len-1] == '\n') len--; - lline = xmalloc(sizeof(*lline) + len + 1); + FLEX_ALLOC_MEM(lline, line, line, len); lline->len = len; lline->next = NULL; lline->prev = sline->plost.lost_tail; @@ -330,8 +330,6 @@ static void append_lost(struct sline *sline, int n, const char *line, int len) sline->plost.lost_tail = lline; sline->plost.len++; lline->parent_map = this_mask; - memcpy(lline->line, line, len); - lline->line[len] = 0; } struct combine_diff_state { @@ -1043,7 +1041,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, elem->mode = canon_mode(S_IFLNK); result_size = len; - result = xmalloc(len + 1); + result = xmallocz(len); done = read_in_full(fd, result, len); if (done < 0) @@ -1051,8 +1049,6 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, else if (done < len) die("early EOF '%s'", elem->path); - result[len] = 0; - /* If not a fake symlink, apply filters, e.g. autocrlf */ if (is_file) { struct strbuf buf = STRBUF_INIT; @@ -1115,7 +1111,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, if (result_size && result[result_size-1] != '\n') cnt++; /* incomplete line */ - sline = xcalloc(cnt+2, sizeof(*sline)); + sline = xcalloc(st_add(cnt, 2), sizeof(*sline)); sline[0].bol = result; for (lno = 0, cp = result; cp < result + result_size; cp++) { if (*cp == '\n') { @@ -1134,7 +1130,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, /* Even p_lno[cnt+1] is valid -- that is for the end line number * for deletion hunk at the end. */ - sline[0].p_lno = xcalloc((cnt+2) * num_parent, sizeof(unsigned long)); + sline[0].p_lno = xcalloc(st_mult(st_add(cnt, 2), num_parent), sizeof(unsigned long)); for (lno = 0; lno <= cnt; lno++) sline[lno+1].p_lno = sline[lno].p_lno + num_parent; @@ -1266,7 +1262,7 @@ static struct diff_filepair *combined_pair(struct combine_diff_path *p, struct diff_filespec *pool; pair = xmalloc(sizeof(*pair)); - pool = xcalloc(num_parent + 1, sizeof(struct diff_filespec)); + pool = xcalloc(st_add(num_parent, 1), sizeof(struct diff_filespec)); pair->one = pool + 1; pair->two = pool; @@ -1372,7 +1368,7 @@ static struct combine_diff_path *find_paths_multitree( struct combine_diff_path paths_head; struct strbuf base; - parents_sha1 = xmalloc(nparent * sizeof(parents_sha1[0])); + ALLOC_ARRAY(parents_sha1, nparent); for (i = 0; i < nparent; i++) parents_sha1[i] = parents->sha1[i]; @@ -1483,7 +1479,7 @@ void diff_tree_combined(const unsigned char *sha1, if (opt->orderfile && num_paths) { struct obj_order *o; - o = xmalloc(sizeof(*o) * num_paths); + ALLOC_ARRAY(o, num_paths); for (i = 0, p = paths; p; p = p->next, i++) o[i].obj = p; order_objects(opt->orderfile, path_path, o, num_paths); diff --git a/commit.c b/commit.c index 40388d71e7..3f4f371e5e 100644 --- a/commit.c +++ b/commit.c @@ -147,7 +147,7 @@ struct commit_graft *read_graft_line(char *buf, int len) if ((len + 1) % entry_size) goto bad_graft_data; i = (len + 1) / entry_size - 1; - graft = xmalloc(sizeof(*graft) + GIT_SHA1_RAWSZ * i); + graft = xmalloc(st_add(sizeof(*graft), st_mult(GIT_SHA1_RAWSZ, i))); graft->nr_parent = i; if (get_oid_hex(buf, &graft->oid)) goto bad_graft_data; @@ -903,7 +903,7 @@ static int remove_redundant(struct commit **array, int cnt) work = xcalloc(cnt, sizeof(*work)); redundant = xcalloc(cnt, 1); - filled_index = xmalloc(sizeof(*filled_index) * (cnt - 1)); + ALLOC_ARRAY(filled_index, cnt - 1); for (i = 0; i < cnt; i++) parse_commit(array[i]); diff --git a/compat/basename.c b/compat/basename.c index d8f8a3c6dc..96bd9533b4 100644 --- a/compat/basename.c +++ b/compat/basename.c @@ -1,15 +1,71 @@ #include "../git-compat-util.h" +#include "../strbuf.h" /* Adapted from libiberty's basename.c. */ char *gitbasename (char *path) { const char *base; - /* Skip over the disk name in MSDOS pathnames. */ - if (has_dos_drive_prefix(path)) - path += 2; + + if (path) + skip_dos_drive_prefix(&path); + + if (!path || !*path) + return "."; + for (base = path; *path; path++) { - if (is_dir_sep(*path)) - base = path + 1; + if (!is_dir_sep(*path)) + continue; + do { + path++; + } while (is_dir_sep(*path)); + if (*path) + base = path; + else + while (--path != base && is_dir_sep(*path)) + *path = '\0'; } return (char *)base; } + +char *gitdirname(char *path) +{ + static struct strbuf buf = STRBUF_INIT; + char *p = path, *slash = NULL, c; + int dos_drive_prefix; + + if (!p) + return "."; + + if ((dos_drive_prefix = skip_dos_drive_prefix(&p)) && !*p) + goto dot; + + /* + * POSIX.1-2001 says dirname("/") should return "/", and dirname("//") + * should return "//", but dirname("///") should return "/" again. + */ + if (is_dir_sep(*p)) { + if (!p[1] || (is_dir_sep(p[1]) && !p[2])) + return path; + slash = ++p; + } + while ((c = *(p++))) + if (is_dir_sep(c)) { + char *tentative = p - 1; + + /* POSIX.1-2001 says to ignore trailing slashes */ + while (is_dir_sep(*p)) + p++; + if (*p) + slash = tentative; + } + + if (slash) { + *slash = '\0'; + return path; + } + +dot: + strbuf_reset(&buf); + strbuf_addf(&buf, "%.*s.", dos_drive_prefix, path); + return buf.buf; +} diff --git a/compat/bswap.h b/compat/bswap.h index 7fed637ed0..d47c003544 100644 --- a/compat/bswap.h +++ b/compat/bswap.h @@ -149,11 +149,12 @@ static inline uint64_t git_bswap64(uint64_t x) * and is faster on architectures with memory alignment issues. */ -#if defined(__i386__) || defined(__x86_64__) || \ +#if !defined(NO_UNALIGNED_LOADS) && ( \ + defined(__i386__) || defined(__x86_64__) || \ defined(_M_IX86) || defined(_M_X64) || \ defined(__ppc__) || defined(__ppc64__) || \ defined(__powerpc__) || defined(__powerpc64__) || \ - defined(__s390__) || defined(__s390x__) + defined(__s390__) || defined(__s390x__)) #define get_be16(p) ntohs(*(unsigned short *)(p)) #define get_be32(p) ntohl(*(unsigned int *)(p)) diff --git a/compat/mingw.c b/compat/mingw.c index 90bdb1edde..54c82ecf20 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -6,6 +6,8 @@ #include "../run-command.h" #include "../cache.h" +#define HCAST(type, handle) ((type)(intptr_t)handle) + static const int delay[] = { 0, 1, 10, 20, 40 }; int err_win_to_posix(DWORD winerr) @@ -394,6 +396,23 @@ int mingw_fflush(FILE *stream) return ret; } +#undef write +ssize_t mingw_write(int fd, const void *buf, size_t len) +{ + ssize_t result = write(fd, buf, len); + + if (result < 0 && errno == EINVAL && buf) { + /* check if fd is a pipe */ + HANDLE h = (HANDLE) _get_osfhandle(fd); + if (GetFileType(h) == FILE_TYPE_PIPE) + errno = EPIPE; + else + errno = EINVAL; + } + + return result; +} + int mingw_access(const char *filename, int mode) { wchar_t wfilename[MAX_PATH]; @@ -435,6 +454,39 @@ static inline time_t filetime_to_time_t(const FILETIME *ft) return (time_t)(filetime_to_hnsec(ft) / 10000000); } +/** + * Verifies that safe_create_leading_directories() would succeed. + */ +static int has_valid_directory_prefix(wchar_t *wfilename) +{ + int n = wcslen(wfilename); + + while (n > 0) { + wchar_t c = wfilename[--n]; + DWORD attributes; + + if (!is_dir_sep(c)) + continue; + + wfilename[n] = L'\0'; + attributes = GetFileAttributesW(wfilename); + wfilename[n] = c; + if (attributes == FILE_ATTRIBUTE_DIRECTORY || + attributes == FILE_ATTRIBUTE_DEVICE) + return 1; + if (attributes == INVALID_FILE_ATTRIBUTES) + switch (GetLastError()) { + case ERROR_PATH_NOT_FOUND: + continue; + case ERROR_FILE_NOT_FOUND: + /* This implies parent directory exists. */ + return 1; + } + return 0; + } + return 1; +} + /* We keep the do_lstat code in a separate function to avoid recursion. * When a path ends with a slash, the stat will fail with ENOENT. In * this case, we strip the trailing slashes and stat again. @@ -495,6 +547,12 @@ static int do_lstat(int follow, const char *file_name, struct stat *buf) case ERROR_NOT_ENOUGH_MEMORY: errno = ENOMEM; break; + case ERROR_PATH_NOT_FOUND: + if (!has_valid_directory_prefix(wfilename)) { + errno = ENOTDIR; + break; + } + /* fallthru */ default: errno = ENOENT; break; @@ -674,13 +732,13 @@ int pipe(int filedes[2]) errno = err_win_to_posix(GetLastError()); return -1; } - filedes[0] = _open_osfhandle((int)h[0], O_NOINHERIT); + filedes[0] = _open_osfhandle(HCAST(int, h[0]), O_NOINHERIT); if (filedes[0] < 0) { CloseHandle(h[0]); CloseHandle(h[1]); return -1; } - filedes[1] = _open_osfhandle((int)h[1], O_NOINHERIT); + filedes[1] = _open_osfhandle(HCAST(int, h[1]), O_NOINHERIT); if (filedes[1] < 0) { close(filedes[0]); CloseHandle(h[1]); @@ -752,7 +810,7 @@ static const char *quote_arg(const char *arg) return arg; /* insert \ where necessary */ - d = q = xmalloc(len+n+3); + d = q = xmalloc(st_add3(len, n, 3)); *d++ = '"'; while (*arg) { if (*arg == '"') @@ -835,7 +893,7 @@ static char **get_path_split(void) if (!n) return NULL; - path = xmalloc((n+1)*sizeof(char *)); + ALLOC_ARRAY(path, n + 1); p = envpath; i = 0; do { @@ -920,7 +978,7 @@ static wchar_t *make_environment_block(char **deltaenv) i++; /* copy the environment, leaving space for changes */ - tmpenv = xmalloc((size + i) * sizeof(char*)); + ALLOC_ARRAY(tmpenv, size + i); memcpy(tmpenv, environ, size * sizeof(char*)); /* merge supplied environment changes into the temporary environment */ @@ -1011,7 +1069,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen free(quoted); } - wargs = xmalloc((2 * args.len + 1) * sizeof(wchar_t)); + ALLOC_ARRAY(wargs, st_add(st_mult(2, args.len), 1)); xutftowcs(wargs, args.buf, 2 * args.len + 1); strbuf_release(&args); @@ -1110,7 +1168,7 @@ static int try_shell_exec(const char *cmd, char *const *argv) int argc = 0; const char **argv2; while (argv[argc]) argc++; - argv2 = xmalloc(sizeof(*argv) * (argc+1)); + ALLOC_ARRAY(argv2, argc + 1); argv2[0] = (char *)cmd; /* full path to the script file */ memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc); pid = mingw_spawnv(prog, argv2, 1); @@ -1584,7 +1642,12 @@ repeat: if (gle == ERROR_ACCESS_DENIED && (attrs = GetFileAttributesW(wpnew)) != INVALID_FILE_ATTRIBUTES) { if (attrs & FILE_ATTRIBUTE_DIRECTORY) { - errno = EISDIR; + DWORD attrsold = GetFileAttributesW(wpold); + if (attrsold == INVALID_FILE_ATTRIBUTES || + !(attrsold & FILE_ATTRIBUTE_DIRECTORY)) + errno = EISDIR; + else if (!_wrmdir(wpnew)) + goto repeat; return -1; } if ((attrs & FILE_ATTRIBUTE_READONLY) && @@ -1829,7 +1892,8 @@ void mingw_open_html(const char *unixpath) die("cannot run browser"); printf("Launching default browser to display HTML ...\n"); - r = (int)ShellExecute(NULL, "open", htmlpath, NULL, "\\", SW_SHOWNORMAL); + r = HCAST(int, ShellExecute(NULL, "open", htmlpath, + NULL, "\\", SW_SHOWNORMAL)); FreeLibrary(shell32); /* see the MSDN documentation referring to the result codes here */ if (r <= 32) { @@ -1915,28 +1979,31 @@ pid_t waitpid(pid_t pid, int *status, int options) return -1; } +int mingw_skip_dos_drive_prefix(char **path) +{ + int ret = has_dos_drive_prefix(*path); + *path += ret; + return ret; +} + int mingw_offset_1st_component(const char *path) { - int offset = 0; - if (has_dos_drive_prefix(path)) - offset = 2; + char *pos = (char *)path; /* unc paths */ - else if (is_dir_sep(path[0]) && is_dir_sep(path[1])) { - + if (!skip_dos_drive_prefix(&pos) && + is_dir_sep(pos[0]) && is_dir_sep(pos[1])) { /* skip server name */ - char *pos = strpbrk(path + 2, "\\/"); + pos = strpbrk(pos + 2, "\\/"); if (!pos) return 0; /* Error: malformed unc path */ do { pos++; } while (*pos && !is_dir_sep(*pos)); - - offset = pos - path; } - return offset + is_dir_sep(path[offset]); + return pos + is_dir_sep(*pos) - path; } int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen) @@ -2024,6 +2091,37 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen) return -1; } +static void setup_windows_environment() +{ + char *tmp = getenv("TMPDIR"); + + /* on Windows it is TMP and TEMP */ + if (!tmp) { + if (!(tmp = getenv("TMP"))) + tmp = getenv("TEMP"); + if (tmp) { + setenv("TMPDIR", tmp, 1); + tmp = getenv("TMPDIR"); + } + } + + if (tmp) { + /* + * Convert all dir separators to forward slashes, + * to help shell commands called from the Git + * executable (by not mistaking the dir separators + * for escape characters). + */ + for (; *tmp; tmp++) + if (*tmp == '\\') + *tmp = '/'; + } + + /* simulate TERM to enable auto-color (see color.c) */ + if (!getenv("TERM")) + setenv("TERM", "cygwin", 1); +} + /* * Disable MSVCRT command line wildcard expansion (__getmainargs called from * mingw startup code, see init.c in mingw runtime). @@ -2102,19 +2200,7 @@ void mingw_startup() qsort(environ, i, sizeof(char*), compareenv); /* fix Windows specific environment settings */ - - /* on Windows it is TMP and TEMP */ - if (!mingw_getenv("TMPDIR")) { - const char *tmp = mingw_getenv("TMP"); - if (!tmp) - tmp = mingw_getenv("TEMP"); - if (tmp) - setenv("TMPDIR", tmp, 1); - } - - /* simulate TERM to enable auto-color (see color.c) */ - if (!getenv("TERM")) - setenv("TERM", "cygwin", 1); + setup_windows_environment(); /* initialize critical section for waitpid pinfo_t list */ InitializeCriticalSection(&pinfo_cs); diff --git a/compat/mingw.h b/compat/mingw.h index 738865c6c0..c008694639 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -1,27 +1,43 @@ +#ifdef __MINGW64_VERSION_MAJOR +#include +#include +typedef _sigset_t sigset_t; +#endif #include #include +/* MinGW-w64 reports to have flockfile, but it does not actually have it. */ +#ifdef __MINGW64_VERSION_MAJOR +#undef _POSIX_THREAD_SAFE_FUNCTIONS +#endif + /* * things that are not available in header files */ -typedef int pid_t; typedef int uid_t; typedef int socklen_t; +#ifndef __MINGW64_VERSION_MAJOR +typedef int pid_t; #define hstrerror strerror +#endif #define S_IFLNK 0120000 /* Symbolic link */ #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) #define S_ISSOCK(x) 0 +#ifndef S_IRWXG #define S_IRGRP 0 #define S_IWGRP 0 #define S_IXGRP 0 #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +#endif +#ifndef S_IRWXO #define S_IROTH 0 #define S_IWOTH 0 #define S_IXOTH 0 #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +#endif #define S_ISUID 0004000 #define S_ISGID 0002000 @@ -100,8 +116,10 @@ static inline int symlink(const char *oldpath, const char *newpath) { errno = ENOSYS; return -1; } static inline int fchmod(int fildes, mode_t mode) { errno = ENOSYS; return -1; } +#ifndef __MINGW64_VERSION_MAJOR static inline pid_t fork(void) { errno = ENOSYS; return -1; } +#endif static inline unsigned int alarm(unsigned int seconds) { return 0; } static inline int fsync(int fd) @@ -176,8 +194,10 @@ int pipe(int filedes[2]); unsigned int sleep (unsigned int seconds); int mkstemp(char *template); int gettimeofday(struct timeval *tv, void *tz); +#ifndef __MINGW64_VERSION_MAJOR struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime_r(const time_t *timep, struct tm *result); +#endif int getpagesize(void); /* defined in MinGW's libgcc.a */ struct passwd *getpwuid(uid_t uid); int setitimer(int type, struct itimerval *in, struct itimerval *out); @@ -210,6 +230,9 @@ FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); int mingw_fflush(FILE *stream); #define fflush mingw_fflush +ssize_t mingw_write(int fd, const void *buf, size_t len); +#define write mingw_write + int mingw_access(const char *filename, int mode); #undef access #define access mingw_access @@ -298,8 +321,10 @@ static inline int getrlimit(int resource, struct rlimit *rlp) /* * Use mingw specific stat()/lstat()/fstat() implementations on Windows. */ +#ifndef __MINGW64_VERSION_MAJOR #define off_t off64_t #define lseek _lseeki64 +#endif /* use struct stat with 64 bit st_size */ #ifdef stat @@ -358,7 +383,10 @@ HANDLE winansi_get_osfhandle(int fd); * git specific compatibility */ -#define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':') +#define has_dos_drive_prefix(path) \ + (isalpha(*(path)) && (path)[1] == ':' ? 2 : 0) +int mingw_skip_dos_drive_prefix(char **path); +#define skip_dos_drive_prefix mingw_skip_dos_drive_prefix #define is_dir_sep(c) ((c) == '/' || (c) == '\\') static inline char *mingw_find_last_dir_sep(const char *path) { @@ -368,12 +396,22 @@ static inline char *mingw_find_last_dir_sep(const char *path) ret = (char *)path; return ret; } +static inline void convert_slashes(char *path) +{ + for (; *path; path++) + if (*path == '\\') + *path = '/'; +} #define find_last_dir_sep mingw_find_last_dir_sep int mingw_offset_1st_component(const char *path); #define offset_1st_component mingw_offset_1st_component #define PATH_SEP ';' +#ifndef __MINGW64_VERSION_MAJOR #define PRIuMAX "I64u" #define PRId64 "I64d" +#else +#include +#endif void mingw_open_html(const char *path); #define open_html mingw_open_html diff --git a/compat/nedmalloc/malloc.c.h b/compat/nedmalloc/malloc.c.h index f216a2a7d3..b833ff9225 100644 --- a/compat/nedmalloc/malloc.c.h +++ b/compat/nedmalloc/malloc.c.h @@ -720,6 +720,9 @@ struct mallinfo { inlining are defined as macros, so these aren't used for them. */ +#ifdef __MINGW64_VERSION_MAJOR +#undef FORCEINLINE +#endif #ifndef FORCEINLINE #if defined(__GNUC__) #define FORCEINLINE __inline __attribute__ ((always_inline)) @@ -1382,6 +1385,7 @@ LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value); /*** Atomic operations ***/ #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 + #undef _ReadWriteBarrier #define _ReadWriteBarrier() __sync_synchronize() #else static __inline__ __attribute__((always_inline)) long __sync_lock_test_and_set(volatile long * const Target, const long Value) @@ -1798,9 +1802,10 @@ struct win32_mlock_t volatile long threadid; }; +static inline int return_0(int i) { return 0; } #define MLOCK_T struct win32_mlock_t #define CURRENT_THREAD win32_getcurrentthreadid() -#define INITIAL_LOCK(sl) (memset(sl, 0, sizeof(MLOCK_T)), 0) +#define INITIAL_LOCK(sl) (memset(sl, 0, sizeof(MLOCK_T)), return_0(0)) #define ACQUIRE_LOCK(sl) win32_acquire_lock(sl) #define RELEASE_LOCK(sl) win32_release_lock(sl) #define TRY_LOCK(sl) win32_try_lock(sl) diff --git a/compat/poll/poll.c b/compat/poll/poll.c index db4e03ed79..b10adc780f 100644 --- a/compat/poll/poll.c +++ b/compat/poll/poll.c @@ -76,7 +76,7 @@ #ifdef WIN32_NATIVE -#define IsConsoleHandle(h) (((long) (h) & 3) == 3) +#define IsConsoleHandle(h) (((long) (intptr_t) (h) & 3) == 3) static BOOL IsSocketHandle (HANDLE h) diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c index 079070ff1d..dfbe6d8408 100644 --- a/compat/precompose_utf8.c +++ b/compat/precompose_utf8.c @@ -50,7 +50,8 @@ void probe_utf8_pathname_composition(void) close(output_fd); git_path_buf(&path, "%s", auml_nfd); precomposed_unicode = access(path.buf, R_OK) ? 0 : 1; - git_config_set("core.precomposeunicode", precomposed_unicode ? "true" : "false"); + git_config_set("core.precomposeunicode", + precomposed_unicode ? "true" : "false"); git_path_buf(&path, "%s", auml_nfc); if (unlink(path.buf)) die_errno(_("failed to unlink '%s'"), path.buf); diff --git a/compat/qsort.c b/compat/qsort.c index 9574d537bd..7d071afb70 100644 --- a/compat/qsort.c +++ b/compat/qsort.c @@ -47,7 +47,7 @@ static void msort_with_tmp(void *b, size_t n, size_t s, void git_qsort(void *b, size_t n, size_t s, int (*cmp)(const void *, const void *)) { - const size_t size = n * s; + const size_t size = st_mult(n, s); char buf[1024]; if (size < sizeof(buf)) { diff --git a/compat/setenv.c b/compat/setenv.c index fc1439a643..7849f258d2 100644 --- a/compat/setenv.c +++ b/compat/setenv.c @@ -18,7 +18,7 @@ int gitsetenv(const char *name, const char *value, int replace) namelen = strlen(name); valuelen = strlen(value); - envstr = malloc((namelen + valuelen + 2)); + envstr = malloc(st_add3(namelen, valuelen, 2)); if (!envstr) { errno = ENOMEM; return -1; diff --git a/compat/terminal.c b/compat/terminal.c index 313897d581..fa13ee672d 100644 --- a/compat/terminal.c +++ b/compat/terminal.c @@ -122,7 +122,7 @@ char *git_terminal_prompt(const char *prompt, int echo) fputs(prompt, output_fh); fflush(output_fh); - r = strbuf_getline(&buf, input_fh, '\n'); + r = strbuf_getline_lf(&buf, input_fh); if (!echo) { putc('\n', output_fh); fflush(output_fh); diff --git a/compat/win32/pthread.h b/compat/win32/pthread.h index 8ad187344f..b6ed9e7462 100644 --- a/compat/win32/pthread.h +++ b/compat/win32/pthread.h @@ -18,7 +18,10 @@ */ #define pthread_mutex_t CRITICAL_SECTION -#define pthread_mutex_init(a,b) (InitializeCriticalSection((a)), 0) +static inline int return_0(int i) { + return 0; +} +#define pthread_mutex_init(a,b) return_0((InitializeCriticalSection((a)), 0)) #define pthread_mutex_destroy(a) DeleteCriticalSection((a)) #define pthread_mutex_lock EnterCriticalSection #define pthread_mutex_unlock LeaveCriticalSection @@ -75,9 +78,9 @@ extern int win32_pthread_join(pthread_t *thread, void **value_ptr); #define pthread_equal(t1, t2) ((t1).tid == (t2).tid) extern pthread_t pthread_self(void); -static inline int pthread_exit(void *ret) +static inline void NORETURN pthread_exit(void *ret) { - ExitThread((DWORD)ret); + ExitThread((DWORD)(intptr_t)ret); } typedef DWORD pthread_key_t; diff --git a/compat/win32/syslog.c b/compat/win32/syslog.c index d015e436d5..b905aea31b 100644 --- a/compat/win32/syslog.c +++ b/compat/win32/syslog.c @@ -32,7 +32,7 @@ void syslog(int priority, const char *fmt, ...) return; } - str = malloc(str_len + 1); + str = malloc(st_add(str_len, 1)); if (!str) { warning("malloc failed: '%s'", strerror(errno)); return; @@ -43,7 +43,7 @@ void syslog(int priority, const char *fmt, ...) va_end(ap); while ((pos = strstr(str, "%1")) != NULL) { - str = realloc(str, ++str_len + 1); + str = realloc(str, st_add(++str_len, 1)); if (!str) { warning("realloc failed: '%s'", strerror(errno)); return; diff --git a/compat/winansi.c b/compat/winansi.c index ceff55bd67..5dfa5ed61f 100644 --- a/compat/winansi.c +++ b/compat/winansi.c @@ -23,6 +23,7 @@ static HANDLE hthread, hread, hwrite; static HANDLE hconsole1, hconsole2; #ifdef __MINGW32__ +#if !defined(__MINGW64_VERSION_MAJOR) || __MINGW64_VERSION_MAJOR < 5 typedef struct _CONSOLE_FONT_INFOEX { ULONG cbSize; DWORD nFont; @@ -32,6 +33,7 @@ typedef struct _CONSOLE_FONT_INFOEX { WCHAR FaceName[LF_FACESIZE]; } CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX; #endif +#endif typedef BOOL (WINAPI *PGETCURRENTCONSOLEFONTEX)(HANDLE, BOOL, PCONSOLE_FONT_INFOEX); @@ -452,7 +454,8 @@ static HANDLE duplicate_handle(HANDLE hnd) HANDLE hresult, hproc = GetCurrentProcess(); if (!DuplicateHandle(hproc, hnd, hproc, &hresult, 0, TRUE, DUPLICATE_SAME_ACCESS)) - die_lasterr("DuplicateHandle(%li) failed", (long) hnd); + die_lasterr("DuplicateHandle(%li) failed", + (long) (intptr_t) hnd); return hresult; } diff --git a/config.c b/config.c index 86a5eb2571..9ba40bc1b0 100644 --- a/config.c +++ b/config.c @@ -24,6 +24,7 @@ struct config_source { size_t pos; } buf; } u; + const char *origin_type; const char *name; const char *path; int die_on_error; @@ -471,9 +472,9 @@ static int git_parse_source(config_fn_t fn, void *data) break; } if (cf->die_on_error) - die(_("bad config file line %d in %s"), cf->linenr, cf->name); + die(_("bad config line %d in %s %s"), cf->linenr, cf->origin_type, cf->name); else - return error(_("bad config file line %d in %s"), cf->linenr, cf->name); + return error(_("bad config line %d in %s %s"), cf->linenr, cf->origin_type, cf->name); } static int parse_unit_factor(const char *end, uintmax_t *val) @@ -588,9 +589,9 @@ static void die_bad_number(const char *name, const char *value) if (!value) value = ""; - if (cf && cf->name) - die(_("bad numeric config value '%s' for '%s' in %s: %s"), - value, name, cf->name, reason); + if (cf && cf->origin_type && cf->name) + die(_("bad numeric config value '%s' for '%s' in %s %s: %s"), + value, name, cf->origin_type, cf->name, reason); die(_("bad numeric config value '%s' for '%s': %s"), value, name, reason); } @@ -1061,11 +1062,13 @@ static int do_config_from(struct config_source *top, config_fn_t fn, void *data) } static int do_config_from_file(config_fn_t fn, - const char *name, const char *path, FILE *f, void *data) + const char *origin_type, const char *name, const char *path, FILE *f, + void *data) { struct config_source top; top.u.file = f; + top.origin_type = origin_type; top.name = name; top.path = path; top.die_on_error = 1; @@ -1078,7 +1081,7 @@ static int do_config_from_file(config_fn_t fn, static int git_config_from_stdin(config_fn_t fn, void *data) { - return do_config_from_file(fn, "", NULL, stdin, data); + return do_config_from_file(fn, "standard input", "", NULL, stdin, data); } int git_config_from_file(config_fn_t fn, const char *filename, void *data) @@ -1089,21 +1092,22 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data) f = fopen(filename, "r"); if (f) { flockfile(f); - ret = do_config_from_file(fn, filename, filename, f, data); + ret = do_config_from_file(fn, "file", filename, filename, f, data); funlockfile(f); fclose(f); } return ret; } -int git_config_from_buf(config_fn_t fn, const char *name, const char *buf, - size_t len, void *data) +int git_config_from_mem(config_fn_t fn, const char *origin_type, + const char *name, const char *buf, size_t len, void *data) { struct config_source top; top.u.buf.buf = buf; top.u.buf.len = len; top.u.buf.pos = 0; + top.origin_type = origin_type; top.name = name; top.path = NULL; top.die_on_error = 0; @@ -1132,7 +1136,7 @@ static int git_config_from_blob_sha1(config_fn_t fn, return error("reference '%s' does not point to a blob", name); } - ret = git_config_from_buf(fn, name, buf, size, data); + ret = git_config_from_mem(fn, "blob", name, buf, size, data); free(buf); return ret; @@ -1594,6 +1598,30 @@ int git_config_get_pathname(const char *key, const char **dest) return ret; } +int git_config_get_untracked_cache(void) +{ + int val = -1; + const char *v; + + /* Hack for test programs like test-dump-untracked-cache */ + if (ignore_untracked_cache_config) + return -1; + + if (!git_config_get_maybe_bool("core.untrackedcache", &val)) + return val; + + if (!git_config_get_value("core.untrackedcache", &v)) { + if (!strcasecmp(v, "keep")) + return -1; + + error("unknown core.untrackedCache value '%s'; " + "using 'keep' default value", v); + return -1; + } + + return -1; /* default value */ +} + NORETURN void git_die_config_linenr(const char *key, const char *filename, int linenr) { @@ -1825,15 +1853,26 @@ contline: return offset; } -int git_config_set_in_file(const char *config_filename, - const char *key, const char *value) +int git_config_set_in_file_gently(const char *config_filename, + const char *key, const char *value) { - return git_config_set_multivar_in_file(config_filename, key, value, NULL, 0); + return git_config_set_multivar_in_file_gently(config_filename, key, value, NULL, 0); } -int git_config_set(const char *key, const char *value) +void git_config_set_in_file(const char *config_filename, + const char *key, const char *value) { - return git_config_set_multivar(key, value, NULL, 0); + git_config_set_multivar_in_file(config_filename, key, value, NULL, 0); +} + +int git_config_set_gently(const char *key, const char *value) +{ + return git_config_set_multivar_gently(key, value, NULL, 0); +} + +void git_config_set(const char *key, const char *value) +{ + git_config_set_multivar(key, value, NULL, 0); } /* @@ -1878,7 +1917,7 @@ static int git_config_parse_key_1(const char *key, char **store_key, int *basele * Validate the key and while at it, lower case it for matching. */ if (store_key) - *store_key = xmalloc(strlen(key) + 1); + *store_key = xmallocz(strlen(key)); dot = 0; for (i = 0; key[i]; i++) { @@ -1902,8 +1941,6 @@ static int git_config_parse_key_1(const char *key, char **store_key, int *basele if (store_key) (*store_key)[i] = c; } - if (store_key) - (*store_key)[i] = 0; return 0; @@ -1950,9 +1987,10 @@ int git_config_key_is_valid(const char *key) * - the config file is removed and the lock file rename()d to it. * */ -int git_config_set_multivar_in_file(const char *config_filename, - const char *key, const char *value, - const char *value_regex, int multi_replace) +int git_config_set_multivar_in_file_gently(const char *config_filename, + const char *key, const char *value, + const char *value_regex, + int multi_replace) { int fd = -1, in_fd = -1; int ret; @@ -2179,11 +2217,27 @@ write_err_out: } -int git_config_set_multivar(const char *key, const char *value, - const char *value_regex, int multi_replace) +void git_config_set_multivar_in_file(const char *config_filename, + const char *key, const char *value, + const char *value_regex, int multi_replace) { - return git_config_set_multivar_in_file(NULL, key, value, value_regex, - multi_replace); + if (git_config_set_multivar_in_file_gently(config_filename, key, value, + value_regex, multi_replace) < 0) + die(_("Could not set '%s' to '%s'"), key, value); +} + +int git_config_set_multivar_gently(const char *key, const char *value, + const char *value_regex, int multi_replace) +{ + return git_config_set_multivar_in_file_gently(NULL, key, value, value_regex, + multi_replace); +} + +void git_config_set_multivar(const char *key, const char *value, + const char *value_regex, int multi_replace) +{ + git_config_set_multivar_in_file(NULL, key, value, value_regex, + multi_replace); } static int section_name_match (const char *buf, const char *name) @@ -2385,3 +2439,13 @@ int parse_config_key(const char *var, return 0; } + +const char *current_config_origin_type(void) +{ + return cf && cf->origin_type ? cf->origin_type : "command line"; +} + +const char *current_config_name(void) +{ + return cf && cf->name ? cf->name : ""; +} diff --git a/config.mak.uname b/config.mak.uname index f34dcaad20..fe8096f8a6 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -37,6 +37,7 @@ ifeq ($(uname_S),Linux) HAVE_CLOCK_GETTIME = YesPlease HAVE_CLOCK_MONOTONIC = YesPlease HAVE_GETDELIM = YesPlease + SANE_TEXT_GREP=-a endif ifeq ($(uname_S),GNU/kFreeBSD) HAVE_ALLOCA_H = YesPlease @@ -518,13 +519,12 @@ ifneq (,$(findstring MINGW,$(uname_S))) NO_INET_NTOP = YesPlease NO_POSIX_GOODIES = UnfortunatelyYes DEFAULT_HELP_FORMAT = html - COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -D_USE_32BIT_TIME_T -DNOGDI -Icompat -Icompat/win32 + COMPAT_CFLAGS += -DNOGDI -Icompat -Icompat/win32 COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" COMPAT_OBJS += compat/mingw.o compat/winansi.o \ compat/win32/pthread.o compat/win32/syslog.o \ compat/win32/dirent.o BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1 - BASIC_LDFLAGS += -Wl,--large-address-aware EXTLIBS += -lws2_32 GITLIBS += git.res PTHREAD_LIBS = @@ -541,8 +541,35 @@ ifneq (,$(wildcard ../THIS_IS_MSYSGIT)) INTERNAL_QSORT = YesPlease HAVE_LIBCHARSET_H = YesPlease NO_GETTEXT = YesPlease + COMPAT_CLFAGS += -D__USE_MINGW_ACCESS else - NO_CURL = YesPlease + ifeq ($(shell expr "$(uname_R)" : '2\.'),2) + # MSys2 + prefix = /usr/ + ifeq (MINGW32,$(MSYSTEM)) + prefix = /mingw32 + endif + ifeq (MINGW64,$(MSYSTEM)) + prefix = /mingw64 + else + COMPAT_CFLAGS += -D_USE_32BIT_TIME_T + BASIC_LDFLAGS += -Wl,--large-address-aware + endif + CC = gcc + COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO=0 + INSTALL = /bin/install + NO_R_TO_GCC_LINKER = YesPlease + INTERNAL_QSORT = YesPlease + HAVE_LIBCHARSET_H = YesPlease + NO_GETTEXT = + USE_GETTEXT_SCHEME = fallthrough + USE_LIBPCRE= YesPlease + NO_CURL = + USE_NED_ALLOCATOR = YesPlease + else + COMPAT_CFLAGS += -D__USE_MINGW_ANSI_STDIO + NO_CURL = YesPlease + endif endif endif ifeq ($(uname_S),QNX) diff --git a/configure.ac b/configure.ac index 89e2590bd6..0cd9f4680b 100644 --- a/configure.ac +++ b/configure.ac @@ -471,6 +471,13 @@ if test -n "$ASCIIDOC"; then esac fi +if grep -a ascii configure.ac >/dev/null; then + AC_MSG_RESULT([Using 'grep -a' for sane_grep]) + SANE_TEXT_GREP=-a +else + SANE_TEXT_GREP= +fi +GIT_CONF_SUBST([SANE_TEXT_GREP]) ## Checks for libraries. AC_MSG_NOTICE([CHECKS for libraries]) diff --git a/connect.c b/connect.c index fd7ffe1840..c53f3f1c55 100644 --- a/connect.c +++ b/connect.c @@ -267,9 +267,9 @@ static enum protocol get_protocol(const char *name) return PROTO_SSH; if (!strcmp(name, "git")) return PROTO_GIT; - if (!strcmp(name, "git+ssh")) + if (!strcmp(name, "git+ssh")) /* deprecated - do not use */ return PROTO_SSH; - if (!strcmp(name, "ssh+git")) + if (!strcmp(name, "ssh+git")) /* deprecated - do not use */ return PROTO_SSH; if (!strcmp(name, "file")) return PROTO_FILE; @@ -357,6 +357,10 @@ static int git_tcp_connect_sock(char *host, int flags) port = ""; memset(&hints, 0, sizeof(hints)); + if (flags & CONNECT_IPV4) + hints.ai_family = AF_INET; + else if (flags & CONNECT_IPV6) + hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; @@ -783,6 +787,10 @@ struct child_process *git_connect(int fd[2], const char *url, } argv_array_push(&conn->args, ssh); + if (flags & CONNECT_IPV4) + argv_array_push(&conn->args, "-4"); + else if (flags & CONNECT_IPV6) + argv_array_push(&conn->args, "-6"); if (tortoiseplink) argv_array_push(&conn->args, "-batch"); if (port) { diff --git a/connect.h b/connect.h index c41a6850f1..01f14cdf3f 100644 --- a/connect.h +++ b/connect.h @@ -3,6 +3,8 @@ #define CONNECT_VERBOSE (1u << 0) #define CONNECT_DIAG_URL (1u << 1) +#define CONNECT_IPV4 (1u << 2) +#define CONNECT_IPV6 (1u << 3) extern struct child_process *git_connect(int fd[2], const char *url, const char *prog, int flags); extern int finish_connect(struct child_process *conn); extern int git_connection_is_socket(struct child_process *conn); diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 111b05302b..e3918c87e3 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -664,6 +664,7 @@ __git_list_porcelain_commands () check-mailmap) : plumbing;; check-ref-format) : plumbing;; checkout-index) : plumbing;; + column) : internal helper;; commit-tree) : plumbing;; count-objects) : infrequent;; credential) : credentials;; @@ -1168,7 +1169,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary --no-prefix --src-prefix= --dst-prefix= --inter-hunk-context= --patience --histogram --minimal - --raw --word-diff + --raw --word-diff --word-diff-regex= --dirstat --dirstat= --dirstat-by-file --dirstat-by-file= --cumulative --diff-algorithm= @@ -1311,6 +1312,7 @@ _git_grep () --full-name --line-number --extended-regexp --basic-regexp --fixed-strings --perl-regexp + --threads --files-with-matches --name-only --files-without-match --max-depth @@ -1686,8 +1688,12 @@ _git_rebase () --preserve-merges --stat --no-stat --committer-date-is-author-date --ignore-date --ignore-whitespace --whitespace= - --autosquash --fork-point --no-fork-point - --autostash + --autosquash --no-autosquash + --fork-point --no-fork-point + --autostash --no-autostash + --verify --no-verify + --keep-empty --root --force-rebase --no-ff + --exec " return @@ -1716,7 +1722,7 @@ _git_send_email () --to|--cc|--bcc|--from) __gitcomp " $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null) - " "" "" + " return ;; esac @@ -1807,7 +1813,7 @@ _git_config () return ;; branch.*.rebase) - __gitcomp "false true" + __gitcomp "false true preserve interactive" return ;; remote.pushdefault) @@ -2054,6 +2060,7 @@ _git_config () core.sparseCheckout core.symlinks core.trustctime + core.untrackedCache core.warnAmbiguousRefs core.whitespace core.worktree @@ -2367,7 +2374,7 @@ _git_show_branch () case "$cur" in --*) __gitcomp " - --all --remotes --topo-order --current --more= + --all --remotes --topo-order --date-order --current --more= --list --independent --merge-base --no-name --color --no-color --sha1-name --sparse --topics --reflog @@ -2380,7 +2387,7 @@ _git_show_branch () _git_stash () { - local save_opts='--keep-index --no-keep-index --quiet --patch' + local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked' local subcommands='save list show apply clear drop pop create branch' local subcommand="$(__git_find_on_cmdline "$subcommands")" if [ -z "$subcommand" ]; then @@ -2402,9 +2409,20 @@ _git_stash () apply,--*|pop,--*) __gitcomp "--index --quiet" ;; - show,--*|drop,--*|branch,--*) + drop,--*) + __gitcomp "--quiet" ;; - show,*|apply,*|drop,*|pop,*|branch,*) + show,--*|branch,--*) + ;; + branch,*) + if [ $cword -eq 3 ]; then + __gitcomp_nl "$(__git_refs)"; + else + __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ + | sed -n -e 's/:.*//p')" + fi + ;; + show,*|apply,*|drop,*|pop,*) __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ | sed -n -e 's/:.*//p')" ;; diff --git a/contrib/examples/git-commit.sh b/contrib/examples/git-commit.sh index 934505bab9..86c9cfa0c7 100755 --- a/contrib/examples/git-commit.sh +++ b/contrib/examples/git-commit.sh @@ -574,10 +574,10 @@ then if test "$templatefile" != "" then # Test whether this is just the unaltered template. - if cnt=`sed -e '/^#/d' < "$templatefile" | + if cnt=$(sed -e '/^#/d' < "$templatefile" | git stripspace | diff "$GIT_DIR"/COMMIT_BAREMSG - | - wc -l` && + wc -l) && test 0 -lt $cnt then have_commitmsg=t @@ -630,8 +630,8 @@ then fi if test -z "$quiet" then - commit=`git diff-tree --always --shortstat --pretty="format:%h: %s"\ - --abbrev --summary --root HEAD --` + commit=$(git diff-tree --always --shortstat --pretty="format:%h: %s"\ + --abbrev --summary --root HEAD --) echo "Created${initial_commit:+ initial} commit $commit" fi fi diff --git a/contrib/examples/git-fetch.sh b/contrib/examples/git-fetch.sh index 554070909c..57d2e5616f 100755 --- a/contrib/examples/git-fetch.sh +++ b/contrib/examples/git-fetch.sh @@ -146,13 +146,13 @@ esac reflist=$(get_remote_refs_for_fetch "$@") if test "$tags" then - taglist=`IFS=' ' && + taglist=$(IFS=' ' && echo "$ls_remote_result" | git show-ref --exclude-existing=refs/tags/ | while read sha1 name do echo ".${name}:${name}" - done` || exit + done) || exit if test "$#" -gt 1 then # remote URL plus explicit refspecs; we need to merge them. diff --git a/contrib/examples/git-merge.sh b/contrib/examples/git-merge.sh index 52f2aafb9d..ee99f1a4ee 100755 --- a/contrib/examples/git-merge.sh +++ b/contrib/examples/git-merge.sh @@ -523,10 +523,10 @@ do if test "$exit" -eq 1 then - cnt=`{ + cnt=$({ git diff-files --name-only git ls-files --unmerged - } | wc -l` + } | wc -l) if test $best_cnt -le 0 || test $cnt -le $best_cnt then best_strategy=$strategy diff --git a/contrib/examples/git-repack.sh b/contrib/examples/git-repack.sh index 96e3fed326..672af93443 100755 --- a/contrib/examples/git-repack.sh +++ b/contrib/examples/git-repack.sh @@ -67,8 +67,8 @@ case ",$all_into_one," in ,t,) args= existing= if [ -d "$PACKDIR" ]; then - for e in `cd "$PACKDIR" && find . -type f -name '*.pack' \ - | sed -e 's/^\.\///' -e 's/\.pack$//'` + for e in $(cd "$PACKDIR" && find . -type f -name '*.pack' \ + | sed -e 's/^\.\///' -e 's/\.pack$//') do if [ -e "$PACKDIR/$e.keep" ]; then : keep diff --git a/contrib/examples/git-revert.sh b/contrib/examples/git-revert.sh index 7e2aad5491..197838d10b 100755 --- a/contrib/examples/git-revert.sh +++ b/contrib/examples/git-revert.sh @@ -138,8 +138,8 @@ cherry-pick) }' logmsg=$(git show -s --pretty=raw --encoding="$encoding" "$commit") - set_author_env=`echo "$logmsg" | - LANG=C LC_ALL=C sed -ne "$pick_author_script"` + set_author_env=$(echo "$logmsg" | + LANG=C LC_ALL=C sed -ne "$pick_author_script") eval "$set_author_env" export GIT_AUTHOR_NAME export GIT_AUTHOR_EMAIL @@ -160,9 +160,9 @@ cherry-pick) esac >.msg eval GITHEAD_$head=HEAD -eval GITHEAD_$next='`git show -s \ +eval GITHEAD_$next='$(git show -s \ --pretty=oneline --encoding="$encoding" "$commit" | - sed -e "s/^[^ ]* //"`' + sed -e "s/^[^ ]* //")' export GITHEAD_$head GITHEAD_$next # This three way merge is an interesting one. We are at diff --git a/contrib/subtree/Makefile b/contrib/subtree/Makefile index 3071baf493..6afa9aafdf 100644 --- a/contrib/subtree/Makefile +++ b/contrib/subtree/Makefile @@ -37,6 +37,7 @@ GIT_SUBTREE_DOC := git-subtree.1 GIT_SUBTREE_XML := git-subtree.xml GIT_SUBTREE_TXT := git-subtree.txt GIT_SUBTREE_HTML := git-subtree.html +GIT_SUBTREE_TEST := ../../git-subtree all:: $(GIT_SUBTREE) @@ -71,7 +72,10 @@ $(GIT_SUBTREE_HTML): $(GIT_SUBTREE_TXT) $(ASCIIDOC) -b xhtml11 -d manpage -f $(ASCIIDOC_CONF) \ -agit_version=$(GIT_VERSION) $^ -test: +$(GIT_SUBTREE_TEST): $(GIT_SUBTREE) + cp $< $@ + +test: $(GIT_SUBTREE_TEST) $(MAKE) -C t/ test clean: diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index edf36f8c36..7a39b30ad0 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -245,7 +245,10 @@ find_latest_squash() case "$a" in START) sq="$b" ;; git-subtree-mainline:) main="$b" ;; - git-subtree-split:) sub="$b" ;; + git-subtree-split:) + sub="$(git rev-parse "$b^0")" || + die "could not rev-parse split hash $b from commit $sq" + ;; END) if [ -n "$sub" ]; then if [ -n "$main" ]; then @@ -278,7 +281,10 @@ find_existing_splits() case "$a" in START) sq="$b" ;; git-subtree-mainline:) main="$b" ;; - git-subtree-split:) sub="$b" ;; + git-subtree-split:) + sub="$(git rev-parse "$b^0")" || + die "could not rev-parse split hash $b from commit $sq" + ;; END) debug " Main is: '$main'" if [ -z "$main" -a -n "$sub" ]; then @@ -479,8 +485,16 @@ copy_or_skip() p="$p -p $parent" fi done - - if [ -n "$identical" ]; then + + copycommit= + if [ -n "$identical" ] && [ -n "$nonidentical" ]; then + extras=$(git rev-list --count $identical..$nonidentical) + if [ "$extras" -ne 0 ]; then + # we need to preserve history along the other branch + copycommit=1 + fi + fi + if [ -n "$identical" ] && [ -z "$copycommit" ]; then echo $identical else copy_commit $rev $tree "$p" || exit $? diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh index 751aee3a0c..3bf96a9bb6 100755 --- a/contrib/subtree/t/t7900-subtree.sh +++ b/contrib/subtree/t/t7900-subtree.sh @@ -1014,4 +1014,64 @@ test_expect_success 'push split to subproj' ' ) ' +# +# This test covers 2 cases in subtree split copy_or_skip code +# 1) Merges where one parent is a superset of the changes of the other +# parent regarding changes to the subtree, in this case the merge +# commit should be copied +# 2) Merges where only one parent operate on the subtree, and the merge +# commit should be skipped +# +# (1) is checked by ensuring subtree_tip is a descendent of subtree_branch +# (2) should have a check added (not_a_subtree_change shouldn't be present +# on the produced subtree) +# +# Other related cases which are not tested (or currently handled correctly) +# - Case (1) where there are more than 2 parents, it will sometimes correctly copy +# the merge, and sometimes not +# - Merge commit where both parents have same tree as the merge, currently +# will always be skipped, even if they reached that state via different +# set of commits. +# + +next_test +test_expect_success 'subtree descendant check' ' + subtree_test_create_repo "$subtree_test_count" && + test_create_commit "$subtree_test_count" folder_subtree/a && + ( + cd "$subtree_test_count" && + git branch branch + ) && + test_create_commit "$subtree_test_count" folder_subtree/0 && + test_create_commit "$subtree_test_count" folder_subtree/b && + cherry=$(cd "$subtree_test_count"; git rev-parse HEAD) && + ( + cd "$subtree_test_count" && + git checkout branch + ) && + test_create_commit "$subtree_test_count" commit_on_branch && + ( + cd "$subtree_test_count" && + git cherry-pick $cherry && + git checkout master && + git merge -m "merge should be kept on subtree" branch && + git branch no_subtree_work_branch + ) && + test_create_commit "$subtree_test_count" folder_subtree/d && + ( + cd "$subtree_test_count" && + git checkout no_subtree_work_branch + ) && + test_create_commit "$subtree_test_count" not_a_subtree_change && + ( + cd "$subtree_test_count" && + git checkout master && + git merge -m "merge should be skipped on subtree" no_subtree_work_branch && + + git subtree split --prefix folder_subtree/ --branch subtree_tip master && + git subtree split --prefix folder_subtree/ --branch subtree_branch branch && + check_equal $(git rev-list --count subtree_tip..subtree_branch) 0 + ) +' + test_done diff --git a/contrib/thunderbird-patch-inline/appp.sh b/contrib/thunderbird-patch-inline/appp.sh index 8dc73ece15..1053872eea 100755 --- a/contrib/thunderbird-patch-inline/appp.sh +++ b/contrib/thunderbird-patch-inline/appp.sh @@ -31,8 +31,8 @@ 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'` +CCS=$(echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \ + -e 's/^Signed-off-by: \(.*\)/\1,/gp') echo "$SUBJECT" > $1 echo "Cc: $CCS" >> $1 diff --git a/convert.c b/convert.c index 814e814438..f524b8d7f4 100644 --- a/convert.c +++ b/convert.c @@ -13,18 +13,25 @@ * translation when the "text" attribute or "auto_crlf" option is set. */ +/* Stat bits: When BIN is set, the txt bits are unset */ +#define CONVERT_STAT_BITS_TXT_LF 0x1 +#define CONVERT_STAT_BITS_TXT_CRLF 0x2 +#define CONVERT_STAT_BITS_BIN 0x4 + enum crlf_action { - CRLF_GUESS = -1, - CRLF_BINARY = 0, + CRLF_UNDEFINED, + CRLF_BINARY, CRLF_TEXT, - CRLF_INPUT, - CRLF_CRLF, - CRLF_AUTO + CRLF_TEXT_INPUT, + CRLF_TEXT_CRLF, + CRLF_AUTO, + CRLF_AUTO_INPUT, + CRLF_AUTO_CRLF }; struct text_stat { /* NUL, CR, LF and CRLF counts */ - unsigned nul, cr, lf, crlf; + unsigned nul, lonecr, lonelf, crlf; /* These are just approximations! */ unsigned printable, nonprintable; @@ -39,13 +46,15 @@ static void gather_stats(const char *buf, unsigned long size, struct text_stat * for (i = 0; i < size; i++) { unsigned char c = buf[i]; if (c == '\r') { - stats->cr++; - if (i+1 < size && buf[i+1] == '\n') + if (i+1 < size && buf[i+1] == '\n') { stats->crlf++; + i++; + } else + stats->lonecr++; continue; } if (c == '\n') { - stats->lf++; + stats->lonelf++; continue; } if (c == 127) @@ -75,23 +84,84 @@ static void gather_stats(const char *buf, unsigned long size, struct text_stat * /* * The same heuristics as diff.c::mmfile_is_binary() + * We treat files with bare CR as binary */ -static int is_binary(unsigned long size, struct text_stat *stats) +static int convert_is_binary(unsigned long size, const struct text_stat *stats) { - + if (stats->lonecr) + return 1; if (stats->nul) return 1; if ((stats->printable >> 7) < stats->nonprintable) return 1; - /* - * Other heuristics? Average line length might be relevant, - * as might LF vs CR vs CRLF counts.. - * - * NOTE! It might be normal to have a low ratio of CRLF to LF - * (somebody starts with a LF-only file and edits it with an editor - * that adds CRLF only to lines that are added..). But do we - * want to support CR-only? Probably not. - */ + return 0; +} + +static unsigned int gather_convert_stats(const char *data, unsigned long size) +{ + struct text_stat stats; + int ret = 0; + if (!data || !size) + return 0; + gather_stats(data, size, &stats); + if (convert_is_binary(size, &stats)) + ret |= CONVERT_STAT_BITS_BIN; + if (stats.crlf) + ret |= CONVERT_STAT_BITS_TXT_CRLF; + if (stats.lonelf) + ret |= CONVERT_STAT_BITS_TXT_LF; + + return ret; +} + +static const char *gather_convert_stats_ascii(const char *data, unsigned long size) +{ + unsigned int convert_stats = gather_convert_stats(data, size); + + if (convert_stats & CONVERT_STAT_BITS_BIN) + return "-text"; + switch (convert_stats) { + case CONVERT_STAT_BITS_TXT_LF: + return "lf"; + case CONVERT_STAT_BITS_TXT_CRLF: + return "crlf"; + case CONVERT_STAT_BITS_TXT_LF | CONVERT_STAT_BITS_TXT_CRLF: + return "mixed"; + default: + return "none"; + } +} + +const char *get_cached_convert_stats_ascii(const char *path) +{ + const char *ret; + unsigned long sz; + void *data = read_blob_data_from_cache(path, &sz); + ret = gather_convert_stats_ascii(data, sz); + free(data); + return ret; +} + +const char *get_wt_convert_stats_ascii(const char *path) +{ + const char *ret = ""; + struct strbuf sb = STRBUF_INIT; + if (strbuf_read_file(&sb, path, 0) >= 0) + ret = gather_convert_stats_ascii(sb.buf, sb.len); + strbuf_release(&sb); + return ret; +} + +static int text_eol_is_crlf(void) +{ + if (auto_crlf == AUTO_CRLF_TRUE) + return 1; + else if (auto_crlf == AUTO_CRLF_INPUT) + return 0; + if (core_eol == EOL_CRLF) + return 1; + if (core_eol == EOL_UNSET && EOL_NATIVE == EOL_CRLF) + return 1; return 0; } @@ -100,23 +170,19 @@ static enum eol output_eol(enum crlf_action crlf_action) switch (crlf_action) { case CRLF_BINARY: return EOL_UNSET; - case CRLF_CRLF: + case CRLF_TEXT_CRLF: return EOL_CRLF; - case CRLF_INPUT: + case CRLF_TEXT_INPUT: return EOL_LF; - case CRLF_GUESS: - if (!auto_crlf) - return EOL_UNSET; - /* fall through */ + case CRLF_UNDEFINED: + case CRLF_AUTO_CRLF: + case CRLF_AUTO_INPUT: case CRLF_TEXT: case CRLF_AUTO: - if (auto_crlf == AUTO_CRLF_TRUE) - return EOL_CRLF; - else if (auto_crlf == AUTO_CRLF_INPUT) - return EOL_LF; - else if (core_eol == EOL_UNSET) - return EOL_NATIVE; + /* fall through */ + return text_eol_is_crlf() ? EOL_CRLF : EOL_LF; } + warning("Illegal crlf_action %d\n", (int)crlf_action); return core_eol; } @@ -142,7 +208,7 @@ static void check_safe_crlf(const char *path, enum crlf_action crlf_action, * CRLFs would be added by checkout: * check if we have "naked" LFs */ - if (stats->lf != stats->crlf) { + if (stats->lonelf) { if (checksafe == SAFE_CRLF_WARN) warning("LF will be replaced by CRLF in %s.\nThe file will have its original line endings in your working directory.", path); else /* i.e. SAFE_CRLF_FAIL */ @@ -173,7 +239,6 @@ static int crlf_to_git(const char *path, const char *src, size_t len, char *dst; if (crlf_action == CRLF_BINARY || - (crlf_action == CRLF_GUESS && auto_crlf == AUTO_CRLF_FALSE) || (src && !len)) return 0; @@ -186,22 +251,11 @@ static int crlf_to_git(const char *path, const char *src, size_t len, gather_stats(src, len, &stats); - if (crlf_action == CRLF_AUTO || crlf_action == CRLF_GUESS) { - /* - * We're currently not going to even try to convert stuff - * that has bare CR characters. Does anybody do that crazy - * stuff? - */ - if (stats.cr != stats.crlf) + if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) { + if (convert_is_binary(len, &stats)) return 0; - /* - * And add some heuristics for binary vs text, of course... - */ - if (is_binary(len, &stats)) - return 0; - - if (crlf_action == CRLF_GUESS) { + if (crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) { /* * If the file in the index has any CR in it, do not convert. * This is the new safer autocrlf handling. @@ -213,8 +267,8 @@ static int crlf_to_git(const char *path, const char *src, size_t len, check_safe_crlf(path, crlf_action, &stats, checksafe); - /* Optimization: No CR? Nothing to convert, regardless. */ - if (!stats.cr) + /* Optimization: No CRLF? Nothing to convert, regardless. */ + if (!stats.crlf) return 0; /* @@ -228,7 +282,7 @@ static int crlf_to_git(const char *path, const char *src, size_t len, if (strbuf_avail(buf) + buf->len < len) strbuf_grow(buf, len - buf->len); dst = buf->buf; - if (crlf_action == CRLF_AUTO || crlf_action == CRLF_GUESS) { + if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) { /* * If we guessed, we already know we rejected a file with * lone CR, and we can strip a CR without looking at what @@ -261,27 +315,19 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len, gather_stats(src, len, &stats); - /* No LF? Nothing to convert, regardless. */ - if (!stats.lf) + /* No "naked" LF? Nothing to convert, regardless. */ + if (!stats.lonelf) return 0; - /* Was it already in CRLF format? */ - if (stats.lf == stats.crlf) - return 0; - - if (crlf_action == CRLF_AUTO || crlf_action == CRLF_GUESS) { - if (crlf_action == CRLF_GUESS) { + if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) { + if (crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) { /* If we have any CR or CRLF line endings, we do not touch it */ /* This is the new safer autocrlf-handling */ - if (stats.cr > 0 || stats.crlf > 0) + if (stats.lonecr || stats.crlf ) return 0; } - /* If we have any bare CR characters, we're not going to touch it */ - if (stats.cr != stats.crlf) - return 0; - - if (is_binary(len, &stats)) + if (convert_is_binary(len, &stats)) return 0; } @@ -289,7 +335,7 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len, if (src == buf->buf) to_free = strbuf_detach(buf, NULL); - strbuf_grow(buf, len + stats.lf - stats.crlf); + strbuf_grow(buf, len + stats.lonelf); for (;;) { const char *nl = memchr(src, '\n', len); if (!nl) @@ -395,7 +441,7 @@ static int apply_filter(const char *path, const char *src, size_t len, int fd, struct async async; struct filter_params params; - if (!cmd) + if (!cmd || !*cmd) return 0; if (!dst) @@ -657,7 +703,7 @@ static int ident_to_worktree(const char *path, const char *src, size_t len, return 1; } -static enum crlf_action git_path_check_crlf(const char *path, struct git_attr_check *check) +static enum crlf_action git_path_check_crlf(struct git_attr_check *check) { const char *value = check->value; @@ -668,13 +714,13 @@ static enum crlf_action git_path_check_crlf(const char *path, struct git_attr_ch else if (ATTR_UNSET(value)) ; else if (!strcmp(value, "input")) - return CRLF_INPUT; + return CRLF_TEXT_INPUT; else if (!strcmp(value, "auto")) return CRLF_AUTO; - return CRLF_GUESS; + return CRLF_UNDEFINED; } -static enum eol git_path_check_eol(const char *path, struct git_attr_check *check) +static enum eol git_path_check_eol(struct git_attr_check *check) { const char *value = check->value; @@ -687,8 +733,7 @@ static enum eol git_path_check_eol(const char *path, struct git_attr_check *chec return EOL_UNSET; } -static struct convert_driver *git_path_check_convert(const char *path, - struct git_attr_check *check) +static struct convert_driver *git_path_check_convert(struct git_attr_check *check) { const char *value = check->value; struct convert_driver *drv; @@ -701,28 +746,17 @@ static struct convert_driver *git_path_check_convert(const char *path, return NULL; } -static int git_path_check_ident(const char *path, struct git_attr_check *check) +static int git_path_check_ident(struct git_attr_check *check) { const char *value = check->value; return !!ATTR_TRUE(value); } -static enum crlf_action input_crlf_action(enum crlf_action text_attr, enum eol eol_attr) -{ - if (text_attr == CRLF_BINARY) - return CRLF_BINARY; - if (eol_attr == EOL_LF) - return CRLF_INPUT; - if (eol_attr == EOL_CRLF) - return CRLF_CRLF; - return text_attr; -} - struct conv_attrs { struct convert_driver *drv; - enum crlf_action crlf_action; - enum eol eol_attr; + enum crlf_action attr_action; /* What attr says */ + enum crlf_action crlf_action; /* When no attr is set, use core.autocrlf */ int ident; }; @@ -744,18 +778,33 @@ static void convert_attrs(struct conv_attrs *ca, const char *path) } if (!git_check_attr(path, NUM_CONV_ATTRS, ccheck)) { - ca->crlf_action = git_path_check_crlf(path, ccheck + 4); - if (ca->crlf_action == CRLF_GUESS) - ca->crlf_action = git_path_check_crlf(path, ccheck + 0); - ca->ident = git_path_check_ident(path, ccheck + 1); - ca->drv = git_path_check_convert(path, ccheck + 2); - ca->eol_attr = git_path_check_eol(path, ccheck + 3); + ca->crlf_action = git_path_check_crlf(ccheck + 4); + if (ca->crlf_action == CRLF_UNDEFINED) + ca->crlf_action = git_path_check_crlf(ccheck + 0); + ca->attr_action = ca->crlf_action; + ca->ident = git_path_check_ident(ccheck + 1); + ca->drv = git_path_check_convert(ccheck + 2); + if (ca->crlf_action != CRLF_BINARY) { + enum eol eol_attr = git_path_check_eol(ccheck + 3); + if (eol_attr == EOL_LF) + ca->crlf_action = CRLF_TEXT_INPUT; + else if (eol_attr == EOL_CRLF) + ca->crlf_action = CRLF_TEXT_CRLF; + } + ca->attr_action = ca->crlf_action; } else { ca->drv = NULL; - ca->crlf_action = CRLF_GUESS; - ca->eol_attr = EOL_UNSET; + ca->crlf_action = CRLF_UNDEFINED; ca->ident = 0; } + if (ca->crlf_action == CRLF_TEXT) + ca->crlf_action = text_eol_is_crlf() ? CRLF_TEXT_CRLF : CRLF_TEXT_INPUT; + if (ca->crlf_action == CRLF_UNDEFINED && auto_crlf == AUTO_CRLF_FALSE) + ca->crlf_action = CRLF_BINARY; + if (ca->crlf_action == CRLF_UNDEFINED && auto_crlf == AUTO_CRLF_TRUE) + ca->crlf_action = CRLF_AUTO_CRLF; + if (ca->crlf_action == CRLF_UNDEFINED && auto_crlf == AUTO_CRLF_INPUT) + ca->crlf_action = CRLF_AUTO_INPUT; } int would_convert_to_git_filter_fd(const char *path) @@ -777,6 +826,32 @@ int would_convert_to_git_filter_fd(const char *path) return apply_filter(path, NULL, 0, -1, NULL, ca.drv->clean); } +const char *get_convert_attr_ascii(const char *path) +{ + struct conv_attrs ca; + + convert_attrs(&ca, path); + switch (ca.attr_action) { + case CRLF_UNDEFINED: + return ""; + case CRLF_BINARY: + return "-text"; + case CRLF_TEXT: + return "text"; + case CRLF_TEXT_INPUT: + return "text eol=lf"; + case CRLF_TEXT_CRLF: + return "text eol=crlf"; + case CRLF_AUTO: + return "text=auto"; + case CRLF_AUTO_CRLF: + return "text=auto eol=crlf"; /* This is not supported yet */ + case CRLF_AUTO_INPUT: + return "text=auto eol=lf"; /* This is not supported yet */ + } + return ""; +} + int convert_to_git(const char *path, const char *src, size_t len, struct strbuf *dst, enum safe_crlf checksafe) { @@ -799,7 +874,6 @@ int convert_to_git(const char *path, const char *src, size_t len, src = dst->buf; len = dst->len; } - ca.crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr); ret |= crlf_to_git(path, src, len, dst, ca.crlf_action, checksafe); if (ret && dst) { src = dst->buf; @@ -820,7 +894,6 @@ void convert_to_git_filter_fd(const char *path, int fd, struct strbuf *dst, if (!apply_filter(path, NULL, 0, fd, dst, ca.drv->clean)) die("%s: clean filter '%s' failed", path, ca.drv->name); - ca.crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr); crlf_to_git(path, dst->buf, dst->len, dst, ca.crlf_action, checksafe); ident_to_git(path, dst->buf, dst->len, dst, ca.ident); } @@ -850,7 +923,6 @@ static int convert_to_working_tree_internal(const char *path, const char *src, * is a smudge filter. The filter might expect CRLFs. */ if (filter || !normalizing) { - ca.crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr); ret |= crlf_to_worktree(path, src, len, dst, ca.crlf_action); if (ret) { src = dst->buf; @@ -1319,14 +1391,15 @@ struct stream_filter *get_stream_filter(const char *path, const unsigned char *s if (ca.ident) filter = ident_filter(sha1); - crlf_action = input_crlf_action(ca.crlf_action, ca.eol_attr); + crlf_action = ca.crlf_action; - if ((crlf_action == CRLF_BINARY) || (crlf_action == CRLF_INPUT) || - (crlf_action == CRLF_GUESS && auto_crlf == AUTO_CRLF_FALSE)) + if ((crlf_action == CRLF_BINARY) || + crlf_action == CRLF_AUTO_INPUT || + (crlf_action == CRLF_TEXT_INPUT)) filter = cascade_filter(filter, &null_filter_singleton); else if (output_eol(crlf_action) == EOL_CRLF && - !(crlf_action == CRLF_AUTO || crlf_action == CRLF_GUESS)) + !(crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_CRLF)) filter = cascade_filter(filter, lf_to_crlf_filter()); return filter; diff --git a/convert.h b/convert.h index d9d853cd3d..ccf436bfbf 100644 --- a/convert.h +++ b/convert.h @@ -32,6 +32,9 @@ enum eol { }; extern enum eol core_eol; +extern const char *get_cached_convert_stats_ascii(const char *path); +extern const char *get_wt_convert_stats_ascii(const char *path); +extern const char *get_convert_attr_ascii(const char *path); /* returns 1 if *dst was used */ extern int convert_to_git(const char *path, const char *src, size_t len, diff --git a/credential-cache--daemon.c b/credential-cache--daemon.c index 9365f2ce5c..caef21e4fc 100644 --- a/credential-cache--daemon.c +++ b/credential-cache--daemon.c @@ -96,12 +96,12 @@ static int read_request(FILE *fh, struct credential *c, static struct strbuf item = STRBUF_INIT; const char *p; - strbuf_getline(&item, fh, '\n'); + strbuf_getline_lf(&item, fh); if (!skip_prefix(item.buf, "action=", &p)) return error("client sent bogus action line: %s", item.buf); strbuf_addstr(action, p); - strbuf_getline(&item, fh, '\n'); + strbuf_getline_lf(&item, fh); if (!skip_prefix(item.buf, "timeout=", &p)) return error("client sent bogus timeout line: %s", item.buf); *timeout = atoi(p); @@ -215,7 +215,7 @@ static const char permissions_advice[] = "users may be able to read your cached credentials. Consider running:\n" "\n" " chmod 0700 %s"; -static void check_socket_directory(const char *path) +static void init_socket_directory(const char *path) { struct stat st; char *path_copy = xstrdup(path); @@ -224,20 +224,27 @@ static void check_socket_directory(const char *path) if (!stat(dir, &st)) { if (st.st_mode & 077) die(permissions_advice, dir); - free(path_copy); - return; + } else { + /* + * We must be sure to create the directory with the correct mode, + * not just chmod it after the fact; otherwise, there is a race + * condition in which somebody can chdir to it, sleep, then try to open + * our protected socket. + */ + if (safe_create_leading_directories_const(dir) < 0) + die_errno("unable to create directories for '%s'", dir); + if (mkdir(dir, 0700) < 0) + die_errno("unable to mkdir '%s'", dir); } - /* - * We must be sure to create the directory with the correct mode, - * not just chmod it after the fact; otherwise, there is a race - * condition in which somebody can chdir to it, sleep, then try to open - * our protected socket. - */ - if (safe_create_leading_directories_const(dir) < 0) - die_errno("unable to create directories for '%s'", dir); - if (mkdir(dir, 0700) < 0) - die_errno("unable to mkdir '%s'", dir); + if (chdir(dir)) + /* + * We don't actually care what our cwd is; we chdir here just to + * be a friendly daemon and avoid tying up our original cwd. + * If this fails, it's OK to just continue without that benefit. + */ + ; + free(path_copy); } @@ -264,7 +271,10 @@ int main(int argc, const char **argv) if (!socket_path) usage_with_options(usage, options); - check_socket_directory(socket_path); + if (!is_absolute_path(socket_path)) + die("socket directory must be an absolute path"); + + init_socket_directory(socket_path); register_tempfile(&socket_file, socket_path); if (ignore_sighup) diff --git a/credential-store.c b/credential-store.c index fc67d16c10..57141679ab 100644 --- a/credential-store.c +++ b/credential-store.c @@ -23,7 +23,7 @@ static int parse_credential_file(const char *fn, return found_credential; } - while (strbuf_getline(&line, fh, '\n') != EOF) { + while (strbuf_getline_lf(&line, fh) != EOF) { credential_from_url(&entry, line.buf); if (entry.username && entry.password && credential_match(c, &entry)) { @@ -64,8 +64,7 @@ static void rewrite_credential_file(const char *fn, struct credential *c, print_line(extra); parse_credential_file(fn, c, NULL, print_line); if (commit_lock_file(&credential_lock) < 0) - die_errno("unable to write credential store: %s", - strerror(errno)); + die_errno("unable to write credential store"); } static void store_credential_file(const char *fn, struct credential *c) diff --git a/credential.c b/credential.c index b146ad8481..7d6501d190 100644 --- a/credential.c +++ b/credential.c @@ -142,7 +142,7 @@ int credential_read(struct credential *c, FILE *fp) { struct strbuf line = STRBUF_INIT; - while (strbuf_getline(&line, fp, '\n') != EOF) { + while (strbuf_getline_lf(&line, fp) != EOF) { char *key = line.buf; char *value = strchr(key, '='); diff --git a/daemon.c b/daemon.c index be70cd4da0..8d45c336f5 100644 --- a/daemon.c +++ b/daemon.c @@ -424,7 +424,7 @@ static void copy_to_log(int fd) return; } - while (strbuf_getline(&line, fp, '\n') != EOF) { + while (strbuf_getline_lf(&line, fp) != EOF) { logerror("%s", line.buf); strbuf_setlen(&line, 0); } @@ -808,7 +808,7 @@ static void check_dead_children(void) cradle = &blanket->next; } -static char **cld_argv; +static struct argv_array cld_argv = ARGV_ARRAY_INIT; static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen) { struct child_process cld = CHILD_PROCESS_INIT; @@ -842,7 +842,7 @@ static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen) #endif } - cld.argv = (const char **)cld_argv; + cld.argv = cld_argv.argv; cld.in = incoming; cld.out = dup(incoming); @@ -1374,12 +1374,10 @@ int main(int argc, char **argv) write_file(pid_file, "%"PRIuMAX, (uintmax_t) getpid()); /* prepare argv for serving-processes */ - cld_argv = xmalloc(sizeof (char *) * (argc + 2)); - cld_argv[0] = argv[0]; /* git-daemon */ - cld_argv[1] = "--serve"; + argv_array_push(&cld_argv, argv[0]); /* git-daemon */ + argv_array_push(&cld_argv, "--serve"); for (i = 1; i < argc; ++i) - cld_argv[i+1] = argv[i]; - cld_argv[argc+1] = NULL; + argv_array_push(&cld_argv, argv[i]); return serve(&listen_addr, listen_port, cred); } diff --git a/diff-no-index.c b/diff-no-index.c index 8e0fd270b5..03daadb25a 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -237,12 +237,12 @@ static void fixup_paths(const char **path, struct strbuf *replacement) } void diff_no_index(struct rev_info *revs, - int argc, const char **argv, - const char *prefix) + int argc, const char **argv) { int i, prefixlen; const char *paths[2]; struct strbuf replacement = STRBUF_INIT; + const char *prefix = revs->prefix; diff_setup(&revs->diffopt); for (i = 1; i < argc - 2; ) { @@ -252,7 +252,8 @@ void diff_no_index(struct rev_info *revs, else if (!strcmp(argv[i], "--")) i++; else { - j = diff_opt_parse(&revs->diffopt, argv + i, argc - i); + j = diff_opt_parse(&revs->diffopt, argv + i, argc - i, + revs->prefix); if (j <= 0) die("invalid diff option/value: %s", argv[i]); i += j; diff --git a/diff.c b/diff.c index 80eb0c2156..059123c5dc 100644 --- a/diff.c +++ b/diff.c @@ -2607,12 +2607,9 @@ static void builtin_checkdiff(const char *name_a, const char *name_b, struct diff_filespec *alloc_filespec(const char *path) { - int namelen = strlen(path); - struct diff_filespec *spec = xmalloc(sizeof(*spec) + namelen + 1); + struct diff_filespec *spec; - memset(spec, 0, sizeof(*spec)); - spec->path = (char *)(spec + 1); - memcpy(spec->path, path, namelen+1); + FLEXPTR_ALLOC_STR(spec, path, path); spec->count = 1; spec->is_binary = -1; return spec; @@ -2707,21 +2704,21 @@ static int reuse_worktree_file(const char *name, const unsigned char *sha1, int static int diff_populate_gitlink(struct diff_filespec *s, int size_only) { - int len; - char *data = xmalloc(100), *dirty = ""; + struct strbuf buf = STRBUF_INIT; + char *dirty = ""; /* Are we looking at the work tree? */ if (s->dirty_submodule) dirty = "-dirty"; - len = snprintf(data, 100, - "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty); - s->data = data; - s->size = len; - s->should_free = 1; + strbuf_addf(&buf, "Subproject commit %s%s\n", sha1_to_hex(s->sha1), dirty); + s->size = buf.len; if (size_only) { s->data = NULL; - free(data); + strbuf_release(&buf); + } else { + s->data = strbuf_detach(&buf, NULL); + s->should_free = 1; } return 0; } @@ -3693,12 +3690,16 @@ static int parse_ws_error_highlight(struct diff_options *opt, const char *arg) return 1; } -int diff_opt_parse(struct diff_options *options, const char **av, int ac) +int diff_opt_parse(struct diff_options *options, + const char **av, int ac, const char *prefix) { const char *arg = av[0]; const char *optarg; int argcount; + if (!prefix) + prefix = ""; + /* Output format options */ if (!strcmp(arg, "-p") || !strcmp(arg, "-u") || !strcmp(arg, "--patch") || opt_arg(arg, 'U', "unified", &options->context)) @@ -3915,7 +3916,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) else if (!strcmp(arg, "--pickaxe-regex")) options->pickaxe_opts |= DIFF_PICKAXE_REGEX; else if ((argcount = short_opt('O', av, &optarg))) { - options->orderfile = optarg; + const char *path = prefix_filename(prefix, strlen(prefix), optarg); + options->orderfile = xstrdup(path); return argcount; } else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) { @@ -3954,9 +3956,10 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) else if (!strcmp(arg, "--no-function-context")) DIFF_OPT_CLR(options, FUNCCONTEXT); else if ((argcount = parse_long_opt("output", av, &optarg))) { - options->file = fopen(optarg, "w"); + const char *path = prefix_filename(prefix, strlen(prefix), optarg); + options->file = fopen(path, "w"); if (!options->file) - die_errno("Could not open '%s'", optarg); + die_errno("Could not open '%s'", path); options->close_file = 1; return argcount; } else @@ -5079,7 +5082,7 @@ size_t fill_textconv(struct userdiff_driver *driver, { size_t size; - if (!driver || !driver->textconv) { + if (!driver) { if (!DIFF_FILE_VALID(df)) { *outbuf = ""; return 0; @@ -5090,6 +5093,9 @@ size_t fill_textconv(struct userdiff_driver *driver, return df->size; } + if (!driver->textconv) + die("BUG: fill_textconv called with non-textconv driver"); + if (driver->textconv_cache && df->sha1_valid) { *outbuf = notes_cache_get(driver->textconv_cache, df->sha1, &size); diff --git a/diff.h b/diff.h index f7208ad103..e7d68edaf9 100644 --- a/diff.h +++ b/diff.h @@ -91,7 +91,7 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data) #define DIFF_OPT_DIRSTAT_BY_LINE (1 << 28) #define DIFF_OPT_FUNCCONTEXT (1 << 29) #define DIFF_OPT_PICKAXE_IGNORE_CASE (1 << 30) -#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1 << 31) +#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1U << 31) #define DIFF_OPT_TST(opts, flag) ((opts)->flags & DIFF_OPT_##flag) #define DIFF_OPT_TOUCHED(opts, flag) ((opts)->touched_flags & DIFF_OPT_##flag) @@ -222,8 +222,8 @@ struct combine_diff_path { } parent[FLEX_ARRAY]; }; #define combine_diff_path_size(n, l) \ - (sizeof(struct combine_diff_path) + \ - sizeof(struct combine_diff_parent) * (n) + (l) + 1) + st_add4(sizeof(struct combine_diff_path), (l), 1, \ + st_mult(sizeof(struct combine_diff_parent), (n))) extern void show_combined_diff(struct combine_diff_path *elem, int num_parent, int dense, struct rev_info *); @@ -268,7 +268,7 @@ extern int parse_long_opt(const char *opt, const char **argv, extern int git_diff_basic_config(const char *var, const char *value, void *cb); extern int git_diff_ui_config(const char *var, const char *value, void *cb); extern void diff_setup(struct diff_options *); -extern int diff_opt_parse(struct diff_options *, const char **, int); +extern int diff_opt_parse(struct diff_options *, const char **, int, const char *); extern void diff_setup_done(struct diff_options *); #define DIFF_DETECT_RENAME 1 @@ -345,14 +345,30 @@ extern int diff_flush_patch_id(struct diff_options *, unsigned char *); extern int diff_result_code(struct diff_options *, int); -extern void diff_no_index(struct rev_info *, int, const char **, const char *); +extern void diff_no_index(struct rev_info *, int, const char **); extern int index_differs_from(const char *def, int diff_flags); +/* + * Fill the contents of the filespec "df", respecting any textconv defined by + * its userdiff driver. The "driver" parameter must come from a + * previous call to get_textconv(), and therefore should either be NULL or have + * textconv enabled. + * + * Note that the memory ownership of the resulting buffer depends on whether + * the driver field is NULL. If it is, then the memory belongs to the filespec + * struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer + * that should be freed by the caller. + */ extern size_t fill_textconv(struct userdiff_driver *driver, struct diff_filespec *df, char **outbuf); +/* + * Look up the userdiff driver for the given filespec, and return it if + * and only if it has textconv enabled (otherwise return NULL). The result + * can be passed to fill_textconv(). + */ extern struct userdiff_driver *get_textconv(struct diff_filespec *one); extern int parse_rename_score(const char **cp_p); diff --git a/diffcore-delta.c b/diffcore-delta.c index 7cf431d261..4159748a70 100644 --- a/diffcore-delta.c +++ b/diffcore-delta.c @@ -53,7 +53,8 @@ static struct spanhash_top *spanhash_rehash(struct spanhash_top *orig) int osz = 1 << orig->alloc_log2; int sz = osz << 1; - new = xmalloc(sizeof(*orig) + sizeof(struct spanhash) * sz); + new = xmalloc(st_add(sizeof(*orig), + st_mult(sizeof(struct spanhash), sz))); new->alloc_log2 = orig->alloc_log2 + 1; new->free = INITIAL_FREE(new->alloc_log2); memset(new->data, 0, sizeof(struct spanhash) * sz); @@ -130,7 +131,8 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one) int is_text = !diff_filespec_is_binary(one); i = INITIAL_HASH_SIZE; - hash = xmalloc(sizeof(*hash) + sizeof(struct spanhash) * (1<alloc_log2 = i; hash->free = INITIAL_FREE(i); memset(hash->data, 0, sizeof(struct spanhash) * (1<nr) return; - o = xmalloc(sizeof(*o) * q->nr); + ALLOC_ARRAY(o, q->nr); for (i = 0; i < q->nr; i++) o[i].obj = q->queue[i]; order_objects(orderfile, pair_pathtwo, o, q->nr); diff --git a/diffcore-rename.c b/diffcore-rename.c index af1fe08861..3b3c1ed535 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -537,7 +537,7 @@ void diffcore_rename(struct diff_options *options) rename_dst_nr * rename_src_nr, 50, 1); } - mx = xcalloc(num_create * NUM_CANDIDATE_PER_DST, sizeof(*mx)); + mx = xcalloc(st_mult(num_create, NUM_CANDIDATE_PER_DST), sizeof(*mx)); for (dst_cnt = i = 0; i < rename_dst_nr; i++) { struct diff_filespec *two = rename_dst[i].two; struct diff_score *m; diff --git a/dir.c b/dir.c index d2a8f06b02..a4a9d9fae1 100644 --- a/dir.c +++ b/dir.c @@ -503,12 +503,7 @@ void add_exclude(const char *string, const char *base, parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen); if (flags & EXC_FLAG_MUSTBEDIR) { - char *s; - x = xmalloc(sizeof(*x) + patternlen + 1); - s = (char *)(x+1); - memcpy(s, string, patternlen); - s[patternlen] = '\0'; - x->pattern = s; + FLEXPTR_ALLOC_MEM(x, pattern, string, patternlen); } else { x = xmalloc(sizeof(*x)); x->pattern = string; @@ -564,9 +559,7 @@ void clear_exclude_list(struct exclude_list *el) free(el->excludes); free(el->filebuf); - el->nr = 0; - el->excludes = NULL; - el->filebuf = NULL; + memset(el, 0, sizeof(*el)); } static void trim_trailing_spaces(char *buf) @@ -627,10 +620,7 @@ static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc, } uc->dir_created++; - d = xmalloc(sizeof(*d) + len + 1); - memset(d, 0, sizeof(*d)); - memcpy(d->name, name, len); - d->name[len] = '\0'; + FLEX_ALLOC_MEM(d, name, name, len); ALLOC_GROW(dir->dirs, dir->dirs_nr + 1, dir->dirs_alloc); memmove(dir->dirs + first + 1, dir->dirs + first, @@ -699,7 +689,7 @@ static int add_excludes(const char *fname, const char *base, int baselen, return 0; } if (buf[size-1] != '\n') { - buf = xrealloc(buf, size+1); + buf = xrealloc(buf, st_add(size, 1)); buf[size++] = '\n'; } } else { @@ -713,7 +703,7 @@ static int add_excludes(const char *fname, const char *base, int baselen, close(fd); return 0; } - buf = xmalloc(size+1); + buf = xmallocz(size); if (read_in_full(fd, buf, size) != size) { free(buf); close(fd); @@ -882,25 +872,6 @@ int match_pathname(const char *pathname, int pathlen, */ if (!patternlen && !namelen) return 1; - /* - * This can happen when we ignore some exclude rules - * on directories in other to see if negative rules - * may match. E.g. - * - * /abc - * !/abc/def/ghi - * - * The pattern of interest is "/abc". On the first - * try, we should match path "abc" with this pattern - * in the "if" statement right above, but the caller - * ignores it. - * - * On the second try with paths within "abc", - * e.g. "abc/xyz", we come here and try to match it - * with "/abc". - */ - if (!patternlen && namelen && *name == '/') - return 1; } return fnmatch_icase_mem(pattern, patternlen, @@ -908,48 +879,6 @@ int match_pathname(const char *pathname, int pathlen, WM_PATHNAME) == 0; } -/* - * Return non-zero if pathname is a directory and an ancestor of the - * literal path in a (negative) pattern. This is used to keep - * descending in "foo" and "foo/bar" when the pattern is - * "!foo/bar/.gitignore". "foo/notbar" will not be descended however. - */ -static int match_neg_path(const char *pathname, int pathlen, int *dtype, - const char *base, int baselen, - const char *pattern, int prefix, int patternlen, - int flags) -{ - assert((flags & EXC_FLAG_NEGATIVE) && !(flags & EXC_FLAG_NODIR)); - - if (*dtype == DT_UNKNOWN) - *dtype = get_dtype(NULL, pathname, pathlen); - if (*dtype != DT_DIR) - return 0; - - if (*pattern == '/') { - pattern++; - patternlen--; - prefix--; - } - - if (baselen) { - if (((pathlen < baselen && base[pathlen] == '/') || - pathlen == baselen) && - !strncmp_icase(pathname, base, pathlen)) - return 1; - pathname += baselen + 1; - pathlen -= baselen + 1; - } - - - if (prefix && - ((pathlen < prefix && pattern[pathlen] == '/') && - !strncmp_icase(pathname, pattern, pathlen))) - return 1; - - return 0; -} - /* * Scan the given exclude list in reverse to see whether pathname * should be ignored. The first match (i.e. the last on the list), if @@ -963,7 +892,7 @@ static struct exclude *last_exclude_matching_from_list(const char *pathname, struct exclude_list *el) { struct exclude *exc = NULL; /* undecided */ - int i, matched_negative_path = 0; + int i; if (!el->nr) return NULL; /* undefined */ @@ -998,18 +927,7 @@ static struct exclude *last_exclude_matching_from_list(const char *pathname, exc = x; break; } - - if ((x->flags & EXC_FLAG_NEGATIVE) && !matched_negative_path && - match_neg_path(pathname, pathlen, dtype, x->base, - x->baselen ? x->baselen - 1 : 0, - exclude, prefix, x->patternlen, x->flags)) - matched_negative_path = 1; } - if (exc && - !(exc->flags & EXC_FLAG_NEGATIVE) && - !(exc->flags & EXC_FLAG_NODIR) && - matched_negative_path) - exc = NULL; return exc; } @@ -1241,10 +1159,8 @@ static struct dir_entry *dir_entry_new(const char *pathname, int len) { struct dir_entry *ent; - ent = xmalloc(sizeof(*ent) + len + 1); + FLEX_ALLOC_MEM(ent, name, pathname, len); ent->len = len; - memcpy(ent->name, pathname, len); - ent->name[len] = 0; return ent; } @@ -1913,31 +1829,67 @@ static const char *get_ident_string(void) return sb.buf; if (uname(&uts) < 0) die_errno(_("failed to get kernel name and information")); - strbuf_addf(&sb, "Location %s, system %s %s %s", get_git_work_tree(), - uts.sysname, uts.release, uts.version); + strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(), + uts.sysname); return sb.buf; } static int ident_in_untracked(const struct untracked_cache *uc) { - const char *end = uc->ident.buf + uc->ident.len; - const char *p = uc->ident.buf; + /* + * Previous git versions may have saved many NUL separated + * strings in the "ident" field, but it is insane to manage + * many locations, so just take care of the first one. + */ - for (p = uc->ident.buf; p < end; p += strlen(p) + 1) - if (!strcmp(p, get_ident_string())) - return 1; - return 0; + return !strcmp(uc->ident.buf, get_ident_string()); } -void add_untracked_ident(struct untracked_cache *uc) +static void set_untracked_ident(struct untracked_cache *uc) { - if (ident_in_untracked(uc)) - return; + strbuf_reset(&uc->ident); strbuf_addstr(&uc->ident, get_ident_string()); - /* this strbuf contains a list of strings, save NUL too */ + + /* + * This strbuf used to contain a list of NUL separated + * strings, so save NUL too for backward compatibility. + */ strbuf_addch(&uc->ident, 0); } +static void new_untracked_cache(struct index_state *istate) +{ + struct untracked_cache *uc = xcalloc(1, sizeof(*uc)); + strbuf_init(&uc->ident, 100); + uc->exclude_per_dir = ".gitignore"; + /* should be the same flags used by git-status */ + uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; + set_untracked_ident(uc); + istate->untracked = uc; + istate->cache_changed |= UNTRACKED_CHANGED; +} + +void add_untracked_cache(struct index_state *istate) +{ + if (!istate->untracked) { + new_untracked_cache(istate); + } else { + if (!ident_in_untracked(istate->untracked)) { + free_untracked_cache(istate->untracked); + new_untracked_cache(istate); + } + } +} + +void remove_untracked_cache(struct index_state *istate) +{ + if (istate->untracked) { + free_untracked_cache(istate->untracked); + istate->untracked = NULL; + istate->cache_changed |= UNTRACKED_CHANGED; + } +} + static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir, int base_len, const struct pathspec *pathspec) @@ -1995,7 +1947,7 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d return NULL; if (!ident_in_untracked(dir->untracked)) { - warning(_("Untracked cache is disabled on this system.")); + warning(_("Untracked cache is disabled on this system or location.")); return NULL; } @@ -2408,16 +2360,15 @@ void write_untracked_extension(struct strbuf *out, struct untracked_cache *untra struct ondisk_untracked_cache *ouc; struct write_data wd; unsigned char varbuf[16]; - int len = 0, varint_len; - if (untracked->exclude_per_dir) - len = strlen(untracked->exclude_per_dir); - ouc = xmalloc(sizeof(*ouc) + len + 1); + int varint_len; + size_t len = strlen(untracked->exclude_per_dir); + + FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len); stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat); stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat); hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.sha1); hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.sha1); ouc->dir_flags = htonl(untracked->dir_flags); - memcpy(ouc->exclude_per_dir, untracked->exclude_per_dir, len + 1); varint_len = encode_varint(untracked->ident.len, varbuf); strbuf_add(out, varbuf, varint_len); @@ -2522,21 +2473,21 @@ static int read_one_dir(struct untracked_cache_dir **untracked_, ud.untracked_alloc = value; ud.untracked_nr = value; if (ud.untracked_nr) - ud.untracked = xmalloc(sizeof(*ud.untracked) * ud.untracked_nr); + ALLOC_ARRAY(ud.untracked, ud.untracked_nr); data = next; next = data; ud.dirs_alloc = ud.dirs_nr = decode_varint(&next); if (next > end) return -1; - ud.dirs = xmalloc(sizeof(*ud.dirs) * ud.dirs_nr); + ALLOC_ARRAY(ud.dirs, ud.dirs_nr); data = next; len = strlen((const char *)data); next = data + len + 1; if (next > rd->end) return -1; - *untracked_ = untracked = xmalloc(sizeof(*untracked) + len); + *untracked_ = untracked = xmalloc(st_add(sizeof(*untracked), len)); memcpy(untracked, &ud, sizeof(ud)); memcpy(untracked->name, data, len + 1); data = next; @@ -2649,7 +2600,7 @@ struct untracked_cache *read_untracked_extension(const void *data, unsigned long rd.data = next; rd.end = end; rd.index = 0; - rd.ucd = xmalloc(sizeof(*rd.ucd) * len); + ALLOC_ARRAY(rd.ucd, len); if (read_one_dir(&uc->root, &rd) || rd.index != len) goto done; diff --git a/dir.h b/dir.h index 7b5855dd80..cd46f30017 100644 --- a/dir.h +++ b/dir.h @@ -307,5 +307,6 @@ void untracked_cache_add_to_index(struct index_state *, const char *); void free_untracked_cache(struct untracked_cache *); struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz); void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked); -void add_untracked_ident(struct untracked_cache *); +void add_untracked_cache(struct index_state *istate); +void remove_untracked_cache(struct index_state *istate); #endif diff --git a/entry.c b/entry.c index 582c40071a..a4109574fa 100644 --- a/entry.c +++ b/entry.c @@ -6,7 +6,7 @@ static void create_directories(const char *path, int path_len, const struct checkout *state) { - char *buf = xmalloc(path_len + 1); + char *buf = xmallocz(path_len); int len = 0; while (len < path_len) { diff --git a/environment.c b/environment.c index 2da7fe2e06..6dec9d0403 100644 --- a/environment.c +++ b/environment.c @@ -87,6 +87,13 @@ int auto_comment_line_char; /* Parallel index stat data preload? */ int core_preload_index = 1; +/* + * This is a hack for test programs like test-dump-untracked-cache to + * ensure that they do not modify the untracked cache when reading it. + * Do not use it otherwise! + */ +int ignore_untracked_cache_config; + /* This is set by setup_git_dir_gently() and/or git_default_config() */ char *git_work_tree_cfg; static char *work_tree; @@ -235,8 +242,6 @@ void set_git_work_tree(const char *new_work_tree) } git_work_tree_initialized = 1; work_tree = xstrdup(real_path(new_work_tree)); - if (setenv(GIT_WORK_TREE_ENVIRONMENT, work_tree, 1)) - die("could not set GIT_WORK_TREE to '%s'", work_tree); } const char *get_git_work_tree(void) diff --git a/ewah/bitmap.c b/ewah/bitmap.c index 47ad6747c4..7103ceefbf 100644 --- a/ewah/bitmap.c +++ b/ewah/bitmap.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "git-compat-util.h" +#include "cache.h" #include "ewok.h" #define EWAH_MASK(x) ((eword_t)1 << (x % BITS_IN_EWORD)) @@ -25,8 +25,8 @@ struct bitmap *bitmap_new(void) { - struct bitmap *bitmap = ewah_malloc(sizeof(struct bitmap)); - bitmap->words = ewah_calloc(32, sizeof(eword_t)); + struct bitmap *bitmap = xmalloc(sizeof(struct bitmap)); + bitmap->words = xcalloc(32, sizeof(eword_t)); bitmap->word_alloc = 32; return bitmap; } @@ -38,9 +38,7 @@ void bitmap_set(struct bitmap *self, size_t pos) if (block >= self->word_alloc) { size_t old_size = self->word_alloc; self->word_alloc = block * 2; - self->words = ewah_realloc(self->words, - self->word_alloc * sizeof(eword_t)); - + REALLOC_ARRAY(self->words, self->word_alloc); memset(self->words + old_size, 0x0, (self->word_alloc - old_size) * sizeof(eword_t)); } @@ -100,12 +98,7 @@ struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah) ewah_iterator_init(&it, ewah); while (ewah_iterator_next(&blowup, &it)) { - if (i >= bitmap->word_alloc) { - bitmap->word_alloc *= 1.5; - bitmap->words = ewah_realloc( - bitmap->words, bitmap->word_alloc * sizeof(eword_t)); - } - + ALLOC_GROW(bitmap->words, i + 1, bitmap->word_alloc); bitmap->words[i++] = blowup; } @@ -134,8 +127,7 @@ void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other) if (self->word_alloc < other_final) { self->word_alloc = other_final; - self->words = ewah_realloc(self->words, - self->word_alloc * sizeof(eword_t)); + REALLOC_ARRAY(self->words, self->word_alloc); memset(self->words + original_size, 0x0, (self->word_alloc - original_size) * sizeof(eword_t)); } diff --git a/ewah/ewah_bitmap.c b/ewah/ewah_bitmap.c index b522437c0a..2dc9c82ecf 100644 --- a/ewah/ewah_bitmap.c +++ b/ewah/ewah_bitmap.c @@ -39,8 +39,7 @@ static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size) return; self->alloc_size = new_size; - self->buffer = ewah_realloc(self->buffer, - self->alloc_size * sizeof(eword_t)); + REALLOC_ARRAY(self->buffer, self->alloc_size); self->rlw = self->buffer + (rlw_offset / sizeof(eword_t)); } @@ -282,12 +281,9 @@ struct ewah_bitmap *ewah_new(void) { struct ewah_bitmap *self; - self = ewah_malloc(sizeof(struct ewah_bitmap)); - if (self == NULL) - return NULL; - - self->buffer = ewah_malloc(32 * sizeof(eword_t)); + self = xmalloc(sizeof(struct ewah_bitmap)); self->alloc_size = 32; + ALLOC_ARRAY(self->buffer, self->alloc_size); ewah_clear(self); return self; diff --git a/ewah/ewah_io.c b/ewah/ewah_io.c index 43481b9c60..61f6a43579 100644 --- a/ewah/ewah_io.c +++ b/ewah/ewah_io.c @@ -134,11 +134,7 @@ int ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len) self->buffer_size = self->alloc_size = get_be32(ptr); ptr += sizeof(uint32_t); - self->buffer = ewah_realloc(self->buffer, - self->alloc_size * sizeof(eword_t)); - - if (!self->buffer) - return -1; + REALLOC_ARRAY(self->buffer, self->alloc_size); /* * Copy the raw data for the bitmap as a whole chunk; @@ -180,11 +176,7 @@ int ewah_deserialize(struct ewah_bitmap *self, int fd) return -1; self->buffer_size = self->alloc_size = (size_t)ntohl(word_count); - self->buffer = ewah_realloc(self->buffer, - self->alloc_size * sizeof(eword_t)); - - if (!self->buffer) - return -1; + REALLOC_ARRAY(self->buffer, self->alloc_size); /** 64 bit x N -- compressed words */ buffer = self->buffer; diff --git a/ewah/ewok.h b/ewah/ewok.h index 6e2c5e1e3d..269a1a8706 100644 --- a/ewah/ewok.h +++ b/ewah/ewok.h @@ -20,16 +20,6 @@ #ifndef __EWOK_BITMAP_H__ #define __EWOK_BITMAP_H__ -#ifndef ewah_malloc -# define ewah_malloc xmalloc -#endif -#ifndef ewah_realloc -# define ewah_realloc xrealloc -#endif -#ifndef ewah_calloc -# define ewah_calloc xcalloc -#endif - struct strbuf; typedef uint64_t eword_t; #define BITS_IN_EWORD (sizeof(eword_t) * 8) diff --git a/exec_cmd.c b/exec_cmd.c index e85f0fd8d8..9d5703a157 100644 --- a/exec_cmd.c +++ b/exec_cmd.c @@ -1,6 +1,7 @@ #include "cache.h" #include "exec_cmd.h" #include "quote.h" +#include "argv-array.h" #define MAX_ARGS 32 static const char *argv_exec_path; @@ -43,12 +44,10 @@ const char *git_extract_argv0_path(const char *argv0) if (!argv0 || !*argv0) return NULL; - slash = argv0 + strlen(argv0); - while (argv0 <= slash && !is_dir_sep(*slash)) - slash--; + slash = find_last_dir_sep(argv0); - if (slash >= argv0) { + if (slash) { argv0_path = xstrndup(argv0, slash - argv0); return slash + 1; } @@ -107,32 +106,25 @@ void setup_path(void) strbuf_release(&new_path); } -const char **prepare_git_cmd(const char **argv) +const char **prepare_git_cmd(struct argv_array *out, const char **argv) { - int argc; - const char **nargv; - - for (argc = 0; argv[argc]; argc++) - ; /* just counting */ - nargv = xmalloc(sizeof(*nargv) * (argc + 2)); - - nargv[0] = "git"; - for (argc = 0; argv[argc]; argc++) - nargv[argc + 1] = argv[argc]; - nargv[argc + 1] = NULL; - return nargv; + argv_array_push(out, "git"); + argv_array_pushv(out, argv); + return out->argv; } int execv_git_cmd(const char **argv) { - const char **nargv = prepare_git_cmd(argv); - trace_argv_printf(nargv, "trace: exec:"); + struct argv_array nargv = ARGV_ARRAY_INIT; + + prepare_git_cmd(&nargv, argv); + trace_argv_printf(nargv.argv, "trace: exec:"); /* execvp() can only ever return if it fails */ - sane_execvp("git", (char **)nargv); + sane_execvp("git", (char **)nargv.argv); trace_printf("trace: exec failed: %s\n", strerror(errno)); - free(nargv); + argv_array_clear(&nargv); return -1; } diff --git a/exec_cmd.h b/exec_cmd.h index 93b0c02529..1f6b43378b 100644 --- a/exec_cmd.h +++ b/exec_cmd.h @@ -1,11 +1,13 @@ #ifndef GIT_EXEC_CMD_H #define GIT_EXEC_CMD_H +struct argv_array; + extern void git_set_argv_exec_path(const char *exec_path); extern const char *git_extract_argv0_path(const char *path); extern const char *git_exec_path(void); extern void setup_path(void); -extern const char **prepare_git_cmd(const char **argv); +extern const char **prepare_git_cmd(struct argv_array *out, const char **argv); extern int execv_git_cmd(const char **argv); /* NULL terminated */ LAST_ARG_MUST_BE_NULL extern int execl_git_cmd(const char *cmd, ...); diff --git a/fast-import.c b/fast-import.c index 3c65edb5c4..9fc7093406 100644 --- a/fast-import.c +++ b/fast-import.c @@ -622,7 +622,7 @@ static void *pool_alloc(size_t len) return xmalloc(len); } total_allocd += sizeof(struct mem_pool) + mem_pool_alloc; - p = xmalloc(sizeof(struct mem_pool) + mem_pool_alloc); + p = xmalloc(st_add(sizeof(struct mem_pool), mem_pool_alloc)); p->next_pool = mem_pool; p->next_free = (char *) p->space; p->end = p->next_free + mem_pool_alloc; @@ -814,7 +814,8 @@ static struct tree_entry *new_tree_entry(void) if (!avail_tree_entry) { unsigned int n = tree_entry_alloc; total_allocd += n * sizeof(struct tree_entry); - avail_tree_entry = e = xmalloc(n * sizeof(struct tree_entry)); + ALLOC_ARRAY(e, n); + avail_tree_entry = e; while (n-- > 1) { *((void**)e) = e + 1; e++; @@ -864,15 +865,12 @@ static void start_packfile(void) { static char tmp_file[PATH_MAX]; struct packed_git *p; - int namelen; struct pack_header hdr; int pack_fd; pack_fd = odb_mkstemp(tmp_file, sizeof(tmp_file), "pack/tmp_pack_XXXXXX"); - namelen = strlen(tmp_file) + 2; - p = xcalloc(1, sizeof(*p) + namelen); - xsnprintf(p->pack_name, namelen, "%s", tmp_file); + FLEX_ALLOC_STR(p, pack_name, tmp_file); p->pack_fd = pack_fd; p->do_not_close = 1; pack_file = sha1fd(pack_fd, p->pack_name); @@ -898,7 +896,7 @@ static const char *create_index(void) struct object_entry_pool *o; /* Build the table of object IDs. */ - idx = xmalloc(object_count * sizeof(*idx)); + ALLOC_ARRAY(idx, object_count); c = idx; for (o = blocks; o; o = o->next_pool) for (e = o->next_free; e-- != o->entries;) @@ -1888,7 +1886,7 @@ static int read_next_command(void) struct recent_command *rc; strbuf_detach(&command_buf, NULL); - stdin_eof = strbuf_getline(&command_buf, stdin, '\n'); + stdin_eof = strbuf_getline_lf(&command_buf, stdin); if (stdin_eof) return EOF; @@ -1960,7 +1958,7 @@ static int parse_data(struct strbuf *sb, uintmax_t limit, uintmax_t *len_res) strbuf_detach(&command_buf, NULL); for (;;) { - if (strbuf_getline(&command_buf, stdin, '\n') == EOF) + if (strbuf_getline_lf(&command_buf, stdin) == EOF) die("EOF in data (terminator '%s' not found)", term); if (term_len == command_buf.len && !strcmp(term, command_buf.buf)) diff --git a/fetch-pack.c b/fetch-pack.c index 01e34b689b..f96f6dfb35 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -15,6 +15,7 @@ #include "version.h" #include "prio-queue.h" #include "sha1-array.h" +#include "sigchain.h" static int transfer_unpack_limit = -1; static int fetch_unpack_limit = -1; @@ -671,9 +672,12 @@ static int everything_local(struct fetch_pack_args *args, static int sideband_demux(int in, int out, void *data) { int *xd = data; + int ret; - int ret = recv_sideband("fetch-pack", xd[0], out); + sigchain_push(SIGPIPE, SIG_IGN); + ret = recv_sideband("fetch-pack", xd[0], out); close(out); + sigchain_pop(SIGPIPE); return ret; } diff --git a/fsck.c b/fsck.c index c637f6676b..ca4c685377 100644 --- a/fsck.c +++ b/fsck.c @@ -199,7 +199,8 @@ void fsck_set_msg_type(struct fsck_options *options, if (!options->msg_type) { int i; - int *msg_type = xmalloc(sizeof(int) * FSCK_MSG_MAX); + int *msg_type; + ALLOC_ARRAY(msg_type, FSCK_MSG_MAX); for (i = 0; i < FSCK_MSG_MAX; i++) msg_type[i] = fsck_msg_type(i, options); options->msg_type = msg_type; diff --git a/git-compat-util.h b/git-compat-util.h index 8e3986791d..474395471f 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -96,6 +96,14 @@ #define unsigned_add_overflows(a, b) \ ((b) > maximum_unsigned_value_of_type(a) - (a)) +/* + * Returns true if the multiplication of "a" and "b" will + * overflow. The types of "a" and "b" must match and must be unsigned. + * Note that this macro evaluates "a" twice! + */ +#define unsigned_mult_overflows(a, b) \ + ((a) && (b) > maximum_unsigned_value_of_type(a) / (a)) + #ifdef __GNUC__ #define TYPEOF(x) (__typeof__(x)) #else @@ -253,6 +261,8 @@ struct itimerval { #else #define basename gitbasename extern char *gitbasename(char *); +#define dirname gitdirname +extern char *gitdirname(char *); #endif #ifndef NO_ICONV @@ -323,10 +333,6 @@ extern char *gitbasename(char *); #define _PATH_DEFPATH "/usr/local/bin:/usr/bin:/bin" #endif -#ifndef STRIP_EXTENSION -#define STRIP_EXTENSION "" -#endif - #ifndef has_dos_drive_prefix static inline int git_has_dos_drive_prefix(const char *path) { @@ -335,6 +341,14 @@ static inline int git_has_dos_drive_prefix(const char *path) #define has_dos_drive_prefix git_has_dos_drive_prefix #endif +#ifndef skip_dos_drive_prefix +static inline int git_skip_dos_drive_prefix(char **path) +{ + return 0; +} +#define skip_dos_drive_prefix git_skip_dos_drive_prefix +#endif + #ifndef is_dir_sep static inline int git_is_dir_sep(int c) { @@ -663,7 +677,6 @@ extern int git_vsnprintf(char *str, size_t maxsize, #ifdef __GLIBC_PREREQ #if __GLIBC_PREREQ(2, 1) #define HAVE_STRCHRNUL -#define HAVE_MEMPCPY #endif #endif @@ -677,14 +690,6 @@ static inline char *gitstrchrnul(const char *s, int c) } #endif -#ifndef HAVE_MEMPCPY -#define mempcpy gitmempcpy -static inline void *gitmempcpy(void *dest, const void *src, size_t n) -{ - return (char *)memcpy(dest, src, n) + n; -} -#endif - #ifdef NO_INET_PTON int inet_pton(int af, const char *src, void *dst); #endif @@ -703,6 +708,32 @@ 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); +static inline size_t st_add(size_t a, size_t b) +{ + if (unsigned_add_overflows(a, b)) + die("size_t overflow: %"PRIuMAX" + %"PRIuMAX, + (uintmax_t)a, (uintmax_t)b); + return a + b; +} +#define st_add3(a,b,c) st_add(st_add((a),(b)),(c)) +#define st_add4(a,b,c,d) st_add(st_add3((a),(b),(c)),(d)) + +static inline size_t st_mult(size_t a, size_t b) +{ + if (unsigned_mult_overflows(a, b)) + die("size_t overflow: %"PRIuMAX" * %"PRIuMAX, + (uintmax_t)a, (uintmax_t)b); + return a * b; +} + +static inline size_t st_sub(size_t a, size_t b) +{ + if (a < b) + die("size_t underflow: %"PRIuMAX" - %"PRIuMAX, + (uintmax_t)a, (uintmax_t)b); + return a - b; +} + #ifdef HAVE_ALLOCA_H # include # define xalloca(size) (alloca(size)) @@ -733,8 +764,72 @@ extern int xmkstemp_mode(char *template, int mode); extern int odb_mkstemp(char *template, size_t limit, const char *pattern); extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1); extern char *xgetcwd(void); +extern FILE *fopen_for_writing(const char *path); -#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x))) +#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc))) +#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc))) + +/* + * These functions help you allocate structs with flex arrays, and copy + * the data directly into the array. For example, if you had: + * + * struct foo { + * int bar; + * char name[FLEX_ARRAY]; + * }; + * + * you can do: + * + * struct foo *f; + * FLEX_ALLOC_MEM(f, name, src, len); + * + * to allocate a "foo" with the contents of "src" in the "name" field. + * The resulting struct is automatically zero'd, and the flex-array field + * is NUL-terminated (whether the incoming src buffer was or not). + * + * The FLEXPTR_* variants operate on structs that don't use flex-arrays, + * but do want to store a pointer to some extra data in the same allocated + * block. For example, if you have: + * + * struct foo { + * char *name; + * int bar; + * }; + * + * you can do: + * + * struct foo *f; + * FLEX_ALLOC_STR(f, name, src); + * + * and "name" will point to a block of memory after the struct, which will be + * freed along with the struct (but the pointer can be repointed anywhere). + * + * The *_STR variants accept a string parameter rather than a ptr/len + * combination. + * + * Note that these macros will evaluate the first parameter multiple + * times, and it must be assignable as an lvalue. + */ +#define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \ + (x) = NULL; /* silence -Wuninitialized for offset calculation */ \ + (x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \ +} while (0) +#define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \ + (x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \ + (x)->ptrname = (void *)((x)+1); \ +} while(0) +#define FLEX_ALLOC_STR(x, flexname, str) \ + FLEX_ALLOC_MEM((x), flexname, (str), strlen(str)) +#define FLEXPTR_ALLOC_STR(x, ptrname, str) \ + FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str)) + +static inline void *xalloc_flex(size_t base_len, size_t offset, + const void *src, size_t src_len) +{ + unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1)); + memcpy(ret + offset, src, src_len); + return ret; +} static inline char *xstrdup_or_null(const char *str) { @@ -929,9 +1024,6 @@ int access_or_die(const char *path, int mode, unsigned flag); /* Warn on an inaccessible file that ought to be accessible */ void warn_on_inaccessible(const char *path); -/* Get the passwd entry for the UID of the current process. */ -struct passwd *xgetpwuid_self(void); - #ifdef GMTIME_UNRELIABLE_ERRORS struct tm *git_gmtime(const time_t *); struct tm *git_gmtime_r(const time_t *, struct tm *); diff --git a/git-cvsserver.perl b/git-cvsserver.perl index 95e69b19a7..02c0445be1 100755 --- a/git-cvsserver.perl +++ b/git-cvsserver.perl @@ -2664,7 +2664,7 @@ sub argsfromdir # co # Obtain list directly. # remove # HERE: TEST: MAYBE client does the recursion for us, # # since it only makes sense to remove stuff already in - # # the sandobx? + # # the sandbox? # ci # HERE: Similar to remove... # # Don't try to implement the confusing/weird # # ci -r bug er.."feature". diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 98f1779cf3..86b2ff1e07 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -404,7 +404,7 @@ while read commit parents; do then tree=$(git write-tree) else - tree="$commit^{tree}" + tree=$(git rev-parse "$commit^{tree}") fi workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \ "$tree" $parentstr < ../message > ../map/$commit || diff --git a/git-gui/po/glossary/txt-to-pot.sh b/git-gui/po/glossary/txt-to-pot.sh index 49bf7c5365..8249915d3c 100755 --- a/git-gui/po/glossary/txt-to-pot.sh +++ b/git-gui/po/glossary/txt-to-pot.sh @@ -11,7 +11,7 @@ if [ $# -eq 0 ] then cat < git-gui-glossary.pot +Usage: $(basename $0) git-gui-glossary.txt > git-gui-glossary.pot ! exit 1; fi @@ -33,7 +33,7 @@ cat <\n" "Language-Team: LANGUAGE \n" diff --git a/git-merge-one-file.sh b/git-merge-one-file.sh index cdc02af517..424b034e34 100755 --- a/git-merge-one-file.sh +++ b/git-merge-one-file.sh @@ -120,8 +120,7 @@ case "${1:-.}${2:-.}${3:-.}" in case "$1" in '') echo "Added $4 in both, but differently." - orig=$(git-unpack-file $2) - create_virtual_base "$orig" "$src2" + orig=$(git-unpack-file e69de29bb2d1d6434b8b29ae775ad8c2e48c5391) ;; *) echo "Auto-merging $4" diff --git a/git-p4.py b/git-p4.py index 13f124061f..825b9f32d5 100755 --- a/git-p4.py +++ b/git-p4.py @@ -253,8 +253,8 @@ def p4_add(f): def p4_delete(f): p4_system(["delete", wildcard_encode(f)]) -def p4_edit(f): - p4_system(["edit", wildcard_encode(f)]) +def p4_edit(f, *options): + p4_system(["edit"] + list(options) + [wildcard_encode(f)]) def p4_revert(f): p4_system(["revert", wildcard_encode(f)]) @@ -822,39 +822,37 @@ def p4ChangesForPaths(depotPaths, changeRange, requestedBlockSize): die("cannot use --changes-block-size with non-numeric revisions") block_size = None - # Accumulate change numbers in a dictionary to avoid duplicates - changes = {} + changes = [] - for p in depotPaths: - # Retrieve changes a block at a time, to prevent running - # into a MaxResults/MaxScanRows error from the server. + # Retrieve changes a block at a time, to prevent running + # into a MaxResults/MaxScanRows error from the server. - while True: - cmd = ['changes'] + while True: + cmd = ['changes'] - if block_size: - end = min(changeEnd, changeStart + block_size) - revisionRange = "%d,%d" % (changeStart, end) - else: - revisionRange = "%s,%s" % (changeStart, changeEnd) + if block_size: + end = min(changeEnd, changeStart + block_size) + revisionRange = "%d,%d" % (changeStart, end) + else: + revisionRange = "%s,%s" % (changeStart, changeEnd) + for p in depotPaths: cmd += ["%s...@%s" % (p, revisionRange)] - for line in p4_read_pipe_lines(cmd): - changeNum = int(line.split(" ")[1]) - changes[changeNum] = True + # Insert changes in chronological order + for line in reversed(p4_read_pipe_lines(cmd)): + changes.append(int(line.split(" ")[1])) - if not block_size: - break + if not block_size: + break - if end >= changeEnd: - break + if end >= changeEnd: + break - changeStart = end + 1 + changeStart = end + 1 - changelist = changes.keys() - changelist.sort() - return changelist + changes = sorted(changes) + return changes def p4PathStartsWith(path, prefix): # This method tries to remedy a potential mixed-case issue: @@ -1458,6 +1456,8 @@ class P4Submit(Command, P4UserMap): Remove lines in the Files section that show changes to files outside the depot path we're committing into.""" + [upstream, settings] = findUpstreamBranchPoint() + template = "" inFilesSection = False for line in p4_read_pipe_lines(['change', '-o']): @@ -1470,8 +1470,13 @@ class P4Submit(Command, P4UserMap): lastTab = path.rfind("\t") if lastTab != -1: path = path[:lastTab] - if not p4PathStartsWith(path, self.depotPath): - continue + if settings.has_key('depot-paths'): + if not [p for p in settings['depot-paths'] + if p4PathStartsWith(path, p)]: + continue + else: + if not p4PathStartsWith(path, self.depotPath): + continue else: inFilesSection = False else: @@ -1549,6 +1554,7 @@ class P4Submit(Command, P4UserMap): diff = read_pipe_lines("git diff-tree -r %s \"%s^\" \"%s\"" % (self.diffOpts, id, id)) filesToAdd = set() + filesToChangeType = set() filesToDelete = set() editedFiles = set() pureRenameCopy = set() @@ -1609,6 +1615,8 @@ class P4Submit(Command, P4UserMap): os.unlink(dest) filesToDelete.add(src) editedFiles.add(dest) + elif modifier == "T": + filesToChangeType.add(path) else: die("unknown modifier %s for %s" % (modifier, path)) @@ -1668,6 +1676,8 @@ class P4Submit(Command, P4UserMap): # system(applyPatchCmd) + for f in filesToChangeType: + p4_edit(f, "-t", "auto") for f in filesToAdd: p4_add(f) for f in filesToDelete: @@ -2556,12 +2566,6 @@ class P4Sync(Command, P4UserMap): filesToDelete = [] for f in files: - # if using a client spec, only add the files that have - # a path in the client - if self.clientSpecDirs: - if self.clientSpecDirs.map_in_client(f['path']) == "": - continue - filesForCommit.append(f) if f['action'] in self.delete_actions: filesToDelete.append(f) @@ -2632,25 +2636,41 @@ class P4Sync(Command, P4UserMap): gitStream.write(description) gitStream.write("\n") + def inClientSpec(self, path): + if not self.clientSpecDirs: + return True + inClientSpec = self.clientSpecDirs.map_in_client(path) + if not inClientSpec and self.verbose: + print('Ignoring file outside of client spec: {0}'.format(path)) + return inClientSpec + + def hasBranchPrefix(self, path): + if not self.branchPrefixes: + return True + hasPrefix = [p for p in self.branchPrefixes + if p4PathStartsWith(path, p)] + if hasPrefix and self.verbose: + print('Ignoring file outside of prefix: {0}'.format(path)) + return hasPrefix + def commit(self, details, files, branch, parent = ""): epoch = details["time"] author = details["user"] if self.verbose: - print "commit into %s" % branch - - # start with reading files; if that fails, we should not - # create a commit. - new_files = [] - for f in files: - if [p for p in self.branchPrefixes if p4PathStartsWith(f['path'], p)]: - new_files.append (f) - else: - sys.stderr.write("Ignoring file outside of prefix: %s\n" % f['path']) + print('commit into {0}'.format(branch)) if self.clientSpecDirs: self.clientSpecDirs.update_client_spec_path_cache(files) + files = [f for f in files + if self.inClientSpec(f['path']) and self.hasBranchPrefix(f['path'])] + + if not files and not gitConfigBool('git-p4.keepEmptyCommits'): + print('Ignoring revision {0} as it would produce an empty commit.' + .format(details['change'])) + return + self.gitStream.write("commit %s\n" % branch) self.gitStream.write("mark :%s\n" % details["change"]) self.committedChanges.add(int(details["change"])) @@ -2674,7 +2694,7 @@ class P4Sync(Command, P4UserMap): print "parent %s" % parent self.gitStream.write("from %s\n" % parent) - self.streamP4Files(new_files) + self.streamP4Files(files) self.gitStream.write("\n") change = int(details["change"]) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index b938a6d4aa..4cde685b43 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -81,17 +81,13 @@ rewritten_pending="$state_dir"/rewritten-pending # and leaves CR at the end instead. cr=$(printf "\015") -strategy_args= -if test -n "$do_merge" -then - strategy_args=${strategy:+--strategy=$strategy} - eval ' - for strategy_opt in '"$strategy_opts"' - do - strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")" - done - ' -fi +strategy_args=${strategy:+--strategy=$strategy} +eval ' + for strategy_opt in '"$strategy_opts"' + do + strategy_args="$strategy_args -X$(git rev-parse --sq-quote "${strategy_opt#--}")" + done +' GIT_CHERRY_PICK_HELP="$resolvemsg" export GIT_CHERRY_PICK_HELP @@ -1237,7 +1233,8 @@ then git rev-list $revisions | while read rev do - if test -f "$rewritten"/$rev && test "$(sane_grep "$rev" "$state_dir"/not-cherry-picks)" = "" + if test -f "$rewritten"/$rev && + ! sane_grep "$rev" "$state_dir"/not-cherry-picks >/dev/null then # Use -f2 because if rev-list is telling us this commit is # not worthwhile, we don't want to track its multiple heads, diff --git a/git-rebase.sh b/git-rebase.sh index af7ba5fd90..cf60c43908 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -176,7 +176,7 @@ You can run "git stash pop" or "git stash drop" at any time. finish_rebase () { apply_autostash && - git gc --auto && + { git gc --auto || true; } && rm -rf "$state_dir" } diff --git a/git-send-email.perl b/git-send-email.perl index 2a3873b744..d356901348 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -524,8 +524,13 @@ my %parse_alias = ( if (/^\s*alias\s+(?:-group\s+\S+\s+)*(\S+)\s+(.*)$/) { my ($alias, $addr) = ($1, $2); $addr =~ s/#.*$//; # mutt allows # comments - # commas delimit multiple addresses - $aliases{$alias} = [ split_addrs($addr) ]; + # commas delimit multiple addresses + my @addr = split_addrs($addr); + + # quotes may be escaped in the file, + # unescape them so we do not double-escape them later. + s/\\"/"/g foreach @addr; + $aliases{$alias} = \@addr }}}, mailrc => sub { my $fh = shift; while (<$fh>) { if (/^alias\s+(\S+)\s+(.*)$/) { @@ -1332,6 +1337,13 @@ Message-Id: $message_id require Net::SMTP::SSL; $smtp_domain ||= maildomain(); require IO::Socket::SSL; + + # Suppress "variable accessed once" warning. + { + no warnings 'once'; + $IO::Socket::SSL::DEBUG = 1; + } + # Net::SMTP::SSL->new() does not forward any SSL options IO::Socket::SSL::set_client_defaults( ssl_verify_params()); diff --git a/git-sh-setup.sh b/git-sh-setup.sh index 4691fbcb64..c48139a494 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -168,11 +168,11 @@ git_pager() { } sane_grep () { - GREP_OPTIONS= LC_ALL=C grep "$@" + GREP_OPTIONS= LC_ALL=C grep @@SANE_TEXT_GREP@@ "$@" } sane_egrep () { - GREP_OPTIONS= LC_ALL=C egrep "$@" + GREP_OPTIONS= LC_ALL=C egrep @@SANE_TEXT_GREP@@ "$@" } is_bare_repository () { diff --git a/git-submodule.sh b/git-submodule.sh index 86018ee9c5..07290d07ae 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -413,8 +413,8 @@ cmd_foreach() die_if_unmatched "$mode" if test -e "$sm_path"/.git then - displaypath=$(relative_path "$sm_path") - say "$(eval_gettext "Entering '\$prefix\$displaypath'")" + displaypath=$(relative_path "$prefix$sm_path") + say "$(eval_gettext "Entering '\$displaypath'")" name=$(git submodule--helper name "$sm_path") ( prefix="$prefix$sm_path/" @@ -434,7 +434,7 @@ cmd_foreach() cmd_foreach "--recursive" "$@" fi ) <&3 3<&- || - die "$(eval_gettext "Stopping at '\$prefix\$displaypath'; script returned non-zero status.")" + die "$(eval_gettext "Stopping at '\$displaypath'; script returned non-zero status.")" fi done } @@ -473,7 +473,7 @@ cmd_init() die_if_unmatched "$mode" name=$(git submodule--helper name "$sm_path") || exit - displaypath=$(relative_path "$sm_path") + displaypath=$(relative_path "$prefix$sm_path") # Copy url setting when it is not set yet if test -z "$(git config "submodule.$name.url")" @@ -591,6 +591,24 @@ cmd_deinit() done } +is_tip_reachable () ( + clear_local_git_env + cd "$1" && + rev=$(git rev-list -n 1 "$2" --not --all 2>/dev/null) && + test -z "$rev" +) + +fetch_in_submodule () ( + clear_local_git_env + cd "$1" && + case "$2" in + '') + git fetch ;; + *) + git fetch $(get_default_remote) "$2" ;; + esac +) + # # Update each submodule path to correct revision, using clone and checkout as needed # @@ -740,10 +758,15 @@ cmd_update() then # Run fetch only if $sha1 isn't present or it # is not reachable from a ref. - (clear_local_git_env; cd "$sm_path" && - ( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) && - test -z "$rev") || git-fetch)) || + is_tip_reachable "$sm_path" "$sha1" || + fetch_in_submodule "$sm_path" || die "$(eval_gettext "Unable to fetch in submodule path '\$displaypath'")" + + # Now we tried the usual fetch, but $sha1 may + # not be reachable from any of the refs + is_tip_reachable "$sm_path" "$sha1" || + fetch_in_submodule "$sm_path" "$sha1" || + die "$(eval_gettext "Fetched in submodule path '\$displaypath', but it did not contain $sha1. Direct fetching of that commit failed.")" fi must_die_on_failure= @@ -767,8 +790,8 @@ cmd_update() ;; !*) command="${update_module#!}" - die_msg="$(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$prefix\$sm_path'")" - say_msg="$(eval_gettext "Submodule path '\$prefix\$sm_path': '\$command \$sha1'")" + die_msg="$(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$displaypath'")" + say_msg="$(eval_gettext "Submodule path '\$displaypath': '\$command \$sha1'")" must_die_on_failure=yes ;; *) @@ -1124,6 +1147,7 @@ cmd_status() ( prefix="$displaypath/" clear_local_git_env + wt_prefix= cd "$sm_path" && eval cmd_status ) || diff --git a/git-svn.perl b/git-svn.perl index fa5f253065..05eced06cd 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -1745,11 +1745,12 @@ sub post_fetch_checkout { sub complete_svn_url { my ($url, $path) = @_; - $path = canonicalize_path($path); - # If the path is not a URL... - if ($path !~ m#^[a-z\+]+://#) { - if (!defined $url || $url !~ m#^[a-z\+]+://#) { + if ($path =~ m#^[a-z\+]+://#i) { # path is a URL + $path = canonicalize_url($path); + } else { + $path = canonicalize_path($path); + if (!defined $url || $url !~ m#^[a-z\+]+://#i) { fatal("E: '$path' is not a complete URL ", "and a separate URL is not specified"); } @@ -1764,11 +1765,12 @@ sub complete_url_ls_init { print STDERR "W: $switch not specified\n"; return; } - $repo_path = canonicalize_path($repo_path); - if ($repo_path =~ m#^[a-z\+]+://#) { + if ($repo_path =~ m#^[a-z\+]+://#i) { + $repo_path = canonicalize_url($repo_path); $ra = Git::SVN::Ra->new($repo_path); $repo_path = ''; } else { + $repo_path = canonicalize_path($repo_path); $repo_path =~ s#^/+##; unless ($ra) { fatal("E: '$repo_path' is not a complete URL ", diff --git a/git.c b/git.c index 6ed824cacf..6cc0c077f9 100644 --- a/git.c +++ b/git.c @@ -25,14 +25,14 @@ static const char *env_names[] = { GIT_PREFIX_ENVIRONMENT }; static char *orig_env[4]; -static int saved_environment; +static int save_restore_env_balance; -static void save_env(void) +static void save_env_before_alias(void) { int i; - if (saved_environment) - return; - saved_environment = 1; + + assert(save_restore_env_balance == 0); + save_restore_env_balance = 1; orig_cwd = xgetcwd(); for (i = 0; i < ARRAY_SIZE(env_names); i++) { orig_env[i] = getenv(env_names[i]); @@ -41,17 +41,25 @@ static void save_env(void) } } -static void restore_env(void) +static void restore_env(int external_alias) { int i; - if (orig_cwd && chdir(orig_cwd)) + + assert(save_restore_env_balance == 1); + save_restore_env_balance = 0; + if (!external_alias && orig_cwd && chdir(orig_cwd)) die_errno("could not move to %s", orig_cwd); free(orig_cwd); for (i = 0; i < ARRAY_SIZE(env_names); i++) { - if (orig_env[i]) + if (external_alias && + !strcmp(env_names[i], GIT_PREFIX_ENVIRONMENT)) + continue; + if (orig_env[i]) { setenv(env_names[i], orig_env[i], 1); - else + free(orig_env[i]); + } else { unsetenv(env_names[i]); + } } } @@ -226,32 +234,29 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) static int handle_alias(int *argcp, const char ***argv) { int envchanged = 0, ret = 0, saved_errno = errno; - const char *subdir; int count, option_count; const char **new_argv; const char *alias_command; char *alias_string; int unused_nongit; - subdir = setup_git_directory_gently(&unused_nongit); + save_env_before_alias(); + setup_git_directory_gently(&unused_nongit); alias_command = (*argv)[0]; alias_string = alias_lookup(alias_command); if (alias_string) { if (alias_string[0] == '!') { - const char **alias_argv; - int argc = *argcp, i; + struct child_process child = CHILD_PROCESS_INIT; commit_pager_choice(); + restore_env(1); - /* build alias_argv */ - alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1)); - alias_argv[0] = alias_string + 1; - for (i = 1; i < argc; ++i) - alias_argv[i] = (*argv)[i]; - alias_argv[argc] = NULL; + child.use_shell = 1; + argv_array_push(&child.args, alias_string + 1); + argv_array_pushv(&child.args, (*argv) + 1); - ret = run_command_v_opt(alias_argv, RUN_USING_SHELL); + ret = run_command(&child); if (ret >= 0) /* normal exit */ exit(ret); @@ -291,8 +296,7 @@ static int handle_alias(int *argcp, const char ***argv) ret = 1; } - if (subdir && chdir(subdir)) - die_errno("Cannot change to '%s'", subdir); + restore_env(0); errno = saved_errno; @@ -307,7 +311,6 @@ static int handle_alias(int *argcp, const char ***argv) * RUN_SETUP for reading from the configuration file. */ #define NEED_WORK_TREE (1<<3) -#define NO_SETUP (1<<4) struct cmd_struct { const char *cmd; @@ -389,7 +392,7 @@ static struct cmd_struct commands[] = { { "cherry", cmd_cherry, RUN_SETUP }, { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, - { "clone", cmd_clone, NO_SETUP }, + { "clone", cmd_clone }, { "column", cmd_column, RUN_SETUP_GENTLY }, { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, { "commit-tree", cmd_commit_tree, RUN_SETUP }, @@ -415,8 +418,8 @@ static struct cmd_struct commands[] = { { "hash-object", cmd_hash_object }, { "help", cmd_help }, { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY }, - { "init", cmd_init_db, NO_SETUP }, - { "init-db", cmd_init_db, NO_SETUP }, + { "init", cmd_init_db }, + { "init-db", cmd_init_db }, { "interpret-trailers", cmd_interpret_trailers, RUN_SETUP_GENTLY }, { "log", cmd_log, RUN_SETUP }, { "ls-files", cmd_ls_files, RUN_SETUP }, @@ -506,21 +509,25 @@ int is_builtin(const char *s) return !!get_builtin(s); } +#ifdef STRIP_EXTENSION +static void strip_extension(const char **argv) +{ + size_t len; + + if (strip_suffix(argv[0], STRIP_EXTENSION, &len)) + argv[0] = xmemdupz(argv[0], len); +} +#else +#define strip_extension(cmd) +#endif + static void handle_builtin(int argc, const char **argv) { - const char *cmd = argv[0]; - int i; - static const char ext[] = STRIP_EXTENSION; + const char *cmd; struct cmd_struct *builtin; - if (sizeof(ext) > 1) { - i = strlen(argv[0]) - strlen(ext); - if (i > 0 && !strcmp(argv[0] + i, ext)) { - char *argv0 = xstrdup(argv[0]); - argv[0] = cmd = argv0; - argv0[i] = '\0'; - } - } + strip_extension(argv); + cmd = argv[0]; /* Turn "git cmd --help" into "git help cmd" */ if (argc > 1 && !strcmp(argv[1], "--help")) { @@ -529,12 +536,8 @@ static void handle_builtin(int argc, const char **argv) } builtin = get_builtin(cmd); - if (builtin) { - if (saved_environment && (builtin->option & NO_SETUP)) - restore_env(); - else - exit(run_builtin(builtin, argc, argv)); - } + if (builtin) + exit(run_builtin(builtin, argc, argv)); } static void execv_dashed_external(const char **argv) @@ -578,8 +581,17 @@ static int run_argv(int *argcp, const char ***argv) int done_alias = 0; while (1) { - /* See if it's a builtin */ - handle_builtin(*argcp, *argv); + /* + * If we tried alias and futzed with our environment, + * it no longer is safe to invoke builtins directly in + * general. We have to spawn them as dashed externals. + * + * NEEDSWORK: if we can figure out cases + * where it is safe to do, we can avoid spawning a new + * process. + */ + if (!done_alias) + handle_builtin(*argcp, *argv); /* .. then try the external ones */ execv_dashed_external(*argv); @@ -590,7 +602,6 @@ static int run_argv(int *argcp, const char ***argv) */ if (done_alias) break; - save_env(); if (!handle_alias(argcp, argv)) break; done_alias = 1; diff --git a/gitk-git/gitk b/gitk-git/gitk index fcc606eab7..805a1c7030 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -1943,6 +1943,8 @@ proc confirm_popup {msg {owner .}} { } proc setoptions {} { + global use_ttk + if {[tk windowingsystem] ne "win32"} { option add *Panedwindow.showHandle 1 startupFile option add *Panedwindow.sashRelief raised startupFile @@ -1965,6 +1967,18 @@ proc setoptions {} { option add *Listbox.font mainfont startupFile } +proc setttkstyle {} { + eval font configure TkDefaultFont [fontflags mainfont] + eval font configure TkTextFont [fontflags textfont] + eval font configure TkHeadingFont [fontflags mainfont] + eval font configure TkCaptionFont [fontflags mainfont] -weight bold + eval font configure TkTooltipFont [fontflags uifont] + eval font configure TkFixedFont [fontflags textfont] + eval font configure TkIconFont [fontflags uifont] + eval font configure TkMenuFont [fontflags uifont] + eval font configure TkSmallCaptionFont [fontflags uifont] +} + # Make a menu and submenus. # m is the window name for the menu, items is the list of menu items to add. # Each item is a list {mc label type description options...} @@ -2251,7 +2265,7 @@ proc makewindow {} { set h [expr {[font metrics uifont -linespace] + 2}] set progresscanv .tf.bar.progress canvas $progresscanv -relief sunken -height $h -borderwidth 2 - set progressitem [$progresscanv create rect -1 0 0 $h -fill green] + set progressitem [$progresscanv create rect -1 0 0 $h -fill lime] set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow] set rprogitem [$progresscanv create rect -1 0 0 $h -fill red] } @@ -2347,6 +2361,9 @@ proc makewindow {} { ${NS}::frame .bleft.mid ${NS}::frame .bleft.bottom + # gap between sub-widgets + set wgap [font measure uifont "i"] + ${NS}::button .bleft.top.search -text [mc "Search"] -command dosearch pack .bleft.top.search -side left -padx 5 set sstring .bleft.top.sstring @@ -2361,8 +2378,9 @@ proc makewindow {} { -command changediffdisp -variable diffelide -value {0 1} ${NS}::radiobutton .bleft.mid.new -text [mc "New version"] \ -command changediffdisp -variable diffelide -value {1 0} + ${NS}::label .bleft.mid.labeldiffcontext -text " [mc "Lines of context"]: " - pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left + pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left -ipadx $wgap spinbox .bleft.mid.diffcontext -width 5 \ -from 0 -increment 1 -to 10000000 \ -validate all -validatecommand "diffcontextvalidate %P" \ @@ -2370,7 +2388,7 @@ proc makewindow {} { .bleft.mid.diffcontext set $diffcontext trace add variable diffcontextstring write diffcontextchange lappend entries .bleft.mid.diffcontext - pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left + pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left -ipadx $wgap ${NS}::checkbutton .bleft.mid.ignspace -text [mc "Ignore space change"] \ -command changeignorespace -variable ignorespace pack .bleft.mid.ignspace -side left -padx 5 @@ -3003,7 +3021,7 @@ proc bindall {event action} { } proc about {} { - global uifont NS + global bgcolor NS set w .about if {[winfo exists $w]} { raise $w @@ -3018,7 +3036,7 @@ Gitk - a commit viewer for git Copyright \u00a9 2005-2014 Paul Mackerras Use and redistribute under the terms of the GNU General Public License"] \ - -justify center -aspect 400 -border 2 -bg white -relief groove + -justify center -aspect 400 -border 2 -bg $bgcolor -relief groove pack $w.m -side top -fill x -padx 2 -pady 2 ${NS}::button $w.ok -text [mc "Close"] -command "destroy $w" -default active pack $w.ok -side bottom @@ -3029,7 +3047,7 @@ Use and redistribute under the terms of the GNU General Public License"] \ } proc keys {} { - global NS + global bgcolor NS set w .keys if {[winfo exists $w]} { raise $w @@ -3085,7 +3103,7 @@ proc keys {} { [mc "<%s-minus> Decrease font size" $M1T] [mc " Update"] " \ - -justify left -bg white -border 2 -relief groove + -justify left -bg $bgcolor -border 2 -relief groove pack $w.m -side top -fill both -padx 2 -pady 2 ${NS}::button $w.ok -text [mc "Close"] -command "destroy $w" -default active bind $w [list destroy $w] @@ -3379,7 +3397,7 @@ set rectmask { 0x00, 0x00, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0x00, 0x00}; } -image create bitmap reficon-H -background black -foreground green \ +image create bitmap reficon-H -background black -foreground lime \ -data $rectdata -maskdata $rectmask image create bitmap reficon-o -background black -foreground "#ddddff" \ -data $rectdata -maskdata $rectmask @@ -12170,7 +12188,7 @@ if {[tk windowingsystem] eq "aqua"} { set extdifftool "meld" } -set colors {green red blue magenta darkgrey brown orange} +set colors {lime red blue magenta darkgrey brown orange} if {[tk windowingsystem] eq "win32"} { set uicolor SystemButtonFace set uifgcolor SystemButtonText @@ -12188,12 +12206,12 @@ if {[tk windowingsystem] eq "win32"} { } set diffcolors {red "#00a000" blue} set diffcontext 3 -set mergecolors {red blue green purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"} +set mergecolors {red blue lime purple brown "#009090" magenta "#808000" "#009000" "#ff0080" cyan "#b07070" "#70b0f0" "#70f0b0" "#f0b070" "#ff70b0"} set ignorespace 0 set worddiff "" set markbgcolor "#e0e0ff" -set headbgcolor green +set headbgcolor lime set headfgcolor black set headoutlinecolor black set remotebgcolor #ffddaa @@ -12208,7 +12226,7 @@ set linehoverfgcolor black set linehoveroutlinecolor black set mainheadcirclecolor yellow set workingfilescirclecolor red -set indexcirclecolor green +set indexcirclecolor lime set circlecolors {white blue gray blue blue} set linkfgcolor blue set circleoutlinecolor $fgcolor @@ -12356,6 +12374,10 @@ if {![info exists have_ttk]} { set use_ttk [expr {$have_ttk && $want_ttk}] set NS [expr {$use_ttk ? "ttk" : ""}] +if {$use_ttk} { + setttkstyle +} + regexp {^git version ([\d.]*\d)} [exec git version] _ git_version set show_notes {} diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po index 909a56463f..99aa77aa63 100644 --- a/gitk-git/po/bg.po +++ b/gitk-git/po/bg.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: gitk master\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-06-27 20:44+0300\n" -"PO-Revision-Date: 2015-06-27 20:46+0300\n" +"POT-Creation-Date: 2015-12-19 11:48+0200\n" +"PO-Revision-Date: 2015-12-19 11:49+0200\n" "Last-Translator: Alexander Shopov \n" "Language-Team: Bulgarian \n" "Language: bg\n" @@ -22,11 +22,11 @@ msgstr "" msgid "Couldn't get list of unmerged files:" msgstr "Списъкът с неслети файлове не може да бъде получен:" -#: gitk:212 gitk:2381 +#: gitk:212 gitk:2399 msgid "Color words" msgstr "Оцветяване на думите" -#: gitk:217 gitk:2381 gitk:8220 gitk:8253 +#: gitk:217 gitk:2399 gitk:8239 gitk:8272 msgid "Markup words" msgstr "Отбелязване на думите" @@ -59,15 +59,15 @@ msgstr "Грешка при изпълнение на „git log“:" msgid "Reading" msgstr "Прочитане" -#: gitk:496 gitk:4525 +#: gitk:496 gitk:4544 msgid "Reading commits..." msgstr "Прочитане на подаванията…" -#: gitk:499 gitk:1637 gitk:4528 +#: gitk:499 gitk:1637 gitk:4547 msgid "No commits selected" msgstr "Не са избрани подавания" -#: gitk:1445 gitk:4045 gitk:12432 +#: gitk:1445 gitk:4064 gitk:12469 msgid "Command line" msgstr "Команден ред" @@ -79,286 +79,294 @@ msgstr "Изходът от „git log“ не може да се анализи msgid "No commit information available" msgstr "Липсва информация за подавания" -#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521 +#: gitk:1903 gitk:1932 gitk:4334 gitk:9702 gitk:11274 gitk:11554 msgid "OK" msgstr "Добре" -#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671 -#: gitk:11242 gitk:11522 +#: gitk:1934 gitk:4336 gitk:9215 gitk:9294 gitk:9424 gitk:9473 gitk:9704 +#: gitk:11275 gitk:11555 msgid "Cancel" msgstr "Отказ" -#: gitk:2069 +#: gitk:2083 msgid "&Update" -msgstr "Обновяване" - -#: gitk:2070 -msgid "&Reload" -msgstr "Презареждане" - -#: gitk:2071 -msgid "Reread re&ferences" -msgstr "Наново прочитане на настройките" - -#: gitk:2072 -msgid "&List references" -msgstr "Изброяване на указателите" - -#: gitk:2074 -msgid "Start git &gui" -msgstr "Стартиране на „git gui“" - -#: gitk:2076 -msgid "&Quit" -msgstr "Спиране на програмата" - -#: gitk:2068 -msgid "&File" -msgstr "Файл" - -#: gitk:2080 -msgid "&Preferences" -msgstr "Настройки" - -#: gitk:2079 -msgid "&Edit" -msgstr "Редактиране" +msgstr "&Обновяване" #: gitk:2084 -msgid "&New view..." -msgstr "Нов изглед…" +msgid "&Reload" +msgstr "&Презареждане" #: gitk:2085 -msgid "&Edit view..." -msgstr "Редактиране на изгледа…" +msgid "Reread re&ferences" +msgstr "&Наново прочитане на настройките" #: gitk:2086 +msgid "&List references" +msgstr "&Изброяване на указателите" + +#: gitk:2088 +msgid "Start git &gui" +msgstr "&Стартиране на „git gui“" + +#: gitk:2090 +msgid "&Quit" +msgstr "&Спиране на програмата" + +#: gitk:2082 +msgid "&File" +msgstr "&Файл" + +#: gitk:2094 +msgid "&Preferences" +msgstr "&Настройки" + +#: gitk:2093 +msgid "&Edit" +msgstr "&Редактиране" + +#: gitk:2098 +msgid "&New view..." +msgstr "&Нов изглед…" + +#: gitk:2099 +msgid "&Edit view..." +msgstr "&Редактиране на изгледа…" + +#: gitk:2100 msgid "&Delete view" -msgstr "Изтриване на изгледа" +msgstr "&Изтриване на изгледа" -#: gitk:2088 gitk:4043 +#: gitk:2102 msgid "&All files" -msgstr "Всички файлове" +msgstr "&Всички файлове" -#: gitk:2083 gitk:4067 +#: gitk:2097 msgid "&View" -msgstr "Изглед" +msgstr "&Изглед" -#: gitk:2093 gitk:2103 gitk:3012 +#: gitk:2107 gitk:2117 msgid "&About gitk" -msgstr "Относно gitk" +msgstr "&Относно gitk" -#: gitk:2094 gitk:2108 +#: gitk:2108 gitk:2122 msgid "&Key bindings" -msgstr "Клавишни комбинации" +msgstr "&Клавишни комбинации" -#: gitk:2092 gitk:2107 +#: gitk:2106 gitk:2121 msgid "&Help" -msgstr "Помощ" +msgstr "Помо&щ" -#: gitk:2185 gitk:8652 +#: gitk:2199 gitk:8671 msgid "SHA1 ID:" msgstr "SHA1:" -#: gitk:2229 +#: gitk:2243 msgid "Row" msgstr "Ред" -#: gitk:2267 +#: gitk:2281 msgid "Find" msgstr "Търсене" -#: gitk:2295 +#: gitk:2309 msgid "commit" msgstr "подаване" -#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827 -#: gitk:6912 +#: gitk:2313 gitk:2315 gitk:4706 gitk:4729 gitk:4753 gitk:6774 gitk:6846 +#: gitk:6931 msgid "containing:" msgstr "съдържащо:" -#: gitk:2302 gitk:3526 gitk:3531 gitk:4763 +#: gitk:2316 gitk:3545 gitk:3550 gitk:4782 msgid "touching paths:" msgstr "засягащо пътищата:" -#: gitk:2303 gitk:4777 +#: gitk:2317 gitk:4796 msgid "adding/removing string:" msgstr "добавящо/премахващо низ" -#: gitk:2304 gitk:4779 +#: gitk:2318 gitk:4798 msgid "changing lines matching:" msgstr "променящо редове напасващи:" -#: gitk:2313 gitk:2315 gitk:4766 +#: gitk:2327 gitk:2329 gitk:4785 msgid "Exact" msgstr "Точно" -#: gitk:2315 gitk:4854 gitk:6723 +#: gitk:2329 gitk:4873 gitk:6742 msgid "IgnCase" msgstr "Без регистър" -#: gitk:2315 gitk:4736 gitk:4852 gitk:6719 +#: gitk:2329 gitk:4755 gitk:4871 gitk:6738 msgid "Regexp" msgstr "Рег. израз" -#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916 +#: gitk:2331 gitk:2332 gitk:4893 gitk:4923 gitk:4930 gitk:6867 gitk:6935 msgid "All fields" msgstr "Всички полета" -#: gitk:2318 gitk:4871 gitk:4904 gitk:6786 +#: gitk:2332 gitk:4890 gitk:4923 gitk:6805 msgid "Headline" msgstr "Първи ред" -#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389 +#: gitk:2333 gitk:4890 gitk:6805 gitk:6935 gitk:7408 msgid "Comments" msgstr "Коментари" -#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830 -#: gitk:8845 +#: gitk:2333 gitk:4890 gitk:4895 gitk:4930 gitk:6805 gitk:7343 gitk:8849 +#: gitk:8864 msgid "Author" msgstr "Автор" -#: gitk:2319 gitk:4871 gitk:6786 gitk:7326 +#: gitk:2333 gitk:4890 gitk:6805 gitk:7345 msgid "Committer" msgstr "Подаващ" -#: gitk:2350 +#: gitk:2367 msgid "Search" msgstr "Търсене" -#: gitk:2358 +#: gitk:2375 msgid "Diff" msgstr "Разлики" -#: gitk:2360 +#: gitk:2377 msgid "Old version" msgstr "Стара версия" -#: gitk:2362 +#: gitk:2379 msgid "New version" msgstr "Нова версия" -#: gitk:2364 +#: gitk:2382 msgid "Lines of context" msgstr "Контекст в редове" -#: gitk:2374 +#: gitk:2392 msgid "Ignore space change" msgstr "Празните знаци без значение" -#: gitk:2378 gitk:2380 gitk:7959 gitk:8206 +#: gitk:2396 gitk:2398 gitk:7978 gitk:8225 msgid "Line diff" msgstr "Поредови разлики" -#: gitk:2445 +#: gitk:2463 msgid "Patch" msgstr "Кръпка" -#: gitk:2447 +#: gitk:2465 msgid "Tree" msgstr "Дърво" -#: gitk:2617 gitk:2637 +#: gitk:2635 gitk:2656 msgid "Diff this -> selected" msgstr "Разлики между това и избраното" -#: gitk:2618 gitk:2638 +#: gitk:2636 gitk:2657 msgid "Diff selected -> this" msgstr "Разлики между избраното и това" -#: gitk:2619 gitk:2639 +#: gitk:2637 gitk:2658 msgid "Make patch" msgstr "Създаване на кръпка" -#: gitk:2620 gitk:9254 +#: gitk:2638 gitk:9273 msgid "Create tag" msgstr "Създаване на етикет" -#: gitk:2621 gitk:9371 +#: gitk:2639 +msgid "Copy commit summary" +msgstr "Копиране на информацията за подаване" + +#: gitk:2640 gitk:9404 msgid "Write commit to file" msgstr "Запазване на подаването във файл" -#: gitk:2622 gitk:9428 +#: gitk:2641 gitk:9461 msgid "Create new branch" msgstr "Създаване на нов клон" -#: gitk:2623 +#: gitk:2642 msgid "Cherry-pick this commit" msgstr "Отбиране на това подаване" -#: gitk:2624 +#: gitk:2643 msgid "Reset HEAD branch to here" msgstr "Привеждане на върха на клона към текущото подаване" -#: gitk:2625 +#: gitk:2644 msgid "Mark this commit" msgstr "Отбелязване на това подаване" -#: gitk:2626 +#: gitk:2645 msgid "Return to mark" msgstr "Връщане към отбелязаното подаване" -#: gitk:2627 +#: gitk:2646 msgid "Find descendant of this and mark" msgstr "Откриване и отбелязване на наследниците" -#: gitk:2628 +#: gitk:2647 msgid "Compare with marked commit" msgstr "Сравнение с отбелязаното подаване" -#: gitk:2629 gitk:2640 +#: gitk:2648 gitk:2659 msgid "Diff this -> marked commit" msgstr "Разлики между това и отбелязаното" -#: gitk:2630 gitk:2641 +#: gitk:2649 gitk:2660 msgid "Diff marked commit -> this" msgstr "Разлики между отбелязаното и това" -#: gitk:2631 +#: gitk:2650 msgid "Revert this commit" msgstr "Отмяна на това подаване" -#: gitk:2647 +#: gitk:2666 msgid "Check out this branch" msgstr "Изтегляне на този клон" -#: gitk:2648 +#: gitk:2667 msgid "Remove this branch" msgstr "Изтриване на този клон" -#: gitk:2649 +#: gitk:2668 msgid "Copy branch name" msgstr "Копиране на името на клона" -#: gitk:2656 +#: gitk:2675 msgid "Highlight this too" msgstr "Отбелязване и на това" -#: gitk:2657 +#: gitk:2676 msgid "Highlight this only" msgstr "Отбелязване само на това" -#: gitk:2658 +#: gitk:2677 msgid "External diff" msgstr "Външна програма за разлики" -#: gitk:2659 +#: gitk:2678 msgid "Blame parent commit" msgstr "Анотиране на родителското подаване" -#: gitk:2660 +#: gitk:2679 msgid "Copy path" msgstr "Копиране на пътя" -#: gitk:2667 +#: gitk:2686 msgid "Show origin of this line" msgstr "Показване на произхода на този ред" -#: gitk:2668 +#: gitk:2687 msgid "Run git gui blame on this line" msgstr "Изпълнение на „git gui blame“ върху този ред" -#: gitk:3014 +#: gitk:3031 +msgid "About gitk" +msgstr "Относно gitk" + +#: gitk:3033 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -374,316 +382,324 @@ msgstr "" "\n" "Използвайте и разпространявайте при условията на ОПЛ на ГНУ" -#: gitk:3022 gitk:3089 gitk:9857 +#: gitk:3041 gitk:3108 gitk:9890 msgid "Close" msgstr "Затваряне" -#: gitk:3043 +#: gitk:3062 msgid "Gitk key bindings" msgstr "Клавишни комбинации" -#: gitk:3046 +#: gitk:3065 msgid "Gitk key bindings:" msgstr "Клавишни комбинации:" -#: gitk:3048 +#: gitk:3067 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tСпиране на програмата" -#: gitk:3049 +#: gitk:3068 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tЗатваряне на прозореца" -#: gitk:3050 +#: gitk:3069 msgid "\t\tMove to first commit" msgstr "\t\tКъм първото подаване" -#: gitk:3051 +#: gitk:3070 msgid "\t\tMove to last commit" msgstr "\t\tКъм последното подаване" -#: gitk:3052 +#: gitk:3071 msgid ", p, k\tMove up one commit" msgstr ", p, k\tЕдно подаване нагоре" -#: gitk:3053 +#: gitk:3072 msgid ", n, j\tMove down one commit" msgstr ", n, j\tЕдно подаване надолу" -#: gitk:3054 +#: gitk:3073 msgid ", z, h\tGo back in history list" msgstr ", z, h\tНазад в историята" -#: gitk:3055 +#: gitk:3074 msgid ", x, l\tGo forward in history list" msgstr ", x, l\tНапред в историята" -#: gitk:3056 +#: gitk:3075 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" msgstr "<%s-n>\tКъм n-тия родител на текущото подаване в историята" -#: gitk:3057 +#: gitk:3076 msgid "\tMove up one page in commit list" msgstr "\tСтраница нагоре в списъка с подаванията" -#: gitk:3058 +#: gitk:3077 msgid "\tMove down one page in commit list" msgstr "\tСтраница надолу в списъка с подаванията" -#: gitk:3059 +#: gitk:3078 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tКъм началото на списъка с подаванията" -#: gitk:3060 +#: gitk:3079 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tКъм края на списъка с подаванията" -#: gitk:3061 +#: gitk:3080 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tРед нагоре в списъка с подавания" -#: gitk:3062 +#: gitk:3081 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tРед надолу в списъка с подавания" -#: gitk:3063 +#: gitk:3082 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tСтраница нагоре в списъка с подавания" -#: gitk:3064 +#: gitk:3083 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tСтраница надолу в списъка с подавания" -#: gitk:3065 +#: gitk:3084 msgid "\tFind backwards (upwards, later commits)" msgstr "\tТърсене назад (визуално нагоре, исторически — последващи)" -#: gitk:3066 +#: gitk:3085 msgid "\tFind forwards (downwards, earlier commits)" msgstr "" "\tТърсене напред (визуално надолу, исторически — предхождащи)" -#: gitk:3067 +#: gitk:3086 msgid ", b\tScroll diff view up one page" msgstr ", b\tСтраница нагоре в изгледа за разлики" -#: gitk:3068 +#: gitk:3087 msgid "\tScroll diff view up one page" msgstr "\tСтраница надолу в изгледа за разлики" -#: gitk:3069 +#: gitk:3088 msgid "\t\tScroll diff view down one page" msgstr "\t\tСтраница надолу в изгледа за разлики" -#: gitk:3070 +#: gitk:3089 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\t18 реда нагоре в изгледа за разлики" -#: gitk:3071 +#: gitk:3090 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\t18 реда надолу в изгледа за разлики" -#: gitk:3072 +#: gitk:3091 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tТърсене" -#: gitk:3073 +#: gitk:3092 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tКъм следващата поява" -#: gitk:3074 +#: gitk:3093 msgid "\tMove to next find hit" msgstr "\tКъм следващата поява" -#: gitk:3075 +#: gitk:3094 msgid "g\t\tGo to commit" msgstr "g\t\tКъм последното подаване" -#: gitk:3076 +#: gitk:3095 msgid "/\t\tFocus the search box" msgstr "/\t\tФокус върху полето за търсене" -#: gitk:3077 +#: gitk:3096 msgid "?\t\tMove to previous find hit" msgstr "?\t\tКъм предишната поява" -#: gitk:3078 +#: gitk:3097 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tСледващ файл в изгледа за разлики" -#: gitk:3079 +#: gitk:3098 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики" -#: gitk:3080 +#: gitk:3099 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики" -#: gitk:3081 +#: gitk:3100 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tПо-голям размер на шрифта" -#: gitk:3082 +#: gitk:3101 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tПо-голям размер на шрифта" -#: gitk:3083 +#: gitk:3102 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tПо-малък размер на шрифта" -#: gitk:3084 +#: gitk:3103 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tПо-малък размер на шрифта" -#: gitk:3085 +#: gitk:3104 msgid "\t\tUpdate" msgstr "\t\tОбновяване" -#: gitk:3550 gitk:3559 +#: gitk:3569 gitk:3578 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Грешка при създаването на временната директория „%s“:" -#: gitk:3572 +#: gitk:3591 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Грешка при получаването на „%s“ от %s:" -#: gitk:3635 +#: gitk:3654 msgid "command failed:" msgstr "неуспешно изпълнение на команда:" -#: gitk:3784 +#: gitk:3803 msgid "No such commit" msgstr "Такова подаване няма" -#: gitk:3798 +#: gitk:3817 msgid "git gui blame: command failed:" msgstr "„git gui blame“: неуспешно изпълнение на команда:" -#: gitk:3829 +#: gitk:3848 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Върхът за сливане не може да бъде прочетен: %s" -#: gitk:3837 +#: gitk:3856 #, tcl-format msgid "Error reading index: %s" msgstr "Грешка при прочитане на индекса: %s" -#: gitk:3862 +#: gitk:3881 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Командата „git blame“ не може да бъде стартирана: %s" -#: gitk:3865 gitk:6754 +#: gitk:3884 gitk:6773 msgid "Searching" msgstr "Търсене" -#: gitk:3897 +#: gitk:3916 #, tcl-format msgid "Error running git blame: %s" msgstr "Грешка при изпълнението на „git blame“: %s" -#: gitk:3925 +#: gitk:3944 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Този ред идва от подаването %s, което не е в изгледа" -#: gitk:3939 +#: gitk:3958 msgid "External diff viewer failed:" msgstr "Неуспешно изпълнение на външната програма за разлики:" -#: gitk:4070 +#: gitk:4062 +msgid "All files" +msgstr "Всички файлове" + +#: gitk:4086 +msgid "View" +msgstr "Изглед" + +#: gitk:4089 msgid "Gitk view definition" msgstr "Дефиниция на изглед в Gitk" -#: gitk:4074 +#: gitk:4093 msgid "Remember this view" msgstr "Запазване на този изглед" -#: gitk:4075 +#: gitk:4094 msgid "References (space separated list):" msgstr "Указатели (списък с разделител интервал):" -#: gitk:4076 +#: gitk:4095 msgid "Branches & tags:" msgstr "Клони и етикети:" -#: gitk:4077 +#: gitk:4096 msgid "All refs" msgstr "Всички указатели" -#: gitk:4078 +#: gitk:4097 msgid "All (local) branches" msgstr "Всички (локални) клони" -#: gitk:4079 +#: gitk:4098 msgid "All tags" msgstr "Всички етикети" -#: gitk:4080 +#: gitk:4099 msgid "All remote-tracking branches" msgstr "Всички следящи клони" -#: gitk:4081 +#: gitk:4100 msgid "Commit Info (regular expressions):" msgstr "Информация за подаване (рег. изр.):" -#: gitk:4082 +#: gitk:4101 msgid "Author:" msgstr "Автор:" -#: gitk:4083 +#: gitk:4102 msgid "Committer:" msgstr "Подал:" -#: gitk:4084 +#: gitk:4103 msgid "Commit Message:" msgstr "Съобщение при подаване:" -#: gitk:4085 +#: gitk:4104 msgid "Matches all Commit Info criteria" msgstr "Съвпадение по всички характеристики на подаването" -#: gitk:4086 +#: gitk:4105 msgid "Matches no Commit Info criteria" msgstr "Не съвпада по никоя от характеристиките на подаването" -#: gitk:4087 +#: gitk:4106 msgid "Changes to Files:" msgstr "Промени по файловете:" -#: gitk:4088 +#: gitk:4107 msgid "Fixed String" msgstr "Дословен низ" -#: gitk:4089 +#: gitk:4108 msgid "Regular Expression" msgstr "Регулярен израз" -#: gitk:4090 +#: gitk:4109 msgid "Search string:" msgstr "Низ за търсене:" -#: gitk:4091 +#: gitk:4110 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -691,204 +707,204 @@ msgstr "" "Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, " "„March 17, 2009 15:27:38“):" -#: gitk:4092 +#: gitk:4111 msgid "Since:" msgstr "От:" -#: gitk:4093 +#: gitk:4112 msgid "Until:" msgstr "До:" -#: gitk:4094 +#: gitk:4113 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "" "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло " "число):" -#: gitk:4095 +#: gitk:4114 msgid "Number to show:" msgstr "Брой показани:" -#: gitk:4096 +#: gitk:4115 msgid "Number to skip:" msgstr "Брой прескочени:" -#: gitk:4097 +#: gitk:4116 msgid "Miscellaneous options:" msgstr "Разни:" -#: gitk:4098 +#: gitk:4117 msgid "Strictly sort by date" msgstr "Подреждане по дата" -#: gitk:4099 +#: gitk:4118 msgid "Mark branch sides" msgstr "Отбелязване на страните по клона" -#: gitk:4100 +#: gitk:4119 msgid "Limit to first parent" msgstr "Само първия родител" -#: gitk:4101 +#: gitk:4120 msgid "Simple history" msgstr "Опростена история" -#: gitk:4102 +#: gitk:4121 msgid "Additional arguments to git log:" msgstr "Допълнителни аргументи към „git log“:" -#: gitk:4103 +#: gitk:4122 msgid "Enter files and directories to include, one per line:" msgstr "Въведете файловете и директориите за включване, по елемент на ред" -#: gitk:4104 +#: gitk:4123 msgid "Command to generate more commits to include:" msgstr "" "Команда за генерирането на допълнителни подавания, които да бъдат включени:" -#: gitk:4228 +#: gitk:4247 msgid "Gitk: edit view" msgstr "Gitk: редактиране на изглед" -#: gitk:4236 +#: gitk:4255 msgid "-- criteria for selecting revisions" msgstr "— критерии за избор на версии" -#: gitk:4241 +#: gitk:4260 msgid "View Name" msgstr "Име на изглед" -#: gitk:4316 +#: gitk:4335 msgid "Apply (F5)" msgstr "Прилагане (F5)" -#: gitk:4354 +#: gitk:4373 msgid "Error in commit selection arguments:" msgstr "Грешка в аргументите за избор на подавания:" -#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374 +#: gitk:4428 gitk:4481 gitk:4943 gitk:4957 gitk:6227 gitk:12410 gitk:12411 msgid "None" msgstr "Няма" -#: gitk:5021 gitk:5026 +#: gitk:5040 gitk:5045 msgid "Descendant" msgstr "Наследник" -#: gitk:5022 +#: gitk:5041 msgid "Not descendant" msgstr "Не е наследник" -#: gitk:5029 gitk:5034 +#: gitk:5048 gitk:5053 msgid "Ancestor" msgstr "Предшественик" -#: gitk:5030 +#: gitk:5049 msgid "Not ancestor" msgstr "Не е предшественик" -#: gitk:5324 +#: gitk:5343 msgid "Local changes checked in to index but not committed" msgstr "Локални промени добавени към индекса, но неподадени" -#: gitk:5360 +#: gitk:5379 msgid "Local uncommitted changes, not checked in to index" msgstr "Локални промени извън индекса" -#: gitk:7134 +#: gitk:7153 msgid "and many more" msgstr "и още много" -#: gitk:7137 +#: gitk:7156 msgid "many" msgstr "много" -#: gitk:7328 +#: gitk:7347 msgid "Tags:" msgstr "Етикети:" -#: gitk:7345 gitk:7351 gitk:8825 +#: gitk:7364 gitk:7370 gitk:8844 msgid "Parent" msgstr "Родител" -#: gitk:7356 +#: gitk:7375 msgid "Child" msgstr "Дете" -#: gitk:7365 +#: gitk:7384 msgid "Branch" msgstr "Клон" -#: gitk:7368 +#: gitk:7387 msgid "Follows" msgstr "Следва" -#: gitk:7371 +#: gitk:7390 msgid "Precedes" msgstr "Предшества" -#: gitk:7966 +#: gitk:7985 #, tcl-format msgid "Error getting diffs: %s" msgstr "Грешка при получаването на разликите: %s" -#: gitk:8650 +#: gitk:8669 msgid "Goto:" msgstr "Към ред:" -#: gitk:8671 +#: gitk:8690 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Съкратената сума по SHA1 %s не е еднозначна" -#: gitk:8678 +#: gitk:8697 #, tcl-format msgid "Revision %s is not known" msgstr "Непозната версия %s" -#: gitk:8688 +#: gitk:8707 #, tcl-format msgid "SHA1 id %s is not known" msgstr "Непозната сума по SHA1 %s" -#: gitk:8690 +#: gitk:8709 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Версия %s не е в текущия изглед" -#: gitk:8832 gitk:8847 +#: gitk:8851 gitk:8866 msgid "Date" msgstr "Дата" -#: gitk:8835 +#: gitk:8854 msgid "Children" msgstr "Деца" -#: gitk:8898 +#: gitk:8917 #, tcl-format msgid "Reset %s branch to here" msgstr "Зануляване на клона „%s“ към текущото подаване" -#: gitk:8900 +#: gitk:8919 msgid "Detached head: can't reset" msgstr "Несвързан връх: невъзможно зануляване" -#: gitk:9005 gitk:9011 +#: gitk:9024 gitk:9030 msgid "Skipping merge commit " msgstr "Пропускане на подаването на сливането" -#: gitk:9020 gitk:9025 +#: gitk:9039 gitk:9044 msgid "Error getting patch ID for " msgstr "Грешка при получаването на идентификатора на " -#: gitk:9021 gitk:9026 +#: gitk:9040 gitk:9045 msgid " - stopping\n" msgstr " — спиране\n" -#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065 +#: gitk:9050 gitk:9053 gitk:9061 gitk:9075 gitk:9084 msgid "Commit " msgstr "Подаване" -#: gitk:9035 +#: gitk:9054 msgid "" " is the same patch as\n" " " @@ -896,7 +912,7 @@ msgstr "" " е същата кръпка като\n" " " -#: gitk:9043 +#: gitk:9062 msgid "" " differs from\n" " " @@ -904,7 +920,7 @@ msgstr "" " се различава от\n" " " -#: gitk:9045 +#: gitk:9064 msgid "" "Diff of commits:\n" "\n" @@ -912,130 +928,130 @@ msgstr "" "Разлика между подаванията:\n" "\n" -#: gitk:9057 gitk:9066 +#: gitk:9076 gitk:9085 #, tcl-format msgid " has %s children - stopping\n" msgstr " има %s деца — спиране\n" -#: gitk:9085 +#: gitk:9104 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Грешка при запазването на подаването във файл: %s" -#: gitk:9091 +#: gitk:9110 #, tcl-format msgid "Error diffing commits: %s" msgstr "Грешка при изчисляването на разликите между подаванията: %s" -#: gitk:9137 +#: gitk:9156 msgid "Top" msgstr "Най-горе" -#: gitk:9138 +#: gitk:9157 msgid "From" msgstr "От" -#: gitk:9143 +#: gitk:9162 msgid "To" msgstr "До" -#: gitk:9167 +#: gitk:9186 msgid "Generate patch" msgstr "Генериране на кръпка" -#: gitk:9169 +#: gitk:9188 msgid "From:" msgstr "От:" -#: gitk:9178 +#: gitk:9197 msgid "To:" msgstr "До:" -#: gitk:9187 +#: gitk:9206 msgid "Reverse" msgstr "Обръщане" -#: gitk:9189 gitk:9385 +#: gitk:9208 gitk:9418 msgid "Output file:" msgstr "Запазване във файла:" -#: gitk:9195 +#: gitk:9214 msgid "Generate" msgstr "Генериране" -#: gitk:9233 +#: gitk:9252 msgid "Error creating patch:" msgstr "Грешка при създаването на кръпка:" -#: gitk:9256 gitk:9373 gitk:9430 +#: gitk:9275 gitk:9406 gitk:9463 msgid "ID:" msgstr "Идентификатор:" -#: gitk:9265 +#: gitk:9284 msgid "Tag name:" msgstr "Име на етикет:" -#: gitk:9268 +#: gitk:9287 msgid "Tag message is optional" msgstr "Съобщението за етикет е незадължително" -#: gitk:9270 +#: gitk:9289 msgid "Tag message:" msgstr "Съобщение за етикет:" -#: gitk:9274 gitk:9439 +#: gitk:9293 gitk:9472 msgid "Create" msgstr "Създаване" -#: gitk:9292 +#: gitk:9311 msgid "No tag name specified" msgstr "Липсва име на етикет" -#: gitk:9296 +#: gitk:9315 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Етикетът „%s“ вече съществува" -#: gitk:9306 +#: gitk:9325 msgid "Error creating tag:" msgstr "Грешка при създаването на етикет:" -#: gitk:9382 +#: gitk:9415 msgid "Command:" msgstr "Команда:" -#: gitk:9390 +#: gitk:9423 msgid "Write" msgstr "Запазване" -#: gitk:9408 +#: gitk:9441 msgid "Error writing commit:" msgstr "Грешка при запазването на подаването:" -#: gitk:9435 +#: gitk:9468 msgid "Name:" msgstr "Име:" -#: gitk:9458 +#: gitk:9491 msgid "Please specify a name for the new branch" msgstr "Укажете име за новия клон" -#: gitk:9463 +#: gitk:9496 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?" -#: gitk:9530 +#: gitk:9563 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?" -#: gitk:9535 +#: gitk:9568 msgid "Cherry-picking" msgstr "Отбиране" -#: gitk:9544 +#: gitk:9577 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1044,7 +1060,7 @@ msgstr "" "Неуспешно отбиране, защото във файла „%s“ има локални промени.\n" "Подайте, занулете или ги скатайте и пробвайте отново." -#: gitk:9550 +#: gitk:9583 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1052,20 +1068,20 @@ msgstr "" "Неуспешно отбиране поради конфликти при сливане.\n" "Искате ли да ги коригирате чрез „git citool“?" -#: gitk:9566 gitk:9624 +#: gitk:9599 gitk:9657 msgid "No changes committed" msgstr "Не са подадени промени" -#: gitk:9593 +#: gitk:9626 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?" -#: gitk:9598 +#: gitk:9631 msgid "Reverting" msgstr "Отмяна" -#: gitk:9606 +#: gitk:9639 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1074,7 +1090,7 @@ msgstr "" "Неуспешна отмяна, защото във файла „%s“ има локални промени.\n" "Подайте, занулете или ги скатайте и пробвайте отново.<" -#: gitk:9610 +#: gitk:9643 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1082,28 +1098,28 @@ msgstr "" "Неуспешно отмяна поради конфликти при сливане.\n" "Искате ли да ги коригирате чрез „git citool“?" -#: gitk:9653 +#: gitk:9686 msgid "Confirm reset" msgstr "Потвърждаване на зануляването" -#: gitk:9655 +#: gitk:9688 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Да се занули ли клонът „%s“ към „%s“?" -#: gitk:9657 +#: gitk:9690 msgid "Reset type:" msgstr "Вид зануляване:" -#: gitk:9660 +#: gitk:9693 msgid "Soft: Leave working tree and index untouched" msgstr "Слабо: работното дърво и индекса остават същите" -#: gitk:9663 +#: gitk:9696 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Смесено: работното дърво остава същото, индексът се занулява" -#: gitk:9666 +#: gitk:9699 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1111,19 +1127,19 @@ msgstr "" "Силно: зануляване и на работното дърво, и на индекса\n" "(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)" -#: gitk:9683 +#: gitk:9716 msgid "Resetting" msgstr "Зануляване" -#: gitk:9743 +#: gitk:9776 msgid "Checking out" msgstr "Изтегляне" -#: gitk:9796 +#: gitk:9829 msgid "Cannot delete the currently checked-out branch" msgstr "Текущо изтегленият клон не може да бъде изтрит" -#: gitk:9802 +#: gitk:9835 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1132,16 +1148,16 @@ msgstr "" "Подаванията на клона „%s“ не са на никой друг клон.\n" "Наистина ли да се изтрие клонът „%s“?" -#: gitk:9833 +#: gitk:9866 #, tcl-format msgid "Tags and heads: %s" msgstr "Етикети и върхове: %s" -#: gitk:9850 +#: gitk:9883 msgid "Filter" msgstr "Филтриране" -#: gitk:10146 +#: gitk:10179 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1149,201 +1165,201 @@ msgstr "" "Грешка при прочитането на топологията на подаванията. Информацията за клона " "и предшестващите/следващите етикети ще е непълна." -#: gitk:11123 +#: gitk:11156 msgid "Tag" msgstr "Етикет" -#: gitk:11127 +#: gitk:11160 msgid "Id" msgstr "Идентификатор" -#: gitk:11210 +#: gitk:11243 msgid "Gitk font chooser" msgstr "Избор на шрифт за Gitk" -#: gitk:11227 +#: gitk:11260 msgid "B" msgstr "Ч" -#: gitk:11230 +#: gitk:11263 msgid "I" msgstr "К" -#: gitk:11348 +#: gitk:11381 msgid "Commit list display options" msgstr "Настройки на списъка с подавания" -#: gitk:11351 +#: gitk:11384 msgid "Maximum graph width (lines)" msgstr "Максимална широчина на графа (в редове)" -#: gitk:11355 +#: gitk:11388 #, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Максимална широчина на графа (% от панела)" -#: gitk:11358 +#: gitk:11391 msgid "Show local changes" msgstr "Показване на локалните промени" -#: gitk:11361 +#: gitk:11394 msgid "Auto-select SHA1 (length)" msgstr "Автоматично избиране на SHA1 (дължина)" -#: gitk:11365 +#: gitk:11398 msgid "Hide remote refs" msgstr "Скриване на отдалечените указатели" -#: gitk:11369 +#: gitk:11402 msgid "Diff display options" msgstr "Настройки на показването на разликите" -#: gitk:11371 +#: gitk:11404 msgid "Tab spacing" msgstr "Широчина на табулатора" -#: gitk:11374 +#: gitk:11407 msgid "Display nearby tags/heads" msgstr "Извеждане на близките етикети и върхове" -#: gitk:11377 +#: gitk:11410 msgid "Maximum # tags/heads to show" msgstr "Максимален брой етикети/върхове за показване" -#: gitk:11380 +#: gitk:11413 msgid "Limit diffs to listed paths" msgstr "Разлика само в избраните пътища" -#: gitk:11383 +#: gitk:11416 msgid "Support per-file encodings" msgstr "Поддръжка на различни кодирания за всеки файл" -#: gitk:11389 gitk:11536 +#: gitk:11422 gitk:11569 msgid "External diff tool" msgstr "Външен инструмент за разлики" -#: gitk:11390 +#: gitk:11423 msgid "Choose..." msgstr "Избор…" -#: gitk:11395 +#: gitk:11428 msgid "General options" msgstr "Общи настройки" -#: gitk:11398 +#: gitk:11431 msgid "Use themed widgets" msgstr "Използване на тема за графичните обекти" -#: gitk:11400 +#: gitk:11433 msgid "(change requires restart)" msgstr "(промяната изисква рестартиране на Gitk)" -#: gitk:11402 +#: gitk:11435 msgid "(currently unavailable)" msgstr "(в момента недостъпно)" -#: gitk:11413 +#: gitk:11446 msgid "Colors: press to choose" msgstr "Цветове: избира се с натискане" -#: gitk:11416 +#: gitk:11449 msgid "Interface" msgstr "Интерфейс" -#: gitk:11417 +#: gitk:11450 msgid "interface" msgstr "интерфейс" -#: gitk:11420 +#: gitk:11453 msgid "Background" msgstr "Фон" -#: gitk:11421 gitk:11451 +#: gitk:11454 gitk:11484 msgid "background" msgstr "фон" -#: gitk:11424 +#: gitk:11457 msgid "Foreground" msgstr "Знаци" -#: gitk:11425 +#: gitk:11458 msgid "foreground" msgstr "знаци" -#: gitk:11428 +#: gitk:11461 msgid "Diff: old lines" msgstr "Разлика: стари редове" -#: gitk:11429 +#: gitk:11462 msgid "diff old lines" msgstr "разлика, стари редове" -#: gitk:11433 +#: gitk:11466 msgid "Diff: new lines" msgstr "Разлика: нови редове" -#: gitk:11434 +#: gitk:11467 msgid "diff new lines" msgstr "разлика, нови редове" -#: gitk:11438 +#: gitk:11471 msgid "Diff: hunk header" msgstr "Разлика: начало на парче" -#: gitk:11440 +#: gitk:11473 msgid "diff hunk header" msgstr "разлика, начало на парче" -#: gitk:11444 +#: gitk:11477 msgid "Marked line bg" msgstr "Фон на отбелязан ред" -#: gitk:11446 +#: gitk:11479 msgid "marked line background" msgstr "фон на отбелязан ред" -#: gitk:11450 +#: gitk:11483 msgid "Select bg" msgstr "Избор на фон" -#: gitk:11459 +#: gitk:11492 msgid "Fonts: press to choose" msgstr "Шрифтове: избира се с натискане" -#: gitk:11461 +#: gitk:11494 msgid "Main font" msgstr "Основен шрифт" -#: gitk:11462 +#: gitk:11495 msgid "Diff display font" msgstr "Шрифт за разликите" -#: gitk:11463 +#: gitk:11496 msgid "User interface font" msgstr "Шрифт на интерфейса" -#: gitk:11485 +#: gitk:11518 msgid "Gitk preferences" msgstr "Настройки на Gitk" -#: gitk:11494 +#: gitk:11527 msgid "General" msgstr "Общи" -#: gitk:11495 +#: gitk:11528 msgid "Colors" msgstr "Цветове" -#: gitk:11496 +#: gitk:11529 msgid "Fonts" msgstr "Шрифтове" -#: gitk:11546 +#: gitk:11579 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: избор на цвят на „%s“" -#: gitk:12059 +#: gitk:12092 msgid "" "Sorry, gitk cannot run with this version of Tcl/Tk.\n" " Gitk requires at least Tcl/Tk 8.4." @@ -1351,15 +1367,15 @@ msgstr "" "Тази версия на Tcl/Tk не се поддържа от Gitk.\n" " Необходима ви е поне Tcl/Tk 8.4." -#: gitk:12269 +#: gitk:12302 msgid "Cannot find a git repository here." msgstr "Тук липсва хранилище на Git." -#: gitk:12316 +#: gitk:12349 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл" -#: gitk:12328 +#: gitk:12361 msgid "Bad arguments to gitk:" msgstr "Неправилни аргументи на gitk:" diff --git a/gitk-git/po/de.po b/gitk-git/po/de.po index d9ba4052e2..bde749ed8a 100644 --- a/gitk-git/po/de.po +++ b/gitk-git/po/de.po @@ -23,11 +23,11 @@ msgstr "Liste der nicht zusammengeführten Dateien nicht gefunden:" #: gitk:212 gitk:2381 msgid "Color words" -msgstr "" +msgstr "Wörter einfärben" #: gitk:217 gitk:2381 gitk:8220 gitk:8253 msgid "Markup words" -msgstr "" +msgstr "Wörter kennzeichnen" #: gitk:324 msgid "Error parsing revisions:" @@ -187,7 +187,7 @@ msgstr "Änderungen:" #: gitk:2304 gitk:4779 msgid "changing lines matching:" -msgstr "" +msgstr "Geänderte Zeilen entsprechen:" #: gitk:2313 gitk:2315 gitk:4766 msgid "Exact" @@ -248,7 +248,7 @@ msgstr "Leerzeichenänderungen ignorieren" #: gitk:2378 gitk:2380 gitk:7959 gitk:8206 msgid "Line diff" -msgstr "" +msgstr "Zeilenunterschied" #: gitk:2445 msgid "Patch" @@ -307,19 +307,16 @@ msgid "Compare with marked commit" msgstr "Mit Lesezeichen vergleichen" #: gitk:2629 gitk:2640 -#, fuzzy msgid "Diff this -> marked commit" -msgstr "Vergleich: diese -> gewählte" +msgstr "Vergleich: diese -> gewählte Version" #: gitk:2630 gitk:2641 -#, fuzzy msgid "Diff marked commit -> this" -msgstr "Vergleich: gewählte -> diese" +msgstr "Vergleich: gewählte -> diese Version" #: gitk:2631 -#, fuzzy msgid "Revert this commit" -msgstr "Lesezeichen setzen" +msgstr "Version umkehren" #: gitk:2647 msgid "Check out this branch" @@ -331,7 +328,7 @@ msgstr "Zweig löschen" #: gitk:2649 msgid "Copy branch name" -msgstr "" +msgstr "Zweigname kopieren" #: gitk:2656 msgid "Highlight this too" @@ -351,7 +348,7 @@ msgstr "Annotieren der Elternversion" #: gitk:2660 msgid "Copy path" -msgstr "" +msgstr "Pfad kopieren" #: gitk:2667 msgid "Show origin of this line" @@ -362,7 +359,6 @@ msgid "Run git gui blame on this line" msgstr "Diese Zeile annotieren (»git gui blame«)" #: gitk:3014 -#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -374,7 +370,7 @@ msgstr "" "\n" "Gitk - eine Visualisierung der Git-Historie\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright \\u00a9 2005-2014 Paul Mackerras\n" "\n" "Benutzung und Weiterverbreitung gemäß den Bedingungen der GNU General Public " "License" @@ -397,9 +393,9 @@ msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tBeenden" #: gitk:3049 -#, fuzzy, tcl-format +#, tcl-format msgid "<%s-W>\t\tClose window" -msgstr "<%s-F>\t\tSuchen" +msgstr "<%s-F>\t\tFenster schließen" #: gitk:3050 msgid "\t\tMove to first commit" @@ -410,19 +406,16 @@ msgid "\t\tMove to last commit" msgstr "\t\tZur ältesten Version springen" #: gitk:3052 -#, fuzzy msgid ", p, k\tMove up one commit" -msgstr ", p, i\tNächste neuere Version" +msgstr ", p, k\tNächste neuere Version" #: gitk:3053 -#, fuzzy msgid ", n, j\tMove down one commit" -msgstr ", n, k\tNächste ältere Version" +msgstr ", n, j\tNächste ältere Version" #: gitk:3054 -#, fuzzy msgid ", z, h\tGo back in history list" -msgstr ", z, j\tEine Version zurückgehen" +msgstr ", z, h\tEine Version zurückgehen" #: gitk:3055 msgid ", x, l\tGo forward in history list" @@ -431,7 +424,7 @@ msgstr ", x, l\tEine Version weitergehen" #: gitk:3056 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" -msgstr "" +msgstr "<%s-n>\tZu n-ter Elternversion in Versionshistorie springen" #: gitk:3057 msgid "\tMove up one page in commit list" @@ -514,9 +507,8 @@ msgid "\tMove to next find hit" msgstr "\tWeitersuchen" #: gitk:3075 -#, fuzzy msgid "g\t\tGo to commit" -msgstr "\t\tZur ältesten Version springen" +msgstr "g\t\tZu Version springen" #: gitk:3076 msgid "/\t\tFocus the search box" @@ -673,9 +665,8 @@ msgid "Matches all Commit Info criteria" msgstr "Alle Versionsinformationen-Kriterien erfüllen" #: gitk:4086 -#, fuzzy msgid "Matches no Commit Info criteria" -msgstr "Alle Versionsinformationen-Kriterien erfüllen" +msgstr "keine Versionsinformationen-Kriterien erfüllen" #: gitk:4087 msgid "Changes to Files:" @@ -802,7 +793,7 @@ msgstr "Lokale Änderungen, nicht bereitgestellt" #: gitk:7134 msgid "and many more" -msgstr "" +msgstr "und weitere" #: gitk:7137 msgid "many" @@ -1066,34 +1057,31 @@ msgid "No changes committed" msgstr "Keine Änderungen eingetragen" #: gitk:9593 -#, fuzzy, tcl-format +#, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "" -"Version »%s« ist bereits im Zweig »%s« enthalten -- trotzdem erneut " -"eintragen?" +"Version »%s« ist nicht im Zweig »%s« enthalten -- trotzdem umkehren?" #: gitk:9598 -#, fuzzy msgid "Reverting" -msgstr "Zurücksetzen" +msgstr "Umkehren" #: gitk:9606 -#, fuzzy, tcl-format +#, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " "commit, reset or stash your changes and try again." msgstr "" -"Pflücken fehlgeschlagen, da noch lokale Änderungen in Datei »%s«\n" +"Umkehren fehlgeschlagen, da noch lokale Änderungen in Datei »%s«\n" "vorliegen. Bitte diese Änderungen eintragen, zurücksetzen oder\n" "zwischenspeichern (»git stash«) und dann erneut versuchen." #: gitk:9610 -#, fuzzy msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" msgstr "" -"Pflücken fehlgeschlagen, da ein Zusammenführungs-Konflikt aufgetreten\n" +"Umkehren fehlgeschlagen, da ein Zusammenführungs-Konflikt aufgetreten\n" "ist. Soll das Zusammenführungs-Werkzeug (»git citool«) aufgerufen\n" "werden, um diesen Konflikt aufzulösen?" @@ -1206,9 +1194,8 @@ msgid "Show local changes" msgstr "Lokale Änderungen anzeigen" #: gitk:11361 -#, fuzzy msgid "Auto-select SHA1 (length)" -msgstr "SHA1-Hashwert automatisch auswählen" +msgstr "SHA1-Hashwert (Länge) automatisch auswählen" #: gitk:11365 msgid "Hide remote refs" @@ -1223,13 +1210,12 @@ msgid "Tab spacing" msgstr "Tabulatorbreite" #: gitk:11374 -#, fuzzy msgid "Display nearby tags/heads" -msgstr "Naheliegende Markierungen anzeigen" +msgstr "Naheliegende Markierungen/Zweigspitzen anzeigen" #: gitk:11377 msgid "Maximum # tags/heads to show" -msgstr "" +msgstr "Maximale Anzahl anzuzeigender Markierungen/Zweigspitzen" #: gitk:11380 msgid "Limit diffs to listed paths" @@ -1348,17 +1334,16 @@ msgid "Gitk preferences" msgstr "Gitk-Einstellungen" #: gitk:11494 -#, fuzzy msgid "General" -msgstr "Erzeugen" +msgstr "Allgemein" #: gitk:11495 msgid "Colors" -msgstr "" +msgstr "Farben" #: gitk:11496 msgid "Fonts" -msgstr "" +msgstr "Schriftarten" #: gitk:11546 #, tcl-format @@ -1370,6 +1355,8 @@ msgid "" "Sorry, gitk cannot run with this version of Tcl/Tk.\n" " Gitk requires at least Tcl/Tk 8.4." msgstr "" +"Entschuldigung, gitk kann nicht mit dieser Tcl/Tk Version ausgeführt werden.\n" +" Gitk erfordert mindestens Tcl/Tk 8.4." #: gitk:12269 msgid "Cannot find a git repository here." diff --git a/gitk-git/po/fr.po b/gitk-git/po/fr.po index 80f72fb453..c44f994fa5 100644 --- a/gitk-git/po/fr.po +++ b/gitk-git/po/fr.po @@ -3,14 +3,14 @@ # This file is distributed under the same license as the gitk package. # Translators: # Emmanuel Trillaud -# +# Jean-Noël Avila msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-17 14:32+1000\n" -"PO-Revision-Date: 2009-11-19 22:13+0100\n" -"Last-Translator: Emmanuel Trillaud \n" +"POT-Creation-Date: 2016-01-22 22:04+0100\n" +"PO-Revision-Date: 2016-01-22 23:28+0100\n" +"Last-Translator: Jean-Noël Avila \n" "Language-Team: git@vger.kernel.org\n" "Language: \n" "MIME-Version: 1.0\n" @@ -23,13 +23,13 @@ msgstr "" msgid "Couldn't get list of unmerged files:" msgstr "Impossible de récupérer la liste des fichiers non fusionnés :" -#: gitk:212 gitk:2381 +#: gitk:212 gitk:2399 msgid "Color words" -msgstr "" +msgstr "Colorier les mots différents" -#: gitk:217 gitk:2381 gitk:8220 gitk:8253 +#: gitk:217 gitk:2399 gitk:8239 gitk:8272 msgid "Markup words" -msgstr "" +msgstr "Marquer les mots différents" #: gitk:324 msgid "Error parsing revisions:" @@ -47,13 +47,10 @@ msgstr "" # FIXME : améliorer la traduction de 'file limite' #: gitk:396 -#, fuzzy msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." -msgstr "" -"Aucun fichier sélectionné : --merge précisé mais aucun fichier non fusionné " -"n'est dans la limite des fichiers." +msgstr "Aucun fichier sélectionné : --merge précisé mais aucun fichier non fusionné n'est dans la limite des fichiers." #: gitk:418 gitk:566 msgid "Error executing git log:" @@ -63,15 +60,15 @@ msgstr "Erreur à l'exécution de git log :" msgid "Reading" msgstr "Lecture en cours" -#: gitk:496 gitk:4525 +#: gitk:496 gitk:4544 msgid "Reading commits..." msgstr "Lecture des commits..." -#: gitk:499 gitk:1637 gitk:4528 +#: gitk:499 gitk:1637 gitk:4547 msgid "No commits selected" msgstr "Aucun commit sélectionné" -#: gitk:1445 gitk:4045 gitk:12432 +#: gitk:1445 gitk:4064 gitk:12469 msgid "Command line" msgstr "Ligne de commande" @@ -83,290 +80,294 @@ msgstr "Impossible de lire la sortie de git log :" msgid "No commit information available" msgstr "Aucune information disponible sur le commit" -#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521 +#: gitk:1903 gitk:1932 gitk:4334 gitk:9702 gitk:11274 gitk:11554 msgid "OK" msgstr "OK" -#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671 -#: gitk:11242 gitk:11522 +#: gitk:1934 gitk:4336 gitk:9215 gitk:9294 gitk:9424 gitk:9473 gitk:9704 +#: gitk:11275 gitk:11555 msgid "Cancel" msgstr "Annuler" -#: gitk:2069 +#: gitk:2083 msgid "&Update" msgstr "Mise à jour" -#: gitk:2070 +#: gitk:2084 msgid "&Reload" -msgstr "Recharger" +msgstr "&Recharger" -#: gitk:2071 +#: gitk:2085 msgid "Reread re&ferences" -msgstr "Relire les références" +msgstr "Relire les ré&férences" -#: gitk:2072 +#: gitk:2086 msgid "&List references" -msgstr "Lister les références" +msgstr "&Lister les références" -#: gitk:2074 +#: gitk:2088 msgid "Start git &gui" -msgstr "Démarrer git gui" +msgstr "Démarrer git &gui" -#: gitk:2076 +#: gitk:2090 msgid "&Quit" -msgstr "Quitter" +msgstr "&Quitter" -#: gitk:2068 +#: gitk:2082 msgid "&File" -msgstr "Fichier" +msgstr "&Fichier" -#: gitk:2080 +#: gitk:2094 msgid "&Preferences" msgstr "Préférences" -#: gitk:2079 +#: gitk:2093 msgid "&Edit" -msgstr "Éditer" +msgstr "&Éditer" -#: gitk:2084 +#: gitk:2098 msgid "&New view..." -msgstr "Nouvelle vue..." +msgstr "&Nouvelle vue..." -#: gitk:2085 +#: gitk:2099 msgid "&Edit view..." -msgstr "Éditer la vue..." +msgstr "&Éditer la vue..." -#: gitk:2086 +#: gitk:2100 msgid "&Delete view" msgstr "Supprimer la vue" -#: gitk:2088 gitk:4043 +#: gitk:2102 msgid "&All files" msgstr "Tous les fichiers" -#: gitk:2083 gitk:4067 +#: gitk:2097 msgid "&View" -msgstr "Vue" +msgstr "&Vue" -#: gitk:2093 gitk:2103 gitk:3012 +#: gitk:2107 gitk:2117 msgid "&About gitk" msgstr "À propos de gitk" -#: gitk:2094 gitk:2108 +#: gitk:2108 gitk:2122 msgid "&Key bindings" msgstr "Raccourcis clavier" -#: gitk:2092 gitk:2107 +#: gitk:2106 gitk:2121 msgid "&Help" msgstr "Aide" -#: gitk:2185 gitk:8652 +#: gitk:2199 gitk:8671 msgid "SHA1 ID:" msgstr "Id SHA1 :" -#: gitk:2229 +#: gitk:2243 msgid "Row" msgstr "Colonne" -#: gitk:2267 +#: gitk:2281 msgid "Find" msgstr "Recherche" -#: gitk:2295 +#: gitk:2309 msgid "commit" msgstr "commit" -#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827 -#: gitk:6912 +#: gitk:2313 gitk:2315 gitk:4706 gitk:4729 gitk:4753 gitk:6774 gitk:6846 +#: gitk:6931 msgid "containing:" msgstr "contient :" -#: gitk:2302 gitk:3526 gitk:3531 gitk:4763 +#: gitk:2316 gitk:3545 gitk:3550 gitk:4782 msgid "touching paths:" msgstr "chemins modifiés :" -#: gitk:2303 gitk:4777 +#: gitk:2317 gitk:4796 msgid "adding/removing string:" msgstr "ajoute/supprime la chaîne :" -#: gitk:2304 gitk:4779 +#: gitk:2318 gitk:4798 msgid "changing lines matching:" -msgstr "" +msgstr "modifie les lignes vérifiant :" -#: gitk:2313 gitk:2315 gitk:4766 +#: gitk:2327 gitk:2329 gitk:4785 msgid "Exact" msgstr "Exact" -#: gitk:2315 gitk:4854 gitk:6723 +#: gitk:2329 gitk:4873 gitk:6742 msgid "IgnCase" msgstr "Ignorer la casse" -#: gitk:2315 gitk:4736 gitk:4852 gitk:6719 +#: gitk:2329 gitk:4755 gitk:4871 gitk:6738 msgid "Regexp" msgstr "Expression régulière" -#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916 +#: gitk:2331 gitk:2332 gitk:4893 gitk:4923 gitk:4930 gitk:6867 gitk:6935 msgid "All fields" msgstr "Tous les champs" -#: gitk:2318 gitk:4871 gitk:4904 gitk:6786 +#: gitk:2332 gitk:4890 gitk:4923 gitk:6805 msgid "Headline" -msgstr "Surligner" +msgstr "Titre" -#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389 +#: gitk:2333 gitk:4890 gitk:6805 gitk:6935 gitk:7408 msgid "Comments" msgstr "Commentaires" -#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830 -#: gitk:8845 +#: gitk:2333 gitk:4890 gitk:4895 gitk:4930 gitk:6805 gitk:7343 gitk:8849 +#: gitk:8864 msgid "Author" msgstr "Auteur" -#: gitk:2319 gitk:4871 gitk:6786 gitk:7326 +#: gitk:2333 gitk:4890 gitk:6805 gitk:7345 msgid "Committer" -msgstr "Auteur du commit" +msgstr "Validateur" -#: gitk:2350 +#: gitk:2367 msgid "Search" msgstr "Rechercher" -#: gitk:2358 +#: gitk:2375 msgid "Diff" msgstr "Diff" -#: gitk:2360 +#: gitk:2377 msgid "Old version" msgstr "Ancienne version" -#: gitk:2362 +#: gitk:2379 msgid "New version" msgstr "Nouvelle version" -#: gitk:2364 +#: gitk:2382 msgid "Lines of context" msgstr "Lignes de contexte" -#: gitk:2374 +#: gitk:2392 msgid "Ignore space change" msgstr "Ignorer les modifications d'espace" -#: gitk:2378 gitk:2380 gitk:7959 gitk:8206 +#: gitk:2396 gitk:2398 gitk:7978 gitk:8225 msgid "Line diff" -msgstr "" +msgstr "différence par ligne" -#: gitk:2445 +#: gitk:2463 msgid "Patch" msgstr "Patch" -#: gitk:2447 +#: gitk:2465 msgid "Tree" msgstr "Arbre" -#: gitk:2617 gitk:2637 +#: gitk:2635 gitk:2656 msgid "Diff this -> selected" -msgstr "Diff entre ceci et la sélection" +msgstr "Diff ceci -> la sélection" -#: gitk:2618 gitk:2638 +#: gitk:2636 gitk:2657 msgid "Diff selected -> this" -msgstr "Diff entre sélection et ceci" +msgstr "Diff sélection -> ceci" -#: gitk:2619 gitk:2639 +#: gitk:2637 gitk:2658 msgid "Make patch" msgstr "Créer patch" -#: gitk:2620 gitk:9254 +#: gitk:2638 gitk:9273 msgid "Create tag" -msgstr "Créer tag" +msgstr "Créer étiquette" -#: gitk:2621 gitk:9371 +#: gitk:2639 +msgid "Copy commit summary" +msgstr "Copié le résumé du commit" + +#: gitk:2640 gitk:9404 msgid "Write commit to file" msgstr "Écrire le commit dans un fichier" -#: gitk:2622 gitk:9428 +#: gitk:2641 gitk:9461 msgid "Create new branch" msgstr "Créer une nouvelle branche" -#: gitk:2623 +#: gitk:2642 msgid "Cherry-pick this commit" msgstr "Cueillir (cherry-pick) ce commit" -#: gitk:2624 +#: gitk:2643 msgid "Reset HEAD branch to here" msgstr "Réinitialiser la branche HEAD vers cet état" -#: gitk:2625 +#: gitk:2644 msgid "Mark this commit" msgstr "Marquer ce commit" -#: gitk:2626 +#: gitk:2645 msgid "Return to mark" msgstr "Retourner à la marque" -#: gitk:2627 +#: gitk:2646 msgid "Find descendant of this and mark" msgstr "Chercher le descendant de ceci et le marquer" -#: gitk:2628 +#: gitk:2647 msgid "Compare with marked commit" msgstr "Comparer avec le commit marqué" -#: gitk:2629 gitk:2640 -#, fuzzy +#: gitk:2648 gitk:2659 msgid "Diff this -> marked commit" -msgstr "Diff entre ceci et la sélection" +msgstr "Diff ceci -> sélection" -#: gitk:2630 gitk:2641 -#, fuzzy +#: gitk:2649 gitk:2660 msgid "Diff marked commit -> this" -msgstr "Diff entre sélection et ceci" +msgstr "Diff entre sélection -> ceci" -#: gitk:2631 -#, fuzzy +#: gitk:2650 msgid "Revert this commit" -msgstr "Marquer ce commit" +msgstr "Défaire ce commit" -#: gitk:2647 +#: gitk:2666 msgid "Check out this branch" msgstr "Récupérer cette branche" -#: gitk:2648 +#: gitk:2667 msgid "Remove this branch" msgstr "Supprimer cette branche" -#: gitk:2649 +#: gitk:2668 msgid "Copy branch name" -msgstr "" +msgstr "Copier la nom de la branche" -#: gitk:2656 +#: gitk:2675 msgid "Highlight this too" msgstr "Surligner également ceci" -#: gitk:2657 +#: gitk:2676 msgid "Highlight this only" msgstr "Surligner seulement ceci" -#: gitk:2658 +#: gitk:2677 msgid "External diff" msgstr "Diff externe" -#: gitk:2659 +#: gitk:2678 msgid "Blame parent commit" msgstr "Blâmer le commit parent" -#: gitk:2660 +#: gitk:2679 msgid "Copy path" -msgstr "" +msgstr "Copier le chemin" -#: gitk:2667 +#: gitk:2686 msgid "Show origin of this line" msgstr "Montrer l'origine de cette ligne" -#: gitk:2668 +#: gitk:2687 msgid "Run git gui blame on this line" msgstr "Exécuter git gui blame sur cette ligne" -#: gitk:3014 -#, fuzzy +#: gitk:3031 +msgid "About gitk" +msgstr "À propos de gitk" + +#: gitk:3033 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -378,327 +379,329 @@ msgstr "" "\n" "Gitk - visualisateur de commit pour git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright \\u00a9 2005-2014 Paul Mackerras\n" "\n" -"Utilisation et redistribution soumises aux termes de la GNU General Public " -"License" +"Utilisation et redistribution soumises aux termes de la GNU General Public License" -#: gitk:3022 gitk:3089 gitk:9857 +#: gitk:3041 gitk:3108 gitk:9890 msgid "Close" msgstr "Fermer" -#: gitk:3043 +#: gitk:3062 msgid "Gitk key bindings" msgstr "Raccourcis clavier de Gitk" -#: gitk:3046 +#: gitk:3065 msgid "Gitk key bindings:" msgstr "Raccourcis clavier de Gitk :" -#: gitk:3048 +#: gitk:3067 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tQuitter" -#: gitk:3049 -#, fuzzy, tcl-format +#: gitk:3068 +#, tcl-format msgid "<%s-W>\t\tClose window" -msgstr "<%s-F>\t\tRechercher" +msgstr "<%s-W>\t\tFermer la fenêtre" -#: gitk:3050 +#: gitk:3069 msgid "\t\tMove to first commit" msgstr "\t\tAller au premier commit" -#: gitk:3051 +#: gitk:3070 msgid "\t\tMove to last commit" msgstr "\t\tAller au dernier commit" -#: gitk:3052 -#, fuzzy +#: gitk:3071 msgid ", p, k\tMove up one commit" -msgstr ", p, i\t Aller au commit suivant" +msgstr ", p, k\t Aller au commit précédent" -#: gitk:3053 -#, fuzzy +#: gitk:3072 msgid ", n, j\tMove down one commit" -msgstr ", n, k\t Aller au commit précédent" +msgstr ", n, j\t Aller au commit suivant" -#: gitk:3054 -#, fuzzy +#: gitk:3073 msgid ", z, h\tGo back in history list" -msgstr ", z, j\tReculer dans l'historique" +msgstr ", z, h\tReculer dans l'historique" -#: gitk:3055 +#: gitk:3074 msgid ", x, l\tGo forward in history list" msgstr ", x, l\tAvancer dans l'historique" -#: gitk:3056 +#: gitk:3075 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" -msgstr "" +msgstr "<%s-n>\tAller sur le n-ième parent du commit dans l'historique" -#: gitk:3057 +#: gitk:3076 msgid "\tMove up one page in commit list" msgstr "\tMonter d'une page dans la liste des commits" -#: gitk:3058 +#: gitk:3077 msgid "\tMove down one page in commit list" msgstr "\tDescendre d'une page dans la liste des commits" -#: gitk:3059 +#: gitk:3078 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Début>\tAller en haut de la liste des commits" -#: gitk:3060 +#: gitk:3079 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tAller en bas de la liste des commits" -#: gitk:3061 +#: gitk:3080 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tMonter d'une ligne dans la liste des commits" -#: gitk:3062 +#: gitk:3081 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tDescendre d'une ligne dans la liste des commits" -#: gitk:3063 +#: gitk:3082 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tMonter d'une page dans la liste des commits" -#: gitk:3064 +#: gitk:3083 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tDescendre d'une page dans la liste des commits" -#: gitk:3065 +#: gitk:3084 msgid "\tFind backwards (upwards, later commits)" msgstr "" "\tRecherche en arrière (vers l'avant, commits les plus anciens)" -#: gitk:3066 +#: gitk:3085 msgid "\tFind forwards (downwards, earlier commits)" msgstr "" "\tRecherche en avant (vers l'arrière, commit les plus récents)" -#: gitk:3067 +#: gitk:3086 msgid ", b\tScroll diff view up one page" msgstr ", b\tMonter d'une page dans la vue des diff" -#: gitk:3068 +#: gitk:3087 msgid "\tScroll diff view up one page" msgstr "\tMonter d'une page dans la vue des diff" -#: gitk:3069 +#: gitk:3088 msgid "\t\tScroll diff view down one page" msgstr "\t\tDescendre d'une page dans la vue des diff" -#: gitk:3070 +#: gitk:3089 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tMonter de 18 lignes dans la vue des diff" -#: gitk:3071 +#: gitk:3090 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tDescendre de 18 lignes dans la vue des diff" -#: gitk:3072 +#: gitk:3091 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tRechercher" -#: gitk:3073 +#: gitk:3092 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tAller au résultat de recherche suivant" -#: gitk:3074 +#: gitk:3093 msgid "\tMove to next find hit" msgstr "\t\tAller au résultat de recherche suivant" -#: gitk:3075 -#, fuzzy +#: gitk:3094 msgid "g\t\tGo to commit" -msgstr "\t\tAller au dernier commit" +msgstr "g\t\tAller au commit" -#: gitk:3076 +#: gitk:3095 msgid "/\t\tFocus the search box" msgstr "/\t\tFocus sur la zone de recherche" -#: gitk:3077 +#: gitk:3096 msgid "?\t\tMove to previous find hit" msgstr "?\t\tAller au résultat de recherche précédent" -#: gitk:3078 +#: gitk:3097 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tAller au prochain fichier dans la vue des diff" -#: gitk:3079 +#: gitk:3098 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tAller au résultat suivant dans la vue des diff" -#: gitk:3080 +#: gitk:3099 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tAller au résultat précédent dans la vue des diff" -#: gitk:3081 +#: gitk:3100 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tAugmenter la taille de la police" -#: gitk:3082 +#: gitk:3101 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tAugmenter la taille de la police" -#: gitk:3083 +#: gitk:3102 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tDiminuer la taille de la police" -#: gitk:3084 +#: gitk:3103 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tDiminuer la taille de la police" -#: gitk:3085 +#: gitk:3104 msgid "\t\tUpdate" msgstr "\t\tMise à jour" -#: gitk:3550 gitk:3559 +#: gitk:3569 gitk:3578 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Erreur lors de la création du répertoire temporaire %s :" -#: gitk:3572 +#: gitk:3591 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Erreur en obtenant \"%s\" de %s:" -#: gitk:3635 +#: gitk:3654 msgid "command failed:" msgstr "échec de la commande :" -#: gitk:3784 +#: gitk:3803 msgid "No such commit" msgstr "Commit inexistant" -#: gitk:3798 +#: gitk:3817 msgid "git gui blame: command failed:" msgstr "git gui blame : échec de la commande :" -#: gitk:3829 +#: gitk:3848 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Impossible de lire le head de la fusion : %s" -#: gitk:3837 +#: gitk:3856 #, tcl-format msgid "Error reading index: %s" msgstr "Erreur à la lecture de l'index : %s" -#: gitk:3862 +#: gitk:3881 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Impossible de démarrer git blame : %s" -#: gitk:3865 gitk:6754 +#: gitk:3884 gitk:6773 msgid "Searching" msgstr "Recherche en cours" -#: gitk:3897 +#: gitk:3916 #, tcl-format msgid "Error running git blame: %s" msgstr "Erreur à l'exécution de git blame : %s" -#: gitk:3925 +#: gitk:3944 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Cette ligne est issue du commit %s, qui n'est pas dans cette vue" -#: gitk:3939 +#: gitk:3958 msgid "External diff viewer failed:" -msgstr "Échec de l'outil externe de visualisation des diff" +msgstr "Échec de l'outil externe de visualisation des diff :" -#: gitk:4070 +#: gitk:4062 +msgid "All files" +msgstr "Tous les fichiers" + +#: gitk:4086 +msgid "View" +msgstr "Vue" + +#: gitk:4089 msgid "Gitk view definition" msgstr "Définition des vues de Gitk" -#: gitk:4074 +#: gitk:4093 msgid "Remember this view" msgstr "Se souvenir de cette vue" -#: gitk:4075 +#: gitk:4094 msgid "References (space separated list):" msgstr "Références (liste d'éléments séparés par des espaces) :" -#: gitk:4076 +#: gitk:4095 msgid "Branches & tags:" -msgstr "Branches & tags :" +msgstr "Branches & étiquettes :" -#: gitk:4077 +#: gitk:4096 msgid "All refs" msgstr "Toutes les références" -#: gitk:4078 +#: gitk:4097 msgid "All (local) branches" msgstr "Toutes les branches (locales)" -#: gitk:4079 +#: gitk:4098 msgid "All tags" -msgstr "Tous les tags" +msgstr "Toutes les étiquettes" -#: gitk:4080 +#: gitk:4099 msgid "All remote-tracking branches" msgstr "Toutes les branches de suivi à distance" -#: gitk:4081 +#: gitk:4100 msgid "Commit Info (regular expressions):" msgstr "Info sur les commits (expressions régulières) :" -#: gitk:4082 +#: gitk:4101 msgid "Author:" msgstr "Auteur :" -#: gitk:4083 +#: gitk:4102 msgid "Committer:" -msgstr "Commiteur :" +msgstr "Validateur :" -#: gitk:4084 +#: gitk:4103 msgid "Commit Message:" msgstr "Message de commit :" -#: gitk:4085 +#: gitk:4104 msgid "Matches all Commit Info criteria" msgstr "Correspond à tous les critères d'Info sur les commits" -#: gitk:4086 -#, fuzzy +#: gitk:4105 msgid "Matches no Commit Info criteria" -msgstr "Correspond à tous les critères d'Info sur les commits" +msgstr "Ne correspond à aucun des critères d'Info sur les commits" -#: gitk:4087 +#: gitk:4106 msgid "Changes to Files:" msgstr "Changements des fichiers :" -#: gitk:4088 +#: gitk:4107 msgid "Fixed String" msgstr "Chaîne Figée" -#: gitk:4089 +#: gitk:4108 msgid "Regular Expression" msgstr "Expression Régulière" -#: gitk:4090 +#: gitk:4109 msgid "Search string:" msgstr "Recherche de la chaîne :" -#: gitk:4091 +#: gitk:4110 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -706,204 +709,201 @@ msgstr "" "Dates des commits (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, " "2009 15:27:38\") :" -#: gitk:4092 +#: gitk:4111 msgid "Since:" -msgstr "De :" +msgstr "Depuis :" -#: gitk:4093 +#: gitk:4112 msgid "Until:" msgstr "Jusqu'au :" -#: gitk:4094 +#: gitk:4113 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Limiter et/ou sauter un certain nombre (entier positif) de révisions :" -#: gitk:4095 +#: gitk:4114 msgid "Number to show:" msgstr "Nombre à afficher :" -#: gitk:4096 +#: gitk:4115 msgid "Number to skip:" msgstr "Nombre à sauter :" -#: gitk:4097 +#: gitk:4116 msgid "Miscellaneous options:" msgstr "Options diverses :" -#: gitk:4098 +#: gitk:4117 msgid "Strictly sort by date" msgstr "Trier par date" -# FIXME : traduction de "branch sides" -#: gitk:4099 -#, fuzzy +#: gitk:4118 msgid "Mark branch sides" -msgstr "Marquer les extrémités des branches" +msgstr "Indiquer les côtés des branches" -#: gitk:4100 +#: gitk:4119 msgid "Limit to first parent" msgstr "Limiter au premier ancêtre" -#: gitk:4101 +#: gitk:4120 msgid "Simple history" msgstr "Historique simple" -#: gitk:4102 +#: gitk:4121 msgid "Additional arguments to git log:" msgstr "Arguments supplémentaires de git log :" -#: gitk:4103 +#: gitk:4122 msgid "Enter files and directories to include, one per line:" msgstr "Saisir les fichiers et répertoires à inclure, un par ligne :" -#: gitk:4104 +#: gitk:4123 msgid "Command to generate more commits to include:" msgstr "Commande pour générer plus de commits à inclure :" -#: gitk:4228 +#: gitk:4247 msgid "Gitk: edit view" msgstr "Gitk : éditer la vue" -#: gitk:4236 +#: gitk:4255 msgid "-- criteria for selecting revisions" msgstr "-- critère pour la sélection des révisions" -#: gitk:4241 -#, fuzzy +#: gitk:4260 msgid "View Name" -msgstr "Nom de la vue :" +msgstr "Nom de la vue" -#: gitk:4316 +#: gitk:4335 msgid "Apply (F5)" msgstr "Appliquer (F5)" -#: gitk:4354 +#: gitk:4373 msgid "Error in commit selection arguments:" msgstr "Erreur dans les arguments de sélection des commits :" -#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374 +#: gitk:4428 gitk:4481 gitk:4943 gitk:4957 gitk:6227 gitk:12410 gitk:12411 msgid "None" msgstr "Aucun" -#: gitk:5021 gitk:5026 +#: gitk:5040 gitk:5045 msgid "Descendant" msgstr "Descendant" -#: gitk:5022 +#: gitk:5041 msgid "Not descendant" msgstr "Pas un descendant" -#: gitk:5029 gitk:5034 +#: gitk:5048 gitk:5053 msgid "Ancestor" msgstr "Ancêtre" -#: gitk:5030 +#: gitk:5049 msgid "Not ancestor" msgstr "Pas un ancêtre" -#: gitk:5324 +#: gitk:5343 msgid "Local changes checked in to index but not committed" -msgstr "Modifications locales enregistrées dans l'index mais non commitées" +msgstr "Modifications locales enregistrées dans l'index mais non validées" -#: gitk:5360 +#: gitk:5379 msgid "Local uncommitted changes, not checked in to index" -msgstr "Modifications locales non enregistrées dans l'index et non commitées" +msgstr "Modifications locales non enregistrées dans l'index et non validées" -#: gitk:7134 +#: gitk:7153 msgid "and many more" -msgstr "" +msgstr "et beaucoup plus" -#: gitk:7137 +#: gitk:7156 msgid "many" msgstr "nombreux" -#: gitk:7328 +#: gitk:7347 msgid "Tags:" -msgstr "Tags :" +msgstr "Étiquettes :" -#: gitk:7345 gitk:7351 gitk:8825 +#: gitk:7364 gitk:7370 gitk:8844 msgid "Parent" msgstr "Parent" -#: gitk:7356 +#: gitk:7375 msgid "Child" msgstr "Enfant" -#: gitk:7365 +#: gitk:7384 msgid "Branch" msgstr "Branche" -#: gitk:7368 +#: gitk:7387 msgid "Follows" msgstr "Suit" -#: gitk:7371 +#: gitk:7390 msgid "Precedes" msgstr "Précède" -#: gitk:7966 +#: gitk:7985 #, tcl-format msgid "Error getting diffs: %s" msgstr "Erreur lors de la récupération des diff : %s" -#: gitk:8650 +#: gitk:8669 msgid "Goto:" msgstr "Aller à :" -#: gitk:8671 +#: gitk:8690 #, tcl-format msgid "Short SHA1 id %s is ambiguous" -msgstr "Id SHA1 court %s est ambigu" +msgstr "L'id SHA1 court %s est ambigu" -#: gitk:8678 +#: gitk:8697 #, tcl-format msgid "Revision %s is not known" -msgstr "Id SHA1 %s est inconnu" +msgstr "La révision %s est inconnu" -#: gitk:8688 +#: gitk:8707 #, tcl-format msgid "SHA1 id %s is not known" -msgstr "Id SHA1 %s est inconnu" +msgstr "L'id SHA1 %s est inconnu" -#: gitk:8690 +#: gitk:8709 #, tcl-format msgid "Revision %s is not in the current view" msgstr "La révision %s n'est pas dans la vue courante" -#: gitk:8832 gitk:8847 +#: gitk:8851 gitk:8866 msgid "Date" msgstr "Date" -#: gitk:8835 +#: gitk:8854 msgid "Children" msgstr "Enfants" -#: gitk:8898 +#: gitk:8917 #, tcl-format msgid "Reset %s branch to here" msgstr "Réinitialiser la branche %s vers cet état" -#: gitk:8900 +#: gitk:8919 msgid "Detached head: can't reset" msgstr "Head détaché : impossible de réinitialiser" -#: gitk:9005 gitk:9011 +#: gitk:9024 gitk:9030 msgid "Skipping merge commit " msgstr "Éviter le commit de la fusion " -#: gitk:9020 gitk:9025 +#: gitk:9039 gitk:9044 msgid "Error getting patch ID for " msgstr "Erreur à l'obtention de l'ID du patch pour " -#: gitk:9021 gitk:9026 +#: gitk:9040 gitk:9045 msgid " - stopping\n" msgstr " - arrêt en cours\n" -#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065 +#: gitk:9050 gitk:9053 gitk:9061 gitk:9075 gitk:9084 msgid "Commit " msgstr "Commit " -#: gitk:9035 +#: gitk:9054 msgid "" " is the same patch as\n" " " @@ -911,7 +911,7 @@ msgstr "" "est le même patch que \n" " " -#: gitk:9043 +#: gitk:9062 msgid "" " differs from\n" " " @@ -919,240 +919,226 @@ msgstr "" " diffère de\n" " " -#: gitk:9045 +#: gitk:9064 msgid "" "Diff of commits:\n" "\n" -msgstr "" +msgstr "Diff des commits :\n\n" -#: gitk:9057 gitk:9066 +#: gitk:9076 gitk:9085 #, tcl-format msgid " has %s children - stopping\n" -msgstr "a %s enfants - arrêt en cours\n" +msgstr " a %s enfants - arrêt en cours\n" -#: gitk:9085 -#, fuzzy, tcl-format +#: gitk:9104 +#, tcl-format msgid "Error writing commit to file: %s" -msgstr "Erreur à l'ecriture du commit :" +msgstr "Erreur à l'écriture du commit dans le fichier : %s" -#: gitk:9091 -#, fuzzy, tcl-format +#: gitk:9110 +#, tcl-format msgid "Error diffing commits: %s" -msgstr "Erreur à l'ecriture du commit :" +msgstr "Erreur à la différence des commits : %s" -#: gitk:9137 +#: gitk:9156 msgid "Top" msgstr "Haut" -#: gitk:9138 +#: gitk:9157 msgid "From" msgstr "De" -#: gitk:9143 +#: gitk:9162 msgid "To" msgstr "À" -#: gitk:9167 +#: gitk:9186 msgid "Generate patch" msgstr "Générer le patch" -#: gitk:9169 +#: gitk:9188 msgid "From:" msgstr "De :" -#: gitk:9178 +#: gitk:9197 msgid "To:" msgstr "À :" -#: gitk:9187 +#: gitk:9206 msgid "Reverse" msgstr "Inverser" -#: gitk:9189 gitk:9385 +#: gitk:9208 gitk:9418 msgid "Output file:" msgstr "Fichier de sortie :" -#: gitk:9195 +#: gitk:9214 msgid "Generate" msgstr "Générer" -#: gitk:9233 +#: gitk:9252 msgid "Error creating patch:" msgstr "Erreur à la création du patch :" -#: gitk:9256 gitk:9373 gitk:9430 +#: gitk:9275 gitk:9406 gitk:9463 msgid "ID:" msgstr "ID :" -#: gitk:9265 +#: gitk:9284 msgid "Tag name:" -msgstr "Nom du Tag :" +msgstr "Nom de l'étiquette :" -#: gitk:9268 +#: gitk:9287 msgid "Tag message is optional" -msgstr "" +msgstr "Le message d'étiquette est optionnel" -#: gitk:9270 -#, fuzzy +#: gitk:9289 msgid "Tag message:" -msgstr "Nom du Tag :" +msgstr "Message d'étiquette :" -#: gitk:9274 gitk:9439 +#: gitk:9293 gitk:9472 msgid "Create" msgstr "Créer" -#: gitk:9292 +#: gitk:9311 msgid "No tag name specified" -msgstr "Aucun nom de tag spécifié" +msgstr "Aucun nom d'étiquette spécifié" -#: gitk:9296 +#: gitk:9315 #, tcl-format msgid "Tag \"%s\" already exists" -msgstr "Le tag \"%s\" existe déjà" +msgstr "L'étiquette \"%s\" existe déjà" -#: gitk:9306 +#: gitk:9325 msgid "Error creating tag:" -msgstr "Erreur à la création du tag :" +msgstr "Erreur à la création de l'étiquette :" -#: gitk:9382 +#: gitk:9415 msgid "Command:" msgstr "Commande :" -#: gitk:9390 +#: gitk:9423 msgid "Write" msgstr "Écrire" -#: gitk:9408 +#: gitk:9441 msgid "Error writing commit:" msgstr "Erreur à l'ecriture du commit :" -#: gitk:9435 +#: gitk:9468 msgid "Name:" msgstr "Nom :" -#: gitk:9458 +#: gitk:9491 msgid "Please specify a name for the new branch" msgstr "Veuillez spécifier un nom pour la nouvelle branche" -#: gitk:9463 +#: gitk:9496 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "La branche '%s' existe déjà. Écraser?" -#: gitk:9530 +#: gitk:9563 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "Le Commit %s est déjà inclus dans la branche %s -- le ré-appliquer malgré " "tout?" -#: gitk:9535 +#: gitk:9568 msgid "Cherry-picking" -msgstr "Cueillir (Cherry-picking)" +msgstr "Picorer (Cherry-picking)" -#: gitk:9544 +#: gitk:9577 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" "Please commit, reset or stash your changes and try again." msgstr "" -"La cueillette (cherry-pick) a échouée à cause de modifications locales du " -"fichier '%s'.\n" -"Veuillez commiter, réinitialiser ou stasher vos changements et essayer de " -"nouveau." +"Le picorage (cherry-pick) a échouée à cause de modifications locales du fichier '%s'.\n" +"Veuillez commiter, réinitialiser ou stasher vos changements et essayer de nouveau." -#: gitk:9550 +#: gitk:9583 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" msgstr "" -"La cueillette (cherry-pick) a échouée à cause d'un conflit lors d'une " -"fusion.\n" +"Le picorage (cherry-pick) a échouée à cause d'un conflit lors d'une fusion.\n" "Souhaitez-vous exécuter git citool pour le résoudre ?" -#: gitk:9566 gitk:9624 +#: gitk:9599 gitk:9657 msgid "No changes committed" -msgstr "Aucun changement commité" +msgstr "Aucune modification validée" -#: gitk:9593 -#, fuzzy, tcl-format +#: gitk:9626 +#, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" -msgstr "" -"Le Commit %s est déjà inclus dans la branche %s -- le ré-appliquer malgré " -"tout?" +msgstr "Le Commit %s n'est pas inclus dans la branche %s -- le défaire malgré tout?" -#: gitk:9598 -#, fuzzy +#: gitk:9631 msgid "Reverting" -msgstr "Réinitialisation" +msgstr "Commit défait" -#: gitk:9606 -#, fuzzy, tcl-format +#: gitk:9639 +#, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " "commit, reset or stash your changes and try again." -msgstr "" -"La cueillette (cherry-pick) a échouée à cause de modifications locales du " -"fichier '%s'.\n" -"Veuillez commiter, réinitialiser ou stasher vos changements et essayer de " -"nouveau." +msgstr "Échec en tentant de défaire le commit à cause de modifications locales des fichiers : %s. Veuillez valider, réinitialiser ou remiser vos modifications et essayer de nouveau." -#: gitk:9610 -#, fuzzy +#: gitk:9643 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" msgstr "" -"La cueillette (cherry-pick) a échouée à cause d'un conflit lors d'une " -"fusion.\n" +"Échec en tentant de défaire à cause d'un conflit de fusion.\n" "Souhaitez-vous exécuter git citool pour le résoudre ?" -#: gitk:9653 +#: gitk:9686 msgid "Confirm reset" msgstr "Confirmer la réinitialisation" -#: gitk:9655 +#: gitk:9688 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Réinitialiser la branche %s à %s?" -#: gitk:9657 +#: gitk:9690 msgid "Reset type:" msgstr "Type de réinitialisation :" -#: gitk:9660 +#: gitk:9693 msgid "Soft: Leave working tree and index untouched" msgstr "Douce : Laisse le répertoire de travail et l'index intacts" -#: gitk:9663 +#: gitk:9696 msgid "Mixed: Leave working tree untouched, reset index" msgstr "" "Hybride : Laisse le répertoire de travail dans son état courant, " "réinitialise l'index" -#: gitk:9666 +#: gitk:9699 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" msgstr "" "Dure : Réinitialise le répertoire de travail et l'index\n" -"(abandonne TOUS les changements locaux)" +"(abandonne TOUTES les modifications locale)" -#: gitk:9683 +#: gitk:9716 msgid "Resetting" msgstr "Réinitialisation" # Fixme: Récupération est-il vraiment une mauvaise traduction? -#: gitk:9743 -#, fuzzy +#: gitk:9776 msgid "Checking out" -msgstr "Récupération" +msgstr "Extraction" -#: gitk:9796 +#: gitk:9829 msgid "Cannot delete the currently checked-out branch" -msgstr "Impossible de supprimer la branche en cours" +msgstr "Impossible de supprimer la branche extraite" -#: gitk:9802 +#: gitk:9835 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1161,16 +1147,16 @@ msgstr "" "Les commits de la branche %s ne sont dans aucune autre branche.\n" "Voulez-vous vraiment supprimer cette branche %s ?" -#: gitk:9833 +#: gitk:9866 #, tcl-format msgid "Tags and heads: %s" -msgstr "Tags et heads : %s" +msgstr "Étiquettes et heads : %s" -#: gitk:9850 +#: gitk:9883 msgid "Filter" msgstr "Filtrer" -#: gitk:10146 +#: gitk:10179 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1179,207 +1165,202 @@ msgstr "" "informations sur les branches et les tags précédents/suivants seront " "incomplètes." -#: gitk:11123 +#: gitk:11156 msgid "Tag" -msgstr "Tag" +msgstr "Étiquette" -#: gitk:11127 +#: gitk:11160 msgid "Id" msgstr "Id" -#: gitk:11210 +#: gitk:11243 msgid "Gitk font chooser" msgstr "Sélecteur de police de Gitk" -#: gitk:11227 +#: gitk:11260 msgid "B" msgstr "B" -#: gitk:11230 +#: gitk:11263 msgid "I" msgstr "I" -#: gitk:11348 +#: gitk:11381 msgid "Commit list display options" msgstr "Options d'affichage de la liste des commits" -#: gitk:11351 +#: gitk:11384 msgid "Maximum graph width (lines)" msgstr "Longueur maximum du graphe (lignes)" # FIXME : Traduction standard de "pane"? -#: gitk:11355 -#, fuzzy, no-tcl-format +#: gitk:11388 +#, no-tcl-format msgid "Maximum graph width (% of pane)" -msgstr "Longueur maximum du graphe (% du panneau)" +msgstr "Largeur maximum du graphe (% du panneau)" -#: gitk:11358 +#: gitk:11391 msgid "Show local changes" -msgstr "Montrer les changements locaux" +msgstr "Montrer les modifications locales" -#: gitk:11361 -#, fuzzy +#: gitk:11394 msgid "Auto-select SHA1 (length)" -msgstr "Sélection auto. du SHA1" +msgstr "Sélection auto. du SHA1 (longueur)" -#: gitk:11365 +#: gitk:11398 msgid "Hide remote refs" msgstr "Cacher les refs distantes" -#: gitk:11369 +#: gitk:11402 msgid "Diff display options" msgstr "Options d'affichage des diff" -#: gitk:11371 +#: gitk:11404 msgid "Tab spacing" msgstr "Taille des tabulations" -#: gitk:11374 -#, fuzzy +#: gitk:11407 msgid "Display nearby tags/heads" msgstr "Afficher les tags les plus proches" -#: gitk:11377 +#: gitk:11410 msgid "Maximum # tags/heads to show" -msgstr "" +msgstr "Nombre maximum d'étiquettes/heads à afficher" -#: gitk:11380 +#: gitk:11413 msgid "Limit diffs to listed paths" msgstr "Limiter les différences aux chemins listés" -#: gitk:11383 +#: gitk:11416 msgid "Support per-file encodings" msgstr "Support pour un encodage des caractères par fichier" -#: gitk:11389 gitk:11536 +#: gitk:11422 gitk:11569 msgid "External diff tool" msgstr "Outil diff externe" -#: gitk:11390 +#: gitk:11423 msgid "Choose..." msgstr "Choisir..." -#: gitk:11395 -#, fuzzy +#: gitk:11428 msgid "General options" -msgstr "Générer le patch" +msgstr "Options générales" -#: gitk:11398 +#: gitk:11431 msgid "Use themed widgets" -msgstr "" +msgstr "Utiliser des widgets en thème" -#: gitk:11400 +#: gitk:11433 msgid "(change requires restart)" -msgstr "" +msgstr "(la modification nécessite un redémarrage)" -#: gitk:11402 +#: gitk:11435 msgid "(currently unavailable)" -msgstr "" +msgstr "(non disponible actuellement)" -#: gitk:11413 +#: gitk:11446 msgid "Colors: press to choose" msgstr "Couleurs : cliquer pour choisir" -#: gitk:11416 +#: gitk:11449 msgid "Interface" -msgstr "" +msgstr "Interface" -#: gitk:11417 -#, fuzzy +#: gitk:11450 msgid "interface" -msgstr "Police de l'interface utilisateur" +msgstr "interface" -#: gitk:11420 +#: gitk:11453 msgid "Background" msgstr "Arrière-plan" -#: gitk:11421 gitk:11451 +#: gitk:11454 gitk:11484 msgid "background" msgstr "arrière-plan" -#: gitk:11424 +#: gitk:11457 msgid "Foreground" msgstr "Premier plan" -#: gitk:11425 +#: gitk:11458 msgid "foreground" msgstr "premier plan" -#: gitk:11428 +#: gitk:11461 msgid "Diff: old lines" msgstr "Diff : anciennes lignes" -#: gitk:11429 +#: gitk:11462 msgid "diff old lines" msgstr "diff anciennes lignes" -#: gitk:11433 +#: gitk:11466 msgid "Diff: new lines" msgstr "Diff : nouvelles lignes" -#: gitk:11434 +#: gitk:11467 msgid "diff new lines" msgstr "diff nouvelles lignes" -#: gitk:11438 +#: gitk:11471 msgid "Diff: hunk header" msgstr "Diff : entête du hunk" -#: gitk:11440 +#: gitk:11473 msgid "diff hunk header" msgstr "diff : entête du hunk" -#: gitk:11444 +#: gitk:11477 msgid "Marked line bg" -msgstr "Arrière-plan de la ligne marquée" +msgstr "Fond de la ligne marquée" -#: gitk:11446 +#: gitk:11479 msgid "marked line background" -msgstr "Arrière-plan de la ligne marquée" +msgstr "Fond de la ligne marquée" -#: gitk:11450 +#: gitk:11483 msgid "Select bg" -msgstr "Sélectionner l'arrière-plan" +msgstr "Sélectionner le fond" -#: gitk:11459 +#: gitk:11492 msgid "Fonts: press to choose" msgstr "Polices : cliquer pour choisir" -#: gitk:11461 +#: gitk:11494 msgid "Main font" msgstr "Police principale" -#: gitk:11462 +#: gitk:11495 msgid "Diff display font" msgstr "Police d'affichage des diff" -#: gitk:11463 +#: gitk:11496 msgid "User interface font" msgstr "Police de l'interface utilisateur" -#: gitk:11485 +#: gitk:11518 msgid "Gitk preferences" msgstr "Préférences de Gitk" -#: gitk:11494 -#, fuzzy +#: gitk:11527 msgid "General" -msgstr "Générer" +msgstr "Général" -#: gitk:11495 +#: gitk:11528 msgid "Colors" -msgstr "" +msgstr "Couleurs" -#: gitk:11496 +#: gitk:11529 msgid "Fonts" -msgstr "" +msgstr "Polices" -#: gitk:11546 +#: gitk:11579 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk : choisir la couleur de %s" -#: gitk:12059 +#: gitk:12092 msgid "" "Sorry, gitk cannot run with this version of Tcl/Tk.\n" " Gitk requires at least Tcl/Tk 8.4." @@ -1387,16 +1368,16 @@ msgstr "" "Désolé, gitk ne peut être exécuté avec cette version de Tcl/Tk.\n" " Gitk requiert Tcl/Tk version 8.4 ou supérieur." -#: gitk:12269 +#: gitk:12302 msgid "Cannot find a git repository here." msgstr "Impossible de trouver un dépôt git ici." -#: gitk:12316 +#: gitk:12349 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Argument '%s' ambigu : à la fois une révision et un nom de fichier" -#: gitk:12328 +#: gitk:12361 msgid "Bad arguments to gitk:" msgstr "Arguments invalides pour gitk :" diff --git a/gitk-git/po/ja.po b/gitk-git/po/ja.po index 59e42a89fd..f143753db0 100644 --- a/gitk-git/po/ja.po +++ b/gitk-git/po/ja.po @@ -1,7 +1,8 @@ # Japanese translations for gitk package. -# Copyright (C) 2005-2009 Paul Mackerras +# Copyright (C) 2005-2015 Paul Mackerras # This file is distributed under the same license as the gitk package. # +# YOKOTA Hiroshi , 2015. # Mizar , 2009. # Junio C Hamano , 2009. msgid "" @@ -9,10 +10,10 @@ msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-05-17 14:32+1000\n" -"PO-Revision-Date: 2009-11-06 01:45+0900\n" -"Last-Translator: Mizar \n" +"PO-Revision-Date: 2015-11-12 13:00+0900\n" +"Last-Translator: YOKOTA Hiroshi \n" "Language-Team: Japanese\n" -"Language: \n" +"Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -24,11 +25,11 @@ msgstr "マージされていないファイルのリストを取得できませ #: gitk:212 gitk:2381 msgid "Color words" -msgstr "" +msgstr "変更を着色" -#: gitk:217 gitk:2381 gitk:8220 gitk:8253 +#: gitk:217 gitk:2381 gitk:8221 gitk:8254 msgid "Markup words" -msgstr "" +msgstr "変更をマークアップ" #: gitk:324 msgid "Error parsing revisions:" @@ -60,15 +61,15 @@ msgstr "git log 実行エラー:" msgid "Reading" msgstr "読み込み中" -#: gitk:496 gitk:4525 +#: gitk:496 gitk:4526 msgid "Reading commits..." msgstr "コミット読み込み中..." -#: gitk:499 gitk:1637 gitk:4528 +#: gitk:499 gitk:1637 gitk:4529 msgid "No commits selected" msgstr "コミットが選択されていません" -#: gitk:1445 gitk:4045 gitk:12432 +#: gitk:1445 gitk:4046 gitk:12447 msgid "Command line" msgstr "コマンド行" @@ -80,12 +81,12 @@ msgstr "git log の出力を解析できません:" msgid "No commit information available" msgstr "有効なコミットの情報がありません" -#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521 +#: gitk:1903 gitk:1932 gitk:4316 gitk:9684 gitk:11256 gitk:11536 msgid "OK" msgstr "OK" -#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671 -#: gitk:11242 gitk:11522 +#: gitk:1934 gitk:4318 gitk:9197 gitk:9276 gitk:9406 gitk:9455 gitk:9686 +#: gitk:11257 gitk:11537 msgid "Cancel" msgstr "キャンセル" @@ -127,25 +128,25 @@ msgstr "編集(&E)" #: gitk:2084 msgid "&New view..." -msgstr "新規ビュー...(&N)" +msgstr "新規ビュー(&N)..." #: gitk:2085 msgid "&Edit view..." -msgstr "ビュー編集...(&E)" +msgstr "ビュー編集(&E)..." #: gitk:2086 msgid "&Delete view" msgstr "ビュー削除(&D)" -#: gitk:2088 gitk:4043 +#: gitk:2088 msgid "&All files" msgstr "全てのファイル(&A)" -#: gitk:2083 gitk:4067 +#: gitk:2083 msgid "&View" msgstr "ビュー(&V)" -#: gitk:2093 gitk:2103 gitk:3012 +#: gitk:2093 gitk:2103 msgid "&About gitk" msgstr "gitk について(&A)" @@ -157,7 +158,7 @@ msgstr "キーバインディング(&K)" msgid "&Help" msgstr "ヘルプ(&H)" -#: gitk:2185 gitk:8652 +#: gitk:2185 gitk:8653 msgid "SHA1 ID:" msgstr "SHA1 ID:" @@ -173,53 +174,53 @@ msgstr "検索" msgid "commit" msgstr "コミット" -#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827 -#: gitk:6912 +#: gitk:2299 gitk:2301 gitk:4688 gitk:4711 gitk:4735 gitk:6756 gitk:6828 +#: gitk:6913 msgid "containing:" msgstr "含む:" -#: gitk:2302 gitk:3526 gitk:3531 gitk:4763 +#: gitk:2302 gitk:3527 gitk:3532 gitk:4764 msgid "touching paths:" msgstr "パスの一部:" -#: gitk:2303 gitk:4777 +#: gitk:2303 gitk:4778 msgid "adding/removing string:" -msgstr "追加/除去する文字列:" +msgstr "追加/除去される文字列:" -#: gitk:2304 gitk:4779 +#: gitk:2304 gitk:4780 msgid "changing lines matching:" -msgstr "" +msgstr "変更される文字列" -#: gitk:2313 gitk:2315 gitk:4766 +#: gitk:2313 gitk:2315 gitk:4767 msgid "Exact" msgstr "英字の大小を区別する" -#: gitk:2315 gitk:4854 gitk:6723 +#: gitk:2315 gitk:4855 gitk:6724 msgid "IgnCase" msgstr "英字の大小を区別しない" -#: gitk:2315 gitk:4736 gitk:4852 gitk:6719 +#: gitk:2315 gitk:4737 gitk:4853 gitk:6720 msgid "Regexp" msgstr "正規表現" -#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916 +#: gitk:2317 gitk:2318 gitk:4875 gitk:4905 gitk:4912 gitk:6849 gitk:6917 msgid "All fields" msgstr "全ての項目" -#: gitk:2318 gitk:4871 gitk:4904 gitk:6786 +#: gitk:2318 gitk:4872 gitk:4905 gitk:6787 msgid "Headline" msgstr "ヘッドライン" -#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389 +#: gitk:2319 gitk:4872 gitk:6787 gitk:6917 gitk:7390 msgid "Comments" msgstr "コメント" -#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830 -#: gitk:8845 +#: gitk:2319 gitk:4872 gitk:4877 gitk:4912 gitk:6787 gitk:7325 gitk:8831 +#: gitk:8846 msgid "Author" msgstr "作者" -#: gitk:2319 gitk:4871 gitk:6786 gitk:7326 +#: gitk:2319 gitk:4872 gitk:6787 gitk:7327 msgid "Committer" msgstr "コミット者" @@ -247,9 +248,9 @@ msgstr "文脈行数" msgid "Ignore space change" msgstr "空白の違いを無視" -#: gitk:2378 gitk:2380 gitk:7959 gitk:8206 +#: gitk:2378 gitk:2380 gitk:7960 gitk:8207 msgid "Line diff" -msgstr "" +msgstr "行毎のdiff" #: gitk:2445 msgid "Patch" @@ -259,111 +260,115 @@ msgstr "パッチ" msgid "Tree" msgstr "ツリー" -#: gitk:2617 gitk:2637 +#: gitk:2617 gitk:2638 msgid "Diff this -> selected" msgstr "これと選択したコミットのdiffを見る" -#: gitk:2618 gitk:2638 +#: gitk:2618 gitk:2639 msgid "Diff selected -> this" msgstr "選択したコミットとこれのdiffを見る" -#: gitk:2619 gitk:2639 +#: gitk:2619 gitk:2640 msgid "Make patch" msgstr "パッチ作成" -#: gitk:2620 gitk:9254 +#: gitk:2620 gitk:9255 msgid "Create tag" msgstr "タグ生成" -#: gitk:2621 gitk:9371 +#: gitk:2621 +msgid "Copy commit summary" +msgstr "コミットの要約をコピーする" + +#: gitk:2622 gitk:9386 msgid "Write commit to file" msgstr "コミットをファイルに書き出す" -#: gitk:2622 gitk:9428 +#: gitk:2623 gitk:9443 msgid "Create new branch" msgstr "新規ブランチ生成" -#: gitk:2623 +#: gitk:2624 msgid "Cherry-pick this commit" msgstr "このコミットをチェリーピックする" -#: gitk:2624 +#: gitk:2625 msgid "Reset HEAD branch to here" msgstr "ブランチのHEADをここにリセットする" -#: gitk:2625 +#: gitk:2626 msgid "Mark this commit" msgstr "このコミットにマークをつける" -#: gitk:2626 +#: gitk:2627 msgid "Return to mark" msgstr "マークを付けた所に戻る" -#: gitk:2627 +#: gitk:2628 msgid "Find descendant of this and mark" msgstr "これとマークをつけた所との子孫を見つける" -#: gitk:2628 +#: gitk:2629 msgid "Compare with marked commit" msgstr "マークを付けたコミットと比較する" -#: gitk:2629 gitk:2640 -#, fuzzy +#: gitk:2630 gitk:2641 msgid "Diff this -> marked commit" msgstr "これと選択したコミットのdiffを見る" -#: gitk:2630 gitk:2641 -#, fuzzy +#: gitk:2631 gitk:2642 msgid "Diff marked commit -> this" msgstr "選択したコミットとこれのdiffを見る" -#: gitk:2631 -#, fuzzy +#: gitk:2632 msgid "Revert this commit" -msgstr "このコミットにマークをつける" +msgstr "このコミットを撤回する" -#: gitk:2647 +#: gitk:2648 msgid "Check out this branch" msgstr "このブランチをチェックアウトする" -#: gitk:2648 +#: gitk:2649 msgid "Remove this branch" msgstr "このブランチを除去する" -#: gitk:2649 +#: gitk:2650 msgid "Copy branch name" -msgstr "" +msgstr "ブランチ名をコピーする" -#: gitk:2656 +#: gitk:2657 msgid "Highlight this too" msgstr "これもハイライトさせる" -#: gitk:2657 +#: gitk:2658 msgid "Highlight this only" msgstr "これだけをハイライトさせる" -#: gitk:2658 +#: gitk:2659 msgid "External diff" msgstr "外部diffツール" -#: gitk:2659 +#: gitk:2660 msgid "Blame parent commit" msgstr "親コミットから blame をかける" -#: gitk:2660 +#: gitk:2661 msgid "Copy path" -msgstr "" +msgstr "パス名をコピーする" -#: gitk:2667 +#: gitk:2668 msgid "Show origin of this line" msgstr "この行の出自を表示する" -#: gitk:2668 +#: gitk:2669 msgid "Run git gui blame on this line" msgstr "この行に git gui で blame をかける" -#: gitk:3014 -#, fuzzy +#: gitk:3013 +msgid "About gitk" +msgstr "gitk について" + +#: gitk:3015 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -375,324 +380,327 @@ msgstr "" "\n" "Gitk - gitコミットビューア\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "使用および再配布は GNU General Public License に従ってください" -#: gitk:3022 gitk:3089 gitk:9857 +#: gitk:3023 gitk:3090 gitk:9872 msgid "Close" msgstr "閉じる" -#: gitk:3043 +#: gitk:3044 msgid "Gitk key bindings" msgstr "Gitk キーバインディング" -#: gitk:3046 +#: gitk:3047 msgid "Gitk key bindings:" msgstr "Gitk キーバインディング:" -#: gitk:3048 +#: gitk:3049 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\t終了" -#: gitk:3049 -#, fuzzy, tcl-format -msgid "<%s-W>\t\tClose window" -msgstr "<%s-F>\t\t検索" - #: gitk:3050 +#, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-W>\t\tウィンドウを閉じる" + +#: gitk:3051 msgid "\t\tMove to first commit" msgstr "\t\t最初のコミットに移動" -#: gitk:3051 +#: gitk:3052 msgid "\t\tMove to last commit" msgstr "\t\t最後のコミットに移動" -#: gitk:3052 -#, fuzzy -msgid ", p, k\tMove up one commit" -msgstr ", p, i\t一つ上のコミットに移動" - #: gitk:3053 -#, fuzzy -msgid ", n, j\tMove down one commit" -msgstr ", n, k\t一つ下のコミットに移動" +msgid ", p, k\tMove up one commit" +msgstr ", p, k\t一つ上のコミットに移動" #: gitk:3054 -#, fuzzy -msgid ", z, h\tGo back in history list" -msgstr ", z, j\t履歴の前に戻る" +msgid ", n, j\tMove down one commit" +msgstr ", n, j\t一つ下のコミットに移動" #: gitk:3055 +msgid ", z, h\tGo back in history list" +msgstr ", z, h\t履歴の前に戻る" + +#: gitk:3056 msgid ", x, l\tGo forward in history list" msgstr ", x, l\t履歴の次へ進む" -#: gitk:3056 +#: gitk:3057 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" -msgstr "" +msgstr "<%s-n(数字)>\t履歴上で現在のコミットの親コミットの内のn(数字)番目のコミットへ移動" -#: gitk:3057 +#: gitk:3058 msgid "\tMove up one page in commit list" msgstr "\tコミットリストの一つ上のページに移動" -#: gitk:3058 +#: gitk:3059 msgid "\tMove down one page in commit list" msgstr "\tコミットリストの一つ下のページに移動" -#: gitk:3059 +#: gitk:3060 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tコミットリストの一番上にスクロールする" -#: gitk:3060 +#: gitk:3061 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tコミットリストの一番下にスクロールする" -#: gitk:3061 +#: gitk:3062 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tコミットリストの一つ下の行にスクロールする" -#: gitk:3062 +#: gitk:3063 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tコミットリストの一つ下の行にスクロールする" -#: gitk:3063 +#: gitk:3064 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tコミットリストの上のページにスクロールする" -#: gitk:3064 +#: gitk:3065 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tコミットリストの下のページにスクロールする" -#: gitk:3065 +#: gitk:3066 msgid "\tFind backwards (upwards, later commits)" msgstr "\t後方を検索 (上方の・新しいコミット)" -#: gitk:3066 +#: gitk:3067 msgid "\tFind forwards (downwards, earlier commits)" msgstr "\t前方を検索(下方の・古いコミット)" -#: gitk:3067 +#: gitk:3068 msgid ", b\tScroll diff view up one page" msgstr ", b\tdiff画面を上のページにスクロールする" -#: gitk:3068 +#: gitk:3069 msgid "\tScroll diff view up one page" msgstr "\tdiff画面を上のページにスクロールする" -#: gitk:3069 +#: gitk:3070 msgid "\t\tScroll diff view down one page" msgstr "\t\tdiff画面を下のページにスクロールする" -#: gitk:3070 +#: gitk:3071 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tdiff画面を上に18行スクロールする" -#: gitk:3071 +#: gitk:3072 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tdiff画面を下に18行スクロールする" -#: gitk:3072 +#: gitk:3073 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\t検索" -#: gitk:3073 +#: gitk:3074 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\t次を検索して移動" -#: gitk:3074 +#: gitk:3075 msgid "\tMove to next find hit" msgstr "\t次を検索して移動" -#: gitk:3075 -#, fuzzy -msgid "g\t\tGo to commit" -msgstr "\t\t最後のコミットに移動" - #: gitk:3076 +msgid "g\t\tGo to commit" +msgstr "g\t\t指定してコミットに移動" + +#: gitk:3077 msgid "/\t\tFocus the search box" msgstr "/\t\t検索ボックスにフォーカス" -#: gitk:3077 +#: gitk:3078 msgid "?\t\tMove to previous find hit" msgstr "?\t\t前を検索して移動" -#: gitk:3078 +#: gitk:3079 msgid "f\t\tScroll diff view to next file" msgstr "f\t\t次のファイルにdiff画面をスクロールする" -#: gitk:3079 +#: gitk:3080 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tdiff画面の次を検索" -#: gitk:3080 +#: gitk:3081 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tdiff画面の前を検索" -#: gitk:3081 +#: gitk:3082 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\t文字サイズを拡大" -#: gitk:3082 +#: gitk:3083 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\t文字サイズを拡大" -#: gitk:3083 +#: gitk:3084 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\t文字サイズを縮小" -#: gitk:3084 +#: gitk:3085 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\t文字サイズを縮小" -#: gitk:3085 +#: gitk:3086 msgid "\t\tUpdate" msgstr "\t\t更新" -#: gitk:3550 gitk:3559 +#: gitk:3551 gitk:3560 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "一時ディレクトリ %s 生成時エラー:" -#: gitk:3572 +#: gitk:3573 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "\"%s\" のエラーが %s に発生:" -#: gitk:3635 +#: gitk:3636 msgid "command failed:" msgstr "コマンド失敗:" -#: gitk:3784 +#: gitk:3785 msgid "No such commit" msgstr "そのようなコミットはありません" -#: gitk:3798 +#: gitk:3799 msgid "git gui blame: command failed:" msgstr "git gui blame: コマンド失敗:" -#: gitk:3829 +#: gitk:3830 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "マージする HEAD を読み込めません: %s" -#: gitk:3837 +#: gitk:3838 #, tcl-format msgid "Error reading index: %s" msgstr "インデックス読み込みエラー: %s" -#: gitk:3862 +#: gitk:3863 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "git blame を始められません: %s" -#: gitk:3865 gitk:6754 +#: gitk:3866 gitk:6755 msgid "Searching" msgstr "検索中" -#: gitk:3897 +#: gitk:3898 #, tcl-format msgid "Error running git blame: %s" msgstr "git blame 実行エラー: %s" -#: gitk:3925 +#: gitk:3926 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "コミット %s に由来するその行は、このビューに表示されていません" -#: gitk:3939 +#: gitk:3940 msgid "External diff viewer failed:" msgstr "外部diffビューアが失敗:" -#: gitk:4070 +#: gitk:4044 +msgid "All files" +msgstr "全てのファイル" + +#: gitk:4068 +msgid "View" +msgstr "ビュー" + +#: gitk:4071 msgid "Gitk view definition" msgstr "Gitk ビュー定義" -#: gitk:4074 +#: gitk:4075 msgid "Remember this view" msgstr "このビューを記憶する" -#: gitk:4075 +#: gitk:4076 msgid "References (space separated list):" msgstr "リファレンス(スペース区切りのリスト):" -#: gitk:4076 +#: gitk:4077 msgid "Branches & tags:" msgstr "ブランチ&タグ:" -#: gitk:4077 +#: gitk:4078 msgid "All refs" msgstr "全てのリファレンス" -#: gitk:4078 +#: gitk:4079 msgid "All (local) branches" msgstr "全ての(ローカルな)ブランチ" -#: gitk:4079 +#: gitk:4080 msgid "All tags" msgstr "全てのタグ" -#: gitk:4080 +#: gitk:4081 msgid "All remote-tracking branches" msgstr "全てのリモート追跡ブランチ" -#: gitk:4081 +#: gitk:4082 msgid "Commit Info (regular expressions):" msgstr "コミット情報(正規表現):" -#: gitk:4082 +#: gitk:4083 msgid "Author:" msgstr "作者:" -#: gitk:4083 +#: gitk:4084 msgid "Committer:" msgstr "コミット者:" -#: gitk:4084 +#: gitk:4085 msgid "Commit Message:" msgstr "コミットメッセージ:" -#: gitk:4085 +#: gitk:4086 msgid "Matches all Commit Info criteria" msgstr "コミット情報の全ての条件に一致" -#: gitk:4086 -#, fuzzy -msgid "Matches no Commit Info criteria" -msgstr "コミット情報の全ての条件に一致" - #: gitk:4087 +msgid "Matches no Commit Info criteria" +msgstr "コミット情報の全ての条件に不一致" + +#: gitk:4088 msgid "Changes to Files:" msgstr "変更したファイル:" -#: gitk:4088 +#: gitk:4089 msgid "Fixed String" msgstr "固定文字列" -#: gitk:4089 +#: gitk:4090 msgid "Regular Expression" msgstr "正規表現" -#: gitk:4090 +#: gitk:4091 msgid "Search string:" msgstr "検索文字列:" -#: gitk:4091 +#: gitk:4092 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -700,202 +708,201 @@ msgstr "" "コミット日時 (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:4092 +#: gitk:4093 msgid "Since:" msgstr "期間の始め:" -#: gitk:4093 +#: gitk:4094 msgid "Until:" msgstr "期間の終わり:" -#: gitk:4094 +#: gitk:4095 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "制限・省略するリビジョンの数(正の整数):" -#: gitk:4095 +#: gitk:4096 msgid "Number to show:" msgstr "表示する数:" -#: gitk:4096 +#: gitk:4097 msgid "Number to skip:" msgstr "省略する数:" -#: gitk:4097 +#: gitk:4098 msgid "Miscellaneous options:" msgstr "その他のオプション:" -#: gitk:4098 +#: gitk:4099 msgid "Strictly sort by date" msgstr "厳密に日付順で並び替え" -#: gitk:4099 +#: gitk:4100 msgid "Mark branch sides" msgstr "側枝マーク" -#: gitk:4100 +#: gitk:4101 msgid "Limit to first parent" msgstr "最初の親に制限" -#: gitk:4101 +#: gitk:4102 msgid "Simple history" msgstr "簡易な履歴" -#: gitk:4102 +#: gitk:4103 msgid "Additional arguments to git log:" msgstr "git log への追加の引数:" -#: gitk:4103 +#: gitk:4104 msgid "Enter files and directories to include, one per line:" msgstr "含まれるファイル・ディレクトリを一行ごとに入力:" -#: gitk:4104 +#: gitk:4105 msgid "Command to generate more commits to include:" msgstr "コミット追加コマンド:" -#: gitk:4228 +#: gitk:4229 msgid "Gitk: edit view" msgstr "Gitk: ビュー編集" -#: gitk:4236 +#: gitk:4237 msgid "-- criteria for selecting revisions" msgstr "― リビジョンの選択条件" -#: gitk:4241 -#, fuzzy +#: gitk:4242 msgid "View Name" msgstr "ビュー名:" -#: gitk:4316 +#: gitk:4317 msgid "Apply (F5)" msgstr "適用 (F5)" -#: gitk:4354 +#: gitk:4355 msgid "Error in commit selection arguments:" msgstr "コミット選択引数のエラー:" -#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374 +#: gitk:4410 gitk:4463 gitk:4925 gitk:4939 gitk:6209 gitk:12388 gitk:12389 msgid "None" msgstr "無し" -#: gitk:5021 gitk:5026 +#: gitk:5022 gitk:5027 msgid "Descendant" msgstr "子孫" -#: gitk:5022 +#: gitk:5023 msgid "Not descendant" msgstr "非子孫" -#: gitk:5029 gitk:5034 +#: gitk:5030 gitk:5035 msgid "Ancestor" msgstr "祖先" -#: gitk:5030 +#: gitk:5031 msgid "Not ancestor" msgstr "非祖先" -#: gitk:5324 +#: gitk:5325 msgid "Local changes checked in to index but not committed" msgstr "ステージされた、コミット前のローカルな変更" -#: gitk:5360 +#: gitk:5361 msgid "Local uncommitted changes, not checked in to index" msgstr "ステージされていない、コミット前のローカルな変更" -#: gitk:7134 +#: gitk:7135 msgid "and many more" -msgstr "" +msgstr "他多数" -#: gitk:7137 +#: gitk:7138 msgid "many" msgstr "多数" -#: gitk:7328 +#: gitk:7329 msgid "Tags:" msgstr "タグ:" -#: gitk:7345 gitk:7351 gitk:8825 +#: gitk:7346 gitk:7352 gitk:8826 msgid "Parent" msgstr "親" -#: gitk:7356 +#: gitk:7357 msgid "Child" msgstr "子" -#: gitk:7365 +#: gitk:7366 msgid "Branch" msgstr "ブランチ" -#: gitk:7368 +#: gitk:7369 msgid "Follows" msgstr "下位" -#: gitk:7371 +#: gitk:7372 msgid "Precedes" msgstr "上位" -#: gitk:7966 +#: gitk:7967 #, tcl-format msgid "Error getting diffs: %s" msgstr "diff取得エラー: %s" -#: gitk:8650 +#: gitk:8651 msgid "Goto:" msgstr "Goto:" -#: gitk:8671 +#: gitk:8672 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "%s を含む SHA1 ID は複数存在します" -#: gitk:8678 +#: gitk:8679 #, tcl-format msgid "Revision %s is not known" msgstr "リビジョン %s は不明です" -#: gitk:8688 +#: gitk:8689 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA1 id %s は不明です" -#: gitk:8690 +#: gitk:8691 #, tcl-format msgid "Revision %s is not in the current view" msgstr "リビジョン %s は現在のビューにはありません" -#: gitk:8832 gitk:8847 +#: gitk:8833 gitk:8848 msgid "Date" msgstr "日付" -#: gitk:8835 +#: gitk:8836 msgid "Children" msgstr "子" -#: gitk:8898 +#: gitk:8899 #, tcl-format msgid "Reset %s branch to here" msgstr "%s ブランチをここにリセットする" -#: gitk:8900 +#: gitk:8901 msgid "Detached head: can't reset" msgstr "切り離されたHEAD: リセットできません" -#: gitk:9005 gitk:9011 +#: gitk:9006 gitk:9012 msgid "Skipping merge commit " msgstr "コミットマージをスキップ: " -#: gitk:9020 gitk:9025 +#: gitk:9021 gitk:9026 msgid "Error getting patch ID for " msgstr "パッチ取得エラー: ID " -#: gitk:9021 gitk:9026 +#: gitk:9022 gitk:9027 msgid " - stopping\n" msgstr " - 停止\n" -#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065 +#: gitk:9032 gitk:9035 gitk:9043 gitk:9057 gitk:9066 msgid "Commit " msgstr "コミット " -#: gitk:9035 +#: gitk:9036 msgid "" " is the same patch as\n" " " @@ -903,7 +910,7 @@ msgstr "" " は下記のパッチと同等\n" " " -#: gitk:9043 +#: gitk:9044 msgid "" " differs from\n" " " @@ -911,7 +918,7 @@ msgstr "" " 下記からのdiff\n" " " -#: gitk:9045 +#: gitk:9046 msgid "" "Diff of commits:\n" "\n" @@ -919,131 +926,130 @@ msgstr "" "コミットのdiff:\n" "\n" -#: gitk:9057 gitk:9066 +#: gitk:9058 gitk:9067 #, tcl-format msgid " has %s children - stopping\n" msgstr " には %s の子があります - 停止\n" -#: gitk:9085 +#: gitk:9086 #, tcl-format msgid "Error writing commit to file: %s" msgstr "ファイルへのコミット書き出しエラー: %s" -#: gitk:9091 +#: gitk:9092 #, tcl-format msgid "Error diffing commits: %s" msgstr "コミットのdiff実行エラー: %s" -#: gitk:9137 +#: gitk:9138 msgid "Top" msgstr "Top" -#: gitk:9138 +#: gitk:9139 msgid "From" msgstr "From" -#: gitk:9143 +#: gitk:9144 msgid "To" msgstr "To" -#: gitk:9167 +#: gitk:9168 msgid "Generate patch" msgstr "パッチ生成" -#: gitk:9169 +#: gitk:9170 msgid "From:" msgstr "From:" -#: gitk:9178 +#: gitk:9179 msgid "To:" msgstr "To:" -#: gitk:9187 +#: gitk:9188 msgid "Reverse" msgstr "逆" -#: gitk:9189 gitk:9385 +#: gitk:9190 gitk:9400 msgid "Output file:" msgstr "出力ファイル:" -#: gitk:9195 +#: gitk:9196 msgid "Generate" msgstr "生成" -#: gitk:9233 +#: gitk:9234 msgid "Error creating patch:" msgstr "パッチ生成エラー:" -#: gitk:9256 gitk:9373 gitk:9430 +#: gitk:9257 gitk:9388 gitk:9445 msgid "ID:" msgstr "ID:" -#: gitk:9265 +#: gitk:9266 msgid "Tag name:" msgstr "タグ名:" -#: gitk:9268 +#: gitk:9269 msgid "Tag message is optional" -msgstr "" +msgstr "タグメッセージを付ける事も出来ます" -#: gitk:9270 -#, fuzzy +#: gitk:9271 msgid "Tag message:" -msgstr "タグ名:" +msgstr "タグメッセージ:" -#: gitk:9274 gitk:9439 +#: gitk:9275 gitk:9454 msgid "Create" msgstr "生成" -#: gitk:9292 +#: gitk:9293 msgid "No tag name specified" msgstr "タグの名称が指定されていません" -#: gitk:9296 +#: gitk:9297 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "タグ \"%s\" は既に存在します" -#: gitk:9306 +#: gitk:9307 msgid "Error creating tag:" msgstr "タグ生成エラー:" -#: gitk:9382 +#: gitk:9397 msgid "Command:" msgstr "コマンド:" -#: gitk:9390 +#: gitk:9405 msgid "Write" msgstr "書き出し" -#: gitk:9408 +#: gitk:9423 msgid "Error writing commit:" msgstr "コミット書き出しエラー:" -#: gitk:9435 +#: gitk:9450 msgid "Name:" msgstr "名前:" -#: gitk:9458 +#: gitk:9473 msgid "Please specify a name for the new branch" msgstr "新しいブランチの名前を指定してください" -#: gitk:9463 +#: gitk:9478 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "ブランチ '%s' は既に存在します。上書きしますか?" -#: gitk:9530 +#: gitk:9545 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "コミット %s は既にブランチ %s に含まれています ― 本当にこれを再適用しますか?" -#: gitk:9535 +#: gitk:9550 msgid "Cherry-picking" msgstr "チェリーピック中" -#: gitk:9544 +#: gitk:9559 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1053,7 +1059,7 @@ msgstr "" "あなたの変更に commit, reset, stash のいずれかを行ってからやり直してくださ" "い。" -#: gitk:9550 +#: gitk:9565 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1061,62 +1067,56 @@ msgstr "" "マージの衝突によってチェリーピックは失敗しました。\n" "この解決のために git citool を実行したいですか?" -#: gitk:9566 gitk:9624 +#: gitk:9581 gitk:9639 msgid "No changes committed" msgstr "何の変更もコミットされていません" -#: gitk:9593 -#, fuzzy, tcl-format +#: gitk:9608 +#, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" -msgstr "" -"コミット %s は既にブランチ %s に含まれています ― 本当にこれを再適用しますか?" +msgstr "コミット %s は既にブランチ %s に含まれています ― 本当にこれを撤回しますか?" -#: gitk:9598 -#, fuzzy +#: gitk:9613 msgid "Reverting" -msgstr "リセット中" +msgstr "撤回中" -#: gitk:9606 -#, fuzzy, tcl-format +#: gitk:9621 +#, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " "commit, reset or stash your changes and try again." -msgstr "" -"ファイル '%s' のローカルな変更のためにチェリーピックは失敗しました。\n" -"あなたの変更に commit, reset, stash のいずれかを行ってからやり直してくださ" -"い。" +msgstr "ファイル '%s' のローカルな変更のために撤回は失敗しました。 あなたの変更に commit, reset, stash のいずれかを行ってからやり直してください。" -#: gitk:9610 -#, fuzzy +#: gitk:9625 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" msgstr "" -"マージの衝突によってチェリーピックは失敗しました。\n" +"マージの衝突によって撤回は失敗しました。\n" "この解決のために git citool を実行したいですか?" -#: gitk:9653 +#: gitk:9668 msgid "Confirm reset" msgstr "確認を取り消す" -#: gitk:9655 +#: gitk:9670 #, tcl-format msgid "Reset branch %s to %s?" msgstr "ブランチ %s を %s にリセットしますか?" -#: gitk:9657 +#: gitk:9672 msgid "Reset type:" msgstr "Reset タイプ:" -#: gitk:9660 +#: gitk:9675 msgid "Soft: Leave working tree and index untouched" msgstr "Soft: 作業ツリーもインデックスもそのままにする" -#: gitk:9663 +#: gitk:9678 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Mixed: 作業ツリーをそのままにして、インデックスをリセット" -#: gitk:9666 +#: gitk:9681 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1124,19 +1124,19 @@ msgstr "" "Hard: 作業ツリーやインデックスをリセット\n" "(「全ての」ローカルな変更を破棄)" -#: gitk:9683 +#: gitk:9698 msgid "Resetting" msgstr "リセット中" -#: gitk:9743 +#: gitk:9758 msgid "Checking out" msgstr "チェックアウト" -#: gitk:9796 +#: gitk:9811 msgid "Cannot delete the currently checked-out branch" msgstr "現在チェックアウトされているブランチを削除することはできません" -#: gitk:9802 +#: gitk:9817 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1145,16 +1145,16 @@ msgstr "" "ブランチ %s には他のブランチに存在しないコミットがあります。\n" "本当にブランチ %s を削除しますか?" -#: gitk:9833 +#: gitk:9848 #, tcl-format msgid "Tags and heads: %s" msgstr "タグとHEAD: %s" -#: gitk:9850 +#: gitk:9865 msgid "Filter" msgstr "フィルター" -#: gitk:10146 +#: gitk:10161 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1162,237 +1162,217 @@ msgstr "" "コミット構造情報読み込みエラー; ブランチ及び上位/下位のタグ情報が不完全である" "ようです。" -#: gitk:11123 +#: gitk:11138 msgid "Tag" msgstr "タグ" -#: gitk:11127 +#: gitk:11142 msgid "Id" msgstr "ID" -#: gitk:11210 +#: gitk:11225 msgid "Gitk font chooser" msgstr "Gitk フォント選択" -#: gitk:11227 +#: gitk:11242 msgid "B" msgstr "B" -#: gitk:11230 +#: gitk:11245 msgid "I" msgstr "I" -#: gitk:11348 +#: gitk:11363 msgid "Commit list display options" msgstr "コミットリスト表示オプション" -#: gitk:11351 +#: gitk:11366 msgid "Maximum graph width (lines)" msgstr "最大グラフ幅(線の本数)" -#: gitk:11355 +#: gitk:11370 #, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "最大グラフ幅(ペインに対する%)" -#: gitk:11358 +#: gitk:11373 msgid "Show local changes" msgstr "ローカルな変更を表示" -#: gitk:11361 -#, fuzzy +#: gitk:11376 msgid "Auto-select SHA1 (length)" -msgstr "SHA1 の自動選択" +msgstr "SHA1 の自動選択 (選択文字数指定)" -#: gitk:11365 +#: gitk:11380 msgid "Hide remote refs" msgstr "リモートリファレンスを隠す" -#: gitk:11369 +#: gitk:11384 msgid "Diff display options" msgstr "diff表示オプション" -#: gitk:11371 +#: gitk:11386 msgid "Tab spacing" msgstr "タブ空白幅" -#: gitk:11374 -#, fuzzy +#: gitk:11389 msgid "Display nearby tags/heads" -msgstr "近くのタグを表示する" +msgstr "近くの タグ/head を表示する" -#: gitk:11377 +#: gitk:11392 msgid "Maximum # tags/heads to show" -msgstr "" +msgstr "タグ/head の最大表示数" -#: gitk:11380 +#: gitk:11395 msgid "Limit diffs to listed paths" msgstr "diff をリストのパスに制限" -#: gitk:11383 +#: gitk:11398 msgid "Support per-file encodings" msgstr "ファイルごとのエンコーディングのサポート" -#: gitk:11389 gitk:11536 +#: gitk:11404 gitk:11551 msgid "External diff tool" msgstr "外部diffツール" -#: gitk:11390 +#: gitk:11405 msgid "Choose..." msgstr "選択..." -#: gitk:11395 -#, fuzzy +#: gitk:11410 msgid "General options" -msgstr "パッチ生成" - -#: gitk:11398 -msgid "Use themed widgets" -msgstr "" - -#: gitk:11400 -msgid "(change requires restart)" -msgstr "" - -#: gitk:11402 -msgid "(currently unavailable)" -msgstr "" +msgstr "全体設定" #: gitk:11413 +msgid "Use themed widgets" +msgstr "テーマウィジェットを使用する" + +#: gitk:11415 +msgid "(change requires restart)" +msgstr "(変更には再起動が必要です)" + +#: gitk:11417 +msgid "(currently unavailable)" +msgstr "(現在は使用出来ません)" + +#: gitk:11428 msgid "Colors: press to choose" msgstr "色: ボタンを押して選択" -#: gitk:11416 +#: gitk:11431 msgid "Interface" msgstr "インターフェイス" -#: gitk:11417 +#: gitk:11432 msgid "interface" msgstr "インターフェイス" -#: gitk:11420 +#: gitk:11435 msgid "Background" msgstr "背景" -#: gitk:11421 gitk:11451 +#: gitk:11436 gitk:11466 msgid "background" msgstr "背景" -#: gitk:11424 +#: gitk:11439 msgid "Foreground" msgstr "前景" -#: gitk:11425 +#: gitk:11440 msgid "foreground" msgstr "前景" -#: gitk:11428 +#: gitk:11443 msgid "Diff: old lines" msgstr "Diff: 旧バージョン" -#: gitk:11429 +#: gitk:11444 msgid "diff old lines" msgstr "diff 旧バージョン" -#: gitk:11433 +#: gitk:11448 msgid "Diff: new lines" msgstr "Diff: 新バージョン" -#: gitk:11434 +#: gitk:11449 msgid "diff new lines" msgstr "diff 新バージョン" -#: gitk:11438 +#: gitk:11453 msgid "Diff: hunk header" msgstr "Diff: hunkヘッダ" -#: gitk:11440 +#: gitk:11455 msgid "diff hunk header" msgstr "diff hunkヘッダ" -#: gitk:11444 +#: gitk:11459 msgid "Marked line bg" msgstr "マーク行の背景" -#: gitk:11446 +#: gitk:11461 msgid "marked line background" msgstr "マーク行の背景" -#: gitk:11450 +#: gitk:11465 msgid "Select bg" msgstr "選択の背景" -#: gitk:11459 +#: gitk:11474 msgid "Fonts: press to choose" msgstr "フォント: ボタンを押して選択" -#: gitk:11461 +#: gitk:11476 msgid "Main font" msgstr "主フォント" -#: gitk:11462 +#: gitk:11477 msgid "Diff display font" msgstr "Diff表示用フォント" -#: gitk:11463 +#: gitk:11478 msgid "User interface font" msgstr "UI用フォント" -#: gitk:11485 +#: gitk:11500 msgid "Gitk preferences" msgstr "Gitk 設定" -#: gitk:11494 -#, fuzzy +#: gitk:11509 msgid "General" -msgstr "生成" +msgstr "一般" -#: gitk:11495 +#: gitk:11510 msgid "Colors" -msgstr "" +msgstr "色" -#: gitk:11496 +#: gitk:11511 msgid "Fonts" -msgstr "" +msgstr "フォント" -#: gitk:11546 +#: gitk:11561 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: 「%s」 の色を選択" -#: gitk:12059 +#: gitk:12074 msgid "" "Sorry, gitk cannot run with this version of Tcl/Tk.\n" " Gitk requires at least Tcl/Tk 8.4." msgstr "" +"申し訳ありませんが、このバージョンの Tcl/Tk では gitk を実行出来ません。\n" +"Gitkの実行には Tcl/Tk 8.4 以上が必要です。" -#: gitk:12269 +#: gitk:12284 msgid "Cannot find a git repository here." msgstr "ここにはgitリポジトリがありません。" -#: gitk:12316 +#: gitk:12331 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "あいまいな引数 '%s': リビジョンとファイル名の両方に解釈できます" -#: gitk:12328 +#: gitk:12343 msgid "Bad arguments to gitk:" msgstr "gitkへの不正な引数:" - -#~ msgid "mc" -#~ msgstr "mc" - -#~ msgid "SHA1 ID: " -#~ msgstr "SHA1 ID: " - -#~ msgid "next" -#~ msgstr "次" - -#~ msgid "prev" -#~ msgstr "前" - -#~ msgid "CDate" -#~ msgstr "作成日" - -#~ msgid "Cannot find the git directory \"%s\"." -#~ msgstr "gitディレクトリ \"%s\" を見つけられません。" diff --git a/gitk-git/po/sv.po b/gitk-git/po/sv.po index 75317f4396..d9d4e87a44 100644 --- a/gitk-git/po/sv.po +++ b/gitk-git/po/sv.po @@ -1,5 +1,5 @@ # Swedish translation for gitk -# Copyright (C) 2005-2013 Paul Mackerras +# Copyright (C) 2005-2015 Paul Mackerras # This file is distributed under the same license as the gitk package. # # Mikael Magnusson , 2008. @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: sv\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-05-17 14:32+1000\n" -"PO-Revision-Date: 2015-03-27 10:31+0100\n" +"POT-Creation-Date: 2015-12-09 09:40+0100\n" +"PO-Revision-Date: 2015-12-11 09:46+0100\n" "Last-Translator: Peter Krefting \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -28,7 +28,7 @@ msgstr "Kunde inte hämta lista över ej sammanslagna filer:" msgid "Color words" msgstr "Färga ord" -#: gitk:217 gitk:2381 gitk:8220 gitk:8253 +#: gitk:217 gitk:2381 gitk:8221 gitk:8254 msgid "Markup words" msgstr "Märk upp ord" @@ -62,15 +62,15 @@ msgstr "Fel vid körning av git log:" msgid "Reading" msgstr "Läser" -#: gitk:496 gitk:4525 +#: gitk:496 gitk:4526 msgid "Reading commits..." msgstr "Läser incheckningar..." -#: gitk:499 gitk:1637 gitk:4528 +#: gitk:499 gitk:1637 gitk:4529 msgid "No commits selected" msgstr "Inga incheckningar markerade" -#: gitk:1445 gitk:4045 gitk:12432 +#: gitk:1445 gitk:4046 gitk:12447 msgid "Command line" msgstr "Kommandorad" @@ -82,84 +82,84 @@ msgstr "Kan inte tolka utdata från git log:" msgid "No commit information available" msgstr "Ingen incheckningsinformation är tillgänglig" -#: gitk:1903 gitk:1932 gitk:4315 gitk:9669 gitk:11241 gitk:11521 +#: gitk:1903 gitk:1932 gitk:4316 gitk:9684 gitk:11256 gitk:11536 msgid "OK" msgstr "OK" -#: gitk:1934 gitk:4317 gitk:9196 gitk:9275 gitk:9391 gitk:9440 gitk:9671 -#: gitk:11242 gitk:11522 +#: gitk:1934 gitk:4318 gitk:9197 gitk:9276 gitk:9406 gitk:9455 gitk:9686 +#: gitk:11257 gitk:11537 msgid "Cancel" msgstr "Avbryt" #: gitk:2069 msgid "&Update" -msgstr "Uppdatera" +msgstr "&Uppdatera" #: gitk:2070 msgid "&Reload" -msgstr "Ladda om" +msgstr "Läs &om" #: gitk:2071 msgid "Reread re&ferences" -msgstr "Läs om referenser" +msgstr "Läs om &referenser" #: gitk:2072 msgid "&List references" -msgstr "Visa referenser" +msgstr "&Visa referenser" #: gitk:2074 msgid "Start git &gui" -msgstr "Starta git gui" +msgstr "Starta git &gui" #: gitk:2076 msgid "&Quit" -msgstr "Avsluta" +msgstr "&Avsluta" #: gitk:2068 msgid "&File" -msgstr "Arkiv" +msgstr "&Arkiv" #: gitk:2080 msgid "&Preferences" -msgstr "Inställningar" +msgstr "&Inställningar" #: gitk:2079 msgid "&Edit" -msgstr "Redigera" +msgstr "&Redigera" #: gitk:2084 msgid "&New view..." -msgstr "Ny vy..." +msgstr "&Ny vy..." #: gitk:2085 msgid "&Edit view..." -msgstr "Ändra vy..." +msgstr "&Ändra vy..." #: gitk:2086 msgid "&Delete view" -msgstr "Ta bort vy" +msgstr "&Ta bort vy" -#: gitk:2088 gitk:4043 +#: gitk:2088 msgid "&All files" -msgstr "Alla filer" +msgstr "&Alla filer" -#: gitk:2083 gitk:4067 +#: gitk:2083 msgid "&View" -msgstr "Visa" +msgstr "&Visa" -#: gitk:2093 gitk:2103 gitk:3012 +#: gitk:2093 gitk:2103 msgid "&About gitk" -msgstr "Om gitk" +msgstr "&Om gitk" #: gitk:2094 gitk:2108 msgid "&Key bindings" -msgstr "Tangentbordsbindningar" +msgstr "&Tangentbordsbindningar" #: gitk:2092 gitk:2107 msgid "&Help" -msgstr "Hjälp" +msgstr "&Hjälp" -#: gitk:2185 gitk:8652 +#: gitk:2185 gitk:8653 msgid "SHA1 ID:" msgstr "SHA1-id:" @@ -175,53 +175,53 @@ msgstr "Sök" msgid "commit" msgstr "incheckning" -#: gitk:2299 gitk:2301 gitk:4687 gitk:4710 gitk:4734 gitk:6755 gitk:6827 -#: gitk:6912 +#: gitk:2299 gitk:2301 gitk:4688 gitk:4711 gitk:4735 gitk:6756 gitk:6828 +#: gitk:6913 msgid "containing:" msgstr "som innehåller:" -#: gitk:2302 gitk:3526 gitk:3531 gitk:4763 +#: gitk:2302 gitk:3527 gitk:3532 gitk:4764 msgid "touching paths:" msgstr "som rör sökväg:" -#: gitk:2303 gitk:4777 +#: gitk:2303 gitk:4778 msgid "adding/removing string:" msgstr "som lägger/till tar bort sträng:" -#: gitk:2304 gitk:4779 +#: gitk:2304 gitk:4780 msgid "changing lines matching:" msgstr "ändrar rader som matchar:" -#: gitk:2313 gitk:2315 gitk:4766 +#: gitk:2313 gitk:2315 gitk:4767 msgid "Exact" msgstr "Exakt" -#: gitk:2315 gitk:4854 gitk:6723 +#: gitk:2315 gitk:4855 gitk:6724 msgid "IgnCase" msgstr "IgnVersaler" -#: gitk:2315 gitk:4736 gitk:4852 gitk:6719 +#: gitk:2315 gitk:4737 gitk:4853 gitk:6720 msgid "Regexp" msgstr "Reg.uttr." -#: gitk:2317 gitk:2318 gitk:4874 gitk:4904 gitk:4911 gitk:6848 gitk:6916 +#: gitk:2317 gitk:2318 gitk:4875 gitk:4905 gitk:4912 gitk:6849 gitk:6917 msgid "All fields" msgstr "Alla fält" -#: gitk:2318 gitk:4871 gitk:4904 gitk:6786 +#: gitk:2318 gitk:4872 gitk:4905 gitk:6787 msgid "Headline" msgstr "Rubrik" -#: gitk:2319 gitk:4871 gitk:6786 gitk:6916 gitk:7389 +#: gitk:2319 gitk:4872 gitk:6787 gitk:6917 gitk:7390 msgid "Comments" msgstr "Kommentarer" -#: gitk:2319 gitk:4871 gitk:4876 gitk:4911 gitk:6786 gitk:7324 gitk:8830 -#: gitk:8845 +#: gitk:2319 gitk:4872 gitk:4877 gitk:4912 gitk:6787 gitk:7325 gitk:8831 +#: gitk:8846 msgid "Author" msgstr "Författare" -#: gitk:2319 gitk:4871 gitk:6786 gitk:7326 +#: gitk:2319 gitk:4872 gitk:6787 gitk:7327 msgid "Committer" msgstr "Incheckare" @@ -249,7 +249,7 @@ msgstr "Rader sammanhang" msgid "Ignore space change" msgstr "Ignorera ändringar i blanksteg" -#: gitk:2378 gitk:2380 gitk:7959 gitk:8206 +#: gitk:2378 gitk:2380 gitk:7960 gitk:8207 msgid "Line diff" msgstr "Rad-diff" @@ -261,107 +261,115 @@ msgstr "Patch" msgid "Tree" msgstr "Träd" -#: gitk:2617 gitk:2637 +#: gitk:2617 gitk:2638 msgid "Diff this -> selected" msgstr "Diff denna -> markerad" -#: gitk:2618 gitk:2638 +#: gitk:2618 gitk:2639 msgid "Diff selected -> this" msgstr "Diff markerad -> denna" -#: gitk:2619 gitk:2639 +#: gitk:2619 gitk:2640 msgid "Make patch" msgstr "Skapa patch" -#: gitk:2620 gitk:9254 +#: gitk:2620 gitk:9255 msgid "Create tag" msgstr "Skapa tagg" -#: gitk:2621 gitk:9371 +#: gitk:2621 +msgid "Copy commit summary" +msgstr "Kopiera incheckningssammanfattning" + +#: gitk:2622 gitk:9386 msgid "Write commit to file" msgstr "Skriv incheckning till fil" -#: gitk:2622 gitk:9428 +#: gitk:2623 gitk:9443 msgid "Create new branch" msgstr "Skapa ny gren" -#: gitk:2623 +#: gitk:2624 msgid "Cherry-pick this commit" msgstr "Plocka denna incheckning" -#: gitk:2624 +#: gitk:2625 msgid "Reset HEAD branch to here" msgstr "Återställ HEAD-grenen hit" -#: gitk:2625 +#: gitk:2626 msgid "Mark this commit" msgstr "Markera denna incheckning" -#: gitk:2626 +#: gitk:2627 msgid "Return to mark" msgstr "Återgå till markering" -#: gitk:2627 +#: gitk:2628 msgid "Find descendant of this and mark" msgstr "Hitta efterföljare till denna och markera" -#: gitk:2628 +#: gitk:2629 msgid "Compare with marked commit" msgstr "Jämför med markerad incheckning" -#: gitk:2629 gitk:2640 +#: gitk:2630 gitk:2641 msgid "Diff this -> marked commit" msgstr "Diff denna -> markerad incheckning" -#: gitk:2630 gitk:2641 +#: gitk:2631 gitk:2642 msgid "Diff marked commit -> this" msgstr "Diff markerad incheckning -> denna" -#: gitk:2631 +#: gitk:2632 msgid "Revert this commit" msgstr "Ångra denna incheckning" -#: gitk:2647 +#: gitk:2648 msgid "Check out this branch" msgstr "Checka ut denna gren" -#: gitk:2648 +#: gitk:2649 msgid "Remove this branch" msgstr "Ta bort denna gren" -#: gitk:2649 +#: gitk:2650 msgid "Copy branch name" -msgstr "" +msgstr "Kopiera namn på gren" -#: gitk:2656 +#: gitk:2657 msgid "Highlight this too" msgstr "Markera även detta" -#: gitk:2657 +#: gitk:2658 msgid "Highlight this only" msgstr "Markera bara detta" -#: gitk:2658 +#: gitk:2659 msgid "External diff" msgstr "Extern diff" -#: gitk:2659 +#: gitk:2660 msgid "Blame parent commit" msgstr "Klandra föräldraincheckning" -#: gitk:2660 +#: gitk:2661 msgid "Copy path" -msgstr "" +msgstr "Kopiera sökväg" -#: gitk:2667 +#: gitk:2668 msgid "Show origin of this line" msgstr "Visa ursprunget för den här raden" -#: gitk:2668 +#: gitk:2669 msgid "Run git gui blame on this line" msgstr "Kör git gui blame på den här raden" -#: gitk:3014 +#: gitk:3013 +msgid "About gitk" +msgstr "Om gitk" + +#: gitk:3015 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -377,317 +385,323 @@ msgstr "" "\n" "Använd och vidareförmedla enligt villkoren i GNU General Public License" -#: gitk:3022 gitk:3089 gitk:9857 +#: gitk:3023 gitk:3090 gitk:9872 msgid "Close" msgstr "Stäng" -#: gitk:3043 +#: gitk:3044 msgid "Gitk key bindings" msgstr "Tangentbordsbindningar för Gitk" -#: gitk:3046 +#: gitk:3047 msgid "Gitk key bindings:" msgstr "Tangentbordsbindningar för Gitk:" -#: gitk:3048 +#: gitk:3049 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tAvsluta" -#: gitk:3049 +#: gitk:3050 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tStäng fönster" -#: gitk:3050 +#: gitk:3051 msgid "\t\tMove to first commit" msgstr "\t\tGå till första incheckning" -#: gitk:3051 +#: gitk:3052 msgid "\t\tMove to last commit" msgstr "\t\tGå till sista incheckning" -#: gitk:3052 +#: gitk:3053 msgid ", p, k\tMove up one commit" msgstr ", p, k\tGå en incheckning upp" -#: gitk:3053 +#: gitk:3054 msgid ", n, j\tMove down one commit" msgstr ", n, j\tGå en incheckning ned" -#: gitk:3054 +#: gitk:3055 msgid ", z, h\tGo back in history list" msgstr ", z, h\tGå bakåt i historiken" -#: gitk:3055 +#: gitk:3056 msgid ", x, l\tGo forward in history list" msgstr ", x, l\tGå framåt i historiken" -#: gitk:3056 +#: gitk:3057 #, tcl-format msgid "<%s-n>\tGo to n-th parent of current commit in history list" msgstr "<%s-n>\tGå till aktuell inchecknings n:te förälder i historielistan" -#: gitk:3057 +#: gitk:3058 msgid "\tMove up one page in commit list" msgstr "\tGå upp en sida i incheckningslistan" -#: gitk:3058 +#: gitk:3059 msgid "\tMove down one page in commit list" msgstr "\tGå ned en sida i incheckningslistan" -#: gitk:3059 +#: gitk:3060 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tRulla till början av incheckningslistan" -#: gitk:3060 +#: gitk:3061 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tRulla till slutet av incheckningslistan" -#: gitk:3061 +#: gitk:3062 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Upp>\tRulla incheckningslistan upp ett steg" -#: gitk:3062 +#: gitk:3063 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Ned>\tRulla incheckningslistan ned ett steg" -#: gitk:3063 +#: gitk:3064 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tRulla incheckningslistan upp en sida" -#: gitk:3064 +#: gitk:3065 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tRulla incheckningslistan ned en sida" -#: gitk:3065 +#: gitk:3066 msgid "\tFind backwards (upwards, later commits)" msgstr "\tSök bakåt (uppåt, senare incheckningar)" -#: gitk:3066 +#: gitk:3067 msgid "\tFind forwards (downwards, earlier commits)" msgstr "\tSök framåt (nedåt, tidigare incheckningar)" -#: gitk:3067 +#: gitk:3068 msgid ", b\tScroll diff view up one page" msgstr ", b\tRulla diffvisningen upp en sida" -#: gitk:3068 +#: gitk:3069 msgid "\tScroll diff view up one page" msgstr "\tRulla diffvisningen upp en sida" -#: gitk:3069 +#: gitk:3070 msgid "\t\tScroll diff view down one page" msgstr "\tRulla diffvisningen ned en sida" -#: gitk:3070 +#: gitk:3071 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tRulla diffvisningen upp 18 rader" -#: gitk:3071 +#: gitk:3072 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tRulla diffvisningen ned 18 rader" -#: gitk:3072 +#: gitk:3073 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tSök" -#: gitk:3073 +#: gitk:3074 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tGå till nästa sökträff" -#: gitk:3074 +#: gitk:3075 msgid "\tMove to next find hit" msgstr "\t\tGå till nästa sökträff" -#: gitk:3075 -#, fuzzy -msgid "g\t\tGo to commit" -msgstr "\t\tGå till sista incheckning" - #: gitk:3076 +msgid "g\t\tGo to commit" +msgstr "g\t\tGå till incheckning" + +#: gitk:3077 msgid "/\t\tFocus the search box" msgstr "/\t\tFokusera sökrutan" -#: gitk:3077 +#: gitk:3078 msgid "?\t\tMove to previous find hit" msgstr "?\t\tGå till föregående sökträff" -#: gitk:3078 +#: gitk:3079 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tRulla diffvisningen till nästa fil" -#: gitk:3079 +#: gitk:3080 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tGå till nästa sökträff i diffvisningen" -#: gitk:3080 +#: gitk:3081 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tGå till föregående sökträff i diffvisningen" -#: gitk:3081 +#: gitk:3082 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-Num+>\tÖka teckenstorlek" -#: gitk:3082 +#: gitk:3083 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tÖka teckenstorlek" -#: gitk:3083 +#: gitk:3084 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-Num->\tMinska teckenstorlek" -#: gitk:3084 +#: gitk:3085 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tMinska teckenstorlek" -#: gitk:3085 +#: gitk:3086 msgid "\t\tUpdate" msgstr "\t\tUppdatera" -#: gitk:3550 gitk:3559 +#: gitk:3551 gitk:3560 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Fel vid skapande av temporär katalog %s:" -#: gitk:3572 +#: gitk:3573 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Fel vid hämtning av \"%s\" från %s:" -#: gitk:3635 +#: gitk:3636 msgid "command failed:" msgstr "kommando misslyckades:" -#: gitk:3784 +#: gitk:3785 msgid "No such commit" msgstr "Incheckning saknas" -#: gitk:3798 +#: gitk:3799 msgid "git gui blame: command failed:" msgstr "git gui blame: kommando misslyckades:" -#: gitk:3829 +#: gitk:3830 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Kunde inte läsa sammanslagningshuvud: %s" -#: gitk:3837 +#: gitk:3838 #, tcl-format msgid "Error reading index: %s" msgstr "Fel vid läsning av index: %s" -#: gitk:3862 +#: gitk:3863 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Kunde inte starta git blame: %s" -#: gitk:3865 gitk:6754 +#: gitk:3866 gitk:6755 msgid "Searching" msgstr "Söker" -#: gitk:3897 +#: gitk:3898 #, tcl-format msgid "Error running git blame: %s" msgstr "Fel vid körning av git blame: %s" -#: gitk:3925 +#: gitk:3926 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Raden kommer från incheckningen %s, som inte finns i denna vy" -#: gitk:3939 +#: gitk:3940 msgid "External diff viewer failed:" msgstr "Externt diff-verktyg misslyckades:" -#: gitk:4070 +#: gitk:4044 +msgid "All files" +msgstr "Alla filer" + +#: gitk:4068 +msgid "View" +msgstr "Visa" + +#: gitk:4071 msgid "Gitk view definition" msgstr "Definition av Gitk-vy" -#: gitk:4074 +#: gitk:4075 msgid "Remember this view" msgstr "Spara denna vy" -#: gitk:4075 +#: gitk:4076 msgid "References (space separated list):" msgstr "Referenser (blankstegsavdelad lista):" -#: gitk:4076 +#: gitk:4077 msgid "Branches & tags:" msgstr "Grenar & taggar:" -#: gitk:4077 +#: gitk:4078 msgid "All refs" msgstr "Alla referenser" -#: gitk:4078 +#: gitk:4079 msgid "All (local) branches" msgstr "Alla (lokala) grenar" -#: gitk:4079 +#: gitk:4080 msgid "All tags" msgstr "Alla taggar" -#: gitk:4080 +#: gitk:4081 msgid "All remote-tracking branches" msgstr "Alla fjärrspårande grenar" -#: gitk:4081 +#: gitk:4082 msgid "Commit Info (regular expressions):" msgstr "Incheckningsinfo (reguljära uttryck):" -#: gitk:4082 +#: gitk:4083 msgid "Author:" msgstr "Författare:" -#: gitk:4083 +#: gitk:4084 msgid "Committer:" msgstr "Incheckare:" -#: gitk:4084 +#: gitk:4085 msgid "Commit Message:" msgstr "Incheckningsmeddelande:" -#: gitk:4085 +#: gitk:4086 msgid "Matches all Commit Info criteria" msgstr "Motsvarar alla kriterier för incheckningsinfo" -#: gitk:4086 -#, fuzzy +#: gitk:4087 msgid "Matches no Commit Info criteria" msgstr "Motsvarar inga kriterier för incheckningsinfo" -#: gitk:4087 +#: gitk:4088 msgid "Changes to Files:" msgstr "Ändringar av filer:" -#: gitk:4088 +#: gitk:4089 msgid "Fixed String" msgstr "Fast sträng" -#: gitk:4089 +#: gitk:4090 msgid "Regular Expression" msgstr "Reguljärt uttryck" -#: gitk:4090 +#: gitk:4091 msgid "Search string:" msgstr "Söksträng:" -#: gitk:4091 +#: gitk:4092 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -695,201 +709,201 @@ msgstr "" "Incheckingsdatum (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:4092 +#: gitk:4093 msgid "Since:" msgstr "Från:" -#: gitk:4093 +#: gitk:4094 msgid "Until:" msgstr "Till:" -#: gitk:4094 +#: gitk:4095 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Begränsa och/eller hoppa över ett antal revisioner (positivt heltal):" -#: gitk:4095 +#: gitk:4096 msgid "Number to show:" msgstr "Antal att visa:" -#: gitk:4096 +#: gitk:4097 msgid "Number to skip:" msgstr "Antal att hoppa över:" -#: gitk:4097 +#: gitk:4098 msgid "Miscellaneous options:" msgstr "Diverse alternativ:" -#: gitk:4098 +#: gitk:4099 msgid "Strictly sort by date" msgstr "Strikt datumsortering" -#: gitk:4099 +#: gitk:4100 msgid "Mark branch sides" msgstr "Markera sidogrenar" -#: gitk:4100 +#: gitk:4101 msgid "Limit to first parent" msgstr "Begränsa till första förälder" -#: gitk:4101 +#: gitk:4102 msgid "Simple history" msgstr "Enkel historik" -#: gitk:4102 +#: gitk:4103 msgid "Additional arguments to git log:" msgstr "Ytterligare argument till git log:" -#: gitk:4103 +#: gitk:4104 msgid "Enter files and directories to include, one per line:" msgstr "Ange filer och kataloger att ta med, en per rad:" -#: gitk:4104 +#: gitk:4105 msgid "Command to generate more commits to include:" msgstr "Kommando för att generera fler incheckningar att ta med:" -#: gitk:4228 +#: gitk:4229 msgid "Gitk: edit view" msgstr "Gitk: redigera vy" -#: gitk:4236 +#: gitk:4237 msgid "-- criteria for selecting revisions" msgstr " - kriterier för val av revisioner" -#: gitk:4241 +#: gitk:4242 msgid "View Name" msgstr "Namn på vy" -#: gitk:4316 +#: gitk:4317 msgid "Apply (F5)" msgstr "Använd (F5)" -#: gitk:4354 +#: gitk:4355 msgid "Error in commit selection arguments:" msgstr "Fel i argument för val av incheckningar:" -#: gitk:4409 gitk:4462 gitk:4924 gitk:4938 gitk:6208 gitk:12373 gitk:12374 +#: gitk:4410 gitk:4463 gitk:4925 gitk:4939 gitk:6209 gitk:12388 gitk:12389 msgid "None" msgstr "Inget" -#: gitk:5021 gitk:5026 +#: gitk:5022 gitk:5027 msgid "Descendant" msgstr "Avkomling" -#: gitk:5022 +#: gitk:5023 msgid "Not descendant" msgstr "Inte avkomling" -#: gitk:5029 gitk:5034 +#: gitk:5030 gitk:5035 msgid "Ancestor" msgstr "Förfader" -#: gitk:5030 +#: gitk:5031 msgid "Not ancestor" msgstr "Inte förfader" -#: gitk:5324 +#: gitk:5325 msgid "Local changes checked in to index but not committed" msgstr "Lokala ändringar sparade i indexet men inte incheckade" -#: gitk:5360 +#: gitk:5361 msgid "Local uncommitted changes, not checked in to index" msgstr "Lokala ändringar, ej sparade i indexet" -#: gitk:7134 +#: gitk:7135 msgid "and many more" msgstr "med många flera" -#: gitk:7137 +#: gitk:7138 msgid "many" msgstr "många" -#: gitk:7328 +#: gitk:7329 msgid "Tags:" msgstr "Taggar:" -#: gitk:7345 gitk:7351 gitk:8825 +#: gitk:7346 gitk:7352 gitk:8826 msgid "Parent" msgstr "Förälder" -#: gitk:7356 +#: gitk:7357 msgid "Child" msgstr "Barn" -#: gitk:7365 +#: gitk:7366 msgid "Branch" msgstr "Gren" -#: gitk:7368 +#: gitk:7369 msgid "Follows" msgstr "Följer" -#: gitk:7371 +#: gitk:7372 msgid "Precedes" msgstr "Föregår" -#: gitk:7966 +#: gitk:7967 #, tcl-format msgid "Error getting diffs: %s" msgstr "Fel vid hämtning av diff: %s" -#: gitk:8650 +#: gitk:8651 msgid "Goto:" msgstr "Gå till:" -#: gitk:8671 +#: gitk:8672 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Förkortat SHA1-id %s är tvetydigt" -#: gitk:8678 +#: gitk:8679 #, tcl-format msgid "Revision %s is not known" msgstr "Revisionen %s är inte känd" -#: gitk:8688 +#: gitk:8689 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA-id:t %s är inte känt" -#: gitk:8690 +#: gitk:8691 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Revisionen %s finns inte i den nuvarande vyn" -#: gitk:8832 gitk:8847 +#: gitk:8833 gitk:8848 msgid "Date" msgstr "Datum" -#: gitk:8835 +#: gitk:8836 msgid "Children" msgstr "Barn" -#: gitk:8898 +#: gitk:8899 #, tcl-format msgid "Reset %s branch to here" msgstr "Återställ grenen %s hit" -#: gitk:8900 +#: gitk:8901 msgid "Detached head: can't reset" msgstr "Frånkopplad head: kan inte återställa" -#: gitk:9005 gitk:9011 +#: gitk:9006 gitk:9012 msgid "Skipping merge commit " msgstr "Hoppar över sammanslagningsincheckning " -#: gitk:9020 gitk:9025 +#: gitk:9021 gitk:9026 msgid "Error getting patch ID for " msgstr "Fel vid hämtning av patch-id för " -#: gitk:9021 gitk:9026 +#: gitk:9022 gitk:9027 msgid " - stopping\n" msgstr " - stannar\n" -#: gitk:9031 gitk:9034 gitk:9042 gitk:9056 gitk:9065 +#: gitk:9032 gitk:9035 gitk:9043 gitk:9057 gitk:9066 msgid "Commit " msgstr "Incheckning " -#: gitk:9035 +#: gitk:9036 msgid "" " is the same patch as\n" " " @@ -897,7 +911,7 @@ msgstr "" " är samma patch som\n" " " -#: gitk:9043 +#: gitk:9044 msgid "" " differs from\n" " " @@ -905,7 +919,7 @@ msgstr "" " skiljer sig från\n" " " -#: gitk:9045 +#: gitk:9046 msgid "" "Diff of commits:\n" "\n" @@ -913,131 +927,131 @@ msgstr "" "Skillnad mellan incheckningar:\n" "\n" -#: gitk:9057 gitk:9066 +#: gitk:9058 gitk:9067 #, tcl-format msgid " has %s children - stopping\n" msgstr " har %s barn - stannar\n" -#: gitk:9085 +#: gitk:9086 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Fel vid skrivning av incheckning till fil: %s" -#: gitk:9091 +#: gitk:9092 #, tcl-format msgid "Error diffing commits: %s" msgstr "Fel vid jämförelse av incheckningar: %s" -#: gitk:9137 +#: gitk:9138 msgid "Top" msgstr "Topp" -#: gitk:9138 +#: gitk:9139 msgid "From" msgstr "Från" -#: gitk:9143 +#: gitk:9144 msgid "To" msgstr "Till" -#: gitk:9167 +#: gitk:9168 msgid "Generate patch" msgstr "Generera patch" -#: gitk:9169 +#: gitk:9170 msgid "From:" msgstr "Från:" -#: gitk:9178 +#: gitk:9179 msgid "To:" msgstr "Till:" -#: gitk:9187 +#: gitk:9188 msgid "Reverse" msgstr "Vänd" -#: gitk:9189 gitk:9385 +#: gitk:9190 gitk:9400 msgid "Output file:" msgstr "Utdatafil:" -#: gitk:9195 +#: gitk:9196 msgid "Generate" msgstr "Generera" -#: gitk:9233 +#: gitk:9234 msgid "Error creating patch:" msgstr "Fel vid generering av patch:" -#: gitk:9256 gitk:9373 gitk:9430 +#: gitk:9257 gitk:9388 gitk:9445 msgid "ID:" msgstr "Id:" -#: gitk:9265 +#: gitk:9266 msgid "Tag name:" msgstr "Taggnamn:" -#: gitk:9268 +#: gitk:9269 msgid "Tag message is optional" msgstr "Taggmeddelandet är valfritt" -#: gitk:9270 +#: gitk:9271 msgid "Tag message:" msgstr "Taggmeddelande:" -#: gitk:9274 gitk:9439 +#: gitk:9275 gitk:9454 msgid "Create" msgstr "Skapa" -#: gitk:9292 +#: gitk:9293 msgid "No tag name specified" msgstr "Inget taggnamn angavs" -#: gitk:9296 +#: gitk:9297 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Taggen \"%s\" finns redan" -#: gitk:9306 +#: gitk:9307 msgid "Error creating tag:" msgstr "Fel vid skapande av tagg:" -#: gitk:9382 +#: gitk:9397 msgid "Command:" msgstr "Kommando:" -#: gitk:9390 +#: gitk:9405 msgid "Write" msgstr "Skriv" -#: gitk:9408 +#: gitk:9423 msgid "Error writing commit:" msgstr "Fel vid skrivning av incheckning:" -#: gitk:9435 +#: gitk:9450 msgid "Name:" msgstr "Namn:" -#: gitk:9458 +#: gitk:9473 msgid "Please specify a name for the new branch" msgstr "Ange ett namn för den nya grenen" -#: gitk:9463 +#: gitk:9478 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Grenen \"%s\" finns redan. Skriva över?" -#: gitk:9530 +#: gitk:9545 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "Incheckningen %s finns redan på grenen %s -- skall den verkligen appliceras " "på nytt?" -#: gitk:9535 +#: gitk:9550 msgid "Cherry-picking" msgstr "Plockar" -#: gitk:9544 +#: gitk:9559 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1047,7 +1061,7 @@ msgstr "" "Checka in, återställ eller spara undan (stash) dina ändringar och försök " "igen." -#: gitk:9550 +#: gitk:9565 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1055,20 +1069,20 @@ msgstr "" "Cherry-pick misslyckades på grund av en sammanslagningskonflikt.\n" "Vill du köra git citool för att lösa den?" -#: gitk:9566 gitk:9624 +#: gitk:9581 gitk:9639 msgid "No changes committed" msgstr "Inga ändringar incheckade" -#: gitk:9593 +#: gitk:9608 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "Incheckningen %s finns inte på grenen %s -- vill du verkligen ångra?" -#: gitk:9598 +#: gitk:9613 msgid "Reverting" msgstr "Ångrar" -#: gitk:9606 +#: gitk:9621 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1078,7 +1092,7 @@ msgstr "" "Checka in, återställ eller spara undan (stash) dina ändringar och försök " "igen." -#: gitk:9610 +#: gitk:9625 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1086,28 +1100,28 @@ msgstr "" "Misslyckades med att ångra på grund av en sammanslagningskonflikt.\n" " Vill du köra git citool för att lösa den?" -#: gitk:9653 +#: gitk:9668 msgid "Confirm reset" msgstr "Bekräfta återställning" -#: gitk:9655 +#: gitk:9670 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Återställa grenen %s till %s?" -#: gitk:9657 +#: gitk:9672 msgid "Reset type:" msgstr "Typ av återställning:" -#: gitk:9660 +#: gitk:9675 msgid "Soft: Leave working tree and index untouched" msgstr "Mjuk: Rör inte utcheckning och index" -#: gitk:9663 +#: gitk:9678 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Blandad: Rör inte utcheckning, återställ index" -#: gitk:9666 +#: gitk:9681 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1115,19 +1129,19 @@ msgstr "" "Hård: Återställ utcheckning och index\n" "(förkastar ALLA lokala ändringar)" -#: gitk:9683 +#: gitk:9698 msgid "Resetting" msgstr "Återställer" -#: gitk:9743 +#: gitk:9758 msgid "Checking out" msgstr "Checkar ut" -#: gitk:9796 +#: gitk:9811 msgid "Cannot delete the currently checked-out branch" msgstr "Kan inte ta bort den just nu utcheckade grenen" -#: gitk:9802 +#: gitk:9817 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1136,16 +1150,16 @@ msgstr "" "Incheckningarna på grenen %s existerar inte på någon annan gren.\n" "Vill du verkligen ta bort grenen %s?" -#: gitk:9833 +#: gitk:9848 #, tcl-format msgid "Tags and heads: %s" msgstr "Taggar och huvuden: %s" -#: gitk:9850 +#: gitk:9865 msgid "Filter" msgstr "Filter" -#: gitk:10146 +#: gitk:10161 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1153,201 +1167,201 @@ msgstr "" "Fel vid läsning av information om incheckningstopologi; information om " "grenar och föregående/senare taggar kommer inte vara komplett." -#: gitk:11123 +#: gitk:11138 msgid "Tag" msgstr "Tagg" -#: gitk:11127 +#: gitk:11142 msgid "Id" msgstr "Id" -#: gitk:11210 +#: gitk:11225 msgid "Gitk font chooser" msgstr "Teckensnittsväljare för Gitk" -#: gitk:11227 +#: gitk:11242 msgid "B" msgstr "F" -#: gitk:11230 +#: gitk:11245 msgid "I" msgstr "K" -#: gitk:11348 +#: gitk:11363 msgid "Commit list display options" msgstr "Alternativ för incheckningslistvy" -#: gitk:11351 +#: gitk:11366 msgid "Maximum graph width (lines)" msgstr "Maximal grafbredd (rader)" -#: gitk:11355 +#: gitk:11370 #, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Maximal grafbredd (% av ruta)" -#: gitk:11358 +#: gitk:11373 msgid "Show local changes" msgstr "Visa lokala ändringar" -#: gitk:11361 +#: gitk:11376 msgid "Auto-select SHA1 (length)" msgstr "Välj SHA1 (längd) automatiskt" -#: gitk:11365 +#: gitk:11380 msgid "Hide remote refs" msgstr "Dölj fjärr-referenser" -#: gitk:11369 +#: gitk:11384 msgid "Diff display options" msgstr "Alternativ för diffvy" -#: gitk:11371 +#: gitk:11386 msgid "Tab spacing" msgstr "Blanksteg för tabulatortecken" -#: gitk:11374 +#: gitk:11389 msgid "Display nearby tags/heads" msgstr "Visa närliggande taggar/huvuden" -#: gitk:11377 +#: gitk:11392 msgid "Maximum # tags/heads to show" msgstr "Maximalt antal taggar/huvuden att visa" -#: gitk:11380 +#: gitk:11395 msgid "Limit diffs to listed paths" msgstr "Begränsa diff till listade sökvägar" -#: gitk:11383 +#: gitk:11398 msgid "Support per-file encodings" msgstr "Stöd för filspecifika teckenkodningar" -#: gitk:11389 gitk:11536 +#: gitk:11404 gitk:11551 msgid "External diff tool" msgstr "Externt diff-verktyg" -#: gitk:11390 +#: gitk:11405 msgid "Choose..." msgstr "Välj..." -#: gitk:11395 +#: gitk:11410 msgid "General options" msgstr "Allmänna inställningar" -#: gitk:11398 +#: gitk:11413 msgid "Use themed widgets" msgstr "Använd tema på fönsterelement" -#: gitk:11400 +#: gitk:11415 msgid "(change requires restart)" msgstr "(ändringen kräver omstart)" -#: gitk:11402 +#: gitk:11417 msgid "(currently unavailable)" msgstr "(för närvarande inte tillgängligt)" -#: gitk:11413 +#: gitk:11428 msgid "Colors: press to choose" msgstr "Färger: tryck för att välja" -#: gitk:11416 +#: gitk:11431 msgid "Interface" msgstr "Gränssnitt" -#: gitk:11417 +#: gitk:11432 msgid "interface" msgstr "gränssnitt" -#: gitk:11420 +#: gitk:11435 msgid "Background" msgstr "Bakgrund" -#: gitk:11421 gitk:11451 +#: gitk:11436 gitk:11466 msgid "background" msgstr "bakgrund" -#: gitk:11424 +#: gitk:11439 msgid "Foreground" msgstr "Förgrund" -#: gitk:11425 +#: gitk:11440 msgid "foreground" msgstr "förgrund" -#: gitk:11428 +#: gitk:11443 msgid "Diff: old lines" msgstr "Diff: gamla rader" -#: gitk:11429 +#: gitk:11444 msgid "diff old lines" msgstr "diff gamla rader" -#: gitk:11433 +#: gitk:11448 msgid "Diff: new lines" msgstr "Diff: nya rader" -#: gitk:11434 +#: gitk:11449 msgid "diff new lines" msgstr "diff nya rader" -#: gitk:11438 +#: gitk:11453 msgid "Diff: hunk header" msgstr "Diff: delhuvud" -#: gitk:11440 +#: gitk:11455 msgid "diff hunk header" msgstr "diff delhuvud" -#: gitk:11444 +#: gitk:11459 msgid "Marked line bg" msgstr "Markerad rad bakgrund" -#: gitk:11446 +#: gitk:11461 msgid "marked line background" msgstr "markerad rad bakgrund" -#: gitk:11450 +#: gitk:11465 msgid "Select bg" msgstr "Markerad bakgrund" -#: gitk:11459 +#: gitk:11474 msgid "Fonts: press to choose" msgstr "Teckensnitt: tryck för att välja" -#: gitk:11461 +#: gitk:11476 msgid "Main font" msgstr "Huvudteckensnitt" -#: gitk:11462 +#: gitk:11477 msgid "Diff display font" msgstr "Teckensnitt för diffvisning" -#: gitk:11463 +#: gitk:11478 msgid "User interface font" msgstr "Teckensnitt för användargränssnitt" -#: gitk:11485 +#: gitk:11500 msgid "Gitk preferences" msgstr "Inställningar för Gitk" -#: gitk:11494 +#: gitk:11509 msgid "General" msgstr "Allmänt" -#: gitk:11495 +#: gitk:11510 msgid "Colors" msgstr "Färger" -#: gitk:11496 +#: gitk:11511 msgid "Fonts" msgstr "Teckensnitt" -#: gitk:11546 +#: gitk:11561 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: välj färg för %s" -#: gitk:12059 +#: gitk:12074 msgid "" "Sorry, gitk cannot run with this version of Tcl/Tk.\n" " Gitk requires at least Tcl/Tk 8.4." @@ -1355,16 +1369,16 @@ msgstr "" "Gitk kan tyvärr inte köra med denna version av Tcl/Tk.\n" " Gitk kräver åtminstone Tcl/Tk 8.4." -#: gitk:12269 +#: gitk:12284 msgid "Cannot find a git repository here." msgstr "Hittar inget git-arkiv här." -#: gitk:12316 +#: gitk:12331 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Tvetydigt argument \"%s\": både revision och filnamn" -#: gitk:12328 +#: gitk:12343 msgid "Bad arguments to gitk:" msgstr "Felaktiga argument till gitk:" diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 7a5b23acf2..05d7910b7c 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -7576,7 +7576,7 @@ sub git_object { git_cmd(), 'cat-file', '-t', $object_id) . ' 2> /dev/null' or die_error(404, "Object does not exist"); $type = <$fd>; - chomp $type; + defined $type && chomp $type; close $fd or die_error(404, "Object does not exist"); diff --git a/graph.c b/graph.c index c25a09a8fd..1350bdde3b 100644 --- a/graph.c +++ b/graph.c @@ -234,12 +234,10 @@ struct git_graph *graph_init(struct rev_info *opt) * We'll automatically grow columns later if we need more room. */ graph->column_capacity = 30; - graph->columns = xmalloc(sizeof(struct column) * - graph->column_capacity); - graph->new_columns = xmalloc(sizeof(struct column) * - graph->column_capacity); - graph->mapping = xmalloc(sizeof(int) * 2 * graph->column_capacity); - graph->new_mapping = xmalloc(sizeof(int) * 2 * graph->column_capacity); + ALLOC_ARRAY(graph->columns, graph->column_capacity); + ALLOC_ARRAY(graph->new_columns, graph->column_capacity); + ALLOC_ARRAY(graph->mapping, 2 * graph->column_capacity); + ALLOC_ARRAY(graph->new_mapping, 2 * graph->column_capacity); /* * The diff output prefix callback, with this we can make diff --git a/grep.c b/grep.c index 7b2b96a437..528b652f71 100644 --- a/grep.c +++ b/grep.c @@ -1741,7 +1741,7 @@ static int grep_source_load_file(struct grep_source *gs) i = open(filename, O_RDONLY); if (i < 0) goto err_ret; - data = xmalloc(size + 1); + data = xmallocz(size); if (st.st_size != read_in_full(i, data, size)) { error(_("'%s': short read %s"), filename, strerror(errno)); close(i); @@ -1749,7 +1749,6 @@ static int grep_source_load_file(struct grep_source *gs) return -1; } close(i); - data[size] = 0; gs->buf = data; gs->size = size; diff --git a/hashmap.c b/hashmap.c index f693839cb4..b10b642229 100644 --- a/hashmap.c +++ b/hashmap.c @@ -256,10 +256,9 @@ const void *memintern(const void *data, size_t len) e = hashmap_get(&map, &key, data); if (!e) { /* not found: create it */ - e = xmallocz(sizeof(struct pool_entry) + len); + FLEX_ALLOC_MEM(e, data, data, len); hashmap_entry_init(e, key.ent.hash); e->len = len; - memcpy(e->data, data, len); hashmap_add(&map, e); } return e->data; diff --git a/help.c b/help.c index d996b34066..19328ea992 100644 --- a/help.c +++ b/help.c @@ -11,11 +11,9 @@ void add_cmdname(struct cmdnames *cmds, const char *name, int len) { - struct cmdname *ent = xmalloc(sizeof(*ent) + len + 1); - + struct cmdname *ent; + FLEX_ALLOC_MEM(ent, name, name, len); ent->len = len; - memcpy(ent->name, name, len); - ent->name[len] = 0; ALLOC_GROW(cmds->names, cmds->cnt + 1, cmds->alloc); cmds->names[cmds->cnt++] = ent; diff --git a/http-push.c b/http-push.c index d857b131a8..bd60668707 100644 --- a/http-push.c +++ b/http-push.c @@ -1277,9 +1277,7 @@ static struct object_list **add_one_object(struct object *obj, struct object_lis } static struct object_list **process_blob(struct blob *blob, - struct object_list **p, - struct name_path *path, - const char *name) + struct object_list **p) { struct object *obj = &blob->object; @@ -1293,14 +1291,11 @@ static struct object_list **process_blob(struct blob *blob, } static struct object_list **process_tree(struct tree *tree, - struct object_list **p, - struct name_path *path, - const char *name) + struct object_list **p) { struct object *obj = &tree->object; struct tree_desc desc; struct name_entry entry; - struct name_path me; obj->flags |= LOCAL; @@ -1310,21 +1305,17 @@ static struct object_list **process_tree(struct tree *tree, die("bad tree object %s", oid_to_hex(&obj->oid)); obj->flags |= SEEN; - name = xstrdup(name); p = add_one_object(obj, p); - me.up = path; - me.elem = name; - me.elem_len = strlen(name); init_tree_desc(&desc, tree->buffer, tree->size); while (tree_entry(&desc, &entry)) switch (object_type(entry.mode)) { case OBJ_TREE: - p = process_tree(lookup_tree(entry.sha1), p, &me, name); + p = process_tree(lookup_tree(entry.sha1), p); break; case OBJ_BLOB: - p = process_blob(lookup_blob(entry.sha1), p, &me, name); + p = process_blob(lookup_blob(entry.sha1), p); break; default: /* Subproject commit - not in this repository */ @@ -1343,7 +1334,7 @@ static int get_delta(struct rev_info *revs, struct remote_lock *lock) int count = 0; while ((commit = get_revision(revs)) != NULL) { - p = process_tree(commit->tree, p, NULL, ""); + p = process_tree(commit->tree, p); commit->object.flags |= LOCAL; if (!(commit->object.flags & UNINTERESTING)) count += add_send_request(&commit->object, lock); @@ -1362,11 +1353,11 @@ static int get_delta(struct rev_info *revs, struct remote_lock *lock) continue; } if (obj->type == OBJ_TREE) { - p = process_tree((struct tree *)obj, p, NULL, name); + p = process_tree((struct tree *)obj, p); continue; } if (obj->type == OBJ_BLOB) { - p = process_blob((struct blob *)obj, p, NULL, name); + p = process_blob((struct blob *)obj, p); continue; } die("unknown pending object %s (%s)", oid_to_hex(&obj->oid), name); diff --git a/http.c b/http.c index 0da9e66398..69da4454d8 100644 --- a/http.c +++ b/http.c @@ -11,6 +11,11 @@ #include "gettext.h" #include "transport.h" +#if LIBCURL_VERSION_NUM >= 0x070a08 +long int git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER; +#else +long int git_curl_ipresolve; +#endif int active_requests; int http_is_verbose; size_t http_post_buffer = 16 * LARGE_PACKET_MAX; @@ -57,16 +62,41 @@ static const char *ssl_key; #if LIBCURL_VERSION_NUM >= 0x070908 static const char *ssl_capath; #endif +#if LIBCURL_VERSION_NUM >= 0x072c00 +static const char *ssl_pinnedkey; +#endif static const char *ssl_cainfo; static long curl_low_speed_limit = -1; static long curl_low_speed_time = -1; static int curl_ftp_no_epsv; static const char *curl_http_proxy; +static const char *curl_no_proxy; +static const char *http_proxy_authmethod; +static struct { + const char *name; + long curlauth_param; +} proxy_authmethods[] = { + { "basic", CURLAUTH_BASIC }, + { "digest", CURLAUTH_DIGEST }, + { "negotiate", CURLAUTH_GSSNEGOTIATE }, + { "ntlm", CURLAUTH_NTLM }, +#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY + { "anyauth", CURLAUTH_ANY }, +#endif + /* + * CURLAUTH_DIGEST_IE has no corresponding command-line option in + * curl(1) and is not included in CURLAUTH_ANY, so we leave it out + * here, too + */ +}; +static struct credential proxy_auth = CREDENTIAL_INIT; +static const char *curl_proxyuserpwd; static const char *curl_cookie_file; static int curl_save_cookies; struct credential http_auth = CREDENTIAL_INIT; static int http_proactive_auth; static const char *user_agent; +static int curl_empty_auth; #if LIBCURL_VERSION_NUM >= 0x071700 /* Use CURLOPT_KEYPASSWD as is */ @@ -159,6 +189,9 @@ static void finish_active_slot(struct active_request_slot *slot) #else slot->results->auth_avail = 0; #endif + + curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CONNECTCODE, + &slot->results->http_connectcode); } /* Run callback if appropriate */ @@ -256,6 +289,9 @@ static int http_options(const char *var, const char *value, void *cb) if (!strcmp("http.proxy", var)) return git_config_string(&curl_http_proxy, var, value); + if (!strcmp("http.proxyauthmethod", var)) + return git_config_string(&http_proxy_authmethod, var, value); + if (!strcmp("http.cookiefile", var)) return git_config_string(&curl_cookie_file, var, value); if (!strcmp("http.savecookies", var)) { @@ -273,14 +309,31 @@ static int http_options(const char *var, const char *value, void *cb) if (!strcmp("http.useragent", var)) return git_config_string(&user_agent, var, value); + if (!strcmp("http.emptyauth", var)) { + curl_empty_auth = git_config_bool(var, value); + return 0; + } + + if (!strcmp("http.pinnedpubkey", var)) { +#if LIBCURL_VERSION_NUM >= 0x072c00 + return git_config_pathname(&ssl_pinnedkey, var, value); +#else + warning(_("Public key pinning not supported with cURL < 7.44.0")); + return 0; +#endif + } + /* Fall back on the default ones */ return git_default_config(var, value, cb); } static void init_curl_http_auth(CURL *result) { - if (!http_auth.username) + if (!http_auth.username) { + if (curl_empty_auth) + curl_easy_setopt(result, CURLOPT_USERPWD, ":"); return; + } credential_fill(&http_auth); @@ -304,6 +357,64 @@ static void init_curl_http_auth(CURL *result) #endif } +/* *var must be free-able */ +static void var_override(const char **var, char *value) +{ + if (value) { + free((void *)*var); + *var = xstrdup(value); + } +} + +static void set_proxyauth_name_password(CURL *result) +{ +#if LIBCURL_VERSION_NUM >= 0x071301 + curl_easy_setopt(result, CURLOPT_PROXYUSERNAME, + proxy_auth.username); + curl_easy_setopt(result, CURLOPT_PROXYPASSWORD, + proxy_auth.password); +#else + struct strbuf s = STRBUF_INIT; + + strbuf_addstr_urlencode(&s, proxy_auth.username, 1); + strbuf_addch(&s, ':'); + strbuf_addstr_urlencode(&s, proxy_auth.password, 1); + curl_proxyuserpwd = strbuf_detach(&s, NULL); + curl_easy_setopt(result, CURLOPT_PROXYUSERPWD, curl_proxyuserpwd); +#endif +} + +static void init_curl_proxy_auth(CURL *result) +{ + if (proxy_auth.username) { + if (!proxy_auth.password) + credential_fill(&proxy_auth); + set_proxyauth_name_password(result); + } + + var_override(&http_proxy_authmethod, getenv("GIT_HTTP_PROXY_AUTHMETHOD")); + +#if LIBCURL_VERSION_NUM >= 0x070a07 /* CURLOPT_PROXYAUTH and CURLAUTH_ANY */ + if (http_proxy_authmethod) { + int i; + for (i = 0; i < ARRAY_SIZE(proxy_authmethods); i++) { + if (!strcmp(http_proxy_authmethod, proxy_authmethods[i].name)) { + curl_easy_setopt(result, CURLOPT_PROXYAUTH, + proxy_authmethods[i].curlauth_param); + break; + } + } + if (i == ARRAY_SIZE(proxy_authmethods)) { + warning("unsupported proxy authentication method %s: using anyauth", + http_proxy_authmethod); + curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); + } + } + else + curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); +#endif +} + static int has_cert_password(void) { if (ssl_cert == NULL || ssl_cert_password_required != 1) @@ -414,6 +525,10 @@ static CURL *get_curl_handle(void) #if LIBCURL_VERSION_NUM >= 0x070908 if (ssl_capath != NULL) curl_easy_setopt(result, CURLOPT_CAPATH, ssl_capath); +#endif +#if LIBCURL_VERSION_NUM >= 0x072c00 + if (ssl_pinnedkey != NULL) + curl_easy_setopt(result, CURLOPT_PINNEDPUBLICKEY, ssl_pinnedkey); #endif if (ssl_cainfo != NULL) curl_easy_setopt(result, CURLOPT_CAINFO, ssl_cainfo); @@ -462,6 +577,31 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_USE_SSL, CURLUSESSL_TRY); #endif + /* + * CURL also examines these variables as a fallback; but we need to query + * them here in order to decide whether to prompt for missing password (cf. + * init_curl_proxy_auth()). + * + * Unlike many other common environment variables, these are historically + * lowercase only. It appears that CURL did not know this and implemented + * only uppercase variants, which was later corrected to take both - with + * the exception of http_proxy, which is lowercase only also in CURL. As + * the lowercase versions are the historical quasi-standard, they take + * precedence here, as in CURL. + */ + if (!curl_http_proxy) { + if (!strcmp(http_auth.protocol, "https")) { + var_override(&curl_http_proxy, getenv("HTTPS_PROXY")); + var_override(&curl_http_proxy, getenv("https_proxy")); + } else { + var_override(&curl_http_proxy, getenv("http_proxy")); + } + if (!curl_http_proxy) { + var_override(&curl_http_proxy, getenv("ALL_PROXY")); + var_override(&curl_http_proxy, getenv("all_proxy")); + } + } + if (curl_http_proxy) { curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy); #if LIBCURL_VERSION_NUM >= 0x071800 @@ -475,10 +615,23 @@ static CURL *get_curl_handle(void) curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); #endif - } -#if LIBCURL_VERSION_NUM >= 0x070a07 - curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); + if (strstr(curl_http_proxy, "://")) + credential_from_url(&proxy_auth, curl_http_proxy); + else { + struct strbuf url = STRBUF_INIT; + strbuf_addf(&url, "http://%s", curl_http_proxy); + credential_from_url(&proxy_auth, url.buf); + strbuf_release(&url); + } + + curl_easy_setopt(result, CURLOPT_PROXY, proxy_auth.host); +#if LIBCURL_VERSION_NUM >= 0x071304 + var_override(&curl_no_proxy, getenv("NO_PROXY")); + var_override(&curl_no_proxy, getenv("no_proxy")); + curl_easy_setopt(result, CURLOPT_NOPROXY, curl_no_proxy); #endif + } + init_curl_proxy_auth(result); set_curl_keepalive(result); @@ -519,6 +672,9 @@ void http_init(struct remote *remote, const char *url, int proactive_auth) if (remote && remote->http_proxy) curl_http_proxy = xstrdup(remote->http_proxy); + if (remote) + var_override(&http_proxy_authmethod, remote->http_proxy_authmethod); + pragma_header = curl_slist_append(pragma_header, "Pragma: no-cache"); no_pragma_header = curl_slist_append(no_pragma_header, "Pragma:"); @@ -617,6 +773,18 @@ void http_cleanup(void) curl_http_proxy = NULL; } + if (proxy_auth.password) { + memset(proxy_auth.password, 0, strlen(proxy_auth.password)); + free(proxy_auth.password); + proxy_auth.password = NULL; + } + + free((void *)curl_proxyuserpwd); + curl_proxyuserpwd = NULL; + + free((void *)http_proxy_authmethod); + http_proxy_authmethod = NULL; + if (cert_auth.password != NULL) { memset(cert_auth.password, 0, strlen(cert_auth.password)); free(cert_auth.password); @@ -692,10 +860,14 @@ struct active_request_slot *get_active_slot(void) curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1); curl_easy_setopt(slot->curl, CURLOPT_RANGE, NULL); + +#if LIBCURL_VERSION_NUM >= 0x070a08 + curl_easy_setopt(slot->curl, CURLOPT_IPRESOLVE, git_curl_ipresolve); +#endif #ifdef LIBCURL_CAN_HANDLE_AUTH_ANY curl_easy_setopt(slot->curl, CURLOPT_HTTPAUTH, http_auth_methods); #endif - if (http_auth.password) + if (http_auth.password || curl_empty_auth) init_curl_http_auth(slot->curl); return slot; @@ -946,6 +1118,8 @@ static int handle_curl_result(struct slot_results *results) if (results->curl_result == CURLE_OK) { credential_approve(&http_auth); + if (proxy_auth.password) + credential_approve(&proxy_auth); return HTTP_OK; } else if (missing_target(results)) return HTTP_MISSING_TARGET; @@ -960,6 +1134,8 @@ static int handle_curl_result(struct slot_results *results) return HTTP_REAUTH; } } else { + if (results->http_connectcode == 407) + credential_reject(&proxy_auth); #if LIBCURL_VERSION_NUM >= 0x070c00 if (!curl_errorstr[0]) strlcpy(curl_errorstr, diff --git a/http.h b/http.h index 4f97b60b5c..4ef4bbda7d 100644 --- a/http.h +++ b/http.h @@ -54,6 +54,7 @@ struct slot_results { CURLcode curl_result; long http_code; long auth_avail; + long http_connectcode; }; struct active_request_slot { @@ -106,6 +107,7 @@ extern void http_init(struct remote *remote, const char *url, int proactive_auth); extern void http_cleanup(void); +extern long int git_curl_ipresolve; extern int active_requests; extern int http_is_verbose; extern size_t http_post_buffer; diff --git a/ident.c b/ident.c index 4e7f99d5dd..6e125821f0 100644 --- a/ident.c +++ b/ident.c @@ -10,12 +10,17 @@ static struct strbuf git_default_name = STRBUF_INIT; static struct strbuf git_default_email = STRBUF_INIT; static struct strbuf git_default_date = STRBUF_INIT; +static int default_email_is_bogus; +static int default_name_is_bogus; + +static int ident_use_config_only; #define IDENT_NAME_GIVEN 01 #define IDENT_MAIL_GIVEN 02 #define IDENT_ALL_GIVEN (IDENT_NAME_GIVEN|IDENT_MAIL_GIVEN) static int committer_ident_explicitly_given; static int author_ident_explicitly_given; +static int ident_config_given; #ifdef NO_GECOS_IN_PWENT #define get_gecos(ignored) "&" @@ -23,6 +28,25 @@ static int author_ident_explicitly_given; #define get_gecos(struct_passwd) ((struct_passwd)->pw_gecos) #endif +static struct passwd *xgetpwuid_self(int *is_bogus) +{ + struct passwd *pw; + + errno = 0; + pw = getpwuid(getuid()); + if (!pw) { + static struct passwd fallback; + fallback.pw_name = "unknown"; +#ifndef NO_GECOS_IN_PWENT + fallback.pw_gecos = "Unknown"; +#endif + pw = &fallback; + if (is_bogus) + *is_bogus = 1; + } + return pw; +} + static void copy_gecos(const struct passwd *w, struct strbuf *name) { char *src; @@ -55,7 +79,7 @@ static int add_mailname_host(struct strbuf *buf) strerror(errno)); return -1; } - if (strbuf_getline(&mailnamebuf, mailname, '\n') == EOF) { + if (strbuf_getline(&mailnamebuf, mailname) == EOF) { if (ferror(mailname)) warning("cannot read /etc/mailname: %s", strerror(errno)); @@ -86,7 +110,7 @@ static int canonical_name(const char *host, struct strbuf *out) freeaddrinfo(ai); } #else - struct hostent *he = gethostbyname(buf); + struct hostent *he = gethostbyname(host); if (he && strchr(he->h_name, '.')) { strbuf_addstr(out, he->h_name); status = 0; @@ -96,22 +120,26 @@ static int canonical_name(const char *host, struct strbuf *out) return status; } -static void add_domainname(struct strbuf *out) +static void add_domainname(struct strbuf *out, int *is_bogus) { char buf[1024]; if (gethostname(buf, sizeof(buf))) { warning("cannot get host name: %s", strerror(errno)); strbuf_addstr(out, "(none)"); + *is_bogus = 1; return; } if (strchr(buf, '.')) strbuf_addstr(out, buf); - else if (canonical_name(buf, out) < 0) + else if (canonical_name(buf, out) < 0) { strbuf_addf(out, "%s.(none)", buf); + *is_bogus = 1; + } } -static void copy_email(const struct passwd *pw, struct strbuf *email) +static void copy_email(const struct passwd *pw, struct strbuf *email, + int *is_bogus) { /* * Make up a fake email address @@ -122,13 +150,13 @@ static void copy_email(const struct passwd *pw, struct strbuf *email) if (!add_mailname_host(email)) return; /* read from "/etc/mailname" (Debian) */ - add_domainname(email); + add_domainname(email, is_bogus); } const char *ident_default_name(void) { if (!git_default_name.len) { - copy_gecos(xgetpwuid_self(), &git_default_name); + copy_gecos(xgetpwuid_self(&default_name_is_bogus), &git_default_name); strbuf_trim(&git_default_name); } return git_default_name.buf; @@ -144,7 +172,8 @@ const char *ident_default_email(void) committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; author_ident_explicitly_given |= IDENT_MAIL_GIVEN; } else - copy_email(xgetpwuid_self(), &git_default_email); + copy_email(xgetpwuid_self(&default_email_is_bogus), + &git_default_email, &default_email_is_bogus); strbuf_trim(&git_default_email); } return git_default_email.buf; @@ -319,27 +348,40 @@ const char *fmt_ident(const char *name, const char *email, int want_date = !(flag & IDENT_NO_DATE); int want_name = !(flag & IDENT_NO_NAME); - if (want_name && !name) - name = ident_default_name(); - if (!email) - email = ident_default_email(); - - if (want_name && !*name) { - struct passwd *pw; - - if (strict) { - if (name == git_default_name.buf) + if (want_name) { + int using_default = 0; + if (!name) { + name = ident_default_name(); + using_default = 1; + if (strict && default_name_is_bogus) { fputs(env_hint, stderr); - die("empty ident name (for <%s>) not allowed", email); + die("unable to auto-detect name (got '%s')", name); + } + if (strict && ident_use_config_only + && !(ident_config_given & IDENT_NAME_GIVEN)) + die("user.useConfigOnly set but no name given"); + } + if (!*name) { + struct passwd *pw; + if (strict) { + if (using_default) + fputs(env_hint, stderr); + die("empty ident name (for <%s>) not allowed", email); + } + pw = xgetpwuid_self(NULL); + name = pw->pw_name; } - pw = xgetpwuid_self(); - name = pw->pw_name; } - if (strict && email == git_default_email.buf && - strstr(email, "(none)")) { - fputs(env_hint, stderr); - die("unable to auto-detect email address (got '%s')", email); + if (!email) { + email = ident_default_email(); + if (strict && default_email_is_bogus) { + fputs(env_hint, stderr); + die("unable to auto-detect email address (got '%s')", email); + } + if (strict && ident_use_config_only + && !(ident_config_given & IDENT_MAIL_GIVEN)) + die("user.useConfigOnly set but no mail given"); } strbuf_reset(&ident); @@ -413,6 +455,11 @@ int author_ident_sufficiently_given(void) int git_ident_config(const char *var, const char *value, void *data) { + if (!strcmp(var, "user.useconfigonly")) { + ident_use_config_only = git_config_bool(var, value); + return 0; + } + if (!strcmp(var, "user.name")) { if (!value) return config_error_nonbool(var); @@ -420,6 +467,7 @@ int git_ident_config(const char *var, const char *value, void *data) strbuf_addstr(&git_default_name, value); committer_ident_explicitly_given |= IDENT_NAME_GIVEN; author_ident_explicitly_given |= IDENT_NAME_GIVEN; + ident_config_given |= IDENT_NAME_GIVEN; return 0; } @@ -430,6 +478,7 @@ int git_ident_config(const char *var, const char *value, void *data) strbuf_addstr(&git_default_email, value); committer_ident_explicitly_given |= IDENT_MAIL_GIVEN; author_ident_explicitly_given |= IDENT_MAIL_GIVEN; + ident_config_given |= IDENT_MAIL_GIVEN; return 0; } diff --git a/imap-send.c b/imap-send.c index 4d3b7737a9..2c52027c84 100644 --- a/imap-send.c +++ b/imap-send.c @@ -892,12 +892,11 @@ static char *cram(const char *challenge_64, const char *user, const char *pass) response = xstrfmt("%s %s", user, hex); resp_len = strlen(response) + 1; - response_64 = xmalloc(ENCODED_SIZE(resp_len) + 1); + response_64 = xmallocz(ENCODED_SIZE(resp_len)); encoded_len = EVP_EncodeBlock((unsigned char *)response_64, (unsigned char *)response, resp_len); if (encoded_len < 0) die("EVP_EncodeBlock error"); - response_64[encoded_len] = '\0'; return (char *)response_64; } @@ -1188,7 +1187,7 @@ static void lf_to_crlf(struct strbuf *msg) j++; } - new = xmalloc(j + 1); + new = xmallocz(j); /* * Second pass: write the new string. Note that this loop is diff --git a/khash.h b/khash.h index 376475a5ea..c0da40daa7 100644 --- a/khash.h +++ b/khash.h @@ -117,7 +117,7 @@ static const double __ac_HASH_UPPER = 0.77; if (new_n_buckets < 4) new_n_buckets = 4; \ if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \ else { /* hash table size to be changed (shrink or expand); rehash */ \ - new_flags = (khint32_t*)xmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ + ALLOC_ARRAY(new_flags, __ac_fsize(new_n_buckets)); \ if (!new_flags) return -1; \ memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \ if (h->n_buckets < new_n_buckets) { /* expand */ \ diff --git a/levenshtein.c b/levenshtein.c index fc281597fd..d2632690d5 100644 --- a/levenshtein.c +++ b/levenshtein.c @@ -42,11 +42,13 @@ int levenshtein(const char *string1, const char *string2, int w, int s, int a, int d) { int len1 = strlen(string1), len2 = strlen(string2); - int *row0 = xmalloc(sizeof(int) * (len2 + 1)); - int *row1 = xmalloc(sizeof(int) * (len2 + 1)); - int *row2 = xmalloc(sizeof(int) * (len2 + 1)); + int *row0, *row1, *row2; int i, j; + ALLOC_ARRAY(row0, len2 + 1); + ALLOC_ARRAY(row1, len2 + 1); + ALLOC_ARRAY(row2, len2 + 1); + for (j = 0; j <= len2; j++) row1[j] = j * a; for (i = 0; i < len1; i++) { diff --git a/line-log.c b/line-log.c index af6e2f799e..bbe31ed6fb 100644 --- a/line-log.c +++ b/line-log.c @@ -14,6 +14,7 @@ #include "graph.h" #include "userdiff.h" #include "line-log.h" +#include "argv-array.h" static void range_set_grow(struct range_set *rs, size_t extra) { @@ -521,7 +522,7 @@ static void fill_line_ends(struct diff_filespec *spec, long *lines, if (diff_populate_filespec(spec, 0)) die("Cannot read blob %s", sha1_to_hex(spec->sha1)); - ends = xmalloc(size * sizeof(*ends)); + ALLOC_ARRAY(ends, size); ends[cur++] = 0; data = spec->data; while (num < spec->size) { @@ -746,22 +747,17 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_list add_line_range(rev, commit, range); if (!rev->diffopt.detect_rename) { - int i, count = 0; - struct line_log_data *r = range; + struct line_log_data *r; + struct argv_array array = ARGV_ARRAY_INIT; const char **paths; - while (r) { - count++; - r = r->next; - } - paths = xmalloc((count+1)*sizeof(char *)); - r = range; - for (i = 0; i < count; i++) { - paths[i] = xstrdup(r->path); - r = r->next; - } - paths[count] = NULL; + + for (r = range; r; r = r->next) + argv_array_push(&array, r->path); + paths = argv_array_detach(&array); + parse_pathspec(&rev->diffopt.pathspec, 0, PATHSPEC_PREFER_FULL, "", paths); + /* strings are now owned by pathspec */ free(paths); } } @@ -1146,9 +1142,9 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm if (nparents > 1 && rev->first_parent_only) nparents = 1; - diffqueues = xmalloc(nparents * sizeof(*diffqueues)); - cand = xmalloc(nparents * sizeof(*cand)); - parents = xmalloc(nparents * sizeof(*parents)); + ALLOC_ARRAY(diffqueues, nparents); + ALLOC_ARRAY(cand, nparents); + ALLOC_ARRAY(parents, nparents); p = commit->parents; for (i = 0; i < nparents; i++) { diff --git a/list-objects.c b/list-objects.c index 11732d9388..917cc5d7c9 100644 --- a/list-objects.c +++ b/list-objects.c @@ -11,11 +11,12 @@ static void process_blob(struct rev_info *revs, struct blob *blob, show_object_fn show, - struct name_path *path, + struct strbuf *path, const char *name, void *cb_data) { struct object *obj = &blob->object; + size_t pathlen; if (!revs->blob_objects) return; @@ -24,7 +25,11 @@ static void process_blob(struct rev_info *revs, if (obj->flags & (UNINTERESTING | SEEN)) return; obj->flags |= SEEN; - show(obj, path, name, cb_data); + + pathlen = path->len; + strbuf_addstr(path, name); + show(obj, path->buf, cb_data); + strbuf_setlen(path, pathlen); } /* @@ -52,7 +57,7 @@ static void process_blob(struct rev_info *revs, static void process_gitlink(struct rev_info *revs, const unsigned char *sha1, show_object_fn show, - struct name_path *path, + struct strbuf *path, const char *name, void *cb_data) { @@ -62,7 +67,6 @@ static void process_gitlink(struct rev_info *revs, static void process_tree(struct rev_info *revs, struct tree *tree, show_object_fn show, - struct name_path *path, struct strbuf *base, const char *name, void *cb_data) @@ -70,7 +74,6 @@ static void process_tree(struct rev_info *revs, struct object *obj = &tree->object; struct tree_desc desc; struct name_entry entry; - struct name_path me; enum interesting match = revs->diffopt.pathspec.nr == 0 ? all_entries_interesting: entry_not_interesting; int baselen = base->len; @@ -86,17 +89,12 @@ static void process_tree(struct rev_info *revs, return; die("bad tree object %s", oid_to_hex(&obj->oid)); } - obj->flags |= SEEN; - show(obj, path, name, cb_data); - me.up = path; - me.elem = name; - me.elem_len = strlen(name); - if (!match) { - strbuf_addstr(base, name); - if (base->len) - strbuf_addch(base, '/'); - } + obj->flags |= SEEN; + strbuf_addstr(base, name); + show(obj, base->buf, cb_data); + if (base->len) + strbuf_addch(base, '/'); init_tree_desc(&desc, tree->buffer, tree->size); @@ -113,16 +111,16 @@ static void process_tree(struct rev_info *revs, if (S_ISDIR(entry.mode)) process_tree(revs, lookup_tree(entry.sha1), - show, &me, base, entry.path, + show, base, entry.path, cb_data); else if (S_ISGITLINK(entry.mode)) process_gitlink(revs, entry.sha1, - show, &me, entry.path, + show, base, entry.path, cb_data); else process_blob(revs, lookup_blob(entry.sha1), - show, &me, entry.path, + show, base, entry.path, cb_data); } strbuf_setlen(base, baselen); @@ -213,19 +211,19 @@ void traverse_commit_list(struct rev_info *revs, continue; if (obj->type == OBJ_TAG) { obj->flags |= SEEN; - show_object(obj, NULL, name, data); + show_object(obj, name, data); continue; } if (!path) path = ""; if (obj->type == OBJ_TREE) { process_tree(revs, (struct tree *)obj, show_object, - NULL, &base, path, data); + &base, path, data); continue; } if (obj->type == OBJ_BLOB) { process_blob(revs, (struct blob *)obj, show_object, - NULL, path, data); + &base, path, data); continue; } die("unknown pending object %s (%s)", diff --git a/list-objects.h b/list-objects.h index 136a1da5a6..0cebf8585c 100644 --- a/list-objects.h +++ b/list-objects.h @@ -2,7 +2,7 @@ #define LIST_OBJECTS_H typedef void (*show_commit_fn)(struct commit *, void *); -typedef void (*show_object_fn)(struct object *, const struct name_path *, const char *, void *); +typedef void (*show_object_fn)(struct object *, const char *, void *); void traverse_commit_list(struct rev_info *, show_commit_fn, show_object_fn, void *); typedef void (*show_edge_fn)(struct commit *); diff --git a/ll-merge.c b/ll-merge.c index 0338630fc2..ff4a43a982 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -205,7 +205,7 @@ static int ll_ext_merge(const struct ll_merge_driver *fn, if (fstat(fd, &st)) goto close_bad; result->size = st.st_size; - result->ptr = xmalloc(result->size + 1); + result->ptr = xmallocz(result->size); if (read_in_full(fd, result->ptr, result->size) != result->size) { free(result->ptr); result->ptr = NULL; diff --git a/log-tree.c b/log-tree.c index 35e780170a..60f983934d 100644 --- a/log-tree.c +++ b/log-tree.c @@ -77,9 +77,8 @@ int parse_decorate_color_config(const char *var, const char *slot_name, const ch void add_name_decoration(enum decoration_type type, const char *name, struct object *obj) { - int nlen = strlen(name); - struct name_decoration *res = xmalloc(sizeof(*res) + nlen + 1); - memcpy(res->name, name, nlen + 1); + struct name_decoration *res; + FLEX_ALLOC_STR(res, name, name); res->type = type; res->next = add_decoration(&name_decoration, obj, res); } @@ -342,7 +341,8 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit, { const char *subject = NULL; const char *extra_headers = opt->extra_headers; - const char *name = oid_to_hex(&commit->object.oid); + const char *name = oid_to_hex(opt->zero_commit ? + &null_oid : &commit->object.oid); *need_8bit_cte_p = 0; /* unknown */ if (opt->total > 0) { diff --git a/mailinfo.c b/mailinfo.c index f289941f7e..9f19ca1080 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -732,7 +732,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in) struct strbuf continuation = STRBUF_INIT; /* Get the first part of the line. */ - if (strbuf_getline(line, in, '\n')) + if (strbuf_getline_lf(line, in)) return 0; /* @@ -756,7 +756,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in) peek = fgetc(in); ungetc(peek, in); if (peek != ' ' && peek != '\t') break; - if (strbuf_getline(&continuation, in, '\n')) + if (strbuf_getline_lf(&continuation, in)) break; continuation.buf[0] = ' '; strbuf_rtrim(&continuation); @@ -769,7 +769,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in) static int find_boundary(struct mailinfo *mi, struct strbuf *line) { - while (!strbuf_getline(line, mi->input, '\n')) { + while (!strbuf_getline_lf(line, mi->input)) { if (*(mi->content_top) && is_multipart_boundary(mi, line)) return 1; } @@ -820,7 +820,7 @@ again: strbuf_release(&newline); /* replenish line */ - if (strbuf_getline(line, mi->input, '\n')) + if (strbuf_getline_lf(line, mi->input)) return 0; strbuf_addch(line, '\n'); return 1; diff --git a/merge-blobs.c b/merge-blobs.c index ddca601c77..9b6eac22e4 100644 --- a/merge-blobs.c +++ b/merge-blobs.c @@ -48,40 +48,6 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our return res.ptr; } -static int common_outf(void *priv_, mmbuffer_t *mb, int nbuf) -{ - int i; - mmfile_t *dst = priv_; - - for (i = 0; i < nbuf; i++) { - memcpy(dst->ptr + dst->size, mb[i].ptr, mb[i].size); - dst->size += mb[i].size; - } - return 0; -} - -static int generate_common_file(mmfile_t *res, mmfile_t *f1, mmfile_t *f2) -{ - unsigned long size = f1->size < f2->size ? f1->size : f2->size; - void *ptr = xmalloc(size); - xpparam_t xpp; - xdemitconf_t xecfg; - xdemitcb_t ecb; - - memset(&xpp, 0, sizeof(xpp)); - xpp.flags = 0; - memset(&xecfg, 0, sizeof(xecfg)); - xecfg.ctxlen = 3; - xecfg.flags = XDL_EMIT_COMMON; - ecb.outf = common_outf; - - res->ptr = ptr; - res->size = 0; - - ecb.priv = res; - return xdi_diff(f1, f2, &xpp, &xecfg, &ecb); -} - void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct blob *their, unsigned long *size) { void *res = NULL; @@ -112,8 +78,8 @@ void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct if (fill_mmfile_blob(&common, base) < 0) goto out_free_f2_f1; } else { - if (generate_common_file(&common, &f1, &f2) < 0) - goto out_free_f2_f1; + common.ptr = xstrdup(""); + common.size = 0; } res = three_way_filemerge(path, &common, &f1, &f2, size); free_mmfile(&common); diff --git a/merge-recursive.c b/merge-recursive.c index 8eabde20fb..b880ae50e7 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -482,6 +482,9 @@ static struct string_list *get_renames(struct merge_options *o, struct diff_options opts; renames = xcalloc(1, sizeof(struct string_list)); + if (!o->detect_rename) + return renames; + diff_setup(&opts); DIFF_OPT_SET(&opts, RECURSIVE); DIFF_OPT_CLR(&opts, RENAME_EMPTY); @@ -2039,6 +2042,7 @@ void init_merge_options(struct merge_options *o) o->diff_rename_limit = -1; o->merge_rename_limit = -1; o->renormalize = 0; + o->detect_rename = 1; merge_recursive_config(o); if (getenv("GIT_MERGE_VERBOSITY")) o->verbosity = @@ -2088,9 +2092,17 @@ int parse_merge_opt(struct merge_options *o, const char *s) o->renormalize = 1; else if (!strcmp(s, "no-renormalize")) o->renormalize = 0; - else if (skip_prefix(s, "rename-threshold=", &arg)) { + else if (!strcmp(s, "no-renames")) + o->detect_rename = 0; + else if (!strcmp(s, "find-renames")) { + o->detect_rename = 1; + o->rename_score = 0; + } + else if (skip_prefix(s, "find-renames=", &arg) || + skip_prefix(s, "rename-threshold=", &arg)) { if ((o->rename_score = parse_rename_score(&arg)) == -1 || *arg != 0) return -1; + o->detect_rename = 1; } else return -1; diff --git a/merge-recursive.h b/merge-recursive.h index 9e090a3470..52f0201f68 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -17,6 +17,7 @@ struct merge_options { unsigned renormalize : 1; long xdl_opts; int verbosity; + int detect_rename; int diff_rename_limit; int merge_rename_limit; int rename_score; diff --git a/mergetools/vimdiff b/mergetools/vimdiff index 1ddfbfcd78..74ea6d5479 100644 --- a/mergetools/vimdiff +++ b/mergetools/vimdiff @@ -9,8 +9,8 @@ merge_cmd () { gvimdiff|vimdiff) if $base_present then - "$merge_tool_path" -f -d -c 'wincmd J' \ - "$MERGED" "$LOCAL" "$BASE" "$REMOTE" + "$merge_tool_path" -f -d -c '4wincmd w | wincmd J' \ + "$LOCAL" "$BASE" "$REMOTE" "$MERGED" else "$merge_tool_path" -f -d -c 'wincmd l' \ "$LOCAL" "$MERGED" "$REMOTE" diff --git a/name-hash.c b/name-hash.c index 332ba956e7..6d9f23e932 100644 --- a/name-hash.c +++ b/name-hash.c @@ -55,10 +55,9 @@ static struct dir_entry *hash_dir_entry(struct index_state *istate, dir = find_dir_entry(istate, ce->name, namelen); if (!dir) { /* not found, create it and add to hash table */ - dir = xcalloc(1, sizeof(struct dir_entry) + namelen + 1); + FLEX_ALLOC_MEM(dir, name, ce->name, namelen); hashmap_entry_init(dir, memihash(ce->name, namelen)); dir->namelen = namelen; - strncpy(dir->name, ce->name, namelen); hashmap_add(&istate->dir_hash, dir); /* recursively add missing parent directories */ diff --git a/notes-cache.c b/notes-cache.c index c4e9bb7f6c..5dfc5cbd08 100644 --- a/notes-cache.c +++ b/notes-cache.c @@ -32,14 +32,14 @@ void notes_cache_init(struct notes_cache *c, const char *name, const char *validity) { struct strbuf ref = STRBUF_INIT; - int flags = 0; + int flags = NOTES_INIT_WRITABLE; memset(c, 0, sizeof(*c)); c->validity = xstrdup(validity); strbuf_addf(&ref, "refs/notes/%s", name); if (!notes_cache_match_validity(ref.buf, validity)) - flags = NOTES_INIT_EMPTY; + flags |= NOTES_INIT_EMPTY; init_notes(&c->tree, ref.buf, combine_notes_overwrite, flags); strbuf_release(&ref); } @@ -49,7 +49,8 @@ int notes_cache_write(struct notes_cache *c) unsigned char tree_sha1[20]; unsigned char commit_sha1[20]; - if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref) + if (!c || !c->tree.initialized || !c->tree.update_ref || + !*c->tree.update_ref) return -1; if (!c->tree.dirty) return 0; @@ -59,8 +60,8 @@ int notes_cache_write(struct notes_cache *c) if (commit_tree(c->validity, strlen(c->validity), tree_sha1, NULL, commit_sha1, NULL, NULL) < 0) return -1; - if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL, - 0, UPDATE_REFS_QUIET_ON_ERR) < 0) + if (update_ref("update notes cache", c->tree.update_ref, commit_sha1, + NULL, 0, UPDATE_REFS_QUIET_ON_ERR) < 0) return -1; return 0; diff --git a/notes-utils.c b/notes-utils.c index 299e34bccc..24a33616a4 100644 --- a/notes-utils.c +++ b/notes-utils.c @@ -37,7 +37,7 @@ void commit_notes(struct notes_tree *t, const char *msg) if (!t) t = &default_notes_tree; - if (!t->initialized || !t->ref || !*t->ref) + if (!t->initialized || !t->update_ref || !*t->update_ref) die(_("Cannot commit uninitialized/unreferenced notes tree")); if (!t->dirty) return; /* don't have to commit an unchanged tree */ @@ -48,7 +48,7 @@ void commit_notes(struct notes_tree *t, const char *msg) create_notes_commit(t, NULL, buf.buf, buf.len, commit_sha1); strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */ - update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, + update_ref(buf.buf, t->update_ref, commit_sha1, NULL, 0, UPDATE_REFS_DIE_ON_ERR); strbuf_release(&buf); @@ -148,7 +148,7 @@ struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd) free(c); return NULL; } - c->trees = load_notes_trees(c->refs); + c->trees = load_notes_trees(c->refs, NOTES_INIT_WRITABLE); string_list_clear(c->refs, 0); free(c->refs); return c; diff --git a/notes.c b/notes.c index db77922130..88cf4747c1 100644 --- a/notes.c +++ b/notes.c @@ -1011,13 +1011,16 @@ void init_notes(struct notes_tree *t, const char *notes_ref, t->first_non_note = NULL; t->prev_non_note = NULL; t->ref = xstrdup_or_null(notes_ref); + t->update_ref = (flags & NOTES_INIT_WRITABLE) ? t->ref : NULL; t->combine_notes = combine_notes; t->initialized = 1; t->dirty = 0; if (flags & NOTES_INIT_EMPTY || !notes_ref || - read_ref(notes_ref, object_sha1)) + get_sha1_treeish(notes_ref, object_sha1)) return; + if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, object_sha1)) + die("Cannot use notes ref %s", notes_ref); if (get_tree_entry(object_sha1, "", sha1, &mode)) die("Failed to read notes tree referenced by %s (%s)", notes_ref, sha1_to_hex(object_sha1)); @@ -1027,15 +1030,15 @@ void init_notes(struct notes_tree *t, const char *notes_ref, load_subtree(t, &root_tree, t->root, 0); } -struct notes_tree **load_notes_trees(struct string_list *refs) +struct notes_tree **load_notes_trees(struct string_list *refs, int flags) { struct string_list_item *item; int counter = 0; struct notes_tree **trees; - trees = xmalloc((refs->nr+1) * sizeof(struct notes_tree *)); + ALLOC_ARRAY(trees, refs->nr + 1); for_each_string_list_item(item, refs) { struct notes_tree *t = xcalloc(1, sizeof(struct notes_tree)); - init_notes(t, item->string, combine_notes_ignore, 0); + init_notes(t, item->string, combine_notes_ignore, flags); trees[counter++] = t; } trees[counter] = NULL; @@ -1071,7 +1074,7 @@ void init_display_notes(struct display_notes_opt *opt) item->string); } - display_notes_trees = load_notes_trees(&display_notes_refs); + display_notes_trees = load_notes_trees(&display_notes_refs, 0); string_list_clear(&display_notes_refs, 0); } @@ -1303,3 +1306,13 @@ void expand_notes_ref(struct strbuf *sb) else strbuf_insert(sb, 0, "refs/notes/", 11); } + +void expand_loose_notes_ref(struct strbuf *sb) +{ + unsigned char object[20]; + + if (get_sha1(sb->buf, object)) { + /* fallback to expand_notes_ref */ + expand_notes_ref(sb); + } +} diff --git a/notes.h b/notes.h index 2a3f923380..5345642cfd 100644 --- a/notes.h +++ b/notes.h @@ -44,6 +44,7 @@ extern struct notes_tree { struct int_node *root; struct non_note *first_non_note, *prev_non_note; char *ref; + char *update_ref; combine_notes_fn combine_notes; int initialized; int dirty; @@ -71,6 +72,13 @@ const char *default_notes_ref(void); */ #define NOTES_INIT_EMPTY 1 +/* + * By default, the notes tree is only readable, and the notes ref can be + * any treeish. The notes tree can however be made writable with this flag, + * in which case only strict ref names can be used. + */ +#define NOTES_INIT_WRITABLE 2 + /* * Initialize the given notes_tree with the notes tree structure at the given * ref. If given ref is NULL, the value of the $GIT_NOTES_REF environment @@ -276,7 +284,7 @@ void format_display_notes(const unsigned char *object_sha1, * Load the notes tree from each ref listed in 'refs'. The output is * an array of notes_tree*, terminated by a NULL. */ -struct notes_tree **load_notes_trees(struct string_list *refs); +struct notes_tree **load_notes_trees(struct string_list *refs, int flags); /* * Add all refs that match 'glob' to the 'list'. @@ -294,4 +302,11 @@ void string_list_add_refs_from_colon_sep(struct string_list *list, /* Expand inplace a note ref like "foo" or "notes/foo" into "refs/notes/foo" */ void expand_notes_ref(struct strbuf *sb); +/* + * Similar to expand_notes_ref, but will check whether the ref can be located + * via get_sha1 first, and only falls back to expand_notes_ref in the case + * where get_sha1 fails. + */ +void expand_loose_notes_ref(struct strbuf *sb); + #endif diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c index 6bff970c90..c30bcd06cb 100644 --- a/pack-bitmap-write.c +++ b/pack-bitmap-write.c @@ -148,8 +148,7 @@ static uint32_t find_object_pos(const unsigned char *sha1) return entry->in_pack_pos; } -static void show_object(struct object *object, const struct name_path *path, - const char *last, void *data) +static void show_object(struct object *object, const char *name, void *data) { struct bitmap *base = data; bitmap_set(base, find_object_pos(object->oid.hash)); diff --git a/pack-bitmap.c b/pack-bitmap.c index cb9c622803..b949e51716 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -33,9 +33,6 @@ static struct bitmap_index { /* Packfile to which this bitmap index belongs to */ struct packed_git *pack; - /* reverse index for the packfile */ - struct pack_revindex *reverse_index; - /* * Mark the first `reuse_objects` in the packfile as reused: * they will be sent as-is without using them for repacking @@ -308,7 +305,7 @@ static int load_pack_bitmap(void) bitmap_git.bitmaps = kh_init_sha1(); bitmap_git.ext_index.positions = kh_init_sha1_pos(); - bitmap_git.reverse_index = revindex_for_pack(bitmap_git.pack); + load_pack_revindex(bitmap_git.pack); if (!(bitmap_git.commits = read_bitmap_1(&bitmap_git)) || !(bitmap_git.trees = read_bitmap_1(&bitmap_git)) || @@ -380,7 +377,7 @@ static inline int bitmap_position_packfile(const unsigned char *sha1) if (!offset) return -1; - return find_revindex_position(bitmap_git.reverse_index, offset); + return find_revindex_position(bitmap_git.pack, offset); } static int bitmap_position(const unsigned char *sha1) @@ -417,19 +414,15 @@ static int ext_index_add_object(struct object *object, const char *name) return bitmap_pos + bitmap_git.pack->num_objects; } -static void show_object(struct object *object, const struct name_path *path, - const char *last, void *data) +static void show_object(struct object *object, const char *name, void *data) { struct bitmap *base = data; int bitmap_pos; bitmap_pos = bitmap_position(object->oid.hash); - if (bitmap_pos < 0) { - char *name = path_name(path, last); + if (bitmap_pos < 0) bitmap_pos = ext_index_add_object(object, name); - free(name); - } bitmap_set(base, bitmap_pos); } @@ -630,7 +623,7 @@ static void show_objects_for_type( if (pos + offset < bitmap_git.reuse_objects) continue; - entry = &bitmap_git.reverse_index->revindex[pos + offset]; + entry = &bitmap_git.pack->revindex[pos + offset]; sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); if (bitmap_git.hashes) @@ -804,7 +797,7 @@ int reuse_partial_packfile_from_bitmap(struct packed_git **packfile, return -1; bitmap_git.reuse_objects = *entries = reuse_objects; - *up_to = bitmap_git.reverse_index->revindex[reuse_objects].offset; + *up_to = bitmap_git.pack->revindex[reuse_objects].offset; *packfile = bitmap_git.pack; return 0; @@ -897,9 +890,8 @@ struct bitmap_test_data { size_t seen; }; -static void test_show_object(struct object *object, - const struct name_path *path, - const char *last, void *data) +static void test_show_object(struct object *object, const char *name, + void *data) { struct bitmap_test_data *tdata = data; int bitmap_pos; @@ -1038,7 +1030,7 @@ int rebuild_existing_bitmaps(struct packing_data *mapping, struct revindex_entry *entry; struct object_entry *oe; - entry = &bitmap_git.reverse_index->revindex[i]; + entry = &bitmap_git.pack->revindex[i]; sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr); oe = packlist_find(mapping, sha1, NULL); diff --git a/pack-check.c b/pack-check.c index 433bd86ccd..1da89a41ce 100644 --- a/pack-check.c +++ b/pack-check.c @@ -89,7 +89,7 @@ static int verify_packfile(struct packed_git *p, * we do not do scan-streaming check on the pack file. */ nr_objects = p->num_objects; - entries = xmalloc((nr_objects + 1) * sizeof(*entries)); + ALLOC_ARRAY(entries, nr_objects + 1); entries[nr_objects].offset = pack_sig_ofs; /* first sort entries by pack offset, since unpacking them is more efficient that way */ for (i = 0; i < nr_objects; i++) { diff --git a/pack-revindex.c b/pack-revindex.c index e542ea7703..96d51c3467 100644 --- a/pack-revindex.c +++ b/pack-revindex.c @@ -8,52 +8,13 @@ * size is easily available by examining the pack entry header). It is * also rather expensive to find the sha1 for an object given its offset. * - * We build a hashtable of existing packs (pack_revindex), and keep reverse - * index here -- pack index file is sorted by object name mapping to offset; - * this pack_revindex[].revindex array is a list of offset/index_nr pairs + * The pack index file is sorted by object name mapping to offset; + * this revindex array is a list of offset/index_nr pairs * ordered by offset, so if you know the offset of an object, next offset * is where its packed representation ends and the index_nr can be used to * get the object sha1 from the main index. */ -static struct pack_revindex *pack_revindex; -static int pack_revindex_hashsz; - -static int pack_revindex_ix(struct packed_git *p) -{ - unsigned long ui = (unsigned long)(intptr_t)p; - int i; - - ui = ui ^ (ui >> 16); /* defeat structure alignment */ - i = (int)(ui % pack_revindex_hashsz); - while (pack_revindex[i].p) { - if (pack_revindex[i].p == p) - return i; - if (++i == pack_revindex_hashsz) - i = 0; - } - return -1 - i; -} - -static void init_pack_revindex(void) -{ - int num; - struct packed_git *p; - - for (num = 0, p = packed_git; p; p = p->next) - num++; - if (!num) - return; - pack_revindex_hashsz = num * 11; - pack_revindex = xcalloc(pack_revindex_hashsz, sizeof(*pack_revindex)); - for (p = packed_git; p; p = p->next) { - num = pack_revindex_ix(p); - num = - 1 - num; - pack_revindex[num].p = p; - } - /* revindex elements are lazily initialized */ -} - /* * This is a least-significant-digit radix sort. * @@ -83,10 +44,14 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max) * keep track of them with alias pointers, always sorting from "from" * to "to". */ - struct revindex_entry *tmp = xmalloc(n * sizeof(*tmp)); - struct revindex_entry *from = entries, *to = tmp; + struct revindex_entry *tmp, *from, *to; int bits; - unsigned *pos = xmalloc(BUCKETS * sizeof(*pos)); + unsigned *pos; + + ALLOC_ARRAY(pos, BUCKETS); + ALLOC_ARRAY(tmp, n); + from = entries; + to = tmp; /* * If (max >> bits) is zero, then we know that the radix digit we are @@ -154,14 +119,13 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max) /* * Ordered list of offsets of objects in the pack. */ -static void create_pack_revindex(struct pack_revindex *rix) +static void create_pack_revindex(struct packed_git *p) { - struct packed_git *p = rix->p; unsigned num_ent = p->num_objects; unsigned i; const char *index = p->index_data; - rix->revindex = xmalloc(sizeof(*rix->revindex) * (num_ent + 1)); + ALLOC_ARRAY(p->revindex, num_ent + 1); index += 4 * 256; if (p->index_version > 1) { @@ -171,55 +135,42 @@ static void create_pack_revindex(struct pack_revindex *rix) for (i = 0; i < num_ent; i++) { uint32_t off = ntohl(*off_32++); if (!(off & 0x80000000)) { - rix->revindex[i].offset = off; + p->revindex[i].offset = off; } else { - rix->revindex[i].offset = + p->revindex[i].offset = ((uint64_t)ntohl(*off_64++)) << 32; - rix->revindex[i].offset |= + p->revindex[i].offset |= ntohl(*off_64++); } - rix->revindex[i].nr = i; + p->revindex[i].nr = i; } } else { for (i = 0; i < num_ent; i++) { uint32_t hl = *((uint32_t *)(index + 24 * i)); - rix->revindex[i].offset = ntohl(hl); - rix->revindex[i].nr = i; + p->revindex[i].offset = ntohl(hl); + p->revindex[i].nr = i; } } /* This knows the pack format -- the 20-byte trailer * follows immediately after the last object data. */ - rix->revindex[num_ent].offset = p->pack_size - 20; - rix->revindex[num_ent].nr = -1; - sort_revindex(rix->revindex, num_ent, p->pack_size); + p->revindex[num_ent].offset = p->pack_size - 20; + p->revindex[num_ent].nr = -1; + sort_revindex(p->revindex, num_ent, p->pack_size); } -struct pack_revindex *revindex_for_pack(struct packed_git *p) +void load_pack_revindex(struct packed_git *p) { - int num; - struct pack_revindex *rix; - - if (!pack_revindex_hashsz) - init_pack_revindex(); - - num = pack_revindex_ix(p); - if (num < 0) - die("internal error: pack revindex fubar"); - - rix = &pack_revindex[num]; - if (!rix->revindex) - create_pack_revindex(rix); - - return rix; + if (!p->revindex) + create_pack_revindex(p); } -int find_revindex_position(struct pack_revindex *pridx, off_t ofs) +int find_revindex_position(struct packed_git *p, off_t ofs) { int lo = 0; - int hi = pridx->p->num_objects + 1; - struct revindex_entry *revindex = pridx->revindex; + int hi = p->num_objects + 1; + struct revindex_entry *revindex = p->revindex; do { unsigned mi = lo + (hi - lo) / 2; @@ -237,11 +188,13 @@ int find_revindex_position(struct pack_revindex *pridx, off_t ofs) struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs) { - struct pack_revindex *pridx = revindex_for_pack(p); - int pos = find_revindex_position(pridx, ofs); + int pos; + + load_pack_revindex(p); + pos = find_revindex_position(p, ofs); if (pos < 0) return NULL; - return pridx->revindex + pos; + return p->revindex + pos; } diff --git a/pack-revindex.h b/pack-revindex.h index d737f98965..e262f3efe8 100644 --- a/pack-revindex.h +++ b/pack-revindex.h @@ -1,18 +1,15 @@ #ifndef PACK_REVINDEX_H #define PACK_REVINDEX_H +struct packed_git; + struct revindex_entry { off_t offset; unsigned int nr; }; -struct pack_revindex { - struct packed_git *p; - struct revindex_entry *revindex; -}; - -struct pack_revindex *revindex_for_pack(struct packed_git *p); -int find_revindex_position(struct pack_revindex *pridx, off_t ofs); +void load_pack_revindex(struct packed_git *p); +int find_revindex_position(struct packed_git *p, off_t ofs); struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs); diff --git a/pager.c b/pager.c index e425070528..4bc048148e 100644 --- a/pager.c +++ b/pager.c @@ -11,7 +11,6 @@ * something different on Windows. */ -static const char *pager_argv[] = { NULL, NULL }; static struct child_process pager_process = CHILD_PROCESS_INIT; static void wait_for_pager(int in_signal) @@ -64,6 +63,16 @@ const char *git_pager(int stdout_is_tty) return pager; } +void prepare_pager_args(struct child_process *pager_process, const char *pager) +{ + argv_array_push(&pager_process->args, pager); + pager_process->use_shell = 1; + if (!getenv("LESS")) + argv_array_push(&pager_process->env_array, "LESS=FRX"); + if (!getenv("LV")) + argv_array_push(&pager_process->env_array, "LV=-c"); +} + void setup_pager(void) { const char *pager = git_pager(isatty(1)); @@ -80,14 +89,8 @@ void setup_pager(void) setenv("GIT_PAGER_IN_USE", "true", 1); /* spawn the pager */ - pager_argv[0] = pager; - pager_process.use_shell = 1; - pager_process.argv = pager_argv; + prepare_pager_args(&pager_process, pager); pager_process.in = -1; - if (!getenv("LESS")) - argv_array_push(&pager_process.env_array, "LESS=FRX"); - if (!getenv("LV")) - argv_array_push(&pager_process.env_array, "LV=-c"); argv_array_push(&pager_process.env_array, "GIT_PAGER_IN_USE"); if (start_command(&pager_process)) return; diff --git a/path.c b/path.c index 3cd155e27d..969b494d72 100644 --- a/path.c +++ b/path.c @@ -584,6 +584,9 @@ char *expand_user_path(const char *path) if (!home) goto return_null; strbuf_addstr(&user_path, home); +#ifdef GIT_WINDOWS_NATIVE + convert_slashes(user_path.buf); +#endif } else { struct passwd *pw = getpw_str(username, username_len); if (!pw) @@ -782,13 +785,10 @@ const char *relative_path(const char *in, const char *prefix, else if (!prefix_len) return in; - if (have_same_root(in, prefix)) { + if (have_same_root(in, prefix)) /* bypass dos_drive, for "c:" is identical to "C:" */ - if (has_dos_drive_prefix(in)) { - i = 2; - j = 2; - } - } else { + i = j = has_dos_drive_prefix(in); + else { return in; } @@ -943,11 +943,10 @@ const char *remove_leading_path(const char *in, const char *prefix) int normalize_path_copy_len(char *dst, const char *src, int *prefix_len) { char *dst0; + int i; - if (has_dos_drive_prefix(src)) { + for (i = has_dos_drive_prefix(src); i > 0; i--) *dst++ = *src++; - *dst++ = *src++; - } dst0 = dst; if (is_dir_sep(*src)) { diff --git a/pathspec.c b/pathspec.c index 9304ee33d7..c9e9b6c077 100644 --- a/pathspec.c +++ b/pathspec.c @@ -406,7 +406,8 @@ void parse_pathspec(struct pathspec *pathspec, n++; pathspec->nr = n; - pathspec->items = item = xmalloc(sizeof(*item) * n); + ALLOC_ARRAY(pathspec->items, n); + item = pathspec->items; pathspec->_raw = argv; prefixlen = prefix ? strlen(prefix) : 0; @@ -483,7 +484,7 @@ const char **get_pathspec(const char *prefix, const char **pathspec) void copy_pathspec(struct pathspec *dst, const struct pathspec *src) { *dst = *src; - dst->items = xmalloc(sizeof(struct pathspec_item) * dst->nr); + ALLOC_ARRAY(dst->items, dst->nr); memcpy(dst->items, src->items, sizeof(struct pathspec_item) * dst->nr); } diff --git a/perl/Git.pm b/perl/Git.pm index 19ef081103..49eb88af8d 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -188,7 +188,8 @@ sub repository { }; if ($dir) { - $dir =~ m#^/# or $dir = $opts{Directory} . '/' . $dir; + _verify_require(); + File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir; $opts{Repository} = abs_path($dir); # If --git-dir went ok, this shouldn't die either. diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm index c50176eec9..4c4199afec 100644 --- a/perl/Git/SVN/Editor.pm +++ b/perl/Git/SVN/Editor.pm @@ -41,6 +41,7 @@ sub new { "$self->{svn_path}/" : ''; $self->{config} = $opts->{config}; $self->{mergeinfo} = $opts->{mergeinfo}; + $self->{pathnameencoding} = Git::config('svn.pathnameencoding'); return $self; } @@ -143,11 +144,12 @@ sub repo_path { sub url_path { my ($self, $path) = @_; + $path = $self->repo_path($path); if ($self->{url} =~ m#^https?://#) { # characters are taken from subversion/libsvn_subr/path.c $path =~ s#([^~a-zA-Z0-9_./!$&'()*+,-])#sprintf("%%%02X",ord($1))#eg; } - $self->{url} . '/' . $self->repo_path($path); + $self->{url} . '/' . $path; } sub rmdirs { diff --git a/perl/Git/SVN/GlobSpec.pm b/perl/Git/SVN/GlobSpec.pm index c95f5d76ca..a0a8d17621 100644 --- a/perl/Git/SVN/GlobSpec.pm +++ b/perl/Git/SVN/GlobSpec.pm @@ -8,19 +8,23 @@ sub new { $re =~ s!/+$!!g; # no need for trailing slashes my (@left, @right, @patterns); my $state = "left"; - my $die_msg = "Only one set of wildcard directories " . - "(e.g. '*' or '*/*/*') is supported: '$glob'\n"; + my $die_msg = "Only one set of wildcards " . + "(e.g. '*' or '*/*/*') is supported: $glob\n"; for my $part (split(m|/|, $glob)) { - if ($part =~ /\*/ && $part ne "*") { - die "Invalid pattern in '$glob': $part\n"; - } elsif ($pattern_ok && $part =~ /[{}]/ && + if ($pattern_ok && $part =~ /[{}]/ && $part !~ /^\{[^{}]+\}/) { die "Invalid pattern in '$glob': $part\n"; } - if ($part eq "*") { + my $nstars = $part =~ tr/*//; + if ($nstars > 1) { + die "Only one '*' is allowed in a pattern: '$part'\n"; + } + if ($part =~ /(.*)\*(.*)/) { die $die_msg if $state eq "right"; + my ($l, $r) = ($1, $2); $state = "pattern"; - push(@patterns, "[^/]*"); + my $pat = quotemeta($l) . '[^/]*' . quotemeta($r); + push(@patterns, $pat); } elsif ($pattern_ok && $part =~ /^\{(.*)\}$/) { die $die_msg if $state eq "right"; $state = "pattern"; diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm index 4a499fcb38..e764696801 100644 --- a/perl/Git/SVN/Ra.pm +++ b/perl/Git/SVN/Ra.pm @@ -81,7 +81,6 @@ sub prepare_config_once { SVN::_Core::svn_config_ensure($config_dir, undef); my ($baton, $callbacks) = SVN::Core::auth_open_helper(_auth_providers); my $config = SVN::Core::config_get_config($config_dir); - my $dont_store_passwords = 1; my $conf_t = $config->{'config'}; no warnings 'once'; @@ -93,9 +92,14 @@ sub prepare_config_once { $SVN::_Core::SVN_CONFIG_SECTION_AUTH, $SVN::_Core::SVN_CONFIG_OPTION_STORE_PASSWORDS, 1) == 0) { + my $val = '1'; + if (::compare_svn_version('1.9.0') < 0) { # pre-SVN r1553823 + my $dont_store_passwords = 1; + $val = bless \$dont_store_passwords, "_p_void"; + } SVN::_Core::svn_auth_set_parameter($baton, $SVN::_Core::SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, - bless (\$dont_store_passwords, "_p_void")); + $val); } if (SVN::_Core::svn_config_get_bool($conf_t, $SVN::_Core::SVN_CONFIG_SECTION_AUTH, diff --git a/po/TEAMS b/po/TEAMS index 5e1f7e0b50..56274ad4f3 100644 --- a/po/TEAMS +++ b/po/TEAMS @@ -11,7 +11,7 @@ Leader: Alex Henrie Language: de (German) Repository: https://github.com/ralfth/git-po-de -Leader: Ralf Thielow +Leader: Ralf Thielow Members: Thomas Rast Jan Krüger Christian Stimming @@ -32,6 +32,10 @@ Repository: https://github.com/quizzlo/git-po-it/ Leader: Marco Paolone Members: Stefano Lattarini +Language: ko (Korean) +Repository: https://github.com/changwoo/git-l10n-ko/ +Leader: Changwoo Ryu + Language: pt_PT (Portuguese - Portugal) Repository: https://github.com/marcomsousa/git-l10n-pt_PT/ Leader: Marco Sousa diff --git a/po/bg.po b/po/bg.po index 164a766922..ac6f103e4d 100644 --- a/po/bg.po +++ b/po/bg.po @@ -60,17 +60,18 @@ # untracked cache кеш за неследените файлове # broken/corrupt повреден # restore възстановявам +# precious objects repo хранилище с важни обекти +# linked checkout свързано изтегляне +# term управляваща дума (за git-bisect) +# mergetag етикет при сливане +# delta - разлика, делта, обект-разлика # ---- -# FAILED to parse неуспешен анализ на... -> неразпозната стойност на -# blob обект BLOB +# „$var“ - може да не сработва за shell има gettext и eval_gettext - проверка - намират се лесно по „$ # ======================== # „“…— ●≫ѝ→ # -# stressed a -# форма̀та -# delta - разлика или делта # consistency between stdout - standard output/ stdin - standard input/ stderr - standard error -# mergetag етикет при сливане +# # # ======================== # RECHECK @@ -108,8 +109,8 @@ msgid "" msgstr "" "Project-Id-Version: git master\n" "Report-Msgid-Bugs-To: Git Mailing List \n" -"POT-Creation-Date: 2015-07-14 07:19+0800\n" -"PO-Revision-Date: 2015-07-14 19:05+0300\n" +"POT-Creation-Date: 2015-12-22 22:50+0800\n" +"PO-Revision-Date: 2015-12-28 11:32+0200\n" "Last-Translator: Alexander Shopov \n" "Language-Team: Bulgarian \n" "Language: bg\n" @@ -132,95 +133,107 @@ msgstr "" "Редактирайте ги в работното дърво, и тогава ползвайте „git add/rm ФАЙЛ“\n" "за да отбележите коригирането им. След това извършете подаването." -#: archive.c:11 +#: advice.c:101 builtin/merge.c:1225 +msgid "You have not concluded your merge (MERGE_HEAD exists)." +msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)." + +#: advice.c:103 +msgid "Please, commit your changes before merging." +msgstr "Промените трябва да се подадат преди сливане." + +#: advice.c:104 +msgid "Exiting because of unfinished merge." +msgstr "Изход от програмата заради незавършено сливане." + +#: archive.c:12 msgid "git archive [] [...]" msgstr "git archive [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]" -#: archive.c:12 +#: archive.c:13 msgid "git archive --list" msgstr "git archive --list" -#: archive.c:13 +#: archive.c:14 msgid "" "git archive --remote [--exec ] [] [...]" msgstr "" "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО " "[ПЪТ…]" -#: archive.c:14 +#: archive.c:15 msgid "git archive --remote [--exec ] --list" msgstr "git archive --remote ХРАНИЛИЩЕ [--exec КОМАНДА] --list" -#: archive.c:342 builtin/add.c:137 builtin/add.c:428 builtin/rm.c:327 +#: archive.c:344 builtin/add.c:137 builtin/add.c:420 builtin/rm.c:327 #, c-format msgid "pathspec '%s' did not match any files" msgstr "пътят „%s“ не съвпада с никой файл" -#: archive.c:427 +#: archive.c:429 msgid "fmt" msgstr "ФОРМАТ" -#: archive.c:427 +#: archive.c:429 msgid "archive format" msgstr "ФОРМАТ на архива" -#: archive.c:428 builtin/log.c:1204 +#: archive.c:430 builtin/log.c:1229 msgid "prefix" msgstr "префикс" -#: archive.c:429 +#: archive.c:431 msgid "prepend prefix to each pathname in the archive" msgstr "добавяне на този префикс към всеки път в архива" -#: archive.c:430 builtin/archive.c:88 builtin/blame.c:2516 -#: builtin/blame.c:2517 builtin/config.c:57 builtin/fast-export.c:986 -#: builtin/fast-export.c:988 builtin/grep.c:712 builtin/hash-object.c:99 -#: builtin/ls-files.c:446 builtin/ls-files.c:449 builtin/notes.c:394 -#: builtin/notes.c:557 builtin/read-tree.c:109 parse-options.h:150 +#: archive.c:432 builtin/archive.c:88 builtin/blame.c:2535 builtin/blame.c:2536 +#: builtin/config.c:58 builtin/fast-export.c:987 builtin/fast-export.c:989 +#: builtin/grep.c:707 builtin/hash-object.c:99 builtin/ls-files.c:446 +#: builtin/ls-files.c:449 builtin/notes.c:395 builtin/notes.c:558 +#: builtin/read-tree.c:109 parse-options.h:153 msgid "file" msgstr "файл" -#: archive.c:431 builtin/archive.c:89 +#: archive.c:433 builtin/archive.c:89 msgid "write the archive to this file" msgstr "запазване на архива в този файл" -#: archive.c:433 +#: archive.c:435 msgid "read .gitattributes in working directory" msgstr "изчитане на „.gitattributes“ в работната директория" -#: archive.c:434 +#: archive.c:436 msgid "report archived files on stderr" msgstr "извеждане на архивираните файлове на стандартната грешка" -#: archive.c:435 +#: archive.c:437 msgid "store only" msgstr "само съхранение без компресиране" -#: archive.c:436 +#: archive.c:438 msgid "compress faster" msgstr "бързо компресиране" -#: archive.c:444 +#: archive.c:446 msgid "compress better" msgstr "добро компресиране" -#: archive.c:447 +#: archive.c:449 msgid "list supported archive formats" msgstr "извеждане на списъка с поддържаните формати" -#: archive.c:449 builtin/archive.c:90 builtin/clone.c:77 +#: archive.c:451 builtin/archive.c:90 builtin/clone.c:77 msgid "repo" msgstr "хранилище" -#: archive.c:450 builtin/archive.c:91 +#: archive.c:452 builtin/archive.c:91 msgid "retrieve the archive from remote repository " msgstr "изтегляне на архива от отдалеченото ХРАНИЛИЩЕ" -#: archive.c:451 builtin/archive.c:92 builtin/notes.c:478 +#: archive.c:453 builtin/archive.c:92 builtin/notes.c:479 msgid "command" msgstr "команда" -#: archive.c:452 builtin/archive.c:93 +#: archive.c:454 builtin/archive.c:93 msgid "path to the remote git-upload-archive command" msgstr "път към отдалечената команда „git-upload-archive“" @@ -232,85 +245,85 @@ msgstr "" "Отрицателните шаблони се игнорират в атрибутите на git.\n" "Ако ви трябва начална удивителна, ползвайте „\\!“." -#: branch.c:60 +#: branch.c:61 #, c-format msgid "Not setting branch %s as its own upstream." msgstr "" "Клонът „%s“ не може да служи като източник за собствената си синхронизация." -#: branch.c:83 +#: branch.c:84 #, c-format msgid "Branch %s set up to track remote branch %s from %s by rebasing." msgstr "" "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“ чрез " "пребазиране." -#: branch.c:84 +#: branch.c:85 #, c-format msgid "Branch %s set up to track remote branch %s from %s." msgstr "Клонът „%s“ ще следи клона „%s“ от отдалеченото хранилище „%s“." -#: branch.c:88 +#: branch.c:89 #, c-format msgid "Branch %s set up to track local branch %s by rebasing." msgstr "" "Клонът „%s“ ще следи клона „%s“ от локалното хранилище чрез пребазиране." -#: branch.c:89 +#: branch.c:90 #, c-format msgid "Branch %s set up to track local branch %s." msgstr "Клонът „%s“ ще следи клона „%s“ от локалното хранилище." -#: branch.c:94 +#: branch.c:95 #, c-format msgid "Branch %s set up to track remote ref %s by rebasing." msgstr "Клонът „%s“ ще следи отдалечения указател „%s“ чрез пребазиране." -#: branch.c:95 +#: branch.c:96 #, c-format msgid "Branch %s set up to track remote ref %s." msgstr "Клонът „%s“ ще следи отдалечения указател „%s“." -#: branch.c:99 +#: branch.c:100 #, c-format msgid "Branch %s set up to track local ref %s by rebasing." msgstr "Клонът „%s“ ще следи локалния указател „%s“ чрез пребазиране." -#: branch.c:100 +#: branch.c:101 #, c-format msgid "Branch %s set up to track local ref %s." msgstr "Клонът „%s“ ще следи локалния указател „%s“." -#: branch.c:133 +#: branch.c:134 #, c-format msgid "Not tracking: ambiguous information for ref %s" msgstr "Няма следене: двусмислена информация за указателя „%s“" -#: branch.c:162 +#: branch.c:163 #, c-format msgid "'%s' is not a valid branch name." msgstr "„%s“ не е позволено име за клон." -#: branch.c:167 +#: branch.c:168 #, c-format msgid "A branch named '%s' already exists." msgstr "Вече съществува клон с име „%s“." -#: branch.c:175 +#: branch.c:176 msgid "Cannot force update the current branch." msgstr "Текущият клон не може да бъде принудително обновен." -#: branch.c:195 +#: branch.c:196 #, c-format msgid "Cannot setup tracking information; starting point '%s' is not a branch." msgstr "Зададените настройки за следенето са грешни — началото „%s“ не е клон." -#: branch.c:197 +#: branch.c:198 #, c-format msgid "the requested upstream branch '%s' does not exist" msgstr "заявеният отдалечен клон „%s“ не съществува" -#: branch.c:199 +#: branch.c:200 msgid "" "\n" "If you are planning on basing your work on an upstream\n" @@ -329,21 +342,26 @@ msgstr "" "може да използвате „git push -u“, за да настроите към кой клон да се " "изтласква." -#: branch.c:243 +#: branch.c:244 #, c-format msgid "Not a valid object name: '%s'." msgstr "Неправилно име на обект: „%s“" -#: branch.c:263 +#: branch.c:264 #, c-format msgid "Ambiguous object name: '%s'." msgstr "Двусмислено име на обект: „%s“" -#: branch.c:268 +#: branch.c:269 #, c-format msgid "Not a valid branch point: '%s'." msgstr "Неправилно място за начало на клон: „%s“" +#: branch.c:322 +#, c-format +msgid "'%s' is already checked out at '%s'" +msgstr "„%s“ вече е изтеглен в „%s“" + #: bundle.c:34 #, c-format msgid "'%s' does not look like a v2 bundle file" @@ -363,9 +381,9 @@ msgstr "„%s“ не може да се отвори" msgid "Repository lacks these prerequisite commits:" msgstr "В хранилището липсват следните необходими подавания:" -#: bundle.c:163 sequencer.c:650 sequencer.c:1105 builtin/blame.c:2705 -#: builtin/branch.c:651 builtin/commit.c:1045 builtin/log.c:330 -#: builtin/log.c:825 builtin/log.c:1432 builtin/log.c:1666 builtin/merge.c:358 +#: bundle.c:163 ref-filter.c:1372 sequencer.c:636 sequencer.c:1083 +#: builtin/blame.c:2734 builtin/commit.c:1045 builtin/log.c:334 +#: builtin/log.c:849 builtin/log.c:1461 builtin/log.c:1694 builtin/merge.c:358 #: builtin/shortlog.c:158 msgid "revision walk setup failed" msgstr "неуспешно настройване на обхождането на версиите" @@ -388,51 +406,49 @@ msgid_plural "The bundle requires these %d refs:" msgstr[0] "Пратката изисква следния указател:" msgstr[1] "Пратката изисква следните %d указатели:" -#: bundle.c:251 +#: bundle.c:253 msgid "Could not spawn pack-objects" msgstr "Командата „git pack-objects“ не може да бъде стартирана" -# FIXME better message -#: bundle.c:269 +#: bundle.c:264 msgid "pack-objects died" msgstr "Командата „git pack-objects“ не завърши успешно" -# FIXME better message -#: bundle.c:309 +#: bundle.c:304 msgid "rev-list died" msgstr "Командата „git rev-list“ не завърши успешно" -#: bundle.c:358 +#: bundle.c:353 #, c-format msgid "ref '%s' is excluded by the rev-list options" msgstr "" "указателят „%s“ не е бил включен поради опциите зададени на „git rev-list“" -#: bundle.c:437 builtin/log.c:153 builtin/log.c:1342 builtin/shortlog.c:261 +#: bundle.c:443 builtin/log.c:157 builtin/log.c:1369 builtin/shortlog.c:261 #, c-format msgid "unrecognized argument: %s" msgstr "непознат аргумент: %s" -#: bundle.c:443 +#: bundle.c:449 msgid "Refusing to create empty bundle." msgstr "Създаването на празна пратка е невъзможно." -#: bundle.c:453 +#: bundle.c:459 #, c-format msgid "cannot create '%s'" msgstr "Файлът „%s“ не може да бъде създаден" -# FIXME better message -#: bundle.c:474 +#: bundle.c:480 msgid "index-pack died" msgstr "Командата „git index-pack“ не завърши успешно" -#: color.c:260 +#: color.c:275 #, c-format msgid "invalid color value: %.*s" msgstr "неправилна стойност за цвят: %.*s" -#: commit.c:40 +#: commit.c:40 builtin/am.c:452 builtin/am.c:488 builtin/am.c:1520 +#: builtin/am.c:2149 #, c-format msgid "could not parse %s" msgstr "„%s“ не може да се анализира" @@ -591,24 +607,24 @@ msgstr "файлът с подредбата на съответствията msgid "Performing inexact rename detection" msgstr "Търсене на преименувания на обекти съчетани с промени" -#: diff.c:114 +#: diff.c:115 #, c-format msgid " Failed to parse dirstat cut-off percentage '%s'\n" msgstr "" " Неуспешно разпознаване на „%s“ като процент-праг за статистиката по " "директории\n" -#: diff.c:119 +#: diff.c:120 #, c-format msgid " Unknown dirstat parameter '%s'\n" msgstr " Непознат параметър „%s“ за статистиката по директории'\n" -#: diff.c:214 +#: diff.c:215 #, c-format msgid "Unknown value for 'diff.submodule' config variable: '%s'" msgstr "Непозната стойност „%s“ за настройката „diff.submodule“" -#: diff.c:266 +#: diff.c:267 #, c-format msgid "" "Found errors in 'diff.dirstat' config variable:\n" @@ -617,17 +633,17 @@ msgstr "" "Грешки в настройката „diff.dirstat“:\n" "%s" -#: diff.c:2997 +#: diff.c:3000 #, c-format msgid "external diff died, stopping at %s" msgstr "" "външната програма за разлики завърши неуспешно. Спиране на работата при „%s“" -#: diff.c:3393 +#: diff.c:3396 msgid "--follow requires exactly one pathspec" msgstr "Опцията „--follow“ изисква точно един път" -#: diff.c:3556 +#: diff.c:3559 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -636,37 +652,37 @@ msgstr "" "Неразпознат параметър към опцията „--dirstat/-X“:\n" "%s" -#: diff.c:3570 +#: diff.c:3573 #, c-format msgid "Failed to parse --submodule option parameter: '%s'" msgstr "Неразпознат параметър към опцията „--submodule“: „%s“" -#: dir.c:1852 +#: dir.c:1915 msgid "failed to get kernel name and information" msgstr "името и версията на ядрото не бяха получени" -#: dir.c:1945 +#: dir.c:1998 msgid "Untracked cache is disabled on this system." msgstr "Кеша за неследените файлове е изключен на тази система" -#: gpg-interface.c:129 gpg-interface.c:200 +#: gpg-interface.c:166 gpg-interface.c:237 msgid "could not run gpg." msgstr "Програмата „gpg“ не може да бъде стартирана." -#: gpg-interface.c:141 +#: gpg-interface.c:178 msgid "gpg did not accept the data" msgstr "Програмата „gpg“ не прие подадените данни." -#: gpg-interface.c:152 +#: gpg-interface.c:189 msgid "gpg failed to sign the data" msgstr "Програмата „gpg“ не подписа данните." -#: gpg-interface.c:185 +#: gpg-interface.c:222 #, c-format msgid "could not create temporary file '%s': %s" msgstr "Програмата „gpg“ не успя да създаде временния файл „%s“: %s" -#: gpg-interface.c:188 +#: gpg-interface.c:225 #, c-format msgid "failed writing detached signature to '%s': %s" msgstr "Програмата „gpg“ не успя да запише самостоятелния подпис към „%s“: %s" @@ -708,7 +724,6 @@ msgstr "" "Изглежда, че „%s“ е команда на git, но тя не може да\n" "бъде изпълнена. Вероятно пакетът „git-%s“ е повреден." -# FIXME bad message #: help.c:368 msgid "Uh oh. Your system reports no Git commands at all." msgstr "Странно, изглежда, че на системата ви няма нито една команда на git." @@ -753,20 +768,12 @@ msgstr[1] "" msgid "%s: %s - %s" msgstr "%s: %s — %s" -#: lockfile.c:345 -msgid "BUG: reopen a lockfile that is still open" -msgstr "ГРЕШКА В GIT: преотваряне на файл-ключалка" - -#: lockfile.c:347 -msgid "BUG: reopen a lockfile that has been committed" -msgstr "ГРЕШКА В GIT: преотваряне на файл-ключалка, който е подаден" - #: merge.c:41 msgid "failed to read the cache" msgstr "кешът не може да бъде прочетен" -#: merge.c:94 builtin/checkout.c:376 builtin/checkout.c:587 -#: builtin/clone.c:647 +#: merge.c:94 builtin/am.c:2022 builtin/am.c:2057 builtin/checkout.c:376 +#: builtin/checkout.c:587 builtin/clone.c:722 msgid "unable to write new index file" msgstr "неуспешно записване на новия индекс" @@ -784,67 +791,66 @@ msgstr "неуспешно изпълнение на „addinfo_cache“ за п msgid "error building trees" msgstr "грешка при изграждане на дърветата" -#: merge-recursive.c:687 +#: merge-recursive.c:686 #, c-format msgid "failed to create path '%s'%s" msgstr "грешка при създаването на пътя „%s“%s" -#: merge-recursive.c:698 +#: merge-recursive.c:697 #, c-format msgid "Removing %s to make room for subdirectory\n" msgstr "Изтриване на „%s“, за да се освободи място за поддиректория\n" -# FIXME better message -#: merge-recursive.c:712 merge-recursive.c:733 +#: merge-recursive.c:711 merge-recursive.c:732 msgid ": perhaps a D/F conflict?" msgstr ": възможно е да има конфликт директория/файл." -#: merge-recursive.c:723 +#: merge-recursive.c:722 #, c-format msgid "refusing to lose untracked file at '%s'" msgstr "" "преустановяване на действието, за да не се изтрие неследеният файл „%s“" -#: merge-recursive.c:763 +#: merge-recursive.c:762 #, c-format msgid "cannot read object %s '%s'" msgstr "обектът „%s“ (%s) не може да бъде прочетен" -#: merge-recursive.c:765 +#: merge-recursive.c:764 #, c-format msgid "blob expected for %s '%s'" msgstr "обектът „%s“ (%s) се очакваше да е BLOB, а не е" -#: merge-recursive.c:788 builtin/clone.c:306 +#: merge-recursive.c:787 builtin/clone.c:369 #, c-format msgid "failed to open '%s'" msgstr "директорията „%s“ не може да бъде отворена" -#: merge-recursive.c:796 +#: merge-recursive.c:795 #, c-format msgid "failed to symlink '%s'" msgstr "неуспешно създаване на символната връзка „%s“" -#: merge-recursive.c:799 +#: merge-recursive.c:798 #, c-format msgid "do not know what to do with %06o %s '%s'" msgstr "" "не е ясно какво да се прави с обекта „%2$s“ (%3$s) с права за достъп „%1$06o“" -#: merge-recursive.c:937 +#: merge-recursive.c:936 msgid "Failed to execute internal merge" msgstr "Неуспешно вътрешно сливане" -#: merge-recursive.c:941 +#: merge-recursive.c:940 #, c-format msgid "Unable to add %s to database" msgstr "„%s“ не може да се добави в базата с данни" -#: merge-recursive.c:957 +#: merge-recursive.c:956 msgid "unsupported object type in the tree" msgstr "в дървото има неподдържан вид обект" -#: merge-recursive.c:1032 merge-recursive.c:1046 +#: merge-recursive.c:1031 merge-recursive.c:1045 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -853,7 +859,7 @@ msgstr "" "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ " "е оставена в дървото." -#: merge-recursive.c:1038 merge-recursive.c:1051 +#: merge-recursive.c:1037 merge-recursive.c:1050 #, c-format msgid "" "CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left " @@ -862,20 +868,20 @@ msgstr "" "КОНФЛИКТ (%s/изтриване): „%s“ е изтрит в %s, а „%s“ в %s. Версия %s на „%s“ " "е оставена в дървото: %s." -#: merge-recursive.c:1092 +#: merge-recursive.c:1091 msgid "rename" msgstr "преименуване" -#: merge-recursive.c:1092 +#: merge-recursive.c:1091 msgid "renamed" msgstr "преименуван" -#: merge-recursive.c:1148 +#: merge-recursive.c:1147 #, c-format msgid "%s is a directory in %s adding as %s instead" msgstr "„%s“ е директория в „%s“, затова се добавя като „%s“" -#: merge-recursive.c:1170 +#: merge-recursive.c:1169 #, c-format msgid "" "CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s" @@ -884,151 +890,150 @@ msgstr "" "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон " "„%s“, а „%s“ е преименуван на „%s“ в „%s“/%s." -#: merge-recursive.c:1175 +#: merge-recursive.c:1174 msgid " (left unresolved)" msgstr " (некоригиран конфликт)" -#: merge-recursive.c:1229 +#: merge-recursive.c:1228 #, c-format msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s" msgstr "" "КОНФЛИКТ (преименуване/преименуване): „%s“ е преименуван на „%s“ в клон " "„%s“, а „%s“ е преименуван на „%s“ в „%s“" -#: merge-recursive.c:1259 +#: merge-recursive.c:1258 #, c-format msgid "Renaming %s to %s and %s to %s instead" msgstr "Преименуване на „%s“ на „%s“, а „%s“ на „%s“" -#: merge-recursive.c:1458 +#: merge-recursive.c:1457 #, c-format msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s" msgstr "" "КОНФЛИКТ (преименуване/добавяне): „%s“ е преименуван на „%s“ в клон „%s“, а " "„%s“ е добавен в „%s“" -#: merge-recursive.c:1468 +#: merge-recursive.c:1467 #, c-format msgid "Adding merged %s" msgstr "Добавяне на слетия „%s“" -#: merge-recursive.c:1473 merge-recursive.c:1671 +#: merge-recursive.c:1472 merge-recursive.c:1674 #, c-format msgid "Adding as %s instead" msgstr "Добавяне като „%s“" -#: merge-recursive.c:1524 +#: merge-recursive.c:1523 #, c-format msgid "cannot read object %s" msgstr "обектът „%s“ не може да се прочете" -#: merge-recursive.c:1527 +#: merge-recursive.c:1526 #, c-format msgid "object %s is not a blob" msgstr "обектът „%s“ не е BLOB" -#: merge-recursive.c:1575 +#: merge-recursive.c:1578 msgid "modify" msgstr "промяна" -#: merge-recursive.c:1575 +#: merge-recursive.c:1578 msgid "modified" msgstr "променен" -#: merge-recursive.c:1585 +#: merge-recursive.c:1588 msgid "content" msgstr "съдържание" -#: merge-recursive.c:1592 +#: merge-recursive.c:1595 msgid "add/add" msgstr "добавяне/добавяне" -#: merge-recursive.c:1626 +#: merge-recursive.c:1629 #, c-format msgid "Skipped %s (merged same as existing)" msgstr "Прескачане на „%s“ (слетият резултат е идентичен със сегашния)" -#: merge-recursive.c:1640 +#: merge-recursive.c:1643 #, c-format msgid "Auto-merging %s" msgstr "Автоматично сливане на „%s“" -#: merge-recursive.c:1644 git-submodule.sh:1150 +#: merge-recursive.c:1647 git-submodule.sh:1025 msgid "submodule" msgstr "ПОДМОДУЛ" -#: merge-recursive.c:1645 +#: merge-recursive.c:1648 #, c-format msgid "CONFLICT (%s): Merge conflict in %s" msgstr "КОНФЛИКТ (%s): Конфликт при сливане на „%s“" -#: merge-recursive.c:1731 +#: merge-recursive.c:1734 #, c-format msgid "Removing %s" msgstr "Изтриване на „%s“" -#: merge-recursive.c:1756 +#: merge-recursive.c:1759 msgid "file/directory" msgstr "файл/директория" -#: merge-recursive.c:1762 +#: merge-recursive.c:1765 msgid "directory/file" msgstr "директория/файл" -#: merge-recursive.c:1767 +#: merge-recursive.c:1770 #, c-format msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s" msgstr "" "КОНФЛИКТ (%s): Съществува директория на име „%s“ в „%s“. Добавяне на „%s“ " "като „%s“" -#: merge-recursive.c:1777 +#: merge-recursive.c:1780 #, c-format msgid "Adding %s" msgstr "Добавяне на „%s“" -#: merge-recursive.c:1794 +#: merge-recursive.c:1797 msgid "Fatal merge failure, shouldn't happen." msgstr "Фатална грешка при сливане, а такава не трябва да възниква!" -#: merge-recursive.c:1813 +#: merge-recursive.c:1816 msgid "Already up-to-date!" msgstr "Вече е обновено!" -#: merge-recursive.c:1822 +#: merge-recursive.c:1825 #, c-format msgid "merging of trees %s and %s failed" msgstr "неуспешно сливане на дърветата „%s“ и „%s“" -# FIXME message -#: merge-recursive.c:1852 +#: merge-recursive.c:1855 #, c-format msgid "Unprocessed path??? %s" msgstr "" "Пътят „%s“ не е обработен, това е грешка в Git, докладвайте я на " "разработчиците, като пратите е-писмо на адрес: „git@vger.kernel.org“." -#: merge-recursive.c:1900 +#: merge-recursive.c:1903 msgid "Merging:" msgstr "Сливане:" -#: merge-recursive.c:1913 +#: merge-recursive.c:1916 #, c-format msgid "found %u common ancestor:" msgid_plural "found %u common ancestors:" msgstr[0] "открит е %u общ предшественик:" msgstr[1] "открити са %u общи предшественици:" -#: merge-recursive.c:1950 +#: merge-recursive.c:1953 msgid "merge returned no commit" msgstr "сливането не върна подаване" -#: merge-recursive.c:2007 +#: merge-recursive.c:2010 #, c-format msgid "Could not parse object '%s'" msgstr "Неуспешен анализ на обекта „%s“" -#: merge-recursive.c:2018 builtin/merge.c:645 +#: merge-recursive.c:2021 builtin/merge.c:645 msgid "Unable to write index." msgstr "Индексът не може да бъде прочетен" @@ -1037,12 +1042,12 @@ msgid "Cannot commit uninitialized/unreferenced notes tree" msgstr "" "Неинициализирано или нереферирано дърво за бележки не може да бъде подадено" -#: notes-utils.c:82 +#: notes-utils.c:100 #, c-format msgid "Bad notes.rewriteMode value: '%s'" msgstr "Неправилна стойност за „notes.rewriteMode“: „%s“" -#: notes-utils.c:92 +#: notes-utils.c:110 #, c-format msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" msgstr "" @@ -1050,7 +1055,7 @@ msgstr "" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value -#: notes-utils.c:119 +#: notes-utils.c:137 #, c-format msgid "Bad %s value: '%s'" msgstr "Зададена е лоша стойност на променливата „%s“: „%s“" @@ -1060,31 +1065,41 @@ msgstr "Зададена е лоша стойност на променлива msgid "unable to parse object: %s" msgstr "обектът „%s“ не може да бъде анализиран" -#: parse-options.c:546 +#: parse-options.c:570 msgid "..." msgstr "…" -#: parse-options.c:564 +#: parse-options.c:588 #, c-format msgid "usage: %s" msgstr "употреба: %s" #. TRANSLATORS: the colon here should align with the #. one in "usage: %s" translation -#: parse-options.c:568 +#: parse-options.c:592 #, c-format msgid " or: %s" msgstr " или: %s" -#: parse-options.c:571 +#: parse-options.c:595 #, c-format msgid " %s" msgstr " %s" -#: parse-options.c:605 +#: parse-options.c:629 msgid "-NUM" msgstr "-ЧИСЛО" +#: parse-options-cb.c:108 +#, c-format +msgid "malformed object name '%s'" +msgstr "неправилно име на обект „%s“" + +#: path.c:752 +#, c-format +msgid "Could not make %s writable by group" +msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата" + #: pathspec.c:133 msgid "global 'glob' and 'noglob' pathspec settings are incompatible" msgstr "глобалните настройки за пътища „glob“ и „noglob“ са несъвместими" @@ -1149,15 +1164,15 @@ msgstr "" "Нищо не се изключва от шаблоните за изключване.\n" "Това често се случва, ако сте забравили да добавите „:/“ или „.“." -#: pretty.c:968 +#: pretty.c:969 msgid "unable to parse --pretty format" msgstr "аргументът към опцията „--pretty“ не може да се анализира" -#: progress.c:236 +#: progress.c:235 msgid "done" msgstr "действието завърши" -#: read-cache.c:1295 +#: read-cache.c:1281 #, c-format msgid "" "index.version set, but the value is invalid.\n" @@ -1166,7 +1181,7 @@ msgstr "" "Зададена е неправилна стойност на настройката „index.version“.\n" "Ще се ползва версия %i" -#: read-cache.c:1305 +#: read-cache.c:1291 #, c-format msgid "" "GIT_INDEX_VERSION set, but the value is invalid.\n" @@ -1176,95 +1191,165 @@ msgstr "" "„GIT_INDEX_VERSION“.\n" "Ще се ползва версия %i" -#: remote.c:792 +#: refs.c:543 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973 +#: builtin/merge.c:983 +#, c-format +msgid "Could not open '%s' for writing" +msgstr "„%s“ не може да бъде отворен за запис" + +#: refs/files-backend.c:2359 +#, c-format +msgid "could not delete reference %s: %s" +msgstr "Указателят „%s“ не може да бъде изтрит: %s" + +#: refs/files-backend.c:2362 +#, c-format +msgid "could not delete references: %s" +msgstr "Указателите не може да бъдат изтрити: %s" + +#: refs/files-backend.c:2371 +#, c-format +msgid "could not remove reference %s" +msgstr "Указателят „%s“ не може да бъде изтрит" + +#: ref-filter.c:245 +#, c-format +msgid "format: %%(end) atom used without corresponding atom" +msgstr "грешка във форма̀та: лексемата %%(end) е използвана без съответната ѝ" + +#: ref-filter.c:704 +#, c-format +msgid "positive value expected contents:lines=%s" +msgstr "очаква се положителна стойност за „contents:lines=%s“" + +#: ref-filter.c:833 +#, c-format +msgid "expected format: %%(color:)" +msgstr "очакван формат: %%(color:ЦВЯТ)" + +#: ref-filter.c:835 +msgid "unable to parse format" +msgstr "форматът не може да бъде анализиран" + +#: ref-filter.c:870 +#, c-format +msgid "expected format: %%(align:,)" +msgstr "очакван формат: %%(align:ШИРОЧИНА,ПОЗИЦИЯ)" + +#: ref-filter.c:893 +#, c-format +msgid "improper format entered align:%s" +msgstr "въведен е неправилен формат align:%s" + +#: ref-filter.c:898 +#, c-format +msgid "positive width expected with the %%(align) atom" +msgstr "очаква се положителна широчина с лексемата „%%(align)“" + +#: ref-filter.c:1219 +#, c-format +msgid "malformed object at '%s'" +msgstr "обект със сгрешен формат при „%s“" + +#: ref-filter.c:1561 +#, c-format +msgid "format: %%(end) atom missing" +msgstr "грешка във форма̀та: липсва лексемата %%(end)" + +#: ref-filter.c:1615 +#, c-format +msgid "malformed object name %s" +msgstr "неправилно име на обект „%s“" + +#: remote.c:756 #, c-format msgid "Cannot fetch both %s and %s to %s" msgstr "Невъзможно е да се доставят едновременно и „%s“, и „%s“ към „%s“" -#: remote.c:796 +#: remote.c:760 #, c-format msgid "%s usually tracks %s, not %s" msgstr "„%s“ обикновено следи „%s“, а не „%s“" -#: remote.c:800 +#: remote.c:764 #, c-format msgid "%s tracks both %s and %s" msgstr "„%s“ следи както „%s“, така и „%s“" -#: remote.c:808 +#: remote.c:772 msgid "Internal error" msgstr "Вътрешна грешка" -#: remote.c:1723 remote.c:1766 +#: remote.c:1687 remote.c:1730 msgid "HEAD does not point to a branch" msgstr "Указателят „HEAD“ не сочи към клон" -#: remote.c:1732 +#: remote.c:1696 #, c-format msgid "no such branch: '%s'" msgstr "няма клон на име „%s“" -#: remote.c:1735 +#: remote.c:1699 #, c-format msgid "no upstream configured for branch '%s'" msgstr "не е зададен клон-източник за клона „%s“" -#: remote.c:1741 +#: remote.c:1705 #, c-format msgid "upstream branch '%s' not stored as a remote-tracking branch" msgstr "клонът-източник „%s“ не е съхранен като следящ клон" -#: remote.c:1756 +#: remote.c:1720 #, c-format msgid "push destination '%s' on remote '%s' has no local tracking branch" msgstr "" "липсва локален следящ клон за местоположението за изтласкване „%s“ в " "хранилището „%s“" -#: remote.c:1771 +#: remote.c:1735 #, c-format msgid "branch '%s' has no remote for pushing" msgstr "няма информация клонът „%s“ да следи някой друг" -#: remote.c:1782 +#: remote.c:1746 #, c-format msgid "push refspecs for '%s' do not include '%s'" msgstr "указателят за изтласкване на „%s“ не включва „%s“" -#: remote.c:1795 +#: remote.c:1759 msgid "push has no destination (push.default is 'nothing')" msgstr "указателят за изтласкване не включва цел („push.default“ е „nothing“)" -#: remote.c:1817 +#: remote.c:1781 msgid "cannot resolve 'simple' push to a single destination" msgstr "простото (simple) изтласкване не съответства на една цел" -#: remote.c:2124 +#: remote.c:2083 #, c-format msgid "Your branch is based on '%s', but the upstream is gone.\n" msgstr "Този клон следи „%s“, но следеният клон е изтрит.\n" -#: remote.c:2128 +#: remote.c:2087 msgid " (use \"git branch --unset-upstream\" to fixup)\n" msgstr " (за да коригирате това, използвайте „git branch --unset-upstream“)\n" -#: remote.c:2131 +#: remote.c:2090 #, c-format msgid "Your branch is up-to-date with '%s'.\n" msgstr "Клонът е актуализиран към „%s“.\n" -#: remote.c:2135 +#: remote.c:2094 #, 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:2141 +#: remote.c:2100 msgid " (use \"git push\" to publish your local commits)\n" msgstr " (публикувайте локалните си промени чрез „git push“)\n" -#: remote.c:2144 +#: remote.c:2103 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -1274,11 +1359,11 @@ msgstr[0] "" msgstr[1] "" "Клонът ви е с %2$d подавания зад „%1$s“ и може да бъде тривиално слят.\n" -#: remote.c:2152 +#: remote.c:2111 msgid " (use \"git pull\" to update your local branch)\n" msgstr " (обновете локалния си клон чрез „git pull“)\n" -#: remote.c:2155 +#: remote.c:2114 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -1293,49 +1378,54 @@ msgstr[1] "" "Текущият клон се е отделил от „%s“,\n" "двата имат съответно по %d и %d несъвпадащи подавания.\n" -#: remote.c:2165 +#: remote.c:2124 msgid " (use \"git pull\" to merge the remote branch into yours)\n" msgstr " (слейте отдалечения клон в локалния чрез „git pull“)\n" -#: revision.c:2366 +#: revision.c:2193 +msgid "your current branch appears to be broken" +msgstr "Текущият клон е повреден" + +#: revision.c:2196 +#, c-format +msgid "your current branch '%s' does not have any commits yet" +msgstr "Текущият клон „%s“ е без подавания " + +#: revision.c:2390 msgid "--first-parent is incompatible with --bisect" msgstr "опциите „--first-parent“ и „--bisect“ са несъвместими" -#: run-command.c:83 +#: run-command.c:90 msgid "open /dev/null failed" msgstr "неуспешно отваряне на „/dev/null“" -#: run-command.c:85 +#: run-command.c:92 #, c-format msgid "dup2(%d,%d) failed" msgstr "неуспешно изпълнение на dup2(%d,%d)" -#: send-pack.c:272 +#: send-pack.c:295 msgid "failed to sign the push certificate" msgstr "сертификатът за изтласкване не може да бъде подписан" -#: send-pack.c:378 +#: send-pack.c:404 msgid "the receiving end does not support --signed push" msgstr "отсрещната страна не поддържа изтласкване с опцията „--signed“" -#: send-pack.c:389 +#: send-pack.c:406 +msgid "" +"not sending a push certificate since the receiving end does not support --" +"signed push" +msgstr "" +"отсрещната страна не поддържа изтласкване с опцията „--signed“, затова не се " +"използва сертификат" + +#: send-pack.c:418 msgid "the receiving end does not support --atomic push" msgstr "получаващата страна не поддържа изтласкване с опцията „--atomic“" -#: sequencer.c:172 builtin/merge.c:760 builtin/merge.c:871 builtin/merge.c:973 -#: builtin/merge.c:983 -#, c-format -msgid "Could not open '%s' for writing" -msgstr "„%s“ не може да бъде отворен за запис" - -#: sequencer.c:174 builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975 -#: builtin/merge.c:988 -#, c-format -msgid "Could not write to '%s'" -msgstr "„%s“ не може да бъде записан" - # FIXME git add for consistence -#: sequencer.c:195 +#: sequencer.c:183 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add ' or 'git rm '" @@ -1343,7 +1433,7 @@ msgstr "" "след коригирането на конфликтите, отбележете съответните\n" "пътища с „git add ПЪТ…“ или „git rm ПЪТ…“." -#: sequencer.c:198 +#: sequencer.c:186 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add ' or 'git rm '\n" @@ -1354,237 +1444,236 @@ msgstr "" "подайте резултата с командата „git commit'“." # FIXME - must be the same as Could not write to '%s' above -#: sequencer.c:211 sequencer.c:861 sequencer.c:944 +#: sequencer.c:199 sequencer.c:842 sequencer.c:922 #, c-format msgid "Could not write to %s" msgstr "„%s“ не може да бъде записан" -# FIXME wrap up as ffinishing the work on, in fact, full stop at end for consistency with below -#: sequencer.c:214 +#: sequencer.c:202 #, c-format msgid "Error wrapping up %s" msgstr "Обработката на „%s“ не завърши успешно." -#: sequencer.c:229 +#: sequencer.c:217 msgid "Your local changes would be overwritten by cherry-pick." msgstr "Локалните ви промени ще бъдат презаписани при отбирането на подавания." -#: sequencer.c:231 +#: sequencer.c:219 msgid "Your local changes would be overwritten by revert." msgstr "Локалните ви промени ще бъдат презаписани при отмяната на подавания." -#: sequencer.c:234 +#: sequencer.c:222 msgid "Commit your changes or stash them to proceed." msgstr "Подайте или скатайте промените, за да продължите" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:321 +#: sequencer.c:309 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: новият индекс не може да бъде запазен" -#: sequencer.c:339 +#: sequencer.c:327 msgid "Could not resolve HEAD commit\n" msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито\n" -#: sequencer.c:359 +#: sequencer.c:347 msgid "Unable to update cache tree\n" msgstr "Дървото на кеша не може да бъде обновено\n" -#: sequencer.c:411 +#: sequencer.c:399 #, c-format msgid "Could not parse commit %s\n" msgstr "Подаването „%s“ не може да бъде анализирано\n" -#: sequencer.c:416 +#: sequencer.c:404 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Родителското подаване „%s“ не може да бъде анализирано\n" -#: sequencer.c:482 +#: sequencer.c:469 msgid "Your index file is unmerged." msgstr "Индексът не е слят." -#: sequencer.c:501 +#: sequencer.c:488 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "Подаването „%s“ е сливане, но не е дадена опцията „-m“" -#: sequencer.c:509 +#: sequencer.c:496 #, c-format msgid "Commit %s does not have parent %d" msgstr "Подаването „%s“ няма родител %d" -#: sequencer.c:513 +#: sequencer.c:500 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "Указано е базово подаване, но подаването „%s“ не е сливане." #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:526 +#: sequencer.c:513 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: неразпозната стойност за родителското подаване „%s“" -#: sequencer.c:530 +#: sequencer.c:517 #, c-format msgid "Cannot get commit message for %s" msgstr "Неуспешно извличане на съобщението за подаване на „%s“" -#: sequencer.c:616 +#: sequencer.c:603 #, c-format msgid "could not revert %s... %s" msgstr "подаването „%s“… не може да бъде отменено: „%s“" -#: sequencer.c:617 +#: sequencer.c:604 #, c-format msgid "could not apply %s... %s" msgstr "подаването „%s“… не може да бъде приложено: „%s“" -#: sequencer.c:653 +#: sequencer.c:639 msgid "empty commit set passed" msgstr "зададено е празно множество от подавания" -#: sequencer.c:661 +#: sequencer.c:647 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: неуспешно изчитане на индекса" -#: sequencer.c:665 +#: sequencer.c:651 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: неуспешно обновяване на индекса" -#: sequencer.c:725 +#: sequencer.c:711 #, c-format msgid "Cannot %s during a %s" msgstr "По време на „%1$s“ не може да се извърши „%2$s“" -#: sequencer.c:747 +#: sequencer.c:733 #, c-format msgid "Could not parse line %d." msgstr "%d-ят ред не може да се анализира." -#: sequencer.c:752 +#: sequencer.c:738 msgid "No commits parsed." msgstr "Никое от подаванията не може да се разпознае." # FIXME Could not open %s. - full stop for consistence with next message -#: sequencer.c:765 +#: sequencer.c:750 #, c-format msgid "Could not open %s" msgstr "„%s“ не може да се прочете." -#: sequencer.c:769 +#: sequencer.c:754 #, c-format msgid "Could not read %s." msgstr "„%s“ не може да се отвори." -#: sequencer.c:776 +#: sequencer.c:761 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Файлът с описание на предстоящите действия — „%s“ не може да се ползва" -#: sequencer.c:806 +#: sequencer.c:791 #, c-format msgid "Invalid key: %s" msgstr "Неправилен ключ: „%s“" -#: sequencer.c:809 +#: sequencer.c:794 builtin/pull.c:47 builtin/pull.c:49 #, c-format msgid "Invalid value for %s: %s" msgstr "Неправилна стойност за „%s“: „%s“" -#: sequencer.c:821 +#: sequencer.c:804 #, c-format msgid "Malformed options sheet: %s" msgstr "Неправилно съдържание на файла с опции: „%s“" -#: sequencer.c:842 +#: sequencer.c:823 msgid "a cherry-pick or revert is already in progress" msgstr "" "в момента вече се извършва отбиране на подавания или пребазиране на клона" -#: sequencer.c:843 +#: sequencer.c:824 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "използвайте „git cherry-pick (--continue | --quit | --abort)“" -#: sequencer.c:847 +#: sequencer.c:828 #, c-format msgid "Could not create sequencer directory %s" msgstr "Директорията за секвенсора „%s“ не може да бъде създадена" -#: sequencer.c:863 sequencer.c:948 +#: sequencer.c:844 sequencer.c:926 #, c-format msgid "Error wrapping up %s." msgstr "Обработката на „%s“ не завърши успешно." -#: sequencer.c:882 sequencer.c:1018 +#: sequencer.c:863 sequencer.c:996 msgid "no cherry-pick or revert in progress" msgstr "" "в момента не се извършва отбиране на подавания или пребазиране на клона" -#: sequencer.c:884 +#: sequencer.c:865 msgid "cannot resolve HEAD" msgstr "Подаването сочено от указателя „HEAD“ не може да бъде открито" -#: sequencer.c:886 +#: sequencer.c:867 msgid "cannot abort from a branch yet to be born" msgstr "" "действието не може да бъде преустановено, когато сте на клон, който тепърва " "предстои да бъде създаден" -#: sequencer.c:908 builtin/apply.c:4291 +#: sequencer.c:887 builtin/apply.c:4287 #, c-format msgid "cannot open %s: %s" msgstr "файлът „%s“ не може да бъде отворен: %s" -#: sequencer.c:911 +#: sequencer.c:890 #, c-format msgid "cannot read %s: %s" msgstr "файлът „%s“ не може да бъде прочетен: %s" -#: sequencer.c:912 +#: sequencer.c:891 msgid "unexpected end of file" msgstr "неочакван край на файл" -#: sequencer.c:918 +#: sequencer.c:897 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" "запазеният преди започването на отбирането файл за указателя „HEAD“ — „%s“ е " "повреден" -#: sequencer.c:941 +#: sequencer.c:919 #, c-format msgid "Could not format %s." msgstr "Файлът „%s“ не може да се форматира по подходящия начин." -#: sequencer.c:1086 +#: sequencer.c:1064 #, c-format msgid "%s: can't cherry-pick a %s" msgstr "%s: не може да се отбере „%s“" -#: sequencer.c:1089 +#: sequencer.c:1067 #, c-format msgid "%s: bad revision" msgstr "%s: неправилна версия" -#: sequencer.c:1123 +#: sequencer.c:1101 msgid "Can't revert as initial commit" msgstr "Първоначалното подаване не може да бъде отменено" -#: sequencer.c:1124 +#: sequencer.c:1102 msgid "Can't cherry-pick into empty head" msgstr "При празен връх не могат да се отбират подавания" -#: setup.c:243 +#: setup.c:248 #, c-format msgid "failed to read %s" msgstr "файлът „%s“ не може да бъде прочетен" -#: sha1_name.c:453 +#: sha1_name.c:463 msgid "" "Git normally never creates a ref that ends with 40 hex characters\n" "because it will be ignored when you just specify 40-hex. These refs\n" @@ -1608,32 +1697,32 @@ msgstr "" "спрете това съобщение като изпълните командата:\n" "„git config advice.objectNameWarning false“" -#: submodule.c:64 submodule.c:98 +#: submodule.c:61 submodule.c:95 msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first" msgstr "" "Неслетите файлове „.gitmodules“ не могат да бъдат променяни. Първо " "коригирайте конфликтите" -#: submodule.c:68 submodule.c:102 +#: submodule.c:65 submodule.c:99 #, c-format msgid "Could not find section in .gitmodules where path=%s" msgstr "Във файла „.gitmodules“ липсва раздел за директория „path=%s“" -#: submodule.c:76 +#: submodule.c:73 #, c-format msgid "Could not update .gitmodules entry %s" msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде променен" -#: submodule.c:109 +#: submodule.c:106 #, c-format msgid "Could not remove .gitmodules entry for %s" msgstr "Записът „%s“ във файла „.gitmodules“ не може да бъде изтрит" -#: submodule.c:120 +#: submodule.c:117 msgid "staging updated .gitmodules failed" msgstr "неуспешно добавяне на променения файл „.gitmodules“ в индекса" -#: submodule.c:1115 +#: submodule.c:1040 #, c-format msgid "Could not set core.worktree in %s" msgstr "Настройката „core.worktree“ не може да се зададе в „%s“" @@ -1644,7 +1733,7 @@ msgstr "Настройката „core.worktree“ не може да се за msgid "unknown value '%s' for key '%s'" msgstr "неправилна стойност „%s“ за настройката „%s“" -#: trailer.c:543 trailer.c:548 builtin/remote.c:290 +#: trailer.c:543 trailer.c:548 builtin/remote.c:296 #, c-format msgid "more than one %s" msgstr "стойността „%s“ се повтаря в настройките" @@ -1663,6 +1752,11 @@ msgstr "входният файл „%s“ не може да бъде проч msgid "could not read from stdin" msgstr "от стандартния вход не може да се чете" +#: transport-helper.c:1025 +#, c-format +msgid "Could not read ref %s" +msgstr "Указателят „%s“ не може да се прочете." + #: unpack-trees.c:203 msgid "Checking out files" msgstr "Изтегляне на файлове" @@ -1696,203 +1790,210 @@ msgstr "неправилен номер на порт" msgid "invalid '..' path segment" msgstr "неправилна част от пътя „..“" -#: wrapper.c:523 +#: wrapper.c:219 wrapper.c:362 +#, c-format +msgid "could not open '%s' for reading and writing" +msgstr "„%s“ не може да бъде отворен и за четене, и за запис" + +#: wrapper.c:221 wrapper.c:364 +#, c-format +msgid "could not open '%s' for writing" +msgstr "„%s“ не може да бъде отворен за запис" + +#: wrapper.c:223 wrapper.c:366 builtin/am.c:338 builtin/commit.c:1691 +#: builtin/merge.c:1074 builtin/pull.c:380 +#, c-format +msgid "could not open '%s' for reading" +msgstr "файлът не може да бъде прочетен: „%s“" + +#: wrapper.c:579 #, c-format msgid "unable to access '%s': %s" msgstr "няма достъп до „%s“: %s" -#: wrapper.c:544 +#: wrapper.c:600 #, c-format msgid "unable to access '%s'" msgstr "няма достъп до „%s“" -#: wrapper.c:555 -#, c-format -msgid "unable to look up current user in the passwd file: %s" -msgstr "текущият потребител не може да бъде открит във файла „/etc/passwd“: %s" - -#: wrapper.c:556 -msgid "no such user" -msgstr "такъв потребител не съществува" - -#: wrapper.c:564 +#: wrapper.c:608 msgid "unable to get current working directory" msgstr "текущата работна директория е недостъпна" -#: wrapper.c:575 +#: wrapper.c:635 #, c-format msgid "could not open %s for writing" msgstr "„%s“ не може да бъде отворен за запис" # FIXME - must be the same as Could not write to '%s' above -#: wrapper.c:587 +#: wrapper.c:646 builtin/am.c:425 #, c-format msgid "could not write to %s" msgstr "„%s“ не може да бъде записан" -#: wrapper.c:593 +#: wrapper.c:652 #, c-format msgid "could not close %s" msgstr "„%s“ не може да се затвори" -#: wt-status.c:150 +#: wt-status.c:149 msgid "Unmerged paths:" msgstr "Неслети пътища:" -#: wt-status.c:177 wt-status.c:204 +#: wt-status.c:176 wt-status.c:203 #, c-format msgid " (use \"git reset %s ...\" to unstage)" msgstr " (използвайте „git reset %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)" -#: wt-status.c:179 wt-status.c:206 +#: wt-status.c:178 wt-status.c:205 msgid " (use \"git rm --cached ...\" to unstage)" msgstr "" " (използвайте „git rm --cached %s ФАЙЛ…“, за да извадите ФАЙЛа от индекса)" -#: wt-status.c:183 +#: wt-status.c:182 msgid " (use \"git add ...\" to mark resolution)" msgstr "" " (използвайте „git add ФАЙЛ…“, за да укажете разрешаването на конфликта)" -#: wt-status.c:185 wt-status.c:189 +#: wt-status.c:184 wt-status.c:188 msgid " (use \"git add/rm ...\" as appropriate to mark resolution)" msgstr "" " (използвайте „git add/rm ФАЙЛ…“, според решението, което избирате за " "конфликта)" -#: wt-status.c:187 +#: wt-status.c:186 msgid " (use \"git rm ...\" to mark resolution)" msgstr "" " (използвайте „git rm ФАЙЛ…“, за да укажете разрешаването на конфликта)" -#: wt-status.c:198 wt-status.c:881 +#: wt-status.c:197 wt-status.c:880 msgid "Changes to be committed:" msgstr "Промени, които ще бъдат подадени:" -#: wt-status.c:216 wt-status.c:890 +#: wt-status.c:215 wt-status.c:889 msgid "Changes not staged for commit:" msgstr "Промени, които не са в индекса за подаване:" -#: wt-status.c:220 +#: wt-status.c:219 msgid " (use \"git add ...\" to update what will be committed)" msgstr "" " (използвайте „git add ФАЙЛ…“, за да обновите съдържанието за подаване)" -#: wt-status.c:222 +#: wt-status.c:221 msgid " (use \"git add/rm ...\" to update what will be committed)" msgstr "" " (използвайте „git add/rm ФАЙЛ…“, за да обновите съдържанието за подаване)" -#: wt-status.c:223 +#: wt-status.c:222 msgid "" " (use \"git checkout -- ...\" to discard changes in working directory)" msgstr "" " (използвайте „git checkout -- ФАЙЛ…“, за да отхвърлите промените в " "работното дърво)" -#: wt-status.c:225 +#: wt-status.c:224 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" " (подайте или отхвърлете неследеното или промененото съдържание в " "подмодулите)" -#: wt-status.c:237 +#: wt-status.c:236 #, c-format msgid " (use \"git %s ...\" to include in what will be committed)" msgstr "" " (използвайте „git %s ФАЙЛ…“, за да определите какво включвате в подаването)" -#: wt-status.c:252 +#: wt-status.c:251 msgid "both deleted:" msgstr "изтрити в двата случая:" -#: wt-status.c:254 +#: wt-status.c:253 msgid "added by us:" msgstr "добавени от вас:" -#: wt-status.c:256 +#: wt-status.c:255 msgid "deleted by them:" msgstr "изтрити от тях:" -#: wt-status.c:258 +#: wt-status.c:257 msgid "added by them:" msgstr "добавени от тях:" -#: wt-status.c:260 +#: wt-status.c:259 msgid "deleted by us:" msgstr "изтрити от вас:" -#: wt-status.c:262 +#: wt-status.c:261 msgid "both added:" msgstr "добавени и в двата случая:" -#: wt-status.c:264 +#: wt-status.c:263 msgid "both modified:" msgstr "променени и в двата случая:" -#: wt-status.c:266 +#: wt-status.c:265 #, c-format msgid "bug: unhandled unmerged status %x" msgstr "грешка: състоянието на промяната „%x“ не може да бъде обработено" -#: wt-status.c:274 +#: wt-status.c:273 msgid "new file:" msgstr "нов файл:" -#: wt-status.c:276 +#: wt-status.c:275 msgid "copied:" msgstr "копиран:" -#: wt-status.c:278 +#: wt-status.c:277 msgid "deleted:" msgstr "изтрит:" -#: wt-status.c:280 +#: wt-status.c:279 msgid "modified:" msgstr "променен:" -#: wt-status.c:282 +#: wt-status.c:281 msgid "renamed:" msgstr "преименуван:" -#: wt-status.c:284 +#: wt-status.c:283 msgid "typechange:" msgstr "смяна на вида:" -#: wt-status.c:286 +#: wt-status.c:285 msgid "unknown:" msgstr "непозната промяна:" -#: wt-status.c:288 +#: wt-status.c:287 msgid "unmerged:" msgstr "неслят:" -#: wt-status.c:370 +#: wt-status.c:369 msgid "new commits, " msgstr "нови подавания, " -#: wt-status.c:372 +#: wt-status.c:371 msgid "modified content, " msgstr "променено съдържание, " -#: wt-status.c:374 +#: wt-status.c:373 msgid "untracked content, " msgstr "неследено съдържание, " -#: wt-status.c:391 +#: wt-status.c:390 #, c-format msgid "bug: unhandled diff status %c" msgstr "грешка: състоянието на промяната „%c“ не може да бъде обработено" -#: wt-status.c:755 +#: wt-status.c:754 msgid "Submodules changed but not updated:" msgstr "Подмодулите са променени, но не са обновени:" -#: wt-status.c:757 +#: wt-status.c:756 msgid "Submodule changes to be committed:" msgstr "Промени в подмодулите за подаване:" -#: wt-status.c:838 +#: wt-status.c:837 msgid "" "Do not touch the line above.\n" "Everything below will be removed." @@ -1900,193 +2001,229 @@ msgstr "" "Не променяйте горния ред.\n" "Всичко отдолу ще бъде изтрито." -#: wt-status.c:949 +#: wt-status.c:948 msgid "You have unmerged paths." msgstr "Някои пътища не са слети." -#: wt-status.c:952 +#: wt-status.c:951 msgid " (fix conflicts and run \"git commit\")" msgstr " (коригирайте конфликтите и изпълнете „git commit“)" -#: wt-status.c:955 +#: wt-status.c:954 msgid "All conflicts fixed but you are still merging." msgstr "Всички конфликти са решени, но продължавате сливането." -#: wt-status.c:958 +#: wt-status.c:957 msgid " (use \"git commit\" to conclude merge)" msgstr " (използвайте „git commit“, за да завършите сливането)" -#: wt-status.c:968 +#: wt-status.c:967 msgid "You are in the middle of an am session." msgstr "В момента прилагате поредица от кръпки чрез „git am“." -#: wt-status.c:971 +#: wt-status.c:970 msgid "The current patch is empty." msgstr "Текущата кръпка е празна." -#: wt-status.c:975 +#: wt-status.c:974 msgid " (fix conflicts and then run \"git am --continue\")" msgstr " (коригирайте конфликтите и изпълнете „git am --continue“)" -#: wt-status.c:977 +#: wt-status.c:976 msgid " (use \"git am --skip\" to skip this patch)" msgstr " (използвайте „git am --skip“, за да пропуснете тази кръпка)" -#: wt-status.c:979 +#: wt-status.c:978 msgid " (use \"git am --abort\" to restore the original branch)" msgstr "" " (използвайте „git am --abort“, за да възстановите първоначалния клон)" -#: wt-status.c:1039 wt-status.c:1056 +#: wt-status.c:1105 +msgid "No commands done." +msgstr "Не са изпълнени команди." + +#: wt-status.c:1108 +#, c-format +msgid "Last command done (%d command done):" +msgid_plural "Last commands done (%d commands done):" +msgstr[0] "Последна изпълнена команда (изпълнена е общо %d команда):" +msgstr[1] "Последна изпълнена команда (изпълнени са общо %d команди):" + +#: wt-status.c:1119 +#, c-format +msgid " (see more in file %s)" +msgstr " повече информация има във файла „%s“)" + +#: wt-status.c:1124 +msgid "No commands remaining." +msgstr "Не остават повече команди." + +#: wt-status.c:1127 +#, c-format +msgid "Next command to do (%d remaining command):" +msgid_plural "Next commands to do (%d remaining commands):" +msgstr[0] "Следваща команда за изпълнение (остава още %d команда):" +msgstr[1] "Следваща команда за изпълнение (остават още %d команди):" + +#: wt-status.c:1135 +msgid " (use \"git rebase --edit-todo\" to view and edit)" +msgstr "" +" (използвайте „git rebase --edit-todo“, за да разгледате и редактирате)" + +#: wt-status.c:1148 #, c-format msgid "You are currently rebasing branch '%s' on '%s'." msgstr "В момента пребазирате клона „%s“ върху „%s“." -#: wt-status.c:1044 wt-status.c:1061 +#: wt-status.c:1153 msgid "You are currently rebasing." msgstr "В момента пребазирате." -#: wt-status.c:1047 +#: wt-status.c:1167 msgid " (fix conflicts and then run \"git rebase --continue\")" msgstr " (коригирайте конфликтите и използвайте „git rebase --continue“)" -#: wt-status.c:1049 +#: wt-status.c:1169 msgid " (use \"git rebase --skip\" to skip this patch)" msgstr " (използвайте „git rebase --skip“, за да пропуснете тази кръпка)" -#: wt-status.c:1051 +#: wt-status.c:1171 msgid " (use \"git rebase --abort\" to check out the original branch)" msgstr "" " (използвайте „git rebase --abort“, за да възстановите първоначалния клон)" -#: wt-status.c:1064 +#: wt-status.c:1177 msgid " (all conflicts fixed: run \"git rebase --continue\")" msgstr " (всички конфликти са коригирани: изпълнете „git rebase --continue“)" -#: wt-status.c:1068 +#: wt-status.c:1181 #, c-format msgid "" "You are currently splitting a commit while rebasing branch '%s' on '%s'." msgstr "В момента разделяте подаване докато пребазирате клона „%s“ върху „%s“." -#: wt-status.c:1073 +#: wt-status.c:1186 msgid "You are currently splitting a commit during a rebase." msgstr "В момента разделяте подаване докато пребазирате." -#: wt-status.c:1076 +#: wt-status.c:1189 msgid " (Once your working directory is clean, run \"git rebase --continue\")" msgstr "" " (След като работното ви дърво стане чисто, използвайте „git rebase --" "continue“)" -#: wt-status.c:1080 +#: wt-status.c:1193 #, c-format msgid "You are currently editing a commit while rebasing branch '%s' on '%s'." msgstr "" "В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“." -#: wt-status.c:1085 +#: wt-status.c:1198 msgid "You are currently editing a commit during a rebase." msgstr "В момента редактирате подаване докато пребазирате." -#: wt-status.c:1088 +#: wt-status.c:1201 msgid " (use \"git commit --amend\" to amend the current commit)" msgstr "" " (използвайте „git commit --amend“, за да редактирате текущото подаване)" -#: wt-status.c:1090 +#: wt-status.c:1203 msgid "" " (use \"git rebase --continue\" once you are satisfied with your changes)" msgstr "" " (използвайте „git rebase --continue“, след като завършите промените си)" -#: wt-status.c:1100 +#: wt-status.c:1213 #, c-format msgid "You are currently cherry-picking commit %s." msgstr "В момента отбирате подаването „%s“." -#: wt-status.c:1105 +#: wt-status.c:1218 msgid " (fix conflicts and run \"git cherry-pick --continue\")" msgstr " (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)" -#: wt-status.c:1108 +#: wt-status.c:1221 msgid " (all conflicts fixed: run \"git cherry-pick --continue\")" msgstr "" " (всички конфликти са коригирани, изпълнете „git cherry-pick --continue“)" -#: wt-status.c:1110 +#: wt-status.c:1223 msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)" msgstr "" " (използвайте „git cherry-pick --abort“, за да отмените всички действия с " "отбиране)" -#: wt-status.c:1119 +#: wt-status.c:1232 #, c-format msgid "You are currently reverting commit %s." msgstr "В момента отменяте подаване „%s“." -#: wt-status.c:1124 +#: wt-status.c:1237 msgid " (fix conflicts and run \"git revert --continue\")" msgstr " (коригирайте конфликтите и изпълнете „git revert --continue“)" -#: wt-status.c:1127 +#: wt-status.c:1240 msgid " (all conflicts fixed: run \"git revert --continue\")" msgstr " (всички конфликти са коригирани, изпълнете „git revert --continue“)" -#: wt-status.c:1129 +#: wt-status.c:1242 msgid " (use \"git revert --abort\" to cancel the revert operation)" msgstr "" " (използвайте „git revert --abort“, за да преустановите отмяната на " "подаване)" -#: wt-status.c:1140 +#: wt-status.c:1253 #, c-format msgid "You are currently bisecting, started from branch '%s'." msgstr "В момента търсите двоично, като сте стартирали от клон „%s“." -#: wt-status.c:1144 +#: wt-status.c:1257 msgid "You are currently bisecting." msgstr "В момента търсите двоично." -#: wt-status.c:1147 +#: wt-status.c:1260 msgid " (use \"git bisect reset\" to get back to the original branch)" msgstr "" " (използвайте „git bisect reset“, за да се върнете към първоначалното " "състояние и клон)" -#: wt-status.c:1324 +#: wt-status.c:1438 msgid "On branch " msgstr "На клон " -#: wt-status.c:1331 +#: wt-status.c:1444 +msgid "interactive rebase in progress; onto " +msgstr "извършвате интерактивно пребазиране върху " + +#: wt-status.c:1446 msgid "rebase in progress; onto " msgstr "извършвате пребазиране върху " -#: wt-status.c:1336 +#: wt-status.c:1451 msgid "HEAD detached at " msgstr "Указателят „HEAD“ не е свързан и е при " -#: wt-status.c:1338 +#: wt-status.c:1453 msgid "HEAD detached from " msgstr "Указателят „HEAD“ не е свързан и е отделѐн от " -#: wt-status.c:1341 +#: wt-status.c:1456 msgid "Not currently on any branch." msgstr "Извън всички клони." -#: wt-status.c:1358 +#: wt-status.c:1474 msgid "Initial commit" msgstr "Първоначално подаване" -#: wt-status.c:1372 +#: wt-status.c:1488 msgid "Untracked files" msgstr "Неследени файлове" -#: wt-status.c:1374 +#: wt-status.c:1490 msgid "Ignored files" msgstr "Игнорирани файлове" -#: wt-status.c:1378 +#: wt-status.c:1494 #, c-format msgid "" "It took %.2f seconds to enumerate untracked files. 'status -uno'\n" @@ -2098,32 +2235,32 @@ msgstr "" "изпълнението, но не трябва да забравяте ръчно да добавяте новите файлове.\n" "За повече подробности погледнете „git status help“." -#: wt-status.c:1384 +#: wt-status.c:1500 #, c-format msgid "Untracked files not listed%s" msgstr "Неследените файлове не са изведени%s" -#: wt-status.c:1386 +#: wt-status.c:1502 msgid " (use -u option to show untracked files)" msgstr " (използвайте опцията „-u“, за да изведете неследените файлове)" -#: wt-status.c:1392 +#: wt-status.c:1508 msgid "No changes" msgstr "Няма промени" -#: wt-status.c:1397 +#: wt-status.c:1513 #, 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:1400 +#: wt-status.c:1516 #, c-format msgid "no changes added to commit\n" msgstr "към индекса за подаване не са добавени промени\n" -#: wt-status.c:1403 +#: wt-status.c:1519 #, c-format msgid "" "nothing added to commit but untracked files present (use \"git add\" to " @@ -2132,52 +2269,52 @@ msgstr "" "към индекса за подаване не са добавени промени, но има нови файлове " "(използвайте „git add“, за да започне тяхното следене)\n" -#: wt-status.c:1406 +#: wt-status.c:1522 #, c-format msgid "nothing added to commit but untracked files present\n" msgstr "към индекса за подаване не са добавени промени, но има нови файлове\n" -#: wt-status.c:1409 +#: wt-status.c:1525 #, c-format msgid "nothing to commit (create/copy files and use \"git add\" to track)\n" msgstr "" "липсват каквито и да е промени (създайте или копирайте файлове и използвайте " "„git add“, за да започне тяхното следене)\n" -#: wt-status.c:1412 wt-status.c:1417 +#: wt-status.c:1528 wt-status.c:1533 #, c-format msgid "nothing to commit\n" msgstr "липсват каквито и да е промени\n" -#: wt-status.c:1415 +#: wt-status.c:1531 #, c-format msgid "nothing to commit (use -u to show untracked files)\n" msgstr "" "липсват каквито и да е промени (използвайте опцията „-u“, за да се изведат и " "неследените файлове)\n" -#: wt-status.c:1419 +#: wt-status.c:1535 #, c-format msgid "nothing to commit, working directory clean\n" msgstr "липсват каквито и да е промени, работното дърво е чисто\n" -#: wt-status.c:1528 -msgid "HEAD (no branch)" -msgstr "HEAD (извън клон)" - -#: wt-status.c:1534 +#: wt-status.c:1642 msgid "Initial commit on " msgstr "Първоначално подаване на клон" -#: wt-status.c:1561 +#: wt-status.c:1646 +msgid "HEAD (no branch)" +msgstr "HEAD (извън клон)" + +#: wt-status.c:1675 msgid "gone" msgstr "изтрит" -#: wt-status.c:1563 wt-status.c:1571 +#: wt-status.c:1677 wt-status.c:1685 msgid "behind " msgstr "назад с " -#: compat/precompose_utf8.c:55 builtin/clone.c:345 +#: compat/precompose_utf8.c:56 builtin/clone.c:408 #, c-format msgid "failed to unlink '%s'" msgstr "неуспешно изтриване на „%s“" @@ -2191,7 +2328,7 @@ msgstr "git add [ОПЦИЯ…] [--] ПЪТ…" msgid "unexpected diff status %c" msgstr "неочакван изходен код при генериране на разлика: %c" -#: builtin/add.c:70 builtin/commit.c:277 +#: builtin/add.c:70 builtin/commit.c:278 msgid "updating files failed" msgstr "неуспешно обновяване на файловете" @@ -2240,15 +2377,15 @@ msgid "The following paths are ignored by one of your .gitignore files:\n" msgstr "" "Следните пътища ще бъдат игнорирани според някой от файловете „.gitignore“:\n" -#: builtin/add.c:249 builtin/clean.c:874 builtin/fetch.c:107 builtin/mv.c:110 -#: builtin/prune-packed.c:55 builtin/push.c:508 builtin/remote.c:1369 -#: builtin/rm.c:268 +#: builtin/add.c:249 builtin/clean.c:894 builtin/fetch.c:108 builtin/mv.c:110 +#: builtin/prune-packed.c:55 builtin/pull.c:182 builtin/push.c:543 +#: builtin/remote.c:1345 builtin/rm.c:268 builtin/send-pack.c:162 msgid "dry run" msgstr "пробно изпълнeние" -#: builtin/add.c:250 builtin/apply.c:4580 builtin/check-ignore.c:19 -#: builtin/commit.c:1322 builtin/count-objects.c:63 builtin/fsck.c:616 -#: builtin/log.c:1617 builtin/mv.c:109 builtin/read-tree.c:114 +#: builtin/add.c:250 builtin/apply.c:4571 builtin/check-ignore.c:19 +#: builtin/commit.c:1322 builtin/count-objects.c:85 builtin/fsck.c:558 +#: builtin/log.c:1645 builtin/mv.c:109 builtin/read-tree.c:114 msgid "be verbose" msgstr "повече подробности" @@ -2256,7 +2393,7 @@ msgstr "повече подробности" msgid "interactive picking" msgstr "интерактивно отбиране на промени" -#: builtin/add.c:253 builtin/checkout.c:1221 builtin/reset.c:286 +#: builtin/add.c:253 builtin/checkout.c:1153 builtin/reset.c:286 msgid "select hunks interactively" msgstr "интерактивен избор на парчета код" @@ -2318,93 +2455,515 @@ msgstr "опциите „-A“ и „-u“ са несъвместими" msgid "Option --ignore-missing can only be used together with --dry-run" msgstr "Опцията „--ignore-missing“ е съвместима само с „--dry-run“" -#: builtin/add.c:358 +#: builtin/add.c:352 #, c-format msgid "Nothing specified, nothing added.\n" msgstr "Нищо не е зададено и нищо не е добавено.\n" -#: builtin/add.c:359 +#: builtin/add.c:353 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Вероятно искахте да използвате „git add .“?\n" -#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:918 -#: builtin/commit.c:335 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298 +#: builtin/add.c:358 builtin/check-ignore.c:172 builtin/clean.c:938 +#: builtin/commit.c:337 builtin/mv.c:130 builtin/reset.c:235 builtin/rm.c:298 +#: builtin/submodule--helper.c:40 msgid "index file corrupt" msgstr "файлът с индекса е повреден" -#: builtin/add.c:447 builtin/apply.c:4678 builtin/mv.c:279 builtin/rm.c:430 +#: builtin/add.c:439 builtin/apply.c:4669 builtin/mv.c:279 builtin/rm.c:430 msgid "Unable to write new index file" msgstr "Новият индекс не може да бъде записан" +#: builtin/am.c:42 +#, c-format +msgid "could not stat %s" +msgstr "Не може да се получи информация чрез „stat“ за „%s“" + +#: builtin/am.c:271 builtin/commit.c:738 builtin/merge.c:1077 +#, c-format +msgid "could not read '%s'" +msgstr "файлът „%s“ не може да бъде прочетен" + +#: builtin/am.c:445 +msgid "could not parse author script" +msgstr "скриптът за автор не може да се анализира" + +#: builtin/am.c:522 +#, c-format +msgid "'%s' was deleted by the applypatch-msg hook" +msgstr "„%s“ бе изтрит от куката „applypatch-msg“" + +#: builtin/am.c:563 builtin/notes.c:300 +#, c-format +msgid "Malformed input line: '%s'." +msgstr "Даденият входен ред е с неправилен формат: „%s“." + +#: builtin/am.c:600 builtin/notes.c:315 +#, c-format +msgid "Failed to copy notes from '%s' to '%s'" +msgstr "Бележката не може да се копира от „%s“ към „%s“" + +#: builtin/am.c:626 +msgid "fseek failed" +msgstr "неуспешно изпълнение на „fseek“" + +#: builtin/am.c:787 builtin/am.c:875 +#, c-format +msgid "could not open '%s' for reading: %s" +msgstr "„%s“ не може да бъде отворен за четене: %s" + +#: builtin/am.c:794 +#, c-format +msgid "could not open '%s' for writing: %s" +msgstr "„%s“ не може да бъде отворен за запис: %s" + +#: builtin/am.c:803 +#, c-format +msgid "could not parse patch '%s'" +msgstr "кръпката „%s“ не може да се анализира" + +#: builtin/am.c:868 +msgid "Only one StGIT patch series can be applied at once" +msgstr "" +"Само една серия кръпки от „StGIT“ може да бъде прилагана в даден момент" + +#: builtin/am.c:916 +msgid "invalid timestamp" +msgstr "неправилна стойност за време" + +#: builtin/am.c:919 builtin/am.c:927 +msgid "invalid Date line" +msgstr "неправилен ред за дата „Date“" + +#: builtin/am.c:924 +msgid "invalid timezone offset" +msgstr "неправилно отместване на часовия пояс" + +#: builtin/am.c:1011 +msgid "Patch format detection failed." +msgstr "Форматът на кръпката не може да бъде определен." + +#: builtin/am.c:1016 builtin/clone.c:373 +#, c-format +msgid "failed to create directory '%s'" +msgstr "директорията „%s“ не може да бъде създадена" + +#: builtin/am.c:1020 +msgid "Failed to split patches." +msgstr "Кръпките не могат да бъдат разделени." + +#: builtin/am.c:1152 builtin/commit.c:363 +msgid "unable to write index file" +msgstr "индексът не може да бъде записан" + +#: builtin/am.c:1203 +#, c-format +msgid "When you have resolved this problem, run \"%s --continue\"." +msgstr "След коригирането на този проблем изпълнете „%s --continue“." + +#: builtin/am.c:1204 +#, c-format +msgid "If you prefer to skip this patch, run \"%s --skip\" instead." +msgstr "Ако предпочитате да прескочите тази кръпка, изпълнете „%s --skip“." + +#: builtin/am.c:1205 +#, c-format +msgid "To restore the original branch and stop patching, run \"%s --abort\"." +msgstr "За да се върнете към първоначалното състояние, изпълнете „%s --abort“." + +#: builtin/am.c:1343 +msgid "Patch is empty. Was it split wrong?" +msgstr "Празна кръпка. Дали не е разделена погрешно?" + +#: builtin/am.c:1417 builtin/log.c:1347 +#, c-format +msgid "invalid ident line: %s" +msgstr "грешна идентичност: %s" + +#: builtin/am.c:1444 +#, c-format +msgid "unable to parse commit %s" +msgstr "подаването не може да бъде анализирано: %s" + +#: builtin/am.c:1646 +msgid "Repository lacks necessary blobs to fall back on 3-way merge." +msgstr "" +"В хранилището липсват необходимите обекти BLOB, за да се премине към тройно " +"сливане." + +#: builtin/am.c:1648 +msgid "Using index info to reconstruct a base tree..." +msgstr "Базовото дърво се реконструира от информацията в индекса…" + +#: builtin/am.c:1667 +msgid "" +"Did you hand edit your patch?\n" +"It does not apply to blobs recorded in its index." +msgstr "" +"Кръпката не може да се приложи към обектите BLOB в индекса.\n" +"Да не би да сте я редактирали на ръка?" + +#: builtin/am.c:1673 +msgid "Falling back to patching base and 3-way merge..." +msgstr "Преминаване към прилагане на кръпка към базата и тройно сливане…" + +#: builtin/am.c:1688 +msgid "Failed to merge in the changes." +msgstr "Неуспешно сливане на промените." + +#: builtin/am.c:1712 builtin/merge.c:632 +msgid "git write-tree failed to write a tree" +msgstr "Командата „git write-tree“ не успя да запише обект-дърво" + +#: builtin/am.c:1719 +msgid "applying to an empty history" +msgstr "прилагане върху празна история" + +#: builtin/am.c:1732 builtin/commit.c:1755 builtin/merge.c:829 +#: builtin/merge.c:854 +msgid "failed to write commit object" +msgstr "обектът за подаването не може да бъде записан" + +#: builtin/am.c:1764 builtin/am.c:1768 +#, c-format +msgid "cannot resume: %s does not exist." +msgstr "не може да се продължи — „%s“ не съществува." + +#: builtin/am.c:1784 +msgid "cannot be interactive without stdin connected to a terminal." +msgstr "" +"За интерактивно изпълнение е необходимо стандартният\n" +"изход да е свързан с терминал, а в момента не е." + +#: builtin/am.c:1789 +msgid "Commit Body is:" +msgstr "Тялото на кръпката за прилагане е:" + +#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] +#. in your translation. The program will only accept English +#. input at this point. +#. +#: builtin/am.c:1799 +msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: " +msgstr "" +"Прилагане? „y“ — да/„n“ — не/„e“ — редактиране/„v“ — преглед/„a“ — приемане " +"на всичко:" + +#: builtin/am.c:1849 +#, c-format +msgid "Dirty index: cannot apply patches (dirty: %s)" +msgstr "" +"Индексът не е чист: кръпките не могат да бъдат приложени (замърсени са: %s)" + +#: builtin/am.c:1884 builtin/am.c:1955 +#, c-format +msgid "Applying: %.*s" +msgstr "Прилагане: %.*s" + +#: builtin/am.c:1900 +msgid "No changes -- Patch already applied." +msgstr "Без промени — кръпката вече е приложена." + +#: builtin/am.c:1908 +#, c-format +msgid "Patch failed at %s %.*s" +msgstr "Неуспешно прилагане на кръпка при %s %.*s“" + +#: builtin/am.c:1914 +#, c-format +msgid "The copy of the patch that failed is found in: %s" +msgstr "Дубликат на проблемната кръпка се намира в: %s" + +#: builtin/am.c:1958 +msgid "" +"No changes - did you forget to use 'git add'?\n" +"If there is nothing left to stage, chances are that something else\n" +"already introduced the same changes; you might want to skip this patch." +msgstr "" +"Без промени — възможно е да не сте изпълнили „git add“.\n" +"Ако няма друга промяна за включване в индекса, най-вероятно някоя друга\n" +"кръпка е довела до същите промени и в такъв случай просто пропуснете тази." + +#: builtin/am.c:1965 +msgid "" +"You still have unmerged paths in your index.\n" +"Did you forget to use 'git add'?" +msgstr "" +"Индексът все още съдържа неслети промени.\n" +"Възможно е да не сте изпълнили „git add“." + +#: builtin/am.c:2073 builtin/am.c:2077 builtin/am.c:2089 builtin/reset.c:308 +#: builtin/reset.c:316 +#, c-format +msgid "Could not parse object '%s'." +msgstr "„%s“ не е разпознат като обект." + +#: builtin/am.c:2125 +msgid "failed to clean index" +msgstr "индексът не може да бъде изчистен" + +#: builtin/am.c:2159 +msgid "" +"You seem to have moved HEAD since the last 'am' failure.\n" +"Not rewinding to ORIG_HEAD" +msgstr "" +"Изглежда указателят „HEAD“ е променен и не сочи към същия обект както по " +"времето\n" +"на последното неуспешно изпълнение на „git am“. Указателят се задава да сочи " +"към\n" +"„ORIG_HEAD“" + +#: builtin/am.c:2220 +#, c-format +msgid "Invalid value for --patch-format: %s" +msgstr "Неправилна стойност за „--patch-format“: „%s“" + +#: builtin/am.c:2253 +msgid "git am [] [(|)...]" +msgstr "git am [ОПЦИЯ…] [ФАЙЛ_С_ПОЩА|ДИРЕКТОРИЯ_С_ПОЩА]…" + +#: builtin/am.c:2254 +msgid "git am [] (--continue | --skip | --abort)" +msgstr "git am [ОПЦИЯ…] (--continue | --quit | --abort)" + +#: builtin/am.c:2260 +msgid "run interactively" +msgstr "интерактивна работа" + +#: builtin/am.c:2262 +msgid "historical option -- no-op" +msgstr "изоставена опция, съществува по исторически причини, нищо не прави" + +#: builtin/am.c:2264 +msgid "allow fall back on 3way merging if needed" +msgstr "да се преминава към тройно сливане при нужда." + +#: builtin/am.c:2265 builtin/init-db.c:474 builtin/prune-packed.c:57 +#: builtin/repack.c:171 +msgid "be quiet" +msgstr "без извеждане на информация" + +#: builtin/am.c:2267 +msgid "add a Signed-off-by line to the commit message" +msgstr "добавяне на ред за подпис „Signed-off-by“ в съобщението за подаване" + +#: builtin/am.c:2270 +msgid "recode into utf8 (default)" +msgstr "прекодиране в UTF-8 (стандартно)" + +#: builtin/am.c:2272 +msgid "pass -k flag to git-mailinfo" +msgstr "подаване на опцията „-k“ на командата „git-mailinfo“" + +#: builtin/am.c:2274 +msgid "pass -b flag to git-mailinfo" +msgstr "подаване на опцията „-b“ на командата „git-mailinfo“" + +#: builtin/am.c:2276 +msgid "pass -m flag to git-mailinfo" +msgstr "подаване на опцията „-m“ на командата „git-mailinfo“" + +#: builtin/am.c:2278 +msgid "pass --keep-cr flag to git-mailsplit for mbox format" +msgstr "" +"подаване на опцията „--keep-cr“ на командата „git-mailsplit“ за формат „mbox“" + +#: builtin/am.c:2281 +msgid "do not pass --keep-cr flag to git-mailsplit independent of am.keepcr" +msgstr "" +"без подаване на опцията „--keep-cr“ на командата „git-mailsplit“ независимо " +"от „am.keepcr“" + +#: builtin/am.c:2284 +msgid "strip everything before a scissors line" +msgstr "пропускане на всичко преди реда за отрязване" + +#: builtin/am.c:2285 builtin/apply.c:4554 +msgid "action" +msgstr "действие" + +#: builtin/am.c:2286 builtin/am.c:2289 builtin/am.c:2292 builtin/am.c:2295 +#: builtin/am.c:2298 builtin/am.c:2301 builtin/am.c:2304 builtin/am.c:2307 +#: builtin/am.c:2313 +msgid "pass it through git-apply" +msgstr "прекарване през „git-apply“" + +#: builtin/am.c:2294 builtin/apply.c:4578 +msgid "root" +msgstr "НАЧАЛНА_ДИРЕКТОРИЯ" + +#: builtin/am.c:2297 builtin/am.c:2300 builtin/apply.c:4516 +#: builtin/apply.c:4519 builtin/clone.c:85 builtin/fetch.c:93 +#: builtin/pull.c:167 builtin/submodule--helper.c:78 +#: builtin/submodule--helper.c:166 builtin/submodule--helper.c:169 +msgid "path" +msgstr "път" + +#: builtin/am.c:2303 builtin/fmt-merge-msg.c:666 builtin/fmt-merge-msg.c:669 +#: builtin/grep.c:693 builtin/merge.c:198 builtin/pull.c:127 +#: builtin/repack.c:178 builtin/repack.c:182 builtin/show-branch.c:645 +#: builtin/show-ref.c:175 builtin/tag.c:340 parse-options.h:132 +#: parse-options.h:134 parse-options.h:244 +msgid "n" +msgstr "БРОЙ" + +#: builtin/am.c:2306 builtin/apply.c:4522 +msgid "num" +msgstr "БРОЙ" + +#: builtin/am.c:2309 builtin/for-each-ref.c:37 builtin/replace.c:438 +#: builtin/tag.c:372 +msgid "format" +msgstr "ФОРМАТ" + +#: builtin/am.c:2310 +msgid "format the patch(es) are in" +msgstr "формат на кръпките" + +#: builtin/am.c:2316 +msgid "override error message when patch failure occurs" +msgstr "избрано от вас съобщение за грешка при прилагане на кръпки" + +#: builtin/am.c:2318 +msgid "continue applying patches after resolving a conflict" +msgstr "продължаване на прилагането на кръпки след коригирането на конфликт" + +#: builtin/am.c:2321 +msgid "synonyms for --continue" +msgstr "синоними на „--continue“" + +#: builtin/am.c:2324 +msgid "skip the current patch" +msgstr "прескачане на текущата кръпка" + +#: builtin/am.c:2327 +msgid "restore the original branch and abort the patching operation." +msgstr "" +"възстановяване на първоначалното състояние на клона и преустановяване на " +"прилагането на кръпката." + +#: builtin/am.c:2331 +msgid "lie about committer date" +msgstr "дата за подаване различна от първоначалнота" + +#: builtin/am.c:2333 +msgid "use current timestamp for author date" +msgstr "използване на текущото време като това за автор" + +#: builtin/am.c:2335 builtin/commit.c:1593 builtin/merge.c:225 +#: builtin/pull.c:155 builtin/revert.c:92 builtin/tag.c:355 +msgid "key-id" +msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ" + +#: builtin/am.c:2336 +msgid "GPG-sign commits" +msgstr "подписване на подаванията с GPG" + +#: builtin/am.c:2339 +msgid "(internal use for git-rebase)" +msgstr "(ползва се вътрешно за „git-rebase“)" + +#: builtin/am.c:2354 +msgid "" +"The -b/--binary option has been a no-op for long time, and\n" +"it will be removed. Please do not use it anymore." +msgstr "" +"Опциите „-b“/„--binary“ отдавна не правят нищо и\n" +"ще бъдат премахнати в бъдеще. Не ги ползвайте." + +#: builtin/am.c:2361 +msgid "failed to read the index" +msgstr "неуспешно изчитане на индекса" + +#: builtin/am.c:2376 +#, c-format +msgid "previous rebase directory %s still exists but mbox given." +msgstr "" +"предишната директория за пребазиране „%s“ все още съществува, а е зададен " +"файл „mbox“." + +#: builtin/am.c:2400 +#, c-format +msgid "" +"Stray %s directory found.\n" +"Use \"git am --abort\" to remove it." +msgstr "" +"Открита е излишна директория „%s“.\n" +"Можете да я изтриете с командата „git am --abort“." + +#: builtin/am.c:2406 +msgid "Resolve operation not in progress, we are not resuming." +msgstr "В момента не тече операция по коригиране и няма как да се продължи." + #: builtin/apply.c:59 msgid "git apply [] [...]" msgstr "git apply [ОПЦИЯ…] [КРЪПКА…]" -#: builtin/apply.c:112 +#: builtin/apply.c:111 #, c-format msgid "unrecognized whitespace option '%s'" msgstr "непозната опция за знаците за интервали „%s“" -#: builtin/apply.c:127 +#: builtin/apply.c:126 #, c-format msgid "unrecognized whitespace ignore option '%s'" msgstr "непозната опция за игнориране на знаците за интервали „%s“" -#: builtin/apply.c:822 +#: builtin/apply.c:818 #, c-format msgid "Cannot prepare timestamp regexp %s" msgstr "Регулярният израз за времето „%s“ не може за бъде компилиран" -#: builtin/apply.c:831 +#: builtin/apply.c:827 #, c-format msgid "regexec returned %d for input: %s" msgstr "Регулярният израз върна %d при подадена последователност „%s“ на входа" -#: builtin/apply.c:912 +#: builtin/apply.c:908 #, c-format msgid "unable to find filename in patch at line %d" msgstr "Липсва име на файл на ред %d от кръпката" -#: builtin/apply.c:944 +#: builtin/apply.c:940 #, c-format msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" msgstr "" "git apply: лош изход от командата „git-diff“ — на ред %2$d се очакваше „/dev/" "null“, а бе получен „%1$s“" -#: builtin/apply.c:948 +#: builtin/apply.c:944 #, c-format msgid "git apply: bad git-diff - inconsistent new filename on line %d" msgstr "" "git apply: лош изход от командата „git-diff“ — на ред %d бе получено " "неправилно име на нов файл" -#: builtin/apply.c:949 +#: builtin/apply.c:945 #, c-format msgid "git apply: bad git-diff - inconsistent old filename on line %d" msgstr "" "git apply: лош изход от командата „git-diff“ — на ред %d бе получено " "неправилно име на стар файл" -#: builtin/apply.c:956 +#: builtin/apply.c:952 #, c-format msgid "git apply: bad git-diff - expected /dev/null on line %d" msgstr "" "git apply: лош изход от командата „git-diff“ — на ред %d се очакваше „/dev/" "null“" -#: builtin/apply.c:1419 +#: builtin/apply.c:1415 #, c-format msgid "recount: unexpected line: %.*s" msgstr "при повторното преброяване бе получен неочакван ред: „%.*s“" -#: builtin/apply.c:1476 +#: builtin/apply.c:1472 #, c-format msgid "patch fragment without header at line %d: %.*s" msgstr "част от кръпка без заглавна част на ред %d: %.*s" -#: builtin/apply.c:1493 +#: builtin/apply.c:1489 #, c-format msgid "" "git diff header lacks filename information when removing %d leading pathname " @@ -2419,66 +2978,65 @@ msgstr[1] "" "След съкращаването на първите %d части от компонентите на пътя, в заглавната " "част на „git diff“ липсва информация за име на файл (ред: %d)" -#: builtin/apply.c:1659 +#: builtin/apply.c:1655 msgid "new file depends on old contents" msgstr "новият файл зависи от старото съдържание на файла" -#: builtin/apply.c:1661 +#: builtin/apply.c:1657 msgid "deleted file still has contents" msgstr "изтритият файл не е празен" -#: builtin/apply.c:1687 +#: builtin/apply.c:1683 #, c-format msgid "corrupt patch at line %d" msgstr "грешка в кръпката на ред %d" -#: builtin/apply.c:1723 +#: builtin/apply.c:1719 #, c-format msgid "new file %s depends on old contents" msgstr "новият файл „%s“ зависи от старото съдържание на файла" -#: builtin/apply.c:1725 +#: builtin/apply.c:1721 #, c-format msgid "deleted file %s still has contents" msgstr "изтритият файл „%s“ не е празен" -# FIXME - double **?? -#: builtin/apply.c:1728 +#: builtin/apply.c:1724 #, c-format msgid "** warning: file %s becomes empty but is not deleted" -msgstr "●● предупреждение: файлът „%s“ вече е празен, но не е изтрит" +msgstr "● предупреждение: файлът „%s“ вече е празен, но не е изтрит" -#: builtin/apply.c:1874 +#: builtin/apply.c:1870 #, c-format msgid "corrupt binary patch at line %d: %.*s" msgstr "грешка в двоичната кръпка на ред %d: %.*s" -#: builtin/apply.c:1903 +#: builtin/apply.c:1899 #, c-format msgid "unrecognized binary patch at line %d" msgstr "неразпозната двоичната кръпка на ред %d" -#: builtin/apply.c:2054 +#: builtin/apply.c:2050 #, c-format msgid "patch with only garbage at line %d" msgstr "кръпката е с изцяло повредени данни на ред %d" -#: builtin/apply.c:2144 +#: builtin/apply.c:2140 #, c-format msgid "unable to read symlink %s" msgstr "символната връзка „%s“ не може да бъде прочетена" -#: builtin/apply.c:2148 +#: builtin/apply.c:2144 #, c-format msgid "unable to open or read %s" msgstr "файлът „%s“ не може да бъде отворен или прочетен" -#: builtin/apply.c:2781 +#: builtin/apply.c:2777 #, c-format msgid "invalid start of line: '%c'" msgstr "неправилно начало на ред: „%c“" -#: builtin/apply.c:2900 +#: builtin/apply.c:2896 #, c-format msgid "Hunk #%d succeeded at %d (offset %d line)." msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." @@ -2487,13 +3045,13 @@ msgstr[0] "" msgstr[1] "" "%d-то парче код бе успешно приложено на ред %d (отместване от %d реда)." -#: builtin/apply.c:2912 +#: builtin/apply.c:2908 #, c-format msgid "Context reduced to (%ld/%ld) to apply fragment at %d" msgstr "" "Контекстът е намален на (%ld/%ld) за прилагането на парчето код на ред %d" -#: builtin/apply.c:2918 +#: builtin/apply.c:2914 #, c-format msgid "" "while searching for:\n" @@ -2502,345 +3060,328 @@ msgstr "" "при търсене за:\n" "%.*s" -#: builtin/apply.c:2938 +#: builtin/apply.c:2934 #, c-format msgid "missing binary patch data for '%s'" msgstr "липсват данните за двоичната кръпка за „%s“" -#: builtin/apply.c:3039 +#: builtin/apply.c:3035 #, c-format msgid "binary patch does not apply to '%s'" msgstr "двоичната кръпка не може да бъде приложена върху „%s“" -#: builtin/apply.c:3045 +#: builtin/apply.c:3041 #, c-format msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" msgstr "" "двоичната кръпка за „%s“ води до неправилни резултати (очакваше се SHA1: " "„%s“, а бе получено: „%s“)" -#: builtin/apply.c:3066 +#: builtin/apply.c:3062 #, c-format msgid "patch failed: %s:%ld" msgstr "неуспешно прилагане на кръпка: „%s:%ld“" -#: builtin/apply.c:3190 +#: builtin/apply.c:3186 #, c-format msgid "cannot checkout %s" msgstr "„%s“ не може да се изтегли" -#: builtin/apply.c:3235 builtin/apply.c:3246 builtin/apply.c:3291 +#: builtin/apply.c:3231 builtin/apply.c:3242 builtin/apply.c:3287 #, c-format msgid "read of %s failed" msgstr "неуспешно прочитане на „%s“" -#: builtin/apply.c:3243 +#: builtin/apply.c:3239 #, c-format msgid "reading from '%s' beyond a symbolic link" msgstr "изчитане на „%s“ след проследяване на символна връзка" -#: builtin/apply.c:3271 builtin/apply.c:3493 +#: builtin/apply.c:3267 builtin/apply.c:3489 #, c-format msgid "path %s has been renamed/deleted" msgstr "обектът с път „%s“ е преименуван или изтрит" -#: builtin/apply.c:3352 builtin/apply.c:3507 +#: builtin/apply.c:3348 builtin/apply.c:3503 #, c-format msgid "%s: does not exist in index" msgstr "„%s“ не съществува в индекса" -#: builtin/apply.c:3356 builtin/apply.c:3499 builtin/apply.c:3521 +#: builtin/apply.c:3352 builtin/apply.c:3495 builtin/apply.c:3517 #, c-format msgid "%s: %s" msgstr "„%s“: %s" -#: builtin/apply.c:3361 builtin/apply.c:3515 +#: builtin/apply.c:3357 builtin/apply.c:3511 #, c-format msgid "%s: does not match index" msgstr "„%s“ не съответства на индекса" -#: builtin/apply.c:3463 +#: builtin/apply.c:3459 msgid "removal patch leaves file contents" msgstr "изтриващата кръпка оставя файла непразен" -#: builtin/apply.c:3532 +#: builtin/apply.c:3528 #, c-format msgid "%s: wrong type" msgstr "„%s“: неправилен вид" -#: builtin/apply.c:3534 +#: builtin/apply.c:3530 #, c-format msgid "%s has type %o, expected %o" msgstr "„%s“ е от вид „%o“, а се очакваше „%o“" -#: builtin/apply.c:3693 builtin/apply.c:3695 +#: builtin/apply.c:3689 builtin/apply.c:3691 #, c-format msgid "invalid path '%s'" msgstr "неправилен път: „%s“" -#: builtin/apply.c:3750 +#: builtin/apply.c:3746 #, c-format msgid "%s: already exists in index" msgstr "„%s“: вече съществува в индекса" -#: builtin/apply.c:3753 +#: builtin/apply.c:3749 #, c-format msgid "%s: already exists in working directory" msgstr "„%s“: вече съществува в работното дърво" -#: builtin/apply.c:3773 +#: builtin/apply.c:3769 #, c-format msgid "new mode (%o) of %s does not match old mode (%o)" msgstr "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o)" -#: builtin/apply.c:3778 +#: builtin/apply.c:3774 #, c-format msgid "new mode (%o) of %s does not match old mode (%o) of %s" msgstr "" "новите права за достъп (%o) на „%s“ не съвпадат със старите (%o) на „%s“" -#: builtin/apply.c:3798 +#: builtin/apply.c:3794 #, c-format msgid "affected file '%s' is beyond a symbolic link" msgstr "засегнатият файл „%s“ е след символна връзка" -#: builtin/apply.c:3802 +#: builtin/apply.c:3798 #, c-format msgid "%s: patch does not apply" msgstr "Кръпката „%s“ не може да бъде приложена" -#: builtin/apply.c:3816 +#: builtin/apply.c:3812 #, c-format msgid "Checking patch %s..." msgstr "Проверяване на кръпката „%s“…" -#: builtin/apply.c:3909 builtin/checkout.c:233 builtin/reset.c:135 +#: builtin/apply.c:3905 builtin/checkout.c:233 builtin/reset.c:135 #, c-format msgid "make_cache_entry failed for path '%s'" msgstr "неуспешно създаване на запис в кеша чрез „make_cache_entry“ за „%s“" -#: builtin/apply.c:4052 +#: builtin/apply.c:4048 #, c-format msgid "unable to remove %s from index" msgstr "„%s“ не може да се извади от индекса" -#: builtin/apply.c:4081 +#: builtin/apply.c:4077 #, c-format msgid "corrupt patch for submodule %s" msgstr "повредена кръпка за модула „%s“" -#: builtin/apply.c:4085 +#: builtin/apply.c:4081 #, c-format msgid "unable to stat newly created file '%s'" msgstr "" "не може да се получи информация чрез „stat“ за новосъздадения файл „%s“" -#: builtin/apply.c:4090 +#: builtin/apply.c:4086 #, c-format msgid "unable to create backing store for newly created file %s" msgstr "" "не може да се за създаде мястото за съхранение на новосъздадения файл „%s“" -#: builtin/apply.c:4093 builtin/apply.c:4201 +#: builtin/apply.c:4089 builtin/apply.c:4197 #, c-format msgid "unable to add cache entry for %s" msgstr "не може да се добави запис в кеша за „%s“" -#: builtin/apply.c:4126 +#: builtin/apply.c:4122 #, c-format msgid "closing file '%s'" msgstr "затваряне на файла „%s“" -#: builtin/apply.c:4175 +#: builtin/apply.c:4171 #, c-format msgid "unable to write file '%s' mode %o" msgstr "файлът „%s“ не може да се запише с режим на достъп „%o“" -#: builtin/apply.c:4262 +#: builtin/apply.c:4258 #, c-format msgid "Applied patch %s cleanly." msgstr "Кръпката „%s“ бе приложена чисто." -#: builtin/apply.c:4270 +#: builtin/apply.c:4266 msgid "internal error" msgstr "вътрешна грешка" -#: builtin/apply.c:4273 +#: builtin/apply.c:4269 #, c-format msgid "Applying patch %%s with %d reject..." msgid_plural "Applying patch %%s with %d rejects..." msgstr[0] "Прилагане на кръпката „%%s“ с %d отхвърлено парче…" msgstr[1] "Прилагане на кръпката „%%s“ с %d отхвърлени парчета…" -#: builtin/apply.c:4283 +#: builtin/apply.c:4279 #, c-format msgid "truncating .rej filename to %.*s.rej" msgstr "съкращаване на името на файла с отхвърлените парчета на „ %.*s.rej“" -#: builtin/apply.c:4304 +#: builtin/apply.c:4300 #, c-format msgid "Hunk #%d applied cleanly." msgstr "%d-то парче бе успешно приложено." -#: builtin/apply.c:4307 +#: builtin/apply.c:4303 #, c-format msgid "Rejected hunk #%d." msgstr "%d-то парче бе отхвърлено." -#: builtin/apply.c:4397 +#: builtin/apply.c:4393 msgid "unrecognized input" msgstr "непознат вход" -#: builtin/apply.c:4408 +#: builtin/apply.c:4404 msgid "unable to read index file" msgstr "индексът не може да бъде записан" -#: builtin/apply.c:4525 builtin/apply.c:4528 builtin/clone.c:85 -#: builtin/fetch.c:92 -msgid "path" -msgstr "път" - -#: builtin/apply.c:4526 +#: builtin/apply.c:4517 msgid "don't apply changes matching the given path" msgstr "без прилагане на промените напасващи на дадения път" -#: builtin/apply.c:4529 +#: builtin/apply.c:4520 msgid "apply changes matching the given path" msgstr "прилагане на промените напасващи на дадения път" -#: builtin/apply.c:4531 -msgid "num" -msgstr "БРОЙ" - -#: builtin/apply.c:4532 +#: builtin/apply.c:4523 msgid "remove leading slashes from traditional diff paths" msgstr "премахване на този БРОЙ водещи елементи от пътищата в разликата" -#: builtin/apply.c:4535 +#: builtin/apply.c:4526 msgid "ignore additions made by the patch" msgstr "игнориране на редовете добавени от тази кръпка" -#: builtin/apply.c:4537 +#: builtin/apply.c:4528 msgid "instead of applying the patch, output diffstat for the input" msgstr "извеждане на статистика на промените без прилагане на кръпката" -#: builtin/apply.c:4541 +#: builtin/apply.c:4532 msgid "show number of added and deleted lines in decimal notation" msgstr "извеждане на броя на добавените и изтритите редове" -#: builtin/apply.c:4543 +#: builtin/apply.c:4534 msgid "instead of applying the patch, output a summary for the input" msgstr "извеждане на статистика на входните данни без прилагане на кръпката" -#: builtin/apply.c:4545 +#: builtin/apply.c:4536 msgid "instead of applying the patch, see if the patch is applicable" msgstr "проверка дали кръпката може да се приложи, без действително прилагане" -#: builtin/apply.c:4547 +#: builtin/apply.c:4538 msgid "make sure the patch is applicable to the current index" msgstr "проверка дали кръпката може да бъде приложена към текущия индекс" -#: builtin/apply.c:4549 +#: builtin/apply.c:4540 msgid "apply a patch without touching the working tree" msgstr "прилагане на кръпката без промяна на работното дърво" -#: builtin/apply.c:4551 +#: builtin/apply.c:4542 msgid "accept a patch that touches outside the working area" msgstr "прилагане на кръпка, която променя и файлове извън работното дърво" -#: builtin/apply.c:4553 +#: builtin/apply.c:4544 msgid "also apply the patch (use with --stat/--summary/--check)" msgstr "" "кръпката да бъде приложена. Опцията се комбинира с „--check“/„--stat“/„--" "summary“" -#: builtin/apply.c:4555 +#: builtin/apply.c:4546 msgid "attempt three-way merge if a patch does not apply" msgstr "пробване с тройно сливане, ако кръпката не може да се приложи директно" -#: builtin/apply.c:4557 +#: builtin/apply.c:4548 msgid "build a temporary index based on embedded index information" msgstr "" "създаване на временен индекс на база на включената информация за индекса" -#: builtin/apply.c:4559 builtin/checkout-index.c:198 builtin/ls-files.c:412 +#: builtin/apply.c:4550 builtin/checkout-index.c:198 builtin/ls-files.c:412 msgid "paths are separated with NUL character" msgstr "разделяне на пътищата с нулевия знак „NUL“" -#: builtin/apply.c:4562 +#: builtin/apply.c:4553 msgid "ensure at least lines of context match" msgstr "да се осигури контекст от поне такъв БРОЙ съвпадащи редове" -#: builtin/apply.c:4563 -msgid "action" -msgstr "действие" - -#: builtin/apply.c:4564 +#: builtin/apply.c:4555 msgid "detect new or modified lines that have whitespace errors" msgstr "засичане на нови или променени редове с грешки в знаците за интервали" -#: builtin/apply.c:4567 builtin/apply.c:4570 +#: builtin/apply.c:4558 builtin/apply.c:4561 msgid "ignore changes in whitespace when finding context" msgstr "" "игнориране на промените в знаците за интервали при откриване на контекста" -#: builtin/apply.c:4573 +#: builtin/apply.c:4564 msgid "apply the patch in reverse" msgstr "прилагане на кръпката в обратна посока" -#: builtin/apply.c:4575 +#: builtin/apply.c:4566 msgid "don't expect at least one line of context" msgstr "без изискване на дори и един ред контекст" -#: builtin/apply.c:4577 +#: builtin/apply.c:4568 msgid "leave the rejected hunks in corresponding *.rej files" msgstr "оставяне на отхвърлените парчета във файлове с разширение „.rej“" -#: builtin/apply.c:4579 +#: builtin/apply.c:4570 msgid "allow overlapping hunks" msgstr "позволяване на застъпващи се парчета" -#: builtin/apply.c:4582 +#: builtin/apply.c:4573 msgid "tolerate incorrectly detected missing new-line at the end of file" msgstr "пренебрегване на неправилно липсващ знак за нов ред в края на файл" -#: builtin/apply.c:4585 +#: builtin/apply.c:4576 msgid "do not trust the line counts in the hunk headers" msgstr "без доверяване на номерата на редовете в заглавните части на парчетата" -#: builtin/apply.c:4587 -msgid "root" -msgstr "НАЧАЛНА_ДИРЕКТОРИЯ" - -#: builtin/apply.c:4588 +#: builtin/apply.c:4579 msgid "prepend to all filenames" msgstr "добавяне на тази НАЧАЛНА_ДИРЕКТОРИЯ към имената на всички файлове" -#: builtin/apply.c:4610 +#: builtin/apply.c:4601 msgid "--3way outside a repository" msgstr "като „--3way“, но извън хранилище" -#: builtin/apply.c:4618 +#: builtin/apply.c:4609 msgid "--index outside a repository" msgstr "като „--index“, но извън хранилище" -#: builtin/apply.c:4621 +#: builtin/apply.c:4612 msgid "--cached outside a repository" msgstr "като „--cached“, но извън хранилище" -#: builtin/apply.c:4640 +#: builtin/apply.c:4631 #, c-format msgid "can't open patch '%s'" msgstr "кръпката „%s“ не може да бъде отворена" -#: builtin/apply.c:4654 +#: builtin/apply.c:4645 #, c-format msgid "squelched %d whitespace error" msgid_plural "squelched %d whitespace errors" msgstr[0] "пренебрегната е %d грешка в знаците за интервали" msgstr[1] "пренебрегнати са %d грешки в знаците за интервали" -#: builtin/apply.c:4660 builtin/apply.c:4670 +#: builtin/apply.c:4651 builtin/apply.c:4661 #, c-format msgid "%d line adds whitespace errors." msgid_plural "%d lines add whitespace errors." @@ -2895,120 +3436,120 @@ msgid "update BISECT_HEAD instead of checking out the current commit" msgstr "" "обновяване на указателя „BISECT_HEAD“ вместо да се използва текущото подаване" -#: builtin/blame.c:31 +#: builtin/blame.c:32 msgid "git blame [] [] [] [--] " msgstr "git blame [ОПЦИЯ…] [ОПЦИЯ_ЗА_ВЕРСИЯТА…] [ВЕРСИЯ] [--] ФАЙЛ" -#: builtin/blame.c:36 +#: builtin/blame.c:37 msgid " are documented in git-rev-list(1)" msgstr "ОПЦИИте_ЗА_ВЕРСИЯТА са документирани в ръководството git-rev-list(1)" -#: builtin/blame.c:2500 +#: builtin/blame.c:2519 msgid "Show blame entries as we find them, incrementally" msgstr "Извеждане на анотациите с намирането им, последователно" # FIXME SHA-1 -> SHA1 -#: builtin/blame.c:2501 +#: builtin/blame.c:2520 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "" "Извеждане на празни суми по SHA1 за граничните подавания (стандартно опцията " "е изключена)" -#: builtin/blame.c:2502 +#: builtin/blame.c:2521 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "" "Началните подавания да не се считат за гранични (стандартно опцията е " "изключена)" -#: builtin/blame.c:2503 +#: builtin/blame.c:2522 msgid "Show work cost statistics" msgstr "Извеждане на статистика за извършените действия" -#: builtin/blame.c:2504 +#: builtin/blame.c:2523 msgid "Show output score for blame entries" msgstr "Извеждане на допълнителна информация за определянето на анотациите" -#: builtin/blame.c:2505 +#: builtin/blame.c:2524 msgid "Show original filename (Default: auto)" msgstr "" "Извеждане на първоначалното име на файл (стандартно това е автоматично)" -#: builtin/blame.c:2506 +#: builtin/blame.c:2525 msgid "Show original linenumber (Default: off)" msgstr "" "Извеждане на първоначалният номер на ред (стандартно опцията е изключена)" -#: builtin/blame.c:2507 +#: builtin/blame.c:2526 msgid "Show in a format designed for machine consumption" msgstr "Извеждане във формат за по-нататъшна обработка" -#: builtin/blame.c:2508 +#: builtin/blame.c:2527 msgid "Show porcelain format with per-line commit information" msgstr "" "Извеждане във формат за команди от потребителско ниво с информация на всеки " "ред" -#: builtin/blame.c:2509 +#: builtin/blame.c:2528 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "" "Използване на същия формат като „git-annotate“ (стандартно опцията е " "изключена)" -#: builtin/blame.c:2510 +#: builtin/blame.c:2529 msgid "Show raw timestamp (Default: off)" msgstr "Извеждане на неформатирани времена (стандартно опцията е изключена)" -#: builtin/blame.c:2511 +#: builtin/blame.c:2530 msgid "Show long commit SHA1 (Default: off)" msgstr "Извеждане на пълните суми по SHA1 (стандартно опцията е изключена)" -#: builtin/blame.c:2512 +#: builtin/blame.c:2531 msgid "Suppress author name and timestamp (Default: off)" msgstr "Без име на автор и време на промяна (стандартно опцията е изключена)" -#: builtin/blame.c:2513 +#: builtin/blame.c:2532 msgid "Show author email instead of name (Default: off)" msgstr "" "Извеждане на е-пощата на автора, а не името му (стандартно опцията е " "изключена)" -#: builtin/blame.c:2514 +#: builtin/blame.c:2533 msgid "Ignore whitespace differences" msgstr "Без разлики в знаците за интервали" -#: builtin/blame.c:2515 +#: builtin/blame.c:2534 msgid "Spend extra cycles to find better match" msgstr "Допълнителни изчисления за по-добри резултати" -#: builtin/blame.c:2516 +#: builtin/blame.c:2535 msgid "Use revisions from instead of calling git-rev-list" msgstr "Изчитане на версиите от ФАЙЛ, а не чрез изпълнение на „git-rev-list“" -#: builtin/blame.c:2517 +#: builtin/blame.c:2536 msgid "Use 's contents as the final image" msgstr "Използване на съдържанието на ФАЙЛа като крайно положение" -#: builtin/blame.c:2518 builtin/blame.c:2519 +#: builtin/blame.c:2537 builtin/blame.c:2538 msgid "score" msgstr "напасване на редовете" -#: builtin/blame.c:2518 +#: builtin/blame.c:2537 msgid "Find line copies within and across files" msgstr "" "Търсене на копирани редове както в рамките на един файл, така и от един файл " "към друг" -#: builtin/blame.c:2519 +#: builtin/blame.c:2538 msgid "Find line movements within and across files" msgstr "" "Търсене на преместени редове както в рамките на един файл, така и от един " "файл към друг" -#: builtin/blame.c:2520 +#: builtin/blame.c:2539 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2520 +#: builtin/blame.c:2539 msgid "Process only line range n,m, counting from 1" msgstr "" "Информация само за редовете в интервала от n до m включително. Броенето " @@ -3020,27 +3561,31 @@ msgstr "" #. takes 22 places, is the longest among various forms of #. relative timestamps, but your language may need more or #. fewer display columns. -#: builtin/blame.c:2601 +#: builtin/blame.c:2620 msgid "4 years, 11 months ago" msgstr "преди 4 години и 11 месеца" -#: builtin/branch.c:24 +#: builtin/branch.c:25 msgid "git branch [] [-r | -a] [--merged | --no-merged]" msgstr "git branch [ОПЦИЯ…] [-r | -a] [--merged | --no-merged]" -#: builtin/branch.c:25 +#: builtin/branch.c:26 msgid "git branch [] [-l] [-f] []" msgstr "git branch [ОПЦИЯ…] [-l] [-f] ИМЕ_НА_КЛОН [НАЧАЛО]" -#: builtin/branch.c:26 +#: builtin/branch.c:27 msgid "git branch [] [-r] (-d | -D) ..." msgstr "git branch [ОПЦИЯ…] [-r] (-d | -D) ИМЕ_НА_КЛОН…" -#: builtin/branch.c:27 +#: builtin/branch.c:28 msgid "git branch [] (-m | -M) [] " msgstr "git branch [ОПЦИЯ…] (-m | -M) [СТАР_КЛОН] НОВ_КЛОН" -#: builtin/branch.c:150 +#: builtin/branch.c:29 +msgid "git branch [] [-r | -a] [--points-at]" +msgstr "git branch [ОПЦИЯ…] [-r | -a] [--points-at]" + +#: builtin/branch.c:142 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" @@ -3049,7 +3594,7 @@ msgstr "" "изтриване на клона „%s“, който е слят към „%s“,\n" " но още не е слят към върха „HEAD“." -#: builtin/branch.c:154 +#: builtin/branch.c:146 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" @@ -3058,12 +3603,12 @@ msgstr "" "отказване на изтриване на клона „%s“, който не е слят към\n" " „%s“, но е слят към върха „HEAD“." -#: builtin/branch.c:168 +#: builtin/branch.c:160 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "Обектът-подаване за „%s“ не може да бъде открит" -#: builtin/branch.c:172 +#: builtin/branch.c:164 #, c-format msgid "" "The branch '%s' is not fully merged.\n" @@ -3072,310 +3617,301 @@ msgstr "" "Клонът „%s“ не е слят напълно. Ако сте сигурни, че искате\n" "да го изтриете, изпълнете „git branch -D %s“." -#: builtin/branch.c:185 +#: builtin/branch.c:177 msgid "Update of config-file failed" msgstr "Неуспешно обновяване на конфигурационния файл" -#: builtin/branch.c:213 +#: builtin/branch.c:205 msgid "cannot use -a with -d" msgstr "Опцията „-a“ е несъвместима с опцията „-d“" -#: builtin/branch.c:219 +#: builtin/branch.c:211 msgid "Couldn't look up commit object for HEAD" msgstr "Обектът-подаване, сочен от указателя „HEAD“, не може да бъде открит" -#: builtin/branch.c:227 +#: builtin/branch.c:219 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." -msgstr "Не можете да изтриете клона „%s“, защото в момента е текущ." +msgstr "Не можете да изтриете текущия клон „%s“" -#: builtin/branch.c:243 +#: builtin/branch.c:235 #, c-format msgid "remote-tracking branch '%s' not found." msgstr "следящият клон „%s“ не може да бъде открит." -#: builtin/branch.c:244 +#: builtin/branch.c:236 #, c-format msgid "branch '%s' not found." msgstr "клонът „%s“ не може да бъде открит." -#: builtin/branch.c:258 +#: builtin/branch.c:251 #, c-format msgid "Error deleting remote-tracking branch '%s'" msgstr "Грешка при изтриването на следящия клон „%s“" -#: builtin/branch.c:259 +#: builtin/branch.c:252 #, c-format msgid "Error deleting branch '%s'" msgstr "Грешка при изтриването на клона „%s“" -#: builtin/branch.c:266 +#: builtin/branch.c:259 #, c-format msgid "Deleted remote-tracking branch %s (was %s).\n" msgstr "Изтрит следящ клон „%s“ (той сочеше към „%s“).\n" -#: builtin/branch.c:267 +#: builtin/branch.c:260 #, c-format msgid "Deleted branch %s (was %s).\n" msgstr "Изтрит клон „%s“ (той сочеше към „%s“).\n" -#: builtin/branch.c:368 -#, c-format -msgid "branch '%s' does not point at a commit" -msgstr "клонът „%s“ не сочи към подаване" - -#: builtin/branch.c:451 +#: builtin/branch.c:303 #, c-format msgid "[%s: gone]" msgstr "[%s: изтрит]" -#: builtin/branch.c:456 +#: builtin/branch.c:308 #, c-format msgid "[%s]" msgstr "[%s]" -#: builtin/branch.c:461 +#: builtin/branch.c:313 #, c-format msgid "[%s: behind %d]" msgstr "[%s: назад с %d]" -#: builtin/branch.c:463 +#: builtin/branch.c:315 #, c-format msgid "[behind %d]" msgstr "[назад с %d]" -#: builtin/branch.c:467 +#: builtin/branch.c:319 #, c-format msgid "[%s: ahead %d]" msgstr "[%s: напред с %d]" -#: builtin/branch.c:469 +#: builtin/branch.c:321 #, c-format msgid "[ahead %d]" msgstr "[напред с %d]" -#: builtin/branch.c:472 +#: builtin/branch.c:324 #, c-format msgid "[%s: ahead %d, behind %d]" msgstr "[%s: напред с %d, назад с %d]" -#: builtin/branch.c:475 +#: builtin/branch.c:327 #, c-format msgid "[ahead %d, behind %d]" msgstr "[напред с %d, назад с %d]" -# FIXME ** how many?? -#: builtin/branch.c:488 +#: builtin/branch.c:340 msgid " **** invalid ref ****" -msgstr " ●●●● неправилен указател ●●●●" +msgstr " ●●● неправилен указател ●●●" -#: builtin/branch.c:579 +#: builtin/branch.c:366 #, c-format msgid "(no branch, rebasing %s)" msgstr "(извън клон, пребазиране на „%s“)" -#: builtin/branch.c:582 +#: builtin/branch.c:369 #, c-format msgid "(no branch, bisect started on %s)" msgstr "(извън клон, двоично търсене от „%s“)" -#: builtin/branch.c:588 +#: builtin/branch.c:375 #, c-format msgid "(HEAD detached at %s)" msgstr "(Указателят „HEAD“ не е свързан и е при „%s“)" -#: builtin/branch.c:591 +#: builtin/branch.c:378 #, c-format msgid "(HEAD detached from %s)" msgstr "Указателят „HEAD“ не е свързан и е отделѐн от „%s“" -#: builtin/branch.c:595 +#: builtin/branch.c:382 msgid "(no branch)" msgstr "(извън клон)" -#: builtin/branch.c:642 -#, c-format -msgid "object '%s' does not point to a commit" -msgstr "обектът „%s“ не сочи към подаване" - -#: builtin/branch.c:690 -msgid "some refs could not be read" -msgstr "някои указатели не могат да бъдат прочетени" - -#: builtin/branch.c:703 +#: builtin/branch.c:524 msgid "cannot rename the current branch while not on any." msgstr "" "не можете да преименувате текущия клон, защото сте извън който и да е клон" -#: builtin/branch.c:713 +#: builtin/branch.c:534 #, c-format msgid "Invalid branch name: '%s'" msgstr "Неправилно име на клон: „%s“" -#: builtin/branch.c:728 +#: builtin/branch.c:549 msgid "Branch rename failed" msgstr "Неуспешно преименуване на клон" -#: builtin/branch.c:732 +#: builtin/branch.c:553 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "На клона с неправилно име „%s“ е дадено служебно име" -#: builtin/branch.c:736 +#: builtin/branch.c:557 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "Клонът е преименуван на „%s“, но указателят „HEAD“ не е обновен" -#: builtin/branch.c:743 +#: builtin/branch.c:564 msgid "Branch is renamed, but update of config-file failed" msgstr "Клонът е преименуван, но конфигурационният файл не е обновен" -#: builtin/branch.c:758 -#, c-format -msgid "malformed object name %s" -msgstr "неправилно име на обект „%s“" - -#: builtin/branch.c:780 +#: builtin/branch.c:587 #, c-format msgid "could not write branch description template: %s" msgstr "шаблонът за описание на клон не бе записан: „%s“" -#: builtin/branch.c:810 +#: builtin/branch.c:616 msgid "Generic options" msgstr "Общи настройки" -#: builtin/branch.c:812 +#: builtin/branch.c:618 msgid "show hash and subject, give twice for upstream branch" msgstr "" "извеждане на хеша и темата. Повтарянето на опцията прибавя отдалечените клони" -#: builtin/branch.c:813 +#: builtin/branch.c:619 msgid "suppress informational messages" msgstr "без информационни съобщения" -#: builtin/branch.c:814 +#: builtin/branch.c:620 msgid "set up tracking mode (see git-pull(1))" msgstr "задаване на режима на следене (виж git-pull(1))" -#: builtin/branch.c:816 +#: builtin/branch.c:622 msgid "change upstream info" msgstr "смяна на следения клон" -#: builtin/branch.c:820 +#: builtin/branch.c:626 msgid "use colored output" msgstr "цветен изход" -#: builtin/branch.c:821 +#: builtin/branch.c:627 msgid "act on remote-tracking branches" msgstr "действие върху следящите клони" -#: builtin/branch.c:824 builtin/branch.c:830 builtin/branch.c:851 -#: builtin/branch.c:857 builtin/commit.c:1581 builtin/commit.c:1582 -#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/tag.c:616 -#: builtin/tag.c:622 -msgid "commit" -msgstr "подаване" - -#: builtin/branch.c:825 builtin/branch.c:831 +#: builtin/branch.c:629 builtin/branch.c:630 msgid "print only branches that contain the commit" msgstr "извеждане само на клоните, които съдържат това подаване" -#: builtin/branch.c:837 +#: builtin/branch.c:633 msgid "Specific git-branch actions:" msgstr "Специални действия на „git-branch“:" -#: builtin/branch.c:838 +#: builtin/branch.c:634 msgid "list both remote-tracking and local branches" msgstr "извеждане както на следящите, така и на локалните клони" -#: builtin/branch.c:840 +#: builtin/branch.c:636 msgid "delete fully merged branch" msgstr "изтриване на клони, които са напълно слети" -#: builtin/branch.c:841 +#: builtin/branch.c:637 msgid "delete branch (even if not merged)" msgstr "изтриване и на клони, които не са напълно слети" -#: builtin/branch.c:842 +#: builtin/branch.c:638 msgid "move/rename a branch and its reflog" msgstr "" "преместване/преименуване на клон и принадлежащият му журнал на указателите" -#: builtin/branch.c:843 +#: builtin/branch.c:639 msgid "move/rename a branch, even if target exists" msgstr "преместване/преименуване на клон, дори ако има вече клон с такова име" -#: builtin/branch.c:844 +#: builtin/branch.c:640 msgid "list branch names" msgstr "извеждане на имената на клоните" -#: builtin/branch.c:845 +#: builtin/branch.c:641 msgid "create the branch's reflog" msgstr "създаване на журнала на указателите на клона" -#: builtin/branch.c:847 +#: builtin/branch.c:643 msgid "edit the description for the branch" msgstr "редактиране на описанието на клона" -#: builtin/branch.c:848 +#: builtin/branch.c:644 msgid "force creation, move/rename, deletion" msgstr "принудително създаване, преместване, преименуване, изтриване" -#: builtin/branch.c:851 -msgid "print only not merged branches" -msgstr "извеждане само на неслетите клони" - -#: builtin/branch.c:857 -msgid "print only merged branches" +#: builtin/branch.c:645 +msgid "print only branches that are merged" msgstr "извеждане само на слетите клони" -#: builtin/branch.c:861 +#: builtin/branch.c:646 +msgid "print only branches that are not merged" +msgstr "извеждане само на неслетите клони" + +#: builtin/branch.c:647 msgid "list branches in columns" msgstr "извеждане по колони" -#: builtin/branch.c:874 +#: builtin/branch.c:648 builtin/for-each-ref.c:38 builtin/tag.c:366 +msgid "key" +msgstr "ключ" + +#: builtin/branch.c:649 builtin/for-each-ref.c:39 builtin/tag.c:367 +msgid "field name to sort on" +msgstr "име на полето, по което да е подредбата" + +#: builtin/branch.c:651 builtin/for-each-ref.c:41 builtin/notes.c:398 +#: builtin/notes.c:401 builtin/notes.c:561 builtin/notes.c:564 +#: builtin/tag.c:369 +msgid "object" +msgstr "обект" + +#: builtin/branch.c:652 +msgid "print only branches of the object" +msgstr "извеждане само на клоните на обекта" + +#: builtin/branch.c:670 msgid "Failed to resolve HEAD as a valid ref." msgstr "Не може да се открие към какво сочи указателят „HEAD“" -#: builtin/branch.c:878 builtin/clone.c:622 +#: builtin/branch.c:674 builtin/clone.c:697 msgid "HEAD not found below refs/heads!" msgstr "В директорията „refs/heads“ липсва файл „HEAD“" -#: builtin/branch.c:900 +#: builtin/branch.c:694 msgid "--column and --verbose are incompatible" msgstr "Опциите „--column“ и „--verbose“ са несъвместими" -#: builtin/branch.c:911 builtin/branch.c:950 +#: builtin/branch.c:705 builtin/branch.c:747 msgid "branch name required" msgstr "Необходимо е име на клон" -#: builtin/branch.c:926 +#: builtin/branch.c:723 msgid "Cannot give description to detached HEAD" msgstr "Не може да зададете описание на „HEAD“ извън клон" -#: builtin/branch.c:931 +#: builtin/branch.c:728 msgid "cannot edit description of more than one branch" msgstr "Не може да редактирате описанието на повече от един клон едновременно" -#: builtin/branch.c:938 +#: builtin/branch.c:735 #, c-format msgid "No commit on branch '%s' yet." msgstr "В клона „%s“ все още няма подавания." -#: builtin/branch.c:941 +#: builtin/branch.c:738 #, c-format msgid "No branch named '%s'." msgstr "Липсва клон на име „%s“." -#: builtin/branch.c:956 +#: builtin/branch.c:753 msgid "too many branches for a rename operation" msgstr "Прекалено много клони за преименуване" -#: builtin/branch.c:961 +#: builtin/branch.c:758 msgid "too many branches to set new upstream" -msgstr "Прекалено много клони за задаване на следене" +msgstr "Зададени са прекалено много клони за следене" -#: builtin/branch.c:965 +#: builtin/branch.c:762 #, c-format msgid "" "could not set upstream of HEAD to %s when it does not point to any branch." @@ -3383,39 +3919,39 @@ msgstr "" "Следеното от „HEAD“ не може да се зададе да е „%s“, защото то не сочи към " "никой клон." -#: builtin/branch.c:968 builtin/branch.c:990 builtin/branch.c:1011 +#: builtin/branch.c:765 builtin/branch.c:787 builtin/branch.c:808 #, c-format msgid "no such branch '%s'" msgstr "Няма клон на име „%s“." -#: builtin/branch.c:972 +#: builtin/branch.c:769 #, c-format msgid "branch '%s' does not exist" msgstr "Не съществува клон на име „%s“." -#: builtin/branch.c:984 +#: builtin/branch.c:781 msgid "too many branches to unset upstream" msgstr "Прекалено много клони за махане на следене" -#: builtin/branch.c:988 +#: builtin/branch.c:785 msgid "could not unset upstream of HEAD when it does not point to any branch." msgstr "" "Следеното от „HEAD“ не може да махне, защото то не сочи към никой клон." -#: builtin/branch.c:994 +#: builtin/branch.c:791 #, c-format msgid "Branch '%s' has no upstream information" msgstr "Няма информация клонът „%s“ да следи някой друг" -#: builtin/branch.c:1008 +#: builtin/branch.c:805 msgid "it does not make sense to create 'HEAD' manually" msgstr "Няма никакъв смисъл ръчно да създавате „HEAD“." -#: builtin/branch.c:1014 +#: builtin/branch.c:811 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "Опциите „-a“ и „-r“ на „git branch“ са несъвместими с име на клон" -#: builtin/branch.c:1017 +#: builtin/branch.c:814 #, c-format msgid "" "The --set-upstream flag is deprecated and will be removed. Consider using --" @@ -3424,7 +3960,7 @@ msgstr "" "Опцията „--set-upstream“ вече е остаряла и предстои да бъде махната. " "Използвайте „--track“ или „--set-upstream-to“\n" -#: builtin/branch.c:1034 +#: builtin/branch.c:831 #, c-format msgid "" "\n" @@ -3435,12 +3971,12 @@ msgstr "" "За да накарате „%s“ да следи „%s“, изпълнете следната команда:\n" "\n" -#: builtin/branch.c:1035 +#: builtin/branch.c:832 #, c-format msgid " git branch -d %s\n" msgstr " git branch -d %s\n" -#: builtin/branch.c:1036 +#: builtin/branch.c:833 #, c-format msgid " git branch --set-upstream-to %s\n" msgstr " git branch --set-upstream-to %s\n" @@ -3458,7 +3994,7 @@ msgstr "За създаването на пратка е необходимо х msgid "Need a repository to unbundle." msgstr "За приемането на пратка е необходимо хранилище." -#: builtin/cat-file.c:369 +#: builtin/cat-file.c:428 msgid "" "git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|" "|--textconv) " @@ -3466,67 +4002,72 @@ msgstr "" "git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -" "p | ВИД | --textconv) ОБЕКТ" -#: builtin/cat-file.c:370 -msgid "" -"git cat-file (--batch | --batch-check) [--follow-symlinks] < " -msgstr "" -"git cat-file (--batch | --batch-check) [--follow-symlinks] < СПИСЪК_С_ОБЕКТИ" +#: builtin/cat-file.c:429 +msgid "git cat-file (--batch | --batch-check) [--follow-symlinks]" +msgstr "git cat-file (--batch | --batch-check) [--follow-symlinks]" -#: builtin/cat-file.c:407 +#: builtin/cat-file.c:466 msgid " can be one of: blob, tree, commit, tag" msgstr "" "ВИДът може да е: „blob“ (обект BLOB), „tree“ (дърво), „commit“ (подаване), " "„tag“ (етикет)" -#: builtin/cat-file.c:408 +#: builtin/cat-file.c:467 msgid "show object type" msgstr "извеждане на вида на обект" -#: builtin/cat-file.c:409 +#: builtin/cat-file.c:468 msgid "show object size" msgstr "извеждане на размера на обект" -#: builtin/cat-file.c:411 +#: builtin/cat-file.c:470 msgid "exit with zero when there's no error" msgstr "изход с 0, когато няма грешка" -#: builtin/cat-file.c:412 +#: builtin/cat-file.c:471 msgid "pretty-print object's content" msgstr "форматирано извеждане на съдържанието на обекта" -#: builtin/cat-file.c:414 +#: builtin/cat-file.c:473 msgid "for blob objects, run textconv on object's content" msgstr "" "да се стартира програмата зададена в настройката „textconv“ за преобразуване " -"на съдържанието на обекта" +"на съдържанието на обекта BLOB" -#: builtin/cat-file.c:416 +#: builtin/cat-file.c:475 msgid "allow -s and -t to work with broken/corrupt objects" msgstr "позволяване на опциите „-s“ и „-t“ да работят с повредени обекти" -#: builtin/cat-file.c:418 +#: builtin/cat-file.c:476 +msgid "buffer --batch output" +msgstr "буфериране на изхода от „--batch“" + +#: builtin/cat-file.c:478 msgid "show info and content of objects fed from the standard input" msgstr "" "извеждане на информация и съдържание на обектите подадени на стандартния вход" -#: builtin/cat-file.c:421 +#: builtin/cat-file.c:481 msgid "show info about objects fed from the standard input" msgstr "извеждане на информация за обектите подадени на стандартния вход" -#: builtin/cat-file.c:424 +#: builtin/cat-file.c:484 msgid "follow in-tree symlinks (used with --batch or --batch-check)" msgstr "" "следване на символните връзки сочещи в дървото (ползва се с „--batch“ или „--" "batch-check“)" +#: builtin/cat-file.c:486 +msgid "show all objects with --batch or --batch-check" +msgstr "извеждане на всички обекти с „--batch“ или „--batch-check“" + #: builtin/check-attr.c:11 msgid "git check-attr [-a | --all | ...] [--] ..." msgstr "git check-attr [-a | --all | АТРИБУТ…] [--] ПЪТ…" #: builtin/check-attr.c:12 -msgid "git check-attr --stdin [-z] [-a | --all | ...] < " -msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…] < СПИСЪК_С_ПЪТИЩА" +msgid "git check-attr --stdin [-z] [-a | --all | ...]" +msgstr "git check-attr --stdin [-z] [-a | --all | АТРИБУТ…]" #: builtin/check-attr.c:19 msgid "report all attributes set on file" @@ -3544,7 +4085,7 @@ msgstr "изчитане на имената на файловете от ста msgid "terminate input and output records by a NUL character" msgstr "разделяне на входните и изходните записи с нулевия знак „NUL“" -#: builtin/check-ignore.c:18 builtin/checkout.c:1202 builtin/gc.c:279 +#: builtin/check-ignore.c:18 builtin/checkout.c:1134 builtin/gc.c:325 msgid "suppress progress reporting" msgstr "без показване на напредъка" @@ -3560,7 +4101,6 @@ msgstr "прескачане на индекса при проверката" msgid "cannot specify pathnames with --stdin" msgstr "опцията „--stdin“ е несъвместима с имена на пътища" -# FIXME options #: builtin/check-ignore.c:157 msgid "-z only makes sense with --stdin" msgstr "опцията „-z“ изисква „--stdin“" @@ -3573,12 +4113,10 @@ msgstr "не е зададен път" msgid "--quiet is only valid with a single pathname" msgstr "опцията „--quiet“ изисква да е подаден точно един път" -# FIXME options #: builtin/check-ignore.c:165 msgid "cannot have both --quiet and --verbose" msgstr "опциите „--quiet“ и „--verbose“ са несъвместими" -# FIXME options #: builtin/check-ignore.c:168 msgid "--non-matching is only valid with --verbose" msgstr "опцията „--non-matching“ изисква „--verbose“" @@ -3633,6 +4171,8 @@ msgid "write the content to temporary files" msgstr "записване на съдържанието във временни файлове" #: builtin/checkout-index.c:204 builtin/column.c:30 +#: builtin/submodule--helper.c:172 builtin/submodule--helper.c:175 +#: builtin/submodule--helper.c:178 builtin/submodule--helper.c:181 msgid "string" msgstr "НИЗ" @@ -3644,11 +4184,11 @@ msgstr "при създаването на нови файлове да се д msgid "copy out the files from named stage" msgstr "копиране на файловете от това състояние на сливане" -#: builtin/checkout.c:24 +#: builtin/checkout.c:25 msgid "git checkout [] " msgstr "git checkout [ОПЦИЯ…] КЛОН" -#: builtin/checkout.c:25 +#: builtin/checkout.c:26 msgid "git checkout [] [] -- ..." msgstr "git checkout [ОПЦИЯ…] [КЛОН] -- ФАЙЛ…" @@ -3662,13 +4202,11 @@ msgstr "вашата версия липсва в пътя „%s“" msgid "path '%s' does not have their version" msgstr "чуждата версия липсва в пътя „%s“" -# FIXME SAME AS [1] #: builtin/checkout.c:152 #, c-format msgid "path '%s' does not have all necessary versions" msgstr "някоя от необходимите версии липсва в пътя „%s“" -# FIXME SAME AS [1] #: builtin/checkout.c:196 #, c-format msgid "path '%s' does not have necessary versions" @@ -3714,46 +4252,46 @@ msgstr "пътят „%s“ не е слят" msgid "you need to resolve your current index first" msgstr "първо трябва да коригирате индекса си" -#: builtin/checkout.c:627 +#: builtin/checkout.c:623 #, c-format -msgid "Can not do reflog for '%s'\n" -msgstr "Журналът на указателите за „%s“ не може да бъде създаден\n" +msgid "Can not do reflog for '%s': %s\n" +msgstr "Журналът на указателите за „%s“ не може да се проследи: %s\n" -#: builtin/checkout.c:663 +#: builtin/checkout.c:661 msgid "HEAD is now at" msgstr "Указателят „HEAD“ в момента сочи към" -#: builtin/checkout.c:670 +#: builtin/checkout.c:668 #, c-format msgid "Reset branch '%s'\n" msgstr "Зануляване на клона „%s“\n" -#: builtin/checkout.c:673 +#: builtin/checkout.c:671 #, c-format msgid "Already on '%s'\n" msgstr "Вече сте на „%s“\n" -#: builtin/checkout.c:677 +#: builtin/checkout.c:675 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "Преминаване към клона „%s“ и зануляване на промените\n" -#: builtin/checkout.c:679 builtin/checkout.c:1134 +#: builtin/checkout.c:677 builtin/checkout.c:1066 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Преминахте към новия клон „%s“\n" -#: builtin/checkout.c:681 +#: builtin/checkout.c:679 #, c-format msgid "Switched to branch '%s'\n" msgstr "Преминахте към клона „%s“\n" -#: builtin/checkout.c:733 +#: builtin/checkout.c:731 #, c-format msgid " ... and %d more.\n" msgstr "… и още %d.\n" -#: builtin/checkout.c:739 +#: builtin/checkout.c:737 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -3775,7 +4313,7 @@ msgstr[1] "" "\n" "%s\n" -#: builtin/checkout.c:758 +#: builtin/checkout.c:756 #, c-format msgid "" "If you want to keep it by creating a new branch, this may be a good time\n" @@ -3802,153 +4340,154 @@ msgstr[1] "" " git branch ИМЕ_НА_НОВИЯ_КЛОН %s\n" "\n" -#: builtin/checkout.c:794 +#: builtin/checkout.c:792 msgid "internal error in revision walk" msgstr "вътрешна грешка при обхождането на версиите" -#: builtin/checkout.c:798 +#: builtin/checkout.c:796 msgid "Previous HEAD position was" msgstr "Преди това „HEAD“ сочеше към" -#: builtin/checkout.c:825 builtin/checkout.c:1129 +#: builtin/checkout.c:823 builtin/checkout.c:1061 msgid "You are on a branch yet to be born" msgstr "В момента сте на клон, който предстои да бъде създаден" -#: builtin/checkout.c:931 -#, c-format -msgid "'%s' is already checked out at '%s'" -msgstr "„%s“ вече е изтеглен в „%s“" - -#: builtin/checkout.c:1036 +#: builtin/checkout.c:968 #, c-format msgid "only one reference expected, %d given." msgstr "очакваше се един указател, а сте подали %d." -#: builtin/checkout.c:1075 +#: builtin/checkout.c:1007 builtin/worktree.c:213 #, c-format msgid "invalid reference: %s" msgstr "неправилен указател: %s" -#: builtin/checkout.c:1104 +#: builtin/checkout.c:1036 #, c-format msgid "reference is not a tree: %s" msgstr "указателят не сочи към обект-дърво: %s" -#: builtin/checkout.c:1143 +#: builtin/checkout.c:1075 msgid "paths cannot be used with switching branches" msgstr "задаването на път е несъвместимо с преминаването от един клон към друг" -#: builtin/checkout.c:1146 builtin/checkout.c:1150 +#: builtin/checkout.c:1078 builtin/checkout.c:1082 #, c-format msgid "'%s' cannot be used with switching branches" msgstr "опцията „%s“ е несъвместима с преминаването от един клон към друг" -#: builtin/checkout.c:1154 builtin/checkout.c:1157 builtin/checkout.c:1162 -#: builtin/checkout.c:1165 +#: builtin/checkout.c:1086 builtin/checkout.c:1089 builtin/checkout.c:1094 +#: builtin/checkout.c:1097 #, c-format msgid "'%s' cannot be used with '%s'" msgstr "опцията „%s“ е несъвместима с „%s“" -#: builtin/checkout.c:1170 +#: builtin/checkout.c:1102 #, c-format msgid "Cannot switch branch to a non-commit '%s'" msgstr "" "За да преминете към клон, подайте указател, който сочи към подаване. „%s“ не " "е такъв" -#: builtin/checkout.c:1203 builtin/checkout.c:1205 builtin/clone.c:83 -#: builtin/remote.c:159 builtin/remote.c:161 builtin/worktree.c:282 -#: builtin/worktree.c:284 +#: builtin/checkout.c:1135 builtin/checkout.c:1137 builtin/clone.c:83 +#: builtin/remote.c:165 builtin/remote.c:167 builtin/worktree.c:320 +#: builtin/worktree.c:322 msgid "branch" msgstr "клон" -#: builtin/checkout.c:1204 +#: builtin/checkout.c:1136 msgid "create and checkout a new branch" msgstr "създаване и преминаване към нов клон" -#: builtin/checkout.c:1206 +#: builtin/checkout.c:1138 msgid "create/reset and checkout a branch" msgstr "създаване/зануляване на клон и преминаване към него" -#: builtin/checkout.c:1207 +#: builtin/checkout.c:1139 msgid "create reflog for new branch" msgstr "създаване на журнал на указателите за нов клон" -#: builtin/checkout.c:1208 +#: builtin/checkout.c:1140 msgid "detach the HEAD at named commit" msgstr "отделяне на указателя „HEAD“ към указаното подаване" -#: builtin/checkout.c:1209 +#: builtin/checkout.c:1141 msgid "set upstream info for new branch" msgstr "задаване на кой клон бива следен при създаването на новия клон" -#: builtin/checkout.c:1211 +#: builtin/checkout.c:1143 msgid "new-branch" msgstr "НОВ_КЛОН" -#: builtin/checkout.c:1211 +#: builtin/checkout.c:1143 msgid "new unparented branch" msgstr "нов клон без родител" -#: builtin/checkout.c:1212 +#: builtin/checkout.c:1144 msgid "checkout our version for unmerged files" msgstr "изтегляне на вашата версия на неслетите файлове" -#: builtin/checkout.c:1214 +#: builtin/checkout.c:1146 msgid "checkout their version for unmerged files" msgstr "изтегляне на чуждата версия на неслетите файлове" -#: builtin/checkout.c:1216 +#: builtin/checkout.c:1148 msgid "force checkout (throw away local modifications)" msgstr "принудително изтегляне (вашите промени ще бъдат занулени)" -#: builtin/checkout.c:1217 +#: builtin/checkout.c:1149 msgid "perform a 3-way merge with the new branch" msgstr "извършване на тройно сливане с новия клон" -#: builtin/checkout.c:1218 builtin/merge.c:227 +#: builtin/checkout.c:1150 builtin/merge.c:227 msgid "update ignored files (default)" msgstr "обновяване на игнорираните файлове (стандартно)" -#: builtin/checkout.c:1219 builtin/log.c:1239 parse-options.h:244 +#: builtin/checkout.c:1151 builtin/log.c:1266 parse-options.h:250 msgid "style" msgstr "стил" -#: builtin/checkout.c:1220 +#: builtin/checkout.c:1152 msgid "conflict style (merge or diff3)" msgstr "действие при конфликт (сливане или тройна разлика)" -#: builtin/checkout.c:1223 +#: builtin/checkout.c:1155 msgid "do not limit pathspecs to sparse entries only" msgstr "без ограничаване на изброените пътища само до частично изтеглените" -#: builtin/checkout.c:1225 +#: builtin/checkout.c:1157 msgid "second guess 'git checkout '" msgstr "" "опит за отгатване на име на клон след неуспешен опит с „git checkout " "НЕСЪЩЕСТВУВАЩ_КЛОН“" -#: builtin/checkout.c:1227 +#: builtin/checkout.c:1159 msgid "do not check if another worktree is holding the given ref" msgstr "без проверка дали друго работно дърво държи указателя" -#: builtin/checkout.c:1252 +#: builtin/checkout.c:1160 builtin/clone.c:57 builtin/fetch.c:112 +#: builtin/merge.c:224 builtin/pull.c:109 builtin/push.c:558 +#: builtin/send-pack.c:168 +msgid "force progress reporting" +msgstr "извеждане на напредъка" + +#: builtin/checkout.c:1191 msgid "-b, -B and --orphan are mutually exclusive" msgstr "Опциите „-b“, „-B“ и „--orphan“ са несъвместими една с друга" -#: builtin/checkout.c:1269 +#: builtin/checkout.c:1208 msgid "--track needs a branch name" msgstr "опцията „--track“ изисква име на клон" -#: builtin/checkout.c:1274 +#: builtin/checkout.c:1213 msgid "Missing branch name; try -b" msgstr "Липсва име на клон, използвайте опцията „-b“" -#: builtin/checkout.c:1310 +#: builtin/checkout.c:1249 msgid "invalid path specification" msgstr "указан е неправилен път" -#: builtin/checkout.c:1317 +#: builtin/checkout.c:1256 #, c-format msgid "" "Cannot update paths and switch to branch '%s' at the same time.\n" @@ -3957,12 +4496,12 @@ msgstr "" "Не можете едновременно да обновявате пътища и да преминете към клона „%s“.\n" "Дали не искате да изтеглите „%s“, който не сочи към подаване?" -#: builtin/checkout.c:1322 +#: builtin/checkout.c:1261 #, c-format msgid "git checkout: --detach does not take a path argument '%s'" msgstr "git checkout: опцията „--detach“ не приема аргумент-път „%s“" -#: builtin/checkout.c:1326 +#: builtin/checkout.c:1265 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -3970,37 +4509,37 @@ msgstr "" "git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“\n" "са несъвместими с изтегляне от индекса." -#: builtin/clean.c:26 +#: builtin/clean.c:25 msgid "" "git clean [-d] [-f] [-i] [-n] [-q] [-e ] [-x | -X] [--] ..." msgstr "git clean [-d] [-f] [-i] [-n] [-q] [-e ШАБЛОН] [-x | -X] [--] ПЪТ…" -#: builtin/clean.c:30 +#: builtin/clean.c:29 #, c-format msgid "Removing %s\n" msgstr "Изтриване на „%s“\n" -#: builtin/clean.c:31 +#: builtin/clean.c:30 #, c-format msgid "Would remove %s\n" msgstr "Файлът „%s“ ще бъде изтрит\n" -#: builtin/clean.c:32 +#: builtin/clean.c:31 #, c-format msgid "Skipping repository %s\n" msgstr "Прескачане на хранилището „%s“\n" -#: builtin/clean.c:33 +#: builtin/clean.c:32 #, c-format msgid "Would skip repository %s\n" msgstr "Хранилището „%s“ ще бъде прескочено\n" -#: builtin/clean.c:34 +#: builtin/clean.c:33 #, c-format msgid "failed to remove %s" msgstr "файлът „%s“ не може да бъде изтрит" -#: builtin/clean.c:295 +#: builtin/clean.c:315 msgid "" "Prompt help:\n" "1 - select a numbered item\n" @@ -4012,7 +4551,7 @@ msgstr "" "ПРЕФИКС — избор на единствен обект по този уникален префикс\n" " — (празно) нищо да не се избира" -#: builtin/clean.c:299 +#: builtin/clean.c:319 msgid "" "Prompt help:\n" "1 - select a single item\n" @@ -4032,39 +4571,38 @@ msgstr "" "* — избиране на всички обекти\n" " — (празно) завършване на избирането" -# FIXME WTF does this mean -#: builtin/clean.c:515 +#: builtin/clean.c:535 #, c-format msgid "Huh (%s)?" msgstr "Неправилен избор (%s). Изберете отново." # FIXME - should we use >> or sth else -#: builtin/clean.c:657 +#: builtin/clean.c:677 #, c-format msgid "Input ignore patterns>> " msgstr "Шаблони за игнорирани елементи≫ " -#: builtin/clean.c:694 +#: builtin/clean.c:714 #, c-format msgid "WARNING: Cannot find items matched by: %s" msgstr "ПРЕДУПРЕЖДЕНИЕ: Никой обект не напасва на „%s“" -#: builtin/clean.c:715 +#: builtin/clean.c:735 msgid "Select items to delete" msgstr "Избиране на обекти за изтриване" #. TRANSLATORS: Make sure to keep [y/N] as is -#: builtin/clean.c:756 +#: builtin/clean.c:776 #, c-format msgid "Remove %s [y/N]? " msgstr "Да се изтрие ли „%s“? „y“ — да, „N“ — НЕ" # FIXME improve message -#: builtin/clean.c:781 +#: builtin/clean.c:801 msgid "Bye." msgstr "Изход." -#: builtin/clean.c:789 +#: builtin/clean.c:809 msgid "" "clean - start cleaning\n" "filter by pattern - exclude items from deletion\n" @@ -4082,64 +4620,63 @@ msgstr "" "help — този край\n" "? — подсказка за шаблоните" -# FIXME how many *** -#: builtin/clean.c:816 +#: builtin/clean.c:836 msgid "*** Commands ***" msgstr "●●● Команди ●●●" # FIXME improve message -#: builtin/clean.c:817 +#: builtin/clean.c:837 msgid "What now" msgstr "Избор на следващо действие" -#: builtin/clean.c:825 +#: builtin/clean.c:845 msgid "Would remove the following item:" msgid_plural "Would remove the following items:" msgstr[0] "Следният обект ще бъде изтрит:" msgstr[1] "Следните обекти ще бъдат изтрити:" -#: builtin/clean.c:842 +#: builtin/clean.c:862 msgid "No more files to clean, exiting." msgstr "Файловете за изчистване свършиха. Изход от програмата." -#: builtin/clean.c:873 +#: builtin/clean.c:893 msgid "do not print names of files removed" msgstr "без извеждане на имената на файловете, които ще бъдат изтрити" -#: builtin/clean.c:875 +#: builtin/clean.c:895 msgid "force" msgstr "принудително изтриване" -#: builtin/clean.c:876 +#: builtin/clean.c:896 msgid "interactive cleaning" msgstr "интерактивно изтриване" -#: builtin/clean.c:878 +#: builtin/clean.c:898 msgid "remove whole directories" msgstr "изтриване на цели директории" -#: builtin/clean.c:879 builtin/describe.c:407 builtin/grep.c:714 -#: builtin/ls-files.c:443 builtin/name-rev.c:311 builtin/show-ref.c:187 +#: builtin/clean.c:899 builtin/describe.c:407 builtin/grep.c:709 +#: builtin/ls-files.c:443 builtin/name-rev.c:307 builtin/show-ref.c:182 msgid "pattern" msgstr "шаблон" -#: builtin/clean.c:880 +#: builtin/clean.c:900 msgid "add to ignore rules" msgstr "добавяне на ШАБЛОН от файлове, които да не се трият" -#: builtin/clean.c:881 +#: builtin/clean.c:901 msgid "remove ignored files, too" msgstr "изтриване и на игнорираните файлове" -#: builtin/clean.c:883 +#: builtin/clean.c:903 msgid "remove only ignored files" msgstr "изтриване само на игнорирани файлове" -#: builtin/clean.c:901 +#: builtin/clean.c:921 msgid "-x and -X cannot be used together" msgstr "опциите „-x“ и „-X“ са несъвместими" -#: builtin/clean.c:905 +#: builtin/clean.c:925 msgid "" "clean.requireForce set to true and neither -i, -n, nor -f given; refusing to " "clean" @@ -4147,7 +4684,7 @@ msgstr "" "Настройката „clean.requireForce“ е зададена като истина, което изисква някоя " "от опциите „-i“, „-n“ или „-f“. Няма да се извърши изчистване" -#: builtin/clean.c:908 +#: builtin/clean.c:928 msgid "" "clean.requireForce defaults to true and neither -i, -n, nor -f given; " "refusing to clean" @@ -4160,16 +4697,11 @@ msgstr "" msgid "git clone [] [--] []" msgstr "git clone [ОПЦИЯ…] [--] ХРАНИЛИЩЕ [ДИРЕКТОРИЯ]" -#: builtin/clone.c:57 builtin/fetch.c:111 builtin/merge.c:224 -#: builtin/push.c:523 -msgid "force progress reporting" -msgstr "извеждане на напредъка" - #: builtin/clone.c:59 msgid "don't create a checkout" msgstr "без създаване на работно дърво" -#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:503 +#: builtin/clone.c:60 builtin/clone.c:62 builtin/init-db.c:469 msgid "create a bare repository" msgstr "създаване на голо хранилище" @@ -4194,15 +4726,15 @@ msgstr "настройване за споделено хранилище" msgid "initialize submodules in the clone" msgstr "инициализиране на подмодулите при това клониране" -#: builtin/clone.c:75 builtin/init-db.c:500 +#: builtin/clone.c:75 builtin/init-db.c:466 msgid "template-directory" msgstr "директория с шаблони" -#: builtin/clone.c:76 builtin/init-db.c:501 +#: builtin/clone.c:76 builtin/init-db.c:467 msgid "directory from which templates will be used" msgstr "директория, която съдържа шаблоните, които да се ползват" -#: builtin/clone.c:78 +#: builtin/clone.c:78 builtin/submodule--helper.c:179 msgid "reference repository" msgstr "еталонно хранилище" @@ -4226,7 +4758,7 @@ msgstr "изтегляне на този КЛОН, а не соченият от msgid "path to git-upload-pack on the remote" msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище" -#: builtin/clone.c:87 builtin/fetch.c:112 builtin/grep.c:659 +#: builtin/clone.c:87 builtin/fetch.c:113 builtin/grep.c:654 builtin/pull.c:186 msgid "depth" msgstr "ДЪЛБОЧИНА" @@ -4240,11 +4772,11 @@ msgstr "" "клониране само на един клон — или сочения от отдалечения „HEAD“, или изрично " "зададения с „--branch“" -#: builtin/clone.c:91 builtin/init-db.c:509 +#: builtin/clone.c:91 builtin/init-db.c:475 msgid "gitdir" msgstr "СЛУЖЕБНА_ДИРЕКТОРИЯ" -#: builtin/clone.c:92 builtin/init-db.c:510 +#: builtin/clone.c:92 builtin/init-db.c:476 msgid "separate git dir from working tree" msgstr "отделна СЛУЖЕБНА_ДИРЕКТОРИЯ за git извън работното дърво" @@ -4256,57 +4788,57 @@ msgstr "КЛЮЧ=СТОЙНОСТ" msgid "set config inside the new repository" msgstr "задаване на настройките на новото хранилище" -#: builtin/clone.c:240 +#: builtin/clone.c:300 +#, c-format +msgid "reference repository '%s' as a linked checkout is not supported yet." +msgstr "все още не се поддържа еталонно хранилище „%s“ като свързано." + +#: builtin/clone.c:302 #, c-format msgid "reference repository '%s' is not a local repository." msgstr "еталонното хранилище „%s“ не е локално" -#: builtin/clone.c:244 +#: builtin/clone.c:307 #, c-format msgid "reference repository '%s' is shallow" msgstr "еталонното хранилище „%s“ е плитко" -#: builtin/clone.c:247 +#: builtin/clone.c:310 #, c-format msgid "reference repository '%s' is grafted" msgstr "еталонното хранилище „%s“ е с присаждане" -#: builtin/clone.c:310 -#, c-format -msgid "failed to create directory '%s'" -msgstr "директорията „%s“ не може да бъде създадена" - -#: builtin/clone.c:312 builtin/diff.c:84 +#: builtin/clone.c:375 builtin/diff.c:84 #, c-format msgid "failed to stat '%s'" msgstr "не може да бъде получена информация чрез „stat“ за „%s“" -#: builtin/clone.c:314 +#: builtin/clone.c:377 #, c-format msgid "%s exists and is not a directory" msgstr "„%s“ съществува и не е директория" -#: builtin/clone.c:328 +#: builtin/clone.c:391 #, c-format msgid "failed to stat %s\n" msgstr "не може да бъде получена информация чрез „stat“ за „%s“\n" -#: builtin/clone.c:350 +#: builtin/clone.c:413 #, c-format msgid "failed to create link '%s'" msgstr "връзката „%s“ не може да бъде създадена" -#: builtin/clone.c:354 +#: builtin/clone.c:417 #, c-format msgid "failed to copy file to '%s'" msgstr "файлът не може да бъде копиран като „%s“" -#: builtin/clone.c:377 builtin/clone.c:551 +#: builtin/clone.c:442 builtin/clone.c:626 #, c-format msgid "done.\n" msgstr "действието завърши.\n" -#: builtin/clone.c:389 +#: builtin/clone.c:454 msgid "" "Clone succeeded, but checkout failed.\n" "You can inspect what was checked out with 'git status'\n" @@ -4317,7 +4849,7 @@ msgstr "" "клон в момента са изтеглени с командата „git status“. Можете да\n" "завършите изтеглянето на клона с командата „git checkout -f HEAD“.\n" -#: builtin/clone.c:466 +#: builtin/clone.c:531 #, c-format msgid "Could not find remote branch %s to clone." msgstr "" @@ -4325,120 +4857,116 @@ msgstr "" "и който следва да бъде изтеглен, не съществува." # FIXME translator note that the space at end is necesssary -#: builtin/clone.c:546 +#: builtin/clone.c:621 #, c-format msgid "Checking connectivity... " msgstr "Проверка на връзката… " -#: builtin/clone.c:549 +#: builtin/clone.c:624 msgid "remote did not send all necessary objects" msgstr "отдалеченото хранилище не изпрати всички необходими обекти." -#: builtin/clone.c:613 +#: builtin/clone.c:688 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" "указателят „HEAD“ от отдалеченото хранилище сочи към нещо,\n" "което не съществува. Не може да се изтегли определен клон.\n" -#: builtin/clone.c:644 +#: builtin/clone.c:719 msgid "unable to checkout working tree" msgstr "работното дърво не може да бъде подготвено" -#: builtin/clone.c:731 +#: builtin/clone.c:808 msgid "cannot repack to clean up" msgstr "не може да се извърши пакетиране за изчистване на файловете" -#: builtin/clone.c:733 +#: builtin/clone.c:810 msgid "cannot unlink temporary alternates file" msgstr "временният файл за алтернативни обекти не може да бъде изтрит" -#: builtin/clone.c:763 +#: builtin/clone.c:842 msgid "Too many arguments." msgstr "Прекалено много аргументи." -#: builtin/clone.c:767 +#: builtin/clone.c:846 msgid "You must specify a repository to clone." msgstr "Трябва да укажете кое хранилище искате да клонирате." -#: builtin/clone.c:778 +#: builtin/clone.c:857 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "опциите „--bare“ и „--origin %s“ са несъвместими." -#: builtin/clone.c:781 +#: builtin/clone.c:860 msgid "--bare and --separate-git-dir are incompatible." msgstr "опциите „--bare“ и „--separate-git-dir“ са несъвместими." -#: builtin/clone.c:794 +#: builtin/clone.c:873 #, c-format msgid "repository '%s' does not exist" msgstr "не съществува хранилище „%s“" -#: builtin/clone.c:800 builtin/fetch.c:1160 +#: builtin/clone.c:879 builtin/fetch.c:1166 #, c-format msgid "depth %s is not a positive number" msgstr "дълбочината трябва да е положително цяло число, а не „%s“" -#: builtin/clone.c:810 +#: builtin/clone.c:889 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "целевият път „%s“ съществува и не е празна директория." -#: builtin/clone.c:820 +#: builtin/clone.c:899 #, c-format msgid "working tree '%s' already exists." msgstr "в „%s“ вече съществува работно дърво." -#: builtin/clone.c:835 builtin/clone.c:846 builtin/worktree.c:193 -#: builtin/worktree.c:220 +#: builtin/clone.c:914 builtin/clone.c:925 builtin/submodule--helper.c:224 +#: builtin/worktree.c:221 builtin/worktree.c:248 #, c-format msgid "could not create leading directories of '%s'" msgstr "родителските директории на „%s“ не могат да бъдат създадени" -#: builtin/clone.c:838 +#: builtin/clone.c:917 #, c-format msgid "could not create work tree dir '%s'" msgstr "работното дърво в „%s“ не може да бъде създадено." -#: builtin/clone.c:856 +#: builtin/clone.c:935 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Клониране и създаване на голо хранилище в „%s“…\n" -#: builtin/clone.c:858 +#: builtin/clone.c:937 #, c-format msgid "Cloning into '%s'...\n" msgstr "Клониране и създаване на хранилище в „%s“…\n" -#: builtin/clone.c:883 -msgid "--dissociate given, but there is no --reference" -msgstr "Опцията „--dissociate“ е несъвместима с „--reference“" - -#: builtin/clone.c:900 +#: builtin/clone.c:975 msgid "--depth is ignored in local clones; use file:// instead." msgstr "" "При локално клониране опцията „--depth“ се игнорира. Ползвайте схемата " "„file://“." -#: builtin/clone.c:903 +#: builtin/clone.c:978 msgid "source repository is shallow, ignoring --local" msgstr "клонираното хранилище е плитко, затова опцията „--local“ се игнорира" -#: builtin/clone.c:908 +#: builtin/clone.c:983 msgid "--local is ignored" msgstr "опцията „--local“ се игнорира" -#: builtin/clone.c:912 +#: builtin/clone.c:987 #, c-format msgid "Don't know how to clone %s" msgstr "Не се поддържа клониране на връзки от вида „%s“ " -#: builtin/clone.c:961 builtin/clone.c:969 +#: builtin/clone.c:1036 builtin/clone.c:1044 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Отдалеченият клон „%s“ липсва в клонираното хранилище „%s“" -#: builtin/clone.c:972 +#: builtin/clone.c:1047 msgid "You appear to have cloned an empty repository." msgstr "Изглежда клонирахте празно хранилище." @@ -4474,15 +5002,15 @@ msgstr "Поле в знаци между колоните" msgid "--command must be the first argument" msgstr "опцията „--command“ трябва да е първият аргумент" -#: builtin/commit.c:37 +#: builtin/commit.c:38 msgid "git commit [] [--] ..." msgstr "git commit [ОПЦИЯ…] [--] ПЪТ…" -#: builtin/commit.c:42 +#: builtin/commit.c:43 msgid "git status [] [--] ..." msgstr "git status [ОПЦИЯ…] [--] ПЪТ…" -#: builtin/commit.c:47 +#: builtin/commit.c:48 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -4510,7 +5038,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:60 +#: builtin/commit.c:61 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -4535,7 +5063,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:72 +#: builtin/commit.c:73 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -4547,7 +5075,7 @@ msgstr "" "с опцията „--allow-empty“, или да го изтриете от историята с командата:\n" "„git reset HEAD^“.\n" -#: builtin/commit.c:77 +#: builtin/commit.c:78 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -4562,11 +5090,11 @@ msgstr "" " git commit --allow-empty\n" "\n" -#: builtin/commit.c:84 +#: builtin/commit.c:85 msgid "Otherwise, please use 'git reset'\n" msgstr "В противен случай използвайте командата „git reset“\n" -#: builtin/commit.c:87 +#: builtin/commit.c:88 msgid "" "If you wish to skip this commit, use:\n" "\n" @@ -4582,31 +5110,27 @@ msgstr "" "Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n" "останалите подавания.\n" -#: builtin/commit.c:304 +#: builtin/commit.c:305 msgid "failed to unpack HEAD tree object" msgstr "върховото дърво (HEAD tree object) не може да бъде извадено от пакет" -#: builtin/commit.c:344 +#: builtin/commit.c:346 msgid "unable to create temporary index" msgstr "временният индекс не може да бъде създаден" -#: builtin/commit.c:350 +#: builtin/commit.c:352 msgid "interactive add failed" msgstr "неуспешно интерактивно добавяне" -#: builtin/commit.c:361 -msgid "unable to write index file" -msgstr "индексът не може да бъде записан" - -#: builtin/commit.c:363 +#: builtin/commit.c:365 msgid "unable to update temporary index" msgstr "временният индекс не може да бъде обновен" -#: builtin/commit.c:365 +#: builtin/commit.c:367 msgid "Failed to update main cache tree" msgstr "Дървото на основния кеш не може да бъде обновено" -#: builtin/commit.c:389 builtin/commit.c:414 builtin/commit.c:463 +#: builtin/commit.c:391 builtin/commit.c:414 builtin/commit.c:463 msgid "unable to write new_index file" msgstr "новият индекс не може да бъде записан" @@ -4680,11 +5204,6 @@ msgstr "съобщението за сливане MERGE_MSG не може да msgid "could not read SQUASH_MSG" msgstr "съобщението за смачкване SQUASH_MSG не може да бъде прочетено" -#: builtin/commit.c:738 builtin/merge.c:1079 -#, c-format -msgid "could not read '%s'" -msgstr "файлът „%s“ не може да бъде прочетен" - #: builtin/commit.c:785 msgid "could not write commit template" msgstr "шаблонът за подаване не може да бъде запазен" @@ -4765,7 +5284,7 @@ msgstr "Индексът не може да бъде прочетен" msgid "Error building trees" msgstr "Грешка при изграждане на дърветата" -#: builtin/commit.c:953 builtin/tag.c:495 +#: builtin/commit.c:953 builtin/tag.c:266 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Подайте съобщението с някоя от опциите „-m“ или „-F“.\n" @@ -4846,7 +5365,7 @@ msgstr "" "сте\n" "ползвали опцията „--only“ с ПЪТища…" -#: builtin/commit.c:1209 builtin/tag.c:728 +#: builtin/commit.c:1209 builtin/tag.c:475 #, c-format msgid "Invalid cleanup mode %s" msgstr "Несъществуващ режим на изчистване „%s“" @@ -4855,32 +5374,33 @@ msgstr "Несъществуващ режим на изчистване „%s“ msgid "Paths with -a does not make sense." msgstr "Опцията „-a“ е несъвместима със задаването на пътища." -#: builtin/commit.c:1324 builtin/commit.c:1603 +#: builtin/commit.c:1324 builtin/commit.c:1605 msgid "show status concisely" msgstr "кратка информация за състоянието" -#: builtin/commit.c:1326 builtin/commit.c:1605 +#: builtin/commit.c:1326 builtin/commit.c:1607 msgid "show branch information" msgstr "информация за клоните" -#: builtin/commit.c:1328 builtin/commit.c:1607 builtin/push.c:509 +#: builtin/commit.c:1328 builtin/commit.c:1609 builtin/push.c:544 +#: builtin/worktree.c:423 msgid "machine-readable output" msgstr "формат на изхода за четене от програма" -#: builtin/commit.c:1331 builtin/commit.c:1609 +#: builtin/commit.c:1331 builtin/commit.c:1611 msgid "show status in long format (default)" msgstr "подробна информация за състоянието (стандартно)" -#: builtin/commit.c:1334 builtin/commit.c:1612 +#: builtin/commit.c:1334 builtin/commit.c:1614 msgid "terminate entries with NUL" msgstr "разделяне на елементите с нулевия знак „NUL“" -#: builtin/commit.c:1336 builtin/commit.c:1615 builtin/fast-export.c:980 -#: builtin/fast-export.c:983 builtin/tag.c:603 +#: builtin/commit.c:1336 builtin/commit.c:1617 builtin/fast-export.c:981 +#: builtin/fast-export.c:984 builtin/tag.c:353 msgid "mode" msgstr "режим" -#: builtin/commit.c:1337 builtin/commit.c:1615 +#: builtin/commit.c:1337 builtin/commit.c:1617 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" "извеждане на неследените файлове. Възможните режими са „all“ (подробна\n" @@ -4891,7 +5411,7 @@ msgstr "" msgid "show ignored files" msgstr "извеждане на игнорираните файлове" -#: builtin/commit.c:1341 parse-options.h:152 +#: builtin/commit.c:1341 parse-options.h:155 msgid "when" msgstr "кога" @@ -4924,193 +5444,185 @@ msgstr "несвързан връх „HEAD“" msgid " (root-commit)" msgstr " (начално подаване)" -#: builtin/commit.c:1573 +#: builtin/commit.c:1575 msgid "suppress summary after successful commit" msgstr "без информация след успешно подаване" -#: builtin/commit.c:1574 +#: builtin/commit.c:1576 msgid "show diff in commit message template" msgstr "добавяне на разликата към шаблона за съобщението при подаване" -#: builtin/commit.c:1576 +#: builtin/commit.c:1578 msgid "Commit message options" msgstr "Опции за съобщението при подаване" -#: builtin/commit.c:1577 builtin/tag.c:601 +#: builtin/commit.c:1579 builtin/tag.c:351 msgid "read message from file" msgstr "взимане на съобщението от файл" -#: builtin/commit.c:1578 +#: builtin/commit.c:1580 msgid "author" msgstr "автор" -#: builtin/commit.c:1578 +#: builtin/commit.c:1580 msgid "override author for commit" msgstr "задаване на автор за подаването" -#: builtin/commit.c:1579 builtin/gc.c:280 +#: builtin/commit.c:1581 builtin/gc.c:326 msgid "date" msgstr "дата" -#: builtin/commit.c:1579 +#: builtin/commit.c:1581 msgid "override date for commit" msgstr "задаване на дата за подаването" -#: builtin/commit.c:1580 builtin/merge.c:218 builtin/notes.c:391 -#: builtin/notes.c:554 builtin/tag.c:599 +#: builtin/commit.c:1582 builtin/merge.c:218 builtin/notes.c:392 +#: builtin/notes.c:555 builtin/tag.c:349 msgid "message" msgstr "съобщение" -#: builtin/commit.c:1580 +#: builtin/commit.c:1582 msgid "commit message" msgstr "съобщение при подаване" -#: builtin/commit.c:1581 +#: builtin/commit.c:1583 builtin/commit.c:1584 builtin/commit.c:1585 +#: builtin/commit.c:1586 parse-options.h:256 ref-filter.h:79 +msgid "commit" +msgstr "подаване" + +#: builtin/commit.c:1583 msgid "reuse and edit message from specified commit" msgstr "преизползване и редактиране на съобщението от указаното подаване" -#: builtin/commit.c:1582 +#: builtin/commit.c:1584 msgid "reuse message from specified commit" msgstr "преизползване на съобщението от указаното подаване" -#: builtin/commit.c:1583 +#: builtin/commit.c:1585 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "използване на автоматичното съобщение при смачкване за вкарване на " "указаното\n" "подаване в предното без следа" -#: builtin/commit.c:1584 +#: builtin/commit.c:1586 msgid "use autosquash formatted message to squash specified commit" msgstr "" "използване на автоматичното съобщение при смачкване за смачкване на " "указаното\n" "подаване в предното" -#: builtin/commit.c:1585 +#: builtin/commit.c:1587 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "" "смяна на автора да съвпада с подаващия (използва се с „-C“/„-c“/„--amend“)" -#: builtin/commit.c:1586 builtin/log.c:1191 builtin/revert.c:86 +#: builtin/commit.c:1588 builtin/log.c:1216 builtin/revert.c:86 msgid "add Signed-off-by:" msgstr "добавяне на поле за подпис — „Signed-off-by:“" -#: builtin/commit.c:1587 +#: builtin/commit.c:1589 msgid "use specified template file" msgstr "използване на указания шаблонен файл" -#: builtin/commit.c:1588 +#: builtin/commit.c:1590 msgid "force edit of commit" msgstr "редактиране на подаване" -#: builtin/commit.c:1589 +#: builtin/commit.c:1591 msgid "default" msgstr "стандартно" -#: builtin/commit.c:1589 builtin/tag.c:604 +#: builtin/commit.c:1591 builtin/tag.c:354 msgid "how to strip spaces and #comments from message" msgstr "кои празни знаци и #коментари да се махат от съобщенията" -#: builtin/commit.c:1590 +#: builtin/commit.c:1592 msgid "include status in commit message template" msgstr "вмъкване на състоянието в шаблона за съобщението при подаване" -#: builtin/commit.c:1591 builtin/merge.c:225 builtin/revert.c:92 -#: builtin/tag.c:605 -msgid "key-id" -msgstr "ИДЕНТИФИКАТОР_НА_КЛЮЧ" - -#: builtin/commit.c:1592 builtin/merge.c:226 builtin/revert.c:93 +#: builtin/commit.c:1594 builtin/merge.c:226 builtin/pull.c:156 +#: builtin/revert.c:93 msgid "GPG sign commit" msgstr "подписване на подаването с GPG" -#: builtin/commit.c:1595 +#: builtin/commit.c:1597 msgid "Commit contents options" msgstr "Опции за избор на файлове при подаване" -#: builtin/commit.c:1596 +#: builtin/commit.c:1598 msgid "commit all changed files" msgstr "подаване на всички променени файлове" -#: builtin/commit.c:1597 +#: builtin/commit.c:1599 msgid "add specified files to index for commit" msgstr "добавяне на указаните файлове към индекса за подаване" -#: builtin/commit.c:1598 +#: builtin/commit.c:1600 msgid "interactively add files" msgstr "интерактивно добавяне на файлове" -#: builtin/commit.c:1599 +#: builtin/commit.c:1601 msgid "interactively add changes" msgstr "интерактивно добавяне на промени" -#: builtin/commit.c:1600 +#: builtin/commit.c:1602 msgid "commit only specified files" msgstr "подаване само на указаните файлове" -#: builtin/commit.c:1601 +#: builtin/commit.c:1603 msgid "bypass pre-commit hook" msgstr "без изпълнение на куката преди подаване (pre-commit)" -#: builtin/commit.c:1602 +#: builtin/commit.c:1604 msgid "show what would be committed" msgstr "отпечатване на това, което би било подадено" -#: builtin/commit.c:1613 +#: builtin/commit.c:1615 msgid "amend previous commit" msgstr "поправяне на предишното подаване" -#: builtin/commit.c:1614 +#: builtin/commit.c:1616 msgid "bypass post-rewrite hook" msgstr "без изпълнение на куката след презаписване (post-rewrite)" -#: builtin/commit.c:1619 +#: builtin/commit.c:1621 msgid "ok to record an empty change" msgstr "позволяване на празни подавания" -#: builtin/commit.c:1621 +#: builtin/commit.c:1623 msgid "ok to record a change with an empty message" msgstr "позволяване на подавания с празни съобщения" -#: builtin/commit.c:1650 +#: builtin/commit.c:1652 msgid "could not parse HEAD commit" msgstr "върховото подаване „HEAD“ не може да бъде прочетено" -#: builtin/commit.c:1689 builtin/merge.c:1076 -#, c-format -msgid "could not open '%s' for reading" -msgstr "файлът не може да бъде прочетен: „%s“" - -#: builtin/commit.c:1696 +#: builtin/commit.c:1698 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Повреден файл за върха за сливането „MERGE_HEAD“ (%s)" -#: builtin/commit.c:1703 +#: builtin/commit.c:1705 msgid "could not read MERGE_MODE" msgstr "режимът на сливане „MERGE_MODE“ не може да бъде прочетен" -#: builtin/commit.c:1722 +#: builtin/commit.c:1724 #, c-format msgid "could not read commit message: %s" msgstr "съобщението за подаване не може да бъде прочетено: %s" -#: builtin/commit.c:1733 +#: builtin/commit.c:1735 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Неизвършване на подаване поради нередактирано съобщение.\n" -#: builtin/commit.c:1738 +#: builtin/commit.c:1740 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Неизвършване на подаване поради празно съобщение.\n" -#: builtin/commit.c:1753 builtin/merge.c:829 builtin/merge.c:854 -msgid "failed to write commit object" -msgstr "обектът за подаването не може да бъде записан" - -#: builtin/commit.c:1786 +#: builtin/commit.c:1788 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full and quota is\n" @@ -5124,137 +5636,141 @@ msgstr "" msgid "git config []" msgstr "git config [ОПЦИЯ…]" -#: builtin/config.c:53 +#: builtin/config.c:54 msgid "Config file location" msgstr "Местоположение на конфигурационния файл" -#: builtin/config.c:54 +#: builtin/config.c:55 msgid "use global config file" msgstr "използване на глобалния конфигурационен файл" -#: builtin/config.c:55 +#: builtin/config.c:56 msgid "use system config file" msgstr "използване на системния конфигурационен файл" -#: builtin/config.c:56 +#: builtin/config.c:57 msgid "use repository config file" msgstr "използване на конфигурационния файл на хранилището" -#: builtin/config.c:57 +#: builtin/config.c:58 msgid "use given config file" msgstr "използване на зададения конфигурационен файл" -#: builtin/config.c:58 +#: builtin/config.c:59 msgid "blob-id" msgstr "идентификатор на BLOB" -#: builtin/config.c:58 +#: builtin/config.c:59 msgid "read config from given blob object" msgstr "" "изчитане на конфигурацията от BLOB с този идентификатор на съдържанието" -#: builtin/config.c:59 +#: builtin/config.c:60 msgid "Action" msgstr "Действие" -#: builtin/config.c:60 +#: builtin/config.c:61 msgid "get value: name [value-regex]" msgstr "извеждане на стойност: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]" -#: builtin/config.c:61 +#: builtin/config.c:62 msgid "get all values: key [value-regex]" msgstr "извеждане на всички стойности: ключ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]" -#: builtin/config.c:62 +#: builtin/config.c:63 msgid "get values for regexp: name-regex [value-regex]" msgstr "" "извеждане на стойностите за РЕГУЛЯРНия_ИЗРАЗ: РЕГУЛЯРЕН_ИЗРАЗ_ЗА_ИМЕТО " "[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]" -#: builtin/config.c:63 +#: builtin/config.c:64 msgid "get value specific for the URL: section[.var] URL" msgstr "извеждане на стойността за указания адрес: РАЗДЕЛ[.ПРОМЕНЛИВА] АДРЕС" -#: builtin/config.c:64 +#: builtin/config.c:65 msgid "replace all matching variables: name value [value_regex]" msgstr "" "замяна на всички съвпадащи променливи: ИМЕ СТОЙНОСТ " "[РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]" -#: builtin/config.c:65 +#: builtin/config.c:66 msgid "add a new variable: name value" msgstr "добавяне на нова променлива: ИМЕ СТОЙНОСТ" -#: builtin/config.c:66 +#: builtin/config.c:67 msgid "remove a variable: name [value-regex]" msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]" -#: builtin/config.c:67 +#: builtin/config.c:68 msgid "remove all matches: name [value-regex]" msgstr "изтриване на всички съвпадащи: ИМЕ [РЕГУЛЯРЕН_ИЗРАЗ_ЗА_СТОЙНОСТТА]" -#: builtin/config.c:68 +#: builtin/config.c:69 msgid "rename section: old-name new-name" msgstr "преименуване на раздел: СТАРО_ИМЕ НОВО_ИМЕ" -#: builtin/config.c:69 +#: builtin/config.c:70 msgid "remove a section: name" msgstr "изтриване на раздел: ИМЕ" -#: builtin/config.c:70 +#: builtin/config.c:71 msgid "list all" msgstr "изброяване на всички" -#: builtin/config.c:71 +#: builtin/config.c:72 msgid "open an editor" msgstr "отваряне на редактор" -#: builtin/config.c:72 +#: builtin/config.c:73 msgid "find the color configured: slot [default]" msgstr "извеждане на зададения цвят: номер [стандартно]" -#: builtin/config.c:73 +#: builtin/config.c:74 msgid "find the color setting: slot [stdout-is-tty]" msgstr "извеждане на зададения цвят: номер [стандартният изход е терминал]" -#: builtin/config.c:74 +#: builtin/config.c:75 msgid "Type" msgstr "Вид" -#: builtin/config.c:75 +#: builtin/config.c:76 msgid "value is \"true\" or \"false\"" msgstr "СТОЙНОСТТА е „true“ (истина) или „false“ (лъжа)" -#: builtin/config.c:76 +#: builtin/config.c:77 msgid "value is decimal number" msgstr "СТОЙНОСТТА е цяло, десетично число" -#: builtin/config.c:77 +#: builtin/config.c:78 msgid "value is --bool or --int" msgstr "СТОЙНОСТТА е „--bool“ (булева) или „--int“ (десетично цяло число)" -#: builtin/config.c:78 +#: builtin/config.c:79 msgid "value is a path (file or directory name)" msgstr "СТОЙНОСТТА е път (до файл или директория)" -#: builtin/config.c:79 +#: builtin/config.c:80 msgid "Other" msgstr "Други" # FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo -#: builtin/config.c:80 +#: builtin/config.c:81 msgid "terminate values with NUL byte" msgstr "разделяне на стойностите с нулевия знак „NUL“" -#: builtin/config.c:81 +#: builtin/config.c:82 +msgid "show variable names only" +msgstr "извеждане на имената на променливите" + +#: builtin/config.c:83 msgid "respect include directives on lookup" msgstr "при търсене да се уважат и директивите за включване" -#: builtin/config.c:316 +#: builtin/config.c:303 msgid "unable to parse default color value" msgstr "неразпозната стойност на стандартния цвят" -#: builtin/config.c:457 +#: builtin/config.c:441 #, c-format msgid "" "# This is Git's per-user configuration file.\n" @@ -5269,16 +5785,16 @@ msgstr "" "#\tname = %s\n" "#\temail = %s\n" -#: builtin/config.c:587 +#: builtin/config.c:575 #, c-format msgid "cannot create configuration file %s" msgstr "конфигурационният файл „%s“ не може да бъде създаден" -#: builtin/count-objects.c:55 +#: builtin/count-objects.c:77 msgid "git count-objects [-v] [-H | --human-readable]" msgstr "git count-objects [-v] [-H | --human-readable]" -#: builtin/count-objects.c:65 +#: builtin/count-objects.c:87 msgid "print sizes in human readable format" msgstr "извеждане на размерите на обектите във формат лесно четим от хора" @@ -5306,7 +5822,7 @@ msgstr "в анотирания етикет „%s“ липсва вграде msgid "tag '%s' is really '%s' here" msgstr "етикетът „%s“ тук е всъщност „%s“" -#: builtin/describe.c:250 builtin/log.c:452 +#: builtin/describe.c:250 builtin/log.c:459 #, c-format msgid "Not a valid object name %s" msgstr "Неправилно име на обект „%s“" @@ -5402,7 +5918,7 @@ msgstr "да се търси само в този БРОЙ последни ет msgid "only consider tags matching " msgstr "да се търси само измежду етикетите напасващи този ШАБЛОН" -#: builtin/describe.c:410 builtin/name-rev.c:318 +#: builtin/describe.c:410 builtin/name-rev.c:314 msgid "show abbreviated commit object as fallback" msgstr "извеждане на съкратено име на обект като резервен вариант" @@ -5448,239 +5964,239 @@ msgstr "зададен е неправилен обект „%s“." #: builtin/diff.c:410 #, c-format msgid "more than two blobs given: '%s'" -msgstr "зададени са повече от 2 обекта: „%s“" +msgstr "зададени са повече от 2 обекта BLOB: „%s“" #: builtin/diff.c:417 #, c-format msgid "unhandled object '%s' given." msgstr "зададен е неподдържан обект „%s“." -#: builtin/fast-export.c:24 +#: builtin/fast-export.c:25 msgid "git fast-export [rev-list-opts]" msgstr "git fast-export [ОПЦИИ_ЗА_СПИСЪКА_С_ВЕРСИИ]" -#: builtin/fast-export.c:979 +#: builtin/fast-export.c:980 msgid "show progress after objects" msgstr "Съобщение за напредъка на всеки такъв БРОЙ обекта" -#: builtin/fast-export.c:981 +#: builtin/fast-export.c:982 msgid "select handling of signed tags" msgstr "Как да се обработват подписаните етикети" -#: builtin/fast-export.c:984 +#: builtin/fast-export.c:985 msgid "select handling of tags that tag filtered objects" msgstr "Как да се обработват етикетите на филтрираните обекти" -#: builtin/fast-export.c:987 +#: builtin/fast-export.c:988 msgid "Dump marks to this file" msgstr "Запазване на маркерите в този файл" -#: builtin/fast-export.c:989 +#: builtin/fast-export.c:990 msgid "Import marks from this file" msgstr "Внасяне на маркерите от този файл" -#: builtin/fast-export.c:991 +#: builtin/fast-export.c:992 msgid "Fake a tagger when tags lack one" msgstr "Да се използва изкуствено име на човек при липса на задаващ етикета" -#: builtin/fast-export.c:993 +#: builtin/fast-export.c:994 msgid "Output full tree for each commit" msgstr "Извеждане на цялото дърво за всяко подаване" -#: builtin/fast-export.c:995 +#: builtin/fast-export.c:996 msgid "Use the done feature to terminate the stream" msgstr "Използване на маркер за завършване на потока" -#: builtin/fast-export.c:996 +#: builtin/fast-export.c:997 msgid "Skip output of blob data" msgstr "Без извеждане на съдържанието на обектите BLOB" -#: builtin/fast-export.c:997 +#: builtin/fast-export.c:998 msgid "refspec" msgstr "указател на версия" -#: builtin/fast-export.c:998 +#: builtin/fast-export.c:999 msgid "Apply refspec to exported refs" msgstr "Прилагане на указателя на версия към изнесените указатели" -#: builtin/fast-export.c:999 +#: builtin/fast-export.c:1000 msgid "anonymize output" msgstr "анонимизиране на извежданата информация" -#: builtin/fetch.c:19 +#: builtin/fetch.c:20 msgid "git fetch [] [ [...]]" msgstr "git fetch [ОПЦИЯ…] [ХРАНИЛИЩЕ [УКАЗАТЕЛ…]]" -#: builtin/fetch.c:20 +#: builtin/fetch.c:21 msgid "git fetch [] " msgstr "git fetch [ОПЦИЯ…] ГРУПА" -#: builtin/fetch.c:21 +#: builtin/fetch.c:22 msgid "git fetch --multiple [] [( | )...]" msgstr "git fetch --multiple [ОПЦИЯ…] [(ХРАНИЛИЩЕ | ГРУПА)…]" -#: builtin/fetch.c:22 +#: builtin/fetch.c:23 msgid "git fetch --all []" msgstr "git fetch --all [ОПЦИЯ…]" -#: builtin/fetch.c:89 +#: builtin/fetch.c:90 builtin/pull.c:162 msgid "fetch from all remotes" msgstr "доставяне от всички отдалечени хранилища" -#: builtin/fetch.c:91 +#: builtin/fetch.c:92 builtin/pull.c:165 msgid "append to .git/FETCH_HEAD instead of overwriting" msgstr "добавяне към „.git/FETCH_HEAD“ вместо замяна" -#: builtin/fetch.c:93 +#: builtin/fetch.c:94 builtin/pull.c:168 msgid "path to upload pack on remote end" msgstr "отдалечен път, където да се качи пакетът" -#: builtin/fetch.c:94 +#: builtin/fetch.c:95 builtin/pull.c:170 msgid "force overwrite of local branch" msgstr "принудително презаписване на локалния клон" -#: builtin/fetch.c:96 +#: builtin/fetch.c:97 msgid "fetch from multiple remotes" msgstr "доставяне от множество отдалечени хранилища" -#: builtin/fetch.c:98 +#: builtin/fetch.c:99 builtin/pull.c:172 msgid "fetch all tags and associated objects" msgstr "доставяне на всички етикети и принадлежащи обекти" -#: builtin/fetch.c:100 +#: builtin/fetch.c:101 msgid "do not fetch all tags (--no-tags)" msgstr "без доставянето на всички етикети „--no-tags“" -#: builtin/fetch.c:102 +#: builtin/fetch.c:103 builtin/pull.c:175 msgid "prune remote-tracking branches no longer on remote" msgstr "окастряне на клоните следящи вече несъществуващи отдалечени клони" -#: builtin/fetch.c:103 +#: builtin/fetch.c:104 builtin/pull.c:178 msgid "on-demand" msgstr "при нужда" -#: builtin/fetch.c:104 +#: builtin/fetch.c:105 builtin/pull.c:179 msgid "control recursive fetching of submodules" msgstr "управление на рекурсивното доставяне на подмодулите" -#: builtin/fetch.c:108 +#: builtin/fetch.c:109 builtin/pull.c:184 msgid "keep downloaded pack" msgstr "запазване на изтеглените пакети с обекти" -#: builtin/fetch.c:110 +#: builtin/fetch.c:111 msgid "allow updating of HEAD ref" msgstr "позволяване на обновяването на указателя „HEAD“" -#: builtin/fetch.c:113 +#: builtin/fetch.c:114 builtin/pull.c:187 msgid "deepen history of shallow clone" msgstr "задълбочаване на историята на плитко хранилище" -#: builtin/fetch.c:115 +#: builtin/fetch.c:116 builtin/pull.c:190 msgid "convert to a complete repository" msgstr "превръщане в пълно хранилище" -#: builtin/fetch.c:117 builtin/log.c:1208 +#: builtin/fetch.c:118 builtin/log.c:1233 msgid "dir" msgstr "директория" -#: builtin/fetch.c:118 +#: builtin/fetch.c:119 msgid "prepend this to submodule path output" msgstr "добавяне на това пред пътя на подмодула" -#: builtin/fetch.c:121 +#: builtin/fetch.c:122 msgid "default mode for recursion" msgstr "стандартен режим на рекурсия" -#: builtin/fetch.c:123 +#: builtin/fetch.c:124 builtin/pull.c:193 msgid "accept refs that update .git/shallow" msgstr "приемане на указатели, които обновяват „.git/shallow“" -#: builtin/fetch.c:124 +#: builtin/fetch.c:125 builtin/pull.c:195 msgid "refmap" msgstr "карта с указатели" -#: builtin/fetch.c:125 +#: builtin/fetch.c:126 builtin/pull.c:196 msgid "specify fetch refmap" msgstr "указване на картата с указатели за доставяне" -#: builtin/fetch.c:377 +#: builtin/fetch.c:378 msgid "Couldn't find remote ref HEAD" msgstr "Указателят „HEAD“ в отдалеченото хранилище не може да бъде открит" -#: builtin/fetch.c:457 +#: builtin/fetch.c:458 #, c-format msgid "object %s not found" msgstr "обектът „%s“ липсва" -#: builtin/fetch.c:462 +#: builtin/fetch.c:463 msgid "[up to date]" msgstr "[актуализиран]" -#: builtin/fetch.c:476 +#: builtin/fetch.c:477 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s → %s (в текущия клон не може да се доставя)" -#: builtin/fetch.c:477 builtin/fetch.c:563 +#: builtin/fetch.c:478 builtin/fetch.c:566 msgid "[rejected]" msgstr "[отхвърлен]" -#: builtin/fetch.c:488 +#: builtin/fetch.c:489 msgid "[tag update]" msgstr "[обновяване на етикетите]" -#: builtin/fetch.c:490 builtin/fetch.c:525 builtin/fetch.c:543 +#: builtin/fetch.c:491 builtin/fetch.c:526 builtin/fetch.c:544 msgid " (unable to update local ref)" msgstr " (локалните указатели не могат да бъдат обновени)" -#: builtin/fetch.c:508 +#: builtin/fetch.c:509 msgid "[new tag]" msgstr "[нов етикет]" -#: builtin/fetch.c:511 +#: builtin/fetch.c:512 msgid "[new branch]" msgstr "[нов клон]" -#: builtin/fetch.c:514 +#: builtin/fetch.c:515 msgid "[new ref]" msgstr "[нов указател]" -#: builtin/fetch.c:559 +#: builtin/fetch.c:561 msgid "unable to update local ref" msgstr "локален указател не може да бъде обновен" -#: builtin/fetch.c:559 +#: builtin/fetch.c:561 msgid "forced update" msgstr "принудително обновяване" -#: builtin/fetch.c:565 +#: builtin/fetch.c:568 msgid "(non-fast-forward)" msgstr "(сливането не е тривиално)" -#: builtin/fetch.c:599 builtin/fetch.c:832 +#: builtin/fetch.c:602 builtin/fetch.c:843 #, c-format msgid "cannot open %s: %s\n" msgstr "файлът „%s“ не може да бъде отворен: %s\n" -#: builtin/fetch.c:608 +#: builtin/fetch.c:611 #, c-format msgid "%s did not send all necessary objects\n" msgstr "хранилището „%s“ не изпрати всички необходими обекти\n" -#: builtin/fetch.c:626 +#: builtin/fetch.c:629 #, c-format msgid "reject %s because shallow roots are not allowed to be updated" msgstr "" "отхвърляне на върха „%s“, защото плитките хранилища не могат да бъдат " "обновявани" -#: builtin/fetch.c:714 builtin/fetch.c:797 +#: builtin/fetch.c:716 builtin/fetch.c:808 #, c-format msgid "From %.*s\n" msgstr "От %.*s\n" # FIXME - is the space necessary -#: builtin/fetch.c:725 +#: builtin/fetch.c:727 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -5690,55 +6206,55 @@ msgstr "" "„git remote prune %s“, за да премахнете остарелите клони, които\n" "предизвикват конфликта" -#: builtin/fetch.c:777 +#: builtin/fetch.c:779 #, c-format msgid " (%s will become dangling)" msgstr " (обектът „%s“ ще се окаже извън клон)" -#: builtin/fetch.c:778 +#: builtin/fetch.c:780 #, c-format msgid " (%s has become dangling)" msgstr " (обектът „%s“ вече е извън клон)" -#: builtin/fetch.c:802 +#: builtin/fetch.c:812 msgid "[deleted]" msgstr "[изтрит]" -#: builtin/fetch.c:803 builtin/remote.c:1057 +#: builtin/fetch.c:813 builtin/remote.c:1040 msgid "(none)" msgstr "(нищо)" -#: builtin/fetch.c:822 +#: builtin/fetch.c:833 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" -msgstr "Не може да изтегляте в текущия клон „%s“ на хранилище, което не е голо" +msgstr "Не може да доставите в текущия клон „%s“ на хранилище, което не е голо" -#: builtin/fetch.c:841 +#: builtin/fetch.c:852 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Стойността „%2$s“ за опцията „%1$s“ не е съвместима с „%3$s“" -#: builtin/fetch.c:844 +#: builtin/fetch.c:855 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Опцията „%s“ се игнорира при „%s“\n" -#: builtin/fetch.c:900 +#: builtin/fetch.c:911 #, c-format msgid "Don't know how to fetch from %s" msgstr "Не се поддържа доставяне от „%s“" -#: builtin/fetch.c:1063 +#: builtin/fetch.c:1072 #, c-format msgid "Fetching %s\n" msgstr "Доставяне на „%s“\n" -#: builtin/fetch.c:1065 builtin/remote.c:90 +#: builtin/fetch.c:1074 builtin/remote.c:96 #, c-format msgid "Could not fetch %s" msgstr "„%s“ не може да се достави" -#: builtin/fetch.c:1083 +#: builtin/fetch.c:1092 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -5746,225 +6262,251 @@ msgstr "" "Не сте указали отдалечено хранилище. Задайте или адрес, или име\n" "на отдалечено хранилище, откъдето да се доставят новите версии." -#: builtin/fetch.c:1106 +#: builtin/fetch.c:1115 msgid "You need to specify a tag name." msgstr "Трябва да укажете име на етикет." -#: builtin/fetch.c:1148 +#: builtin/fetch.c:1157 msgid "--depth and --unshallow cannot be used together" msgstr "опциите „--depth“ и „--unshallow“ са несъвместими" -#: builtin/fetch.c:1150 +#: builtin/fetch.c:1159 msgid "--unshallow on a complete repository does not make sense" msgstr "не можете да използвате опцията „--unshallow“ върху пълно хранилище" -#: builtin/fetch.c:1173 +#: builtin/fetch.c:1179 msgid "fetch --all does not take a repository argument" msgstr "към „git fetch --all“ не можете да добавите аргумент — хранилище" -#: builtin/fetch.c:1175 +#: builtin/fetch.c:1181 msgid "fetch --all does not make sense with refspecs" msgstr "" "към „git fetch --all“ не можете да добавите аргумент — указател на версия" -#: builtin/fetch.c:1186 +#: builtin/fetch.c:1192 #, c-format msgid "No such remote or remote group: %s" msgstr "Няма нито отдалечено хранилище, нито група от хранилища на име „%s“" -#: builtin/fetch.c:1194 +#: builtin/fetch.c:1200 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Указването на група и указването на версия са несъвместими" -#: builtin/fmt-merge-msg.c:13 +#: builtin/fmt-merge-msg.c:14 msgid "" "git fmt-merge-msg [-m ] [--log[=] | --no-log] [--file ]" msgstr "" "git fmt-merge-msg [-m СЪОБЩЕНИЕ] [--log[=БРОЙ] | --no-log] [--file ФАЙЛ]" -#: builtin/fmt-merge-msg.c:668 builtin/fmt-merge-msg.c:671 builtin/grep.c:698 -#: builtin/merge.c:198 builtin/repack.c:178 builtin/repack.c:182 -#: builtin/show-branch.c:664 builtin/show-ref.c:180 builtin/tag.c:590 -#: parse-options.h:131 parse-options.h:238 -msgid "n" -msgstr "БРОЙ" - -#: builtin/fmt-merge-msg.c:669 +#: builtin/fmt-merge-msg.c:667 msgid "populate log with at most entries from shortlog" msgstr "" "вмъкване на журнал състоящ се от не повече от БРОЙ записа от съкратения " "журнал" -#: builtin/fmt-merge-msg.c:672 +#: builtin/fmt-merge-msg.c:670 msgid "alias for --log (deprecated)" msgstr "синоним на „--log“ (остаряло)" -#: builtin/fmt-merge-msg.c:675 +#: builtin/fmt-merge-msg.c:673 msgid "text" msgstr "ТЕКСТ" -#: builtin/fmt-merge-msg.c:676 +#: builtin/fmt-merge-msg.c:674 msgid "use as start of message" msgstr "за начало на съобщението да се ползва ТЕКСТ" -#: builtin/fmt-merge-msg.c:677 +#: builtin/fmt-merge-msg.c:675 msgid "file to read from" msgstr "файл, от който да се чете" -#: builtin/for-each-ref.c:687 -msgid "unable to parse format" -msgstr "форматът не може да бъде анализиран" - -#: builtin/for-each-ref.c:1083 +#: builtin/for-each-ref.c:9 msgid "git for-each-ref [] []" msgstr "git for-each-ref [ОПЦИЯ…] [ШАБЛОН]" -#: builtin/for-each-ref.c:1098 +#: builtin/for-each-ref.c:10 +msgid "git for-each-ref [--points-at ]" +msgstr "git for-each-ref [--points ОБЕКТ]" + +#: builtin/for-each-ref.c:11 +msgid "git for-each-ref [(--merged | --no-merged) []]" +msgstr "git for-each-ref[(--merged | --no-merged) [ОБЕКТ]]" + +#: builtin/for-each-ref.c:12 +msgid "git for-each-ref [--contains []]" +msgstr "git for-each-ref [--contains ОБЕКТ]" + +#: builtin/for-each-ref.c:27 msgid "quote placeholders suitably for shells" msgstr "цитиране подходящо за командни интерпретатори на обвивката" -#: builtin/for-each-ref.c:1100 +#: builtin/for-each-ref.c:29 msgid "quote placeholders suitably for perl" msgstr "цитиране подходящо за perl" -#: builtin/for-each-ref.c:1102 +#: builtin/for-each-ref.c:31 msgid "quote placeholders suitably for python" msgstr "цитиране подходящо за python" -#: builtin/for-each-ref.c:1104 +#: builtin/for-each-ref.c:33 msgid "quote placeholders suitably for Tcl" msgstr "цитиране подходящо за tcl" -#: builtin/for-each-ref.c:1107 +#: builtin/for-each-ref.c:36 msgid "show only matched refs" msgstr "извеждане само на този БРОЙ напаснати указатели" -#: builtin/for-each-ref.c:1108 builtin/replace.c:438 -msgid "format" -msgstr "ФОРМАТ" - -#: builtin/for-each-ref.c:1108 +#: builtin/for-each-ref.c:37 builtin/tag.c:372 msgid "format to use for the output" msgstr "ФОРМАТ за изхода" -#: builtin/for-each-ref.c:1109 -msgid "key" -msgstr "ключ" +#: builtin/for-each-ref.c:41 +msgid "print only refs which points at the given object" +msgstr "извеждане само на указателите, сочещи към обекта" -#: builtin/for-each-ref.c:1110 -msgid "field name to sort on" -msgstr "име на полето, по което да е подредбата" +#: builtin/for-each-ref.c:43 +msgid "print only refs that are merged" +msgstr "извеждане само на слетите указатели" -#: builtin/fsck.c:147 builtin/prune.c:137 +#: builtin/for-each-ref.c:44 +msgid "print only refs that are not merged" +msgstr "извеждане само на неслетите указатели" + +#: builtin/for-each-ref.c:45 +msgid "print only refs which contain the commit" +msgstr "извеждане само на указателите, които съдържат това подаване" + +#: builtin/fsck.c:156 builtin/prune.c:140 msgid "Checking connectivity" msgstr "Проверка на връзката" -#: builtin/fsck.c:548 +#: builtin/fsck.c:486 msgid "Checking object directories" msgstr "Проверка на директориите с обекти" -#: builtin/fsck.c:611 +#: builtin/fsck.c:553 msgid "git fsck [] [...]" msgstr "git fsck [ОПЦИЯ…] [ОБЕКТ…]" -#: builtin/fsck.c:617 +#: builtin/fsck.c:559 msgid "show unreachable objects" msgstr "показване на недостижимите обекти" -#: builtin/fsck.c:618 +#: builtin/fsck.c:560 msgid "show dangling objects" msgstr "показване на обектите извън клоните" -#: builtin/fsck.c:619 +#: builtin/fsck.c:561 msgid "report tags" msgstr "показване на етикетите" -#: builtin/fsck.c:620 +#: builtin/fsck.c:562 msgid "report root nodes" msgstr "показване на кореновите възли" -#: builtin/fsck.c:621 +#: builtin/fsck.c:563 msgid "make index objects head nodes" msgstr "задаване на обекти от индекса да са коренови" # FIXME bad message -#: builtin/fsck.c:622 +#: builtin/fsck.c:564 msgid "make reflogs head nodes (default)" msgstr "проследяване на указателите от журнала като глави (стандартно)" -#: builtin/fsck.c:623 +#: builtin/fsck.c:565 msgid "also consider packs and alternate objects" msgstr "допълнително да се проверяват пакетите и алтернативните обекти" -#: builtin/fsck.c:624 +#: builtin/fsck.c:566 +msgid "check only connectivity" +msgstr "проверка само на връзката" + +#: builtin/fsck.c:567 msgid "enable more strict checking" msgstr "по-строги проверки" -#: builtin/fsck.c:626 +#: builtin/fsck.c:569 msgid "write dangling objects in .git/lost-found" msgstr "запазване на обектите извън клоните в директорията „.git/lost-found“" -#: builtin/fsck.c:627 builtin/prune.c:107 +#: builtin/fsck.c:570 builtin/prune.c:107 msgid "show progress" msgstr "показване на напредъка" -#: builtin/fsck.c:677 +#: builtin/fsck.c:631 msgid "Checking objects" msgstr "Проверка на обектите" # FIXME plural with ... -#: builtin/gc.c:24 +#: builtin/gc.c:25 msgid "git gc []" msgstr "git gc [ОПЦИЯ…]" -#: builtin/gc.c:67 +#: builtin/gc.c:72 #, c-format msgid "Invalid %s: '%s'" msgstr "Неправилен %s: „%s“" -#: builtin/gc.c:112 +#: builtin/gc.c:139 #, c-format msgid "insanely long object directory %.*s" msgstr "прекалено дълга директория с обекти „%.*s“" -#: builtin/gc.c:281 +#: builtin/gc.c:290 +#, c-format +msgid "" +"The last gc run reported the following. Please correct the root cause\n" +"and remove %s.\n" +"Automatic cleanup will not be performed until the file is removed.\n" +"\n" +"%s" +msgstr "" +"При последното изпълнение на „git gc“ бе докладвана грешка. Коригирайте " +"причината за\n" +"нея и изтрийте „%s“.\n" +"Автоматичното изчистване на боклука няма да работи, преди да изтриете " +"файла.\n" +"\n" +"%s" + +#: builtin/gc.c:327 msgid "prune unreferenced objects" msgstr "окастряне на обектите, към които нищо не сочи" -#: builtin/gc.c:283 +#: builtin/gc.c:329 msgid "be more thorough (increased runtime)" msgstr "изчерпателно търсене на боклука (за сметка на повече време работа)" -#: builtin/gc.c:284 +#: builtin/gc.c:330 msgid "enable auto-gc mode" msgstr "включване на автоматичното събиране на боклука (auto-gc)" -#: builtin/gc.c:285 +#: builtin/gc.c:331 msgid "force running gc even if there may be another gc running" msgstr "" "изрично стартиране на събирането на боклука, дори и ако вече работи друго " "събиране" -#: builtin/gc.c:327 +#: builtin/gc.c:373 #, c-format msgid "Auto packing the repository in background for optimum performance.\n" msgstr "" "Автоматично пакетиране на заден фон на хранилището за по-добра " "производителност.\n" -#: builtin/gc.c:329 +#: builtin/gc.c:375 #, c-format msgid "Auto packing the repository for optimum performance.\n" msgstr "Автоматично пакетиране на хранилището за по-добра производителност.\n" -#: builtin/gc.c:330 +#: builtin/gc.c:376 #, c-format msgid "See \"git help gc\" for manual housekeeping.\n" msgstr "" "Погледнете ръководството за повече информация как да изпълните „git help " "gc“.\n" -#: builtin/gc.c:348 +#: builtin/gc.c:397 #, c-format msgid "" "gc is already running on machine '%s' pid % (use --force if not)" @@ -5973,7 +6515,7 @@ msgstr "" "процеса: % (ако сте сигурни, че това не е вярно, това използвайте\n" "опцията „--force“)" -#: builtin/gc.c:376 +#: builtin/gc.c:441 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -6010,214 +6552,210 @@ msgstr "опцията „%c“ очаква число за аргумент" msgid "cannot open '%s'" msgstr "„%s“ не може да бъде отворен" -#: builtin/grep.c:638 +#: builtin/grep.c:633 msgid "search in index instead of in the work tree" msgstr "търсене в индекса, а не в работното дърво" -#: builtin/grep.c:640 +#: builtin/grep.c:635 msgid "find in contents not managed by git" msgstr "търсене и във файловете, които не са под управлението на git" -#: builtin/grep.c:642 +#: builtin/grep.c:637 msgid "search in both tracked and untracked files" msgstr "търсене и в следените, и в неследените файлове" -#: builtin/grep.c:644 +#: builtin/grep.c:639 msgid "ignore files specified via '.gitignore'" msgstr "игнориране на файловете указани в „.gitignore“" -#: builtin/grep.c:647 +#: builtin/grep.c:642 msgid "show non-matching lines" msgstr "извеждане на редовете, които не съвпадат" -#: builtin/grep.c:649 +#: builtin/grep.c:644 msgid "case insensitive matching" msgstr "без значение на регистъра на буквите (главни/малки)" -#: builtin/grep.c:651 +#: builtin/grep.c:646 msgid "match patterns only at word boundaries" msgstr "напасване на шаблоните само по границите на думите" -#: builtin/grep.c:653 +#: builtin/grep.c:648 msgid "process binary files as text" msgstr "обработване на двоичните файлове като текстови" -#: builtin/grep.c:655 +#: builtin/grep.c:650 msgid "don't match patterns in binary files" msgstr "прескачане на двоичните файлове" -#: builtin/grep.c:658 +#: builtin/grep.c:653 msgid "process binary files with textconv filters" msgstr "" "обработване на двоичните файлове чрез филтри за преобразуване към текст" -#: builtin/grep.c:660 +#: builtin/grep.c:655 msgid "descend at most levels" msgstr "навлизане максимално на тази ДЪЛБОЧИНА в дървото" -#: builtin/grep.c:664 +#: builtin/grep.c:659 msgid "use extended POSIX regular expressions" msgstr "разширени регулярни изрази по POSIX" -#: builtin/grep.c:667 +#: builtin/grep.c:662 msgid "use basic POSIX regular expressions (default)" msgstr "основни регулярни изрази по POSIX (стандартно)" -#: builtin/grep.c:670 +#: builtin/grep.c:665 msgid "interpret patterns as fixed strings" msgstr "шаблоните са дословни низове" -#: builtin/grep.c:673 +#: builtin/grep.c:668 msgid "use Perl-compatible regular expressions" msgstr "регулярни изрази на Perl" -#: builtin/grep.c:676 +#: builtin/grep.c:671 msgid "show line numbers" msgstr "извеждане на номерата на редовете" -#: builtin/grep.c:677 +#: builtin/grep.c:672 msgid "don't show filenames" msgstr "без извеждане на имената на файловете" -#: builtin/grep.c:678 +#: builtin/grep.c:673 msgid "show filenames" msgstr "извеждане на имената на файловете" -#: builtin/grep.c:680 +#: builtin/grep.c:675 msgid "show filenames relative to top directory" msgstr "" "извеждане на относителните имена на файловете спрямо основната директория на " "хранилището" -#: builtin/grep.c:682 +#: builtin/grep.c:677 msgid "show only filenames instead of matching lines" msgstr "извеждане само на имената на файловете без напасващите редове" -#: builtin/grep.c:684 +#: builtin/grep.c:679 msgid "synonym for --files-with-matches" msgstr "синоним на „--files-with-matches“" -#: builtin/grep.c:687 +#: builtin/grep.c:682 msgid "show only the names of files without match" msgstr "" "извеждане само на имената на файловете, които не съдържат ред, напасващ на " "шаблона" -#: builtin/grep.c:689 +#: builtin/grep.c:684 msgid "print NUL after filenames" msgstr "извеждане на нулевия знак „NUL“ след всяко име на файл" -#: builtin/grep.c:691 +#: builtin/grep.c:686 msgid "show the number of matches instead of matching lines" msgstr "извеждане на броя на съвпаденията вместо напасващите редове" -#: builtin/grep.c:692 +#: builtin/grep.c:687 msgid "highlight matches" msgstr "оцветяване на напасванията" -#: builtin/grep.c:694 +#: builtin/grep.c:689 msgid "print empty line between matches from different files" msgstr "извеждане на празен ред между напасванията от различни файлове" -#: builtin/grep.c:696 +#: builtin/grep.c:691 msgid "show filename only once above matches from same file" msgstr "" "извеждане на името на файла само веднъж за всички напасвания от този файл" -#: builtin/grep.c:699 +#: builtin/grep.c:694 msgid "show context lines before and after matches" msgstr "извеждане на такъв БРОЙ редове преди и след напасванията" -#: builtin/grep.c:702 +#: builtin/grep.c:697 msgid "show context lines before matches" msgstr "извеждане на такъв БРОЙ редове преди напасванията" -#: builtin/grep.c:704 +#: builtin/grep.c:699 msgid "show context lines after matches" msgstr "извеждане на такъв БРОЙ редове след напасванията" -#: builtin/grep.c:705 +#: builtin/grep.c:700 msgid "shortcut for -C NUM" msgstr "синоним на „-C БРОЙ“" -#: builtin/grep.c:708 +#: builtin/grep.c:703 msgid "show a line with the function name before matches" msgstr "извеждане на ред с името на функцията, в която е напаснат шаблона" -#: builtin/grep.c:710 +#: builtin/grep.c:705 msgid "show the surrounding function" msgstr "извеждане на обхващащата функция" -#: builtin/grep.c:713 +#: builtin/grep.c:708 msgid "read patterns from file" msgstr "изчитане на шаблоните от файл" -#: builtin/grep.c:715 +#: builtin/grep.c:710 msgid "match " msgstr "напасване на ШАБЛОН" -#: builtin/grep.c:717 +#: builtin/grep.c:712 msgid "combine patterns specified with -e" msgstr "комбиниране на шаблоните указани с опцията „-e“" -#: builtin/grep.c:729 +#: builtin/grep.c:724 msgid "indicate hit with exit status without output" msgstr "" "без извеждане на стандартния изход. Изходният код указва наличието на " "напасване" -#: builtin/grep.c:731 +#: builtin/grep.c:726 msgid "show only matches from files that match all patterns" msgstr "" "извеждане на редове само от файловете, които напасват на всички шаблони" -#: builtin/grep.c:733 +#: builtin/grep.c:728 msgid "show parse tree for grep expression" msgstr "извеждане на дървото за анализ на регулярния израз" -#: builtin/grep.c:737 +#: builtin/grep.c:732 msgid "pager" msgstr "програма за преглед по страници" -#: builtin/grep.c:737 +#: builtin/grep.c:732 msgid "show matching files in the pager" msgstr "извеждане на съвпадащите файлове в програма за преглед по страници" -#: builtin/grep.c:740 +#: builtin/grep.c:735 msgid "allow calling of grep(1) (ignored by this build)" msgstr "" "позволяване на стартирането на grep(1) (текущият компилат пренебрегва тази " "опция)" -#: builtin/grep.c:741 builtin/show-ref.c:189 -msgid "show usage" -msgstr "извеждане на начина на употреба на командата" - -#: builtin/grep.c:808 +#: builtin/grep.c:793 msgid "no pattern given." msgstr "липсва шаблон." -#: builtin/grep.c:866 +#: builtin/grep.c:851 msgid "--open-files-in-pager only works on the worktree" msgstr "" "опцията „--open-files-in-pager“ е съвместима само с търсене в работното дърво" -#: builtin/grep.c:892 +#: builtin/grep.c:877 msgid "--cached or --untracked cannot be used with --no-index." msgstr "опциите „--cached“ и „--untracked“ са несъвместими с „--no-index“." -#: builtin/grep.c:897 +#: builtin/grep.c:882 msgid "--no-index or --untracked cannot be used with revs." msgstr "" "опциите „--cached“ и „--untracked“ са несъвместими с търсене във версии." -#: builtin/grep.c:900 +#: builtin/grep.c:885 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" "опциите „--(no-)exclude-standard“ са несъвместими с търсене по следени " "файлове." -#: builtin/grep.c:908 +#: builtin/grep.c:893 msgid "both --cached and trees are given." msgstr "опцията „--cached“ е несъвместима със задаване на дърво." @@ -6229,12 +6767,11 @@ msgstr "" "git hash-object [-t ВИД] [-w] [--path=ФАЙЛ | --no-filters] [--stdin] [--] " "ФАЙЛ…" -# FIXME - list of paths or path... #: builtin/hash-object.c:81 -msgid "git hash-object --stdin-paths < " -msgstr "git hash-object --stdin-paths < ПЪТ…" +msgid "git hash-object --stdin-paths" +msgstr "git hash-object --stdin-paths" -#: builtin/hash-object.c:92 builtin/tag.c:612 +#: builtin/hash-object.c:92 msgid "type" msgstr "ВИД" @@ -6307,12 +6844,12 @@ msgstr "Версията на „emacsclient“ не може да се анал msgid "emacsclient version '%d' too old (< 22)." msgstr "Прекалено стара версия на „emacsclient“ — %d (< 22)." -#: builtin/help.c:130 builtin/help.c:158 builtin/help.c:167 builtin/help.c:175 +#: builtin/help.c:130 builtin/help.c:151 builtin/help.c:160 builtin/help.c:168 #, c-format msgid "failed to exec '%s': %s" msgstr "неуспешно изпълнение на „%s“: %s" -#: builtin/help.c:215 +#: builtin/help.c:208 #, c-format msgid "" "'%s': path for unsupported man viewer.\n" @@ -6321,7 +6858,7 @@ msgstr "" "„%s“: път към неподдържана програма за преглед на\n" " ръководството. Вместо нея пробвайте „man..cmd“." -#: builtin/help.c:227 +#: builtin/help.c:220 #, c-format msgid "" "'%s': cmd for supported man viewer.\n" @@ -6330,194 +6867,194 @@ msgstr "" "„%s“: команда за поддържана програма за преглед на\n" " ръководството. Вместо нея пробвайте „man..path“." -#: builtin/help.c:354 +#: builtin/help.c:337 #, c-format msgid "'%s': unknown man viewer." msgstr "„%s“: непозната програма за преглед на ръководството." -#: builtin/help.c:371 +#: builtin/help.c:354 msgid "no man viewer handled the request" msgstr "никоя програма за преглед на ръководство не успя да обработи заявката" -#: builtin/help.c:379 +#: builtin/help.c:362 msgid "no info viewer handled the request" msgstr "" "никоя програма за преглед на информационните страници не успя да обработи " "заявката" -#: builtin/help.c:428 +#: builtin/help.c:411 msgid "Defining attributes per path" msgstr "Указване на атрибути към път" -#: builtin/help.c:429 +#: builtin/help.c:412 msgid "Everyday Git With 20 Commands Or So" msgstr "Ежедневието в Git в рамките на 20-ина команди" -#: builtin/help.c:430 +#: builtin/help.c:413 msgid "A Git glossary" msgstr "Речник с термините на Git" -#: builtin/help.c:431 +#: builtin/help.c:414 msgid "Specifies intentionally untracked files to ignore" msgstr "Указване на неследени файлове, които да бъдат нарочно пренебрегвани" -#: builtin/help.c:432 +#: builtin/help.c:415 msgid "Defining submodule properties" msgstr "Дефиниране на свойствата на подмодулите" -#: builtin/help.c:433 +#: builtin/help.c:416 msgid "Specifying revisions and ranges for Git" msgstr "Указване на версии и интервали в Git" -#: builtin/help.c:434 +#: builtin/help.c:417 msgid "A tutorial introduction to Git (for version 1.5.1 or newer)" msgstr "Въвеждащ урок за Git (версии поне 1.5.1)" -#: builtin/help.c:435 +#: builtin/help.c:418 msgid "An overview of recommended workflows with Git" msgstr "Общ преглед на препоръчваните начини за работа с Git" -#: builtin/help.c:447 +#: builtin/help.c:430 msgid "The common Git guides are:\n" msgstr "Популярните пътеводители в Git са:\n" -#: builtin/help.c:468 builtin/help.c:485 +#: builtin/help.c:451 builtin/help.c:468 #, c-format msgid "usage: %s%s" msgstr "употреба: %s%s" -#: builtin/help.c:501 +#: builtin/help.c:484 #, c-format msgid "`git %s' is aliased to `%s'" msgstr "„git %s“ е синоним на „%s“" # FIXME merge with next? -#: builtin/index-pack.c:151 +#: builtin/index-pack.c:152 #, c-format msgid "unable to open %s" msgstr "обектът „%s“ не може да бъде отворен" -#: builtin/index-pack.c:201 +#: builtin/index-pack.c:202 #, c-format msgid "object type mismatch at %s" msgstr "неправилен вид на обекта „%s“" -#: builtin/index-pack.c:221 +#: builtin/index-pack.c:222 #, c-format msgid "did not receive expected object %s" msgstr "очакваният обект „%s“ не бе получен" -#: builtin/index-pack.c:224 +#: builtin/index-pack.c:225 #, c-format msgid "object %s: expected type %s, found %s" msgstr "неправилен вид на обекта „%s“: очакваше се „%s“, а бе получен „%s“" -#: builtin/index-pack.c:266 +#: builtin/index-pack.c:267 #, c-format msgid "cannot fill %d byte" msgid_plural "cannot fill %d bytes" msgstr[0] "не може да се запълни %d байт" msgstr[1] "не може да се запълнят %d байта" -#: builtin/index-pack.c:276 +#: builtin/index-pack.c:277 msgid "early EOF" msgstr "неочакван край на файл" -#: builtin/index-pack.c:277 +#: builtin/index-pack.c:278 msgid "read error on input" msgstr "грешка при четене на входните данни" -#: builtin/index-pack.c:289 +#: builtin/index-pack.c:290 msgid "used more bytes than were available" msgstr "използвани са повече от наличните байтове" -#: builtin/index-pack.c:296 +#: builtin/index-pack.c:297 msgid "pack too large for current definition of off_t" msgstr "пакетният файл е прекалено голям за текущата стойност на типа „off_t“" -#: builtin/index-pack.c:312 +#: builtin/index-pack.c:313 #, c-format msgid "unable to create '%s'" msgstr "пакетният файл „%s“ не може да бъде създаден" -#: builtin/index-pack.c:317 +#: builtin/index-pack.c:318 #, c-format msgid "cannot open packfile '%s'" msgstr "пакетният файл „%s“ не може да бъде отворен" -#: builtin/index-pack.c:331 +#: builtin/index-pack.c:332 msgid "pack signature mismatch" msgstr "несъответствие в подписа към пакетния файл" -#: builtin/index-pack.c:333 +#: builtin/index-pack.c:334 #, c-format msgid "pack version % unsupported" msgstr "не се поддържа пакетиране вeрсия „%“" -#: builtin/index-pack.c:351 +#: builtin/index-pack.c:352 #, c-format msgid "pack has bad object at offset %lu: %s" msgstr "повреден обект в пакетния файл при отместване %lu: %s" -#: builtin/index-pack.c:472 +#: builtin/index-pack.c:473 #, c-format msgid "inflate returned %d" msgstr "декомпресирането с „inflate“ върна %d" -#: builtin/index-pack.c:521 +#: builtin/index-pack.c:522 msgid "offset value overflow for delta base object" msgstr "стойността на отместването за обекта-разлика води до препълване" -#: builtin/index-pack.c:529 +#: builtin/index-pack.c:530 msgid "delta base offset is out of bound" msgstr "стойността на отместването за обекта-разлика е извън диапазона" -#: builtin/index-pack.c:537 +#: builtin/index-pack.c:538 #, c-format msgid "unknown object type %d" msgstr "непознат вид обект %d" -#: builtin/index-pack.c:568 +#: builtin/index-pack.c:569 msgid "cannot pread pack file" msgstr "пакетният файл не може да бъде прочетен" -#: builtin/index-pack.c:570 +#: builtin/index-pack.c:571 #, c-format msgid "premature end of pack file, %lu byte missing" msgid_plural "premature end of pack file, %lu bytes missing" msgstr[0] "неочакван край на файл, липсва %lu байт" msgstr[1] "неочакван край на файл, липсват %lu байта" -#: builtin/index-pack.c:596 +#: builtin/index-pack.c:597 msgid "serious inflate inconsistency" msgstr "сериозна грешка при декомпресиране с „inflate“" -#: builtin/index-pack.c:742 builtin/index-pack.c:748 builtin/index-pack.c:771 -#: builtin/index-pack.c:805 builtin/index-pack.c:814 +#: builtin/index-pack.c:743 builtin/index-pack.c:749 builtin/index-pack.c:772 +#: builtin/index-pack.c:806 builtin/index-pack.c:815 #, c-format msgid "SHA1 COLLISION FOUND WITH %s !" msgstr "" "СЪВПАДЕНИЕ НА СТОЙНОСТИТЕ ЗА СУМИТЕ ЗА SHA1: „%s“ НА ДВА РАЗЛИЧНИ ОБЕКТА!" # FIXME merge with next? -#: builtin/index-pack.c:745 builtin/pack-objects.c:162 +#: builtin/index-pack.c:746 builtin/pack-objects.c:162 #: builtin/pack-objects.c:254 #, c-format msgid "unable to read %s" msgstr "обектът „%s“ не може да бъде прочетен" -#: builtin/index-pack.c:811 +#: builtin/index-pack.c:812 #, c-format msgid "cannot read existing object %s" msgstr "съществуващият обект „%s“ не може да бъде прочетен" -#: builtin/index-pack.c:825 +#: builtin/index-pack.c:826 #, c-format msgid "invalid blob object %s" msgstr "неправилен обект BLOB „%s“" # FIXME perhaps invalid object -#: builtin/index-pack.c:839 +#: builtin/index-pack.c:840 #, c-format msgid "invalid %s" msgstr "неправилен обект „%s“" @@ -6644,7 +7181,7 @@ msgstr "зададена е неправилна версия пакетиран msgid "invalid number of threads specified (%d)" msgstr "зададен е неправилен брой нишки: %d" -#: builtin/index-pack.c:1479 builtin/index-pack.c:1658 +#: builtin/index-pack.c:1479 builtin/index-pack.c:1663 #, c-format msgid "no threads support, ignoring %s" msgstr "липсва поддръжка за нишки. „%s“ ще се пренебрегне" @@ -6674,114 +7211,86 @@ msgstr[0] "дължината на веригата е %d: %lu обект" msgstr[1] "дължината на веригата е %d: %lu обекта" # FIXME it is not the cwd it is the previous cwd -#: builtin/index-pack.c:1622 +#: builtin/index-pack.c:1623 msgid "Cannot come back to cwd" msgstr "Процесът не може да се върне към предишната работна директория" -#: builtin/index-pack.c:1670 builtin/index-pack.c:1673 -#: builtin/index-pack.c:1685 builtin/index-pack.c:1689 +#: builtin/index-pack.c:1675 builtin/index-pack.c:1678 +#: builtin/index-pack.c:1690 builtin/index-pack.c:1694 #, c-format msgid "bad %s" msgstr "неправилна стойност „%s“" -#: builtin/index-pack.c:1703 +#: builtin/index-pack.c:1708 msgid "--fix-thin cannot be used without --stdin" msgstr "опцията „--fix-thin“ изисква „--stdin“" -#: builtin/index-pack.c:1707 builtin/index-pack.c:1716 +#: builtin/index-pack.c:1712 builtin/index-pack.c:1721 #, c-format msgid "packfile name '%s' does not end with '.pack'" msgstr "името на пакетния файл „%s“ не завършва на „.pack“" -#: builtin/index-pack.c:1724 +#: builtin/index-pack.c:1729 msgid "--verify with no packfile name given" msgstr "опцията „--verify“ изисква име на пакетен файл" -#: builtin/init-db.c:35 -#, c-format -msgid "Could not make %s writable by group" -msgstr "Не могат да се дадат права за запис в директорията „%s“ на групата" - -# FIXME - bad wording insanely -#: builtin/init-db.c:62 -#, c-format -msgid "insanely long template name %s" -msgstr "твърде дълго име на шаблон: „%s“" - -#: builtin/init-db.c:67 +#: builtin/init-db.c:55 #, c-format msgid "cannot stat '%s'" msgstr "не може да се получи информация чрез „stat“ за директорията „%s“" -#: builtin/init-db.c:73 +#: builtin/init-db.c:61 #, c-format msgid "cannot stat template '%s'" msgstr "не може да се получи информация чрез „stat“ за шаблона „%s“" -#: builtin/init-db.c:80 +#: builtin/init-db.c:66 #, c-format msgid "cannot opendir '%s'" msgstr "директорията „%s“ не може да бъде отворена" -#: builtin/init-db.c:97 +#: builtin/init-db.c:77 #, c-format msgid "cannot readlink '%s'" msgstr "връзката „%s“ не може да бъде прочетена" -# FIXME - bad wording insanely -#: builtin/init-db.c:99 -#, c-format -msgid "insanely long symlink %s" -msgstr "твърде дълго име на символна връзка: „%s“" - -#: builtin/init-db.c:102 +#: builtin/init-db.c:79 #, c-format msgid "cannot symlink '%s' '%s'" msgstr "не може да се създаде символна връзка „%s“ в „%s“" -#: builtin/init-db.c:106 +#: builtin/init-db.c:85 #, c-format msgid "cannot copy '%s' to '%s'" msgstr "„%s“ не може да се копира в „%s“" -#: builtin/init-db.c:110 +#: builtin/init-db.c:89 #, c-format msgid "ignoring template %s" msgstr "игнориране на шаблона „%s“" -# FIXME bad word insanely -#: builtin/init-db.c:136 -#, c-format -msgid "insanely long template path %s" -msgstr "твърде дълъг път към шаблон: „%s“" - -#: builtin/init-db.c:144 +#: builtin/init-db.c:118 #, c-format msgid "templates not found %s" msgstr "директорията с шаблоните не е открита: „%s“" -#: builtin/init-db.c:157 +#: builtin/init-db.c:131 #, c-format msgid "not copying templates of a wrong format version %d from '%s'" msgstr "" -"шаблоните с неправилен номер на формата %d няма да бъдат копирани от „%s“" +"шаблоните с неправилен номер на форма̀та %d няма да бъдат копирани от „%s“" -#: builtin/init-db.c:211 -#, c-format -msgid "insane git directory %s" -msgstr "твърде дълго име на директория на Git: „%s“" - -#: builtin/init-db.c:343 builtin/init-db.c:346 +#: builtin/init-db.c:309 builtin/init-db.c:312 #, c-format msgid "%s already exists" msgstr "Директорията „%s“ вече съществува" -#: builtin/init-db.c:374 +#: builtin/init-db.c:340 #, c-format msgid "unable to handle file type %d" msgstr "файлове от вид %d не се поддържат" -#: builtin/init-db.c:377 +#: builtin/init-db.c:343 #, c-format msgid "unable to move %s to %s" msgstr "„%s“ не може да се премести в „%s“" @@ -6789,24 +7298,24 @@ msgstr "„%s“ не може да се премести в „%s“" #. 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:433 +#: builtin/init-db.c:399 #, c-format msgid "%s%s Git repository in %s%s\n" msgstr "%s%s хранилище на Git в „%s%s“\n" -#: builtin/init-db.c:434 +#: builtin/init-db.c:400 msgid "Reinitialized existing" msgstr "Наново инициализирано, съществуващо" -#: builtin/init-db.c:434 +#: builtin/init-db.c:400 msgid "Initialized empty" msgstr "Инициализирано празно" -#: builtin/init-db.c:435 +#: builtin/init-db.c:401 msgid " shared" msgstr ", споделено" -#: builtin/init-db.c:482 +#: builtin/init-db.c:448 msgid "" "git init [-q | --quiet] [--bare] [--template=] [--" "shared[=]] []" @@ -6814,31 +7323,27 @@ msgstr "" "git init [-q | --quiet] [--bare] [--template=ДИРЕКТОРИЯ_С_ШАБЛОНИ] [--" "shared[=ПРАВА]] [ДИРЕКТОРИЯ]" -#: builtin/init-db.c:505 +#: builtin/init-db.c:471 msgid "permissions" msgstr "права" -#: builtin/init-db.c:506 +#: builtin/init-db.c:472 msgid "specify that the git repository is to be shared amongst several users" msgstr "" "указване, че хранилището на Git ще бъде споделено от повече от един " "потребител" -#: builtin/init-db.c:508 builtin/prune-packed.c:57 builtin/repack.c:171 -msgid "be quiet" -msgstr "без извеждане на информация" - -#: builtin/init-db.c:540 builtin/init-db.c:545 +#: builtin/init-db.c:506 builtin/init-db.c:511 #, c-format msgid "cannot mkdir %s" msgstr "директорията „%s“ не може да бъде създадена" -#: builtin/init-db.c:549 +#: builtin/init-db.c:515 #, c-format msgid "cannot chdir to %s" msgstr "не може да се влезе в директорията „%s“" -#: builtin/init-db.c:570 +#: builtin/init-db.c:536 #, c-format msgid "" "%s (or --work-tree=) not allowed without specifying %s (or --git-" @@ -6847,7 +7352,7 @@ msgstr "" "%s (или --work-tree=ДИРЕКТОРИЯ) изисква указването на %s (или --git-" "dir=ДИРЕКТОРИЯ)" -#: builtin/init-db.c:598 +#: builtin/init-db.c:564 #, c-format msgid "Cannot access work tree '%s'" msgstr "Работното дърво в „%s“ е недостъпно" @@ -6872,291 +7377,290 @@ msgstr "епилог" msgid "trailer(s) to add" msgstr "епилог(зи) за добавяне" -#: builtin/log.c:41 +#: builtin/log.c:43 msgid "git log [] [] [[--] ...]" msgstr "git log [ОПЦИЯ…] [ДИАПАЗОН_НА_ВЕРСИИТЕ] [[--] ПЪТ…]" -#: builtin/log.c:42 +#: builtin/log.c:44 msgid "git show [] ..." msgstr "git show [ОПЦИЯ…] ОБЕКТ…" -#: builtin/log.c:81 +#: builtin/log.c:83 #, c-format msgid "invalid --decorate option: %s" msgstr "неправилна опция „--decorate“: %s" -#: builtin/log.c:127 +#: builtin/log.c:131 msgid "suppress diff output" msgstr "без извеждане на разликите" -#: builtin/log.c:128 +#: builtin/log.c:132 msgid "show source" msgstr "извеждане на изходния код" -#: builtin/log.c:129 +#: builtin/log.c:133 msgid "Use mail map file" msgstr "" "Използване на файл за съответствията на имената и адресите на е-поща („." "mailmap“)" -#: builtin/log.c:130 +#: builtin/log.c:134 msgid "decorate options" msgstr "настройки на форма̀та на извежданата информация" -#: builtin/log.c:133 +#: builtin/log.c:137 msgid "Process line range n,m in file, counting from 1" msgstr "" "Обработване само на редовете във файла в интервала от n до m включително. " "Броенето започва от 1" -#: builtin/log.c:229 +#: builtin/log.c:233 #, c-format msgid "Final output: %d %s\n" msgstr "Резултат: %d %s\n" -#: builtin/log.c:458 +#: builtin/log.c:465 #, c-format msgid "git show %s: bad file" msgstr "git show %s: повреден файл" -#: builtin/log.c:472 builtin/log.c:564 +#: builtin/log.c:479 builtin/log.c:572 #, c-format msgid "Could not read object %s" msgstr "Обектът не може да бъде прочетен: %s" -#: builtin/log.c:588 +#: builtin/log.c:596 #, c-format msgid "Unknown type: %d" msgstr "Неизвестен вид: %d" -#: builtin/log.c:689 +#: builtin/log.c:714 msgid "format.headers without value" msgstr "не е зададена стойност на „format.headers“" -#: builtin/log.c:773 +#: builtin/log.c:798 msgid "name of output directory is too long" msgstr "прекалено дълго име на директорията за изходната информация" -#: builtin/log.c:789 +#: builtin/log.c:813 #, c-format msgid "Cannot open patch file %s" msgstr "Файлът-кръпка „%s“ не може да бъде отворен" -#: builtin/log.c:803 +#: builtin/log.c:827 msgid "Need exactly one range." msgstr "Трябва да зададете точно един диапазон." -#: builtin/log.c:813 +#: builtin/log.c:837 msgid "Not a range." msgstr "Не е диапазон." -#: builtin/log.c:919 +#: builtin/log.c:943 msgid "Cover letter needs email format" msgstr "Придружаващото писмо трябва да е форматирано като е-писмо" # FIXME bad wording insanely -#: builtin/log.c:998 +#: builtin/log.c:1022 #, c-format msgid "insane in-reply-to: %s" msgstr "неправилен формат на заглавната част за отговор „in-reply-to“: %s" -#: builtin/log.c:1026 +#: builtin/log.c:1050 msgid "git format-patch [] [ | ]" msgstr "git format-patch [ОПЦИЯ…] [ОТ | ДИАПАЗОН_НА_ВЕРСИИТЕ]" # FIXME message WTF why ask it -#: builtin/log.c:1071 +#: builtin/log.c:1095 msgid "Two output directories?" msgstr "Можете да укажете максимум една директория за изход." -#: builtin/log.c:1186 +#: builtin/log.c:1211 msgid "use [PATCH n/m] even with a single patch" msgstr "номерация „[PATCH n/m]“ дори и при единствена кръпка" -#: builtin/log.c:1189 +#: builtin/log.c:1214 msgid "use [PATCH] even with multiple patches" msgstr "номерация „[PATCH]“ дори и при множество кръпки" -#: builtin/log.c:1193 +#: builtin/log.c:1218 msgid "print patches to standard out" msgstr "извеждане на кръпките на стандартния изход" -#: builtin/log.c:1195 +#: builtin/log.c:1220 msgid "generate a cover letter" msgstr "създаване на придружаващо писмо" -#: builtin/log.c:1197 +#: builtin/log.c:1222 msgid "use simple number sequence for output file names" msgstr "проста числова последователност за имената на файловете-кръпки" -#: builtin/log.c:1198 +#: builtin/log.c:1223 msgid "sfx" msgstr "ЗНАЦИ" -#: builtin/log.c:1199 +#: builtin/log.c:1224 msgid "use instead of '.patch'" msgstr "използване на тези ЗНАЦИ за суфикс вместо „.patch“" -#: builtin/log.c:1201 +#: builtin/log.c:1226 msgid "start numbering patches at instead of 1" msgstr "номерирането на кръпките да започва от този БРОЙ, а не с 1" -#: builtin/log.c:1203 +#: builtin/log.c:1228 msgid "mark the series as Nth re-roll" msgstr "отбелязване, че това е N-тата поредна редакция на поредицата от кръпки" -#: builtin/log.c:1205 +#: builtin/log.c:1230 msgid "Use [] instead of [PATCH]" msgstr "Използване на този „[ПРЕФИКС]“ вместо „[PATCH]“" -#: builtin/log.c:1208 +#: builtin/log.c:1233 msgid "store resulting files in " msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ" -#: builtin/log.c:1211 +#: builtin/log.c:1236 msgid "don't strip/add [PATCH]" msgstr "без добавяне/махане на префикса „[PATCH]“" -#: builtin/log.c:1214 +#: builtin/log.c:1239 msgid "don't output binary diffs" msgstr "без извеждане на разлики между двоични файлове" -#: builtin/log.c:1216 +#: builtin/log.c:1241 +msgid "output all-zero hash in From header" +msgstr "в заглавната част „From:“ (от) хешът да е само от нули" + +#: builtin/log.c:1243 msgid "don't include a patch matching a commit upstream" msgstr "да не се включват кръпки, които присъстват в следения клон" -#: builtin/log.c:1218 +#: builtin/log.c:1245 msgid "show patch format instead of default (patch + stat)" msgstr "" "извеждане във формат за кръпки, а на в стандартния (кръпка и статистика)" -#: builtin/log.c:1220 +#: builtin/log.c:1247 msgid "Messaging" msgstr "Опции при изпращане" -#: builtin/log.c:1221 +#: builtin/log.c:1248 msgid "header" msgstr "ЗАГЛАВНА_ЧАСТ" -#: builtin/log.c:1222 +#: builtin/log.c:1249 msgid "add email header" msgstr "добавяне на тази ЗАГЛАВНА_ЧАСТ" -#: builtin/log.c:1223 builtin/log.c:1225 +#: builtin/log.c:1250 builtin/log.c:1252 msgid "email" msgstr "Е-ПОЩА" -#: builtin/log.c:1223 +#: builtin/log.c:1250 msgid "add To: header" msgstr "добавяне на заглавна част „To:“ (до)" -#: builtin/log.c:1225 +#: builtin/log.c:1252 msgid "add Cc: header" msgstr "добавяне на заглавна част „Cc:“ (и до)" -#: builtin/log.c:1227 +#: builtin/log.c:1254 msgid "ident" msgstr "ИДЕНТИЧНОСТ" -#: builtin/log.c:1228 +#: builtin/log.c:1255 msgid "set From address to (or committer ident if absent)" msgstr "" -"задаване на адреса в заглавната част „From“ да е тази ИДЕНТИЧНОСТ. Ако не е " -"зададена такава, се взима адреса на подаващия" +"задаване на адреса в заглавната част „From“ (от) да е тази ИДЕНТИЧНОСТ. Ако " +"не е зададена такава, се взима адреса на подаващия" -#: builtin/log.c:1230 +#: builtin/log.c:1257 msgid "message-id" msgstr "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ" -#: builtin/log.c:1231 +#: builtin/log.c:1258 msgid "make first mail a reply to " msgstr "" "първото съобщение да е в отговор на е-писмото с този " "ИДЕНТИФИКАТОР_НА_СЪОБЩЕНИЕ" -#: builtin/log.c:1232 builtin/log.c:1235 +#: builtin/log.c:1259 builtin/log.c:1262 msgid "boundary" msgstr "граница" -#: builtin/log.c:1233 +#: builtin/log.c:1260 msgid "attach the patch" msgstr "прикрепяне на кръпката" -#: builtin/log.c:1236 +#: builtin/log.c:1263 msgid "inline the patch" msgstr "включване на кръпката в текста на писмата" -#: builtin/log.c:1240 +#: builtin/log.c:1267 msgid "enable message threading, styles: shallow, deep" msgstr "" "използване на нишки за съобщенията. Стилът е „shallow“ (плитък) или " "„deep“ (дълбок)" -#: builtin/log.c:1242 +#: builtin/log.c:1269 msgid "signature" msgstr "подпис" -#: builtin/log.c:1243 +#: builtin/log.c:1270 msgid "add a signature" msgstr "добавяне на поле за подпис" -#: builtin/log.c:1245 +#: builtin/log.c:1272 msgid "add a signature from a file" msgstr "добавяне на подпис от файл" -#: builtin/log.c:1246 +#: builtin/log.c:1273 msgid "don't print the patch filenames" msgstr "без извеждане на имената на кръпките" -#: builtin/log.c:1320 -#, c-format -msgid "invalid ident line: %s" -msgstr "грешна идентичност: %s" - -#: builtin/log.c:1335 +#: builtin/log.c:1362 msgid "-n and -k are mutually exclusive." msgstr "опциите „-n“ и „-k“ са несъвместими." -#: builtin/log.c:1337 +#: builtin/log.c:1364 msgid "--subject-prefix and -k are mutually exclusive." msgstr "опциите „--subject-prefix“ и „-k“ са несъвместими." -#: builtin/log.c:1345 +#: builtin/log.c:1372 msgid "--name-only does not make sense" msgstr "опцията „--name-only“ е несъвместима с генерирането на кръпки" -#: builtin/log.c:1347 +#: builtin/log.c:1374 msgid "--name-status does not make sense" msgstr "опцията „--name-status“ е несъвместима с генерирането на кръпки" -#: builtin/log.c:1349 +#: builtin/log.c:1376 msgid "--check does not make sense" msgstr "опцията „--check“ е несъвместима с генерирането на кръпки" -#: builtin/log.c:1372 +#: builtin/log.c:1401 msgid "standard output, or directory, which one?" msgstr "" "изходът може да или стандартният, или да е в директория, но не и двете." -#: builtin/log.c:1374 +#: builtin/log.c:1403 #, c-format msgid "Could not create directory '%s'" msgstr "Директорията „%s“ не може да бъде създадена" -#: builtin/log.c:1472 +#: builtin/log.c:1500 #, c-format msgid "unable to read signature file '%s'" msgstr "файлът „%s“ с подпис не може да бъде прочетен" -#: builtin/log.c:1535 +#: builtin/log.c:1563 msgid "Failed to create output files" msgstr "Изходните файлове не могат да бъдат създадени" -#: builtin/log.c:1583 +#: builtin/log.c:1611 msgid "git cherry [-v] [ [ []]]" msgstr "git cherry [-v] [ОТДАЛЕЧЕН_КЛОН [ВРЪХ [ПРЕДЕЛ]]]" -#: builtin/log.c:1637 +#: builtin/log.c:1665 #, c-format msgid "" "Could not find a tracked remote branch, please specify manually.\n" @@ -7164,7 +7668,7 @@ msgstr "" "Следеният отдалечен клон не бе открит, затова изрично задайте " "ОТДАЛЕЧЕН_КЛОН.\n" -#: builtin/log.c:1648 builtin/log.c:1650 builtin/log.c:1662 +#: builtin/log.c:1676 builtin/log.c:1678 builtin/log.c:1690 #, c-format msgid "Unknown commit %s" msgstr "Непознато подаване „%s“" @@ -7268,35 +7772,35 @@ msgstr "извеждане на информацията за изчистван msgid "git ls-tree [] [...]" msgstr "git ls-tree [ОПЦИЯ…] УКАЗАТЕЛ_КЪМ_ДЪРВО [ПЪТ…]" -#: builtin/ls-tree.c:127 +#: builtin/ls-tree.c:128 msgid "only show trees" msgstr "извеждане само на дървета" -#: builtin/ls-tree.c:129 +#: builtin/ls-tree.c:130 msgid "recurse into subtrees" msgstr "рекурсивно обхождане поддърветата" -#: builtin/ls-tree.c:131 +#: builtin/ls-tree.c:132 msgid "show trees when recursing" msgstr "извеждане на дърветата при рекурсивното обхождане" -#: builtin/ls-tree.c:134 +#: builtin/ls-tree.c:135 msgid "terminate entries with NUL byte" msgstr "разделяне на обектите с нулевия знак „NUL“" -#: builtin/ls-tree.c:135 +#: builtin/ls-tree.c:136 msgid "include object size" msgstr "извеждане на размера на обекта" -#: builtin/ls-tree.c:137 builtin/ls-tree.c:139 +#: builtin/ls-tree.c:138 builtin/ls-tree.c:140 msgid "list only filenames" msgstr "извеждане само имената на файловете" -#: builtin/ls-tree.c:142 +#: builtin/ls-tree.c:143 msgid "use full path names" msgstr "използване на пълните имена на пътищата" -#: builtin/ls-tree.c:144 +#: builtin/ls-tree.c:145 msgid "list entire tree; not just current directory (implies --full-name)" msgstr "" "извеждане на цялото дърво, не само на текущата директория (включва опцията " @@ -7334,33 +7838,33 @@ msgstr "Наличните стратегии са:" msgid "Available custom strategies are:" msgstr "Допълнителните стратегии са:" -#: builtin/merge.c:193 +#: builtin/merge.c:193 builtin/pull.c:119 msgid "do not show a diffstat at the end of the merge" msgstr "без извеждане на статистиката след завършване на сливане" -#: builtin/merge.c:196 +#: builtin/merge.c:196 builtin/pull.c:122 msgid "show a diffstat at the end of the merge" msgstr "извеждане на статистиката след завършване на сливане" -#: builtin/merge.c:197 +#: builtin/merge.c:197 builtin/pull.c:125 msgid "(synonym to --stat)" msgstr "(синоним на „--stat“)" -#: builtin/merge.c:199 +#: builtin/merge.c:199 builtin/pull.c:128 msgid "add (at most ) entries from shortlog to merge commit message" msgstr "" "добавяне (на максимум такъв БРОЙ) записи от съкратения журнал в съобщението " "за подаване" -#: builtin/merge.c:202 +#: builtin/merge.c:202 builtin/pull.c:131 msgid "create a single commit instead of doing a merge" msgstr "създаване на едно подаване вместо извършване на сливане" -#: builtin/merge.c:204 +#: builtin/merge.c:204 builtin/pull.c:134 msgid "perform a commit if the merge succeeds (default)" msgstr "извършване на подаване при успешно сливане (стандартно действие)" -#: builtin/merge.c:206 +#: builtin/merge.c:206 builtin/pull.c:137 msgid "edit message before committing" msgstr "редактиране на съобщението преди подаване" @@ -7368,7 +7872,7 @@ msgstr "редактиране на съобщението преди подав msgid "allow fast-forward (default)" msgstr "позволяване на тривиално сливане (стандартно действие)" -#: builtin/merge.c:209 +#: builtin/merge.c:209 builtin/pull.c:143 msgid "abort if fast-forward is not possible" msgstr "преустановяване, ако сливането не е тривиално" @@ -7376,19 +7880,20 @@ msgstr "преустановяване, ако сливането не е три msgid "Verify that the named commit has a valid GPG signature" msgstr "Проверка, че именуваното подаване е с правилен подпис на GPG" -#: builtin/merge.c:214 builtin/notes.c:753 builtin/revert.c:89 +#: builtin/merge.c:214 builtin/notes.c:767 builtin/pull.c:148 +#: builtin/revert.c:89 msgid "strategy" msgstr "стратегия" -#: builtin/merge.c:215 +#: builtin/merge.c:215 builtin/pull.c:149 msgid "merge strategy to use" msgstr "стратегия за сливане, която да се ползва" -#: builtin/merge.c:216 +#: builtin/merge.c:216 builtin/pull.c:152 msgid "option=value" msgstr "опция=стойност" -#: builtin/merge.c:217 +#: builtin/merge.c:217 builtin/pull.c:153 msgid "option for selected merge strategy" msgstr "опция за избраната стратегия за сливане" @@ -7426,6 +7931,12 @@ msgstr " (няма какво да се смачка)" msgid "Squash commit -- not updating HEAD\n" msgstr "Подаване със смачкване — указателят „HEAD“ няма да бъде обновен\n" +#: builtin/merge.c:344 builtin/merge.c:763 builtin/merge.c:975 +#: builtin/merge.c:988 +#, c-format +msgid "Could not write to '%s'" +msgstr "„%s“ не може да бъде записан" + #: builtin/merge.c:372 msgid "Writing SQUASH_MSG" msgstr "Записване на съобщението за смачкване SQUASH_MSG" @@ -7450,10 +7961,6 @@ msgstr "„%s“ не сочи към подаване" msgid "Bad branch.%s.mergeoptions string: %s" msgstr "Неправилен низ за настройката „branch.%s.mergeoptions“: „%s“" -#: builtin/merge.c:632 -msgid "git write-tree failed to write a tree" -msgstr "Командата „git write-tree“ не успя да запише обект-дърво" - #: builtin/merge.c:656 msgid "Not handling anything other than two heads merge." msgstr "Поддържа се само сливане на точно две истории." @@ -7532,18 +8039,18 @@ msgstr "Текущият клон не следи никой клон." msgid "No remote-tracking branch for %s from %s" msgstr "Никой клон не следи клона „%s“ от хранилището „%s“" -#: builtin/merge.c:1081 +#: builtin/merge.c:1079 #, c-format msgid "could not close '%s'" msgstr "„%s“ не може да се затвори" -#: builtin/merge.c:1208 +#: builtin/merge.c:1206 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "" "Не може да преустановите сливане, защото в момента не се извършва такова " "(липсва указател „MERGE_HEAD“)." -#: builtin/merge.c:1224 +#: builtin/merge.c:1222 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you merge." @@ -7551,11 +8058,7 @@ msgstr "" "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува).\n" "Подайте промените си, преди да започнете ново сливане." -#: builtin/merge.c:1227 git-pull.sh:74 -msgid "You have not concluded your merge (MERGE_HEAD exists)." -msgstr "Не сте завършили сливане. (Указателят „MERGE_HEAD“ съществува)." - -#: builtin/merge.c:1231 +#: builtin/merge.c:1229 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you merge." @@ -7563,58 +8066,58 @@ msgstr "" "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n" "съществува). Подайте промените си, преди да започнете ново сливане." -#: builtin/merge.c:1234 +#: builtin/merge.c:1232 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" "Не сте завършили отбиране на подаване (указателят „CHERRY_PICK_HEAD“\n" "съществува)." -#: builtin/merge.c:1243 +#: builtin/merge.c:1241 msgid "You cannot combine --squash with --no-ff." msgstr "Опцията „--squash“ е несъвместима с „--no-ff“." -#: builtin/merge.c:1251 +#: builtin/merge.c:1249 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "" "Не е указано подаване и настройката „merge.defaultToUpstream“ не е зададена." -#: builtin/merge.c:1268 +#: builtin/merge.c:1266 msgid "Squash commit into empty head not supported yet" msgstr "Подаване със смачкване във връх без история все още не се поддържа" -#: builtin/merge.c:1270 +#: builtin/merge.c:1268 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "" "Понеже върхът е без история, всички сливания са тривиални, не може да се " "извърши нетривиално сливане изисквано от опцията „--no-ff“" -#: builtin/merge.c:1276 +#: builtin/merge.c:1274 #, c-format msgid "%s - not something we can merge" msgstr "„%s“ — не е нещо, което може да се слее" -#: builtin/merge.c:1278 +#: builtin/merge.c:1276 msgid "Can merge only exactly one commit into empty head" msgstr "Можете да слеете точно едно подаване във връх без история" -#: builtin/merge.c:1333 +#: builtin/merge.c:1331 #, c-format msgid "Commit %s has an untrusted GPG signature, allegedly by %s." msgstr "" "Подаването „%s“ е с недоверен подпис от GPG, който твърди, че е на „%s“." -#: builtin/merge.c:1336 +#: builtin/merge.c:1334 #, c-format msgid "Commit %s has a bad GPG signature allegedly by %s." msgstr "" "Подаването „%s“ е с неправилен подпис от GPG, който твърди, че е на „%s“." -#: builtin/merge.c:1339 +#: builtin/merge.c:1337 #, c-format msgid "Commit %s does not have a GPG signature." msgstr "Подаването „%s“ е без подпис от GPG." -#: builtin/merge.c:1342 +#: builtin/merge.c:1340 #, c-format msgid "Commit %s has a good GPG signature by %s\n" msgstr "Подаването „%s“ е с коректен подпис от GPG на „%s“.\n" @@ -7624,50 +8127,50 @@ msgstr "Подаването „%s“ е с коректен подпис от G msgid "Updating %s..%s\n" msgstr "Обновяване „%s..%s“\n" -#: builtin/merge.c:1462 +#: builtin/merge.c:1460 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Проба с най-тривиалното сливане в рамките на индекса…\n" # FIXME WTF message -#: builtin/merge.c:1469 +#: builtin/merge.c:1467 #, c-format msgid "Nope.\n" msgstr "Неуспешно сливане.\n" -#: builtin/merge.c:1501 +#: builtin/merge.c:1499 msgid "Not possible to fast-forward, aborting." msgstr "" "Не може да се извърши тривиално сливане, преустановяване на действието." -#: builtin/merge.c:1524 builtin/merge.c:1603 +#: builtin/merge.c:1522 builtin/merge.c:1601 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Привеждане на дървото към първоначалното…\n" -#: builtin/merge.c:1528 +#: builtin/merge.c:1526 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Пробване със стратегията за сливане „%s“…\n" -#: builtin/merge.c:1594 +#: builtin/merge.c:1592 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Никоя стратегия за сливане не може да извърши сливането.\n" -#: builtin/merge.c:1596 +#: builtin/merge.c:1594 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Неуспешно сливане със стратегия „%s“.\n" -#: builtin/merge.c:1605 +#: builtin/merge.c:1603 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "" "Ползва се стратегията „%s“, която ще подготви дървото за коригиране на " "ръка.\n" -#: builtin/merge.c:1617 +#: builtin/merge.c:1615 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" @@ -7862,59 +8365,59 @@ msgstr "%s, обект: „%s“, цел: „%s“" msgid "Renaming %s to %s\n" msgstr "Преименуване на „%s“ на „%s“\n" -#: builtin/mv.c:256 builtin/remote.c:725 builtin/repack.c:361 +#: builtin/mv.c:256 builtin/remote.c:728 builtin/repack.c:365 #, c-format msgid "renaming '%s' failed" msgstr "неуспешно преименуване на „%s“" -#: builtin/name-rev.c:255 +#: builtin/name-rev.c:251 msgid "git name-rev [] ..." msgstr "git name-rev [ОПЦИЯ…] ПОДАВАНЕ…" -#: builtin/name-rev.c:256 +#: builtin/name-rev.c:252 msgid "git name-rev [] --all" msgstr "git name-rev [ОПЦИЯ…] --all" -#: builtin/name-rev.c:257 +#: builtin/name-rev.c:253 msgid "git name-rev [] --stdin" msgstr "git name-rev [ОПЦИЯ…] --stdin" # FIXME sha -#: builtin/name-rev.c:309 +#: builtin/name-rev.c:305 msgid "print only names (no SHA-1)" msgstr "извеждане само на имената (без сумите по SHA1)" -#: builtin/name-rev.c:310 +#: builtin/name-rev.c:306 msgid "only use tags to name the commits" msgstr "използване само на етикетите за именуване на подаванията" -#: builtin/name-rev.c:312 +#: builtin/name-rev.c:308 msgid "only use refs matching " msgstr "използване само на шаблоните напасващи на ШАБЛОНа" -#: builtin/name-rev.c:314 +#: builtin/name-rev.c:310 msgid "list all commits reachable from all refs" msgstr "" "извеждане на всички подавания, които могат да бъдат достигнати от всички " "указатели" -#: builtin/name-rev.c:315 +#: builtin/name-rev.c:311 msgid "read from stdin" msgstr "четене от стандартния вход" -#: builtin/name-rev.c:316 +#: builtin/name-rev.c:312 msgid "allow to print `undefined` names (default)" msgstr "да се извеждат и недефинираните имена (стандартна стойност на опцията)" -#: builtin/name-rev.c:322 +#: builtin/name-rev.c:318 msgid "dereference tags in the input (internal use)" msgstr "извеждане на идентификаторите на обекти-етикети (за вътрешни нужди)" -#: builtin/notes.c:24 +#: builtin/notes.c:25 msgid "git notes [--ref ] [list []]" msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] [list [ОБЕКТ]]" -#: builtin/notes.c:25 +#: builtin/notes.c:26 msgid "" "git notes [--ref ] add [-f] [--allow-empty] [-m | -F " "| (-c | -C) ] []" @@ -7922,12 +8425,12 @@ msgstr "" "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] add [-f] [--allow-empty] [-m СЪОБЩЕНИЕ " "| -F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]" -#: builtin/notes.c:26 +#: builtin/notes.c:27 msgid "git notes [--ref ] copy [-f] " msgstr "" "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] copy [-f] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ" -#: builtin/notes.c:27 +#: builtin/notes.c:28 msgid "" "git notes [--ref ] append [--allow-empty] [-m | -F | " "(-c | -C) ] []" @@ -7935,205 +8438,190 @@ msgstr "" "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] append [--allow-empty] [-m СЪОБЩЕНИЕ | " "-F ФАЙЛ | (-c | -C) ОБЕКТ] [ОБЕКТ]" -#: builtin/notes.c:28 +#: builtin/notes.c:29 msgid "git notes [--ref ] edit [--allow-empty] []" msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] edit [--allow-empty] [ОБЕКТ]" -#: builtin/notes.c:29 +#: builtin/notes.c:30 msgid "git notes [--ref ] show []" msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] show [ОБЕКТ]" -#: builtin/notes.c:30 +#: builtin/notes.c:31 msgid "" "git notes [--ref ] merge [-v | -q] [-s ] " msgstr "" "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] merge [-v | -q] [-s СТРАТЕГИЯ] " "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА" -#: builtin/notes.c:31 +#: builtin/notes.c:32 msgid "git notes merge --commit [-v | -q]" msgstr "git notes merge --commit [-v | -q]" -#: builtin/notes.c:32 +#: builtin/notes.c:33 msgid "git notes merge --abort [-v | -q]" msgstr "git notes merge --abort [-v | -q]" -#: builtin/notes.c:33 +#: builtin/notes.c:34 msgid "git notes [--ref ] remove [...]" msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] remove [ОБЕКТ…]" -#: builtin/notes.c:34 +#: builtin/notes.c:35 msgid "git notes [--ref ] prune [-n | -v]" msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] prune [-n | -v]" -#: builtin/notes.c:35 +#: builtin/notes.c:36 msgid "git notes [--ref ] get-ref" msgstr "git notes [--ref УКАЗАТЕЛ_ЗА_БЕЛЕЖКА] get-ref" -#: builtin/notes.c:40 +#: builtin/notes.c:41 msgid "git notes [list []]" msgstr "git notes [list [ОБЕКТ]]" -#: builtin/notes.c:45 +#: builtin/notes.c:46 msgid "git notes add [] []" msgstr "git notes add [ОПЦИЯ…] [ОБЕКТ]" -#: builtin/notes.c:50 +#: builtin/notes.c:51 msgid "git notes copy [] " msgstr "git notes copy [ОПЦИЯ…] ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ" -#: builtin/notes.c:51 +#: builtin/notes.c:52 msgid "git notes copy --stdin [ ]..." msgstr "git notes copy --stdin [ОБЕКТ_ИЗТОЧНИК ОБЕКТ_ЦЕЛ]…" -#: builtin/notes.c:56 +#: builtin/notes.c:57 msgid "git notes append [] []" msgstr "git notes append [ОПЦИЯ…] [ОБЕКТ]" -#: builtin/notes.c:61 +#: builtin/notes.c:62 msgid "git notes edit []" msgstr "git notes edit [ОБЕКТ]" -#: builtin/notes.c:66 +#: builtin/notes.c:67 msgid "git notes show []" msgstr "git notes show [ОБЕКТ]" -#: builtin/notes.c:71 +#: builtin/notes.c:72 msgid "git notes merge [] " msgstr "git notes merge [ОПЦИЯ…] УКАЗАТЕЛ_ЗА_БЕЛЕЖКА" -#: builtin/notes.c:72 +#: builtin/notes.c:73 msgid "git notes merge --commit []" msgstr "git notes merge --commit [ОПЦИЯ…]" -#: builtin/notes.c:73 +#: builtin/notes.c:74 msgid "git notes merge --abort []" msgstr "git notes merge --abort [ОПЦИЯ…]" -#: builtin/notes.c:78 +#: builtin/notes.c:79 msgid "git notes remove []" msgstr "git notes remove [ОБЕКТ]" -#: builtin/notes.c:83 +#: builtin/notes.c:84 msgid "git notes prune []" msgstr "git notes prune [ОПЦИЯ…]" -#: builtin/notes.c:88 +#: builtin/notes.c:89 msgid "git notes get-ref" msgstr "git notes get-ref" -#: builtin/notes.c:146 +#: builtin/notes.c:147 #, c-format msgid "unable to start 'show' for object '%s'" msgstr "действието „show“ не може да се изпълни за обект „%s“" -#: builtin/notes.c:150 +#: builtin/notes.c:151 msgid "could not read 'show' output" msgstr "изведената информация от действието „show“ не може да се прочете" -#: builtin/notes.c:158 +#: builtin/notes.c:159 #, c-format msgid "failed to finish 'show' for object '%s'" msgstr "действието „show“ не може да се завърши за обект „%s“" -#: builtin/notes.c:173 builtin/tag.c:477 +#: builtin/notes.c:174 builtin/tag.c:248 #, c-format msgid "could not create file '%s'" msgstr "файлът „%s“ не може да бъде създаден" -#: builtin/notes.c:192 +#: builtin/notes.c:193 msgid "Please supply the note contents using either -m or -F option" msgstr "Задайте съдържанието на бележката с някоя от опциите „-m“ или „-F“" -#: builtin/notes.c:201 +#: builtin/notes.c:202 msgid "unable to write note object" msgstr "обектът-бележка не може да бъде записан" -#: builtin/notes.c:203 +#: builtin/notes.c:204 #, c-format msgid "The note contents have been left in %s" msgstr "Съдържанието на бележката е във файла „%s“" -#: builtin/notes.c:231 builtin/tag.c:693 +#: builtin/notes.c:232 builtin/tag.c:440 #, c-format msgid "cannot read '%s'" msgstr "файлът „%s“ не може да бъде прочетен" -#: builtin/notes.c:233 builtin/tag.c:696 +#: builtin/notes.c:234 builtin/tag.c:443 #, c-format msgid "could not open or read '%s'" msgstr "файлът „%s“ не може да бъде отворен или прочетен" -#: builtin/notes.c:252 builtin/notes.c:303 builtin/notes.c:305 -#: builtin/notes.c:365 builtin/notes.c:420 builtin/notes.c:506 -#: builtin/notes.c:511 builtin/notes.c:589 builtin/notes.c:652 -#: builtin/notes.c:854 builtin/tag.c:709 +#: builtin/notes.c:253 builtin/notes.c:304 builtin/notes.c:306 +#: builtin/notes.c:366 builtin/notes.c:421 builtin/notes.c:507 +#: builtin/notes.c:512 builtin/notes.c:590 builtin/notes.c:653 +#: builtin/notes.c:877 builtin/tag.c:456 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Не може да се открие към какво сочи „%s“." -#: builtin/notes.c:255 +#: builtin/notes.c:256 #, c-format msgid "Failed to read object '%s'." msgstr "Обектът „%s“ не може да бъде прочетен." -#: builtin/notes.c:259 +#: builtin/notes.c:260 #, c-format msgid "Cannot read note data from non-blob object '%s'." msgstr "" "Съдържанието на бележка не може да се вземе от обект, който не е BLOB: „%s“." -#: builtin/notes.c:299 -#, c-format -msgid "Malformed input line: '%s'." -msgstr "Даденият входен ред е с неправилен формат: „%s“." - -#: builtin/notes.c:314 -#, c-format -msgid "Failed to copy notes from '%s' to '%s'" -msgstr "Бележката не може да се копира от „%s“ към „%s“" - -#: builtin/notes.c:358 builtin/notes.c:413 builtin/notes.c:489 -#: builtin/notes.c:501 builtin/notes.c:577 builtin/notes.c:645 -#: builtin/notes.c:919 +#: builtin/notes.c:359 builtin/notes.c:414 builtin/notes.c:490 +#: builtin/notes.c:502 builtin/notes.c:578 builtin/notes.c:646 +#: builtin/notes.c:942 msgid "too many parameters" msgstr "прекалено много параметри" -#: builtin/notes.c:371 builtin/notes.c:658 +#: builtin/notes.c:372 builtin/notes.c:659 #, c-format msgid "No note found for object %s." msgstr "Няма бележки за обекта „%s“." -#: builtin/notes.c:392 builtin/notes.c:555 +#: builtin/notes.c:393 builtin/notes.c:556 msgid "note contents as a string" msgstr "низ, който е съдържанието на бележката" -#: builtin/notes.c:395 builtin/notes.c:558 +#: builtin/notes.c:396 builtin/notes.c:559 msgid "note contents in a file" msgstr "файл със съдържанието на бележката" -#: builtin/notes.c:397 builtin/notes.c:400 builtin/notes.c:560 -#: builtin/notes.c:563 builtin/tag.c:628 -msgid "object" -msgstr "обект" - -#: builtin/notes.c:398 builtin/notes.c:561 +#: builtin/notes.c:399 builtin/notes.c:562 msgid "reuse and edit specified note object" msgstr "преизползване и редактиране на указания обект-бележка" -#: builtin/notes.c:401 builtin/notes.c:564 +#: builtin/notes.c:402 builtin/notes.c:565 msgid "reuse specified note object" msgstr "преизползване на указания обект-бележка" -#: builtin/notes.c:404 builtin/notes.c:567 +#: builtin/notes.c:405 builtin/notes.c:568 msgid "allow storing empty note" msgstr "приемане и на празни бележки" -#: builtin/notes.c:405 builtin/notes.c:476 +#: builtin/notes.c:406 builtin/notes.c:477 msgid "replace existing notes" msgstr "замяна на съществуващите бележки" -#: builtin/notes.c:430 +#: builtin/notes.c:431 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -8142,32 +8630,32 @@ msgstr "" "Не може да се добави бележка, защото такава вече съществува за обекта „%s“. " "Използвайте опцията „-f“, за да презапишете съществуващи бележки." -#: builtin/notes.c:445 builtin/notes.c:524 +#: builtin/notes.c:446 builtin/notes.c:525 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "Презаписване на съществуващите бележки за обекта „%s“\n" -#: builtin/notes.c:456 builtin/notes.c:617 builtin/notes.c:859 +#: builtin/notes.c:457 builtin/notes.c:618 builtin/notes.c:882 #, c-format msgid "Removing note for object %s\n" msgstr "Изтриване на бележката за обекта „%s“\n" -#: builtin/notes.c:477 +#: builtin/notes.c:478 msgid "read objects from stdin" msgstr "изчитане на обектите от стандартния вход" # FIXME imporve message -#: builtin/notes.c:479 +#: builtin/notes.c:480 msgid "load rewriting config for (implies --stdin)" msgstr "" "зареждане на настройките за КОМАНДАта, която презаписва подавания (включва " "опцията „--stdin“)" -#: builtin/notes.c:497 +#: builtin/notes.c:498 msgid "too few parameters" msgstr "прекалено малко параметри" -#: builtin/notes.c:518 +#: builtin/notes.c:519 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -8176,14 +8664,14 @@ msgstr "" "Не може да се копира бележка, защото такава вече съществува за обекта „%s“. " "Използвайте опцията „-f“, за да презапишете съществуващи бележки." -#: builtin/notes.c:530 +#: builtin/notes.c:531 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "" "Не може да се копира бележка, която не съществува — няма бележки за обекта-" "източник „%s“." -#: builtin/notes.c:582 +#: builtin/notes.c:583 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" @@ -8191,18 +8679,18 @@ msgid "" msgstr "" "Задаването на опциите „-m“/„-F“/„-c“/„-C“ с командата „edit“ вече е " "остаряло.\n" -"Вместо това ги използвайте с командата „add“: „git notes add -f -m/-F/-c/-" +"Вместо това ги използвайте с подкомандата „add“: „git notes add -f -m/-F/-c/-" "C“.\n" -#: builtin/notes.c:750 +#: builtin/notes.c:764 msgid "General options" msgstr "Общи опции" -#: builtin/notes.c:752 +#: builtin/notes.c:766 msgid "Merge options" msgstr "Опции при сливане" -#: builtin/notes.c:754 +#: builtin/notes.c:768 msgid "" "resolve notes conflicts using the given strategy (manual/ours/theirs/union/" "cat_sort_uniq)" @@ -8212,58 +8700,65 @@ msgstr "" "„union“ (обединяване), „cat_sort_uniq“ (обединяване, подреждане, уникални " "резултати)" -#: builtin/notes.c:756 +#: builtin/notes.c:770 msgid "Committing unmerged notes" msgstr "Подаване на неслети бележки" -#: builtin/notes.c:758 +#: builtin/notes.c:772 msgid "finalize notes merge by committing unmerged notes" msgstr "завършване на сливането чрез подаване на неслети бележки" -#: builtin/notes.c:760 +#: builtin/notes.c:774 msgid "Aborting notes merge resolution" msgstr "Преустановяване на корекцията при сливането на бележки" -#: builtin/notes.c:762 +#: builtin/notes.c:776 msgid "abort notes merge" msgstr "преустановяване на сливането на бележки" -#: builtin/notes.c:857 +#: builtin/notes.c:853 +#, c-format +msgid "A notes merge into %s is already in-progress at %s" +msgstr "В момента се извършва сливане на бележките в „%s“ при „%s“" + +#: builtin/notes.c:880 #, c-format msgid "Object %s has no note\n" msgstr "Няма бележки за обекта „%s“\n" -#: builtin/notes.c:869 +#: builtin/notes.c:892 msgid "attempt to remove non-existent note is not an error" msgstr "опитът за изтриването на несъществуваща бележка не се счита за грешка" -#: builtin/notes.c:872 +#: builtin/notes.c:895 msgid "read object names from the standard input" msgstr "изчитане на имената на обектите от стандартния вход" -#: builtin/notes.c:953 +#: builtin/notes.c:976 msgid "notes-ref" msgstr "УКАЗАТЕЛ_ЗА_БЕЛЕЖКА" -#: builtin/notes.c:954 +#: builtin/notes.c:977 msgid "use notes from " msgstr "да се използва бележката сочена от този УКАЗАТЕЛ_ЗА_БЕЛЕЖКА" -#: builtin/notes.c:989 builtin/remote.c:1618 +#: builtin/notes.c:1012 builtin/remote.c:1647 #, c-format msgid "Unknown subcommand: %s" msgstr "Непозната подкоманда: %s" #: builtin/pack-objects.c:28 -msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]" +msgid "" +"git pack-objects --stdout [...] [< | < ]" msgstr "" -"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_ВЕРСИИ | < СПИСЪК_С_ОБЕКТИ]" +"git pack-objects --stdout [ОПЦИЯ…] [< СПИСЪК_С_УКАЗАТЕЛИ | < СПИСЪК_С_ОБЕКТИ]" # FIXME [options] vs [options...] #: builtin/pack-objects.c:29 -msgid "git pack-objects [options...] base-name [< ref-list | < object-list]" +msgid "" +"git pack-objects [...] [< | < ]" msgstr "" -"git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_ВЕРСИИ | < " +"git pack-objects [ОПЦИЯ…] ПРЕФИКС_НА_ИМЕТО [< СПИСЪК_С_УКАЗАТЕЛИ | < " "СПИСЪК_С_ОБЕКТИ]" #: builtin/pack-objects.c:175 builtin/pack-objects.c:178 @@ -8295,167 +8790,157 @@ msgstr "неподдържана версия на индекса „%s“" msgid "bad index version '%s'" msgstr "неправилна версия на индекса „%s“" -#: builtin/pack-objects.c:2595 -#, c-format -msgid "option %s does not accept negative form" -msgstr "опцията „%s“ не притежава отрицателна версия" - -#: builtin/pack-objects.c:2599 -#, c-format -msgid "unable to parse value '%s' for option %s" -msgstr "неразпозната стойност „%s“ за опцията „%s“" - -#: builtin/pack-objects.c:2619 +#: builtin/pack-objects.c:2602 msgid "do not show progress meter" msgstr "без извеждане на напредъка" -#: builtin/pack-objects.c:2621 +#: builtin/pack-objects.c:2604 msgid "show progress meter" msgstr "извеждане на напредъка" -#: builtin/pack-objects.c:2623 +#: builtin/pack-objects.c:2606 msgid "show progress meter during object writing phase" msgstr "извеждане на напредъка във фазата на запазване на обектите" -#: builtin/pack-objects.c:2626 +#: builtin/pack-objects.c:2609 msgid "similar to --all-progress when progress meter is shown" msgstr "" "същото действие като опцията „--all-progress“ при извеждането на напредъка" -#: builtin/pack-objects.c:2627 +#: builtin/pack-objects.c:2610 msgid "version[,offset]" msgstr "ВЕРСИЯ[,ОТМЕСТВАНЕ]" -#: builtin/pack-objects.c:2628 +#: builtin/pack-objects.c:2611 msgid "write the pack index file in the specified idx format version" msgstr "" "запазване на индекса на пакетните файлове във форма̀та с указаната версия" -#: builtin/pack-objects.c:2631 +#: builtin/pack-objects.c:2614 msgid "maximum size of each output pack file" msgstr "максимален размер на всеки пакетен файл" -#: builtin/pack-objects.c:2633 +#: builtin/pack-objects.c:2616 msgid "ignore borrowed objects from alternate object store" msgstr "игнориране на обектите заети от други хранилища на обекти" -#: builtin/pack-objects.c:2635 +#: builtin/pack-objects.c:2618 msgid "ignore packed objects" msgstr "игнориране на пакетираните обекти" -#: builtin/pack-objects.c:2637 +#: builtin/pack-objects.c:2620 msgid "limit pack window by objects" msgstr "ограничаване на прозореца за пакетиране по брой обекти" -#: builtin/pack-objects.c:2639 +#: builtin/pack-objects.c:2622 msgid "limit pack window by memory in addition to object limit" msgstr "" "ограничаване на прозореца за пакетиране и по памет освен по брой обекти" -#: builtin/pack-objects.c:2641 +#: builtin/pack-objects.c:2624 msgid "maximum length of delta chain allowed in the resulting pack" msgstr "" "максимална дължина на веригата от разлики, която е позволена в пакетния файл" -#: builtin/pack-objects.c:2643 +#: builtin/pack-objects.c:2626 msgid "reuse existing deltas" msgstr "преизползване на съществуващите разлики" -#: builtin/pack-objects.c:2645 +#: builtin/pack-objects.c:2628 msgid "reuse existing objects" msgstr "преизползване на съществуващите обекти" -#: builtin/pack-objects.c:2647 +#: builtin/pack-objects.c:2630 msgid "use OFS_DELTA objects" msgstr "използване на обекти „OFS_DELTA“" -#: builtin/pack-objects.c:2649 +#: builtin/pack-objects.c:2632 msgid "use threads when searching for best delta matches" msgstr "" "стартиране на нишки за претърсване на най-добрите съвпадения на разликите" -#: builtin/pack-objects.c:2651 +#: builtin/pack-objects.c:2634 msgid "do not create an empty pack output" msgstr "без създаване на празен пакетен файл" -#: builtin/pack-objects.c:2653 +#: builtin/pack-objects.c:2636 msgid "read revision arguments from standard input" msgstr "изчитане на версиите от стандартния вход" -#: builtin/pack-objects.c:2655 +#: builtin/pack-objects.c:2638 msgid "limit the objects to those that are not yet packed" msgstr "ограничаване до все още непакетираните обекти" -#: builtin/pack-objects.c:2658 +#: builtin/pack-objects.c:2641 msgid "include objects reachable from any reference" msgstr "" "включване на всички обекти, които могат да се достигнат от произволен " "указател" -#: builtin/pack-objects.c:2661 +#: builtin/pack-objects.c:2644 msgid "include objects referred by reflog entries" msgstr "включване и на обектите сочени от записите в журнала на указателите" -#: builtin/pack-objects.c:2664 +#: builtin/pack-objects.c:2647 msgid "include objects referred to by the index" msgstr "включване и на обектите сочени от индекса" -#: builtin/pack-objects.c:2667 +#: builtin/pack-objects.c:2650 msgid "output pack to stdout" msgstr "извеждане на пакета на стандартния изход" -#: builtin/pack-objects.c:2669 +#: builtin/pack-objects.c:2652 msgid "include tag objects that refer to objects to be packed" msgstr "" "включване и на обектите-етикети, които сочат към обектите, които ще бъдат " "пакетирани" -#: builtin/pack-objects.c:2671 +#: builtin/pack-objects.c:2654 msgid "keep unreachable objects" msgstr "запазване на недостижимите обекти" -#: builtin/pack-objects.c:2672 parse-options.h:139 +#: builtin/pack-objects.c:2655 parse-options.h:142 msgid "time" msgstr "ВРЕМЕ" -#: builtin/pack-objects.c:2673 +#: builtin/pack-objects.c:2656 msgid "unpack unreachable objects newer than