diff options
300 files changed, 12791 insertions, 5871 deletions
diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index 894546dd75..376d5ec4f8 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -328,9 +328,14 @@ For C programs: - When you come up with an API, document it. - - The first #include in C files, except in platform specific - compat/ implementations, should be git-compat-util.h or another - header file that includes it, such as cache.h or builtin.h. + - The first #include in C files, except in platform specific compat/ + implementations, must be either "git-compat-util.h", "cache.h" or + "builtin.h". You do not have to include more than one of these. + + - A C file must directly include the header files that declare the + functions and the types it uses, except for the functions and types + that are made available to it by including one of the header files + it must include by the previous rule. - If you are planning a new command, consider writing it in shell or perl first, so that changes in semantics can be easily @@ -413,6 +418,29 @@ Error Messages - Say what the error is first ("cannot open %s", not "%s: cannot open") +Externally Visible Names + + - For configuration variable names, follow the existing convention: + + . The section name indicates the affected subsystem. + + . The subsection name, if any, indicates which of an unbounded set + of things to set the value for. + + . The variable name describes the effect of tweaking this knob. + + The section and variable names that consist of multiple words are + formed by concatenating the words without punctuations (e.g. `-`), + and are broken using bumpyCaps in documentation as a hint to the + reader. + + When choosing the variable namespace, do not use variable name for + specifying possibly unbounded set of things, most notably anything + an end user can freely come up with (e.g. branch names). Instead, + use subsection names or variable values, like the existing variable + branch.<name>.description does. + + Writing Documentation: Most (if not all) of the documentation pages are written in the @@ -441,6 +469,10 @@ Writing Documentation: --sort=<key> --abbrev[=<n>] + If a placeholder has multiple words, they are separated by dashes: + <new-branch-name> + --template=<template-directory> + Possibility of multiple occurrences is indicated by three dots: <file>... (One or more of <file>.) @@ -457,12 +489,12 @@ Writing Documentation: (Zero or more of <patch>. Note that the dots are inside, not outside the brackets.) - Multiple alternatives are indicated with vertical bar: + Multiple alternatives are indicated with vertical bars: [-q | --quiet] [--utf8 | --no-utf8] Parentheses are used for grouping: - [(<rev>|<range>)...] + [(<rev> | <range>)...] (Any number of either <rev> or <range>. Parens are needed to make it clear that "..." pertains to both <rev> and <range>.) @@ -494,7 +526,7 @@ Writing Documentation: `backticks around word phrases`, do so. `--pretty=oneline` `git rev-list` - `remote.pushdefault` + `remote.pushDefault` Word phrases enclosed in `backtick characters` are rendered literally and will not be further expanded. The use of `backticks` to achieve the diff --git a/Documentation/RelNotes/2.3.1.txt b/Documentation/RelNotes/2.3.1.txt new file mode 100644 index 0000000000..cf96186288 --- /dev/null +++ b/Documentation/RelNotes/2.3.1.txt @@ -0,0 +1,52 @@ +Git v2.3.1 Release Notes +======================== + +Fixes since v2.3 +---------------- + + * The interactive "show a list and let the user choose from it" + interface "add -i" used showed and prompted to the user even when + the candidate list was empty, against which the only "choice" the + user could have made was to choose nothing. + + * "git apply --whitespace=fix" used to under-allocate the memory + when the fix resulted in a longer text than the original patch. + + * "git log --help" used to show rev-list options that are irrelevant + to the "log" command. + + * The error message from "git commit", when a non-existing author + name was given as value to the "--author=" parameter, has been + reworded to avoid misunderstanding. + + * A broken pack .idx file in the receiving repository prevented the + dumb http transport from fetching a good copy of it from the other + side. + + * The documentation incorrectly said that C(opy) and R(ename) are the + only ones that can be followed by the score number in the output in + the --raw format. + + * Fix a misspelled conditional that is always true. + + * Code to read branch name from various files in .git/ directory + would have misbehaved if the code to write them left an empty file. + + * The "git push" documentation made the "--repo=<there>" option + easily misunderstood. + + * After attempting and failing a password-less authentication + (e.g. kerberos), libcURL refuses to fall back to password based + Basic authentication without a bit of help/encouragement. + + * Setting diff.submodule to 'log' made "git format-patch" produce + broken patches. + + * "git rerere" (invoked internally from many mergy operations) did + not correctly signal errors when told to update the working tree + files and failed to do so for whatever reason. + + * "git blame HEAD -- missing" failed to correctly say "HEAD" when it + tried to say "No such path 'missing' in HEAD". + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/2.3.2.txt b/Documentation/RelNotes/2.3.2.txt new file mode 100644 index 0000000000..f4caf54927 --- /dev/null +++ b/Documentation/RelNotes/2.3.2.txt @@ -0,0 +1,79 @@ +Git v2.3.2 Release Notes +======================== + +Fixes since v2.3.1 +------------------ + + * "update-index --refresh" used to leak when an entry cannot be + refreshed for whatever reason. + + * "git fast-import" used to crash when it could not close and + conclude the resulting packfile cleanly. + + * "git blame" died, trying to free an uninitialized piece of memory. + + * "git merge-file" did not work correctly in a subdirectory. + + * "git submodule add" failed to squash "path/to/././submodule" to + "path/to/submodule". + + * In v2.2.0, we broke "git prune" that runs in a repository that + borrows from an alternate object store. + + * Certain older vintages of cURL give irregular output from + "curl-config --vernum", which confused our build system. + + * An earlier workaround to squelch unhelpful deprecation warnings + from the complier on Mac OSX unnecessarily set minimum required + version of the OS, which the user might want to raise (or lower) + for other reasons. + + * Longstanding configuration variable naming rules has been added to + the documentation. + + * The credential helper for Windows (in contrib/) used to mishandle + a user name with an at-sign in it. + + * Older GnuPG implementations may not correctly import the keyring + material we prepare for the tests to use. + + * Clarify in the documentation that "remote.<nick>.pushURL" and + "remote.<nick>.URL" are there to name the same repository accessed + via different transports, not two separate repositories. + + * The pack bitmap support did not build with older versions of GCC. + + * Reading configuration from a blob object, when it ends with a lone + CR, use to confuse the configuration parser. + + * We didn't format an integer that wouldn't fit in "int" but in + "uintmax_t" correctly. + + * "git push --signed" gave an incorrectly worded error message when + the other side did not support the capability. + + * "git fetch" over a remote-helper that cannot respond to "list" + command could not fetch from a symbolic reference e.g. HEAD. + + * The insn sheet "git rebase -i" creates did not fully honor + core.abbrev settings. + + * The tests that wanted to see that file becomes unreadable after + running "chmod a-r file", and the tests that wanted to make sure it + is not run as root, we used "can we write into the / directory?" as + a cheap substitute, but on some platforms that is not a good + heuristics. The tests and their prerequisites have been updated to + check what they really require. + + * The configuration variable 'mailinfo.scissors' was hard to + discover in the documentation. + + * Correct a breakage to git-svn around v2.2 era that triggers + premature closing of FileHandle. + + * Even though we officially haven't dropped Perl 5.8 support, the + Getopt::Long package that came with it does not support "--no-" + prefix to negate a boolean option; manually add support to help + people with older Getopt::Long package. + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/2.3.3.txt b/Documentation/RelNotes/2.3.3.txt new file mode 100644 index 0000000000..5ef12644c2 --- /dev/null +++ b/Documentation/RelNotes/2.3.3.txt @@ -0,0 +1,39 @@ +Git v2.3.3 Release Notes +======================== + +Fixes since v2.3.2 +------------------ + + * A corrupt input to "git diff -M" used cause us to segfault. + + * The borrowed code in kwset API did not follow our usual convention + to use "unsigned char" to store values that range from 0-255. + + * Description given by "grep -h" for its --exclude-standard option + was phrased poorly. + + * Documentaton for "git remote add" mentioned "--tags" and + "--no-tags" and it was not clear that fetch from the remote in + the future will use the default behaviour when neither is given + to override it. + + * "git diff --shortstat --dirstat=changes" showed a dirstat based on + lines that was never asked by the end user in addition to the + dirstat that the user asked for. + + * The interaction between "git submodule update" and the + submodule.*.update configuration was not clearly documented. + + * "git apply" was not very careful about reading from, removing, + updating and creating paths outside the working tree (under + --index/--cached) or the current directory (when used as a + replacement for GNU patch). + + * "git daemon" looked up the hostname even when "%CH" and "%IP" + interpolations are not requested, which was unnecessary. + + * The "interpolated-path" option of "git daemon" inserted any string + client declared on the "host=" capability request without checking. + Sanitize and limit %H and %CH to a saner and a valid DNS name. + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/2.3.4.txt b/Documentation/RelNotes/2.3.4.txt new file mode 100644 index 0000000000..094c7b853b --- /dev/null +++ b/Documentation/RelNotes/2.3.4.txt @@ -0,0 +1,32 @@ +Git v2.3.4 Release Notes +======================== + +Fixes since v2.3.3 +------------------ + + * The 'color.status.unmerged' configuration was not described. + + * "git log --decorate" did not reset colors correctly around the + branch names. + + * "git -C '' subcmd" refused to work in the current directory, unlike + "cd ''" which silently behaves as a no-op. + + * "git imap-send" learned to optionally talk with an IMAP server via + libcURL; because there is no other option when Git is built with + NO_OPENSSL option, use that codepath by default under such + configuration. + + * A workaround for certain build of GPG that triggered false breakage + in a test has been added. + + * "git rebase -i" recently started to include the number of + commits in the insn sheet to be processed, but on a platform + that prepends leading whitespaces to "wc -l" output, the numbers + are shown with extra whitespaces that aren't necessary. + + * We did not parse username followed by literal IPv6 address in SSH + transport URLs, e.g. ssh://user@[2001:db8::1]:22/repo.git + correctly. + +Also contains typofixes, documentation updates and trivial code clean-ups. diff --git a/Documentation/RelNotes/2.4.0.txt b/Documentation/RelNotes/2.4.0.txt new file mode 100644 index 0000000000..f052162eff --- /dev/null +++ b/Documentation/RelNotes/2.4.0.txt @@ -0,0 +1,414 @@ +Git 2.4 Release Notes +===================== + +Backward compatibility warning(s) +--------------------------------- + +This release has a few changes in the user-visible output from +Porcelain commands, which the users may want to be aware of. + + * Output from "git log --decorate" (and "%d" format specifier used in + the userformat "--format=<string>" parameter "git log" family of + command takes) used to list "HEAD" just like other tips of branch + names, separated with a comma in between. E.g. + + $ git log --decorate -1 master + commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD, master) + ... + + This release updates the output slightly when HEAD refers to the tip + of a branch whose name is also shown in the output. The above is + shown as: + + $ git log --decorate -1 master + commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD -> master) + ... + + * The phrasing "git branch" uses to describe a detached HEAD has been + updated to match that of "git status": + + - When the HEAD is at the same commit as it was originally + detached, they now both show "detached at <commit object name>". + + - When the HEAD has moved since it was originally detached, + they now both show "detached from <commit object name>". + + Earlier "git branch" always used "from" + + +Updates since v2.3 +------------------ + +Ports + + * Our default I/O size (8 MiB) for large files was too large for some + platforms with smaller SSIZE_MAX, leading to read(2)/write(2) + failures. + + * We did not check the curl library version before using + CURLOPT_PROXYAUTH feature that may not exist. + + * We now detect number of CPUs on older BSD-derived systems. + + * Portability fixes and workarounds for shell scripts have been added + to help BSD-derived systems. + + +UI, Workflows & Features + + * The command usage info strings given by "git cmd -h" and in + documentation have been tweaked for consistency. + + * The "sync" subcommand of "git p4" now allows users to exclude + subdirectories like its "clone" subcommand does. + + * "git log --invert-grep --grep=WIP" will show only commits that do + not have the string "WIP" in their messages. + + * "git push" has been taught a "--atomic" option that makes push to + update more than one ref an "all-or-none" affair. + + * Extending the "push to deploy" added in 2.3, the behaviour of "git + push" when updating the branch that is checked out can now be + tweaked by push-to-checkout hook. + + * Using environment variable LANGUAGE and friends on the client side, + HTTP-based transports now send Accept-Language when making requests. + + * "git send-email" used to accept a mistaken "y" (or "yes") as an + answer to "What encoding do you want to use [UTF-8]? " without + questioning. Now it asks for confirmation when the answer looks + too short to be a valid encoding name. + + * When "git apply --whitespace=fix" fixed whitespace errors in the + common context lines, the command reports that it did so. + + * "git status" now allows the "-v" to be given twice to show the + differences that are left in the working tree not to be committed. + + * "git cherry-pick" used to clean-up the log message even when it is + merely replaying an existing commit. It now replays the message + verbatim unless you are editing the message of resulting commits. + + * "git archive" can now be told to set the 'text' attribute in the + resulting zip archive. + + * Output from "git log --decorate" mentions HEAD when it points at a + tip of an branch differently from a detached HEAD. + + This is a potentially backward-incompatible change. + + * "git branch" on a detached HEAD always said "(detached from xyz)", + even when "git status" would report "detached at xyz". The HEAD is + actually at xyz and haven't been moved since it was detached in + such a case, but the user cannot read what the current value of + HEAD is when "detached from" is used. + + * "git -C '' subcmd" refused to work in the current directory, unlike + "cd ''" which silently behaves as a no-op. + (merge 6a536e2 kn/git-cd-to-empty later to maint). + + * The versionsort.prerelease configuration variable can be used to + specify that v1.0-pre1 comes before v1.0. + + * A new "push.followTags" configuration turns the "--follow-tags" + option on by default for the "git push" command. + + +Performance, Internal Implementation, Development Support etc. + + * Implementation of N_() macro has been updated slightly to help us + detect mistakes. + + * Implementation of "reflog expire" has been restructured to fit the + reflogs better with the recently updated ref API. + + * The transport-helper did not give transport options such as + verbosity, progress, cloning, etc. to import and export based + helpers, like it did for fetch and push based helpers, robbing them + the chance to honor the wish of the end-users better. + + * The tests that wanted to see that file becomes unreadable after + running "chmod a-r file", and the tests that wanted to make sure it + is not run as root, we used "can we write into the / directory?" as + a cheap substitute, but on some platforms that is not a good + heuristics. The tests and their prerequisites have been updated to + check what they really require. + (merge f400e51 jk/sanity later to maint). + + * Various issues around "reflog expire", e.g. using --updateref when + expiring a reflog for a symbolic reference, have been corrected + and/or made saner. + + * The strbuf API was explained between the API documentation and in + the header file. Move missing bits to strbuf.h so that programmers + can check only one place for all necessary information. + + * The error handling functions and conventions are now documented in + the API manual. + + * Optimize attribute look-up, mostly useful in "git grep" on a + project that does not use many attributes, by avoiding it when we + (should) know that the attributes are not defined in the first + place. + + * Typofix in comments. + (merge ef2956a ak/git-pm-typofix later to maint). + + * Code clean-up. + (merge 0b868f0 sb/hex-object-name-is-at-most-41-bytes-long later to maint). + (merge 5d30851 dp/remove-duplicated-header-inclusion later to maint). + + * Simplify the ref transaction API around how "the ref should be + pointing at this object" is specified. + + * Code in "git daemon" to parse out and hold hostnames used in + request interpolation has been simplified. + + * "git push" codepath has been restructured to make it easier to add + new configuration bits. + + +Also contains various documentation updates and code clean-ups. + + +Fixes since v2.3 +---------------- + +Unless otherwise noted, all the fixes since v2.3 in the maintenance +track are contained in this release (see the maintenance releases' +notes for details). + + * "git blame HEAD -- missing" failed to correctly say "HEAD" when it + tried to say "No such path 'missing' in HEAD". + (merge a46442f jk/blame-commit-label later to maint). + + * "git rerere" (invoked internally from many mergy operations) did + not correctly signal errors when told to update the working tree + files and failed to do so for whatever reason. + (merge 89ea903 jn/rerere-fail-on-auto-update-failure later to maint). + + * Setting diff.submodule to 'log' made "git format-patch" produce + broken patches. + (merge 339de50 dk/format-patch-ignore-diff-submodule later to maint). + + * After attempting and failing a password-less authentication + (e.g. kerberos), libcURL refuses to fall back to password based + Basic authentication without a bit of help/encouragement. + (merge 4dbe664 bc/http-fallback-to-password-after-krb-fails later to maint). + + * The "git push" documentation made the "--repo=<there>" option + easily misunderstood. + (merge 57b92a7 mg/push-repo-option-doc later to maint). + + * Code to read branch name from various files in .git/ directory + would have misbehaved if the code to write them left an empty file. + (merge 66ec904 jk/status-read-branch-name-fix later to maint). + + * A misspelled conditional that is always true has been fixed. + (merge 94ee8e2 jk/remote-curl-an-array-in-struct-cannot-be-null later to maint). + + * The documentation incorrectly said that C(opy) and R(ename) are the + only ones that can be followed by the score number in the output in + the --raw format. + (merge ac1c2d9 jc/diff-format-doc later to maint). + + * A broken pack .idx file in the receiving repository prevented the + dumb http transport from fetching a good copy of it from the other + side. + (merge 8b9c2dd jk/dumb-http-idx-fetch-fix later to maint). + + * The error message from "git commit", when a non-existing author + name was given as value to the "--author=" parameter, has been + reworded to avoid misunderstanding. + (merge 1044b1f mg/commit-author-no-match-malformed-message later to maint). + + * "git log --help" used to show rev-list options that are irrelevant + to the "log" command. + (merge 3cab02d jc/doc-log-rev-list-options later to maint). + + * "git apply --whitespace=fix" used to under-allocate the memory when + the fix resulted in a longer text than the original patch. + (merge 407a792 jc/apply-ws-fix-expands later to maint). + + * The interactive "show a list and let the user choose from it" + interface "add -i" used showed and prompted to the user even when + the candidate list was empty, against which the only "choice" the + user could have made was to choose nothing. + (merge a9c4641 ak/add-i-empty-candidates later to maint). + + * The insn sheet "git rebase -i" creates did not fully honor + core.abbrev settings. + (merge edb72d5 ks/rebase-i-abbrev later to maint). + + * "git fetch" over a remote-helper that cannot respond to "list" + command could not fetch from a symbolic reference e.g. HEAD. + (merge 33cae54 mh/deref-symref-over-helper-transport later to maint). + + * "git push --signed" gave an incorrectly worded error message when + the other side did not support the capability. + (merge 45917f0 jc/push-cert later to maint). + + * We didn't format an integer that wouldn't fit in "int" but in + "uintmax_t" correctly. + (merge d306f3d jk/decimal-width-for-uintmax later to maint). + + * Reading configuration from a blob object, when it ends with a lone + CR, use to confuse the configuration parser. + (merge 1d0655c jk/config-no-ungetc-eof later to maint). + + * The pack bitmap support did not build with older versions of GCC. + (merge bd4e882 jk/pack-bitmap later to maint). + + * The documentation wasn't clear that "remote.<nick>.pushURL" and + "remote.<nick>.URL" are there to name the same repository accessed + via different transports, not two separate repositories. + (merge 697f652 jc/remote-set-url-doc later to maint). + + * Older GnuPG implementations may not correctly import the keyring + material we prepare for the tests to use. + (merge 1f985d6 ch/new-gpg-drops-rfc-1991 later to maint). + + * The credential helper for Windows (in contrib/) used to mishandle + a user name with an at-sign in it. + (merge 13d261e av/wincred-with-at-in-username-fix later to maint). + + * Longstanding configuration variable naming rules has been added to + the documentation. + (merge 35840a3 jc/conf-var-doc later to maint). + + * An earlier workaround to squelch unhelpful deprecation warnings + from the complier on Mac OSX unnecessarily set minimum required + version of the OS, which the user might want to raise (or lower) + for other reasons. + (merge 88c03eb es/squelch-openssl-warnings-on-macosx later to maint). + + * Certain older vintages of cURL give irregular output from + "curl-config --vernum", which confused our build system. + (merge 3af6792 tc/curl-vernum-output-broken-in-7.11 later to maint). + + * In v2.2.0, we broke "git prune" that runs in a repository that + borrows from an alternate object store. + (merge b0a4264 jk/prune-mtime later to maint). + + * "git submodule add" failed to squash "path/to/././submodule" to + "path/to/submodule". + (merge 8196e72 ps/submodule-sanitize-path-upon-add later to maint). + + * "git merge-file" did not work correctly in a subdirectory. + (merge 204a8ff ab/merge-file-prefix later to maint). + + * "git blame" died, trying to free an uninitialized piece of memory. + (merge e600592 es/blame-commit-info-fix later to maint). + + * "git fast-import" used to crash when it could not close and + conclude the resulting packfile cleanly. + (merge 5e915f3 jk/fast-import-die-nicely-fix later to maint). + + * "update-index --refresh" used to leak when an entry cannot be + refreshed for whatever reason. + (merge bc1c2ca sb/plug-leak-in-make-cache-entry later to maint). + + * The "interpolated-path" option of "git daemon" inserted any string + client declared on the "host=" capability request without checking. + Sanitize and limit %H and %CH to a saner and a valid DNS name. + (merge b485373 jk/daemon-interpolate later to maint). + + * "git daemon" looked up the hostname even when "%CH" and "%IP" + interpolations are not requested, which was unnecessary. + (merge dc8edc8 rs/daemon-interpolate later to maint). + + * Even though we officially haven't dropped Perl 5.8 support, the + Getopt::Long package that came with it does not support "--no-" + prefix to negate a boolean option; manually add support to help + people with older Getopt::Long package. + (merge f471494 km/send-email-getopt-long-workarounds later to maint). + + * "git apply" was not very careful about reading from, removing, + updating and creating paths outside the working tree (under + --index/--cached) or the current directory (when used as a + replacement for GNU patch). + (merge e0d201b jc/apply-beyond-symlink later to maint). + + * A breakage to git-svn around v2.2 era that triggers premature + closing of FileHandle has been corrected. + (merge e426311 ew/svn-maint-fixes later to maint). + + * We did not parse username followed by literal IPv6 address in SSH + transport URLs, e.g. ssh://user@[2001:db8::1]:22/repo.git + correctly. + (merge 3f55cca tb/connect-ipv6-parse-fix later to maint). + + * The configuration variable 'mailinfo.scissors' was hard to + discover in the documentation. + (merge afb5de7 mm/am-c-doc later to maint). + + * The interaction between "git submodule update" and the + submodule.*.update configuration was not clearly documented. + (merge 5c31acf ms/submodule-update-config-doc later to maint). + + * "git diff --shortstat --dirstat=changes" showed a dirstat based on + lines that was never asked by the end user in addition to the + dirstat that the user asked for. + (merge ab27389 mk/diff-shortstat-dirstat-fix later to maint). + + * "git remote add" mentioned "--tags" and "--no-tags" and was not + clear that fetch from the remote in the future will use the default + behaviour when neither is given to override it. + (merge aaba0ab mg/doc-remote-tags-or-not later to maint). + + * Description given by "grep -h" for its --exclude-standard option + was phrased poorly. + (merge 77fdb8a nd/grep-exclude-standard-help-fix later to maint). + + * "git rebase -i" recently started to include the number of + commits in the insn sheet to be processed, but on a platform + that prepends leading whitespaces to "wc -l" output, the numbers + are shown with extra whitespaces that aren't necessary. + (merge 2185d3b es/rebase-i-count-todo later to maint). + + * The borrowed code in kwset API did not follow our usual convention + to use "unsigned char" to store values that range from 0-255. + (merge 189c860 bw/kwset-use-unsigned later to maint). + + * A corrupt input to "git diff -M" used to cause it to segfault. + (merge 4d6be03 jk/diffcore-rename-duplicate later to maint). + + * Certain builds of GPG triggered false breakages in a test. + (merge 3f88c1b mg/verify-commit later to maint). + + * "git imap-send" learned to optionally talk with an IMAP server via + libcURL; because there is no other option when Git is built with + NO_OPENSSL option, use that codepath by default under such + configuration. + (merge dcd01ea km/imap-send-libcurl-options later to maint). + + * "git log --decorate" did not reset colors correctly around the + branch names. + (merge 5ee8758 jc/decorate-leaky-separator-color later to maint). + + * The code that reads from the ctags file in the completion script + (in contrib/) did not spell ${param/pattern/string} substitution + correctly, which happened to work with bash but not with zsh. + (merge db8d750 js/completion-ctags-pattern-substitution-fix later to maint). + + * The transfer.hiderefs support did not quite work for smart-http + transport. + (merge 8ddf3ca jk/smart-http-hide-refs later to maint). + + * "git tag -h" used to show the "--column" and "--sort" options + that are about listing in a wrong section. + (merge dd059c6 jk/tag-h-column-is-a-listing-option later to maint). + + * Code cleanups and documentation updates. + (merge 2ce63e9 rs/simple-cleanups later to maint). + (merge 33baa69 rj/no-xopen-source-for-cygwin later to maint). + (merge 817d03e jc/diff-test-updates later to maint). + (merge eb32c66 ak/t5516-typofix later to maint). + (merge bcd57cb mr/doc-clean-f-f later to maint). + (merge 0d6accc mg/doc-status-color-slot later to maint). + (merge 53e53c7 sg/completion-remote later to maint). + (merge 8fa7975 ak/git-done-help-cleanup later to maint). + (merge 9a6f128 rs/deflate-init-cleanup later to maint). + (merge 6f75d45 rs/use-isxdigit later to maint). + (merge 376e4b3 jk/test-annoyances later to maint). diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index ef0eeb40cd..98fc4cc1d0 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -136,6 +136,11 @@ that is fine, but please mark it as such. (4) Sending your patches. +Learn to use format-patch and send-email if possible. These commands +are optimized for the workflow of sending patches, avoiding many ways +your existing e-mail client that is optimized for "multipart/*" mime +type e-mails to corrupt and render your patches unusable. + People on the Git mailing list need to be able to read and comment on the changes you are submitting. It is important for a developer to be able to "quote" your changes, using standard diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index 0cebc4f692..b299b59023 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -4,7 +4,7 @@ --root:: Do not treat root commits as boundaries. This can also be - controlled via the `blame.showroot` config option. + controlled via the `blame.showRoot` config option. --show-stats:: Include additional statistics at the end of blame output. diff --git a/Documentation/config.txt b/Documentation/config.txt index 04e2a71687..2e5ceaf719 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -14,7 +14,8 @@ the fully qualified variable name of the variable itself is the last dot-separated segment and the section name is everything before the last dot. The variable names are case-insensitive, allow only alphanumeric characters and `-`, and must start with an alphabetic character. Some -variables may appear multiple times. +variables may appear multiple times; we say then that the variable is +multivalued. Syntax ~~~~~~ @@ -25,7 +26,7 @@ blank lines are ignored. The file consists of sections and variables. A section begins with the name of the section in square brackets and continues until the next -section begins. Section names are not case sensitive. Only alphanumeric +section begins. Section names are case-insensitive. Only alphanumeric characters, `-` and `.` are allowed in section names. Each variable must belong to some section, which means that there must be a section header before the first setting of a variable. @@ -40,8 +41,8 @@ in the section header, like in the example below: -------- Subsection names are case sensitive and can contain any characters except -newline (doublequote `"` and backslash have to be escaped as `\"` and `\\`, -respectively). Section headers cannot span multiple +newline (doublequote `"` and backslash can be included by escaping them +as `\"` and `\\`, respectively). Section headers cannot span multiple lines. Variables may belong directly to a section or to a given subsection. You can have `[section]` if you have `[section "subsection"]`, but you don't need to. @@ -53,38 +54,27 @@ restrictions as section names. All the other lines (and the remainder of the line after the section header) are recognized as setting variables, in the form -'name = value'. If there is no equal sign on the line, the entire line -is taken as 'name' and the variable is recognized as boolean "true". +'name = value' (or just 'name', which is a short-hand to say that +the variable is the boolean "true"). The variable names are case-insensitive, allow only alphanumeric characters -and `-`, and must start with an alphabetic character. There can be more -than one value for a given variable; we say then that the variable is -multivalued. - -Leading and trailing whitespace in a variable value is discarded. -Internal whitespace within a variable value is retained verbatim. +and `-`, and must start with an alphabetic character. -The values following the equals sign in variable assign are all either -a string, an integer, or a boolean. Boolean values may be given as yes/no, -1/0, true/false or on/off. Case is not significant in boolean values, when -converting value to the canonical form using '--bool' type specifier; -'git config' will ensure that the output is "true" or "false". +A line that defines a value can be continued to the next line by +ending it with a `\`; the backquote and the end-of-line are +stripped. Leading whitespaces after 'name =', the remainder of the +line after the first comment character '#' or ';', and trailing +whitespaces of the line are discarded unless they are enclosed in +double quotes. Internal whitespaces within the value are retained +verbatim. -String values may be entirely or partially enclosed in double quotes. -You need to enclose variable values in double quotes if you want to -preserve leading or trailing whitespace, or if the variable value contains -comment characters (i.e. it contains '#' or ';'). -Double quote `"` and backslash `\` characters in variable values must -be escaped: use `\"` for `"` and `\\` for `\`. +Inside double quotes, double quote `"` and backslash `\` characters +must be escaped: use `\"` for `"` and `\\` for `\`. The following escape sequences (beside `\"` and `\\`) are recognized: `\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB) and `\b` for backspace (BS). Other char escape sequences (including octal escape sequences) are invalid. -Variable values ending in a `\` are continued on the next line in the -customary UNIX fashion. - -Some variables may require a special value format. Includes ~~~~~~~~ @@ -126,6 +116,60 @@ Example path = foo ; expand "foo" relative to the current file path = ~/foo ; expand "foo" in your $HOME directory + +Values +~~~~~~ + +Values of many variables are treated as a simple string, but there +are variables that take values of specific types and there are rules +as to how to spell them. + +boolean:: + + When a variable is said to take a boolean value, many + synonyms are accepted for 'true' and 'false'; these are all + case-insensitive. + + true;; Boolean true can be spelled as `yes`, `on`, `true`, + or `1`. Also, a variable defined without `= <value>` + is taken as true. + + false;; Boolean false can be spelled as `no`, `off`, + `false`, or `0`. ++ +When converting value to the canonical form using '--bool' type +specifier; 'git config' will ensure that the output is "true" or +"false" (spelled in lowercase). + +integer:: + The value for many variables that specify various sizes can + be suffixed with `k`, `M`,... to mean "scale the number by + 1024", "by 1024x1024", etc. + +color:: + The value for a variables that takes a color is a list of + colors (at most two) and attributes (at most one), separated + by spaces. The colors accepted are `normal`, `black`, + `red`, `green`, `yellow`, `blue`, `magenta`, `cyan` and + `white`; the attributes are `bold`, `dim`, `ul`, `blink` and + `reverse`. The first color given is the foreground; the + second is the background. The position of the attribute, if + any, doesn't matter. Attributes may be turned off specifically + by prefixing them with `no` (e.g., `noreverse`, `noul`, etc). ++ +Colors (foreground and background) may also be given as numbers between +0 and 255; these use ANSI 256-color mode (but note that not all +terminals may support this). If your terminal supports it, you may also +specify 24-bit RGB values as hex, like `#ff0ab3`. ++ +The attributes are meant to be reset at the beginning of each item +in the colored output, so setting color.decorate.branch to `black` +will paint that branch name in a plain `black`, even if the previous +thing on the same output line (e.g. opening parenthesis before the +list of branch names in `log --decorate` output) is set to be +painted with `bold` or some other attribute. + + Variables ~~~~~~~~~ @@ -225,7 +269,7 @@ See linkgit:git-update-index[1]. + The default is true (when core.filemode is not specified in the config file). -core.ignorecase:: +core.ignoreCase:: If true, this option enables various workarounds to enable Git to work better on filesystems that are not case sensitive, like FAT. For example, if a directory listing finds @@ -234,12 +278,12 @@ core.ignorecase:: "Makefile". + The default is false, except linkgit:git-clone[1] or linkgit:git-init[1] -will probe and set core.ignorecase true if appropriate when the repository +will probe and set core.ignoreCase true if appropriate when the repository is created. -core.precomposeunicode:: +core.precomposeUnicode:: This option is only used by Mac OS implementation of Git. - When core.precomposeunicode=true, Git reverts the unicode decomposition + When core.precomposeUnicode=true, Git reverts the unicode decomposition of filenames done by Mac OS. This is useful when sharing a repository between Mac OS and Linux or Windows. (Git for Windows 1.7.10 or higher is needed, or Git under cygwin 1.7). @@ -264,13 +308,13 @@ core.trustctime:: crawlers and some backup systems). See linkgit:git-update-index[1]. True by default. -core.checkstat:: +core.checkStat:: Determines which stat fields to match between the index and work tree. The user can set this to 'default' or 'minimal'. Default (or explicitly 'default'), is to check all fields, including the sub-second part of mtime and ctime. -core.quotepath:: +core.quotePath:: The commands that output paths (e.g. 'ls-files', 'diff'), when not given the `-z` option, will quote "unusual" characters in the pathname by enclosing the @@ -474,9 +518,9 @@ core.compression:: -1 is the zlib default. 0 means no compression, and 1..9 are various speed/size tradeoffs, 9 being slowest. If set, this provides a default to other compression variables, - such as 'core.loosecompression' and 'pack.compression'. + such as 'core.looseCompression' and 'pack.compression'. -core.loosecompression:: +core.looseCompression:: An integer -1..9, indicating the compression level for objects that are not in a pack file. -1 is the zlib default. 0 means no compression, and 1..9 are various speed/size tradeoffs, 9 being @@ -537,7 +581,7 @@ be delta compressed, but larger binary media files won't be. + Common unit suffixes of 'k', 'm', or 'g' are supported. -core.excludesfile:: +core.excludesFile:: In addition to '.gitignore' (per-directory) and '.git/info/exclude', Git looks into this file for patterns of files which are not meant to be tracked. "`~/`" is expanded @@ -546,7 +590,7 @@ core.excludesfile:: If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead. See linkgit:gitignore[5]. -core.askpass:: +core.askPass:: Some commands (e.g. svn and http interfaces) that interactively ask for a password can be told to use an external program given via the value of this variable. Can be overridden by the 'GIT_ASKPASS' @@ -555,11 +599,11 @@ core.askpass:: prompt. The external program shall be given a suitable prompt as command-line argument and write the password on its STDOUT. -core.attributesfile:: +core.attributesFile:: In addition to '.gitattributes' (per-directory) and '.git/info/attributes', Git looks into this file for attributes (see linkgit:gitattributes[5]). Path expansions are made the same - way as for `core.excludesfile`. Its default value is + way as for `core.excludesFile`. Its default value is $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/attributes is used instead. @@ -569,7 +613,7 @@ core.editor:: variable when it is set, and the environment variable `GIT_EDITOR` is not set. See linkgit:git-var[1]. -core.commentchar:: +core.commentChar:: Commands such as `commit` and `tag` that lets you edit messages consider a line that begins with this character commented, and removes them after the editor returns @@ -638,7 +682,7 @@ core.whitespace:: is relevant for `indent-with-non-tab` and when Git fixes `tab-in-indent` errors. The default tab width is 8. Allowed values are 1 to 63. -core.fsyncobjectfiles:: +core.fsyncObjectFiles:: This boolean will enable 'fsync()' when writing object files. + This is a total waste of time and effort on a filesystem that orders @@ -646,7 +690,7 @@ data writes properly, but can be useful for filesystems that do not use journalling (traditional UNIX filesystems) or that only journal metadata and not file contents (OS X's HFS+, or Linux ext3 with "data=writeback"). -core.preloadindex:: +core.preloadIndex:: Enable parallel index preload for operations like 'git diff' + This can speed up operations like 'git diff' and 'git status' especially @@ -683,14 +727,13 @@ core.abbrev:: for abbreviated object names to stay unique for sufficiently long time. -add.ignore-errors:: add.ignoreErrors:: +add.ignore-errors (deprecated):: Tells 'git add' to continue adding files when some files cannot be added due to indexing errors. Equivalent to the '--ignore-errors' - option of linkgit:git-add[1]. Older versions of Git accept only - `add.ignore-errors`, which does not follow the usual naming - convention for configuration variables. Newer versions of Git - honor `add.ignoreErrors` as well. + option of linkgit:git-add[1]. `add.ignore-errors` is deprecated, + as it does not follow the usual naming convention for configuration + variables. alias.*:: Command aliases for the linkgit:git[1] command wrapper - e.g. @@ -718,7 +761,7 @@ am.keepcr:: by giving '--no-keep-cr' from the command line. See linkgit:git-am[1], linkgit:git-mailsplit[1]. -apply.ignorewhitespace:: +apply.ignoreWhitespace:: When set to 'change', tells 'git apply' to ignore changes in whitespace, in the same way as the '--ignore-space-change' option. @@ -730,7 +773,7 @@ apply.whitespace:: Tells 'git apply' how to handle whitespaces, in the same way as the '--whitespace' option. See linkgit:git-apply[1]. -branch.autosetupmerge:: +branch.autoSetupMerge:: Tells 'git branch' and 'git checkout' to set up new branches so that linkgit:git-pull[1] will appropriately merge from the starting point branch. Note that even if this option is not set, @@ -742,7 +785,7 @@ branch.autosetupmerge:: local branch or remote-tracking branch. This option defaults to true. -branch.autosetuprebase:: +branch.autoSetupRebase:: When a new branch is created with 'git branch' or 'git checkout' that tracks another branch, this variable tells Git to set up pull to rebase instead of merge (see "branch.<name>.rebase"). @@ -753,27 +796,27 @@ branch.autosetuprebase:: remote-tracking branches. When `always`, rebase will be set to true for all tracking branches. - See "branch.autosetupmerge" for details on how to set up a + See "branch.autoSetupMerge" for details on how to set up a branch to track another branch. This option defaults to never. branch.<name>.remote:: When on branch <name>, it tells 'git fetch' and 'git push' which remote to fetch from/push to. The remote to push to - may be overridden with `remote.pushdefault` (for all branches). + may be overridden with `remote.pushDefault` (for all branches). The remote to push to, for the current branch, may be further - overridden by `branch.<name>.pushremote`. If no remote is + overridden by `branch.<name>.pushRemote`. If no remote is configured, or if you are not on any branch, it defaults to - `origin` for fetching and `remote.pushdefault` for pushing. + `origin` for fetching and `remote.pushDefault` for pushing. Additionally, `.` (a period) is the current local repository (a dot-repository), see `branch.<name>.merge`'s final note below. -branch.<name>.pushremote:: +branch.<name>.pushRemote:: When on branch <name>, it overrides `branch.<name>.remote` for - pushing. It also overrides `remote.pushdefault` for pushing + pushing. It also overrides `remote.pushDefault` for pushing from branch <name>. When you pull from one place (e.g. your upstream) and push to another place (e.g. your own publishing - repository), you would want to set `remote.pushdefault` to + repository), you would want to set `remote.pushDefault` to specify the remote to push to for all branches, and use this option to override it for a specific branch. @@ -795,7 +838,7 @@ branch.<name>.merge:: branch.<name>.merge to the desired branch, and use the relative path setting `.` (a period) for branch.<name>.remote. -branch.<name>.mergeoptions:: +branch.<name>.mergeOptions:: Sets default options for merging into branch <name>. The syntax and supported options are the same as those of linkgit:git-merge[1], but option values containing whitespace characters are currently not @@ -847,20 +890,6 @@ color.branch.<slot>:: `remote` (a remote-tracking branch in refs/remotes/), `upstream` (upstream tracking branch), `plain` (other refs). -+ -The value for these configuration variables is a list of colors (at most -two) and attributes (at most one), separated by spaces. The colors -accepted are `normal`, `black`, `red`, `green`, `yellow`, `blue`, -`magenta`, `cyan` and `white`; the attributes are `bold`, `dim`, `ul`, -`blink` and `reverse`. The first color given is the foreground; the -second is the background. The position of the attribute, if any, -doesn't matter. Attributes may be turned off specifically by prefixing -them with `no` (e.g., `noreverse`, `noul`, etc). -+ -Colors (foreground and background) may also be given as numbers between -0 and 255; these use ANSI 256-color mode (but note that not all -terminals may support this). If your terminal supports it, you may also -specify 24-bit RGB values as hex, like `#ff0ab3`. color.diff:: Whether to use ANSI escape sequences to add color to patches. @@ -880,8 +909,7 @@ color.diff.<slot>:: of `plain` (context text), `meta` (metainformation), `frag` (hunk header), 'func' (function in hunk header), `old` (removed lines), `new` (added lines), `commit` (commit headers), or `whitespace` - (highlighting whitespace errors). The values of these variables may be - specified as in color.branch.<slot>. + (highlighting whitespace errors). color.decorate.<slot>:: Use customized color for 'git log --decorate' output. `<slot>` is one @@ -918,8 +946,6 @@ color.grep.<slot>:: separators between fields on a line (`:`, `-`, and `=`) and between hunks (`--`) -- -+ -The values of these variables may be specified as in color.branch.<slot>. color.interactive:: When set to `always`, always use colors for interactive prompts @@ -932,14 +958,13 @@ color.interactive.<slot>:: Use customized color for 'git add --interactive' and 'git clean --interactive' output. `<slot>` may be `prompt`, `header`, `help` or `error`, for four distinct types of normal output from - interactive commands. The values of these variables may be - specified as in color.branch.<slot>. + interactive commands. color.pager:: A boolean to enable/disable colored output when the pager is in use (default is true). -color.showbranch:: +color.showBranch:: A boolean to enable/disable color in the output of linkgit:git-show-branch[1]. May be set to `always`, `false` (or `never`) or `auto` (or `true`), in which case colors are used @@ -957,10 +982,10 @@ color.status.<slot>:: `added` or `updated` (files which are added but not committed), `changed` (files which are changed but not added in the index), `untracked` (files which are not tracked by Git), - `branch` (the current branch), or + `branch` (the current branch), `nobranch` (the color the 'no branch' warning is shown in, defaulting - to red). The values of these variables may be specified as in - color.branch.<slot>. + to red), or + `unmerged` (files which have unmerged changes). color.ui:: This variable determines the default value for variables such @@ -1039,7 +1064,7 @@ commit.cleanup:: have to remove the help lines that begin with `#` in the commit log template yourself, if you do this). -commit.gpgsign:: +commit.gpgSign:: A boolean to specify whether all commits should be GPG signed. Use of this option when doing operations such as rebase can @@ -1152,7 +1177,7 @@ format.cc:: by mail. See the --to and --cc options in linkgit:git-format-patch[1]. -format.subjectprefix:: +format.subjectPrefix:: The default for format-patch is to output files with the '[PATCH]' subject prefix. Use this variable to change that prefix. @@ -1162,7 +1187,7 @@ format.signature:: Set this variable to the empty string ("") to suppress signature generation. -format.signaturefile:: +format.signatureFile:: Works just like format.signature except the contents of the file specified by this variable will be used as the signature. @@ -1186,7 +1211,7 @@ format.thread:: A true boolean value is the same as `shallow`, and a false value disables threading. -format.signoff:: +format.signOff:: A boolean value which lets you enable the `-s/--signoff` option of format-patch by default. *Note:* Adding the Signed-off-by: line to a patch should be a conscious act and means that you certify you have @@ -1225,17 +1250,17 @@ gc.auto:: light-weight garbage collection from time to time. The default value is 6700. Setting this to 0 disables it. -gc.autopacklimit:: +gc.autoPackLimit:: When there are more than this many packs that are not marked with `*.keep` file in the repository, `git gc --auto` consolidates them into one larger pack. The default value is 50. Setting this to 0 disables it. -gc.autodetach:: +gc.autoDetach:: Make `git gc --auto` return immediately and run in background if the system supports it. Default is true. -gc.packrefs:: +gc.packRefs:: Running `git pack-refs` in a repository renders it unclonable by Git versions prior to 1.5.1.2 over dumb transports such as HTTP. This variable determines whether @@ -1243,38 +1268,38 @@ gc.packrefs:: to enable it within all non-bare repos or it can be set to a boolean value. The default is `true`. -gc.pruneexpire:: +gc.pruneExpire:: When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'. Override the grace period with this config variable. The value "now" may be used to disable this grace period and always prune unreachable objects immediately. -gc.reflogexpire:: -gc.<pattern>.reflogexpire:: +gc.reflogExpire:: +gc.<pattern>.reflogExpire:: 'git reflog expire' removes reflog entries older than this time; defaults to 90 days. With "<pattern>" (e.g. "refs/stash") in the middle the setting applies only to the refs that match the <pattern>. -gc.reflogexpireunreachable:: -gc.<ref>.reflogexpireunreachable:: +gc.reflogExpireUnreachable:: +gc.<ref>.reflogExpireUnreachable:: 'git reflog expire' removes reflog entries older than this time and are not reachable from the current tip; defaults to 30 days. With "<pattern>" (e.g. "refs/stash") in the middle, the setting applies only to the refs that match the <pattern>. -gc.rerereresolved:: +gc.rerereResolved:: Records of conflicted merge you resolved earlier are kept for this many days when 'git rerere gc' is run. The default is 60 days. See linkgit:git-rerere[1]. -gc.rerereunresolved:: +gc.rerereUnresolved:: Records of conflicted merge you have not resolved are kept for this many days when 'git rerere gc' is run. The default is 15 days. See linkgit:git-rerere[1]. -gitcvs.commitmsgannotation:: +gitcvs.commitMsgAnnotation:: Append this string to each commit message. Set to empty string to disable this feature. Defaults to "via git-CVS emulator". @@ -1282,7 +1307,7 @@ gitcvs.enabled:: Whether the CVS server interface is enabled for this repository. See linkgit:git-cvsserver[1]. -gitcvs.logfile:: +gitcvs.logFile:: Path to a log file where the CVS server interface well... logs various stuff. See linkgit:git-cvsserver[1]. @@ -1294,10 +1319,10 @@ gitcvs.usecrlfattr:: treat it as text. If they suppress text conversion, the file will be set with '-kb' mode, which suppresses any newline munging the client might otherwise do. If the attributes do not allow - the file type to be determined, then 'gitcvs.allbinary' is + the file type to be determined, then 'gitcvs.allBinary' is used. See linkgit:gitattributes[5]. -gitcvs.allbinary:: +gitcvs.allBinary:: This is used if 'gitcvs.usecrlfattr' does not resolve the correct '-kb' mode to use. If true, all unresolved files are sent to the client in @@ -1307,7 +1332,7 @@ gitcvs.allbinary:: then the contents of the file are examined to decide if it is binary, similar to 'core.autocrlf'. -gitcvs.dbname:: +gitcvs.dbName:: Database used by git-cvsserver to cache revision information derived from the Git repository. The exact meaning depends on the used database driver, for SQLite (which is the default driver) this @@ -1315,7 +1340,7 @@ gitcvs.dbname:: linkgit:git-cvsserver[1] for details). May not contain semicolons (`;`). Default: '%Ggitcvs.%m.sqlite' -gitcvs.dbdriver:: +gitcvs.dbDriver:: Used Perl DBI driver. You can specify any available driver for this here, but it might not work. git-cvsserver is tested with 'DBD::SQLite', reported to work with 'DBD::Pg', and @@ -1323,10 +1348,10 @@ gitcvs.dbdriver:: May not contain double colons (`:`). Default: 'SQLite'. See linkgit:git-cvsserver[1]. -gitcvs.dbuser, gitcvs.dbpass:: - Database user and password. Only useful if setting 'gitcvs.dbdriver', +gitcvs.dbUser, gitcvs.dbPass:: + Database user and password. Only useful if setting 'gitcvs.dbDriver', since SQLite has no concept of database users and/or passwords. - 'gitcvs.dbuser' supports variable substitution (see + 'gitcvs.dbUser' supports variable substitution (see linkgit:git-cvsserver[1] for details). gitcvs.dbTableNamePrefix:: @@ -1337,7 +1362,7 @@ gitcvs.dbTableNamePrefix:: characters will be replaced with underscores. All gitcvs variables except for 'gitcvs.usecrlfattr' and -'gitcvs.allbinary' can also be specified as +'gitcvs.allBinary' can also be specified as 'gitcvs.<access_method>.<varname>' (where 'access_method' is one of "ext" and "pserver") to make them apply only for the given access method. @@ -1355,7 +1380,7 @@ gitweb.highlight:: gitweb.patches:: gitweb.pickaxe:: gitweb.remote_heads:: -gitweb.showsizes:: +gitweb.showSizes:: gitweb.snapshot:: See linkgit:gitweb.conf[5] for description. @@ -1384,15 +1409,15 @@ gpg.program:: signed, and the program is expected to send the result to its standard output. -gui.commitmsgwidth:: +gui.commitMsgWidth:: Defines how wide the commit message window is in the linkgit:git-gui[1]. "75" is the default. -gui.diffcontext:: +gui.diffContext:: Specifies how many context lines should be used in calls to diff made by the linkgit:git-gui[1]. The default is "5". -gui.displayuntracked:: +gui.displayUntracked:: Determines if linkgit::git-gui[1] shows untracked files in the file list. The default is "true". @@ -1404,16 +1429,16 @@ gui.encoding:: If this option is not set, the tools default to the locale encoding. -gui.matchtrackingbranch:: +gui.matchTrackingBranch:: Determines if new branches created with linkgit:git-gui[1] should default to tracking remote branches with matching names or not. Default: "false". -gui.newbranchtemplate:: +gui.newBranchTemplate:: Is used as suggested name when creating new branches using the linkgit:git-gui[1]. -gui.pruneduringfetch:: +gui.pruneDuringFetch:: "true" if linkgit:git-gui[1] should prune remote-tracking branches when performing a fetch. The default value is "false". @@ -1421,17 +1446,17 @@ gui.trustmtime:: Determines if linkgit:git-gui[1] should trust the file modification timestamp or not. By default the timestamps are not trusted. -gui.spellingdictionary:: +gui.spellingDictionary:: Specifies the dictionary used for spell checking commit messages in the linkgit:git-gui[1]. When set to "none" spell checking is turned off. -gui.fastcopyblame:: +gui.fastCopyBlame:: If true, 'git gui blame' uses `-C` instead of `-C -C` for original location detection. It makes blame significantly faster on huge repositories at the expense of less thorough copy detection. -gui.copyblamethreshold:: +gui.copyBlameThreshold:: Specifies the threshold to use in 'git gui blame' original location detection, measured in alphanumeric characters. See the linkgit:git-blame[1] manual for more information on copy detection. @@ -1451,22 +1476,22 @@ guitool.<name>.cmd:: 'FILENAME', and the name of the current branch as 'CUR_BRANCH' (if the head is detached, 'CUR_BRANCH' is empty). -guitool.<name>.needsfile:: +guitool.<name>.needsFile:: Run the tool only if a diff is selected in the GUI. It guarantees that 'FILENAME' is not empty. -guitool.<name>.noconsole:: +guitool.<name>.noConsole:: Run the command silently, without creating a window to display its output. -guitool.<name>.norescan:: +guitool.<name>.noRescan:: Don't rescan the working directory for changes after the tool finishes execution. guitool.<name>.confirm:: Show a confirmation dialog before actually running the tool. -guitool.<name>.argprompt:: +guitool.<name>.argPrompt:: Request a string argument from the user, and pass it to the tool through the 'ARGS' environment variable. Since requesting an argument implies confirmation, the 'confirm' option has no effect @@ -1474,13 +1499,13 @@ guitool.<name>.argprompt:: the dialog uses a built-in generic prompt; otherwise the exact value of the variable is used. -guitool.<name>.revprompt:: +guitool.<name>.revPrompt:: Request a single valid revision from the user, and set the 'REVISION' environment variable. In other aspects this option - is similar to 'argprompt', and can be used together with it. + is similar to 'argPrompt', and can be used together with it. -guitool.<name>.revunmerged:: - Show only unmerged branches in the 'revprompt' subdialog. +guitool.<name>.revUnmerged:: + Show only unmerged branches in the 'revPrompt' subdialog. This is useful for tools similar to merge or rebase, but not for things like checkout or reset. @@ -1490,7 +1515,7 @@ guitool.<name>.title:: guitool.<name>.prompt:: Specifies the general prompt string to display at the top of - the dialog, before subsections for 'argprompt' and 'revprompt'. + the dialog, before subsections for 'argPrompt' and 'revPrompt'. The default value includes the actual command. help.browser:: @@ -1502,7 +1527,7 @@ help.format:: Values 'man', 'info', 'web' and 'html' are supported. 'man' is the default. 'web' and 'html' are the same. -help.autocorrect:: +help.autoCorrect:: Automatically correct and execute mistyped commands after waiting for the given number of deciseconds (0.1 sec). If more than one command can be deduced from the entered text, nothing @@ -1511,7 +1536,7 @@ help.autocorrect:: value is 0 - the command will be just shown but not executed. This is the default. -help.htmlpath:: +help.htmlPath:: Specify the path where the HTML documentation resides. File system paths and URLs are supported. HTML pages will be prefixed with this path when help is displayed in the 'web' format. This defaults to the documentation @@ -1523,17 +1548,17 @@ http.proxy:: `curl(1)`). This can be overridden on a per-remote basis; see remote.<name>.proxy -http.cookiefile:: +http.cookieFile:: File containing previously stored cookie lines which should be used in the Git http session, if they match the server. The file format of the file to read cookies from should be plain HTTP headers or the Netscape/Mozilla cookie file format (see linkgit:curl[1]). - NOTE that the file specified with http.cookiefile is only used as + NOTE that the file specified with http.cookieFile is only used as input unless http.saveCookies is set. -http.savecookies:: +http.saveCookies:: If set, store cookies received during requests to the file specified by - http.cookiefile. Has no effect if http.cookiefile is unset. + http.cookieFile. Has no effect if http.cookieFile is unset. http.sslVerify:: Whether to verify the SSL certificate when fetching or pushing @@ -1604,7 +1629,7 @@ http.noEPSV:: support EPSV mode. Can be overridden by the 'GIT_CURL_FTP_NO_EPSV' environment variable. Default is false (curl will use EPSV). -http.useragent:: +http.userAgent:: The HTTP USER_AGENT string presented to an HTTP server. The default value represents the version of the client Git such as git/1.7.1. This option allows you to override this value to a more common value @@ -1677,7 +1702,7 @@ index.version:: Specify the version with which new index files should be initialized. This does not affect existing repositories. -init.templatedir:: +init.templateDir:: Specify the directory from which templates will be copied. (See the "TEMPLATE DIRECTORY" section of linkgit:git-init[1].) @@ -1693,7 +1718,7 @@ instaweb.local:: If true the web server started by linkgit:git-instaweb[1] will be bound to the local IP (127.0.0.1). -instaweb.modulepath:: +instaweb.modulePath:: The default module path for linkgit:git-instaweb[1] to use instead of /usr/lib/apache2/modules. Only used if httpd is Apache. @@ -1702,7 +1727,7 @@ instaweb.port:: The port number to bind the gitweb httpd to. See linkgit:git-instaweb[1]. -interactive.singlekey:: +interactive.singleKey:: In interactive commands, allow the user to provide one-letter input with a single key (i.e., without hitting enter). Currently this is used by the `--patch` mode of @@ -1730,7 +1755,7 @@ log.decorate:: specified, the full ref name (including prefix) will be printed. This is the same as the log commands '--decorate' option. -log.showroot:: +log.showRoot:: If true, the initial commit will be shown as a big creation event. This is equivalent to a diff against an empty tree. Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which @@ -1740,6 +1765,13 @@ log.mailmap:: If true, makes linkgit:git-log[1], linkgit:git-show[1], and linkgit:git-whatchanged[1] assume `--use-mailmap`. +mailinfo.scissors:: + If true, makes linkgit:git-mailinfo[1] (and therefore + linkgit:git-am[1]) act by default as if the --scissors option + was provided on the command-line. When active, this features + removes everything from the message body before a scissors + line (i.e. consisting mainly of ">8", "8<" and "-"). + mailmap.file:: The location of an augmenting mailmap file. The default mailmap, located in the root of the repository, is loaded @@ -1960,7 +1992,7 @@ pack.useBitmaps:: true. You should not generally need to turn this off unless you are debugging pack bitmaps. -pack.writebitmaps:: +pack.writeBitmaps (deprecated):: This is a deprecated synonym for `repack.writeBitmaps`. pack.writeBitmapHashCache:: @@ -2079,14 +2111,20 @@ new default). -- +push.followTags:: + If set to true enable '--follow-tags' option by default. You + may override this configuration at time of push by specifying + '--no-follow-tags'. + + rebase.stat:: Whether to show a diffstat of what changed upstream since the last rebase. False by default. -rebase.autosquash:: +rebase.autoSquash:: If set to true enable '--autosquash' option by default. -rebase.autostash:: +rebase.autoStash:: When set to true, automatically create a temporary stash before the operation begins, and apply it after the operation ends. This means that you can run rebase on a dirty worktree. @@ -2094,18 +2132,23 @@ rebase.autostash:: successful rebase might result in non-trivial conflicts. Defaults to false. +receive.advertiseAtomic:: + By default, git-receive-pack will advertise the atomic push + capability to its clients. If you don't want to this capability + to be advertised, set this variable to false. + receive.autogc:: By default, git-receive-pack will run "git-gc --auto" after receiving data from git-push and updating refs. You can stop it by setting this variable to false. -receive.certnonceseed:: +receive.certNonceSeed:: By setting this variable to a string, `git receive-pack` will accept a `git push --signed` and verifies it by using a "nonce" protected by HMAC using this string as a secret key. -receive.certnonceslop:: +receive.certNonceSlop:: When a `git push --signed` sent a push certificate with a "nonce" that was issued by a receive-pack serving the same repository within this many seconds, export the "nonce" @@ -2153,11 +2196,15 @@ receive.denyCurrentBranch:: message. Defaults to "refuse". + Another option is "updateInstead" which will update the working -directory (must be clean) if pushing into the current branch. This option is +tree if pushing into the current branch. This option is intended for synchronizing working directories when one side is not easily accessible via interactive ssh (e.g. a live web site, hence the requirement that the working directory be clean). This mode also comes in handy when developing inside a VM to test and fix code on different Operating Systems. ++ +By default, "updateInstead" will refuse the push if the working tree or +the index have any difference from the HEAD, but the `push-to-checkout` +hook can be used to customize this. See linkgit:githooks[5]. receive.denyNonFastForwards:: If set to true, git-receive-pack will deny a ref update which is @@ -2165,7 +2212,7 @@ receive.denyNonFastForwards:: even if that push is forced. This configuration variable is set when initializing a shared repository. -receive.hiderefs:: +receive.hideRefs:: String(s) `receive-pack` uses to decide which refs to omit from its initial advertisement. Use more than one definitions to specify multiple prefix strings. A ref that @@ -2174,18 +2221,18 @@ receive.hiderefs:: push`, and an attempt to update or delete a hidden ref by `git push` is rejected. -receive.updateserverinfo:: +receive.updateServerInfo:: If set to true, git-receive-pack will run git-update-server-info after receiving data from git-push and updating refs. -receive.shallowupdate:: +receive.shallowUpdate:: If set to true, .git/shallow can be updated when new refs require new shallow roots. Otherwise those refs are rejected. -remote.pushdefault:: +remote.pushDefault:: The remote to push to by default. Overrides `branch.<name>.remote` for all branches, and is overridden by - `branch.<name>.pushremote` for specific branches. + `branch.<name>.pushRemote` for specific branches. remote.<name>.url:: The URL of a remote repository. See linkgit:git-fetch[1] or @@ -2229,7 +2276,7 @@ remote.<name>.uploadpack:: The default program to execute on the remote side when fetching. See option \--upload-pack of linkgit:git-fetch-pack[1]. -remote.<name>.tagopt:: +remote.<name>.tagOpt:: Setting this value to \--no-tags disables automatic tag following when fetching from remote <name>. Setting it to \--tags will fetch every tag from remote <name>, even if they are not reachable from remote @@ -2251,7 +2298,7 @@ remotes.<group>:: The list of remotes which are fetched by "git remote update <group>". See linkgit:git-remote[1]. -repack.usedeltabaseoffset:: +repack.useDeltaBaseOffset:: By default, linkgit:git-repack[1] creates packs that use delta-base offset. If you need to share your repository with Git older than version 1.4.4, either directly or via a dumb @@ -2274,7 +2321,7 @@ repack.writeBitmaps:: space and extra time spent on the initial repack. Defaults to false. -rerere.autoupdate:: +rerere.autoUpdate:: When set to true, `git-rerere` updates the index with the resulting contents after it cleanly resolves conflicts using previously recorded resolution. Defaults to false. @@ -2293,12 +2340,12 @@ sendemail.identity:: values in the 'sendemail' section. The default identity is the value of 'sendemail.identity'. -sendemail.smtpencryption:: +sendemail.smtpEncryption:: See linkgit:git-send-email[1] for description. Note that this setting is not subject to the 'identity' mechanism. -sendemail.smtpssl:: - Deprecated alias for 'sendemail.smtpencryption = ssl'. +sendemail.smtpssl (deprecated):: + Deprecated alias for 'sendemail.smtpEncryption = ssl'. sendemail.smtpsslcertpath:: Path to ca-certificates (either a directory or a single file). @@ -2310,34 +2357,34 @@ sendemail.<identity>.*:: identity is selected, through command-line or 'sendemail.identity'. -sendemail.aliasesfile:: -sendemail.aliasfiletype:: +sendemail.aliasesFile:: +sendemail.aliasFileType:: sendemail.annotate:: sendemail.bcc:: sendemail.cc:: -sendemail.cccmd:: -sendemail.chainreplyto:: +sendemail.ccCmd:: +sendemail.chainReplyTo:: sendemail.confirm:: -sendemail.envelopesender:: +sendemail.envelopeSender:: sendemail.from:: -sendemail.multiedit:: +sendemail.multiEdit:: sendemail.signedoffbycc:: -sendemail.smtppass:: +sendemail.smtpPass:: sendemail.suppresscc:: -sendemail.suppressfrom:: +sendemail.suppressFrom:: sendemail.to:: -sendemail.smtpdomain:: -sendemail.smtpserver:: -sendemail.smtpserverport:: -sendemail.smtpserveroption:: -sendemail.smtpuser:: +sendemail.smtpDomain:: +sendemail.smtpServer:: +sendemail.smtpServerPort:: +sendemail.smtpServerOption:: +sendemail.smtpUser:: sendemail.thread:: -sendemail.transferencoding:: +sendemail.transferEncoding:: sendemail.validate:: sendemail.xmailer:: See linkgit:git-send-email[1] for description. -sendemail.signedoffcc:: +sendemail.signedoffcc (deprecated):: Deprecated alias for 'sendemail.signedoffbycc'. showbranch.default:: @@ -2384,7 +2431,7 @@ If this variable is not specified, it defaults to 'normal'. This variable can be overridden with the -u|--untracked-files option of linkgit:git-status[1] and linkgit:git-commit[1]. -status.submodulesummary:: +status.submoduleSummary:: Defaults to false. If this is set to a non zero number or true (identical to -1 or an unlimited number), the submodule summary will be enabled and a @@ -2402,12 +2449,16 @@ status.submodulesummary:: submodule.<name>.path:: submodule.<name>.url:: + The path within this project and URL for a submodule. These + variables are initially populated by 'git submodule init'. See + linkgit:git-submodule[1] and linkgit:gitmodules[5] for + details. + submodule.<name>.update:: - The path within this project, URL, and the updating strategy - for a submodule. These variables are initially populated - by 'git submodule init'; edit them to override the - URL and other values found in the `.gitmodules` file. See - linkgit:git-submodule[1] and linkgit:gitmodules[5] for details. + The default update procedure for a submodule. This variable + is populated by `git submodule init` from the + linkgit:gitmodules[5] file. See description of 'update' + command in linkgit:git-submodule[1]. submodule.<name>.branch:: The remote branch name for a submodule, used by `git submodule @@ -2455,9 +2506,9 @@ transfer.fsckObjects:: not set, the value of this variable is used instead. Defaults to false. -transfer.hiderefs:: - This variable can be used to set both `receive.hiderefs` - and `uploadpack.hiderefs` at the same time to the same +transfer.hideRefs:: + This variable can be used to set both `receive.hideRefs` + and `uploadpack.hideRefs` at the same time to the same values. See entries for these other variables. transfer.unpackLimit:: @@ -2472,7 +2523,7 @@ uploadarchive.allowUnreachable:: linkgit:git-upload-archive[1] for more details. Defaults to `false`. -uploadpack.hiderefs:: +uploadpack.hideRefs:: String(s) `upload-pack` uses to decide which refs to omit from its initial advertisement. Use more than one definitions to specify multiple prefix strings. A ref that @@ -2482,12 +2533,12 @@ uploadpack.hiderefs:: fetch` will fail. See also `uploadpack.allowtipsha1inwant`. uploadpack.allowtipsha1inwant:: - When `uploadpack.hiderefs` is in effect, allow `upload-pack` + When `uploadpack.hideRefs` is in effect, allow `upload-pack` to accept a fetch request that asks for an object at the tip of a hidden ref (by default, such a request is rejected). - see also `uploadpack.hiderefs`. + see also `uploadpack.hideRefs`. -uploadpack.keepalive:: +uploadpack.keepAlive:: When `upload-pack` has started `pack-objects`, there may be a quiet period while `pack-objects` prepares the pack. Normally it would output progress information, but if `--quiet` was used @@ -2495,7 +2546,7 @@ uploadpack.keepalive:: the pack data begins. Some clients and networks may consider the server to be hung and give up. Setting this option instructs `upload-pack` to send an empty keepalive packet every - `uploadpack.keepalive` seconds. Setting this option to 0 + `uploadpack.keepAlive` seconds. Setting this option to 0 disables keepalive packets entirely. The default is 5 seconds. url.<base>.insteadOf:: @@ -2532,13 +2583,25 @@ user.name:: Can be overridden by the 'GIT_AUTHOR_NAME' and 'GIT_COMMITTER_NAME' environment variables. See linkgit:git-commit-tree[1]. -user.signingkey:: +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 commit, you can override the default selection with this variable. This option is passed unchanged to gpg's --local-user parameter, so you may specify a key using any method that gpg supports. +versionsort.prereleaseSuffix:: + When version sort is used in linkgit:git-tag[1], prerelease + tags (e.g. "1.0-rc1") may appear after the main release + "1.0". By specifying the suffix "-rc" in this variable, + "1.0-rc1" will appear before "1.0". ++ +This variable can be specified multiple times, once per suffix. The +order of suffixes in the config file determines the sorting order +(e.g. if "-pre" appears before "-rc" in the config file then 1.0-preXX +is sorted before 1.0-rcXX). The sorting order between different +suffixes is undefined if they are in multiple config files. + web.browser:: Specify a web browser that may be used by some commands. Currently only linkgit:git-instaweb[1] and linkgit:git-help[1] diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt index b001779520..6eaa45271c 100644 --- a/Documentation/diff-config.txt +++ b/Documentation/diff-config.txt @@ -1,4 +1,4 @@ -diff.autorefreshindex:: +diff.autoRefreshIndex:: When using 'git diff' to compare with work tree files, do not consider stat-only change as changed. Instead, silently run `git update-index --refresh` to @@ -75,11 +75,11 @@ diff.ignoreSubmodules:: commands such as 'git diff-files'. 'git checkout' also honors this setting when reporting uncommitted changes. Setting it to 'all' disables the submodule summary normally shown by 'git commit' - and 'git status' when 'status.submodulesummary' is set unless it is + and 'git status' when 'status.submoduleSummary' is set unless it is overridden by using the --ignore-submodules command-line option. The 'git submodule' commands are not affected by this setting. -diff.mnemonicprefix:: +diff.mnemonicPrefix:: If set, 'git diff' uses a prefix pair that is different from the standard "a/" and "b/" depending on what is being compared. When this configuration is in effect, reverse diff output also swaps @@ -98,7 +98,7 @@ diff.mnemonicprefix:: diff.noprefix:: If set, 'git diff' does not show any source or destination prefix. -diff.orderfile:: +diff.orderFile:: File indicating how to order files within a diff, using one shell glob pattern per line. Can be overridden by the '-O' option to linkgit:git-diff[1]. @@ -148,7 +148,7 @@ diff.<driver>.textconv:: conversion is used to generate a human-readable diff. See linkgit:gitattributes[5] for details. -diff.<driver>.wordregex:: +diff.<driver>.wordRegex:: The regular expression that the diff driver should use to split words in a line. See linkgit:gitattributes[5] for details. diff --git a/Documentation/diff-format.txt b/Documentation/diff-format.txt index 15c7e794f4..85b08909ce 100644 --- a/Documentation/diff-format.txt +++ b/Documentation/diff-format.txt @@ -66,7 +66,8 @@ be committed) Status letters C and R are always followed by a score (denoting the percentage of similarity between the source and target of the move or -copy), and are the only ones to be so. +copy). Status letter M may be followed by a score (denoting the +percentage of dissimilarity) for file rewrites. <sha1> is shown as all 0's if a file is new on the filesystem and it is out of sync with the index. diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index 6cb083aae5..ccd499867b 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -432,8 +432,8 @@ endif::git-format-patch[] -O<orderfile>:: Output the patch in the order specified in the <orderfile>, which has one shell glob pattern per line. - This overrides the `diff.orderfile` configuration variable - (see linkgit:git-config[1]). To cancel `diff.orderfile`, + This overrides the `diff.orderFile` configuration variable + (see linkgit:git-config[1]). To cancel `diff.orderFile`, use `-O/dev/null`. ifndef::git-format-patch[] diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt index b09a783ee3..45583d8454 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -68,7 +68,7 @@ endif::git-pull[] By default, tags that point at objects that are downloaded from the remote repository are fetched and stored locally. This option disables this automatic tag following. The default - behavior for a remote may be specified with the remote.<name>.tagopt + behavior for a remote may be specified with the remote.<name>.tagOpt setting. See linkgit:git-config[1]. ifndef::git-pull[] diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index 1c74907dd4..f2eb9076d7 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -173,7 +173,7 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files. Configuration ------------- -The optional configuration variable `core.excludesfile` indicates a path to a +The optional configuration variable `core.excludesFile` indicates a path to a file containing patterns of file names to exclude from git-add, similar to $GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to those in info/exclude. See linkgit:gitignore[5]. @@ -317,7 +317,7 @@ After deciding the fate for all hunks, if there is any hunk that was chosen, the index is updated with the selected hunks. + You can omit having to type return here, by setting the configuration -variable `interactive.singlekey` to `true`. +variable `interactive.singleKey` to `true`. diff:: diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index f4eea28dc4..0d8ba48f79 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -52,7 +52,8 @@ OPTIONS -c:: --scissors:: Remove everything in body before a scissors line (see - linkgit:git-mailinfo[1]). + linkgit:git-mailinfo[1]). Can be activated by default using + the `mailinfo.scissors` configuration variable. --no-scissors:: Ignore scissors lines (see linkgit:git-mailinfo[1]). diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt index f605327946..d9ed6a1a4e 100644 --- a/Documentation/git-apply.txt +++ b/Documentation/git-apply.txt @@ -16,7 +16,7 @@ SYNOPSIS [--ignore-space-change | --ignore-whitespace ] [--whitespace=(nowarn|warn|fix|error|error-all)] [--exclude=<path>] [--include=<path>] [--directory=<root>] - [--verbose] [<patch>...] + [--verbose] [--unsafe-paths] [<patch>...] DESCRIPTION ----------- @@ -229,10 +229,20 @@ For example, a patch that talks about updating `a/git-gui.sh` to `b/git-gui.sh` can be applied to the file in the working tree `modules/git-gui/git-gui.sh` by running `git apply --directory=modules/git-gui`. +--unsafe-paths:: + By default, a patch that affects outside the working area + (either a Git controlled working tree, or the current working + directory when "git apply" is used as a replacement of GNU + patch) is rejected as a mistake (or a mischief). ++ +When `git apply` is used as a "better GNU patch", the user can pass +the `--unsafe-paths` option to override this safety check. This option +has no effect when `--index` or `--cached` is in use. + Configuration ------------- -apply.ignorewhitespace:: +apply.ignoreWhitespace:: Set to 'change' if you want changes in whitespace to be ignored by default. Set to one of: no, none, never, false if you want changes in whitespace to be significant. diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index 311b33674e..359619b552 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -51,7 +51,7 @@ When a local branch is started off a remote-tracking branch, Git sets up the branch (specifically the `branch.<name>.remote` and `branch.<name>.merge` configuration entries) so that 'git pull' will appropriately merge from the remote-tracking branch. This behavior may be changed via the global -`branch.autosetupmerge` configuration flag. That setting can be +`branch.autoSetupMerge` configuration flag. That setting can be overridden by using the `--track` and `--no-track` options, and changed later using `git branch --set-upstream-to`. @@ -166,14 +166,14 @@ This option is only applicable in non-verbose mode. upstream when the new branch is checked out. + This behavior is the default when the start point is a remote-tracking branch. -Set the branch.autosetupmerge configuration variable to `false` if you +Set the branch.autoSetupMerge configuration variable to `false` if you want `git checkout` and `git branch` to always behave as if '--no-track' were given. Set it to `always` if you want this behavior when the start-point is either a local or remote-tracking branch. --no-track:: Do not set up "upstream" configuration, even if the - branch.autosetupmerge configuration variable is true. + branch.autoSetupMerge configuration variable is true. --set-upstream:: If specified branch does not exist yet or if `--force` has been diff --git a/Documentation/git-check-ignore.txt b/Documentation/git-check-ignore.txt index 788a011580..e35cd0489b 100644 --- a/Documentation/git-check-ignore.txt +++ b/Documentation/git-check-ignore.txt @@ -72,7 +72,7 @@ matching pattern, <source> is the pattern's source file, and <linenum> is the line number of the pattern within that source. If the pattern contained a `!` prefix or `/` suffix, it will be preserved in the output. <source> will be an absolute path when referring to the file -configured by `core.excludesfile`, or relative to the repository root +configured by `core.excludesFile`, or relative to the repository root when referring to `.git/info/exclude` or a per-directory exclude file. If `-z` is specified, the pathnames in the output are delimited by the diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 33ad2adf5c..d5041082e8 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -144,7 +144,7 @@ explicitly give a name with '-b' in such a case. --no-track:: Do not set up "upstream" configuration, even if the - branch.autosetupmerge configuration variable is true. + branch.autoSetupMerge configuration variable is true. -l:: Create the new branch's reflog; see linkgit:git-branch[1] for @@ -210,7 +210,7 @@ the conflicted merge in the specified paths. --conflict=<style>:: The same as --merge option above, but changes the way the conflicting hunks are presented, overriding the - merge.conflictstyle configuration variable. Possible values are + merge.conflictStyle configuration variable. Possible values are "merge" (default) and "diff3" (in addition to what is shown by "merge" style, shows the original contents). diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt index 94b6d19cf2..641681f61a 100644 --- a/Documentation/git-clean.txt +++ b/Documentation/git-clean.txt @@ -34,8 +34,12 @@ OPTIONS -f:: --force:: If the Git configuration variable clean.requireForce is not set - to false, 'git clean' will refuse to run unless given -f, -n or - -i. + 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. -i:: --interactive:: diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt index a469eab066..f5f2a8d326 100644 --- a/Documentation/git-commit-tree.txt +++ b/Documentation/git-commit-tree.txt @@ -59,7 +59,7 @@ OPTIONS GPG-sign commit. --no-gpg-sign:: - Countermand `commit.gpgsign` configuration variable that is + Countermand `commit.gpgSign` configuration variable that is set to force each and every commit to be signed. diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 1e74b75d38..617e29b38b 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -284,6 +284,10 @@ configuration variable documented in linkgit:git-config[1]. would be committed at the bottom of the commit message template. Note that this diff output doesn't have its lines prefixed with '#'. ++ +If specified twice, show in addition the unified diff between +what would be committed and the worktree files, i.e. the unstaged +changes to tracked files. -q:: --quiet:: @@ -310,7 +314,7 @@ configuration variable documented in linkgit:git-config[1]. GPG-sign commit. --no-gpg-sign:: - Countermand `commit.gpgsign` configuration variable that is + Countermand `commit.gpgSign` configuration variable that is set to force each and every commit to be signed. \--:: diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 9dfa1a5ce2..02ec096faa 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -405,7 +405,7 @@ true % git config --bool --get-urlmatch http.sslverify https://weak.example.com false % git config --get-urlmatch http https://weak.example.com -http.cookiefile /tmp/cookie.txt +http.cookieFile /tmp/cookie.txt http.sslverify false ------------ diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt index 4961f1abda..db4d7a917c 100644 --- a/Documentation/git-cvsserver.txt +++ b/Documentation/git-cvsserver.txt @@ -154,7 +154,7 @@ with CVS_SERVER (and shouldn't) as 'git-shell' understands `cvs` to mean [gitcvs] enabled=1 # optional for debugging - logfile=/path/to/logfile + logFile=/path/to/logfile ------ Note: you need to ensure each user that is going to invoke 'git-cvsserver' has @@ -254,14 +254,14 @@ Configuring database backend its documentation if changing these variables, especially about `DBI->connect()`. -gitcvs.dbname:: +gitcvs.dbName:: Database name. The exact meaning depends on the selected database driver, for SQLite this is a filename. Supports variable substitution (see below). May not contain semicolons (`;`). Default: '%Ggitcvs.%m.sqlite' -gitcvs.dbdriver:: +gitcvs.dbDriver:: Used DBI driver. You can specify any available driver for this here, but it might not work. cvsserver is tested with 'DBD::SQLite', reported to work with @@ -271,12 +271,12 @@ gitcvs.dbdriver:: Default: 'SQLite' gitcvs.dbuser:: - Database user. Only useful if setting `dbdriver`, since + Database user. Only useful if setting `dbDriver`, since SQLite has no concept of database users. Supports variable substitution (see below). -gitcvs.dbpass:: - Database password. Only useful if setting `dbdriver`, since +gitcvs.dbPass:: + Database password. Only useful if setting `dbDriver`, since SQLite has no concept of database passwords. gitcvs.dbTableNamePrefix:: @@ -288,7 +288,7 @@ All variables can also be set per access method, see <<configaccessmethod,above> Variable substitution ^^^^^^^^^^^^^^^^^^^^^ -In `dbdriver` and `dbuser` you can use the following variables: +In `dbDriver` and `dbUser` you can use the following variables: %G:: Git directory name @@ -413,16 +413,16 @@ about end-of-line conversion. Alternatively, if `gitcvs.usecrlfattr` config is not enabled or the attributes do not allow automatic detection for a filename, then -the server uses the `gitcvs.allbinary` config for the default setting. -If `gitcvs.allbinary` is set, then file not otherwise +the server uses the `gitcvs.allBinary` config for the default setting. +If `gitcvs.allBinary` is set, then file not otherwise specified will default to '-kb' mode. Otherwise the '-k' mode -is left blank. But if `gitcvs.allbinary` is set to "guess", then +is left blank. But if `gitcvs.allBinary` is set to "guess", then the correct '-k' mode will be guessed based on the contents of the file. For best consistency with 'cvs', it is probably best to override the defaults by setting `gitcvs.usecrlfattr` to true, -and `gitcvs.allbinary` to "guess". +and `gitcvs.allBinary` to "guess". Dependencies ------------ diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt index 8deb61469d..e62d9a0717 100644 --- a/Documentation/git-fetch.txt +++ b/Documentation/git-fetch.txt @@ -26,7 +26,7 @@ By default, any tag that points into the histories being fetched is also fetched; the effect is to fetch tags that point at branches that you are interested in. This default behavior can be changed by using the --tags or --no-tags options or by -configuring remote.<name>.tagopt. By using a refspec that fetches tags +configuring remote.<name>.tagOpt. By using a refspec that fetches tags explicitly, you can fetch tags that do not point into branches you are interested in as well. diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index c0fd470da4..bb3ea9372f 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -273,13 +273,13 @@ attachments, and sign off patches with configuration variables. ------------ [format] headers = "Organization: git-foo\n" - subjectprefix = CHANGE + subjectPrefix = CHANGE suffix = .txt numbered = auto to = <email> cc = <email> attach [ = mime-boundary-string ] - signoff = true + signOff = true coverletter = auto ------------ diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt index 273c4663c8..52234987f9 100644 --- a/Documentation/git-gc.txt +++ b/Documentation/git-gc.txt @@ -54,10 +54,10 @@ all loose objects are combined into a single pack using `git repack -d -l`. Setting the value of `gc.auto` to 0 disables automatic packing of loose objects. + -If the number of packs exceeds the value of `gc.autopacklimit`, +If the number of packs exceeds the value of `gc.autoPackLimit`, then existing packs (except those marked with a `.keep` file) are consolidated into a single pack by using the `-A` option of -'git repack'. Setting `gc.autopacklimit` to 0 disables +'git repack'. Setting `gc.autoPackLimit` to 0 disables automatic consolidation of packs. --prune=<date>:: @@ -101,18 +101,18 @@ branches: ------------ [gc "refs/remotes/*"] reflogExpire = never - reflogexpireUnreachable = 3 days + reflogExpireUnreachable = 3 days ------------ -The optional configuration variable 'gc.rerereresolved' indicates +The optional configuration variable 'gc.rerereResolved' indicates how long records of conflicted merge you resolved earlier are kept. This defaults to 60 days. -The optional configuration variable 'gc.rerereunresolved' indicates +The optional configuration variable 'gc.rerereUnresolved' indicates how long records of conflicted merge you have not resolved are kept. This defaults to 15 days. -The optional configuration variable 'gc.packrefs' determines if +The optional configuration variable 'gc.packRefs' determines if 'git gc' runs 'git pack-refs'. This can be set to "notbare" to enable it within all non-bare repos or it can be set to a boolean value. This defaults to true. diff --git a/Documentation/git-imap-send.txt b/Documentation/git-imap-send.txt index 77aacf1309..5d1e4c80cd 100644 --- a/Documentation/git-imap-send.txt +++ b/Documentation/git-imap-send.txt @@ -44,7 +44,8 @@ OPTIONS --no-curl:: Talk to the IMAP server using git's own IMAP routines instead of - using libcurl. + using libcurl. Ignored if Git was built with the NO_OPENSSL option + set. CONFIGURATION diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt index 369f889bb4..8174d27efd 100644 --- a/Documentation/git-init.txt +++ b/Documentation/git-init.txt @@ -125,7 +125,7 @@ The template directory will be one of the following (in order): - the contents of the `$GIT_TEMPLATE_DIR` environment variable; - - the `init.templatedir` configuration variable; or + - the `init.templateDir` configuration variable; or - the default template directory: `/usr/share/git-core/templates`. diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt index f3eef510f2..cc75b25022 100644 --- a/Documentation/git-instaweb.txt +++ b/Documentation/git-instaweb.txt @@ -76,7 +76,7 @@ You may specify configuration in your .git/config httpd = apache2 -f port = 4321 browser = konqueror - modulepath = /usr/lib/apache2/modules + modulePath = /usr/lib/apache2/modules ----------------------------------------------------------------------- diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 1f7bc67d6c..18bc716a0c 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -184,7 +184,7 @@ log.date:: `--date` option.) Defaults to "default", which means to write dates like `Sat May 8 19:35:34 2010 -0500`. -log.showroot:: +log.showRoot:: If `false`, `git log` and related commands will not treat the initial commit as a big creation event. Any root commits in `git log -p` output would be shown without a diff attached. diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index cf2c374b71..1f94908e3c 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -232,7 +232,7 @@ Barbie's remark on your side. The only thing you can tell is that your side wants to say it is hard and you'd prefer to go shopping, while the other side wants to claim it is easy. -An alternative style can be used by setting the "merge.conflictstyle" +An alternative style can be used by setting the "merge.conflictStyle" configuration variable to "diff3". In "diff3" style, the above conflict may look like this: @@ -329,7 +329,7 @@ CONFIGURATION ------------- include::merge-config.txt[] -branch.<name>.mergeoptions:: +branch.<name>.mergeOptions:: Sets default options for merging into branch <name>. The syntax and supported options are the same as those of 'git merge', but option values containing whitespace characters are currently not supported. diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index 6ab5f9497a..a1664b9f68 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -241,6 +241,9 @@ Git repository: Use a client spec to find the list of interesting files in p4. See the "CLIENT SPEC" section below. +-/ <path>:: + Exclude selected depot paths when cloning or syncing. + Clone options ~~~~~~~~~~~~~ These options can be used in an initial 'clone', along with the 'sync' @@ -254,9 +257,6 @@ options described above. --bare:: Perform a bare clone. See linkgit:git-clone[1]. --/ <path>:: - Exclude selected depot paths when cloning. - Submit options ~~~~~~~~~~~~~~ These options can be used to modify 'git p4 submit' behavior. diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index 200eb22260..d3d236cd1f 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -117,7 +117,7 @@ locally created merge commits will not be flattened. + When false, merge the current branch into the upstream branch. + -See `pull.rebase`, `branch.<name>.rebase` and `branch.autosetuprebase` in +See `pull.rebase`, `branch.<name>.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 b17283ab7a..5171086181 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -9,7 +9,7 @@ git-push - Update remote refs along with associated objects SYNOPSIS -------- [verse] -'git push' [--all | --mirror | --tags] [--follow-tags] [-n | --dry-run] [--receive-pack=<git-receive-pack>] +'git push' [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>] [--repo=<repository>] [-f | --force] [--prune] [-v | --verbose] [-u | --set-upstream] [--signed] [--force-with-lease[=<refname>[:<expect>]]] @@ -128,7 +128,10 @@ already exists on the remote side. Push all the refs that would be pushed without this option, and also push annotated tags in `refs/tags` that are missing from the remote but are pointing at commit-ish that are - reachable from the refs being pushed. + reachable from the refs being pushed. This can also be specified + with configuration variable 'push.followTags'. For more + information, see 'push.followTags' in linkgit:git-config[1]. + --signed:: GPG-sign the push request to update refs on the receiving @@ -136,6 +139,11 @@ already exists on the remote side. logged. See linkgit:git-receive-pack[1] for the details on the receiving end. +--[no-]atomic:: + Use an atomic transaction on the remote side if available. + Either all refs are updated, or on error, no refs are updated. + If the server does not support atomic pushes the push will fail. + --receive-pack=<git-receive-pack>:: --exec=<git-receive-pack>:: Path to the 'git-receive-pack' program on the remote @@ -214,22 +222,8 @@ origin +master` to force a push to the `master` branch). See the `<refspec>...` section above for details. --repo=<repository>:: - This option is only relevant if no <repository> argument is - passed in the invocation. In this case, 'git push' derives the - remote name from the current branch: If it tracks a remote - branch, then that remote repository is pushed to. Otherwise, - the name "origin" is used. For this latter case, this option - can be used to override the name "origin". In other words, - the difference between these two commands -+ --------------------------- -git push public #1 -git push --repo=public #2 --------------------------- -+ -is that #1 always pushes to "public" whereas #2 pushes to "public" -only if the current branch does not track a remote branch. This is -useful if you write an alias or script around 'git push'. + This option is equivalent to the <repository> argument. If both + are specified, the command-line argument takes precedence. -u:: --set-upstream:: diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 924827dc2e..d728030590 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -207,10 +207,10 @@ rebase.stat:: Whether to show a diffstat of what changed upstream since the last rebase. False by default. -rebase.autosquash:: +rebase.autoSquash:: If set to true enable '--autosquash' option by default. -rebase.autostash:: +rebase.autoStash:: If set to true enable '--autostash' option by default. OPTIONS @@ -414,7 +414,7 @@ squash/fixup series. This option is only valid when the '--interactive' option is used. + If the '--autosquash' option is enabled by default using the -configuration variable `rebase.autosquash`, this option can be +configuration variable `rebase.autoSquash`, this option can be used to override and disable this setting. --[no-]autostash:: diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.txt index 9016960e27..000ee8dba2 100644 --- a/Documentation/git-receive-pack.txt +++ b/Documentation/git-receive-pack.txt @@ -100,7 +100,7 @@ the following environment variables: starting time is different by this many seconds from the current session. Only meaningful when `GIT_PUSH_CERT_NONCE_STATUS` says `SLOP`. - Also read about `receive.certnonceslop` variable in + Also read about `receive.certNonceSlop` variable in linkgit:git-config[1]. This hook is called before any refname is updated and before any diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt index 70791b9fd8..5e7908e4f7 100644 --- a/Documentation/git-reflog.txt +++ b/Documentation/git-reflog.txt @@ -17,85 +17,113 @@ The command takes various subcommands, and different options depending on the subcommand: [verse] -'git reflog expire' [--dry-run] [--stale-fix] [--verbose] - [--expire=<time>] [--expire-unreachable=<time>] [--all] <refs>... -'git reflog delete' ref@\{specifier\}... 'git reflog' ['show'] [log-options] [<ref>] +'git reflog expire' [--expire=<time>] [--expire-unreachable=<time>] + [--rewrite] [--updateref] [--stale-fix] + [--dry-run] [--verbose] [--all | <refs>...] +'git reflog delete' [--rewrite] [--updateref] + [--dry-run] [--verbose] ref@\{specifier\}... + +Reference logs, or "reflogs", record when the tips of branches and +other references were updated in the local repository. Reflogs are +useful in various Git commands, to specify the old value of a +reference. For example, `HEAD@{2}` means "where HEAD used to be two +moves ago", `master@{one.week.ago}` means "where master used to point +to one week ago in this local repository", and so on. See +linkgit:gitrevisions[7] for more details. + +This command manages the information recorded in the reflogs. + +The "show" subcommand (which is also the default, in the absence of +any subcommands) shows the log of the reference provided in the +command-line (or `HEAD`, by default). The reflog covers all recent +actions, and in addition the `HEAD` reflog records branch switching. +`git reflog show` is an alias for `git log -g --abbrev-commit +--pretty=oneline`; see linkgit:git-log[1] for more information. + +The "expire" subcommand prunes older reflog entries. Entries older +than `expire` time, or entries older than `expire-unreachable` time +and not reachable from the current tip, are removed from the reflog. +This is typically not used directly by end users -- instead, see +linkgit:git-gc[1]. + +The "delete" subcommand deletes single entries from the reflog. Its +argument must be an _exact_ entry (e.g. "`git reflog delete +master@{2}`"). This subcommand is also typically not used directly by +end users. -Reflog is a mechanism to record when the tip of branches are -updated. This command is to manage the information recorded in it. -The subcommand "expire" is used to prune older reflog entries. -Entries older than `expire` time, or entries older than -`expire-unreachable` time and not reachable from the current -tip, are removed from the reflog. This is typically not used -directly by the end users -- instead, see linkgit:git-gc[1]. - -The subcommand "show" (which is also the default, in the absence of any -subcommands) will take all the normal log options, and show the log of -the reference provided in the command-line (or `HEAD`, by default). -The reflog will cover all recent actions (HEAD reflog records branch switching -as well). It is an alias for `git log -g --abbrev-commit --pretty=oneline`; -see linkgit:git-log[1]. +OPTIONS +------- -The reflog is useful in various Git commands, to specify the old value -of a reference. For example, `HEAD@{2}` means "where HEAD used to be -two moves ago", `master@{one.week.ago}` means "where master used to -point to one week ago", and so on. See linkgit:gitrevisions[7] for -more details. +Options for `show` +~~~~~~~~~~~~~~~~~~ -To delete single entries from the reflog, use the subcommand "delete" -and specify the _exact_ entry (e.g. "`git reflog delete master@{2}`"). +`git reflog show` accepts any of the options accepted by `git log`. -OPTIONS -------- +Options for `expire` +~~~~~~~~~~~~~~~~~~~~ ---stale-fix:: - This revamps the logic -- the definition of "broken commit" - becomes: a commit that is not reachable from any of the refs and - there is a missing object among the commit, tree, or blob - objects reachable from it that is not reachable from any of the - refs. -+ -This computation involves traversing all the reachable objects, i.e. it -has the same cost as 'git prune'. Fortunately, once this is run, we -should not have to ever worry about missing objects, because the current -prune and pack-objects know about reflogs and protect objects referred by -them. +--all:: + Process the reflogs of all references. --expire=<time>:: - Entries older than this time are pruned. Without the - option it is taken from configuration `gc.reflogExpire`, - which in turn defaults to 90 days. --expire=all prunes - entries regardless of their age; --expire=never turns off - pruning of reachable entries (but see --expire-unreachable). + Prune entries older than the specified time. If this option is + not specified, the expiration time is taken from the + configuration setting `gc.reflogExpire`, which in turn + defaults to 90 days. `--expire=all` prunes entries regardless + of their age; `--expire=never` turns off pruning of reachable + entries (but see `--expire-unreachable`). --expire-unreachable=<time>:: - Entries older than this time and not reachable from - the current tip of the branch are pruned. Without the - option it is taken from configuration - `gc.reflogExpireUnreachable`, which in turn defaults to - 30 days. --expire-unreachable=all prunes unreachable - entries regardless of their age; --expire-unreachable=never + Prune entries older than `<time>` that are not reachable from + the current tip of the branch. If this option is not + specified, the expiration time is taken from the configuration + setting `gc.reflogExpireUnreachable`, which in turn defaults + to 30 days. `--expire-unreachable=all` prunes unreachable + entries regardless of their age; `--expire-unreachable=never` turns off early pruning of unreachable entries (but see - --expire). - ---all:: - Instead of listing <refs> explicitly, prune all refs. + `--expire`). --updateref:: - Update the ref with the sha1 of the top reflog entry (i.e. - <ref>@\{0\}) after expiring or deleting. + Update the reference to the value of the top reflog entry (i.e. + <ref>@\{0\}) if the previous top entry was pruned. (This + option is ignored for symbolic references.) --rewrite:: - While expiring or deleting, adjust each reflog entry to ensure - that the `old` sha1 field points to the `new` sha1 field of the - previous entry. + If a reflog entry's predecessor is pruned, adjust its "old" + SHA-1 to be equal to the "new" SHA-1 field of the entry that + now precedes it. + +--stale-fix:: + Prune any reflog entries that point to "broken commits". A + broken commit is a commit that is not reachable from any of + the reference tips and that refers, directly or indirectly, to + a missing commit, tree, or blob object. ++ +This computation involves traversing all the reachable objects, i.e. it +has the same cost as 'git prune'. It is primarily intended to fix +corruption caused by garbage collecting using older versions of Git, +which didn't protect objects referred to by reflogs. + +-n:: +--dry-run:: + Do not actually prune any entries; just show what would have + been pruned. --verbose:: Print extra information on screen. + +Options for `delete` +~~~~~~~~~~~~~~~~~~~~ + +`git reflog delete` accepts options `--updateref`, `--rewrite`, `-n`, +`--dry-run`, and `--verbose`, with the same meanings as when they are +used with `expire`. + + GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt index cb103c8b6f..4c6d6de7b7 100644 --- a/Documentation/git-remote.txt +++ b/Documentation/git-remote.txt @@ -58,6 +58,9 @@ remote repository. With `--no-tags` option, `git fetch <name>` does not import tags from the remote repository. + +By default, only tags on fetched branches are imported +(see linkgit:git-fetch[1]). ++ With `-t <branch>` option, instead of the default glob refspec for the remote to track all branches under the `refs/remotes/<name>/` namespace, a refspec to track only `<branch>` @@ -130,17 +133,25 @@ branches, adds to that list. 'set-url':: -Changes URL remote points to. Sets first URL remote points to matching +Changes URLs for the remote. Sets first URL for remote <name> that matches regex <oldurl> (first URL if no <oldurl> is given) to <newurl>. If -<oldurl> doesn't match any URL, error occurs and nothing is changed. +<oldurl> doesn't match any URL, an error occurs and nothing is changed. + With '--push', push URLs are manipulated instead of fetch URLs. + -With '--add', instead of changing some URL, new URL is added. +With '--add', instead of changing existing URLs, new URL is added. ++ +With '--delete', instead of changing existing URLs, all URLs matching +regex <url> are deleted for remote <name>. Trying to delete all +non-push URLs is an error. + -With '--delete', instead of changing some URL, all URLs matching -regex <url> are deleted. Trying to delete all non-push URLs is an -error. +Note that the push URL and the fetch URL, even though they can +be set differently, must still refer to the same place. What you +pushed to the push URL should be what you would see if you +immediately fetched from the fetch URL. If you are trying to +fetch from one place (e.g. your upstream) and push to another (e.g. +your publishing repository), use two separate remotes. + 'show':: diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt index 4786a780b5..0e0bd363d6 100644 --- a/Documentation/git-repack.txt +++ b/Documentation/git-repack.txt @@ -115,7 +115,7 @@ other objects in that pack they already have locally. Write a reachability bitmap index as part of the repack. This only makes sense when used with `-a` or `-A`, as the bitmaps must be able to refer to all reachable objects. This option - overrides the setting of `pack.writebitmaps`. + overrides the setting of `pack.writeBitmaps`. --pack-kept-objects:: Include objects in `.keep` files when repacking. Note that we @@ -123,7 +123,7 @@ other objects in that pack they already have locally. This means that we may duplicate objects, but this makes the option safe to use when there are concurrent pushes or fetches. This option is generally only useful if you are writing bitmaps - with `-b` or `pack.writebitmaps`, as it ensures that the + with `-b` or `pack.writeBitmaps`, as it ensures that the bitmapped packfile has the necessary objects. Configuration diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt index a62227f84e..9ee083c415 100644 --- a/Documentation/git-rerere.txt +++ b/Documentation/git-rerere.txt @@ -69,7 +69,7 @@ Prune records of conflicted merges that occurred a long time ago. By default, unresolved conflicts older than 15 days and resolved conflicts older than 60 days are pruned. These defaults are controlled via the -`gc.rerereunresolved` and `gc.rerereresolved` configuration +`gc.rerereUnresolved` and `gc.rerereResolved` configuration variables respectively. diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index f248a8665e..804554609d 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -47,7 +47,7 @@ Composing --annotate:: Review and edit each patch you're about to send. Default is the value of 'sendemail.annotate'. See the CONFIGURATION section for - 'sendemail.multiedit'. + 'sendemail.multiEdit'. --bcc=<address>:: Specify a "Bcc:" value for each email. Default is the value of @@ -73,7 +73,7 @@ and In-Reply-To headers will be used unless they are removed. + Missing From or In-Reply-To headers will be prompted for. + -See the CONFIGURATION section for 'sendemail.multiedit'. +See the CONFIGURATION section for 'sendemail.multiEdit'. --from=<address>:: Specify the sender of the emails. If not specified on the command line, @@ -156,31 +156,31 @@ Sending subscribed to a list. In order to use the 'From' address, set the value to "auto". If you use the sendmail binary, you must have suitable privileges for the -f parameter. Default is the value of the - 'sendemail.envelopesender' configuration variable; if that is + 'sendemail.envelopeSender' configuration variable; if that is unspecified, choosing the envelope sender is left to your MTA. --smtp-encryption=<encryption>:: Specify the encryption to use, either 'ssl' or 'tls'. Any other value reverts to plain SMTP. Default is the value of - 'sendemail.smtpencryption'. + 'sendemail.smtpEncryption'. --smtp-domain=<FQDN>:: Specifies the Fully Qualified Domain Name (FQDN) used in the HELO/EHLO command to the SMTP server. Some servers require the FQDN to match your IP address. If not set, git send-email attempts to determine your FQDN automatically. Default is the value of - 'sendemail.smtpdomain'. + 'sendemail.smtpDomain'. --smtp-pass[=<password>]:: Password for SMTP-AUTH. The argument is optional: If no argument is specified, then the empty string is used as - the password. Default is the value of 'sendemail.smtppass', + the password. Default is the value of 'sendemail.smtpPass', however '--smtp-pass' always overrides this value. + Furthermore, passwords need not be specified in configuration files or on the command line. If a username has been specified (with -'--smtp-user' or a 'sendemail.smtpuser'), but no password has been -specified (with '--smtp-pass' or 'sendemail.smtppass'), then +'--smtp-user' or a 'sendemail.smtpUser'), but no password has been +specified (with '--smtp-pass' or 'sendemail.smtpPass'), then a password is obtained using 'git-credential'. --smtp-server=<host>:: @@ -188,7 +188,7 @@ a password is obtained using 'git-credential'. `smtp.example.com` or a raw IP address). Alternatively it can specify a full pathname of a sendmail-like program instead; the program must support the `-i` option. Default value can - be specified by the 'sendemail.smtpserver' configuration + be specified by the 'sendemail.smtpServer' configuration option; the built-in default is `/usr/sbin/sendmail` or `/usr/lib/sendmail` if such program is available, or `localhost` otherwise. @@ -199,11 +199,11 @@ a password is obtained using 'git-credential'. submission port 587, or the common SSL smtp port 465); symbolic port names (e.g. "submission" instead of 587) are also accepted. The port can also be set with the - 'sendemail.smtpserverport' configuration variable. + 'sendemail.smtpServerPort' configuration variable. --smtp-server-option=<option>:: If set, specifies the outgoing SMTP server option to use. - Default value can be specified by the 'sendemail.smtpserveroption' + Default value can be specified by the 'sendemail.smtpServerOption' configuration option. + The --smtp-server-option option must be repeated for each option you want @@ -225,8 +225,8 @@ must be used for each option. be the best choice on most platforms). --smtp-user=<user>:: - Username for SMTP-AUTH. Default is the value of 'sendemail.smtpuser'; - if a username is not specified (with '--smtp-user' or 'sendemail.smtpuser'), + Username for SMTP-AUTH. Default is the value of 'sendemail.smtpUser'; + if a username is not specified (with '--smtp-user' or 'sendemail.smtpUser'), then authentication is not attempted. --smtp-debug=0|1:: @@ -247,14 +247,14 @@ Automating Specify a command to execute once per patch file which should generate patch file specific "Cc:" entries. Output of this command must be single email address per line. - Default is the value of 'sendemail.cccmd' configuration value. + Default is the value of 'sendemail.ccCmd' configuration value. --[no-]chain-reply-to:: If this is set, each email will be sent as a reply to the previous email sent. If disabled with "--no-chain-reply-to", all emails after the first will be sent as replies to the first email sent. When using this, it is recommended that the first file given be an overview of the - entire patch series. Disabled by default, but the 'sendemail.chainreplyto' + entire patch series. Disabled by default, but the 'sendemail.chainReplyTo' configuration variable can be used to enable it. --identity=<identity>:: @@ -304,7 +304,7 @@ specified, as well as 'body' if --no-signed-off-cc is specified. --[no-]suppress-from:: If this is set, do not add the From: address to the cc: list. - Default is the value of 'sendemail.suppressfrom' configuration + Default is the value of 'sendemail.suppressFrom' configuration value; if that is unspecified, default to --no-suppress-from. --[no-]thread:: @@ -377,15 +377,15 @@ default to '--validate'. CONFIGURATION ------------- -sendemail.aliasesfile:: +sendemail.aliasesFile:: To avoid typing long email addresses, point this to one or more - email aliases files. You must also supply 'sendemail.aliasfiletype'. + email aliases files. You must also supply 'sendemail.aliasFileType'. -sendemail.aliasfiletype:: - Format of the file(s) specified in sendemail.aliasesfile. Must be +sendemail.aliasFileType:: + Format of the file(s) specified in sendemail.aliasesFile. Must be one of 'mutt', 'mailrc', 'pine', 'elm', or 'gnus'. -sendemail.multiedit:: +sendemail.multiEdit:: If true (default), a single editor instance will be spawned to edit files you have to edit (patches when '--annotate' is used, and the summary when '--compose' is used). If false, files will be edited one @@ -404,10 +404,10 @@ To use 'git send-email' to send your patches through the GMail SMTP server, edit ~/.gitconfig to specify your account settings: [sendemail] - smtpencryption = tls - smtpserver = smtp.gmail.com - smtpuser = yourname@gmail.com - smtpserverport = 587 + smtpEncryption = tls + smtpServer = smtp.gmail.com + smtpUser = yourname@gmail.com + smtpServerPort = 587 Once your commits are ready to be sent to the mailing list, run the following commands: diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt index 2a0de42a75..45c7725dc3 100644 --- a/Documentation/git-send-pack.txt +++ b/Documentation/git-send-pack.txt @@ -9,7 +9,7 @@ git-send-pack - Push objects over Git protocol to another repository SYNOPSIS -------- [verse] -'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...] +'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> [<ref>...] DESCRIPTION ----------- @@ -62,6 +62,11 @@ be in a separate packet, and the list must end with a flush packet. Send a "thin" pack, which records objects in deltified form based on objects not included in the pack to reduce network traffic. +--atomic:: + Use an atomic transaction for updating the refs. If any of the refs + fails to update then the entire push will fail without changing any + refs. + <host>:: A remote host to house the repository. When this part is specified, 'git-receive-pack' is invoked via diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 4d8d530d35..b3319f7c2a 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -77,7 +77,7 @@ configuration variable documented in linkgit:git-config[1]. only changes to the commits stored in the superproject are shown (this was the behavior before 1.7.0). Using "all" hides all changes to submodules (and suppresses the output of submodule summaries when the config option - `status.submodulesummary` is set). + `status.submoduleSummary` is set). --ignored:: Show ignored files as well. @@ -207,7 +207,7 @@ If the config variable `status.relativePaths` is set to false, then all paths shown are relative to the repository root, not to the current directory. -If `status.submodulesummary` is set to a non zero number or true (identical +If `status.submoduleSummary` is set to a non zero number or true (identical to -1 or an unlimited number), the submodule summary will be enabled for the long format and a summary of commits for modified submodules will be shown (see --summary-limit option of linkgit:git-submodule[1]). Please note diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 8e6af65da0..2c25916f8f 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -154,27 +154,51 @@ If `--force` is specified, the submodule's work tree will be removed even if it contains local modifications. update:: - Update the registered submodules, i.e. clone missing submodules and - checkout the commit specified in the index of the containing repository. - This will make the submodules HEAD be detached unless `--rebase` or - `--merge` is specified or the key `submodule.$name.update` is set to - `rebase`, `merge` or `none`. `none` can be overridden by specifying - `--checkout`. Setting the key `submodule.$name.update` to `!command` - will cause `command` to be run. `command` can be any arbitrary shell - command that takes a single argument, namely the sha1 to update to. + +-- +Update the registered submodules to match what the superproject +expects by cloning missing submodules and updating the working tree of +the submodules. The "updating" can be done in several ways depending +on command line options and the value of `submodule.<name>.update` +configuration variable. Supported update procedures are: + + checkout;; the commit recorded in the superproject will be + checked out in the submodule on a detached HEAD. This is + done when `--checkout` option is given, or no option is + given, and `submodule.<name>.update` is unset, or if it is + set to 'checkout'. ++ +If `--force` is specified, the submodule will be checked out (using +`git checkout --force` if appropriate), even if the commit specified +in the index of the containing repository already matches the commit +checked out in the submodule. + + rebase;; the current branch of the submodule will be rebased + onto the commit recorded in the superproject. This is done + when `--rebase` option is given, or no option is given, and + `submodule.<name>.update` is set to 'rebase'. + + merge;; the commit recorded in the superproject will be merged + into the current branch in the submodule. This is done + when `--merge` option is given, or no option is given, and + `submodule.<name>.update` is set to 'merge'. + + custom command;; arbitrary shell command that takes a single + argument (the sha1 of the commit recorded in the + superproject) is executed. This is done when no option is + given, and `submodule.<name>.update` has the form of + '!command'. + +When no option is given and `submodule.<name>.update` is set to 'none', +the submodule is not updated. + If the submodule is not yet initialized, and you just want to use the setting as stored in .gitmodules, you can automatically initialize the submodule with the `--init` option. -+ + If `--recursive` is specified, this command will recurse into the registered submodules, and update any nested submodules within. -+ -If `--force` is specified, the submodule will be checked out (using -`git checkout --force` if appropriate), even if the commit specified in the -index of the containing repository already matches the commit checked out in -the submodule. - +-- summary:: Show commit summary between the given commit (defaults to HEAD) and working tree/index. For a submodule in question, a series of commits @@ -238,10 +262,12 @@ OPTIONS When running add, allow adding an otherwise ignored submodule path. When running deinit the submodule work trees will be removed even if they contain local changes. - When running update, throw away local changes in submodules when - switching to a different commit; and always run a checkout operation - in the submodule, even if the commit listed in the index of the - containing repository matches the commit checked out in the submodule. + When running update (only effective with the checkout procedure), + throw away local changes in submodules when switching to a + different commit; and always run a checkout operation in the + submodule, even if the commit listed in the index of the + containing repository matches the commit checked out in the + submodule. --cached:: This option is only valid for status and summary commands. These @@ -302,7 +328,7 @@ the submodule itself. Checkout the commit recorded in the superproject on a detached HEAD in the submodule. This is the default behavior, the main use of this option is to override `submodule.$name.update` when set to - `merge`, `rebase` or `none`. + a value other than `checkout`. If the key `submodule.$name.update` is either not explicitly set or set to `checkout`, this option is implicit. diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index e953ba4439..bfba4ef078 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -161,7 +161,7 @@ it in the repository configuration as follows: ------------------------------------- [user] - signingkey = <gpg-key-id> + signingKey = <gpg-key-id> ------------------------------------- diff --git a/Documentation/git.txt b/Documentation/git.txt index eadbd05356..b12e22d597 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,13 @@ 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.3.0/git.html[documentation for release 2.3] +* link:v2.3.4/git.html[documentation for release 2.3.4] * release notes for + link:RelNotes/2.3.4.txt[2.3.4], + link:RelNotes/2.3.3.txt[2.3.3], + link:RelNotes/2.3.2.txt[2.3.2], + link:RelNotes/2.3.1.txt[2.3.1], link:RelNotes/2.3.0.txt[2.3]. * link:v2.2.2/git.html[documentation for release 2.2.2] @@ -916,7 +920,7 @@ for further details. If this environment variable is set, then Git commands which need to acquire passwords or passphrases (e.g. for HTTP or IMAP authentication) will call this program with a suitable prompt as command-line argument - and read the password from its STDOUT. See also the 'core.askpass' + and read the password from its STDOUT. See also the 'core.askPass' option in linkgit:git-config[1]. 'GIT_TERMINAL_PROMPT':: @@ -1023,6 +1027,17 @@ GIT_ICASE_PATHSPECS:: variable when it is invoked as the top level command by the end user, to be recorded in the body of the reflog. +`GIT_REF_PARANOIA`:: + If set to `1`, include broken or badly named refs when iterating + over lists of refs. In a normal, non-corrupted repository, this + does nothing. However, enabling it may help git to detect and + abort some operations in the presence of broken refs. Git sets + this variable automatically when performing destructive + operations like linkgit:git-prune[1]. You should not need to set + it yourself unless you want to be paranoid about making sure + an operation has touched every ref (e.g., because you are + cloning a repository to make a backup). + Discussion[[Discussion]] ------------------------ diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index c892ffa5ce..70899b3023 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -80,7 +80,7 @@ Attributes which should be version-controlled and distributed to other repositories (i.e., attributes of interest to all users) should go into `.gitattributes` files. Attributes that should affect all repositories for a single user should be placed in a file specified by the -`core.attributesfile` configuration option (see linkgit:git-config[1]). +`core.attributesFile` configuration option (see linkgit:git-config[1]). Its default value is $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/attributes is used instead. Attributes for all users on a system should be placed in the diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.txt index 47576be5db..1c75be0803 100644 --- a/Documentation/gitcredentials.txt +++ b/Documentation/gitcredentials.txt @@ -32,7 +32,7 @@ strategies to ask the user for usernames and passwords: to the program on the command line, and the user's input is read from its standard output. -2. Otherwise, if the `core.askpass` configuration variable is set, its +2. Otherwise, if the `core.askPass` configuration variable is set, its value is used as above. 3. Otherwise, if the `SSH_ASKPASS` environment variable is set, its diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt index 9ef2469373..7ba0ac965d 100644 --- a/Documentation/githooks.txt +++ b/Documentation/githooks.txt @@ -341,6 +341,36 @@ Both standard output and standard error output are forwarded to 'git send-pack' on the other end, so you can simply `echo` messages for the user. +push-to-checkout +~~~~~~~~~~~~~~~~ + +This hook is invoked by 'git-receive-pack' on the remote repository, +which happens when a 'git push' is done on a local repository, when +the push tries to update the branch that is currently checked out +and the `receive.denyCurrentBranch` configuration variable is set to +`updateInstead`. Such a push by default is refused if the working +tree and the index of the remote repository has any difference from +the currently checked out commit; when both the working tree and the +index match the current commit, they are updated to match the newly +pushed tip of the branch. This hook is to be used to override the +default behaviour. + +The hook receives the commit with which the tip of the current +branch is going to be updated. It can exit with a non-zero status +to refuse the push (when it does so, it must not modify the index or +the working tree). Or it can make any necessary changes to the +working tree and to the index to bring them to the desired state +when the tip of the current branch is updated to the new commit, and +exit with a zero status. + +For example, the hook can simply run `git read-tree -u -m HEAD "$1"` +in order to emulate 'git fetch' that is run in the reverse direction +with `git push`, as the two-tree form of `read-tree -u -m` is +essentially the same as `git checkout` that switches branches while +keeping the local changes in the working tree that do not interfere +with the difference between the branches. + + pre-auto-gc ~~~~~~~~~~~ diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 4fd04423e9..473623d631 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -38,7 +38,7 @@ precedence, the last matching pattern decides the outcome): * Patterns read from `$GIT_DIR/info/exclude`. * Patterns read from the file specified by the configuration - variable 'core.excludesfile'. + variable 'core.excludesFile'. Which file to place a pattern in depends on how the pattern is meant to be used. @@ -56,7 +56,7 @@ be used. * Patterns which a user wants Git to ignore in all situations (e.g., backup or temporary files generated by the user's editor of choice) generally go into a file specified by - `core.excludesfile` in the user's `~/.gitconfig`. Its default value is + `core.excludesFile` in the user's `~/.gitconfig`. Its default value is $XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore is used instead. diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index f6c0dfd029..ac70eca321 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -38,18 +38,15 @@ submodule.<name>.url:: In addition, there are a number of optional keys: submodule.<name>.update:: - Defines what to do when the submodule is updated by the superproject. - If 'checkout' (the default), the new commit specified in the - superproject will be checked out in the submodule on a detached HEAD. - If 'rebase', the current branch of the submodule will be rebased onto - the commit specified in the superproject. If 'merge', the commit - specified in the superproject will be merged into the current branch - in the submodule. - If 'none', the submodule with name `$name` will not be updated - by default. - - This config option is overridden if 'git submodule update' is given - the '--merge', '--rebase' or '--checkout' options. + Defines the default update procedure for the named submodule, + i.e. how the submodule is updated by "git submodule update" + command in the superproject. This is only used by `git + submodule init` to initialize the configuration variable of + the same name. Allowed values here are 'checkout', 'rebase', + 'merge' or 'none'. See description of 'update' command in + linkgit:git-submodule[1] for their meaning. Note that the + '!command' form is intentionally ignored here for security + reasons. submodule.<name>.branch:: A remote branch name for tracking updates in the upstream submodule. diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt index ebe7a6c24c..0506f07d74 100644 --- a/Documentation/gitweb.conf.txt +++ b/Documentation/gitweb.conf.txt @@ -706,7 +706,7 @@ show-sizes:: I/O. Enabled by default. + This feature can be configured on a per-repository basis via -repository's `gitweb.showsizes` configuration variable (boolean). +repository's `gitweb.showSizes` configuration variable (boolean). patches:: Enable and configure "patches" view, which displays list of commits in email diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt index d78d6d854e..8a0e52f8ee 100644 --- a/Documentation/merge-config.txt +++ b/Documentation/merge-config.txt @@ -1,4 +1,4 @@ -merge.conflictstyle:: +merge.conflictStyle:: Specify the style in which conflicted hunks are written out to working tree files upon merge. The default is "merge", which shows a `<<<<<<<` conflict marker, changes made by one side, diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt index 8569e29d08..74aa01a0ec 100644 --- a/Documentation/pretty-options.txt +++ b/Documentation/pretty-options.txt @@ -3,9 +3,13 @@ Pretty-print the contents of the commit logs in a given format, where '<format>' can be one of 'oneline', 'short', 'medium', - 'full', 'fuller', 'email', 'raw' and 'format:<string>'. See - the "PRETTY FORMATS" section for some additional details for each - format. When omitted, the format defaults to 'medium'. + 'full', 'fuller', 'email', 'raw', 'format:<string>' + and 'tformat:<string>'. When '<format>' is none of the above, + and has '%placeholder' in it, it acts as if + '--pretty=tformat:<format>' were given. ++ +See the "PRETTY FORMATS" section for some additional details for each +format. When '=<format>' part is omitted, it defaults to 'medium'. + Note: you can specify the default pretty format in the repository configuration (see linkgit:git-config[1]). diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 2984f407a9..f620ee4e1c 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -66,6 +66,10 @@ if it is part of the log message. Limit the commits output to ones that match all given `--grep`, instead of ones that match at least one. +--invert-grep:: + Limit the commits output to ones with log message that do not + match the pattern specified with `--grep=<pattern>`. + -i:: --regexp-ignore-case:: Match the regular expression limiting patterns without regard to letter @@ -119,7 +123,8 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit). because merges into a topic branch tend to be only about adjusting to updated upstream from time to time, and this option allows you to ignore the individual commits - brought in to your history by such a merge. + brought in to your history by such a merge. Cannot be + combined with --bisect. --not:: Reverses the meaning of the '{caret}' prefix (or lack thereof) @@ -172,11 +177,6 @@ explicitly. Pretend as if all objects mentioned by reflogs are listed on the command line as `<commit>`. ---indexed-objects:: - Pretend as if all trees and blobs used by the index are listed - on the command line. Note that you probably want to use - `--objects`, too. - --ignore-missing:: Upon seeing an invalid object name in the input, pretend as if the bad input was not given. @@ -186,7 +186,7 @@ ifndef::git-rev-list[] Pretend as if the bad bisection ref `refs/bisect/bad` was listed and as if it was followed by `--not` and the good bisection refs `refs/bisect/good-*` on the command - line. + line. Cannot be combined with --first-parent. endif::git-rev-list[] --stdin:: @@ -567,7 +567,7 @@ outputs 'midpoint', the output of the two commands would be of roughly the same length. Finding the change which introduces a regression is thus reduced to a binary search: repeatedly generate and test new 'midpoint's until the commit chain is of length -one. +one. Cannot be combined with --first-parent. --bisect-vars:: This calculates the same as `--bisect`, except that refs in @@ -644,6 +644,7 @@ Object Traversal These options are mostly targeted for packing of Git repositories. +ifdef::git-rev-list[] --objects:: Print the object IDs of any object referenced by the listed commits. `--objects foo ^bar` thus means ``send me @@ -662,9 +663,15 @@ These options are mostly targeted for packing of Git repositories. commits at the cost of increased time. This is used instead of `--objects-edge` to build ``thin'' packs for shallow repositories. +--indexed-objects:: + Pretend as if all trees and blobs used by the index are listed + on the command line. Note that you probably want to use + `--objects`, too. + --unpacked:: Only useful with `--objects`; print the object IDs that are not in packs. +endif::git-rev-list[] --no-walk[=(sorted|unsorted)]:: Only show the given commits, but do not traverse their ancestors. @@ -673,6 +680,7 @@ These options are mostly targeted for packing of Git repositories. given on the command line. Otherwise (if `sorted` or no argument was given), the commits are shown in reverse chronological order by commit time. + Cannot be combined with `--graph`. --do-walk:: Overrides a previous `--no-walk`. @@ -775,6 +783,7 @@ you would get an output like this: on the left hand side of the output. This may cause extra lines to be printed in between commits, in order for the graph history to be drawn properly. + Cannot be combined with `--no-walk`. + This enables parent rewriting, see 'History Simplification' below. + diff --git a/Documentation/technical/api-error-handling.txt b/Documentation/technical/api-error-handling.txt new file mode 100644 index 0000000000..fc68db126e --- /dev/null +++ b/Documentation/technical/api-error-handling.txt @@ -0,0 +1,75 @@ +Error reporting in git +====================== + +`die`, `usage`, `error`, and `warning` report errors of various +kinds. + +- `die` is for fatal application errors. It prints a message to + the user and exits with status 128. + +- `usage` is for errors in command line usage. After printing its + message, it exits with status 129. (See also `usage_with_options` + in the link:api-parse-options.html[parse-options API].) + +- `error` is for non-fatal library errors. It prints a message + to the user and returns -1 for convenience in signaling the error + to the caller. + +- `warning` is for reporting situations that probably should not + occur but which the user (and Git) can continue to work around + without running into too many problems. Like `error`, it + returns -1 after reporting the situation to the caller. + +Customizable error handlers +--------------------------- + +The default behavior of `die` and `error` is to write a message to +stderr and then exit or return as appropriate. This behavior can be +overridden using `set_die_routine` and `set_error_routine`. For +example, "git daemon" uses set_die_routine to write the reason `die` +was called to syslog before exiting. + +Library errors +-------------- + +Functions return a negative integer on error. Details beyond that +vary from function to function: + +- Some functions return -1 for all errors. Others return a more + specific value depending on how the caller might want to react + to the error. + +- Some functions report the error to stderr with `error`, + while others leave that for the caller to do. + +- errno is not meaningful on return from most functions (except + for thin wrappers for system calls). + +Check the function's API documentation to be sure. + +Caller-handled errors +--------------------- + +An increasing number of functions take a parameter 'struct strbuf *err'. +On error, such functions append a message about what went wrong to the +'err' strbuf. The message is meant to be complete enough to be passed +to `die` or `error` as-is. For example: + + if (ref_transaction_commit(transaction, &err)) + die("%s", err.buf); + +The 'err' parameter will be untouched if no error occured, so multiple +function calls can be chained: + + t = ref_transaction_begin(&err); + if (!t || + ref_transaction_update(t, "HEAD", ..., &err) || + ret_transaction_commit(t, &err)) + die("%s", err.buf); + +The 'err' parameter must be a pointer to a valid strbuf. To silence +a message, pass a strbuf that is explicitly ignored: + + if (thing_that_can_fail_in_an_ignorable_way(..., &err)) + /* This failure is okay. */ + strbuf_reset(&err); diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt deleted file mode 100644 index cca6543234..0000000000 --- a/Documentation/technical/api-strbuf.txt +++ /dev/null @@ -1,351 +0,0 @@ -strbuf API -========== - -strbuf's are meant to be used with all the usual C string and memory -APIs. Given that the length of the buffer is known, it's often better to -use the mem* functions than a str* one (memchr vs. strchr e.g.). -Though, one has to be careful about the fact that str* functions often -stop on NULs and that strbufs may have embedded NULs. - -A strbuf is NUL terminated for convenience, but no function in the -strbuf API actually relies on the string being free of NULs. - -strbufs have some invariants that are very important to keep in mind: - -. The `buf` member is never NULL, so it can be used in any usual C -string operations safely. strbuf's _have_ to be initialized either by -`strbuf_init()` or by `= STRBUF_INIT` before the invariants, though. -+ -Do *not* assume anything on what `buf` really is (e.g. if it is -allocated memory or not), use `strbuf_detach()` to unwrap a memory -buffer from its strbuf shell in a safe way. That is the sole supported -way. This will give you a malloced buffer that you can later `free()`. -+ -However, it is totally safe to modify anything in the string pointed by -the `buf` member, between the indices `0` and `len-1` (inclusive). - -. The `buf` member is a byte array that has at least `len + 1` bytes - allocated. The extra byte is used to store a `'\0'`, allowing the - `buf` member to be a valid C-string. Every strbuf function ensure this - invariant is preserved. -+ -NOTE: It is OK to "play" with the buffer directly if you work it this - way: -+ ----- -strbuf_grow(sb, SOME_SIZE); <1> -strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE); ----- -<1> Here, the memory array starting at `sb->buf`, and of length -`strbuf_avail(sb)` is all yours, and you can be sure that -`strbuf_avail(sb)` is at least `SOME_SIZE`. -+ -NOTE: `SOME_OTHER_SIZE` must be smaller or equal to `strbuf_avail(sb)`. -+ -Doing so is safe, though if it has to be done in many places, adding the -missing API to the strbuf module is the way to go. -+ -WARNING: Do _not_ assume that the area that is yours is of size `alloc -- 1` even if it's true in the current implementation. Alloc is somehow a -"private" member that should not be messed with. Use `strbuf_avail()` -instead. - -Data structures ---------------- - -* `struct strbuf` - -This is the string buffer structure. The `len` member can be used to -determine the current length of the string, and `buf` member provides -access to the string itself. - -Functions ---------- - -* Life cycle - -`strbuf_init`:: - - Initialize the structure. The second parameter can be zero or a bigger - number to allocate memory, in case you want to prevent further reallocs. - -`strbuf_release`:: - - Release a string buffer and the memory it used. You should not use the - string buffer after using this function, unless you initialize it again. - -`strbuf_detach`:: - - Detach the string from the strbuf and returns it; you now own the - storage the string occupies and it is your responsibility from then on - to release it with `free(3)` when you are done with it. - -`strbuf_attach`:: - - Attach a string to a buffer. You should specify the string to attach, - the current length of the string and the amount of allocated memory. - The amount must be larger than the string length, because the string you - pass is supposed to be a NUL-terminated string. This string _must_ be - malloc()ed, and after attaching, the pointer cannot be relied upon - anymore, and neither be free()d directly. - -`strbuf_swap`:: - - Swap the contents of two string buffers. - -* Related to the size of the buffer - -`strbuf_avail`:: - - Determine the amount of allocated but unused memory. - -`strbuf_grow`:: - - Ensure that at least this amount of unused memory is available after - `len`. This is used when you know a typical size for what you will add - and want to avoid repetitive automatic resizing of the underlying buffer. - This is never a needed operation, but can be critical for performance in - some cases. - -`strbuf_setlen`:: - - Set the length of the buffer to a given value. This function does *not* - allocate new memory, so you should not perform a `strbuf_setlen()` to a - length that is larger than `len + strbuf_avail()`. `strbuf_setlen()` is - just meant as a 'please fix invariants from this strbuf I just messed - with'. - -`strbuf_reset`:: - - Empty the buffer by setting the size of it to zero. - -* Related to the contents of the buffer - -`strbuf_trim`:: - - Strip whitespace from the beginning and end of a string. - Equivalent to performing `strbuf_rtrim()` followed by `strbuf_ltrim()`. - -`strbuf_rtrim`:: - - Strip whitespace from the end of a string. - -`strbuf_ltrim`:: - - Strip whitespace from the beginning of a string. - -`strbuf_reencode`:: - - Replace the contents of the strbuf with a reencoded form. Returns -1 - on error, 0 on success. - -`strbuf_tolower`:: - - Lowercase each character in the buffer using `tolower`. - -`strbuf_cmp`:: - - Compare two buffers. Returns an integer less than, equal to, or greater - than zero if the first buffer is found, respectively, to be less than, - to match, or be greater than the second buffer. - -* Adding data to the buffer - -NOTE: All of the functions in this section will grow the buffer as necessary. -If they fail for some reason other than memory shortage and the buffer hadn't -been allocated before (i.e. the `struct strbuf` was set to `STRBUF_INIT`), -then they will free() it. - -`strbuf_addch`:: - - Add a single character to the buffer. - -`strbuf_addchars`:: - - Add a character the specified number of times to the buffer. - -`strbuf_insert`:: - - Insert data to the given position of the buffer. The remaining contents - will be shifted, not overwritten. - -`strbuf_remove`:: - - Remove given amount of data from a given position of the buffer. - -`strbuf_splice`:: - - Remove the bytes between `pos..pos+len` and replace it with the given - data. - -`strbuf_add_commented_lines`:: - - Add a NUL-terminated string to the buffer. Each line will be prepended - by a comment character and a blank. - -`strbuf_add`:: - - Add data of given length to the buffer. - -`strbuf_addstr`:: - -Add a NUL-terminated string to the buffer. -+ -NOTE: This function will *always* be implemented as an inline or a macro -that expands to: -+ ----- -strbuf_add(..., s, strlen(s)); ----- -+ -Meaning that this is efficient to write things like: -+ ----- -strbuf_addstr(sb, "immediate string"); ----- - -`strbuf_addbuf`:: - - Copy the contents of another buffer at the end of the current one. - -`strbuf_adddup`:: - - Copy part of the buffer from a given position till a given length to the - end of the buffer. - -`strbuf_expand`:: - - This function can be used to expand a format string containing - placeholders. To that end, it parses the string and calls the specified - function for every percent sign found. -+ -The callback function is given a pointer to the character after the `%` -and a pointer to the struct strbuf. It is expected to add the expanded -version of the placeholder to the strbuf, e.g. to add a newline -character if the letter `n` appears after a `%`. The function returns -the length of the placeholder recognized and `strbuf_expand()` skips -over it. -+ -The format `%%` is automatically expanded to a single `%` as a quoting -mechanism; callers do not need to handle the `%` placeholder themselves, -and the callback function will not be invoked for this placeholder. -+ -All other characters (non-percent and not skipped ones) are copied -verbatim to the strbuf. If the callback returned zero, meaning that the -placeholder is unknown, then the percent sign is copied, too. -+ -In order to facilitate caching and to make it possible to give -parameters to the callback, `strbuf_expand()` passes a context pointer, -which can be used by the programmer of the callback as she sees fit. - -`strbuf_expand_dict_cb`:: - - Used as callback for `strbuf_expand()`, expects an array of - struct strbuf_expand_dict_entry as context, i.e. pairs of - placeholder and replacement string. The array needs to be - terminated by an entry with placeholder set to NULL. - -`strbuf_addbuf_percentquote`:: - - Append the contents of one strbuf to another, quoting any - percent signs ("%") into double-percents ("%%") in the - destination. This is useful for literal data to be fed to either - strbuf_expand or to the *printf family of functions. - -`strbuf_humanise_bytes`:: - - Append the given byte size as a human-readable string (i.e. 12.23 KiB, - 3.50 MiB). - -`strbuf_addf`:: - - Add a formatted string to the buffer. - -`strbuf_commented_addf`:: - - Add a formatted string prepended by a comment character and a - blank to the buffer. - -`strbuf_fread`:: - - Read a given size of data from a FILE* pointer to the buffer. -+ -NOTE: The buffer is rewound if the read fails. If -1 is returned, -`errno` must be consulted, like you would do for `read(3)`. -`strbuf_read()`, `strbuf_read_file()` and `strbuf_getline()` has the -same behaviour as well. - -`strbuf_read`:: - - Read the contents of a given file descriptor. The third argument can be - used to give a hint about the file size, to avoid reallocs. - -`strbuf_read_file`:: - - Read the contents of a file, specified by its path. The third argument - can be used to give a hint about the file size, to avoid reallocs. - -`strbuf_readlink`:: - - Read the target of a symbolic link, specified by its path. The third - argument can be used to give a hint about the size, to avoid reallocs. - -`strbuf_getline`:: - - Read a line from a FILE *, overwriting the existing contents - of the strbuf. The second argument specifies the line - terminator character, typically `'\n'`. - Reading stops after the terminator or at EOF. The terminator - is removed from the buffer before returning. Returns 0 unless - there was nothing left before EOF, in which case it returns `EOF`. - -`strbuf_getwholeline`:: - - Like `strbuf_getline`, but keeps the trailing terminator (if - any) in the buffer. - -`strbuf_getwholeline_fd`:: - - Like `strbuf_getwholeline`, but operates on a file descriptor. - It reads one character at a time, so it is very slow. Do not - use it unless you need the correct position in the file - descriptor. - -`strbuf_getcwd`:: - - Set the buffer to the path of the current working directory. - -`strbuf_add_absolute_path` - - Add a path to a buffer, converting a relative path to an - absolute one in the process. Symbolic links are not - resolved. - -`stripspace`:: - - Strip whitespace from a buffer. The second parameter controls if - comments are considered contents to be removed or not. - -`strbuf_split_buf`:: -`strbuf_split_str`:: -`strbuf_split_max`:: -`strbuf_split`:: - - Split a string or strbuf into a list of strbufs at a specified - terminator character. The returned substrings include the - terminator characters. Some of these functions take a `max` - parameter, which, if positive, limits the output to that - number of substrings. - -`strbuf_list_free`:: - - Free a list of strbufs (for example, the return values of the - `strbuf_split()` functions). - -`launch_editor`:: - - Launch the user preferred editor to edit a file and fill the buffer - with the file's contents upon the user completing their editing. The - third argument can be used to set the environment which the editor is - run in. If the buffer is NULL the editor is launched as usual but the - file's contents are not read into the buffer upon completion. diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt index 6d5424c1bd..4f8a7bfb4c 100644 --- a/Documentation/technical/protocol-capabilities.txt +++ b/Documentation/technical/protocol-capabilities.txt @@ -18,8 +18,9 @@ was sent. Server MUST NOT ignore capabilities that client requested and server advertised. As a consequence of these rules, server MUST NOT advertise capabilities it does not understand. -The 'report-status', 'delete-refs', 'quiet', and 'push-cert' capabilities -are sent and recognized by the receive-pack (push to server) process. +The 'atomic', 'report-status', 'delete-refs', 'quiet', and 'push-cert' +capabilities are sent and recognized by the receive-pack (push to server) +process. The 'ofs-delta' and 'side-band-64k' capabilities are sent and recognized by both upload-pack and receive-pack protocols. The 'agent' capability @@ -244,6 +245,14 @@ respond with the 'quiet' capability to suppress server-side progress reporting if the local progress reporting is also being suppressed (e.g., via `push -q`, or if stderr does not go to a tty). +atomic +------ + +If the server sends the 'atomic' capability it is capable of accepting +atomic pushes. If the pushing client requests this capability, the server +will update the refs in one atomic transaction. Either all refs are +updated or none. + allow-tip-sha1-in-want ---------------------- diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 7330d880f3..68978f5338 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -1200,7 +1200,7 @@ for other users who clone your repository. If you wish the exclude patterns to affect only certain repositories (instead of every repository for a given project), you may instead put them in a file in your repository named `.git/info/exclude`, or in any -file specified by the `core.excludesfile` configuration variable. +file specified by the `core.excludesFile` configuration variable. Some Git commands can also take exclude patterns directly on the command line. See linkgit:gitignore[5] for the details. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 780064ad71..734fa9b434 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.3.0 +DEF_VER=v2.3.3.GIT LF=' ' @@ -348,6 +348,17 @@ all:: # # Define NO_HMAC_CTX_CLEANUP if your OpenSSL is version 0.9.6b or earlier to # cleanup the HMAC context with the older HMAC_cleanup function. +# +# Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily +# compiles the following initialization: +# +# static const char s[] = ("FOO"); +# +# and define it to "no" if you need to remove the parentheses () around the +# constant. The default is "auto", which means to use parentheses if your +# compiler is detected to support it. +# +# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function. GIT-VERSION-FILE: FORCE @$(SHELL_PATH) ./GIT-VERSION-GEN @@ -955,6 +966,14 @@ ifneq (,$(SOCKLEN_T)) BASIC_CFLAGS += -Dsocklen_t=$(SOCKLEN_T) endif +ifeq (yes,$(USE_PARENS_AROUND_GETTEXT_N)) + BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=1 +else +ifeq (no,$(USE_PARENS_AROUND_GETTEXT_N)) + BASIC_CFLAGS += -DUSE_PARENS_AROUND_GETTEXT_N=0 +endif +endif + ifeq ($(uname_S),Darwin) ifndef NO_FINK ifeq ($(shell test -d /sw/lib && echo y),y) @@ -1035,13 +1054,13 @@ else REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES) PROGRAM_OBJS += http-fetch.o PROGRAMS += $(REMOTE_CURL_NAMES) - curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p) + curl_check := $(shell (echo 070908; curl-config --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p) ifeq "$(curl_check)" "070908" ifndef NO_EXPAT PROGRAM_OBJS += http-push.o endif endif - curl_check := $(shell (echo 072200; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p) + curl_check := $(shell (echo 072200; curl-config --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p) ifeq "$(curl_check)" "072200" USE_CURL_FOR_IMAP_SEND = YesPlease endif @@ -1414,6 +1433,10 @@ ifdef HAVE_CLOCK_MONOTONIC BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC endif +ifdef HAVE_BSD_SYSCTL + BASIC_CFLAGS += -DHAVE_BSD_SYSCTL +endif + ifeq ($(TCLTK_PATH),) NO_TCLTK = NoThanks endif @@ -1 +1 @@ -Documentation/RelNotes/2.3.0.txt
\ No newline at end of file +Documentation/RelNotes/2.4.0.txt
\ No newline at end of file @@ -105,7 +105,7 @@ void detach_advice(const char *new_name) "state without impacting any branches by performing another checkout.\n\n" "If you want to create a new branch to retain commits you create, you may\n" "do so (now or later) by using -b with the checkout command again. Example:\n\n" - " git checkout -b new_branch_name\n\n"; + " git checkout -b <new-branch-name>\n\n"; fprintf(stderr, fmt, new_name); } diff --git a/archive-zip.c b/archive-zip.c index 4bde019bce..ffb3535e93 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -5,6 +5,8 @@ #include "archive.h" #include "streaming.h" #include "utf8.h" +#include "userdiff.h" +#include "xdiff-interface.h" static int zip_date; static int zip_time; @@ -120,7 +122,6 @@ static void *zlib_deflate_raw(void *data, unsigned long size, void *buffer; int result; - memset(&stream, 0, sizeof(stream)); git_deflate_init_raw(&stream, compression_level); maxsize = git_deflate_bound(&stream, size); buffer = xmalloc(maxsize); @@ -189,6 +190,16 @@ static int has_only_ascii(const char *s) } } +static int entry_is_binary(const char *path, const void *buffer, size_t size) +{ + struct userdiff_driver *driver = userdiff_find_by_path(path); + if (!driver) + driver = userdiff_find_by_name("default"); + if (driver->binary != -1) + return driver->binary; + return buffer_is_binary(buffer, size); +} + #define STREAM_BUFFER_SIZE (1024 * 16) static int write_zip_entry(struct archiver_args *args, @@ -210,6 +221,8 @@ static int write_zip_entry(struct archiver_args *args, struct git_istream *stream = NULL; unsigned long flags = 0; unsigned long size; + int is_binary = -1; + const char *path_without_prefix = path + args->baselen; crc = crc32(0, NULL, 0); @@ -256,6 +269,8 @@ static int write_zip_entry(struct archiver_args *args, return error("cannot read %s", sha1_to_hex(sha1)); crc = crc32(crc, buffer, size); + is_binary = entry_is_binary(path_without_prefix, + buffer, size); out = buffer; } compressed_size = (method == 0) ? size : 0; @@ -300,7 +315,6 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(dirent.extra_length, ZIP_EXTRA_MTIME_SIZE); copy_le16(dirent.comment_length, 0); copy_le16(dirent.disk, 0); - copy_le16(dirent.attr1, 0); copy_le32(dirent.attr2, attr2); copy_le32(dirent.offset, zip_offset); @@ -328,6 +342,9 @@ static int write_zip_entry(struct archiver_args *args, if (readlen <= 0) break; crc = crc32(crc, buf, readlen); + if (is_binary == -1) + is_binary = entry_is_binary(path_without_prefix, + buf, readlen); write_or_die(1, buf, readlen); } close_istream(stream); @@ -349,7 +366,6 @@ static int write_zip_entry(struct archiver_args *args, size_t out_len; unsigned char compressed[STREAM_BUFFER_SIZE * 2]; - memset(&zstream, 0, sizeof(zstream)); git_deflate_init_raw(&zstream, args->compression_level); compressed_size = 0; @@ -361,6 +377,9 @@ static int write_zip_entry(struct archiver_args *args, if (readlen <= 0) break; crc = crc32(crc, buf, readlen); + if (is_binary == -1) + is_binary = entry_is_binary(path_without_prefix, + buf, readlen); zstream.next_in = buf; zstream.avail_in = readlen; @@ -405,6 +424,8 @@ static int write_zip_entry(struct archiver_args *args, free(deflated); free(buffer); + copy_le16(dirent.attr1, !is_binary); + memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE); zip_dir_offset += ZIP_DIR_HEADER_SIZE; memcpy(zip_dir + zip_dir_offset, path, pathlen); @@ -8,9 +8,9 @@ #include "dir.h" static char const * const archive_usage[] = { - N_("git archive [options] <tree-ish> [<path>...]"), + N_("git archive [<options>] <tree-ish> [<path>...]"), N_("git archive --list"), - N_("git archive --remote <repo> [--exec <cmd>] [options] <tree-ish> [<path>...]"), + N_("git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"), N_("git archive --remote <repo> [--exec <cmd>] --list"), NULL }; @@ -32,9 +32,12 @@ struct git_attr { struct git_attr *next; unsigned h; int attr_nr; + int maybe_macro; + int maybe_real; char name[FLEX_ARRAY]; }; static int attr_nr; +static int cannot_trust_maybe_real; static struct git_attr_check *check_all_attr; static struct git_attr *(git_attr_hash[HASHSIZE]); @@ -95,6 +98,8 @@ static struct git_attr *git_attr_internal(const char *name, int len) a->h = hval; a->next = git_attr_hash[pos]; a->attr_nr = attr_nr++; + a->maybe_macro = 0; + a->maybe_real = 0; git_attr_hash[pos] = a; REALLOC_ARRAY(check_all_attr, attr_nr); @@ -244,9 +249,10 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, sizeof(*res) + sizeof(struct attr_state) * num_attr + (is_macro ? 0 : namelen + 1)); - if (is_macro) + if (is_macro) { res->u.attr = git_attr_internal(name, namelen); - else { + res->u.attr->maybe_macro = 1; + } else { char *p = (char *)&(res->state[num_attr]); memcpy(p, name, namelen); res->u.pat.pattern = p; @@ -266,6 +272,10 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, /* Second pass to fill the attr_states */ for (cp = states, i = 0; *cp; i++) { cp = parse_attr(src, lineno, cp, &(res->state[i])); + if (!is_macro) + res->state[i].attr->maybe_real = 1; + if (res->state[i].attr->maybe_macro) + cannot_trust_maybe_real = 1; } return res; @@ -681,13 +691,14 @@ static int fill(const char *path, int pathlen, int basename_offset, return rem; } -static int macroexpand_one(int attr_nr, int rem) +static int macroexpand_one(int nr, int rem) { struct attr_stack *stk; struct match_attr *a = NULL; int i; - if (check_all_attr[attr_nr].value != ATTR__TRUE) + if (check_all_attr[nr].value != ATTR__TRUE || + !check_all_attr[nr].attr->maybe_macro) return rem; for (stk = attr_stack; !a && stk; stk = stk->prev) @@ -695,7 +706,7 @@ static int macroexpand_one(int attr_nr, int rem) struct match_attr *ma = stk->attrs[i]; if (!ma->is_macro) continue; - if (ma->u.attr->attr_nr == attr_nr) + if (ma->u.attr->attr_nr == nr) a = ma; } @@ -706,10 +717,13 @@ static int macroexpand_one(int attr_nr, int rem) } /* - * Collect all attributes for path into the array pointed to by - * check_all_attr. + * Collect attributes for path into the array pointed to by + * check_all_attr. If num is non-zero, only attributes in check[] are + * collected. Otherwise all attributes are collected. */ -static void collect_all_attrs(const char *path) +static void collect_some_attrs(const char *path, int num, + struct git_attr_check *check) + { struct attr_stack *stk; int i, pathlen, rem, dirlen; @@ -732,6 +746,19 @@ static void collect_all_attrs(const char *path) prepare_attr_stack(path, dirlen); for (i = 0; i < attr_nr; i++) check_all_attr[i].value = ATTR__UNKNOWN; + if (num && !cannot_trust_maybe_real) { + rem = 0; + for (i = 0; i < num; i++) { + if (!check[i].attr->maybe_real) { + struct git_attr_check *c; + c = check_all_attr + check[i].attr->attr_nr; + c->value = ATTR__UNSET; + rem++; + } + } + if (rem == num) + return; + } rem = attr_nr; for (stk = attr_stack; 0 < rem && stk; stk = stk->prev) @@ -742,7 +769,7 @@ int git_check_attr(const char *path, int num, struct git_attr_check *check) { int i; - collect_all_attrs(path); + collect_some_attrs(path, num, check); for (i = 0; i < num; i++) { const char *value = check_all_attr[check[i].attr->attr_nr].value; @@ -758,7 +785,7 @@ int git_all_attrs(const char *path, int *num, struct git_attr_check **check) { int i, count, j; - collect_all_attrs(path); + collect_some_attrs(path, 0, NULL); /* Count the number of attributes that are set. */ count = 0; @@ -284,8 +284,9 @@ void create_branch(const char *head, transaction = ref_transaction_begin(&err); if (!transaction || - ref_transaction_update(transaction, ref.buf, sha1, - null_sha1, 0, !forcing, msg, &err) || + ref_transaction_update(transaction, ref.buf, + sha1, forcing ? NULL : null_sha1, + 0, msg, &err) || ref_transaction_commit(transaction, &err)) die("%s", err.buf); ref_transaction_free(transaction); diff --git a/builtin/add.c b/builtin/add.c index 1074e32349..3390933d68 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -19,7 +19,7 @@ #include "argv-array.h" static const char * const builtin_add_usage[] = { - N_("git add [options] [--] <pathspec>..."), + N_("git add [<options>] [--] <pathspec>..."), NULL }; static int patch_interactive, add_interactive, edit_interactive; diff --git a/builtin/apply.c b/builtin/apply.c index 0aad912839..65b97eee69 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -51,11 +51,12 @@ static int apply_verbosely; static int allow_overlap; static int no_add; static int threeway; +static int unsafe_paths; static const char *fake_ancestor; static int line_termination = '\n'; static unsigned int p_context = UINT_MAX; static const char * const apply_usage[] = { - N_("git apply [options] [<patch>...]"), + N_("git apply [<options>] [<patch>...]"), NULL }; @@ -657,11 +658,6 @@ static size_t diff_timestamp_len(const char *line, size_t len) return line + len - end; } -static char *null_strdup(const char *s) -{ - return s ? xstrdup(s) : NULL; -} - static char *find_name_common(const char *line, const char *def, int p_value, const char *end, int terminate) { @@ -684,10 +680,10 @@ static char *find_name_common(const char *line, const char *def, start = line; } if (!start) - return squash_slash(null_strdup(def)); + return squash_slash(xstrdup_or_null(def)); len = line - start; if (!len) - return squash_slash(null_strdup(def)); + return squash_slash(xstrdup_or_null(def)); /* * Generally we prefer the shorter name, especially @@ -909,7 +905,7 @@ static void parse_traditional_patch(const char *first, const char *second, struc patch->old_name = name; } else { patch->old_name = name; - patch->new_name = null_strdup(name); + patch->new_name = xstrdup_or_null(name); } } if (!name) @@ -998,7 +994,7 @@ static int gitdiff_delete(const char *line, struct patch *patch) { patch->is_delete = 1; free(patch->old_name); - patch->old_name = null_strdup(patch->def_name); + patch->old_name = xstrdup_or_null(patch->def_name); return gitdiff_oldmode(line, patch); } @@ -1006,7 +1002,7 @@ static int gitdiff_newfile(const char *line, struct patch *patch) { patch->is_new = 1; free(patch->new_name); - patch->new_name = null_strdup(patch->def_name); + patch->new_name = xstrdup_or_null(patch->def_name); return gitdiff_newmode(line, patch); } @@ -1605,6 +1601,9 @@ static int parse_fragment(const char *line, unsigned long size, if (!deleted && !added) leading++; trailing++; + if (!apply_in_reverse && + ws_error_action == correct_ws_error) + check_whitespace(line, len, patch->ws_rule); break; case '-': if (apply_in_reverse && @@ -2235,6 +2234,12 @@ static void update_pre_post_images(struct image *preimage, ctx++; } + if (postlen + ? postlen < new - postimage->buf + : postimage->len < new - postimage->buf) + die("BUG: caller miscounted postlen: asked %d, orig = %d, used = %d", + (int)postlen, (int) postimage->len, (int)(new - postimage->buf)); + /* Fix the length of the whole thing */ postimage->len = new - postimage->buf; postimage->nr -= reduced; @@ -2390,10 +2395,27 @@ static int match_fragment(struct image *img, /* * The hunk does not apply byte-by-byte, but the hash says - * it might with whitespace fuzz. We haven't been asked to + * it might with whitespace fuzz. We weren't asked to * ignore whitespace, we were asked to correct whitespace * errors, so let's try matching after whitespace correction. * + * While checking the preimage against the target, whitespace + * errors in both fixed, we count how large the corresponding + * postimage needs to be. The postimage prepared by + * apply_one_fragment() has whitespace errors fixed on added + * lines already, but the common lines were propagated as-is, + * which may become longer when their whitespace errors are + * fixed. + */ + + /* First count added lines in postimage */ + postlen = 0; + for (i = 0; i < postimage->nr; i++) { + if (!(postimage->line[i].flag & LINE_COMMON)) + postlen += postimage->line[i].len; + } + + /* * The preimage may extend beyond the end of the file, * but in this loop we will only handle the part of the * preimage that falls within the file. @@ -2401,7 +2423,6 @@ static int match_fragment(struct image *img, strbuf_init(&fixed, preimage->len + 1); orig = preimage->buf; target = img->buf + try; - postlen = 0; for (i = 0; i < preimage_limit; i++) { size_t oldlen = preimage->line[i].len; size_t tgtlen = img->line[try_lno + i].len; @@ -2429,7 +2450,10 @@ static int match_fragment(struct image *img, match = (tgtfix.len == fixed.len - fixstart && !memcmp(tgtfix.buf, fixed.buf + fixstart, fixed.len - fixstart)); - postlen += tgtfix.len; + + /* Add the length if this is common with the postimage */ + if (preimage->line[i].flag & LINE_COMMON) + postlen += tgtfix.len; strbuf_release(&tgtfix); if (!match) @@ -3201,7 +3225,7 @@ static int load_patch_target(struct strbuf *buf, const char *name, unsigned expected_mode) { - if (cached) { + if (cached || check_index) { if (read_file_or_gitlink(ce, buf)) return error(_("read of %s failed"), name); } else if (name) { @@ -3210,6 +3234,8 @@ static int load_patch_target(struct strbuf *buf, return read_file_or_gitlink(ce, buf); else return SUBMODULE_PATCH_WITHOUT_INDEX; + } else if (has_symlink_leading_path(name, strlen(name))) { + return error(_("reading from '%s' beyond a symbolic link"), name); } else { if (read_old_data(st, name, buf)) return error(_("read of %s failed"), name); @@ -3550,6 +3576,121 @@ static int check_to_create(const char *new_name, int ok_if_exists) } /* + * We need to keep track of how symlinks in the preimage are + * manipulated by the patches. A patch to add a/b/c where a/b + * is a symlink should not be allowed to affect the directory + * the symlink points at, but if the same patch removes a/b, + * it is perfectly fine, as the patch removes a/b to make room + * to create a directory a/b so that a/b/c can be created. + */ +static struct string_list symlink_changes; +#define SYMLINK_GOES_AWAY 01 +#define SYMLINK_IN_RESULT 02 + +static uintptr_t register_symlink_changes(const char *path, uintptr_t what) +{ + struct string_list_item *ent; + + ent = string_list_lookup(&symlink_changes, path); + if (!ent) { + ent = string_list_insert(&symlink_changes, path); + ent->util = (void *)0; + } + ent->util = (void *)(what | ((uintptr_t)ent->util)); + return (uintptr_t)ent->util; +} + +static uintptr_t check_symlink_changes(const char *path) +{ + struct string_list_item *ent; + + ent = string_list_lookup(&symlink_changes, path); + if (!ent) + return 0; + return (uintptr_t)ent->util; +} + +static void prepare_symlink_changes(struct patch *patch) +{ + for ( ; patch; patch = patch->next) { + if ((patch->old_name && S_ISLNK(patch->old_mode)) && + (patch->is_rename || patch->is_delete)) + /* the symlink at patch->old_name is removed */ + register_symlink_changes(patch->old_name, SYMLINK_GOES_AWAY); + + if (patch->new_name && S_ISLNK(patch->new_mode)) + /* the symlink at patch->new_name is created or remains */ + register_symlink_changes(patch->new_name, SYMLINK_IN_RESULT); + } +} + +static int path_is_beyond_symlink_1(struct strbuf *name) +{ + do { + unsigned int change; + + while (--name->len && name->buf[name->len] != '/') + ; /* scan backwards */ + if (!name->len) + break; + name->buf[name->len] = '\0'; + change = check_symlink_changes(name->buf); + if (change & SYMLINK_IN_RESULT) + return 1; + if (change & SYMLINK_GOES_AWAY) + /* + * This cannot be "return 0", because we may + * see a new one created at a higher level. + */ + continue; + + /* otherwise, check the preimage */ + if (check_index) { + struct cache_entry *ce; + + ce = cache_file_exists(name->buf, name->len, ignore_case); + if (ce && S_ISLNK(ce->ce_mode)) + return 1; + } else { + struct stat st; + if (!lstat(name->buf, &st) && S_ISLNK(st.st_mode)) + return 1; + } + } while (1); + return 0; +} + +static int path_is_beyond_symlink(const char *name_) +{ + int ret; + struct strbuf name = STRBUF_INIT; + + assert(*name_ != '\0'); + strbuf_addstr(&name, name_); + ret = path_is_beyond_symlink_1(&name); + strbuf_release(&name); + + return ret; +} + +static void die_on_unsafe_path(struct patch *patch) +{ + const char *old_name = NULL; + const char *new_name = NULL; + if (patch->is_delete) + old_name = patch->old_name; + else if (!patch->is_new && !patch->is_copy) + old_name = patch->old_name; + if (!patch->is_delete) + new_name = patch->new_name; + + if (old_name && !verify_path(old_name)) + die(_("invalid path '%s'"), old_name); + if (new_name && !verify_path(new_name)) + die(_("invalid path '%s'"), new_name); +} + +/* * Check and apply the patch in-core; leave the result in patch->result * for the caller to write it out to the final destination. */ @@ -3636,6 +3777,22 @@ static int check_patch(struct patch *patch) } } + if (!unsafe_paths) + die_on_unsafe_path(patch); + + /* + * An attempt to read from or delete a path that is beyond a + * symbolic link will be prevented by load_patch_target() that + * is called at the beginning of apply_data() so we do not + * have to worry about a patch marked with "is_delete" bit + * here. We however need to make sure that the patch result + * is not deposited to a path that is beyond a symbolic link + * here. + */ + if (!patch->is_delete && path_is_beyond_symlink(patch->new_name)) + return error(_("affected file '%s' is beyond a symbolic link"), + patch->new_name); + if (apply_data(patch, &st, ce) < 0) return error(_("%s: patch does not apply"), name); patch->rejected = 0; @@ -3646,6 +3803,7 @@ static int check_patch_list(struct patch *patch) { int err = 0; + prepare_symlink_changes(patch); prepare_fn_table(patch); while (patch) { if (apply_verbosely) @@ -4384,6 +4542,8 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) N_("make sure the patch is applicable to the current index")), OPT_BOOL(0, "cached", &cached, N_("apply a patch without touching the working tree")), + OPT_BOOL(0, "unsafe-paths", &unsafe_paths, + N_("accept a patch that touches outside the working area")), OPT_BOOL(0, "apply", &force_apply, N_("also apply the patch (use with --stat/--summary/--check)")), OPT_BOOL('3', "3way", &threeway, @@ -4456,6 +4616,9 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) die(_("--cached outside a repository")); check_index = 1; } + if (check_index) + unsafe_paths = 0; + for (i = 0; i < argc; i++) { const char *arg = argv[i]; int fd; diff --git a/builtin/blame.c b/builtin/blame.c index 303e217ae9..06484c2e0e 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -27,12 +27,12 @@ #include "line-range.h" #include "line-log.h" -static char blame_usage[] = N_("git blame [options] [rev-opts] [rev] [--] file"); +static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] file"); static const char *blame_opt_usage[] = { blame_usage, "", - N_("[rev-opts] are documented in git-rev-list(1)"), + N_("<rev-opts> are documented in git-rev-list(1)"), NULL }; @@ -2085,7 +2085,6 @@ static void find_alignment(struct scoreboard *sb, int *option) for (e = sb->ent; e; e = e->next) { struct origin *suspect = e->suspect; - struct commit_info ci; int num; if (compute_auto_abbrev) @@ -2096,6 +2095,7 @@ static void find_alignment(struct scoreboard *sb, int *option) if (longest_file < num) longest_file = num; if (!(suspect->commit->object.flags & METAINFO_SHOWN)) { + struct commit_info ci; suspect->commit->object.flags |= METAINFO_SHOWN; get_commit_info(suspect->commit, &ci, 1); if (*option & OUTPUT_SHOW_EMAIL) @@ -2104,6 +2104,7 @@ static void find_alignment(struct scoreboard *sb, int *option) num = utf8_strwidth(ci.author.buf); if (longest_author < num) longest_author = num; + commit_info_destroy(&ci); } num = e->s_lno + e->num_lines; if (longest_src_lines < num) @@ -2113,8 +2114,6 @@ static void find_alignment(struct scoreboard *sb, int *option) longest_dst_lines = num; if (largest_score < ent_score(sb, e)) largest_score = ent_score(sb, e); - - commit_info_destroy(&ci); } max_orig_digits = decimal_width(longest_src_lines); max_digits = decimal_width(longest_dst_lines); @@ -2390,7 +2389,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt, return commit; } -static const char *prepare_final(struct scoreboard *sb) +static char *prepare_final(struct scoreboard *sb) { int i; const char *final_commit_name = NULL; @@ -2415,10 +2414,10 @@ static const char *prepare_final(struct scoreboard *sb) sb->final = (struct commit *) obj; final_commit_name = revs->pending.objects[i].name; } - return final_commit_name; + return xstrdup_or_null(final_commit_name); } -static const char *prepare_initial(struct scoreboard *sb) +static char *prepare_initial(struct scoreboard *sb) { int i; const char *final_commit_name = NULL; @@ -2445,7 +2444,7 @@ static const char *prepare_initial(struct scoreboard *sb) } if (!final_commit_name) die("No commit to dig down to?"); - return final_commit_name; + return xstrdup(final_commit_name); } static int blame_copy_callback(const struct option *option, const char *arg, int unset) @@ -2489,7 +2488,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) struct origin *o; struct blame_entry *ent = NULL; long dashdash_pos, lno; - const char *final_commit_name = NULL; + char *final_commit_name = NULL; enum object_type type; static struct string_list range_list; @@ -2786,6 +2785,8 @@ parse_done: assign_blame(&sb, opt); + free(final_commit_name); + if (incremental) return 0; diff --git a/builtin/branch.c b/builtin/branch.c index dc6f0b266c..1d150378e9 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -21,10 +21,10 @@ #include "wt-status.h" static const char * const builtin_branch_usage[] = { - N_("git branch [options] [-r | -a] [--merged | --no-merged]"), - N_("git branch [options] [-l] [-f] <branchname> [<start-point>]"), - N_("git branch [options] [-r] (-d | -D) <branchname>..."), - N_("git branch [options] (-m | -M) [<oldbranch>] <newbranch>"), + N_("git branch [<options>] [-r | -a] [--merged | --no-merged]"), + N_("git branch [<options>] [-l] [-f] <branch-name> [<start-point>]"), + N_("git branch [<options>] [-r] (-d | -D) <branch-name>..."), + N_("git branch [<options>] (-m | -M) [<old-branch>] <new-branch>"), NULL }; @@ -589,9 +589,16 @@ static char *get_head_description(void) else if (state.bisect_in_progress) strbuf_addf(&desc, _("(no branch, bisect started on %s)"), state.branch); - else if (state.detached_from) - strbuf_addf(&desc, _("(detached from %s)"), - state.detached_from); + else if (state.detached_from) { + /* TRANSLATORS: make sure these match _("HEAD detached at ") + and _("HEAD detached from ") in wt-status.c */ + if (state.detached_at) + strbuf_addf(&desc, _("(HEAD detached at %s)"), + state.detached_from); + else + strbuf_addf(&desc, _("(HEAD detached from %s)"), + state.detached_from); + } else strbuf_addstr(&desc, _("(no branch)")); free(state.branch); diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 31b133b357..df99df4db1 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -323,8 +323,8 @@ static int batch_objects(struct batch_options *opt) } static const char * const cat_file_usage[] = { - N_("git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"), - N_("git cat-file (--batch|--batch-check) < <list_of_objects>"), + N_("git cat-file (-t | -s | -e | -p | <type> | --textconv) <object>"), + N_("git cat-file (--batch | --batch-check) < <list-of-objects>"), NULL }; diff --git a/builtin/check-attr.c b/builtin/check-attr.c index 5600ec3f61..21d2bedcc9 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -8,8 +8,8 @@ static int all_attrs; static int cached_attrs; static int stdin_paths; static const char * const check_attr_usage[] = { -N_("git check-attr [-a | --all | attr...] [--] pathname..."), -N_("git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"), +N_("git check-attr [-a | --all | <attr>...] [--] <pathname>..."), +N_("git check-attr --stdin [-z] [-a | --all | <attr>...] < <list-of-paths>"), NULL }; diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 594463a11b..dc8d97c56c 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -7,8 +7,8 @@ static int quiet, verbose, stdin_paths, show_non_matching, no_index; static const char * const check_ignore_usage[] = { -"git check-ignore [options] pathname...", -"git check-ignore [options] --stdin < <list-of-paths>", +"git check-ignore [<options>] <pathname>...", +"git check-ignore [<options>] --stdin < <list-of-paths>", NULL }; diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c index 8f4d809bd8..eaaea546d3 100644 --- a/builtin/check-mailmap.c +++ b/builtin/check-mailmap.c @@ -5,7 +5,7 @@ static int use_stdin; static const char * const check_mailmap_usage[] = { -N_("git check-mailmap [options] <contact>..."), +N_("git check-mailmap [<options>] <contact>..."), NULL }; diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c index 28a7320271..fd915d5984 100644 --- a/builtin/check-ref-format.c +++ b/builtin/check-ref-format.c @@ -8,7 +8,7 @@ #include "strbuf.h" static const char builtin_check_ref_format_usage[] = -"git check-ref-format [--normalize] [options] <refname>\n" +"git check-ref-format [--normalize] [<options>] <refname>\n" " or: git check-ref-format --branch <branchname-shorthand>"; /* diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 031780f49e..9ca2da1583 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -123,7 +123,7 @@ static void checkout_all(const char *prefix, int prefix_length) } static const char * const builtin_checkout_index_usage[] = { - N_("git checkout-index [options] [--] [<file>...]"), + N_("git checkout-index [<options>] [--] [<file>...]"), NULL }; diff --git a/builtin/checkout.c b/builtin/checkout.c index 52d6cbb0a8..3e141fc149 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -22,8 +22,8 @@ #include "argv-array.h" static const char * const checkout_usage[] = { - N_("git checkout [options] <branch>"), - N_("git checkout [options] [<branch>] -- <file>..."), + N_("git checkout [<options>] <branch>"), + N_("git checkout [<options>] [<branch>] -- <file>..."), NULL, }; @@ -746,7 +746,7 @@ static void suggest_reattach(struct commit *commit, struct rev_info *revs) _( "If you want to keep them by creating a new branch, " "this may be a good time\nto do so with:\n\n" - " git branch new_branch_name %s\n\n"), + " git branch <new-branch-name> %s\n\n"), find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV)); } @@ -1127,7 +1127,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) OPT_BOOL(0, "ignore-skip-worktree-bits", &opts.ignore_skipworktree, N_("do not limit pathspecs to sparse entries only")), OPT_HIDDEN_BOOL(0, "guess", &dwim_new_local_branch, - N_("second guess 'git checkout no-such-branch'")), + N_("second guess 'git checkout <no-such-branch>'")), OPT_END(), }; diff --git a/builtin/clean.c b/builtin/clean.c index 7e7fdcfe54..98c103fa8b 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -754,7 +754,8 @@ static int ask_each_cmd(void) /* Ctrl-D should stop removing files */ if (!eof) { qname = quote_path_relative(item->string, NULL, &buf); - printf(_("remove %s? "), qname); + /* TRANSLATORS: Make sure to keep [y/N] as is */ + printf(_("Remove %s [y/N]? "), qname); if (strbuf_getline(&confirm, stdin, '\n') != EOF) { strbuf_trim(&confirm); } else { diff --git a/builtin/clone.c b/builtin/clone.c index 316c75d0b3..53a2e5af35 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -34,7 +34,7 @@ * */ static const char * const builtin_clone_usage[] = { - N_("git clone [options] [--] <repo> [<dir>]"), + N_("git clone [<options>] [--] <repo> [<dir>]"), NULL }; @@ -842,20 +842,21 @@ int cmd_clone(int argc, const char **argv, const char *prefix) git_dir = mkpathdup("%s/.git", dir); } + atexit(remove_junk); + sigchain_push_common(remove_junk_on_signal); + if (!option_bare) { - junk_work_tree = work_tree; if (safe_create_leading_directories_const(work_tree) < 0) die_errno(_("could not create leading directories of '%s'"), work_tree); if (!dest_exists && mkdir(work_tree, 0777)) - die_errno(_("could not create work tree dir '%s'."), + die_errno(_("could not create work tree dir '%s'"), work_tree); + junk_work_tree = work_tree; set_git_work_tree(work_tree); } - junk_git_dir = git_dir; - atexit(remove_junk); - sigchain_push_common(remove_junk_on_signal); + junk_git_dir = git_dir; if (safe_create_leading_directories_const(git_dir) < 0) die(_("could not create leading directories of '%s'"), git_dir); diff --git a/builtin/column.c b/builtin/column.c index 75818520e1..449413c8a8 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -6,7 +6,7 @@ #include "column.h" static const char * const builtin_column_usage[] = { - N_("git column [options]"), + N_("git column [<options>]"), NULL }; static unsigned int colopts; diff --git a/builtin/commit.c b/builtin/commit.c index 7d90c35915..961e467242 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -34,12 +34,12 @@ #include "mailmap.h" static const char * const builtin_commit_usage[] = { - N_("git commit [options] [--] <pathspec>..."), + N_("git commit [<options>] [--] <pathspec>..."), NULL }; static const char * const builtin_status_usage[] = { - N_("git status [options] [--] <pathspec>..."), + N_("git status [<options>] [--] <pathspec>..."), NULL }; @@ -559,20 +559,14 @@ static void set_ident_var(char **buf, char *val) *buf = val; } -static char *envdup(const char *var) -{ - const char *val = getenv(var); - return val ? xstrdup(val) : NULL; -} - static void determine_author_info(struct strbuf *author_ident) { char *name, *email, *date; struct ident_split author; - name = envdup("GIT_AUTHOR_NAME"); - email = envdup("GIT_AUTHOR_EMAIL"); - date = envdup("GIT_AUTHOR_DATE"); + name = xstrdup_or_null(getenv("GIT_AUTHOR_NAME")); + email = xstrdup_or_null(getenv("GIT_AUTHOR_EMAIL")); + date = xstrdup_or_null(getenv("GIT_AUTHOR_DATE")); if (author_message) { struct ident_split ident; @@ -1056,7 +1050,7 @@ static const char *find_author_by_nickname(const char *name) clear_mailmap(&mailmap); return strbuf_detach(&buf, NULL); } - die(_("No existing author found with '%s'"), name); + die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name); } @@ -1772,8 +1766,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (!transaction || ref_transaction_update(transaction, "HEAD", sha1, current_head - ? current_head->object.sha1 : NULL, - 0, !!current_head, sb.buf, &err) || + ? current_head->object.sha1 : null_sha1, + 0, sb.buf, &err) || ref_transaction_commit(transaction, &err)) { rollback_index_files(); die("%s", err.buf); diff --git a/builtin/config.c b/builtin/config.c index 15a7bea936..d32c5327e5 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -5,7 +5,7 @@ #include "urlmatch.h" static const char *const builtin_config_usage[] = { - N_("git config [options]"), + N_("git config [<options>]"), NULL }; diff --git a/builtin/describe.c b/builtin/describe.c index 9103193b4f..e00a75b121 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -14,8 +14,8 @@ #define MAX_TAGS (FLAG_BITS - 1) static const char * const describe_usage[] = { - N_("git describe [options] <commit-ish>*"), - N_("git describe [options] --dirty"), + N_("git describe [<options>] [<commit-ish>...]"), + N_("git describe [<options>] --dirty"), NULL }; diff --git a/builtin/diff-files.c b/builtin/diff-files.c index 9200069363..8ed2eb8813 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c @@ -11,7 +11,7 @@ #include "submodule.h" static const char diff_files_usage[] = -"git diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]" +"git diff-files [-q] [-0 | -1 | -2 | -3 | -c | --cc] [<common-diff-options>] [<path>...]" COMMON_DIFF_OPTIONS_HELP; int cmd_diff_files(int argc, const char **argv, const char *prefix) diff --git a/builtin/diff-index.c b/builtin/diff-index.c index ce15b23042..d979824f93 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -7,7 +7,7 @@ static const char diff_cache_usage[] = "git diff-index [-m] [--cached] " -"[<common diff options>] <tree-ish> [<path>...]" +"[<common-diff-options>] <tree-ish> [<path>...]" COMMON_DIFF_OPTIONS_HELP; int cmd_diff_index(int argc, const char **argv, const char *prefix) diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index 1c4ad6223e..12b683d021 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -82,7 +82,7 @@ static int diff_tree_stdin(char *line) static const char diff_tree_usage[] = "git diff-tree [--stdin] [-m] [-c] [--cc] [-s] [-v] [--pretty] [-t] [-r] [--root] " -"[<common diff options>] <tree-ish> [<tree-ish>] [<path>...]\n" +"[<common-diff-options>] <tree-ish> [<tree-ish>] [<path>...]\n" " -r diff recursively\n" " --root include the initial commit as diff against /dev/null\n" COMMON_DIFF_OPTIONS_HELP; diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index 1262b405f8..4a6b340ab6 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -6,7 +6,7 @@ #include "sha1-array.h" static const char fetch_pack_usage[] = -"git fetch-pack [--all] [--stdin] [--quiet|-q] [--keep|-k] [--thin] " +"git fetch-pack [--all] [--stdin] [--quiet | -q] [--keep | -k] [--thin] " "[--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] " "[--no-progress] [--diag-url] [-v] [<host>:]<directory> [<refs>...]"; diff --git a/builtin/fetch.c b/builtin/fetch.c index 7b84d35d83..f9512652cf 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -11,7 +11,6 @@ #include "run-command.h" #include "parse-options.h" #include "sigchain.h" -#include "transport.h" #include "submodule.h" #include "connected.h" #include "argv-array.h" @@ -416,8 +415,10 @@ static int s_update_ref(const char *action, transaction = ref_transaction_begin(&err); if (!transaction || - ref_transaction_update(transaction, ref->name, ref->new_sha1, - ref->old_sha1, 0, check_old, msg, &err)) + ref_transaction_update(transaction, ref->name, + ref->new_sha1, + check_old ? ref->old_sha1 : NULL, + 0, msg, &err)) goto fail; ret = ref_transaction_commit(transaction, &err); diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index af7919e51e..1d962dc569 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -10,7 +10,7 @@ #include "gpg-interface.h" static const char * const fmt_merge_msg_usage[] = { - N_("git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"), + N_("git fmt-merge-msg [-m <message>] [--log[=<n>] | --no-log] [--file <file>]"), NULL }; diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index a0123f6146..83f9cf9163 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -178,11 +178,10 @@ static const char *find_next(const char *cp) static int verify_format(const char *format) { const char *cp, *sp; - static const char color_reset[] = "color:reset"; need_color_reset_at_eol = 0; for (cp = format; *cp && (sp = find_next(cp)); ) { - const char *ep = strchr(sp, ')'); + const char *color, *ep = strchr(sp, ')'); int at; if (!ep) @@ -191,8 +190,8 @@ static int verify_format(const char *format) at = parse_atom(sp + 2, ep); cp = ep + 1; - if (starts_with(used_atom[at], "color:")) - need_color_reset_at_eol = !!strcmp(used_atom[at], color_reset); + if (skip_prefix(used_atom[at], "color:", &color)) + need_color_reset_at_eol = !!strcmp(color, "reset"); } return 0; } @@ -1061,7 +1060,7 @@ static int opt_parse_sort(const struct option *opt, const char *arg, int unset) } static char const * const for_each_ref_usage[] = { - N_("git for-each-ref [options] [<pattern>]"), + N_("git for-each-ref [<options>] [<pattern>]"), NULL }; diff --git a/builtin/fsck.c b/builtin/fsck.c index a27515aeaa..0c757862e8 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -600,7 +600,7 @@ static int fsck_cache_tree(struct cache_tree *it) } static char const * const fsck_usage[] = { - N_("git fsck [options] [<object>...]"), + N_("git fsck [<options>] [<object>...]"), NULL }; diff --git a/builtin/gc.c b/builtin/gc.c index 005adbebea..5c634afc00 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -21,7 +21,7 @@ #define FAILED_RUN "failed to run %s" static const char * const builtin_gc_usage[] = { - N_("git gc [options]"), + N_("git gc [<options>]"), NULL }; diff --git a/builtin/grep.c b/builtin/grep.c index 4063882f06..abc440023f 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -20,7 +20,7 @@ #include "pathspec.h" static char const * const grep_usage[] = { - N_("git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"), + N_("git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"), NULL }; @@ -641,7 +641,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) OPT_BOOL(0, "untracked", &untracked, N_("search in both tracked and untracked files")), OPT_SET_INT(0, "exclude-standard", &opt_exclude, - N_("search also in ignored files"), 1), + N_("ignore files specified via '.gitignore'"), 1), OPT_GROUP(""), OPT_BOOL('v', "invert-match", &opt.invert, N_("show non-matching lines")), @@ -885,7 +885,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) } } - if (!show_in_pager) + if (!show_in_pager && !opt.status_only) setup_pager(); if (!use_index && (untracked || cached)) diff --git a/builtin/hash-object.c b/builtin/hash-object.c index 6158363318..207b90c7b1 100644 --- a/builtin/hash-object.c +++ b/builtin/hash-object.c @@ -79,7 +79,7 @@ static void hash_stdin_paths(const char *type, int no_filters, unsigned flags, int cmd_hash_object(int argc, const char **argv, const char *prefix) { static const char * const hash_object_usage[] = { - N_("git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>..."), + N_("git hash-object [-t <type>] [-w] [--path=<file> | --no-filters] [--stdin] [--] <file>..."), N_("git hash-object --stdin-paths < <list-of-paths>"), NULL }; diff --git a/builtin/help.c b/builtin/help.c index e78c135e01..3422e73079 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -49,7 +49,7 @@ static struct option builtin_help_options[] = { }; static const char * const builtin_help_usage[] = { - N_("git help [--all] [--guides] [--man|--web|--info] [command]"), + N_("git help [--all] [--guides] [--man | --web | --info] [<command>]"), NULL }; @@ -171,7 +171,7 @@ static void exec_man_cmd(const char *cmd, const char *page) { struct strbuf shell_cmd = STRBUF_INIT; strbuf_addf(&shell_cmd, "%s %s", cmd, page); - execl("/bin/sh", "sh", "-c", shell_cmd.buf, (char *)NULL); + execl(SHELL_PATH, SHELL_PATH, "-c", shell_cmd.buf, (char *)NULL); warning(_("failed to exec '%s': %s"), cmd, strerror(errno)); } @@ -456,7 +456,7 @@ static void list_common_guides_help(void) int cmd_help(int argc, const char **argv, const char *prefix) { int nongit; - const char *alias; + char *alias; enum help_format parsed_help_format; argc = parse_options(argc, argv, prefix, builtin_help_options, @@ -499,6 +499,7 @@ int cmd_help(int argc, const char **argv, const char *prefix) alias = alias_lookup(argv[0]); if (alias && !is_git_command(argv[0])) { printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias); + free(alias); return 0; } diff --git a/builtin/index-pack.c b/builtin/index-pack.c index 4632117671..cf654df09b 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -1204,7 +1204,6 @@ static int write_compressed(struct sha1file *f, void *in, unsigned int size) int status; unsigned char outbuf[4096]; - memset(&stream, 0, sizeof(stream)); git_deflate_init(&stream, zlib_compression_level); stream.next_in = in; stream.avail_in = size; diff --git a/builtin/init-db.c b/builtin/init-db.c index 9966522b4a..6723d39c3b 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -472,7 +472,7 @@ static int shared_callback(const struct option *opt, const char *arg, int unset) } static const char *const init_db_usage[] = { - N_("git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [directory]"), + N_("git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [<directory>]"), NULL }; diff --git a/builtin/log.c b/builtin/log.c index 923ffe72ce..dd8f3fcfc4 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -39,7 +39,7 @@ static const char *fmt_pretty; static const char * const builtin_log_usage[] = { N_("git log [<options>] [<revision range>] [[--] <path>...]"), - N_("git show [options] <object>..."), + N_("git show [<options>] <object>..."), NULL }; @@ -705,7 +705,7 @@ static int git_format_config(const char *var, const char *value, void *cb) return 0; } if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff") || - !strcmp(var, "color.ui")) { + !strcmp(var, "color.ui") || !strcmp(var, "diff.submodule")) { return 0; } if (!strcmp(var, "format.numbered")) { @@ -1023,7 +1023,7 @@ static const char *set_outdir(const char *prefix, const char *output_directory) } static const char * const builtin_format_patch_usage[] = { - N_("git format-patch [options] [<since> | <revision range>]"), + N_("git format-patch [<options>] [<since> | <revision-range>]"), NULL }; diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 99cee20fb0..914054d367 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -398,7 +398,7 @@ int report_path_error(const char *ps_matched, } static const char * const ls_files_usage[] = { - N_("git ls-files [options] [<file>...]"), + N_("git ls-files [<options>] [<file>...]"), NULL }; diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index b2a4b92992..4554dbc8a9 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -5,7 +5,7 @@ static const char ls_remote_usage[] = "git ls-remote [--heads] [--tags] [-u <exec> | --upload-pack <exec>]\n" -" [-q|--quiet] [--exit-code] [--get-url] [<repository> [<refs>...]]"; +" [-q | --quiet] [--exit-code] [--get-url] [<repository> [<refs>...]]"; /* * Is there one among the list of patterns that match the tail part diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index c8a47c173d..999a5250fb 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -1031,7 +1031,7 @@ static int git_mailinfo_config(const char *var, const char *value, void *unused) } static const char mailinfo_usage[] = - "git mailinfo [-k|-b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] msg patch < mail >info"; + "git mailinfo [-k | -b] [-m | --message-id] [-u | --encoding=<encoding> | -n] [--scissors | --no-scissors] <msg> <patch> < mail >info"; int cmd_mailinfo(int argc, const char **argv, const char *prefix) { diff --git a/builtin/merge-base.c b/builtin/merge-base.c index fdebef6fa1..08a8217890 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -26,8 +26,8 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all) } static const char * const merge_base_usage[] = { - N_("git merge-base [-a|--all] <commit> <commit>..."), - N_("git merge-base [-a|--all] --octopus <commit>..."), + N_("git merge-base [-a | --all] <commit> <commit>..."), + N_("git merge-base [-a | --all] --octopus <commit>..."), N_("git merge-base --independent <commit>..."), N_("git merge-base --is-ancestor <commit> <commit>"), N_("git merge-base --fork-point <ref> [<commit>]"), diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 844f84f40b..ea8093f676 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -5,7 +5,7 @@ #include "parse-options.h" static const char *const merge_file_usage[] = { - N_("git merge-file [options] [-L name1 [-L orig [-L name2]]] file1 orig_file file2"), + N_("git merge-file [<options>] [-L <name1> [-L <orig> [-L <name2>]]] <file1> <orig-file> <file2>"), NULL }; @@ -42,7 +42,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) N_("for conflicts, use this marker size")), OPT__QUIET(&quiet, N_("do not warn about conflicts")), OPT_CALLBACK('L', NULL, names, N_("name"), - N_("set labels for file1/orig_file/file2"), &label_cb), + N_("set labels for file1/orig-file/file2"), &label_cb), OPT_END(), }; @@ -90,7 +90,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) if (ret >= 0) { const char *filename = argv[0]; - FILE *f = to_stdout ? stdout : fopen(filename, "wb"); + const char *fpath = prefix_filename(prefix, prefixlen, argv[0]); + FILE *f = to_stdout ? stdout : fopen(fpath, "wb"); if (!f) ret = error("Could not open %s for writing", filename); diff --git a/builtin/merge-index.c b/builtin/merge-index.c index b416d92849..1a1eafa6fd 100644 --- a/builtin/merge-index.c +++ b/builtin/merge-index.c @@ -75,7 +75,7 @@ int cmd_merge_index(int argc, const char **argv, const char *prefix) signal(SIGCHLD, SIG_DFL); if (argc < 3) - usage("git merge-index [-o] [-q] <merge-program> (-a | [--] <filename>*)"); + usage("git merge-index [-o] [-q] <merge-program> (-a | [--] [<filename>...])"); read_cache(); diff --git a/builtin/merge.c b/builtin/merge.c index c638fd5a9a..3b0f8f96d4 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -42,8 +42,8 @@ struct strategy { }; static const char * const builtin_merge_usage[] = { - N_("git merge [options] [<commit>...]"), - N_("git merge [options] <msg> HEAD <commit>"), + N_("git merge [<options>] [<commit>...]"), + N_("git merge [<options>] <msg> HEAD <commit>"), N_("git merge --abort"), NULL }; diff --git a/builtin/mv.c b/builtin/mv.c index 563d05ba1a..d1d43168ae 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -12,7 +12,7 @@ #include "submodule.h" static const char * const builtin_mv_usage[] = { - N_("git mv [options] <source>... <destination>"), + N_("git mv [<options>] <source>... <destination>"), NULL }; diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 3c8f319be6..9736d4452f 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -252,9 +252,9 @@ static void show_name(const struct object *obj, } static char const * const name_rev_usage[] = { - N_("git name-rev [options] <commit>..."), - N_("git name-rev [options] --all"), - N_("git name-rev [options] --stdin"), + N_("git name-rev [<options>] <commit>..."), + N_("git name-rev [<options>] --all"), + N_("git name-rev [<options>] --stdin"), NULL }; diff --git a/builtin/notes.c b/builtin/notes.c index a9f37d0456..63f95fc554 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -21,18 +21,18 @@ #include "notes-utils.h" static const char * const git_notes_usage[] = { - N_("git notes [--ref <notes_ref>] [list [<object>]]"), - N_("git notes [--ref <notes_ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"), - N_("git notes [--ref <notes_ref>] copy [-f] <from-object> <to-object>"), - N_("git notes [--ref <notes_ref>] append [--allow-empty] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"), - N_("git notes [--ref <notes_ref>] edit [--allow-empty] [<object>]"), - N_("git notes [--ref <notes_ref>] show [<object>]"), - N_("git notes [--ref <notes_ref>] merge [-v | -q] [-s <strategy> ] <notes_ref>"), + N_("git notes [--ref <notes-ref>] [list [<object>]]"), + N_("git notes [--ref <notes-ref>] add [-f] [--allow-empty] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"), + N_("git notes [--ref <notes-ref>] copy [-f] <from-object> <to-object>"), + N_("git notes [--ref <notes-ref>] append [--allow-empty] [-m <msg> | -F <file> | (-c | -C) <object>] [<object>]"), + N_("git notes [--ref <notes-ref>] edit [--allow-empty] [<object>]"), + N_("git notes [--ref <notes-ref>] show [<object>]"), + N_("git notes [--ref <notes-ref>] merge [-v | -q] [-s <strategy>] <notes-ref>"), N_("git notes merge --commit [-v | -q]"), N_("git notes merge --abort [-v | -q]"), - N_("git notes [--ref <notes_ref>] remove [<object>...]"), - N_("git notes [--ref <notes_ref>] prune [-n | -v]"), - N_("git notes [--ref <notes_ref>] get-ref"), + N_("git notes [--ref <notes-ref>] remove [<object>...]"), + N_("git notes [--ref <notes-ref>] prune [-n | -v]"), + N_("git notes [--ref <notes-ref>] get-ref"), NULL }; @@ -68,7 +68,7 @@ static const char * const git_notes_show_usage[] = { }; static const char * const git_notes_merge_usage[] = { - N_("git notes merge [<options>] <notes_ref>"), + N_("git notes merge [<options>] <notes-ref>"), N_("git notes merge --commit [<options>]"), N_("git notes merge --abort [<options>]"), NULL @@ -951,7 +951,7 @@ int cmd_notes(int argc, const char **argv, const char *prefix) const char *override_notes_ref = NULL; struct option options[] = { OPT_STRING(0, "ref", &override_notes_ref, N_("notes-ref"), - N_("use notes from <notes_ref>")), + N_("use notes from <notes-ref>")), OPT_END() }; diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index d8165878e1..c3a75166bd 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -125,7 +125,6 @@ static unsigned long do_compress(void **pptr, unsigned long size) void *in, *out; unsigned long maxsize; - memset(&stream, 0, sizeof(stream)); git_deflate_init(&stream, pack_compression_level); maxsize = git_deflate_bound(&stream, size); @@ -153,7 +152,6 @@ static unsigned long write_large_blob_data(struct git_istream *st, struct sha1fi unsigned char obuf[1024 * 16]; unsigned long olen = 0; - memset(&stream, 0, sizeof(stream)); git_deflate_init(&stream, pack_compression_level); for (;;) { diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c index 649c3aaa93..d0532f66b1 100644 --- a/builtin/pack-redundant.c +++ b/builtin/pack-redundant.c @@ -11,7 +11,7 @@ #define BLKSIZE 512 static const char pack_redundant_usage[] = -"git pack-redundant [ --verbose ] [ --alt-odb ] < --all | <.pack filename> ...>"; +"git pack-redundant [--verbose] [--alt-odb] (--all | <filename.pack>...)"; static int load_all_packs, verbose, alt_odb; diff --git a/builtin/pack-refs.c b/builtin/pack-refs.c index b20b1ec4c1..39f9a55d16 100644 --- a/builtin/pack-refs.c +++ b/builtin/pack-refs.c @@ -3,7 +3,7 @@ #include "refs.h" static char const * const pack_refs_usage[] = { - N_("git pack-refs [options]"), + N_("git pack-refs [<options>]"), NULL }; diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c index f24a2c2bdc..7cf900ea07 100644 --- a/builtin/prune-packed.c +++ b/builtin/prune-packed.c @@ -4,7 +4,7 @@ #include "parse-options.h" static const char * const prune_packed_usage[] = { - N_("git prune-packed [-n|--dry-run] [-q|--quiet]"), + N_("git prune-packed [-n | --dry-run] [-q | --quiet]"), NULL }; diff --git a/builtin/prune.c b/builtin/prune.c index 04d3b12ae4..17094ad954 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -115,6 +115,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) expire = ULONG_MAX; save_commit_buffer = 0; check_replace_refs = 0; + ref_paranoia = 1; init_revisions(&revs, prefix); argc = parse_options(argc, argv, prefix, options, prune_usage, 0); diff --git a/builtin/push.c b/builtin/push.c index 12f5e69393..57c138bd7b 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -473,13 +473,22 @@ static int option_parse_recurse_submodules(const struct option *opt, static int git_push_config(const char *k, const char *v, void *cb) { - struct wt_status *s = cb; + int *flags = cb; int status; status = git_gpg_config(k, v, NULL); if (status) return status; - return git_default_config(k, v, s); + + if (!strcmp(k, "push.followtags")) { + if (git_config_bool(k, v)) + *flags |= TRANSPORT_PUSH_FOLLOW_TAGS; + else + *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS; + return 0; + } + + return git_default_config(k, v, NULL); } int cmd_push(int argc, const char **argv, const char *prefix) @@ -518,11 +527,12 @@ int cmd_push(int argc, const char **argv, const char *prefix) OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"), TRANSPORT_PUSH_FOLLOW_TAGS), OPT_BIT(0, "signed", &flags, N_("GPG sign the push"), TRANSPORT_PUSH_CERT), + OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC), OPT_END() }; packet_trace_identity("push"); - git_config(git_push_config, NULL); + git_config(git_push_config, &flags); argc = parse_options(argc, argv, prefix, options, push_usage, 0); if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR)))) diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 8266c1fccf..70e9ce5f96 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -38,9 +38,11 @@ static int receive_fsck_objects = -1; static int transfer_fsck_objects = -1; static int receive_unpack_limit = -1; static int transfer_unpack_limit = -1; +static int advertise_atomic_push = 1; static int unpack_limit = 100; static int report_status; static int use_sideband; +static int use_atomic; static int quiet; static int prefer_ofs_delta = 1; static int auto_update_server_info; @@ -67,6 +69,7 @@ static const char *NONCE_SLOP = "SLOP"; static const char *nonce_status; static long nonce_stamp_slop; static unsigned long nonce_stamp_slop_limit; +static struct ref_transaction *transaction; static enum deny_action parse_deny_action(const char *var, const char *value) { @@ -160,6 +163,11 @@ static int receive_pack_config(const char *var, const char *value, void *cb) return 0; } + if (strcmp(var, "receive.advertiseatomic") == 0) { + advertise_atomic_push = git_config_bool(var, value); + return 0; + } + return git_default_config(var, value, cb); } @@ -175,6 +183,8 @@ static void show_ref(const char *path, const unsigned char *sha1) strbuf_addstr(&cap, "report-status delete-refs side-band-64k quiet"); + if (advertise_atomic_push) + strbuf_addstr(&cap, " atomic"); if (prefer_ofs_delta) strbuf_addstr(&cap, " ofs-delta"); if (push_cert_nonce) @@ -733,7 +743,9 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si) return 0; } -static const char *update_worktree(unsigned char *sha1) +static const char *push_to_deploy(unsigned char *sha1, + struct argv_array *env, + const char *work_tree) { const char *update_refresh[] = { "update-index", "-q", "--ignore-submodules", "--refresh", NULL @@ -748,69 +760,87 @@ static const char *update_worktree(unsigned char *sha1) const char *read_tree[] = { "read-tree", "-u", "-m", NULL, NULL }; - const char *work_tree = git_work_tree_cfg ? git_work_tree_cfg : ".."; - struct argv_array env = ARGV_ARRAY_INIT; struct child_process child = CHILD_PROCESS_INIT; - if (is_bare_repository()) - return "denyCurrentBranch = updateInstead needs a worktree"; - - argv_array_pushf(&env, "GIT_DIR=%s", absolute_path(get_git_dir())); - child.argv = update_refresh; - child.env = env.argv; + child.env = env->argv; child.dir = work_tree; child.no_stdin = 1; child.stdout_to_stderr = 1; child.git_cmd = 1; - if (run_command(&child)) { - argv_array_clear(&env); + if (run_command(&child)) return "Up-to-date check failed"; - } /* run_command() does not clean up completely; reinitialize */ child_process_init(&child); child.argv = diff_files; - child.env = env.argv; + child.env = env->argv; child.dir = work_tree; child.no_stdin = 1; child.stdout_to_stderr = 1; child.git_cmd = 1; - if (run_command(&child)) { - argv_array_clear(&env); + if (run_command(&child)) return "Working directory has unstaged changes"; - } child_process_init(&child); child.argv = diff_index; - child.env = env.argv; + child.env = env->argv; child.no_stdin = 1; child.no_stdout = 1; child.stdout_to_stderr = 0; child.git_cmd = 1; - if (run_command(&child)) { - argv_array_clear(&env); + if (run_command(&child)) return "Working directory has staged changes"; - } read_tree[3] = sha1_to_hex(sha1); child_process_init(&child); child.argv = read_tree; - child.env = env.argv; + child.env = env->argv; child.dir = work_tree; child.no_stdin = 1; child.no_stdout = 1; child.stdout_to_stderr = 0; child.git_cmd = 1; - if (run_command(&child)) { - argv_array_clear(&env); + if (run_command(&child)) return "Could not update working tree to new HEAD"; - } - argv_array_clear(&env); return NULL; } +static const char *push_to_checkout_hook = "push-to-checkout"; + +static const char *push_to_checkout(unsigned char *sha1, + struct argv_array *env, + const char *work_tree) +{ + argv_array_pushf(env, "GIT_WORK_TREE=%s", absolute_path(work_tree)); + if (run_hook_le(env->argv, push_to_checkout_hook, + sha1_to_hex(sha1), NULL)) + return "push-to-checkout hook declined"; + else + return NULL; +} + +static const char *update_worktree(unsigned char *sha1) +{ + const char *retval; + const char *work_tree = git_work_tree_cfg ? git_work_tree_cfg : ".."; + struct argv_array env = ARGV_ARRAY_INIT; + + if (is_bare_repository()) + return "denyCurrentBranch = updateInstead needs a worktree"; + + argv_array_pushf(&env, "GIT_DIR=%s", absolute_path(get_git_dir())); + + if (!find_hook(push_to_checkout_hook)) + retval = push_to_deploy(sha1, &env, work_tree); + else + retval = push_to_checkout(sha1, &env, work_tree); + + argv_array_clear(&env); + return retval; +} + static const char *update(struct command *cmd, struct shallow_info *si) { const char *name = cmd->ref_name; @@ -910,6 +940,7 @@ static const char *update(struct command *cmd, struct shallow_info *si) } if (is_null_sha1(new_sha1)) { + struct strbuf err = STRBUF_INIT; if (!parse_object(old_sha1)) { old_sha1 = NULL; if (ref_exists(name)) { @@ -919,35 +950,35 @@ static const char *update(struct command *cmd, struct shallow_info *si) cmd->did_not_exist = 1; } } - if (delete_ref(namespaced_name, old_sha1, 0)) { - rp_error("failed to delete %s", name); + if (ref_transaction_delete(transaction, + namespaced_name, + old_sha1, + 0, "push", &err)) { + rp_error("%s", err.buf); + strbuf_release(&err); return "failed to delete"; } + strbuf_release(&err); return NULL; /* good */ } else { struct strbuf err = STRBUF_INIT; - struct ref_transaction *transaction; - if (shallow_update && si->shallow_ref[cmd->index] && update_shallow_ref(cmd, si)) return "shallow error"; - transaction = ref_transaction_begin(&err); - if (!transaction || - ref_transaction_update(transaction, namespaced_name, - new_sha1, old_sha1, 0, 1, "push", - &err) || - ref_transaction_commit(transaction, &err)) { - ref_transaction_free(transaction); - + if (ref_transaction_update(transaction, + namespaced_name, + new_sha1, old_sha1, + 0, "push", + &err)) { rp_error("%s", err.buf); strbuf_release(&err); + return "failed to update ref"; } - - ref_transaction_free(transaction); strbuf_release(&err); + return NULL; /* good */ } } @@ -1131,11 +1162,105 @@ static void reject_updates_to_hidden(struct command *commands) } } +static int should_process_cmd(struct command *cmd) +{ + return !cmd->error_string && !cmd->skip_update; +} + +static void warn_if_skipped_connectivity_check(struct command *commands, + struct shallow_info *si) +{ + struct command *cmd; + int checked_connectivity = 1; + + for (cmd = commands; cmd; cmd = cmd->next) { + if (should_process_cmd(cmd) && si->shallow_ref[cmd->index]) { + error("BUG: connectivity check has not been run on ref %s", + cmd->ref_name); + checked_connectivity = 0; + } + } + if (!checked_connectivity) + die("BUG: connectivity check skipped???"); +} + +static void execute_commands_non_atomic(struct command *commands, + struct shallow_info *si) +{ + struct command *cmd; + struct strbuf err = STRBUF_INIT; + + for (cmd = commands; cmd; cmd = cmd->next) { + if (!should_process_cmd(cmd)) + continue; + + transaction = ref_transaction_begin(&err); + if (!transaction) { + rp_error("%s", err.buf); + strbuf_reset(&err); + cmd->error_string = "transaction failed to start"; + continue; + } + + cmd->error_string = update(cmd, si); + + if (!cmd->error_string + && ref_transaction_commit(transaction, &err)) { + rp_error("%s", err.buf); + strbuf_reset(&err); + cmd->error_string = "failed to update ref"; + } + ref_transaction_free(transaction); + } + strbuf_release(&err); +} + +static void execute_commands_atomic(struct command *commands, + struct shallow_info *si) +{ + struct command *cmd; + struct strbuf err = STRBUF_INIT; + const char *reported_error = "atomic push failure"; + + transaction = ref_transaction_begin(&err); + if (!transaction) { + rp_error("%s", err.buf); + strbuf_reset(&err); + reported_error = "transaction failed to start"; + goto failure; + } + + for (cmd = commands; cmd; cmd = cmd->next) { + if (!should_process_cmd(cmd)) + continue; + + cmd->error_string = update(cmd, si); + + if (cmd->error_string) + goto failure; + } + + if (ref_transaction_commit(transaction, &err)) { + rp_error("%s", err.buf); + reported_error = "atomic transaction failed"; + goto failure; + } + goto cleanup; + +failure: + for (cmd = commands; cmd; cmd = cmd->next) + if (!cmd->error_string) + cmd->error_string = reported_error; + +cleanup: + ref_transaction_free(transaction); + strbuf_release(&err); +} + static void execute_commands(struct command *commands, const char *unpacker_error, struct shallow_info *si) { - int checked_connectivity; struct command *cmd; unsigned char sha1[20]; struct iterate_data data; @@ -1166,27 +1291,13 @@ static void execute_commands(struct command *commands, free(head_name_to_free); head_name = head_name_to_free = resolve_refdup("HEAD", 0, sha1, NULL); - checked_connectivity = 1; - for (cmd = commands; cmd; cmd = cmd->next) { - if (cmd->error_string) - continue; - - if (cmd->skip_update) - continue; - - cmd->error_string = update(cmd, si); - if (shallow_update && !cmd->error_string && - si->shallow_ref[cmd->index]) { - error("BUG: connectivity check has not been run on ref %s", - cmd->ref_name); - checked_connectivity = 0; - } - } + if (use_atomic) + execute_commands_atomic(commands, si); + else + execute_commands_non_atomic(commands, si); - if (shallow_update && !checked_connectivity) - error("BUG: run 'git fsck' for safety.\n" - "If there are errors, try to remove " - "the reported refs above"); + if (shallow_update) + warn_if_skipped_connectivity_check(commands, si); } static struct command **queue_command(struct command **tail, @@ -1268,6 +1379,9 @@ static struct command *read_head_info(struct sha1_array *shallow) use_sideband = LARGE_PACKET_MAX; if (parse_feature_request(feature_list, "quiet")) quiet = 1; + if (advertise_atomic_push + && parse_feature_request(feature_list, "atomic")) + use_atomic = 1; } if (!strcmp(line, "push-cert")) { diff --git a/builtin/reflog.c b/builtin/reflog.c index 2d85d260ca..8182b648b9 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -8,32 +8,24 @@ #include "revision.h" #include "reachable.h" -/* - * reflog expire - */ - +/* NEEDSWORK: switch to using parse_options */ static const char reflog_expire_usage[] = -"git reflog expire [--verbose] [--dry-run] [--stale-fix] [--expire=<time>] [--expire-unreachable=<time>] [--all] <refs>..."; +"git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] <refs>..."; static const char reflog_delete_usage[] = -"git reflog delete [--verbose] [--dry-run] [--rewrite] [--updateref] <refs>..."; +"git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] <refs>..."; static unsigned long default_reflog_expire; static unsigned long default_reflog_expire_unreachable; struct cmd_reflog_expire_cb { struct rev_info revs; - int dry_run; int stalefix; - int rewrite; - int updateref; - int verbose; unsigned long expire_total; unsigned long expire_unreachable; int recno; }; -struct expire_reflog_cb { - FILE *newlog; +struct expire_reflog_policy_cb { enum { UE_NORMAL, UE_ALWAYS, @@ -41,14 +33,16 @@ struct expire_reflog_cb { } unreachable_expire_kind; struct commit_list *mark_list; unsigned long mark_limit; - struct cmd_reflog_expire_cb *cmd; - unsigned char last_kept_sha1[20]; + struct cmd_reflog_expire_cb cmd; + struct commit *tip_commit; + struct commit_list *tips; }; struct collected_reflog { unsigned char sha1[20]; char reflog[FLEX_ARRAY]; }; + struct collect_reflog_cb { struct collected_reflog **e; int alloc; @@ -220,7 +214,7 @@ static int keep_entry(struct commit **it, unsigned char *sha1) * the expire_limit and queue them back, so that the caller can call * us again to restart the traversal with longer expire_limit. */ -static void mark_reachable(struct expire_reflog_cb *cb) +static void mark_reachable(struct expire_reflog_policy_cb *cb) { struct commit *commit; struct commit_list *pending; @@ -259,7 +253,7 @@ static void mark_reachable(struct expire_reflog_cb *cb) cb->mark_list = leftover; } -static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsigned char *sha1) +static int unreachable(struct expire_reflog_policy_cb *cb, struct commit *commit, unsigned char *sha1) { /* * We may or may not have the commit yet - if not, look it @@ -288,55 +282,39 @@ static int unreachable(struct expire_reflog_cb *cb, struct commit *commit, unsig return !(commit->object.flags & REACHABLE); } -static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, - const char *email, unsigned long timestamp, int tz, - const char *message, void *cb_data) +/* + * Return true iff the specified reflog entry should be expired. + */ +static int should_expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, + const char *email, unsigned long timestamp, int tz, + const char *message, void *cb_data) { - struct expire_reflog_cb *cb = cb_data; + struct expire_reflog_policy_cb *cb = cb_data; struct commit *old, *new; - if (timestamp < cb->cmd->expire_total) - goto prune; - - if (cb->cmd->rewrite) - osha1 = cb->last_kept_sha1; + if (timestamp < cb->cmd.expire_total) + return 1; old = new = NULL; - if (cb->cmd->stalefix && + if (cb->cmd.stalefix && (!keep_entry(&old, osha1) || !keep_entry(&new, nsha1))) - goto prune; + return 1; - if (timestamp < cb->cmd->expire_unreachable) { + if (timestamp < cb->cmd.expire_unreachable) { if (cb->unreachable_expire_kind == UE_ALWAYS) - goto prune; + return 1; if (unreachable(cb, old, osha1) || unreachable(cb, new, nsha1)) - goto prune; + return 1; } - if (cb->cmd->recno && --(cb->cmd->recno) == 0) - goto prune; - - if (cb->newlog) { - char sign = (tz < 0) ? '-' : '+'; - int zone = (tz < 0) ? (-tz) : tz; - fprintf(cb->newlog, "%s %s %s %lu %c%04d\t%s", - sha1_to_hex(osha1), sha1_to_hex(nsha1), - email, timestamp, sign, zone, - message); - hashcpy(cb->last_kept_sha1, nsha1); - } - if (cb->cmd->verbose) - printf("keep %s", message); - return 0; - prune: - if (!cb->newlog) - printf("would prune %s", message); - else if (cb->cmd->verbose) - printf("prune %s", message); + if (cb->cmd.recno && --(cb->cmd.recno) == 0) + return 1; + return 0; } -static int push_tip_to_list(const char *refname, const unsigned char *sha1, int flags, void *cb_data) +static int push_tip_to_list(const char *refname, const unsigned char *sha1, + int flags, void *cb_data) { struct commit_list **list = cb_data; struct commit *tip_commit; @@ -349,104 +327,56 @@ static int push_tip_to_list(const char *refname, const unsigned char *sha1, int return 0; } -static int expire_reflog(const char *ref, const unsigned char *sha1, int unused, void *cb_data) +static void reflog_expiry_prepare(const char *refname, + const unsigned char *sha1, + void *cb_data) { - struct cmd_reflog_expire_cb *cmd = cb_data; - struct expire_reflog_cb cb; - struct ref_lock *lock; - char *log_file, *newlog_path = NULL; - struct commit *tip_commit; - struct commit_list *tips; - int status = 0; - - memset(&cb, 0, sizeof(cb)); - - /* - * we take the lock for the ref itself to prevent it from - * getting updated. - */ - lock = lock_any_ref_for_update(ref, sha1, 0, NULL); - if (!lock) - return error("cannot lock ref '%s'", ref); - log_file = git_pathdup("logs/%s", ref); - if (!reflog_exists(ref)) - goto finish; - if (!cmd->dry_run) { - newlog_path = git_pathdup("logs/%s.lock", ref); - cb.newlog = fopen(newlog_path, "w"); - } + struct expire_reflog_policy_cb *cb = cb_data; - cb.cmd = cmd; - - if (!cmd->expire_unreachable || !strcmp(ref, "HEAD")) { - tip_commit = NULL; - cb.unreachable_expire_kind = UE_HEAD; + if (!cb->cmd.expire_unreachable || !strcmp(refname, "HEAD")) { + cb->tip_commit = NULL; + cb->unreachable_expire_kind = UE_HEAD; } else { - tip_commit = lookup_commit_reference_gently(sha1, 1); - if (!tip_commit) - cb.unreachable_expire_kind = UE_ALWAYS; + cb->tip_commit = lookup_commit_reference_gently(sha1, 1); + if (!cb->tip_commit) + cb->unreachable_expire_kind = UE_ALWAYS; else - cb.unreachable_expire_kind = UE_NORMAL; + cb->unreachable_expire_kind = UE_NORMAL; } - if (cmd->expire_unreachable <= cmd->expire_total) - cb.unreachable_expire_kind = UE_ALWAYS; + if (cb->cmd.expire_unreachable <= cb->cmd.expire_total) + cb->unreachable_expire_kind = UE_ALWAYS; - cb.mark_list = NULL; - tips = NULL; - if (cb.unreachable_expire_kind != UE_ALWAYS) { - if (cb.unreachable_expire_kind == UE_HEAD) { + cb->mark_list = NULL; + cb->tips = NULL; + if (cb->unreachable_expire_kind != UE_ALWAYS) { + if (cb->unreachable_expire_kind == UE_HEAD) { struct commit_list *elem; - for_each_ref(push_tip_to_list, &tips); - for (elem = tips; elem; elem = elem->next) - commit_list_insert(elem->item, &cb.mark_list); + for_each_ref(push_tip_to_list, &cb->tips); + for (elem = cb->tips; elem; elem = elem->next) + commit_list_insert(elem->item, &cb->mark_list); } else { - commit_list_insert(tip_commit, &cb.mark_list); + commit_list_insert(cb->tip_commit, &cb->mark_list); } - cb.mark_limit = cmd->expire_total; - mark_reachable(&cb); + cb->mark_limit = cb->cmd.expire_total; + mark_reachable(cb); } +} - for_each_reflog_ent(ref, expire_reflog_ent, &cb); +static void reflog_expiry_cleanup(void *cb_data) +{ + struct expire_reflog_policy_cb *cb = cb_data; - if (cb.unreachable_expire_kind != UE_ALWAYS) { - if (cb.unreachable_expire_kind == UE_HEAD) { + if (cb->unreachable_expire_kind != UE_ALWAYS) { + if (cb->unreachable_expire_kind == UE_HEAD) { struct commit_list *elem; - for (elem = tips; elem; elem = elem->next) + for (elem = cb->tips; elem; elem = elem->next) clear_commit_marks(elem->item, REACHABLE); - free_commit_list(tips); + free_commit_list(cb->tips); } else { - clear_commit_marks(tip_commit, REACHABLE); + clear_commit_marks(cb->tip_commit, REACHABLE); } } - finish: - if (cb.newlog) { - if (fclose(cb.newlog)) { - status |= error("%s: %s", strerror(errno), - newlog_path); - unlink(newlog_path); - } else if (cmd->updateref && - (write_in_full(lock->lock_fd, - sha1_to_hex(cb.last_kept_sha1), 40) != 40 || - write_str_in_full(lock->lock_fd, "\n") != 1 || - close_ref(lock) < 0)) { - status |= error("Couldn't write %s", - lock->lk->filename.buf); - unlink(newlog_path); - } else if (rename(newlog_path, log_file)) { - status |= error("cannot rename %s to %s", - newlog_path, log_file); - unlink(newlog_path); - } else if (cmd->updateref && commit_ref(lock)) { - status |= error("Couldn't set %s", lock->ref_name); - } else { - adjust_shared_perm(log_file); - } - } - free(newlog_path); - free(log_file); - unlock_ref(lock); - return status; } static int collect_reflog(const char *ref, const unsigned char *sha1, int unused, void *cb_data) @@ -590,10 +520,11 @@ static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, int slot, c static int cmd_reflog_expire(int argc, const char **argv, const char *prefix) { - struct cmd_reflog_expire_cb cb; + struct expire_reflog_policy_cb cb; unsigned long now = time(NULL); int i, status, do_all; int explicit_expiry = 0; + unsigned int flags = 0; default_reflog_expire_unreachable = now - 30 * 24 * 3600; default_reflog_expire = now - 90 * 24 * 3600; @@ -603,33 +534,33 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix) do_all = status = 0; memset(&cb, 0, sizeof(cb)); - cb.expire_total = default_reflog_expire; - cb.expire_unreachable = default_reflog_expire_unreachable; + cb.cmd.expire_total = default_reflog_expire; + cb.cmd.expire_unreachable = default_reflog_expire_unreachable; for (i = 1; i < argc; i++) { const char *arg = argv[i]; if (!strcmp(arg, "--dry-run") || !strcmp(arg, "-n")) - cb.dry_run = 1; + flags |= EXPIRE_REFLOGS_DRY_RUN; else if (starts_with(arg, "--expire=")) { - if (parse_expiry_date(arg + 9, &cb.expire_total)) + if (parse_expiry_date(arg + 9, &cb.cmd.expire_total)) die(_("'%s' is not a valid timestamp"), arg); explicit_expiry |= EXPIRE_TOTAL; } else if (starts_with(arg, "--expire-unreachable=")) { - if (parse_expiry_date(arg + 21, &cb.expire_unreachable)) + if (parse_expiry_date(arg + 21, &cb.cmd.expire_unreachable)) die(_("'%s' is not a valid timestamp"), arg); explicit_expiry |= EXPIRE_UNREACH; } else if (!strcmp(arg, "--stale-fix")) - cb.stalefix = 1; + cb.cmd.stalefix = 1; else if (!strcmp(arg, "--rewrite")) - cb.rewrite = 1; + flags |= EXPIRE_REFLOGS_REWRITE; else if (!strcmp(arg, "--updateref")) - cb.updateref = 1; + flags |= EXPIRE_REFLOGS_UPDATE_REF; else if (!strcmp(arg, "--all")) do_all = 1; else if (!strcmp(arg, "--verbose")) - cb.verbose = 1; + flags |= EXPIRE_REFLOGS_VERBOSE; else if (!strcmp(arg, "--")) { i++; break; @@ -645,12 +576,12 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix) * even in older repository. We cannot trust what's reachable * from reflog if the repository was pruned with older git. */ - if (cb.stalefix) { - init_revisions(&cb.revs, prefix); - if (cb.verbose) + if (cb.cmd.stalefix) { + init_revisions(&cb.cmd.revs, prefix); + if (flags & EXPIRE_REFLOGS_VERBOSE) printf("Marking reachable objects..."); - mark_reachable_objects(&cb.revs, 0, 0, NULL); - if (cb.verbose) + mark_reachable_objects(&cb.cmd.revs, 0, 0, NULL); + if (flags & EXPIRE_REFLOGS_VERBOSE) putchar('\n'); } @@ -662,8 +593,12 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix) for_each_reflog(collect_reflog, &collected); for (i = 0; i < collected.nr; i++) { struct collected_reflog *e = collected.e[i]; - set_reflog_expiry_param(&cb, explicit_expiry, e->reflog); - status |= expire_reflog(e->reflog, e->sha1, 0, &cb); + set_reflog_expiry_param(&cb.cmd, explicit_expiry, e->reflog); + status |= reflog_expire(e->reflog, e->sha1, flags, + reflog_expiry_prepare, + should_expire_reflog_ent, + reflog_expiry_cleanup, + &cb); free(e); } free(collected.e); @@ -676,8 +611,12 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix) status |= error("%s points nowhere!", argv[i]); continue; } - set_reflog_expiry_param(&cb, explicit_expiry, ref); - status |= expire_reflog(ref, sha1, 0, &cb); + set_reflog_expiry_param(&cb.cmd, explicit_expiry, ref); + status |= reflog_expire(ref, sha1, flags, + reflog_expiry_prepare, + should_expire_reflog_ent, + reflog_expiry_cleanup, + &cb); } return status; } @@ -686,29 +625,30 @@ static int count_reflog_ent(unsigned char *osha1, unsigned char *nsha1, const char *email, unsigned long timestamp, int tz, const char *message, void *cb_data) { - struct cmd_reflog_expire_cb *cb = cb_data; - if (!cb->expire_total || timestamp < cb->expire_total) - cb->recno++; + struct expire_reflog_policy_cb *cb = cb_data; + if (!cb->cmd.expire_total || timestamp < cb->cmd.expire_total) + cb->cmd.recno++; return 0; } static int cmd_reflog_delete(int argc, const char **argv, const char *prefix) { - struct cmd_reflog_expire_cb cb; + struct expire_reflog_policy_cb cb; int i, status = 0; + unsigned int flags = 0; memset(&cb, 0, sizeof(cb)); for (i = 1; i < argc; i++) { const char *arg = argv[i]; if (!strcmp(arg, "--dry-run") || !strcmp(arg, "-n")) - cb.dry_run = 1; + flags |= EXPIRE_REFLOGS_DRY_RUN; else if (!strcmp(arg, "--rewrite")) - cb.rewrite = 1; + flags |= EXPIRE_REFLOGS_REWRITE; else if (!strcmp(arg, "--updateref")) - cb.updateref = 1; + flags |= EXPIRE_REFLOGS_UPDATE_REF; else if (!strcmp(arg, "--verbose")) - cb.verbose = 1; + flags |= EXPIRE_REFLOGS_VERBOSE; else if (!strcmp(arg, "--")) { i++; break; @@ -740,15 +680,19 @@ static int cmd_reflog_delete(int argc, const char **argv, const char *prefix) recno = strtoul(spec + 2, &ep, 10); if (*ep == '}') { - cb.recno = -recno; + cb.cmd.recno = -recno; for_each_reflog_ent(ref, count_reflog_ent, &cb); } else { - cb.expire_total = approxidate(spec + 2); + cb.cmd.expire_total = approxidate(spec + 2); for_each_reflog_ent(ref, count_reflog_ent, &cb); - cb.expire_total = 0; + cb.cmd.expire_total = 0; } - status |= expire_reflog(ref, sha1, 0, &cb); + status |= reflog_expire(ref, sha1, flags, + reflog_expiry_prepare, + should_expire_reflog_ent, + reflog_expiry_cleanup, + &cb); free(ref); } return status; diff --git a/builtin/remote.c b/builtin/remote.c index b4ff468977..5d3ab906bc 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -10,10 +10,10 @@ static const char * const builtin_remote_usage[] = { N_("git remote [-v | --verbose]"), - N_("git remote add [-t <branch>] [-m <master>] [-f] [--tags|--no-tags] [--mirror=<fetch|push>] <name> <url>"), + N_("git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url>"), N_("git remote rename <old> <new>"), N_("git remote remove <name>"), - N_("git remote set-head <name> (-a | --auto | -d | --delete |<branch>)"), + N_("git remote set-head <name> (-a | --auto | -d | --delete | <branch>)"), N_("git remote [-v | --verbose] show [-n] <name>"), N_("git remote prune [-n | --dry-run] <name>"), N_("git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]"), diff --git a/builtin/repack.c b/builtin/repack.c index 3f852f35d1..f2edeb0f4c 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -14,7 +14,7 @@ static int write_bitmaps; static char *packdir, *packtmp; static const char *const git_repack_usage[] = { - N_("git repack [options]"), + N_("git repack [<options>]"), NULL }; @@ -228,13 +228,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix) get_non_kept_pack_filenames(&existing_packs); if (existing_packs.nr && delete_redundant) { - if (unpack_unreachable) + if (unpack_unreachable) { argv_array_pushf(&cmd.args, "--unpack-unreachable=%s", unpack_unreachable); - else if (pack_everything & LOOSEN_UNREACHABLE) + argv_array_push(&cmd.env_array, "GIT_REF_PARANOIA=1"); + } else if (pack_everything & LOOSEN_UNREACHABLE) { argv_array_push(&cmd.args, "--unpack-unreachable"); + } else { + argv_array_push(&cmd.env_array, "GIT_REF_PARANOIA=1"); + } } } else { argv_array_push(&cmd.args, "--unpacked"); diff --git a/builtin/replace.c b/builtin/replace.c index 85d39b58d8..54bf01acb4 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -172,7 +172,7 @@ static int replace_object_sha1(const char *object_ref, transaction = ref_transaction_begin(&err); if (!transaction || ref_transaction_update(transaction, ref, repl, prev, - 0, 1, NULL, &err) || + 0, NULL, &err) || ref_transaction_commit(transaction, &err)) die("%s", err.buf); diff --git a/builtin/rerere.c b/builtin/rerere.c index 98eb8c5404..7afadd2ead 100644 --- a/builtin/rerere.c +++ b/builtin/rerere.c @@ -9,7 +9,7 @@ #include "pathspec.h" static const char * const rerere_usage[] = { - N_("git rerere [clear | forget path... | status | remaining | diff | gc]"), + N_("git rerere [clear | forget <path>... | status | remaining | diff | gc]"), NULL, }; diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 95328b80d9..3626c61da6 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -358,7 +358,7 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix) { static int keep_dashdash = 0, stop_at_non_option = 0; static char const * const parseopt_usage[] = { - N_("git rev-parse --parseopt [options] -- [<args>...]"), + N_("git rev-parse --parseopt [<options>] -- [<args>...]"), NULL }; static struct option parseopt_opts[] = { @@ -496,9 +496,9 @@ static void die_no_single_rev(int quiet) } static const char builtin_rev_parse_usage[] = -N_("git rev-parse --parseopt [options] -- [<args>...]\n" +N_("git rev-parse --parseopt [<options>] -- [<args>...]\n" " or: git rev-parse --sq-quote [<arg>...]\n" - " or: git rev-parse [options] [<arg>...]\n" + " or: git rev-parse [<options>] [<arg>...]\n" "\n" "Run \"git rev-parse --parseopt -h\" for more information on the first usage."); diff --git a/builtin/revert.c b/builtin/revert.c index f9ed5bd5d0..56a2c36669 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -19,13 +19,13 @@ */ static const char * const revert_usage[] = { - N_("git revert [options] <commit-ish>..."), + N_("git revert [<options>] <commit-ish>..."), N_("git revert <subcommand>"), NULL }; static const char * const cherry_pick_usage[] = { - N_("git cherry-pick [options] <commit-ish>..."), + N_("git cherry-pick [<options>] <commit-ish>..."), N_("git cherry-pick <subcommand>"), NULL }; diff --git a/builtin/rm.c b/builtin/rm.c index d8a9c86dd1..3304bff42a 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -14,7 +14,7 @@ #include "pathspec.h" static const char * const builtin_rm_usage[] = { - N_("git rm [options] [--] <file>..."), + N_("git rm [<options>] [--] <file>..."), NULL }; diff --git a/builtin/send-pack.c b/builtin/send-pack.c index b564a77845..b961e5ae78 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -13,7 +13,7 @@ #include "sha1-array.h" static const char send_pack_usage[] = -"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...]\n" +"git send-pack [--all | --mirror] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [--atomic] [<host>:]<directory> [<ref>...]\n" " --all and explicit <ref> specification are mutually exclusive."; static struct send_pack_args args; @@ -170,6 +170,10 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) args.use_thin_pack = 1; continue; } + if (!strcmp(arg, "--atomic")) { + args.atomic = 1; + continue; + } if (!strcmp(arg, "--stateless-rpc")) { args.stateless_rpc = 1; continue; diff --git a/builtin/shortlog.c b/builtin/shortlog.c index 4b7e53623f..c0bab6aaa9 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -10,7 +10,7 @@ #include "parse-options.h" static char const * const shortlog_usage[] = { - N_("git shortlog [<options>] [<revision range>] [[--] [<path>...]]"), + N_("git shortlog [<options>] [<revision-range>] [[--] [<path>...]]"), NULL }; diff --git a/builtin/show-branch.c b/builtin/show-branch.c index 365228aa8d..f3fb5fb2bf 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -6,11 +6,11 @@ #include "parse-options.h" static const char* show_branch_usage[] = { - N_("git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order]\n" + N_("git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" " [--current] [--color[=<when>] | --no-color] [--sparse]\n" " [--more=<n> | --list | --independent | --merge-base]\n" " [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)...]"), - N_("git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"), + N_("git show-branch (-g | --reflog)[=<n>[,<base>]] [--list] [<ref>]"), NULL }; diff --git a/builtin/show-ref.c b/builtin/show-ref.c index 5ba1f30838..afb10309d6 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -7,7 +7,7 @@ #include "parse-options.h" static const char * const show_ref_usage[] = { - N_("git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "), + N_("git show-ref [-q | --quiet] [--verify] [--head] [-d | --dereference] [-s | --hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [<pattern>...]"), N_("git show-ref --exclude-existing[=pattern] < ref-list"), NULL }; diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index 29fb3f1c20..ce0fde705c 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -4,8 +4,8 @@ #include "parse-options.h" static const char * const git_symbolic_ref_usage[] = { - N_("git symbolic-ref [options] name [ref]"), - N_("git symbolic-ref -d [-q] name"), + N_("git symbolic-ref [<options>] <name> [<ref>]"), + N_("git symbolic-ref -d [-q] <name>"), NULL }; diff --git a/builtin/tag.c b/builtin/tag.c index e633f4efdb..6f07ac6b93 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -19,9 +19,9 @@ #include "column.h" static const char * const git_tag_usage[] = { - N_("git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"), + N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"), N_("git tag -d <tagname>..."), - N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] " + N_("git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>]" "\n\t\t[<pattern>...]"), N_("git tag -v <tagname>..."), NULL @@ -605,13 +605,13 @@ int cmd_tag(int argc, const char **argv, const char *prefix) OPT_STRING('u', "local-user", &keyid, N_("key-id"), N_("use another key to sign the tag")), OPT__FORCE(&force, N_("replace the tag if exists")), + + OPT_GROUP(N_("Tag listing options")), OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")), { OPTION_CALLBACK, 0, "sort", &tag_sort, N_("type"), N_("sort tags"), PARSE_OPT_NONEG, parse_opt_sort }, - - OPT_GROUP(N_("Tag listing options")), { OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"), N_("print only tags that contain the commit"), @@ -733,7 +733,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix) transaction = ref_transaction_begin(&err); if (!transaction || ref_transaction_update(transaction, ref.buf, object, prev, - 0, 1, NULL, &err) || + 0, NULL, &err) || ref_transaction_commit(transaction, &err)) die("%s", err.buf); ref_transaction_free(transaction); diff --git a/builtin/update-index.c b/builtin/update-index.c index b0e3dc9105..587898624c 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -400,7 +400,7 @@ static void read_index_info(int line_termination) } static const char * const update_index_usage[] = { - N_("git update-index [options] [--] [<file>...]"), + N_("git update-index [<options>] [--] [<file>...]"), NULL }; diff --git a/builtin/update-ref.c b/builtin/update-ref.c index 1993529521..3d79a46b03 100644 --- a/builtin/update-ref.c +++ b/builtin/update-ref.c @@ -6,9 +6,9 @@ #include "argv-array.h" static const char * const git_update_ref_usage[] = { - N_("git update-ref [options] -d <refname> [<oldval>]"), - N_("git update-ref [options] <refname> <newval> [<oldval>]"), - N_("git update-ref [options] --stdin [-z]"), + N_("git update-ref [<options>] -d <refname> [<old-val>]"), + N_("git update-ref [<options>] <refname> <new-val> [<old-val>]"), + N_("git update-ref [<options>] --stdin [-z]"), NULL }; @@ -198,8 +198,9 @@ static const char *parse_cmd_update(struct ref_transaction *transaction, if (*next != line_termination) die("update %s: extra input: %s", refname, next); - if (ref_transaction_update(transaction, refname, new_sha1, old_sha1, - update_flags, have_old, msg, &err)) + if (ref_transaction_update(transaction, refname, + new_sha1, have_old ? old_sha1 : NULL, + update_flags, msg, &err)) die("%s", err.buf); update_flags = 0; @@ -264,8 +265,9 @@ static const char *parse_cmd_delete(struct ref_transaction *transaction, if (*next != line_termination) die("delete %s: extra input: %s", refname, next); - if (ref_transaction_delete(transaction, refname, old_sha1, - update_flags, have_old, msg, &err)) + if (ref_transaction_delete(transaction, refname, + have_old ? old_sha1 : NULL, + update_flags, msg, &err)) die("%s", err.buf); update_flags = 0; @@ -280,7 +282,6 @@ static const char *parse_cmd_verify(struct ref_transaction *transaction, { struct strbuf err = STRBUF_INIT; char *refname; - unsigned char new_sha1[20]; unsigned char old_sha1[20]; refname = parse_refname(input, &next); @@ -291,13 +292,11 @@ static const char *parse_cmd_verify(struct ref_transaction *transaction, PARSE_SHA1_OLD)) hashclr(old_sha1); - hashcpy(new_sha1, old_sha1); - if (*next != line_termination) die("verify %s: extra input: %s", refname, next); - if (ref_transaction_update(transaction, refname, new_sha1, old_sha1, - update_flags, 1, msg, &err)) + if (ref_transaction_verify(transaction, refname, old_sha1, + update_flags, &err)) die("%s", err.buf); update_flags = 0; @@ -353,7 +352,8 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix) { const char *refname, *oldval; unsigned char sha1[20], oldsha1[20]; - int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0, flags = 0; + int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0; + unsigned int flags = 0; struct option options[] = { OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")), OPT_BOOL('d', NULL, &delete, N_("delete the reference")), diff --git a/builtin/verify-commit.c b/builtin/verify-commit.c index b0f85042b2..ec0c4e3d83 100644 --- a/builtin/verify-commit.c +++ b/builtin/verify-commit.c @@ -14,7 +14,7 @@ #include "gpg-interface.h" static const char * const verify_commit_usage[] = { - N_("git verify-commit [-v|--verbose] <commit>..."), + N_("git verify-commit [-v | --verbose] <commit>..."), NULL }; diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c index 7747537beb..c94e156932 100644 --- a/builtin/verify-pack.c +++ b/builtin/verify-pack.c @@ -51,7 +51,7 @@ static int verify_one_pack(const char *path, unsigned int flags) } static const char * const verify_pack_usage[] = { - N_("git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."), + N_("git verify-pack [-v | --verbose] [-s | --stat-only] <pack>..."), NULL }; diff --git a/builtin/verify-tag.c b/builtin/verify-tag.c index 9cdf332333..53c68fce3a 100644 --- a/builtin/verify-tag.c +++ b/builtin/verify-tag.c @@ -14,7 +14,7 @@ #include "gpg-interface.h" static const char * const verify_tag_usage[] = { - N_("git verify-tag [-v|--verbose] <tag>..."), + N_("git verify-tag [-v | --verbose] <tag>..."), NULL }; diff --git a/bulk-checkin.c b/bulk-checkin.c index 0c4b8a7cad..8d157eba45 100644 --- a/bulk-checkin.c +++ b/bulk-checkin.c @@ -105,7 +105,6 @@ static int stream_to_pack(struct bulk_checkin_state *state, int write_object = (flags & HASH_WRITE_OBJECT); off_t offset = 0; - memset(&s, 0, sizeof(s)); git_deflate_init(&s, pack_compression_level); hdrlen = encode_in_pack_object_header(type, size, obuf); @@ -334,7 +334,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs) if (e->item->flags & UNINTERESTING) continue; if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1) - continue; + goto skip_write_ref; if (read_ref_full(e->name, RESOLVE_REF_READING, sha1, &flag)) flag = 0; display_ref = (flag & REF_ISSYMREF) ? e->name : ref; @@ -342,7 +342,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs) if (e->item->type == OBJ_TAG && !is_tag_in_date_range(e->item, revs)) { e->item->flags |= UNINTERESTING; - continue; + goto skip_write_ref; } /* @@ -357,8 +357,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs) if (!(e->item->flags & SHOWN) && e->item->type == OBJ_COMMIT) { warning(_("ref '%s' is excluded by the rev-list options"), e->name); - free(ref); - continue; + goto skip_write_ref; } /* * If you run "git bundle create bndl v1.0..v2.0", the @@ -388,8 +387,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs) obj->flags |= SHOWN; add_pending_object(revs, obj, e->name); } - free(ref); - continue; + goto skip_write_ref; } ref_count++; @@ -397,6 +395,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs) write_or_die(bundle_fd, " ", 1); write_or_die(bundle_fd, display_ref, strlen(display_ref)); write_or_die(bundle_fd, "\n", 1); + skip_write_ref: free(ref); } @@ -568,7 +568,7 @@ extern void update_index_if_able(struct index_state *, struct lock_file *); extern int hold_locked_index(struct lock_file *, int); extern void set_alternate_index_output(const char *); -extern int delete_ref(const char *, const unsigned char *sha1, int delopt); +extern int delete_ref(const char *, const unsigned char *sha1, unsigned int flags); /* Environment bits from configuration mechanism */ extern int trust_executable_bit; @@ -614,6 +614,14 @@ extern int protect_hfs; extern int protect_ntfs; /* + * Include broken refs in all ref iterations, which will + * generally choke dangerous operations rather than letting + * them silently proceed without taking the broken ref into + * account. + */ +extern int ref_paranoia; + +/* * The character that begins a commented line in user-editable file * that is subject to stripspace. */ @@ -1254,6 +1262,10 @@ extern int unpack_object_header(struct packed_git *, struct pack_window **, off_ * * Any callback that is NULL will be ignored. Callbacks returning non-zero * will end the iteration. + * + * In the "buf" variant, "path" is a strbuf which will also be used as a + * scratch buffer, but restored to its original contents before + * the function returns. */ typedef int each_loose_object_fn(const unsigned char *sha1, const char *path, @@ -1269,6 +1281,11 @@ int for_each_loose_file_in_objdir(const char *path, each_loose_cruft_fn cruft_cb, each_loose_subdir_fn subdir_cb, void *data); +int for_each_loose_file_in_objdir_buf(struct strbuf *path, + each_loose_object_fn obj_cb, + each_loose_cruft_fn cruft_cb, + each_loose_subdir_fn subdir_cb, + void *data); /* * Iterate over loose and packed objects in both the local @@ -1498,7 +1515,7 @@ extern const char *pager_program; extern int pager_in_use(void); extern int pager_use_color; extern int term_columns(void); -extern int decimal_width(int); +extern int decimal_width(uintmax_t); extern int check_pager_config(const char *cmd); extern const char *editor_program; diff --git a/check-builtins.sh b/check-builtins.sh index 07cff69d8e..a0aaf3a347 100755 --- a/check-builtins.sh +++ b/check-builtins.sh @@ -3,7 +3,7 @@ { cat <<\EOF sayIt: - $(foreach b,$(BUILT_INS),echo XXX $b YYY;) + $(foreach b,$(BUILT_INS),echo XXX $(b:$X=) YYY;) EOF cat Makefile } | @@ -254,7 +254,6 @@ extern int for_each_commit_graft(each_commit_graft_fn, void *); extern int is_repository_shallow(void); extern struct commit_list *get_shallow_commits(struct object_array *heads, int depth, int shallow_flag, int not_shallow_flag); -extern void check_shallow_file_for_update(void); extern void set_alternate_shallow_file(const char *path, int override); extern int write_shallow_commits(struct strbuf *out, int use_pack_protocol, const struct sha1_array *extra); @@ -73,8 +73,12 @@ static int config_buf_fgetc(struct config_source *conf) static int config_buf_ungetc(int c, struct config_source *conf) { - if (conf->u.buf.pos > 0) - return conf->u.buf.buf[--conf->u.buf.pos]; + if (conf->u.buf.pos > 0) { + conf->u.buf.pos--; + if (conf->u.buf.buf[conf->u.buf.pos] != c) + die("BUG: config_buf can only ungetc the same character"); + return c; + } return EOF; } @@ -235,7 +239,8 @@ static int get_next_char(void) /* DOS like systems */ c = cf->do_fgetc(cf); if (c != '\n') { - cf->do_ungetc(c, cf); + if (c != EOF) + cf->do_ungetc(c, cf); c = '\r'; } } @@ -1340,7 +1345,7 @@ static int configset_add_value(struct config_set *cs, const char *key, const cha string_list_init(&e->value_list, 1); hashmap_add(&cs->config_hash, e); } - si = string_list_append_nodup(&e->value_list, value ? xstrdup(value) : NULL); + si = string_list_append_nodup(&e->value_list, xstrdup_or_null(value)); ALLOC_GROW(cs->list.items, cs->list.nr + 1, cs->list.alloc); l_item = &cs->list.items[cs->list.nr++]; diff --git a/config.mak.uname b/config.mak.uname index b64b63c34c..f4e77cb9e5 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -107,6 +107,7 @@ ifeq ($(uname_S),Darwin) COMPAT_OBJS += compat/precompose_utf8.o BASIC_CFLAGS += -DPRECOMPOSE_UNICODE BASIC_CFLAGS += -DPROTECT_HFS_DEFAULT=1 + HAVE_BSD_SYSCTL = YesPlease endif ifeq ($(uname_S),SunOS) NEEDS_SOCKET = YesPlease @@ -199,6 +200,7 @@ ifeq ($(uname_S),FreeBSD) PYTHON_PATH = /usr/local/bin/python HAVE_PATHS_H = YesPlease GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes + HAVE_BSD_SYSCTL = YesPlease endif ifeq ($(uname_S),OpenBSD) NO_STRCASESTR = YesPlease @@ -208,6 +210,7 @@ ifeq ($(uname_S),OpenBSD) BASIC_CFLAGS += -I/usr/local/include BASIC_LDFLAGS += -L/usr/local/lib HAVE_PATHS_H = YesPlease + HAVE_BSD_SYSCTL = YesPlease endif ifeq ($(uname_S),MirBSD) NO_STRCASESTR = YesPlease @@ -215,6 +218,7 @@ ifeq ($(uname_S),MirBSD) USE_ST_TIMESPEC = YesPlease NEEDS_LIBICONV = YesPlease HAVE_PATHS_H = YesPlease + HAVE_BSD_SYSCTL = YesPlease endif ifeq ($(uname_S),NetBSD) ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2) @@ -225,6 +229,7 @@ ifeq ($(uname_S),NetBSD) USE_ST_TIMESPEC = YesPlease NO_MKSTEMPS = YesPlease HAVE_PATHS_H = YesPlease + HAVE_BSD_SYSCTL = YesPlease endif ifeq ($(uname_S),AIX) DEFAULT_PAGER = more diff --git a/configure.ac b/configure.ac index 55e5a9b3e6..bbdde85c3d 100644 --- a/configure.ac +++ b/configure.ac @@ -1046,6 +1046,29 @@ GIT_CONF_SUBST([NO_INITGROUPS]) # # Define NO_ICONV if your libc does not properly support iconv. +AC_DEFUN([BSD_SYSCTL_SRC], [ +AC_LANG_PROGRAM([[ +#include <stddef.h> +#include <sys/types.h> +#include <sys/sysctl.h> +]],[[ +int val, mib[2]; +size_t len; +mib[0] = CTL_HW; +mib[1] = 1; +len = sizeof(val); +return sysctl(mib, 2, &val, &len, NULL, 0) ? 1 : 0; +]])]) + +# +# Define HAVE_BSD_SYSCTL=YesPlease if a BSD-compatible sysctl function is available. +AC_MSG_CHECKING([for BSD sysctl]) +AC_COMPILE_IFELSE([BSD_SYSCTL_SRC], + [AC_MSG_RESULT([yes]) + HAVE_BSD_SYSCTL=YesPlease], + [AC_MSG_RESULT([no]) + HAVE_BSD_SYSCTL=]) +GIT_CONF_SUBST([HAVE_BSD_SYSCTL]) ## Other checks. # Define USE_PIC if you need the main git objects to be built with -fPIC @@ -157,8 +157,7 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len, server_capabilities = xstrdup(name + name_len + 1); } - if (extra_have && - name_len == 5 && !memcmp(".have", name, 5)) { + if (extra_have && !strcmp(name, ".have")) { sha1_array_append(extra_have, old_sha1); continue; } @@ -274,28 +273,44 @@ static enum protocol get_protocol(const char *name) die("I don't handle protocol '%s'", name); } +static char *host_end(char **hoststart, int removebrackets) +{ + char *host = *hoststart; + char *end; + char *start = strstr(host, "@["); + if (start) + start++; /* Jump over '@' */ + else + start = host; + if (start[0] == '[') { + end = strchr(start + 1, ']'); + if (end) { + if (removebrackets) { + *end = 0; + memmove(start, start + 1, end - start); + end++; + } + } else + end = host; + } else + end = host; + return end; +} + #define STR_(s) # s #define STR(s) STR_(s) static void get_host_and_port(char **host, const char **port) { char *colon, *end; - - if (*host[0] == '[') { - end = strchr(*host + 1, ']'); - if (end) { - *end = 0; - end++; - (*host)++; - } else - end = *host; - } else - end = *host; + end = host_end(host, 1); colon = strchr(end, ':'); - if (colon) { - *colon = 0; - *port = colon + 1; + long portnr = strtol(colon + 1, &end, 10); + if (end != colon + 1 && *end == '\0' && 0 <= portnr && portnr < 65536) { + *colon = 0; + *port = colon + 1; + } } } @@ -547,13 +562,16 @@ static struct child_process *git_proxy_connect(int fd[2], char *host) return proxy; } -static const char *get_port_numeric(const char *p) +static char *get_port(char *host) { char *end; + char *p = strchr(host, ':'); + if (p) { long port = strtol(p + 1, &end, 10); if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) { - return p; + *p = '\0'; + return p+1; } } @@ -595,14 +613,7 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host, * Don't do destructive transforms as protocol code does * '[]' unwrapping in get_host_and_port() */ - if (host[0] == '[') { - end = strchr(host + 1, ']'); - if (end) { - end++; - } else - end = host; - } else - end = host; + end = host_end(&host, 0); if (protocol == PROTO_LOCAL) path = end; @@ -663,17 +674,27 @@ struct child_process *git_connect(int fd[2], const char *url, signal(SIGCHLD, SIG_DFL); protocol = parse_connect_url(url, &hostandport, &path); - if (flags & CONNECT_DIAG_URL) { + if ((flags & CONNECT_DIAG_URL) && (protocol != PROTO_SSH)) { printf("Diag: url=%s\n", url ? url : "NULL"); printf("Diag: protocol=%s\n", prot_name(protocol)); printf("Diag: hostandport=%s\n", hostandport ? hostandport : "NULL"); printf("Diag: path=%s\n", path ? path : "NULL"); conn = NULL; } else if (protocol == PROTO_GIT) { + /* + * Set up virtual host information based on where we will + * connect, unless the user has overridden us in + * the environment. + */ + char *target_host = getenv("GIT_OVERRIDE_VIRTUAL_HOST"); + if (target_host) + target_host = xstrdup(target_host); + else + target_host = xstrdup(hostandport); + /* These underlying connection commands die() if they * cannot connect. */ - char *target_host = xstrdup(hostandport); if (git_use_proxy(hostandport)) conn = git_proxy_connect(fd, hostandport); else @@ -705,28 +726,43 @@ struct child_process *git_connect(int fd[2], const char *url, char *ssh_host = hostandport; const char *port = NULL; get_host_and_port(&ssh_host, &port); - port = get_port_numeric(port); - ssh = getenv("GIT_SSH_COMMAND"); - if (ssh) { - conn->use_shell = 1; - putty = 0; - } else { - ssh = getenv("GIT_SSH"); - if (!ssh) - ssh = "ssh"; - putty = !!strcasestr(ssh, "plink"); - } + if (!port) + port = get_port(ssh_host); + + if (flags & CONNECT_DIAG_URL) { + printf("Diag: url=%s\n", url ? url : "NULL"); + printf("Diag: protocol=%s\n", prot_name(protocol)); + printf("Diag: userandhost=%s\n", ssh_host ? ssh_host : "NULL"); + printf("Diag: port=%s\n", port ? port : "NONE"); + printf("Diag: path=%s\n", path ? path : "NULL"); - argv_array_push(&conn->args, ssh); - if (putty && !strcasestr(ssh, "tortoiseplink")) - argv_array_push(&conn->args, "-batch"); - if (port) { - /* P is for PuTTY, p is for OpenSSH */ - argv_array_push(&conn->args, putty ? "-P" : "-p"); - argv_array_push(&conn->args, port); + free(hostandport); + free(path); + free(conn); + return NULL; + } else { + ssh = getenv("GIT_SSH_COMMAND"); + if (ssh) { + conn->use_shell = 1; + putty = 0; + } else { + ssh = getenv("GIT_SSH"); + if (!ssh) + ssh = "ssh"; + putty = !!strcasestr(ssh, "plink"); + } + + argv_array_push(&conn->args, ssh); + if (putty && !strcasestr(ssh, "tortoiseplink")) + argv_array_push(&conn->args, "-batch"); + if (port) { + /* P is for PuTTY, p is for OpenSSH */ + argv_array_push(&conn->args, putty ? "-P" : "-p"); + argv_array_push(&conn->args, port); + } + argv_array_push(&conn->args, ssh_host); } - argv_array_push(&conn->args, ssh_host); } else { /* remove repo-local variables from the environment */ conn->env = local_repo_env; diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 8cfee95f88..931eac29ad 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -411,12 +411,9 @@ __git_refs_remotes () __git_remotes () { - local i IFS=$'\n' d="$(__gitdir)" + local d="$(__gitdir)" test -d "$d/remotes" && ls -1 "$d/remotes" - for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do - i="${i#remote.}" - echo "${i/.url*/}" - done + git --git-dir="$d" remote } __git_list_merge_strategies () @@ -1305,7 +1302,7 @@ _git_gitk () } __git_match_ctag() { - awk "/^${1////\\/}/ { print \$1 }" "$2" + awk "/^${1//\//\\/}/ { print \$1 }" "$2" } _git_grep () @@ -1425,7 +1422,7 @@ __git_log_gitk_options=" # Options that go well for log and shortlog (not gitk) __git_log_shortlog_options=" --author= --committer= --grep= - --all-match + --all-match --invert-grep " __git_log_pretty_formats="oneline short medium full fuller email raw format:" @@ -2014,6 +2011,7 @@ _git_config () color.status.changed color.status.header color.status.nobranch + color.status.unmerged color.status.untracked color.status.updated color.ui @@ -2188,6 +2186,7 @@ _git_config () pull.octopus pull.twohead push.default + push.followTags rebase.autosquash rebase.stat receive.autogc diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh index 214e859f99..f18aedc73b 100644 --- a/contrib/completion/git-prompt.sh +++ b/contrib/completion/git-prompt.sh @@ -487,7 +487,7 @@ __git_ps1 () if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] && [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] && - git ls-files --others --exclude-standard --error-unmatch -- '*' >/dev/null 2>/dev/null + git ls-files --others --exclude-standard --error-unmatch -- ':/*' >/dev/null 2>/dev/null then u="%${ZSH_VERSION+%}" fi diff --git a/contrib/credential/wincred/git-credential-wincred.c b/contrib/credential/wincred/git-credential-wincred.c index a1d38f035b..006134043a 100644 --- a/contrib/credential/wincred/git-credential-wincred.c +++ b/contrib/credential/wincred/git-credential-wincred.c @@ -111,14 +111,23 @@ static void write_item(const char *what, LPCWSTR wbuf, int wlen) * Match an (optional) expected string and a delimiter in the target string, * consuming the matched text by updating the target pointer. */ -static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim) + +static LPCWSTR wcsstr_last(LPCWSTR str, LPCWSTR find) +{ + LPCWSTR res = NULL, pos; + for (pos = wcsstr(str, find); pos; pos = wcsstr(pos + 1, find)) + res = pos; + return res; +} + +static int match_part_with_last(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim, int last) { LPCWSTR delim_pos, start = *ptarget; int len; /* find start of delimiter (or end-of-string if delim is empty) */ if (*delim) - delim_pos = wcsstr(start, delim); + delim_pos = last ? wcsstr_last(start, delim) : wcsstr(start, delim); else delim_pos = start + wcslen(start); @@ -138,6 +147,16 @@ static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim) return !want || (!wcsncmp(want, start, len) && !want[len]); } +static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim) +{ + return match_part_with_last(ptarget, want, delim, 0); +} + +static int match_part_last(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim) +{ + return match_part_with_last(ptarget, want, delim, 1); +} + static int match_cred(const CREDENTIALW *cred) { LPCWSTR target = cred->TargetName; @@ -146,7 +165,7 @@ static int match_cred(const CREDENTIALW *cred) return match_part(&target, L"git", L":") && match_part(&target, protocol, L"://") && - match_part(&target, wusername, L"@") && + match_part_last(&target, wusername, L"@") && match_part(&target, host, L"/") && match_part(&target, path, L""); } diff --git a/credential-store.c b/credential-store.c index d435514cbe..925d3f4024 100644 --- a/credential-store.c +++ b/credential-store.c @@ -118,7 +118,7 @@ static int lookup_credential(const char *fn, struct credential *c) int main(int argc, char **argv) { const char * const usage[] = { - "git credential-store [options] <action>", + "git credential-store [<options>] <action>", NULL }; const char *op; diff --git a/csum-file.c b/csum-file.c index b00b215031..a172199e44 100644 --- a/csum-file.c +++ b/csum-file.c @@ -130,14 +130,10 @@ struct sha1file *sha1fd_check(const char *name) sink = open("/dev/null", O_WRONLY); if (sink < 0) - return NULL; + die_errno("unable to open /dev/null"); check = open(name, O_RDONLY); - if (check < 0) { - int saved_errno = errno; - close(sink); - errno = saved_errno; - return NULL; - } + if (check < 0) + die_errno("unable to open '%s'", name); f = sha1fd(sink, name); f->check_fd = check; return f; @@ -30,7 +30,7 @@ const unsigned char sane_ctype[256] = { }; /* For case-insensitive kwset */ -const char tolower_trans_tbl[256] = { +const unsigned char tolower_trans_tbl[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -43,9 +43,6 @@ static const char *base_path; static const char *interpolated_path; static int base_path_relaxed; -/* Flag indicating client sent extra args. */ -static int saw_extended_args; - /* If defined, ~user notation is allowed and the string is inserted * after ~user/. E.g. a request to git://host/~alice/frotz would * go to /home/alice/pub_git/frotz with --user-path=pub_git. @@ -56,10 +53,28 @@ static const char *user_path; static unsigned int timeout; static unsigned int init_timeout; -static char *hostname; -static char *canon_hostname; -static char *ip_address; -static char *tcp_port; +struct hostinfo { + struct strbuf hostname; + struct strbuf canon_hostname; + struct strbuf ip_address; + struct strbuf tcp_port; + unsigned int hostname_lookup_done:1; + unsigned int saw_extended_args:1; +}; + +static void lookup_hostname(struct hostinfo *hi); + +static const char *get_canon_hostname(struct hostinfo *hi) +{ + lookup_hostname(hi); + return hi->canon_hostname.buf; +} + +static const char *get_ip_address(struct hostinfo *hi) +{ + lookup_hostname(hi); + return hi->ip_address.buf; +} static void logreport(int priority, const char *err, va_list params) { @@ -106,7 +121,43 @@ static void NORETURN daemon_die(const char *err, va_list params) exit(1); } -static const char *path_ok(const char *directory) +struct expand_path_context { + const char *directory; + struct hostinfo *hostinfo; +}; + +static size_t expand_path(struct strbuf *sb, const char *placeholder, void *ctx) +{ + struct expand_path_context *context = ctx; + struct hostinfo *hi = context->hostinfo; + + switch (placeholder[0]) { + case 'H': + strbuf_addbuf(sb, &hi->hostname); + return 1; + case 'C': + if (placeholder[1] == 'H') { + strbuf_addstr(sb, get_canon_hostname(hi)); + return 2; + } + break; + case 'I': + if (placeholder[1] == 'P') { + strbuf_addstr(sb, get_ip_address(hi)); + return 2; + } + break; + case 'P': + strbuf_addbuf(sb, &hi->tcp_port); + return 1; + case 'D': + strbuf_addstr(sb, context->directory); + return 1; + } + return 0; +} + +static const char *path_ok(const char *directory, struct hostinfo *hi) { static char rpath[PATH_MAX]; static char interp_path[PATH_MAX]; @@ -142,16 +193,13 @@ static const char *path_ok(const char *directory) dir = rpath; } } - else if (interpolated_path && saw_extended_args) { + else if (interpolated_path && hi->saw_extended_args) { struct strbuf expanded_path = STRBUF_INIT; - struct strbuf_expand_dict_entry dict[6]; - - dict[0].placeholder = "H"; dict[0].value = hostname; - dict[1].placeholder = "CH"; dict[1].value = canon_hostname; - dict[2].placeholder = "IP"; dict[2].value = ip_address; - dict[3].placeholder = "P"; dict[3].value = tcp_port; - dict[4].placeholder = "D"; dict[4].value = directory; - dict[5].placeholder = NULL; dict[5].value = NULL; + struct expand_path_context context; + + context.directory = directory; + context.hostinfo = hi; + if (*dir != '/') { /* Allow only absolute */ logerror("'%s': Non-absolute path denied (interpolated-path active)", dir); @@ -159,7 +207,7 @@ static const char *path_ok(const char *directory) } strbuf_expand(&expanded_path, interpolated_path, - strbuf_expand_dict_cb, &dict); + expand_path, &context); strlcpy(interp_path, expanded_path.buf, PATH_MAX); strbuf_release(&expanded_path); loginfo("Interpolated dir '%s'", interp_path); @@ -240,7 +288,8 @@ static int daemon_error(const char *dir, const char *msg) static const char *access_hook; -static int run_access_hook(struct daemon_service *service, const char *dir, const char *path) +static int run_access_hook(struct daemon_service *service, const char *dir, + const char *path, struct hostinfo *hi) { struct child_process child = CHILD_PROCESS_INIT; struct strbuf buf = STRBUF_INIT; @@ -249,16 +298,14 @@ static int run_access_hook(struct daemon_service *service, const char *dir, cons char *eol; int seen_errors = 0; -#define STRARG(x) ((x) ? (x) : "") *arg++ = access_hook; *arg++ = service->name; *arg++ = path; - *arg++ = STRARG(hostname); - *arg++ = STRARG(canon_hostname); - *arg++ = STRARG(ip_address); - *arg++ = STRARG(tcp_port); + *arg++ = hi->hostname.buf; + *arg++ = get_canon_hostname(hi); + *arg++ = get_ip_address(hi); + *arg++ = hi->tcp_port.buf; *arg = NULL; -#undef STRARG child.use_shell = 1; child.argv = argv; @@ -302,7 +349,8 @@ error_return: return -1; } -static int run_service(const char *dir, struct daemon_service *service) +static int run_service(const char *dir, struct daemon_service *service, + struct hostinfo *hi) { const char *path; int enabled = service->enabled; @@ -316,7 +364,7 @@ static int run_service(const char *dir, struct daemon_service *service) return daemon_error(dir, "service not enabled"); } - if (!(path = path_ok(dir))) + if (!(path = path_ok(dir, hi))) return daemon_error(dir, "no such repository"); /* @@ -352,7 +400,7 @@ static int run_service(const char *dir, struct daemon_service *service) * Optionally, a hook can choose to deny access to the * repository depending on the phase of the moon. */ - if (access_hook && run_access_hook(service, dir, path)) + if (access_hook && run_access_hook(service, dir, path, hi)) return -1; /* @@ -485,16 +533,46 @@ static void parse_host_and_port(char *hostport, char **host, } /* + * Sanitize a string from the client so that it's OK to be inserted into a + * filesystem path. Specifically, we disallow slashes, runs of "..", and + * trailing and leading dots, which means that the client cannot escape + * our base path via ".." traversal. + */ +static void sanitize_client(struct strbuf *out, const char *in) +{ + for (; *in; in++) { + if (*in == '/') + continue; + if (*in == '.' && (!out->len || out->buf[out->len - 1] == '.')) + continue; + strbuf_addch(out, *in); + } + + while (out->len && out->buf[out->len - 1] == '.') + strbuf_setlen(out, out->len - 1); +} + +/* + * Like sanitize_client, but we also perform any canonicalization + * to make life easier on the admin. + */ +static void canonicalize_client(struct strbuf *out, const char *in) +{ + sanitize_client(out, in); + strbuf_tolower(out); +} + +/* * Read the host as supplied by the client connection. */ -static void parse_host_arg(char *extra_args, int buflen) +static void parse_host_arg(struct hostinfo *hi, char *extra_args, int buflen) { char *val; int vallen; char *end = extra_args + buflen; if (extra_args < end && *extra_args) { - saw_extended_args = 1; + hi->saw_extended_args = 1; if (strncasecmp("host=", extra_args, 5) == 0) { val = extra_args + 5; vallen = strlen(val) + 1; @@ -503,12 +581,10 @@ static void parse_host_arg(char *extra_args, int buflen) char *host; char *port; parse_host_and_port(val, &host, &port); - if (port) { - free(tcp_port); - tcp_port = xstrdup(port); - } - free(hostname); - hostname = xstrdup_tolower(host); + if (port) + sanitize_client(&hi->tcp_port, port); + canonicalize_client(&hi->hostname, host); + hi->hostname_lookup_done = 0; } /* On to the next one */ @@ -517,11 +593,14 @@ static void parse_host_arg(char *extra_args, int buflen) if (extra_args < end && *extra_args) die("Invalid request"); } +} - /* - * Locate canonical hostname and its IP address. - */ - if (hostname) { +/* + * Locate canonical hostname and its IP address. + */ +static void lookup_hostname(struct hostinfo *hi) +{ + if (!hi->hostname_lookup_done && hi->hostname.len) { #ifndef NO_IPV6 struct addrinfo hints; struct addrinfo *ai; @@ -531,18 +610,20 @@ static void parse_host_arg(char *extra_args, int buflen) memset(&hints, 0, sizeof(hints)); hints.ai_flags = AI_CANONNAME; - gai = getaddrinfo(hostname, NULL, &hints, &ai); + gai = getaddrinfo(hi->hostname.buf, NULL, &hints, &ai); if (!gai) { struct sockaddr_in *sin_addr = (void *)ai->ai_addr; inet_ntop(AF_INET, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf)); - free(ip_address); - ip_address = xstrdup(addrbuf); + strbuf_addstr(&hi->ip_address, addrbuf); - free(canon_hostname); - canon_hostname = xstrdup(ai->ai_canonname ? - ai->ai_canonname : ip_address); + if (ai->ai_canonname) + sanitize_client(&hi->canon_hostname, + ai->ai_canonname); + else + strbuf_addbuf(&hi->canon_hostname, + &hi->ip_address); freeaddrinfo(ai); } @@ -552,7 +633,7 @@ static void parse_host_arg(char *extra_args, int buflen) char **ap; static char addrbuf[HOST_NAME_MAX + 1]; - hent = gethostbyname(hostname); + hent = gethostbyname(hostname.buf); if (hent) { ap = hent->h_addr_list; memset(&sa, 0, sizeof sa); @@ -563,21 +644,39 @@ static void parse_host_arg(char *extra_args, int buflen) inet_ntop(hent->h_addrtype, &sa.sin_addr, addrbuf, sizeof(addrbuf)); - free(canon_hostname); - canon_hostname = xstrdup(hent->h_name); - free(ip_address); - ip_address = xstrdup(addrbuf); + sanitize_client(&hi->canon_hostname, hent->h_name); + strbuf_addstr(&hi->ip_address, addrbuf); } #endif + hi->hostname_lookup_done = 1; } } +static void hostinfo_init(struct hostinfo *hi) +{ + memset(hi, 0, sizeof(*hi)); + strbuf_init(&hi->hostname, 0); + strbuf_init(&hi->canon_hostname, 0); + strbuf_init(&hi->ip_address, 0); + strbuf_init(&hi->tcp_port, 0); +} + +static void hostinfo_clear(struct hostinfo *hi) +{ + strbuf_release(&hi->hostname); + strbuf_release(&hi->canon_hostname); + strbuf_release(&hi->ip_address); + strbuf_release(&hi->tcp_port); +} static int execute(void) { char *line = packet_buffer; int pktlen, len, i; char *addr = getenv("REMOTE_ADDR"), *port = getenv("REMOTE_PORT"); + struct hostinfo hi; + + hostinfo_init(&hi); if (addr) loginfo("Connection from %s:%s", addr, port); @@ -596,14 +695,8 @@ static int execute(void) pktlen--; } - free(hostname); - free(canon_hostname); - free(ip_address); - free(tcp_port); - hostname = canon_hostname = ip_address = tcp_port = NULL; - if (len != pktlen) - parse_host_arg(line + len + 1, pktlen - len - 1); + parse_host_arg(&hi, line + len + 1, pktlen - len - 1); for (i = 0; i < ARRAY_SIZE(daemon_service); i++) { struct daemon_service *s = &(daemon_service[i]); @@ -616,10 +709,13 @@ static int execute(void) * Note: The directory here is probably context sensitive, * and might depend on the actual service being performed. */ - return run_service(arg, s); + int rc = run_service(arg, s, &hi); + hostinfo_clear(&hi); + return rc; } } + hostinfo_clear(&hi); logerror("Protocol error: '%s'", line); return -1; } diff --git a/diff-lib.c b/diff-lib.c index 875aff8643..a85c4971ac 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -101,6 +101,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) struct cache_entry *ce = active_cache[i]; int changed; unsigned dirty_submodule = 0; + const unsigned char *old_sha1, *new_sha1; if (diff_can_quit_early(&revs->diffopt)) break; @@ -224,9 +225,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option) continue; } oldmode = ce->ce_mode; + old_sha1 = ce->sha1; + new_sha1 = changed ? null_sha1 : ce->sha1; diff_change(&revs->diffopt, oldmode, newmode, - ce->sha1, (changed ? null_sha1 : ce->sha1), - !is_null_sha1(ce->sha1), (changed ? 0 : !is_null_sha1(ce->sha1)), + old_sha1, new_sha1, + !is_null_sha1(old_sha1), + !is_null_sha1(new_sha1), ce->name, 0, dirty_submodule); } @@ -2093,7 +2093,6 @@ static unsigned char *deflate_it(char *data, unsigned char *deflated; git_zstream stream; - memset(&stream, 0, sizeof(stream)); git_deflate_init(&stream, zlib_compression_level); bound = git_deflate_bound(&stream, size); deflated = xmalloc(bound); @@ -4541,7 +4540,7 @@ void diff_flush(struct diff_options *options) show_stats(&diffstat, options); if (output_format & DIFF_FORMAT_SHORTSTAT) show_shortstats(&diffstat, options); - if (output_format & DIFF_FORMAT_DIRSTAT) + if (output_format & DIFF_FORMAT_DIRSTAT && dirstat_by_line) show_dirstat_by_line(&diffstat, options); free_diffstat_info(&diffstat); separator++; diff --git a/diffcore-rename.c b/diffcore-rename.c index 4e132f1fdb..af1fe08861 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -15,8 +15,7 @@ static struct diff_rename_dst { } *rename_dst; static int rename_dst_nr, rename_dst_alloc; -static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two, - int insert_ok) +static int find_rename_dst(struct diff_filespec *two) { int first, last; @@ -27,16 +26,33 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two, struct diff_rename_dst *dst = &(rename_dst[next]); int cmp = strcmp(two->path, dst->two->path); if (!cmp) - return dst; + return next; if (cmp < 0) { last = next; continue; } first = next+1; } - /* not found */ - if (!insert_ok) - return NULL; + return -first - 1; +} + +static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two) +{ + int ofs = find_rename_dst(two); + return ofs < 0 ? NULL : &rename_dst[ofs]; +} + +/* + * Returns 0 on success, -1 if we found a duplicate. + */ +static int add_rename_dst(struct diff_filespec *two) +{ + int first = find_rename_dst(two); + + if (first >= 0) + return -1; + first = -first - 1; + /* insert to make it at "first" */ ALLOC_GROW(rename_dst, rename_dst_nr + 1, rename_dst_alloc); rename_dst_nr++; @@ -46,7 +62,7 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two, rename_dst[first].two = alloc_filespec(two->path); fill_filespec(rename_dst[first].two, two->sha1, two->sha1_valid, two->mode); rename_dst[first].pair = NULL; - return &(rename_dst[first]); + return 0; } /* Table of rename/copy src files */ @@ -450,8 +466,12 @@ void diffcore_rename(struct diff_options *options) else if (!DIFF_OPT_TST(options, RENAME_EMPTY) && is_empty_blob_sha1(p->two->sha1)) continue; - else - locate_rename_dst(p->two, 1); + else if (add_rename_dst(p->two) < 0) { + warning("skipping rename detection, detected" + " duplicate destination '%s'", + p->two->path); + goto cleanup; + } } else if (!DIFF_OPT_TST(options, RENAME_EMPTY) && is_empty_blob_sha1(p->one->sha1)) @@ -582,8 +602,7 @@ void diffcore_rename(struct diff_options *options) * We would output this create record if it has * not been turned into a rename/copy already. */ - struct diff_rename_dst *dst = - locate_rename_dst(p->two, 0); + struct diff_rename_dst *dst = locate_rename_dst(p->two); if (dst && dst->pair) { diff_q(&outq, dst->pair); pair_to_free = p; @@ -613,8 +632,7 @@ void diffcore_rename(struct diff_options *options) */ if (DIFF_PAIR_BROKEN(p)) { /* broken delete */ - struct diff_rename_dst *dst = - locate_rename_dst(p->one, 0); + struct diff_rename_dst *dst = locate_rename_dst(p->one); if (dst && dst->pair) /* counterpart is now rename/copy */ pair_to_free = p; diff --git a/environment.c b/environment.c index 1ade5c9684..a40044c3bf 100644 --- a/environment.c +++ b/environment.c @@ -24,6 +24,7 @@ int is_bare_repository_cfg = -1; /* unspecified */ int log_all_ref_updates = -1; /* unspecified */ int warn_ambiguous_refs = 1; int warn_on_object_refname_ambiguity = 1; +int ref_paranoia = -1; int repository_format_version; const char *git_commit_encoding; const char *git_log_output_encoding; diff --git a/ewah/ewok.h b/ewah/ewok.h index f6ad190a03..13c6e20412 100644 --- a/ewah/ewok.h +++ b/ewah/ewok.h @@ -47,7 +47,8 @@ static inline uint32_t ewah_bit_popcount64(uint64_t x) return (x * 0x0101010101010101ULL) >> 56; } -#ifdef __GNUC__ +/* __builtin_ctzll was not available until 3.4.0 */ +#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR > 3)) #define ewah_bit_ctz64(x) __builtin_ctzll(x) #else static inline int ewah_bit_ctz64(uint64_t x) diff --git a/fast-import.c b/fast-import.c index d0bd285a16..e78ca107b3 100644 --- a/fast-import.c +++ b/fast-import.c @@ -947,9 +947,12 @@ static void unkeep_all_packs(void) static void end_packfile(void) { - if (!pack_data) + static int running; + + if (running || !pack_data) return; + running = 1; clear_delta_base_cache(); if (object_count) { struct packed_git *new_p; @@ -999,6 +1002,7 @@ static void end_packfile(void) } free(pack_data); pack_data = NULL; + running = 0; /* We can't carry a delta across packfiles. */ strbuf_release(&last_blob.data); @@ -1058,7 +1062,6 @@ static int store_object( } else delta = NULL; - memset(&s, 0, sizeof(s)); git_deflate_init(&s, pack_compression_level); if (delta) { s.next_in = delta; @@ -1086,7 +1089,6 @@ static int store_object( free(delta); delta = NULL; - memset(&s, 0, sizeof(s)); git_deflate_init(&s, pack_compression_level); s.next_in = (void *)dat->buf; s.avail_in = dat->len; @@ -1186,7 +1188,6 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark) crc32_begin(pack_file); - memset(&s, 0, sizeof(s)); git_deflate_init(&s, pack_compression_level); hdrlen = encode_in_pack_object_header(OBJ_BLOB, len, out_buf); @@ -1716,7 +1717,7 @@ static int update_branch(struct branch *b) transaction = ref_transaction_begin(&err); if (!transaction || ref_transaction_update(transaction, b->name, b->sha1, old_sha1, - 0, 1, msg, &err) || + 0, msg, &err) || ref_transaction_commit(transaction, &err)) { ref_transaction_free(transaction); error("%s", err.buf); @@ -1756,8 +1757,8 @@ static void dump_tags(void) strbuf_reset(&ref_name); strbuf_addf(&ref_name, "refs/tags/%s", t->name); - if (ref_transaction_update(transaction, ref_name.buf, t->sha1, - NULL, 0, 0, msg, &err)) { + if (ref_transaction_update(transaction, ref_name.buf, + t->sha1, NULL, 0, msg, &err)) { failure |= error("%s", err.buf); goto cleanup; } diff --git a/fetch-pack.c b/fetch-pack.c index 655ee64256..48526aa54b 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -544,16 +544,19 @@ static void filter_refs(struct fetch_pack_args *args, /* Append unmatched requests to the list */ if (allow_tip_sha1_in_want) { for (i = 0; i < nr_sought; i++) { + unsigned char sha1[20]; + ref = sought[i]; if (ref->matched) continue; - if (get_sha1_hex(ref->name, ref->old_sha1)) + if (get_sha1_hex(ref->name, sha1) || + ref->name[40] != '\0' || + hashcmp(sha1, ref->old_sha1)) continue; ref->matched = 1; - *newtail = ref; - ref->next = NULL; - newtail = &ref->next; + *newtail = copy_ref(ref); + newtail = &(*newtail)->next; } } *refs = newlist; @@ -625,7 +628,6 @@ static int everything_local(struct fetch_pack_args *args, for (retval = 1, ref = *refs; ref ; ref = ref->next) { const unsigned char *remote = ref->old_sha1; - unsigned char local[20]; struct object *o; o = lookup_object(remote); @@ -638,8 +640,6 @@ static int everything_local(struct fetch_pack_args *args, ref->name); continue; } - - hashcpy(ref->new_sha1, local); if (!args->verbose) continue; fprintf(stderr, @@ -18,6 +18,31 @@ # endif #endif +/* + * Guess the user's preferred languages from the value in LANGUAGE environment + * variable and LC_MESSAGES locale category if NO_GETTEXT is not defined. + * + * The result can be a colon-separated list like "ko:ja:en". + */ +const char *get_preferred_languages(void) +{ + const char *retval; + + retval = getenv("LANGUAGE"); + if (retval && *retval) + return retval; + +#ifndef NO_GETTEXT + retval = setlocale(LC_MESSAGES, NULL); + if (retval && *retval && + strcmp(retval, "C") && + strcmp(retval, "POSIX")) + return retval; +#endif + + return NULL; +} + #ifdef GETTEXT_POISON int use_gettext_poison(void) { @@ -63,6 +63,32 @@ const char *Q_(const char *msgid, const char *plu, unsigned long n) } /* Mark msgid for translation but do not translate it. */ +#if !USE_PARENS_AROUND_GETTEXT_N #define N_(msgid) msgid +#else +/* + * Strictly speaking, this will lead to invalid C when + * used this way: + * static const char s[] = N_("FOO"); + * which will expand to + * static const char s[] = ("FOO"); + * and in valid C, the initializer on the right hand side must + * be without the parentheses. But many compilers do accept it + * as a language extension and it will allow us to catch mistakes + * like: + * static const char *msgs[] = { + * N_("one") + * N_("two"), + * N_("three"), + * NULL + * }; + * (notice the missing comma on one of the lines) by forcing + * a compilation error, because parenthesised ("one") ("two") + * will not get silently turned into ("onetwo"). + */ +#define N_(msgid) (msgid) +#endif + +const char *get_preferred_languages(void); #endif diff --git a/git-add--interactive.perl b/git-add--interactive.perl index c7256741cc..77876d433a 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -515,6 +515,9 @@ sub error_msg { sub list_and_choose { my ($opts, @stuff) = @_; my (@chosen, @return); + if (!@stuff) { + return @return; + } my $i; my @prefixes = find_unique_prefixes(@stuff) unless $opts->{LIST_ONLY}; @@ -725,6 +728,8 @@ sub add_untracked_cmd { if (@add) { system(qw(git update-index --add --), @add); say_n_paths('added', @add); + } else { + print "No untracked files.\n"; } print "\n"; } diff --git a/git-bisect.sh b/git-bisect.sh index 2fc07acb0f..ae3fec22c4 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -127,7 +127,7 @@ bisect_start() { if test "z$mode" != "z--no-checkout" then git checkout "$start_head" -- || - die "$(eval_gettext "Checking out '\$start_head' failed. Try 'git bisect reset <validbranch>'.")" + die "$(eval_gettext "Checking out '\$start_head' failed. Try 'git bisect reset <valid-branch>'.")" fi else # Get rev from where we start. diff --git a/git-compat-util.h b/git-compat-util.h index eb9b0ff328..bc8fc8cf85 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -127,6 +127,9 @@ #else #include <poll.h> #endif +#ifdef HAVE_BSD_SYSCTL +#include <sys/sysctl.h> +#endif #if defined(__MINGW32__) /* pull in Windows compatibility stuff */ @@ -164,16 +167,10 @@ typedef long intptr_t; typedef unsigned long uintptr_t; #endif -#if defined(__CYGWIN__) -#undef _XOPEN_SOURCE -#include <grp.h> -#define _XOPEN_SOURCE 600 -#else #undef _ALL_SOURCE /* AIX 5.3L defines a struct list with _ALL_SOURCE. */ #include <grp.h> #define _ALL_SOURCE 1 #endif -#endif /* used on Mac OS X */ #ifdef PRECOMPOSE_UNICODE @@ -212,12 +209,15 @@ extern char *gitbasename(char *); #endif #ifndef NO_OPENSSL +#ifdef __APPLE__ #define __AVAILABILITY_MACROS_USES_AVAILABILITY 0 -#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6 +#include <AvailabilityMacros.h> +#undef DEPRECATED_ATTRIBUTE +#define DEPRECATED_ATTRIBUTE +#undef __AVAILABILITY_MACROS_USES_AVAILABILITY +#endif #include <openssl/ssl.h> #include <openssl/err.h> -#undef MAC_OS_X_VERSION_MIN_REQUIRED -#undef __AVAILABILITY_MACROS_USES_AVAILABILITY #ifdef NO_HMAC_CTX_CLEANUP #define HMAC_CTX_cleanup HMAC_cleanup #endif @@ -678,6 +678,11 @@ extern char *xgetcwd(void); #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x))) +static inline char *xstrdup_or_null(const char *str) +{ + return str ? xstrdup(str) : NULL; +} + static inline size_t xsize_t(off_t len) { if (len > (size_t) len) @@ -686,7 +691,7 @@ static inline size_t xsize_t(off_t len) } /* in ctype.c, for kwset users */ -extern const char tolower_trans_tbl[256]; +extern const unsigned char tolower_trans_tbl[256]; /* Sane ctype - no locale, and works with signed chars */ #undef isascii @@ -870,4 +875,12 @@ struct tm *git_gmtime_r(const time_t *, struct tm *); #define gmtime_r git_gmtime_r #endif +#if !defined(USE_PARENS_AROUND_GETTEXT_N) && defined(__GNUC__) +#define USE_PARENS_AROUND_GETTEXT_N 1 +#endif + +#ifndef SHELL_PATH +# define SHELL_PATH "/bin/sh" +#endif + #endif diff --git a/git-instaweb.sh b/git-instaweb.sh index 513efa662e..47e38f34c3 100755 --- a/git-instaweb.sh +++ b/git-instaweb.sh @@ -20,6 +20,7 @@ start start the web server restart restart the web server " +SUBDIRECTORY_OK=Yes . git-sh-setup fqgitdir="$GIT_DIR" @@ -204,7 +205,7 @@ webrick_conf () { # actual gitweb.cgi using a shell script to force it wrapper="$fqgitdir/gitweb/$httpd/wrapper.sh" cat > "$wrapper" <<EOF -#!/bin/sh +#!@SHELL_PATH@ # we use this shell script wrapper around the real gitweb.cgi since # there appears to be no other way to pass arbitrary environment variables # into the CGI process @@ -1442,7 +1442,7 @@ class P4Submit(Command, P4UserMap): print " " + self.clientPath print print "To submit, use \"p4 submit\" to write a new description," - print "or \"p4 submit -i %s\" to use the one prepared by" \ + print "or \"p4 submit -i <%s\" to use the one prepared by" \ " \"git p4\"." % fileName print "You can delete the file \"%s\" when finished." % fileName @@ -1915,7 +1915,10 @@ class P4Sync(Command, P4UserMap): optparse.make_option("--keep-path", dest="keepRepoPath", action='store_true', help="Keep entire BRANCH/DIR/SUBDIR prefix during import"), optparse.make_option("--use-client-spec", dest="useClientSpec", action='store_true', - help="Only sync files that are included in the Perforce Client Spec") + help="Only sync files that are included in the Perforce Client Spec"), + optparse.make_option("-/", dest="cloneExclude", + action="append", type="string", + help="exclude depot path"), ] self.description = """Imports from Perforce into a git repository.\n example: @@ -1950,6 +1953,12 @@ class P4Sync(Command, P4UserMap): if gitConfig("git-p4.syncFromOrigin") == "false": self.syncWithOrigin = False + # This is required for the "append" cloneExclude action + def ensure_value(self, attr, value): + if not hasattr(self, attr) or getattr(self, attr) is None: + setattr(self, attr, value) + return getattr(self, attr) + # Force a checkpoint in fast-import and wait for it to finish def checkpoint(self): self.gitStream.write("checkpoint\n\n") @@ -3101,9 +3110,6 @@ class P4Clone(P4Sync): optparse.make_option("--destination", dest="cloneDestination", action='store', default=None, help="where to leave result of the clone"), - optparse.make_option("-/", dest="cloneExclude", - action="append", type="string", - help="exclude depot path"), optparse.make_option("--bare", dest="cloneBare", action="store_true", default=False), ] @@ -3111,12 +3117,6 @@ class P4Clone(P4Sync): self.needsGit = False self.cloneBare = False - # This is required for the "append" cloneExclude action - def ensure_value(self, attr, value): - if not hasattr(self, attr) or getattr(self, attr) is None: - setattr(self, attr, value) - return getattr(self, attr) - def defaultDestination(self, args): ## TODO: use common prefix of args? depotPath = args[0] diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index c6a4629cbc..f7deeb096e 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -961,14 +961,13 @@ else revisions=$onto...$orig_head shortrevisions=$shorthead fi -git rev-list $merges_option --pretty=oneline --abbrev-commit \ - --abbrev=7 --reverse --left-right --topo-order \ +git rev-list $merges_option --pretty=oneline --reverse --left-right --topo-order \ $revisions ${restrict_revision+^$restrict_revision} | \ sed -n "s/^>//p" | -while read -r shortsha1 rest +while read -r sha1 rest do - if test -z "$keep_empty" && is_empty_commit $shortsha1 && ! is_merge_commit $shortsha1 + if test -z "$keep_empty" && is_empty_commit $sha1 && ! is_merge_commit $sha1 then comment_out="$comment_char " else @@ -977,9 +976,8 @@ do if test t != "$preserve_merges" then - printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo" + printf '%s\n' "${comment_out}pick $sha1 $rest" >>"$todo" else - sha1=$(git rev-parse $shortsha1) if test -z "$rebase_root" then preserve=t @@ -996,7 +994,7 @@ do if test f = "$preserve" then touch "$rewritten"/$sha1 - printf '%s\n' "${comment_out}pick $shortsha1 $rest" >>"$todo" + printf '%s\n' "${comment_out}pick $sha1 $rest" >>"$todo" fi fi done @@ -1020,8 +1018,8 @@ then # just the history of its first-parent for others that will # be rebasing on top of it git rev-list --parents -1 $rev | cut -d' ' -s -f2 > "$dropped"/$rev - short=$(git rev-list -1 --abbrev-commit --abbrev=7 $rev) - sane_grep -v "^[a-z][a-z]* $short" <"$todo" > "${todo}2" ; mv "${todo}2" "$todo" + sha1=$(git rev-list -1 $rev) + sane_grep -v "^[a-z][a-z]* $sha1" <"$todo" > "${todo}2" ; mv "${todo}2" "$todo" rm "$rewritten"/$rev fi done @@ -1032,10 +1030,11 @@ test -n "$autosquash" && rearrange_squash "$todo" test -n "$cmd" && add_exec_commands "$todo" todocount=$(git stripspace --strip-comments <"$todo" | wc -l) +todocount=${todocount##* } cat >>"$todo" <<EOF -$comment_char Rebase $shortrevisions onto $shortonto ($todocount TODO item(s)) +$comment_char Rebase $shortrevisions onto $shortonto ($todocount command(s)) EOF append_todo_help git stripspace --comment-lines >>"$todo" <<\EOF @@ -1054,6 +1053,7 @@ has_action "$todo" || return 2 cp "$todo" "$todo".backup +collapse_todo_ids git_sequence_editor "$todo" || die_abort "Could not execute editor" diff --git a/git-remote-testgit.sh b/git-remote-testgit.sh index a9c75a2360..752c763eb6 100755 --- a/git-remote-testgit.sh +++ b/git-remote-testgit.sh @@ -1,7 +1,13 @@ #!/bin/sh # Copyright (c) 2012 Felipe Contreras -alias=$1 +# The first argument can be a url when the fetch/push command was a url +# instead of a configured remote. In this case, use a generic alias. +if test "$1" = "testgit::$2"; then + alias=_ +else + alias=$1 +fi url=$2 dir="$GIT_DIR/testgit/$alias" diff --git a/git-send-email.perl b/git-send-email.perl index 3092ab356c..e1e9b1460c 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -299,6 +299,7 @@ my $rc = GetOptions("h" => \$help, "bcc=s" => \@bcclist, "no-bcc" => \$no_bcc, "chain-reply-to!" => \$chain_reply_to, + "no-chain-reply-to" => sub {$chain_reply_to = 0}, "smtp-server=s" => \$smtp_server, "smtp-server-option=s" => \@smtp_server_options, "smtp-server-port=s" => \$smtp_server_port, @@ -311,25 +312,34 @@ my $rc = GetOptions("h" => \$help, "smtp-domain:s" => \$smtp_domain, "identity=s" => \$identity, "annotate!" => \$annotate, + "no-annotate" => sub {$annotate = 0}, "compose" => \$compose, "quiet" => \$quiet, "cc-cmd=s" => \$cc_cmd, "suppress-from!" => \$suppress_from, + "no-suppress-from" => sub {$suppress_from = 0}, "suppress-cc=s" => \@suppress_cc, "signed-off-cc|signed-off-by-cc!" => \$signed_off_by_cc, + "no-signed-off-cc|no-signed-off-by-cc" => sub {$signed_off_by_cc = 0}, "cc-cover|cc-cover!" => \$cover_cc, + "no-cc-cover" => sub {$cover_cc = 0}, "to-cover|to-cover!" => \$cover_to, + "no-to-cover" => sub {$cover_to = 0}, "confirm=s" => \$confirm, "dry-run" => \$dry_run, "envelope-sender=s" => \$envelope_sender, "thread!" => \$thread, + "no-thread" => sub {$thread = 0}, "validate!" => \$validate, + "no-validate" => sub {$validate = 0}, "transfer-encoding=s" => \$target_xfer_encoding, "format-patch!" => \$format_patch, + "no-format-patch" => sub {$format_patch = 0}, "8bit-encoding=s" => \$auto_8bit_encoding, "compose-encoding=s" => \$compose_encoding, "force" => \$force, "xmailer!" => \$use_xmailer, + "no-xmailer" => sub {$use_xmailer = 0}, ); usage() if $help; @@ -752,6 +762,7 @@ if (!defined $auto_8bit_encoding && scalar %broken_encoding) { print " $f\n"; } $auto_8bit_encoding = ask("Which 8bit encoding should I declare [UTF-8]? ", + valid_re => qr/.{4}/, confirm_only => 1, default => "UTF-8"); } diff --git a/git-submodule.sh b/git-submodule.sh index 9245abfd42..36797c3c00 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -423,7 +423,7 @@ cmd_add() sed -e ' s|//*|/|g s|^\(\./\)*|| - s|/\./|/|g + s|/\(\./\)*|/|g :start s|\([^/]*\)/\.\./|| tstart diff --git a/git-svn.perl b/git-svn.perl index 32d109ebdf..36f7240c99 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -11,14 +11,10 @@ $AUTHOR = 'Eric Wong <normalperson@yhbt.net>'; $VERSION = '@@GIT_VERSION@@'; use Carp qw/croak/; -use Digest::MD5; -use IO::File qw//; use File::Basename qw/dirname basename/; use File::Path qw/mkpath/; use File::Spec; -use File::Find; use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/; -use IPC::Open3; use Memoize; use Git::SVN; @@ -298,7 +294,6 @@ my %cmd = ( {} ], ); -use Term::ReadLine; package FakeTerm; sub new { my ($class, $reason) = @_; @@ -313,6 +308,7 @@ package main; my $term; sub term_init { $term = eval { + require Term::ReadLine; $ENV{"GIT_SVN_NOTTY"} ? new Term::ReadLine 'git-svn', \*STDIN, \*STDOUT : new Term::ReadLine 'git-svn'; @@ -1173,6 +1169,7 @@ sub cmd_branch { } ::_req_svn(); + require SVN::Client; my $ctx = SVN::Client->new( config => SVN::Core::config_get_config( @@ -1693,11 +1690,13 @@ sub cmd_reset { } sub cmd_gc { + require File::Find; if (!can_compress()) { warn "Compress::Zlib could not be found; unhandled.log " . "files will not be compressed.\n"; } - find({ wanted => \&gc_directory, no_chdir => 1}, "$ENV{GIT_DIR}/svn"); + File::Find::find({ wanted => \&gc_directory, no_chdir => 1}, + "$ENV{GIT_DIR}/svn"); } ########################### utility functions ######################### @@ -2122,6 +2121,7 @@ sub find_file_type_and_diff_status { sub md5sum { my $arg = shift; my $ref = ref $arg; + require Digest::MD5; my $md5 = Digest::MD5->new(); if ($ref eq 'GLOB' || $ref eq 'IO::File' || $ref eq 'File::Temp') { $md5->addfile($arg) or croak $!; @@ -2148,6 +2148,7 @@ sub gc_directory { $gz->gzwrite($str) or die "Unable to write: ".$gz->gzerror()."!\n"; } + no warnings 'once'; # $File::Find::name would warn unlink $_ or die "unlink $File::Find::name: $!\n"; } elsif (-f $_ && basename($_) eq "index") { unlink $_ or die "unlink $_: $!\n"; @@ -6,7 +6,7 @@ const char git_usage_string[] = "git [--version] [--help] [-C <path>] [-c name=value]\n" " [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]\n" - " [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]\n" + " [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]\n" " [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\n" " <command> [<args>]"; @@ -204,10 +204,12 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) fprintf(stderr, "No directory given for -C.\n" ); usage(git_usage_string); } - if (chdir((*argv)[1])) - die_errno("Cannot change to '%s'", (*argv)[1]); - if (envchanged) - *envchanged = 1; + if ((*argv)[1][0]) { + if (chdir((*argv)[1])) + die_errno("Cannot change to '%s'", (*argv)[1]); + if (envchanged) + *envchanged = 1; + } (*argv)++; (*argc)--; } else { @@ -618,6 +620,7 @@ int main(int argc, char **av) { const char **argv = (const char **) av; const char *cmd; + int done_help = 0; startup_info = &git_startup_info; @@ -680,9 +683,7 @@ int main(int argc, char **av) setup_path(); while (1) { - static int done_help = 0; - static int was_alias = 0; - was_alias = run_argv(&argc, &argv); + int was_alias = run_argv(&argc, &argv); if (errno != ENOENT) break; if (was_alias) { diff --git a/gitk-git/gitk b/gitk-git/gitk index 78358a712a..9a2daf3c55 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -2516,6 +2516,13 @@ proc makewindow {} { } else { bindall <ButtonRelease-4> "allcanvs yview scroll -5 units" bindall <ButtonRelease-5> "allcanvs yview scroll 5 units" + bind $ctext <Button> { + if {"%b" eq 6} { + $ctext xview scroll -5 units + } elseif {"%b" eq 7} { + $ctext xview scroll 5 units + } + } if {[tk windowingsystem] eq "aqua"} { bindall <MouseWheel> { set delta [expr {- (%D)}] @@ -2776,33 +2783,87 @@ proc doprogupdate {} { } } +proc config_check_tmp_exists {tries_left} { + global config_file_tmp + + if {[file exists $config_file_tmp]} { + incr tries_left -1 + if {$tries_left > 0} { + after 100 [list config_check_tmp_exists $tries_left] + } else { + error_popup "There appears to be a stale $config_file_tmp\ + file, which will prevent gitk from saving its configuration on exit.\ + Please remove it if it is not being used by any existing gitk process." + } + } +} + +proc config_init_trace {name} { + global config_variable_changed config_variable_original + + upvar #0 $name var + set config_variable_changed($name) 0 + set config_variable_original($name) $var +} + +proc config_variable_change_cb {name name2 op} { + global config_variable_changed config_variable_original + + upvar #0 $name var + if {$op eq "write" && + (![info exists config_variable_original($name)] || + $config_variable_original($name) ne $var)} { + set config_variable_changed($name) 1 + } +} + proc savestuff {w} { - global viewname viewfiles viewargs viewargscmd viewperm nextviewnum - global use_ttk global stuffsaved global config_file config_file_tmp - global config_variables + global config_variables config_variable_changed + global viewchanged + + upvar #0 viewname current_viewname + upvar #0 viewfiles current_viewfiles + upvar #0 viewargs current_viewargs + upvar #0 viewargscmd current_viewargscmd + upvar #0 viewperm current_viewperm + upvar #0 nextviewnum current_nextviewnum + upvar #0 use_ttk current_use_ttk if {$stuffsaved} return if {![winfo viewable .]} return - catch { - if {[file exists $config_file_tmp]} { - file delete -force $config_file_tmp + set remove_tmp 0 + if {[catch { + set try_count 0 + while {[catch {set f [open $config_file_tmp {WRONLY CREAT EXCL}]}]} { + if {[incr try_count] > 50} { + error "Unable to write config file: $config_file_tmp exists" + } + after 100 } - set f [open $config_file_tmp w] + set remove_tmp 1 if {$::tcl_platform(platform) eq {windows}} { file attributes $config_file_tmp -hidden true } + if {[file exists $config_file]} { + source $config_file + } foreach var_name $config_variables { upvar #0 $var_name var - puts $f [list set $var_name $var] + upvar 0 $var_name old_var + if {!$config_variable_changed($var_name) && [info exists old_var]} { + puts $f [list set $var_name $old_var] + } else { + puts $f [list set $var_name $var] + } } puts $f "set geometry(main) [wm geometry .]" puts $f "set geometry(state) [wm state .]" puts $f "set geometry(topwidth) [winfo width .tf]" puts $f "set geometry(topheight) [winfo height .tf]" - if {$use_ttk} { + if {$current_use_ttk} { puts $f "set geometry(pwsash0) \"[.tf.histframe.pwclist sashpos 0] 1\"" puts $f "set geometry(pwsash1) \"[.tf.histframe.pwclist sashpos 1] 1\"" } else { @@ -2812,15 +2873,43 @@ proc savestuff {w} { puts $f "set geometry(botwidth) [winfo width .bleft]" puts $f "set geometry(botheight) [winfo height .bleft]" + array set view_save {} + array set views {} + if {![info exists permviews]} { set permviews {} } + foreach view $permviews { + set view_save([lindex $view 0]) 1 + set views([lindex $view 0]) $view + } puts -nonewline $f "set permviews {" - for {set v 0} {$v < $nextviewnum} {incr v} { - if {$viewperm($v)} { - puts $f "{[list $viewname($v) $viewfiles($v) $viewargs($v) $viewargscmd($v)]}" + for {set v 1} {$v < $current_nextviewnum} {incr v} { + if {$viewchanged($v)} { + if {$current_viewperm($v)} { + set views($current_viewname($v)) [list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v)] + } else { + set view_save($current_viewname($v)) 0 + } + } + } + # write old and updated view to their places and append remaining to the end + foreach view $permviews { + set view_name [lindex $view 0] + if {$view_save($view_name)} { + puts $f "{$views($view_name)}" } + unset views($view_name) + } + foreach view_name [array names views] { + puts $f "{$views($view_name)}" } puts $f "}" close $f file rename -force $config_file_tmp $config_file + set remove_tmp 0 + } err]} { + puts "Error saving config: $err" + } + if {$remove_tmp} { + file delete -force $config_file_tmp } set stuffsaved 1 } @@ -3977,6 +4066,7 @@ set known_view_options { {committer t15 . "--committer=*" {mc "Committer:"}} {loginfo t15 .. "--grep=*" {mc "Commit Message:"}} {allmatch b .. "--all-match" {mc "Matches all Commit Info criteria"}} + {igrep b .. "--invert-grep" {mc "Matches none Commit Info criteria"}} {changes_l l + {} {mc "Changes to Files:"}} {pickaxe_s r0 . {} {mc "Fixed String"}} {pickaxe_t r1 . "--pickaxe-regex" {mc "Regular Expression"}} @@ -4238,7 +4328,7 @@ proc allviewmenus {n op args} { proc newviewok {top n {apply 0}} { global nextviewnum newviewperm newviewname newishighlight - global viewname viewfiles viewperm selectedview curview + global viewname viewfiles viewperm viewchanged selectedview curview global viewargs viewargscmd newviewopts viewhlmenu if {[catch { @@ -4259,6 +4349,7 @@ proc newviewok {top n {apply 0}} { incr nextviewnum set viewname($n) $newviewname($n) set viewperm($n) $newviewopts($n,perm) + set viewchanged($n) 1 set viewfiles($n) $files set viewargs($n) $newargs set viewargscmd($n) $newviewopts($n,cmd) @@ -4271,6 +4362,7 @@ proc newviewok {top n {apply 0}} { } else { # editing an existing view set viewperm($n) $newviewopts($n,perm) + set viewchanged($n) 1 if {$newviewname($n) ne $viewname($n)} { set viewname($n) $newviewname($n) doviewmenu .bar.view 5 [list showview $n] \ @@ -4293,7 +4385,7 @@ proc newviewok {top n {apply 0}} { } proc delview {} { - global curview viewperm hlview selectedhlview + global curview viewperm hlview selectedhlview viewchanged if {$curview == 0} return if {[info exists hlview] && $hlview == $curview} { @@ -4302,6 +4394,7 @@ proc delview {} { } allviewmenus $curview delete set viewperm($curview) 0 + set viewchanged($curview) 1 showview 0 } @@ -11237,6 +11330,7 @@ proc prefspage_general {notebook} { ${NS}::label $page.maxwidthl -text [mc "Maximum graph width (lines)"] spinbox $page.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth grid $page.spacer $page.maxwidthl $page.maxwidth -sticky w + #xgettext:no-tcl-format ${NS}::label $page.maxpctl -text [mc "Maximum graph width (% of pane)"] spinbox $page.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct grid x $page.maxpctl $page.maxpct -sticky w @@ -11936,7 +12030,7 @@ if { [info exists ::env(GIT_TRACE)] } { } # defaults... -set wrcomcmd "git diff-tree --stdin -p --pretty" +set wrcomcmd "git diff-tree --stdin -p --pretty=email" set gitencoding {} catch { @@ -12109,6 +12203,7 @@ catch { } source $config_file } +config_check_tmp_exists 50 set config_variables { mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth @@ -12122,6 +12217,10 @@ set config_variables { linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor indexcirclecolor circlecolors linkfgcolor circleoutlinecolor } +foreach var $config_variables { + config_init_trace $var + trace add variable $var write config_variable_change_cb +} parsefont mainfont $mainfont eval font create mainfont [fontflags mainfont] @@ -12249,6 +12348,7 @@ set highlight_related [mc "None"] set highlight_files {} set viewfiles(0) {} set viewperm(0) 0 +set viewchanged(0) 0 set viewargs(0) {} set viewargscmd(0) {} @@ -12307,6 +12407,7 @@ if {$cmdline_files ne {} || $revtreeargs ne {} || $revtreeargscmd ne {}} { set viewargs(1) $revtreeargs set viewargscmd(1) $revtreeargscmd set viewperm(1) 0 + set viewchanged(1) 0 set vdatemode(1) 0 addviewmenu 1 .bar.view entryconf [mca "Edit view..."] -state normal @@ -12322,6 +12423,7 @@ if {[info exists permviews]} { set viewargs($n) [lindex $v 2] set viewargscmd($n) [lindex $v 3] set viewperm($n) 1 + set viewchanged($n) 0 addviewmenu $n } } diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po index f86a161129..1df0716c38 100644 --- a/gitk-git/po/bg.po +++ b/gitk-git/po/bg.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: gitk master\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-08-03 11:17+0300\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2014-07-28 07:32+0300\n" "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" "Language-Team: Bulgarian <dict@fsa-bg.org>\n" @@ -22,28 +22,28 @@ msgstr "" msgid "Couldn't get list of unmerged files:" msgstr "Списъкът с неслети файлове не може да бъде получен:" -#: gitk:212 gitk:2379 +#: gitk:212 gitk:2381 msgid "Color words" msgstr "Оцветяване на думите" -#: gitk:217 gitk:2379 gitk:8155 gitk:8188 +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 msgid "Markup words" msgstr "Отбелязване на думите" -#: gitk:322 +#: gitk:324 msgid "Error parsing revisions:" msgstr "Грешка при разбор на версиите:" -#: gitk:378 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Грешка при изпълнение на командата с „--argscmd“." -#: gitk:391 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове." -#: gitk:394 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -51,306 +51,306 @@ msgstr "" "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове " "в ограниченията." -#: gitk:416 gitk:564 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Грешка при изпълнение на „git log“:" -#: gitk:434 gitk:580 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Прочитане" -#: gitk:494 gitk:4470 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Прочитане на подаванията…" -#: gitk:497 gitk:1635 gitk:4473 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Не са избрани подавания" -#: gitk:1509 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Изходът от „git log“ не може да се анализира:" -#: gitk:1738 +#: gitk:1740 msgid "No commit information available" msgstr "Липсва информация за подавания" -#: gitk:1895 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1930 gitk:4263 gitk:9604 gitk:11174 gitk:11453 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "Добре" -#: gitk:1932 gitk:4265 gitk:9131 gitk:9210 gitk:9326 gitk:9375 gitk:9606 -#: gitk:11175 gitk:11454 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Отказ" -#: gitk:2067 +#: gitk:2069 msgid "Update" msgstr "Обновяване" -#: gitk:2068 +#: gitk:2070 msgid "Reload" msgstr "Презареждане" -#: gitk:2069 +#: gitk:2071 msgid "Reread references" msgstr "Наново прочитане на настройките" -#: gitk:2070 +#: gitk:2072 msgid "List references" msgstr "Изброяване на указателите" -#: gitk:2072 +#: gitk:2074 msgid "Start git gui" msgstr "Стартиране на „git gui“" -#: gitk:2074 +#: gitk:2076 msgid "Quit" msgstr "Спиране на програмата" -#: gitk:2066 +#: gitk:2068 msgid "File" msgstr "Файл" -#: gitk:2078 +#: gitk:2080 msgid "Preferences" msgstr "Настройки" -#: gitk:2077 +#: gitk:2079 msgid "Edit" msgstr "Редактиране" -#: gitk:2082 +#: gitk:2084 msgid "New view..." msgstr "Нов изглед…" -#: gitk:2083 +#: gitk:2085 msgid "Edit view..." msgstr "Редактиране на изгледа…" -#: gitk:2084 +#: gitk:2086 msgid "Delete view" msgstr "Изтриване на изгледа" -#: gitk:2086 +#: gitk:2088 msgid "All files" msgstr "Всички файлове" -#: gitk:2081 gitk:4016 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Изглед" -#: gitk:2091 gitk:2101 gitk:2976 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Относно gitk" -#: gitk:2092 gitk:2106 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Клавишни комбинации" -#: gitk:2090 gitk:2105 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Помощ" -#: gitk:2183 gitk:8587 +#: gitk:2185 gitk:8633 msgid "SHA1 ID:" msgstr "SHA1:" -#: gitk:2227 +#: gitk:2229 msgid "Row" msgstr "Ред" -#: gitk:2265 +#: gitk:2267 msgid "Find" msgstr "Търсене" -#: gitk:2293 +#: gitk:2295 msgid "commit" msgstr "подаване" -#: gitk:2297 gitk:2299 gitk:4631 gitk:4654 gitk:4678 gitk:6698 gitk:6770 -#: gitk:6855 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "съдържащо:" -#: gitk:2300 gitk:3488 gitk:3493 gitk:4707 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "засягащо пътищата:" -#: gitk:2301 gitk:4721 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "добавящо/премахващо низ" -#: gitk:2302 gitk:4723 +#: gitk:2304 gitk:4761 msgid "changing lines matching:" msgstr "променящо редове напасващи:" -#: gitk:2311 gitk:2313 gitk:4710 +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Точно" -#: gitk:2313 gitk:4798 gitk:6666 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "Без регистър" -#: gitk:2313 gitk:4680 gitk:4796 gitk:6662 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Рег. израз" -#: gitk:2315 gitk:2316 gitk:4818 gitk:4848 gitk:4855 gitk:6791 gitk:6859 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Всички полета" -#: gitk:2316 gitk:4815 gitk:4848 gitk:6729 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Първи ред" -#: gitk:2317 gitk:4815 gitk:6729 gitk:6859 gitk:7332 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Коментари" -#: gitk:2317 gitk:4815 gitk:4820 gitk:4855 gitk:6729 gitk:7267 gitk:8765 -#: gitk:8780 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Автор" -#: gitk:2317 gitk:4815 gitk:6729 gitk:7269 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Подаващ" -#: gitk:2348 +#: gitk:2350 msgid "Search" msgstr "Търсене" -#: gitk:2356 +#: gitk:2358 msgid "Diff" msgstr "Разлики" -#: gitk:2358 +#: gitk:2360 msgid "Old version" msgstr "Стара версия" -#: gitk:2360 +#: gitk:2362 msgid "New version" msgstr "Нова версия" -#: gitk:2362 +#: gitk:2364 msgid "Lines of context" msgstr "Контекст в редове" -#: gitk:2372 +#: gitk:2374 msgid "Ignore space change" msgstr "Празните знаци без значение" -#: gitk:2376 gitk:2378 gitk:7894 gitk:8141 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 msgid "Line diff" msgstr "Поредови разлики" -#: gitk:2443 +#: gitk:2445 msgid "Patch" msgstr "Кръпка" -#: gitk:2445 +#: gitk:2447 msgid "Tree" msgstr "Дърво" -#: gitk:2604 gitk:2624 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Разлики между това и избраното" -#: gitk:2605 gitk:2625 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Разлики между избраното и това" -#: gitk:2606 gitk:2626 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Създаване на кръпка" -#: gitk:2607 gitk:9189 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Създаване на етикет" -#: gitk:2608 gitk:9306 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Запазване на подаването във файл" -#: gitk:2609 gitk:9363 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Създаване на нов клон" -#: gitk:2610 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Отбиране на това подаване" -#: gitk:2611 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Привеждане на върха на клона към текущото подаване" -#: gitk:2612 +#: gitk:2624 msgid "Mark this commit" msgstr "Отбелязване на това подаване" -#: gitk:2613 +#: gitk:2625 msgid "Return to mark" msgstr "Връщане към отбелязаното подаване" -#: gitk:2614 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Откриване и отбелязване на наследниците" -#: gitk:2615 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Сравнение с отбелязаното подаване" -#: gitk:2616 gitk:2627 +#: gitk:2628 gitk:2639 msgid "Diff this -> marked commit" msgstr "Разлики между това и отбелязаното" -#: gitk:2617 gitk:2628 +#: gitk:2629 gitk:2640 msgid "Diff marked commit -> this" msgstr "Разлики между отбелязаното и това" -#: gitk:2618 +#: gitk:2630 msgid "Revert this commit" msgstr "Отмяна на това подаване" -#: gitk:2634 +#: gitk:2646 msgid "Check out this branch" msgstr "Изтегляне на този клон" -#: gitk:2635 +#: gitk:2647 msgid "Remove this branch" msgstr "Изтриване на този клон" -#: gitk:2642 +#: gitk:2654 msgid "Highlight this too" msgstr "Отбелязване и на това" -#: gitk:2643 +#: gitk:2655 msgid "Highlight this only" msgstr "Отбелязване само на това" -#: gitk:2644 +#: gitk:2656 msgid "External diff" msgstr "Външна програма за разлики" -#: gitk:2645 +#: gitk:2657 msgid "Blame parent commit" msgstr "Анотиране на родителското подаване" -#: gitk:2652 +#: gitk:2664 msgid "Show origin of this line" msgstr "Показване на произхода на този ред" -#: gitk:2653 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Изпълнение на „git gui blame“ върху този ред" -#: gitk:2978 +#: gitk:3011 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -366,303 +366,313 @@ msgstr "" "\n" "Използвайте и разпространявайте при условията на ОПЛ на ГНУ" -#: gitk:2986 gitk:3051 gitk:9790 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Затваряне" -#: gitk:3007 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Клавишни комбинации" -#: gitk:3010 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Клавишни комбинации:" -#: gitk:3012 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tСпиране на програмата" -#: gitk:3013 +#: gitk:3046 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tЗатваряне на прозореца" -#: gitk:3014 +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tКъм първото подаване" -#: gitk:3015 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tКъм последното подаване" -#: gitk:3016 +#: gitk:3049 msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, k\tЕдно подаване нагоре" -#: gitk:3017 +#: gitk:3050 msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, j\tЕдно подаване надолу" -#: gitk:3018 +#: gitk:3051 msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, h\tНазад в историята" -#: gitk:3019 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\tНапред в историята" -#: gitk:3020 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tСтраница нагоре в списъка с подаванията" -#: gitk:3021 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tСтраница надолу в списъка с подаванията" -#: gitk:3022 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tКъм началото на списъка с подаванията" -#: gitk:3023 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tКъм края на списъка с подаванията" -#: gitk:3024 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tРед нагоре в списъка с подавания" -#: gitk:3025 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tРед надолу в списъка с подавания" -#: gitk:3026 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tСтраница нагоре в списъка с подавания" -#: gitk:3027 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tСтраница надолу в списъка с подавания" -#: gitk:3028 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)" -#: gitk:3029 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "" "<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)" -#: gitk:3030 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tСтраница нагоре в изгледа за разлики" -#: gitk:3031 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tСтраница надолу в изгледа за разлики" -#: gitk:3032 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Space>\t\tСтраница надолу в изгледа за разлики" -#: gitk:3033 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\t18 реда нагоре в изгледа за разлики" -#: gitk:3034 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\t18 реда надолу в изгледа за разлики" -#: gitk:3035 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tТърсене" -#: gitk:3036 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tКъм следващата поява" -#: gitk:3037 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\tКъм следващата поява" -#: gitk:3038 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tФокус върху полето за търсене" -#: gitk:3039 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tКъм предишната поява" -#: gitk:3040 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tСледващ файл в изгледа за разлики" -#: gitk:3041 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики" -#: gitk:3042 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики" -#: gitk:3043 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tПо-голям размер на шрифта" -#: gitk:3044 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tПо-голям размер на шрифта" -#: gitk:3045 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tПо-малък размер на шрифта" -#: gitk:3046 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tПо-малък размер на шрифта" -#: gitk:3047 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tОбновяване" -#: gitk:3512 gitk:3521 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Грешка при създаването на временната директория „%s“:" -#: gitk:3534 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Грешка при получаването на „%s“ от %s:" -#: gitk:3597 +#: gitk:3631 msgid "command failed:" msgstr "неуспешно изпълнение на команда:" -#: gitk:3746 +#: gitk:3780 msgid "No such commit" msgstr "Такова подаване няма" -#: gitk:3760 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "„git gui blame“: неуспешно изпълнение на команда:" -#: gitk:3791 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Върхът за сливане не може да бъде прочетен: %s" -#: gitk:3799 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Грешка при прочитане на индекса: %s" -#: gitk:3824 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Командата „git blame“ не може да бъде стартирана: %s" -#: gitk:3827 gitk:6697 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Търсене" -#: gitk:3859 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Грешка при изпълнението на „git blame“: %s" -#: gitk:3887 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Този ред идва от подаването %s, което не е в изгледа" -#: gitk:3901 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Неуспешно изпълнение на външната програма за разлики:" -#: gitk:4019 +#: gitk:4053 msgid "Gitk view definition" msgstr "Дефиниция на изглед в Gitk" -#: gitk:4023 +#: gitk:4057 msgid "Remember this view" msgstr "Запазване на този изглед" -#: gitk:4024 +#: gitk:4058 msgid "References (space separated list):" msgstr "Указатели (списък с разделител интервал):" -#: gitk:4025 +#: gitk:4059 msgid "Branches & tags:" msgstr "Клони и етикети:" -#: gitk:4026 +#: gitk:4060 msgid "All refs" msgstr "Всички указатели" -#: gitk:4027 +#: gitk:4061 msgid "All (local) branches" msgstr "Всички (локални) клони" -#: gitk:4028 +#: gitk:4062 msgid "All tags" msgstr "Всички етикети" -#: gitk:4029 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Всички следящи клони" -#: gitk:4030 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Информация за подаване (рег. изр.):" -#: gitk:4031 +#: gitk:4065 msgid "Author:" msgstr "Автор:" -#: gitk:4032 +#: gitk:4066 msgid "Committer:" msgstr "Подал:" -#: gitk:4033 +#: gitk:4067 msgid "Commit Message:" msgstr "Съобщение при подаване:" -#: gitk:4034 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Съвпадение по коя да е информация за подаването" -#: gitk:4035 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Съвпадение по коя да е информация за подаването" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Промени по файловете:" -#: gitk:4036 +#: gitk:4071 msgid "Fixed String" msgstr "Дословен низ" -#: gitk:4037 +#: gitk:4072 msgid "Regular Expression" msgstr "Регулярен израз" -#: gitk:4038 +#: gitk:4073 msgid "Search string:" msgstr "Низ за търсене:" -#: gitk:4039 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -670,204 +680,204 @@ msgstr "" "Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, " "„March 17, 2009 15:27:38“):" -#: gitk:4040 +#: gitk:4075 msgid "Since:" msgstr "От:" -#: gitk:4041 +#: gitk:4076 msgid "Until:" msgstr "До:" -#: gitk:4042 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "" "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло " "число):" -#: gitk:4043 +#: gitk:4078 msgid "Number to show:" msgstr "Брой показани:" -#: gitk:4044 +#: gitk:4079 msgid "Number to skip:" msgstr "Брой прескочени:" -#: gitk:4045 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Разни:" -#: gitk:4046 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Подреждане по дата" -#: gitk:4047 +#: gitk:4082 msgid "Mark branch sides" msgstr "Отбелязване на страните по клона" -#: gitk:4048 +#: gitk:4083 msgid "Limit to first parent" msgstr "Само първия родител" -#: gitk:4049 +#: gitk:4084 msgid "Simple history" msgstr "Опростена история" -#: gitk:4050 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Допълнителни аргументи към „git log“:" -#: gitk:4051 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Въведете файловете и директориите за включване, по елемент на ред" -#: gitk:4052 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "" "Команда за генерирането на допълнителни подавания, които да бъдат включени:" -#: gitk:4176 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: редактиране на изглед" -#: gitk:4184 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "— критерии за избор на версии" -#: gitk:4189 +#: gitk:4224 msgid "View Name" msgstr "Име на изглед" -#: gitk:4264 +#: gitk:4299 msgid "Apply (F5)" msgstr "Прилагане (F5)" -#: gitk:4302 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Грешка в аргументите за избор на подавания:" -#: gitk:4355 gitk:4407 gitk:4868 gitk:4882 gitk:6152 gitk:12281 gitk:12282 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Няма" -#: gitk:4965 gitk:4970 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Наследник" -#: gitk:4966 +#: gitk:5004 msgid "Not descendant" msgstr "Не е наследник" -#: gitk:4973 gitk:4978 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Предшественик" -#: gitk:4974 +#: gitk:5012 msgid "Not ancestor" msgstr "Не е предшественик" -#: gitk:5268 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Локални промени добавени към индекса, но неподадени" -#: gitk:5304 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Локални промени извън индекса" -#: gitk:7077 +#: gitk:7115 msgid "and many more" msgstr "и още много" -#: gitk:7080 +#: gitk:7118 msgid "many" msgstr "много" -#: gitk:7271 +#: gitk:7309 msgid "Tags:" msgstr "Етикети:" -#: gitk:7288 gitk:7294 gitk:8760 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Родител" -#: gitk:7299 +#: gitk:7337 msgid "Child" msgstr "Дете" -#: gitk:7308 +#: gitk:7346 msgid "Branch" msgstr "Клон" -#: gitk:7311 +#: gitk:7349 msgid "Follows" msgstr "Следва" -#: gitk:7314 +#: gitk:7352 msgid "Precedes" msgstr "Предшества" -#: gitk:7901 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Грешка при получаването на разликите: %s" -#: gitk:8585 +#: gitk:8631 msgid "Goto:" msgstr "Към ред:" -#: gitk:8606 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Съкратената сума по SHA1 %s не е еднозначна" -#: gitk:8613 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "Непозната версия %s" -#: gitk:8623 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "Непозната сума по SHA1 %s" -#: gitk:8625 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Версия %s не е в текущия изглед" -#: gitk:8767 gitk:8782 +#: gitk:8813 gitk:8828 msgid "Date" msgstr "Дата" -#: gitk:8770 +#: gitk:8816 msgid "Children" msgstr "Деца" -#: gitk:8833 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Зануляване на клона „%s“ към текущото подаване" -#: gitk:8835 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Несвързан връх: невъзможно зануляване" -#: gitk:8940 gitk:8946 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Пропускане на подаването на сливането" -#: gitk:8955 gitk:8960 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Грешка при получаването на идентификатора на " -#: gitk:8956 gitk:8961 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " — спиране\n" -#: gitk:8966 gitk:8969 gitk:8977 gitk:8991 gitk:9000 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Подаване" -#: gitk:8970 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -875,7 +885,7 @@ msgstr "" " е същата кръпка като\n" " " -#: gitk:8978 +#: gitk:9024 msgid "" " differs from\n" " " @@ -883,7 +893,7 @@ msgstr "" " се различава от\n" " " -#: gitk:8980 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -891,130 +901,130 @@ msgstr "" "Разлика между подаванията:\n" "\n" -#: gitk:8992 gitk:9001 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " има %s деца — спиране\n" -#: gitk:9020 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Грешка при запазването на подаването във файл: %s" -#: gitk:9026 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "Грешка при изчисляването на разликите между подаванията: %s" -#: gitk:9072 +#: gitk:9118 msgid "Top" msgstr "Най-горе" -#: gitk:9073 +#: gitk:9119 msgid "From" msgstr "От" -#: gitk:9078 +#: gitk:9124 msgid "To" msgstr "До" -#: gitk:9102 +#: gitk:9148 msgid "Generate patch" msgstr "Генериране на кръпка" -#: gitk:9104 +#: gitk:9150 msgid "From:" msgstr "От:" -#: gitk:9113 +#: gitk:9159 msgid "To:" msgstr "До:" -#: gitk:9122 +#: gitk:9168 msgid "Reverse" msgstr "Обръщане" -#: gitk:9124 gitk:9320 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Запазване във файла:" -#: gitk:9130 +#: gitk:9176 msgid "Generate" msgstr "Генериране" -#: gitk:9168 +#: gitk:9214 msgid "Error creating patch:" msgstr "Грешка при създаването на кръпка:" -#: gitk:9191 gitk:9308 gitk:9365 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "Идентификатор:" -#: gitk:9200 +#: gitk:9246 msgid "Tag name:" msgstr "Име на етикет:" -#: gitk:9203 +#: gitk:9249 msgid "Tag message is optional" msgstr "Съобщението за етикет е незадължително" -#: gitk:9205 +#: gitk:9251 msgid "Tag message:" msgstr "Съобщение за етикет:" -#: gitk:9209 gitk:9374 +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Създаване" -#: gitk:9227 +#: gitk:9273 msgid "No tag name specified" msgstr "Липсва име на етикет" -#: gitk:9231 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Етикетът „%s“ вече съществува" -#: gitk:9241 +#: gitk:9287 msgid "Error creating tag:" msgstr "Грешка при създаването на етикет:" -#: gitk:9317 +#: gitk:9363 msgid "Command:" msgstr "Команда:" -#: gitk:9325 +#: gitk:9371 msgid "Write" msgstr "Запазване" -#: gitk:9343 +#: gitk:9389 msgid "Error writing commit:" msgstr "Грешка при запазването на подаването:" -#: gitk:9370 +#: gitk:9416 msgid "Name:" msgstr "Име:" -#: gitk:9393 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Укажете име за новия клон" -#: gitk:9398 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?" -#: gitk:9465 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?" -#: gitk:9470 +#: gitk:9516 msgid "Cherry-picking" msgstr "Отбиране" -#: gitk:9479 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1023,7 +1033,7 @@ msgstr "" "Неуспешно отбиране, защото във файла „%s“ има локални промени.\n" "Подайте, занулете или ги скатайте и пробвайте отново." -#: gitk:9485 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1031,20 +1041,20 @@ msgstr "" "Неуспешно отбиране поради конфликти при сливане.\n" "Искате ли да ги коригирате чрез „git citool“?" -#: gitk:9501 gitk:9559 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Не са подадени промени" -#: gitk:9528 +#: gitk:9574 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?" -#: gitk:9533 +#: gitk:9579 msgid "Reverting" msgstr "Отмяна" -#: gitk:9541 +#: gitk:9587 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1053,7 +1063,7 @@ msgstr "" "Неуспешна отмяна, защото във файла „%s“ има локални промени.\n" "Подайте, занулете или ги скатайте и пробвайте отново.<" -#: gitk:9545 +#: gitk:9591 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1061,28 +1071,28 @@ msgstr "" "Неуспешно отмяна поради конфликти при сливане.\n" "Искате ли да ги коригирате чрез „git citool“?" -#: gitk:9588 +#: gitk:9634 msgid "Confirm reset" msgstr "Потвърждаване на зануляването" -#: gitk:9590 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Да се занули ли клонът „%s“ към „%s“?" -#: gitk:9592 +#: gitk:9638 msgid "Reset type:" msgstr "Вид зануляване:" -#: gitk:9595 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Слабо: работното дърво и индекса остават същите" -#: gitk:9598 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Смесено: работното дърво остава същото, индексът се занулява" -#: gitk:9601 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1090,19 +1100,19 @@ msgstr "" "Силно: зануляване и на работното дърво, и на индекса\n" "(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)" -#: gitk:9618 +#: gitk:9664 msgid "Resetting" msgstr "Зануляване" -#: gitk:9678 +#: gitk:9724 msgid "Checking out" msgstr "Изтегляне" -#: gitk:9731 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Текущо изтегленият клон не може да бъде изтрит" -#: gitk:9737 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1111,16 +1121,16 @@ msgstr "" "Подаванията на клона „%s“ не са на никой друг клон.\n" "Наистина ли да се изтрие клонът „%s“?" -#: gitk:9768 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Етикети и върхове: %s" -#: gitk:9783 +#: gitk:9829 msgid "Filter" msgstr "Филтриране" -#: gitk:10079 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1128,213 +1138,213 @@ msgstr "" "Грешка при прочитането на топологията на подаванията. Информацията за клона " "и предшестващите/следващите етикети ще е непълна." -#: gitk:11056 +#: gitk:11102 msgid "Tag" msgstr "Етикет" -#: gitk:11060 +#: gitk:11106 msgid "Id" msgstr "Идентификатор" -#: gitk:11143 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Избор на шрифт за Gitk" -#: gitk:11160 +#: gitk:11206 msgid "B" msgstr "Ч" -#: gitk:11163 +#: gitk:11209 msgid "I" msgstr "К" -#: gitk:11281 +#: gitk:11327 msgid "Commit list display options" msgstr "Настройки на списъка с подавания" -#: gitk:11284 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Максимална широчина на графа (в редове)" -#: gitk:11287 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Максимална широчина на графа (% от панела)" -#: gitk:11290 +#: gitk:11337 msgid "Show local changes" msgstr "Показване на локалните промени" -#: gitk:11293 +#: gitk:11340 msgid "Auto-select SHA1 (length)" msgstr "Автоматично избиране на SHA1 (дължина)" -#: gitk:11297 +#: gitk:11344 msgid "Hide remote refs" msgstr "Скриване на отдалечените указатели" -#: gitk:11301 +#: gitk:11348 msgid "Diff display options" msgstr "Настройки на показването на разликите" -#: gitk:11303 +#: gitk:11350 msgid "Tab spacing" msgstr "Широчина на табулатора" -#: gitk:11306 +#: gitk:11353 msgid "Display nearby tags/heads" msgstr "Извеждане на близките етикети и върхове" -#: gitk:11309 +#: gitk:11356 msgid "Maximum # tags/heads to show" msgstr "Максимален брой етикети/върхове за показване" -#: gitk:11312 +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Разлика само в избраните пътища" -#: gitk:11315 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Поддръжка на различни кодирания за всеки файл" -#: gitk:11321 gitk:11468 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Външен инструмент за разлики" -#: gitk:11322 +#: gitk:11369 msgid "Choose..." msgstr "Избор…" -#: gitk:11327 +#: gitk:11374 msgid "General options" msgstr "Общи настройки" -#: gitk:11330 +#: gitk:11377 msgid "Use themed widgets" msgstr "Използване на тема за графичните обекти" -#: gitk:11332 +#: gitk:11379 msgid "(change requires restart)" msgstr "(промяната изисква рестартиране на Gitk)" -#: gitk:11334 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(в момента недостъпно)" -#: gitk:11345 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Цветове: избира се с натискане" -#: gitk:11348 +#: gitk:11395 msgid "Interface" msgstr "Интерфейс" -#: gitk:11349 +#: gitk:11396 msgid "interface" msgstr "интерфейс" -#: gitk:11352 +#: gitk:11399 msgid "Background" msgstr "Фон" -#: gitk:11353 gitk:11383 +#: gitk:11400 gitk:11430 msgid "background" msgstr "фон" -#: gitk:11356 +#: gitk:11403 msgid "Foreground" msgstr "Знаци" -#: gitk:11357 +#: gitk:11404 msgid "foreground" msgstr "знаци" -#: gitk:11360 +#: gitk:11407 msgid "Diff: old lines" msgstr "Разлика: стари редове" -#: gitk:11361 +#: gitk:11408 msgid "diff old lines" msgstr "разлика, стари редове" -#: gitk:11365 +#: gitk:11412 msgid "Diff: new lines" msgstr "Разлика: нови редове" -#: gitk:11366 +#: gitk:11413 msgid "diff new lines" msgstr "разлика, нови редове" -#: gitk:11370 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Разлика: начало на парче" -#: gitk:11372 +#: gitk:11419 msgid "diff hunk header" msgstr "разлика, начало на парче" -#: gitk:11376 +#: gitk:11423 msgid "Marked line bg" msgstr "Фон на отбелязан ред" -#: gitk:11378 +#: gitk:11425 msgid "marked line background" msgstr "фон на отбелязан ред" -#: gitk:11382 +#: gitk:11429 msgid "Select bg" msgstr "Избор на фон" -#: gitk:11391 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Шрифтове: избира се с натискане" -#: gitk:11393 +#: gitk:11440 msgid "Main font" msgstr "Основен шрифт" -#: gitk:11394 +#: gitk:11441 msgid "Diff display font" msgstr "Шрифт за разликите" -#: gitk:11395 +#: gitk:11442 msgid "User interface font" msgstr "Шрифт на интерфейса" -#: gitk:11417 +#: gitk:11464 msgid "Gitk preferences" msgstr "Настройки на Gitk" -#: gitk:11426 +#: gitk:11473 msgid "General" msgstr "Общи" -#: gitk:11427 +#: gitk:11474 msgid "Colors" msgstr "Цветове" -#: gitk:11428 +#: gitk:11475 msgid "Fonts" msgstr "Шрифтове" -#: gitk:11478 +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: избор на цвят на „%s“" -#: gitk:12177 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Тук липсва хранилище на Git." -#: gitk:12224 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл" -#: gitk:12236 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Неправилни аргументи на gitk:" -#: gitk:12339 +#: gitk:12405 msgid "Command line" msgstr "Команден ред" diff --git a/gitk-git/po/ca.po b/gitk-git/po/ca.po new file mode 100644 index 0000000000..2c1f60683c --- /dev/null +++ b/gitk-git/po/ca.po @@ -0,0 +1,1354 @@ +# Translation of gitk +# Copyright (C) 2005-2014 Paul Mackerras +# This file is distributed under the same license as the gitk package. +# Alex Henrie <alexhenrie24@gmail.com>, 2015. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gitk\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" +"PO-Revision-Date: 2015-02-01 22:49-0700\n" +"Last-Translator: Alex Henrie <alexhenrie24@gmail.com>\n" +"Language-Team: Catalan\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.7.3\n" + +#: gitk:140 +msgid "Couldn't get list of unmerged files:" +msgstr "No s'ha pogut obtenir la llista de fitxers no fusionats:" + +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "Colora les paraules" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "Marca les paraules" + +#: gitk:324 +msgid "Error parsing revisions:" +msgstr "Error en analitzar les revisions:" + +#: gitk:380 +msgid "Error executing --argscmd command:" +msgstr "Error en executar l'ordre --argscmd:" + +#: gitk:393 +msgid "No files selected: --merge specified but no files are unmerged." +msgstr "" +"No hi ha fitxers seleccionats: s'ha especificat --merge però cap fitxer està " +"sense fusionar." + +#: gitk:396 +msgid "" +"No files selected: --merge specified but no unmerged files are within file " +"limit." +msgstr "" +"No hi ha fitxers seleccionats: s'ha especificat --merge però cap fitxer " +"sense fusionar està dins del límit de fitxers." + +#: gitk:418 gitk:566 +msgid "Error executing git log:" +msgstr "Error en executar git log:" + +#: gitk:436 gitk:582 +msgid "Reading" +msgstr "Llegint" + +#: gitk:496 gitk:4508 +msgid "Reading commits..." +msgstr "Llegint les revisions..." + +#: gitk:499 gitk:1637 gitk:4511 +msgid "No commits selected" +msgstr "Cap comissió seleccionada" + +#: gitk:1511 +msgid "Can't parse git log output:" +msgstr "No es pot analitzar la sortida del git log:" + +#: gitk:1740 +msgid "No commit information available" +msgstr "Cap informació de comissió disponible" + +#: gitk:1897 +msgid "mc" +msgstr "mc" + +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 +msgid "OK" +msgstr "D'acord" + +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 +msgid "Cancel" +msgstr "Cancel·la" + +#: gitk:2069 +msgid "Update" +msgstr "Actualitza" + +#: gitk:2070 +msgid "Reload" +msgstr "Recarrega" + +#: gitk:2071 +msgid "Reread references" +msgstr "Rellegeix les referències" + +#: gitk:2072 +msgid "List references" +msgstr "Llista les referències" + +#: gitk:2074 +msgid "Start git gui" +msgstr "Inicia el git gui" + +#: gitk:2076 +msgid "Quit" +msgstr "Surt" + +#: gitk:2068 +msgid "File" +msgstr "Fitxer" + +#: gitk:2080 +msgid "Preferences" +msgstr "Preferències" + +#: gitk:2079 +msgid "Edit" +msgstr "Edita" + +#: gitk:2084 +msgid "New view..." +msgstr "Vista nova..." + +#: gitk:2085 +msgid "Edit view..." +msgstr "Edita la vista..." + +#: gitk:2086 +msgid "Delete view" +msgstr "Suprimeix vista" + +#: gitk:2088 +msgid "All files" +msgstr "Tots els fitxers" + +#: gitk:2083 gitk:4050 +msgid "View" +msgstr "Vista" + +#: gitk:2093 gitk:2103 gitk:3009 +msgid "About gitk" +msgstr "Quant al gitk" + +#: gitk:2094 gitk:2108 +msgid "Key bindings" +msgstr "Associacions de tecles" + +#: gitk:2092 gitk:2107 +msgid "Help" +msgstr "Ajuda" + +#: gitk:2185 gitk:8633 +msgid "SHA1 ID:" +msgstr "ID SHA1:" + +#: gitk:2229 +msgid "Row" +msgstr "Fila" + +#: gitk:2267 +msgid "Find" +msgstr "Cerca" + +#: gitk:2295 +msgid "commit" +msgstr "comissió" + +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 +msgid "containing:" +msgstr "que contingui:" + +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 +msgid "touching paths:" +msgstr "que toqui els camins:" + +#: gitk:2303 gitk:4759 +msgid "adding/removing string:" +msgstr "que afegeixi/elimini la cadena:" + +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "que tingui línies canviades coincidents amb:" + +#: gitk:2313 gitk:2315 gitk:4748 +msgid "Exact" +msgstr "Exacte" + +#: gitk:2315 gitk:4836 gitk:6704 +msgid "IgnCase" +msgstr "Ignora majúscula i minúscula" + +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 +msgid "Regexp" +msgstr "Regexp" + +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 +msgid "All fields" +msgstr "Tots els camps" + +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 +msgid "Headline" +msgstr "Titular" + +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 +msgid "Comments" +msgstr "Comentaris" + +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 +msgid "Author" +msgstr "Autor" + +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 +msgid "Committer" +msgstr "Comitent" + +#: gitk:2350 +msgid "Search" +msgstr "Cerca" + +#: gitk:2358 +msgid "Diff" +msgstr "Diferència" + +#: gitk:2360 +msgid "Old version" +msgstr "Versió antiga" + +#: gitk:2362 +msgid "New version" +msgstr "Versió nova" + +#: gitk:2364 +msgid "Lines of context" +msgstr "Línies de context" + +#: gitk:2374 +msgid "Ignore space change" +msgstr "Ignora canvis d'espai" + +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "Diferència de línies" + +#: gitk:2445 +msgid "Patch" +msgstr "Pedaç" + +#: gitk:2447 +msgid "Tree" +msgstr "Arbre" + +#: gitk:2616 gitk:2636 +msgid "Diff this -> selected" +msgstr "Diferencia aquesta -> la seleccionada" + +#: gitk:2617 gitk:2637 +msgid "Diff selected -> this" +msgstr "Diferencia la seleccionada -> aquesta" + +#: gitk:2618 gitk:2638 +msgid "Make patch" +msgstr "Fes pedaç" + +#: gitk:2619 gitk:9235 +msgid "Create tag" +msgstr "Crea etiqueta" + +#: gitk:2620 gitk:9352 +msgid "Write commit to file" +msgstr "Escriu la comissió a un fitxer" + +#: gitk:2621 gitk:9409 +msgid "Create new branch" +msgstr "Crea una branca nova" + +#: gitk:2622 +msgid "Cherry-pick this commit" +msgstr "Recull aquesta comissió com a cirera" + +#: gitk:2623 +msgid "Reset HEAD branch to here" +msgstr "Restableix la branca HEAD aquí" + +#: gitk:2624 +msgid "Mark this commit" +msgstr "Marca aquesta comissió" + +#: gitk:2625 +msgid "Return to mark" +msgstr "Torna a la marca" + +#: gitk:2626 +msgid "Find descendant of this and mark" +msgstr "Troba la descendent d'aquesta i marca-la" + +#: gitk:2627 +msgid "Compare with marked commit" +msgstr "Compara amb la comissió marcada" + +#: gitk:2628 gitk:2639 +msgid "Diff this -> marked commit" +msgstr "Diferencia aquesta -> la comissió marcada" + +#: gitk:2629 gitk:2640 +msgid "Diff marked commit -> this" +msgstr "Diferencia la comissió seleccionada -> aquesta" + +#: gitk:2630 +msgid "Revert this commit" +msgstr "Reverteix aquesta comissió" + +#: gitk:2646 +msgid "Check out this branch" +msgstr "Agafa aquesta branca" + +#: gitk:2647 +msgid "Remove this branch" +msgstr "Elimina aquesta branca" + +#: gitk:2654 +msgid "Highlight this too" +msgstr "Ressalta aquest també" + +#: gitk:2655 +msgid "Highlight this only" +msgstr "Ressalta només aquest" + +#: gitk:2656 +msgid "External diff" +msgstr "Diferència externa" + +#: gitk:2657 +msgid "Blame parent commit" +msgstr "Culpabilitat de la comissió mare" + +#: gitk:2664 +msgid "Show origin of this line" +msgstr "Mostra l'origen d'aquesta línia" + +#: gitk:2665 +msgid "Run git gui blame on this line" +msgstr "Executa git gui blame en aquesta línia" + +#: gitk:3011 +msgid "" +"\n" +"Gitk - a commit viewer for git\n" +"\n" +"Copyright © 2005-2014 Paul Mackerras\n" +"\n" +"Use and redistribute under the terms of the GNU General Public License" +msgstr "" +"\n" +"Gitk - visualitzador de comissions per al git\n" +"\n" +"Copyright © 2005-2014 Paul Mackerras\n" +"\n" +"Useu-lo i redistribuïu-lo sota els termes de la Llicència Pública General GNU" + +#: gitk:3019 gitk:3085 gitk:9836 +msgid "Close" +msgstr "Tanca" + +#: gitk:3040 +msgid "Gitk key bindings" +msgstr "Associacions de tecles del Gitk" + +#: gitk:3043 +msgid "Gitk key bindings:" +msgstr "Associacions de tecles del Gitk:" + +#: gitk:3045 +#, tcl-format +msgid "<%s-Q>\t\tQuit" +msgstr "<%s-Q>\t\tSurt" + +#: gitk:3046 +#, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-W>\t\tTanca la finestra" + +#: gitk:3047 +msgid "<Home>\t\tMove to first commit" +msgstr "<Inici>\t\tVés a la primera comissió" + +#: gitk:3048 +msgid "<End>\t\tMove to last commit" +msgstr "<Fi>\t\tVés a l'última comissió" + +#: gitk:3049 +msgid "<Up>, p, k\tMove up one commit" +msgstr "<Amunt>, p, k\tMou-te una comissió amunt" + +#: gitk:3050 +msgid "<Down>, n, j\tMove down one commit" +msgstr "<Avall>, n, j\tMou-te una comissió avall" + +#: gitk:3051 +msgid "<Left>, z, h\tGo back in history list" +msgstr "<Esquerra>, z, h\tRetrocedeix en la llista d'història" + +#: gitk:3052 +msgid "<Right>, x, l\tGo forward in history list" +msgstr "<Dreta>, x, l\tAvança en la llista d'història" + +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" +"<%s-n>\tVés a l'enèsima mare de la comissió actual en la llista d'història" + +#: gitk:3054 +msgid "<PageUp>\tMove up one page in commit list" +msgstr "<RePàg>\tBaixa una pàgina en la llista de comissions" + +#: gitk:3055 +msgid "<PageDown>\tMove down one page in commit list" +msgstr "<AvPàg>\tBaixa per una pàgina en la llista de comissions" + +#: gitk:3056 +#, tcl-format +msgid "<%s-Home>\tScroll to top of commit list" +msgstr "<%s-Inici>\tDesplaça't a la part superior de la llista de comissions" + +#: gitk:3057 +#, tcl-format +msgid "<%s-End>\tScroll to bottom of commit list" +msgstr "<%s-Fi>\tDesplaça't a la part inferior de la llista de comissions" + +#: gitk:3058 +#, tcl-format +msgid "<%s-Up>\tScroll commit list up one line" +msgstr "<%s-Amunt>\tDesplaça la llista de comissions una línia cap amunt" + +#: gitk:3059 +#, tcl-format +msgid "<%s-Down>\tScroll commit list down one line" +msgstr "<%s-Avall>\tDesplaça la llista de comissions una línia cap avall" + +#: gitk:3060 +#, tcl-format +msgid "<%s-PageUp>\tScroll commit list up one page" +msgstr "<%s-RePàg>\tDesplaça la llista de comissions amunt per una pàgina" + +#: gitk:3061 +#, tcl-format +msgid "<%s-PageDown>\tScroll commit list down one page" +msgstr "<%s-AvPàg>\tDesplaça la llista de comissions una pàgina cap avall" + +#: gitk:3062 +msgid "<Shift-Up>\tFind backwards (upwards, later commits)" +msgstr "<Maj-Amunt>\tCerca cap enrere (amunt, les comissions més noves)" + +#: gitk:3063 +msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" +msgstr "<Maj-Avall>\tCerca cap endavant (avall, les comissions més velles)" + +#: gitk:3064 +msgid "<Delete>, b\tScroll diff view up one page" +msgstr "<Supr>, b\tDesplaça la vista de diferència una pàgina cap amunt" + +#: gitk:3065 +msgid "<Backspace>\tScroll diff view up one page" +msgstr "<Retrocés>\tDesplaça la vista de diferència una pàgina cap amunt" + +#: gitk:3066 +msgid "<Space>\t\tScroll diff view down one page" +msgstr "<Espai>\t\tDesplaça la vista de diferència una pàgina cap avall" + +#: gitk:3067 +msgid "u\t\tScroll diff view up 18 lines" +msgstr "u\t\tDesplaça la vista de diferència 18 línies cap amunt" + +#: gitk:3068 +msgid "d\t\tScroll diff view down 18 lines" +msgstr "d\t\tDesplaça la vista de diferència 18 línies cap avall " + +#: gitk:3069 +#, tcl-format +msgid "<%s-F>\t\tFind" +msgstr "<%s-F>\t\tCerca" + +#: gitk:3070 +#, tcl-format +msgid "<%s-G>\t\tMove to next find hit" +msgstr "<%s-G>\t\tMou-te a la propera coincidència de la cerca" + +#: gitk:3071 +msgid "<Return>\tMove to next find hit" +msgstr "<Retorn>\tMou-te a la propera coincidència de la cerca" + +#: gitk:3072 +msgid "/\t\tFocus the search box" +msgstr "/\t\tPosa el focus a la caixa de cerca" + +#: gitk:3073 +msgid "?\t\tMove to previous find hit" +msgstr "?\t\tMou a la coincidència prèvia de la cerca" + +#: gitk:3074 +msgid "f\t\tScroll diff view to next file" +msgstr "f\t\tDesplaça la vista de diferència al proper fitxer" + +#: gitk:3075 +#, tcl-format +msgid "<%s-S>\t\tSearch for next hit in diff view" +msgstr "<%s-S>\t\tCerca la propera coincidència en la vista de diferència" + +#: gitk:3076 +#, tcl-format +msgid "<%s-R>\t\tSearch for previous hit in diff view" +msgstr "<%s-R>\t\tCerca la coincidència prèvia en la vista de diferència" + +#: gitk:3077 +#, tcl-format +msgid "<%s-KP+>\tIncrease font size" +msgstr "<%s-KP+>\tAugmenta la mida de lletra" + +#: gitk:3078 +#, tcl-format +msgid "<%s-plus>\tIncrease font size" +msgstr "<%s-més>\tAugmenta la mida de lletra" + +#: gitk:3079 +#, tcl-format +msgid "<%s-KP->\tDecrease font size" +msgstr "<%s-KP->\tDisminueix la mida de lletra" + +#: gitk:3080 +#, tcl-format +msgid "<%s-minus>\tDecrease font size" +msgstr "<%s-menys>\tDisminueix la mida de lletra" + +#: gitk:3081 +msgid "<F5>\t\tUpdate" +msgstr "<F5>\t\tActualitza" + +#: gitk:3546 gitk:3555 +#, tcl-format +msgid "Error creating temporary directory %s:" +msgstr "Error en crear el directori temporal %s:" + +#: gitk:3568 +#, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "Error en obtenir \"%s\" de %s:" + +#: gitk:3631 +msgid "command failed:" +msgstr "l'ordre ha fallat:" + +#: gitk:3780 +msgid "No such commit" +msgstr "Cap comissió així" + +#: gitk:3794 +msgid "git gui blame: command failed:" +msgstr "git gui blame: l'ordre ha fallat:" + +#: gitk:3825 +#, tcl-format +msgid "Couldn't read merge head: %s" +msgstr "No s'ha pogut llegir el cap de fusió: %s" + +#: gitk:3833 +#, tcl-format +msgid "Error reading index: %s" +msgstr "Error en llegir l'índex: %s" + +#: gitk:3858 +#, tcl-format +msgid "Couldn't start git blame: %s" +msgstr "No s'ha pogut iniciar el git blame: %s" + +#: gitk:3861 gitk:6735 +msgid "Searching" +msgstr "Cercant" + +#: gitk:3893 +#, tcl-format +msgid "Error running git blame: %s" +msgstr "Error en executar el git blame: %s" + +#: gitk:3921 +#, tcl-format +msgid "That line comes from commit %s, which is not in this view" +msgstr "" +"Aquella línia ve de la comissió %s, la qual no és en aquesta visualització" + +#: gitk:3935 +msgid "External diff viewer failed:" +msgstr "El visualitzador de diferència extern ha fallat:" + +#: gitk:4053 +msgid "Gitk view definition" +msgstr "Definició de vista del Gitk" + +#: gitk:4057 +msgid "Remember this view" +msgstr "Recorda aquesta vista" + +#: gitk:4058 +msgid "References (space separated list):" +msgstr "Referències (llista separada per espais)" + +#: gitk:4059 +msgid "Branches & tags:" +msgstr "Branques i etiquetes:" + +#: gitk:4060 +msgid "All refs" +msgstr "Totes les referències" + +#: gitk:4061 +msgid "All (local) branches" +msgstr "Totes les branques (locals)" + +#: gitk:4062 +msgid "All tags" +msgstr "Totes les etiquetes" + +#: gitk:4063 +msgid "All remote-tracking branches" +msgstr "Totes les branques amb seguiment remot" + +#: gitk:4064 +msgid "Commit Info (regular expressions):" +msgstr "Informació de comissió (expressions regulars):" + +#: gitk:4065 +msgid "Author:" +msgstr "Autor:" + +#: gitk:4066 +msgid "Committer:" +msgstr "Comitent:" + +#: gitk:4067 +msgid "Commit Message:" +msgstr "Missatge de comissió:" + +#: gitk:4068 +msgid "Matches all Commit Info criteria" +msgstr "Coincideix amb tots els criteris d'informació de comissió" + +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Coincideix amb tots els criteris d'informació de comissió" + +#: gitk:4070 +msgid "Changes to Files:" +msgstr "Canvis als fitxers:" + +#: gitk:4071 +msgid "Fixed String" +msgstr "Cadena fixa" + +#: gitk:4072 +msgid "Regular Expression" +msgstr "Expressió regular" + +#: gitk:4073 +msgid "Search string:" +msgstr "Cadena de cerca:" + +#: gitk:4074 +msgid "" +"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " +"15:27:38\"):" +msgstr "" +"Dates de comissió (\"fa 2 setmanes\", \"2009-03-17 15:27:38\", \"17 abr 2009 " +"15:27:38\"):" + +#: gitk:4075 +msgid "Since:" +msgstr "Des de:" + +#: gitk:4076 +msgid "Until:" +msgstr "Fins:" + +#: gitk:4077 +msgid "Limit and/or skip a number of revisions (positive integer):" +msgstr "Limita o salta un nombre de revisions (nombre enter positiu)" + +#: gitk:4078 +msgid "Number to show:" +msgstr "Nombre a mostrar:" + +#: gitk:4079 +msgid "Number to skip:" +msgstr "Nombre a saltar:" + +#: gitk:4080 +msgid "Miscellaneous options:" +msgstr "Opcions miscel·lànies:" + +#: gitk:4081 +msgid "Strictly sort by date" +msgstr "Ordena estrictament per data" + +#: gitk:4082 +msgid "Mark branch sides" +msgstr "Marca els costats de les branques" + +#: gitk:4083 +msgid "Limit to first parent" +msgstr "Limita a la primera mare" + +#: gitk:4084 +msgid "Simple history" +msgstr "Història senzilla" + +#: gitk:4085 +msgid "Additional arguments to git log:" +msgstr "Paràmetres addicionals al git log:" + +#: gitk:4086 +msgid "Enter files and directories to include, one per line:" +msgstr "Introduïu els fitxers i directoris a incloure, un per línia:" + +#: gitk:4087 +msgid "Command to generate more commits to include:" +msgstr "Ordre per a generar més comissions a incloure:" + +#: gitk:4211 +msgid "Gitk: edit view" +msgstr "Gitk: vista d'edició" + +#: gitk:4219 +msgid "-- criteria for selecting revisions" +msgstr "-- criteris per a seleccionar les revisions" + +#: gitk:4224 +msgid "View Name" +msgstr "Nom de vista" + +#: gitk:4299 +msgid "Apply (F5)" +msgstr "Aplica (F5)" + +#: gitk:4337 +msgid "Error in commit selection arguments:" +msgstr "Error en els paràmetres de selecció de comissions:" + +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 +msgid "None" +msgstr "Cap" + +#: gitk:5003 gitk:5008 +msgid "Descendant" +msgstr "Descendent" + +#: gitk:5004 +msgid "Not descendant" +msgstr "No descendent" + +#: gitk:5011 gitk:5016 +msgid "Ancestor" +msgstr "Avantpassat" + +#: gitk:5012 +msgid "Not ancestor" +msgstr "No avantpassat" + +#: gitk:5306 +msgid "Local changes checked in to index but not committed" +msgstr "Canvis locals registrats en l'índex però no comesos" + +#: gitk:5342 +msgid "Local uncommitted changes, not checked in to index" +msgstr "Canvis locals sense cometre, no registrats en l'índex" + +#: gitk:7115 +msgid "and many more" +msgstr "i moltes més" + +#: gitk:7118 +msgid "many" +msgstr "moltes" + +#: gitk:7309 +msgid "Tags:" +msgstr "Etiquetes:" + +#: gitk:7326 gitk:7332 gitk:8806 +msgid "Parent" +msgstr "Mare" + +#: gitk:7337 +msgid "Child" +msgstr "Filla" + +#: gitk:7346 +msgid "Branch" +msgstr "Branca" + +#: gitk:7349 +msgid "Follows" +msgstr "Segueix" + +#: gitk:7352 +msgid "Precedes" +msgstr "Precedeix" + +#: gitk:7947 +#, tcl-format +msgid "Error getting diffs: %s" +msgstr "Error en obtenir les diferències: %s" + +#: gitk:8631 +msgid "Goto:" +msgstr "Vés a:" + +#: gitk:8652 +#, tcl-format +msgid "Short SHA1 id %s is ambiguous" +msgstr "L'id SHA1 curta %s és ambigua" + +#: gitk:8659 +#, tcl-format +msgid "Revision %s is not known" +msgstr "La revisió %s és desconeguda" + +#: gitk:8669 +#, tcl-format +msgid "SHA1 id %s is not known" +msgstr "L'id SHA1 %s és desconeguda" + +#: gitk:8671 +#, tcl-format +msgid "Revision %s is not in the current view" +msgstr "La revisió %s no és en la vista actual" + +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Data" + +#: gitk:8816 +msgid "Children" +msgstr "Filles" + +#: gitk:8879 +#, tcl-format +msgid "Reset %s branch to here" +msgstr "Restableix la branca %s aquí" + +#: gitk:8881 +msgid "Detached head: can't reset" +msgstr "Cap separat: no es pot restablir" + +#: gitk:8986 gitk:8992 +msgid "Skipping merge commit " +msgstr "Saltant la comissió de fusió " + +#: gitk:9001 gitk:9006 +msgid "Error getting patch ID for " +msgstr "Error en obtenir l'ID de pedaç de " + +#: gitk:9002 gitk:9007 +msgid " - stopping\n" +msgstr " - aturant\n" + +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 +msgid "Commit " +msgstr "Comissió " + +#: gitk:9016 +msgid "" +" is the same patch as\n" +" " +msgstr "" +" és el mateix pedaç que\n" +" " + +#: gitk:9024 +msgid "" +" differs from\n" +" " +msgstr "" +" difereix de\n" +" " + +#: gitk:9026 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "" +"Diferència entre comissions:\n" +"\n" + +#: gitk:9038 gitk:9047 +#, tcl-format +msgid " has %s children - stopping\n" +msgstr " té %s filles - aturant\n" + +#: gitk:9066 +#, tcl-format +msgid "Error writing commit to file: %s" +msgstr "Error en escriure la comissió al fitxer: %s" + +#: gitk:9072 +#, tcl-format +msgid "Error diffing commits: %s" +msgstr "Error en diferenciar les comissions: %s" + +#: gitk:9118 +msgid "Top" +msgstr "Part superior" + +#: gitk:9119 +msgid "From" +msgstr "De" + +#: gitk:9124 +msgid "To" +msgstr "A" + +#: gitk:9148 +msgid "Generate patch" +msgstr "Genera pedaç" + +#: gitk:9150 +msgid "From:" +msgstr "De:" + +#: gitk:9159 +msgid "To:" +msgstr "A:" + +#: gitk:9168 +msgid "Reverse" +msgstr "Inverteix" + +#: gitk:9170 gitk:9366 +msgid "Output file:" +msgstr "Fitxer de sortida:" + +#: gitk:9176 +msgid "Generate" +msgstr "Genera" + +#: gitk:9214 +msgid "Error creating patch:" +msgstr "Error en crear el pedaç:" + +#: gitk:9237 gitk:9354 gitk:9411 +msgid "ID:" +msgstr "ID:" + +#: gitk:9246 +msgid "Tag name:" +msgstr "Nom d'etiqueta:" + +#: gitk:9249 +msgid "Tag message is optional" +msgstr "El missatge d'etiqueta és opcional" + +#: gitk:9251 +msgid "Tag message:" +msgstr "Missatge d'etiqueta:" + +#: gitk:9255 gitk:9420 +msgid "Create" +msgstr "Crea" + +#: gitk:9273 +msgid "No tag name specified" +msgstr "No s'ha especificat cap nom d'etiqueta" + +#: gitk:9277 +#, tcl-format +msgid "Tag \"%s\" already exists" +msgstr "L'etiqueta \"%s\" ja existeix" + +#: gitk:9287 +msgid "Error creating tag:" +msgstr "Error en crear l'etiqueta:" + +#: gitk:9363 +msgid "Command:" +msgstr "Ordre:" + +#: gitk:9371 +msgid "Write" +msgstr "Escriu" + +#: gitk:9389 +msgid "Error writing commit:" +msgstr "Error en escriure la comissió:" + +#: gitk:9416 +msgid "Name:" +msgstr "Nom:" + +#: gitk:9439 +msgid "Please specify a name for the new branch" +msgstr "Si us plau, especifiqueu un nom per a la branca nova" + +#: gitk:9444 +#, tcl-format +msgid "Branch '%s' already exists. Overwrite?" +msgstr "La branca '%s' ja existeix. Voleu sobreescriure?" + +#: gitk:9511 +#, tcl-format +msgid "Commit %s is already included in branch %s -- really re-apply it?" +msgstr "" +"La comissió %s ja està inclosa en la branca %s -- realment voleu tornar a " +"aplicar-la?" + +#: gitk:9516 +msgid "Cherry-picking" +msgstr "Recollint cireres" + +#: gitk:9525 +#, 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 "" +"El recull de cireres ha fallat a causa de canvis locals al fitxer '%s'.\n" +"Si us plau, cometeu, restabliu o emmagatzemeu els vostres canvis i torneu a " +"intentar." + +#: gitk:9531 +msgid "" +"Cherry-pick failed because of merge conflict.\n" +"Do you wish to run git citool to resolve it?" +msgstr "" +"El recull de cireres ha fallat a causa d'un conflicte de fusió.\n" +"Voleu executar el git citool per a resoldre'l?" + +#: gitk:9547 gitk:9605 +msgid "No changes committed" +msgstr "Cap canvi comès" + +#: gitk:9574 +#, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "" +"La comissió %s no s'inclou en la branca %s -- realment voleu revertir-la?" + +#: gitk:9579 +msgid "Reverting" +msgstr "Revertint" + +#: gitk:9587 +#, 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 reversió ha fallat a causa de canvis locals als fitxers següents:%s Si us " +"plau, cometeu, restabliu o emmagatzemeu els vostres canvis i torneu-ho a " +"intentar." + +#: gitk:9591 +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"La reversió ha fallat a causa d'un conflicte de fusió.\n" +" Voleu executar el git citool per a resoldre'l?" + +#: gitk:9634 +msgid "Confirm reset" +msgstr "Confirma el restabliment" + +#: gitk:9636 +#, tcl-format +msgid "Reset branch %s to %s?" +msgstr "Voleu restablir la branca %s a %s?" + +#: gitk:9638 +msgid "Reset type:" +msgstr "Tipus de restabliment:" + +#: gitk:9641 +msgid "Soft: Leave working tree and index untouched" +msgstr "Suau: Deixa l'arbre de treball i l'índex sense tocar" + +#: gitk:9644 +msgid "Mixed: Leave working tree untouched, reset index" +msgstr "Mixt: Deixa l'arbre de treball sense tocar, restableix l'índex" + +#: gitk:9647 +msgid "" +"Hard: Reset working tree and index\n" +"(discard ALL local changes)" +msgstr "" +"Dur: Restableix l'arbre de treball i l'índex\n" +"(descarta TOTS els canvis locals)" + +#: gitk:9664 +msgid "Resetting" +msgstr "Restablint" + +#: gitk:9724 +msgid "Checking out" +msgstr "Agafant" + +#: gitk:9777 +msgid "Cannot delete the currently checked-out branch" +msgstr "No es pot suprimir la branca actualment agafada" + +#: gitk:9783 +#, tcl-format +msgid "" +"The commits on branch %s aren't on any other branch.\n" +"Really delete branch %s?" +msgstr "" +"Les comissions en la branca %s no són en cap altra branca.\n" +"Realment voleu suprimir la branca %s?" + +#: gitk:9814 +#, tcl-format +msgid "Tags and heads: %s" +msgstr "Etiquetes i caps: %s" + +#: gitk:9829 +msgid "Filter" +msgstr "Filtre" + +#: gitk:10125 +msgid "" +"Error reading commit topology information; branch and preceding/following " +"tag information will be incomplete." +msgstr "" +"Error en llegir la informació de topologia de comissió; la informació sobre " +"branques i etiquetes precedents/següents serà incompleta." + +#: gitk:11102 +msgid "Tag" +msgstr "Etiqueta" + +#: gitk:11106 +msgid "Id" +msgstr "Id" + +#: gitk:11189 +msgid "Gitk font chooser" +msgstr "Selector de tipus de lletra del Gitk" + +#: gitk:11206 +msgid "B" +msgstr "B" + +#: gitk:11209 +msgid "I" +msgstr "I" + +#: gitk:11327 +msgid "Commit list display options" +msgstr "Opcions de visualització de la llista de comissions" + +#: gitk:11330 +msgid "Maximum graph width (lines)" +msgstr "Amplada màxima del gràfic (línies)" + +#: gitk:11334 +#, no-tcl-format +msgid "Maximum graph width (% of pane)" +msgstr "Amplada màxima del gràfic (% del panell)" + +#: gitk:11337 +msgid "Show local changes" +msgstr "Mostra els canvis locals" + +#: gitk:11340 +msgid "Auto-select SHA1 (length)" +msgstr "Selecciona automàticament l'SHA1 (longitud)" + +#: gitk:11344 +msgid "Hide remote refs" +msgstr "Amaga les referències remotes" + +#: gitk:11348 +msgid "Diff display options" +msgstr "Opcions de visualització de diferència" + +#: gitk:11350 +msgid "Tab spacing" +msgstr "Espaiat de tabulació" + +#: gitk:11353 +msgid "Display nearby tags/heads" +msgstr "Mostra etiquetes/caps propers" + +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "Nombre màxim d'etiquetes/caps a mostrar" + +#: gitk:11359 +msgid "Limit diffs to listed paths" +msgstr "Limita les diferències als camins llistats" + +#: gitk:11362 +msgid "Support per-file encodings" +msgstr "Admet codificacions específiques per a cada fitxer" + +#: gitk:11368 gitk:11515 +msgid "External diff tool" +msgstr "Eina de diferència externa" + +#: gitk:11369 +msgid "Choose..." +msgstr "Trieu..." + +#: gitk:11374 +msgid "General options" +msgstr "Opcions generals" + +#: gitk:11377 +msgid "Use themed widgets" +msgstr "Usa els ginys tematitzats" + +#: gitk:11379 +msgid "(change requires restart)" +msgstr "(el canvi requereix reiniciar)" + +#: gitk:11381 +msgid "(currently unavailable)" +msgstr "(actualment no disponible)" + +#: gitk:11392 +msgid "Colors: press to choose" +msgstr "Colors: pressiona per a triar" + +#: gitk:11395 +msgid "Interface" +msgstr "Interfície" + +#: gitk:11396 +msgid "interface" +msgstr "interfície" + +#: gitk:11399 +msgid "Background" +msgstr "Fons" + +#: gitk:11400 gitk:11430 +msgid "background" +msgstr "fons" + +#: gitk:11403 +msgid "Foreground" +msgstr "Primer pla" + +#: gitk:11404 +msgid "foreground" +msgstr "primer pla" + +#: gitk:11407 +msgid "Diff: old lines" +msgstr "Diferència: línies velles" + +#: gitk:11408 +msgid "diff old lines" +msgstr "diferencia les línies velles" + +#: gitk:11412 +msgid "Diff: new lines" +msgstr "Diferència: línies noves" + +#: gitk:11413 +msgid "diff new lines" +msgstr "diferencia les línies noves" + +#: gitk:11417 +msgid "Diff: hunk header" +msgstr "Diferència: capçalera de tros" + +#: gitk:11419 +msgid "diff hunk header" +msgstr "diferencia la capçalera de tros" + +#: gitk:11423 +msgid "Marked line bg" +msgstr "Fons de la línia marcada" + +#: gitk:11425 +msgid "marked line background" +msgstr "fons de la línia marcada" + +#: gitk:11429 +msgid "Select bg" +msgstr "fons de la selecció" + +#: gitk:11438 +msgid "Fonts: press to choose" +msgstr "Tipus de lletra: pressiona per a triar" + +#: gitk:11440 +msgid "Main font" +msgstr "Tipus de lletra principal" + +#: gitk:11441 +msgid "Diff display font" +msgstr "Tipus de lletra de visualització de diferència" + +#: gitk:11442 +msgid "User interface font" +msgstr "Tipus de lletra de la interfície d'usuari" + +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Preferències del Gitk" + +#: gitk:11473 +msgid "General" +msgstr "General" + +#: gitk:11474 +msgid "Colors" +msgstr "Colors" + +#: gitk:11475 +msgid "Fonts" +msgstr "Tipus de lletra" + +#: gitk:11525 +#, tcl-format +msgid "Gitk: choose color for %s" +msgstr "Gitk: tria el color per a %s" + +#: gitk:12242 +msgid "Cannot find a git repository here." +msgstr "No es pot trobar cap dipòsit de git aquí." + +#: gitk:12289 +#, tcl-format +msgid "Ambiguous argument '%s': both revision and filename" +msgstr "Paràmetre ambigu '%s': és tant revisió com nom de fitxer" + +#: gitk:12301 +msgid "Bad arguments to gitk:" +msgstr "Paràmetres dolents al gitk:" + +#: gitk:12405 +msgid "Command line" +msgstr "Línia d'ordres" diff --git a/gitk-git/po/de.po b/gitk-git/po/de.po index bd194a3dff..dabd4eefb5 100644 --- a/gitk-git/po/de.po +++ b/gitk-git/po/de.po @@ -8,33 +8,42 @@ msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-27 20:21+0100\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2010-01-27 20:27+0100\n" "Last-Translator: Christian Stimming <stimming@tuhh.de>\n" "Language-Team: German\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gitk:115 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "Liste der nicht zusammengeführten Dateien nicht gefunden:" -#: gitk:274 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 msgid "Error parsing revisions:" msgstr "Fehler beim Laden der Versionen:" -#: gitk:329 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Fehler beim Ausführen des --argscmd-Kommandos:" -#: gitk:342 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Keine Dateien ausgewählt: Es wurde --merge angegeben, aber es existieren " "keine nicht zusammengeführten Dateien." -#: gitk:345 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -42,299 +51,315 @@ msgstr "" "Keine Dateien ausgewählt: Es wurde --merge angegeben, aber es sind keine " "nicht zusammengeführten Dateien in der Dateiauswahl." -#: gitk:367 gitk:514 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Fehler beim Ausführen von »git log«:" -#: gitk:385 gitk:530 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Lesen" -#: gitk:445 gitk:4261 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Versionen werden gelesen ..." -#: gitk:448 gitk:1578 gitk:4264 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Keine Versionen ausgewählt" -#: gitk:1454 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Ausgabe von »git log« kann nicht erkannt werden:" -#: gitk:1674 +#: gitk:1740 msgid "No commit information available" msgstr "Keine Versionsinformation verfügbar" -#: gitk:1816 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1851 gitk:4054 gitk:9044 gitk:10585 gitk:10804 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "Ok" -#: gitk:1853 gitk:4056 gitk:8634 gitk:8713 gitk:8828 gitk:8877 gitk:9046 -#: gitk:10586 gitk:10805 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Abbrechen" -#: gitk:1975 +#: gitk:2069 msgid "Update" msgstr "Aktualisieren" -#: gitk:1976 +#: gitk:2070 msgid "Reload" msgstr "Neu laden" -#: gitk:1977 +#: gitk:2071 msgid "Reread references" msgstr "Zweige neu laden" -#: gitk:1978 +#: gitk:2072 msgid "List references" msgstr "Zweige/Markierungen auflisten" -#: gitk:1980 +#: gitk:2074 msgid "Start git gui" msgstr "»git gui« starten" -#: gitk:1982 +#: gitk:2076 msgid "Quit" msgstr "Beenden" -#: gitk:1974 +#: gitk:2068 msgid "File" msgstr "Datei" -#: gitk:1986 +#: gitk:2080 msgid "Preferences" msgstr "Einstellungen" -#: gitk:1985 +#: gitk:2079 msgid "Edit" msgstr "Bearbeiten" -#: gitk:1990 +#: gitk:2084 msgid "New view..." msgstr "Neue Ansicht ..." -#: gitk:1991 +#: gitk:2085 msgid "Edit view..." msgstr "Ansicht bearbeiten ..." -#: gitk:1992 +#: gitk:2086 msgid "Delete view" msgstr "Ansicht entfernen" -#: gitk:1994 +#: gitk:2088 msgid "All files" msgstr "Alle Dateien" -#: gitk:1989 gitk:3808 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Ansicht" -#: gitk:1999 gitk:2009 gitk:2780 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Über gitk" -#: gitk:2000 gitk:2014 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Tastenkürzel" -#: gitk:1998 gitk:2013 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Hilfe" -#: gitk:2091 gitk:8110 +#: gitk:2185 gitk:8633 msgid "SHA1 ID:" msgstr "SHA1 ID:" -#: gitk:2122 +#: gitk:2229 msgid "Row" msgstr "Zeile" -#: gitk:2160 +#: gitk:2267 msgid "Find" msgstr "Suche" -#: gitk:2161 -msgid "next" -msgstr "nächste" - -#: gitk:2162 -msgid "prev" -msgstr "vorige" - -#: gitk:2163 +#: gitk:2295 msgid "commit" msgstr "Version nach" -#: gitk:2166 gitk:2168 gitk:4422 gitk:4445 gitk:4469 gitk:6410 gitk:6482 -#: gitk:6566 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "Beschreibung:" -#: gitk:2169 gitk:3290 gitk:3295 gitk:4497 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "Dateien:" -#: gitk:2170 gitk:4502 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "Änderungen:" -#: gitk:2179 gitk:2181 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Exakt" -#: gitk:2181 gitk:4577 gitk:6378 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "Kein Groß/Klein" -#: gitk:2181 gitk:4471 gitk:4575 gitk:6374 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Regexp" -#: gitk:2183 gitk:2184 gitk:4596 gitk:4626 gitk:4633 gitk:6502 gitk:6570 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Alle Felder" -#: gitk:2184 gitk:4594 gitk:4626 gitk:6441 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Überschrift" -#: gitk:2185 gitk:4594 gitk:6441 gitk:6570 gitk:7003 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Beschreibung" -#: gitk:2185 gitk:4594 gitk:4598 gitk:4633 gitk:6441 gitk:6938 gitk:8285 -#: gitk:8300 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Autor" -#: gitk:2185 gitk:4594 gitk:6441 gitk:6940 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Eintragender" -#: gitk:2216 +#: gitk:2350 msgid "Search" msgstr "Suchen" -#: gitk:2224 +#: gitk:2358 msgid "Diff" msgstr "Vergleich" -#: gitk:2226 +#: gitk:2360 msgid "Old version" msgstr "Alte Version" -#: gitk:2228 +#: gitk:2362 msgid "New version" msgstr "Neue Version" -#: gitk:2230 +#: gitk:2364 msgid "Lines of context" msgstr "Kontextzeilen" -#: gitk:2240 +#: gitk:2374 msgid "Ignore space change" msgstr "Leerzeichenänderungen ignorieren" -#: gitk:2299 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Patch" -#: gitk:2301 +#: gitk:2447 msgid "Tree" msgstr "Baum" -#: gitk:2456 gitk:2473 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Vergleich: diese -> gewählte" -#: gitk:2457 gitk:2474 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Vergleich: gewählte -> diese" -#: gitk:2458 gitk:2475 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Patch erstellen" -#: gitk:2459 gitk:8692 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Markierung erstellen" -#: gitk:2460 gitk:8808 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Version in Datei schreiben" -#: gitk:2461 gitk:8865 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Neuen Zweig erstellen" -#: gitk:2462 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Diese Version pflücken" -#: gitk:2463 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "HEAD-Zweig auf diese Version zurücksetzen" -#: gitk:2464 +#: gitk:2624 msgid "Mark this commit" msgstr "Lesezeichen setzen" -#: gitk:2465 +#: gitk:2625 msgid "Return to mark" msgstr "Zum Lesezeichen" -#: gitk:2466 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Abkömmling von Lesezeichen und dieser Version finden" -#: gitk:2467 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Mit Lesezeichen vergleichen" -#: gitk:2481 +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Vergleich: diese -> gewählte" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Vergleich: gewählte -> diese" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Lesezeichen setzen" + +#: gitk:2646 msgid "Check out this branch" msgstr "Auf diesen Zweig umstellen" -#: gitk:2482 +#: gitk:2647 msgid "Remove this branch" msgstr "Zweig löschen" -#: gitk:2489 +#: gitk:2654 msgid "Highlight this too" msgstr "Diesen auch hervorheben" -#: gitk:2490 +#: gitk:2655 msgid "Highlight this only" msgstr "Nur diesen hervorheben" -#: gitk:2491 +#: gitk:2656 msgid "External diff" msgstr "Externes Diff-Programm" -#: gitk:2492 +#: gitk:2657 msgid "Blame parent commit" msgstr "Annotieren der Elternversion" -#: gitk:2499 +#: gitk:2664 msgid "Show origin of this line" msgstr "Herkunft dieser Zeile anzeigen" -#: gitk:2500 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Diese Zeile annotieren (»git gui blame«)" -#: gitk:2782 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -343,500 +368,520 @@ msgstr "" "\n" "Copyright \\u00a9 2005-2010 Paul Mackerras\n" "\n" -"Benutzung und Weiterverbreitung gemäß den Bedingungen der GNU General Public License" +"Benutzung und Weiterverbreitung gemäß den Bedingungen der GNU General Public " +"License" -#: gitk:2790 gitk:2854 gitk:9230 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Schließen" -#: gitk:2811 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Gitk-Tastaturbelegung" -#: gitk:2814 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Gitk-Tastaturbelegung:" -#: gitk:2816 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tBeenden" -#: gitk:2817 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\tSuchen" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Pos1>\t\tZur neuesten Version springen" -#: gitk:2818 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<Ende>\t\tZur ältesten Version springen" -#: gitk:2819 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Hoch>, p, i\tNächste neuere Version" -#: gitk:2820 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Runter>, n, k\tNächste ältere Version" -#: gitk:2821 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Links>, z, j\tEine Version zurückgehen" -#: gitk:2822 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Rechts>, x, l\tEine Version weitergehen" -#: gitk:2823 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<BildHoch>\tEine Seite nach oben blättern" -#: gitk:2824 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<BildRunter>\tEine Seite nach unten blättern" -#: gitk:2825 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Pos1>\tZum oberen Ende der Versionsliste blättern" -#: gitk:2826 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-Ende>\tZum unteren Ende der Versionsliste blättern" -#: gitk:2827 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Hoch>\tVersionsliste eine Zeile nach oben blättern" -#: gitk:2828 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Runter>\tVersionsliste eine Zeile nach unten blättern" -#: gitk:2829 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-BildHoch>\tVersionsliste eine Seite nach oben blättern" -#: gitk:2830 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-BildRunter>\tVersionsliste eine Seite nach unten blättern" -#: gitk:2831 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Umschalt-Hoch>\tRückwärts suchen (nach oben; neuere Versionen)" -#: gitk:2832 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Umschalt-Runter> Suchen (nach unten; ältere Versionen)" -#: gitk:2833 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Entf>, b\t\tVergleich eine Seite nach oben blättern" -#: gitk:2834 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Löschtaste>\tVergleich eine Seite nach oben blättern" -#: gitk:2835 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Leertaste>\tVergleich eine Seite nach unten blättern" -#: gitk:2836 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tVergleich um 18 Zeilen nach oben blättern" -#: gitk:2837 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tVergleich um 18 Zeilen nach unten blättern" -#: gitk:2838 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tSuchen" -#: gitk:2839 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tWeitersuchen" -#: gitk:2840 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Eingabetaste>\tWeitersuchen" -#: gitk:2841 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tTastaturfokus ins Suchfeld" -#: gitk:2842 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tRückwärts weitersuchen" -#: gitk:2843 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tVergleich zur nächsten Datei blättern" -#: gitk:2844 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tWeitersuchen im Vergleich" -#: gitk:2845 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tRückwärts weitersuchen im Vergleich" -#: gitk:2846 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-Nummerblock-Plus>\tSchrift vergrößern" -#: gitk:2847 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-Plus>\tSchrift vergrößern" -#: gitk:2848 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-Nummernblock-Minus> Schrift verkleinern" -#: gitk:2849 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-Minus>\tSchrift verkleinern" -#: gitk:2850 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tAktualisieren" -#: gitk:3305 gitk:3314 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Fehler beim Erzeugen des temporären Verzeichnisses »%s«:" -#: gitk:3327 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Fehler beim Holen von »%s« von »%s«:" -#: gitk:3390 +#: gitk:3631 msgid "command failed:" msgstr "Kommando fehlgeschlagen:" -#: gitk:3539 +#: gitk:3780 msgid "No such commit" msgstr "Version nicht gefunden" -#: gitk:3553 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: Kommando fehlgeschlagen:" -#: gitk:3584 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Zusammenführungs-Spitze konnte nicht gelesen werden: %s" -#: gitk:3592 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Fehler beim Lesen der Bereitstellung (»index«): %s" -#: gitk:3617 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "»git blame« konnte nicht gestartet werden: %s" -#: gitk:3620 gitk:6409 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Suchen" -#: gitk:3652 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Fehler beim Ausführen von »git blame«: %s" -#: gitk:3680 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "" "Diese Zeile stammt aus Version %s, die nicht in dieser Ansicht gezeigt wird" -#: gitk:3694 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Externes Diff-Programm fehlgeschlagen:" -#: gitk:3812 +#: gitk:4053 msgid "Gitk view definition" msgstr "Gitk-Ansichten" -#: gitk:3816 +#: gitk:4057 msgid "Remember this view" msgstr "Diese Ansicht speichern" -#: gitk:3817 +#: gitk:4058 msgid "References (space separated list):" msgstr "Zweige/Markierungen (durch Leerzeichen getrennte Liste):" -#: gitk:3818 +#: gitk:4059 msgid "Branches & tags:" msgstr "Zweige/Markierungen:" -#: gitk:3819 +#: gitk:4060 msgid "All refs" msgstr "Alle Markierungen und Zweige" -#: gitk:3820 +#: gitk:4061 msgid "All (local) branches" msgstr "Alle (lokalen) Zweige" -#: gitk:3821 +#: gitk:4062 msgid "All tags" msgstr "Alle Markierungen" -#: gitk:3822 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Alle Übernahmezweige" -#: gitk:3823 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Versionsinformationen (reguläre Ausdrücke):" -#: gitk:3824 +#: gitk:4065 msgid "Author:" msgstr "Autor:" -#: gitk:3825 +#: gitk:4066 msgid "Committer:" msgstr "Eintragender:" -#: gitk:3826 +#: gitk:4067 msgid "Commit Message:" msgstr "Versionsbeschreibung:" -#: gitk:3827 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Alle Versionsinformationen-Kriterien erfüllen" -#: gitk:3828 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Alle Versionsinformationen-Kriterien erfüllen" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Dateien:" -#: gitk:3829 +#: gitk:4071 msgid "Fixed String" msgstr "Zeichenkette" -#: gitk:3830 +#: gitk:4072 msgid "Regular Expression" msgstr "Regulärer Ausdruck" -#: gitk:3831 +#: gitk:4073 msgid "Search string:" msgstr "Suchausdruck:" -#: gitk:3832 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -msgstr "Datum (»2 weeks ago«, »2009-03-17 15:27:38«, »March 17, 2009 15:27:38«)" +msgstr "" +"Datum (»2 weeks ago«, »2009-03-17 15:27:38«, »March 17, 2009 15:27:38«)" -#: gitk:3833 +#: gitk:4075 msgid "Since:" msgstr "Von:" -#: gitk:3834 +#: gitk:4076 msgid "Until:" msgstr "Bis:" -#: gitk:3835 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Versionsanzahl begrenzen oder einige überspringen (ganzzahliger Wert):" -#: gitk:3836 +#: gitk:4078 msgid "Number to show:" msgstr "Anzeigen:" -#: gitk:3837 +#: gitk:4079 msgid "Number to skip:" msgstr "Überspringen:" -#: gitk:3838 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Sonstiges:" -#: gitk:3839 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Streng nach Datum sortieren" -#: gitk:3840 +#: gitk:4082 msgid "Mark branch sides" msgstr "Zweig-Seiten markieren" -#: gitk:3841 +#: gitk:4083 msgid "Limit to first parent" msgstr "Auf erste Elternversion beschränken" -#: gitk:3842 +#: gitk:4084 msgid "Simple history" msgstr "Einfache Historie" -#: gitk:3843 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Zusätzliche Argumente für »git log«:" -#: gitk:3844 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Folgende Dateien und Verzeichnisse anzeigen (eine pro Zeile):" -#: gitk:3845 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Versionsliste durch folgendes Kommando erzeugen lassen:" -#: gitk:3967 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: Ansicht bearbeiten" -#: gitk:3975 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "-- Auswahl der angezeigten Versionen" -#: gitk:3980 +#: gitk:4224 msgid "View Name" msgstr "Ansichtsname" -#: gitk:4055 +#: gitk:4299 msgid "Apply (F5)" msgstr "Anwenden (F5)" -#: gitk:4093 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Fehler in den ausgewählten Versionen:" -#: gitk:4146 gitk:4198 gitk:4646 gitk:4660 gitk:5921 gitk:11534 gitk:11535 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Keine" -#: gitk:4594 gitk:6441 gitk:8287 gitk:8302 -msgid "Date" -msgstr "Datum" - -#: gitk:4594 gitk:6441 -msgid "CDate" -msgstr "Eintragedatum" - -#: gitk:4743 gitk:4748 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Abkömmling" -#: gitk:4744 +#: gitk:5004 msgid "Not descendant" msgstr "Kein Abkömmling" -#: gitk:4751 gitk:4756 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Vorgänger" -#: gitk:4752 +#: gitk:5012 msgid "Not ancestor" msgstr "Kein Vorgänger" -#: gitk:5042 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Lokale Änderungen bereitgestellt, aber nicht eingetragen" -#: gitk:5078 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Lokale Änderungen, nicht bereitgestellt" -#: gitk:6759 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 msgid "many" msgstr "viele" -#: gitk:6942 +#: gitk:7309 msgid "Tags:" msgstr "Markierungen:" -#: gitk:6959 gitk:6965 gitk:8280 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Eltern" -#: gitk:6970 +#: gitk:7337 msgid "Child" msgstr "Kind" -#: gitk:6979 +#: gitk:7346 msgid "Branch" msgstr "Zweig" -#: gitk:6982 +#: gitk:7349 msgid "Follows" msgstr "Folgt auf" -#: gitk:6985 +#: gitk:7352 msgid "Precedes" msgstr "Vorgänger von" -#: gitk:7522 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Fehler beim Laden des Vergleichs: %s" -#: gitk:8108 +#: gitk:8631 msgid "Goto:" msgstr "Gehe zu:" -#: gitk:8129 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Kurzer SHA1-Hashwert »%s« ist mehrdeutig" -#: gitk:8136 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "Version »%s« ist unbekannt" -#: gitk:8146 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA1-Hashwert »%s« ist unbekannt" -#: gitk:8148 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Version »%s« wird in der aktuellen Ansicht nicht angezeigt" -#: gitk:8290 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Datum" + +#: gitk:8816 msgid "Children" msgstr "Kinder" -#: gitk:8348 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Zweig »%s« hierher zurücksetzen" -#: gitk:8350 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Zweigspitze ist abgetrennt: Zurücksetzen nicht möglich" -#: gitk:8459 gitk:8465 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Überspringe Zusammenführungs-Version " -#: gitk:8474 gitk:8479 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Fehler beim Holen der Patch-ID für " -#: gitk:8475 gitk:8480 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - Abbruch.\n" -#: gitk:8485 gitk:8488 gitk:8496 gitk:8510 gitk:8519 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Version " -#: gitk:8489 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -844,7 +889,7 @@ msgstr "" " ist das gleiche Patch wie\n" " " -#: gitk:8497 +#: gitk:9024 msgid "" " differs from\n" " " @@ -852,7 +897,7 @@ msgstr "" " ist unterschiedlich von\n" " " -#: gitk:8499 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -860,130 +905,131 @@ msgstr "" "Vergleich der Versionen:\n" "\n" -#: gitk:8511 gitk:8520 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " hat %s Kinder. Abbruch\n" -#: gitk:8539 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Fehler beim Schreiben der Version in Datei: %s" -#: gitk:8545 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "Fehler beim Vergleichen der Versionen: %s" -#: gitk:8575 +#: gitk:9118 msgid "Top" msgstr "Oben" -#: gitk:8576 +#: gitk:9119 msgid "From" msgstr "Von" -#: gitk:8581 +#: gitk:9124 msgid "To" msgstr "bis" -#: gitk:8605 +#: gitk:9148 msgid "Generate patch" msgstr "Patch erstellen" -#: gitk:8607 +#: gitk:9150 msgid "From:" msgstr "Von:" -#: gitk:8616 +#: gitk:9159 msgid "To:" msgstr "bis:" -#: gitk:8625 +#: gitk:9168 msgid "Reverse" msgstr "Umgekehrt" -#: gitk:8627 gitk:8822 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Ausgabedatei:" -#: gitk:8633 +#: gitk:9176 msgid "Generate" msgstr "Erzeugen" -#: gitk:8671 +#: gitk:9214 msgid "Error creating patch:" msgstr "Fehler beim Erzeugen des Patches:" -#: gitk:8694 gitk:8810 gitk:8867 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:8703 +#: gitk:9246 msgid "Tag name:" msgstr "Markierungsname:" -#: gitk:8706 +#: gitk:9249 msgid "Tag message is optional" msgstr "Eine Markierungsbeschreibung ist optional" -#: gitk:8708 +#: gitk:9251 msgid "Tag message:" msgstr "Markierungsbeschreibung:" -#: gitk:8712 gitk:8876 +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Erstellen" -#: gitk:8730 +#: gitk:9273 msgid "No tag name specified" msgstr "Kein Markierungsname angegeben" -#: gitk:8734 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Markierung »%s« existiert bereits." -#: gitk:8744 +#: gitk:9287 msgid "Error creating tag:" msgstr "Fehler beim Erstellen der Markierung:" -#: gitk:8819 +#: gitk:9363 msgid "Command:" msgstr "Kommando:" -#: gitk:8827 +#: gitk:9371 msgid "Write" msgstr "Schreiben" -#: gitk:8845 +#: gitk:9389 msgid "Error writing commit:" msgstr "Fehler beim Schreiben der Version:" -#: gitk:8872 +#: gitk:9416 msgid "Name:" msgstr "Name:" -#: gitk:8895 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Bitte geben Sie einen Namen für den neuen Zweig an." -#: gitk:8900 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Zweig »%s« existiert bereits. Soll er überschrieben werden?" -#: gitk:8966 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" -"Version »%s« ist bereits im Zweig »%s« enthalten -- trotzdem erneut eintragen?" +"Version »%s« ist bereits im Zweig »%s« enthalten -- trotzdem erneut " +"eintragen?" -#: gitk:8971 +#: gitk:9516 msgid "Cherry-picking" msgstr "Version pflücken" -#: gitk:8980 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -993,7 +1039,7 @@ msgstr "" "vorliegen. Bitte diese Änderungen eintragen, zurücksetzen oder\n" "zwischenspeichern (»git stash«) und dann erneut versuchen." -#: gitk:8986 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1002,34 +1048,66 @@ msgstr "" "ist. Soll das Zusammenführungs-Werkzeug (»git citool«) aufgerufen\n" "werden, um diesen Konflikt aufzulösen?" -#: gitk:9002 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Keine Änderungen eingetragen" -#: gitk:9028 +#: gitk:9574 +#, fuzzy, 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?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "Zurücksetzen" + +#: gitk:9587 +#, fuzzy, 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" +"vorliegen. Bitte diese Änderungen eintragen, zurücksetzen oder\n" +"zwischenspeichern (»git stash«) und dann erneut versuchen." + +#: gitk:9591 +#, 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" +"ist. Soll das Zusammenführungs-Werkzeug (»git citool«) aufgerufen\n" +"werden, um diesen Konflikt aufzulösen?" + +#: gitk:9634 msgid "Confirm reset" msgstr "Zurücksetzen bestätigen" -#: gitk:9030 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Zweig »%s« auf »%s« zurücksetzen?" -#: gitk:9032 +#: gitk:9638 msgid "Reset type:" msgstr "Art des Zurücksetzens:" -#: gitk:9035 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Harmlos: Arbeitskopie und Bereitstellung unverändert" -#: gitk:9038 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "" "Gemischt: Arbeitskopie unverändert,\n" "Bereitstellung zurückgesetzt" -#: gitk:9041 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1037,21 +1115,21 @@ msgstr "" "Hart: Arbeitskopie und Bereitstellung\n" "(Alle lokalen Änderungen werden gelöscht)" -#: gitk:9058 +#: gitk:9664 msgid "Resetting" msgstr "Zurücksetzen" -#: gitk:9118 +#: gitk:9724 msgid "Checking out" msgstr "Umstellen" -#: gitk:9171 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "" "Der Zweig, auf den die Arbeitskopie momentan umgestellt ist, kann nicht " "gelöscht werden." -#: gitk:9177 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1060,16 +1138,16 @@ msgstr "" "Die Versionen auf Zweig »%s« existieren auf keinem anderen Zweig.\n" "Zweig »%s« trotzdem löschen?" -#: gitk:9208 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Markierungen und Zweige: %s" -#: gitk:9223 +#: gitk:9829 msgid "Filter" msgstr "Filtern" -#: gitk:9518 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1077,202 +1155,228 @@ msgstr "" "Fehler beim Lesen der Strukturinformationen; Zweige und Informationen zu " "Vorgänger/Nachfolger werden unvollständig sein." -#: gitk:10504 +#: gitk:11102 msgid "Tag" msgstr "Markierung" -#: gitk:10504 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:10554 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Gitk-Schriften wählen" -#: gitk:10571 +#: gitk:11206 msgid "B" msgstr "F" -#: gitk:10574 +#: gitk:11209 msgid "I" msgstr "K" -#: gitk:10692 -msgid "Gitk preferences" -msgstr "Gitk-Einstellungen" - -#: gitk:10694 +#: gitk:11327 msgid "Commit list display options" msgstr "Anzeige der Versionsliste" -#: gitk:10697 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Maximale Graphenbreite (Zeilen)" -#: gitk:10700 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Maximale Graphenbreite (% des Fensters)" -#: gitk:10703 +#: gitk:11337 msgid "Show local changes" msgstr "Lokale Änderungen anzeigen" -#: gitk:10706 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "SHA1-Hashwert automatisch auswählen" -#: gitk:10709 +#: gitk:11344 msgid "Hide remote refs" msgstr "Entfernte Zweige/Markierungen ausblenden" -#: gitk:10713 +#: gitk:11348 msgid "Diff display options" msgstr "Anzeige des Vergleichs" -#: gitk:10715 +#: gitk:11350 msgid "Tab spacing" msgstr "Tabulatorbreite" -#: gitk:10718 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Naheliegende Markierungen anzeigen" -#: gitk:10721 +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" + +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Vergleich nur für angezeigte Pfade" -#: gitk:10724 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Zeichenkodierung pro Datei ermitteln" -#: gitk:10730 gitk:10819 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Externes Diff-Programm" -#: gitk:10731 +#: gitk:11369 msgid "Choose..." msgstr "Wählen ..." -#: gitk:10736 +#: gitk:11374 msgid "General options" msgstr "Allgemeine Optionen" -#: gitk:10739 +#: gitk:11377 msgid "Use themed widgets" msgstr "Aussehen der Benutzeroberfläche durch Thema bestimmen" -#: gitk:10741 +#: gitk:11379 msgid "(change requires restart)" msgstr "(Änderungen werden erst nach Neustart wirksam)" -#: gitk:10743 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(Momentan nicht verfügbar)" -#: gitk:10747 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Farben: Klicken zum Wählen" -#: gitk:10750 +#: gitk:11395 msgid "Interface" msgstr "Benutzeroberfläche" -#: gitk:10751 +#: gitk:11396 msgid "interface" msgstr "Benutzeroberfläche" -#: gitk:10754 +#: gitk:11399 msgid "Background" msgstr "Hintergrund" -#: gitk:10755 gitk:10785 +#: gitk:11400 gitk:11430 msgid "background" msgstr "Hintergrund" -#: gitk:10758 +#: gitk:11403 msgid "Foreground" msgstr "Vordergrund" -#: gitk:10759 +#: gitk:11404 msgid "foreground" msgstr "Vordergrund" -#: gitk:10762 +#: gitk:11407 msgid "Diff: old lines" msgstr "Vergleich: Alte Zeilen" -#: gitk:10763 +#: gitk:11408 msgid "diff old lines" msgstr "Vergleich - Alte Zeilen" -#: gitk:10767 +#: gitk:11412 msgid "Diff: new lines" msgstr "Vergleich: Neue Zeilen" -#: gitk:10768 +#: gitk:11413 msgid "diff new lines" msgstr "Vergleich - Neue Zeilen" -#: gitk:10772 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Vergleich: Änderungstitel" -#: gitk:10774 +#: gitk:11419 msgid "diff hunk header" msgstr "Vergleich - Änderungstitel" -#: gitk:10778 +#: gitk:11423 msgid "Marked line bg" msgstr "Hintergrund für markierte Zeile" -#: gitk:10780 +#: gitk:11425 msgid "marked line background" msgstr "Hintergrund für markierte Zeile" -#: gitk:10784 +#: gitk:11429 msgid "Select bg" msgstr "Hintergrundfarbe auswählen" -#: gitk:10788 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Schriftart: Klicken zum Wählen" -#: gitk:10790 +#: gitk:11440 msgid "Main font" msgstr "Programmschriftart" -#: gitk:10791 +#: gitk:11441 msgid "Diff display font" msgstr "Schriftart für Vergleich" -#: gitk:10792 +#: gitk:11442 msgid "User interface font" msgstr "Beschriftungen" -#: gitk:10829 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Gitk-Einstellungen" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Erzeugen" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: Farbe wählen für %s" -#: gitk:11433 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Kein Git-Projektarchiv gefunden." -#: gitk:11437 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "Git-Verzeichnis »%s« wurde nicht gefunden." - -#: gitk:11484 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Mehrdeutige Angabe »%s«: Sowohl Version als auch Dateiname existiert." -#: gitk:11496 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Falsche Kommandozeilen-Parameter für gitk:" -#: gitk:11587 +#: gitk:12405 msgid "Command line" msgstr "Kommandozeile" + +#~ msgid "next" +#~ msgstr "nächste" + +#~ msgid "prev" +#~ msgstr "vorige" + +#~ msgid "CDate" +#~ msgstr "Eintragedatum" + +#~ msgid "Cannot find the git directory \"%s\"." +#~ msgstr "Git-Verzeichnis »%s« wurde nicht gefunden." diff --git a/gitk-git/po/es.po b/gitk-git/po/es.po index 0471dd0672..cfc10e13ea 100644 --- a/gitk-git/po/es.po +++ b/gitk-git/po/es.po @@ -8,25 +8,43 @@ msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-10-18 22:03+1100\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2008-03-25 11:20+0100\n" "Last-Translator: Santiago Gala <santiago.gala@gmail.com>\n" "Language-Team: Spanish\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gitk:113 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "Imposible obtener la lista de archivos pendientes de fusión:" -#: gitk:340 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 +#, fuzzy +msgid "Error parsing revisions:" +msgstr "Error al leer las diferencias de fusión:" + +#: gitk:380 +msgid "Error executing --argscmd command:" +msgstr "" + +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "No hay archivos seleccionados: se seleccionó la opción --merge pero no hay " "archivos pendientes de fusión." -#: gitk:343 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -34,254 +52,317 @@ msgstr "" "No hay archivos seleccionados: se seleccionó la opción --merge pero los " "archivos especificados no necesitan fusión." -#: gitk:378 +#: gitk:418 gitk:566 +#, fuzzy +msgid "Error executing git log:" +msgstr "Error al crear la etiqueta:" + +#: gitk:436 gitk:582 msgid "Reading" msgstr "Leyendo" -#: gitk:438 gitk:3462 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Leyendo revisiones..." -#: gitk:441 gitk:1528 gitk:3465 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "No se seleccionaron revisiones" -#: gitk:1399 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Error analizando la salida de git log:" -#: gitk:1605 +#: gitk:1740 msgid "No commit information available" msgstr "Falta información sobre las revisiones" -#: gitk:1709 gitk:1731 gitk:3259 gitk:7764 gitk:9293 gitk:9466 +#: gitk:1897 +msgid "mc" +msgstr "" + +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "Aceptar" -#: gitk:1733 gitk:3260 gitk:7439 gitk:7510 gitk:7613 gitk:7660 gitk:7766 -#: gitk:9294 gitk:9467 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Cancelar" -#: gitk:1811 +#: gitk:2069 msgid "Update" msgstr "Actualizar" -#: gitk:1813 +#: gitk:2070 +msgid "Reload" +msgstr "" + +#: gitk:2071 msgid "Reread references" msgstr "Releer referencias" -#: gitk:1814 +#: gitk:2072 msgid "List references" msgstr "Lista de referencias" -#: gitk:1815 +#: gitk:2074 +msgid "Start git gui" +msgstr "" + +#: gitk:2076 msgid "Quit" msgstr "Salir" -#: gitk:1810 +#: gitk:2068 msgid "File" msgstr "Archivo" -#: gitk:1818 +#: gitk:2080 msgid "Preferences" msgstr "Preferencias" -#: gitk:1817 +#: gitk:2079 msgid "Edit" msgstr "Editar" -#: gitk:1821 +#: gitk:2084 msgid "New view..." msgstr "Nueva vista..." -#: gitk:1822 +#: gitk:2085 msgid "Edit view..." msgstr "Modificar vista..." -#: gitk:1823 +#: gitk:2086 msgid "Delete view" msgstr "Eliminar vista" -#: gitk:1825 +#: gitk:2088 msgid "All files" msgstr "Todos los archivos" -#: gitk:1820 gitk:3196 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Vista" -#: gitk:1828 gitk:2487 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Acerca de gitk" -#: gitk:1829 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Combinaciones de teclas" -#: gitk:1827 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Ayuda" -#: gitk:1887 -msgid "SHA1 ID: " -msgstr "SHA1 ID: " +#: gitk:2185 gitk:8633 +msgid "SHA1 ID:" +msgstr "SHA1 ID:" -#: gitk:1918 +#: gitk:2229 msgid "Row" msgstr "" -#: gitk:1949 +#: gitk:2267 msgid "Find" msgstr "Buscar" -#: gitk:1950 -msgid "next" -msgstr "<<" - -#: gitk:1951 -msgid "prev" -msgstr ">>" - -#: gitk:1952 +#: gitk:2295 msgid "commit" msgstr "revisión" -#: gitk:1955 gitk:1957 gitk:3617 gitk:3640 gitk:3664 gitk:5550 gitk:5621 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "que contiene:" -#: gitk:1958 gitk:2954 gitk:2959 gitk:3692 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "que modifica la ruta:" -#: gitk:1959 gitk:3697 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "que añade/elimina cadena:" -#: gitk:1968 gitk:1970 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Exacto" -#: gitk:1970 gitk:3773 gitk:5518 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "NoMayús" -#: gitk:1970 gitk:3666 gitk:3771 gitk:5514 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Regex" -#: gitk:1972 gitk:1973 gitk:3792 gitk:3822 gitk:3829 gitk:5641 gitk:5708 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Todos los campos" -#: gitk:1973 gitk:3790 gitk:3822 gitk:5580 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Título" -#: gitk:1974 gitk:3790 gitk:5580 gitk:5708 gitk:6109 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Comentarios" -#: gitk:1974 gitk:3790 gitk:3794 gitk:3829 gitk:5580 gitk:6045 gitk:7285 -#: gitk:7300 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Autor" -#: gitk:1974 gitk:3790 gitk:5580 gitk:6047 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "" -#: gitk:2003 +#: gitk:2350 msgid "Search" msgstr "Buscar" -#: gitk:2010 +#: gitk:2358 msgid "Diff" msgstr "Diferencia" -#: gitk:2012 +#: gitk:2360 msgid "Old version" msgstr "Versión antigua" -#: gitk:2014 +#: gitk:2362 msgid "New version" msgstr "Versión nueva" -#: gitk:2016 +#: gitk:2364 msgid "Lines of context" msgstr "Líneas de contexto" -#: gitk:2026 +#: gitk:2374 msgid "Ignore space change" msgstr "Ignora cambios de espaciado" -#: gitk:2084 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Parche" -#: gitk:2086 +#: gitk:2447 msgid "Tree" msgstr "Árbol" -#: gitk:2213 gitk:2226 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Diferencia de esta -> seleccionada" -#: gitk:2214 gitk:2227 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Diferencia de seleccionada -> esta" -#: gitk:2215 gitk:2228 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Crear patch" -#: gitk:2216 gitk:7494 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Crear etiqueta" -#: gitk:2217 gitk:7593 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Escribir revisiones a archivo" -#: gitk:2218 gitk:7647 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Crear nueva rama" -#: gitk:2219 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Añadir esta revisión a la rama actual (cherry-pick)" -#: gitk:2220 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Traer la rama HEAD aquí" -#: gitk:2234 +#: gitk:2624 +#, fuzzy +msgid "Mark this commit" +msgstr "Añadir esta revisión a la rama actual (cherry-pick)" + +#: gitk:2625 +msgid "Return to mark" +msgstr "" + +#: gitk:2626 +msgid "Find descendant of this and mark" +msgstr "" + +#: gitk:2627 +msgid "Compare with marked commit" +msgstr "" + +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Diferencia de esta -> seleccionada" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Diferencia de seleccionada -> esta" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Añadir esta revisión a la rama actual (cherry-pick)" + +#: gitk:2646 msgid "Check out this branch" msgstr "Cambiar a esta rama" -#: gitk:2235 +#: gitk:2647 msgid "Remove this branch" msgstr "Eliminar esta rama" -#: gitk:2242 +#: gitk:2654 msgid "Highlight this too" msgstr "Seleccionar también" -#: gitk:2243 +#: gitk:2655 msgid "Highlight this only" msgstr "Seleccionar sólo" -#: gitk:2245 +#: gitk:2656 +msgid "External diff" +msgstr "" + +#: gitk:2657 msgid "Blame parent commit" msgstr "" -#: gitk:2488 +#: gitk:2664 +msgid "Show origin of this line" +msgstr "" + +#: gitk:2665 +msgid "Run git gui blame on this line" +msgstr "" + +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -293,425 +374,728 @@ msgstr "" "Uso y redistribución permitidos según los términos de la Licencia Pública " "General de GNU (GNU GPL)" -#: gitk:2496 gitk:2557 gitk:7943 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Cerrar" -#: gitk:2515 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Combinaciones de tecla de Gitk" -#: gitk:2517 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Combinaciones de tecla de Gitk:" -#: gitk:2519 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tSalir" -#: gitk:2520 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\tBuscar" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tIr a la primera revisión" -#: gitk:2521 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tIr a la última revisión" -#: gitk:2522 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, i\tSubir una revisión" -#: gitk:2523 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, k\tBajar una revisión" -#: gitk:2524 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, j\tRetroceder en la historia" -#: gitk:2525 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\tAvanzar en la historia" -#: gitk:2526 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tSubir una página en la lista de revisiones" -#: gitk:2527 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tBajar una página en la lista de revisiones" -#: gitk:2528 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tDesplazarse al inicio de la lista de revisiones" -#: gitk:2529 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tDesplazarse al final de la lista de revisiones" -#: gitk:2530 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tDesplazar una línea hacia arriba la lista de revisiones" -#: gitk:2531 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tDesplazar una línea hacia abajo la lista de revisiones" -#: gitk:2532 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tDesplazar una página hacia arriba la lista de revisiones" -#: gitk:2533 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tDesplazar una página hacia abajo la lista de revisiones" -#: gitk:2534 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Up>\tBuscar hacia atrás (arriba, revisiones siguientes)" -#: gitk:2535 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Shift-Down>\tBuscar hacia adelante (abajo, revisiones anteriores)" -#: gitk:2536 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tDesplaza hacia arriba una página la vista de diferencias" -#: gitk:2537 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tDesplaza hacia arriba una página la vista de diferencias" -#: gitk:2538 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Space>\t\tDesplaza hacia abajo una página la vista de diferencias" -#: gitk:2539 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tDesplaza hacia arriba 18 líneas la vista de diferencias" -#: gitk:2540 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tDesplaza hacia abajo 18 líneas la vista de diferencias" -#: gitk:2541 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tBuscar" -#: gitk:2542 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tBuscar el siguiente" -#: gitk:2543 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\tBuscar el siguiente" -#: gitk:2544 -msgid "/\t\tMove to next find hit, or redo find" -msgstr "/\t\tBuscar el siguiente, o reiniciar la búsqueda" +#: gitk:3072 +msgid "/\t\tFocus the search box" +msgstr "" -#: gitk:2545 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tBuscar el anterior" -#: gitk:2546 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tDesplazar la vista de diferencias al archivo siguiente" -#: gitk:2547 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tBuscar siguiente en la vista de diferencias" -#: gitk:2548 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tBuscar anterior en la vista de diferencias" -#: gitk:2549 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tAumentar tamaño del texto" -#: gitk:2550 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tAumentar tamaño del texto" -#: gitk:2551 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tDisminuir tamaño del texto" -#: gitk:2552 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tDisminuir tamaño del texto" -#: gitk:2553 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tActualizar" -#: gitk:3200 +#: gitk:3546 gitk:3555 +#, fuzzy, tcl-format +msgid "Error creating temporary directory %s:" +msgstr "Error en la creación del parche:" + +#: gitk:3568 +#, fuzzy, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "Error al leer las diferencias de fusión:" + +#: gitk:3631 +#, fuzzy +msgid "command failed:" +msgstr "Línea de comandos" + +#: gitk:3780 +#, fuzzy +msgid "No such commit" +msgstr "No se han guardado cambios" + +#: gitk:3794 +msgid "git gui blame: command failed:" +msgstr "" + +#: gitk:3825 +#, tcl-format +msgid "Couldn't read merge head: %s" +msgstr "" + +#: gitk:3833 +#, fuzzy, tcl-format +msgid "Error reading index: %s" +msgstr "Error al crear la etiqueta:" + +#: gitk:3858 +#, tcl-format +msgid "Couldn't start git blame: %s" +msgstr "" + +#: gitk:3861 gitk:6735 +msgid "Searching" +msgstr "Buscando" + +#: gitk:3893 +#, fuzzy, tcl-format +msgid "Error running git blame: %s" +msgstr "Error al crear la etiqueta:" + +#: gitk:3921 +#, tcl-format +msgid "That line comes from commit %s, which is not in this view" +msgstr "" + +#: gitk:3935 +#, fuzzy +msgid "External diff viewer failed:" +msgstr "f\t\tDesplazar la vista de diferencias al archivo siguiente" + +#: gitk:4053 msgid "Gitk view definition" msgstr "Definición de vistas de Gitk" -#: gitk:3225 -msgid "Name" -msgstr "Nombre" - -#: gitk:3228 +#: gitk:4057 msgid "Remember this view" msgstr "Recordar esta vista" -#: gitk:3232 -msgid "Commits to include (arguments to git log):" +#: gitk:4058 +msgid "References (space separated list):" +msgstr "" + +#: gitk:4059 +msgid "Branches & tags:" +msgstr "" + +#: gitk:4060 +#, fuzzy +msgid "All refs" +msgstr "Todos los archivos" + +#: gitk:4061 +msgid "All (local) branches" +msgstr "" + +#: gitk:4062 +msgid "All tags" +msgstr "" + +#: gitk:4063 +msgid "All remote-tracking branches" +msgstr "" + +#: gitk:4064 +msgid "Commit Info (regular expressions):" +msgstr "" + +#: gitk:4065 +#, fuzzy +msgid "Author:" +msgstr "Autor" + +#: gitk:4066 +#, fuzzy +msgid "Committer:" +msgstr "revisión" + +#: gitk:4067 +msgid "Commit Message:" +msgstr "" + +#: gitk:4068 +msgid "Matches all Commit Info criteria" +msgstr "" + +#: gitk:4069 +msgid "Matches none Commit Info criteria" +msgstr "" + +#: gitk:4070 +msgid "Changes to Files:" +msgstr "" + +#: gitk:4071 +msgid "Fixed String" +msgstr "" + +#: gitk:4072 +msgid "Regular Expression" +msgstr "" + +#: gitk:4073 +#, fuzzy +msgid "Search string:" +msgstr "Buscando" + +#: gitk:4074 +msgid "" +"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " +"15:27:38\"):" +msgstr "" + +#: gitk:4075 +msgid "Since:" +msgstr "" + +#: gitk:4076 +msgid "Until:" +msgstr "" + +#: gitk:4077 +msgid "Limit and/or skip a number of revisions (positive integer):" +msgstr "" + +#: gitk:4078 +msgid "Number to show:" +msgstr "" + +#: gitk:4079 +msgid "Number to skip:" +msgstr "" + +#: gitk:4080 +msgid "Miscellaneous options:" +msgstr "" + +#: gitk:4081 +msgid "Strictly sort by date" +msgstr "" + +#: gitk:4082 +msgid "Mark branch sides" +msgstr "" + +#: gitk:4083 +#, fuzzy +msgid "Limit to first parent" +msgstr "Limitar las diferencias a las rutas seleccionadas" + +#: gitk:4084 +msgid "Simple history" +msgstr "" + +#: gitk:4085 +#, fuzzy +msgid "Additional arguments to git log:" msgstr "Revisiones a incluir (argumentos a git log):" -#: gitk:3239 +#: gitk:4086 +msgid "Enter files and directories to include, one per line:" +msgstr "Introducir archivos y directorios a incluir, uno por línea:" + +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Comando que genera más revisiones a incluir:" -#: gitk:3246 -msgid "Enter files and directories to include, one per line:" -msgstr "Introducir archivos y directorios a incluir, uno por línea:" +#: gitk:4211 +msgid "Gitk: edit view" +msgstr "" + +#: gitk:4219 +msgid "-- criteria for selecting revisions" +msgstr "" + +#: gitk:4224 +#, fuzzy +msgid "View Name" +msgstr "Vista" + +#: gitk:4299 +msgid "Apply (F5)" +msgstr "" -#: gitk:3293 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Error en los argumentos de selección de las revisiones:" -#: gitk:3347 gitk:3399 gitk:3842 gitk:3856 gitk:5060 gitk:10141 gitk:10142 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Ninguno" -#: gitk:3790 gitk:5580 gitk:7287 gitk:7302 -msgid "Date" -msgstr "Fecha" - -#: gitk:3790 gitk:5580 -msgid "CDate" -msgstr "Fecha de creación" - -#: gitk:3939 gitk:3944 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Descendiente" -#: gitk:3940 +#: gitk:5004 msgid "Not descendant" msgstr "No descendiente" -#: gitk:3947 gitk:3952 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Antepasado" -#: gitk:3948 +#: gitk:5012 msgid "Not ancestor" msgstr "No antepasado" -#: gitk:4187 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Cambios locales añadidos al índice pero sin completar revisión" -#: gitk:4220 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Cambios locales sin añadir al índice" -#: gitk:5549 -msgid "Searching" -msgstr "Buscando" +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 +msgid "many" +msgstr "" -#: gitk:6049 +#: gitk:7309 msgid "Tags:" msgstr "Etiquetas:" -#: gitk:6066 gitk:6072 gitk:7280 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Padre" -#: gitk:6077 +#: gitk:7337 msgid "Child" msgstr "Hija" -#: gitk:6086 +#: gitk:7346 msgid "Branch" msgstr "Rama" -#: gitk:6089 +#: gitk:7349 msgid "Follows" msgstr "Sigue-a" -#: gitk:6092 +#: gitk:7352 msgid "Precedes" msgstr "Precede-a" -#: gitk:6378 -msgid "Error getting merge diffs:" +#: gitk:7947 +#, fuzzy, tcl-format +msgid "Error getting diffs: %s" msgstr "Error al leer las diferencias de fusión:" -#: gitk:7113 +#: gitk:8631 msgid "Goto:" msgstr "Ir a:" -#: gitk:7115 -msgid "SHA1 ID:" -msgstr "SHA1 ID:" - -#: gitk:7134 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "La id SHA1 abreviada %s es ambigua" -#: gitk:7146 +#: gitk:8659 +#, fuzzy, tcl-format +msgid "Revision %s is not known" +msgstr "La id SHA1 %s es desconocida" + +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "La id SHA1 %s es desconocida" -#: gitk:7148 +#: gitk:8671 #, tcl-format -msgid "Tag/Head %s is not known" -msgstr "La etiqueta/rama %s es deconocida" +msgid "Revision %s is not in the current view" +msgstr "" -#: gitk:7290 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Fecha" + +#: gitk:8816 msgid "Children" msgstr "Hijas" -#: gitk:7347 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Poner la rama %s en esta revisión" -#: gitk:7349 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "" -#: gitk:7381 +#: gitk:8986 gitk:8992 +msgid "Skipping merge commit " +msgstr "" + +#: gitk:9001 gitk:9006 +#, fuzzy +msgid "Error getting patch ID for " +msgstr "Error en la creación del parche:" + +#: gitk:9002 gitk:9007 +msgid " - stopping\n" +msgstr "" + +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 +#, fuzzy +msgid "Commit " +msgstr "revisión" + +#: gitk:9016 +msgid "" +" is the same patch as\n" +" " +msgstr "" + +#: gitk:9024 +msgid "" +" differs from\n" +" " +msgstr "" + +#: gitk:9026 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "" + +#: gitk:9038 gitk:9047 +#, tcl-format +msgid " has %s children - stopping\n" +msgstr "" + +#: gitk:9066 +#, fuzzy, tcl-format +msgid "Error writing commit to file: %s" +msgstr "Error al escribir revisión:" + +#: gitk:9072 +#, fuzzy, tcl-format +msgid "Error diffing commits: %s" +msgstr "Error al escribir revisión:" + +#: gitk:9118 msgid "Top" msgstr "Origen" -#: gitk:7382 +#: gitk:9119 msgid "From" msgstr "De" -#: gitk:7387 +#: gitk:9124 msgid "To" msgstr "A" -#: gitk:7410 +#: gitk:9148 msgid "Generate patch" msgstr "Generar parche" -#: gitk:7412 +#: gitk:9150 msgid "From:" msgstr "De:" -#: gitk:7421 +#: gitk:9159 msgid "To:" msgstr "Para:" -#: gitk:7430 +#: gitk:9168 msgid "Reverse" msgstr "Invertir" -#: gitk:7432 gitk:7607 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Escribir a archivo:" -#: gitk:7438 +#: gitk:9176 msgid "Generate" msgstr "Generar" -#: gitk:7474 +#: gitk:9214 msgid "Error creating patch:" msgstr "Error en la creación del parche:" -#: gitk:7496 gitk:7595 gitk:7649 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:7505 +#: gitk:9246 msgid "Tag name:" msgstr "Nombre de etiqueta:" -#: gitk:7509 gitk:7659 +#: gitk:9249 +msgid "Tag message is optional" +msgstr "" + +#: gitk:9251 +#, fuzzy +msgid "Tag message:" +msgstr "Nombre de etiqueta:" + +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Crear" -#: gitk:7524 +#: gitk:9273 msgid "No tag name specified" msgstr "No se ha especificado etiqueta" -#: gitk:7528 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "La etiqueta \"%s\" ya existe" -#: gitk:7534 +#: gitk:9287 msgid "Error creating tag:" msgstr "Error al crear la etiqueta:" -#: gitk:7604 +#: gitk:9363 msgid "Command:" msgstr "Comando:" -#: gitk:7612 +#: gitk:9371 msgid "Write" msgstr "Escribir" -#: gitk:7628 +#: gitk:9389 msgid "Error writing commit:" msgstr "Error al escribir revisión:" -#: gitk:7654 +#: gitk:9416 msgid "Name:" msgstr "Nombre:" -#: gitk:7674 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Especifique un nombre para la nueva rama" -#: gitk:7703 +#: gitk:9444 +#, fuzzy, tcl-format +msgid "Branch '%s' already exists. Overwrite?" +msgstr "La etiqueta \"%s\" ya existe" + +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "La revisión %s ya está incluida en la rama %s -- ¿Volver a aplicarla?" -#: gitk:7708 +#: gitk:9516 msgid "Cherry-picking" msgstr "Eligiendo revisiones (cherry-picking)" -#: gitk:7720 +#: gitk:9525 +#, 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 "" + +#: gitk:9531 +msgid "" +"Cherry-pick failed because of merge conflict.\n" +"Do you wish to run git citool to resolve it?" +msgstr "" + +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "No se han guardado cambios" -#: gitk:7745 +#: gitk:9574 +#, fuzzy, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "La revisión %s ya está incluida en la rama %s -- ¿Volver a aplicarla?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "Reponiendo" + +#: gitk:9587 +#, 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 "" + +#: gitk:9591 +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" + +#: gitk:9634 msgid "Confirm reset" msgstr "Confirmar git reset" -#: gitk:7747 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "¿Reponer la rama %s a %s?" -#: gitk:7751 +#: gitk:9638 msgid "Reset type:" msgstr "Tipo de reposición:" -#: gitk:7755 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Suave: No altera la copia de trabajo ni el índice" -#: gitk:7758 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Mixta: Actualiza el índice, no altera la copia de trabajo" -#: gitk:7761 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -719,19 +1103,19 @@ msgstr "" "Dura: Actualiza el índice y la copia de trabajo\n" "(abandona TODAS las modificaciones locales)" -#: gitk:7777 +#: gitk:9664 msgid "Resetting" msgstr "Reponiendo" -#: gitk:7834 +#: gitk:9724 msgid "Checking out" msgstr "Creando copia de trabajo" -#: gitk:7885 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "No se puede borrar la rama actual" -#: gitk:7891 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -740,16 +1124,16 @@ msgstr "" "Las revisiones de la rama %s no están presentes en otras ramas.\n" "¿Borrar la rama %s?" -#: gitk:7922 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Etiquetas y ramas: %s" -#: gitk:7936 +#: gitk:9829 msgid "Filter" msgstr "Filtro" -#: gitk:8230 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -757,155 +1141,255 @@ msgstr "" "Error al leer la topología de revisiones: la información sobre las ramas y " "etiquetas precedentes y siguientes será incompleta." -#: gitk:9216 +#: gitk:11102 msgid "Tag" msgstr "Etiqueta" -#: gitk:9216 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:9262 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Selector de tipografías gitk" -#: gitk:9279 +#: gitk:11206 msgid "B" msgstr "B" -#: gitk:9282 +#: gitk:11209 msgid "I" msgstr "I" -#: gitk:9375 -msgid "Gitk preferences" -msgstr "Preferencias de gitk" - -#: gitk:9376 +#: gitk:11327 msgid "Commit list display options" msgstr "Opciones de visualización de la lista de revisiones" -#: gitk:9379 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Ancho máximo del gráfico (en líneas)" -#: gitk:9383 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Ancho máximo del gráfico (en % del panel)" -#: gitk:9388 +#: gitk:11337 msgid "Show local changes" msgstr "Mostrar cambios locales" -#: gitk:9393 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "Seleccionar automáticamente SHA1 hash" -#: gitk:9398 +#: gitk:11344 +msgid "Hide remote refs" +msgstr "" + +#: gitk:11348 msgid "Diff display options" msgstr "Opciones de visualización de diferencias" -#: gitk:9400 +#: gitk:11350 msgid "Tab spacing" msgstr "Espaciado de tabulador" -#: gitk:9404 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Mostrar etiquetas cercanas" -#: gitk:9409 +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" + +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Limitar las diferencias a las rutas seleccionadas" -#: gitk:9414 +#: gitk:11362 msgid "Support per-file encodings" msgstr "" -#: gitk:9421 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "" -#: gitk:9423 +#: gitk:11369 msgid "Choose..." msgstr "" -#: gitk:9428 +#: gitk:11374 +#, fuzzy +msgid "General options" +msgstr "Generar parche" + +#: gitk:11377 +msgid "Use themed widgets" +msgstr "" + +#: gitk:11379 +msgid "(change requires restart)" +msgstr "" + +#: gitk:11381 +msgid "(currently unavailable)" +msgstr "" + +#: gitk:11392 msgid "Colors: press to choose" msgstr "Colores: pulse para seleccionar" -#: gitk:9431 +#: gitk:11395 +msgid "Interface" +msgstr "" + +#: gitk:11396 +#, fuzzy +msgid "interface" +msgstr "Tipografía para interfaz de usuario" + +#: gitk:11399 msgid "Background" msgstr "Fondo" -#: gitk:9435 +#: gitk:11400 gitk:11430 +#, fuzzy +msgid "background" +msgstr "Fondo" + +#: gitk:11403 msgid "Foreground" msgstr "Primer plano" -#: gitk:9439 +#: gitk:11404 +#, fuzzy +msgid "foreground" +msgstr "Primer plano" + +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff: líneas viejas" -#: gitk:9444 +#: gitk:11408 +#, fuzzy +msgid "diff old lines" +msgstr "Diff: líneas viejas" + +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff: líneas nuevas" -#: gitk:9449 +#: gitk:11413 +#, fuzzy +msgid "diff new lines" +msgstr "Diff: líneas nuevas" + +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff: cabecera de fragmento" -#: gitk:9455 +#: gitk:11419 +#, fuzzy +msgid "diff hunk header" +msgstr "Diff: cabecera de fragmento" + +#: gitk:11423 +msgid "Marked line bg" +msgstr "" + +#: gitk:11425 +msgid "marked line background" +msgstr "" + +#: gitk:11429 msgid "Select bg" msgstr "Color de fondo de la selección" -#: gitk:9459 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Tipografías: pulse para elegir" -#: gitk:9461 +#: gitk:11440 msgid "Main font" msgstr "Tipografía principal" -#: gitk:9462 +#: gitk:11441 msgid "Diff display font" msgstr "Tipografía para diferencias" -#: gitk:9463 +#: gitk:11442 msgid "User interface font" msgstr "Tipografía para interfaz de usuario" -#: gitk:9488 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Preferencias de gitk" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Generar" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: elegir color para %s" -#: gitk:9934 -msgid "" -"Sorry, gitk cannot run with this version of Tcl/Tk.\n" -" Gitk requires at least Tcl/Tk 8.4." -msgstr "" -"Esta versión de Tcl/Tk es demasiado antigua.\n" -" Gitk requiere Tcl/Tk versión 8.4 o superior." - -#: gitk:10047 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "No hay un repositorio git aquí." -#: gitk:10051 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "No hay directorio git \"%s\"." - -#: gitk:10098 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "" "Argumento ambiguo: '%s' es tanto una revisión como un nombre de archivo" -#: gitk:10110 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Argumentos incorrectos a Gitk:" -#: gitk:10170 +#: gitk:12405 msgid "Command line" msgstr "Línea de comandos" + +#~ msgid "SHA1 ID: " +#~ msgstr "SHA1 ID: " + +#~ msgid "next" +#~ msgstr "<<" + +#~ msgid "prev" +#~ msgstr ">>" + +#~ msgid "/\t\tMove to next find hit, or redo find" +#~ msgstr "/\t\tBuscar el siguiente, o reiniciar la búsqueda" + +#~ msgid "Name" +#~ msgstr "Nombre" + +#~ msgid "CDate" +#~ msgstr "Fecha de creación" + +#~ msgid "Tag/Head %s is not known" +#~ msgstr "La etiqueta/rama %s es deconocida" + +#~ msgid "" +#~ "Sorry, gitk cannot run with this version of Tcl/Tk.\n" +#~ " Gitk requires at least Tcl/Tk 8.4." +#~ msgstr "" +#~ "Esta versión de Tcl/Tk es demasiado antigua.\n" +#~ " Gitk requiere Tcl/Tk versión 8.4 o superior." + +#~ msgid "Cannot find the git directory \"%s\"." +#~ msgstr "No hay directorio git \"%s\"." diff --git a/gitk-git/po/fr.po b/gitk-git/po/fr.po index 5370ddc393..747ee190f2 100644 --- a/gitk-git/po/fr.po +++ b/gitk-git/po/fr.po @@ -8,36 +8,45 @@ msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-05 15:16+0200\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2009-11-19 22:13+0100\n" "Last-Translator: Emmanuel Trillaud <etrillaud@gmail.com>\n" "Language-Team: git@vger.kernel.org\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: French\n" "X-Poedit-Country: FRANCE\n" -#: gitk:113 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "Impossible de récupérer la liste des fichiers non fusionnés :" -#: gitk:269 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 msgid "Error parsing revisions:" msgstr "Erreur lors du parcours des révisions :" -#: gitk:324 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Erreur à l'exécution de la commande --argscmd :" -#: gitk:337 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Aucun fichier sélectionné : --merge précisé, mais tous les fichiers sont " "fusionnés." # FIXME : améliorer la traduction de 'file limite' -#: gitk:340 +#: gitk:396 #, fuzzy msgid "" "No files selected: --merge specified but no unmerged files are within file " @@ -46,295 +55,315 @@ msgstr "" "Aucun fichier sélectionné : --merge précisé mais aucun fichier non fusionné " "n'est dans la limite des fichiers." -#: gitk:362 gitk:509 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Erreur à l'exécution de git log :" -#: gitk:380 gitk:525 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Lecture en cours" -#: gitk:440 gitk:4123 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Lecture des commits..." -#: gitk:443 gitk:1561 gitk:4126 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Aucun commit sélectionné" -#: gitk:1437 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Impossible de lire la sortie de git log :" -#: gitk:1657 +#: gitk:1740 msgid "No commit information available" msgstr "Aucune information disponible sur le commit" -#: gitk:1793 gitk:1817 gitk:3916 gitk:8786 gitk:10322 gitk:10498 +#: gitk:1897 +msgid "mc" +msgstr "" + +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "OK" -#: gitk:1819 gitk:3918 gitk:8383 gitk:8457 gitk:8567 gitk:8616 gitk:8788 -#: gitk:10323 gitk:10499 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Annuler" -#: gitk:1919 +#: gitk:2069 msgid "Update" msgstr "Mise à jour" -#: gitk:1920 +#: gitk:2070 msgid "Reload" msgstr "Recharger" -#: gitk:1921 +#: gitk:2071 msgid "Reread references" msgstr "Relire les références" -#: gitk:1922 +#: gitk:2072 msgid "List references" msgstr "Lister les références" -#: gitk:1924 +#: gitk:2074 msgid "Start git gui" msgstr "Démarrer git gui" -#: gitk:1926 +#: gitk:2076 msgid "Quit" msgstr "Quitter" -#: gitk:1918 +#: gitk:2068 msgid "File" msgstr "Fichier" -#: gitk:1930 +#: gitk:2080 msgid "Preferences" msgstr "Préférences" -#: gitk:1929 +#: gitk:2079 msgid "Edit" msgstr "Éditer" -#: gitk:1934 +#: gitk:2084 msgid "New view..." msgstr "Nouvelle vue..." -#: gitk:1935 +#: gitk:2085 msgid "Edit view..." msgstr "Éditer la vue..." -#: gitk:1936 +#: gitk:2086 msgid "Delete view" msgstr "Supprimer la vue" -#: gitk:1938 +#: gitk:2088 msgid "All files" msgstr "Tous les fichiers" -#: gitk:1933 gitk:3670 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Vue" -#: gitk:1943 gitk:1953 gitk:2654 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "À propos de gitk" -#: gitk:1944 gitk:1958 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Raccourcis clavier" -#: gitk:1942 gitk:1957 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Aide" -#: gitk:2018 -msgid "SHA1 ID: " -msgstr "ID SHA1 :" +#: gitk:2185 gitk:8633 +msgid "SHA1 ID:" +msgstr "Id SHA1 :" -#: gitk:2049 +#: gitk:2229 msgid "Row" msgstr "Colonne" -#: gitk:2080 +#: gitk:2267 msgid "Find" msgstr "Recherche" -#: gitk:2081 -msgid "next" -msgstr "suivant" - -#: gitk:2082 -msgid "prev" -msgstr "précédent" - -#: gitk:2083 +#: gitk:2295 msgid "commit" msgstr "commit" -#: gitk:2086 gitk:2088 gitk:4284 gitk:4307 gitk:4331 gitk:6272 gitk:6344 -#: gitk:6428 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "contient :" -#: gitk:2089 gitk:3162 gitk:3167 gitk:4359 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "chemins modifiés :" -#: gitk:2090 gitk:4364 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "ajoute/supprime la chaîne :" -#: gitk:2099 gitk:2101 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Exact" -#: gitk:2101 gitk:4439 gitk:6240 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "Ignorer la casse" -#: gitk:2101 gitk:4333 gitk:4437 gitk:6236 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Expression régulière" -#: gitk:2103 gitk:2104 gitk:4458 gitk:4488 gitk:4495 gitk:6364 gitk:6432 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Tous les champs" -#: gitk:2104 gitk:4456 gitk:4488 gitk:6303 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Surligner" -#: gitk:2105 gitk:4456 gitk:6303 gitk:6432 gitk:6866 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Commentaires" -#: gitk:2105 gitk:4456 gitk:4460 gitk:4495 gitk:6303 gitk:6801 gitk:8063 -#: gitk:8078 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Auteur" -#: gitk:2105 gitk:4456 gitk:6303 gitk:6803 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Auteur du commit" -#: gitk:2134 +#: gitk:2350 msgid "Search" msgstr "Rechercher" -#: gitk:2141 +#: gitk:2358 msgid "Diff" msgstr "Diff" -#: gitk:2143 +#: gitk:2360 msgid "Old version" msgstr "Ancienne version" -#: gitk:2145 +#: gitk:2362 msgid "New version" msgstr "Nouvelle version" -#: gitk:2147 +#: gitk:2364 msgid "Lines of context" msgstr "Lignes de contexte" -#: gitk:2157 +#: gitk:2374 msgid "Ignore space change" msgstr "Ignorer les modifications d'espace" -#: gitk:2215 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Patch" -#: gitk:2217 +#: gitk:2447 msgid "Tree" msgstr "Arbre" -#: gitk:2361 gitk:2378 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Diff entre ceci et la sélection" -#: gitk:2362 gitk:2379 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Diff entre sélection et ceci" -#: gitk:2363 gitk:2380 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Créer patch" -#: gitk:2364 gitk:8441 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Créer tag" -#: gitk:2365 gitk:8547 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Écrire le commit dans un fichier" -#: gitk:2366 gitk:8604 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Créer une nouvelle branche" -#: gitk:2367 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Cueillir (cherry-pick) ce commit" -#: gitk:2368 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Réinitialiser la branche HEAD vers cet état" -#: gitk:2369 +#: gitk:2624 msgid "Mark this commit" msgstr "Marquer ce commit" -#: gitk:2370 +#: gitk:2625 msgid "Return to mark" msgstr "Retourner à la marque" -#: gitk:2371 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Chercher le descendant de ceci et le marquer" -#: gitk:2372 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Comparer avec le commit marqué" -#: gitk:2386 +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Diff entre ceci et la sélection" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Diff entre sélection et ceci" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Marquer ce commit" + +#: gitk:2646 msgid "Check out this branch" msgstr "Récupérer cette branche" -#: gitk:2387 +#: gitk:2647 msgid "Remove this branch" msgstr "Supprimer cette branche" -#: gitk:2394 +#: gitk:2654 msgid "Highlight this too" msgstr "Surligner également ceci" -#: gitk:2395 +#: gitk:2655 msgid "Highlight this only" msgstr "Surligner seulement ceci" -#: gitk:2396 +#: gitk:2656 msgid "External diff" msgstr "Diff externe" -#: gitk:2397 +#: gitk:2657 msgid "Blame parent commit" msgstr "Blâmer le commit parent" -#: gitk:2404 +#: gitk:2664 msgid "Show origin of this line" msgstr "Montrer l'origine de cette ligne" -#: gitk:2405 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Exécuter git gui blame sur cette ligne" -#: gitk:2656 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -346,299 +375,317 @@ msgstr "" "Utilisation et redistribution soumises aux termes de la GNU General Public " "License" -#: gitk:2664 gitk:2726 gitk:8969 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Fermer" -#: gitk:2683 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Raccourcis clavier de Gitk" -#: gitk:2686 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Raccourcis clavier de Gitk :" -#: gitk:2688 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tQuitter" -#: gitk:2689 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\tRechercher" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Début>\t\tAller au premier commit" -#: gitk:2690 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<Fin>\t\tAller au dernier commit" -#: gitk:2691 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Haut>, p, i\t Aller au commit suivant" -#: gitk:2692 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Bas>, n, k\t Aller au commit précédent" -#: gitk:2693 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Gauche>, z, j\tReculer dans l'historique" -#: gitk:2694 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Droite>, x, l\tAvancer dans l'historique" -#: gitk:2695 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tMonter d'une page dans la liste des commits" -#: gitk:2696 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tDescendre d'une page dans la liste des commits" -#: gitk:2697 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Début>\tAller en haut de la liste des commits" -#: gitk:2698 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tAller en bas de la liste des commits" -#: gitk:2699 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tMonter d'une ligne dans la liste des commits" -#: gitk:2700 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tDescendre d'une ligne dans la liste des commits" -#: gitk:2701 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tMonter d'une page dans la liste des commits" -#: gitk:2702 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tDescendre d'une page dans la liste des commits" -#: gitk:2703 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "" "<Shift-Up>\tRecherche en arrière (vers l'avant, commits les plus anciens)" -#: gitk:2704 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "" "<Shift-Down>\tRecherche en avant (vers l'arrière, commit les plus récents)" -#: gitk:2705 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Supprimer>, b\tMonter d'une page dans la vue des diff" -#: gitk:2706 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tMonter d'une page dans la vue des diff" -#: gitk:2707 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Espace>\t\tDescendre d'une page dans la vue des diff" -#: gitk:2708 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tMonter de 18 lignes dans la vue des diff" -#: gitk:2709 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tDescendre de 18 lignes dans la vue des diff" -#: gitk:2710 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tRechercher" -#: gitk:2711 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tAller au résultat de recherche suivant" -#: gitk:2712 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\t\tAller au résultat de recherche suivant" -#: gitk:2713 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tFocus sur la zone de recherche" -#: gitk:2714 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tAller au résultat de recherche précédent" -#: gitk:2715 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tAller au prochain fichier dans la vue des diff" -#: gitk:2716 +#: gitk:3075 #, 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:2717 +#: gitk:3076 #, 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:2718 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tAugmenter la taille de la police" -#: gitk:2719 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tAugmenter la taille de la police" -#: gitk:2720 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tDiminuer la taille de la police" -#: gitk:2721 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tDiminuer la taille de la police" -#: gitk:2722 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tMise à jour" -#: gitk:3177 -#, tcl-format -msgid "Error getting \"%s\" from %s:" -msgstr "Erreur en obtenant \"%s\" de %s:" - -#: gitk:3234 gitk:3243 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Erreur lors de la création du répertoire temporaire %s :" -#: gitk:3255 +#: gitk:3568 +#, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "Erreur en obtenant \"%s\" de %s:" + +#: gitk:3631 msgid "command failed:" msgstr "échec de la commande :" -#: gitk:3401 +#: gitk:3780 msgid "No such commit" msgstr "Commit inexistant" -#: gitk:3415 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame : échec de la commande :" -#: gitk:3446 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Impossible de lire le head de la fusion : %s" -#: gitk:3454 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Erreur à la lecture de l'index : %s" -#: gitk:3479 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Impossible de démarrer git blame : %s" -#: gitk:3482 gitk:6271 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Recherche en cours" -#: gitk:3514 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Erreur à l'exécution de git blame : %s" -#: gitk:3542 +#: gitk:3921 #, 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:3556 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Échec de l'outil externe de visualisation des diff" -#: gitk:3674 +#: gitk:4053 msgid "Gitk view definition" msgstr "Définition des vues de Gitk" -#: gitk:3678 +#: gitk:4057 msgid "Remember this view" msgstr "Se souvenir de cette vue" -#: gitk:3679 +#: gitk:4058 msgid "References (space separated list):" msgstr "Références (liste d'éléments séparés par des espaces) :" -#: gitk:3680 +#: gitk:4059 msgid "Branches & tags:" msgstr "Branches & tags :" -#: gitk:3681 +#: gitk:4060 msgid "All refs" msgstr "Toutes les références" -#: gitk:3682 +#: gitk:4061 msgid "All (local) branches" msgstr "Toutes les branches (locales)" -#: gitk:3683 +#: gitk:4062 msgid "All tags" msgstr "Tous les tags" -#: gitk:3684 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Toutes les branches de suivi à distance" -#: gitk:3685 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Info sur les commits (expressions régulières) :" -#: gitk:3686 +#: gitk:4065 msgid "Author:" msgstr "Auteur :" -#: gitk:3687 +#: gitk:4066 msgid "Committer:" msgstr "Commiteur :" -#: gitk:3688 +#: gitk:4067 msgid "Commit Message:" msgstr "Message de commit :" -#: gitk:3689 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Correspond à tous les critères d'Info sur les commits" -#: gitk:3690 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Correspond à tous les critères d'Info sur les commits" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Changements des fichiers :" -#: gitk:3691 +#: gitk:4071 msgid "Fixed String" msgstr "Chaîne Figée" -#: gitk:3692 +#: gitk:4072 msgid "Regular Expression" msgstr "Expression Régulière" -#: gitk:3693 +#: gitk:4073 msgid "Search string:" msgstr "Recherche de la chaîne :" -#: gitk:3694 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -646,207 +693,204 @@ msgstr "" "Dates des commits (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, " "2009 15:27:38\") :" -#: gitk:3695 +#: gitk:4075 msgid "Since:" msgstr "De :" -#: gitk:3696 +#: gitk:4076 msgid "Until:" msgstr "Jusqu'au :" -#: gitk:3697 +#: gitk:4077 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:3698 +#: gitk:4078 msgid "Number to show:" msgstr "Nombre à afficher :" -#: gitk:3699 +#: gitk:4079 msgid "Number to skip:" msgstr "Nombre à sauter :" -#: gitk:3700 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Options diverses :" -#: gitk:3701 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Trier par date" # FIXME : traduction de "branch sides" -#: gitk:3702 +#: gitk:4082 #, fuzzy msgid "Mark branch sides" msgstr "Marquer les extrémités des branches" -#: gitk:3703 +#: gitk:4083 msgid "Limit to first parent" msgstr "Limiter au premier ancêtre" -#: gitk:3704 +#: gitk:4084 msgid "Simple history" msgstr "Historique simple" -#: gitk:3705 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Arguments supplémentaires de git log :" -#: gitk:3706 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Saisir les fichiers et répertoires à inclure, un par ligne :" -#: gitk:3707 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Commande pour générer plus de commits à inclure :" -#: gitk:3829 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk : éditer la vue" -#: gitk:3837 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "-- critère pour la sélection des révisions" -#: gitk:3842 -msgid "View Name:" +#: gitk:4224 +#, fuzzy +msgid "View Name" msgstr "Nom de la vue :" -#: gitk:3917 +#: gitk:4299 msgid "Apply (F5)" msgstr "Appliquer (F5)" -#: gitk:3955 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Erreur dans les arguments de sélection des commits :" -#: gitk:4008 gitk:4060 gitk:4508 gitk:4522 gitk:5783 gitk:11196 gitk:11197 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Aucun" -#: gitk:4456 gitk:6303 gitk:8065 gitk:8080 -msgid "Date" -msgstr "Date" - -#: gitk:4456 gitk:6303 -msgid "CDate" -msgstr "CDate" - -#: gitk:4605 gitk:4610 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Descendant" -#: gitk:4606 +#: gitk:5004 msgid "Not descendant" msgstr "Pas un descendant" -#: gitk:4613 gitk:4618 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Ancêtre" -#: gitk:4614 +#: gitk:5012 msgid "Not ancestor" msgstr "Pas un ancêtre" -#: gitk:4904 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Modifications locales enregistrées dans l'index mais non commitées" -#: gitk:4940 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Modifications locales non enregistrées dans l'index et non commitées" -#: gitk:6621 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 msgid "many" msgstr "nombreux" -#: gitk:6805 +#: gitk:7309 msgid "Tags:" msgstr "Tags :" -#: gitk:6822 gitk:6828 gitk:8058 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Parent" -#: gitk:6833 +#: gitk:7337 msgid "Child" msgstr "Enfant" -#: gitk:6842 +#: gitk:7346 msgid "Branch" msgstr "Branche" -#: gitk:6845 +#: gitk:7349 msgid "Follows" msgstr "Suit" -#: gitk:6848 +#: gitk:7352 msgid "Precedes" msgstr "Précède" -#: gitk:7346 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Erreur lors de la récupération des diff : %s" -#: gitk:7886 +#: gitk:8631 msgid "Goto:" msgstr "Aller à :" -#: gitk:7888 -msgid "SHA1 ID:" -msgstr "Id SHA1 :" - -#: gitk:7907 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Id SHA1 court %s est ambigu" -#: gitk:7914 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "Id SHA1 %s est inconnu" -#: gitk:7924 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "Id SHA1 %s est inconnu" -#: gitk:7926 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "La révision %s n'est pas dans la vue courante" -#: gitk:8068 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Date" + +#: gitk:8816 msgid "Children" msgstr "Enfants" -#: gitk:8125 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Réinitialiser la branche %s vers cet état" -#: gitk:8127 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Head détaché : impossible de réinitialiser" -#: gitk:8236 gitk:8242 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Éviter le commit de la fusion " -#: gitk:8251 gitk:8256 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Erreur à l'obtention de l'ID du patch pour " -#: gitk:8252 gitk:8257 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - arrêt en cours\n" -#: gitk:8262 gitk:8265 gitk:8273 gitk:8283 gitk:8292 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Commit " -#: gitk:8266 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -854,7 +898,7 @@ msgstr "" "est le même patch que \n" " " -#: gitk:8274 +#: gitk:9024 msgid "" " differs from\n" " " @@ -862,117 +906,138 @@ msgstr "" " diffère de\n" " " -#: gitk:8276 -msgid "- stopping\n" -msgstr "- arrêt en cours\n" +#: gitk:9026 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "" -#: gitk:8284 gitk:8293 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr "a %s enfants - arrêt en cours\n" -#: gitk:8324 +#: gitk:9066 +#, fuzzy, tcl-format +msgid "Error writing commit to file: %s" +msgstr "Erreur à l'ecriture du commit :" + +#: gitk:9072 +#, fuzzy, tcl-format +msgid "Error diffing commits: %s" +msgstr "Erreur à l'ecriture du commit :" + +#: gitk:9118 msgid "Top" msgstr "Haut" -#: gitk:8325 +#: gitk:9119 msgid "From" msgstr "De" -#: gitk:8330 +#: gitk:9124 msgid "To" msgstr "À" -#: gitk:8354 +#: gitk:9148 msgid "Generate patch" msgstr "Générer le patch" -#: gitk:8356 +#: gitk:9150 msgid "From:" msgstr "De :" -#: gitk:8365 +#: gitk:9159 msgid "To:" msgstr "À :" -#: gitk:8374 +#: gitk:9168 msgid "Reverse" msgstr "Inverser" -#: gitk:8376 gitk:8561 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Fichier de sortie :" -#: gitk:8382 +#: gitk:9176 msgid "Generate" msgstr "Générer" -#: gitk:8420 +#: gitk:9214 msgid "Error creating patch:" msgstr "Erreur à la création du patch :" -#: gitk:8443 gitk:8549 gitk:8606 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID :" -#: gitk:8452 +#: gitk:9246 msgid "Tag name:" msgstr "Nom du Tag :" -#: gitk:8456 gitk:8615 +#: gitk:9249 +msgid "Tag message is optional" +msgstr "" + +#: gitk:9251 +#, fuzzy +msgid "Tag message:" +msgstr "Nom du Tag :" + +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Créer" -#: gitk:8473 +#: gitk:9273 msgid "No tag name specified" msgstr "Aucun nom de tag spécifié" -#: gitk:8477 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Le tag \"%s\" existe déjà" -#: gitk:8483 +#: gitk:9287 msgid "Error creating tag:" msgstr "Erreur à la création du tag :" -#: gitk:8558 +#: gitk:9363 msgid "Command:" msgstr "Commande :" -#: gitk:8566 +#: gitk:9371 msgid "Write" msgstr "Écrire" -#: gitk:8584 +#: gitk:9389 msgid "Error writing commit:" msgstr "Erreur à l'ecriture du commit :" -#: gitk:8611 +#: gitk:9416 msgid "Name:" msgstr "Nom :" -#: gitk:8634 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Veuillez spécifier un nom pour la nouvelle branche" -#: gitk:8639 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "La branche '%s' existe déjà. Écraser?" -#: gitk:8705 +#: gitk:9511 #, 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:8710 +#: gitk:9516 msgid "Cherry-picking" msgstr "Cueillir (Cherry-picking)" -#: gitk:8719 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -983,7 +1048,7 @@ msgstr "" "Veuillez commiter, réinitialiser ou stasher vos changements et essayer de " "nouveau." -#: gitk:8725 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -992,34 +1057,67 @@ msgstr "" "fusion.\n" "Souhaitez-vous exécuter git citool pour le résoudre ?" -#: gitk:8741 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Aucun changement commité" -#: gitk:8767 +#: gitk:9574 +#, fuzzy, 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?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "Réinitialisation" + +#: gitk:9587 +#, fuzzy, 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." + +#: gitk:9591 +#, fuzzy +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" +"Souhaitez-vous exécuter git citool pour le résoudre ?" + +#: gitk:9634 msgid "Confirm reset" msgstr "Confirmer la réinitialisation" -#: gitk:8769 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Réinitialiser la branche %s à %s?" -#: gitk:8773 +#: gitk:9638 msgid "Reset type:" msgstr "Type de réinitialisation :" -#: gitk:8777 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Douce : Laisse le répertoire de travail et l'index intacts" -#: gitk:8780 +#: gitk:9644 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:8783 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1027,21 +1125,21 @@ msgstr "" "Dure : Réinitialise le répertoire de travail et l'index\n" "(abandonne TOUS les changements locaux)" -#: gitk:8800 +#: gitk:9664 msgid "Resetting" msgstr "Réinitialisation" # Fixme: Récupération est-il vraiment une mauvaise traduction? -#: gitk:8857 +#: gitk:9724 #, fuzzy msgid "Checking out" msgstr "Récupération" -#: gitk:8910 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Impossible de supprimer la branche en cours" -#: gitk:8916 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1050,16 +1148,16 @@ msgstr "" "Les commits de la branche %s ne sont dans aucune autre branche.\n" "Voulez-vous vraiment supprimer cette branche %s ?" -#: gitk:8947 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Tags et heads : %s" -#: gitk:8962 +#: gitk:9829 msgid "Filter" msgstr "Filtrer" -#: gitk:9257 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1068,187 +1166,244 @@ msgstr "" "informations sur les branches et les tags précédents/suivants seront " "incomplètes." -#: gitk:10243 +#: gitk:11102 msgid "Tag" msgstr "Tag" -#: gitk:10243 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:10291 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Sélecteur de police de Gitk" -#: gitk:10308 +#: gitk:11206 msgid "B" msgstr "B" -#: gitk:10311 +#: gitk:11209 msgid "I" msgstr "I" -#: gitk:10407 -msgid "Gitk preferences" -msgstr "Préférences de Gitk" - -#: gitk:10409 +#: gitk:11327 msgid "Commit list display options" msgstr "Options d'affichage de la liste des commits" -#: gitk:10412 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Longueur maximum du graphe (lignes)" # FIXME : Traduction standard de "pane"? -#: gitk:10416 -#, fuzzy, tcl-format +#: gitk:11334 +#, fuzzy, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Longueur maximum du graphe (% du panneau)" -#: gitk:10420 +#: gitk:11337 msgid "Show local changes" msgstr "Montrer les changements locaux" -#: gitk:10423 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "Sélection auto. du SHA1" -#: gitk:10427 +#: gitk:11344 +msgid "Hide remote refs" +msgstr "Cacher les refs distantes" + +#: gitk:11348 msgid "Diff display options" msgstr "Options d'affichage des diff" -#: gitk:10429 +#: gitk:11350 msgid "Tab spacing" msgstr "Taille des tabulations" -#: gitk:10432 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Afficher les tags les plus proches" -#: gitk:10435 -msgid "Hide remote refs" -msgstr "Cacher les refs distantes" +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" -#: gitk:10438 +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Limiter les différences aux chemins listés" -#: gitk:10441 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Support pour un encodage des caractères par fichier" -#: gitk:10447 gitk:10512 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Outil diff externe" -#: gitk:10449 +#: gitk:11369 msgid "Choose..." msgstr "Choisir..." -#: gitk:10454 +#: gitk:11374 +#, fuzzy +msgid "General options" +msgstr "Générer le patch" + +#: gitk:11377 +msgid "Use themed widgets" +msgstr "" + +#: gitk:11379 +msgid "(change requires restart)" +msgstr "" + +#: gitk:11381 +msgid "(currently unavailable)" +msgstr "" + +#: gitk:11392 msgid "Colors: press to choose" msgstr "Couleurs : cliquer pour choisir" -#: gitk:10457 +#: gitk:11395 +msgid "Interface" +msgstr "" + +#: gitk:11396 +#, fuzzy +msgid "interface" +msgstr "Police de l'interface utilisateur" + +#: gitk:11399 msgid "Background" msgstr "Arrière-plan" -#: gitk:10458 gitk:10488 +#: gitk:11400 gitk:11430 msgid "background" msgstr "arrière-plan" -#: gitk:10461 +#: gitk:11403 msgid "Foreground" msgstr "Premier plan" -#: gitk:10462 +#: gitk:11404 msgid "foreground" msgstr "premier plan" -#: gitk:10465 +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff : anciennes lignes" -#: gitk:10466 +#: gitk:11408 msgid "diff old lines" msgstr "diff anciennes lignes" -#: gitk:10470 +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff : nouvelles lignes" -#: gitk:10471 +#: gitk:11413 msgid "diff new lines" msgstr "diff nouvelles lignes" -#: gitk:10475 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff : entête du hunk" -#: gitk:10477 +#: gitk:11419 msgid "diff hunk header" msgstr "diff : entête du hunk" -#: gitk:10481 +#: gitk:11423 msgid "Marked line bg" msgstr "Arrière-plan de la ligne marquée" -#: gitk:10483 +#: gitk:11425 msgid "marked line background" msgstr "Arrière-plan de la ligne marquée" -#: gitk:10487 +#: gitk:11429 msgid "Select bg" msgstr "Sélectionner l'arrière-plan" -#: gitk:10491 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Polices : cliquer pour choisir" -#: gitk:10493 +#: gitk:11440 msgid "Main font" msgstr "Police principale" -#: gitk:10494 +#: gitk:11441 msgid "Diff display font" msgstr "Police d'affichage des diff" -#: gitk:10495 +#: gitk:11442 msgid "User interface font" msgstr "Police de l'interface utilisateur" -#: gitk:10522 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Préférences de Gitk" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Générer" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk : choisir la couleur de %s" -#: gitk:10973 -msgid "" -"Sorry, gitk cannot run with this version of Tcl/Tk.\n" -" Gitk requires at least Tcl/Tk 8.4." -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:11101 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Impossible de trouver un dépôt git ici." -#: gitk:11105 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "Impossible de trouver le répertoire git \"%s\"." - -#: gitk:11152 +#: gitk:12289 #, 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:11164 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Arguments invalides pour gitk :" -#: gitk:11249 +#: gitk:12405 msgid "Command line" msgstr "Ligne de commande" + +#~ msgid "SHA1 ID: " +#~ msgstr "ID SHA1 :" + +#~ msgid "next" +#~ msgstr "suivant" + +#~ msgid "prev" +#~ msgstr "précédent" + +#~ msgid "CDate" +#~ msgstr "CDate" + +#~ msgid "- stopping\n" +#~ msgstr "- arrêt en cours\n" + +#~ msgid "" +#~ "Sorry, gitk cannot run with this version of Tcl/Tk.\n" +#~ " Gitk requires at least Tcl/Tk 8.4." +#~ 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." + +#~ msgid "Cannot find the git directory \"%s\"." +#~ msgstr "Impossible de trouver le répertoire git \"%s\"." diff --git a/gitk-git/po/hu.po b/gitk-git/po/hu.po index 7262b610dc..5e3e9468c0 100644 --- a/gitk-git/po/hu.po +++ b/gitk-git/po/hu.po @@ -8,32 +8,41 @@ msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-14 13:33+0100\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2009-12-14 14:04+0100\n" "Last-Translator: Laszlo Papp <djszapi@archlinux.us>\n" "Language-Team: Hungarian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gitk:115 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "Nem sikerült letölteni az unmerged fájl listát:" -#: gitk:271 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 msgid "Error parsing revisions:" msgstr "Hiba történt értelmezés közben:" -#: gitk:326 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Hiba történt a végrehajtáskor --argscmd parancs:" -#: gitk:339 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Nincsen fájl kiválasztva: --merge megadve, de egyetlen fájl sem unmerged." -#: gitk:342 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -41,299 +50,315 @@ msgstr "" "Nincsen fájl kiválasztva: --merge megadva, de nincsenek unmerged fájlok a " "fájlon belül limit." -#: gitk:364 gitk:511 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Hiba történt a git log végrehajtása közben:" -#: gitk:382 gitk:527 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Olvasás" -#: gitk:442 gitk:4258 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Commitok olvasása ..." -#: gitk:445 gitk:1575 gitk:4261 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Nincsen commit kiválasztva" -#: gitk:1451 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Nem lehet értelmezni a git log kimenetét:" -#: gitk:1671 +#: gitk:1740 msgid "No commit information available" msgstr "Nincsen elérhető commit információ" -#: gitk:1813 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1848 gitk:4051 gitk:9029 gitk:10570 gitk:10789 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "OK" -#: gitk:1850 gitk:4053 gitk:8629 gitk:8703 gitk:8813 gitk:8862 gitk:9031 -#: gitk:10571 gitk:10790 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Visszavonás" -#: gitk:1972 +#: gitk:2069 msgid "Update" msgstr "Frissités" -#: gitk:1973 +#: gitk:2070 msgid "Reload" msgstr "Újratöltés" -#: gitk:1974 +#: gitk:2071 msgid "Reread references" msgstr "Referenciák újraolvasása" -#: gitk:1975 +#: gitk:2072 msgid "List references" msgstr "Referenciák listázása" -#: gitk:1977 +#: gitk:2074 msgid "Start git gui" msgstr "Git gui indítása" -#: gitk:1979 +#: gitk:2076 msgid "Quit" msgstr "Kilépés" -#: gitk:1971 +#: gitk:2068 msgid "File" msgstr "Fájl" -#: gitk:1983 +#: gitk:2080 msgid "Preferences" msgstr "Beállítások" -#: gitk:1982 +#: gitk:2079 msgid "Edit" msgstr "Szerkesztés" -#: gitk:1987 +#: gitk:2084 msgid "New view..." msgstr "Új nézet ..." -#: gitk:1988 +#: gitk:2085 msgid "Edit view..." msgstr "Nézet szerkesztése ..." -#: gitk:1989 +#: gitk:2086 msgid "Delete view" msgstr "Nézet törlése" -#: gitk:1991 +#: gitk:2088 msgid "All files" msgstr "Minden fájl" -#: gitk:1986 gitk:3805 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Nézet" -#: gitk:1996 gitk:2006 gitk:2777 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Gitk névjegy" -#: gitk:1997 gitk:2011 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Billentyűkombináció" -#: gitk:1995 gitk:2010 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Segítség" -#: gitk:2088 -msgid "SHA1 ID: " -msgstr "SHA1 ID: " +#: gitk:2185 gitk:8633 +msgid "SHA1 ID:" +msgstr "SHA1 ID:" -#: gitk:2119 +#: gitk:2229 msgid "Row" msgstr "Sor" -#: gitk:2157 +#: gitk:2267 msgid "Find" msgstr "Keresés" -#: gitk:2158 -msgid "next" -msgstr "következő" - -#: gitk:2159 -msgid "prev" -msgstr "előző" - -#: gitk:2160 +#: gitk:2295 msgid "commit" msgstr "commit" -#: gitk:2163 gitk:2165 gitk:4419 gitk:4442 gitk:4466 gitk:6407 gitk:6479 -#: gitk:6563 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "tartalmazás:" -#: gitk:2166 gitk:3287 gitk:3292 gitk:4494 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "érintendő útvonalak:" -#: gitk:2167 gitk:4499 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "string hozzáadása/törlése:" -#: gitk:2176 gitk:2178 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Pontos" -#: gitk:2178 gitk:4574 gitk:6375 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "Kis/nagy betű nem számít" -#: gitk:2178 gitk:4468 gitk:4572 gitk:6371 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Regexp" -#: gitk:2180 gitk:2181 gitk:4593 gitk:4623 gitk:4630 gitk:6499 gitk:6567 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Minden mező" -#: gitk:2181 gitk:4591 gitk:4623 gitk:6438 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Főcím" -#: gitk:2182 gitk:4591 gitk:6438 gitk:6567 gitk:7000 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Megjegyzések" -#: gitk:2182 gitk:4591 gitk:4595 gitk:4630 gitk:6438 gitk:6935 gitk:8280 -#: gitk:8295 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Szerző" -#: gitk:2182 gitk:4591 gitk:6438 gitk:6937 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Commitoló" -#: gitk:2213 +#: gitk:2350 msgid "Search" msgstr "Keresés" -#: gitk:2221 +#: gitk:2358 msgid "Diff" msgstr "Diff" -#: gitk:2223 +#: gitk:2360 msgid "Old version" msgstr "Régi verzió" -#: gitk:2225 +#: gitk:2362 msgid "New version" msgstr "Új verzió" -#: gitk:2227 +#: gitk:2364 msgid "Lines of context" msgstr "Tartalmi sorok" -#: gitk:2237 +#: gitk:2374 msgid "Ignore space change" msgstr "Space váltás mellőzése" -#: gitk:2296 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Patch" -#: gitk:2298 +#: gitk:2447 msgid "Tree" msgstr "Tree" -#: gitk:2453 gitk:2470 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Diff ezeket -> kiválasztott" -#: gitk:2454 gitk:2471 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Diff kiválasztottakat -> ezt" -#: gitk:2455 gitk:2472 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Patch készítése" -#: gitk:2456 gitk:8687 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Tag készítése" -#: gitk:2457 gitk:8793 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Commit fáljba írása" -#: gitk:2458 gitk:8850 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Új branch készítése" -#: gitk:2459 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Cherry-pick erre a commitra" -#: gitk:2460 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "HEAD branch újraindítása ide" -#: gitk:2461 +#: gitk:2624 msgid "Mark this commit" msgstr "Ezen commit megjelölése" -#: gitk:2462 +#: gitk:2625 msgid "Return to mark" msgstr "Visszatérés a megjelöléshez" -#: gitk:2463 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Találd meg ezen utódokat és jelöld meg" -#: gitk:2464 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Összehasonlítás a megjelölt commit-tal" -#: gitk:2478 +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Diff ezeket -> kiválasztott" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Diff kiválasztottakat -> ezt" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Ezen commit megjelölése" + +#: gitk:2646 msgid "Check out this branch" msgstr "Check out ezt a branchot" -#: gitk:2479 +#: gitk:2647 msgid "Remove this branch" msgstr "Töröld ezt a branch-ot" -#: gitk:2486 +#: gitk:2654 msgid "Highlight this too" msgstr "Emeld ki ezt is" -#: gitk:2487 +#: gitk:2655 msgid "Highlight this only" msgstr "Csak ezt emeld ki" -#: gitk:2488 +#: gitk:2656 msgid "External diff" msgstr "Külső diff" -#: gitk:2489 +#: gitk:2657 msgid "Blame parent commit" msgstr "Blame szülő kommitra" -#: gitk:2496 +#: gitk:2664 msgid "Show origin of this line" msgstr "Mutasd meg ennek a sornak az eredetét" -#: gitk:2497 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Futtasd a git gui blame-t ezen a soron" -#: gitk:2779 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -344,298 +369,316 @@ msgstr "" "\n" "Használd és terjeszd a GNU General Public License feltételei mellett" -#: gitk:2787 gitk:2851 gitk:9215 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Bezárás" -#: gitk:2808 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Gitk-billentyű hozzárendelés" -#: gitk:2811 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Gitk-billentyű hozzaárendelés:" -#: gitk:2813 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tKilépés" -#: gitk:2814 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\tKeresés" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Pos1>\t\tElső commithoz" -#: gitk:2815 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<Ende>\t\tUtolsó commithoz" -#: gitk:2816 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Hoch>, p, i\tEgy committal feljebb" -#: gitk:2817 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Runter>, n, k\tEgy committal lejjebb" -#: gitk:2818 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Links>, z, j\tVissza a history listába" -#: gitk:2819 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Rechts>, x, l\tElőre a history listába" -#: gitk:2820 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<BildHoch>\tEgy lappal feljebb a commit listába" -#: gitk:2821 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<BildRunter>\tEgy lappal lejjebb a commit listába" -#: gitk:2822 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Pos1>\tGörgetés a commit lista tetejéhez" -#: gitk:2823 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-Ende>\tGörgetés a commit lista aljához" -#: gitk:2824 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Hoch>\tEgy sorral feljebb görgetés a commit listában" -#: gitk:2825 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Runter>\tEgy sorral lejjebb görgetés a commit listában" -#: gitk:2826 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-BildHoch>\tEgy lappal feljebb görgetés a commit listában" -#: gitk:2827 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-BildRunter>\tEgy sorral lejjebb görgetés a commit listában" -#: gitk:2828 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Umschalt-Hoch>\tKeresés visszafele (felfele, utolsó commitok)" -#: gitk:2829 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Umschalt-Runter>\tKeresés előre (lefelé; korábbi commitok)" -#: gitk:2830 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Entf>, b\t\tEgy lappal feljebb görgetés a diff nézetben" -#: gitk:2831 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Löschtaste>\tEgy lappal feljebb görgetés a diff nézetben" -#: gitk:2832 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Leertaste>\tEgy lappal lejjebb görgetés a diff nézetben" -#: gitk:2833 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\t18 sorral felfelé görgetés diff nézetben" -#: gitk:2834 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\t18 sorral lejjebb görgetés a diff nézetben" -#: gitk:2835 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tKeresés" -#: gitk:2836 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tKövetkező találathoz" -#: gitk:2837 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Eingabetaste>\tKövetkező találathoz" -#: gitk:2838 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tLépj a keresési mezőre" -#: gitk:2839 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tElőző találathoz" -#: gitk:2840 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tKövetkező fájlra görgetés diff nézetben" -#: gitk:2841 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tKövetkező találatra keresés diff nézetben" -#: gitk:2842 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tElőző találatra keresés diff nézetben" -#: gitk:2843 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-Nummerblock-Plus>\tBetűméret növelése" -#: gitk:2844 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-Plus>\tBetűméret növelése" -#: gitk:2845 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-Nummernblock-Minus> Betűméret csökkentése" -#: gitk:2846 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-Minus>\tBetűméret csökkentése" -#: gitk:2847 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tFrissítés" -#: gitk:3302 gitk:3311 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Hiba történt az ideiglenes könyvtár létrehozása közben %s:" -#: gitk:3324 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Hiba történt \"%s\" letöltése közben %s-ről:" -#: gitk:3387 +#: gitk:3631 msgid "command failed:" msgstr "parancs hiba:" -#: gitk:3536 +#: gitk:3780 msgid "No such commit" msgstr "Nincs ilyen commit" -#: gitk:3550 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: parancs hiba:" -#: gitk:3581 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Nem sikerült a Merge head olvasása: %s" -#: gitk:3589 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Hiba történt az index olvasása közben: %s" -#: gitk:3614 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Nem sikerült a git blame indítása: %s" -#: gitk:3617 gitk:6406 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Keresés" -#: gitk:3649 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Hiba történt a git blame futtatása közben: %s" -#: gitk:3677 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "" "A %s commitból származik az a sor, amelyik nem található ebben a nézetben" -#: gitk:3691 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Külső diff nézegető hiba:" -#: gitk:3809 +#: gitk:4053 msgid "Gitk view definition" msgstr "Gitk nézet meghatározása" -#: gitk:3813 +#: gitk:4057 msgid "Remember this view" msgstr "Maradj ennél a nézetnél" -#: gitk:3814 +#: gitk:4058 msgid "References (space separated list):" msgstr "Referenciák (szóközzel tagolt lista" -#: gitk:3815 +#: gitk:4059 msgid "Branches & tags:" msgstr "Branch-ek & tagek:" -#: gitk:3816 +#: gitk:4060 msgid "All refs" msgstr "Minden ref" -#: gitk:3817 +#: gitk:4061 msgid "All (local) branches" msgstr "Minden (helyi) branch" -#: gitk:3818 +#: gitk:4062 msgid "All tags" msgstr "Minden tag" -#: gitk:3819 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Minden távoli követő branch" -#: gitk:3820 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Commit Infó (reguláris kifejezés):" -#: gitk:3821 +#: gitk:4065 msgid "Author:" msgstr "Szerző:" -#: gitk:3822 +#: gitk:4066 msgid "Committer:" msgstr "Commitoló:" -#: gitk:3823 +#: gitk:4067 msgid "Commit Message:" msgstr "Commit üzenet:" -#: gitk:3824 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Egyezik minen Commit Infó feltétellel" -#: gitk:3825 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Egyezik minen Commit Infó feltétellel" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Fájl változások:" -#: gitk:3826 +#: gitk:4071 msgid "Fixed String" msgstr "Fix String" -#: gitk:3827 +#: gitk:4072 msgid "Regular Expression" msgstr "Reguláris kifejezés" -#: gitk:3828 +#: gitk:4073 msgid "Search string:" msgstr "Keresés szöveg:" -#: gitk:3829 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -643,206 +686,203 @@ msgstr "" "Commit Dátumok (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:3830 +#: gitk:4075 msgid "Since:" msgstr "Ettől:" -#: gitk:3831 +#: gitk:4076 msgid "Until:" msgstr "Eddig:" -#: gitk:3832 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Limitálva és/vagy kihagyva egy adott számú revíziót (pozitív egész):" -#: gitk:3833 +#: gitk:4078 msgid "Number to show:" msgstr "Mutatandó szám:" -#: gitk:3834 +#: gitk:4079 msgid "Number to skip:" msgstr "Kihagyandó szám:" -#: gitk:3835 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Különféle opciók:" -#: gitk:3836 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Szigorú rendezás dátum alapján" -#: gitk:3837 +#: gitk:4082 msgid "Mark branch sides" msgstr "Jelölje meg az ágakat" -#: gitk:3838 +#: gitk:4083 msgid "Limit to first parent" msgstr "Korlátozás az első szülőre" -#: gitk:3839 +#: gitk:4084 msgid "Simple history" msgstr "Egyszerű history" -#: gitk:3840 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "További argumentok a git log-hoz:" -#: gitk:3841 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Fájlok és könyvtárak bejegyzése amiket tartalmaz, soronként:" -#: gitk:3842 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Parancs több tartalmazó commit generálására:" -#: gitk:3964 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: szerkesztés nézet" -#: gitk:3972 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "-- kritériumok a revíziók kiválasztásához" -#: gitk:3977 +#: gitk:4224 msgid "View Name" msgstr "Nézet neve" -#: gitk:4052 +#: gitk:4299 msgid "Apply (F5)" msgstr "Alkalmaz (F5)" -#: gitk:4090 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Hiba történt a commit argumentumok kiválasztása közben:" -#: gitk:4143 gitk:4195 gitk:4643 gitk:4657 gitk:5918 gitk:11519 gitk:11520 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Keine" -#: gitk:4591 gitk:6438 gitk:8282 gitk:8297 -msgid "Date" -msgstr "Dátum" - -#: gitk:4591 gitk:6438 -msgid "CDate" -msgstr "Dátum" - -#: gitk:4740 gitk:4745 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Leszármazott" -#: gitk:4741 +#: gitk:5004 msgid "Not descendant" msgstr "Nem leszármazott" -#: gitk:4748 gitk:4753 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Előd" -#: gitk:4749 +#: gitk:5012 msgid "Not ancestor" msgstr "Nem előd" -#: gitk:5039 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "" "Lokális változtatások, melyek be vannak téve az indexbe, de még nincsenek " "commitolva" -#: gitk:5075 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Lokális nem commitolt változások, nincsenek betéve az indexbe" -#: gitk:6756 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 msgid "many" msgstr "sok" -#: gitk:6939 +#: gitk:7309 msgid "Tags:" msgstr "Tagek:" -#: gitk:6956 gitk:6962 gitk:8275 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Eltern" -#: gitk:6967 +#: gitk:7337 msgid "Child" msgstr "Gyerek" -#: gitk:6976 +#: gitk:7346 msgid "Branch" msgstr "Ág" -#: gitk:6979 +#: gitk:7349 msgid "Follows" msgstr "Következők" -#: gitk:6982 +#: gitk:7352 msgid "Precedes" msgstr "Megelőzők" -#: gitk:7519 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Hiba történt a diff-ek letöltése közben: %s" -#: gitk:8103 +#: gitk:8631 msgid "Goto:" msgstr "Menj:" -#: gitk:8105 -msgid "SHA1 ID:" -msgstr "SHA1 ID:" - -#: gitk:8124 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Rövid SHA1 id %s félreérthető" -#: gitk:8131 +#: gitk:8659 +#, tcl-format msgid "Revision %s is not known" msgstr "A(z) %s revízió nem ismert" -#: gitk:8141 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA1 id %s nem ismert" -#: gitk:8143 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "A(z) %s revízió nincs a jelenlegi nézetben" -#: gitk:8285 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Dátum" + +#: gitk:8816 msgid "Children" msgstr "Gyerekek" -#: gitk:8343 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Állítsd vissza a %s branch-ot ide" -#: gitk:8345 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Elkülönített head: nem lehet visszaállítani" -#: gitk:8454 gitk:8460 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Merge commit kihagyása " -#: gitk:8469 gitk:8474 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Hiba történt a patch ID megszerzése közben a következőnél " -#: gitk:8470 gitk:8475 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - abbahagyás\n" -#: gitk:8480 gitk:8483 gitk:8491 gitk:8505 gitk:8514 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Commit " -#: gitk:8484 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -850,7 +890,7 @@ msgstr "" " Ugyanaz a patch mint\n" " " -#: gitk:8492 +#: gitk:9024 msgid "" " differs from\n" " " @@ -858,7 +898,7 @@ msgstr "" " különbözik innentől\n" " " -#: gitk:8494 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -866,121 +906,132 @@ msgstr "" "A commitok diffje:\n" "\n" -#: gitk:8506 gitk:8515 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " %s gyereke van. abbahagyás\n" -#: gitk:8534 +#: gitk:9066 +#, tcl-format msgid "Error writing commit to file: %s" msgstr "Hiba történt a commit fájlba írása közben: %s" -#: gitk:8540 +#: gitk:9072 +#, tcl-format msgid "Error diffing commits: %s" msgstr "Hiba történt a commitok diffelése közben: %s" -#: gitk:8570 +#: gitk:9118 msgid "Top" msgstr "Teteje" -#: gitk:8571 +#: gitk:9119 msgid "From" msgstr "Innen" -#: gitk:8576 +#: gitk:9124 msgid "To" msgstr "Ide" -#: gitk:8600 +#: gitk:9148 msgid "Generate patch" msgstr "Patch generálása" -#: gitk:8602 +#: gitk:9150 msgid "From:" msgstr "Innen:" -#: gitk:8611 +#: gitk:9159 msgid "To:" msgstr "Ide:" -#: gitk:8620 +#: gitk:9168 msgid "Reverse" msgstr "Visszafele" -#: gitk:8622 gitk:8807 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Kimeneti fájl:" -#: gitk:8628 +#: gitk:9176 msgid "Generate" msgstr "Generálás" -#: gitk:8666 +#: gitk:9214 msgid "Error creating patch:" msgstr "Hiba törtét a patch készítése közben:" -#: gitk:8689 gitk:8795 gitk:8852 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:8698 +#: gitk:9246 msgid "Tag name:" msgstr "Tag név:" -#: gitk:8702 gitk:8861 +#: gitk:9249 +msgid "Tag message is optional" +msgstr "" + +#: gitk:9251 +#, fuzzy +msgid "Tag message:" +msgstr "Tag név:" + +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Létrehozás" -#: gitk:8719 +#: gitk:9273 msgid "No tag name specified" msgstr "A tag neve nincsen megadva" -#: gitk:8723 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "%s Tag már létezik" -#: gitk:8729 +#: gitk:9287 msgid "Error creating tag:" msgstr "Hiba történt a tag létrehozása közben:" -#: gitk:8804 +#: gitk:9363 msgid "Command:" msgstr "Parancs:" -#: gitk:8812 +#: gitk:9371 msgid "Write" msgstr "Írás" -#: gitk:8830 +#: gitk:9389 msgid "Error writing commit:" msgstr "Hiba történt a commit írása közben:" -#: gitk:8857 +#: gitk:9416 msgid "Name:" msgstr "Név:" -#: gitk:8880 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Kérem adja meg a nevét az új branchhoz" -#: gitk:8885 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "%s branch már létezik. Felülírja?" -#: gitk:8951 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "%s commit már benne van a %s branchban -- biztos hogy újra csinálja ?" "eintragen?" -#: gitk:8956 +#: gitk:9516 msgid "Cherry-picking" msgstr "Cherry-picking" -#: gitk:8965 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -990,7 +1041,7 @@ msgstr "" "Kérem commitolja, indítsa újra vagy rejtse el a változtatásait és próbálja " "újra." -#: gitk:8971 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -998,32 +1049,63 @@ msgstr "" "Cherry-pick hiba történt merge konfliktus miatt.\n" "Kívánja futtatni a git citool-t a probléma megoldásához?" -#: gitk:8987 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Nincsen változás commitolva" -#: gitk:9013 +#: gitk:9574 +#, fuzzy, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "" +"%s commit már benne van a %s branchban -- biztos hogy újra csinálja ?" +"eintragen?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "Újraindítás" + +#: gitk:9587 +#, fuzzy, 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 "" +"Cherry-pick hiba történt lokális váltotások miatt a '%s' fájlban.\n" +"Kérem commitolja, indítsa újra vagy rejtse el a változtatásait és próbálja " +"újra." + +#: gitk:9591 +#, fuzzy +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"Cherry-pick hiba történt merge konfliktus miatt.\n" +"Kívánja futtatni a git citool-t a probléma megoldásához?" + +#: gitk:9634 msgid "Confirm reset" msgstr "Újraindítás megerősítése" -#: gitk:9015 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Újraindítja a %s branchot %s-ig?" -#: gitk:9017 +#: gitk:9638 msgid "Reset type:" msgstr "Újraindítás típusa:" -#: gitk:9020 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Soft: Hagyd a working tree-t és az indexet érintetlenül" -#: gitk:9023 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Kevert: Hagyd a working tree-t érintetlenül, töröld az indexet" -#: gitk:9026 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1031,19 +1113,19 @@ msgstr "" "Hard: Indítsd újra a working tree-t és az indexet\n" "(MINDEN lokális változás eldobása)" -#: gitk:9043 +#: gitk:9664 msgid "Resetting" msgstr "Újraindítás" -#: gitk:9103 +#: gitk:9724 msgid "Checking out" msgstr "Kivesz" -#: gitk:9156 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Nem lehet a jelenleg kivett branch-ot törölni" -#: gitk:9162 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1052,16 +1134,16 @@ msgstr "" "A %s branchon található commit nem található meg semelyik másik branchon.\n" "Tényleg törli a %s branchot?" -#: gitk:9193 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Tagek és headek: %s" -#: gitk:9208 +#: gitk:9829 msgid "Filter" msgstr "Szűrő" -#: gitk:9503 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1069,206 +1151,235 @@ msgstr "" "Hiba történt a commit topológiai információ olvasása közben; branch ésa " "megelőző/következő információ nem lesz teljes." -#: gitk:10489 +#: gitk:11102 msgid "Tag" msgstr "Tag" -#: gitk:10489 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:10539 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Gitk-betű kiválasztó" -#: gitk:10556 +#: gitk:11206 msgid "B" msgstr "F" -#: gitk:10559 +#: gitk:11209 msgid "I" msgstr "K" -#: gitk:10677 -msgid "Gitk preferences" -msgstr "Gitk beállítások" - -#: gitk:10679 +#: gitk:11327 msgid "Commit list display options" msgstr "Commit lista kijelzési opciók" -#: gitk:10682 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Maximális grafikon szélesség (sorok)" -#: gitk:10685 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Maximális grafikon szélesség (táble %-je)" -#: gitk:10688 +#: gitk:11337 msgid "Show local changes" msgstr "Mutasd a lokális változtatásokat" -#: gitk:10691 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "SHA1 Automatikus kiválasztása" -#: gitk:10694 +#: gitk:11344 msgid "Hide remote refs" msgstr "A távoli refek elrejtése" -#: gitk:10698 +#: gitk:11348 msgid "Diff display options" msgstr "Diff kijelző opciók" -#: gitk:10700 +#: gitk:11350 msgid "Tab spacing" msgstr "Tab sorköz" -#: gitk:10703 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Szomszédos tagek kijelzése" -#: gitk:10706 +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" + +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Korlátozott diffek a kilistázott útvonalakhoz" -#: gitk:10709 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Fájlonkénti kódolás támgatása" -#: gitk:10715 gitk:10804 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Külső diff alkalmazás" -#: gitk:10716 +#: gitk:11369 msgid "Choose..." msgstr "Válaszd ..." -#: gitk:10721 +#: gitk:11374 msgid "General options" msgstr "Általános opciók" -#: gitk:10724 +#: gitk:11377 msgid "Use themed widgets" msgstr "Témázott vezérlők használata" -#: gitk:10726 +#: gitk:11379 msgid "(change requires restart)" msgstr "(a változás újraindítást igényel)" -#: gitk:10728 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(jelenleg nem elérhető)" -#: gitk:10732 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Színek: nyomja meg a kiválasztáshoz" -#: gitk:10735 +#: gitk:11395 msgid "Interface" msgstr "Interfész" -#: gitk:10736 +#: gitk:11396 msgid "interface" msgstr "interfész" -#: gitk:10739 +#: gitk:11399 msgid "Background" msgstr "Háttér" -#: gitk:10740 gitk:10770 +#: gitk:11400 gitk:11430 msgid "background" msgstr "háttér" -#: gitk:10743 +#: gitk:11403 msgid "Foreground" msgstr "Előtér" -#: gitk:10744 +#: gitk:11404 msgid "foreground" msgstr "előtér" -#: gitk:10747 +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff: régi sorok" -#: gitk:10748 +#: gitk:11408 msgid "diff old lines" msgstr "diff régi sorok" -#: gitk:10752 +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff: új sorok" -#: gitk:10753 +#: gitk:11413 msgid "diff new lines" msgstr "diff - új sorok" -#: gitk:10757 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff: nagy headerök" -#: gitk:10759 +#: gitk:11419 msgid "diff hunk header" msgstr "diff - nagy headerök" -#: gitk:10763 +#: gitk:11423 msgid "Marked line bg" msgstr "Megjelölt sor háttér" -#: gitk:10765 +#: gitk:11425 msgid "marked line background" msgstr "megjelölt sor háttér" -#: gitk:10769 +#: gitk:11429 msgid "Select bg" msgstr "Válasszon hátteret" -#: gitk:10773 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Betű: nyomja meg a kiválasztáshoz" -#: gitk:10775 +#: gitk:11440 msgid "Main font" msgstr "Fő betű" -#: gitk:10776 +#: gitk:11441 msgid "Diff display font" msgstr "Diff kijelző betű" -#: gitk:10777 +#: gitk:11442 msgid "User interface font" msgstr "Felhasználói interfész betű" -#: gitk:10814 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Gitk beállítások" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Generálás" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: válasszon színt a %s-ra" -#: gitk:11418 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Nem találhatü git repository itt." -#: gitk:11422 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "Nem található a \"%s\" könyvtár." - -#: gitk:11469 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Félreérthető argumentum '%s': revízió és fájlnév is" -#: gitk:11481 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Rossz gitk argumentumok:" -#: gitk:11572 +#: gitk:12405 msgid "Command line" msgstr "Parancs sor" +#~ msgid "SHA1 ID: " +#~ msgstr "SHA1 ID: " + +#~ msgid "next" +#~ msgstr "következő" + +#~ msgid "prev" +#~ msgstr "előző" + +#~ msgid "CDate" +#~ msgstr "Dátum" + +#~ msgid "Cannot find the git directory \"%s\"." +#~ msgstr "Nem található a \"%s\" könyvtár." + #~ msgid "Use all refs" #~ msgstr "Használd az összes referenciát" diff --git a/gitk-git/po/it.po b/gitk-git/po/it.po index a730d63a42..d630bb086d 100644 --- a/gitk-git/po/it.po +++ b/gitk-git/po/it.po @@ -8,33 +8,42 @@ msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-28 18:40+0100\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2010-01-28 18:41+0100\n" "Last-Translator: Michele Ballabio <barra_cuda@katamail.com>\n" "Language-Team: Italian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gitk:115 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "Impossibile ottenere l'elenco dei file in attesa di fusione:" -#: gitk:274 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 msgid "Error parsing revisions:" msgstr "Errore nella lettura delle revisioni:" -#: gitk:329 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Errore nell'esecuzione del comando specificato con --argscmd:" -#: gitk:342 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Nessun file selezionato: è stata specificata l'opzione --merge ma non ci " "sono file in attesa di fusione." -#: gitk:345 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -42,299 +51,315 @@ msgstr "" "Nessun file selezionato: è stata specificata l'opzione --merge ma i file " "specificati non sono in attesa di fusione." -#: gitk:367 gitk:514 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Errore nell'esecuzione di git log:" -#: gitk:385 gitk:530 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Lettura in corso" -#: gitk:445 gitk:4261 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Lettura delle revisioni in corso..." -#: gitk:448 gitk:1578 gitk:4264 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Nessuna revisione selezionata" -#: gitk:1454 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Impossibile elaborare i dati di git log:" -#: gitk:1674 +#: gitk:1740 msgid "No commit information available" msgstr "Nessuna informazione disponibile sulle revisioni" -#: gitk:1816 +#: gitk:1897 msgid "mc" msgstr "" -#: gitk:1851 gitk:4054 gitk:9044 gitk:10585 gitk:10804 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "OK" -#: gitk:1853 gitk:4056 gitk:8634 gitk:8713 gitk:8828 gitk:8877 gitk:9046 -#: gitk:10586 gitk:10805 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Annulla" -#: gitk:1975 +#: gitk:2069 msgid "Update" msgstr "Aggiorna" -#: gitk:1976 +#: gitk:2070 msgid "Reload" msgstr "Ricarica" -#: gitk:1977 +#: gitk:2071 msgid "Reread references" msgstr "Rileggi riferimenti" -#: gitk:1978 +#: gitk:2072 msgid "List references" msgstr "Elenca riferimenti" -#: gitk:1980 +#: gitk:2074 msgid "Start git gui" msgstr "Avvia git gui" -#: gitk:1982 +#: gitk:2076 msgid "Quit" msgstr "Esci" -#: gitk:1974 +#: gitk:2068 msgid "File" msgstr "File" -#: gitk:1986 +#: gitk:2080 msgid "Preferences" msgstr "Preferenze" -#: gitk:1985 +#: gitk:2079 msgid "Edit" msgstr "Modifica" -#: gitk:1990 +#: gitk:2084 msgid "New view..." msgstr "Nuova vista..." -#: gitk:1991 +#: gitk:2085 msgid "Edit view..." msgstr "Modifica vista..." -#: gitk:1992 +#: gitk:2086 msgid "Delete view" msgstr "Elimina vista" -#: gitk:1994 +#: gitk:2088 msgid "All files" msgstr "Tutti i file" -#: gitk:1989 gitk:3808 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Vista" -#: gitk:1999 gitk:2009 gitk:2780 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Informazioni su gitk" -#: gitk:2000 gitk:2014 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Scorciatoie da tastiera" -#: gitk:1998 gitk:2013 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Aiuto" -#: gitk:2091 gitk:8110 +#: gitk:2185 gitk:8633 msgid "SHA1 ID:" msgstr "SHA1 ID:" -#: gitk:2122 +#: gitk:2229 msgid "Row" msgstr "Riga" -#: gitk:2160 +#: gitk:2267 msgid "Find" msgstr "Trova" -#: gitk:2161 -msgid "next" -msgstr "succ" - -#: gitk:2162 -msgid "prev" -msgstr "prec" - -#: gitk:2163 +#: gitk:2295 msgid "commit" msgstr "revisione" -#: gitk:2166 gitk:2168 gitk:4422 gitk:4445 gitk:4469 gitk:6410 gitk:6482 -#: gitk:6566 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "contenente:" -#: gitk:2169 gitk:3290 gitk:3295 gitk:4497 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "che riguarda i percorsi:" -#: gitk:2170 gitk:4502 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "che aggiunge/rimuove la stringa:" -#: gitk:2179 gitk:2181 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Esatto" -#: gitk:2181 gitk:4577 gitk:6378 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "" -#: gitk:2181 gitk:4471 gitk:4575 gitk:6374 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "" -#: gitk:2183 gitk:2184 gitk:4596 gitk:4626 gitk:4633 gitk:6502 gitk:6570 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Tutti i campi" -#: gitk:2184 gitk:4594 gitk:4626 gitk:6441 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Titolo" -#: gitk:2185 gitk:4594 gitk:6441 gitk:6570 gitk:7003 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Commenti" -#: gitk:2185 gitk:4594 gitk:4598 gitk:4633 gitk:6441 gitk:6938 gitk:8285 -#: gitk:8300 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Autore" -#: gitk:2185 gitk:4594 gitk:6441 gitk:6940 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Revisione creata da" -#: gitk:2216 +#: gitk:2350 msgid "Search" msgstr "Cerca" -#: gitk:2224 +#: gitk:2358 msgid "Diff" msgstr "" -#: gitk:2226 +#: gitk:2360 msgid "Old version" msgstr "Vecchia versione" -#: gitk:2228 +#: gitk:2362 msgid "New version" msgstr "Nuova versione" -#: gitk:2230 +#: gitk:2364 msgid "Lines of context" msgstr "Linee di contesto" -#: gitk:2240 +#: gitk:2374 msgid "Ignore space change" msgstr "Ignora modifiche agli spazi" -#: gitk:2299 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Modifiche" -#: gitk:2301 +#: gitk:2447 msgid "Tree" msgstr "Directory" -#: gitk:2456 gitk:2473 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Diff questo -> selezionato" -#: gitk:2457 gitk:2474 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Diff selezionato -> questo" -#: gitk:2458 gitk:2475 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Crea patch" -#: gitk:2459 gitk:8692 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Crea etichetta" -#: gitk:2460 gitk:8808 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Scrivi revisione in un file" -#: gitk:2461 gitk:8865 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Crea un nuovo ramo" -#: gitk:2462 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Porta questa revisione in cima al ramo attuale" -#: gitk:2463 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Aggiorna il ramo HEAD a questa revisione" -#: gitk:2464 +#: gitk:2624 msgid "Mark this commit" msgstr "Segna questa revisione" -#: gitk:2465 +#: gitk:2625 msgid "Return to mark" msgstr "Torna alla revisione segnata" -#: gitk:2466 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Trova il discendente di questa revisione e di quella segnata" -#: gitk:2467 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Confronta con la revisione segnata" -#: gitk:2481 +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Diff questo -> selezionato" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Diff selezionato -> questo" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Segna questa revisione" + +#: gitk:2646 msgid "Check out this branch" msgstr "Attiva questo ramo" -#: gitk:2482 +#: gitk:2647 msgid "Remove this branch" msgstr "Elimina questo ramo" -#: gitk:2489 +#: gitk:2654 msgid "Highlight this too" msgstr "Evidenzia anche questo" -#: gitk:2490 +#: gitk:2655 msgid "Highlight this only" msgstr "Evidenzia solo questo" -#: gitk:2491 +#: gitk:2656 msgid "External diff" msgstr "Visualizza differenze in un altro programma" -#: gitk:2492 +#: gitk:2657 msgid "Blame parent commit" msgstr "Annota la revisione precedente" -#: gitk:2499 +#: gitk:2664 msgid "Show origin of this line" msgstr "Mostra la provenienza di questa riga" -#: gitk:2500 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Esegui git gui blame su questa riga" -#: gitk:2782 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -346,298 +371,316 @@ msgstr "" "Utilizzo e redistribuzione permessi sotto i termini della GNU General Public " "License" -#: gitk:2790 gitk:2854 gitk:9230 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Chiudi" -#: gitk:2811 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Scorciatoie da tastiera di Gitk" -#: gitk:2814 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Scorciatoie da tastiera di Gitk:" -#: gitk:2816 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tEsci" -#: gitk:2817 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\tTrova" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tVai alla prima revisione" -#: gitk:2818 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tVai all'ultima revisione" -#: gitk:2819 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Su>, p, i\tVai più in alto di una revisione" -#: gitk:2820 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Giù>, n, k\tVai più in basso di una revisione" -#: gitk:2821 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Sinistra>, z, j\tTorna indietro nella cronologia" -#: gitk:2822 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Destra>, x, l\tVai avanti nella cronologia" -#: gitk:2823 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PaginaSu>\tVai più in alto di una pagina nella lista delle revisioni" -#: gitk:2824 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "" "<PaginaGiù>\tVai più in basso di una pagina nella lista delle revisioni" -#: gitk:2825 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tScorri alla cima della lista delle revisioni" -#: gitk:2826 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tScorri alla fine della lista delle revisioni" -#: gitk:2827 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Su>\tScorri la lista delle revisioni in alto di una riga" -#: gitk:2828 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Giù>\tScorri la lista delle revisioni in basso di una riga" -#: gitk:2829 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PaginaSu>\tScorri la lista delle revisioni in alto di una pagina" -#: gitk:2830 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PaginaGiù>\tScorri la lista delle revisioni in basso di una pagina" -#: gitk:2831 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Su>\tTrova all'indietro (verso l'alto, revisioni successive)" -#: gitk:2832 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Shift-Giù>\tTrova in avanti (verso il basso, revisioni precedenti)" -#: gitk:2833 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tScorri la vista delle differenze in alto di una pagina" -#: gitk:2834 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tScorri la vista delle differenze in alto di una pagina" -#: gitk:2835 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Spazio>\t\tScorri la vista delle differenze in basso di una pagina" -#: gitk:2836 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tScorri la vista delle differenze in alto di 18 linee" -#: gitk:2837 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tScorri la vista delle differenze in basso di 18 linee" -#: gitk:2838 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tTrova" -#: gitk:2839 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tTrova in avanti" -#: gitk:2840 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Invio>\tTrova in avanti" -#: gitk:2841 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tCursore nel box di ricerca" -#: gitk:2842 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tTrova all'indietro" -#: gitk:2843 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tScorri la vista delle differenze al file successivo" -#: gitk:2844 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tCerca in avanti nella vista delle differenze" -#: gitk:2845 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tCerca all'indietro nella vista delle differenze" -#: gitk:2846 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tAumenta dimensione carattere" -#: gitk:2847 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-più>\tAumenta dimensione carattere" -#: gitk:2848 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tDiminuisci dimensione carattere" -#: gitk:2849 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-meno>\tDiminuisci dimensione carattere" -#: gitk:2850 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tAggiorna" -#: gitk:3305 gitk:3314 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Errore durante la creazione della directory temporanea %s:" -#: gitk:3327 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Errore nella lettura di \"%s\" da %s:" -#: gitk:3390 +#: gitk:3631 msgid "command failed:" msgstr "impossibile eseguire il comando:" -#: gitk:3539 +#: gitk:3780 msgid "No such commit" msgstr "Revisione inesistente" -#: gitk:3553 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: impossibile eseguire il comando:" -#: gitk:3584 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Impossibile leggere merge head: %s" -#: gitk:3592 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Errore nella lettura dell'indice: %s" -#: gitk:3617 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Impossibile eseguire git blame: %s" -#: gitk:3620 gitk:6409 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Ricerca in corso" -#: gitk:3652 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Errore nell'esecuzione di git blame: %s" -#: gitk:3680 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Quella riga proviene dalla revisione %s, non presente in questa vista" -#: gitk:3694 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Impossibile eseguire il visualizzatore di differenze:" -#: gitk:3812 +#: gitk:4053 msgid "Gitk view definition" msgstr "Scelta vista Gitk" -#: gitk:3816 +#: gitk:4057 msgid "Remember this view" msgstr "Ricorda questa vista" -#: gitk:3817 +#: gitk:4058 msgid "References (space separated list):" msgstr "Riferimenti (lista di elementi separati da spazi)" -#: gitk:3818 +#: gitk:4059 msgid "Branches & tags:" msgstr "Rami ed etichette" -#: gitk:3819 +#: gitk:4060 msgid "All refs" msgstr "Tutti i riferimenti" -#: gitk:3820 +#: gitk:4061 msgid "All (local) branches" msgstr "Tutti i rami (locali)" -#: gitk:3821 +#: gitk:4062 msgid "All tags" msgstr "Tutte le etichette" -#: gitk:3822 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Tutti i rami remoti" -#: gitk:3823 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Informazioni sulla revisione (espressioni regolari):" -#: gitk:3824 +#: gitk:4065 msgid "Author:" msgstr "Autore:" -#: gitk:3825 +#: gitk:4066 msgid "Committer:" msgstr "Revisione creata da:" -#: gitk:3826 +#: gitk:4067 msgid "Commit Message:" msgstr "Messaggio di revisione:" -#: gitk:3827 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Risponde a tutti i criteri di ricerca sulle revisioni" -#: gitk:3828 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Risponde a tutti i criteri di ricerca sulle revisioni" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Modifiche ai file:" -#: gitk:3829 +#: gitk:4071 msgid "Fixed String" msgstr "Stringa fissa" -#: gitk:3830 +#: gitk:4072 msgid "Regular Expression" msgstr "Espressione regolare" -#: gitk:3831 +#: gitk:4073 msgid "Search string:" msgstr "Cerca stringa:" -#: gitk:3832 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -645,201 +688,201 @@ msgstr "" "Date di revisione (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, " "2009 15:27:38\"):" -#: gitk:3833 +#: gitk:4075 msgid "Since:" msgstr "Da:" -#: gitk:3834 +#: gitk:4076 msgid "Until:" msgstr "A:" -#: gitk:3835 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Limita e/o salta N revisioni (intero positivo):" -#: gitk:3836 +#: gitk:4078 msgid "Number to show:" msgstr "Numero di revisioni da mostrare:" -#: gitk:3837 +#: gitk:4079 msgid "Number to skip:" msgstr "Numero di revisioni da saltare:" -#: gitk:3838 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Altre opzioni:" -#: gitk:3839 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Ordina solo per data" -#: gitk:3840 +#: gitk:4082 msgid "Mark branch sides" msgstr "Segna i lati del ramo" -#: gitk:3841 +#: gitk:4083 msgid "Limit to first parent" msgstr "Limita al primo genitore" -#: gitk:3842 +#: gitk:4084 msgid "Simple history" msgstr "Cronologia semplificata" -#: gitk:3843 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Ulteriori argomenti da passare a git log:" -#: gitk:3844 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Inserire file e directory da includere, uno per riga:" -#: gitk:3845 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Comando che genera altre revisioni da visualizzare:" -#: gitk:3967 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: modifica vista" -#: gitk:3975 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "-- criteri per la scelta delle revisioni" -#: gitk:3980 +#: gitk:4224 msgid "View Name" msgstr "Nome vista" -#: gitk:4055 +#: gitk:4299 msgid "Apply (F5)" msgstr "Applica (F5)" -#: gitk:4093 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Errore negli argomenti di selezione delle revisioni:" -#: gitk:4146 gitk:4198 gitk:4646 gitk:4660 gitk:5921 gitk:11534 gitk:11535 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Nessuno" -#: gitk:4594 gitk:6441 gitk:8287 gitk:8302 -msgid "Date" -msgstr "Data" - -#: gitk:4594 gitk:6441 -msgid "CDate" -msgstr "" - -#: gitk:4743 gitk:4748 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Discendente" -#: gitk:4744 +#: gitk:5004 msgid "Not descendant" msgstr "Non discendente" -#: gitk:4751 gitk:4756 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Ascendente" -#: gitk:4752 +#: gitk:5012 msgid "Not ancestor" msgstr "Non ascendente" -#: gitk:5042 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Modifiche locali presenti nell'indice ma non nell'archivio" -#: gitk:5078 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Modifiche locali non presenti né nell'archivio né nell'indice" -#: gitk:6759 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 msgid "many" msgstr "molti" -#: gitk:6942 +#: gitk:7309 msgid "Tags:" msgstr "Etichette:" -#: gitk:6959 gitk:6965 gitk:8280 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Genitore" -#: gitk:6970 +#: gitk:7337 msgid "Child" msgstr "Figlio" -#: gitk:6979 +#: gitk:7346 msgid "Branch" msgstr "Ramo" -#: gitk:6982 +#: gitk:7349 msgid "Follows" msgstr "Segue" -#: gitk:6985 +#: gitk:7352 msgid "Precedes" msgstr "Precede" -#: gitk:7522 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Errore nella lettura delle differenze:" -#: gitk:8108 +#: gitk:8631 msgid "Goto:" msgstr "Vai a:" -#: gitk:8129 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "La SHA1 id abbreviata %s è ambigua" -#: gitk:8136 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "La revisione %s è sconosciuta" -#: gitk:8146 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "La SHA1 id %s è sconosciuta" -#: gitk:8148 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "La revisione %s non è presente nella vista attuale" -#: gitk:8290 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Data" + +#: gitk:8816 msgid "Children" msgstr "Figli" -#: gitk:8348 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Aggiorna il ramo %s a questa revisione" -#: gitk:8350 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Nessun ramo attivo: reset impossibile" -#: gitk:8459 gitk:8465 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Salto la revisione di fusione " -#: gitk:8474 gitk:8479 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Errore nella identificazione della patch per " -#: gitk:8475 gitk:8480 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - fine\n" -#: gitk:8485 gitk:8488 gitk:8496 gitk:8510 gitk:8519 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "La revisione " -#: gitk:8489 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -847,7 +890,7 @@ msgstr "" " ha le stesse differenze di\n" " " -#: gitk:8497 +#: gitk:9024 msgid "" " differs from\n" " " @@ -855,7 +898,7 @@ msgstr "" " è diversa da\n" " " -#: gitk:8499 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -863,129 +906,129 @@ msgstr "" "Differenze tra le revisioni:\n" "\n" -#: gitk:8511 gitk:8520 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " ha %s figli - fine\n" -#: gitk:8539 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Errore nella scrittura della revisione nel file: %s" -#: gitk:8545 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "Errore nelle differenze tra le revisioni: %s" -#: gitk:8575 +#: gitk:9118 msgid "Top" msgstr "Inizio" -#: gitk:8576 +#: gitk:9119 msgid "From" msgstr "Da" -#: gitk:8581 +#: gitk:9124 msgid "To" msgstr "A" -#: gitk:8605 +#: gitk:9148 msgid "Generate patch" msgstr "Genera patch" -#: gitk:8607 +#: gitk:9150 msgid "From:" msgstr "Da:" -#: gitk:8616 +#: gitk:9159 msgid "To:" msgstr "A:" -#: gitk:8625 +#: gitk:9168 msgid "Reverse" msgstr "Inverti" -#: gitk:8627 gitk:8822 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Scrivi sul file:" -#: gitk:8633 +#: gitk:9176 msgid "Generate" msgstr "Genera" -#: gitk:8671 +#: gitk:9214 msgid "Error creating patch:" msgstr "Errore nella creazione della patch:" -#: gitk:8694 gitk:8810 gitk:8867 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:8703 +#: gitk:9246 msgid "Tag name:" msgstr "Nome etichetta:" -#: gitk:8706 +#: gitk:9249 msgid "Tag message is optional" msgstr "Il messaggio dell'etichetta è opzionale" -#: gitk:8708 +#: gitk:9251 msgid "Tag message:" msgstr "Messaggio dell'etichetta:" -#: gitk:8712 gitk:8876 +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Crea" -#: gitk:8730 +#: gitk:9273 msgid "No tag name specified" msgstr "Nessuna etichetta specificata" -#: gitk:8734 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "L'etichetta \"%s\" esiste già" -#: gitk:8744 +#: gitk:9287 msgid "Error creating tag:" msgstr "Errore nella creazione dell'etichetta:" -#: gitk:8819 +#: gitk:9363 msgid "Command:" msgstr "Comando:" -#: gitk:8827 +#: gitk:9371 msgid "Write" msgstr "Scrivi" -#: gitk:8845 +#: gitk:9389 msgid "Error writing commit:" msgstr "Errore nella scrittura della revisione:" -#: gitk:8872 +#: gitk:9416 msgid "Name:" msgstr "Nome:" -#: gitk:8895 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Specificare un nome per il nuovo ramo" -#: gitk:8900 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Il ramo '%s' esiste già. Sovrascrivere?" -#: gitk:8966 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "La revisione %s è già inclusa nel ramo %s -- applicarla di nuovo?" -#: gitk:8971 +#: gitk:9516 msgid "Cherry-picking" msgstr "" -#: gitk:8980 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -996,7 +1039,7 @@ msgstr "" "Prima di riprovare, bisogna creare una nuova revisione, annullare le " "modifiche o usare 'git stash'." -#: gitk:8986 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1004,32 +1047,62 @@ msgstr "" "Impossibile eseguire cherry-pick a causa di un conflitto nella fusione.\n" "Vuoi avviare git citool per risolverlo?" -#: gitk:9002 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Nessuna modifica archiviata" -#: gitk:9028 +#: gitk:9574 +#, fuzzy, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "La revisione %s è già inclusa nel ramo %s -- applicarla di nuovo?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "git reset in corso" + +#: gitk:9587 +#, fuzzy, 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 "" +"Impossibile eseguire cherry-pick perché il file '%s' è stato modificato " +"nella directory di lavoro.\n" +"Prima di riprovare, bisogna creare una nuova revisione, annullare le " +"modifiche o usare 'git stash'." + +#: gitk:9591 +#, fuzzy +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"Impossibile eseguire cherry-pick a causa di un conflitto nella fusione.\n" +"Vuoi avviare git citool per risolverlo?" + +#: gitk:9634 msgid "Confirm reset" msgstr "Conferma git reset" -#: gitk:9030 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Aggiornare il ramo %s a %s?" -#: gitk:9032 +#: gitk:9638 msgid "Reset type:" msgstr "Tipo di aggiornamento:" -#: gitk:9035 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Soft: Lascia la direcory di lavoro e l'indice come sono" -#: gitk:9038 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Mixed: Lascia la directory di lavoro come è, aggiorna l'indice" -#: gitk:9041 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1037,19 +1110,19 @@ msgstr "" "Hard: Aggiorna la directory di lavoro e l'indice\n" "(abbandona TUTTE le modifiche locali)" -#: gitk:9058 +#: gitk:9664 msgid "Resetting" msgstr "git reset in corso" -#: gitk:9118 +#: gitk:9724 msgid "Checking out" msgstr "Attivazione in corso" -#: gitk:9171 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Impossibile cancellare il ramo attualmente attivo" -#: gitk:9177 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1058,16 +1131,16 @@ msgstr "" "Le revisioni nel ramo %s non sono presenti su altri rami.\n" "Cancellare il ramo %s?" -#: gitk:9208 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Etichette e rami: %s" -#: gitk:9223 +#: gitk:9829 msgid "Filter" msgstr "Filtro" -#: gitk:9518 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1075,202 +1148,225 @@ msgstr "" "Errore nella lettura della topologia delle revisioni: le informazioni sul " "ramo e le etichette precedenti e seguenti saranno incomplete." -#: gitk:10504 +#: gitk:11102 msgid "Tag" msgstr "Etichetta" -#: gitk:10504 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:10554 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Scelta caratteri gitk" -#: gitk:10571 +#: gitk:11206 msgid "B" msgstr "B" -#: gitk:10574 +#: gitk:11209 msgid "I" msgstr "I" -#: gitk:10692 -msgid "Gitk preferences" -msgstr "Preferenze gitk" - -#: gitk:10694 +#: gitk:11327 msgid "Commit list display options" msgstr "Opzioni visualizzazione dell'elenco revisioni" -#: gitk:10697 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Larghezza massima del grafico (in linee)" -#: gitk:10700 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Larghezza massima del grafico (% del pannello)" -#: gitk:10703 +#: gitk:11337 msgid "Show local changes" msgstr "Mostra modifiche locali" -#: gitk:10706 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "Seleziona automaticamente SHA1 hash" -#: gitk:10709 +#: gitk:11344 msgid "Hide remote refs" msgstr "Nascondi i riferimenti remoti" -#: gitk:10713 +#: gitk:11348 msgid "Diff display options" msgstr "Opzioni di visualizzazione delle differenze" -#: gitk:10715 +#: gitk:11350 msgid "Tab spacing" msgstr "Spaziatura tabulazioni" -#: gitk:10718 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Mostra etichette vicine" -#: gitk:10721 +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" + +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Limita le differenze ai percorsi elencati" -#: gitk:10724 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Attiva codifica file per file" -#: gitk:10730 gitk:10819 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Visualizzatore di differenze" -#: gitk:10731 +#: gitk:11369 msgid "Choose..." msgstr "Scegli..." -#: gitk:10736 +#: gitk:11374 msgid "General options" msgstr "Opzioni generali" -#: gitk:10739 +#: gitk:11377 msgid "Use themed widgets" msgstr "Utilizza interfaccia a tema" -#: gitk:10741 +#: gitk:11379 msgid "(change requires restart)" msgstr "(una modifica richiede il riavvio)" -#: gitk:10743 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(momentaneamente non disponibile)" -#: gitk:10747 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Colori: premere per scegliere" -#: gitk:10750 +#: gitk:11395 msgid "Interface" msgstr "Interfaccia" -#: gitk:10751 +#: gitk:11396 msgid "interface" msgstr "interfaccia" -#: gitk:10754 +#: gitk:11399 msgid "Background" msgstr "Sfondo" -#: gitk:10755 gitk:10785 +#: gitk:11400 gitk:11430 msgid "background" msgstr "sfondo" -#: gitk:10758 +#: gitk:11403 msgid "Foreground" msgstr "Primo piano" -#: gitk:10759 +#: gitk:11404 msgid "foreground" msgstr "primo piano" -#: gitk:10762 +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff: vecchie linee" -#: gitk:10763 +#: gitk:11408 msgid "diff old lines" msgstr "vecchie linee" -#: gitk:10767 +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff: nuove linee" -#: gitk:10768 +#: gitk:11413 msgid "diff new lines" msgstr "nuove linee" -#: gitk:10772 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff: intestazione della sezione" -#: gitk:10774 +#: gitk:11419 msgid "diff hunk header" msgstr "intestazione della sezione" -#: gitk:10778 +#: gitk:11423 msgid "Marked line bg" msgstr "Sfondo riga selezionata" -#: gitk:10780 +#: gitk:11425 msgid "marked line background" msgstr "sfondo riga selezionata" -#: gitk:10784 +#: gitk:11429 msgid "Select bg" msgstr "Sfondo" -#: gitk:10788 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Carattere: premere per scegliere" -#: gitk:10790 +#: gitk:11440 msgid "Main font" msgstr "Carattere principale" -#: gitk:10791 +#: gitk:11441 msgid "Diff display font" msgstr "Carattere per differenze" -#: gitk:10792 +#: gitk:11442 msgid "User interface font" msgstr "Carattere per interfaccia utente" -#: gitk:10829 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Preferenze gitk" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Genera" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: scegliere un colore per %s" -#: gitk:11433 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Archivio git non trovato." -#: gitk:11437 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "Directory git \"%s\" non trovata." - -#: gitk:11484 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Argomento ambiguo: '%s' è sia revisione che nome di file" -#: gitk:11496 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Gitk: argomenti errati:" -#: gitk:11587 +#: gitk:12405 msgid "Command line" msgstr "Linea di comando" + +#~ msgid "next" +#~ msgstr "succ" + +#~ msgid "prev" +#~ msgstr "prec" + +#~ msgid "Cannot find the git directory \"%s\"." +#~ msgstr "Directory git \"%s\" non trovata." diff --git a/gitk-git/po/ja.po b/gitk-git/po/ja.po index 4f4705164c..db47a4c2b6 100644 --- a/gitk-git/po/ja.po +++ b/gitk-git/po/ja.po @@ -8,34 +8,43 @@ msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-11-04 00:08+0900\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2009-11-06 01:45+0900\n" "Last-Translator: Mizar <mizar.jp@gmail.com>\n" "Language-Team: Japanese\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: gitk:113 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "マージされていないファイルのリストを取得できません:" -#: gitk:269 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 msgid "Error parsing revisions:" msgstr "リビジョン解析エラー:" -#: gitk:324 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "--argscmd コマンド実行エラー:" -#: gitk:337 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "ファイル未選択: --merge が指定されましたが、マージされていないファイルはあり" "ません。" -#: gitk:340 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -43,299 +52,315 @@ msgstr "" "ファイル未選択: --merge が指定されましたが、ファイル制限内にマージされていな" "いファイルはありません。" -#: gitk:362 gitk:509 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "git log 実行エラー:" -#: gitk:380 gitk:525 +#: gitk:436 gitk:582 msgid "Reading" msgstr "読み込み中" -#: gitk:440 gitk:4132 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "コミット読み込み中..." -#: gitk:443 gitk:1561 gitk:4135 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "コミットが選択されていません" -#: gitk:1437 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "git log の出力を解析できません:" -#: gitk:1657 +#: gitk:1740 msgid "No commit information available" msgstr "有効なコミットの情報がありません" -#: gitk:1790 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1817 gitk:3925 gitk:8842 gitk:10378 gitk:10558 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "OK" -#: gitk:1819 gitk:3927 gitk:8439 gitk:8513 gitk:8623 gitk:8672 gitk:8844 -#: gitk:10379 gitk:10559 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "キャンセル" -#: gitk:1919 +#: gitk:2069 msgid "Update" msgstr "更新" -#: gitk:1920 +#: gitk:2070 msgid "Reload" msgstr "リロード" -#: gitk:1921 +#: gitk:2071 msgid "Reread references" msgstr "リファレンスを再読み込み" -#: gitk:1922 +#: gitk:2072 msgid "List references" msgstr "リファレンスリストを表示" -#: gitk:1924 +#: gitk:2074 msgid "Start git gui" msgstr "git gui の開始" -#: gitk:1926 +#: gitk:2076 msgid "Quit" msgstr "終了" -#: gitk:1918 +#: gitk:2068 msgid "File" msgstr "ファイル" -#: gitk:1930 +#: gitk:2080 msgid "Preferences" msgstr "設定" -#: gitk:1929 +#: gitk:2079 msgid "Edit" msgstr "編集" -#: gitk:1934 +#: gitk:2084 msgid "New view..." msgstr "新規ビュー..." -#: gitk:1935 +#: gitk:2085 msgid "Edit view..." msgstr "ビュー編集..." -#: gitk:1936 +#: gitk:2086 msgid "Delete view" msgstr "ビュー削除" -#: gitk:1938 +#: gitk:2088 msgid "All files" msgstr "全てのファイル" -#: gitk:1933 gitk:3679 +#: gitk:2083 gitk:4050 msgid "View" msgstr "ビュー" -#: gitk:1943 gitk:1953 gitk:2656 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "gitk について" -#: gitk:1944 gitk:1958 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "キーバインディング" -#: gitk:1942 gitk:1957 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "ヘルプ" -#: gitk:2018 -msgid "SHA1 ID: " -msgstr "SHA1 ID: " +#: gitk:2185 gitk:8633 +msgid "SHA1 ID:" +msgstr "SHA1 ID:" -#: gitk:2049 +#: gitk:2229 msgid "Row" msgstr "行" -#: gitk:2080 +#: gitk:2267 msgid "Find" msgstr "検索" -#: gitk:2081 -msgid "next" -msgstr "次" - -#: gitk:2082 -msgid "prev" -msgstr "前" - -#: gitk:2083 +#: gitk:2295 msgid "commit" msgstr "コミット" -#: gitk:2086 gitk:2088 gitk:4293 gitk:4316 gitk:4340 gitk:6281 gitk:6353 -#: gitk:6437 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "含む:" -#: gitk:2089 gitk:3164 gitk:3169 gitk:4368 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "パスの一部:" -#: gitk:2090 gitk:4373 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "追加/除去する文字列:" -#: gitk:2099 gitk:2101 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "英字の大小を区別する" -#: gitk:2101 gitk:4448 gitk:6249 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "英字の大小を区別しない" -#: gitk:2101 gitk:4342 gitk:4446 gitk:6245 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "正規表現" -#: gitk:2103 gitk:2104 gitk:4467 gitk:4497 gitk:4504 gitk:6373 gitk:6441 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "全ての項目" -#: gitk:2104 gitk:4465 gitk:4497 gitk:6312 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "ヘッドライン" -#: gitk:2105 gitk:4465 gitk:6312 gitk:6441 gitk:6875 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "コメント" -#: gitk:2105 gitk:4465 gitk:4469 gitk:4504 gitk:6312 gitk:6810 gitk:8091 -#: gitk:8106 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "作者" -#: gitk:2105 gitk:4465 gitk:6312 gitk:6812 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "コミット者" -#: gitk:2134 +#: gitk:2350 msgid "Search" msgstr "検索" -#: gitk:2141 +#: gitk:2358 msgid "Diff" msgstr "Diff" -#: gitk:2143 +#: gitk:2360 msgid "Old version" msgstr "旧バージョン" -#: gitk:2145 +#: gitk:2362 msgid "New version" msgstr "新バージョン" -#: gitk:2147 +#: gitk:2364 msgid "Lines of context" msgstr "文脈行数" -#: gitk:2157 +#: gitk:2374 msgid "Ignore space change" msgstr "空白の違いを無視" -#: gitk:2215 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "パッチ" -#: gitk:2217 +#: gitk:2447 msgid "Tree" msgstr "ツリー" -#: gitk:2361 gitk:2378 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "これと選択したコミットのdiffを見る" -#: gitk:2362 gitk:2379 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "選択したコミットとこれのdiffを見る" -#: gitk:2363 gitk:2380 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "パッチ作成" -#: gitk:2364 gitk:8497 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "タグ生成" -#: gitk:2365 gitk:8603 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "コミットをファイルに書き出す" -#: gitk:2366 gitk:8660 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "新規ブランチ生成" -#: gitk:2367 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "このコミットをチェリーピックする" -#: gitk:2368 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "ブランチのHEADをここにリセットする" -#: gitk:2369 +#: gitk:2624 msgid "Mark this commit" msgstr "このコミットにマークをつける" -#: gitk:2370 +#: gitk:2625 msgid "Return to mark" msgstr "マークを付けた所に戻る" -#: gitk:2371 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "これとマークをつけた所との子孫を見つける" -#: gitk:2372 +#: gitk:2627 msgid "Compare with marked commit" msgstr "マークを付けたコミットと比較する" -#: gitk:2386 +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "これと選択したコミットのdiffを見る" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "選択したコミットとこれのdiffを見る" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "このコミットにマークをつける" + +#: gitk:2646 msgid "Check out this branch" msgstr "このブランチをチェックアウトする" -#: gitk:2387 +#: gitk:2647 msgid "Remove this branch" msgstr "このブランチを除去する" -#: gitk:2394 +#: gitk:2654 msgid "Highlight this too" msgstr "これもハイライトさせる" -#: gitk:2395 +#: gitk:2655 msgid "Highlight this only" msgstr "これだけをハイライトさせる" -#: gitk:2396 +#: gitk:2656 msgid "External diff" msgstr "外部diffツール" -#: gitk:2397 +#: gitk:2657 msgid "Blame parent commit" msgstr "親コミットから blame をかける" -#: gitk:2404 +#: gitk:2664 msgid "Show origin of this line" msgstr "この行の出自を表示する" -#: gitk:2405 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "この行に git gui で blame をかける" -#: gitk:2658 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -346,297 +371,315 @@ msgstr "" "\n" "使用および再配布は GNU General Public License に従ってください" -#: gitk:2666 gitk:2728 gitk:9025 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "閉じる" -#: gitk:2685 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Gitk キーバインディング" -#: gitk:2688 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Gitk キーバインディング:" -#: gitk:2690 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\t終了" -#: gitk:2691 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\t検索" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\t最初のコミットに移動" -#: gitk:2692 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\t最後のコミットに移動" -#: gitk:2693 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, i\t一つ上のコミットに移動" -#: gitk:2694 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, k\t一つ下のコミットに移動" -#: gitk:2695 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, j\t履歴の前に戻る" -#: gitk:2696 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\t履歴の次へ進む" -#: gitk:2697 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tコミットリストの一つ上のページに移動" -#: gitk:2698 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tコミットリストの一つ下のページに移動" -#: gitk:2699 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tコミットリストの一番上にスクロールする" -#: gitk:2700 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tコミットリストの一番下にスクロールする" -#: gitk:2701 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tコミットリストの一つ下の行にスクロールする" -#: gitk:2702 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tコミットリストの一つ下の行にスクロールする" -#: gitk:2703 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tコミットリストの上のページにスクロールする" -#: gitk:2704 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tコミットリストの下のページにスクロールする" -#: gitk:2705 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Up>\t後方を検索 (上方の・新しいコミット)" -#: gitk:2706 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Shift-Down>\t前方を検索(下方の・古いコミット)" -#: gitk:2707 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tdiff画面を上のページにスクロールする" -#: gitk:2708 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tdiff画面を上のページにスクロールする" -#: gitk:2709 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Space>\t\tdiff画面を下のページにスクロールする" -#: gitk:2710 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tdiff画面を上に18行スクロールする" -#: gitk:2711 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tdiff画面を下に18行スクロールする" -#: gitk:2712 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\t検索" -#: gitk:2713 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\t次を検索して移動" -#: gitk:2714 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\t次を検索して移動" -#: gitk:2715 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\t検索ボックスにフォーカス" -#: gitk:2716 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\t前を検索して移動" -#: gitk:2717 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\t次のファイルにdiff画面をスクロールする" -#: gitk:2718 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tdiff画面の次を検索" -#: gitk:2719 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tdiff画面の前を検索" -#: gitk:2720 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\t文字サイズを拡大" -#: gitk:2721 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\t文字サイズを拡大" -#: gitk:2722 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\t文字サイズを縮小" -#: gitk:2723 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\t文字サイズを縮小" -#: gitk:2724 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\t更新" -#: gitk:3179 gitk:3188 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "一時ディレクトリ %s 生成時エラー:" -#: gitk:3201 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "\"%s\" のエラーが %s に発生:" -#: gitk:3264 +#: gitk:3631 msgid "command failed:" msgstr "コマンド失敗:" -#: gitk:3410 +#: gitk:3780 msgid "No such commit" msgstr "そのようなコミットはありません" -#: gitk:3424 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: コマンド失敗:" -#: gitk:3455 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "マージする HEAD を読み込めません: %s" -#: gitk:3463 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "インデックス読み込みエラー: %s" -#: gitk:3488 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "git blame を始められません: %s" -#: gitk:3491 gitk:6280 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "検索中" -#: gitk:3523 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "git blame 実行エラー: %s" -#: gitk:3551 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "コミット %s に由来するその行は、このビューに表示されていません" -#: gitk:3565 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "外部diffビューアが失敗:" -#: gitk:3683 +#: gitk:4053 msgid "Gitk view definition" msgstr "Gitk ビュー定義" -#: gitk:3687 +#: gitk:4057 msgid "Remember this view" msgstr "このビューを記憶する" -#: gitk:3688 +#: gitk:4058 msgid "References (space separated list):" msgstr "リファレンス(スペース区切りのリスト):" -#: gitk:3689 +#: gitk:4059 msgid "Branches & tags:" msgstr "ブランチ&タグ:" -#: gitk:3690 +#: gitk:4060 msgid "All refs" msgstr "全てのリファレンス" -#: gitk:3691 +#: gitk:4061 msgid "All (local) branches" msgstr "全ての(ローカルな)ブランチ" -#: gitk:3692 +#: gitk:4062 msgid "All tags" msgstr "全てのタグ" -#: gitk:3693 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "全てのリモート追跡ブランチ" -#: gitk:3694 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "コミット情報(正規表現):" -#: gitk:3695 +#: gitk:4065 msgid "Author:" msgstr "作者:" -#: gitk:3696 +#: gitk:4066 msgid "Committer:" msgstr "コミット者:" -#: gitk:3697 +#: gitk:4067 msgid "Commit Message:" msgstr "コミットメッセージ:" -#: gitk:3698 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "コミット情報の全ての条件に一致" -#: gitk:3699 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "コミット情報の全ての条件に一致" + +#: gitk:4070 msgid "Changes to Files:" msgstr "変更したファイル:" -#: gitk:3700 +#: gitk:4071 msgid "Fixed String" msgstr "固定文字列" -#: gitk:3701 +#: gitk:4072 msgid "Regular Expression" msgstr "正規表現" -#: gitk:3702 +#: gitk:4073 msgid "Search string:" msgstr "検索文字列:" -#: gitk:3703 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -644,205 +687,202 @@ msgstr "" "コミット日時 (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:3704 +#: gitk:4075 msgid "Since:" msgstr "期間の始め:" -#: gitk:3705 +#: gitk:4076 msgid "Until:" msgstr "期間の終わり:" -#: gitk:3706 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "制限・省略するリビジョンの数(正の整数):" -#: gitk:3707 +#: gitk:4078 msgid "Number to show:" msgstr "表示する数:" -#: gitk:3708 +#: gitk:4079 msgid "Number to skip:" msgstr "省略する数:" -#: gitk:3709 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "その他のオプション:" -#: gitk:3710 +#: gitk:4081 msgid "Strictly sort by date" msgstr "厳密に日付順で並び替え" -#: gitk:3711 +#: gitk:4082 msgid "Mark branch sides" msgstr "側枝マーク" -#: gitk:3712 +#: gitk:4083 msgid "Limit to first parent" msgstr "最初の親に制限" -#: gitk:3713 +#: gitk:4084 msgid "Simple history" msgstr "簡易な履歴" -#: gitk:3714 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "git log への追加の引数:" -#: gitk:3715 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "含まれるファイル・ディレクトリを一行ごとに入力:" -#: gitk:3716 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "コミット追加コマンド:" -#: gitk:3838 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: ビュー編集" -#: gitk:3846 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "― リビジョンの選択条件" -#: gitk:3851 -msgid "View Name:" +#: gitk:4224 +#, fuzzy +msgid "View Name" msgstr "ビュー名:" -#: gitk:3926 +#: gitk:4299 msgid "Apply (F5)" msgstr "適用 (F5)" -#: gitk:3964 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "コミット選択引数のエラー:" -#: gitk:4017 gitk:4069 gitk:4517 gitk:4531 gitk:5792 gitk:11263 gitk:11264 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "無し" -#: gitk:4465 gitk:6312 gitk:8093 gitk:8108 -msgid "Date" -msgstr "日付" - -#: gitk:4465 gitk:6312 -msgid "CDate" -msgstr "作成日" - -#: gitk:4614 gitk:4619 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "子孫" -#: gitk:4615 +#: gitk:5004 msgid "Not descendant" msgstr "非子孫" -#: gitk:4622 gitk:4627 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "祖先" -#: gitk:4623 +#: gitk:5012 msgid "Not ancestor" msgstr "非祖先" -#: gitk:4913 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "ステージされた、コミット前のローカルな変更" -#: gitk:4949 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "ステージされていない、コミット前のローカルな変更" -#: gitk:6630 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 msgid "many" msgstr "多数" -#: gitk:6814 +#: gitk:7309 msgid "Tags:" msgstr "タグ:" -#: gitk:6831 gitk:6837 gitk:8086 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "親" -#: gitk:6842 +#: gitk:7337 msgid "Child" msgstr "子" -#: gitk:6851 +#: gitk:7346 msgid "Branch" msgstr "ブランチ" -#: gitk:6854 +#: gitk:7349 msgid "Follows" msgstr "下位" -#: gitk:6857 +#: gitk:7352 msgid "Precedes" msgstr "上位" -#: gitk:7359 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "diff取得エラー: %s" -#: gitk:7914 +#: gitk:8631 msgid "Goto:" msgstr "Goto:" -#: gitk:7916 -msgid "SHA1 ID:" -msgstr "SHA1 ID:" - -#: gitk:7935 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "%s を含む SHA1 ID は複数存在します" -#: gitk:7942 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "リビジョン %s は不明です" -#: gitk:7952 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA1 id %s は不明です" -#: gitk:7954 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "リビジョン %s は現在のビューにはありません" -#: gitk:8096 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "日付" + +#: gitk:8816 msgid "Children" msgstr "子" -#: gitk:8153 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "%s ブランチをここにリセットする" -#: gitk:8155 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "切り離されたHEAD: リセットできません" -#: gitk:8264 gitk:8270 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "コミットマージをスキップ: " -#: gitk:8279 gitk:8284 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "パッチ取得エラー: ID " -#: gitk:8280 gitk:8285 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - 停止\n" -#: gitk:8290 gitk:8293 gitk:8301 gitk:8314 gitk:8323 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "コミット " -#: gitk:8294 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -850,7 +890,7 @@ msgstr "" " は下記のパッチと同等\n" " " -#: gitk:8302 +#: gitk:9024 msgid "" " differs from\n" " " @@ -858,7 +898,7 @@ msgstr "" " 下記からのdiff\n" " " -#: gitk:8304 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -866,122 +906,131 @@ msgstr "" "コミットのdiff:\n" "\n" -#: gitk:8315 gitk:8324 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " には %s の子があります - 停止\n" -#: gitk:8344 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "ファイルへのコミット書き出しエラー: %s" -#: gitk:8350 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "コミットのdiff実行エラー: %s" -#: gitk:8380 +#: gitk:9118 msgid "Top" msgstr "Top" -#: gitk:8381 +#: gitk:9119 msgid "From" msgstr "From" -#: gitk:8386 +#: gitk:9124 msgid "To" msgstr "To" -#: gitk:8410 +#: gitk:9148 msgid "Generate patch" msgstr "パッチ生成" -#: gitk:8412 +#: gitk:9150 msgid "From:" msgstr "From:" -#: gitk:8421 +#: gitk:9159 msgid "To:" msgstr "To:" -#: gitk:8430 +#: gitk:9168 msgid "Reverse" msgstr "逆" -#: gitk:8432 gitk:8617 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "出力ファイル:" -#: gitk:8438 +#: gitk:9176 msgid "Generate" msgstr "生成" -#: gitk:8476 +#: gitk:9214 msgid "Error creating patch:" msgstr "パッチ生成エラー:" -#: gitk:8499 gitk:8605 gitk:8662 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:8508 +#: gitk:9246 msgid "Tag name:" msgstr "タグ名:" -#: gitk:8512 gitk:8671 +#: gitk:9249 +msgid "Tag message is optional" +msgstr "" + +#: gitk:9251 +#, fuzzy +msgid "Tag message:" +msgstr "タグ名:" + +#: gitk:9255 gitk:9420 msgid "Create" msgstr "生成" -#: gitk:8529 +#: gitk:9273 msgid "No tag name specified" msgstr "タグの名称が指定されていません" -#: gitk:8533 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "タグ \"%s\" は既に存在します" -#: gitk:8539 +#: gitk:9287 msgid "Error creating tag:" msgstr "タグ生成エラー:" -#: gitk:8614 +#: gitk:9363 msgid "Command:" msgstr "コマンド:" -#: gitk:8622 +#: gitk:9371 msgid "Write" msgstr "書き出し" -#: gitk:8640 +#: gitk:9389 msgid "Error writing commit:" msgstr "コミット書き出しエラー:" -#: gitk:8667 +#: gitk:9416 msgid "Name:" msgstr "名前:" -#: gitk:8690 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "新しいブランチの名前を指定してください" -#: gitk:8695 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "ブランチ '%s' は既に存在します。上書きしますか?" -#: gitk:8761 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "コミット %s は既にブランチ %s に含まれています ― 本当にこれを再適用しますか?" -#: gitk:8766 +#: gitk:9516 msgid "Cherry-picking" msgstr "チェリーピック中" -#: gitk:8775 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -991,7 +1040,7 @@ msgstr "" "あなたの変更に commit, reset, stash のいずれかを行ってからやり直してくださ" "い。" -#: gitk:8781 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -999,32 +1048,62 @@ msgstr "" "マージの衝突によってチェリーピックは失敗しました。\n" "この解決のために git citool を実行したいですか?" -#: gitk:8797 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "何の変更もコミットされていません" -#: gitk:8823 +#: gitk:9574 +#, fuzzy, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "" +"コミット %s は既にブランチ %s に含まれています ― 本当にこれを再適用しますか?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "リセット中" + +#: gitk:9587 +#, fuzzy, 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 のいずれかを行ってからやり直してくださ" +"い。" + +#: gitk:9591 +#, fuzzy +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"マージの衝突によってチェリーピックは失敗しました。\n" +"この解決のために git citool を実行したいですか?" + +#: gitk:9634 msgid "Confirm reset" msgstr "確認を取り消す" -#: gitk:8825 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "ブランチ %s を %s にリセットしますか?" -#: gitk:8829 +#: gitk:9638 msgid "Reset type:" msgstr "Reset タイプ:" -#: gitk:8833 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Soft: 作業ツリーもインデックスもそのままにする" -#: gitk:8836 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Mixed: 作業ツリーをそのままにして、インデックスをリセット" -#: gitk:8839 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1032,19 +1111,19 @@ msgstr "" "Hard: 作業ツリーやインデックスをリセット\n" "(「全ての」ローカルな変更を破棄)" -#: gitk:8856 +#: gitk:9664 msgid "Resetting" msgstr "リセット中" -#: gitk:8913 +#: gitk:9724 msgid "Checking out" msgstr "チェックアウト" -#: gitk:8966 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "現在チェックアウトされているブランチを削除することはできません" -#: gitk:8972 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1053,16 +1132,16 @@ msgstr "" "ブランチ %s には他のブランチに存在しないコミットがあります。\n" "本当にブランチ %s を削除しますか?" -#: gitk:9003 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "タグとHEAD: %s" -#: gitk:9018 +#: gitk:9829 msgid "Filter" msgstr "フィルター" -#: gitk:9313 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1070,186 +1149,232 @@ msgstr "" "コミット構造情報読み込みエラー; ブランチ及び上位/下位のタグ情報が不完全である" "ようです。" -#: gitk:10299 +#: gitk:11102 msgid "Tag" msgstr "タグ" -#: gitk:10299 +#: gitk:11106 msgid "Id" msgstr "ID" -#: gitk:10347 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Gitk フォント選択" -#: gitk:10364 +#: gitk:11206 msgid "B" msgstr "B" -#: gitk:10367 +#: gitk:11209 msgid "I" msgstr "I" -#: gitk:10463 -msgid "Gitk preferences" -msgstr "Gitk 設定" - -#: gitk:10465 +#: gitk:11327 msgid "Commit list display options" msgstr "コミットリスト表示オプション" -#: gitk:10468 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "最大グラフ幅(線の本数)" -#: gitk:10472 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "最大グラフ幅(ペインに対する%)" -#: gitk:10476 +#: gitk:11337 msgid "Show local changes" msgstr "ローカルな変更を表示" -#: gitk:10479 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "SHA1 の自動選択" -#: gitk:10483 +#: gitk:11344 +msgid "Hide remote refs" +msgstr "リモートリファレンスを隠す" + +#: gitk:11348 msgid "Diff display options" msgstr "diff表示オプション" -#: gitk:10485 +#: gitk:11350 msgid "Tab spacing" msgstr "タブ空白幅" -#: gitk:10488 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "近くのタグを表示する" -#: gitk:10491 -msgid "Hide remote refs" -msgstr "リモートリファレンスを隠す" +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" -#: gitk:10494 +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "diff をリストのパスに制限" -#: gitk:10497 +#: gitk:11362 msgid "Support per-file encodings" msgstr "ファイルごとのエンコーディングのサポート" -#: gitk:10503 gitk:10572 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "外部diffツール" -#: gitk:10505 +#: gitk:11369 msgid "Choose..." msgstr "選択..." -#: gitk:10510 +#: gitk:11374 +#, fuzzy +msgid "General options" +msgstr "パッチ生成" + +#: gitk:11377 +msgid "Use themed widgets" +msgstr "" + +#: gitk:11379 +msgid "(change requires restart)" +msgstr "" + +#: gitk:11381 +msgid "(currently unavailable)" +msgstr "" + +#: gitk:11392 msgid "Colors: press to choose" msgstr "色: ボタンを押して選択" -#: gitk:10513 +#: gitk:11395 msgid "Interface" msgstr "インターフェイス" -#: gitk:10514 +#: gitk:11396 msgid "interface" msgstr "インターフェイス" -#: gitk:10517 +#: gitk:11399 msgid "Background" msgstr "背景" -#: gitk:10518 gitk:10548 +#: gitk:11400 gitk:11430 msgid "background" msgstr "背景" -#: gitk:10521 +#: gitk:11403 msgid "Foreground" msgstr "前景" -#: gitk:10522 +#: gitk:11404 msgid "foreground" msgstr "前景" -#: gitk:10525 +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff: 旧バージョン" -#: gitk:10526 +#: gitk:11408 msgid "diff old lines" msgstr "diff 旧バージョン" -#: gitk:10530 +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff: 新バージョン" -#: gitk:10531 +#: gitk:11413 msgid "diff new lines" msgstr "diff 新バージョン" -#: gitk:10535 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff: hunkヘッダ" -#: gitk:10537 +#: gitk:11419 msgid "diff hunk header" msgstr "diff hunkヘッダ" -#: gitk:10541 +#: gitk:11423 msgid "Marked line bg" msgstr "マーク行の背景" -#: gitk:10543 +#: gitk:11425 msgid "marked line background" msgstr "マーク行の背景" -#: gitk:10547 +#: gitk:11429 msgid "Select bg" msgstr "選択の背景" -#: gitk:10551 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "フォント: ボタンを押して選択" -#: gitk:10553 +#: gitk:11440 msgid "Main font" msgstr "主フォント" -#: gitk:10554 +#: gitk:11441 msgid "Diff display font" msgstr "Diff表示用フォント" -#: gitk:10555 +#: gitk:11442 msgid "User interface font" msgstr "UI用フォント" -#: gitk:10582 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Gitk 設定" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "生成" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: 「%s」 の色を選択" -#: gitk:11168 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "ここにはgitリポジトリがありません。" -#: gitk:11172 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "gitディレクトリ \"%s\" を見つけられません。" - -#: gitk:11219 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "あいまいな引数 '%s': リビジョンとファイル名の両方に解釈できます" -#: gitk:11231 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "gitkへの不正な引数:" -#: gitk:11316 +#: gitk:12405 msgid "Command line" msgstr "コマンド行" + +#~ 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/pt_br.po b/gitk-git/po/pt_br.po index 1486e3205a..80d24bcad8 100644 --- a/gitk-git/po/pt_br.po +++ b/gitk-git/po/pt_br.po @@ -9,33 +9,42 @@ msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-26 15:47-0800\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2010-12-06 23:39-0200\n" "Last-Translator: Alexandre Erwin Ittner <alexandre@ittner.com.br>\n" "Language-Team: Brazilian Portuguese <>\n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gitk:115 +#: gitk:140 msgid "Couldn't get list of unmerged files:" msgstr "Não foi possível obter a lista dos arquivos não mesclados:" -#: gitk:274 +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" +msgstr "" + +#: gitk:324 msgid "Error parsing revisions:" msgstr "Erro ao interpretar revisões:" -#: gitk:330 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Erro ao executar o comando--argscmd:" -#: gitk:343 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Nenhum arquivo foi selecionado: --merge especificado mas não há arquivos não-" "mesclados." -#: gitk:346 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -43,603 +52,634 @@ msgstr "" "Nenhum arquivo foi selecionado: --merge especificado mas não há arquivos não-" "mesclados dentro dos limites." -#: gitk:368 gitk:516 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Erro ao executar git log:" -#: gitk:386 gitk:532 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Lendo" -#: gitk:446 gitk:4271 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Lendo revisões..." -#: gitk:449 gitk:1580 gitk:4274 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Nenhuma revisão foi selecionada" -#: gitk:1456 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Não foi possível interpretar a saída do \"git log\":" -#: gitk:1676 +#: gitk:1740 msgid "No commit information available" msgstr "Não há informações disponíveis sobre a revisão" -#: gitk:1818 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1853 gitk:4064 gitk:9067 gitk:10607 gitk:10817 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "Ok" -#: gitk:1855 gitk:4066 gitk:8657 gitk:8736 gitk:8851 gitk:8900 gitk:9069 -#: gitk:10608 gitk:10818 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Cancelar" -#: gitk:1980 +#: gitk:2069 msgid "Update" msgstr "Atualizar" -#: gitk:1981 +#: gitk:2070 msgid "Reload" msgstr "Recarregar" -#: gitk:1982 +#: gitk:2071 msgid "Reread references" msgstr "Ler as referências novamente" -#: gitk:1983 +#: gitk:2072 msgid "List references" msgstr "Listar referências" -#: gitk:1985 +#: gitk:2074 msgid "Start git gui" msgstr "Iniciar Git GUI" -#: gitk:1987 +#: gitk:2076 msgid "Quit" msgstr "Sair" -#: gitk:1979 +#: gitk:2068 msgid "File" msgstr "Arquivo" -#: gitk:1991 +#: gitk:2080 msgid "Preferences" msgstr "Preferências" -#: gitk:1990 +#: gitk:2079 msgid "Edit" msgstr "Editar" -#: gitk:1995 +#: gitk:2084 msgid "New view..." msgstr "Nova vista..." -#: gitk:1996 +#: gitk:2085 msgid "Edit view..." msgstr "Editar vista..." -#: gitk:1997 +#: gitk:2086 msgid "Delete view" msgstr "Apagar vista" -#: gitk:1999 +#: gitk:2088 msgid "All files" msgstr "Todos os arquivos" -#: gitk:1994 gitk:3817 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Exibir" -#: gitk:2004 gitk:2014 gitk:2787 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Sobre o gitk" -#: gitk:2005 gitk:2019 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Atalhos de teclado" -#: gitk:2003 gitk:2018 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Ajuda" -#: gitk:2096 gitk:8132 +#: gitk:2185 gitk:8633 msgid "SHA1 ID:" msgstr "SHA1 ID:" -#: gitk:2127 +#: gitk:2229 msgid "Row" msgstr "Linha" -#: gitk:2165 +#: gitk:2267 msgid "Find" msgstr "Encontrar" -#: gitk:2166 -msgid "next" -msgstr "Próximo" - -#: gitk:2167 -msgid "prev" -msgstr "Anterior" - -#: gitk:2168 +#: gitk:2295 msgid "commit" msgstr "Revisão" -#: gitk:2171 gitk:2173 gitk:4432 gitk:4455 gitk:4479 gitk:6420 gitk:6492 -#: gitk:6576 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "contendo:" -#: gitk:2174 gitk:3298 gitk:3303 gitk:4507 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "envolvendo os caminhos:" -#: gitk:2175 gitk:4512 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "Adicionando/removendo texto:" -#: gitk:2184 gitk:2186 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Exatamente" -#: gitk:2186 gitk:4587 gitk:6388 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "Ignorar maiúsculas/minúsculas" -#: gitk:2186 gitk:4481 gitk:4585 gitk:6384 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Expressão regular" -#: gitk:2188 gitk:2189 gitk:4606 gitk:4636 gitk:4643 gitk:6512 gitk:6580 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Todos os campos" -#: gitk:2189 gitk:4604 gitk:4636 gitk:6451 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Assunto" -#: gitk:2190 gitk:4604 gitk:6451 gitk:6580 gitk:7013 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Descrição da revisão" -#: gitk:2190 gitk:4604 gitk:4608 gitk:4643 gitk:6451 gitk:6948 gitk:8307 -#: gitk:8322 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Autor" -#: gitk:2190 gitk:4604 gitk:6451 gitk:6950 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Revisor" -#: gitk:2221 +#: gitk:2350 msgid "Search" msgstr "Buscar" -#: gitk:2229 +#: gitk:2358 msgid "Diff" msgstr "Diferenças" -#: gitk:2231 +#: gitk:2360 msgid "Old version" msgstr "Versão antiga" -#: gitk:2233 +#: gitk:2362 msgid "New version" msgstr "Versão nova" -#: gitk:2235 +#: gitk:2364 msgid "Lines of context" msgstr "Número de linhas de contexto" -#: gitk:2245 +#: gitk:2374 msgid "Ignore space change" msgstr "Ignorar mudanças de caixa" -#: gitk:2304 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Diferenças" -#: gitk:2306 +#: gitk:2447 msgid "Tree" msgstr "Árvore" -#: gitk:2463 gitk:2480 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Comparar esta revisão com a selecionada" -#: gitk:2464 gitk:2481 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Comparar a revisão selecionada com esta" -#: gitk:2465 gitk:2482 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Criar patch" -#: gitk:2466 gitk:8715 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Criar etiqueta" -#: gitk:2467 gitk:8831 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Salvar revisão para um arquivo" -#: gitk:2468 gitk:8888 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Criar novo ramo" -#: gitk:2469 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Fazer cherry-pick desta revisão" -#: gitk:2470 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Redefinir HEAD para cá" -#: gitk:2471 +#: gitk:2624 msgid "Mark this commit" msgstr "Marcar esta revisão" -#: gitk:2472 +#: gitk:2625 msgid "Return to mark" msgstr "Voltar à marca" -#: gitk:2473 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Encontrar descendente e marcar" -#: gitk:2474 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Comparar com a revisão marcada" -#: gitk:2488 +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Comparar esta revisão com a selecionada" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Comparar a revisão selecionada com esta" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Marcar esta revisão" + +#: gitk:2646 msgid "Check out this branch" msgstr "Efetuar checkout deste ramo" -#: gitk:2489 +#: gitk:2647 msgid "Remove this branch" msgstr "Excluir este ramo" -#: gitk:2496 +#: gitk:2654 msgid "Highlight this too" msgstr "Marcar este também" -#: gitk:2497 +#: gitk:2655 msgid "Highlight this only" msgstr "Marcar apenas este" -#: gitk:2498 +#: gitk:2656 msgid "External diff" msgstr "Diff externo" -#: gitk:2499 +#: gitk:2657 msgid "Blame parent commit" msgstr "Anotar revisão anterior" -#: gitk:2506 +#: gitk:2664 msgid "Show origin of this line" msgstr "Exibir origem desta linha" -#: gitk:2507 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Executar 'git blame' nesta linha" -#: gitk:2789 -msgid "\n" +#: gitk:3011 +#, fuzzy +msgid "" +"\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright ©9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" -msgstr "\n" +msgstr "" +"\n" "Gitk - um visualizador de revisões para o git \n" "\n" "Copyright ©9 2005-2010 Paul Mackerras\n" "\n" "Uso e distribuição segundo os termos da Licença Pública Geral GNU" -#: gitk:2797 gitk:2862 gitk:9253 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Fechar" -#: gitk:2818 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Atalhos de teclado" -#: gitk:2821 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Atalhos de teclado:" -#: gitk:2823 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tSair" -#: gitk:2824 +#: gitk:3046 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tFechar janela" -#: gitk:2825 +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tIr para a primeira revisão" -#: gitk:2826 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tIr para a última revisão" -#: gitk:2827 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, i\tIr para uma revisão acima" -#: gitk:2828 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, k\tIr para uma revisão abaixo" -#: gitk:2829 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, j\tVoltar no histórico" -#: gitk:2830 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\tAvançar no histórico" -#: gitk:2831 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tSubir uma página na lista de revisões" -#: gitk:2832 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tDescer uma página na lista de revisões" -#: gitk:2833 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tRolar para o início da lista de revisões" -#: gitk:2834 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tRolar para o final da lista de revisões" -#: gitk:2835 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tRolar uma linha acima na lista de revisões" -#: gitk:2836 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tRolar uma linha abaixo na lista de revisões" -#: gitk:2837 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tRolar uma página acima na lista de revisões" -#: gitk:2838 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tRolar uma página abaixo na lista de revisões" -#: gitk:2839 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Up>\tProcurar próxima (revisões mas recentes)" -#: gitk:2840 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Shift-Down>\tProcurar anterior (revisões mais antigas)" -#: gitk:2841 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tRola alterações uma página acima" -#: gitk:2842 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tRolar alterações uma página abaixo" -#: gitk:2843 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Space>\t\tRolar alterações uma página abaixo" -#: gitk:2844 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tRolar alterações 18 linhas acima" -#: gitk:2845 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tRolar alterações 18 linhas abaixo" -#: gitk:2846 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tProcurar" -#: gitk:2847 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tIr para a próxima ocorrência" -#: gitk:2848 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\tIr para a próxima ocorrência" -#: gitk:2849 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tPor foco na caixa de busca" -#: gitk:2850 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tIr para a ocorrência anterior" -#: gitk:2851 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tRolar alterações para o próximo arquivo" -#: gitk:2852 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tProcurar a próxima ocorrência na lista de alterações" -#: gitk:2853 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tProcurar ocorrência anterior na lista de alterações" -#: gitk:2854 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tAumentar tamanho da fonte" -#: gitk:2855 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tAumentar tamanho da fonte" -#: gitk:2856 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tReduzir tamanho da fonte" -#: gitk:2857 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tReduzir tamanho da fonte" -#: gitk:2858 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tAtualizar" -#: gitk:3313 gitk:3322 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Erro ao criar o diretório temporário %s:" -#: gitk:3335 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Erro ao ler \"%s\" de %s:" -#: gitk:3398 +#: gitk:3631 msgid "command failed:" msgstr "O comando falhou:" -#: gitk:3547 +#: gitk:3780 msgid "No such commit" msgstr "Revisão não encontrada" -#: gitk:3561 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "Comando 'git gui blame' falhou:" -#: gitk:3592 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Impossível ler merge head: %s" -#: gitk:3600 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Erro ao ler o índice: %s" -#: gitk:3625 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Não foi possível inciar o 'git blame': %s" -#: gitk:3628 gitk:6419 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Procurando" -#: gitk:3660 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Erro ao executar 'git blame': %s" -#: gitk:3688 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Esta linha vem da revisão %s, que não está nesta vista" -#: gitk:3702 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Erro do visualizador de alterações externo:" -#: gitk:3820 +#: gitk:4053 msgid "Gitk view definition" msgstr "Definir vista" -#: gitk:3824 +#: gitk:4057 msgid "Remember this view" msgstr "Lembrar esta vista" -#: gitk:3825 +#: gitk:4058 msgid "References (space separated list):" msgstr "Referências (separar a lista com um espaço):" -#: gitk:3826 +#: gitk:4059 msgid "Branches & tags:" msgstr "Ramos & etiquetas:" -#: gitk:3827 +#: gitk:4060 msgid "All refs" msgstr "Todas as referências" -#: gitk:3828 +#: gitk:4061 msgid "All (local) branches" msgstr "Todos os ramos locais" -#: gitk:3829 +#: gitk:4062 msgid "All tags" msgstr "Todas as etiquetas" -#: gitk:3830 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Todos os ramos de rastreio" -#: gitk:3831 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Informações da revisão (expressões regulares):" -#: gitk:3832 +#: gitk:4065 msgid "Author:" msgstr "Autor:" -#: gitk:3833 +#: gitk:4066 msgid "Committer:" msgstr "Revisor:" -#: gitk:3834 +#: gitk:4067 msgid "Commit Message:" msgstr "Descrição da revisão:" -#: gitk:3835 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Coincidir todos os critérios de informações da revisão" -#: gitk:3836 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Coincidir todos os critérios de informações da revisão" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Mudanças para os arquivos:" -#: gitk:3837 +#: gitk:4071 msgid "Fixed String" msgstr "Texto fixo" -#: gitk:3838 +#: gitk:4072 msgid "Regular Expression" msgstr "Expressão regular" -#: gitk:3839 +#: gitk:4073 msgid "Search string:" msgstr "Texto de busca" -#: gitk:3840 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -647,201 +687,201 @@ msgstr "" "Datas de revisão (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:3841 +#: gitk:4075 msgid "Since:" msgstr "Desde:" -#: gitk:3842 +#: gitk:4076 msgid "Until:" msgstr "Até:" -#: gitk:3843 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Limitar e/ou ignorar um número de revisões (inteiro positivo):" -#: gitk:3844 +#: gitk:4078 msgid "Number to show:" msgstr "Número para mostrar:" -#: gitk:3845 +#: gitk:4079 msgid "Number to skip:" msgstr "Número para ignorar:" -#: gitk:3846 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Opções diversas:" -#: gitk:3847 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Ordenar estritamente pela data" -#: gitk:3848 +#: gitk:4082 msgid "Mark branch sides" msgstr "Marcar os dois lados do ramo" -#: gitk:3849 +#: gitk:4083 msgid "Limit to first parent" msgstr "Limitar ao primeiro antecessor" -#: gitk:3850 +#: gitk:4084 msgid "Simple history" msgstr "Histórico simplificado" -#: gitk:3851 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Argumentos adicionais para o 'git log':" -#: gitk:3852 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Arquivos e diretórios para incluir, um por linha" -#: gitk:3853 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Comando para gerar mais revisões para incluir:" -#: gitk:3977 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: editar vista" -#: gitk:3985 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "-- critérios para selecionar revisões" -#: gitk:3990 +#: gitk:4224 msgid "View Name" msgstr "Nome da vista" -#: gitk:4065 +#: gitk:4299 msgid "Apply (F5)" msgstr "Aplicar (F5)" -#: gitk:4103 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Erro nos argumentos de seleção de revisões:" -#: gitk:4156 gitk:4208 gitk:4656 gitk:4670 gitk:5931 gitk:11551 gitk:11552 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Nenhum" -#: gitk:4604 gitk:6451 gitk:8309 gitk:8324 -msgid "Date" -msgstr "Data" - -#: gitk:4604 gitk:6451 -msgid "CDate" -msgstr "DataR" - -#: gitk:4753 gitk:4758 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Descendente de" -#: gitk:4754 +#: gitk:5004 msgid "Not descendant" msgstr "Não descendente de" -#: gitk:4761 gitk:4766 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Antecessor de" -#: gitk:4762 +#: gitk:5012 msgid "Not ancestor" msgstr "Não antecessor de" -#: gitk:5052 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Mudanças locais marcadas, porém não salvas" -#: gitk:5088 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Mudanças locais não marcadas" -#: gitk:6769 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 msgid "many" msgstr "muitas" -#: gitk:6952 +#: gitk:7309 msgid "Tags:" msgstr "Etiquetas:" -#: gitk:6969 gitk:6975 gitk:8302 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Antecessor" -#: gitk:6980 +#: gitk:7337 msgid "Child" msgstr "Descendente" -#: gitk:6989 +#: gitk:7346 msgid "Branch" msgstr "Ramo" -#: gitk:6992 +#: gitk:7349 msgid "Follows" msgstr "Segue" -#: gitk:6995 +#: gitk:7352 msgid "Precedes" msgstr "Precede" -#: gitk:7532 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Erro ao obter diferenças: %s" -#: gitk:8130 +#: gitk:8631 msgid "Goto:" msgstr "Ir para:" -#: gitk:8151 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "O id SHA1 %s é ambíguo" -#: gitk:8158 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "Revisão %s desconhecida" -#: gitk:8168 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "Id SHA1 %s desconhecido" -#: gitk:8170 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "A revisão %s não está na vista atual" -#: gitk:8312 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Data" + +#: gitk:8816 msgid "Children" msgstr "Descendentes" -#: gitk:8370 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Redefinir ramo %s para este ponto" -#: gitk:8372 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Detached head: impossível redefinir" -#: gitk:8481 gitk:8487 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Saltando revisão de mesclagem" -#: gitk:8496 gitk:8501 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Erro ao obter patch ID para" -#: gitk:8497 gitk:8502 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr "- parando\n" -#: gitk:8507 gitk:8510 gitk:8518 gitk:8532 gitk:8541 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Revisão" -#: gitk:8511 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -849,13 +889,13 @@ msgstr "" "é o mesmo patch que\n" " " -#: gitk:8519 +#: gitk:9024 msgid "" " differs from\n" " " msgstr "difere de" -#: gitk:8521 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -863,129 +903,129 @@ msgstr "" "Diferença de revisões:\n" "\n" -#: gitk:8533 gitk:8542 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr "possui %s descendentes - parando\n" -#: gitk:8561 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Erro ao salvar revisão para o arquivo: %s" -#: gitk:8567 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "Erro ao comparar revisões: %s" -#: gitk:8598 +#: gitk:9118 msgid "Top" msgstr "Início" -#: gitk:8599 +#: gitk:9119 msgid "From" msgstr "De" -#: gitk:8604 +#: gitk:9124 msgid "To" msgstr "Para" -#: gitk:8628 +#: gitk:9148 msgid "Generate patch" msgstr "Gerar patch" -#: gitk:8630 +#: gitk:9150 msgid "From:" msgstr "De:" -#: gitk:8639 +#: gitk:9159 msgid "To:" msgstr "Para:" -#: gitk:8648 +#: gitk:9168 msgid "Reverse" msgstr "Inverter" -#: gitk:8650 gitk:8845 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Arquivo de saída:" -#: gitk:8656 +#: gitk:9176 msgid "Generate" msgstr "Gerar" -#: gitk:8694 +#: gitk:9214 msgid "Error creating patch:" msgstr "Erro ao criar patch:" -#: gitk:8717 gitk:8833 gitk:8890 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:8726 +#: gitk:9246 msgid "Tag name:" msgstr "Nome da etiqueta:" -#: gitk:8729 +#: gitk:9249 msgid "Tag message is optional" msgstr "A descrição da etiqueta é opcional" -#: gitk:8731 +#: gitk:9251 msgid "Tag message:" msgstr "Descrição da etiqueta" -#: gitk:8735 gitk:8899 +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Criar" -#: gitk:8753 +#: gitk:9273 msgid "No tag name specified" msgstr "Nome da etiqueta não indicado" -#: gitk:8757 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Etiqueta \"%s\" já existe" -#: gitk:8767 +#: gitk:9287 msgid "Error creating tag:" msgstr "Erro ao criar etiqueta:" -#: gitk:8842 +#: gitk:9363 msgid "Command:" msgstr "Comando:" -#: gitk:8850 +#: gitk:9371 msgid "Write" msgstr "Exportar" -#: gitk:8868 +#: gitk:9389 msgid "Error writing commit:" msgstr "Erro ao exportar revisão" -#: gitk:8895 +#: gitk:9416 msgid "Name:" msgstr "Nome:" -#: gitk:8918 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Indique um nome para o novo ramo" -#: gitk:8923 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "O ramo \"%s\" já existe. Sobrescrever?" -#: gitk:8989 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "Revisão %s já inclusa no ramo %s -- você realmente deseja reaplicá-la?" -#: gitk:8994 +#: gitk:9516 msgid "Cherry-picking" msgstr "Cherry-picking" -#: gitk:9003 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -995,7 +1035,7 @@ msgstr "" "Salve a uma revisão, redefina ou armazene (stash) suas mudanças e tente " "novamente." -#: gitk:9009 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1003,32 +1043,61 @@ msgstr "" "O cherry-pick falhou porque houve um conflito na mesclagem.\n" "Executar o 'git citool' para resolvê-lo?" -#: gitk:9025 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Nenhuma revisão foi salva" -#: gitk:9051 +#: gitk:9574 +#, fuzzy, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "Revisão %s já inclusa no ramo %s -- você realmente deseja reaplicá-la?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "Redefinindo" + +#: gitk:9587 +#, fuzzy, 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 "" +"O cherry-pick falhou porque o arquivo \"%s\" possui mudanças locais.\n" +"Salve a uma revisão, redefina ou armazene (stash) suas mudanças e tente " +"novamente." + +#: gitk:9591 +#, fuzzy +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"O cherry-pick falhou porque houve um conflito na mesclagem.\n" +"Executar o 'git citool' para resolvê-lo?" + +#: gitk:9634 msgid "Confirm reset" msgstr "Confirmar redefinição" -#: gitk:9053 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Você realmente deseja redefinir o ramo %s para %s?" -#: gitk:9055 +#: gitk:9638 msgid "Reset type:" msgstr "Tipo de redefinição" -#: gitk:9058 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Soft: deixa a árvore de trabalho e o índice intocados" -#: gitk:9061 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Misto: Deixa a árvore de trabalho intocada, redefine o índice" -#: gitk:9064 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1036,19 +1105,19 @@ msgstr "" "Hard: Redefine a árvore de trabalho e o índice\n" "(descarta TODAS as mudanças locais)" -#: gitk:9081 +#: gitk:9664 msgid "Resetting" msgstr "Redefinindo" -#: gitk:9141 +#: gitk:9724 msgid "Checking out" msgstr "Abrindo" -#: gitk:9194 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Impossível excluir o ramo atualmente aberto" -#: gitk:9200 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1057,16 +1126,16 @@ msgstr "" "As revisões do ramo \"%s\" não existem em nenhum outro ramo.\n" "Você realmente deseja excluir ramo \"%s\"?" -#: gitk:9231 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Referências: %s" -#: gitk:9246 +#: gitk:9829 msgid "Filter" msgstr "Filtro" -#: gitk:9541 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1074,204 +1143,230 @@ msgstr "" "Erro ao ler a topologia das revisões; as informações dos ramos e etiquetas " "antecessoras/sucessoras estarão incompletas" -#: gitk:10527 +#: gitk:11102 msgid "Tag" msgstr "Etiqueta" -#: gitk:10527 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:10576 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Selecionar fontes do Gitk" -#: gitk:10593 +#: gitk:11206 msgid "B" msgstr "B" -#: gitk:10596 +#: gitk:11209 msgid "I" msgstr "I" -#: gitk:10714 -msgid "Gitk preferences" -msgstr "Preferências do Gitk" - -#: gitk:10716 +#: gitk:11327 msgid "Commit list display options" msgstr "Opções da lista de revisões" -#: gitk:10719 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Largura máxima do grafo (linhas)" -#: gitk:10722 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Largura máxima do grafo (% do painel)" -#: gitk:10725 +#: gitk:11337 msgid "Show local changes" msgstr "Exibir mudanças locais" -#: gitk:10728 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "Selecionar o SHA1 automaticamente" -#: gitk:10731 +#: gitk:11344 msgid "Hide remote refs" msgstr "Ocultar referências remotas" -#: gitk:10735 +#: gitk:11348 msgid "Diff display options" msgstr "Opções de exibição das alterações" -#: gitk:10737 +#: gitk:11350 msgid "Tab spacing" msgstr "Espaços por tabulação" -#: gitk:10740 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Exibir etiquetas próximas" -#: gitk:10743 +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" + +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Limitar diferenças aos caminhos listados" -#: gitk:10746 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Usar codificações distintas por arquivo" -#: gitk:10752 gitk:10832 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Ferramenta 'diff' externa" -#: gitk:10753 +#: gitk:11369 msgid "Choose..." msgstr "Selecionar..." -#: gitk:10758 +#: gitk:11374 msgid "General options" msgstr "Opções gerais" -#: gitk:10761 +#: gitk:11377 msgid "Use themed widgets" msgstr "Usar temas para as janelas" -#: gitk:10763 +#: gitk:11379 msgid "(change requires restart)" msgstr "(exige reinicialização)" -#: gitk:10765 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(atualmente indisponível)" -#: gitk:10769 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Cores: clique para escolher" -#: gitk:10772 +#: gitk:11395 msgid "Interface" msgstr "Interface" -#: gitk:10773 +#: gitk:11396 msgid "interface" msgstr "interface" -#: gitk:10776 +#: gitk:11399 msgid "Background" msgstr "Segundo plano" -#: gitk:10777 gitk:10807 +#: gitk:11400 gitk:11430 msgid "background" msgstr "segundo plano" -#: gitk:10780 +#: gitk:11403 msgid "Foreground" msgstr "Primeiro plano" -#: gitk:10781 +#: gitk:11404 msgid "foreground" msgstr "primeiro plano" -#: gitk:10784 +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff: linhas excluídas" -#: gitk:10785 +#: gitk:11408 msgid "diff old lines" msgstr "linhas excluídas" -#: gitk:10789 +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff: linhas adicionadas" -#: gitk:10790 +#: gitk:11413 msgid "diff new lines" msgstr "linhas adicionadas" -#: gitk:10794 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff: cabeçalho do bloco" -#: gitk:10796 +#: gitk:11419 msgid "diff hunk header" msgstr "cabeçalho do bloco" -#: gitk:10800 +#: gitk:11423 msgid "Marked line bg" msgstr "2º plano da linha marcada" -#: gitk:10802 +#: gitk:11425 msgid "marked line background" msgstr "segundo plano da linha marcada" -#: gitk:10806 +#: gitk:11429 msgid "Select bg" msgstr "2º plano da seleção" -#: gitk:10810 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Fontes: clique para escolher" -#: gitk:10812 +#: gitk:11440 msgid "Main font" msgstr "Fonte principal" -#: gitk:10813 +#: gitk:11441 msgid "Diff display font" msgstr "Fonte da lista de mudanças" -#: gitk:10814 +#: gitk:11442 msgid "User interface font" msgstr "Fonte da interface" -#: gitk:10842 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Preferências do Gitk" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Gerar" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: selecionar cor para %s" -#: gitk:11445 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Não há nenhum repositório git aqui." -#: gitk:11449 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "Impossível encontrar o diretório git \"%s\"." - -#: gitk:11496 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "" "O argumento \"%s\" é ambíguo (especifica tanto uma revisão e um nome de " "arquivo)" -#: gitk:11508 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Argumentos incorretos para o gitk:" -#: gitk:11604 +#: gitk:12405 msgid "Command line" msgstr "Linha de comando" + +#~ msgid "next" +#~ msgstr "Próximo" + +#~ msgid "prev" +#~ msgstr "Anterior" + +#~ msgid "CDate" +#~ msgstr "DataR" + +#~ msgid "Cannot find the git directory \"%s\"." +#~ msgstr "Impossível encontrar o diretório git \"%s\"." diff --git a/gitk-git/po/ru.po b/gitk-git/po/ru.po index 59873033af..faba6721c1 100644 --- a/gitk-git/po/ru.po +++ b/gitk-git/po/ru.po @@ -5,315 +5,359 @@ msgid "" msgstr "" "Project-Id-Version: gitk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-04-24 16:00+0200\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2009-04-24 16:00+0200\n" "Last-Translator: Alex Riesen <raa.lkml@gmail.com>\n" "Language-Team: Russian\n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: gitk:113 +#: gitk:140 msgid "Couldn't get list of unmerged files:" +msgstr "Невозможно получить список файлов незавершённой операции слияния:" + +#: gitk:212 gitk:2381 +msgid "Color words" +msgstr "" + +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 +msgid "Markup words" msgstr "" -"Невозможно получить список файлов незавершённой операции слияния:" -#: gitk:268 +#: gitk:324 msgid "Error parsing revisions:" msgstr "Ошибка в идентификаторе версии:" -#: gitk:323 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Ошибка выполнения команды заданной --argscmd:" -#: gitk:336 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" -"Файлы не выбраны: указан --merge, но не было найдено ни одного файла " -"где эта операция должна быть завершена." +"Файлы не выбраны: указан --merge, но не было найдено ни одного файла где эта " +"операция должна быть завершена." -#: gitk:339 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." msgstr "" -"Файлы не выбраны: указан --merge, но в рамках указанного " -"ограничения на имена файлов нет ни одного " -"где эта операция должна быть завершена." +"Файлы не выбраны: указан --merge, но в рамках указанного ограничения на " +"имена файлов нет ни одного где эта операция должна быть завершена." -#: gitk:361 gitk:508 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Ошибка запуска git log:" -#: gitk:379 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Чтение" -#: gitk:439 gitk:4021 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Чтение версий..." -#: gitk:442 gitk:1560 gitk:4024 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Ничего не выбрано" -#: gitk:1436 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Ошибка обработки вывода команды git log:" -#: gitk:1656 +#: gitk:1740 msgid "No commit information available" msgstr "Нет информации о состоянии" -#: gitk:1791 gitk:1815 gitk:3814 gitk:8478 gitk:10014 gitk:10186 +#: gitk:1897 +msgid "mc" +msgstr "" + +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "Ok" -#: gitk:1817 gitk:3816 gitk:8078 gitk:8152 gitk:8259 gitk:8308 gitk:8480 -#: gitk:10015 gitk:10187 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Отмена" -#: gitk:1915 +#: gitk:2069 msgid "Update" msgstr "Обновить" -#: gitk:1916 +#: gitk:2070 msgid "Reload" msgstr "Перечитать" -#: gitk:1917 +#: gitk:2071 msgid "Reread references" msgstr "Обновить список ссылок" -#: gitk:1918 +#: gitk:2072 msgid "List references" msgstr "Список ссылок" -#: gitk:1920 +#: gitk:2074 msgid "Start git gui" msgstr "Запустить git gui" -#: gitk:1922 +#: gitk:2076 msgid "Quit" msgstr "Завершить" -#: gitk:1914 +#: gitk:2068 msgid "File" msgstr "Файл" -#: gitk:1925 +#: gitk:2080 msgid "Preferences" msgstr "Настройки" -#: gitk:1924 +#: gitk:2079 msgid "Edit" msgstr "Редактировать" -#: gitk:1928 +#: gitk:2084 msgid "New view..." msgstr "Новое представление..." -#: gitk:1929 +#: gitk:2085 msgid "Edit view..." msgstr "Редактировать представление..." -#: gitk:1930 +#: gitk:2086 msgid "Delete view" msgstr "Удалить представление" -#: gitk:1932 +#: gitk:2088 msgid "All files" msgstr "Все файлы" -#: gitk:1927 gitk:3626 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Представление" -#: gitk:1935 gitk:2609 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "О gitk" -#: gitk:1936 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Назначения клавиатуры" -#: gitk:1934 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Подсказка" -#: gitk:1994 -msgid "SHA1 ID: " -msgstr "SHA1:" +#: gitk:2185 gitk:8633 +msgid "SHA1 ID:" +msgstr "SHA1 ID:" -#: gitk:2025 +#: gitk:2229 msgid "Row" msgstr "Строка" -#: gitk:2056 +#: gitk:2267 msgid "Find" msgstr "Поиск" -#: gitk:2057 -msgid "next" -msgstr "След." - -#: gitk:2058 -msgid "prev" -msgstr "Пред." - -#: gitk:2059 +#: gitk:2295 msgid "commit" msgstr "состояние" -#: gitk:2062 gitk:2064 gitk:4179 gitk:4202 gitk:4226 gitk:6164 gitk:6236 -#: gitk:6320 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "содержащее:" -#: gitk:2065 gitk:3117 gitk:3122 gitk:4254 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "касательно файлов:" -#: gitk:2066 gitk:4259 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "добавив/удалив строку:" -#: gitk:2075 gitk:2077 +#: gitk:2304 gitk:4761 +msgid "changing lines matching:" +msgstr "" + +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Точно" -#: gitk:2077 gitk:4334 gitk:6132 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "Игнорировать большие/маленькие" -#: gitk:2077 gitk:4228 gitk:4332 gitk:6128 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Регулярные выражения" -#: gitk:2079 gitk:2080 gitk:4353 gitk:4383 gitk:4390 gitk:6256 gitk:6324 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Во всех полях" -#: gitk:2080 gitk:4351 gitk:4383 gitk:6195 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Заголовок" -#: gitk:2081 gitk:4351 gitk:6195 gitk:6324 gitk:6737 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Комментарии" -#: gitk:2081 gitk:4351 gitk:4355 gitk:4390 gitk:6195 gitk:6672 gitk:7923 -#: gitk:7938 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Автор" -#: gitk:2081 gitk:4351 gitk:6195 gitk:6674 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Сохранивший состояние" -#: gitk:2110 +#: gitk:2350 msgid "Search" msgstr "Найти" -#: gitk:2117 +#: gitk:2358 msgid "Diff" msgstr "Сравнить" -#: gitk:2119 +#: gitk:2360 msgid "Old version" msgstr "Старая версия" -#: gitk:2121 +#: gitk:2362 msgid "New version" msgstr "Новая версия" -#: gitk:2123 +#: gitk:2364 msgid "Lines of context" msgstr "Строк контекста" -#: gitk:2133 +#: gitk:2374 msgid "Ignore space change" msgstr "Игнорировать пробелы" -#: gitk:2191 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 +msgid "Line diff" +msgstr "" + +#: gitk:2445 msgid "Patch" msgstr "Патч" -#: gitk:2193 +#: gitk:2447 msgid "Tree" msgstr "Файлы" -#: gitk:2326 gitk:2339 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Сравнить это состояние с выделенным" -#: gitk:2327 gitk:2340 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Сравнить выделенное с этим состоянием" -#: gitk:2328 gitk:2341 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Создать патч" -#: gitk:2329 gitk:8136 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Создать метку" -#: gitk:2330 gitk:8239 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Сохранить изменения в файл" -#: gitk:2331 gitk:8296 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Создать ветвь" -#: gitk:2332 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Скопировать это состояние" -#: gitk:2333 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Установить HEAD на это состояние" -#: gitk:2347 +#: gitk:2624 +#, fuzzy +msgid "Mark this commit" +msgstr "Скопировать это состояние" + +#: gitk:2625 +msgid "Return to mark" +msgstr "" + +#: gitk:2626 +msgid "Find descendant of this and mark" +msgstr "" + +#: gitk:2627 +msgid "Compare with marked commit" +msgstr "" + +#: gitk:2628 gitk:2639 +#, fuzzy +msgid "Diff this -> marked commit" +msgstr "Сравнить это состояние с выделенным" + +#: gitk:2629 gitk:2640 +#, fuzzy +msgid "Diff marked commit -> this" +msgstr "Сравнить выделенное с этим состоянием" + +#: gitk:2630 +#, fuzzy +msgid "Revert this commit" +msgstr "Скопировать это состояние" + +#: gitk:2646 msgid "Check out this branch" msgstr "Перейти на эту ветвь" -#: gitk:2348 +#: gitk:2647 msgid "Remove this branch" msgstr "Удалить эту ветвь" -#: gitk:2355 +#: gitk:2654 msgid "Highlight this too" msgstr "Подсветить этот тоже" -#: gitk:2356 +#: gitk:2655 msgid "Highlight this only" msgstr "Подсветить только этот" -#: gitk:2357 +#: gitk:2656 msgid "External diff" msgstr "Программа сравнения" -#: gitk:2358 +#: gitk:2657 msgid "Blame parent commit" msgstr "Аннотировать родительское состояние" -#: gitk:2365 +#: gitk:2664 msgid "Show origin of this line" msgstr "Показать источник этой строки" -#: gitk:2366 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Запустить git gui blame для этой строки" -#: gitk:2611 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright \\u00a9 2005-2010 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -324,497 +368,667 @@ msgstr "" "\n" "Использование и распространение согласно условиям GNU General Public License" -#: gitk:2619 gitk:2681 gitk:8661 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Закрыть" -#: gitk:2638 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Назначения клавиатуры в Gitk" -#: gitk:2641 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Назначения клавиатуры в Gitk:" -#: gitk:2643 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tЗавершить" -#: gitk:2644 +#: gitk:3046 +#, fuzzy, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-F>\t\tПоиск" + +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tПерейти к первому состоянию" -#: gitk:2645 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tПерейти к последнему состоянию" -#: gitk:2646 -msgid "<Up>, p, i\tMove up one commit" +#: gitk:3049 +#, fuzzy +msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, i\tПерейти к следующему состоянию" -#: gitk:2647 -msgid "<Down>, n, k\tMove down one commit" +#: gitk:3050 +#, fuzzy +msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, k\tПерейти к предыдущему состоянию" -#: gitk:2648 -msgid "<Left>, z, j\tGo back in history list" +#: gitk:3051 +#, fuzzy +msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, j\tПоказать ранее посещённое состояние" -#: gitk:2649 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\tПоказать следующее посещённое состояние" -#: gitk:2650 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tПерейти на страницу выше в списке состояний" -#: gitk:2651 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tПерейти на страницу ниже в списке состояний" -#: gitk:2652 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tПоказать начало списка состояний" -#: gitk:2653 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tПоказать конец списка состояний" -#: gitk:2654 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tПровернуть список состояний вверх" -#: gitk:2655 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tПровернуть список состояний вниз" -#: gitk:2656 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tПровернуть список состояний на страницу вверх" -#: gitk:2657 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tПровернуть список состояний на страницу вниз" -#: gitk:2658 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" -msgstr "" -"<Shift-Up>\tПоиск в обратном порядке (вверх, среди новых состояний)" +msgstr "<Shift-Up>\tПоиск в обратном порядке (вверх, среди новых состояний)" -#: gitk:2659 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Shift-Down>\tПоиск (вниз, среди старых состояний)" -#: gitk:2660 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tПрокрутить список изменений на страницу выше" -#: gitk:2661 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tПрокрутить список изменений на страницу выше" -#: gitk:2662 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Leertaste>\t\tПрокрутить список изменений на страницу ниже" -#: gitk:2663 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tПрокрутить список изменений на 18 строк вверх" -#: gitk:2664 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tПрокрутить список изменений на 18 строк вниз" -#: gitk:2665 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tПоиск" -#: gitk:2666 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tПерейти к следующему найденному состоянию" -#: gitk:2667 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\tПерейти к следующему найденному состоянию" -#: gitk:2668 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tПерейти к полю поиска" -#: gitk:2669 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tПерейти к предыдущему найденному состоянию" -#: gitk:2670 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tПрокрутить список изменений к следующему файлу" -#: gitk:2671 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tПродолжить поиск в списке изменений" -#: gitk:2672 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tПерейти к предыдущему найденному тексту в списке изменений" -#: gitk:2673 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tУвеличить размер шрифта" -#: gitk:2674 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tУвеличить размер шрифта" -#: gitk:2675 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tУменьшить размер шрифта" -#: gitk:2676 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tУменьшить размер шрифта" -#: gitk:2677 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tОбновить" -#: gitk:3132 -#, tcl-format -msgid "Error getting \"%s\" from %s:" -msgstr "Ошибка получения \"%s\" из %s:" - -#: gitk:3189 gitk:3198 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Ошибка создания временного каталога %s:" -#: gitk:3211 +#: gitk:3568 +#, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "Ошибка получения \"%s\" из %s:" + +#: gitk:3631 msgid "command failed:" msgstr "ошибка выполнения команды:" -#: gitk:3357 +#: gitk:3780 msgid "No such commit" msgstr "Состояние не найдено" -#: gitk:3371 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: ошибка выполнения команды:" -#: gitk:3402 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Ошибка чтения MERGE_HEAD: %s" -#: gitk:3410 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Ошибка чтения индекса: %s" -#: gitk:3435 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Ошибка запуска git blame: %s" -#: gitk:3438 gitk:6163 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Поиск" -#: gitk:3470 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Ошибка выполнения git blame: %s" -#: gitk:3498 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "" -"Эта строка принадлежит состоянию %s, которое не показано в этом " -"представлении" +"Эта строка принадлежит состоянию %s, которое не показано в этом представлении" -#: gitk:3512 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Ошибка выполнения программы сравнения:" -#: gitk:3630 +#: gitk:4053 msgid "Gitk view definition" msgstr "Gitk определение представлений" -#: gitk:3634 +#: gitk:4057 msgid "Remember this view" msgstr "Запомнить представление" -#: gitk:3635 -msgid "Commits to include (arguments to git log):" -msgstr "Включить состояния (аргументы для git-log):" +#: gitk:4058 +msgid "References (space separated list):" +msgstr "" + +#: gitk:4059 +msgid "Branches & tags:" +msgstr "" -#: gitk:3636 -msgid "Use all refs" -msgstr "Использовать все ветви" +#: gitk:4060 +#, fuzzy +msgid "All refs" +msgstr "Все файлы" -#: gitk:3637 -msgid "Strictly sort by date" -msgstr "Строгая сортировка по дате" +#: gitk:4061 +msgid "All (local) branches" +msgstr "" -#: gitk:3638 -msgid "Mark branch sides" -msgstr "Отметить стороны ветвей" +#: gitk:4062 +msgid "All tags" +msgstr "" + +#: gitk:4063 +msgid "All remote-tracking branches" +msgstr "" + +#: gitk:4064 +msgid "Commit Info (regular expressions):" +msgstr "" + +#: gitk:4065 +#, fuzzy +msgid "Author:" +msgstr "Автор" + +#: gitk:4066 +#, fuzzy +msgid "Committer:" +msgstr "Сохранивший состояние" + +#: gitk:4067 +msgid "Commit Message:" +msgstr "" + +#: gitk:4068 +msgid "Matches all Commit Info criteria" +msgstr "" + +#: gitk:4069 +msgid "Matches none Commit Info criteria" +msgstr "" + +#: gitk:4070 +msgid "Changes to Files:" +msgstr "" + +#: gitk:4071 +msgid "Fixed String" +msgstr "" + +#: gitk:4072 +msgid "Regular Expression" +msgstr "" -#: gitk:3639 -msgid "Since date:" +#: gitk:4073 +#, fuzzy +msgid "Search string:" +msgstr "Поиск" + +#: gitk:4074 +msgid "" +"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " +"15:27:38\"):" +msgstr "" + +#: gitk:4075 +#, fuzzy +msgid "Since:" msgstr "С даты:" -#: gitk:3640 -msgid "Until date:" +#: gitk:4076 +#, fuzzy +msgid "Until:" msgstr "По дату:" -#: gitk:3641 -msgid "Max count:" -msgstr "Макс. количество:" +#: gitk:4077 +msgid "Limit and/or skip a number of revisions (positive integer):" +msgstr "" + +#: gitk:4078 +msgid "Number to show:" +msgstr "" + +#: gitk:4079 +msgid "Number to skip:" +msgstr "" + +#: gitk:4080 +msgid "Miscellaneous options:" +msgstr "" + +#: gitk:4081 +msgid "Strictly sort by date" +msgstr "Строгая сортировка по дате" -#: gitk:3642 -msgid "Skip:" -msgstr "Пропустить:" +#: gitk:4082 +msgid "Mark branch sides" +msgstr "Отметить стороны ветвей" -#: gitk:3643 +#: gitk:4083 msgid "Limit to first parent" msgstr "Ограничить первым предком" -#: gitk:3644 -msgid "Command to generate more commits to include:" -msgstr "Дополнительная команда для списка состояний:" +#: gitk:4084 +msgid "Simple history" +msgstr "" -#: gitk:3753 -msgid "Name" -msgstr "Имя" +#: gitk:4085 +#, fuzzy +msgid "Additional arguments to git log:" +msgstr "Включить состояния (аргументы для git-log):" -#: gitk:3801 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Файлы и каталоги для ограничения истории, по одному на строку:" -#: gitk:3815 +#: gitk:4087 +msgid "Command to generate more commits to include:" +msgstr "Дополнительная команда для списка состояний:" + +#: gitk:4211 +msgid "Gitk: edit view" +msgstr "" + +#: gitk:4219 +#, fuzzy +msgid "-- criteria for selecting revisions" +msgstr "Ошибка в идентификаторе версии:" + +#: gitk:4224 +#, fuzzy +msgid "View Name" +msgstr "Представление" + +#: gitk:4299 msgid "Apply (F5)" msgstr "Применить (F5)" -#: gitk:3853 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Ошибка в параметрах выбора состояний:" -#: gitk:3906 gitk:3958 gitk:4403 gitk:4417 gitk:5675 gitk:10867 gitk:10868 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Ни одного" -#: gitk:4351 gitk:6195 gitk:7925 gitk:7940 -msgid "Date" -msgstr "Дата" - -#: gitk:4351 gitk:6195 -msgid "CDate" -msgstr "Дата ввода" - -#: gitk:4500 gitk:4505 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Порождённое" -#: gitk:4501 +#: gitk:5004 msgid "Not descendant" msgstr "Не порождённое" -#: gitk:4508 gitk:4513 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Предок" -#: gitk:4509 +#: gitk:5012 msgid "Not ancestor" msgstr "Не предок" -#: gitk:4799 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Изменения зарегистрированные в индексе, но не сохранённые" -#: gitk:4835 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Изменения в рабочем каталоге, не зарегистрированные в индексе" -#: gitk:6676 +#: gitk:7115 +msgid "and many more" +msgstr "" + +#: gitk:7118 +msgid "many" +msgstr "" + +#: gitk:7309 msgid "Tags:" msgstr "Таги:" -#: gitk:6693 gitk:6699 gitk:7918 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Предок" -#: gitk:6704 +#: gitk:7337 msgid "Child" msgstr "Потомок" -#: gitk:6713 +#: gitk:7346 msgid "Branch" msgstr "Ветвь" -#: gitk:6716 +#: gitk:7349 msgid "Follows" msgstr "Следует за" -#: gitk:6719 +#: gitk:7352 msgid "Precedes" msgstr "Предшествует" -#: gitk:7212 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Ошибка получения изменений: %s" -#: gitk:7751 +#: gitk:8631 msgid "Goto:" msgstr "Перейти к:" -#: gitk:7753 -msgid "SHA1 ID:" -msgstr "SHA1 ID:" - -#: gitk:7772 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Сокращённый SHA1 идентификатор %s неоднозначен" -#: gitk:7784 +#: gitk:8659 +#, fuzzy, tcl-format +msgid "Revision %s is not known" +msgstr "SHA1 идентификатор %s не найден" + +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA1 идентификатор %s не найден" -#: gitk:7786 +#: gitk:8671 #, tcl-format -msgid "Tag/Head %s is not known" -msgstr "Метка или ветвь %s не найдена" +msgid "Revision %s is not in the current view" +msgstr "" -#: gitk:7928 +#: gitk:8813 gitk:8828 +msgid "Date" +msgstr "Дата" + +#: gitk:8816 msgid "Children" msgstr "Потомки" -#: gitk:7985 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Установить ветвь %s на это состояние" -#: gitk:7987 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Состояние не принадлежит ни одной ветви, переход невозможен" -#: gitk:8019 +#: gitk:8986 gitk:8992 +msgid "Skipping merge commit " +msgstr "" + +#: gitk:9001 gitk:9006 +#, fuzzy +msgid "Error getting patch ID for " +msgstr "Ошибка создания патча:" + +#: gitk:9002 gitk:9007 +msgid " - stopping\n" +msgstr "" + +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 +#, fuzzy +msgid "Commit " +msgstr "состояние" + +#: gitk:9016 +msgid "" +" is the same patch as\n" +" " +msgstr "" + +#: gitk:9024 +msgid "" +" differs from\n" +" " +msgstr "" + +#: gitk:9026 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "" + +#: gitk:9038 gitk:9047 +#, tcl-format +msgid " has %s children - stopping\n" +msgstr "" + +#: gitk:9066 +#, fuzzy, tcl-format +msgid "Error writing commit to file: %s" +msgstr "Ошибка сохранения состояния:" + +#: gitk:9072 +#, fuzzy, tcl-format +msgid "Error diffing commits: %s" +msgstr "Ошибка сохранения состояния:" + +#: gitk:9118 msgid "Top" msgstr "Верх" -#: gitk:8020 +#: gitk:9119 msgid "From" msgstr "От" -#: gitk:8025 +#: gitk:9124 msgid "To" msgstr "До" -#: gitk:8049 +#: gitk:9148 msgid "Generate patch" msgstr "Создать патч" -#: gitk:8051 +#: gitk:9150 msgid "From:" msgstr "От:" -#: gitk:8060 +#: gitk:9159 msgid "To:" msgstr "До:" -#: gitk:8069 +#: gitk:9168 msgid "Reverse" msgstr "В обратном порядке" -#: gitk:8071 gitk:8253 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Файл для сохранения:" -#: gitk:8077 +#: gitk:9176 msgid "Generate" msgstr "Создать" -#: gitk:8115 +#: gitk:9214 msgid "Error creating patch:" msgstr "Ошибка создания патча:" -#: gitk:8138 gitk:8241 gitk:8298 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:8147 +#: gitk:9246 msgid "Tag name:" msgstr "Имя метки:" -#: gitk:8151 gitk:8307 +#: gitk:9249 +msgid "Tag message is optional" +msgstr "" + +#: gitk:9251 +#, fuzzy +msgid "Tag message:" +msgstr "Имя метки:" + +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Создать" -#: gitk:8168 +#: gitk:9273 msgid "No tag name specified" msgstr "Не задано имя метки" -#: gitk:8172 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Метка \"%s\" уже существует" -#: gitk:8178 +#: gitk:9287 msgid "Error creating tag:" msgstr "Ошибка создания метки:" -#: gitk:8250 +#: gitk:9363 msgid "Command:" msgstr "Команда:" -#: gitk:8258 +#: gitk:9371 msgid "Write" msgstr "Запись" -#: gitk:8276 +#: gitk:9389 msgid "Error writing commit:" msgstr "Ошибка сохранения состояния:" -#: gitk:8303 +#: gitk:9416 msgid "Name:" msgstr "Имя:" -#: gitk:8326 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Укажите имя для новой ветви" -#: gitk:8331 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Ветвь '%s' уже существует. Переписать?" -#: gitk:8397 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" -msgstr "" -"Состояние %s уже принадлежит ветви %s. Продолжить операцию?" +msgstr "Состояние %s уже принадлежит ветви %s. Продолжить операцию?" -#: gitk:8402 +#: gitk:9516 msgid "Cherry-picking" msgstr "Копирование изменений" -#: gitk:8411 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -823,61 +1037,88 @@ msgstr "" "Копирование невозможно из-за изменений в файле '%s'.\n" "Сохраните или отмените изменения и повторите операцию." -#: gitk:8417 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" msgstr "" -"Копирование изменений невозможно из-за незавершённой операции " -"слияния.\nЗапустить git citool для завершения этой операции?" +"Копирование изменений невозможно из-за незавершённой операции слияния.\n" +"Запустить git citool для завершения этой операции?" -#: gitk:8433 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Изменения не сохранены" -#: gitk:8459 +#: gitk:9574 +#, fuzzy, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "Состояние %s уже принадлежит ветви %s. Продолжить операцию?" + +#: gitk:9579 +#, fuzzy +msgid "Reverting" +msgstr "Установка" + +#: gitk:9587 +#, fuzzy, 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" +"Сохраните или отмените изменения и повторите операцию." + +#: gitk:9591 +#, fuzzy +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"Копирование изменений невозможно из-за незавершённой операции слияния.\n" +"Запустить git citool для завершения этой операции?" + +#: gitk:9634 msgid "Confirm reset" msgstr "Подтвердите операцию перехода" -#: gitk:8461 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Установить ветвь %s на состояние %s?" -#: gitk:8465 +#: gitk:9638 msgid "Reset type:" msgstr "Тип операции перехода:" -#: gitk:8469 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Лёгкий: оставить рабочий каталог и индекс неизменными" -#: gitk:8472 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" -msgstr "" -"Смешанный: оставить рабочий каталог неизменным, установить индекс" +msgstr "Смешанный: оставить рабочий каталог неизменным, установить индекс" -#: gitk:8475 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" msgstr "" "Жесткий: переписать индекс и рабочий каталог\n" -"(все изменения в рабочем каталоги будут потеряны)" +"(все изменения в рабочем каталоге будут потеряны)" -#: gitk:8492 +#: gitk:9664 msgid "Resetting" msgstr "Установка" -#: gitk:8549 +#: gitk:9724 msgid "Checking out" msgstr "Переход" -#: gitk:8602 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Активная ветвь не может быть удалена" -#: gitk:8608 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -886,200 +1127,272 @@ msgstr "" "Состояния ветви %s больше не принадлежат никакой другой ветви.\n" "Действительно удалить ветвь %s?" -#: gitk:8639 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Метки и ветви: %s" -#: gitk:8654 +#: gitk:9829 msgid "Filter" msgstr "Фильтровать" -#: gitk:8949 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." msgstr "" -"Ошибка чтения истории проекта; информация о ветвях и состояниях " -"вокруг меток (до/после) может быть неполной." +"Ошибка чтения истории проекта; информация о ветвях и состояниях вокруг меток " +"(до/после) может быть неполной." -#: gitk:9935 +#: gitk:11102 msgid "Tag" msgstr "Метка" -#: gitk:9935 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:9983 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Шрифт Gitk" -#: gitk:10000 +#: gitk:11206 msgid "B" msgstr "Ж" -#: gitk:10003 +#: gitk:11209 msgid "I" msgstr "К" -#: gitk:10098 -msgid "Gitk preferences" -msgstr "Настройки Gitk" - -#: gitk:10100 +#: gitk:11327 msgid "Commit list display options" msgstr "Параметры показа списка состояний" -#: gitk:10103 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Макс. ширина графа (строк)" -#: gitk:10107 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Макс. ширина графа (% ширины панели)" -#: gitk:10111 +#: gitk:11337 msgid "Show local changes" msgstr "Показывать изменения в рабочем каталоге" -#: gitk:10114 -msgid "Auto-select SHA1" +#: gitk:11340 +#, fuzzy +msgid "Auto-select SHA1 (length)" msgstr "Выделить SHA1" -#: gitk:10118 +#: gitk:11344 +msgid "Hide remote refs" +msgstr "" + +#: gitk:11348 msgid "Diff display options" msgstr "Параметры показа изменений" -#: gitk:10120 +#: gitk:11350 msgid "Tab spacing" msgstr "Ширина табуляции" -#: gitk:10123 -msgid "Display nearby tags" +#: gitk:11353 +#, fuzzy +msgid "Display nearby tags/heads" msgstr "Показывать близкие метки" -#: gitk:10126 +#: gitk:11356 +msgid "Maximum # tags/heads to show" +msgstr "" + +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Ограничить показ изменений выбранными файлами" -#: gitk:10129 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Поддержка кодировок в отдельных файлах" -#: gitk:10135 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Программа для показа изменений" -#: gitk:10137 +#: gitk:11369 msgid "Choose..." msgstr "Выберите..." -#: gitk:10142 +#: gitk:11374 +#, fuzzy +msgid "General options" +msgstr "Создать патч" + +#: gitk:11377 +msgid "Use themed widgets" +msgstr "" + +#: gitk:11379 +msgid "(change requires restart)" +msgstr "" + +#: gitk:11381 +msgid "(currently unavailable)" +msgstr "" + +#: gitk:11392 msgid "Colors: press to choose" msgstr "Цвета: нажмите для выбора" -#: gitk:10145 +#: gitk:11395 +msgid "Interface" +msgstr "" + +#: gitk:11396 +#, fuzzy +msgid "interface" +msgstr "Шрифт интерфейса" + +#: gitk:11399 msgid "Background" msgstr "Фон" -#: gitk:10146 gitk:10176 +#: gitk:11400 gitk:11430 msgid "background" msgstr "фон" -#: gitk:10149 +#: gitk:11403 msgid "Foreground" msgstr "Передний план" -#: gitk:10150 +#: gitk:11404 msgid "foreground" msgstr "передний план" -#: gitk:10153 +#: gitk:11407 msgid "Diff: old lines" msgstr "Изменения: старый текст" -#: gitk:10154 +#: gitk:11408 msgid "diff old lines" msgstr "старый текст изменения" -#: gitk:10158 +#: gitk:11412 msgid "Diff: new lines" msgstr "Изменения: новый текст" -#: gitk:10159 +#: gitk:11413 msgid "diff new lines" msgstr "новый текст изменения" -#: gitk:10163 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Изменения: заголовок блока" -#: gitk:10165 +#: gitk:11419 msgid "diff hunk header" msgstr "заголовок блока изменений" -#: gitk:10169 +#: gitk:11423 msgid "Marked line bg" msgstr "Фон выбранной строки" -#: gitk:10171 +#: gitk:11425 msgid "marked line background" msgstr "фон выбранной строки" -#: gitk:10175 +#: gitk:11429 msgid "Select bg" msgstr "Выберите фон" -#: gitk:10179 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Шрифт: нажмите для выбора" -#: gitk:10181 +#: gitk:11440 msgid "Main font" msgstr "Основной шрифт" -#: gitk:10182 +#: gitk:11441 msgid "Diff display font" msgstr "Шрифт показа изменений" -#: gitk:10183 +#: gitk:11442 msgid "User interface font" msgstr "Шрифт интерфейса" -#: gitk:10210 +#: gitk:11464 +msgid "Gitk preferences" +msgstr "Настройки Gitk" + +#: gitk:11473 +#, fuzzy +msgid "General" +msgstr "Создать" + +#: gitk:11474 +msgid "Colors" +msgstr "" + +#: gitk:11475 +msgid "Fonts" +msgstr "" + +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: выберите цвет для %s" -#: gitk:10656 -msgid "" -"Sorry, gitk cannot run with this version of Tcl/Tk.\n" -" Gitk requires at least Tcl/Tk 8.4." -msgstr "" -"К сожалению gitk не может работать с этой версий Tcl/Tk.\n" -"Требуется как минимум Tcl/Tk 8.4." - -#: gitk:10773 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Git-репозитарий не найден в текущем каталоге." -#: gitk:10777 -#, tcl-format -msgid "Cannot find the git directory \"%s\"." -msgstr "Git-репозитарий \"%s\" не найден." - -#: gitk:10824 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Неоднозначный аргумент '%s': существует как версия и имя файла" -#: gitk:10836 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Неправильные аргументы для gitk:" -#: gitk:10896 +#: gitk:12405 msgid "Command line" msgstr "Командная строка" +#~ msgid "SHA1 ID: " +#~ msgstr "SHA1:" + +#~ msgid "next" +#~ msgstr "След." + +#~ msgid "prev" +#~ msgstr "Пред." + +#~ msgid "Use all refs" +#~ msgstr "Использовать все ветви" + +#~ msgid "Max count:" +#~ msgstr "Макс. количество:" + +#~ msgid "Skip:" +#~ msgstr "Пропустить:" + +#~ msgid "Name" +#~ msgstr "Имя" + +#~ msgid "CDate" +#~ msgstr "Дата ввода" + +#~ msgid "Tag/Head %s is not known" +#~ msgstr "Метка или ветвь %s не найдена" + +#~ msgid "" +#~ "Sorry, gitk cannot run with this version of Tcl/Tk.\n" +#~ " Gitk requires at least Tcl/Tk 8.4." +#~ msgstr "" +#~ "К сожалению gitk не может работать с этой версий Tcl/Tk.\n" +#~ "Требуется как минимум Tcl/Tk 8.4." + +#~ 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 df95e01b90..0994d87c28 100644 --- a/gitk-git/po/sv.po +++ b/gitk-git/po/sv.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: sv\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-16 08:06+0100\n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2013-05-16 08:12+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" @@ -22,29 +22,29 @@ msgstr "" msgid "Couldn't get list of unmerged files:" msgstr "Kunde inte hämta lista över ej sammanslagna filer:" -#: gitk:210 gitk:2334 +#: gitk:212 gitk:2381 msgid "Color words" msgstr "Färga ord" -#: gitk:215 gitk:2334 gitk:7977 gitk:8010 +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 msgid "Markup words" msgstr "Märk upp ord" -#: gitk:312 +#: gitk:324 msgid "Error parsing revisions:" msgstr "Fel vid tolkning av revisioner:" -#: gitk:368 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Fel vid körning av --argscmd-kommando:" -#: gitk:381 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Inga filer valdes: --merge angavs men det finns inga filer som inte har " "slagits samman." -#: gitk:384 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -52,319 +52,312 @@ msgstr "" "Inga filer valdes: --merge angavs men det finns inga filer inom " "filbegränsningen." -#: gitk:406 gitk:554 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Fel vid körning av git log:" -#: gitk:424 gitk:570 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Läser" -#: gitk:484 gitk:4409 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Läser incheckningar..." -#: gitk:487 gitk:1625 gitk:4412 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Inga incheckningar markerade" -#: gitk:1499 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Kan inte tolka utdata från git log:" -#: gitk:1719 +#: gitk:1740 msgid "No commit information available" msgstr "Ingen incheckningsinformation är tillgänglig" -#: gitk:1876 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1911 gitk:4202 gitk:9437 gitk:10979 gitk:11258 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "OK" -#: gitk:1913 gitk:4204 gitk:8964 gitk:9043 gitk:9159 gitk:9208 gitk:9439 -#: gitk:10980 gitk:11259 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Avbryt" -#: gitk:2048 +#: gitk:2069 msgid "Update" msgstr "Uppdatera" -#: gitk:2049 +#: gitk:2070 msgid "Reload" msgstr "Ladda om" -#: gitk:2050 +#: gitk:2071 msgid "Reread references" msgstr "Läs om referenser" -#: gitk:2051 +#: gitk:2072 msgid "List references" msgstr "Visa referenser" -#: gitk:2053 +#: gitk:2074 msgid "Start git gui" msgstr "Starta git gui" -#: gitk:2055 +#: gitk:2076 msgid "Quit" msgstr "Avsluta" -#: gitk:2047 +#: gitk:2068 msgid "File" msgstr "Arkiv" -#: gitk:2059 +#: gitk:2080 msgid "Preferences" msgstr "Inställningar" -#: gitk:2058 +#: gitk:2079 msgid "Edit" msgstr "Redigera" -#: gitk:2063 +#: gitk:2084 msgid "New view..." msgstr "Ny vy..." -#: gitk:2064 +#: gitk:2085 msgid "Edit view..." msgstr "Ändra vy..." -#: gitk:2065 +#: gitk:2086 msgid "Delete view" msgstr "Ta bort vy" -#: gitk:2067 +#: gitk:2088 msgid "All files" msgstr "Alla filer" -#: gitk:2062 gitk:3955 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Visa" -#: gitk:2072 gitk:2082 gitk:2925 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Om gitk" -#: gitk:2073 gitk:2087 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Tangentbordsbindningar" -#: gitk:2071 gitk:2086 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Hjälp" -#: gitk:2164 gitk:8420 +#: gitk:2185 gitk:8633 msgid "SHA1 ID:" msgstr "SHA1-id:" -#: gitk:2208 +#: gitk:2229 msgid "Row" msgstr "Rad" -#: gitk:2246 +#: gitk:2267 msgid "Find" msgstr "Sök" -#: gitk:2247 -msgid "next" -msgstr "nästa" - -#: gitk:2248 -msgid "prev" -msgstr "föreg" - -#: gitk:2249 +#: gitk:2295 msgid "commit" msgstr "incheckning" -#: gitk:2252 gitk:2254 gitk:4570 gitk:4593 gitk:4617 gitk:6592 gitk:6664 -#: gitk:6749 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "som innehåller:" -#: gitk:2255 gitk:3437 gitk:3442 gitk:4646 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "som rör sökväg:" -#: gitk:2256 gitk:4660 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "som lägger/till tar bort sträng:" -#: gitk:2257 gitk:4662 +#: gitk:2304 gitk:4761 msgid "changing lines matching:" msgstr "ändrar rader som matchar:" -#: gitk:2266 gitk:2268 gitk:4649 +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Exakt" -#: gitk:2268 gitk:4737 gitk:6560 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "IgnVersaler" -#: gitk:2268 gitk:4619 gitk:4735 gitk:6556 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "Reg.uttr." -#: gitk:2270 gitk:2271 gitk:4757 gitk:4787 gitk:4794 gitk:6685 gitk:6753 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Alla fält" -#: gitk:2271 gitk:4754 gitk:4787 gitk:6623 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Rubrik" -#: gitk:2272 gitk:4754 gitk:6623 gitk:6753 gitk:7221 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Kommentarer" -#: gitk:2272 gitk:4754 gitk:4759 gitk:4794 gitk:6623 gitk:7156 gitk:8598 -#: gitk:8613 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Författare" -#: gitk:2272 gitk:4754 gitk:6623 gitk:7158 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Incheckare" -#: gitk:2303 +#: gitk:2350 msgid "Search" msgstr "Sök" -#: gitk:2311 +#: gitk:2358 msgid "Diff" msgstr "Diff" -#: gitk:2313 +#: gitk:2360 msgid "Old version" msgstr "Gammal version" -#: gitk:2315 +#: gitk:2362 msgid "New version" msgstr "Ny version" -#: gitk:2317 +#: gitk:2364 msgid "Lines of context" msgstr "Rader sammanhang" -#: gitk:2327 +#: gitk:2374 msgid "Ignore space change" msgstr "Ignorera ändringar i blanksteg" -#: gitk:2331 gitk:2333 gitk:7735 gitk:7963 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 msgid "Line diff" msgstr "Rad-diff" -#: gitk:2397 +#: gitk:2445 msgid "Patch" msgstr "Patch" -#: gitk:2399 +#: gitk:2447 msgid "Tree" msgstr "Träd" -#: gitk:2557 gitk:2577 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "Diff denna -> markerad" -#: gitk:2558 gitk:2578 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "Diff markerad -> denna" -#: gitk:2559 gitk:2579 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Skapa patch" -#: gitk:2560 gitk:9022 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Skapa tagg" -#: gitk:2561 gitk:9139 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Skriv incheckning till fil" -#: gitk:2562 gitk:9196 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Skapa ny gren" -#: gitk:2563 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Plocka denna incheckning" -#: gitk:2564 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Återställ HEAD-grenen hit" -#: gitk:2565 +#: gitk:2624 msgid "Mark this commit" msgstr "Markera denna incheckning" -#: gitk:2566 +#: gitk:2625 msgid "Return to mark" msgstr "Återgå till markering" -#: gitk:2567 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Hitta efterföljare till denna och markera" -#: gitk:2568 +#: gitk:2627 msgid "Compare with marked commit" msgstr "Jämför med markerad incheckning" -#: gitk:2569 gitk:2580 +#: gitk:2628 gitk:2639 msgid "Diff this -> marked commit" msgstr "Diff denna -> markerad incheckning" -#: gitk:2570 gitk:2581 +#: gitk:2629 gitk:2640 msgid "Diff marked commit -> this" msgstr "Diff markerad incheckning -> denna" -#: gitk:2571 +#: gitk:2630 msgid "Revert this commit" msgstr "Ångra denna incheckning" -#: gitk:2587 +#: gitk:2646 msgid "Check out this branch" msgstr "Checka ut denna gren" -#: gitk:2588 +#: gitk:2647 msgid "Remove this branch" msgstr "Ta bort denna gren" -#: gitk:2595 +#: gitk:2654 msgid "Highlight this too" msgstr "Markera även detta" -#: gitk:2596 +#: gitk:2655 msgid "Highlight this only" msgstr "Markera bara detta" -#: gitk:2597 +#: gitk:2656 msgid "External diff" msgstr "Extern diff" -#: gitk:2598 +#: gitk:2657 msgid "Blame parent commit" msgstr "Klandra föräldraincheckning" -#: gitk:2605 +#: gitk:2664 msgid "Show origin of this line" msgstr "Visa ursprunget för den här raden" -#: gitk:2606 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Kör git gui blame på den här raden" -#: gitk:2927 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright ©9 2005-2011 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -375,302 +368,312 @@ msgstr "" "\n" "Använd och vidareförmedla enligt villkoren i GNU General Public License" -#: gitk:2935 gitk:3000 gitk:9623 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Stäng" -#: gitk:2956 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Tangentbordsbindningar för Gitk" -#: gitk:2959 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Tangentbordsbindningar för Gitk:" -#: gitk:2961 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tAvsluta" -#: gitk:2962 +#: gitk:3046 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tStäng fönster" -#: gitk:2963 +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tGå till första incheckning" -#: gitk:2964 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tGå till sista incheckning" -#: gitk:2965 +#: gitk:3049 msgid "<Up>, p, k\tMove up one commit" msgstr "<Upp>, p, k\tGå en incheckning upp" -#: gitk:2966 +#: gitk:3050 msgid "<Down>, n, j\tMove down one commit" msgstr "<Ned>, n, j\tGå en incheckning ned" -#: gitk:2967 +#: gitk:3051 msgid "<Left>, z, h\tGo back in history list" msgstr "<Vänster>, z, h\tGå bakåt i historiken" -#: gitk:2968 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Höger>, x, l\tGå framåt i historiken" -#: gitk:2969 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tGå upp en sida i incheckningslistan" -#: gitk:2970 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tGå ned en sida i incheckningslistan" -#: gitk:2971 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tRulla till början av incheckningslistan" -#: gitk:2972 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tRulla till slutet av incheckningslistan" -#: gitk:2973 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Upp>\tRulla incheckningslistan upp ett steg" -#: gitk:2974 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Ned>\tRulla incheckningslistan ned ett steg" -#: gitk:2975 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tRulla incheckningslistan upp en sida" -#: gitk:2976 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tRulla incheckningslistan ned en sida" -#: gitk:2977 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Skift-Upp>\tSök bakåt (uppåt, senare incheckningar)" -#: gitk:2978 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "<Skift-Ned>\tSök framåt (nedåt, tidigare incheckningar)" -#: gitk:2979 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tRulla diffvisningen upp en sida" -#: gitk:2980 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Baksteg>\tRulla diffvisningen upp en sida" -#: gitk:2981 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Blanksteg>\tRulla diffvisningen ned en sida" -#: gitk:2982 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tRulla diffvisningen upp 18 rader" -#: gitk:2983 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tRulla diffvisningen ned 18 rader" -#: gitk:2984 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tSök" -#: gitk:2985 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tGå till nästa sökträff" -#: gitk:2986 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\t\tGå till nästa sökträff" -#: gitk:2987 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tFokusera sökrutan" -#: gitk:2988 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tGå till föregående sökträff" -#: gitk:2989 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tRulla diffvisningen till nästa fil" -#: gitk:2990 +#: gitk:3075 #, 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:2991 +#: gitk:3076 #, 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:2992 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-Num+>\tÖka teckenstorlek" -#: gitk:2993 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tÖka teckenstorlek" -#: gitk:2994 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-Num->\tMinska teckenstorlek" -#: gitk:2995 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tMinska teckenstorlek" -#: gitk:2996 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tUppdatera" -#: gitk:3451 gitk:3460 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Fel vid skapande av temporär katalog %s:" -#: gitk:3473 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Fel vid hämtning av \"%s\" från %s:" -#: gitk:3536 +#: gitk:3631 msgid "command failed:" msgstr "kommando misslyckades:" -#: gitk:3685 +#: gitk:3780 msgid "No such commit" msgstr "Incheckning saknas" -#: gitk:3699 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: kommando misslyckades:" -#: gitk:3730 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Kunde inte läsa sammanslagningshuvud: %s" -#: gitk:3738 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Fel vid läsning av index: %s" -#: gitk:3763 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Kunde inte starta git blame: %s" -#: gitk:3766 gitk:6591 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Söker" -#: gitk:3798 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Fel vid körning av git blame: %s" -#: gitk:3826 +#: gitk:3921 #, 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:3840 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Externt diff-verktyg misslyckades:" -#: gitk:3958 +#: gitk:4053 msgid "Gitk view definition" msgstr "Definition av Gitk-vy" -#: gitk:3962 +#: gitk:4057 msgid "Remember this view" msgstr "Spara denna vy" -#: gitk:3963 +#: gitk:4058 msgid "References (space separated list):" msgstr "Referenser (blankstegsavdelad lista):" -#: gitk:3964 +#: gitk:4059 msgid "Branches & tags:" msgstr "Grenar & taggar:" -#: gitk:3965 +#: gitk:4060 msgid "All refs" msgstr "Alla referenser" -#: gitk:3966 +#: gitk:4061 msgid "All (local) branches" msgstr "Alla (lokala) grenar" -#: gitk:3967 +#: gitk:4062 msgid "All tags" msgstr "Alla taggar" -#: gitk:3968 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Alla fjärrspårande grenar" -#: gitk:3969 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Incheckningsinfo (reguljära uttryck):" -#: gitk:3970 +#: gitk:4065 msgid "Author:" msgstr "Författare:" -#: gitk:3971 +#: gitk:4066 msgid "Committer:" msgstr "Incheckare:" -#: gitk:3972 +#: gitk:4067 msgid "Commit Message:" msgstr "Incheckningsmeddelande:" -#: gitk:3973 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Motsvarar alla kriterier för incheckningsinfo" -#: gitk:3974 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Motsvarar alla kriterier för incheckningsinfo" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Ändringar av filer:" -#: gitk:3975 +#: gitk:4071 msgid "Fixed String" msgstr "Fast sträng" -#: gitk:3976 +#: gitk:4072 msgid "Regular Expression" msgstr "Reguljärt uttryck" -#: gitk:3977 +#: gitk:4073 msgid "Search string:" msgstr "Söksträng:" -#: gitk:3978 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -678,201 +681,201 @@ msgstr "" "Incheckingsdatum (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:3979 +#: gitk:4075 msgid "Since:" msgstr "Från:" -#: gitk:3980 +#: gitk:4076 msgid "Until:" msgstr "Till:" -#: gitk:3981 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Begränsa och/eller hoppa över ett antal revisioner (positivt heltal):" -#: gitk:3982 +#: gitk:4078 msgid "Number to show:" msgstr "Antal att visa:" -#: gitk:3983 +#: gitk:4079 msgid "Number to skip:" msgstr "Antal att hoppa över:" -#: gitk:3984 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Diverse alternativ:" -#: gitk:3985 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Strikt datumsortering" -#: gitk:3986 +#: gitk:4082 msgid "Mark branch sides" msgstr "Markera sidogrenar" -#: gitk:3987 +#: gitk:4083 msgid "Limit to first parent" msgstr "Begränsa till första förälder" -#: gitk:3988 +#: gitk:4084 msgid "Simple history" msgstr "Enkel historik" -#: gitk:3989 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Ytterligare argument till git log:" -#: gitk:3990 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Ange filer och kataloger att ta med, en per rad:" -#: gitk:3991 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Kommando för att generera fler incheckningar att ta med:" -#: gitk:4115 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: redigera vy" -#: gitk:4123 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr " - kriterier för val av revisioner" -#: gitk:4128 +#: gitk:4224 msgid "View Name" msgstr "Namn på vy" -#: gitk:4203 +#: gitk:4299 msgid "Apply (F5)" msgstr "Använd (F5)" -#: gitk:4241 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Fel i argument för val av incheckningar:" -#: gitk:4294 gitk:4346 gitk:4807 gitk:4821 gitk:6087 gitk:12041 gitk:12042 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Inget" -#: gitk:4904 gitk:4909 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Avkomling" -#: gitk:4905 +#: gitk:5004 msgid "Not descendant" msgstr "Inte avkomling" -#: gitk:4912 gitk:4917 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Förfader" -#: gitk:4913 +#: gitk:5012 msgid "Not ancestor" msgstr "Inte förfader" -#: gitk:5203 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "Lokala ändringar sparade i indexet men inte incheckade" -#: gitk:5239 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Lokala ändringar, ej sparade i indexet" -#: gitk:6971 +#: gitk:7115 msgid "and many more" msgstr "med många flera" -#: gitk:6974 +#: gitk:7118 msgid "many" msgstr "många" -#: gitk:7160 +#: gitk:7309 msgid "Tags:" msgstr "Taggar:" -#: gitk:7177 gitk:7183 gitk:8593 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Förälder" -#: gitk:7188 +#: gitk:7337 msgid "Child" msgstr "Barn" -#: gitk:7197 +#: gitk:7346 msgid "Branch" msgstr "Gren" -#: gitk:7200 +#: gitk:7349 msgid "Follows" msgstr "Följer" -#: gitk:7203 +#: gitk:7352 msgid "Precedes" msgstr "Föregår" -#: gitk:7742 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Fel vid hämtning av diff: %s" -#: gitk:8418 +#: gitk:8631 msgid "Goto:" msgstr "Gå till:" -#: gitk:8439 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Förkortat SHA1-id %s är tvetydigt" -#: gitk:8446 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "Revisionen %s är inte känd" -#: gitk:8456 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "SHA-id:t %s är inte känt" -#: gitk:8458 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Revisionen %s finns inte i den nuvarande vyn" -#: gitk:8600 gitk:8615 +#: gitk:8813 gitk:8828 msgid "Date" msgstr "Datum" -#: gitk:8603 +#: gitk:8816 msgid "Children" msgstr "Barn" -#: gitk:8666 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Återställ grenen %s hit" -#: gitk:8668 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Frånkopplad head: kan inte återställa" -#: gitk:8773 gitk:8779 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Hoppar över sammanslagningsincheckning " -#: gitk:8788 gitk:8793 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Fel vid hämtning av patch-id för " -#: gitk:8789 gitk:8794 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - stannar\n" -#: gitk:8799 gitk:8802 gitk:8810 gitk:8824 gitk:8833 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Incheckning " -#: gitk:8803 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -880,7 +883,7 @@ msgstr "" " är samma patch som\n" " " -#: gitk:8811 +#: gitk:9024 msgid "" " differs from\n" " " @@ -888,7 +891,7 @@ msgstr "" " skiljer sig från\n" " " -#: gitk:8813 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -896,131 +899,131 @@ msgstr "" "Skillnad mellan incheckningar:\n" "\n" -#: gitk:8825 gitk:8834 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " har %s barn - stannar\n" -#: gitk:8853 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Fel vid skrivning av incheckning till fil: %s" -#: gitk:8859 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "Fel vid jämförelse av incheckningar: %s" -#: gitk:8905 +#: gitk:9118 msgid "Top" msgstr "Topp" -#: gitk:8906 +#: gitk:9119 msgid "From" msgstr "Från" -#: gitk:8911 +#: gitk:9124 msgid "To" msgstr "Till" -#: gitk:8935 +#: gitk:9148 msgid "Generate patch" msgstr "Generera patch" -#: gitk:8937 +#: gitk:9150 msgid "From:" msgstr "Från:" -#: gitk:8946 +#: gitk:9159 msgid "To:" msgstr "Till:" -#: gitk:8955 +#: gitk:9168 msgid "Reverse" msgstr "Vänd" -#: gitk:8957 gitk:9153 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Utdatafil:" -#: gitk:8963 +#: gitk:9176 msgid "Generate" msgstr "Generera" -#: gitk:9001 +#: gitk:9214 msgid "Error creating patch:" msgstr "Fel vid generering av patch:" -#: gitk:9024 gitk:9141 gitk:9198 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "Id:" -#: gitk:9033 +#: gitk:9246 msgid "Tag name:" msgstr "Taggnamn:" -#: gitk:9036 +#: gitk:9249 msgid "Tag message is optional" msgstr "Taggmeddelandet är valfritt" -#: gitk:9038 +#: gitk:9251 msgid "Tag message:" msgstr "Taggmeddelande:" -#: gitk:9042 gitk:9207 +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Skapa" -#: gitk:9060 +#: gitk:9273 msgid "No tag name specified" msgstr "Inget taggnamn angavs" -#: gitk:9064 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Taggen \"%s\" finns redan" -#: gitk:9074 +#: gitk:9287 msgid "Error creating tag:" msgstr "Fel vid skapande av tagg:" -#: gitk:9150 +#: gitk:9363 msgid "Command:" msgstr "Kommando:" -#: gitk:9158 +#: gitk:9371 msgid "Write" msgstr "Skriv" -#: gitk:9176 +#: gitk:9389 msgid "Error writing commit:" msgstr "Fel vid skrivning av incheckning:" -#: gitk:9203 +#: gitk:9416 msgid "Name:" msgstr "Namn:" -#: gitk:9226 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Ange ett namn för den nya grenen" -#: gitk:9231 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Grenen \"%s\" finns redan. Skriva över?" -#: gitk:9298 +#: gitk:9511 #, 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:9303 +#: gitk:9516 msgid "Cherry-picking" msgstr "Plockar" -#: gitk:9312 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1030,7 +1033,7 @@ msgstr "" "Checka in, återställ eller spara undan (stash) dina ändringar och försök " "igen." -#: gitk:9318 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1038,20 +1041,20 @@ msgstr "" "Cherry-pick misslyckades på grund av en sammanslagningskonflikt.\n" "Vill du köra git citool för att lösa den?" -#: gitk:9334 gitk:9392 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Inga ändringar incheckade" -#: gitk:9361 +#: gitk:9574 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "Incheckningen %s finns inte på grenen %s -- vill du verkligen ångra?" -#: gitk:9366 +#: gitk:9579 msgid "Reverting" msgstr "Ångrar" -#: gitk:9374 +#: gitk:9587 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1061,7 +1064,7 @@ msgstr "" "Checka in, återställ eller spara undan (stash) dina ändringar och försök " "igen." -#: gitk:9378 +#: gitk:9591 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1069,28 +1072,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:9421 +#: gitk:9634 msgid "Confirm reset" msgstr "Bekräfta återställning" -#: gitk:9423 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Återställa grenen %s till %s?" -#: gitk:9425 +#: gitk:9638 msgid "Reset type:" msgstr "Typ av återställning:" -#: gitk:9428 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Mjuk: Rör inte utcheckning och index" -#: gitk:9431 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "Blandad: Rör inte utcheckning, återställ index" -#: gitk:9434 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1098,19 +1101,19 @@ msgstr "" "Hård: Återställ utcheckning och index\n" "(förkastar ALLA lokala ändringar)" -#: gitk:9451 +#: gitk:9664 msgid "Resetting" msgstr "Återställer" -#: gitk:9511 +#: gitk:9724 msgid "Checking out" msgstr "Checkar ut" -#: gitk:9564 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Kan inte ta bort den just nu utcheckade grenen" -#: gitk:9570 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1119,16 +1122,16 @@ msgstr "" "Incheckningarna på grenen %s existerar inte på någon annan gren.\n" "Vill du verkligen ta bort grenen %s?" -#: gitk:9601 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Taggar och huvuden: %s" -#: gitk:9616 +#: gitk:9829 msgid "Filter" msgstr "Filter" -#: gitk:9912 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1136,217 +1139,223 @@ msgstr "" "Fel vid läsning av information om incheckningstopologi; information om " "grenar och föregående/senare taggar kommer inte vara komplett." -#: gitk:10899 +#: gitk:11102 msgid "Tag" msgstr "Tagg" -#: gitk:10899 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:10948 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Teckensnittsväljare för Gitk" -#: gitk:10965 +#: gitk:11206 msgid "B" msgstr "F" -#: gitk:10968 +#: gitk:11209 msgid "I" msgstr "K" -#: gitk:11086 +#: gitk:11327 msgid "Commit list display options" msgstr "Alternativ för incheckningslistvy" -#: gitk:11089 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Maximal grafbredd (rader)" -#: gitk:11092 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Maximal grafbredd (% av ruta)" -#: gitk:11095 +#: gitk:11337 msgid "Show local changes" msgstr "Visa lokala ändringar" -#: gitk:11098 +#: gitk:11340 msgid "Auto-select SHA1 (length)" msgstr "Välj SHA1 (längd) automatiskt" -#: gitk:11102 +#: gitk:11344 msgid "Hide remote refs" msgstr "Dölj fjärr-referenser" -#: gitk:11106 +#: gitk:11348 msgid "Diff display options" msgstr "Alternativ för diffvy" -#: gitk:11108 +#: gitk:11350 msgid "Tab spacing" msgstr "Blanksteg för tabulatortecken" -#: gitk:11111 +#: gitk:11353 msgid "Display nearby tags/heads" msgstr "Visa närliggande taggar/huvuden" -#: gitk:11114 +#: gitk:11356 msgid "Maximum # tags/heads to show" msgstr "Maximalt antal taggar/huvuden att visa" -#: gitk:11117 +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Begränsa diff till listade sökvägar" -#: gitk:11120 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Stöd för filspecifika teckenkodningar" -#: gitk:11126 gitk:11273 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Externt diff-verktyg" -#: gitk:11127 +#: gitk:11369 msgid "Choose..." msgstr "Välj..." -#: gitk:11132 +#: gitk:11374 msgid "General options" msgstr "Allmänna inställningar" -#: gitk:11135 +#: gitk:11377 msgid "Use themed widgets" msgstr "Använd tema på fönsterelement" -#: gitk:11137 +#: gitk:11379 msgid "(change requires restart)" msgstr "(ändringen kräver omstart)" -#: gitk:11139 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(för närvarande inte tillgängligt)" -#: gitk:11150 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Färger: tryck för att välja" -#: gitk:11153 +#: gitk:11395 msgid "Interface" msgstr "Gränssnitt" -#: gitk:11154 +#: gitk:11396 msgid "interface" msgstr "gränssnitt" -#: gitk:11157 +#: gitk:11399 msgid "Background" msgstr "Bakgrund" -#: gitk:11158 gitk:11188 +#: gitk:11400 gitk:11430 msgid "background" msgstr "bakgrund" -#: gitk:11161 +#: gitk:11403 msgid "Foreground" msgstr "Förgrund" -#: gitk:11162 +#: gitk:11404 msgid "foreground" msgstr "förgrund" -#: gitk:11165 +#: gitk:11407 msgid "Diff: old lines" msgstr "Diff: gamla rader" -#: gitk:11166 +#: gitk:11408 msgid "diff old lines" msgstr "diff gamla rader" -#: gitk:11170 +#: gitk:11412 msgid "Diff: new lines" msgstr "Diff: nya rader" -#: gitk:11171 +#: gitk:11413 msgid "diff new lines" msgstr "diff nya rader" -#: gitk:11175 +#: gitk:11417 msgid "Diff: hunk header" msgstr "Diff: delhuvud" -#: gitk:11177 +#: gitk:11419 msgid "diff hunk header" msgstr "diff delhuvud" -#: gitk:11181 +#: gitk:11423 msgid "Marked line bg" msgstr "Markerad rad bakgrund" -#: gitk:11183 +#: gitk:11425 msgid "marked line background" msgstr "markerad rad bakgrund" -#: gitk:11187 +#: gitk:11429 msgid "Select bg" msgstr "Markerad bakgrund" -#: gitk:11196 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Teckensnitt: tryck för att välja" -#: gitk:11198 +#: gitk:11440 msgid "Main font" msgstr "Huvudteckensnitt" -#: gitk:11199 +#: gitk:11441 msgid "Diff display font" msgstr "Teckensnitt för diffvisning" -#: gitk:11200 +#: gitk:11442 msgid "User interface font" msgstr "Teckensnitt för användargränssnitt" -#: gitk:11222 +#: gitk:11464 msgid "Gitk preferences" msgstr "Inställningar för Gitk" -#: gitk:11231 +#: gitk:11473 msgid "General" msgstr "Allmänt" -#: gitk:11232 +#: gitk:11474 msgid "Colors" msgstr "Färger" -#: gitk:11233 +#: gitk:11475 msgid "Fonts" msgstr "Teckensnitt" -#: gitk:11283 +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: välj färg för %s" -#: gitk:11937 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Hittar inget git-arkiv här." -#: gitk:11984 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Tvetydigt argument \"%s\": både revision och filnamn" -#: gitk:11996 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Felaktiga argument till gitk:" -#: gitk:12099 +#: gitk:12405 msgid "Command line" msgstr "Kommandorad" +#~ msgid "next" +#~ msgstr "nästa" + +#~ msgid "prev" +#~ msgstr "föreg" + #~ msgid "CDate" #~ msgstr "Skapat datum" diff --git a/gitk-git/po/vi.po b/gitk-git/po/vi.po index 4dfe125a69..ade9cb70cb 100644 --- a/gitk-git/po/vi.po +++ b/gitk-git/po/vi.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: gitk @@GIT_VERSION@@\n" -"Report-Msgid-Bugs-To: Paul Mackerras <paulus@samba.org>\n" -"POT-Creation-Date: 2013-12-14 09:24+0700\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-15 14:37+1100\n" "PO-Revision-Date: 2013-12-14 14:40+0700\n" "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n" "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n" @@ -21,28 +21,28 @@ msgstr "" msgid "Couldn't get list of unmerged files:" msgstr "Không thể lấy danh sách các tập-tin chưa được hòa trộn:" -#: gitk:212 gitk:2353 +#: gitk:212 gitk:2381 msgid "Color words" msgstr "Tô màu chữ" -#: gitk:217 gitk:2353 gitk:8103 gitk:8136 +#: gitk:217 gitk:2381 gitk:8201 gitk:8234 msgid "Markup words" msgstr "Đánh dấu chữ" -#: gitk:322 +#: gitk:324 msgid "Error parsing revisions:" msgstr "Gặp lỗi khi phân tích điểm xét duyệt:" -#: gitk:378 +#: gitk:380 msgid "Error executing --argscmd command:" msgstr "Gặp lỗi khi thực hiện lệnh --argscmd:" -#: gitk:391 +#: gitk:393 msgid "No files selected: --merge specified but no files are unmerged." msgstr "" "Chưa chọn tập tin: --merge đã chỉ định nhưng không có tập tin chưa hòa trộn." -#: gitk:394 +#: gitk:396 msgid "" "No files selected: --merge specified but no unmerged files are within file " "limit." @@ -50,319 +50,312 @@ msgstr "" "Chưa chọn tập tin: --merge đã chỉ định nhưng không có tập tin chưa hòa trộn " "trong giới hạn tập tin." -#: gitk:416 gitk:564 +#: gitk:418 gitk:566 msgid "Error executing git log:" msgstr "Gặp lỗi khi thực hiện lệnh git log:" -#: gitk:434 gitk:580 +#: gitk:436 gitk:582 msgid "Reading" msgstr "Đang đọc" -#: gitk:494 gitk:4429 +#: gitk:496 gitk:4508 msgid "Reading commits..." msgstr "Đang đọc các lần chuyển giao..." -#: gitk:497 gitk:1635 gitk:4432 +#: gitk:499 gitk:1637 gitk:4511 msgid "No commits selected" msgstr "Chưa chọn các lần chuyển giao" -#: gitk:1509 +#: gitk:1511 msgid "Can't parse git log output:" msgstr "Không thể phân tích kết xuất từ lệnh git log:" -#: gitk:1738 +#: gitk:1740 msgid "No commit information available" msgstr "Không có thông tin về lần chuyển giao nào" -#: gitk:1895 +#: gitk:1897 msgid "mc" msgstr "mc" -#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401 +#: gitk:1932 gitk:4298 gitk:9650 gitk:11220 gitk:11500 msgid "OK" msgstr "Đồng ý" -#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554 -#: gitk:11123 gitk:11402 +#: gitk:1934 gitk:4300 gitk:9177 gitk:9256 gitk:9372 gitk:9421 gitk:9652 +#: gitk:11221 gitk:11501 msgid "Cancel" msgstr "Thôi" -#: gitk:2067 +#: gitk:2069 msgid "Update" msgstr "Cập nhật" -#: gitk:2068 +#: gitk:2070 msgid "Reload" msgstr "Tải lại" -#: gitk:2069 +#: gitk:2071 msgid "Reread references" msgstr "Đọc lại tham chiếu" -#: gitk:2070 +#: gitk:2072 msgid "List references" msgstr "Liệt kê các tham chiếu" -#: gitk:2072 +#: gitk:2074 msgid "Start git gui" msgstr "Khởi chạy git gui" -#: gitk:2074 +#: gitk:2076 msgid "Quit" msgstr "Thoát" -#: gitk:2066 +#: gitk:2068 msgid "File" msgstr "Chính" -#: gitk:2078 +#: gitk:2080 msgid "Preferences" msgstr "Cá nhân hóa" -#: gitk:2077 +#: gitk:2079 msgid "Edit" msgstr "Chỉnh sửa" -#: gitk:2082 +#: gitk:2084 msgid "New view..." msgstr "Thêm trình bày mới..." -#: gitk:2083 +#: gitk:2085 msgid "Edit view..." msgstr "Sửa cách trình bày..." -#: gitk:2084 +#: gitk:2086 msgid "Delete view" msgstr "Xóa cách trình bày" -#: gitk:2086 +#: gitk:2088 msgid "All files" msgstr "Mọi tập tin" -#: gitk:2081 gitk:3975 +#: gitk:2083 gitk:4050 msgid "View" msgstr "Trình bày" -#: gitk:2091 gitk:2101 gitk:2945 +#: gitk:2093 gitk:2103 gitk:3009 msgid "About gitk" msgstr "Giới thiệu về gitk" -#: gitk:2092 gitk:2106 +#: gitk:2094 gitk:2108 msgid "Key bindings" msgstr "Tổ hợp phím" -#: gitk:2090 gitk:2105 +#: gitk:2092 gitk:2107 msgid "Help" msgstr "Trợ giúp" -#: gitk:2183 gitk:8535 +#: gitk:2185 gitk:8633 msgid "SHA1 ID:" msgstr "SHA1 ID:" -#: gitk:2227 +#: gitk:2229 msgid "Row" msgstr "Hàng" -#: gitk:2265 +#: gitk:2267 msgid "Find" msgstr "Tìm" -#: gitk:2266 -msgid "next" -msgstr "tiếp" - -#: gitk:2267 -msgid "prev" -msgstr "trước" - -#: gitk:2268 +#: gitk:2295 msgid "commit" msgstr "lần chuyển giao" -#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725 -#: gitk:6810 +#: gitk:2299 gitk:2301 gitk:4669 gitk:4692 gitk:4716 gitk:6736 gitk:6808 +#: gitk:6893 msgid "containing:" msgstr "có chứa:" -#: gitk:2274 gitk:3457 gitk:3462 gitk:4666 +#: gitk:2302 gitk:3522 gitk:3527 gitk:4745 msgid "touching paths:" msgstr "đang chạm đường dẫn:" -#: gitk:2275 gitk:4680 +#: gitk:2303 gitk:4759 msgid "adding/removing string:" msgstr "thêm/gỡ bỏ chuỗi:" -#: gitk:2276 gitk:4682 +#: gitk:2304 gitk:4761 msgid "changing lines matching:" msgstr "những dòng thay đổi khớp mẫu:" -#: gitk:2285 gitk:2287 gitk:4669 +#: gitk:2313 gitk:2315 gitk:4748 msgid "Exact" msgstr "Chính xác" -#: gitk:2287 gitk:4757 gitk:6621 +#: gitk:2315 gitk:4836 gitk:6704 msgid "IgnCase" msgstr "BquaHt" -#: gitk:2287 gitk:4639 gitk:4755 gitk:6617 +#: gitk:2315 gitk:4718 gitk:4834 gitk:6700 msgid "Regexp" msgstr "BTCQ" -#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814 +#: gitk:2317 gitk:2318 gitk:4856 gitk:4886 gitk:4893 gitk:6829 gitk:6897 msgid "All fields" msgstr "Mọi trường" -#: gitk:2290 gitk:4774 gitk:4807 gitk:6684 +#: gitk:2318 gitk:4853 gitk:4886 gitk:6767 msgid "Headline" msgstr "Nội dung chính" -#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283 +#: gitk:2319 gitk:4853 gitk:6767 gitk:6897 gitk:7370 msgid "Comments" msgstr "Ghi chú" -#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713 -#: gitk:8728 +#: gitk:2319 gitk:4853 gitk:4858 gitk:4893 gitk:6767 gitk:7305 gitk:8811 +#: gitk:8826 msgid "Author" msgstr "Tác giả" -#: gitk:2291 gitk:4774 gitk:6684 gitk:7220 +#: gitk:2319 gitk:4853 gitk:6767 gitk:7307 msgid "Committer" msgstr "Người chuyển giao" -#: gitk:2322 +#: gitk:2350 msgid "Search" msgstr "Tìm kiếm" -#: gitk:2330 +#: gitk:2358 msgid "Diff" msgstr "So sánh" -#: gitk:2332 +#: gitk:2360 msgid "Old version" msgstr "Phiên bản cũ" -#: gitk:2334 +#: gitk:2362 msgid "New version" msgstr "Phiên bản mới" -#: gitk:2336 +#: gitk:2364 msgid "Lines of context" msgstr "Các dòng của nội dung" -#: gitk:2346 +#: gitk:2374 msgid "Ignore space change" msgstr "Không xét đến thay đổi do khoảng trắng" -#: gitk:2350 gitk:2352 gitk:7842 gitk:8089 +#: gitk:2378 gitk:2380 gitk:7940 gitk:8187 msgid "Line diff" msgstr "Khác biệt theo dòng" -#: gitk:2417 +#: gitk:2445 msgid "Patch" msgstr "Vá" -#: gitk:2419 +#: gitk:2447 msgid "Tree" msgstr "Cây" -#: gitk:2577 gitk:2597 +#: gitk:2616 gitk:2636 msgid "Diff this -> selected" msgstr "So sánh cái này -> cái đã chọn" -#: gitk:2578 gitk:2598 +#: gitk:2617 gitk:2637 msgid "Diff selected -> this" msgstr "So sánh cái đã chọn -> cái này" -#: gitk:2579 gitk:2599 +#: gitk:2618 gitk:2638 msgid "Make patch" msgstr "Tạo miếng vá" -#: gitk:2580 gitk:9137 +#: gitk:2619 gitk:9235 msgid "Create tag" msgstr "Tạo thẻ" -#: gitk:2581 gitk:9254 +#: gitk:2620 gitk:9352 msgid "Write commit to file" msgstr "Ghi lần chuyển giao ra tập tin" -#: gitk:2582 gitk:9311 +#: gitk:2621 gitk:9409 msgid "Create new branch" msgstr "Tạo nhánh mới" -#: gitk:2583 +#: gitk:2622 msgid "Cherry-pick this commit" msgstr "Cherry-pick lần chuyển giao này" -#: gitk:2584 +#: gitk:2623 msgid "Reset HEAD branch to here" msgstr "Đặt lại HEAD của nhánh vào đây" -#: gitk:2585 +#: gitk:2624 msgid "Mark this commit" msgstr "Đánh dấu lần chuyển giao này" -#: gitk:2586 +#: gitk:2625 msgid "Return to mark" msgstr "Quay lại vị trí dấu" -#: gitk:2587 +#: gitk:2626 msgid "Find descendant of this and mark" msgstr "Tìm con cháu của cái này và cái đã đánh dấu" -#: gitk:2588 +#: gitk:2627 msgid "Compare with marked commit" msgstr "So sánh với lần chuyển giao đã đánh dấu" -#: gitk:2589 gitk:2600 +#: gitk:2628 gitk:2639 msgid "Diff this -> marked commit" msgstr "So sánh cái này -> lần chuyển giao đã đánh dấu" -#: gitk:2590 gitk:2601 +#: gitk:2629 gitk:2640 msgid "Diff marked commit -> this" msgstr "So sánh lần chuyển giao đã đánh dấu -> cái này" -#: gitk:2591 +#: gitk:2630 msgid "Revert this commit" msgstr "Hoàn lại lần chuyển giao này" -#: gitk:2607 +#: gitk:2646 msgid "Check out this branch" msgstr "Checkout nhánh này" -#: gitk:2608 +#: gitk:2647 msgid "Remove this branch" msgstr "Gỡ bỏ nhánh này" -#: gitk:2615 +#: gitk:2654 msgid "Highlight this too" msgstr "Cũng tô sáng nó" -#: gitk:2616 +#: gitk:2655 msgid "Highlight this only" msgstr "Chỉ tô sáng cái này" -#: gitk:2617 +#: gitk:2656 msgid "External diff" msgstr "diff từ bên ngoài" -#: gitk:2618 +#: gitk:2657 msgid "Blame parent commit" msgstr "Xem công trạng lần chuyển giao cha mẹ" -#: gitk:2625 +#: gitk:2664 msgid "Show origin of this line" msgstr "Hiển thị nguyên gốc của dòng này" -#: gitk:2626 +#: gitk:2665 msgid "Run git gui blame on this line" msgstr "Chạy lệnh git gui blame cho dòng này" -#: gitk:2947 +#: gitk:3011 +#, fuzzy msgid "" "\n" "Gitk - a commit viewer for git\n" "\n" -"Copyright © 2005-2011 Paul Mackerras\n" +"Copyright © 2005-2014 Paul Mackerras\n" "\n" "Use and redistribute under the terms of the GNU General Public License" msgstr "" @@ -373,304 +366,314 @@ msgstr "" "\n" "Dùng và phân phối lại phần mềm này theo các điều khoản của Giấy Phép Công GNU" -#: gitk:2955 gitk:3020 gitk:9738 +#: gitk:3019 gitk:3085 gitk:9836 msgid "Close" msgstr "Đóng" -#: gitk:2976 +#: gitk:3040 msgid "Gitk key bindings" msgstr "Tổ hợp phím gitk" -#: gitk:2979 +#: gitk:3043 msgid "Gitk key bindings:" msgstr "Tổ hợp phím gitk:" -#: gitk:2981 +#: gitk:3045 #, tcl-format msgid "<%s-Q>\t\tQuit" msgstr "<%s-Q>\t\tThoát" -#: gitk:2982 +#: gitk:3046 #, tcl-format msgid "<%s-W>\t\tClose window" msgstr "<%s-W>\t\tĐóng cửa sổ" -#: gitk:2983 +#: gitk:3047 msgid "<Home>\t\tMove to first commit" msgstr "<Home>\t\tChuyển đến lần chuyển giao đầu tiên" -#: gitk:2984 +#: gitk:3048 msgid "<End>\t\tMove to last commit" msgstr "<End>\t\tChuyển đến lần chuyển giao cuối" -#: gitk:2985 +#: gitk:3049 msgid "<Up>, p, k\tMove up one commit" msgstr "<Up>, p, k\tDi chuyển lên một lần chuyển giao" -#: gitk:2986 +#: gitk:3050 msgid "<Down>, n, j\tMove down one commit" msgstr "<Down>, n, j\tDi chuyển xuống một lần chuyển giao" -#: gitk:2987 +#: gitk:3051 msgid "<Left>, z, h\tGo back in history list" msgstr "<Left>, z, h\tQuay trở lại danh sách lịch sử" -#: gitk:2988 +#: gitk:3052 msgid "<Right>, x, l\tGo forward in history list" msgstr "<Right>, x, l\tDi chuyển tiếp trong danh sách lịch sử" -#: gitk:2989 +#: gitk:3053 +#, tcl-format +msgid "<%s-n>\tGo to n-th parent of current commit in history list" +msgstr "" + +#: gitk:3054 msgid "<PageUp>\tMove up one page in commit list" msgstr "<PageUp>\tDi chuyển lên một trang trong danh sách lần chuyển giao" -#: gitk:2990 +#: gitk:3055 msgid "<PageDown>\tMove down one page in commit list" msgstr "<PageDown>\tDi chuyển xuống một trang trong danh sách lần chuyển giao" -#: gitk:2991 +#: gitk:3056 #, tcl-format msgid "<%s-Home>\tScroll to top of commit list" msgstr "<%s-Home>\tCuộn lên trên cùng của danh sách lần chuyển giao" -#: gitk:2992 +#: gitk:3057 #, tcl-format msgid "<%s-End>\tScroll to bottom of commit list" msgstr "<%s-End>\tCuộn xuống dưới cùng của danh sách lần chuyển giao" -#: gitk:2993 +#: gitk:3058 #, tcl-format msgid "<%s-Up>\tScroll commit list up one line" msgstr "<%s-Up>\tCuộn danh sách lần chuyển giao lên một dòng" -#: gitk:2994 +#: gitk:3059 #, tcl-format msgid "<%s-Down>\tScroll commit list down one line" msgstr "<%s-Down>\tCuộn danh sách lần chuyển giao xuống một dòng" -#: gitk:2995 +#: gitk:3060 #, tcl-format msgid "<%s-PageUp>\tScroll commit list up one page" msgstr "<%s-PageUp>\tCuộn danh sách lần chuyển giao lên một trang" -#: gitk:2996 +#: gitk:3061 #, tcl-format msgid "<%s-PageDown>\tScroll commit list down one page" msgstr "<%s-PageDown>\tCuộn danh sách lần chuyển giao xuống một trang" -#: gitk:2997 +#: gitk:3062 msgid "<Shift-Up>\tFind backwards (upwards, later commits)" msgstr "<Shift-Up>\tTìm về phía sau (hướng lên trên, lần chuyển giao sau này)" -#: gitk:2998 +#: gitk:3063 msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" msgstr "" "<Shift-Down>\tTìm về phía trước (hướng xuống dưới, lần chuyển giao trước đây)" -#: gitk:2999 +#: gitk:3064 msgid "<Delete>, b\tScroll diff view up one page" msgstr "<Delete>, b\tCuộn phần trình bày diff lên một trang" -#: gitk:3000 +#: gitk:3065 msgid "<Backspace>\tScroll diff view up one page" msgstr "<Backspace>\tCuộn phần trình bày diff lên một trang" -#: gitk:3001 +#: gitk:3066 msgid "<Space>\t\tScroll diff view down one page" msgstr "<Space>\t\tCuộn phần trình bày diff xuống một trang" -#: gitk:3002 +#: gitk:3067 msgid "u\t\tScroll diff view up 18 lines" msgstr "u\t\tCuộn phần trình bày diff lên 18 dòng" -#: gitk:3003 +#: gitk:3068 msgid "d\t\tScroll diff view down 18 lines" msgstr "d\t\tCuộn phần trình bày diff xuống 18 dòng" -#: gitk:3004 +#: gitk:3069 #, tcl-format msgid "<%s-F>\t\tFind" msgstr "<%s-F>\t\tTìm kiếm" -#: gitk:3005 +#: gitk:3070 #, tcl-format msgid "<%s-G>\t\tMove to next find hit" msgstr "<%s-G>\t\tDi chuyển đến chỗ gặp kế tiếp" -#: gitk:3006 +#: gitk:3071 msgid "<Return>\tMove to next find hit" msgstr "<Return>\t\tDi chuyển đến chỗ gặp kế tiếp" -#: gitk:3007 +#: gitk:3072 msgid "/\t\tFocus the search box" msgstr "/\t\tĐưa con trỏ chuột vào ô tìm kiếm" -#: gitk:3008 +#: gitk:3073 msgid "?\t\tMove to previous find hit" msgstr "?\t\tDi chuyển đến chỗ gặp kế trước" -#: gitk:3009 +#: gitk:3074 msgid "f\t\tScroll diff view to next file" msgstr "f\t\tCuộn phần trình bày diff sang tập-tin kế" -#: gitk:3010 +#: gitk:3075 #, tcl-format msgid "<%s-S>\t\tSearch for next hit in diff view" msgstr "<%s-S>\t\tTìm đến chỗ khác biệt kế tiếp" -#: gitk:3011 +#: gitk:3076 #, tcl-format msgid "<%s-R>\t\tSearch for previous hit in diff view" msgstr "<%s-R>\t\tTìm đến chỗ khác biệt kế trước" -#: gitk:3012 +#: gitk:3077 #, tcl-format msgid "<%s-KP+>\tIncrease font size" msgstr "<%s-KP+>\tTăng cỡ chữ" -#: gitk:3013 +#: gitk:3078 #, tcl-format msgid "<%s-plus>\tIncrease font size" msgstr "<%s-plus>\tTăng cỡ chữ" -#: gitk:3014 +#: gitk:3079 #, tcl-format msgid "<%s-KP->\tDecrease font size" msgstr "<%s-KP->\tGiảm cỡ chữ" -#: gitk:3015 +#: gitk:3080 #, tcl-format msgid "<%s-minus>\tDecrease font size" msgstr "<%s-minus>\tGiảm cỡ chữ" -#: gitk:3016 +#: gitk:3081 msgid "<F5>\t\tUpdate" msgstr "<F5>\t\tCập nhật" -#: gitk:3471 gitk:3480 +#: gitk:3546 gitk:3555 #, tcl-format msgid "Error creating temporary directory %s:" msgstr "Gặp lỗi khi tạo thư mục tạm %s:" -#: gitk:3493 +#: gitk:3568 #, tcl-format msgid "Error getting \"%s\" from %s:" msgstr "Lỗi chào hỏi \"%s\" từ %s:" -#: gitk:3556 +#: gitk:3631 msgid "command failed:" msgstr "lệnh gặp lỗi:" -#: gitk:3705 +#: gitk:3780 msgid "No such commit" msgstr "Không có lần chuyển giao như vậy" -#: gitk:3719 +#: gitk:3794 msgid "git gui blame: command failed:" msgstr "git gui blame: lệnh gặp lỗi:" -#: gitk:3750 +#: gitk:3825 #, tcl-format msgid "Couldn't read merge head: %s" msgstr "Không thể độc đầu của hòa trộn: %s" # tcl-format -#: gitk:3758 +#: gitk:3833 #, tcl-format msgid "Error reading index: %s" msgstr "Gặp lỗi khi đọc chỉ mục: %s" -#: gitk:3783 +#: gitk:3858 #, tcl-format msgid "Couldn't start git blame: %s" msgstr "Không thể khởi chạy git blame: %s" -#: gitk:3786 gitk:6652 +#: gitk:3861 gitk:6735 msgid "Searching" msgstr "Đang tìm kiếm" -#: gitk:3818 +#: gitk:3893 #, tcl-format msgid "Error running git blame: %s" msgstr "Gặp lỗi khi chạy git blame: %s" -#: gitk:3846 +#: gitk:3921 #, tcl-format msgid "That line comes from commit %s, which is not in this view" msgstr "Dòng đến từ lần chuyển giao %s, cái mà không trong trình bày này" -#: gitk:3860 +#: gitk:3935 msgid "External diff viewer failed:" msgstr "Bộ trình bày diff từ bên ngoài gặp lỗi:" -#: gitk:3978 +#: gitk:4053 msgid "Gitk view definition" msgstr "Định nghĩa cách trình bày gitk" -#: gitk:3982 +#: gitk:4057 msgid "Remember this view" msgstr "Nhớ cách trình bày này" -#: gitk:3983 +#: gitk:4058 msgid "References (space separated list):" msgstr "Tham chiếu (danh sách ngăn cách bằng dấu cách):" -#: gitk:3984 +#: gitk:4059 msgid "Branches & tags:" msgstr "Nhánh & thẻ:" -#: gitk:3985 +#: gitk:4060 msgid "All refs" msgstr "Mọi tham chiếu" -#: gitk:3986 +#: gitk:4061 msgid "All (local) branches" msgstr "Mọi nhánh (nội bộ)" -#: gitk:3987 +#: gitk:4062 msgid "All tags" msgstr "Mọi thẻ" -#: gitk:3988 +#: gitk:4063 msgid "All remote-tracking branches" msgstr "Mọi nhánh remote-tracking" -#: gitk:3989 +#: gitk:4064 msgid "Commit Info (regular expressions):" msgstr "Thông tin chuyển giao (biểu thức chính quy):" -#: gitk:3990 +#: gitk:4065 msgid "Author:" msgstr "Tác giả:" -#: gitk:3991 +#: gitk:4066 msgid "Committer:" msgstr "Người chuyển giao:" -#: gitk:3992 +#: gitk:4067 msgid "Commit Message:" msgstr "Chú thích của lần chuyển giao:" -#: gitk:3993 +#: gitk:4068 msgid "Matches all Commit Info criteria" msgstr "Khớp mọi điều kiện Thông tin Chuyển giao" -#: gitk:3994 +#: gitk:4069 +#, fuzzy +msgid "Matches none Commit Info criteria" +msgstr "Khớp mọi điều kiện Thông tin Chuyển giao" + +#: gitk:4070 msgid "Changes to Files:" msgstr "Đổi thành Tập tin:" -#: gitk:3995 +#: gitk:4071 msgid "Fixed String" msgstr "Chuỗi cố định" -#: gitk:3996 +#: gitk:4072 msgid "Regular Expression" msgstr "Biểu thức chính quy" -#: gitk:3997 +#: gitk:4073 msgid "Search string:" msgstr "Chuỗi tìm kiếm:" -#: gitk:3998 +#: gitk:4074 msgid "" "Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" @@ -678,203 +681,203 @@ msgstr "" "Ngày chuyển giao (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " "15:27:38\"):" -#: gitk:3999 +#: gitk:4075 msgid "Since:" msgstr "Kể từ:" -#: gitk:4000 +#: gitk:4076 msgid "Until:" msgstr "Đến:" -#: gitk:4001 +#: gitk:4077 msgid "Limit and/or skip a number of revisions (positive integer):" msgstr "Giới hạn và/hoặc bỏ số của điểm xét (số nguyên âm):" -#: gitk:4002 +#: gitk:4078 msgid "Number to show:" msgstr "Số lượng hiển thị:" -#: gitk:4003 +#: gitk:4079 msgid "Number to skip:" msgstr "Số lượng sẽ bỏ qua:" -#: gitk:4004 +#: gitk:4080 msgid "Miscellaneous options:" msgstr "Tuỳ chọn hỗn hợp:" -#: gitk:4005 +#: gitk:4081 msgid "Strictly sort by date" msgstr "Sắp xếp chặt chẽ theo ngày" -#: gitk:4006 +#: gitk:4082 msgid "Mark branch sides" msgstr "Đánh dấu các cạnh nhánh" -#: gitk:4007 +#: gitk:4083 msgid "Limit to first parent" msgstr "Giới hạn thành cha mẹ đầu tiên" -#: gitk:4008 +#: gitk:4084 msgid "Simple history" msgstr "Lịch sử dạng đơn giản" -#: gitk:4009 +#: gitk:4085 msgid "Additional arguments to git log:" msgstr "Đối số bổ xung cho lệnh git log:" -#: gitk:4010 +#: gitk:4086 msgid "Enter files and directories to include, one per line:" msgstr "Nhập vào các tập tin và thư mục bao gồm, mỗi dòng một cái:" -#: gitk:4011 +#: gitk:4087 msgid "Command to generate more commits to include:" msgstr "Lệnh tạo ra nhiều lần chuyển giao hơn bao gồm:" -#: gitk:4135 +#: gitk:4211 msgid "Gitk: edit view" msgstr "Gitk: sửa cách trình bày" -#: gitk:4143 +#: gitk:4219 msgid "-- criteria for selecting revisions" msgstr "-- tiêu chuẩn chọn điểm xét duyệt" -#: gitk:4148 +#: gitk:4224 msgid "View Name" msgstr "Tên cách trình bày" -#: gitk:4223 +#: gitk:4299 msgid "Apply (F5)" msgstr "Áp dụng (F5)" -#: gitk:4261 +#: gitk:4337 msgid "Error in commit selection arguments:" msgstr "Lỗi trong các đối số chọn chuyển giao:" -#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185 +#: gitk:4392 gitk:4445 gitk:4906 gitk:4920 gitk:6190 gitk:12346 gitk:12347 msgid "None" msgstr "Không" -#: gitk:4924 gitk:4929 +#: gitk:5003 gitk:5008 msgid "Descendant" msgstr "Con cháu" -#: gitk:4925 +#: gitk:5004 msgid "Not descendant" msgstr "Không có con cháu" -#: gitk:4932 gitk:4937 +#: gitk:5011 gitk:5016 msgid "Ancestor" msgstr "Tổ tiên chung" -#: gitk:4933 +#: gitk:5012 msgid "Not ancestor" msgstr "Không có chung tổ tiên" -#: gitk:5223 +#: gitk:5306 msgid "Local changes checked in to index but not committed" msgstr "" "Có thay đổi nội bộ đã được đưa vào bảng mục lục, nhưng chưa được chuyển giao" -#: gitk:5259 +#: gitk:5342 msgid "Local uncommitted changes, not checked in to index" msgstr "Có thay đổi nội bộ, nhưng chưa được đưa vào bảng mục lục" -#: gitk:7032 +#: gitk:7115 msgid "and many more" msgstr "và nhiều nữa" -#: gitk:7035 +#: gitk:7118 msgid "many" msgstr "nhiều" -#: gitk:7222 +#: gitk:7309 msgid "Tags:" msgstr "Thẻ:" -#: gitk:7239 gitk:7245 gitk:8708 +#: gitk:7326 gitk:7332 gitk:8806 msgid "Parent" msgstr "Cha" -#: gitk:7250 +#: gitk:7337 msgid "Child" msgstr "Con" -#: gitk:7259 +#: gitk:7346 msgid "Branch" msgstr "Nhánh" -#: gitk:7262 +#: gitk:7349 msgid "Follows" msgstr "Đứng sau" -#: gitk:7265 +#: gitk:7352 msgid "Precedes" msgstr "Đứng trước" # tcl-format -#: gitk:7849 +#: gitk:7947 #, tcl-format msgid "Error getting diffs: %s" msgstr "Lỗi lấy diff: %s" -#: gitk:8533 +#: gitk:8631 msgid "Goto:" msgstr "Nhảy tới:" -#: gitk:8554 +#: gitk:8652 #, tcl-format msgid "Short SHA1 id %s is ambiguous" msgstr "Định danh SHA1 dạng ngắn %s là chưa đủ rõ ràng" -#: gitk:8561 +#: gitk:8659 #, tcl-format msgid "Revision %s is not known" msgstr "Không hiểu điểm xét duyệt %s" -#: gitk:8571 +#: gitk:8669 #, tcl-format msgid "SHA1 id %s is not known" msgstr "Không hiểu định danh SHA1 %s" -#: gitk:8573 +#: gitk:8671 #, tcl-format msgid "Revision %s is not in the current view" msgstr "Điểm %s không ở trong phần hiển thị hiện tại" -#: gitk:8715 gitk:8730 +#: gitk:8813 gitk:8828 msgid "Date" msgstr "Ngày" -#: gitk:8718 +#: gitk:8816 msgid "Children" msgstr "Con cháu" -#: gitk:8781 +#: gitk:8879 #, tcl-format msgid "Reset %s branch to here" msgstr "Đặt lại nhánh %s tại đây" -#: gitk:8783 +#: gitk:8881 msgid "Detached head: can't reset" msgstr "Head đã bị tách rời: không thể đặt lại" -#: gitk:8888 gitk:8894 +#: gitk:8986 gitk:8992 msgid "Skipping merge commit " msgstr "Bỏ qua lần chuyển giao hòa trộn " -#: gitk:8903 gitk:8908 +#: gitk:9001 gitk:9006 msgid "Error getting patch ID for " msgstr "Gặp lỗi khi lấy ID miếng vá cho " -#: gitk:8904 gitk:8909 +#: gitk:9002 gitk:9007 msgid " - stopping\n" msgstr " - dừng\n" -#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948 +#: gitk:9012 gitk:9015 gitk:9023 gitk:9037 gitk:9046 msgid "Commit " msgstr "Commit " -#: gitk:8918 +#: gitk:9016 msgid "" " is the same patch as\n" " " @@ -882,7 +885,7 @@ msgstr "" " là cùng một miếng vá với\n" " " -#: gitk:8926 +#: gitk:9024 msgid "" " differs from\n" " " @@ -890,7 +893,7 @@ msgstr "" " khác biệt từ\n" " " -#: gitk:8928 +#: gitk:9026 msgid "" "Diff of commits:\n" "\n" @@ -898,131 +901,131 @@ msgstr "" "Khác biệt của lần chuyển giao (commit):\n" "\n" -#: gitk:8940 gitk:8949 +#: gitk:9038 gitk:9047 #, tcl-format msgid " has %s children - stopping\n" msgstr " có %s con - dừng\n" -#: gitk:8968 +#: gitk:9066 #, tcl-format msgid "Error writing commit to file: %s" msgstr "Gặp lỗi trong quá trình ghi lần chuyển giao vào tập tin: %s" -#: gitk:8974 +#: gitk:9072 #, tcl-format msgid "Error diffing commits: %s" msgstr "Gặp lỗi khi so sánh sự khác biệt giữa các lần chuyển giao: %s" -#: gitk:9020 +#: gitk:9118 msgid "Top" msgstr "Đỉnh" -#: gitk:9021 +#: gitk:9119 msgid "From" msgstr "Từ" -#: gitk:9026 +#: gitk:9124 msgid "To" msgstr "Đến" -#: gitk:9050 +#: gitk:9148 msgid "Generate patch" msgstr "Tạo miếng vá" -#: gitk:9052 +#: gitk:9150 msgid "From:" msgstr "Từ:" -#: gitk:9061 +#: gitk:9159 msgid "To:" msgstr "Đến:" -#: gitk:9070 +#: gitk:9168 msgid "Reverse" msgstr "Đảo ngược" -#: gitk:9072 gitk:9268 +#: gitk:9170 gitk:9366 msgid "Output file:" msgstr "Tập tin kết xuất:" -#: gitk:9078 +#: gitk:9176 msgid "Generate" msgstr "Tạo" -#: gitk:9116 +#: gitk:9214 msgid "Error creating patch:" msgstr "Gặp lỗi khi tạo miếng vá:" -#: gitk:9139 gitk:9256 gitk:9313 +#: gitk:9237 gitk:9354 gitk:9411 msgid "ID:" msgstr "ID:" -#: gitk:9148 +#: gitk:9246 msgid "Tag name:" msgstr "Tên thẻ:" -#: gitk:9151 +#: gitk:9249 msgid "Tag message is optional" msgstr "Ghi chú thẻ chỉ là tùy chọn" -#: gitk:9153 +#: gitk:9251 msgid "Tag message:" msgstr "Ghi chú cho thẻ:" -#: gitk:9157 gitk:9322 +#: gitk:9255 gitk:9420 msgid "Create" msgstr "Tạo" -#: gitk:9175 +#: gitk:9273 msgid "No tag name specified" msgstr "Chưa chỉ ra tên của thẻ" -#: gitk:9179 +#: gitk:9277 #, tcl-format msgid "Tag \"%s\" already exists" msgstr "Thẻ “%s” đã có sẵn rồi" -#: gitk:9189 +#: gitk:9287 msgid "Error creating tag:" msgstr "Gặp lỗi khi tạo thẻ:" -#: gitk:9265 +#: gitk:9363 msgid "Command:" msgstr "Lệnh:" -#: gitk:9273 +#: gitk:9371 msgid "Write" msgstr "Ghi" -#: gitk:9291 +#: gitk:9389 msgid "Error writing commit:" msgstr "Gặp lỗi trong quá trình ghi chuyển giao:" -#: gitk:9318 +#: gitk:9416 msgid "Name:" msgstr "Tên:" -#: gitk:9341 +#: gitk:9439 msgid "Please specify a name for the new branch" msgstr "Vui lòng chỉ định tên cho nhánh mới" -#: gitk:9346 +#: gitk:9444 #, tcl-format msgid "Branch '%s' already exists. Overwrite?" msgstr "Nhánh “%s” đã có từ trước rồi. Ghi đè?" -#: gitk:9413 +#: gitk:9511 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" "Lần chuyển giao %s đã sẵn được bao gồm trong nhánh %s -- bạn có thực sự muốn " "áp dụng lại nó không?" -#: gitk:9418 +#: gitk:9516 msgid "Cherry-picking" msgstr "Đang cherry-pick" -#: gitk:9427 +#: gitk:9525 #, tcl-format msgid "" "Cherry-pick failed because of local changes to file '%s'.\n" @@ -1031,7 +1034,7 @@ msgstr "" "Cherry-pick gặp lỗi bởi vì các thay đổi nội bộ tập tin “%s”.\n" "Xin hãy chuyển giao, reset hay stash các thay đổi của bạn sau đó thử lại." -#: gitk:9433 +#: gitk:9531 msgid "" "Cherry-pick failed because of merge conflict.\n" "Do you wish to run git citool to resolve it?" @@ -1039,22 +1042,22 @@ msgstr "" "Cherry-pick gặp lỗi bởi vì xung đột trong hòa trộn.\n" "Bạn có muốn chạy lệnh “git citool” để giải quyết vấn đề này không?" -#: gitk:9449 gitk:9507 +#: gitk:9547 gitk:9605 msgid "No changes committed" msgstr "Không có thay đổi nào cần chuyển giao" -#: gitk:9476 +#: gitk:9574 #, tcl-format msgid "Commit %s is not included in branch %s -- really revert it?" msgstr "" "Lần chuyển giao %s không được bao gồm trong nhánh %s -- bạn có thực sự muốn " "“revert” nó không?" -#: gitk:9481 +#: gitk:9579 msgid "Reverting" msgstr "Đang hoàn tác" -#: gitk:9489 +#: gitk:9587 #, tcl-format msgid "" "Revert failed because of local changes to the following files:%s Please " @@ -1063,7 +1066,7 @@ msgstr "" "Revert gặp lỗi bởi vì tập tin sau đã được thay đổi nội bộ:%s\n" "Xin hãy chạy lệnh “commit”, “reset” hoặc “stash” rồi thử lại." -#: gitk:9493 +#: gitk:9591 msgid "" "Revert failed because of merge conflict.\n" " Do you wish to run git citool to resolve it?" @@ -1071,29 +1074,29 @@ msgstr "" "Revert gặp lỗi bởi vì xung đột hòa trộn.\n" " Bạn có muốn chạy lệnh “git citool” để phân giải nó không?" -#: gitk:9536 +#: gitk:9634 msgid "Confirm reset" msgstr "Xác nhật đặt lại" -#: gitk:9538 +#: gitk:9636 #, tcl-format msgid "Reset branch %s to %s?" msgstr "Đặt lại nhánh “%s” thành “%s”?" -#: gitk:9540 +#: gitk:9638 msgid "Reset type:" msgstr "Kiểu đặt lại:" -#: gitk:9543 +#: gitk:9641 msgid "Soft: Leave working tree and index untouched" msgstr "Mềm: Không động đến thư mục làm việc và bảng mục lục" -#: gitk:9546 +#: gitk:9644 msgid "Mixed: Leave working tree untouched, reset index" msgstr "" "Pha trộn: Không động chạm đến thư mục làm việc nhưng đặt lại bảng mục lục" -#: gitk:9549 +#: gitk:9647 msgid "" "Hard: Reset working tree and index\n" "(discard ALL local changes)" @@ -1101,19 +1104,19 @@ msgstr "" "Hard: Đặt lại cây làm việc và mục lục\n" "(hủy bỏ MỌI thay đổi nội bộ)" -#: gitk:9566 +#: gitk:9664 msgid "Resetting" msgstr "Đang đặt lại" -#: gitk:9626 +#: gitk:9724 msgid "Checking out" msgstr "Đang checkout" -#: gitk:9679 +#: gitk:9777 msgid "Cannot delete the currently checked-out branch" msgstr "Không thể xóa nhánh hiện tại đang được lấy ra" -#: gitk:9685 +#: gitk:9783 #, tcl-format msgid "" "The commits on branch %s aren't on any other branch.\n" @@ -1122,16 +1125,16 @@ msgstr "" "Các lần chuyển giao trên nhánh %s không ở trên nhánh khác.\n" "Thực sự muốn xóa nhánh %s?" -#: gitk:9716 +#: gitk:9814 #, tcl-format msgid "Tags and heads: %s" msgstr "Thẻ và Đầu: %s" -#: gitk:9731 +#: gitk:9829 msgid "Filter" msgstr "Bộ lọc" -#: gitk:10027 +#: gitk:10125 msgid "" "Error reading commit topology information; branch and preceding/following " "tag information will be incomplete." @@ -1139,213 +1142,219 @@ msgstr "" "Gặp lỗi khi đọc thông tin hình học lần chuyển giao; thông tin nhánh và thẻ " "trước/sau sẽ không hoàn thiện." -#: gitk:11004 +#: gitk:11102 msgid "Tag" msgstr "Thẻ" -#: gitk:11008 +#: gitk:11106 msgid "Id" msgstr "Id" -#: gitk:11091 +#: gitk:11189 msgid "Gitk font chooser" msgstr "Hộp thoại chọn phông Gitk" -#: gitk:11108 +#: gitk:11206 msgid "B" msgstr "B" -#: gitk:11111 +#: gitk:11209 msgid "I" msgstr "I" -#: gitk:11229 +#: gitk:11327 msgid "Commit list display options" msgstr "Các tùy chọn về hiển thị danh sách lần chuyển giao" -#: gitk:11232 +#: gitk:11330 msgid "Maximum graph width (lines)" msgstr "Độ rộng biểu đồ tối đa (dòng)" -#: gitk:11235 -#, tcl-format +#: gitk:11334 +#, no-tcl-format msgid "Maximum graph width (% of pane)" msgstr "Độ rộng biểu đồ tối đa (% của bảng)" -#: gitk:11238 +#: gitk:11337 msgid "Show local changes" msgstr "Hiển thị các thay đổi nội bộ" -#: gitk:11241 +#: gitk:11340 msgid "Auto-select SHA1 (length)" msgstr "Tự chọn SHA1 (độ dài)" -#: gitk:11245 +#: gitk:11344 msgid "Hide remote refs" msgstr "Ẩn tham chiếu đến máy chủ" -#: gitk:11249 +#: gitk:11348 msgid "Diff display options" msgstr "Các tùy chọn trình bày các khác biệt" -#: gitk:11251 +#: gitk:11350 msgid "Tab spacing" msgstr "Khoảng cách tab" -#: gitk:11254 +#: gitk:11353 msgid "Display nearby tags/heads" msgstr "Hiển thị các thẻ/đầu xung quanh" -#: gitk:11257 +#: gitk:11356 msgid "Maximum # tags/heads to show" msgstr "Số lượng thẻ/đầu tối đa sẽ hiển thị" -#: gitk:11260 +#: gitk:11359 msgid "Limit diffs to listed paths" msgstr "Giới hạn các khác biệt cho đường dẫn đã liệt kê" -#: gitk:11263 +#: gitk:11362 msgid "Support per-file encodings" msgstr "Hỗ trợ mã hóa mỗi-dòng" -#: gitk:11269 gitk:11416 +#: gitk:11368 gitk:11515 msgid "External diff tool" msgstr "Công cụ so sánh từ bên ngoài" -#: gitk:11270 +#: gitk:11369 msgid "Choose..." msgstr "Chọn..." -#: gitk:11275 +#: gitk:11374 msgid "General options" msgstr "Các tùy chọn chung" -#: gitk:11278 +#: gitk:11377 msgid "Use themed widgets" msgstr "Dùng các widget chủ đề" -#: gitk:11280 +#: gitk:11379 msgid "(change requires restart)" msgstr "(để thay đổi cần khởi động lại)" -#: gitk:11282 +#: gitk:11381 msgid "(currently unavailable)" msgstr "(hiện tại không sẵn sàng)" -#: gitk:11293 +#: gitk:11392 msgid "Colors: press to choose" msgstr "Màu sắc: bấm vào nút phía dưới để chọn màu" -#: gitk:11296 +#: gitk:11395 msgid "Interface" msgstr "Giao diện" -#: gitk:11297 +#: gitk:11396 msgid "interface" msgstr "giao diện" -#: gitk:11300 +#: gitk:11399 msgid "Background" msgstr "Nền" -#: gitk:11301 gitk:11331 +#: gitk:11400 gitk:11430 msgid "background" msgstr "nền" -#: gitk:11304 +#: gitk:11403 msgid "Foreground" msgstr "Tiền cảnh" -#: gitk:11305 +#: gitk:11404 msgid "foreground" msgstr "tiền cảnh" -#: gitk:11308 +#: gitk:11407 msgid "Diff: old lines" msgstr "So sánh: dòng cũ" -#: gitk:11309 +#: gitk:11408 msgid "diff old lines" msgstr "diff dòng cũ" -#: gitk:11313 +#: gitk:11412 msgid "Diff: new lines" msgstr "So sánh: dòng mới" -#: gitk:11314 +#: gitk:11413 msgid "diff new lines" msgstr "màu dòng mới" -#: gitk:11318 +#: gitk:11417 msgid "Diff: hunk header" msgstr "So sánh: phần đầu của đoạn" -#: gitk:11320 +#: gitk:11419 msgid "diff hunk header" msgstr "màu của phần đầu của đoạn khi so sánh" -#: gitk:11324 +#: gitk:11423 msgid "Marked line bg" msgstr "Nền dòng đánh dấu" -#: gitk:11326 +#: gitk:11425 msgid "marked line background" msgstr "nền dòng được đánh dấu" -#: gitk:11330 +#: gitk:11429 msgid "Select bg" msgstr "Màu nền" -#: gitk:11339 +#: gitk:11438 msgid "Fonts: press to choose" msgstr "Phông chữ: bấm vào các nút ở dưới để chọn" -#: gitk:11341 +#: gitk:11440 msgid "Main font" msgstr "Phông chữ chính" -#: gitk:11342 +#: gitk:11441 msgid "Diff display font" msgstr "Phông chữ dùng khi so sánh" -#: gitk:11343 +#: gitk:11442 msgid "User interface font" msgstr "Phông chữ giao diện" -#: gitk:11365 +#: gitk:11464 msgid "Gitk preferences" msgstr "Cá nhân hóa các cài đặt cho Gitk" -#: gitk:11374 +#: gitk:11473 msgid "General" msgstr "Chung" -#: gitk:11375 +#: gitk:11474 msgid "Colors" msgstr "Màu sắc" -#: gitk:11376 +#: gitk:11475 msgid "Fonts" msgstr "Phông chữ" -#: gitk:11426 +#: gitk:11525 #, tcl-format msgid "Gitk: choose color for %s" msgstr "Gitk: chọn màu cho %s" -#: gitk:12080 +#: gitk:12242 msgid "Cannot find a git repository here." msgstr "Không thể tìm thấy kho git ở đây." -#: gitk:12127 +#: gitk:12289 #, tcl-format msgid "Ambiguous argument '%s': both revision and filename" msgstr "Đối số “%s” chưa rõ ràng: vừa là điểm xét duyệt vừa là tên tập tin" -#: gitk:12139 +#: gitk:12301 msgid "Bad arguments to gitk:" msgstr "Đối số không hợp lệ cho gitk:" -#: gitk:12242 +#: gitk:12405 msgid "Command line" msgstr "Dòng lệnh" + +#~ msgid "next" +#~ msgstr "tiếp" + +#~ msgid "prev" +#~ msgstr "trước" @@ -1661,8 +1661,8 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type, const void *identifier) { gs->type = type; - gs->name = name ? xstrdup(name) : NULL; - gs->path = path ? xstrdup(path) : NULL; + gs->name = xstrdup_or_null(name); + gs->path = xstrdup_or_null(path); gs->buf = NULL; gs->size = 0; gs->driver = NULL; @@ -59,7 +59,7 @@ int get_sha1_hex(const char *hex, unsigned char *sha1) char *sha1_to_hex(const unsigned char *sha1) { static int bufno; - static char hexbuffer[4][50]; + static char hexbuffer[4][41]; static const char hex[] = "0123456789abcdef"; char *buffer = hexbuffer[3 & ++bufno], *buf = buffer; int i; diff --git a/http-push.c b/http-push.c index 0beb7ab67f..bfb1c9605b 100644 --- a/http-push.c +++ b/http-push.c @@ -365,7 +365,6 @@ static void start_put(struct transfer_request *request) hdrlen = sprintf(hdr, "%s %lu", typename(type), len) + 1; /* Set it up */ - memset(&stream, 0, sizeof(stream)); git_deflate_init(&stream, zlib_compression_level); size = git_deflate_bound(&stream, len + hdrlen); strbuf_init(&request->buffer.buf, size); @@ -8,6 +8,7 @@ #include "credential.h" #include "version.h" #include "pkt-line.h" +#include "gettext.h" int active_requests; int http_is_verbose; @@ -62,12 +63,17 @@ static const char *user_agent; static struct credential cert_auth = CREDENTIAL_INIT; static int ssl_cert_password_required; +#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY +static unsigned long http_auth_methods = CURLAUTH_ANY; +#endif static struct curl_slist *pragma_header; static struct curl_slist *no_pragma_header; static struct active_request_slot *active_queue_head; +static char *cached_accept_language; + size_t fread_buffer(char *ptr, size_t eltsize, size_t nmemb, void *buffer_) { size_t size = eltsize * nmemb; @@ -114,6 +120,37 @@ size_t fwrite_null(char *ptr, size_t eltsize, size_t nmemb, void *strbuf) return eltsize * nmemb; } +static void closedown_active_slot(struct active_request_slot *slot) +{ + active_requests--; + slot->in_use = 0; +} + +static void finish_active_slot(struct active_request_slot *slot) +{ + closedown_active_slot(slot); + curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE, &slot->http_code); + + if (slot->finished != NULL) + (*slot->finished) = 1; + + /* Store slot results so they can be read after the slot is reused */ + if (slot->results != NULL) { + slot->results->curl_result = slot->curl_result; + slot->results->http_code = slot->http_code; +#if LIBCURL_VERSION_NUM >= 0x070a08 + curl_easy_getinfo(slot->curl, CURLINFO_HTTPAUTH_AVAIL, + &slot->results->auth_avail); +#else + slot->results->auth_avail = 0; +#endif + } + + /* Run callback if appropriate */ + if (slot->callback_func != NULL) + slot->callback_func(slot->callback_data); +} + #ifdef USE_CURL_MULTI static void process_curl_messages(void) { @@ -369,7 +406,9 @@ static CURL *get_curl_handle(void) if (curl_http_proxy) { curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy); +#if LIBCURL_VERSION_NUM >= 0x070a07 curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY); +#endif } set_curl_keepalive(result); @@ -515,6 +554,9 @@ void http_cleanup(void) cert_auth.password = NULL; } ssl_cert_password_required = 0; + + free(cached_accept_language); + cached_accept_language = NULL; } struct active_request_slot *get_active_slot(void) @@ -580,6 +622,9 @@ struct active_request_slot *get_active_slot(void) curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 0); curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); curl_easy_setopt(slot->curl, CURLOPT_FAILONERROR, 1); +#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY + curl_easy_setopt(slot->curl, CURLOPT_HTTPAUTH, http_auth_methods); +#endif if (http_auth.password) init_curl_http_auth(slot->curl); @@ -730,12 +775,6 @@ void run_active_slot(struct active_request_slot *slot) #endif } -static void closedown_active_slot(struct active_request_slot *slot) -{ - active_requests--; - slot->in_use = 0; -} - static void release_active_slot(struct active_request_slot *slot) { closedown_active_slot(slot); @@ -752,31 +791,6 @@ static void release_active_slot(struct active_request_slot *slot) #endif } -void finish_active_slot(struct active_request_slot *slot) -{ - closedown_active_slot(slot); - curl_easy_getinfo(slot->curl, CURLINFO_HTTP_CODE, &slot->http_code); - - if (slot->finished != NULL) - (*slot->finished) = 1; - - /* Store slot results so they can be read after the slot is reused */ - if (slot->results != NULL) { - slot->results->curl_result = slot->curl_result; - slot->results->http_code = slot->http_code; -#if LIBCURL_VERSION_NUM >= 0x070a08 - curl_easy_getinfo(slot->curl, CURLINFO_HTTPAUTH_AVAIL, - &slot->results->auth_avail); -#else - slot->results->auth_avail = 0; -#endif - } - - /* Run callback if appropriate */ - if (slot->callback_func != NULL) - slot->callback_func(slot->callback_data); -} - void finish_all_active_slots(void) { struct active_request_slot *slot = active_queue_head; @@ -839,7 +853,7 @@ char *get_remote_object_url(const char *url, const char *hex, return strbuf_detach(&buf, NULL); } -int handle_curl_result(struct slot_results *results) +static int handle_curl_result(struct slot_results *results) { /* * If we see a failing http code with CURLE_OK, we have turned off @@ -870,6 +884,9 @@ int handle_curl_result(struct slot_results *results) credential_reject(&http_auth); return HTTP_NOAUTH; } else { +#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY + http_auth_methods &= ~CURLAUTH_GSSNEGOTIATE; +#endif return HTTP_REAUTH; } } else { @@ -986,6 +1003,117 @@ static void extract_content_type(struct strbuf *raw, struct strbuf *type, strbuf_addstr(charset, "ISO-8859-1"); } +static void write_accept_language(struct strbuf *buf) +{ + /* + * MAX_DECIMAL_PLACES must not be larger than 3. If it is larger than + * that, q-value will be smaller than 0.001, the minimum q-value the + * HTTP specification allows. See + * http://tools.ietf.org/html/rfc7231#section-5.3.1 for q-value. + */ + const int MAX_DECIMAL_PLACES = 3; + const int MAX_LANGUAGE_TAGS = 1000; + const int MAX_ACCEPT_LANGUAGE_HEADER_SIZE = 4000; + char **language_tags = NULL; + int num_langs = 0; + const char *s = get_preferred_languages(); + int i; + struct strbuf tag = STRBUF_INIT; + + /* Don't add Accept-Language header if no language is preferred. */ + if (!s) + return; + + /* + * Split the colon-separated string of preferred languages into + * language_tags array. + */ + do { + /* collect language tag */ + for (; *s && (isalnum(*s) || *s == '_'); s++) + strbuf_addch(&tag, *s == '_' ? '-' : *s); + + /* skip .codeset, @modifier and any other unnecessary parts */ + while (*s && *s != ':') + s++; + + if (tag.len) { + num_langs++; + REALLOC_ARRAY(language_tags, num_langs); + language_tags[num_langs - 1] = strbuf_detach(&tag, NULL); + if (num_langs >= MAX_LANGUAGE_TAGS - 1) /* -1 for '*' */ + break; + } + } while (*s++); + + /* write Accept-Language header into buf */ + if (num_langs) { + int last_buf_len = 0; + int max_q; + int decimal_places; + char q_format[32]; + + /* add '*' */ + REALLOC_ARRAY(language_tags, num_langs + 1); + language_tags[num_langs++] = "*"; /* it's OK; this won't be freed */ + + /* compute decimal_places */ + for (max_q = 1, decimal_places = 0; + max_q < num_langs && decimal_places <= MAX_DECIMAL_PLACES; + decimal_places++, max_q *= 10) + ; + + sprintf(q_format, ";q=0.%%0%dd", decimal_places); + + strbuf_addstr(buf, "Accept-Language: "); + + for (i = 0; i < num_langs; i++) { + if (i > 0) + strbuf_addstr(buf, ", "); + + strbuf_addstr(buf, language_tags[i]); + + if (i > 0) + strbuf_addf(buf, q_format, max_q - i); + + if (buf->len > MAX_ACCEPT_LANGUAGE_HEADER_SIZE) { + strbuf_remove(buf, last_buf_len, buf->len - last_buf_len); + break; + } + + last_buf_len = buf->len; + } + } + + /* free language tags -- last one is a static '*' */ + for (i = 0; i < num_langs - 1; i++) + free(language_tags[i]); + free(language_tags); +} + +/* + * Get an Accept-Language header which indicates user's preferred languages. + * + * Examples: + * LANGUAGE= -> "" + * LANGUAGE=ko:en -> "Accept-Language: ko, en; q=0.9, *; q=0.1" + * LANGUAGE=ko_KR.UTF-8:sr@latin -> "Accept-Language: ko-KR, sr; q=0.9, *; q=0.1" + * LANGUAGE=ko LANG=en_US.UTF-8 -> "Accept-Language: ko, *; q=0.1" + * LANGUAGE= LANG=en_US.UTF-8 -> "Accept-Language: en-US, *; q=0.1" + * LANGUAGE= LANG=C -> "" + */ +static const char *get_accept_language(void) +{ + if (!cached_accept_language) { + struct strbuf buf = STRBUF_INIT; + write_accept_language(&buf); + if (buf.len > 0) + cached_accept_language = strbuf_detach(&buf, NULL); + } + + return cached_accept_language; +} + /* http_request() targets */ #define HTTP_REQUEST_STRBUF 0 #define HTTP_REQUEST_FILE 1 @@ -998,6 +1126,7 @@ static int http_request(const char *url, struct slot_results results; struct curl_slist *headers = NULL; struct strbuf buf = STRBUF_INIT; + const char *accept_language; int ret; slot = get_active_slot(); @@ -1023,6 +1152,11 @@ static int http_request(const char *url, fwrite_buffer); } + accept_language = get_accept_language(); + + if (accept_language) + headers = curl_slist_append(headers, accept_language); + strbuf_addstr(&buf, "Pragma:"); if (options && options->no_cache) strbuf_addstr(&buf, " no-cache"); @@ -1240,7 +1374,7 @@ static int fetch_and_setup_pack_index(struct packed_git **packs_head, int ret; if (has_pack_index(sha1)) { - new_pack = parse_pack_index(sha1, NULL); + new_pack = parse_pack_index(sha1, sha1_pack_index_name(sha1)); if (!new_pack) return -1; /* parse_pack_index() already issued error message */ goto add_pack; @@ -85,9 +85,7 @@ extern curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp); extern struct active_request_slot *get_active_slot(void); extern int start_active_slot(struct active_request_slot *slot); extern void run_active_slot(struct active_request_slot *slot); -extern void finish_active_slot(struct active_request_slot *slot); extern void finish_all_active_slots(void); -extern int handle_curl_result(struct slot_results *results); /* * This will run one slot to completion in a blocking manner, similar to how diff --git a/imap-send.c b/imap-send.c index d69887da5a..37ac4aa86a 100644 --- a/imap-send.c +++ b/imap-send.c @@ -34,8 +34,16 @@ typedef void *SSL; #include "http.h" #endif +#if defined(USE_CURL_FOR_IMAP_SEND) && defined(NO_OPENSSL) +/* only available option */ +#define USE_CURL_DEFAULT 1 +#else +/* strictly opt in */ +#define USE_CURL_DEFAULT 0 +#endif + static int verbosity; -static int use_curl; /* strictly opt in */ +static int use_curl = USE_CURL_DEFAULT; static const char * const imap_send_usage[] = { "git imap-send [-v] [-q] [--[no-]curl] < <mbox>", NULL }; @@ -1504,9 +1512,14 @@ int main(int argc, char **argv) #ifndef USE_CURL_FOR_IMAP_SEND if (use_curl) { - warning("--use-curl not supported in this build"); + warning("--curl not supported in this build"); use_curl = 0; } +#elif defined(NO_OPENSSL) + if (!use_curl) { + warning("--no-curl not supported in this build"); + use_curl = 1; + } #endif if (!server.port) @@ -80,13 +80,13 @@ struct kwset struct trie *next[NCHAR]; /* Table of children of the root. */ char *target; /* Target string if there's only one. */ int mind2; /* Used in Boyer-Moore search for one string. */ - char const *trans; /* Character translation table. */ + unsigned char const *trans; /* Character translation table. */ }; /* Allocate and initialize a keyword set object, returning an opaque pointer to it. Return NULL if memory is not available. */ kwset_t -kwsalloc (char const *trans) +kwsalloc (unsigned char const *trans) { struct kwset *kwset; @@ -381,7 +381,7 @@ kwsprep (kwset_t kws) register struct kwset *kwset; register int i; register struct trie *curr; - register char const *trans; + register unsigned char const *trans; unsigned char delta[NCHAR]; kwset = (struct kwset *) kws; @@ -590,7 +590,7 @@ cwexec (kwset_t kws, char const *text, size_t len, struct kwsmatch *kwsmatch) register int d; register char const *end, *qlim; register struct tree const *tree; - register char const *trans; + register unsigned char const *trans; accept = NULL; @@ -39,7 +39,7 @@ typedef struct kwset_t* kwset_t; if enough memory cannot be obtained. The argument if non-NULL specifies a table of character translations to be applied to all pattern and search text. */ -extern kwset_t kwsalloc(char const *); +extern kwset_t kwsalloc(unsigned char const *); /* Incrementally extend the keyword set to include the given string. Return NULL for success, or an error message. Remember an index diff --git a/line-log.c b/line-log.c index b7864ad586..a490efea07 100644 --- a/line-log.c +++ b/line-log.c @@ -237,7 +237,7 @@ static void diff_ranges_release(struct diff_ranges *diff) range_set_release(&diff->target); } -void line_log_data_init(struct line_log_data *r) +static void line_log_data_init(struct line_log_data *r) { memset(r, 0, sizeof(struct line_log_data)); range_set_init(&r->ranges, 0); diff --git a/line-log.h b/line-log.h index a9212d84e4..7a5c24e2df 100644 --- a/line-log.h +++ b/line-log.h @@ -54,8 +54,6 @@ struct line_log_data { struct diff_ranges diff; }; -extern void line_log_data_init(struct line_log_data *r); - extern void line_log_init(struct rev_info *rev, const char *prefix, struct string_list *args); extern int line_log_filter(struct rev_info *rev); diff --git a/log-tree.c b/log-tree.c index 7f0890e4ac..2c1ed0fa90 100644 --- a/log-tree.c +++ b/log-tree.c @@ -173,6 +173,43 @@ static void show_children(struct rev_info *opt, struct commit *commit, int abbre } /* + * Do we have HEAD in the output, and also the branch it points at? + * If so, find that decoration entry for that current branch. + */ +static const struct name_decoration *current_pointed_by_HEAD(const struct name_decoration *decoration) +{ + const struct name_decoration *list, *head = NULL; + const char *branch_name = NULL; + unsigned char unused[20]; + int rru_flags; + + /* First find HEAD */ + for (list = decoration; list; list = list->next) + if (list->type == DECORATION_REF_HEAD) { + head = list; + break; + } + if (!head) + return NULL; + + /* Now resolve and find the matching current branch */ + branch_name = resolve_ref_unsafe("HEAD", 0, unused, &rru_flags); + if (!(rru_flags & REF_ISSYMREF)) + return NULL; + if (!skip_prefix(branch_name, "refs/heads/", &branch_name)) + return NULL; + + /* OK, do we have that ref in the list? */ + for (list = decoration; list; list = list->next) + if ((list->type == DECORATION_REF_LOCAL) && + !strcmp(branch_name, list->name)) { + return list; + } + + return NULL; +} + +/* * The caller makes sure there is no funny color before calling. * format_decorations_extended makes sure the same after return. */ @@ -184,6 +221,7 @@ void format_decorations_extended(struct strbuf *sb, const char *suffix) { const struct name_decoration *decoration; + const struct name_decoration *current_and_HEAD; const char *color_commit = diff_get_color(use_color, DIFF_COMMIT); const char *color_reset = @@ -192,15 +230,37 @@ void format_decorations_extended(struct strbuf *sb, decoration = get_name_decoration(&commit->object); if (!decoration) return; + + current_and_HEAD = current_pointed_by_HEAD(decoration); while (decoration) { - strbuf_addstr(sb, color_commit); - strbuf_addstr(sb, prefix); - strbuf_addstr(sb, decorate_get_color(use_color, decoration->type)); - if (decoration->type == DECORATION_REF_TAG) - strbuf_addstr(sb, "tag: "); - strbuf_addstr(sb, decoration->name); - strbuf_addstr(sb, color_reset); - prefix = separator; + /* + * When both current and HEAD are there, only + * show HEAD->current where HEAD would have + * appeared, skipping the entry for current. + */ + if (decoration != current_and_HEAD) { + strbuf_addstr(sb, color_commit); + strbuf_addstr(sb, prefix); + strbuf_addstr(sb, color_reset); + strbuf_addstr(sb, decorate_get_color(use_color, decoration->type)); + if (decoration->type == DECORATION_REF_TAG) + strbuf_addstr(sb, "tag: "); + + strbuf_addstr(sb, decoration->name); + + if (current_and_HEAD && + decoration->type == DECORATION_REF_HEAD) { + strbuf_addstr(sb, color_reset); + strbuf_addstr(sb, color_commit); + strbuf_addstr(sb, " -> "); + strbuf_addstr(sb, color_reset); + strbuf_addstr(sb, decorate_get_color(use_color, current_and_HEAD->type)); + strbuf_addstr(sb, current_and_HEAD->name); + } + strbuf_addstr(sb, color_reset); + + prefix = separator; + } decoration = decoration->next; } strbuf_addstr(sb, color_commit); @@ -1006,7 +1006,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref, t->root = (struct int_node *) xcalloc(1, sizeof(struct int_node)); t->first_non_note = NULL; t->prev_non_note = NULL; - t->ref = notes_ref ? xstrdup(notes_ref) : NULL; + t->ref = xstrdup_or_null(notes_ref); t->combine_notes = combine_notes; t->initialized = 1; t->dirty = 0; diff --git a/pack-bitmap.c b/pack-bitmap.c index 6a818419ca..365f9d92ed 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -60,7 +60,7 @@ static struct bitmap_index { struct ewah_bitmap *blobs; struct ewah_bitmap *tags; - /* Map from SHA1 -> `stored_bitmap` for all the bitmapped comits */ + /* Map from SHA1 -> `stored_bitmap` for all the bitmapped commits */ khash_sha1 *bitmaps; /* Number of bitmapped commits */ @@ -252,6 +252,20 @@ static int load_bitmap_entries_v1(struct bitmap_index *index) return 0; } +static char *pack_bitmap_filename(struct packed_git *p) +{ + char *idx_name; + int len; + + len = strlen(p->pack_name) - strlen(".pack"); + idx_name = xmalloc(len + strlen(".bitmap") + 1); + + memcpy(idx_name, p->pack_name, len); + memcpy(idx_name + len, ".bitmap", strlen(".bitmap") + 1); + + return idx_name; +} + static int open_pack_bitmap_1(struct packed_git *packfile) { int fd; @@ -322,20 +336,6 @@ failed: return -1; } -char *pack_bitmap_filename(struct packed_git *p) -{ - char *idx_name; - int len; - - len = strlen(p->pack_name) - strlen(".pack"); - idx_name = xmalloc(len + strlen(".bitmap") + 1); - - memcpy(idx_name, p->pack_name, len); - memcpy(idx_name + len, ".bitmap", strlen(".bitmap") + 1); - - return idx_name; -} - static int open_pack_bitmap(void) { struct packed_git *p; diff --git a/pack-bitmap.h b/pack-bitmap.h index 487600b18c..0adcef77b5 100644 --- a/pack-bitmap.h +++ b/pack-bitmap.h @@ -38,7 +38,6 @@ int prepare_bitmap_git(void); void count_bitmap_commit_list(uint32_t *commits, uint32_t *trees, uint32_t *blobs, uint32_t *tags); void traverse_bitmap_commit_list(show_reachable_fn show_reachable); void test_bitmap_walk(struct rev_info *revs); -char *pack_bitmap_filename(struct packed_git *p); int prepare_bitmap_walk(struct rev_info *revs); int reuse_partial_packfile_from_bitmap(struct packed_git **packfile, uint32_t *entries, off_t *up_to); int rebuild_existing_bitmaps(struct packing_data *mapping, khash_sha1 *reused_bitmaps, int show_progress); @@ -133,12 +133,12 @@ int term_columns(void) /* * How many columns do we need to show this number in decimal? */ -int decimal_width(int number) +int decimal_width(uintmax_t number) { - int i, width; + int width; - for (width = 1, i = 10; i <= number; width++) - i *= 10; + for (width = 1; number >= 10; width++) + number /= 10; return width; } diff --git a/perl/Git.pm b/perl/Git.pm index b5905ee1ad..9026a7bb98 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -695,7 +695,7 @@ Retrieve the integer configuration C<VARIABLE>. The return value is simple decimal number. An optional value suffix of 'k', 'm', or 'g' in the config file will cause the value to be multiplied by 1024, 1048576 (1024^2), or 1073741824 (1024^3) prior to output. -It would return C<undef> if configuration variable is not defined, +It would return C<undef> if configuration variable is not defined. =cut @@ -704,7 +704,7 @@ sub config_int { } # Common subroutine to implement bulk of what the config* family of methods -# do. This curently wraps command('config') so it is not so fast. +# do. This currently wraps command('config') so it is not so fast. sub _config_common { my ($opts) = shift @_; my ($self, $var) = _maybe_self(@_); diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index 8e4af7153e..152fb7e927 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -9,11 +9,10 @@ use vars qw/$_no_metadata $_use_log_author $_add_author_from $_localtime/; use Carp qw/croak/; use File::Path qw/mkpath/; -use File::Copy qw/copy/; use IPC::Open3; use Memoize; # core since 5.8.0, Jul 2002 -use Memoize::Storable; use POSIX qw(:signal_h); +use Time::Local; use Git qw( command @@ -32,11 +31,7 @@ use Git::SVN::Utils qw( add_path_to_url ); -my $can_use_yaml; -BEGIN { - $can_use_yaml = eval { require Git::SVN::Memoize::YAML; 1}; -} - +my $memo_backend; our $_follow_parent = 1; our $_minimize_url = 'unset'; our $default_repo_id = 'svn'; @@ -1332,7 +1327,7 @@ sub parse_svn_date { $ENV{TZ} = 'UTC'; my $epoch_in_UTC = - POSIX::strftime('%s', $S, $M, $H, $d, $m - 1, $Y - 1900); + Time::Local::timelocal($S, $M, $H, $d, $m - 1, $Y - 1900); # Determine our local timezone (including DST) at the # time of $epoch_in_UTC. $Git::SVN::Log::TZ stored the @@ -1578,7 +1573,16 @@ sub tie_for_persistent_memoization { my $hash = shift; my $path = shift; - if ($can_use_yaml) { + unless ($memo_backend) { + if (eval { require Git::SVN::Memoize::YAML; 1}) { + $memo_backend = 1; + } else { + require Memoize::Storable; + $memo_backend = -1; + } + } + + if ($memo_backend > 0) { tie %$hash => 'Git::SVN::Memoize::YAML', "$path.yaml"; } else { tie %$hash => 'Memoize::Storable', "$path.db", 'nstore'; @@ -2188,8 +2192,9 @@ sub rev_map_set { # both of these options make our .rev_db file very, very important # and we can't afford to lose it because rebuild() won't work if ($self->use_svm_props || $self->no_metadata) { + require File::Copy; $sync = 1; - copy($db, $db_lock) or die "rev_map_set(@_): ", + File::Copy::copy($db, $db_lock) or die "rev_map_set(@_): ", "Failed to copy: ", "$db => $db_lock ($!)\n"; } else { diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm index 4088f13e72..c50176eec9 100644 --- a/perl/Git/SVN/Editor.pm +++ b/perl/Git/SVN/Editor.pm @@ -5,7 +5,6 @@ use warnings; use SVN::Core; use SVN::Delta; use Carp qw/croak/; -use IO::File; use Git qw/command command_oneline command_noisy command_output_pipe command_input_pipe command_close_pipe command_bidi_pipe command_close_bidi_pipe/; @@ -586,7 +585,7 @@ The interface will change as git-svn evolves. =head1 DEPENDENCIES Subversion perl bindings, -the core L<Carp> and L<IO::File> modules, +the core L<Carp> module, and git's L<Git> helper module. C<Git::SVN::Editor> has not been tested using callers other than diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm index 10edb27732..d8c21ad915 100644 --- a/perl/Git/SVN/Fetcher.pm +++ b/perl/Git/SVN/Fetcher.pm @@ -7,7 +7,6 @@ use warnings; use SVN::Delta; use Carp qw/croak/; use File::Basename qw/dirname/; -use IO::File qw//; use Git qw/command command_oneline command_noisy command_output_pipe command_input_pipe command_close_pipe command_bidi_pipe command_close_bidi_pipe/; @@ -322,6 +321,14 @@ sub apply_textdelta { # (but $base does not,) so dup() it for reading in close_file open my $dup, '<&', $fh or croak $!; my $base = $::_repository->temp_acquire("git_blob_${$}_$suffix"); + # close_file may call temp_acquire on 'svn_hash', but because of the + # call chain, if the temp_acquire call from close_file ends up being the + # call that first creates the 'svn_hash' temp file, then the FileHandle + # that's created as a result will end up in an SVN::Pool that we clear + # in SVN::Ra::gs_fetch_loop_common. Avoid that by making sure the + # 'svn_hash' FileHandle is already created before close_file is called. + my $tmp_fh = $::_repository->temp_acquire('svn_hash'); + $::_repository->temp_release($tmp_fh, 1); if ($fb->{blob}) { my ($base_is_link, $size); @@ -600,7 +607,7 @@ developing git-svn. =head1 DEPENDENCIES L<SVN::Delta> from the Subversion perl bindings, -the core L<Carp>, L<File::Basename>, and L<IO::File> modules, +the core L<Carp> and L<File::Basename> modules, and git's L<Git> helper module. C<Git::SVN::Fetcher> has not been tested using callers other than diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm index 622535e217..4a499fcb38 100644 --- a/perl/Git/SVN/Ra.pm +++ b/perl/Git/SVN/Ra.pm @@ -3,7 +3,6 @@ use vars qw/@ISA $config_dir $_ignore_refs_regex $_log_window_size/; use strict; use warnings; use Memoize; -use SVN::Client; use Git::SVN::Utils qw( canonicalize_url canonicalize_path @@ -42,6 +41,7 @@ END { } sub _auth_providers () { + require SVN::Client; my @rv = ( SVN::Client::get_simple_provider(), SVN::Client::get_ssl_server_trust_file_provider(), @@ -247,7 +247,10 @@ sub get_log { $ret; } +# uncommon, only for ancient SVN (<= 1.4.2) sub trees_match { + require IO::File; + require SVN::Client; my ($self, $url1, $rev1, $url2, $rev2) = @_; my $ctx = SVN::Client->new(auth => _auth_providers); my $out = IO::File->new_tmpfile; @@ -391,6 +394,9 @@ sub longest_common_path { sub gs_fetch_loop_common { my ($self, $base, $head, $gsv, $globs) = @_; return if ($base > $head); + # Make sure the cat_blob open2 FileHandle is created before calling + # SVN::Pool::new_default so that it does not incorrectly end up in the pool. + $::_repository->_open_cat_blob_if_needed; my $gpool = SVN::Pool->new_default; my $ra_url = $self->url; my $reload_ra = sub { @@ -567,7 +567,7 @@ static char *replace_encoding_header(char *buf, const char *encoding) char *cp = buf; /* guess if there is an encoding header before a \n\n */ - while (strncmp(cp, "encoding ", strlen("encoding "))) { + while (!starts_with(cp, "encoding ")) { cp = strchr(cp, '\n'); if (!cp || *++cp == '\n') return buf; @@ -73,8 +73,3 @@ char *git_prompt(const char *prompt, int flags) } return r; } - -char *git_getpass(const char *prompt) -{ - return git_prompt(prompt, PROMPT_ASKPASS); -} @@ -5,6 +5,5 @@ #define PROMPT_ECHO (1<<1) char *git_prompt(const char *prompt, int flags); -char *git_getpass(const char *prompt); #endif /* PROMPT_H */ diff --git a/read-cache.c b/read-cache.c index 9cff715d6b..1bf78a445f 100644 --- a/read-cache.c +++ b/read-cache.c @@ -725,7 +725,7 @@ struct cache_entry *make_cache_entry(unsigned int mode, unsigned int refresh_options) { int size, len; - struct cache_entry *ce; + struct cache_entry *ce, *ret; if (!verify_path(path)) { error("Invalid path '%s'", path); @@ -742,7 +742,13 @@ struct cache_entry *make_cache_entry(unsigned int mode, ce->ce_namelen = len; ce->ce_mode = create_ce_mode(mode); - return refresh_cache_entry(ce, refresh_options); + ret = refresh_cache_entry(ce, refresh_options); + if (!ret) { + free(ce); + return NULL; + } else { + return ret; + } } int ce_same_name(const struct cache_entry *a, const struct cache_entry *b) @@ -1480,18 +1486,25 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk, return ce; } -static void check_ce_order(struct cache_entry *ce, struct cache_entry *next_ce) +static void check_ce_order(struct index_state *istate) { - int name_compare = strcmp(ce->name, next_ce->name); - if (0 < name_compare) - die("unordered stage entries in index"); - if (!name_compare) { - if (!ce_stage(ce)) - die("multiple stage entries for merged file '%s'", - ce->name); - if (ce_stage(ce) > ce_stage(next_ce)) - die("unordered stage entries for '%s'", - ce->name); + unsigned int i; + + for (i = 1; i < istate->cache_nr; i++) { + struct cache_entry *ce = istate->cache[i - 1]; + struct cache_entry *next_ce = istate->cache[i]; + int name_compare = strcmp(ce->name, next_ce->name); + + if (0 < name_compare) + die("unordered stage entries in index"); + if (!name_compare) { + if (!ce_stage(ce)) + die("multiple stage entries for merged file '%s'", + ce->name); + if (ce_stage(ce) > ce_stage(next_ce)) + die("unordered stage entries for '%s'", + ce->name); + } } } @@ -1556,9 +1569,6 @@ int do_read_index(struct index_state *istate, const char *path, int must_exist) ce = create_from_disk(disk_ce, &consumed, previous_name); set_index_entry(istate, i, ce); - if (i > 0) - check_ce_order(istate->cache[i - 1], ce); - src_offset += consumed; } strbuf_release(&previous_name_buf); @@ -1602,11 +1612,10 @@ int read_index_from(struct index_state *istate, const char *path) ret = do_read_index(istate, path, 0); split_index = istate->split_index; - if (!split_index) - return ret; - - if (is_null_sha1(split_index->base_sha1)) + if (!split_index || is_null_sha1(split_index->base_sha1)) { + check_ce_order(istate); return ret; + } if (split_index->base) discard_index(split_index->base); @@ -1622,6 +1631,7 @@ int read_index_from(struct index_state *istate, const char *path) sha1_to_hex(split_index->base_sha1)), sha1_to_hex(split_index->base->sha1)); merge_base_index(istate); + check_ce_order(istate); return ret; } @@ -6,6 +6,14 @@ #include "dir.h" #include "string-list.h" +struct ref_lock { + char *ref_name; + char *orig_ref_name; + struct lock_file *lk; + unsigned char old_sha1[20]; + int lock_fd; +}; + /* * How to handle various characters in refnames: * 0: An acceptable character for refs @@ -26,10 +34,29 @@ static unsigned char refname_disposition[256] = { }; /* - * Used as a flag to ref_transaction_delete when a loose ref is being + * Flag passed to lock_ref_sha1_basic() telling it to tolerate broken + * refs (i.e., because the reference is about to be deleted anyway). + */ +#define REF_DELETING 0x02 + +/* + * Used as a flag in ref_update::flags when a loose ref is being * pruned. */ -#define REF_ISPRUNING 0x0100 +#define REF_ISPRUNING 0x04 + +/* + * Used as a flag in ref_update::flags when the reference should be + * updated to new_sha1. + */ +#define REF_HAVE_NEW 0x08 + +/* + * Used as a flag in ref_update::flags when old_sha1 should be + * checked. + */ +#define REF_HAVE_OLD 0x10 + /* * Try to read one refname component from the front of refname. * Return the length of the component found, or -1 if the component is @@ -1618,8 +1645,7 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags, unsigned char *resolve_refdup(const char *ref, int resolve_flags, unsigned char *sha1, int *flags) { - const char *ret = resolve_ref_unsafe(ref, resolve_flags, sha1, flags); - return ret ? xstrdup(ret) : NULL; + return xstrdup_or_null(resolve_ref_unsafe(ref, resolve_flags, sha1, flags)); } /* The argument to filter_refs */ @@ -1908,6 +1934,11 @@ static int do_for_each_ref(struct ref_cache *refs, const char *base, data.fn = fn; data.cb_data = cb_data; + if (ref_paranoia < 0) + ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0); + if (ref_paranoia) + data.flags |= DO_FOR_EACH_INCLUDE_BROKEN; + return do_for_each_entry(refs, base, do_one_ref, &data); } @@ -2094,6 +2125,16 @@ int refname_match(const char *abbrev_name, const char *full_name) return 0; } +static void unlock_ref(struct ref_lock *lock) +{ + /* Do not free lock->lk -- atexit() still looks at them */ + if (lock->lk) + rollback_lock_file(lock->lk); + free(lock->ref_name); + free(lock->orig_ref_name); + free(lock); +} + /* This function should make sure errno is meaningful on error */ static struct ref_lock *verify_lock(struct ref_lock *lock, const unsigned char *old_sha1, int mustexist) @@ -2231,7 +2272,7 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log) static struct ref_lock *lock_ref_sha1_basic(const char *refname, const unsigned char *old_sha1, const struct string_list *skip, - int flags, int *type_p) + unsigned int flags, int *type_p) { char *ref_file; const char *orig_refname = refname; @@ -2240,7 +2281,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, int type, lflags; int mustexist = (old_sha1 && !is_null_sha1(old_sha1)); int resolve_flags = 0; - int missing = 0; int attempts_remaining = 3; lock = xcalloc(1, sizeof(struct ref_lock)); @@ -2279,13 +2319,13 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, orig_refname, strerror(errno)); goto error_return; } - missing = is_null_sha1(lock->old_sha1); - /* When the ref did not exist and we are creating it, - * make sure there is no existing ref that is packed - * whose name begins with our refname, nor a ref whose - * name is a proper prefix of our refname. + /* + * If the ref did not exist and we are creating it, make sure + * there is no existing packed ref whose name begins with our + * refname, nor a packed ref whose name is a proper prefix of + * our refname. */ - if (missing && + if (is_null_sha1(lock->old_sha1) && !is_refname_available(refname, skip, get_packed_refs(&ref_cache))) { last_errno = ENOTDIR; goto error_return; @@ -2301,10 +2341,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, lock->ref_name = xstrdup(refname); lock->orig_ref_name = xstrdup(orig_refname); ref_file = git_path("%s", refname); - if (missing) - lock->force_write = 1; - if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) - lock->force_write = 1; retry: switch (safe_create_leading_directories(ref_file)) { @@ -2346,13 +2382,6 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, return NULL; } -struct ref_lock *lock_any_ref_for_update(const char *refname, - const unsigned char *old_sha1, - int flags, int *type_p) -{ - return lock_ref_sha1_basic(refname, old_sha1, NULL, flags, type_p); -} - /* * Write an entry to the packed-refs file for the specified refname. * If peeled is non-NULL, write it as the entry's peeled value. @@ -2552,7 +2581,7 @@ static void prune_ref(struct ref_to_prune *r) transaction = ref_transaction_begin(&err); if (!transaction || ref_transaction_delete(transaction, r->name, r->sha1, - REF_ISPRUNING, 1, NULL, &err) || + REF_ISPRUNING, NULL, &err) || ref_transaction_commit(transaction, &err)) { ref_transaction_free(transaction); error("%s", err.buf); @@ -2592,68 +2621,10 @@ int pack_refs(unsigned int flags) return 0; } -/* - * If entry is no longer needed in packed-refs, add it to the string - * list pointed to by cb_data. Reasons for deleting entries: - * - * - Entry is broken. - * - Entry is overridden by a loose ref. - * - Entry does not point at a valid object. - * - * In the first and third cases, also emit an error message because these - * are indications of repository corruption. - */ -static int curate_packed_ref_fn(struct ref_entry *entry, void *cb_data) -{ - struct string_list *refs_to_delete = cb_data; - - if (entry->flag & REF_ISBROKEN) { - /* This shouldn't happen to packed refs. */ - error("%s is broken!", entry->name); - string_list_append(refs_to_delete, entry->name); - return 0; - } - if (!has_sha1_file(entry->u.value.sha1)) { - unsigned char sha1[20]; - int flags; - - if (read_ref_full(entry->name, 0, sha1, &flags)) - /* We should at least have found the packed ref. */ - die("Internal error"); - if ((flags & REF_ISSYMREF) || !(flags & REF_ISPACKED)) { - /* - * This packed reference is overridden by a - * loose reference, so it is OK that its value - * is no longer valid; for example, it might - * refer to an object that has been garbage - * collected. For this purpose we don't even - * care whether the loose reference itself is - * invalid, broken, symbolic, etc. Silently - * remove the packed reference. - */ - string_list_append(refs_to_delete, entry->name); - return 0; - } - /* - * There is no overriding loose reference, so the fact - * that this reference doesn't refer to a valid object - * indicates some kind of repository corruption. - * Report the problem, then omit the reference from - * the output. - */ - error("%s does not point to a valid object!", entry->name); - string_list_append(refs_to_delete, entry->name); - return 0; - } - - return 0; -} - int repack_without_refs(struct string_list *refnames, struct strbuf *err) { struct ref_dir *packed; - struct string_list refs_to_delete = STRING_LIST_INIT_DUP; - struct string_list_item *refname, *ref_to_delete; + struct string_list_item *refname; int ret, needs_repacking = 0, removed = 0; assert(err); @@ -2689,13 +2660,6 @@ int repack_without_refs(struct string_list *refnames, struct strbuf *err) return 0; } - /* Remove any other accumulated cruft */ - do_for_each_entry_in_dir(packed, 0, curate_packed_ref_fn, &refs_to_delete); - for_each_string_list_item(ref_to_delete, &refs_to_delete) { - if (remove_entry(packed, ref_to_delete->string) == -1) - die("internal error"); - } - /* Write what remains */ ret = commit_packed_refs(); if (ret) @@ -2722,15 +2686,16 @@ static int delete_ref_loose(struct ref_lock *lock, int flag, struct strbuf *err) return 0; } -int delete_ref(const char *refname, const unsigned char *sha1, int delopt) +int delete_ref(const char *refname, const unsigned char *sha1, unsigned int flags) { struct ref_transaction *transaction; struct strbuf err = STRBUF_INIT; transaction = ref_transaction_begin(&err); if (!transaction || - ref_transaction_delete(transaction, refname, sha1, delopt, - sha1 && !is_null_sha1(sha1), NULL, &err) || + ref_transaction_delete(transaction, refname, + (sha1 && !is_null_sha1(sha1)) ? sha1 : NULL, + flags, NULL, &err) || ref_transaction_commit(transaction, &err)) { error("%s", err.buf); ref_transaction_free(transaction); @@ -2866,7 +2831,6 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms error("unable to lock %s for update", newrefname); goto rollback; } - lock->force_write = 1; hashcpy(lock->old_sha1, orig_sha1); if (write_ref_sha1(lock, orig_sha1, logmsg)) { error("unable to write current sha1 into %s", newrefname); @@ -2882,7 +2846,6 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms goto rollbacklog; } - lock->force_write = 1; flag = log_all_ref_updates; log_all_ref_updates = 0; if (write_ref_sha1(lock, orig_sha1, NULL)) @@ -2901,7 +2864,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms return 1; } -int close_ref(struct ref_lock *lock) +static int close_ref(struct ref_lock *lock) { if (close_lock_file(lock->lk)) return -1; @@ -2909,7 +2872,7 @@ int close_ref(struct ref_lock *lock) return 0; } -int commit_ref(struct ref_lock *lock) +static int commit_ref(struct ref_lock *lock) { if (commit_lock_file(lock->lk)) return -1; @@ -2917,16 +2880,6 @@ int commit_ref(struct ref_lock *lock) return 0; } -void unlock_ref(struct ref_lock *lock) -{ - /* Do not free lock->lk -- atexit() still looks at them */ - if (lock->lk) - rollback_lock_file(lock->lk); - free(lock->ref_name); - free(lock->orig_ref_name); - free(lock); -} - /* * copy the reflog message msg to buf, which has been allocated sufficiently * large, while cleaning up the whitespaces. Especially, convert LF to space, @@ -3003,15 +2956,37 @@ int log_ref_setup(const char *refname, char *logfile, int bufsize) return 0; } +static int log_ref_write_fd(int fd, const unsigned char *old_sha1, + const unsigned char *new_sha1, + const char *committer, const char *msg) +{ + int msglen, written; + unsigned maxlen, len; + char *logrec; + + msglen = msg ? strlen(msg) : 0; + maxlen = strlen(committer) + msglen + 100; + logrec = xmalloc(maxlen); + len = sprintf(logrec, "%s %s %s\n", + sha1_to_hex(old_sha1), + sha1_to_hex(new_sha1), + committer); + if (msglen) + len += copy_msg(logrec + len - 1, msg) - 1; + + written = len <= maxlen ? write_in_full(fd, logrec, len) : -1; + free(logrec); + if (written != len) + return -1; + + return 0; +} + static int log_ref_write(const char *refname, const unsigned char *old_sha1, const unsigned char *new_sha1, const char *msg) { - int logfd, result, written, oflags = O_APPEND | O_WRONLY; - unsigned maxlen, len; - int msglen; + int logfd, result, oflags = O_APPEND | O_WRONLY; char log_file[PATH_MAX]; - char *logrec; - const char *committer; if (log_all_ref_updates < 0) log_all_ref_updates = !is_bare_repository(); @@ -3023,19 +2998,9 @@ static int log_ref_write(const char *refname, const unsigned char *old_sha1, logfd = open(log_file, oflags); if (logfd < 0) return 0; - msglen = msg ? strlen(msg) : 0; - committer = git_committer_info(0); - maxlen = strlen(committer) + msglen + 100; - logrec = xmalloc(maxlen); - len = sprintf(logrec, "%s %s %s\n", - sha1_to_hex(old_sha1), - sha1_to_hex(new_sha1), - committer); - if (msglen) - len += copy_msg(logrec + len - 1, msg) - 1; - written = len <= maxlen ? write_in_full(logfd, logrec, len) : -1; - free(logrec); - if (written != len) { + result = log_ref_write_fd(logfd, old_sha1, new_sha1, + git_committer_info(0), msg); + if (result) { int save_errno = errno; close(logfd); error("Unable to append to %s", log_file); @@ -3066,14 +3031,6 @@ static int write_ref_sha1(struct ref_lock *lock, static char term = '\n'; struct object *o; - if (!lock) { - errno = EINVAL; - return -1; - } - if (!lock->force_write && !hashcmp(lock->old_sha1, sha1)) { - unlock_ref(lock); - return 0; - } o = parse_object(sha1); if (!o) { error("Trying to write ref %s with nonexistent object %s", @@ -3543,16 +3500,27 @@ int for_each_reflog(each_ref_fn fn, void *cb_data) } /** - * Information needed for a single ref update. Set new_sha1 to the - * new value or to zero to delete the ref. To check the old value - * while locking the ref, set have_old to 1 and set old_sha1 to the - * value or to zero to ensure the ref does not exist before update. + * Information needed for a single ref update. Set new_sha1 to the new + * value or to null_sha1 to delete the ref. To check the old value + * while the ref is locked, set (flags & REF_HAVE_OLD) and set + * old_sha1 to the old value, or to null_sha1 to ensure the ref does + * not exist before update. */ struct ref_update { + /* + * If (flags & REF_HAVE_NEW), set the reference to this value: + */ unsigned char new_sha1[20]; + /* + * If (flags & REF_HAVE_OLD), check that the reference + * previously had this value: + */ unsigned char old_sha1[20]; - int flags; /* REF_NODEREF? */ - int have_old; /* 1 if old_sha1 is valid, 0 otherwise */ + /* + * One or more of REF_HAVE_NEW, REF_HAVE_OLD, REF_NODEREF, + * REF_DELETING, and REF_ISPRUNING: + */ + unsigned int flags; struct ref_lock *lock; int type; char *msg; @@ -3624,7 +3592,7 @@ int ref_transaction_update(struct ref_transaction *transaction, const char *refname, const unsigned char *new_sha1, const unsigned char *old_sha1, - int flags, int have_old, const char *msg, + unsigned int flags, const char *msg, struct strbuf *err) { struct ref_update *update; @@ -3634,10 +3602,7 @@ int ref_transaction_update(struct ref_transaction *transaction, if (transaction->state != REF_TRANSACTION_OPEN) die("BUG: update called for transaction that is not open"); - if (have_old && !old_sha1) - die("BUG: have_old is true but old_sha1 is NULL"); - - if (!is_null_sha1(new_sha1) && + if (new_sha1 && !is_null_sha1(new_sha1) && check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { strbuf_addf(err, "refusing to update ref with bad name %s", refname); @@ -3645,11 +3610,15 @@ int ref_transaction_update(struct ref_transaction *transaction, } update = add_update(transaction, refname); - hashcpy(update->new_sha1, new_sha1); - update->flags = flags; - update->have_old = have_old; - if (have_old) + if (new_sha1) { + hashcpy(update->new_sha1, new_sha1); + flags |= REF_HAVE_NEW; + } + if (old_sha1) { hashcpy(update->old_sha1, old_sha1); + flags |= REF_HAVE_OLD; + } + update->flags = flags; if (msg) update->msg = xstrdup(msg); return 0; @@ -3658,75 +3627,52 @@ int ref_transaction_update(struct ref_transaction *transaction, int ref_transaction_create(struct ref_transaction *transaction, const char *refname, const unsigned char *new_sha1, - int flags, const char *msg, + unsigned int flags, const char *msg, struct strbuf *err) { - struct ref_update *update; - - assert(err); - - if (transaction->state != REF_TRANSACTION_OPEN) - die("BUG: create called for transaction that is not open"); - if (!new_sha1 || is_null_sha1(new_sha1)) - die("BUG: create ref with null new_sha1"); - - if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { - strbuf_addf(err, "refusing to create ref with bad name %s", - refname); - return -1; - } - - update = add_update(transaction, refname); - - hashcpy(update->new_sha1, new_sha1); - hashclr(update->old_sha1); - update->flags = flags; - update->have_old = 1; - if (msg) - update->msg = xstrdup(msg); - return 0; + die("BUG: create called without valid new_sha1"); + return ref_transaction_update(transaction, refname, new_sha1, + null_sha1, flags, msg, err); } int ref_transaction_delete(struct ref_transaction *transaction, const char *refname, const unsigned char *old_sha1, - int flags, int have_old, const char *msg, + unsigned int flags, const char *msg, struct strbuf *err) { - struct ref_update *update; - - assert(err); - - if (transaction->state != REF_TRANSACTION_OPEN) - die("BUG: delete called for transaction that is not open"); - - if (have_old && !old_sha1) - die("BUG: have_old is true but old_sha1 is NULL"); + if (old_sha1 && is_null_sha1(old_sha1)) + die("BUG: delete called with old_sha1 set to zeros"); + return ref_transaction_update(transaction, refname, + null_sha1, old_sha1, + flags, msg, err); +} - update = add_update(transaction, refname); - update->flags = flags; - update->have_old = have_old; - if (have_old) { - assert(!is_null_sha1(old_sha1)); - hashcpy(update->old_sha1, old_sha1); - } - if (msg) - update->msg = xstrdup(msg); - return 0; +int ref_transaction_verify(struct ref_transaction *transaction, + const char *refname, + const unsigned char *old_sha1, + unsigned int flags, + struct strbuf *err) +{ + if (!old_sha1) + die("BUG: verify called with old_sha1 set to NULL"); + return ref_transaction_update(transaction, refname, + NULL, old_sha1, + flags, NULL, err); } -int update_ref(const char *action, const char *refname, - const unsigned char *sha1, const unsigned char *oldval, - int flags, enum action_on_err onerr) +int update_ref(const char *msg, const char *refname, + const unsigned char *new_sha1, const unsigned char *old_sha1, + unsigned int flags, enum action_on_err onerr) { struct ref_transaction *t; struct strbuf err = STRBUF_INIT; t = ref_transaction_begin(&err); if (!t || - ref_transaction_update(t, refname, sha1, oldval, flags, - !!oldval, action, &err) || + ref_transaction_update(t, refname, new_sha1, old_sha1, + flags, msg, &err) || ref_transaction_commit(t, &err)) { const char *str = "update_ref failed for ref '%s': %s"; @@ -3802,17 +3748,17 @@ int ref_transaction_commit(struct ref_transaction *transaction, /* Acquire all locks while verifying old values */ for (i = 0; i < n; i++) { struct ref_update *update = updates[i]; - int flags = update->flags; + unsigned int flags = update->flags; - if (is_null_sha1(update->new_sha1)) + if ((flags & REF_HAVE_NEW) && is_null_sha1(update->new_sha1)) flags |= REF_DELETING; - update->lock = lock_ref_sha1_basic(update->refname, - (update->have_old ? - update->old_sha1 : - NULL), - NULL, - flags, - &update->type); + update->lock = lock_ref_sha1_basic( + update->refname, + ((update->flags & REF_HAVE_OLD) ? + update->old_sha1 : NULL), + NULL, + flags, + &update->type); if (!update->lock) { ret = (errno == ENOTDIR) ? TRANSACTION_NAME_CONFLICT @@ -3826,31 +3772,46 @@ int ref_transaction_commit(struct ref_transaction *transaction, /* Perform updates first so live commits remain referenced */ for (i = 0; i < n; i++) { struct ref_update *update = updates[i]; + int flags = update->flags; - if (!is_null_sha1(update->new_sha1)) { - if (write_ref_sha1(update->lock, update->new_sha1, - update->msg)) { + if ((flags & REF_HAVE_NEW) && !is_null_sha1(update->new_sha1)) { + int overwriting_symref = ((update->type & REF_ISSYMREF) && + (update->flags & REF_NODEREF)); + + if (!overwriting_symref + && !hashcmp(update->lock->old_sha1, update->new_sha1)) { + /* + * The reference already has the desired + * value, so we don't need to write it. + */ + unlock_ref(update->lock); + update->lock = NULL; + } else if (write_ref_sha1(update->lock, update->new_sha1, + update->msg)) { update->lock = NULL; /* freed by write_ref_sha1 */ strbuf_addf(err, "Cannot update the ref '%s'.", update->refname); ret = TRANSACTION_GENERIC_ERROR; goto cleanup; + } else { + /* freed by write_ref_sha1(): */ + update->lock = NULL; } - update->lock = NULL; /* freed by write_ref_sha1 */ } } /* Perform deletes now that updates are safely completed */ for (i = 0; i < n; i++) { struct ref_update *update = updates[i]; + int flags = update->flags; - if (update->lock) { + if ((flags & REF_HAVE_NEW) && is_null_sha1(update->new_sha1)) { if (delete_ref_loose(update->lock, update->type, err)) { ret = TRANSACTION_GENERIC_ERROR; goto cleanup; } - if (!(update->flags & REF_ISPRUNING)) + if (!(flags & REF_ISPRUNING)) string_list_append(&refs_to_delete, update->lock->ref_name); } @@ -4009,3 +3970,141 @@ int ref_is_hidden(const char *refname) } return 0; } + +struct expire_reflog_cb { + unsigned int flags; + reflog_expiry_should_prune_fn *should_prune_fn; + void *policy_cb; + FILE *newlog; + unsigned char last_kept_sha1[20]; +}; + +static int expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1, + const char *email, unsigned long timestamp, int tz, + const char *message, void *cb_data) +{ + struct expire_reflog_cb *cb = cb_data; + struct expire_reflog_policy_cb *policy_cb = cb->policy_cb; + + if (cb->flags & EXPIRE_REFLOGS_REWRITE) + osha1 = cb->last_kept_sha1; + + if ((*cb->should_prune_fn)(osha1, nsha1, email, timestamp, tz, + message, policy_cb)) { + if (!cb->newlog) + printf("would prune %s", message); + else if (cb->flags & EXPIRE_REFLOGS_VERBOSE) + printf("prune %s", message); + } else { + if (cb->newlog) { + fprintf(cb->newlog, "%s %s %s %lu %+05d\t%s", + sha1_to_hex(osha1), sha1_to_hex(nsha1), + email, timestamp, tz, message); + hashcpy(cb->last_kept_sha1, nsha1); + } + if (cb->flags & EXPIRE_REFLOGS_VERBOSE) + printf("keep %s", message); + } + return 0; +} + +int reflog_expire(const char *refname, const unsigned char *sha1, + unsigned int flags, + reflog_expiry_prepare_fn prepare_fn, + reflog_expiry_should_prune_fn should_prune_fn, + reflog_expiry_cleanup_fn cleanup_fn, + void *policy_cb_data) +{ + static struct lock_file reflog_lock; + struct expire_reflog_cb cb; + struct ref_lock *lock; + char *log_file; + int status = 0; + int type; + + memset(&cb, 0, sizeof(cb)); + cb.flags = flags; + cb.policy_cb = policy_cb_data; + cb.should_prune_fn = should_prune_fn; + + /* + * The reflog file is locked by holding the lock on the + * reference itself, plus we might need to update the + * reference if --updateref was specified: + */ + lock = lock_ref_sha1_basic(refname, sha1, NULL, 0, &type); + if (!lock) + return error("cannot lock ref '%s'", refname); + if (!reflog_exists(refname)) { + unlock_ref(lock); + return 0; + } + + log_file = git_pathdup("logs/%s", refname); + if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) { + /* + * Even though holding $GIT_DIR/logs/$reflog.lock has + * no locking implications, we use the lock_file + * machinery here anyway because it does a lot of the + * work we need, including cleaning up if the program + * exits unexpectedly. + */ + if (hold_lock_file_for_update(&reflog_lock, log_file, 0) < 0) { + struct strbuf err = STRBUF_INIT; + unable_to_lock_message(log_file, errno, &err); + error("%s", err.buf); + strbuf_release(&err); + goto failure; + } + cb.newlog = fdopen_lock_file(&reflog_lock, "w"); + if (!cb.newlog) { + error("cannot fdopen %s (%s)", + reflog_lock.filename.buf, strerror(errno)); + goto failure; + } + } + + (*prepare_fn)(refname, sha1, cb.policy_cb); + for_each_reflog_ent(refname, expire_reflog_ent, &cb); + (*cleanup_fn)(cb.policy_cb); + + if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) { + /* + * It doesn't make sense to adjust a reference pointed + * to by a symbolic ref based on expiring entries in + * the symbolic reference's reflog. Nor can we update + * a reference if there are no remaining reflog + * entries. + */ + int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) && + !(type & REF_ISSYMREF) && + !is_null_sha1(cb.last_kept_sha1); + + if (close_lock_file(&reflog_lock)) { + status |= error("couldn't write %s: %s", log_file, + strerror(errno)); + } else if (update && + (write_in_full(lock->lock_fd, + sha1_to_hex(cb.last_kept_sha1), 40) != 40 || + write_str_in_full(lock->lock_fd, "\n") != 1 || + close_ref(lock) < 0)) { + status |= error("couldn't write %s", + lock->lk->filename.buf); + rollback_lock_file(&reflog_lock); + } else if (commit_lock_file(&reflog_lock)) { + status |= error("unable to commit reflog '%s' (%s)", + log_file, strerror(errno)); + } else if (update && commit_ref(lock)) { + status |= error("couldn't set %s", lock->ref_name); + } + } + free(log_file); + unlock_ref(lock); + return status; + + failure: + rollback_lock_file(&reflog_lock); + free(log_file); + unlock_ref(lock); + return -1; +} @@ -1,15 +1,6 @@ #ifndef REFS_H #define REFS_H -struct ref_lock { - char *ref_name; - char *orig_ref_name; - struct lock_file *lk; - unsigned char old_sha1[20]; - int lock_fd; - int force_write; -}; - /* * A ref_transaction represents a collection of ref updates * that should succeed or fail together. @@ -189,31 +180,13 @@ extern int is_branch(const char *refname); extern int peel_ref(const char *refname, unsigned char *sha1); /* - * Flags controlling lock_any_ref_for_update(), ref_transaction_update(), - * ref_transaction_create(), etc. + * Flags controlling ref_transaction_update(), ref_transaction_create(), etc. * REF_NODEREF: act on the ref directly, instead of dereferencing * symbolic references. - * REF_DELETING: tolerate broken refs * - * Flags >= 0x100 are reserved for internal use. + * Other flags are reserved for internal use. */ #define REF_NODEREF 0x01 -#define REF_DELETING 0x02 -/* - * This function sets errno to something meaningful on failure. - */ -extern struct ref_lock *lock_any_ref_for_update(const char *refname, - const unsigned char *old_sha1, - int flags, int *type_p); - -/** Close the file descriptor owned by a lock and return the status */ -extern int close_ref(struct ref_lock *lock); - -/** Close and commit the ref locked by the lock */ -extern int commit_ref(struct ref_lock *lock); - -/** Release any lock taken but not written. **/ -extern void unlock_ref(struct ref_lock *lock); /* * Setup reflog before using. Set errno to something meaningful on failure. @@ -282,57 +255,95 @@ enum action_on_err { struct ref_transaction *ref_transaction_begin(struct strbuf *err); /* - * The following functions add a reference check or update to a - * ref_transaction. In all of them, refname is the name of the - * reference to be affected. The functions make internal copies of - * refname and msg, so the caller retains ownership of these parameters. - * flags can be REF_NODEREF; it is passed to update_ref_lock(). + * Reference transaction updates + * + * The following four functions add a reference check or update to a + * ref_transaction. They have some common similar parameters: + * + * transaction -- a pointer to an open ref_transaction, obtained + * from ref_transaction_begin(). + * + * refname -- the name of the reference to be affected. + * + * flags -- flags affecting the update, passed to + * update_ref_lock(). Can be REF_NODEREF, which means that + * symbolic references should not be followed. + * + * msg -- a message describing the change (for the reflog). + * + * err -- a strbuf for receiving a description of any error that + * might have occured. + * + * The functions make internal copies of refname and msg, so the + * caller retains ownership of these parameters. + * + * The functions return 0 on success and non-zero on failure. A + * failure means that the transaction as a whole has failed and needs + * to be rolled back. */ /* - * Add a reference update to transaction. new_sha1 is the value that - * the reference should have after the update, or zeros if it should - * be deleted. If have_old is true, then old_sha1 holds the value - * that the reference should have had before the update, or zeros if - * it must not have existed beforehand. - * Function returns 0 on success and non-zero on failure. A failure to update - * means that the transaction as a whole has failed and will need to be - * rolled back. + * Add a reference update to transaction. new_sha1 is the value that + * the reference should have after the update, or null_sha1 if it + * should be deleted. If new_sha1 is NULL, then the reference is not + * changed at all. old_sha1 is the value that the reference must have + * before the update, or null_sha1 if it must not have existed + * beforehand. The old value is checked after the lock is taken to + * prevent races. If the old value doesn't agree with old_sha1, the + * whole transaction fails. If old_sha1 is NULL, then the previous + * value is not checked. + * + * See the above comment "Reference transaction updates" for more + * information. */ int ref_transaction_update(struct ref_transaction *transaction, const char *refname, const unsigned char *new_sha1, const unsigned char *old_sha1, - int flags, int have_old, const char *msg, + unsigned int flags, const char *msg, struct strbuf *err); /* - * Add a reference creation to transaction. new_sha1 is the value - * that the reference should have after the update; it must not be the - * null SHA-1. It is verified that the reference does not exist + * Add a reference creation to transaction. new_sha1 is the value that + * the reference should have after the update; it must not be + * null_sha1. It is verified that the reference does not exist * already. - * Function returns 0 on success and non-zero on failure. A failure to create - * means that the transaction as a whole has failed and will need to be - * rolled back. + * + * See the above comment "Reference transaction updates" for more + * information. */ int ref_transaction_create(struct ref_transaction *transaction, const char *refname, const unsigned char *new_sha1, - int flags, const char *msg, + unsigned int flags, const char *msg, struct strbuf *err); /* - * Add a reference deletion to transaction. If have_old is true, then - * old_sha1 holds the value that the reference should have had before - * the update (which must not be the null SHA-1). - * Function returns 0 on success and non-zero on failure. A failure to delete - * means that the transaction as a whole has failed and will need to be - * rolled back. + * Add a reference deletion to transaction. If old_sha1 is non-NULL, + * then it holds the value that the reference should have had before + * the update (which must not be null_sha1). + * + * See the above comment "Reference transaction updates" for more + * information. */ int ref_transaction_delete(struct ref_transaction *transaction, const char *refname, const unsigned char *old_sha1, - int flags, int have_old, const char *msg, + unsigned int flags, const char *msg, + struct strbuf *err); + +/* + * Verify, within a transaction, that refname has the value old_sha1, + * or, if old_sha1 is null_sha1, then verify that the reference + * doesn't exist. old_sha1 must be non-NULL. + * + * See the above comment "Reference transaction updates" for more + * information. + */ +int ref_transaction_verify(struct ref_transaction *transaction, + const char *refname, + const unsigned char *old_sha1, + unsigned int flags, struct strbuf *err); /* @@ -353,12 +364,65 @@ int ref_transaction_commit(struct ref_transaction *transaction, */ void ref_transaction_free(struct ref_transaction *transaction); -/** Lock a ref and then write its file */ -int update_ref(const char *action, const char *refname, - const unsigned char *sha1, const unsigned char *oldval, - int flags, enum action_on_err onerr); +/** + * Lock, update, and unlock a single reference. This function + * basically does a transaction containing a single call to + * ref_transaction_update(). The parameters to this function have the + * same meaning as the corresponding parameters to + * ref_transaction_update(). Handle errors as requested by the `onerr` + * argument. + */ +int update_ref(const char *msg, const char *refname, + const unsigned char *new_sha1, const unsigned char *old_sha1, + unsigned int flags, enum action_on_err onerr); extern int parse_hide_refs_config(const char *var, const char *value, const char *); extern int ref_is_hidden(const char *); +enum expire_reflog_flags { + EXPIRE_REFLOGS_DRY_RUN = 1 << 0, + EXPIRE_REFLOGS_UPDATE_REF = 1 << 1, + EXPIRE_REFLOGS_VERBOSE = 1 << 2, + EXPIRE_REFLOGS_REWRITE = 1 << 3 +}; + +/* + * The following interface is used for reflog expiration. The caller + * calls reflog_expire(), supplying it with three callback functions, + * of the following types. The callback functions define the + * expiration policy that is desired. + * + * reflog_expiry_prepare_fn -- Called once after the reference is + * locked. + * + * reflog_expiry_should_prune_fn -- Called once for each entry in the + * existing reflog. It should return true iff that entry should be + * pruned. + * + * reflog_expiry_cleanup_fn -- Called once before the reference is + * unlocked again. + */ +typedef void reflog_expiry_prepare_fn(const char *refname, + const unsigned char *sha1, + void *cb_data); +typedef int reflog_expiry_should_prune_fn(unsigned char *osha1, + unsigned char *nsha1, + const char *email, + unsigned long timestamp, int tz, + const char *message, void *cb_data); +typedef void reflog_expiry_cleanup_fn(void *cb_data); + +/* + * Expire reflog entries for the specified reference. sha1 is the old + * value of the reference. flags is a combination of the constants in + * enum expire_reflog_flags. The three function pointers are described + * above. On success, return zero. + */ +extern int reflog_expire(const char *refname, const unsigned char *sha1, + unsigned int flags, + reflog_expiry_prepare_fn prepare_fn, + reflog_expiry_should_prune_fn should_prune_fn, + reflog_expiry_cleanup_fn cleanup_fn, + void *policy_cb_data); + #endif /* REFS_H */ diff --git a/remote-curl.c b/remote-curl.c index dd63bc27ab..af7b6786dc 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -567,7 +567,6 @@ retry: git_zstream stream; int ret; - memset(&stream, 0, sizeof(stream)); git_deflate_init_gzip(&stream, Z_BEST_COMPRESSION); gzip_size = git_deflate_bound(&stream, rpc->len); gzip_body = xmalloc(gzip_size); @@ -760,7 +759,7 @@ static int fetch_git(struct discovery *heads, for (i = 0; i < nr_heads; i++) { struct ref *ref = to_fetch[i]; - if (!ref->name || !*ref->name) + if (!*ref->name) die("cannot fetch by sha1 over smart http"); packet_buf_write(&preamble, "%s %s\n", sha1_to_hex(ref->old_sha1), ref->name); @@ -962,6 +961,8 @@ int main(int argc, const char **argv) struct strbuf buf = STRBUF_INIT; int nongit; + git_setup_gettext(); + git_extract_argv0_path(argv[0]); setup_git_directory_gently(&nongit); if (argc < 2) { @@ -975,8 +975,8 @@ struct ref *copy_ref(const struct ref *ref) cpy = xmalloc(sizeof(struct ref) + len + 1); memcpy(cpy, ref, sizeof(struct ref) + len + 1); cpy->next = NULL; - cpy->symref = ref->symref ? xstrdup(ref->symref) : NULL; - cpy->remote_status = ref->remote_status ? xstrdup(ref->remote_status) : NULL; + cpy->symref = xstrdup_or_null(ref->symref); + cpy->remote_status = xstrdup_or_null(ref->remote_status); cpy->peer_ref = copy_ref(ref->peer_ref); return cpy; } @@ -2156,7 +2156,7 @@ struct ref *get_stale_heads(struct refspec *refs, int ref_count, struct ref *fet /* * Compare-and-swap */ -void clear_cas_option(struct push_cas_option *cas) +static void clear_cas_option(struct push_cas_option *cas) { int i; @@ -115,7 +115,8 @@ struct ref { REF_STATUS_REJECT_SHALLOW, REF_STATUS_UPTODATE, REF_STATUS_REMOTE_REJECT, - REF_STATUS_EXPECTING_REPORT + REF_STATUS_EXPECTING_REPORT, + REF_STATUS_ATOMIC_PUSH_FAILED } status; char *remote_status; struct ref *peer_ref; /* when renaming */ @@ -260,7 +261,6 @@ struct push_cas_option { extern int parseopt_push_cas_option(const struct option *, const char *arg, int unset); extern int parse_push_cas_option(struct push_cas_option *, const char *arg, int unset); -extern void clear_cas_option(struct push_cas_option *); extern int is_empty_cas(const struct push_cas_option *); void apply_push_cas(struct push_cas_option *, struct remote *, struct ref *); @@ -477,27 +477,23 @@ out: static struct lock_file index_lock; -static int update_paths(struct string_list *update) +static void update_paths(struct string_list *update) { int i; - int fd = hold_locked_index(&index_lock, 0); - int status = 0; - if (fd < 0) - return -1; + hold_locked_index(&index_lock, 1); for (i = 0; i < update->nr; i++) { struct string_list_item *item = &update->items[i]; - if (add_file_to_cache(item->string, ADD_CACHE_IGNORE_ERRORS)) - status = -1; + if (add_file_to_cache(item->string, 0)) + exit(128); } - if (!status && active_cache_changed) { + if (active_cache_changed) { if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK)) die("Unable to write new index file"); - } else if (fd >= 0) + } else rollback_lock_file(&index_lock); - return status; } static int do_plain_rerere(struct string_list *rr, int fd) diff --git a/revision.c b/revision.c index 86406a26a2..6399a0412c 100644 --- a/revision.c +++ b/revision.c @@ -2017,6 +2017,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg grep_set_pattern_type_option(GREP_PATTERN_TYPE_PCRE, &revs->grep_filter); } else if (!strcmp(arg, "--all-match")) { revs->grep_filter.all_match = 1; + } else if (!strcmp(arg, "--invert-grep")) { + revs->invert_grep = 1; } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) { if (strcmp(optarg, "none")) git_log_output_encoding = xstrdup(optarg); @@ -2337,9 +2339,14 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s if (revs->reflog_info && revs->graph) die("cannot combine --walk-reflogs with --graph"); + if (revs->no_walk && revs->graph) + die("cannot combine --no-walk with --graph"); if (!revs->reflog_info && revs->grep_filter.use_reflog_filter) die("cannot use --grep-reflog without --walk-reflogs"); + if (revs->first_parent_only && revs->bisect) + die(_("--first-parent is incompatible with --bisect")); + return left; } @@ -2915,7 +2922,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt) (char *)message, strlen(message)); strbuf_release(&buf); unuse_commit_buffer(commit, message); - return retval; + return opt->invert_grep ? !retval : retval; } static inline int want_ancestry(const struct rev_info *revs) @@ -2968,6 +2975,61 @@ enum commit_action get_commit_action(struct rev_info *revs, struct commit *commi return commit_show; } +define_commit_slab(saved_parents, struct commit_list *); + +#define EMPTY_PARENT_LIST ((struct commit_list *)-1) + +/* + * You may only call save_parents() once per commit (this is checked + * for non-root commits). + */ +static void save_parents(struct rev_info *revs, struct commit *commit) +{ + struct commit_list **pp; + + if (!revs->saved_parents_slab) { + revs->saved_parents_slab = xmalloc(sizeof(struct saved_parents)); + init_saved_parents(revs->saved_parents_slab); + } + + pp = saved_parents_at(revs->saved_parents_slab, commit); + + /* + * When walking with reflogs, we may visit the same commit + * several times: once for each appearance in the reflog. + * + * In this case, save_parents() will be called multiple times. + * We want to keep only the first set of parents. We need to + * store a sentinel value for an empty (i.e., NULL) parent + * list to distinguish it from a not-yet-saved list, however. + */ + if (*pp) + return; + if (commit->parents) + *pp = copy_commit_list(commit->parents); + else + *pp = EMPTY_PARENT_LIST; +} + +static void free_saved_parents(struct rev_info *revs) +{ + if (revs->saved_parents_slab) + clear_saved_parents(revs->saved_parents_slab); +} + +struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit) +{ + struct commit_list *parents; + + if (!revs->saved_parents_slab) + return commit->parents; + + parents = *saved_parents_at(revs->saved_parents_slab, commit); + if (parents == EMPTY_PARENT_LIST) + return NULL; + return parents; +} + enum commit_action simplify_commit(struct rev_info *revs, struct commit *commit) { enum commit_action action = get_commit_action(revs, commit); @@ -3267,54 +3329,3 @@ void put_revision_mark(const struct rev_info *revs, const struct commit *commit) fputs(mark, stdout); putchar(' '); } - -define_commit_slab(saved_parents, struct commit_list *); - -#define EMPTY_PARENT_LIST ((struct commit_list *)-1) - -void save_parents(struct rev_info *revs, struct commit *commit) -{ - struct commit_list **pp; - - if (!revs->saved_parents_slab) { - revs->saved_parents_slab = xmalloc(sizeof(struct saved_parents)); - init_saved_parents(revs->saved_parents_slab); - } - - pp = saved_parents_at(revs->saved_parents_slab, commit); - - /* - * When walking with reflogs, we may visit the same commit - * several times: once for each appearance in the reflog. - * - * In this case, save_parents() will be called multiple times. - * We want to keep only the first set of parents. We need to - * store a sentinel value for an empty (i.e., NULL) parent - * list to distinguish it from a not-yet-saved list, however. - */ - if (*pp) - return; - if (commit->parents) - *pp = copy_commit_list(commit->parents); - else - *pp = EMPTY_PARENT_LIST; -} - -struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit) -{ - struct commit_list *parents; - - if (!revs->saved_parents_slab) - return commit->parents; - - parents = *saved_parents_at(revs->saved_parents_slab, commit); - if (parents == EMPTY_PARENT_LIST) - return NULL; - return parents; -} - -void free_saved_parents(struct rev_info *revs) -{ - if (revs->saved_parents_slab) - clear_saved_parents(revs->saved_parents_slab); -} diff --git a/revision.h b/revision.h index 033a24460e..0ea8b4e255 100644 --- a/revision.h +++ b/revision.h @@ -169,6 +169,8 @@ struct rev_info { /* Filter by commit log message */ struct grep_opt grep_filter; + /* Negate the match of grep_filter */ + int invert_grep; /* Display history graph */ struct git_graph *graph; @@ -298,18 +300,14 @@ extern int rewrite_parents(struct rev_info *revs, struct commit *commit, rewrite_parent_fn_t rewrite_parent); /* - * Save a copy of the parent list, and return the saved copy. This is - * used by the log machinery to retrieve the original parents when - * commit->parents has been modified by history simpification. - * - * You may only call save_parents() once per commit (this is checked - * for non-root commits). + * The log machinery saves the original parent list so that + * get_saved_parents() can later tell what the real parents of the + * commits are, when commit->parents has been modified by history + * simpification. * * get_saved_parents() will transparently return commit->parents if * history simplification is off. */ -extern void save_parents(struct rev_info *revs, struct commit *commit); extern struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit); -extern void free_saved_parents(struct rev_info *revs); #endif diff --git a/run-command.c b/run-command.c index 0b432cc971..3afb124c79 100644 --- a/run-command.c +++ b/run-command.c @@ -4,10 +4,6 @@ #include "sigchain.h" #include "argv-array.h" -#ifndef SHELL_PATH -# define SHELL_PATH "/bin/sh" -#endif - void child_process_init(struct child_process *child) { memset(child, 0, sizeof(*child)); diff --git a/send-pack.c b/send-pack.c index 25947d7df9..9d2b0c52ed 100644 --- a/send-pack.c +++ b/send-pack.c @@ -193,10 +193,13 @@ static void advertise_shallow_grafts_buf(struct strbuf *sb) for_each_commit_graft(advertise_shallow_grafts_cb, sb); } -static int ref_update_to_be_sent(const struct ref *ref, const struct send_pack_args *args) +#define CHECK_REF_NO_PUSH -1 +#define CHECK_REF_STATUS_REJECTED -2 +#define CHECK_REF_UPTODATE -3 +static int check_to_send_update(const struct ref *ref, const struct send_pack_args *args) { if (!ref->peer_ref && !args->send_mirror) - return 0; + return CHECK_REF_NO_PUSH; /* Check for statuses set by set_ref_status_for_push() */ switch (ref->status) { @@ -206,10 +209,11 @@ static int ref_update_to_be_sent(const struct ref *ref, const struct send_pack_a case REF_STATUS_REJECT_NEEDS_FORCE: case REF_STATUS_REJECT_STALE: case REF_STATUS_REJECT_NODELETE: + return CHECK_REF_STATUS_REJECTED; case REF_STATUS_UPTODATE: - return 0; + return CHECK_REF_UPTODATE; default: - return 1; + return 0; } } @@ -253,7 +257,7 @@ static int generate_push_cert(struct strbuf *req_buf, strbuf_addstr(&cert, "\n"); for (ref = remote_refs; ref; ref = ref->next) { - if (!ref_update_to_be_sent(ref, args)) + if (check_to_send_update(ref, args) < 0) continue; update_seen = 1; strbuf_addf(&cert, "%s %s %s\n", @@ -281,6 +285,29 @@ free_return: return update_seen; } + +static int atomic_push_failure(struct send_pack_args *args, + struct ref *remote_refs, + struct ref *failing_ref) +{ + struct ref *ref; + /* Mark other refs as failed */ + for (ref = remote_refs; ref; ref = ref->next) { + if (!ref->peer_ref && !args->send_mirror) + continue; + + switch (ref->status) { + case REF_STATUS_EXPECTING_REPORT: + ref->status = REF_STATUS_ATOMIC_PUSH_FAILED; + continue; + default: + break; /* do nothing */ + } + } + return error("atomic push failed for ref %s. status: %d\n", + failing_ref->name, failing_ref->status); +} + int send_pack(struct send_pack_args *args, int fd[], struct child_process *conn, struct ref *remote_refs, @@ -297,6 +324,8 @@ int send_pack(struct send_pack_args *args, int use_sideband = 0; int quiet_supported = 0; int agent_supported = 0; + int use_atomic = 0; + int atomic_supported = 0; unsigned cmds_sent = 0; int ret; struct async demux; @@ -317,6 +346,8 @@ int send_pack(struct send_pack_args *args, agent_supported = 1; if (server_supports("no-thin")) args->use_thin_pack = 0; + if (server_supports("atomic")) + atomic_supported = 1; if (args->push_cert) { int len; @@ -331,6 +362,10 @@ int send_pack(struct send_pack_args *args, "Perhaps you should specify a branch such as 'master'.\n"); return 0; } + if (args->atomic && !atomic_supported) + die(_("server does not support --atomic push")); + + use_atomic = atomic_supported && args->atomic; if (status_report) strbuf_addstr(&cap_buf, " report-status"); @@ -338,6 +373,8 @@ int send_pack(struct send_pack_args *args, strbuf_addstr(&cap_buf, " side-band-64k"); if (quiet_supported && (args->quiet || !args->progress)) strbuf_addstr(&cap_buf, " quiet"); + if (use_atomic) + strbuf_addstr(&cap_buf, " atomic"); if (agent_supported) strbuf_addf(&cap_buf, " agent=%s", git_user_agent_sanitized()); @@ -362,9 +399,21 @@ int send_pack(struct send_pack_args *args, * the pack data. */ for (ref = remote_refs; ref; ref = ref->next) { - if (!ref_update_to_be_sent(ref, args)) + switch (check_to_send_update(ref, args)) { + case 0: /* no error */ + break; + case CHECK_REF_STATUS_REJECTED: + /* + * When we know the server would reject a ref update if + * we were to send it and we're trying to send the refs + * atomically, abort the whole operation. + */ + if (use_atomic) + return atomic_push_failure(args, remote_refs, ref); + /* Fallthrough for non atomic case. */ + default: continue; - + } if (!ref->deletion) need_pack_data = 1; @@ -383,7 +432,7 @@ int send_pack(struct send_pack_args *args, if (args->dry_run || args->push_cert) continue; - if (!ref_update_to_be_sent(ref, args)) + if (check_to_send_update(ref, args) < 0) continue; old_hex = sha1_to_hex(ref->old_sha1); diff --git a/send-pack.h b/send-pack.h index 5635457746..b6646488aa 100644 --- a/send-pack.h +++ b/send-pack.h @@ -13,7 +13,8 @@ struct send_pack_args { use_ofs_delta:1, dry_run:1, push_cert:1, - stateless_rpc:1; + stateless_rpc:1, + atomic:1; }; int send_pack(struct send_pack_args *args, diff --git a/sequencer.c b/sequencer.c index 77a1266760..c4f4b7d571 100644 --- a/sequencer.c +++ b/sequencer.c @@ -252,7 +252,7 @@ static int fast_forward_to(const unsigned char *to, const unsigned char *from, if (!transaction || ref_transaction_update(transaction, "HEAD", to, unborn ? null_sha1 : from, - 0, 1, sb.buf, &err) || + 0, sb.buf, &err) || ref_transaction_commit(transaction, &err)) { ref_transaction_free(transaction); error("%s", err.buf); @@ -373,6 +373,7 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, { struct argv_array array; int rc; + const char *value; argv_array_init(&array); argv_array_push(&array, "commit"); @@ -385,6 +386,10 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts, if (!opts->edit) { argv_array_push(&array, "-F"); argv_array_push(&array, defmsg); + if (!opts->signoff && + !opts->record_origin && + git_config_get_value("commit.cleanup", &value)) + argv_array_push(&array, "--cleanup=verbatim"); } if (allow_empty) diff --git a/sha1_file.c b/sha1_file.c index 30995e61b3..88f06bac92 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2943,7 +2943,6 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, } /* Set it up */ - memset(&stream, 0, sizeof(stream)); git_deflate_init(&stream, zlib_compression_level); stream.next_out = compressed; stream.avail_out = sizeof(compressed); @@ -3359,31 +3358,42 @@ static int for_each_file_in_obj_subdir(int subdir_nr, return r; } -int for_each_loose_file_in_objdir(const char *path, +int for_each_loose_file_in_objdir_buf(struct strbuf *path, each_loose_object_fn obj_cb, each_loose_cruft_fn cruft_cb, each_loose_subdir_fn subdir_cb, void *data) { - struct strbuf buf = STRBUF_INIT; - size_t baselen; + size_t baselen = path->len; int r = 0; int i; - strbuf_addstr(&buf, path); - strbuf_addch(&buf, '/'); - baselen = buf.len; - for (i = 0; i < 256; i++) { - strbuf_addf(&buf, "%02x", i); - r = for_each_file_in_obj_subdir(i, &buf, obj_cb, cruft_cb, + strbuf_addf(path, "/%02x", i); + r = for_each_file_in_obj_subdir(i, path, obj_cb, cruft_cb, subdir_cb, data); - strbuf_setlen(&buf, baselen); + strbuf_setlen(path, baselen); if (r) break; } + return r; +} + +int for_each_loose_file_in_objdir(const char *path, + each_loose_object_fn obj_cb, + each_loose_cruft_fn cruft_cb, + each_loose_subdir_fn subdir_cb, + void *data) +{ + struct strbuf buf = STRBUF_INIT; + int r; + + strbuf_addstr(&buf, path); + r = for_each_loose_file_in_objdir_buf(&buf, obj_cb, cruft_cb, + subdir_cb, data); strbuf_release(&buf); + return r; } @@ -3396,9 +3406,16 @@ static int loose_from_alt_odb(struct alternate_object_database *alt, void *vdata) { struct loose_alt_odb_data *data = vdata; - return for_each_loose_file_in_objdir(alt->base, - data->cb, NULL, NULL, - data->data); + struct strbuf buf = STRBUF_INIT; + int r; + + /* copy base not including trailing '/' */ + strbuf_add(&buf, alt->base, alt->name - alt->base - 1); + r = for_each_loose_file_in_objdir_buf(&buf, + data->cb, NULL, NULL, + data->data); + strbuf_release(&buf); + return r; } int for_each_loose_object(each_loose_object_fn cb, void *data) diff --git a/sha1_name.c b/sha1_name.c index cf2a83b143..6d10f052b5 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -757,7 +757,7 @@ static int get_describe_name(const char *name, int len, unsigned char *sha1) for (cp = name + len - 1; name + 2 <= cp; cp--) { char ch = *cp; - if (hexval(ch) & ~0377) { + if (!isxdigit(ch)) { /* We must be looking at g in "SOMETHING-g" * for it to be describe output. */ @@ -1391,9 +1391,7 @@ static int get_sha1_with_context_1(const char *name, namelen = strlen(cp); } - strncpy(oc->path, cp, - sizeof(oc->path)); - oc->path[sizeof(oc->path)-1] = '\0'; + strlcpy(oc->path, cp, sizeof(oc->path)); if (!active_cache) read_cache(); @@ -1443,9 +1441,7 @@ static int get_sha1_with_context_1(const char *name, name, len); } hashcpy(oc->tree, tree_sha1); - strncpy(oc->path, filename, - sizeof(oc->path)); - oc->path[sizeof(oc->path)-1] = '\0'; + strlcpy(oc->path, filename, sizeof(oc->path)); free(new_filename); return ret; @@ -22,7 +22,7 @@ void set_alternate_shallow_file(const char *path, int override) if (alternate_shallow_file && !override) return; free(alternate_shallow_file); - alternate_shallow_file = path ? xstrdup(path) : NULL; + alternate_shallow_file = xstrdup_or_null(path); } int register_shallow(const unsigned char *sha1) @@ -137,7 +137,7 @@ struct commit_list *get_shallow_commits(struct object_array *heads, int depth, return result; } -void check_shallow_file_for_update(void) +static void check_shallow_file_for_update(void) { if (is_shallow == -1) die("BUG: shallow must be initialized by now"); @@ -1,22 +1,112 @@ #ifndef STRBUF_H #define STRBUF_H -/* See Documentation/technical/api-strbuf.txt */ +/** + * strbuf's are meant to be used with all the usual C string and memory + * APIs. Given that the length of the buffer is known, it's often better to + * use the mem* functions than a str* one (memchr vs. strchr e.g.). + * Though, one has to be careful about the fact that str* functions often + * stop on NULs and that strbufs may have embedded NULs. + * + * A strbuf is NUL terminated for convenience, but no function in the + * strbuf API actually relies on the string being free of NULs. + * + * strbufs have some invariants that are very important to keep in mind: + * + * - The `buf` member is never NULL, so it can be used in any usual C + * string operations safely. strbuf's _have_ to be initialized either by + * `strbuf_init()` or by `= STRBUF_INIT` before the invariants, though. + * + * Do *not* assume anything on what `buf` really is (e.g. if it is + * allocated memory or not), use `strbuf_detach()` to unwrap a memory + * buffer from its strbuf shell in a safe way. That is the sole supported + * way. This will give you a malloced buffer that you can later `free()`. + * + * However, it is totally safe to modify anything in the string pointed by + * the `buf` member, between the indices `0` and `len-1` (inclusive). + * + * - The `buf` member is a byte array that has at least `len + 1` bytes + * allocated. The extra byte is used to store a `'\0'`, allowing the + * `buf` member to be a valid C-string. Every strbuf function ensure this + * invariant is preserved. + * + * NOTE: It is OK to "play" with the buffer directly if you work it this + * way: + * + * strbuf_grow(sb, SOME_SIZE); <1> + * strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE); + * + * <1> Here, the memory array starting at `sb->buf`, and of length + * `strbuf_avail(sb)` is all yours, and you can be sure that + * `strbuf_avail(sb)` is at least `SOME_SIZE`. + * + * NOTE: `SOME_OTHER_SIZE` must be smaller or equal to `strbuf_avail(sb)`. + * + * Doing so is safe, though if it has to be done in many places, adding the + * missing API to the strbuf module is the way to go. + * + * WARNING: Do _not_ assume that the area that is yours is of size `alloc + * - 1` even if it's true in the current implementation. Alloc is somehow a + * "private" member that should not be messed with. Use `strbuf_avail()` + * instead. +*/ + +/** + * Data Structures + * --------------- + */ -extern char strbuf_slopbuf[]; +/** + * This is the string buffer structure. The `len` member can be used to + * determine the current length of the string, and `buf` member provides + * access to the string itself. + */ struct strbuf { size_t alloc; size_t len; char *buf; }; +extern char strbuf_slopbuf[]; #define STRBUF_INIT { 0, 0, strbuf_slopbuf } -/*----- strbuf life cycle -----*/ +/** + * Life Cycle Functions + * -------------------- + */ + +/** + * Initialize the structure. The second parameter can be zero or a bigger + * number to allocate memory, in case you want to prevent further reallocs. + */ extern void strbuf_init(struct strbuf *, size_t); + +/** + * Release a string buffer and the memory it used. You should not use the + * string buffer after using this function, unless you initialize it again. + */ extern void strbuf_release(struct strbuf *); + +/** + * Detach the string from the strbuf and returns it; you now own the + * storage the string occupies and it is your responsibility from then on + * to release it with `free(3)` when you are done with it. + */ extern char *strbuf_detach(struct strbuf *, size_t *); + +/** + * Attach a string to a buffer. You should specify the string to attach, + * the current length of the string and the amount of allocated memory. + * The amount must be larger than the string length, because the string you + * pass is supposed to be a NUL-terminated string. This string _must_ be + * malloc()ed, and after attaching, the pointer cannot be relied upon + * anymore, and neither be free()d directly. + */ extern void strbuf_attach(struct strbuf *, void *, size_t, size_t); + +/** + * Swap the contents of two string buffers. + */ static inline void strbuf_swap(struct strbuf *a, struct strbuf *b) { struct strbuf tmp = *a; @@ -24,14 +114,36 @@ static inline void strbuf_swap(struct strbuf *a, struct strbuf *b) *b = tmp; } -/*----- strbuf size related -----*/ + +/** + * Functions related to the size of the buffer + * ------------------------------------------- + */ + +/** + * Determine the amount of allocated but unused memory. + */ static inline size_t strbuf_avail(const struct strbuf *sb) { return sb->alloc ? sb->alloc - sb->len - 1 : 0; } +/** + * Ensure that at least this amount of unused memory is available after + * `len`. This is used when you know a typical size for what you will add + * and want to avoid repetitive automatic resizing of the underlying buffer. + * This is never a needed operation, but can be critical for performance in + * some cases. + */ extern void strbuf_grow(struct strbuf *, size_t); +/** + * Set the length of the buffer to a given value. This function does *not* + * allocate new memory, so you should not perform a `strbuf_setlen()` to a + * length that is larger than `len + strbuf_avail()`. `strbuf_setlen()` is + * just meant as a 'please fix invariants from this strbuf I just messed + * with'. + */ static inline void strbuf_setlen(struct strbuf *sb, size_t len) { if (len > (sb->alloc ? sb->alloc - 1 : 0)) @@ -39,78 +151,58 @@ static inline void strbuf_setlen(struct strbuf *sb, size_t len) sb->len = len; sb->buf[len] = '\0'; } + +/** + * Empty the buffer by setting the size of it to zero. + */ #define strbuf_reset(sb) strbuf_setlen(sb, 0) -/*----- content related -----*/ + +/** + * Functions related to the contents of the buffer + * ----------------------------------------------- + */ + +/** + * Strip whitespace from the beginning (`ltrim`), end (`rtrim`), or both side + * (`trim`) of a string. + */ extern void strbuf_trim(struct strbuf *); extern void strbuf_rtrim(struct strbuf *); extern void strbuf_ltrim(struct strbuf *); -extern int strbuf_reencode(struct strbuf *sb, const char *from, const char *to); -extern void strbuf_tolower(struct strbuf *sb); -extern int strbuf_cmp(const struct strbuf *, const struct strbuf *); -static inline int strbuf_strip_suffix(struct strbuf *sb, const char *suffix) -{ - if (strip_suffix_mem(sb->buf, &sb->len, suffix)) { - strbuf_setlen(sb, sb->len); - return 1; - } else - return 0; -} - -/* - * Split str (of length slen) at the specified terminator character. - * Return a null-terminated array of pointers to strbuf objects - * holding the substrings. The substrings include the terminator, - * except for the last substring, which might be unterminated if the - * original string did not end with a terminator. If max is positive, - * then split the string into at most max substrings (with the last - * substring containing everything following the (max-1)th terminator - * character). - * - * For lighter-weight alternatives, see string_list_split() and - * string_list_split_in_place(). +/** + * Replace the contents of the strbuf with a reencoded form. Returns -1 + * on error, 0 on success. */ -extern struct strbuf **strbuf_split_buf(const char *, size_t, - int terminator, int max); +extern int strbuf_reencode(struct strbuf *sb, const char *from, const char *to); -/* - * Split a NUL-terminated string at the specified terminator - * character. See strbuf_split_buf() for more information. +/** + * Lowercase each character in the buffer using `tolower`. */ -static inline struct strbuf **strbuf_split_str(const char *str, - int terminator, int max) -{ - return strbuf_split_buf(str, strlen(str), terminator, max); -} +extern void strbuf_tolower(struct strbuf *sb); -/* - * Split a strbuf at the specified terminator character. See - * strbuf_split_buf() for more information. +/** + * Compare two buffers. Returns an integer less than, equal to, or greater + * than zero if the first buffer is found, respectively, to be less than, + * to match, or be greater than the second buffer. */ -static inline struct strbuf **strbuf_split_max(const struct strbuf *sb, - int terminator, int max) -{ - return strbuf_split_buf(sb->buf, sb->len, terminator, max); -} +extern int strbuf_cmp(const struct strbuf *, const struct strbuf *); -/* - * Split a strbuf at the specified terminator character. See - * strbuf_split_buf() for more information. - */ -static inline struct strbuf **strbuf_split(const struct strbuf *sb, - int terminator) -{ - return strbuf_split_max(sb, terminator, 0); -} -/* - * Free a NULL-terminated list of strbufs (for example, the return - * values of the strbuf_split*() functions). +/** + * Adding data to the buffer + * ------------------------- + * + * NOTE: All of the functions in this section will grow the buffer as + * necessary. If they fail for some reason other than memory shortage and the + * buffer hadn't been allocated before (i.e. the `struct strbuf` was set to + * `STRBUF_INIT`), then they will free() it. */ -extern void strbuf_list_free(struct strbuf **); -/*----- add data in your buffer -----*/ +/** + * Add a single character to the buffer. + */ static inline void strbuf_addch(struct strbuf *sb, int c) { strbuf_grow(sb, 1); @@ -118,47 +210,276 @@ static inline void strbuf_addch(struct strbuf *sb, int c) sb->buf[sb->len] = '\0'; } +/** + * Add a character the specified number of times to the buffer. + */ +extern void strbuf_addchars(struct strbuf *sb, int c, size_t n); + +/** + * Insert data to the given position of the buffer. The remaining contents + * will be shifted, not overwritten. + */ extern void strbuf_insert(struct strbuf *, size_t pos, const void *, size_t); + +/** + * Remove given amount of data from a given position of the buffer. + */ extern void strbuf_remove(struct strbuf *, size_t pos, size_t len); -/* splice pos..pos+len with given data */ +/** + * Remove the bytes between `pos..pos+len` and replace it with the given + * data. + */ extern void strbuf_splice(struct strbuf *, size_t pos, size_t len, - const void *, size_t); + const void *, size_t); +/** + * Add a NUL-terminated string to the buffer. Each line will be prepended + * by a comment character and a blank. + */ extern void strbuf_add_commented_lines(struct strbuf *out, const char *buf, size_t size); + +/** + * Add data of given length to the buffer. + */ extern void strbuf_add(struct strbuf *, const void *, size_t); + +/** + * Add a NUL-terminated string to the buffer. + * + * NOTE: This function will *always* be implemented as an inline or a macro + * using strlen, meaning that this is efficient to write things like: + * + * strbuf_addstr(sb, "immediate string"); + * + */ static inline void strbuf_addstr(struct strbuf *sb, const char *s) { strbuf_add(sb, s, strlen(s)); } + +/** + * Copy the contents of another buffer at the end of the current one. + */ static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) { strbuf_grow(sb, sb2->len); strbuf_add(sb, sb2->buf, sb2->len); } + +/** + * Copy part of the buffer from a given position till a given length to the + * end of the buffer. + */ extern void strbuf_adddup(struct strbuf *sb, size_t pos, size_t len); -extern void strbuf_addchars(struct strbuf *sb, int c, size_t n); +/** + * This function can be used to expand a format string containing + * placeholders. To that end, it parses the string and calls the specified + * function for every percent sign found. + * + * The callback function is given a pointer to the character after the `%` + * and a pointer to the struct strbuf. It is expected to add the expanded + * version of the placeholder to the strbuf, e.g. to add a newline + * character if the letter `n` appears after a `%`. The function returns + * the length of the placeholder recognized and `strbuf_expand()` skips + * over it. + * + * The format `%%` is automatically expanded to a single `%` as a quoting + * mechanism; callers do not need to handle the `%` placeholder themselves, + * and the callback function will not be invoked for this placeholder. + * + * All other characters (non-percent and not skipped ones) are copied + * verbatim to the strbuf. If the callback returned zero, meaning that the + * placeholder is unknown, then the percent sign is copied, too. + * + * In order to facilitate caching and to make it possible to give + * parameters to the callback, `strbuf_expand()` passes a context pointer, + * which can be used by the programmer of the callback as she sees fit. + */ typedef size_t (*expand_fn_t) (struct strbuf *sb, const char *placeholder, void *context); extern void strbuf_expand(struct strbuf *sb, const char *format, expand_fn_t fn, void *context); + +/** + * Used as callback for `strbuf_expand()`, expects an array of + * struct strbuf_expand_dict_entry as context, i.e. pairs of + * placeholder and replacement string. The array needs to be + * terminated by an entry with placeholder set to NULL. + */ struct strbuf_expand_dict_entry { const char *placeholder; const char *value; }; extern size_t strbuf_expand_dict_cb(struct strbuf *sb, const char *placeholder, void *context); + +/** + * Append the contents of one strbuf to another, quoting any + * percent signs ("%") into double-percents ("%%") in the + * destination. This is useful for literal data to be fed to either + * strbuf_expand or to the *printf family of functions. + */ extern void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src); +/** + * Append the given byte size as a human-readable string (i.e. 12.23 KiB, + * 3.50 MiB). + */ +extern void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes); + +/** + * Add a formatted string to the buffer. + */ __attribute__((format (printf,2,3))) extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...); + +/** + * Add a formatted string prepended by a comment character and a + * blank to the buffer. + */ __attribute__((format (printf, 2, 3))) extern void strbuf_commented_addf(struct strbuf *sb, const char *fmt, ...); + __attribute__((format (printf,2,0))) extern void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap); +/** + * Read a given size of data from a FILE* pointer to the buffer. + * + * NOTE: The buffer is rewound if the read fails. If -1 is returned, + * `errno` must be consulted, like you would do for `read(3)`. + * `strbuf_read()`, `strbuf_read_file()` and `strbuf_getline()` has the + * same behaviour as well. + */ +extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); + +/** + * Read the contents of a given file descriptor. The third argument can be + * used to give a hint about the file size, to avoid reallocs. If read fails, + * any partial read is undone. + */ +extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); + +/** + * Read the contents of a file, specified by its path. The third argument + * can be used to give a hint about the file size, to avoid reallocs. + */ +extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint); + +/** + * Read the target of a symbolic link, specified by its path. The third + * argument can be used to give a hint about the size, to avoid reallocs. + */ +extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint); + +/** + * Read a line from a FILE *, overwriting the existing contents + * of the strbuf. The second argument specifies the line + * terminator character, typically `'\n'`. + * Reading stops after the terminator or at EOF. The terminator + * is removed from the buffer before returning. Returns 0 unless + * there was nothing left before EOF, in which case it returns `EOF`. + */ +extern int strbuf_getline(struct strbuf *, FILE *, int); + +/** + * Like `strbuf_getline`, but keeps the trailing terminator (if + * any) in the buffer. + */ +extern int strbuf_getwholeline(struct strbuf *, FILE *, int); + +/** + * Like `strbuf_getwholeline`, but operates on a file descriptor. + * It reads one character at a time, so it is very slow. Do not + * use it unless you need the correct position in the file + * descriptor. + */ +extern int strbuf_getwholeline_fd(struct strbuf *, int, int); + +/** + * Set the buffer to the path of the current working directory. + */ +extern int strbuf_getcwd(struct strbuf *sb); + +/** + * Add a path to a buffer, converting a relative path to an + * absolute one in the process. Symbolic links are not + * resolved. + */ +extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path); + +/** + * Strip whitespace from a buffer. The second parameter controls if + * comments are considered contents to be removed or not. + */ +extern void stripspace(struct strbuf *buf, int skip_comments); + +static inline int strbuf_strip_suffix(struct strbuf *sb, const char *suffix) +{ + if (strip_suffix_mem(sb->buf, &sb->len, suffix)) { + strbuf_setlen(sb, sb->len); + return 1; + } else + return 0; +} + +/** + * Split str (of length slen) at the specified terminator character. + * Return a null-terminated array of pointers to strbuf objects + * holding the substrings. The substrings include the terminator, + * except for the last substring, which might be unterminated if the + * original string did not end with a terminator. If max is positive, + * then split the string into at most max substrings (with the last + * substring containing everything following the (max-1)th terminator + * character). + * + * The most generic form is `strbuf_split_buf`, which takes an arbitrary + * pointer/len buffer. The `_str` variant takes a NUL-terminated string, + * the `_max` variant takes a strbuf, and just `strbuf_split` is a convenience + * wrapper to drop the `max` parameter. + * + * For lighter-weight alternatives, see string_list_split() and + * string_list_split_in_place(). + */ +extern struct strbuf **strbuf_split_buf(const char *, size_t, + int terminator, int max); + +static inline struct strbuf **strbuf_split_str(const char *str, + int terminator, int max) +{ + return strbuf_split_buf(str, strlen(str), terminator, max); +} + +static inline struct strbuf **strbuf_split_max(const struct strbuf *sb, + int terminator, int max) +{ + return strbuf_split_buf(sb->buf, sb->len, terminator, max); +} + +static inline struct strbuf **strbuf_split(const struct strbuf *sb, + int terminator) +{ + return strbuf_split_max(sb, terminator, 0); +} + +/** + * Free a NULL-terminated list of strbufs (for example, the return + * values of the strbuf_split*() functions). + */ +extern void strbuf_list_free(struct strbuf **); + +/** + * Launch the user preferred editor to edit a file and fill the buffer + * with the file's contents upon the user completing their editing. The + * third argument can be used to set the environment which the editor is + * run in. If the buffer is NULL the editor is launched as usual but the + * file's contents are not read into the buffer upon completion. + */ +extern int launch_editor(const char *path, struct strbuf *buffer, const char *const *env); + extern void strbuf_add_lines(struct strbuf *sb, const char *prefix, const char *buf, size_t size); -/* +/** * Append s to sb, with the characters '<', '>', '&' and '"' converted * into XML entities. */ @@ -170,28 +491,11 @@ static inline void strbuf_complete_line(struct strbuf *sb) strbuf_addch(sb, '\n'); } -extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); -/* XXX: if read fails, any partial read is undone */ -extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); -extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint); -extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint); -extern int strbuf_getcwd(struct strbuf *sb); - -extern int strbuf_getwholeline(struct strbuf *, FILE *, int); -extern int strbuf_getline(struct strbuf *, FILE *, int); -extern int strbuf_getwholeline_fd(struct strbuf *, int, int); - -extern void stripspace(struct strbuf *buf, int skip_comments); -extern int launch_editor(const char *path, struct strbuf *buffer, const char *const *env); - extern int strbuf_branchname(struct strbuf *sb, const char *name); extern int strbuf_check_branch_ref(struct strbuf *sb, const char *name); extern void strbuf_addstr_urlencode(struct strbuf *, const char *, int reserved); -extern void strbuf_humanise_bytes(struct strbuf *buf, off_t bytes); - -extern void strbuf_add_absolute_path(struct strbuf *sb, const char *path); __attribute__((format (printf,1,2))) extern int printf_ln(const char *fmt, ...); @@ -200,7 +504,7 @@ extern int fprintf_ln(FILE *fp, const char *fmt, ...); char *xstrdup_tolower(const char *); -/* +/** * Create a newly allocated string using printf format. You can do this easily * with a strbuf, but this provides a shortcut to save a few lines. */ diff --git a/t/diff-lib.sh b/t/diff-lib.sh index 75a35fcd06..c211dc40ee 100644 --- a/t/diff-lib.sh +++ b/t/diff-lib.sh @@ -1,6 +1,6 @@ : -sanitize_diff_raw='/^:/s/ '"$_x40"' '"$_x40"' \([A-Z]\)[0-9]* / X X \1# /' +sanitize_diff_raw='/^:/s/ '"\($_x40\)"' '"\($_x40\)"' \([A-Z]\)[0-9]* / \1 \2 \3# /' compare_diff_raw () { # When heuristics are improved, the score numbers would change. # Ignore them while comparing. diff --git a/t/diff-lib/COPYING b/t/diff-lib/COPYING new file mode 100644 index 0000000000..6ff87c4664 --- /dev/null +++ b/t/diff-lib/COPYING @@ -0,0 +1,361 @@ + + Note that the only valid version of the GPL as far as this project + is concerned is _this_ particular version of the license (ie v2, not + v2.2 or v3.x or whatever), unless explicitly otherwise stated. + + HOWEVER, in order to allow a migration to GPLv3 if that seems like + a good idea, I also ask that people involved with the project make + their preferences known. In particular, if you trust me to make that + decision, you might note so in your copyright message, ie something + like + + This file is licensed under the GPL v2, or a later version + at the discretion of Linus. + + might avoid issues. But we can also just decide to synchronize and + contact all copyright holders on record if/when the occasion arises. + + Linus Torvalds + +---------------------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/t/diff-lib/README b/t/diff-lib/README new file mode 100644 index 0000000000..548142c327 --- /dev/null +++ b/t/diff-lib/README @@ -0,0 +1,46 @@ +//////////////////////////////////////////////////////////////// + + 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 is a fast, scalable, distributed revision control system with an +unusually rich command set that provides both high-level operations +and full access to internals. + +Git is an Open Source project covered by the GNU General Public License. +It was originally written by Linus Torvalds with help of a group of +hackers around the net. It is currently maintained by Junio C Hamano. + +Please read the file INSTALL for installation instructions. +See Documentation/tutorial.txt to get started, then see +Documentation/everyday.txt for a useful minimum set of commands, +and "man git-commandname" for documentation of each command. +CVS users may also want to read Documentation/cvs-migration.txt. + +Many Git online resources are accessible from http://git.or.cz/ +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. 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://marc.theaimsgroup.com/?l=git and other archival sites. + +The messages titled "A note from the maintainer", "What's in +git.git (stable)" and "What's cooking in git.git (topics)" and +the discussion following them on the mailing list give a good +reference for project status, development direction and +remaining tasks. diff --git a/t/lib-gpg.sh b/t/lib-gpg.sh index d88da29f77..db2ef22e8f 100755 --- a/t/lib-gpg.sh +++ b/t/lib-gpg.sh @@ -23,6 +23,8 @@ else # To write armored exported key to keyring: # gpg --homedir /tmp/gpghome --export-secret-keys \ # --armor 0xDEADBEEF >> lib-gpg/keyring.gpg + # gpg --homedir /tmp/gpghome --export \ + # --armor 0xDEADBEEF >> lib-gpg/keyring.gpg # To export ownertrust: # gpg --homedir /tmp/gpghome --export-ownertrust \ # > lib-gpg/ownertrust @@ -34,6 +36,8 @@ else "$TEST_DIRECTORY"/lib-gpg/keyring.gpg && gpg --homedir "${GNUPGHOME}" 2>/dev/null --import-ownertrust \ "$TEST_DIRECTORY"/lib-gpg/ownertrust && + gpg --homedir "${GNUPGHOME}" </dev/null >/dev/null 2>&1 \ + --sign -u committer@example.com && test_set_prereq GPG ;; esac diff --git a/t/lib-gpg/keyring.gpg b/t/lib-gpg/keyring.gpg index fb1f048c22..d4754a1f19 100644 --- a/t/lib-gpg/keyring.gpg +++ b/t/lib-gpg/keyring.gpg @@ -86,3 +86,57 @@ Z9Ei+zj6JD5Pcdi3BJhQo9WOLOVEJ0NHmewTYqk9QVXH/0v1Hdl4LMJtgcbdbDWk BOW78WUxzhu0YJTLKy+iKCjg5HS5dx6OC+e4aEEgfhNPCMkbvDsJjtQ= =hieJ -----END PGP PRIVATE KEY BLOCK----- +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQGiBEZnyykRBACzCPjIpTYNL7Y2tQqlEGTTDlvZcWNLjF5f7ZzuyOqNOidLUgFD +36qch1LZLSZkShdR3Gae+bsolyjxrlFuFP0eXRPMtqK20aLw7WZvPFpEV1ThMne+ +PRJjYrvghWw3L0VVIAIZ8GXwrVBuU99uEjHEI0ojYloOvFc2jVPgSaoBvwCg48Tj +fol2foSoJa7XUu9yAL8szg8D/RUsTzNF+I9hSRHl7MYKFMYoKEY9BDgrgAujp7YY +8qdGsiUb0Ggyzp2kRjZFt4lpcvKhGfHn5GEjmtk+fRbD5qPfMqKFW+T0NPfYlYmL +JJ4fs4qZ8Lx7x6iG6X51u+YNwsQuIGjMCC3CeNi3F7or651kkNYASbaQ1NROkCIN +NudyA/0aasvoZUoNJAc2cP5Ifs6WhXMWLfMR2p2XbfKwKNYneec60usnSComcKqh +sJVk0Gytvr3FOYVhRkXnKAbx+0W2urFP8OFVBTEKO6Ts2VygWGgneQYoHnqzwlUE +yjOjlr+lyf7u2s/KAxpKA6jnttEdRZAmzWkhuox1wwAUkr27/bQiQyBPIE1pdHRl +ciA8Y29tbWl0dGVyQGV4YW1wbGUuY29tPoheBBMRAgAeBQJGZ8spAhsDBgsJCAcD +AgMVAgMDFgIBAh4BAheAAAoJEBO29R7N3kMNdB0AoL3Z/7A6tORuY8R/676oD8a/ +oHFDAJ9DXbwlcKLcykwHy0jYqajXm1iCebkCDQRGZ8tOEAgAzrl5P1Pr6CDR8mf5 +DGGzcUUM+PEroA4FLdKJ5ZaZc7qy1lmmW9vuvb6xdinwcwee2c5fdNE+iUjHV2x2 +S/dbfDzJTN/0uajZcw+xnf+KxZ0Rs4gDSs7cHXHBtA7u8ShYd4Hu7JggXpiwgfSk +yrGQiZyLAHW2ck8H07Go8eUP8fLIeva+iPqeYQZo9BaPz92R/J6debpeY1lRkv+y +WTq1GE3C/hxbdBAuHf2duLP2uq9kwoVdfzCRjgV1CQmMIbCrMb7vIlzIe96bb3+K +r/+NEtmB2I3wHBXcwJMnIOnz9Zv933KNlxSbVF23BGLB+F9D7OanKymbs7Eg18fr +mt/t/wAEDQgAtGIxGz944Pn2OtheY9JlBRuIAuVskm24/Zz03dZnk6CuEOIBb5IM +g36GAPKcn1vsLZ0TfE1q53jNpcAAXjgngnRsCjZm1mglqPD4ZfBpl+Hhnuc80fAR +xsUPj+5c8KP2M+Rws4moaZRjVpd3KCi3ceflT/OjwnE9DzdhslCGTMA5n8cajAs2 +oqAaQssefVf2prLQLGV9NB4Q3lFnKXdvipHMaAYAsW+iF7JkhTDVNuNGlufeSqUm +igRBjTZXBcVd8sj8vDOCWKUfqxJyS+zRYcotn7QvpvcKAkc3ZGxntDHAIGLVp6ay ++vrkV4Ren8BjFobl25Ruy6Abw+CgnTpuwYhJBBgRAgAJBQJGZ8tOAhsMAAoJEBO2 +9R7N3kMNwewAoNBygC0NYkW6lVGqV4EJ7PHhDaSEAJwKz78u0Twtv2EL7Zy+ve4f +mnzYApkBDQRRTJZHAQgAyYv8ZwBfMiN+Dx4pUgmzO1bThTte6BTJKbuHIDdkKT7j +OTFY8nL68ykoLmRbzwgy83gBSVtbj8S+Eh2h0pIrAqxYYox+ziVnDjzT0hQsLvop +wKALLx5uJ7OqXw2ckY1Ux0mOK3TCEqihUaM2l7vLx3gUcyIRZ7mwQnqSmVtO6Cj5 +65xC1U1VElFSPunpfCRZiSFscSzS4X0UUjxdL+DA1zxf/4glomQyPidaS70OVf3+ +2LX7AxldKD2Ouie9gRSRueeXigbbZzWPdNS5iN6HJ+T+YlZ1w2qjBJcOxSqZwDV7 +nIGNx+JC8jZCN7NydAhm1yO29zAVrY3LboVr9athuQARAQABtCRFcmlzIERpc2Nv +cmRpYSA8ZGlzY29yZEBleGFtcGxlLm5ldD6JATgEEwECACIFAlFMlkcCGwMGCwkI +BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEGEJLoW3InGJWKMH+wfn/hQ3C1X8PF8x +pSpLtRejyNchgrewDDtvyZJjuC5YB7iIBaanuW/14ypdCLEXG1S4raoiKJHPLvux +/MmFOuww5Yqu7dYKgcvqk4Uh3IJ+ljCk2qgqjhNo8x8qrpSAM0LCUPnOUkaHxGQC +k+EGtg8vp7Klg6SBO/GiXdFZ5JPVOh9lbgAb1HjfyDIL8T6+duaPqwQ+y1OCdwrT +s31frDuvt93WvgZvVIZEeLQuB/59XQzdSWLsQUG4MU6v4fJinuP+/2L8vuVrGHfe +mUSxNmRVnll7SpMJmG0ONht0mVF2mfEfDrW08lK42xSoqTuML18Ico7tZfXMQLK3 +GusW0gi5AQ0EUUyWRwEIAKk7TxXE16jPlKO2zqKPnXB4vFw3//F0hJmXzCnP1OaU +kwZO4dYEirhs4xdp98EJugPPtdNb0y2kOj6BQxVvLkAdNJo8phq0Q2BYM/G44Z2n +pGZwOF04a9UTo334DIbN7k6Qnm3VfpS/CtKCUx3N/Uzy04NtwxXEUgzftwESSUu/ +gkQSG7fS+YDm6YAOB1Gqf6OjeztOK0Dj1PNzAKp8KNiUzvw3ndM6GndFaN9TZpOB +firxBOdn7Rh23e8qiFBigbdknkwIfOdGnC3jWT/ldWO2rQQq+/85viaR1qvTh+/z +aJpRCJMS/Fg7fBnwCqKmYKnny/gAhJy2wLdXbt39BbMAEQEAAYkBHwQYAQIACQUC +UUyWRwIbDAAKCRBhCS6FtyJxiexxCADF5DH+HDlppwLr73EptyqS4IblopPXcn59 +bGPyBuWraCivsqZlf05QZTGahUM7jyCUE/FS25sbS5Q4SRtOC2yOnPGsSGcTjmSi +8uZ000stes7ahHku3onxyz2YNVBRchBCENV1tAjQwHrliofdBEY8peAoOz51kmfR +Ivs4+iQ+T3HYtwSYUKPVjizlRCdDR5nsE2KpPUFVx/9L9R3ZeCzCbYHG3Ww1pOFE +5F24PaZ97pgoJDSd1bPH1pyFjvSM3a9v8KxWNib1E+2L5fsLDSFmrbzhMxsu5wTl +u/FlMc4btGCUyysvoigo4OR0uXcejgvnuGhBIH4TTwjJG7w7CY7U +=iYv/ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh index fd53b57187..e6adf2f82d 100644 --- a/t/lib-httpd.sh +++ b/t/lib-httpd.sh @@ -37,7 +37,7 @@ then test_done fi -if ! test_have_prereq SANITY; then +if ! test_have_prereq NOT_ROOT; then test_skip_or_die $GIT_TEST_HTTPD \ "Cannot run httpd tests as root" fi @@ -79,6 +79,7 @@ HTTPD_DOCUMENT_ROOT_PATH=$HTTPD_ROOT_PATH/www # hack to suppress apache PassEnv warnings GIT_VALGRIND=$GIT_VALGRIND; export GIT_VALGRIND GIT_VALGRIND_OPTIONS=$GIT_VALGRIND_OPTIONS; export GIT_VALGRIND_OPTIONS +GIT_TRACE=$GIT_TRACE; export GIT_TRACE if ! test -x "$LIB_HTTPD_PATH" then diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index 03a4c2ee84..0b81a0047b 100644 --- a/t/lib-httpd/apache.conf +++ b/t/lib-httpd/apache.conf @@ -70,6 +70,7 @@ PassEnv GIT_VALGRIND PassEnv GIT_VALGRIND_OPTIONS PassEnv GNUPGHOME PassEnv ASAN_OPTIONS +PassEnv GIT_TRACE Alias /dumb/ www/ Alias /auth/dumb/ www/auth/dumb/ diff --git a/t/lib-terminal.sh b/t/lib-terminal.sh index 51845491bb..cd220e378e 100644 --- a/t/lib-terminal.sh +++ b/t/lib-terminal.sh @@ -1,7 +1,7 @@ # Helpers for terminal output tests. # Catch tests which should depend on TTY but forgot to. There's no need -# to aditionally check that the TTY prereq is set here. If the test declared +# to additionally check that the TTY prereq is set here. If the test declared # it and we are running the test, then it must have been set. test_terminal () { if ! test_declared_prereq TTY diff --git a/t/t0056-git-C.sh b/t/t0056-git-C.sh index 99c037703a..2630e756da 100755 --- a/t/t0056-git-C.sh +++ b/t/t0056-git-C.sh @@ -14,6 +14,16 @@ test_expect_success '"git -C <path>" runs git from the directory <path>' ' test_cmp expected actual ' +test_expect_success '"git -C <path>" with an empty <path> is a no-op' ' + ( + mkdir -p dir1/subdir && + cd dir1/subdir && + git -C "" rev-parse --show-prefix >actual && + echo subdir/ >expect && + test_cmp expect actual + ) +' + test_expect_success 'Multiple -C options: "-C dir1 -C dir2" is equivalent to "-C dir1/dir2"' ' test_create_repo dir1/dir2 && echo 1 >dir1/dir2/b.txt && diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh index 17e969df60..9acf628726 100755 --- a/t/t0061-run-command.sh +++ b/t/t0061-run-command.sh @@ -34,7 +34,7 @@ test_expect_success POSIXPERM 'run_command reports EACCES' ' grep "fatal: cannot exec.*hello.sh" err ' -test_expect_success POSIXPERM 'unreadable directory in PATH' ' +test_expect_success POSIXPERM,SANITY 'unreadable directory in PATH' ' mkdir local-command && test_when_finished "chmod u+rwx local-command && rm -fr local-command" && git config alias.nitfol "!echo frotz" && diff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh index fdc257e66f..3c6791e6be 100755 --- a/t/t1307-config-blob.sh +++ b/t/t1307-config-blob.sh @@ -67,4 +67,13 @@ test_expect_success 'parse errors in blobs are properly attributed' ' grep "HEAD:config" err ' +test_expect_success 'can parse blob ending with CR' ' + printf "[some]key = value\\r" >config && + git add config && + git commit -m CR && + echo value >expect && + git config --blob=HEAD:config some.key >actual && + test_cmp expect actual +' + test_done diff --git a/t/t1509-root-worktree.sh b/t/t1509-root-worktree.sh index 335420fd87..b6977d4b39 100755 --- a/t/t1509-root-worktree.sh +++ b/t/t1509-root-worktree.sh @@ -98,8 +98,16 @@ test_foobar_foobar() { ' } -if ! test_have_prereq POSIXPERM || ! [ -w / ]; then - skip_all="Dangerous test skipped. Read this test if you want to execute it" +if ! test -w / +then + skip_all="Test requiring writable / skipped. Read this test if you want to run it" + test_done +fi + +if test -e /refs || test -e /objects || test -e /info || test -e /hooks || + test -e /.git || test -e /foo || test -e /me +then + skip_all="Skip test that clobbers existing files in /" test_done fi @@ -108,8 +116,9 @@ if [ "$IKNOWWHATIAMDOING" != "YES" ]; then test_done fi -if [ "$UID" = 0 ]; then - skip_all="No you can't run this with root" +if ! test_have_prereq NOT_ROOT +then + skip_all="No you can't run this as root" test_done fi diff --git a/t/t3203-branch-output.sh b/t/t3203-branch-output.sh index ba4f98e800..f51d0f3cad 100755 --- a/t/t3203-branch-output.sh +++ b/t/t3203-branch-output.sh @@ -96,7 +96,7 @@ test_expect_success 'git branch -v pattern does not show branch summaries' ' test_expect_success 'git branch shows detached HEAD properly' ' cat >expect <<EOF && -* (detached from $(git rev-parse --short HEAD^0)) +* (HEAD detached at $(git rev-parse --short HEAD^0)) branch-one branch-two master @@ -106,4 +106,41 @@ EOF test_i18ncmp expect actual ' +test_expect_success 'git branch shows detached HEAD properly after moving' ' + cat >expect <<EOF && +* (HEAD detached from $(git rev-parse --short HEAD)) + branch-one + branch-two + master +EOF + git reset --hard HEAD^1 && + git branch >actual && + test_i18ncmp expect actual +' + +test_expect_success 'git branch shows detached HEAD properly from tag' ' + cat >expect <<EOF && +* (HEAD detached at fromtag) + branch-one + branch-two + master +EOF + git tag fromtag master && + git checkout fromtag && + git branch >actual && + test_i18ncmp expect actual +' + +test_expect_success 'git branch shows detached HEAD properly after moving from tag' ' + cat >expect <<EOF && +* (HEAD detached from fromtag) + branch-one + branch-two + master +EOF + git reset --hard HEAD^1 && + git branch >actual && + test_i18ncmp expect actual +' + test_done diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 8197ed29a9..034eb35cdf 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -1039,4 +1039,20 @@ test_expect_success 'short SHA-1 collide' ' ) ' +test_expect_success 'respect core.abbrev' ' + git config core.abbrev 12 && + set_cat_todo_editor && + test_must_fail git rebase -i HEAD~4 >todo-list && + test 4 = $(grep -c "pick [0-9a-f]\{12,\}" todo-list) +' + +test_expect_success 'todo count' ' + write_script dump-raw.sh <<-\EOF && + cat "$1" + EOF + test_set_editor "$(pwd)/dump-raw.sh" && + git rebase -i HEAD~4 >actual && + grep "^# Rebase ..* onto ..* ([0-9]" actual +' + test_done diff --git a/t/t3511-cherry-pick-x.sh b/t/t3511-cherry-pick-x.sh index f97727975b..b7dff09d06 100755 --- a/t/t3511-cherry-pick-x.sh +++ b/t/t3511-cherry-pick-x.sh @@ -36,6 +36,20 @@ mesg_with_cherry_footer="$mesg_with_footer_sob (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709) Tested-by: C.U. Thor <cuthor@example.com>" +mesg_unclean="$mesg_one_line + + +leading empty lines + + +consecutive empty lines + +# hash tag comment + +trailing empty lines + + +" test_expect_success setup ' git config advice.detachedhead false && @@ -53,6 +67,10 @@ test_expect_success setup ' test_commit "$mesg_with_footer_sob" foo b mesg-with-footer-sob && git reset --hard initial && test_commit "$mesg_with_cherry_footer" foo b mesg-with-cherry-footer && + git reset --hard initial && + test_config commit.cleanup verbatim && + test_commit "$mesg_unclean" foo b mesg-unclean && + test_unconfig commit.cleanup && pristine_detach initial && test_commit conflicting unrelated ' @@ -216,4 +234,14 @@ test_expect_success 'cherry-pick -x -s treats "(cherry picked from..." line as p test_cmp expect actual ' +test_expect_success 'cherry-pick preserves commit message' ' + pristine_detach initial && + printf "$mesg_unclean" >expect && + git log -1 --pretty=format:%B mesg-unclean >actual && + test_cmp expect actual && + git cherry-pick mesg-unclean && + git log -1 --pretty=format:%B >actual && + test_cmp expect actual +' + test_done diff --git a/t/t4003-diff-rename-1.sh b/t/t4003-diff-rename-1.sh index bfa8835638..df2accb655 100755 --- a/t/t4003-diff-rename-1.sh +++ b/t/t4003-diff-rename-1.sh @@ -11,7 +11,7 @@ test_description='More rename detection test_expect_success \ 'prepare reference tree' \ - 'cat "$TEST_DIRECTORY"/../COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && echo frotz >rezrov && git update-index --add COPYING rezrov && tree=$(git write-tree) && @@ -99,7 +99,7 @@ test_expect_success \ test_expect_success \ 'prepare work tree once again' \ - 'cat "$TEST_DIRECTORY"/../COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && git update-index --add --remove COPYING COPYING.1' # tree has COPYING and rezrov. work tree has COPYING and COPYING.1, diff --git a/t/t4005-diff-rename-2.sh b/t/t4005-diff-rename-2.sh index 7d2c6e13a2..135addbfbd 100755 --- a/t/t4005-diff-rename-2.sh +++ b/t/t4005-diff-rename-2.sh @@ -11,7 +11,7 @@ test_description='Same rename detection as t4003 but testing diff-raw. test_expect_success \ 'prepare reference tree' \ - 'cat "$TEST_DIRECTORY"/../COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && echo frotz >rezrov && git update-index --add COPYING rezrov && tree=$(git write-tree) && @@ -71,7 +71,7 @@ test_expect_success \ test_expect_success \ 'prepare work tree once again' \ - 'cat "$TEST_DIRECTORY"/../COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && git update-index --add --remove COPYING COPYING.1' git diff-index -C --find-copies-harder $tree >current diff --git a/t/t4007-rename-3.sh b/t/t4007-rename-3.sh index 11502b7509..dae327fabb 100755 --- a/t/t4007-rename-3.sh +++ b/t/t4007-rename-3.sh @@ -11,7 +11,7 @@ test_description='Rename interaction with pathspec. test_expect_success 'prepare reference tree' ' mkdir path0 path1 && - cp "$TEST_DIRECTORY"/../COPYING path0/COPYING && + cp "$TEST_DIRECTORY"/diff-lib/COPYING path0/COPYING && git update-index --add path0/COPYING && tree=$(git write-tree) && echo $tree diff --git a/t/t4008-diff-break-rewrite.sh b/t/t4008-diff-break-rewrite.sh index 8920464896..9dd1bc5e16 100755 --- a/t/t4008-diff-break-rewrite.sh +++ b/t/t4008-diff-break-rewrite.sh @@ -10,179 +10,145 @@ We have two very different files, file0 and file1, registered in a tree. We update file1 so drastically that it is more similar to file0, and then remove file0. With -B, changes to file1 should be broken into separate delete and create, resulting in removal of file0, removal of -original file1 and creation of completely rewritten file1. +original file1 and creation of completely rewritten file1. The latter +two are then merged back into a single "complete rewrite". Further, with -B and -M together, these three modifications should turn into rename-edit of file0 into file1. Starting from the same two files in the tree, we swap file0 and file1. -With -B, this should be detected as two complete rewrites, resulting in -four changes in total. +With -B, this should be detected as two complete rewrites. Further, with -B and -M together, these should turn into two renames. ' . ./test-lib.sh . "$TEST_DIRECTORY"/diff-lib.sh ;# test-lib chdir's into trash -test_expect_success \ - setup \ - 'cat "$TEST_DIRECTORY"/../README >file0 && - cat "$TEST_DIRECTORY"/../COPYING >file1 && - git update-index --add file0 file1 && - tree=$(git write-tree) && - echo "$tree"' - -test_expect_success \ - 'change file1 with copy-edit of file0 and remove file0' \ - 'sed -e "s/git/GIT/" file0 >file1 && - rm -f file0 && - git update-index --remove file0 file1' - -test_expect_success \ - 'run diff with -B' \ - 'git diff-index -B --cached "$tree" >current' - -cat >expected <<\EOF -:100644 000000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 0000000000000000000000000000000000000000 D file0 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 11e331465a89c394dc25c780de230043750c1ec8 M100 file1 -EOF - -test_expect_success \ - 'validate result of -B (#1)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'run diff with -B and -M' \ - 'git diff-index -B -M "$tree" >current' - -cat >expected <<\EOF -:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 08bb2fb671deff4c03a4d4a0a1315dff98d5732c R100 file0 file1 -EOF - -test_expect_success \ - 'validate result of -B -M (#2)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'swap file0 and file1' \ - 'rm -f file0 file1 && - git read-tree -m $tree && - git checkout-index -f -u -a && - mv file0 tmp && - mv file1 file0 && - mv tmp file1 && - git update-index file0 file1' - -test_expect_success \ - 'run diff with -B' \ - 'git diff-index -B "$tree" >current' - -cat >expected <<\EOF -:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 6ff87c4664981e4397625791c8ea3bbb5f2279a3 M100 file0 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100 file1 -EOF - -test_expect_success \ - 'validate result of -B (#3)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'run diff with -B and -M' \ - 'git diff-index -B -M "$tree" >current' - -cat >expected <<\EOF -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 6ff87c4664981e4397625791c8ea3bbb5f2279a3 R100 file1 file0 -:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 R100 file0 file1 -EOF - -test_expect_success \ - 'validate result of -B -M (#4)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'make file0 into something completely different' \ - 'rm -f file0 && - test_ln_s_add frotz file0 && - git update-index file1' - -test_expect_success \ - 'run diff with -B' \ - 'git diff-index -B "$tree" >current' - -cat >expected <<\EOF -:100644 120000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 67be421f88824578857624f7b3dc75e99a8a1481 T file0 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M100 file1 -EOF - -test_expect_success \ - 'validate result of -B (#5)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'run diff with -B -M' \ - 'git diff-index -B -M "$tree" >current' - -# file0 changed from regular to symlink. file1 is very close to the preimage of file0. -# the change does not make file0 disappear, so file1 is denoted as a copy of file0 -cat >expected <<\EOF -:100644 120000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 67be421f88824578857624f7b3dc75e99a8a1481 T file0 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 C file0 file1 -EOF - -test_expect_success \ - 'validate result of -B -M (#6)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'run diff with -M' \ - 'git diff-index -M "$tree" >current' - -# This should not mistake file0 as the copy source of new file1 -# due to type differences. -cat >expected <<\EOF -:100644 120000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 67be421f88824578857624f7b3dc75e99a8a1481 T file0 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 M file1 -EOF - -test_expect_success \ - 'validate result of -M (#7)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'file1 edited to look like file0 and file0 rename-edited to file2' \ - 'rm -f file0 file1 && - git read-tree -m $tree && - git checkout-index -f -u -a && - sed -e "s/git/GIT/" file0 >file1 && - sed -e "s/git/GET/" file0 >file2 && - rm -f file0 && - git update-index --add --remove file0 file1 file2' - -test_expect_success \ - 'run diff with -B' \ - 'git diff-index -B "$tree" >current' - -cat >expected <<\EOF -:100644 000000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 0000000000000000000000000000000000000000 D file0 -:100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 08bb2fb671deff4c03a4d4a0a1315dff98d5732c M100 file1 -:000000 100644 0000000000000000000000000000000000000000 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 A file2 -EOF - -test_expect_success \ - 'validate result of -B (#8)' \ - 'compare_diff_raw expected current' - -test_expect_success \ - 'run diff with -B -C' \ - 'git diff-index -B -C "$tree" >current' - -cat >expected <<\EOF -:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 08bb2fb671deff4c03a4d4a0a1315dff98d5732c C095 file0 file1 -:100644 100644 f5deac7be59e7eeab8657fd9ae706fd6a57daed2 59f832e5c8b3f7e486be15ad0cd3e95ba9af8998 R095 file0 file2 -EOF - -test_expect_success \ - 'validate result of -B -M (#9)' \ - 'compare_diff_raw expected current' +test_expect_success setup ' + cat "$TEST_DIRECTORY"/diff-lib/README >file0 && + cat "$TEST_DIRECTORY"/diff-lib/COPYING >file1 && + git update-index --add file0 file1 && + git tag reference $(git write-tree) +' + +test_expect_success 'change file1 with copy-edit of file0 and remove file0' ' + sed -e "s/git/GIT/" file0 >file1 && + rm -f file0 && + git update-index --remove file0 file1 +' + +test_expect_success 'run diff with -B (#1)' ' + git diff-index -B --cached reference >current && + cat >expect <<-\EOF && + :100644 000000 548142c327a6790ff8821d67c2ee1eff7a656b52 0000000000000000000000000000000000000000 D file0 + :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 2fbedd0b5d4b8126e4750c3bee305e8ff79f80ec M100 file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'run diff with -B and -M (#2)' ' + git diff-index -B -M reference >current && + cat >expect <<-\EOF && + :100644 100644 548142c327a6790ff8821d67c2ee1eff7a656b52 2fbedd0b5d4b8126e4750c3bee305e8ff79f80ec R100 file0 file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'swap file0 and file1' ' + rm -f file0 file1 && + git read-tree -m reference && + git checkout-index -f -u -a && + mv file0 tmp && + mv file1 file0 && + mv tmp file1 && + git update-index file0 file1 +' + +test_expect_success 'run diff with -B (#3)' ' + git diff-index -B reference >current && + cat >expect <<-\EOF && + :100644 100644 548142c327a6790ff8821d67c2ee1eff7a656b52 6ff87c4664981e4397625791c8ea3bbb5f2279a3 M100 file0 + :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 548142c327a6790ff8821d67c2ee1eff7a656b52 M100 file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'run diff with -B and -M (#4)' ' + git diff-index -B -M reference >current && + cat >expect <<-\EOF && + :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 6ff87c4664981e4397625791c8ea3bbb5f2279a3 R100 file1 file0 + :100644 100644 548142c327a6790ff8821d67c2ee1eff7a656b52 548142c327a6790ff8821d67c2ee1eff7a656b52 R100 file0 file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'make file0 into something completely different' ' + rm -f file0 && + test_ln_s_add frotz file0 && + git update-index file1 +' + +test_expect_success 'run diff with -B (#5)' ' + git diff-index -B reference >current && + cat >expect <<-\EOF && + :100644 120000 548142c327a6790ff8821d67c2ee1eff7a656b52 67be421f88824578857624f7b3dc75e99a8a1481 T file0 + :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 548142c327a6790ff8821d67c2ee1eff7a656b52 M100 file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'run diff with -B -M (#6)' ' + git diff-index -B -M reference >current && + + # file0 changed from regular to symlink. file1 is the same as the preimage + # of file0. Because the change does not make file0 disappear, file1 is + # denoted as a copy of file0 + cat >expect <<-\EOF && + :100644 120000 548142c327a6790ff8821d67c2ee1eff7a656b52 67be421f88824578857624f7b3dc75e99a8a1481 T file0 + :100644 100644 548142c327a6790ff8821d67c2ee1eff7a656b52 548142c327a6790ff8821d67c2ee1eff7a656b52 C file0 file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'run diff with -M (#7)' ' + git diff-index -M reference >current && + + # This should not mistake file0 as the copy source of new file1 + # due to type differences. + cat >expect <<-\EOF && + :100644 120000 548142c327a6790ff8821d67c2ee1eff7a656b52 67be421f88824578857624f7b3dc75e99a8a1481 T file0 + :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 548142c327a6790ff8821d67c2ee1eff7a656b52 M file1 + EOF + compare_diff_raw expect current +' + +test_expect_success 'file1 edited to look like file0 and file0 rename-edited to file2' ' + rm -f file0 file1 && + git read-tree -m reference && + git checkout-index -f -u -a && + sed -e "s/git/GIT/" file0 >file1 && + sed -e "s/git/GET/" file0 >file2 && + rm -f file0 && + git update-index --add --remove file0 file1 file2 +' + +test_expect_success 'run diff with -B (#8)' ' + git diff-index -B reference >current && + cat >expect <<-\EOF && + :100644 000000 548142c327a6790ff8821d67c2ee1eff7a656b52 0000000000000000000000000000000000000000 D file0 + :100644 100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 2fbedd0b5d4b8126e4750c3bee305e8ff79f80ec M100 file1 + :000000 100644 0000000000000000000000000000000000000000 69a939f651686f56322566e2fd76715947a24162 A file2 + EOF + compare_diff_raw expect current +' + +test_expect_success 'run diff with -B -C (#9)' ' + git diff-index -B -C reference >current && + cat >expect <<-\EOF && + :100644 100644 548142c327a6790ff8821d67c2ee1eff7a656b52 2fbedd0b5d4b8126e4750c3bee305e8ff79f80ec C095 file0 file1 + :100644 100644 548142c327a6790ff8821d67c2ee1eff7a656b52 69a939f651686f56322566e2fd76715947a24162 R095 file0 file2 + EOF + compare_diff_raw expect current +' test_done diff --git a/t/t4009-diff-rename-4.sh b/t/t4009-diff-rename-4.sh index 57c094fdce..3641fd84d6 100755 --- a/t/t4009-diff-rename-4.sh +++ b/t/t4009-diff-rename-4.sh @@ -11,7 +11,7 @@ test_description='Same rename detection as t4003 but testing diff-raw -z. test_expect_success \ 'prepare reference tree' \ - 'cat "$TEST_DIRECTORY"/../COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && echo frotz >rezrov && git update-index --add COPYING rezrov && tree=$(git write-tree) && @@ -78,7 +78,7 @@ test_expect_success \ test_expect_success \ 'prepare work tree once again' \ - 'cat "$TEST_DIRECTORY"/../COPYING >COPYING && + 'cat "$TEST_DIRECTORY"/diff-lib/COPYING >COPYING && git update-index --add --remove COPYING COPYING.1' git diff-index -z -C --find-copies-harder $tree >current diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh index bf07841866..43c488b545 100755 --- a/t/t4010-diff-pathspec.sh +++ b/t/t4010-diff-pathspec.sh @@ -56,7 +56,7 @@ test_expect_success \ compare_diff_raw current expected' cat >expected <<\EOF -:100644 100644 766498d93a4b06057a8e49d23f4068f1170ff38f 0a41e115ab61be0328a19b29f18cdcb49338d516 M file0 +:100644 100644 8e4020bb5a8d8c873b25de15933e75cc0fc275df dca6b92303befc93086aa025d90a5facd7eb2812 M file0 EOF test_expect_success \ 'limit to file0 should show file0' \ diff --git a/t/t4013/diff.log_--decorate_--all b/t/t4013/diff.log_--decorate_--all index 27d3eabc26..3aa16a9e42 100644 --- a/t/t4013/diff.log_--decorate_--all +++ b/t/t4013/diff.log_--decorate_--all @@ -5,7 +5,7 @@ Date: Mon Jun 26 00:06:00 2006 +0000 Rearranged lines in dir/sub -commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, master) +commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD -> master) Merge: 9a6d494 c7a2ab9 Author: A U Thor <author@example.com> Date: Mon Jun 26 00:04:00 2006 +0000 diff --git a/t/t4047-diff-dirstat.sh b/t/t4047-diff-dirstat.sh index ed7e093366..0d50dce97e 100755 --- a/t/t4047-diff-dirstat.sh +++ b/t/t4047-diff-dirstat.sh @@ -973,4 +973,18 @@ test_expect_success 'diff.dirstat=future_param,0,lines should warn, but still wo test_i18ngrep -q "diff\\.dirstat" actual_error ' +test_expect_success '--shortstat --dirstat should output only one dirstat' ' + git diff --shortstat --dirstat=changes HEAD^..HEAD >out && + grep " dst/copy/changed/$" out >actual_diff_shortstat_dirstat_changes && + test_line_count = 1 actual_diff_shortstat_dirstat_changes && + + git diff --shortstat --dirstat=lines HEAD^..HEAD >out && + grep " dst/copy/changed/$" out >actual_diff_shortstat_dirstat_lines && + test_line_count = 1 actual_diff_shortstat_dirstat_lines && + + git diff --shortstat --dirstat=files HEAD^..HEAD >out && + grep " dst/copy/changed/$" out >actual_diff_shortstat_dirstat_files && + test_line_count = 1 actual_diff_shortstat_dirstat_files +' + test_done diff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh index b68afefa3c..babd2ead88 100755 --- a/t/t4052-stat-output.sh +++ b/t/t4052-stat-output.sh @@ -99,7 +99,7 @@ do test_cmp "$expect" actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success "$cmd --graph $verb COLUMNS (big change)" ' COLUMNS=200 git $cmd $args --graph >output @@ -127,7 +127,7 @@ do test_cmp "$expect" actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success "$cmd --graph $verb not enough COLUMNS (big change)" ' COLUMNS=40 git $cmd $args --graph >output @@ -155,7 +155,7 @@ do test_cmp "$expect" actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success "$cmd --graph $verb statGraphWidth config" ' git -c diff.statGraphWidth=26 $cmd $args --graph >output @@ -196,7 +196,7 @@ do test_cmp expect actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success "$cmd --stat-width=width --graph with big change" ' git $cmd $args --stat-width=40 --graph >output @@ -236,7 +236,7 @@ do test_cmp expect actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success "$cmd --stat=width --graph with big change is balanced" ' git $cmd $args --stat-width=60 --graph >output && @@ -270,7 +270,7 @@ do test_cmp "$expect" actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success "$cmd --graph $verb COLUMNS (long filename)" ' COLUMNS=200 git $cmd $args --graph >output @@ -299,7 +299,7 @@ do test_cmp "$expect" actual ' - test "$cmd" != diff || continue + case "$cmd" in diff|show) continue;; esac test_expect_success COLUMNS_CAN_BE_1 \ "$cmd --graph $verb prefix greater than COLUMNS (big change)" ' diff --git a/t/t4058-diff-duplicates.sh b/t/t4058-diff-duplicates.sh new file mode 100755 index 0000000000..0a23242cb6 --- /dev/null +++ b/t/t4058-diff-duplicates.sh @@ -0,0 +1,79 @@ +#!/bin/sh + +test_description='test tree diff when trees have duplicate entries' +. ./test-lib.sh + +# make_tree_entry <mode> <mode> <sha1> +# +# We have to rely on perl here because not all printfs understand +# hex escapes (only octal), and xxd is not portable. +make_tree_entry () { + printf '%s %s\0' "$1" "$2" && + perl -e 'print chr(hex($_)) for ($ARGV[0] =~ /../g)' "$3" +} + +# Like git-mktree, but without all of the pesky sanity checking. +# Arguments come in groups of three, each group specifying a single +# tree entry (see make_tree_entry above). +make_tree () { + while test $# -gt 2; do + make_tree_entry "$1" "$2" "$3" + shift; shift; shift + done | + git hash-object -w -t tree --stdin +} + +# this is kind of a convoluted setup, but matches +# a real-world case. Each tree contains four entries +# for the given path, one with one sha1, and three with +# the other. The first tree has them split across +# two subtrees (which are themselves duplicate entries in +# the root tree), and the second has them all in a single subtree. +test_expect_success 'create trees with duplicate entries' ' + blob_one=$(echo one | git hash-object -w --stdin) && + blob_two=$(echo two | git hash-object -w --stdin) && + inner_one_a=$(make_tree \ + 100644 inner $blob_one + ) && + inner_one_b=$(make_tree \ + 100644 inner $blob_two \ + 100644 inner $blob_two \ + 100644 inner $blob_two + ) && + outer_one=$(make_tree \ + 040000 outer $inner_one_a \ + 040000 outer $inner_one_b + ) && + inner_two=$(make_tree \ + 100644 inner $blob_one \ + 100644 inner $blob_two \ + 100644 inner $blob_two \ + 100644 inner $blob_two + ) && + outer_two=$(make_tree \ + 040000 outer $inner_two + ) && + git tag one $outer_one && + git tag two $outer_two +' + +test_expect_success 'diff-tree between trees' ' + { + printf ":000000 100644 $_z40 $blob_two A\touter/inner\n" && + printf ":000000 100644 $_z40 $blob_two A\touter/inner\n" && + printf ":000000 100644 $_z40 $blob_two A\touter/inner\n" && + printf ":100644 000000 $blob_two $_z40 D\touter/inner\n" && + printf ":100644 000000 $blob_two $_z40 D\touter/inner\n" && + printf ":100644 000000 $blob_two $_z40 D\touter/inner\n" + } >expect && + git diff-tree -r --no-abbrev one two >actual && + test_cmp expect actual +' + +test_expect_success 'diff-tree with renames' ' + # same expectation as above, since we disable rename detection + git diff-tree -M -r --no-abbrev one two >actual && + test_cmp expect actual +' + +test_done diff --git a/t/t4122-apply-symlink-inside.sh b/t/t4122-apply-symlink-inside.sh index 70b3a06e1d..4acb3f336e 100755 --- a/t/t4122-apply-symlink-inside.sh +++ b/t/t4122-apply-symlink-inside.sh @@ -3,17 +3,10 @@ test_description='apply to deeper directory without getting fooled with symlink' . ./test-lib.sh -lecho () { - for l_ - do - echo "$l_" - done -} - test_expect_success setup ' mkdir -p arch/i386/boot arch/x86_64 && - lecho 1 2 3 4 5 >arch/i386/boot/Makefile && + test_write_lines 1 2 3 4 5 >arch/i386/boot/Makefile && test_ln_s_add ../i386/boot arch/x86_64/boot && git add . && test_tick && @@ -22,7 +15,7 @@ test_expect_success setup ' rm arch/x86_64/boot && mkdir arch/x86_64/boot && - lecho 2 3 4 5 6 >arch/x86_64/boot/Makefile && + test_write_lines 2 3 4 5 6 >arch/x86_64/boot/Makefile && git add . && test_tick && git commit -a -m second && @@ -52,4 +45,110 @@ test_expect_success 'check result' ' ' +test_expect_success SYMLINKS 'do not read from beyond symbolic link' ' + git reset --hard && + mkdir -p arch/x86_64/dir && + >arch/x86_64/dir/file && + git add arch/x86_64/dir/file && + echo line >arch/x86_64/dir/file && + git diff >patch && + git reset --hard && + + mkdir arch/i386/dir && + >arch/i386/dir/file && + ln -s ../i386/dir arch/x86_64/dir && + + test_must_fail git apply patch && + test_must_fail git apply --cached patch && + test_must_fail git apply --index patch + +' + +test_expect_success SYMLINKS 'do not follow symbolic link (setup)' ' + + rm -rf arch/i386/dir arch/x86_64/dir && + git reset --hard && + ln -s ../i386/dir arch/x86_64/dir && + git add arch/x86_64/dir && + git diff HEAD >add_symlink.patch && + git reset --hard && + + mkdir arch/x86_64/dir && + >arch/x86_64/dir/file && + git add arch/x86_64/dir/file && + git diff HEAD >add_file.patch && + git diff -R HEAD >del_file.patch && + git reset --hard && + rm -fr arch/x86_64/dir && + + cat add_symlink.patch add_file.patch >patch && + cat add_symlink.patch del_file.patch >tricky_del && + + mkdir arch/i386/dir +' + +test_expect_success SYMLINKS 'do not follow symbolic link (same input)' ' + + # same input creates a confusing symbolic link + test_must_fail git apply patch 2>error-wt && + test_i18ngrep "beyond a symbolic link" error-wt && + test_path_is_missing arch/x86_64/dir && + test_path_is_missing arch/i386/dir/file && + + test_must_fail git apply --index patch 2>error-ix && + test_i18ngrep "beyond a symbolic link" error-ix && + test_path_is_missing arch/x86_64/dir && + test_path_is_missing arch/i386/dir/file && + test_must_fail git ls-files --error-unmatch arch/x86_64/dir && + test_must_fail git ls-files --error-unmatch arch/i386/dir && + + test_must_fail git apply --cached patch 2>error-ct && + test_i18ngrep "beyond a symbolic link" error-ct && + test_must_fail git ls-files --error-unmatch arch/x86_64/dir && + test_must_fail git ls-files --error-unmatch arch/i386/dir && + + >arch/i386/dir/file && + git add arch/i386/dir/file && + + test_must_fail git apply tricky_del && + test_path_is_file arch/i386/dir/file && + + test_must_fail git apply --index tricky_del && + test_path_is_file arch/i386/dir/file && + test_must_fail git ls-files --error-unmatch arch/x86_64/dir && + git ls-files --error-unmatch arch/i386/dir && + + test_must_fail git apply --cached tricky_del && + test_must_fail git ls-files --error-unmatch arch/x86_64/dir && + git ls-files --error-unmatch arch/i386/dir +' + +test_expect_success SYMLINKS 'do not follow symbolic link (existing)' ' + + # existing symbolic link + git reset --hard && + ln -s ../i386/dir arch/x86_64/dir && + git add arch/x86_64/dir && + + test_must_fail git apply add_file.patch 2>error-wt-add && + test_i18ngrep "beyond a symbolic link" error-wt-add && + test_path_is_missing arch/i386/dir/file && + + mkdir arch/i386/dir && + >arch/i386/dir/file && + test_must_fail git apply del_file.patch 2>error-wt-del && + test_i18ngrep "beyond a symbolic link" error-wt-del && + test_path_is_file arch/i386/dir/file && + rm arch/i386/dir/file && + + test_must_fail git apply --index add_file.patch 2>error-ix-add && + test_i18ngrep "beyond a symbolic link" error-ix-add && + test_path_is_missing arch/i386/dir/file && + test_must_fail git ls-files --error-unmatch arch/i386/dir && + + test_must_fail git apply --cached add_file.patch 2>error-ct-file && + test_i18ngrep "beyond a symbolic link" error-ct-file && + test_must_fail git ls-files --error-unmatch arch/i386/dir +' + test_done diff --git a/t/t4138-apply-ws-expansion.sh b/t/t4138-apply-ws-expansion.sh new file mode 100755 index 0000000000..0ffe33fbef --- /dev/null +++ b/t/t4138-apply-ws-expansion.sh @@ -0,0 +1,121 @@ +#!/bin/sh +# +# Copyright (C) 2015 Kyle J. McKay +# + +test_description='git apply test patches with whitespace expansion.' + +. ./test-lib.sh + +test_expect_success setup ' + # + ## create test-N, patchN.patch, expect-N files + # + + # test 1 + printf "\t%s\n" 1 2 3 4 5 6 >before && + printf "\t%s\n" 1 2 3 >after && + printf "%64s\n" a b c >>after && + printf "\t%s\n" 4 5 6 >>after && + git diff --no-index before after | + sed -e "s/before/test-1/" -e "s/after/test-1/" >patch1.patch && + printf "%64s\n" 1 2 3 4 5 6 >test-1 && + printf "%64s\n" 1 2 3 a b c 4 5 6 >expect-1 && + + # test 2 + printf "\t%s\n" a b c d e f >before && + printf "\t%s\n" a b c >after && + n=10 && + x=1 && + while test $x -lt $n + do + printf "%63s%d\n" "" $x >>after + x=$(( $x + 1 )) + done && + printf "\t%s\n" d e f >>after && + git diff --no-index before after | + sed -e "s/before/test-2/" -e "s/after/test-2/" >patch2.patch && + printf "%64s\n" a b c d e f >test-2 && + printf "%64s\n" a b c >expect-2 && + x=1 && + while test $x -lt $n + do + printf "%63s%d\n" "" $x >>expect-2 + x=$(( $x + 1 )) + done && + printf "%64s\n" d e f >>expect-2 && + + # test 3 + printf "\t%s\n" a b c d e f >before && + printf "\t%s\n" a b c >after && + n=100 && + x=0 && + while test $x -lt $n + do + printf "%63s%02d\n" "" $x >>after + x=$(( $x + 1 )) + done && + printf "\t%s\n" d e f >>after && + git diff --no-index before after | + sed -e "s/before/test-3/" -e "s/after/test-3/" >patch3.patch && + printf "%64s\n" a b c d e f >test-3 && + printf "%64s\n" a b c >expect-3 && + x=0 && + while test $x -lt $n + do + printf "%63s%02d\n" "" $x >>expect-3 + x=$(( $x + 1 )) + done && + printf "%64s\n" d e f >>expect-3 && + + # test 4 + >before && + x=0 && + while test $x -lt 50 + do + printf "\t%02d\n" $x >>before + x=$(( $x + 1 )) + done && + cat before >after && + printf "%64s\n" a b c >>after && + while test $x -lt 100 + do + printf "\t%02d\n" $x >>before + printf "\t%02d\n" $x >>after + x=$(( $x + 1 )) + done && + git diff --no-index before after | + sed -e "s/before/test-4/" -e "s/after/test-4/" >patch4.patch && + >test-4 && + x=0 && + while test $x -lt 50 + do + printf "%63s%02d\n" "" $x >>test-4 + x=$(( $x + 1 )) + done && + cat test-4 >expect-4 && + printf "%64s\n" a b c >>expect-4 && + while test $x -lt 100 + do + printf "%63s%02d\n" "" $x >>test-4 + printf "%63s%02d\n" "" $x >>expect-4 + x=$(( $x + 1 )) + done && + + git config core.whitespace tab-in-indent,tabwidth=63 && + git config apply.whitespace fix + +' + +# Note that `patch` can successfully apply all patches when run +# with the --ignore-whitespace option. + +for t in 1 2 3 4 +do + test_expect_success 'apply with ws expansion (t=$t)' ' + git apply patch$t.patch && + test_cmp test-$t expect-$t + ' +done + +test_done diff --git a/t/t4139-apply-escape.sh b/t/t4139-apply-escape.sh new file mode 100755 index 0000000000..45b5660a47 --- /dev/null +++ b/t/t4139-apply-escape.sh @@ -0,0 +1,141 @@ +#!/bin/sh + +test_description='paths written by git-apply cannot escape the working tree' +. ./test-lib.sh + +# tests will try to write to ../foo, and we do not +# want them to escape the trash directory when they +# fail +test_expect_success 'bump git repo one level down' ' + mkdir inside && + mv .git inside/ && + cd inside +' + +# $1 = name of file +# $2 = current path to file (if different) +mkpatch_add () { + rm -f "${2:-$1}" && + cat <<-EOF + diff --git a/$1 b/$1 + new file mode 100644 + index 0000000..53c74cd + --- /dev/null + +++ b/$1 + @@ -0,0 +1 @@ + +evil + EOF +} + +mkpatch_del () { + echo evil >"${2:-$1}" && + cat <<-EOF + diff --git a/$1 b/$1 + deleted file mode 100644 + index 53c74cd..0000000 + --- a/$1 + +++ /dev/null + @@ -1 +0,0 @@ + -evil + EOF +} + +# $1 = name of file +# $2 = content of symlink +mkpatch_symlink () { + rm -f "$1" && + cat <<-EOF + diff --git a/$1 b/$1 + new file mode 120000 + index 0000000..$(printf "%s" "$2" | git hash-object --stdin) + --- /dev/null + +++ b/$1 + @@ -0,0 +1 @@ + +$2 + \ No newline at end of file + EOF +} + +test_expect_success 'cannot create file containing ..' ' + mkpatch_add ../foo >patch && + test_must_fail git apply patch && + test_path_is_missing ../foo +' + +test_expect_success 'can create file containing .. with --unsafe-paths' ' + mkpatch_add ../foo >patch && + git apply --unsafe-paths patch && + test_path_is_file ../foo +' + +test_expect_success 'cannot create file containing .. (index)' ' + mkpatch_add ../foo >patch && + test_must_fail git apply --index patch && + test_path_is_missing ../foo +' + +test_expect_success 'cannot create file containing .. with --unsafe-paths (index)' ' + mkpatch_add ../foo >patch && + test_must_fail git apply --index --unsafe-paths patch && + test_path_is_missing ../foo +' + +test_expect_success 'cannot delete file containing ..' ' + mkpatch_del ../foo >patch && + test_must_fail git apply patch && + test_path_is_file ../foo +' + +test_expect_success 'can delete file containing .. with --unsafe-paths' ' + mkpatch_del ../foo >patch && + git apply --unsafe-paths patch && + test_path_is_missing ../foo +' + +test_expect_success 'cannot delete file containing .. (index)' ' + mkpatch_del ../foo >patch && + test_must_fail git apply --index patch && + test_path_is_file ../foo +' + +test_expect_success SYMLINKS 'symlink escape via ..' ' + { + mkpatch_symlink tmp .. && + mkpatch_add tmp/foo ../foo + } >patch && + test_must_fail git apply patch && + test_path_is_missing tmp && + test_path_is_missing ../foo +' + +test_expect_success SYMLINKS 'symlink escape via .. (index)' ' + { + mkpatch_symlink tmp .. && + mkpatch_add tmp/foo ../foo + } >patch && + test_must_fail git apply --index patch && + test_path_is_missing tmp && + test_path_is_missing ../foo +' + +test_expect_success SYMLINKS 'symlink escape via absolute path' ' + { + mkpatch_symlink tmp "$(pwd)" && + mkpatch_add tmp/foo ../foo + } >patch && + test_must_fail git apply patch && + test_path_is_missing tmp && + test_path_is_missing ../foo +' + +test_expect_success SYMLINKS 'symlink escape via absolute path (index)' ' + { + mkpatch_symlink tmp "$(pwd)" && + mkpatch_add tmp/foo ../foo + } >patch && + test_must_fail git apply --index patch && + test_path_is_missing tmp && + test_path_is_missing ../foo +' + +test_done diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 99ab7ca21f..f111705e70 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -212,6 +212,21 @@ test_expect_success 'log --grep' ' test_cmp expect actual ' +cat > expect << EOF +second +initial +EOF +test_expect_success 'log --invert-grep --grep' ' + git log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual && + test_cmp expect actual +' + +test_expect_success 'log --invert-grep --grep -i' ' + echo initial >expect && + git log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual && + test_cmp expect actual +' + test_expect_success 'log --grep option parsing' ' echo second >expect && git log -1 --pretty="tformat:%s" --grep sec >actual && @@ -872,4 +887,8 @@ test_expect_success GPG 'log --graph --show-signature for merged tag' ' grep "^| | gpg: Good signature" actual ' +test_expect_success 'log --graph --no-walk is forbidden' ' + test_must_fail git log --graph --no-walk +' + test_done diff --git a/t/t4207-log-decoration-colors.sh b/t/t4207-log-decoration-colors.sh index 925f577a3c..f8008b6a3d 100755 --- a/t/t4207-log-decoration-colors.sh +++ b/t/t4207-log-decoration-colors.sh @@ -44,15 +44,15 @@ test_expect_success setup ' ' cat >expected <<EOF -${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_HEAD}HEAD${c_reset}${c_commit},\ - ${c_tag}tag: v1.0${c_reset}${c_commit},\ - ${c_tag}tag: B${c_reset}${c_commit},\ - ${c_branch}master${c_reset}${c_commit})${c_reset} B -${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_tag}tag: A1${c_reset}${c_commit},\ - ${c_remoteBranch}other/master${c_reset}${c_commit})${c_reset} A1 -${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_stash}refs/stash${c_reset}${c_commit})${c_reset}\ +${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_HEAD}HEAD${c_reset}${c_commit} ->\ + ${c_reset}${c_branch}master${c_reset}${c_commit},\ + ${c_reset}${c_tag}tag: v1.0${c_reset}${c_commit},\ + ${c_reset}${c_tag}tag: B${c_reset}${c_commit})${c_reset} B +${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A1${c_reset}${c_commit},\ + ${c_reset}${c_remoteBranch}other/master${c_reset}${c_commit})${c_reset} A1 +${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_stash}refs/stash${c_reset}${c_commit})${c_reset}\ On master: Changes to A.t -${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_tag}tag: A${c_reset}${c_commit})${c_reset} A +${c_commit}COMMIT_ID${c_reset}${c_commit} (${c_reset}${c_tag}tag: A${c_reset}${c_commit})${c_reset} A EOF # We want log to show all, but the second parent to refs/stash is irrelevant diff --git a/t/t4255-am-submodule.sh b/t/t4255-am-submodule.sh index 8bde7dbb6d..0ba8194403 100755 --- a/t/t4255-am-submodule.sh +++ b/t/t4255-am-submodule.sh @@ -18,4 +18,76 @@ am_3way () { KNOWN_FAILURE_NOFF_MERGE_ATTEMPTS_TO_MERGE_REMOVED_SUBMODULE_FILES=1 test_submodule_switch "am_3way" +test_expect_success 'setup diff.submodule' ' + test_commit one && + INITIAL=$(git rev-parse HEAD) && + + git init submodule && + ( + cd submodule && + test_commit two && + git rev-parse HEAD >../initial-submodule + ) && + git submodule add ./submodule && + git commit -m first && + + ( + cd submodule && + test_commit three && + git rev-parse HEAD >../first-submodule + ) && + git add submodule && + git commit -m second && + SECOND=$(git rev-parse HEAD) && + + ( + cd submodule && + git mv two.t four.t && + git commit -m "second submodule" && + git rev-parse HEAD >../second-submodule + ) && + test_commit four && + git add submodule && + git commit --amend --no-edit && + THIRD=$(git rev-parse HEAD) && + git submodule update --init +' + +run_test() { + START_COMMIT=$1 && + EXPECT=$2 && + # Abort any merges in progress: the previous + # test may have failed, and we should clean up. + test_might_fail git am --abort && + git reset --hard $START_COMMIT && + rm -f *.patch && + git format-patch -1 && + git reset --hard $START_COMMIT^ && + git submodule update && + git am *.patch && + git submodule update && + git -C submodule rev-parse HEAD >actual && + test_cmp $EXPECT actual +} + +test_expect_success 'diff.submodule unset' ' + test_unconfig diff.submodule && + run_test $SECOND first-submodule +' + +test_expect_success 'diff.submodule unset with extra file' ' + test_unconfig diff.submodule && + run_test $THIRD second-submodule +' + +test_expect_success 'diff.submodule=log' ' + test_config diff.submodule log && + run_test $SECOND first-submodule +' + +test_expect_success 'diff.submodule=log with extra file' ' + test_config diff.submodule log && + run_test $THIRD second-submodule +' + test_done diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh index c929db5633..14744b2a4b 100755 --- a/t/t5003-archive-zip.sh +++ b/t/t5003-archive-zip.sh @@ -33,6 +33,37 @@ check_zip() { test_expect_success UNZIP " validate file contents" " diff -r a ${dir_with_prefix}a " + + dir=eol_$1 + dir_with_prefix=$dir/$2 + extracted=${dir_with_prefix}a + original=a + + test_expect_success UNZIP " extract ZIP archive with EOL conversion" ' + (mkdir $dir && cd $dir && "$GIT_UNZIP" -a ../$zipfile) + ' + + test_expect_success UNZIP " validate that text files are converted" " + test_cmp_bin $extracted/text.cr $extracted/text.crlf && + test_cmp_bin $extracted/text.cr $extracted/text.lf + " + + test_expect_success UNZIP " validate that binary files are unchanged" " + test_cmp_bin $original/binary.cr $extracted/binary.cr && + test_cmp_bin $original/binary.crlf $extracted/binary.crlf && + test_cmp_bin $original/binary.lf $extracted/binary.lf + " + + test_expect_success UNZIP " validate that diff files are converted" " + test_cmp_bin $extracted/diff.cr $extracted/diff.crlf && + test_cmp_bin $extracted/diff.cr $extracted/diff.lf + " + + test_expect_success UNZIP " validate that -diff files are unchanged" " + test_cmp_bin $original/nodiff.cr $extracted/nodiff.cr && + test_cmp_bin $original/nodiff.crlf $extracted/nodiff.crlf && + test_cmp_bin $original/nodiff.lf $extracted/nodiff.lf + " } test_expect_success \ @@ -41,6 +72,18 @@ test_expect_success \ echo simple textfile >a/a && mkdir a/bin && cp /bin/sh a/bin && + printf "text\r" >a/text.cr && + printf "text\r\n" >a/text.crlf && + printf "text\n" >a/text.lf && + printf "text\r" >a/nodiff.cr && + printf "text\r\n" >a/nodiff.crlf && + printf "text\n" >a/nodiff.lf && + printf "\0\r" >a/binary.cr && + printf "\0\r\n" >a/binary.crlf && + printf "\0\n" >a/binary.lf && + printf "\0\r" >a/diff.cr && + printf "\0\r\n" >a/diff.crlf && + printf "\0\n" >a/diff.lf && printf "A\$Format:%s\$O" "$SUBSTFORMAT" >a/substfile1 && printf "A not substituted O" >a/substfile2 && (p=long_path_to_a_file && cd a && @@ -66,7 +109,9 @@ test_expect_success 'add files to repository' ' GIT_COMMITTER_DATE="2005-05-27 22:00" git commit -m initial ' -test_expect_success 'setup export-subst' ' +test_expect_success 'setup export-subst and diff attributes' ' + echo "a/nodiff.* -diff" >>.git/info/attributes && + echo "a/diff.* diff" >>.git/info/attributes && echo "substfile?" export-subst >>.git/info/attributes && git log --max-count=1 "--pretty=format:A${SUBSTFORMAT}O" HEAD \ >a/substfile1 diff --git a/t/t5304-prune.sh b/t/t5304-prune.sh index e32e46dee1..0794d33dad 100755 --- a/t/t5304-prune.sh +++ b/t/t5304-prune.sh @@ -253,4 +253,12 @@ test_expect_success 'prune .git/shallow' ' test_path_is_missing .git/shallow ' +test_expect_success 'prune: handle alternate object database' ' + test_create_repo A && + git -C A commit --allow-empty -m "initial commit" && + git clone --shared A B && + git -C B commit --allow-empty -m "next commit" && + git -C B prune +' + test_done diff --git a/t/t5312-prune-corruption.sh b/t/t5312-prune-corruption.sh new file mode 100755 index 0000000000..8e98b44083 --- /dev/null +++ b/t/t5312-prune-corruption.sh @@ -0,0 +1,114 @@ +#!/bin/sh + +test_description=' +Test pruning of repositories with minor corruptions. The goal +here is that we should always be erring on the side of safety. So +if we see, for example, a ref with a bogus name, it is OK either to +bail out or to proceed using it as a reachable tip, but it is _not_ +OK to proceed as if it did not exist. Otherwise we might silently +delete objects that cannot be recovered. +' +. ./test-lib.sh + +test_expect_success 'disable reflogs' ' + git config core.logallrefupdates false && + rm -rf .git/logs +' + +test_expect_success 'create history reachable only from a bogus-named ref' ' + test_tick && git commit --allow-empty -m master && + base=$(git rev-parse HEAD) && + test_tick && git commit --allow-empty -m bogus && + bogus=$(git rev-parse HEAD) && + git cat-file commit $bogus >saved && + echo $bogus >.git/refs/heads/bogus..name && + git reset --hard HEAD^ +' + +test_expect_success 'pruning does not drop bogus object' ' + test_when_finished "git hash-object -w -t commit saved" && + test_might_fail git prune --expire=now && + verbose git cat-file -e $bogus +' + +test_expect_success 'put bogus object into pack' ' + git tag reachable $bogus && + git repack -ad && + git tag -d reachable && + verbose git cat-file -e $bogus +' + +test_expect_success 'destructive repack keeps packed object' ' + test_might_fail git repack -Ad --unpack-unreachable=now && + verbose git cat-file -e $bogus && + test_might_fail git repack -ad && + verbose git cat-file -e $bogus +' + +# subsequent tests will have different corruptions +test_expect_success 'clean up bogus ref' ' + rm .git/refs/heads/bogus..name +' + +# We create two new objects here, "one" and "two". Our +# master branch points to "two", which is deleted, +# corrupting the repository. But we'd like to make sure +# that the otherwise unreachable "one" is not pruned +# (since it is the user's best bet for recovering +# from the corruption). +# +# Note that we also point HEAD somewhere besides "two", +# as we want to make sure we test the case where we +# pick up the reference to "two" by iterating the refs, +# not by resolving HEAD. +test_expect_success 'create history with missing tip commit' ' + test_tick && git commit --allow-empty -m one && + recoverable=$(git rev-parse HEAD) && + git cat-file commit $recoverable >saved && + test_tick && git commit --allow-empty -m two && + missing=$(git rev-parse HEAD) && + git checkout --detach $base && + rm .git/objects/$(echo $missing | sed "s,..,&/,") && + test_must_fail git cat-file -e $missing +' + +test_expect_success 'pruning with a corrupted tip does not drop history' ' + test_when_finished "git hash-object -w -t commit saved" && + test_might_fail git prune --expire=now && + verbose git cat-file -e $recoverable +' + +test_expect_success 'pack-refs does not silently delete broken loose ref' ' + git pack-refs --all --prune && + echo $missing >expect && + git rev-parse refs/heads/master >actual && + test_cmp expect actual +' + +# we do not want to count on running pack-refs to +# actually pack it, as it is perfectly reasonable to +# skip processing a broken ref +test_expect_success 'create packed-refs file with broken ref' ' + rm -f .git/refs/heads/master && + cat >.git/packed-refs <<-EOF && + $missing refs/heads/master + $recoverable refs/heads/other + EOF + echo $missing >expect && + git rev-parse refs/heads/master >actual && + test_cmp expect actual +' + +test_expect_success 'pack-refs does not silently delete broken packed ref' ' + git pack-refs --all --prune && + git rev-parse refs/heads/master >actual && + test_cmp expect actual +' + +test_expect_success 'pack-refs does not drop broken refs during deletion' ' + git update-ref -d refs/heads/other && + git rev-parse refs/heads/master >actual && + test_cmp expect actual +' + +test_done diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh index 5b2b1c2c13..bd37f040b6 100755 --- a/t/t5500-fetch-pack.sh +++ b/t/t5500-fetch-pack.sh @@ -541,13 +541,30 @@ check_prot_path () { test_cmp expected actual } -check_prot_host_path () { - cat >expected <<-EOF && +check_prot_host_port_path () { + local diagport + case "$2" in + *ssh*) + pp=ssh + uah=userandhost + ehost=$(echo $3 | tr -d "[]") + diagport="Diag: port=$4" + ;; + *) + pp=$p + uah=hostandport + ehost=$(echo $3$4 | sed -e "s/22$/:22/" -e "s/NONE//") + diagport="" + ;; + esac + cat >exp <<-EOF && Diag: url=$1 - Diag: protocol=$2 - Diag: hostandport=$3 - Diag: path=$4 + Diag: protocol=$pp + Diag: $uah=$ehost + $diagport + Diag: path=$5 EOF + grep -v "^$" exp >expected git fetch-pack --diag-url "$1" >actual && test_cmp expected actual } @@ -557,22 +574,20 @@ do # git or ssh with scheme for p in "ssh+git" "git+ssh" git ssh do - for h in host host:12 [::1] [::1]:23 + for h in host user@host user@[::1] user@::1 do - case "$p" in - *ssh*) - pp=ssh - ;; - *) - pp=$p - ;; - esac test_expect_success "fetch-pack --diag-url $p://$h/$r" ' - check_prot_host_path $p://$h/$r $pp "$h" "/$r" + check_prot_host_port_path $p://$h/$r $p "$h" NONE "/$r" ' # "/~" -> "~" conversion test_expect_success "fetch-pack --diag-url $p://$h/~$r" ' - check_prot_host_path $p://$h/~$r $pp "$h" "~$r" + check_prot_host_port_path $p://$h/~$r $p "$h" NONE "~$r" + ' + done + for h in host User@host User@[::1] + do + test_expect_success "fetch-pack --diag-url $p://$h:22/$r" ' + check_prot_host_port_path $p://$h:22/$r $p "$h" 22 "/$r" ' done done @@ -603,11 +618,11 @@ do for h in host [::1] do test_expect_success "fetch-pack --diag-url $h:$r" ' - check_prot_path $h:$r $p "$r" + check_prot_host_port_path $h:$r $p "$h" NONE "$r" ' # Do "/~" -> "~" conversion test_expect_success "fetch-pack --diag-url $h:/~$r" ' - check_prot_host_path $h:/~$r $p "$h" "~$r" + check_prot_host_port_path $h:/~$r $p "$h" NONE "~$r" ' done done diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index 85c7fecd22..5e04d64109 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -238,7 +238,7 @@ test_expect_success 'push with pushInsteadOf' ' test_expect_success 'push with pushInsteadOf and explicit pushurl (pushInsteadOf should not rewrite)' ' mk_empty testrepo && test_config "url.trash2/.pushInsteadOf" testrepo/ && - test_config "url.trash3/.pusnInsteadOf" trash/wrong && + test_config "url.trash3/.pushInsteadOf" trash/wrong && test_config remote.r.url trash/wrong && test_config remote.r.pushurl "testrepo/" && git push r refs/heads/master:refs/remotes/origin/master && @@ -1107,9 +1107,16 @@ test_expect_success 'fetch exact SHA1' ' git config uploadpack.allowtipsha1inwant true ) && - git fetch -v ../testrepo $the_commit:refs/heads/copy && - result=$(git rev-parse --verify refs/heads/copy) && - test "$the_commit" = "$result" + git fetch -v ../testrepo $the_commit:refs/heads/copy master:refs/heads/extra && + cat >expect <<-EOF && + $the_commit + $the_first_commit + EOF + { + git rev-parse --verify refs/heads/copy && + git rev-parse --verify refs/heads/extra + } >actual && + test_cmp expect actual ) ' @@ -1434,4 +1441,67 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' ' +test_expect_success 'updateInstead with push-to-checkout hook' ' + rm -fr testrepo && + git init testrepo && + ( + cd testrepo && + git pull .. master && + git reset --hard HEAD^^ && + git tag initial && + git config receive.denyCurrentBranch updateInstead && + write_script .git/hooks/push-to-checkout <<-\EOF + echo >&2 updating from $(git rev-parse HEAD) + echo >&2 updating to "$1" + + git update-index -q --refresh && + git read-tree -u -m HEAD "$1" || { + status=$? + echo >&2 read-tree failed + exit $status + } + EOF + ) && + + # Try pushing into a pristine + git push testrepo master && + ( + cd testrepo && + git diff --quiet && + git diff HEAD --quiet && + test $(git -C .. rev-parse HEAD) = $(git rev-parse HEAD) + ) && + + # Try pushing into a repository with conflicting change + ( + cd testrepo && + git reset --hard initial && + echo conflicting >path2 + ) && + test_must_fail git push testrepo master && + ( + cd testrepo && + test $(git rev-parse initial) = $(git rev-parse HEAD) && + test conflicting = "$(cat path2)" && + git diff-index --quiet --cached HEAD + ) && + + # Try pushing into a repository with unrelated change + ( + cd testrepo && + git reset --hard initial && + echo unrelated >path1 && + echo irrelevant >path5 && + git add path5 + ) && + git push testrepo master && + ( + cd testrepo && + test "$(cat path1)" = unrelated && + test "$(cat path5)" = irrelevant && + test "$(git diff --name-only --cached HEAD)" = path5 && + test $(git -C .. rev-parse HEAD) = $(git rev-parse HEAD) + ) +' + test_done diff --git a/t/t5528-push-default.sh b/t/t5528-push-default.sh index cc7451908b..73f4bb6346 100755 --- a/t/t5528-push-default.sh +++ b/t/t5528-push-default.sh @@ -26,7 +26,7 @@ check_pushed_commit () { # $2 = expected target branch for the push # $3 = [optional] repo to check for actual output (repo1 by default) test_push_success () { - git ${1:+-c push.default="$1"} push && + git ${1:+-c} ${1:+push.default="$1"} push && check_pushed_commit HEAD "$2" "$3" } @@ -34,7 +34,7 @@ test_push_success () { # check that push fails and does not modify any remote branch test_push_failure () { git --git-dir=repo1 log --no-walk --format='%h %s' --all >expect && - test_must_fail git ${1:+-c push.default="$1"} push && + test_must_fail git ${1:+-c} ${1:+push.default="$1"} push && git --git-dir=repo1 log --no-walk --format='%h %s' --all >actual && test_cmp expect actual } diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index d2c681ebfd..1ecb5881ac 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -324,12 +324,6 @@ test_expect_success 'push into half-auth-complete requires password' ' test_cmp expect actual ' -run_with_limited_cmdline () { - (ulimit -s 128 && "$@") -} - -test_lazy_prereq CMDLINE_LIMIT 'run_with_limited_cmdline true' - test_expect_success CMDLINE_LIMIT 'push 2000 tags over http' ' sha1=$(git rev-parse HEAD) && test_seq 2000 | diff --git a/t/t5543-atomic-push.sh b/t/t5543-atomic-push.sh new file mode 100755 index 0000000000..3480b33007 --- /dev/null +++ b/t/t5543-atomic-push.sh @@ -0,0 +1,194 @@ +#!/bin/sh + +test_description='pushing to a repository using the atomic push option' + +. ./test-lib.sh + +mk_repo_pair () { + rm -rf workbench upstream && + test_create_repo upstream && + test_create_repo workbench && + ( + cd upstream && + git config receive.denyCurrentBranch warn + ) && + ( + cd workbench && + git remote add up ../upstream + ) +} + +# Compare the ref ($1) in upstream with a ref value from workbench ($2) +# i.e. test_refs second HEAD@{2} +test_refs () { + test $# = 2 && + git -C upstream rev-parse --verify "$1" >expect && + git -C workbench rev-parse --verify "$2" >actual && + test_cmp expect actual +} + +test_expect_success 'atomic push works for a single branch' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git push --mirror up && + test_commit two && + git push --atomic up master + ) && + test_refs master master +' + +test_expect_success 'atomic push works for two branches' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git branch second && + git push --mirror up && + test_commit two && + git checkout second && + test_commit three && + git push --atomic up master second + ) && + test_refs master master && + test_refs second second +' + +test_expect_success 'atomic push works in combination with --mirror' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git checkout -b second && + test_commit two && + git push --atomic --mirror up + ) && + test_refs master master && + test_refs second second +' + +test_expect_success 'atomic push works in combination with --force' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git branch second master && + test_commit two_a && + git checkout second && + test_commit two_b && + test_commit three_b && + test_commit four && + git push --mirror up && + # The actual test is below + git checkout master && + test_commit three_a && + git checkout second && + git reset --hard HEAD^ && + git push --force --atomic up master second + ) && + test_refs master master && + test_refs second second +' + +# set up two branches where master can be pushed but second can not +# (non-fast-forward). Since second can not be pushed the whole operation +# will fail and leave master untouched. +test_expect_success 'atomic push fails if one branch fails' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git checkout -b second master && + test_commit two && + test_commit three && + test_commit four && + git push --mirror up && + git reset --hard HEAD~2 && + test_commit five && + git checkout master && + test_commit six && + test_must_fail git push --atomic --all up + ) && + test_refs master HEAD@{7} && + test_refs second HEAD@{4} +' + +test_expect_success 'atomic push fails if one tag fails remotely' ' + # prepare the repo + mk_repo_pair && + ( + cd workbench && + test_commit one && + git checkout -b second master && + test_commit two && + git push --mirror up + ) && + # a third party modifies the server side: + ( + cd upstream && + git checkout second && + git tag test_tag second + ) && + # see if we can now push both branches. + ( + cd workbench && + git checkout master && + test_commit three && + git checkout second && + test_commit four && + git tag test_tag && + test_must_fail git push --tags --atomic up master second + ) && + test_refs master HEAD@{3} && + test_refs second HEAD@{1} +' + +test_expect_success 'atomic push obeys update hook preventing a branch to be pushed' ' + mk_repo_pair && + ( + cd workbench && + test_commit one && + git checkout -b second master && + test_commit two && + git push --mirror up + ) && + ( + cd upstream && + HOOKDIR="$(git rev-parse --git-dir)/hooks" && + HOOK="$HOOKDIR/update" && + mkdir -p "$HOOKDIR" && + write_script "$HOOK" <<-\EOF + # only allow update to master from now on + test "$1" = "refs/heads/master" + EOF + ) && + ( + cd workbench && + git checkout master && + test_commit three && + git checkout second && + test_commit four && + test_must_fail git push --atomic up master second + ) && + test_refs master HEAD@{3} && + test_refs second HEAD@{1} +' + +test_expect_success 'atomic push is not advertised if configured' ' + mk_repo_pair && + ( + cd upstream + git config receive.advertiseatomic 0 + ) && + ( + cd workbench && + test_commit one && + git push --mirror up && + test_commit two && + test_must_fail git push --atomic up master + ) && + test_refs master HEAD@{1} +' + +test_done diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh index ac71418a1b..2731ad4cea 100755 --- a/t/t5550-http-fetch-dumb.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -165,6 +165,24 @@ test_expect_success 'fetch notices corrupt idx' ' ) ' +test_expect_success 'fetch can handle previously-fetched .idx files' ' + git checkout --orphan branch1 && + echo base >file && + git add file && + git commit -m base && + git --bare init "$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git && + git push "$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git branch1 && + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git repack -d && + git checkout -b branch2 branch1 && + echo b2 >>file && + git commit -a -m b2 && + git push "$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git branch2 && + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git repack -d && + git --bare init clone_packed_branches.git && + git --git-dir=clone_packed_branches.git fetch "$HTTPD_URL"/dumb/repo_packed_branches.git branch1:branch1 && + git --git-dir=clone_packed_branches.git fetch "$HTTPD_URL"/dumb/repo_packed_branches.git branch2:branch2 +' + test_expect_success 'did not use upload-pack service' ' grep '/git-upload-pack' <"$HTTPD_ROOT_PATH"/access.log >act : >exp @@ -196,5 +214,47 @@ test_expect_success 'reencoding is robust to whitespace oddities' ' grep "this is the error message" stderr ' +check_language () { + case "$2" in + '') + >expect + ;; + ?*) + echo "Accept-Language: $1" >expect + ;; + esac && + GIT_CURL_VERBOSE=1 \ + LANGUAGE=$2 \ + git ls-remote "$HTTPD_URL/dumb/repo.git" >output 2>&1 && + tr -d '\015' <output | + sort -u | + sed -ne '/^Accept-Language:/ p' >actual && + test_cmp expect actual +} + +test_expect_success 'git client sends Accept-Language based on LANGUAGE' ' + check_language "ko-KR, *;q=0.9" ko_KR.UTF-8' + +test_expect_success 'git client sends Accept-Language correctly with unordinary LANGUAGE' ' + check_language "ko-KR, *;q=0.9" "ko_KR:" && + check_language "ko-KR, en-US;q=0.9, *;q=0.8" "ko_KR::en_US" && + check_language "ko-KR, *;q=0.9" ":::ko_KR" && + check_language "ko-KR, en-US;q=0.9, *;q=0.8" "ko_KR!!:en_US" && + check_language "ko-KR, ja-JP;q=0.9, *;q=0.8" "ko_KR en_US:ja_JP"' + +test_expect_success 'git client sends Accept-Language with many preferred languages' ' + check_language "ko-KR, en-US;q=0.9, fr-CA;q=0.8, de;q=0.7, sr;q=0.6, \ +ja;q=0.5, zh;q=0.4, sv;q=0.3, pt;q=0.2, *;q=0.1" \ + ko_KR.EUC-KR:en_US.UTF-8:fr_CA:de.UTF-8@euro:sr@latin:ja:zh:sv:pt && + check_language "ko-KR, en-US;q=0.99, fr-CA;q=0.98, de;q=0.97, sr;q=0.96, \ +ja;q=0.95, zh;q=0.94, sv;q=0.93, pt;q=0.92, nb;q=0.91, *;q=0.90" \ + ko_KR.EUC-KR:en_US.UTF-8:fr_CA:de.UTF-8@euro:sr@latin:ja:zh:sv:pt:nb +' + +test_expect_success 'git client does not send an empty Accept-Language' ' + GIT_CURL_VERBOSE=1 LANGUAGE= git ls-remote "$HTTPD_URL/dumb/repo.git" 2>stderr && + ! grep "^Accept-Language:" stderr +' + stop_httpd test_done diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index 6cbc12d9a7..df47851752 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -213,10 +213,21 @@ test_expect_success 'cookies stored in http.cookiefile when http.savecookies set test_cmp expect_cookies.txt cookies_tail.txt ' -test_expect_success EXPENSIVE 'create 50,000 tags in the repo' ' +test_expect_success 'transfer.hiderefs works over smart-http' ' + test_commit hidden && + test_commit visible && + git push public HEAD^:refs/heads/a HEAD:refs/heads/b && + git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \ + config transfer.hiderefs refs/heads/a && + git clone --bare "$HTTPD_URL/smart/repo.git" hidden.git && + test_must_fail git -C hidden.git rev-parse --verify a && + git -C hidden.git rev-parse --verify b +' + +test_expect_success 'create 2,000 tags in the repo' ' ( cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" && - for i in `test_seq 50000` + for i in $(test_seq 2000) do echo "commit refs/heads/too-many-refs" echo "mark :$i" @@ -237,13 +248,22 @@ test_expect_success EXPENSIVE 'create 50,000 tags in the repo' ' ) ' -test_expect_success EXPENSIVE 'clone the 50,000 tag repo to check OS command line overflow' ' - git clone $HTTPD_URL/smart/repo.git too-many-refs && +test_expect_success CMDLINE_LIMIT \ + 'clone the 2,000 tag repo to check OS command line overflow' ' + run_with_limited_cmdline git clone $HTTPD_URL/smart/repo.git too-many-refs && ( cd too-many-refs && - test $(git for-each-ref refs/tags | wc -l) = 50000 + git for-each-ref refs/tags >actual && + test_line_count = 2000 actual ) ' +test_expect_success 'large fetch-pack requests can be split across POSTs' ' + GIT_CURL_VERBOSE=1 git -c http.postbuffer=65536 \ + clone --bare "$HTTPD_URL/smart/repo.git" split.git 2>err && + grep "^> POST" err >posts && + test_line_count = 2 posts +' + stop_httpd test_done diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh index 6b16379951..b7e283252d 100755 --- a/t/t5570-git-daemon.sh +++ b/t/t5570-git-daemon.sh @@ -142,4 +142,31 @@ test_expect_success 'read access denied' "test_remote_error -x 'no such reposito test_expect_success 'not exported' "test_remote_error -n 'repository not exported' fetch repo.git " stop_git_daemon +start_git_daemon --interpolated-path="$GIT_DAEMON_DOCUMENT_ROOT_PATH/%H%D" + +test_expect_success 'access repo via interpolated hostname' ' + repo="$GIT_DAEMON_DOCUMENT_ROOT_PATH/localhost/interp.git" && + git init --bare "$repo" && + git push "$repo" HEAD && + >"$repo"/git-daemon-export-ok && + rm -rf tmp.git && + GIT_OVERRIDE_VIRTUAL_HOST=localhost \ + git clone --bare "$GIT_DAEMON_URL/interp.git" tmp.git && + rm -rf tmp.git && + GIT_OVERRIDE_VIRTUAL_HOST=LOCALHOST \ + git clone --bare "$GIT_DAEMON_URL/interp.git" tmp.git +' + +test_expect_success 'hostname cannot break out of directory' ' + rm -rf tmp.git && + repo="$GIT_DAEMON_DOCUMENT_ROOT_PATH/../escape.git" && + git init --bare "$repo" && + git push "$repo" HEAD && + >"$repo"/git-daemon-export-ok && + test_must_fail \ + env GIT_OVERRIDE_VIRTUAL_HOST=.. \ + git clone --bare "$GIT_DAEMON_URL/escape.git" tmp.git +' + +stop_git_daemon test_done diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index e4f10c0f68..02b40b117f 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -301,11 +301,17 @@ expect_ssh () { (cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output) ' && { - case "$1" in - none) + case "$#" in + 1) ;; - *) + 2) echo "ssh: $1 git-upload-pack '$2'" + ;; + 3) + echo "ssh: $1 $2 git-upload-pack '$3'" + ;; + *) + echo "ssh: $1 $2 git-upload-pack '$3' $4" esac } >"$TRASH_DIRECTORY/ssh-expect" && (cd "$TRASH_DIRECTORY" && test_cmp ssh-expect ssh-output) @@ -326,7 +332,7 @@ test_expect_success !MINGW,!CYGWIN 'clone local path foo:bar' ' test_expect_success 'bracketed hostnames are still ssh' ' git clone "[myhost:123]:src" ssh-bracket-clone && - expect_ssh myhost:123 src + expect_ssh myhost '-p 123' src ' counter=0 @@ -336,7 +342,8 @@ counter=0 test_clone_url () { counter=$(($counter + 1)) test_might_fail git clone "$1" tmp$counter && - expect_ssh "$2" "$3" + shift && + expect_ssh "$@" } test_expect_success !MINGW 'clone c:temp is ssl' ' @@ -359,7 +366,7 @@ done for repo in rep rep/home/project 123 do test_expect_success "clone [::1]:$repo" ' - test_clone_url [::1]:$repo ::1 $repo + test_clone_url [::1]:$repo ::1 "$repo" ' done #home directory @@ -400,24 +407,40 @@ test_expect_success 'clone ssh://host.xz:22/~repo' ' ' #IPv6 -test_expect_success 'clone ssh://[::1]/home/user/repo' ' - test_clone_url "ssh://[::1]/home/user/repo" "::1" "/home/user/repo" -' +for tuah in ::1 [::1] user@::1 user@[::1] [user@::1] +do + ehost=$(echo $tuah | tr -d "[]") + test_expect_success "clone ssh://$tuah/home/user/repo" " + test_clone_url ssh://$tuah/home/user/repo $ehost /home/user/repo + " +done #IPv6 from home directory -test_expect_success 'clone ssh://[::1]/~repo' ' - test_clone_url "ssh://[::1]/~repo" "::1" "~repo" -' +for tuah in ::1 [::1] user@::1 user@[::1] [user@::1] +do + euah=$(echo $tuah | tr -d "[]") + test_expect_success "clone ssh://$tuah/~repo" " + test_clone_url ssh://$tuah/~repo $euah '~repo' + " +done #IPv6 with port number -test_expect_success 'clone ssh://[::1]:22/home/user/repo' ' - test_clone_url "ssh://[::1]:22/home/user/repo" "-p 22 ::1" "/home/user/repo" -' +for tuah in [::1] user@[::1] [user@::1] +do + euah=$(echo $tuah | tr -d "[]") + test_expect_success "clone ssh://$tuah:22/home/user/repo" " + test_clone_url ssh://$tuah:22/home/user/repo '-p 22' $euah /home/user/repo + " +done #IPv6 from home directory with port number -test_expect_success 'clone ssh://[::1]:22/~repo' ' - test_clone_url "ssh://[::1]:22/~repo" "-p 22 ::1" "~repo" -' +for tuah in [::1] user@[::1] [user@::1] +do + euah=$(echo $tuah | tr -d "[]") + test_expect_success "clone ssh://$tuah:22/~repo" " + test_clone_url ssh://$tuah:22/~repo '-p 22' $euah '~repo' + " +done test_expect_success 'clone from a repository with two identical branches' ' diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh index 2419407546..c9d3ed14c3 100755 --- a/t/t5801-remote-helpers.sh +++ b/t/t5801-remote-helpers.sh @@ -281,4 +281,28 @@ test_expect_success 'push messages' ' ) ' +test_expect_success 'fetch HEAD' ' + (cd server && + git checkout master && + echo more >>file && + git commit -a -m more + ) && + (cd local && + git fetch origin HEAD + ) && + compare_refs server HEAD local FETCH_HEAD +' + +test_expect_success 'fetch url' ' + (cd server && + git checkout master && + echo more >>file && + git commit -a -m more + ) && + (cd local && + git fetch "testgit::${PWD}/../server" + ) && + compare_refs server HEAD local FETCH_HEAD +' + test_done diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh index 2602086303..1f58b46e1f 100755 --- a/t/t6000-rev-list-misc.sh +++ b/t/t6000-rev-list-misc.sh @@ -96,4 +96,8 @@ test_expect_success 'rev-list can show index objects' ' test_cmp expect actual ' +test_expect_success '--bisect and --first-parent can not be combined' ' + test_must_fail git rev-list --bisect --first-parent HEAD +' + test_done diff --git a/t/t6014-rev-list-all.sh b/t/t6014-rev-list-all.sh index 991ab4a65b..c9bedd29cb 100755 --- a/t/t6014-rev-list-all.sh +++ b/t/t6014-rev-list-all.sh @@ -35,4 +35,8 @@ test_expect_success 'repack does not lose detached HEAD' ' ' +test_expect_success 'rev-list --graph --no-walk is forbidden' ' + test_must_fail git rev-list --graph --no-walk HEAD +' + test_done diff --git a/t/t6023-merge-file.sh b/t/t6023-merge-file.sh index 3758961765..190ee903cf 100755 --- a/t/t6023-merge-file.sh +++ b/t/t6023-merge-file.sh @@ -69,7 +69,8 @@ test_expect_success 'works in subdirectory' ' cp new1.txt dir/a.txt && cp orig.txt dir/o.txt && cp new2.txt dir/b.txt && - ( cd dir && git merge-file a.txt o.txt b.txt ) + ( cd dir && git merge-file a.txt o.txt b.txt ) && + test_path_is_missing a.txt ' cp new1.txt test.txt diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index 35c805a44e..8bfeef9b0b 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -1459,6 +1459,34 @@ test_expect_success 'invalid sort parameter in configuratoin' ' test_cmp expect actual ' +test_expect_success 'version sort with prerelease reordering' ' + git config --unset tag.sort && + git config versionsort.prereleaseSuffix -rc && + git tag foo1.6-rc1 && + git tag foo1.6-rc2 && + git tag -l --sort=version:refname "foo*" >actual && + cat >expect <<-\EOF && + foo1.3 + foo1.6-rc1 + foo1.6-rc2 + foo1.6 + foo1.10 + EOF + test_cmp expect actual +' + +test_expect_success 'reverse version sort with prerelease reordering' ' + git tag -l --sort=-version:refname "foo*" >actual && + cat >expect <<-\EOF && + foo1.10 + foo1.6 + foo1.6-rc2 + foo1.6-rc1 + foo1.3 + EOF + test_cmp expect actual +' + run_with_limited_stack () { (ulimit -s 128 && "$@") } diff --git a/t/t7007-show.sh b/t/t7007-show.sh index 1b824fe5ed..42d3db6246 100755 --- a/t/t7007-show.sh +++ b/t/t7007-show.sh @@ -124,4 +124,8 @@ test_expect_success '--quiet suppresses diff' ' test_cmp expect actual ' +test_expect_success 'show --graph is forbidden' ' + test_must_fail git show --graph HEAD +' + test_done diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh index 7c88245031..5811a982f4 100755 --- a/t/t7400-submodule-basic.sh +++ b/t/t7400-submodule-basic.sh @@ -171,6 +171,23 @@ test_expect_success 'submodule add with ./ in path' ' test_cmp empty untracked ' +test_expect_success 'submodule add with /././ in path' ' + echo "refs/heads/master" >expect && + >empty && + + ( + cd addtest && + git submodule add "$submodurl" dotslashdotsubmod/././frotz/./ && + git submodule init + ) && + + rm -f heads head untracked && + inspect addtest/dotslashdotsubmod/frotz ../../.. && + test_cmp expect heads && + test_cmp expect head && + test_cmp empty untracked +' + test_expect_success 'submodule add with // in path' ' echo "refs/heads/master" >expect && >empty && diff --git a/t/t7508-status.sh b/t/t7508-status.sh index 8ed5788808..6b16bcb640 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -66,6 +66,12 @@ strip_comments () { rm "$1" && mv "$1".tmp "$1" } +cat >.gitignore <<\EOF +.gitignore +expect* +output* +EOF + test_expect_success 'status --column' ' cat >expect <<\EOF && # On branch master @@ -83,8 +89,8 @@ test_expect_success 'status --column' ' # Untracked files: # (use "git add <file>..." to include in what will be committed) # -# dir1/untracked dir2/untracked output -# dir2/modified expect untracked +# dir1/untracked dir2/untracked +# dir2/modified untracked # EOF COLUMNS=50 git -c status.displayCommentPrefix=true status --column="column dense" >output && @@ -116,8 +122,6 @@ cat >expect <<\EOF # dir1/untracked # dir2/modified # dir2/untracked -# expect -# output # untracked # EOF @@ -133,6 +137,23 @@ test_expect_success 'status with status.displayCommentPrefix=false' ' test_i18ncmp expect output ' +test_expect_success 'status -v' ' + (cat expect && git diff --cached) >expect-with-v && + git status -v >output && + test_i18ncmp expect-with-v output +' + +test_expect_success 'status -v -v' ' + (cat expect && + echo "Changes to be committed:" && + git -c diff.mnemonicprefix=true diff --cached && + echo "--------------------------------------------------" && + echo "Changes not staged for commit:" && + git -c diff.mnemonicprefix=true diff) >expect-with-v && + git status -v -v >output && + test_i18ncmp expect-with-v output +' + test_expect_success 'setup fake editor' ' cat >.git/editor <<-\EOF && #! /bin/sh @@ -167,8 +188,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -186,8 +205,6 @@ A dir2/added ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF @@ -201,7 +218,7 @@ test_expect_success 'status -s' ' test_expect_success 'status with gitignore' ' { echo ".gitignore" && - echo "expect" && + echo "expect*" && echo "output" && echo "untracked" } >.gitignore && @@ -222,6 +239,7 @@ test_expect_success 'status with gitignore' ' !! dir1/untracked !! dir2/untracked !! expect + !! expect-with-v !! output !! untracked EOF @@ -253,6 +271,7 @@ Ignored files: dir1/untracked dir2/untracked expect + expect-with-v output untracked @@ -264,7 +283,7 @@ EOF test_expect_success 'status with gitignore (nothing untracked)' ' { echo ".gitignore" && - echo "expect" && + echo "expect*" && echo "dir2/modified" && echo "output" && echo "untracked" @@ -285,6 +304,7 @@ test_expect_success 'status with gitignore (nothing untracked)' ' !! dir2/modified !! dir2/untracked !! expect + !! expect-with-v !! output !! untracked EOF @@ -312,6 +332,7 @@ Ignored files: dir2/modified dir2/untracked expect + expect-with-v output untracked @@ -320,7 +341,11 @@ EOF test_i18ncmp expect output ' -rm -f .gitignore +cat >.gitignore <<\EOF +.gitignore +expect* +output* +EOF cat >expect <<\EOF ## master @@ -329,8 +354,6 @@ A dir2/added ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF @@ -434,8 +457,6 @@ Untracked files: dir2/modified dir2/untracked dir3/ - expect - output untracked EOF @@ -456,8 +477,6 @@ A dir2/added ?? dir2/modified ?? dir2/untracked ?? dir3/ -?? expect -?? output ?? untracked EOF test_expect_success 'status -s -unormal' ' @@ -493,8 +512,6 @@ Untracked files: dir2/untracked dir3/untracked1 dir3/untracked2 - expect - output untracked EOF @@ -518,8 +535,6 @@ A dir2/added ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF test_expect_success 'status -s -uall' ' @@ -554,8 +569,6 @@ Untracked files: untracked ../dir2/modified ../dir2/untracked - ../expect - ../output ../untracked EOF @@ -569,8 +582,6 @@ A ../dir2/added ?? untracked ?? ../dir2/modified ?? ../dir2/untracked -?? ../expect -?? ../output ?? ../untracked EOF test_expect_success 'status -s with relative paths' ' @@ -586,8 +597,6 @@ A dir2/added ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF @@ -625,8 +634,6 @@ Untracked files: <BLUE>dir1/untracked<RESET> <BLUE>dir2/modified<RESET> <BLUE>dir2/untracked<RESET> - <BLUE>expect<RESET> - <BLUE>output<RESET> <BLUE>untracked<RESET> EOF @@ -647,8 +654,6 @@ cat >expect <<\EOF <BLUE>??<RESET> dir1/untracked <BLUE>??<RESET> dir2/modified <BLUE>??<RESET> dir2/untracked -<BLUE>??<RESET> expect -<BLUE>??<RESET> output <BLUE>??<RESET> untracked EOF @@ -676,8 +681,6 @@ cat >expect <<\EOF <BLUE>??<RESET> dir1/untracked <BLUE>??<RESET> dir2/modified <BLUE>??<RESET> dir2/untracked -<BLUE>??<RESET> expect -<BLUE>??<RESET> output <BLUE>??<RESET> untracked EOF @@ -694,8 +697,6 @@ A dir2/added ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF @@ -755,8 +756,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -772,8 +771,6 @@ A dir2/added ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF @@ -798,8 +795,6 @@ Untracked files: dir1/untracked dir2/ - expect - output untracked EOF @@ -848,8 +843,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -870,8 +863,6 @@ A sm ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF test_expect_success 'status -s submodule summary is disabled by default' ' @@ -913,8 +904,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -940,8 +929,6 @@ A sm ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF test_expect_success 'status -s submodule summary' ' @@ -964,8 +951,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked no changes added to commit (use "git add" and/or "git commit -a") @@ -983,8 +968,6 @@ cat >expect <<EOF ?? dir1/untracked ?? dir2/modified ?? dir2/untracked -?? expect -?? output ?? untracked EOF test_expect_success 'status -s submodule summary (clean submodule)' ' @@ -1025,8 +1008,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -1080,8 +1061,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -1192,8 +1171,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -1254,8 +1231,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF @@ -1336,8 +1311,6 @@ cat > expect << EOF ; dir1/untracked ; dir2/modified ; dir2/untracked -; expect -; output ; untracked ; EOF @@ -1369,8 +1342,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked no changes added to commit (use "git add" and/or "git commit -a") @@ -1400,8 +1371,6 @@ Untracked files: dir1/untracked dir2/modified dir2/untracked - expect - output untracked EOF diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh index 474dab381a..3cef18cfda 100755 --- a/t/t7510-signed-commit.sh +++ b/t/t7510-signed-commit.sh @@ -86,8 +86,8 @@ test_expect_success GPG 'show signed commit with signature' ' git show -s --show-signature initial >show && git verify-commit -v initial >verify.1 2>verify.2 && git cat-file commit initial >cat && - grep -v "gpg: " show >show.commit && - grep "gpg: " show >show.gpg && + grep -v -e "gpg: " -e "Warning: " show >show.commit && + grep -e "gpg: " -e "Warning: " show >show.gpg && grep -v "^ " cat | grep -v "^gpgsig " >cat.commit && test_cmp show.commit commit && test_cmp show.gpg verify.2 && diff --git a/t/t7516-commit-races.sh b/t/t7516-commit-races.sh new file mode 100755 index 0000000000..f2ce14e907 --- /dev/null +++ b/t/t7516-commit-races.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +test_description='git commit races' +. ./test-lib.sh + +test_expect_success 'race to create orphan commit' ' + write_script hare-editor <<-\EOF && + git commit --allow-empty -m hare + EOF + test_must_fail env EDITOR=./hare-editor git commit --allow-empty -m tortoise -e && + git show -s --pretty=format:%s >subject && + grep hare subject && + test -z "$(git show -s --pretty=format:%P)" +' + +test_expect_success 'race to create non-orphan commit' ' + write_script airplane-editor <<-\EOF && + git commit --allow-empty -m airplane + EOF + git checkout --orphan branch && + git commit --allow-empty -m base && + git rev-parse HEAD >base && + test_must_fail env EDITOR=./airplane-editor git commit --allow-empty -m ship -e && + git show -s --pretty=format:%s >subject && + grep airplane subject && + git rev-parse HEAD^ >parent && + test_cmp base parent +' + +test_done diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index af6a3e8904..051305545c 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -392,7 +392,7 @@ test_expect_success $PREREQ 'allow long lines with --no-validate' ' --from="Example <nobody@example.com>" \ --to=nobody@example.com \ --smtp-server="$(pwd)/fake.sendmail" \ - --novalidate \ + --no-validate \ $patches longline.patch \ 2>errors ' @@ -426,7 +426,7 @@ test_expect_success $PREREQ 'In-Reply-To without --chain-reply-to' ' git send-email \ --from="Example <nobody@example.com>" \ --to=nobody@example.com \ - --nochain-reply-to \ + --no-chain-reply-to \ --in-reply-to="$(cat expect)" \ --smtp-server="$(pwd)/fake.sendmail" \ $patches $patches $patches \ @@ -1067,7 +1067,7 @@ test_expect_success $PREREQ 'in-reply-to but no threading' ' --from="Example <nobody@example.com>" \ --to=nobody@example.com \ --in-reply-to="<in-reply-id@example.com>" \ - --nothread \ + --no-thread \ $patches | grep "In-Reply-To: <in-reply-id@example.com>" ' @@ -1077,7 +1077,7 @@ test_expect_success $PREREQ 'no in-reply-to and no threading' ' --dry-run \ --from="Example <nobody@example.com>" \ --to=nobody@example.com \ - --nothread \ + --no-thread \ $patches $patches >stdout && ! grep "In-Reply-To: " stdout ' @@ -1088,7 +1088,7 @@ test_expect_success $PREREQ 'threading but no chain-reply-to' ' --from="Example <nobody@example.com>" \ --to=nobody@example.com \ --thread \ - --nochain-reply-to \ + --no-chain-reply-to \ $patches $patches >stdout && grep "In-Reply-To: " stdout ' diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 37c2d633f0..c538e0a4e9 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -552,8 +552,8 @@ test_expect_success 'D: verify pack' ' ' cat >expect <<EOF -:000000 100755 0000000000000000000000000000000000000000 35a59026a33beac1569b1c7f66f3090ce9c09afc A newdir/exec.sh -:000000 100644 0000000000000000000000000000000000000000 046d0371e9220107917db0d0e030628de8a1de9b A newdir/interesting +:000000 100755 0000000000000000000000000000000000000000 e74b7d465e52746be2b4bae983670711e6e66657 A newdir/exec.sh +:000000 100644 0000000000000000000000000000000000000000 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 A newdir/interesting EOF git diff-tree -M -r branch^ branch >actual test_expect_success \ diff --git a/t/t9817-git-p4-exclude.sh b/t/t9817-git-p4-exclude.sh new file mode 100755 index 0000000000..aac568eadf --- /dev/null +++ b/t/t9817-git-p4-exclude.sh @@ -0,0 +1,71 @@ +#!/bin/sh + +test_description='git p4 tests for excluded paths during clone and sync' + +. ./lib-git-p4.sh + +test_expect_success 'start p4d' ' + start_p4d +' + +# Create a repo with the structure: +# +# //depot/wanted/foo +# //depot/discard/foo +# +# Check that we can exclude a subdirectory with both +# clone and sync operations. + +test_expect_success 'create exclude repo' ' + ( + cd "$cli" && + mkdir -p wanted discard && + echo wanted >wanted/foo && + echo discard >discard/foo && + p4 add wanted/foo discard/foo && + p4 submit -d "initial revision" + ) +' + +test_expect_success 'check the repo was created correctly' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot/...@all && + ( + cd "$git" && + test_path_is_file wanted/foo && + test_path_is_file discard/foo + ) +' + +test_expect_success 'clone, excluding part of repo' ' + test_when_finished cleanup_git && + git p4 clone -//depot/discard/... --dest="$git" //depot/...@all && + ( + cd "$git" && + test_path_is_file wanted/foo && + test_path_is_missing discard/foo + ) +' + +test_expect_success 'clone, then sync with exclude' ' + test_when_finished cleanup_git && + git p4 clone -//depot/discard/... --dest="$git" //depot/...@all && + ( + cd "$cli" && + p4 edit wanted/foo discard/foo && + date >>wanted/foo && + date >>discard/foo && + p4 submit -d "updating" && + + cd "$git" && + git p4 sync -//depot/discard/... && + test_path_is_file wanted/foo && + test_path_is_missing discard/foo + ) +' + +test_expect_success 'kill p4d' ' + kill_p4d +' + +test_done diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index f10a75290e..7a883d1a67 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -351,6 +351,25 @@ test_expect_success '__gitcomp_nl - doesnt fail because of invalid variable name __gitcomp_nl "$invalid_variable_name" ' +test_expect_success '__git_remotes - list remotes from $GIT_DIR/remotes and from config file' ' + cat >expect <<-EOF && + remote_from_file_1 + remote_from_file_2 + remote_in_config_1 + remote_in_config_2 + EOF + test_when_finished "rm -rf .git/remotes" && + mkdir -p .git/remotes && + >.git/remotes/remote_from_file_1 && + >.git/remotes/remote_from_file_2 && + test_when_finished "git remote remove remote_in_config_1" && + git remote add remote_in_config_1 git://remote_1 && + test_when_finished "git remote remove remote_in_config_2" && + git remote add remote_in_config_2 git://remote_2 && + __git_remotes >actual && + test_cmp expect actual +' + test_expect_success 'basic' ' run_completion "git " && # built-in diff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh index 51ecd3e4c1..46d7d37a51 100755 --- a/t/t9903-bash-prompt.sh +++ b/t/t9903-bash-prompt.sh @@ -397,6 +397,17 @@ test_expect_success 'prompt - untracked files status indicator - untracked files test_cmp expected "$actual" ' +test_expect_success 'prompt - untracked files status indicator - untracked files outside cwd' ' + printf " (master %%)" >expected && + ( + mkdir -p ignored_dir && + cd ignored_dir && + GIT_PS1_SHOWUNTRACKEDFILES=y && + __git_ps1 >"$actual" + ) && + test_cmp expected "$actual" +' + test_expect_success 'prompt - untracked files status indicator - shell variable unset with config disabled' ' printf " (master)" >expected && test_config bash.showUntrackedFiles false && diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh index 0d93e33de4..0698ce7908 100644 --- a/t/test-lib-functions.sh +++ b/t/test-lib-functions.sh @@ -745,7 +745,9 @@ test_ln_s_add () { else printf '%s' "$1" >"$2" && ln_s_obj=$(git hash-object -w "$2") && - git update-index --add --cacheinfo 120000 $ln_s_obj "$2" + git update-index --add --cacheinfo 120000 $ln_s_obj "$2" && + # pick up stat info from the file + git update-index "$2" fi } diff --git a/t/test-lib.sh b/t/test-lib.sh index bb1402de94..9914d3e1cf 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -152,10 +152,7 @@ unset UNZIP case $(echo $GIT_TRACE |tr "[A-Z]" "[a-z]") in 1|2|true) - echo "* warning: Some tests will not work if GIT_TRACE" \ - "is set as to trace on STDERR ! *" - echo "* warning: Please set GIT_TRACE to something" \ - "other than 1, 2 or true ! *" + GIT_TRACE=4 ;; esac @@ -299,6 +296,7 @@ die () { GIT_EXIT_OK= trap 'die' EXIT +trap 'exit $?' INT # The user-facing functions are loaded from a separate file so that # test_perf subshells can have them too @@ -1031,12 +1029,42 @@ test_lazy_prereq USR_BIN_TIME ' test -x /usr/bin/time ' -# When the tests are run as root, permission tests will report that -# things are writable when they shouldn't be. -test -w / || test_set_prereq SANITY +test_lazy_prereq NOT_ROOT ' + uid=$(id -u) && + test "$uid" != 0 +' + +# On a filesystem that lacks SANITY, a file can be deleted even if +# the containing directory doesn't have write permissions, or a file +# can be accessed even if the containing directory doesn't have read +# or execute permissions, causing our tests that validate that Git +# works sensibly in such situations. +test_lazy_prereq SANITY ' + mkdir SANETESTD.1 SANETESTD.2 && + + chmod +w SANETESTD.1 SANETESTD.2 && + >SANETESTD.1/x 2>SANETESTD.2/x && + chmod -w SANETESTD.1 && + chmod -rx SANETESTD.2 || + error "bug in test sript: cannot prepare SANETESTD" + + ! rm SANETESTD.1/x && ! test -f SANETESTD.2/x + status=$? + + chmod +rwx SANETESTD.1 SANETESTD.2 && + rm -rf SANETESTD.1 SANETESTD.2 || + error "bug in test sript: cannot clean SANETESTD" + return $status +' GIT_UNZIP=${GIT_UNZIP:-unzip} test_lazy_prereq UNZIP ' "$GIT_UNZIP" -v test $? -ne 127 ' + +run_with_limited_cmdline () { + (ulimit -s 128 && "$@") +} + +test_lazy_prereq CMDLINE_LIMIT 'run_with_limited_cmdline true' diff --git a/thread-utils.c b/thread-utils.c index 97396a75ae..a2135e0743 100644 --- a/thread-utils.c +++ b/thread-utils.c @@ -35,7 +35,23 @@ int online_cpus(void) if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0)) return (int)psd.psd_proc_cnt; -#endif +#elif defined(HAVE_BSD_SYSCTL) && defined(HW_NCPU) + int mib[2]; + size_t len; + int cpucount; + + mib[0] = CTL_HW; +# ifdef HW_AVAILCPU + mib[1] = HW_AVAILCPU; + len = sizeof(cpucount); + if (!sysctl(mib, 2, &cpucount, &len, NULL, 0)) + return cpucount; +# endif /* HW_AVAILCPU */ + mib[1] = HW_NCPU; + len = sizeof(cpucount); + if (!sysctl(mib, 2, &cpucount, &len, NULL, 0)) + return cpucount; +#endif /* defined(HAVE_BSD_SYSCTL) && defined(HW_NCPU) */ #ifdef _SC_NPROCESSORS_ONLN if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0) @@ -1,7 +1,6 @@ #include "cache.h" #include "string-list.h" #include "run-command.h" -#include "string-list.h" #include "commit.h" #include "trailer.h" /* diff --git a/transport-helper.c b/transport-helper.c index 0224687a23..5d99a6bc2e 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -5,7 +5,6 @@ #include "commit.h" #include "diff.h" #include "revision.h" -#include "quote.h" #include "remote.h" #include "string-list.h" #include "thread-utils.h" @@ -98,6 +97,8 @@ static void do_take_over(struct transport *transport) free(data); } +static void standard_options(struct transport *t); + static struct child_process *get_helper(struct transport *transport) { struct helper_data *data = transport->data; @@ -212,6 +213,7 @@ static struct child_process *get_helper(struct transport *transport) strbuf_release(&buf); if (debug) fprintf(stderr, "Debug: Capabilities complete.\n"); + standard_options(transport); return data->helper; } @@ -339,24 +341,14 @@ static int fetch_with_fetch(struct transport *transport, int i; struct strbuf buf = STRBUF_INIT; - standard_options(transport); - if (data->check_connectivity && - data->transport_options.check_self_contained_and_connected) - set_helper_option(transport, "check-connectivity", "true"); - - if (transport->cloning) - set_helper_option(transport, "cloning", "true"); - - if (data->transport_options.update_shallow) - set_helper_option(transport, "update-shallow", "true"); - for (i = 0; i < nr_heads; i++) { const struct ref *posn = to_fetch[i]; if (posn->status & REF_STATUS_UPTODATE) continue; strbuf_addf(&buf, "fetch %s %s\n", - sha1_to_hex(posn->old_sha1), posn->name); + sha1_to_hex(posn->old_sha1), + posn->symref ? posn->symref : posn->name); } strbuf_addch(&buf, '\n'); @@ -454,7 +446,8 @@ static int fetch_with_import(struct transport *transport, if (posn->status & REF_STATUS_UPTODATE) continue; - strbuf_addf(&buf, "import %s\n", posn->name); + strbuf_addf(&buf, "import %s\n", + posn->symref ? posn->symref : posn->name); sendline(data, &buf); strbuf_reset(&buf); } @@ -487,14 +480,15 @@ static int fetch_with_import(struct transport *transport, * fast-forward or this is a forced update. */ for (i = 0; i < nr_heads; i++) { - char *private; + char *private, *name; posn = to_fetch[i]; if (posn->status & REF_STATUS_UPTODATE) continue; + name = posn->symref ? posn->symref : posn->name; if (data->refspecs) - private = apply_refspecs(data->refspecs, data->refspec_nr, posn->name); + private = apply_refspecs(data->refspecs, data->refspec_nr, name); else - private = xstrdup(posn->name); + private = xstrdup(name); if (private) { read_ref(private, posn->old_sha1); free(private); @@ -620,6 +614,16 @@ static int fetch(struct transport *transport, if (!count) return 0; + if (data->check_connectivity && + data->transport_options.check_self_contained_and_connected) + set_helper_option(transport, "check-connectivity", "true"); + + if (transport->cloning) + set_helper_option(transport, "cloning", "true"); + + if (data->transport_options.update_shallow) + set_helper_option(transport, "update-shallow", "true"); + if (data->fetch) return fetch_with_fetch(transport, nr_heads, to_fetch); @@ -824,7 +828,6 @@ static int push_refs_with_push(struct transport *transport, return 0; } - standard_options(transport); for_each_string_list_item(cas_option, &cas_options) set_helper_option(transport, "cas", cas_option->string); @@ -860,7 +863,7 @@ static int push_refs_with_export(struct transport *transport, die("helper %s does not support dry-run", data->name); } else if (flags & TRANSPORT_PUSH_CERT) { if (set_helper_option(transport, TRANS_OPT_PUSH_CERT, "true") != 0) - die("helper %s does not support dry-run", data->name); + die("helper %s does not support --signed", data->name); } if (flags & TRANSPORT_PUSH_FORCE) { diff --git a/transport.c b/transport.c index 08bcd3a4eb..eca9b8c817 100644 --- a/transport.c +++ b/transport.c @@ -117,7 +117,7 @@ static void insert_packed_refs(const char *packed_refs, struct ref **list) return; } - if (hexval(buffer[0]) > 0xf) + if (!isxdigit(buffer[0])) continue; len = strlen(buffer); if (len && buffer[len - 1] == '\n') @@ -519,7 +519,7 @@ static int fetch_refs_via_pack(struct transport *transport, int nr_heads, struct ref **to_fetch) { struct git_transport_data *data = transport->data; - const struct ref *refs; + struct ref *refs; char *dest = xstrdup(transport->url); struct fetch_pack_args args; struct ref *refs_tmp = NULL; @@ -552,15 +552,17 @@ static int fetch_refs_via_pack(struct transport *transport, &transport->pack_lockfile); close(data->fd[0]); close(data->fd[1]); - if (finish_connect(data->conn)) + if (finish_connect(data->conn)) { + free_refs(refs); refs = NULL; + } data->conn = NULL; data->got_remote_heads = 0; data->options.self_contained_and_connected = args.self_contained_and_connected; free_refs(refs_tmp); - + free_refs(refs); free(dest); return (refs ? 0 : -1); } @@ -728,6 +730,10 @@ static int print_one_push_status(struct ref *ref, const char *dest, int count, i ref->deletion ? NULL : ref->peer_ref, "remote failed to report status", porcelain); break; + case REF_STATUS_ATOMIC_PUSH_FAILED: + print_ref_status('!', "[rejected]", ref, ref->peer_ref, + "atomic push failed", porcelain); + break; case REF_STATUS_OK: print_ok_ref_status(ref, porcelain); break; @@ -826,6 +832,7 @@ static int git_transport_push(struct transport *transport, struct ref *remote_re args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN); args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN); args.push_cert = !!(flags & TRANSPORT_PUSH_CERT); + args.atomic = !!(flags & TRANSPORT_PUSH_ATOMIC); args.url = transport->url; ret = send_pack(&args, data->fd, data->conn, remote_refs, diff --git a/transport.h b/transport.h index 3e0091eaab..18d2cf8275 100644 --- a/transport.h +++ b/transport.h @@ -125,6 +125,7 @@ struct transport { #define TRANSPORT_PUSH_NO_HOOK 512 #define TRANSPORT_PUSH_FOLLOW_TAGS 1024 #define TRANSPORT_PUSH_CERT 2048 +#define TRANSPORT_PUSH_ATOMIC 4096 #define TRANSPORT_SUMMARY_WIDTH (2 * DEFAULT_ABBREV + 3) #define TRANSPORT_SUMMARY(x) (int)(TRANSPORT_SUMMARY_WIDTH + strlen(x) - gettext_width(x)), (x) diff --git a/upload-pack.c b/upload-pack.c index b531a325d2..aa84576500 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -681,7 +681,7 @@ static void receive_needs(void) } /* return non-zero if the ref is hidden, otherwise 0 */ -static int mark_our_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) +static int mark_our_ref(const char *refname, const unsigned char *sha1) { struct object *o = lookup_unknown_object(sha1); @@ -689,12 +689,16 @@ static int mark_our_ref(const char *refname, const unsigned char *sha1, int flag o->flags |= HIDDEN_REF; return 1; } - if (!o) - die("git upload-pack: cannot find object %s:", sha1_to_hex(sha1)); o->flags |= OUR_REF; return 0; } +static int check_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data) +{ + mark_our_ref(refname, sha1); + return 0; +} + static void format_symref_info(struct strbuf *buf, struct string_list *symref) { struct string_list_item *item; @@ -713,7 +717,7 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo const char *refname_nons = strip_namespace(refname); unsigned char peeled[20]; - if (mark_our_ref(refname, sha1, flag, NULL)) + if (mark_our_ref(refname, sha1)) return 0; if (capabilities) { @@ -767,8 +771,8 @@ static void upload_pack(void) advertise_shallow_grafts(1); packet_flush(1); } else { - head_ref_namespaced(mark_our_ref, NULL); - for_each_namespaced_ref(mark_our_ref, NULL); + head_ref_namespaced(check_ref, NULL); + for_each_namespaced_ref(check_ref, NULL); } string_list_clear(&symref, 1); if (advertise_refs) diff --git a/urlmatch.c b/urlmatch.c index 618d216491..132d342bc1 100644 --- a/urlmatch.c +++ b/urlmatch.c @@ -412,9 +412,9 @@ static size_t url_match_prefix(const char *url, return 0; } -int match_urls(const struct url_info *url, - const struct url_info *url_prefix, - int *exactusermatch) +static int match_urls(const struct url_info *url, + const struct url_info *url_prefix, + int *exactusermatch) { /* * url_prefix matches url if the scheme, host and port of url_prefix diff --git a/urlmatch.h b/urlmatch.h index b461dfd3df..528862adc5 100644 --- a/urlmatch.h +++ b/urlmatch.h @@ -31,7 +31,6 @@ struct url_info { }; extern char *url_normalize(const char *, struct url_info *); -extern int match_urls(const struct url_info *url, const struct url_info *url_prefix, int *exactusermatch); struct urlmatch_item { size_t matched_len; diff --git a/userdiff.c b/userdiff.c index fad52d6392..2ccbee50cb 100644 --- a/userdiff.c +++ b/userdiff.c @@ -1,6 +1,5 @@ #include "cache.h" #include "userdiff.h" -#include "cache.h" #include "attr.h" static struct userdiff_driver *drivers; diff --git a/versioncmp.c b/versioncmp.c index 7511e08271..80bfd109fa 100644 --- a/versioncmp.c +++ b/versioncmp.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "string-list.h" /* * versioncmp(): copied from string/strverscmp.c in glibc commit @@ -20,6 +21,48 @@ #define CMP 2 #define LEN 3 +static const struct string_list *prereleases; +static int initialized; + +/* + * p1 and p2 point to the first different character in two strings. If + * either p1 or p2 starts with a prerelease suffix, it will be forced + * to be on top. + * + * If both p1 and p2 start with (different) suffix, the order is + * determined by config file. + * + * Note that we don't have to deal with the situation when both p1 and + * p2 start with the same suffix because the common part is already + * consumed by the caller. + * + * Return non-zero if *diff contains the return value for versioncmp() + */ +static int swap_prereleases(const void *p1_, + const void *p2_, + int *diff) +{ + const char *p1 = p1_; + const char *p2 = p2_; + int i, i1 = -1, i2 = -1; + + for (i = 0; i < prereleases->nr; i++) { + const char *suffix = prereleases->items[i].string; + if (i1 == -1 && starts_with(p1, suffix)) + i1 = i; + if (i2 == -1 && starts_with(p2, suffix)) + i2 = i; + } + if (i1 == -1 && i2 == -1) + return 0; + if (i1 >= 0 && i2 >= 0) + *diff = i1 - i2; + else if (i1 >= 0) + *diff = -1; + else /* if (i2 >= 0) */ + *diff = 1; + return 1; +} /* * Compare S1 and S2 as strings holding indices/version numbers, @@ -74,6 +117,13 @@ int versioncmp(const char *s1, const char *s2) state += (c1 == '0') + (isdigit (c1) != 0); } + if (!initialized) { + initialized = 1; + prereleases = git_config_get_value_multi("versionsort.prereleasesuffix"); + } + if (prereleases && swap_prereleases(p1 - 1, p2 - 1, &diff)) + return diff; + state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))]; switch (state) { @@ -232,7 +232,7 @@ int walker_targets_stdin(char ***target, const char ***write_ref) REALLOC_ARRAY(*write_ref, targets_alloc); } (*target)[targets] = xstrdup(tg_one); - (*write_ref)[targets] = rf_one ? xstrdup(rf_one) : NULL; + (*write_ref)[targets] = xstrdup_or_null(rf_one); targets++; } strbuf_release(&buf); @@ -299,7 +299,7 @@ int walker_fetch(struct walker *walker, int targets, char **target, strbuf_reset(&refname); strbuf_addf(&refname, "refs/%s", write_ref[i]); if (ref_transaction_update(transaction, refname.buf, - &sha1[20 * i], NULL, 0, 0, + &sha1[20 * i], NULL, 0, msg ? msg : "fetch (unknown)", &err)) { error("%s", err.buf); @@ -172,8 +172,22 @@ void *xcalloc(size_t nmemb, size_t size) * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in * the absence of bugs, large chunks can result in bad latencies when * you decide to kill the process. + * + * We pick 8 MiB as our default, but if the platform defines SSIZE_MAX + * that is smaller than that, clip it to SSIZE_MAX, as a call to + * read(2) or write(2) larger than that is allowed to fail. As the last + * resort, we allow a port to pass via CFLAGS e.g. "-DMAX_IO_SIZE=value" + * to override this, if the definition of SSIZE_MAX given by the platform + * is broken. */ -#define MAX_IO_SIZE (8*1024*1024) +#ifndef MAX_IO_SIZE +# define MAX_IO_SIZE_DEFAULT (8*1024*1024) +# if defined(SSIZE_MAX) && (SSIZE_MAX < MAX_IO_SIZE_DEFAULT) +# define MAX_IO_SIZE SSIZE_MAX +# else +# define MAX_IO_SIZE MAX_IO_SIZE_DEFAULT +# endif +#endif /* * xread() is the same a read(), but it automatically restarts read() diff --git a/wt-status.c b/wt-status.c index b54eac5af6..7036fa28dc 100644 --- a/wt-status.c +++ b/wt-status.c @@ -849,6 +849,8 @@ static void wt_status_print_verbose(struct wt_status *s) { struct rev_info rev; struct setup_revision_opt opt; + int dirty_submodules; + const char *c = color(WT_STATUS_HEADER, s); init_revisions(&rev, NULL); DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV); @@ -873,7 +875,25 @@ static void wt_status_print_verbose(struct wt_status *s) rev.diffopt.use_color = 0; wt_status_add_cut_line(s->fp); } + if (s->verbose > 1 && s->commitable) { + /* print_updated() printed a header, so do we */ + if (s->fp != stdout) + wt_status_print_trailer(s); + status_printf_ln(s, c, _("Changes to be committed:")); + rev.diffopt.a_prefix = "c/"; + rev.diffopt.b_prefix = "i/"; + } /* else use prefix as per user config */ run_diff_index(&rev, 1); + if (s->verbose > 1 && + wt_status_check_worktree_changes(s, &dirty_submodules)) { + status_printf_ln(s, c, + "--------------------------------------------------"); + status_printf_ln(s, c, _("Changes not staged for commit:")); + setup_work_tree(); + rev.diffopt.a_prefix = "i/"; + rev.diffopt.b_prefix = "w/"; + run_diff_files(&rev, 0); + } } static void wt_status_print_tracking(struct wt_status *s) @@ -1140,7 +1160,7 @@ static char *read_and_strip_branch(const char *path) if (strbuf_read_file(&sb, git_path("%s", path), 0) <= 0) goto got_nothing; - while (&sb.len && sb.buf[sb.len - 1] == '\n') + while (sb.len && sb.buf[sb.len - 1] == '\n') strbuf_setlen(&sb, sb.len - 1); if (!sb.len) goto got_nothing; @@ -1222,6 +1242,8 @@ static void wt_status_get_detached_from(struct wt_status_state *state) state->detached_from = xstrdup(find_unique_abbrev(cb.nsha1, DEFAULT_ABBREV)); hashcpy(state->detached_sha1, cb.nsha1); + state->detached_at = !get_sha1("HEAD", sha1) && + !hashcmp(sha1, state->detached_sha1); free(ref); strbuf_release(&cb.buf); @@ -1310,10 +1332,8 @@ void wt_status_print(struct wt_status *s) on_what = _("rebase in progress; onto "); branch_name = state.onto; } else if (state.detached_from) { - unsigned char sha1[20]; branch_name = state.detached_from; - if (!get_sha1("HEAD", sha1) && - !hashcmp(sha1, state.detached_sha1)) + if (state.detached_at) on_what = _("HEAD detached at "); else on_what = _("HEAD detached from "); diff --git a/wt-status.h b/wt-status.h index 283a9fef03..e0a99f75c7 100644 --- a/wt-status.h +++ b/wt-status.h @@ -84,6 +84,7 @@ struct wt_status_state { int cherry_pick_in_progress; int bisect_in_progress; int revert_in_progress; + int detached_at; char *branch; char *onto; char *detached_from; @@ -159,6 +159,7 @@ void git_deflate_init(git_zstream *strm, int level) { int status; + memset(strm, 0, sizeof(*strm)); zlib_pre_call(strm); status = deflateInit(&strm->z, level); zlib_post_call(strm); @@ -172,6 +173,7 @@ static void do_git_deflate_init(git_zstream *strm, int level, int windowBits) { int status; + memset(strm, 0, sizeof(*strm)); zlib_pre_call(strm); status = deflateInit2(&strm->z, level, Z_DEFLATED, windowBits, |