From: Junio C Hamano Date: Sun, 23 Dec 2012 04:35:34 +0000 (-0800) Subject: Merge branch 'ta/doc-cleanup' into maint X-Git-Tag: v1.8.0.3~17 X-Git-Url: https://www.git.lorimer.id.au/gitweb.git/diff_plain/66afe50b439e4d83679d12639dd084bcab0486f0?hp=5e00439f0a522c6f240791b0d105a17e0dde3247 Merge branch 'ta/doc-cleanup' into maint * ta/doc-cleanup: Documentation: build html for all files in technical and howto Documentation/howto: convert plain text files to asciidoc Documentation/technical: convert plain text files to asciidoc Change headline of technical/send-pack-pipeline.txt to not confuse its content with content from git-send-pack.txt Shorten two over-long lines in git-bisect-lk2009.txt by abbreviating some sha1 Split over-long synopsis in git-fetch-pack.txt into several lines --- diff --git a/Documentation/Makefile b/Documentation/Makefile index 361550422a..fe9a91d6a3 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -331,7 +331,7 @@ $(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml howto-index.txt: howto-index.sh $(wildcard howto/*.txt) $(QUIET_GEN)$(RM) $@+ $@ && \ - '$(SHELL_PATH_SQ)' ./howto-index.sh $(wildcard howto/*.txt) >$@+ && \ + '$(SHELL_PATH_SQ)' ./howto-index.sh $(sort $(wildcard howto/*.txt)) >$@+ && \ mv $@+ $@ $(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt diff --git a/Documentation/RelNotes/1.7.12.4.txt b/Documentation/RelNotes/1.7.12.4.txt new file mode 100644 index 0000000000..c6da3cc939 --- /dev/null +++ b/Documentation/RelNotes/1.7.12.4.txt @@ -0,0 +1,23 @@ +Git 1.7.12.4 Release Notes +========================== + +Fixes since v1.7.12.3 +--------------------- + + * "git fetch" over the dumb-http revision walker could segfault when + curl's multi interface was used. + + * It was possible to give specific paths for "asciidoc" and other + tools in the documentation toolchain, but not for "xmlto". + + * "gitweb" did not give the correct committer timezone in its feed + output due to a typo. + + * The "-Xours" (and similarly -Xtheirs) backend option to "git + merge -s recursive" was ignored for binary files. Now it is + honored. + + * The "binary" synthetic attribute made "diff" to treat the path as + binary, but not "merge". + +Also contains many documentation updates. diff --git a/Documentation/RelNotes/1.8.0.1.txt b/Documentation/RelNotes/1.8.0.1.txt new file mode 100644 index 0000000000..1f372fa0b5 --- /dev/null +++ b/Documentation/RelNotes/1.8.0.1.txt @@ -0,0 +1,64 @@ +Git v1.8.0.1 Release Notes +========================== + +Fixes since v1.8.0 +------------------ + + * The configuration parser had an unnecessary hardcoded limit on + variable names that was not checked consistently. + + * The "say" function in the test scaffolding incorrectly allowed + "echo" to interpret "\a" as if it were a C-string asking for a + BEL output. + + * "git mergetool" feeds /dev/null as a common ancestor when dealing + with an add/add conflict, but p4merge backend cannot handle + it. Work it around by passing a temporary empty file. + + * "git log -F -E --grep=''" failed to use the given + pattern as extended regular expression, and instead looked for the + string literally. + + * "git grep -e pattern " asked the attribute system to read + ":.gitattributes" file in the working tree, which was + nonsense. + + * A symbolic ref refs/heads/SYM was not correctly removed with "git + branch -d SYM"; the command removed the ref pointed by SYM + instead. + + * Earlier we fixed documentation to hyphenate "remote-tracking branch" + to clarify that these are not a remote entity, but unhyphenated + spelling snuck in to a few places since then. + + * "git pull --rebase" run while the HEAD is detached tried to find + the upstream branch of the detached HEAD (which by definition + does not exist) and emitted unnecessary error messages. + + * The refs/replace hierarchy was not mentioned in the + repository-layout docs. + + * Sometimes curl_multi_timeout() function suggested a wrong timeout + value when there is no file descriptors to wait on and the http + transport ended up sleeping for minutes in select(2) system call. + A workaround has been added for this. + + * Various rfc2047 quoting issues around a non-ASCII name on the + From: line in the output from format-patch have been corrected. + + * "git diff -G" did not honor textconv filter when looking + for changes. + + * Bash completion script (in contrib/) did not correctly complete a + lazy "git checkout $name_of_remote_tracking_branch_that_is_unique" + command line. + + * RSS feed from "gitweb" had a xss hole in its title output. + + * "git config --path $key" segfaulted on "[section] key" (a boolean + "true" spelled without "=", not "[section] key = true"). + + * "git checkout -b foo" while on an unborn branch did not say + "Switched to a new branch 'foo'" like other cases. + +Also contains other minor fixes and documentation updates. diff --git a/Documentation/RelNotes/1.8.0.2.txt b/Documentation/RelNotes/1.8.0.2.txt new file mode 100644 index 0000000000..8497e051de --- /dev/null +++ b/Documentation/RelNotes/1.8.0.2.txt @@ -0,0 +1,34 @@ +Git v1.8.0.2 Release Notes +========================== + +Fixes since v1.8.0.1 +-------------------- + + * Various codepaths have workaround for a common misconfiguration to + spell "UTF-8" as "utf8", but it was not used uniformly. Most + notably, mailinfo (which is used by "git am") lacked this support. + + * We failed to mention a file without any content change but whose + permission bit was modified, or (worse yet) a new file without any + content in the "git diff --stat" output. + + * When "--stat-count" hides a diffstat for binary contents, the total + number of added and removed lines at the bottom was computed + incorrectly. + + * When "--stat-count" hides a diffstat for unmerged paths, the total + number of affected files at the bottom of the "diff --stat" output + was computed incorrectly. + + * "diff --shortstat" miscounted the total number of affected files + when there were unmerged paths. + + * "git p4" used to try expanding malformed "$keyword$" that spans + across multiple lines. + + * "git update-ref -d --deref SYM" to delete a ref through a symbolic + ref that points to it did not remove it correctly. + + * Syntax highlighting in "gitweb" was not quite working. + +Also contains other minor fixes and documentation updates. diff --git a/Documentation/RelNotes/1.8.0.txt b/Documentation/RelNotes/1.8.0.txt index 9158899d60..43883c14f0 100644 --- a/Documentation/RelNotes/1.8.0.txt +++ b/Documentation/RelNotes/1.8.0.txt @@ -4,16 +4,18 @@ Git v1.8.0 Release Notes Backward compatibility notes ---------------------------- -In the next major release, we will change the behavior of the "git -push" command. When "git push [$there]" does not say what to push, we -have used the traditional "matching" semantics so far (all your branches were -sent to the remote as long as there already are branches of the same -name over there). We will now use the "simple" semantics, that pushes the -current branch to the branch with the same name only when the current +In the next major release (not *this* one), we will change the +behavior of the "git push" command. + +When "git push [$there]" does not say what to push, we have used the +traditional "matching" semantics so far (all your branches were sent +to the remote as long as there already are branches of the same name +over there). We will use the "simple" semantics that pushes the +current branch to the branch with the same name, only when the current branch is set to integrate with that remote branch. There is a user preference configuration variable "push.default" to change this, and "git push" will warn about the upcoming change until you set this -variable. +variable in this release. "git branch --set-upstream" is deprecated and may be removed in a relatively distant future. "git branch [-u|--set-upstream-to]" has @@ -35,7 +37,7 @@ UI, Workflows & Features * When "git am" sanitizes the "Subject:" line, we strip the prefix from "Re: subject" and also from a less common "re: subject", but left - the even less common "RE: subject" intact. We strip that now, too. + the even less common "RE: subject" intact. Now we strip that too. * It was tempting to say "git branch --set-upstream origin/master", but that tells Git to arrange the local branch "origin/master" to @@ -62,6 +64,8 @@ UI, Workflows & Features * "git grep" learned to use a non-standard pattern type by default if a configuration variable tells it to. + * Accumulated updates to "git gui" has been merged. + * "git log -g" learned the "--grep-reflog=" option to limit its output to commits with a reflog message that matches the given pattern. @@ -73,9 +77,6 @@ UI, Workflows & Features with the mergetool.$name.cmd configuration variable even for built-in mergetool backends. - * The "-Xours" backend option to "git merge -s recursive" now takes - effect even on binary files. - * "git rebase -i" learned the "--edit-todo" option to open an editor to edit the instruction sheet. @@ -88,7 +89,7 @@ Foreign Interface encountering a conflict during "p4 submit". -Performance, Internal Implementation, etc. (please report possible regressions) +Performance, Internal Implementation, etc. * Git ships with a fall-back regexp implementation for platforms with buggy regexp library, but it was easy for people to keep using their @@ -212,7 +213,6 @@ to them for details). * "git fetch" over the dumb-http revision walker could segfault when curl's multi interface was used. - (merge 188923f jk/maint-http-half-auth-push later to maint). * "git gc --auto" notified the user that auto-packing has triggered even under the "--quiet" option. @@ -226,6 +226,9 @@ to them for details). --author or --committer, it showed commits that mention either A or B (or both) instead. + * The "-Xours" backend option to "git merge -s recursive" was ignored + for binary files. + * "git p4", when "--use-client-spec" and "--detect-branches" are used together, misdetected branches. diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index cf4b216598..1fb6f2d4e9 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -308,7 +308,11 @@ endif::git-log[] index (i.e. amount of addition/deletions compared to the file's size). For example, `-M90%` means git should consider a delete/add pair to be a rename if more than 90% of the file - hasn't changed. + hasn't changed. Without a `%` sign, the number is to be read as + a fraction, with a decimal point before it. I.e., `-M5` becomes + 0.5, and is thus the same as `-M50%`. Similarly, `-M05` is + the same as `-M5%`. To limit detection to exact renames, use + `-M100%`. -C[]:: --find-copies[=]:: diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index 6d98ef3d2a..7fefdb0384 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -196,9 +196,9 @@ objects from the source repository into a pack in the cloned repository. `--no-single-branch` is given to fetch the histories near the tips of all branches. Further fetches into the resulting repository will only update the - remote tracking branch for the branch this option was used for the + remote-tracking branch for the branch this option was used for the initial cloning. If the HEAD at the remote did not point at any - branch when `--single-branch` clone was made, no remote tracking + branch when `--single-branch` clone was made, no remote-tracking branch is created. --recursive:: diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 9594ac8e9d..15cec8601c 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -184,6 +184,11 @@ OPTIONS commit log message unmodified. This option lets you further edit the message taken from these sources. +--no-edit:: + Use the selected commit message without launching an editor. + For example, `git commit --amend --no-edit` amends a commit + without changing its commit message. + --amend:: Used to amend the tip of the current branch. Prepare the tree object you would want to replace the latest commit as usual @@ -193,10 +198,6 @@ OPTIONS current tip -- if it was a merge, it will have the parents of the current tip as parents -- so the current top commit is discarded. - ---no-post-rewrite:: - Bypass the post-rewrite hook. - + -- It is a rough equivalent for: @@ -213,6 +214,9 @@ You should understand the implications of rewriting history if you amend a commit that has already been published. (See the "RECOVERING FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].) +--no-post-rewrite:: + Bypass the post-rewrite hook. + -i:: --include:: Before making a commit out of staged contents so far, diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index 6603a7ab73..d1844ead4a 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -442,7 +442,9 @@ their syntax. ^^^^^^ The `from` command is used to specify the commit to initialize this branch from. This revision will be the first ancestor of the -new commit. +new commit. The state of the tree built at this commit will begin +with the state at the `from` commit, and be altered by the content +modifications in this commit. Omitting the `from` command in the first commit of a new branch will cause fast-import to create that commit with no ancestor. This @@ -492,7 +494,9 @@ existing value of the branch. `merge` ^^^^^^^ -Includes one additional ancestor commit. If the `from` command is +Includes one additional ancestor commit. The additional ancestry +link does not change the way the tree state is built at this commit. +If the `from` command is omitted when creating a new branch, the first `merge` commit will be the first ancestor of the current commit, and the branch will start out with no files. An unlimited number of `merge` commands per @@ -558,8 +562,12 @@ A `` string must use UNIX-style directory separators (forward slash `/`), may contain any byte other than `LF`, and must not start with double quote (`"`). -If an `LF` or double quote must be encoded into `` shell-style -quoting should be used, e.g. `"path/with\n and \" in it"`. +A path can use C-style string quoting; this is accepted in all cases +and mandatory if the filename starts with double quote or contains +`LF`. In C-style quoting, the complete name should be surrounded with +double quotes, and any `LF`, backslash, or double quote characters +must be escaped by preceding them with a backslash (e.g., +`"path/with\n, \\ and \" in it"`). The value of `` must be in canonical form. That is it must not: diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index 20f9228511..d34ea3c50b 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -99,7 +99,7 @@ commit or stash your changes before running 'git merge'. more than two parents (affectionately called an Octopus merge). + If no commit is given from the command line, and if `merge.defaultToUpstream` -configuration variable is set, merge the remote tracking branches +configuration variable is set, merge the remote-tracking branches that the current branch is configured to use as its upstream. See also the configuration section of this manual page. diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 22d2580129..8b637d339f 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -175,7 +175,7 @@ useful if you write an alias or script around 'git push'. --recurse-submodules=check|on-demand:: Make sure all submodule commits used by the revisions to be - pushed are available on a remote tracking branch. If 'check' is + pushed are available on a remote-tracking branch. If 'check' is used git will verify that all submodule commits that changed in the revisions to be pushed are available on at least one remote of the submodule. If any commits are missing the push will be @@ -286,7 +286,8 @@ leading to commit A. The history looks like this: ---------------- Further suppose that the other person already pushed changes leading to A -back to the original repository you two obtained the original commit X. +back to the original repository from which you two obtained the original +commit X. The push done by the other person updated the branch that used to point at commit X to point at commit A. It is a fast-forward. @@ -384,11 +385,23 @@ the ones in the examples below) can be configured as the default for A handy way to push the current branch to the same name on the remote. -`git push origin master:satellite/master dev:satellite/dev`:: +`git push mothership master:satellite/master dev:satellite/dev`:: Use the source ref that matches `master` (e.g. `refs/heads/master`) to update the ref that matches `satellite/master` (most probably - `refs/remotes/satellite/master`) in the `origin` repository, then + `refs/remotes/satellite/master`) in the `mothership` repository; do the same for `dev` and `satellite/dev`. ++ +This is to emulate `git fetch` run on the `mothership` using `git +push` that is run in the opposite direction in order to integrate +the work done on `satellite`, and is often necessary when you can +only make connection in one way (i.e. satellite can ssh into +mothership but mothership cannot initiate connection to satellite +because the latter is behind a firewall or does not run sshd). ++ +After running this `git push` on the `satellite` machine, you would +ssh into the `mothership` and run `git merge` there to complete the +emulation of `git pull` that were run on `mothership` to pull changes +made on `satellite`. `git push origin HEAD:master`:: Push the current branch to the remote ref matching `master` in the diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt index 0aa4e20eae..711ffe17a7 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -144,7 +144,7 @@ drop [-q|--quiet] []:: Remove a single stashed state from the stash list. When no `` is given, it removes the latest one. i.e. `stash@{0}`, otherwise - `` must a valid stash log reference of the form + `` must be a valid stash log reference of the form `stash@{}`. create:: diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index b4683bba1b..a65f38e184 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -9,7 +9,7 @@ git-submodule - Initialize, update or inspect submodules SYNOPSIS -------- [verse] -'git submodule' [--quiet] add [-b branch] [-f|--force] +'git submodule' [--quiet] add [-b ] [-f|--force] [--reference ] [--] [] 'git submodule' [--quiet] status [--cached] [--recursive] [--] [...] 'git submodule' [--quiet] init [--] [...] diff --git a/Documentation/git.txt b/Documentation/git.txt index d1d227a32d..60db2929b5 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,17 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.7.12.3/git.html[documentation for release 1.7.12.3] +* link:v1.8.0.2/git.html[documentation for release 1.8.0.2] * release notes for + link:RelNotes/1.8.0.2.txt[1.8.0.2], + link:RelNotes/1.8.0.1.txt[1.8.0.1], + link:RelNotes/1.8.0.txt[1.8.0]. + +* link:v1.7.12.4/git.html[documentation for release 1.7.12.4] + +* release notes for + link:RelNotes/1.7.12.4.txt[1.7.12.4], link:RelNotes/1.7.12.3.txt[1.7.12.3], link:RelNotes/1.7.12.2.txt[1.7.12.2], link:RelNotes/1.7.12.1.txt[1.7.12.1], @@ -642,6 +650,7 @@ git so take care if using Cogito etc. If the 'GIT_DIR' environment variable is set then it specifies a path to use instead of the default `.git` for the base of the repository. + The '--git-dir' command-line option also sets this value. 'GIT_WORK_TREE':: Set the path to the working tree. The value will not be @@ -861,8 +870,7 @@ Authors ------- Git was started by Linus Torvalds, and is currently maintained by Junio C Hamano. Numerous contributions have come from the git mailing list -. For a more complete list of contributors, see -http://git-scm.com/about. If you have a clone of git.git itself, the +. If you have a clone of git.git itself, the output of linkgit:git-shortlog[1] and linkgit:git-blame[1] can show you the authors for specific parts of the project. diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt index 5c891f1169..9f628862b4 100644 --- a/Documentation/gitrepository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -93,6 +93,12 @@ refs/remotes/`name`:: records tip-of-the-tree commit objects of branches copied from a remote repository. +refs/replace/``:: + records the SHA1 of the object that replaces ``. + This is similar to info/grafts and is internally used and + maintained by linkgit:git-replace[1]. Such refs can be exchanged + between repositories while grafts are not. + packed-refs:: records the same information as refs/heads/, refs/tags/, and friends record in a more efficient way. See diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt index 861bd6f553..9bb4956ccd 100644 --- a/Documentation/merge-config.txt +++ b/Documentation/merge-config.txt @@ -9,11 +9,11 @@ merge.conflictstyle:: merge.defaultToUpstream:: If merge is called without any commit argument, merge the upstream branches configured for the current branch by using their last - observed values stored in their remote tracking branches. + observed values stored in their remote-tracking branches. The values of the `branch..merge` that name the branches at the remote named by `branch..remote` are consulted, and then they are mapped via `remote..fetch` - to their corresponding remote tracking branches, and the tips of + to their corresponding remote-tracking branches, and the tips of these tracking branches are merged. merge.ff:: diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 3c0e89c4cb..053628c939 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.8.0-rc2 +DEF_VER=v1.8.0.2 LF=' ' diff --git a/Makefile b/Makefile index f69979e39e..6b73c14aa0 100644 --- a/Makefile +++ b/Makefile @@ -1564,7 +1564,7 @@ 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) | sort -r | sed -ne 2p) + curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p) ifeq "$(curl_check)" "070908" ifndef NO_EXPAT PROGRAM_OBJS += http-push.o diff --git a/RelNotes b/RelNotes index 2484b38bbb..37b9d6fd5d 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes/1.8.0.txt \ No newline at end of file +Documentation/RelNotes/1.8.0.2.txt \ No newline at end of file diff --git a/builtin/branch.c b/builtin/branch.c index ffd26849c7..1ec9c02612 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -154,10 +154,37 @@ static int branch_merged(int kind, const char *name, return merged; } +static int check_branch_commit(const char *branchname, const char *refname, + unsigned char *sha1, struct commit *head_rev, + int kinds, int force) +{ + struct commit *rev = lookup_commit_reference(sha1); + if (!rev) { + error(_("Couldn't look up commit object for '%s'"), refname); + return -1; + } + if (!force && !branch_merged(kinds, branchname, rev, head_rev)) { + error(_("The branch '%s' is not fully merged.\n" + "If you are sure you want to delete it, " + "run 'git branch -D %s'."), branchname, branchname); + return -1; + } + return 0; +} + +static void delete_branch_config(const char *branchname) +{ + struct strbuf buf = STRBUF_INIT; + strbuf_addf(&buf, "branch.%s", branchname); + if (git_config_rename_section(buf.buf, NULL) < 0) + warning(_("Update of config-file failed")); + strbuf_release(&buf); +} + static int delete_branches(int argc, const char **argv, int force, int kinds, int quiet) { - struct commit *rev, *head_rev = NULL; + struct commit *head_rev = NULL; unsigned char sha1[20]; char *name = NULL; const char *fmt; @@ -187,6 +214,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, die(_("Couldn't look up commit object for HEAD")); } for (i = 0; i < argc; i++, strbuf_release(&bname)) { + const char *target; + int flags = 0; + strbuf_branchname(&bname, argv[i]); if (kinds == REF_LOCAL_BRANCH && !strcmp(head, bname.buf)) { error(_("Cannot delete the branch '%s' " @@ -198,7 +228,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, free(name); name = mkpathdup(fmt, bname.buf); - if (read_ref(name, sha1)) { + target = resolve_ref_unsafe(name, sha1, 0, &flags); + if (!target || + (!(flags & REF_ISSYMREF) && is_null_sha1(sha1))) { error(remote_branch ? _("remote branch '%s' not found.") : _("branch '%s' not found."), bname.buf); @@ -206,40 +238,31 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, continue; } - rev = lookup_commit_reference(sha1); - if (!rev) { - error(_("Couldn't look up commit object for '%s'"), name); - ret = 1; - continue; - } - - if (!force && !branch_merged(kinds, bname.buf, rev, head_rev)) { - error(_("The branch '%s' is not fully merged.\n" - "If you are sure you want to delete it, " - "run 'git branch -D %s'."), bname.buf, bname.buf); + if (!(flags & REF_ISSYMREF) && + check_branch_commit(bname.buf, name, sha1, head_rev, kinds, + force)) { ret = 1; continue; } - if (delete_ref(name, sha1, 0)) { + if (delete_ref(name, sha1, REF_NODEREF)) { error(remote_branch ? _("Error deleting remote branch '%s'") : _("Error deleting branch '%s'"), bname.buf); ret = 1; - } else { - struct strbuf buf = STRBUF_INIT; - if (!quiet) - printf(remote_branch - ? _("Deleted remote branch %s (was %s).\n") - : _("Deleted branch %s (was %s).\n"), - bname.buf, - find_unique_abbrev(sha1, DEFAULT_ABBREV)); - strbuf_addf(&buf, "branch.%s", bname.buf); - if (git_config_rename_section(buf.buf, NULL) < 0) - warning(_("Update of config-file failed")); - strbuf_release(&buf); + continue; + } + if (!quiet) { + printf(remote_branch + ? _("Deleted remote branch %s (was %s).\n") + : _("Deleted branch %s (was %s).\n"), + bname.buf, + (flags & REF_ISSYMREF) + ? target + : find_unique_abbrev(sha1, DEFAULT_ABBREV)); } + delete_branch_config(bname.buf); } free(name); diff --git a/builtin/checkout.c b/builtin/checkout.c index 781295b2c9..a9c1b5a95f 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -951,6 +951,9 @@ static int switch_unborn_to_new_branch(const struct checkout_opts *opts) strbuf_addf(&branch_ref, "refs/heads/%s", opts->new_branch); status = create_symref("HEAD", branch_ref.buf, "checkout -b"); strbuf_release(&branch_ref); + if (!opts->quiet) + fprintf(stderr, _("Switched to a new branch '%s'\n"), + opts->new_branch); return status; } diff --git a/builtin/config.c b/builtin/config.c index e1c33e0691..505bbc7ddd 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -129,7 +129,8 @@ static int show_config(const char *key_, const char *value_, void *cb) else sprintf(value, "%d", v); } else if (types == TYPE_PATH) { - git_config_pathname(&vptr, key_, value_); + if (git_config_pathname(&vptr, key_, value_) < 0) + return -1; must_free_vptr = 1; } else if (value_) { vptr = value_; diff --git a/builtin/grep.c b/builtin/grep.c index 82530a61b4..0e1b6c860e 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -86,7 +86,7 @@ static pthread_cond_t cond_result; static int skip_first_line; static void add_work(struct grep_opt *opt, enum grep_source_type type, - const char *name, const void *id) + const char *name, const char *path, const void *id) { grep_lock(); @@ -94,7 +94,7 @@ static void add_work(struct grep_opt *opt, enum grep_source_type type, pthread_cond_wait(&cond_write, &grep_mutex); } - grep_source_init(&todo[todo_end].source, type, name, id); + grep_source_init(&todo[todo_end].source, type, name, path, id); if (opt->binary != GREP_BINARY_TEXT) grep_source_load_driver(&todo[todo_end].source); todo[todo_end].done = 0; @@ -261,103 +261,12 @@ static int wait_all(void) } #endif -static int parse_pattern_type_arg(const char *opt, const char *arg) +static int grep_cmd_config(const char *var, const char *value, void *cb) { - if (!strcmp(arg, "default")) - return GREP_PATTERN_TYPE_UNSPECIFIED; - else if (!strcmp(arg, "basic")) - return GREP_PATTERN_TYPE_BRE; - else if (!strcmp(arg, "extended")) - return GREP_PATTERN_TYPE_ERE; - else if (!strcmp(arg, "fixed")) - return GREP_PATTERN_TYPE_FIXED; - else if (!strcmp(arg, "perl")) - return GREP_PATTERN_TYPE_PCRE; - die("bad %s argument: %s", opt, arg); -} - -static void grep_pattern_type_options(const int pattern_type, struct grep_opt *opt) -{ - switch (pattern_type) { - case GREP_PATTERN_TYPE_UNSPECIFIED: - /* fall through */ - - case GREP_PATTERN_TYPE_BRE: - opt->fixed = 0; - opt->pcre = 0; - opt->regflags &= ~REG_EXTENDED; - break; - - case GREP_PATTERN_TYPE_ERE: - opt->fixed = 0; - opt->pcre = 0; - opt->regflags |= REG_EXTENDED; - break; - - case GREP_PATTERN_TYPE_FIXED: - opt->fixed = 1; - opt->pcre = 0; - opt->regflags &= ~REG_EXTENDED; - break; - - case GREP_PATTERN_TYPE_PCRE: - opt->fixed = 0; - opt->pcre = 1; - opt->regflags &= ~REG_EXTENDED; - break; - } -} - -static int grep_config(const char *var, const char *value, void *cb) -{ - struct grep_opt *opt = cb; - char *color = NULL; - - if (userdiff_config(var, value) < 0) - return -1; - - if (!strcmp(var, "grep.extendedregexp")) { - if (git_config_bool(var, value)) - opt->extended_regexp_option = 1; - else - opt->extended_regexp_option = 0; - return 0; - } - - if (!strcmp(var, "grep.patterntype")) { - opt->pattern_type_option = parse_pattern_type_arg(var, value); - return 0; - } - - if (!strcmp(var, "grep.linenumber")) { - opt->linenum = git_config_bool(var, value); - return 0; - } - - if (!strcmp(var, "color.grep")) - opt->color = git_config_colorbool(var, value); - else if (!strcmp(var, "color.grep.context")) - color = opt->color_context; - else if (!strcmp(var, "color.grep.filename")) - color = opt->color_filename; - else if (!strcmp(var, "color.grep.function")) - color = opt->color_function; - else if (!strcmp(var, "color.grep.linenumber")) - color = opt->color_lineno; - else if (!strcmp(var, "color.grep.match")) - color = opt->color_match; - else if (!strcmp(var, "color.grep.selected")) - color = opt->color_selected; - else if (!strcmp(var, "color.grep.separator")) - color = opt->color_sep; - else - return git_color_default_config(var, value, cb); - if (color) { - if (!value) - return config_error_nonbool(var); - color_parse(value, var, color); - } - return 0; + int st = grep_config(var, value, cb); + if (git_color_default_config(var, value, cb) < 0) + st = -1; + return st; } static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size) @@ -371,7 +280,8 @@ static void *lock_and_read_sha1_file(const unsigned char *sha1, enum object_type } static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, - const char *filename, int tree_name_len) + const char *filename, int tree_name_len, + const char *path) { struct strbuf pathbuf = STRBUF_INIT; @@ -385,7 +295,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, #ifndef NO_PTHREADS if (use_threads) { - add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, sha1); + add_work(opt, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); return 0; } else @@ -394,7 +304,7 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, struct grep_source gs; int hit; - grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, sha1); + grep_source_init(&gs, GREP_SOURCE_SHA1, pathbuf.buf, path, sha1); strbuf_release(&pathbuf); hit = grep_source(opt, &gs); @@ -414,7 +324,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) #ifndef NO_PTHREADS if (use_threads) { - add_work(opt, GREP_SOURCE_FILE, buf.buf, filename); + add_work(opt, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); return 0; } else @@ -423,7 +333,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) struct grep_source gs; int hit; - grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename); + grep_source_init(&gs, GREP_SOURCE_FILE, buf.buf, filename, filename); strbuf_release(&buf); hit = grep_source(opt, &gs); @@ -479,7 +389,7 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int if (cached || (ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) { if (ce_stage(ce)) continue; - hit |= grep_sha1(opt, ce->sha1, ce->name, 0); + hit |= grep_sha1(opt, ce->sha1, ce->name, 0, ce->name); } else hit |= grep_file(opt, ce->name); @@ -497,7 +407,8 @@ static int grep_cache(struct grep_opt *opt, const struct pathspec *pathspec, int } static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, - struct tree_desc *tree, struct strbuf *base, int tn_len) + struct tree_desc *tree, struct strbuf *base, int tn_len, + int check_attr) { int hit = 0; enum interesting match = entry_not_interesting; @@ -518,7 +429,8 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, strbuf_add(base, entry.path, te_len); if (S_ISREG(entry.mode)) { - hit |= grep_sha1(opt, entry.sha1, base->buf, tn_len); + hit |= grep_sha1(opt, entry.sha1, base->buf, tn_len, + check_attr ? base->buf + tn_len : NULL); } else if (S_ISDIR(entry.mode)) { enum object_type type; @@ -533,7 +445,8 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec, strbuf_addch(base, '/'); init_tree_desc(&sub, data, size); - hit |= grep_tree(opt, pathspec, &sub, base, tn_len); + hit |= grep_tree(opt, pathspec, &sub, base, tn_len, + check_attr); free(data); } strbuf_setlen(base, old_baselen); @@ -548,7 +461,7 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, struct object *obj, const char *name) { if (obj->type == OBJ_BLOB) - return grep_sha1(opt, obj->sha1, name, 0); + return grep_sha1(opt, obj->sha1, name, 0, NULL); if (obj->type == OBJ_COMMIT || obj->type == OBJ_TREE) { struct tree_desc tree; void *data; @@ -571,7 +484,8 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec, strbuf_addch(&base, ':'); } init_tree_desc(&tree, data, size); - hit = grep_tree(opt, pathspec, &tree, &base, base.len); + hit = grep_tree(opt, pathspec, &tree, &base, base.len, + obj->type == OBJ_COMMIT); strbuf_release(&base); free(data); return hit; @@ -839,27 +753,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix) if (argc == 2 && !strcmp(argv[1], "-h")) usage_with_options(grep_usage, options); - memset(&opt, 0, sizeof(opt)); - opt.prefix = prefix; - opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0; - opt.relative = 1; - opt.pathname = 1; - opt.pattern_tail = &opt.pattern_list; - opt.header_tail = &opt.header_list; - opt.regflags = REG_NEWLINE; - opt.max_depth = -1; - opt.pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED; - opt.extended_regexp_option = 0; - - strcpy(opt.color_context, ""); - strcpy(opt.color_filename, ""); - strcpy(opt.color_function, ""); - strcpy(opt.color_lineno, ""); - strcpy(opt.color_match, GIT_COLOR_BOLD_RED); - strcpy(opt.color_selected, ""); - strcpy(opt.color_sep, GIT_COLOR_CYAN); - opt.color = -1; - git_config(grep_config, &opt); + init_grep_defaults(); + git_config(grep_cmd_config, NULL); + grep_init(&opt, prefix); /* * If there is no -- then the paths must exist in the working @@ -875,13 +771,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_STOP_AT_NON_OPTION | PARSE_OPT_NO_INTERNAL_HELP); - - if (pattern_type_arg != GREP_PATTERN_TYPE_UNSPECIFIED) - grep_pattern_type_options(pattern_type_arg, &opt); - else if (opt.pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED) - grep_pattern_type_options(opt.pattern_type_option, &opt); - else if (opt.extended_regexp_option) - grep_pattern_type_options(GREP_PATTERN_TYPE_ERE, &opt); + grep_commit_pattern_type(pattern_type_arg, &opt); if (use_index && !startup_info->have_repository) /* die the same way as if we did it at the beginning */ diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index da231400b3..24a772d8e1 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -483,7 +483,8 @@ static void convert_to_utf8(struct strbuf *line, const char *charset) if (!charset || !*charset) return; - if (!strcasecmp(metainfo_charset, charset)) + + if (same_encoding(metainfo_charset, charset)) return; out = reencode_string(line->buf, metainfo_charset, charset); if (!out) diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c index f5c6afc5dd..649c3aaa93 100644 --- a/builtin/pack-redundant.c +++ b/builtin/pack-redundant.c @@ -301,14 +301,14 @@ static void pll_free(struct pll *l) */ static struct pll * get_permutations(struct pack_list *list, int n) { - struct pll *subset, *ret = NULL, *new_pll = NULL, *pll; + struct pll *subset, *ret = NULL, *new_pll = NULL; if (list == NULL || pack_list_size(list) < n || n == 0) return NULL; if (n == 1) { while (list) { - new_pll = xmalloc(sizeof(pll)); + new_pll = xmalloc(sizeof(*new_pll)); new_pll->pl = NULL; pack_list_insert(&new_pll->pl, list); new_pll->next = ret; @@ -321,7 +321,7 @@ static struct pll * get_permutations(struct pack_list *list, int n) while (list->next) { subset = get_permutations(list->next, n - 1); while (subset) { - new_pll = xmalloc(sizeof(pll)); + new_pll = xmalloc(sizeof(*new_pll)); new_pll->pl = subset->pl; pack_list_insert(&new_pll->pl, list); new_pll->next = ret; diff --git a/builtin/remote.c b/builtin/remote.c index a5a4b23231..937484d7c7 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -39,7 +39,7 @@ static const char * const builtin_remote_rm_usage[] = { }; static const char * const builtin_remote_sethead_usage[] = { - N_("git remote set-head (-a | -d | ])"), + N_("git remote set-head (-a | -d | )"), NULL }; diff --git a/compat/fnmatch/fnmatch.c b/compat/fnmatch/fnmatch.c index 9473aed2bb..0ff1d273a5 100644 --- a/compat/fnmatch/fnmatch.c +++ b/compat/fnmatch/fnmatch.c @@ -345,7 +345,7 @@ internal_fnmatch (pattern, string, no_leading_period, flags) for (;;) { - if (c1 == CHAR_CLASS_MAX_LENGTH) + if (c1 > CHAR_CLASS_MAX_LENGTH) /* The name is too long and therefore the pattern is ill-formed. */ return FNM_NOMATCH; diff --git a/config.c b/config.c index 08e47e2e48..fff8a43bc0 100644 --- a/config.c +++ b/config.c @@ -10,8 +10,6 @@ #include "strbuf.h" #include "quote.h" -#define MAXNAME (256) - typedef struct config_file { struct config_file *prev; FILE *f; @@ -19,7 +17,7 @@ typedef struct config_file { int linenr; int eof; struct strbuf value; - char var[MAXNAME]; + struct strbuf var; } config_file; static config_file *cf; @@ -260,7 +258,7 @@ static inline int iskeychar(int c) return isalnum(c) || c == '-'; } -static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) +static int get_value(config_fn_t fn, void *data, struct strbuf *name) { int c; char *value; @@ -272,11 +270,9 @@ static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) break; if (!iskeychar(c)) break; - name[len++] = tolower(c); - if (len >= MAXNAME) - return -1; + strbuf_addch(name, tolower(c)); } - name[len] = 0; + while (c == ' ' || c == '\t') c = get_next_char(); @@ -288,10 +284,10 @@ static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) if (!value) return -1; } - return fn(name, value, data); + return fn(name->buf, value, data); } -static int get_extended_base_var(char *name, int baselen, int c) +static int get_extended_base_var(struct strbuf *name, int c) { do { if (c == '\n') @@ -302,7 +298,7 @@ static int get_extended_base_var(char *name, int baselen, int c) /* We require the format to be '[base "extension"]' */ if (c != '"') return -1; - name[baselen++] = '.'; + strbuf_addch(name, '.'); for (;;) { int c = get_next_char(); @@ -315,37 +311,31 @@ static int get_extended_base_var(char *name, int baselen, int c) if (c == '\n') goto error_incomplete_line; } - name[baselen++] = c; - if (baselen > MAXNAME / 2) - return -1; + strbuf_addch(name, c); } /* Final ']' */ if (get_next_char() != ']') return -1; - return baselen; + return 0; error_incomplete_line: cf->linenr--; return -1; } -static int get_base_var(char *name) +static int get_base_var(struct strbuf *name) { - int baselen = 0; - for (;;) { int c = get_next_char(); if (cf->eof) return -1; if (c == ']') - return baselen; + return 0; if (isspace(c)) - return get_extended_base_var(name, baselen, c); + return get_extended_base_var(name, c); if (!iskeychar(c) && c != '.') return -1; - if (baselen > MAXNAME / 2) - return -1; - name[baselen++] = tolower(c); + strbuf_addch(name, tolower(c)); } } @@ -353,7 +343,7 @@ static int git_parse_file(config_fn_t fn, void *data) { int comment = 0; int baselen = 0; - char *var = cf->var; + struct strbuf *var = &cf->var; /* U+FEFF Byte Order Mark in UTF8 */ static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf"; @@ -389,17 +379,24 @@ static int git_parse_file(config_fn_t fn, void *data) continue; } if (c == '[') { - baselen = get_base_var(var); - if (baselen <= 0) + /* Reset prior to determining a new stem */ + strbuf_reset(var); + if (get_base_var(var) < 0 || var->len < 1) break; - var[baselen++] = '.'; - var[baselen] = 0; + strbuf_addch(var, '.'); + baselen = var->len; continue; } if (!isalpha(c)) break; - var[baselen] = tolower(c); - if (get_value(fn, data, var, baselen+1) < 0) + /* + * Truncate the var name back to the section header + * stem prior to grabbing the suffix part of the name + * and the value. + */ + strbuf_setlen(var, baselen); + strbuf_addch(var, tolower(c)); + if (get_value(fn, data, var) < 0) break; } die("bad config file line %d in %s", cf->linenr, cf->name); @@ -899,12 +896,14 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data) top.linenr = 1; top.eof = 0; strbuf_init(&top.value, 1024); + strbuf_init(&top.var, 1024); cf = ⊤ ret = git_parse_file(fn, data); /* pop config-file parsing state stack */ strbuf_release(&top.value); + strbuf_release(&top.var); cf = top.prev; fclose(f); diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index be800e09bd..cda095de6b 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -321,7 +321,7 @@ __git_refs () if [[ "$ref" == "$cur"* ]]; then echo "$ref" fi - done | uniq -u + done | sort | uniq -u fi return fi @@ -989,6 +989,8 @@ _git_clone () --upload-pack --template= --depth + --single-branch + --branch " return ;; diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh index bf20491ec3..5ab488cd65 100644 --- a/contrib/completion/git-prompt.sh +++ b/contrib/completion/git-prompt.sh @@ -49,6 +49,15 @@ # find one, or @{upstream} otherwise. Once you have set # GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by # setting the bash.showUpstream config variable. +# +# If you would like to see more information about the identity of +# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE +# to one of these values: +# +# contains relative to newer annotated tag (v1.6.3.2~35) +# branch relative to newer tag or branch (master~4) +# describe relative to older annotated tag (v1.6.3.1-13-gdd42c2f) +# default exactly matching tag # __gitdir accepts 0 or 1 arguments (i.e., location) # returns location of .git repo diff --git a/contrib/mw-to-git/git-remote-mediawiki b/contrib/mw-to-git/git-remote-mediawiki index 68555d4265..094129de09 100755 --- a/contrib/mw-to-git/git-remote-mediawiki +++ b/contrib/mw-to-git/git-remote-mediawiki @@ -711,6 +711,14 @@ sub fetch_mw_revisions { return ($n, @revisions); } +sub fe_escape_path { + my $path = shift; + $path =~ s/\\/\\\\/g; + $path =~ s/"/\\"/g; + $path =~ s/\n/\\n/g; + return '"' . $path . '"'; +} + sub import_file_revision { my $commit = shift; my %commit = %{$commit}; @@ -738,15 +746,17 @@ sub import_file_revision { print STDOUT "from refs/mediawiki/$remotename/master^0\n"; } if ($content ne DELETED_CONTENT) { - print STDOUT "M 644 inline $title.mw\n"; + print STDOUT "M 644 inline " . + fe_escape_path($title . ".mw") . "\n"; literal_data($content); if (%mediafile) { - print STDOUT "M 644 inline $mediafile{title}\n"; + print STDOUT "M 644 inline " + . fe_escape_path($mediafile{title}) . "\n"; literal_data_raw($mediafile{content}); } print STDOUT "\n\n"; } else { - print STDOUT "D $title.mw\n"; + print STDOUT "D " . fe_escape_path($title . ".mw") . "\n"; } # mediawiki revision number in the git note diff --git a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh b/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh index 246d47d8fb..b6405ce262 100755 --- a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh +++ b/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh @@ -318,4 +318,30 @@ test_expect_success 'git push with \ in format control' ' ' +test_expect_success 'fast-import meta-characters in page name (mw -> git)' ' + wiki_reset && + wiki_editpage \"file\"_\\_foo "expect to be called \"file\"_\\_foo" false && + git clone mediawiki::'"$WIKI_URL"' mw_dir_21 && + test_path_is_file mw_dir_21/\"file\"_\\_foo.mw && + wiki_getallpage ref_page_21 && + test_diff_directories mw_dir_21 ref_page_21 +' + + +test_expect_success 'fast-import meta-characters in page name (git -> mw) ' ' + wiki_reset && + git clone mediawiki::'"$WIKI_URL"' mw_dir_22 && + ( + cd mw_dir_22 && + echo "this file is called \"file\"_\\_foo.mw" >\"file\"_\\_foo && + git add . && + git commit -am "file \"file\"_\\_foo" && + git pull && + git push + ) && + wiki_getallpage ref_page_22 && + test_diff_directories mw_dir_22 ref_page_22 +' + + test_done diff --git a/diff.c b/diff.c index 35d3f07385..374b2354f3 100644 --- a/diff.c +++ b/diff.c @@ -1300,6 +1300,7 @@ struct diffstat_t { unsigned is_unmerged:1; unsigned is_binary:1; unsigned is_renamed:1; + unsigned is_interesting:1; uintmax_t added, deleted; } **files; }; @@ -1469,8 +1470,8 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) for (i = 0; (i < count) && (i < data->nr); i++) { struct diffstat_file *file = data->files[i]; uintmax_t change = file->added + file->deleted; - if (!data->files[i]->is_renamed && - (change == 0)) { + + if (!file->is_interesting && (change == 0)) { count++; /* not shown == room for one more */ continue; } @@ -1497,7 +1498,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) if (max_change < change) max_change = change; } - count = i; /* min(count, data->nr) */ + count = i; /* where we can stop scanning in data->files[] */ /* * We have width = stat_width or term_columns() columns total. @@ -1585,16 +1586,15 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) */ for (i = 0; i < count; i++) { const char *prefix = ""; - char *name = data->files[i]->print_name; - uintmax_t added = data->files[i]->added; - uintmax_t deleted = data->files[i]->deleted; + struct diffstat_file *file = data->files[i]; + char *name = file->print_name; + uintmax_t added = file->added; + uintmax_t deleted = file->deleted; int name_len; - if (!data->files[i]->is_renamed && - (added + deleted == 0)) { - total_files--; + if (!file->is_interesting && (added + deleted == 0)) continue; - } + /* * "scale" the filename */ @@ -1610,7 +1610,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) name = slash; } - if (data->files[i]->is_binary) { + if (file->is_binary) { fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); fprintf(options->file, " %*s", number_width, "Bin"); @@ -1627,7 +1627,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) fprintf(options->file, "\n"); continue; } - else if (data->files[i]->is_unmerged) { + else if (file->is_unmerged) { fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); fprintf(options->file, " Unmerged\n"); @@ -1639,8 +1639,6 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) */ add = added; del = deleted; - adds += add; - dels += del; if (graph_width <= max_change) { int total = add + del; @@ -1666,16 +1664,24 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) show_graph(options->file, '-', del, del_c, reset); fprintf(options->file, "\n"); } - for (i = count; i < data->nr; i++) { - uintmax_t added = data->files[i]->added; - uintmax_t deleted = data->files[i]->deleted; - if (!data->files[i]->is_renamed && - (added + deleted == 0)) { + + for (i = 0; i < data->nr; i++) { + struct diffstat_file *file = data->files[i]; + uintmax_t added = file->added; + uintmax_t deleted = file->deleted; + + if (file->is_unmerged || + (!file->is_interesting && (added + deleted == 0))) { total_files--; continue; } - adds += added; - dels += deleted; + + if (!file->is_binary) { + adds += added; + dels += deleted; + } + if (i < count) + continue; if (!extra_shown) fprintf(options->file, "%s ...\n", line_prefix); extra_shown = 1; @@ -1695,9 +1701,8 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option int added = data->files[i]->added; int deleted= data->files[i]->deleted; - if (data->files[i]->is_unmerged) - continue; - if (!data->files[i]->is_renamed && (added + deleted == 0)) { + if (data->files[i]->is_unmerged || + (!data->files[i]->is_interesting && (added + deleted == 0))) { total_files--; } else if (!data->files[i]->is_binary) { /* don't count bytes */ adds += added; @@ -2397,13 +2402,20 @@ static void builtin_diffstat(const char *name_a, const char *name_b, struct diff_filespec *two, struct diffstat_t *diffstat, struct diff_options *o, - int complete_rewrite) + struct diff_filepair *p) { mmfile_t mf1, mf2; struct diffstat_file *data; int same_contents; + int complete_rewrite = 0; + + if (!DIFF_PAIR_UNMERGED(p)) { + if (p->status == DIFF_STATUS_MODIFIED && p->score) + complete_rewrite = 1; + } data = diffstat_add(diffstat, name_a, name_b); + data->is_interesting = p->status != DIFF_STATUS_UNKNOWN; if (!one || !two) { data->is_unmerged = 1; @@ -3114,11 +3126,10 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o, { const char *name; const char *other; - int complete_rewrite = 0; if (DIFF_PAIR_UNMERGED(p)) { /* unmerged */ - builtin_diffstat(p->one->path, NULL, NULL, NULL, diffstat, o, 0); + builtin_diffstat(p->one->path, NULL, NULL, NULL, diffstat, o, p); return; } @@ -3131,9 +3142,7 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o, diff_fill_sha1_info(p->one); diff_fill_sha1_info(p->two); - if (p->status == DIFF_STATUS_MODIFIED && p->score) - complete_rewrite = 1; - builtin_diffstat(name, other, p->one, p->two, diffstat, o, complete_rewrite); + builtin_diffstat(name, other, p->one, p->two, diffstat, o, p); } static void run_checkdiff(struct diff_filepair *p, struct diff_options *o) diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c index ed23eb4bdd..b097fa7661 100644 --- a/diffcore-pickaxe.c +++ b/diffcore-pickaxe.c @@ -104,10 +104,10 @@ static int diff_grep(struct diff_filepair *p, struct diff_options *o, if (!mf2.ptr) return 0; /* ignore unmerged */ /* created "two" -- does it have what we are looking for? */ - hit = !regexec(regexp, p->two->data, 1, ®match, 0); + hit = !regexec(regexp, mf2.ptr, 1, ®match, 0); } else if (!mf2.ptr) { /* removed "one" -- did it have what we are looking for? */ - hit = !regexec(regexp, p->one->data, 1, ®match, 0); + hit = !regexec(regexp, mf1.ptr, 1, ®match, 0); } else { /* * We have both sides; need to run textual diff and see if @@ -157,19 +157,15 @@ static void diffcore_pickaxe_grep(struct diff_options *o) return; } -static unsigned int contains(struct diff_filespec *one, struct diff_options *o, +static unsigned int contains(mmfile_t *mf, struct diff_options *o, regex_t *regexp, kwset_t kws) { unsigned int cnt; unsigned long sz; const char *data; - if (!o->pickaxe[0]) - return 0; - if (diff_populate_filespec(one, 0)) - return 0; - sz = one->size; - data = one->data; + sz = mf->size; + data = mf->ptr; cnt = 0; if (regexp) { @@ -199,26 +195,53 @@ static unsigned int contains(struct diff_filespec *one, struct diff_options *o, cnt++; } } - diff_free_filespec_data(one); return cnt; } static int has_changes(struct diff_filepair *p, struct diff_options *o, regex_t *regexp, kwset_t kws) { - if (!DIFF_FILE_VALID(p->one)) { - if (!DIFF_FILE_VALID(p->two)) - return 0; /* ignore unmerged */ + struct userdiff_driver *textconv_one = get_textconv(p->one); + struct userdiff_driver *textconv_two = get_textconv(p->two); + mmfile_t mf1, mf2; + int ret; + + if (!o->pickaxe[0]) + return 0; + + /* + * If we have an unmodified pair, we know that the count will be the + * same and don't even have to load the blobs. Unless textconv is in + * play, _and_ we are using two different textconv filters (e.g., + * because a pair is an exact rename with different textconv attributes + * for each side, which might generate different content). + */ + if (textconv_one == textconv_two && diff_unmodified_pair(p)) + return 0; + + fill_one(p->one, &mf1, &textconv_one); + fill_one(p->two, &mf2, &textconv_two); + + if (!mf1.ptr) { + if (!mf2.ptr) + ret = 0; /* ignore unmerged */ /* created */ - return contains(p->two, o, regexp, kws) != 0; - } - if (!DIFF_FILE_VALID(p->two)) - return contains(p->one, o, regexp, kws) != 0; - if (!diff_unmodified_pair(p)) { - return contains(p->one, o, regexp, kws) != - contains(p->two, o, regexp, kws); + ret = contains(&mf2, o, regexp, kws) != 0; } - return 0; + else if (!mf2.ptr) /* removed */ + ret = contains(&mf1, o, regexp, kws) != 0; + else + ret = contains(&mf1, o, regexp, kws) != + contains(&mf2, o, regexp, kws); + + if (textconv_one) + free(mf1.ptr); + if (textconv_two) + free(mf2.ptr); + diff_free_filespec_data(p->one); + diff_free_filespec_data(p->two); + + return ret; } static void diffcore_pickaxe_count(struct diff_options *o) diff --git a/git-compat-util.h b/git-compat-util.h index 2fbf1fd8b1..2e79b8a2f3 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -506,6 +506,7 @@ extern const char tolower_trans_tbl[256]; #undef isdigit #undef isalpha #undef isalnum +#undef isprint #undef islower #undef isupper #undef tolower @@ -523,6 +524,7 @@ extern unsigned char sane_ctype[256]; #define isdigit(x) sane_istest(x,GIT_DIGIT) #define isalpha(x) sane_istest(x,GIT_ALPHA) #define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT) +#define isprint(x) ((x) >= 0x20 && (x) <= 0x7e) #define islower(x) sane_iscase(x, 1) #define isupper(x) sane_iscase(x, 0) #define is_glob_special(x) sane_istest(x,GIT_GLOB_SPECIAL) diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN index 65709437ff..49b62ea6eb 100755 --- a/git-gui/GIT-VERSION-GEN +++ b/git-gui/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=0.16.GITGUI +DEF_VER=0.17.GITGUI LF=' ' diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index ba4e5c1330..89f636f496 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -154,6 +154,7 @@ set _trace [lsearch -exact $argv --trace] if {$_trace >= 0} { set argv [lreplace $argv $_trace $_trace] set _trace 1 + if {[tk windowingsystem] eq "win32"} { console show } } else { set _trace 0 } @@ -1463,7 +1464,7 @@ proc rescan {after {honor_trustmtime 1}} { (![$ui_comm edit modified] || [string trim [$ui_comm get 0.0 end]] eq {})} { if {[string match amend* $commit_type]} { - } elseif {[load_message GITGUI_MSG]} { + } elseif {[load_message GITGUI_MSG utf-8]} { } elseif {[run_prepare_commit_msg_hook]} { } elseif {[load_message MERGE_MSG]} { } elseif {[load_message SQUASH_MSG]} { @@ -1549,7 +1550,7 @@ proc rescan_stage2 {fd after} { fileevent $fd_lo readable [list read_ls_others $fd_lo $after] } -proc load_message {file} { +proc load_message {file {encoding {}}} { global ui_comm set f [gitdir $file] @@ -1558,6 +1559,9 @@ proc load_message {file} { return 0 } fconfigure $fd -eofchar {} + if {$encoding ne {}} { + fconfigure $fd -encoding $encoding + } set content [string trim [read $fd]] close $fd regsub -all -line {[ \r\t]+$} $content {} content @@ -2266,6 +2270,7 @@ proc do_quit {{rc {1}}} { && $msg ne {}} { catch { set fd [open $save w] + fconfigure $fd -encoding utf-8 puts -nonewline $fd $msg close $fd } @@ -2998,10 +3003,19 @@ blame { set jump_spec {} set is_path 0 foreach a $argv { - if {$is_path || [file exists $_prefix$a]} { + if {[file exists $a]} { + if {$path ne {}} usage + set path [normalize_relpath $a] + break + } elseif {[file exists $_prefix$a]} { if {$path ne {}} usage set path [normalize_relpath $_prefix$a] break + } + + if {$is_path} { + if {$path ne {}} usage + break } elseif {$a eq {--}} { if {$path ne {}} { if {$head ne {}} usage @@ -3023,8 +3037,13 @@ blame { unset is_path if {$head ne {} && $path eq {}} { - set path [normalize_relpath $_prefix$head] - set head {} + if {[string index $head 0] eq {/}} { + set path [normalize_relpath $head] + set head {} + } else { + set path [normalize_relpath $_prefix$head] + set head {} + } } if {$head eq {}} { @@ -3710,6 +3729,8 @@ bind $ui_diff <$M1B-Key-v> {break} bind $ui_diff <$M1B-Key-V> {break} bind $ui_diff <$M1B-Key-a> {%W tag add sel 0.0 end;break} bind $ui_diff <$M1B-Key-A> {%W tag add sel 0.0 end;break} +bind $ui_diff <$M1B-Key-j> {do_revert_selection;break} +bind $ui_diff <$M1B-Key-J> {do_revert_selection;break} bind $ui_diff {catch {%W yview scroll -1 units};break} bind $ui_diff {catch {%W yview scroll 1 units};break} bind $ui_diff {catch {%W xview scroll -1 units};break} @@ -3742,6 +3763,8 @@ bind . <$M1B-Key-s> do_signoff bind . <$M1B-Key-S> do_signoff bind . <$M1B-Key-t> do_add_selection bind . <$M1B-Key-T> do_add_selection +bind . <$M1B-Key-u> do_unstage_selection +bind . <$M1B-Key-U> do_unstage_selection bind . <$M1B-Key-j> do_revert_selection bind . <$M1B-Key-J> do_revert_selection bind . <$M1B-Key-i> do_add_all @@ -3835,7 +3858,7 @@ if {[is_enabled transport]} { } if {[winfo exists $ui_comm]} { - set GITGUI_BCK_exists [load_message GITGUI_BCK] + set GITGUI_BCK_exists [load_message GITGUI_BCK utf-8] # -- If both our backup and message files exist use the # newer of the two files to initialize the buffer. @@ -3872,6 +3895,7 @@ if {[winfo exists $ui_comm]} { } elseif {$m} { catch { set fd [open [gitdir GITGUI_BCK] w] + fconfigure $fd -encoding utf-8 puts -nonewline $fd $msg close $fd set GITGUI_BCK_exists 1 diff --git a/git-gui/lib/commit.tcl b/git-gui/lib/commit.tcl index 0d81432af5..864b687057 100644 --- a/git-gui/lib/commit.tcl +++ b/git-gui/lib/commit.tcl @@ -268,7 +268,7 @@ proc commit_commitmsg {curHEAD msg_p} { && [is_config_true gui.warndetachedcommit]} { set msg [mc "You are about to commit on a detached head.\ This is a potentially dangerous thing to do because if you switch\ -to another branch you will loose your changes and it can be difficult\ +to another branch you will lose your changes and it can be difficult\ to retrieve them later from the reflog. You should probably cancel this\ commit and create a new branch to continue.\n\ \n\ @@ -409,6 +409,7 @@ A rescan will be automatically started now. catch {file delete [gitdir MERGE_MSG]} catch {file delete [gitdir SQUASH_MSG]} catch {file delete [gitdir GITGUI_MSG]} + catch {file delete [gitdir CHERRY_PICK_HEAD]} # -- Let rerere do its thing. # diff --git a/git-gui/lib/status_bar.tcl b/git-gui/lib/status_bar.tcl index 95cb44991f..02111a1742 100644 --- a/git-gui/lib/status_bar.tcl +++ b/git-gui/lib/status_bar.tcl @@ -77,6 +77,7 @@ method start {msg uds} { method update {have total} { set pdone 0 + set cdone 0 if {$total > 0} { set pdone [expr {100 * $have / $total}] set cdone [expr {[winfo width $w_c] * $have / $total}] diff --git a/git-gui/macosx/AppMain.tcl b/git-gui/macosx/AppMain.tcl index ddbe6334a2..738bdd03ed 100644 --- a/git-gui/macosx/AppMain.tcl +++ b/git-gui/macosx/AppMain.tcl @@ -12,7 +12,9 @@ if {[file tail [lindex $argv 0]] eq {gitk}} { } else { set argv0 [file join $gitexecdir [file tail [lindex $argv 0]]] set AppMain_source [file join $gitguilib git-gui.tcl] - if {[pwd] eq {/}} { + if {[info exists env(PWD)]} { + cd $env(PWD) + } elseif {[pwd] eq {/}} { cd $env(HOME) } } diff --git a/git-gui/po/de.po b/git-gui/po/de.po index 44c5ddc8b6..baebff2fff 100644 --- a/git-gui/po/de.po +++ b/git-gui/po/de.po @@ -72,7 +72,7 @@ msgstr "" #: git-gui.sh:1154 msgid "Cannot use bare repository:" -msgstr "Leeres Projektarchiv kann nicht benutzt werden:" +msgstr "Bloßes Projektarchiv kann nicht benutzt werden:" #: git-gui.sh:1162 msgid "No working directory" @@ -88,7 +88,7 @@ msgstr "Nach geänderten Dateien suchen..." #: git-gui.sh:1454 msgid "Calling prepare-commit-msg hook..." -msgstr "Aufrufen der Eintragen-Vorbereiten-Kontrolle..." +msgstr "Aufrufen der Eintragen-Vorbereiten-Kontrolle (»prepare-commit hook«)..." #: git-gui.sh:1471 msgid "Commit declined by prepare-commit-msg hook." @@ -188,7 +188,7 @@ msgstr "Zusammenführen" #: git-gui.sh:2465 lib/choose_rev.tcl:557 msgid "Remote" -msgstr "Andere Archive" +msgstr "Externe Archive" #: git-gui.sh:2468 msgid "Tools" @@ -478,7 +478,7 @@ msgstr "Zusammenführungswerkzeug" #: git-gui.sh:3328 msgid "Use Remote Version" -msgstr "Entfernte Version benutzen" +msgstr "Externe Version benutzen" #: git-gui.sh:3332 msgid "Use Local Version" @@ -771,7 +771,7 @@ msgstr "Bitte wählen Sie einen Übernahmezweig." #: lib/branch_create.tcl:140 #, tcl-format msgid "Tracking branch %s is not a branch in the remote repository." -msgstr "Übernahmezweig »%s« ist kein Zweig im anderen Projektarchiv." +msgstr "Übernahmezweig »%s« ist kein Zweig im externen Projektarchiv." #: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 msgid "Please supply a branch name." @@ -1446,7 +1446,7 @@ msgstr "" #: lib/commit.tcl:234 msgid "Calling pre-commit hook..." -msgstr "Aufrufen der Vor-Eintragen-Kontrolle..." +msgstr "Aufrufen der Vor-Eintragen-Kontrolle (»pre-commit hook«)..." #: lib/commit.tcl:249 msgid "Commit declined by pre-commit hook." @@ -1454,7 +1454,7 @@ msgstr "Eintragen abgelehnt durch Vor-Eintragen-Kontrolle (»pre-commit hook«). #: lib/commit.tcl:272 msgid "Calling commit-msg hook..." -msgstr "Aufrufen der Versionsbeschreibungs-Kontrolle..." +msgstr "Aufrufen der Versionsbeschreibungs-Kontrolle (»commit-message hook«)..." #: lib/commit.tcl:287 msgid "Commit declined by commit-msg hook." @@ -2134,11 +2134,11 @@ msgstr "Optionen konnten nicht gespeichert werden:" #: lib/remote_add.tcl:19 msgid "Add Remote" -msgstr "Anderes Archiv hinzufügen" +msgstr "Externes Archiv hinzufügen" #: lib/remote_add.tcl:24 msgid "Add New Remote" -msgstr "Neues anderes Archiv hinzufügen" +msgstr "Neues externes Archiv hinzufügen" #: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36 msgid "Add" @@ -2146,7 +2146,7 @@ msgstr "Hinzufügen" #: lib/remote_add.tcl:37 msgid "Remote Details" -msgstr "Einzelheiten des anderen Archivs" +msgstr "Einzelheiten des externen Archivs" #: lib/remote_add.tcl:50 msgid "Location:" @@ -2162,7 +2162,7 @@ msgstr "Gleich anfordern" #: lib/remote_add.tcl:71 msgid "Initialize Remote Repository and Push" -msgstr "Anderes Archiv initialisieren und dahin versenden" +msgstr "Externes Archiv initialisieren und dahin versenden" #: lib/remote_add.tcl:77 msgid "Do Nothing Else Now" @@ -2170,17 +2170,17 @@ msgstr "Nichts tun" #: lib/remote_add.tcl:101 msgid "Please supply a remote name." -msgstr "Bitte geben Sie einen Namen des anderen Archivs an." +msgstr "Bitte geben Sie einen Namen des externen Archivs an." #: lib/remote_add.tcl:114 #, tcl-format msgid "'%s' is not an acceptable remote name." -msgstr "»%s« ist kein zulässiger Name eines anderen Archivs." +msgstr "»%s« ist kein zulässiger Name eines externen Archivs." #: lib/remote_add.tcl:125 #, tcl-format msgid "Failed to add remote '%s' of location '%s'." -msgstr "Fehler beim Hinzufügen des anderen Archivs »%s« aus Herkunftsort »%s«." +msgstr "Fehler beim Hinzufügen des externen Archivs »%s« aus Herkunftsort »%s«." #: lib/remote_add.tcl:133 lib/transport.tcl:6 #, tcl-format @@ -2195,7 +2195,7 @@ msgstr "»%s« anfordern" #: lib/remote_add.tcl:157 #, tcl-format msgid "Do not know how to initialize repository at location '%s'." -msgstr "Initialisieren eines anderen Archivs an Adresse »%s« ist nicht möglich." +msgstr "Initialisieren eines externen Archivs an Adresse »%s« ist nicht möglich." #: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 #: lib/transport.tcl:81 @@ -2210,7 +2210,7 @@ msgstr "Einrichten von »%s« an »%s«" #: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 msgid "Delete Branch Remotely" -msgstr "Zweig in anderem Archiv löschen" +msgstr "Zweig in externem Archiv löschen" #: lib/remote_branch_delete.tcl:47 msgid "From Repository" @@ -2218,7 +2218,7 @@ msgstr "In Projektarchiv" #: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 msgid "Remote:" -msgstr "Anderes Archiv:" +msgstr "Externes Archiv:" #: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 msgid "Arbitrary Location:" @@ -2281,7 +2281,7 @@ msgstr "»%s« laden..." #: lib/remote.tcl:163 msgid "Remove Remote" -msgstr "Anderes Archiv entfernen" +msgstr "Externes Archiv entfernen" #: lib/remote.tcl:168 msgid "Prune from" @@ -2397,7 +2397,7 @@ msgid "Generation failed." msgstr "Schlüsselerzeugung fehlgeschlagen." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Schlüsselerzeugung erfolgreich, aber keine Schlüssel gefunden." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/fr.po b/git-gui/po/fr.po index 81706965f3..40441dbb0d 100644 --- a/git-gui/po/fr.po +++ b/git-gui/po/fr.po @@ -2399,7 +2399,7 @@ msgid "Generation failed." msgstr "La génération a échoué." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "La génération a réussi, mais aucune clé n'a été trouvée." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/git-gui.pot b/git-gui/po/git-gui.pot index 1ae2aaa0b3..0c94f9c2c6 100644 --- a/git-gui/po/git-gui.pot +++ b/git-gui/po/git-gui.pot @@ -2203,7 +2203,7 @@ msgid "Generation failed." msgstr "" #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "" #: lib/sshkey.tcl:121 diff --git a/git-gui/po/hu.po b/git-gui/po/hu.po index 0f87bc1cbe..d106dadac8 100644 --- a/git-gui/po/hu.po +++ b/git-gui/po/hu.po @@ -2354,7 +2354,7 @@ msgid "Generation failed." msgstr "A generálás nem sikerült." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "A generálás sikeres, de egy kulcs se található." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/it.po b/git-gui/po/it.po index aa15a204d8..1bd8b8e04f 100644 --- a/git-gui/po/it.po +++ b/git-gui/po/it.po @@ -2397,7 +2397,7 @@ msgid "Generation failed." msgstr "Errore durante la creazione della chiave." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "La chiave è stata creata con successo, ma non è stata trovata." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/ja.po b/git-gui/po/ja.po index 15017985e5..9aff249d5f 100644 --- a/git-gui/po/ja.po +++ b/git-gui/po/ja.po @@ -2362,7 +2362,7 @@ msgid "Generation failed." msgstr "生成に失敗しました。" #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "生成には成功しましたが、鍵が見つかりません。" #: lib/sshkey.tcl:121 diff --git a/git-gui/po/nb.po b/git-gui/po/nb.po index 6de93c28c2..d66aa50263 100644 --- a/git-gui/po/nb.po +++ b/git-gui/po/nb.po @@ -2286,7 +2286,7 @@ msgid "Generation failed." msgstr "Generering feilet." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Generering vellykket, men ingen nøkler er funnet." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/pt_br.po b/git-gui/po/pt_br.po index b175b9791e..bad116c780 100644 --- a/git-gui/po/pt_br.po +++ b/git-gui/po/pt_br.po @@ -2375,7 +2375,7 @@ msgid "Generation failed." msgstr "A geração da chave falhou." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "A geração da chave foi bem-sucedida, mas nenhuma chave foi encontrada." #: lib/sshkey.tcl:121 diff --git a/git-gui/po/ru.po b/git-gui/po/ru.po index 30f4b77dac..ca4343b40c 100644 --- a/git-gui/po/ru.po +++ b/git-gui/po/ru.po @@ -2370,7 +2370,7 @@ msgid "Generation failed." msgstr "Ключ не создан." #: lib/sshkey.tcl:118 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Создание ключа завершилось, но результат не был найден" #: lib/sshkey.tcl:121 diff --git a/git-gui/po/sv.po b/git-gui/po/sv.po index 24cc4e3675..fcb063ffa6 100644 --- a/git-gui/po/sv.po +++ b/git-gui/po/sv.po @@ -2382,7 +2382,7 @@ msgid "Generation failed." msgstr "Misslyckades med att skapa." #: lib/sshkey.tcl:120 -msgid "Generation succeded, but no keys found." +msgid "Generation succeeded, but no keys found." msgstr "Lyckades skapa nyckeln, men hittar inte nÃ¥gon nyckel." #: lib/sshkey.tcl:123 diff --git a/git-p4.py b/git-p4.py index 882b1bbab5..7d6c928c3f 100755 --- a/git-p4.py +++ b/git-p4.py @@ -227,7 +227,7 @@ def p4_keywords_regexp_for_type(base, type_mods): pattern = r""" \$ # Starts with a dollar, followed by... (%s) # one of the keywords, followed by... - (:[^$]+)? # possibly an old expansion, followed by... + (:[^$\n]+)? # possibly an old expansion, followed by... \$ # another dollar """ % kwords return pattern diff --git a/git-parse-remote.sh b/git-parse-remote.sh index 484b2e61cc..0e87e0915e 100644 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -80,7 +80,7 @@ See git-${cmd}(1) for details If you wish to set tracking information for this branch you can do so with: - git branch --set-upstream ${branch_name#refs/heads/} $remote/ + git branch --set-upstream-to=$remote/ ${branch_name#refs/heads/} " fi exit 1 diff --git a/git-pull.sh b/git-pull.sh index 2a10047eb7..266e682f6c 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -200,6 +200,7 @@ test true = "$rebase" && { require_clean_work_tree "pull with rebase" "Please commit or stash them." fi oldremoteref= && + test -n "$curr_branch" && . git-parse-remote && remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" && oldremoteref="$(git rev-parse -q --verify "$remoteref")" && diff --git a/git-submodule.sh b/git-submodule.sh index ab6b1107b6..02f82e9ed5 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -5,7 +5,7 @@ # Copyright (c) 2007 Lars Hjemli dashless=$(basename "$0" | sed -e 's/-/ /') -USAGE="[--quiet] add [-b branch] [-f|--force] [--reference ] [--] [] +USAGE="[--quiet] add [-b ] [-f|--force] [--reference ] [--] [] or: $dashless [--quiet] status [--cached] [--recursive] [--] [...] or: $dashless [--quiet] init [--] [...] or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference ] [--merge] [--recursive] [--] [...] diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 10ed9e51a5..e8812fa2b9 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -270,16 +270,15 @@ sub evaluate_uri { our %highlight_ext = ( # main extensions, defining name of syntax; # see files in /usr/share/highlight/langDefs/ directory - map { $_ => $_ } - qw(py c cpp rb java css php sh pl js tex bib xml awk bat ini spec tcl sql make), + (map { $_ => $_ } qw(py rb java css js tex bib xml awk bat ini spec tcl sql)), # alternate extensions, see /etc/highlight/filetypes.conf - 'h' => 'c', - map { $_ => 'sh' } qw(bash zsh ksh), - map { $_ => 'cpp' } qw(cxx c++ cc), - map { $_ => 'php' } qw(php3 php4 php5 phps), - map { $_ => 'pl' } qw(perl pm), # perhaps also 'cgi' - map { $_ => 'make'} qw(mak mk), - map { $_ => 'xml' } qw(xhtml html htm), + (map { $_ => 'c' } qw(c h)), + (map { $_ => 'sh' } qw(sh bash zsh ksh)), + (map { $_ => 'cpp' } qw(cpp cxx c++ cc)), + (map { $_ => 'php' } qw(php php3 php4 php5 phps)), + (map { $_ => 'pl' } qw(pl perl pm)), # perhaps also 'cgi' + (map { $_ => 'make'} qw(make mak mk)), + (map { $_ => 'xml' } qw(xml xhtml html htm)), ); # You define site-wide feature defaults here; override them with @@ -8055,6 +8054,7 @@ sub git_feed { $feed_type = 'history'; } $title .= " $feed_type"; + $title = esc_html($title); my $descr = git_get_project_description($project); if (defined $descr) { $descr = esc_html($descr); diff --git a/grep.c b/grep.c index edc7776677..4bd1b8b1dd 100644 --- a/grep.c +++ b/grep.c @@ -6,6 +6,183 @@ static int grep_source_load(struct grep_source *gs); static int grep_source_is_binary(struct grep_source *gs); +static struct grep_opt grep_defaults; + +/* + * Initialize the grep_defaults template with hardcoded defaults. + * We could let the compiler do this, but without C99 initializers + * the code gets unwieldy and unreadable, so... + */ +void init_grep_defaults(void) +{ + struct grep_opt *opt = &grep_defaults; + static int run_once; + + if (run_once) + return; + run_once++; + + memset(opt, 0, sizeof(*opt)); + opt->relative = 1; + opt->pathname = 1; + opt->regflags = REG_NEWLINE; + opt->max_depth = -1; + opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED; + opt->extended_regexp_option = 0; + strcpy(opt->color_context, ""); + strcpy(opt->color_filename, ""); + strcpy(opt->color_function, ""); + strcpy(opt->color_lineno, ""); + strcpy(opt->color_match, GIT_COLOR_BOLD_RED); + strcpy(opt->color_selected, ""); + strcpy(opt->color_sep, GIT_COLOR_CYAN); + opt->color = -1; +} + +static int parse_pattern_type_arg(const char *opt, const char *arg) +{ + if (!strcmp(arg, "default")) + return GREP_PATTERN_TYPE_UNSPECIFIED; + else if (!strcmp(arg, "basic")) + return GREP_PATTERN_TYPE_BRE; + else if (!strcmp(arg, "extended")) + return GREP_PATTERN_TYPE_ERE; + else if (!strcmp(arg, "fixed")) + return GREP_PATTERN_TYPE_FIXED; + else if (!strcmp(arg, "perl")) + return GREP_PATTERN_TYPE_PCRE; + die("bad %s argument: %s", opt, arg); +} + +/* + * Read the configuration file once and store it in + * the grep_defaults template. + */ +int grep_config(const char *var, const char *value, void *cb) +{ + struct grep_opt *opt = &grep_defaults; + char *color = NULL; + + if (userdiff_config(var, value) < 0) + return -1; + + if (!strcmp(var, "grep.extendedregexp")) { + if (git_config_bool(var, value)) + opt->extended_regexp_option = 1; + else + opt->extended_regexp_option = 0; + return 0; + } + + if (!strcmp(var, "grep.patterntype")) { + opt->pattern_type_option = parse_pattern_type_arg(var, value); + return 0; + } + + if (!strcmp(var, "grep.linenumber")) { + opt->linenum = git_config_bool(var, value); + return 0; + } + + if (!strcmp(var, "color.grep")) + opt->color = git_config_colorbool(var, value); + else if (!strcmp(var, "color.grep.context")) + color = opt->color_context; + else if (!strcmp(var, "color.grep.filename")) + color = opt->color_filename; + else if (!strcmp(var, "color.grep.function")) + color = opt->color_function; + else if (!strcmp(var, "color.grep.linenumber")) + color = opt->color_lineno; + else if (!strcmp(var, "color.grep.match")) + color = opt->color_match; + else if (!strcmp(var, "color.grep.selected")) + color = opt->color_selected; + else if (!strcmp(var, "color.grep.separator")) + color = opt->color_sep; + + if (color) { + if (!value) + return config_error_nonbool(var); + color_parse(value, var, color); + } + return 0; +} + +/* + * Initialize one instance of grep_opt and copy the + * default values from the template we read the configuration + * information in an earlier call to git_config(grep_config). + */ +void grep_init(struct grep_opt *opt, const char *prefix) +{ + struct grep_opt *def = &grep_defaults; + + memset(opt, 0, sizeof(*opt)); + opt->prefix = prefix; + opt->prefix_length = (prefix && *prefix) ? strlen(prefix) : 0; + opt->pattern_tail = &opt->pattern_list; + opt->header_tail = &opt->header_list; + + opt->color = def->color; + opt->extended_regexp_option = def->extended_regexp_option; + opt->pattern_type_option = def->pattern_type_option; + opt->linenum = def->linenum; + opt->max_depth = def->max_depth; + opt->pathname = def->pathname; + opt->regflags = def->regflags; + opt->relative = def->relative; + + strcpy(opt->color_context, def->color_context); + strcpy(opt->color_filename, def->color_filename); + strcpy(opt->color_function, def->color_function); + strcpy(opt->color_lineno, def->color_lineno); + strcpy(opt->color_match, def->color_match); + strcpy(opt->color_selected, def->color_selected); + strcpy(opt->color_sep, def->color_sep); +} + +void grep_commit_pattern_type(enum grep_pattern_type pattern_type, struct grep_opt *opt) +{ + if (pattern_type != GREP_PATTERN_TYPE_UNSPECIFIED) + grep_set_pattern_type_option(pattern_type, opt); + else if (opt->pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED) + grep_set_pattern_type_option(opt->pattern_type_option, opt); + else if (opt->extended_regexp_option) + grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, opt); +} + +void grep_set_pattern_type_option(enum grep_pattern_type pattern_type, struct grep_opt *opt) +{ + switch (pattern_type) { + case GREP_PATTERN_TYPE_UNSPECIFIED: + /* fall through */ + + case GREP_PATTERN_TYPE_BRE: + opt->fixed = 0; + opt->pcre = 0; + opt->regflags &= ~REG_EXTENDED; + break; + + case GREP_PATTERN_TYPE_ERE: + opt->fixed = 0; + opt->pcre = 0; + opt->regflags |= REG_EXTENDED; + break; + + case GREP_PATTERN_TYPE_FIXED: + opt->fixed = 1; + opt->pcre = 0; + opt->regflags &= ~REG_EXTENDED; + break; + + case GREP_PATTERN_TYPE_PCRE: + opt->fixed = 0; + opt->pcre = 1; + opt->regflags &= ~REG_EXTENDED; + break; + } +} static struct grep_pat *create_grep_pat(const char *pat, size_t patlen, const char *origin, int no, @@ -1373,7 +1550,7 @@ int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size) struct grep_source gs; int r; - grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL); + grep_source_init(&gs, GREP_SOURCE_BUF, NULL, NULL, NULL); gs.buf = buf; gs.size = size; @@ -1384,10 +1561,12 @@ int grep_buffer(struct grep_opt *opt, char *buf, unsigned long size) } void grep_source_init(struct grep_source *gs, enum grep_source_type type, - const char *name, const void *identifier) + const char *name, const char *path, + const void *identifier) { gs->type = type; gs->name = name ? xstrdup(name) : NULL; + gs->path = path ? xstrdup(path) : NULL; gs->buf = NULL; gs->size = 0; gs->driver = NULL; @@ -1409,6 +1588,8 @@ void grep_source_clear(struct grep_source *gs) { free(gs->name); gs->name = NULL; + free(gs->path); + gs->path = NULL; free(gs->identifier); gs->identifier = NULL; grep_source_clear_data(gs); @@ -1501,7 +1682,8 @@ void grep_source_load_driver(struct grep_source *gs) return; grep_attr_lock(); - gs->driver = userdiff_find_by_path(gs->name); + if (gs->path) + gs->driver = userdiff_find_by_path(gs->path); if (!gs->driver) gs->driver = userdiff_find_by_name("default"); grep_attr_unlock(); diff --git a/grep.h b/grep.h index c256ac6e15..8fc854f400 100644 --- a/grep.h +++ b/grep.h @@ -138,6 +138,12 @@ struct grep_opt { void *output_priv; }; +extern void init_grep_defaults(void); +extern int grep_config(const char *var, const char *value, void *); +extern void grep_init(struct grep_opt *, const char *prefix); +void grep_set_pattern_type_option(enum grep_pattern_type, struct grep_opt *opt); +void grep_commit_pattern_type(enum grep_pattern_type, struct grep_opt *opt); + extern void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t); extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t); extern void append_header_grep_pattern(struct grep_opt *, enum grep_header_field, const char *); @@ -158,11 +164,13 @@ struct grep_source { char *buf; unsigned long size; + char *path; /* for attribute lookups */ struct userdiff_driver *driver; }; void grep_source_init(struct grep_source *gs, enum grep_source_type type, - const char *name, const void *identifier); + const char *name, const char *path, + const void *identifier); void grep_source_clear_data(struct grep_source *gs); void grep_source_clear(struct grep_source *gs); void grep_source_load_driver(struct grep_source *gs); diff --git a/http.c b/http.c index df9bb71086..f9a9de1416 100644 --- a/http.c +++ b/http.c @@ -631,6 +631,18 @@ void run_active_slot(struct active_request_slot *slot) FD_ZERO(&excfds); curl_multi_fdset(curlm, &readfds, &writefds, &excfds, &max_fd); + /* + * It can happen that curl_multi_timeout returns a pathologically + * long timeout when curl_multi_fdset returns no file descriptors + * to read. See commit message for more details. + */ + if (max_fd < 0 && + (select_timeout.tv_sec > 0 || + select_timeout.tv_usec > 50000)) { + select_timeout.tv_sec = 0; + select_timeout.tv_usec = 50000; + } + select(max_fd+1, &readfds, &writefds, &excfds, &select_timeout); } } diff --git a/mailmap.c b/mailmap.c index 47aa419245..ea4b471ede 100644 --- a/mailmap.c +++ b/mailmap.c @@ -118,7 +118,7 @@ static char *parse_name_and_email(char *buffer, char **name, while (isspace(*nstart) && nstart < left) ++nstart; nend = left-1; - while (isspace(*nend) && nend > nstart) + while (nend > nstart && isspace(*nend)) --nend; *name = (nstart < nend ? nstart : NULL); diff --git a/mergetools/p4merge b/mergetools/p4merge index 1a45c1b0c5..295361a8aa 100644 --- a/mergetools/p4merge +++ b/mergetools/p4merge @@ -1,5 +1,30 @@ diff_cmd () { + # p4merge does not like /dev/null + rm_local= + rm_remote= + if test "/dev/null" = "$LOCAL" + then + LOCAL="./p4merge-dev-null.LOCAL.$$" + >"$LOCAL" + rm_local=true + fi + if test "/dev/null" = "$REMOTE" + then + REMOTE="./p4merge-dev-null.REMOTE.$$" + >"$REMOTE" + rm_remote=true + fi + "$merge_tool_path" "$LOCAL" "$REMOTE" + + if test -n "$rm_local" + then + rm -f "$LOCAL" + fi + if test -n "$rm_remote" + then + rm -f "$REMOTE" + fi } merge_cmd () { diff --git a/notes.c b/notes.c index bc454e1eab..ee8f01f1d5 100644 --- a/notes.c +++ b/notes.c @@ -1231,7 +1231,7 @@ static void format_note(struct notes_tree *t, const unsigned char *object_sha1, } if (output_encoding && *output_encoding && - strcmp(utf8, output_encoding)) { + !is_encoding_utf8(output_encoding)) { char *reencoded = reencode_string(msg, output_encoding, utf8); if (reencoded) { free(msg); diff --git a/po/sv.po b/po/sv.po index 7ce7e581d9..9b3aa744bc 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: git 1.7.12\n" "Report-Msgid-Bugs-To: Git Mailing List \n" -"POT-Creation-Date: 2012-09-15 10:21+0800\n" -"PO-Revision-Date: 2012-10-02 08:15+0100\n" +"POT-Creation-Date: 2012-10-16 08:38+0800\n" +"PO-Revision-Date: 2012-10-16 08:36+0100\n" "Last-Translator: Peter Krefting \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -73,12 +73,11 @@ msgstr "prefix" msgid "prepend prefix to each pathname in the archive" msgstr "lägg till prefix till varje sökväg i arkivet" -# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e. -#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332 -#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642 -#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77 -#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537 -#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149 +#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2389 +#: builtin/blame.c:2390 builtin/config.c:56 builtin/fast-export.c:642 +#: builtin/fast-export.c:644 builtin/grep.c:801 builtin/hash-object.c:77 +#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:540 +#: builtin/notes.c:697 builtin/read-tree.c:107 parse-options.h:149 msgid "file" msgstr "fil" @@ -118,7 +117,7 @@ msgstr "arkiv" msgid "retrieve the archive from remote repository " msgstr "hämta arkivet frÃ¥n fjärrarkivet " -#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616 +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:619 msgid "command" msgstr "kommando" @@ -136,7 +135,7 @@ msgstr "'%s' ser inte ut som en v2-bundle-fil" msgid "unrecognized header: %s%s (%d)" msgstr "okänt huvud: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:714 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" msgstr "kunde inte öppna \"%s\"" @@ -145,7 +144,7 @@ msgstr "kunde inte öppna \"%s\"" msgid "Repository lacks these prerequisite commits:" msgstr "Arkivet saknar dessa nödvändiga incheckningar:" -#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290 +#: bundle.c:164 sequencer.c:562 sequencer.c:994 builtin/log.c:290 #: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347 #: builtin/shortlog.c:181 msgid "revision walk setup failed" @@ -204,12 +203,12 @@ msgstr "kan inte skapa \"%s\"" msgid "index-pack died" msgstr "index-pack dog" -#: commit.c:48 +#: commit.c:50 #, c-format msgid "could not parse %s" msgstr "kunde inte tolka %s" -#: commit.c:50 +#: commit.c:52 #, c-format msgid "%s %s is not a commit!" msgstr "%s %s är inte en incheckning!" @@ -318,32 +317,7 @@ msgstr "" "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n" "%s" -#: diff.c:1401 -msgid " 0 files changed" -msgstr " 0 filer ändrade" - -#: diff.c:1405 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] " %d fil ändrad" -msgstr[1] " %d filer ändrade" - -#: diff.c:1422 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] ", %d tillägg(+)" -msgstr[1] ", %d tillägg(+)" - -#: diff.c:1433 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] ", %d borttagning(-)" -msgstr[1] ", %d borttagningar(-)" - -#: diff.c:3460 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -364,17 +338,17 @@ msgstr "gpg godtog inte data" msgid "gpg failed to sign the data" msgstr "gpg misslyckades signera data" -#: grep.c:1320 +#: grep.c:1441 #, c-format msgid "'%s': unable to read %s" msgstr "\"%s\" kunde inte läsa %s" -#: grep.c:1337 +#: grep.c:1458 #, c-format msgid "'%s': %s" msgstr "\"%s\": %s" -#: grep.c:1348 +#: grep.c:1469 #, c-format msgid "'%s': short read %s" msgstr "\"%s\": kort läsning %s" @@ -741,19 +715,19 @@ msgstr[1] "" "Din gren och \"%s\" har divergerat,\n" "och har %d respektive %d olika incheckningar.\n" -#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977 +#: sequencer.c:123 builtin/merge.c:864 builtin/merge.c:977 #: builtin/merge.c:1087 builtin/merge.c:1097 #, c-format msgid "Could not open '%s' for writing" msgstr "Kunde inte öppna \"%s\" för skrivning" -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867 +#: sequencer.c:125 builtin/merge.c:333 builtin/merge.c:867 #: builtin/merge.c:1089 builtin/merge.c:1102 #, c-format msgid "Could not write to '%s'" msgstr "Kunde inte skriva till \"%s\"" -#: sequencer.c:144 +#: sequencer.c:146 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add ' or 'git rm '" @@ -761,7 +735,7 @@ msgstr "" "efter att ha löst konflikterna, markera de rättade sökvägarna\n" "med \"git add \" eller \"git rm \"" -#: sequencer.c:147 +#: sequencer.c:149 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add ' or 'git rm '\n" @@ -771,214 +745,214 @@ msgstr "" "med \"git add \" eller \"git rm \"\n" "och checka in resultatet med \"git commit\"" -#: sequencer.c:160 sequencer.c:765 sequencer.c:848 +#: sequencer.c:162 sequencer.c:770 sequencer.c:853 #, c-format msgid "Could not write to %s" msgstr "Kunde inte skriva till %s" -#: sequencer.c:163 +#: sequencer.c:165 #, c-format msgid "Error wrapping up %s" msgstr "Fel vid ombrytning av %s" -#: sequencer.c:178 +#: sequencer.c:180 msgid "Your local changes would be overwritten by cherry-pick." msgstr "Dina lokala ändringar skulle skrivas över av \"cherry-pick\"." -#: sequencer.c:180 +#: sequencer.c:182 msgid "Your local changes would be overwritten by revert." msgstr "Dina lokala ändringar skulle skrivas över av \"revert\"." -#: sequencer.c:183 +#: sequencer.c:185 msgid "Commit your changes or stash them to proceed." msgstr "Checka in dina ändringar eller använd \"stash\" för att fortsätta." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:233 +#: sequencer.c:235 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Kunde inte skriva ny indexfil" -#: sequencer.c:261 +#: sequencer.c:266 msgid "Could not resolve HEAD commit\n" msgstr "Kunde inte bestämma HEAD:s incheckning\n" -#: sequencer.c:282 +#: sequencer.c:287 msgid "Unable to update cache tree\n" msgstr "Kan inte uppdatera cacheträd\n" -#: sequencer.c:327 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "Kunde inte tolka incheckningen %s\n" -#: sequencer.c:332 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Kunde inte tolka föräldraincheckningen %s\n" -#: sequencer.c:398 +#: sequencer.c:403 msgid "Your index file is unmerged." msgstr "Din indexfil har inte slagits ihop." -#: sequencer.c:401 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "Du har ingen giltig HEAD" -#: sequencer.c:416 +#: sequencer.c:421 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "Incheckning %s är en sammanslagning, men flaggan -m angavs inte." -#: sequencer.c:424 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "Incheckning %s har inte förälder %d" -#: sequencer.c:428 +#: sequencer.c:433 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:439 +#: sequencer.c:444 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kan inte tolka föräldraincheckningen %s" -#: sequencer.c:443 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "Kan inte hämta incheckningsmeddelande för %s" -#: sequencer.c:527 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "kunde inte Ã¥ngra %s... %s" -#: sequencer.c:528 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "kunde inte tillämpa %s... %s" -#: sequencer.c:560 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "den angivna uppsättningen incheckningar är tom" -#: sequencer.c:568 +#: sequencer.c:573 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: misslyckades läsa indexet" -#: sequencer.c:573 +#: sequencer.c:578 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: misslyckades uppdatera indexet" -#: sequencer.c:631 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "kan inte %s under en %s" -#: sequencer.c:653 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "Kan inte tolka rad %d." -#: sequencer.c:658 +#: sequencer.c:663 msgid "No commits parsed." msgstr "Inga incheckningar lästes." -#: sequencer.c:671 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "Kunde inte öppna %s" -#: sequencer.c:675 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "kunde inte läsa %s." -#: sequencer.c:682 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Oanvändbart manus: %s" -#: sequencer.c:710 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "Felaktig nyckel: %s" -#: sequencer.c:713 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "Felaktigt värde för %s: %s" -#: sequencer.c:725 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "Trasigt manus: %s" -#: sequencer.c:746 +#: sequencer.c:751 msgid "a cherry-pick or revert is already in progress" msgstr "en \"cherry-pick\" eller \"revert\" pÃ¥gÃ¥r redan" -#: sequencer.c:747 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:751 +#: sequencer.c:756 #, c-format msgid "Could not create sequencer directory %s" msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\"" -#: sequencer.c:767 sequencer.c:852 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "Fel vid ombrytning av %s." -#: sequencer.c:786 sequencer.c:920 +#: sequencer.c:791 sequencer.c:925 msgid "no cherry-pick or revert in progress" msgstr "ingen \"cherry-pick\" eller \"revert\" pÃ¥gÃ¥r" -#: sequencer.c:788 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "kan inte bestämma HEAD" -#: sequencer.c:790 +#: sequencer.c:795 msgid "cannot abort from a branch yet to be born" msgstr "kan inte avbryta frÃ¥n en gren som ännu inte är född" -#: sequencer.c:812 builtin/apply.c:4005 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "kan inte öppna %s: %s" -#: sequencer.c:815 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "kan inte läsa %s: %s" -#: sequencer.c:816 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "oväntat filslut" -#: sequencer.c:822 +#: sequencer.c:827 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "sparad HEAD-fil frÃ¥n före \"cherry-pick\", \"%s\", är trasig" -#: sequencer.c:845 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "Kunde inte formatera %s." -#: sequencer.c:1007 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "Kan inte Ã¥ngra som första incheckning" -#: sequencer.c:1008 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud" @@ -1374,7 +1348,7 @@ msgstr "git add [flaggor] [--] ..." msgid "unexpected diff status %c" msgstr "diff-status %c förväntades inte" -#: builtin/add.c:67 builtin/commit.c:229 +#: builtin/add.c:67 builtin/commit.c:230 msgid "updating files failed" msgstr "misslyckades uppdatera filer" @@ -1439,7 +1413,7 @@ msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n" msgid "dry run" msgstr "testkörning" -#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187 +#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1154 #: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477 #: builtin/mv.c:62 builtin/read-tree.c:112 msgid "be verbose" @@ -1516,7 +1490,7 @@ msgstr "Inget angivet, inget tillagt.\n" msgid "Maybe you wanted to say 'git add .'?\n" msgstr "Kanske menade du att skriva \"git add .\"?\n" -#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82 +#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:290 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "indexfilen trasig" @@ -2057,95 +2031,95 @@ msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil" msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)" -#: builtin/blame.c:2316 +#: builtin/blame.c:2373 msgid "Show blame entries as we find them, incrementally" msgstr "Visa klandringsposter när vi hittar dem, interaktivt" -#: builtin/blame.c:2317 +#: builtin/blame.c:2374 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)" -#: builtin/blame.c:2318 +#: builtin/blame.c:2375 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "Behandla inte rotincheckningar som gränser (Standard: av)" -#: builtin/blame.c:2319 +#: builtin/blame.c:2376 msgid "Show work cost statistics" msgstr "Visa statistik över arbetskostnad" -#: builtin/blame.c:2320 +#: builtin/blame.c:2377 msgid "Show output score for blame entries" msgstr "Visa utdatapoäng för klandringsposter" -#: builtin/blame.c:2321 +#: builtin/blame.c:2378 msgid "Show original filename (Default: auto)" msgstr "Visa originalfilnamn (Standard: auto)" -#: builtin/blame.c:2322 +#: builtin/blame.c:2379 msgid "Show original linenumber (Default: off)" msgstr "Visa ursprungligt radnummer (Standard: av)" -#: builtin/blame.c:2323 +#: builtin/blame.c:2380 msgid "Show in a format designed for machine consumption" msgstr "Visa i ett format avsett för maskinkonsumtion" -#: builtin/blame.c:2324 +#: builtin/blame.c:2381 msgid "Show porcelain format with per-line commit information" msgstr "Visa porslinsformat med per-rad-incheckningsinformation" -#: builtin/blame.c:2325 +#: builtin/blame.c:2382 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "Använd samma utdataläge som git-annotate (Standard: av)" -#: builtin/blame.c:2326 +#: builtin/blame.c:2383 msgid "Show raw timestamp (Default: off)" msgstr "Visa rÃ¥ tidsstämpel (Standard: av)" -#: builtin/blame.c:2327 +#: builtin/blame.c:2384 msgid "Show long commit SHA1 (Default: off)" msgstr "Visa lÃ¥ng inchecknings-SHA1 (Standard: av)" -#: builtin/blame.c:2328 +#: builtin/blame.c:2385 msgid "Suppress author name and timestamp (Default: off)" msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)" -#: builtin/blame.c:2329 +#: builtin/blame.c:2386 msgid "Show author email instead of name (Default: off)" msgstr "Visa författarens e-post istället för namn (Standard: av)" -#: builtin/blame.c:2330 +#: builtin/blame.c:2387 msgid "Ignore whitespace differences" msgstr "Ignorera ändringar i blanksteg" -#: builtin/blame.c:2331 +#: builtin/blame.c:2388 msgid "Spend extra cycles to find better match" msgstr "Slösa extra cykler med att hitta bättre träff" -#: builtin/blame.c:2332 +#: builtin/blame.c:2389 msgid "Use revisions from instead of calling git-rev-list" msgstr "Använd revisioner frÃ¥n istället för att anropa git-rev-list" -#: builtin/blame.c:2333 +#: builtin/blame.c:2390 msgid "Use 's contents as the final image" msgstr "Använd s innehÃ¥ll som slutgiltig bild" -#: builtin/blame.c:2334 builtin/blame.c:2335 +#: builtin/blame.c:2391 builtin/blame.c:2392 msgid "score" msgstr "poäng" -#: builtin/blame.c:2334 +#: builtin/blame.c:2391 msgid "Find line copies within and across files" msgstr "Hitta kopierade rader inuti och mellan filer" -#: builtin/blame.c:2335 +#: builtin/blame.c:2392 msgid "Find line movements within and across files" msgstr "Hitta flyttade rader inuti och mellan filer" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "Process only line range n,m, counting from 1" msgstr "Behandla endast radintervallet n,m, med början pÃ¥ 1" @@ -2354,8 +2328,8 @@ msgid "act on remote-tracking branches" msgstr "arbeta pÃ¥ fjärrspÃ¥rande grenar" #: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765 -#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396 -#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470 +#: builtin/branch.c:771 builtin/commit.c:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 msgid "commit" msgstr "incheckning" @@ -2531,8 +2505,8 @@ msgid "git check-attr [-a | --all | attr...] [--] pathname..." msgstr "git check-attr [-a | --all | attr...] [--] sökväg..." #: builtin/check-attr.c:12 -msgid "git check-attr --stdin [-a | --all | attr...] < " -msgstr "git check-attr --stdin [-a | --all | attr...] < " +msgid "git check-attr --stdin [-z] [-a | --all | attr...] < " +msgstr "git check-attr --stdin [-z] [-a | --all | attr...] < " #: builtin/check-attr.c:19 msgid "report all attributes set on file" @@ -2912,7 +2886,7 @@ msgstr "tvinga" msgid "remove whole directories" msgstr "ta bort hela kataloger" -#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802 +#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:803 #: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199 msgid "pattern" msgstr "mönster" @@ -3038,7 +3012,7 @@ msgstr "checka ut istället för fjärrens HEAD" msgid "path to git-upload-pack on the remote" msgstr "sökväg till git-upload-pack pÃ¥ fjärren" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747 +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:748 msgid "depth" msgstr "djup" @@ -3116,69 +3090,69 @@ msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" "HEAD hos fjärren pekar pÃ¥ en obefintlig referens, kan inte checka ut.\n" -#: builtin/clone.c:642 +#: builtin/clone.c:690 msgid "Too many arguments." msgstr "För mÃ¥nga argument." -#: builtin/clone.c:646 +#: builtin/clone.c:694 msgid "You must specify a repository to clone." msgstr "Du mÃ¥ste ange ett arkiv att klona." -#: builtin/clone.c:657 +#: builtin/clone.c:705 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "flaggorna --bare och --origin %s är inkompatibla." -#: builtin/clone.c:671 +#: builtin/clone.c:719 #, c-format msgid "repository '%s' does not exist" msgstr "arkivet \"%s\" finns inte" -#: builtin/clone.c:676 +#: builtin/clone.c:724 msgid "--depth is ignored in local clones; use file:// instead." msgstr "--depth ignoreras i lokala kloningar; använd file:// istället" -#: builtin/clone.c:686 +#: builtin/clone.c:734 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "destinationssökvägen \"%s\" finns redan och är inte en tom katalog." -#: builtin/clone.c:696 +#: builtin/clone.c:744 #, c-format msgid "working tree '%s' already exists." msgstr "arbetsträdet \"%s\" finns redan." -#: builtin/clone.c:709 builtin/clone.c:723 +#: builtin/clone.c:757 builtin/clone.c:771 #, c-format msgid "could not create leading directories of '%s'" msgstr "kunde inte skapa inledande kataloger för \"%s\"" -#: builtin/clone.c:712 +#: builtin/clone.c:760 #, c-format msgid "could not create work tree dir '%s'." msgstr "kunde inte skapa arbetskatalogen \"%s\"" -#: builtin/clone.c:731 +#: builtin/clone.c:779 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Klonar till ett naket arkiv \"%s\"...\n" -#: builtin/clone.c:733 +#: builtin/clone.c:781 #, c-format msgid "Cloning into '%s'...\n" msgstr "Klonar till \"%s\"...\n" -#: builtin/clone.c:789 +#: builtin/clone.c:823 #, c-format msgid "Don't know how to clone %s" msgstr "Vet inte hur man klonar %s" -#: builtin/clone.c:838 +#: builtin/clone.c:872 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Fjärrgrenen %s hittades inte i uppströmsarkivet %s" -#: builtin/clone.c:845 +#: builtin/clone.c:879 msgid "You appear to have cloned an empty repository." msgstr "Du verkar ha klonat ett tomt arkiv." @@ -3214,15 +3188,15 @@ msgstr "Spaltfyllnad mellan spalter" msgid "--command must be the first argument" msgstr "--command mÃ¥ste vara första argument" -#: builtin/commit.c:33 +#: builtin/commit.c:34 msgid "git commit [options] [--] ..." msgstr "git commit [flaggor] [--] ..." -#: builtin/commit.c:38 +#: builtin/commit.c:39 msgid "git status [options] [--] ..." msgstr "git status [flaggor] [--] ..." -#: builtin/commit.c:43 +#: builtin/commit.c:44 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3247,7 +3221,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:55 +#: builtin/commit.c:56 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -3257,7 +3231,7 @@ msgstr "" "blir den tom. Du kan köra kommandot pÃ¥ nytt med --allow-empty, eller\n" "sÃ¥ kan du ta bort incheckningen helt med \"git reset HEAD^\".\n" -#: builtin/commit.c:60 +#: builtin/commit.c:61 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3273,93 +3247,93 @@ msgstr "" "\n" "Annars använder du \"git reset\"\n" -#: builtin/commit.c:256 +#: builtin/commit.c:257 msgid "failed to unpack HEAD tree object" msgstr "misslyckades packa upp HEAD:s trädobjekt" -#: builtin/commit.c:298 +#: builtin/commit.c:299 msgid "unable to create temporary index" msgstr "kunde inte skapa temporär indexfil" -#: builtin/commit.c:304 +#: builtin/commit.c:305 msgid "interactive add failed" msgstr "interaktiv tilläggning misslyckades" -#: builtin/commit.c:337 builtin/commit.c:358 builtin/commit.c:408 +#: builtin/commit.c:338 builtin/commit.c:359 builtin/commit.c:409 msgid "unable to write new_index file" msgstr "kunde inte skriva filen new_index" -#: builtin/commit.c:389 +#: builtin/commit.c:390 msgid "cannot do a partial commit during a merge." msgstr "kan inte utföra en delvis incheckning under en sammanslagning." -#: builtin/commit.c:391 +#: builtin/commit.c:392 msgid "cannot do a partial commit during a cherry-pick." msgstr "kan inte utföra en delvis incheckning under en cherry-pick." -#: builtin/commit.c:401 +#: builtin/commit.c:402 msgid "cannot read the index" msgstr "kan inte läsa indexet" -#: builtin/commit.c:421 +#: builtin/commit.c:422 msgid "unable to write temporary index file" msgstr "kunde inte skriva temporär indexfil" -#: builtin/commit.c:510 builtin/commit.c:516 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "felaktig incheckning: %s" -#: builtin/commit.c:539 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "felformad \"--author\"-flagga" -#: builtin/commit.c:600 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" msgstr "Felaktig indragningssträng: \"%s\"" -#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985 +#: builtin/commit.c:596 builtin/commit.c:629 builtin/commit.c:952 #, c-format msgid "could not lookup commit %s" msgstr "kunde inte slÃ¥ upp incheckningen %s" -#: builtin/commit.c:650 builtin/shortlog.c:296 +#: builtin/commit.c:608 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(läser loggmeddelande frÃ¥n standard in)\n" -#: builtin/commit.c:652 +#: builtin/commit.c:610 msgid "could not read log from standard input" msgstr "kunde inte läsa logg frÃ¥n standard in" -#: builtin/commit.c:656 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" msgstr "kunde inte läsa loggfilen \"%s\"" -#: builtin/commit.c:662 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "incheckningen har ett tomt meddelande" -#: builtin/commit.c:678 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "kunde inte läsa MERGE_MSG" -#: builtin/commit.c:682 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "kunde inte läsa SQUASH_MSG" -#: builtin/commit.c:686 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/commit.c:738 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "kunde inte skriva incheckningsmall" -#: builtin/commit.c:749 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -3374,7 +3348,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:754 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -3389,7 +3363,7 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:766 +#: builtin/commit.c:733 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" @@ -3397,7 +3371,7 @@ msgstr "" "Ange incheckningsmeddelandet för dina ändringar. Rader som inleds\n" "med \"#\" kommer ignoreras, och ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:771 +#: builtin/commit.c:738 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" @@ -3407,131 +3381,131 @@ msgstr "" "med \"#\" kommer behÃ¥llas; du kan själv ta bort dem om du vill.\n" "Ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:784 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "%sFörfattare: %s" -#: builtin/commit.c:791 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "%sIncheckare: %s" -#: builtin/commit.c:811 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "Kan inte läsa indexet" -#: builtin/commit.c:848 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "Fel vid byggande av träd" -#: builtin/commit.c:863 builtin/tag.c:361 +#: builtin/commit.c:830 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Ange meddelandet en av flaggorna -m eller -F.\n" -#: builtin/commit.c:960 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" msgstr "Hittade ingen befintlig författare med \"%s\"" -#: builtin/commit.c:975 builtin/commit.c:1175 +#: builtin/commit.c:942 builtin/commit.c:1142 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Ogiltigt läge för ospÃ¥rade filer: \"%s\"" -#: builtin/commit.c:1015 +#: builtin/commit.c:982 msgid "Using both --reset-author and --author does not make sense" msgstr "Kan inte använda bÃ¥de --reset-author och --author" -#: builtin/commit.c:1026 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "Du har inget att utöka." -#: builtin/commit.c:1029 +#: builtin/commit.c:996 msgid "You are in the middle of a merge -- cannot amend." msgstr "Du är i mitten av en sammanslagning -- kan inte utöka." -#: builtin/commit.c:1031 +#: builtin/commit.c:998 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "Du är i mitten av en cherry-pick -- kan inte utöka." -#: builtin/commit.c:1034 +#: builtin/commit.c:1001 msgid "Options --squash and --fixup cannot be used together" msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt" -#: builtin/commit.c:1044 +#: builtin/commit.c:1011 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Endast en av -c/-C/-F/--fixup kan användas." -#: builtin/commit.c:1046 +#: builtin/commit.c:1013 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup." -#: builtin/commit.c:1054 +#: builtin/commit.c:1021 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author kan endast användas med -C, -c eller --amend." -#: builtin/commit.c:1071 +#: builtin/commit.c:1038 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Endast en av --include/--only/--all/--interactive/--patch kan användas." -#: builtin/commit.c:1073 +#: builtin/commit.c:1040 msgid "No paths with --include/--only does not make sense." msgstr "Du mÃ¥ste ange sökvägar tillsammans med --include/--only." -#: builtin/commit.c:1075 +#: builtin/commit.c:1042 msgid "Clever... amending the last one with dirty index." msgstr "Smart... utöka den senaste med smutsigt index." -#: builtin/commit.c:1077 +#: builtin/commit.c:1044 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..." -#: builtin/commit.c:1087 builtin/tag.c:577 +#: builtin/commit.c:1054 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "Felaktigt städningsläge %s" -#: builtin/commit.c:1092 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "Kan inte ange sökvägar med -a." -#: builtin/commit.c:1189 builtin/commit.c:1417 +#: builtin/commit.c:1156 builtin/commit.c:1384 msgid "show status concisely" msgstr "vis koncis status" -#: builtin/commit.c:1191 builtin/commit.c:1419 +#: builtin/commit.c:1158 builtin/commit.c:1386 msgid "show branch information" msgstr "visa information om gren" -#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389 +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 msgid "machine-readable output" msgstr "maskinläsbar utdata" -#: builtin/commit.c:1196 builtin/commit.c:1423 +#: builtin/commit.c:1163 builtin/commit.c:1390 msgid "terminate entries with NUL" msgstr "terminera poster med NUL" -#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636 +#: builtin/commit.c:1165 builtin/commit.c:1393 builtin/fast-export.c:636 #: builtin/fast-export.c:639 builtin/tag.c:461 msgid "mode" msgstr "läge" -#: builtin/commit.c:1199 builtin/commit.c:1426 +#: builtin/commit.c:1166 builtin/commit.c:1393 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "visa ospÃ¥rade filer, valfria lägen: alla, normal, no. (Standard: all)" -#: builtin/commit.c:1202 +#: builtin/commit.c:1169 msgid "show ignored files" msgstr "visa ignorerade filer" -#: builtin/commit.c:1203 parse-options.h:151 +#: builtin/commit.c:1170 parse-options.h:151 msgid "when" msgstr "när" -#: builtin/commit.c:1204 +#: builtin/commit.c:1171 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -3539,217 +3513,217 @@ msgstr "" "ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. " "(Default: all)" -#: builtin/commit.c:1206 +#: builtin/commit.c:1173 msgid "list untracked files in columns" msgstr "visa ospÃ¥rade filer i spalter" -#: builtin/commit.c:1275 +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "kunde inte slÃ¥ upp en precis skapad incheckning" -#: builtin/commit.c:1277 +#: builtin/commit.c:1244 msgid "could not parse newly created commit" msgstr "kunde inte tolka en precis skapad incheckning" -#: builtin/commit.c:1318 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "frÃ¥nkopplad HEAD" -#: builtin/commit.c:1320 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr " (rotincheckning)" -#: builtin/commit.c:1387 +#: builtin/commit.c:1354 msgid "suppress summary after successful commit" msgstr "undertryck sammanfattning efter framgÃ¥ngsrik incheckning" -#: builtin/commit.c:1388 +#: builtin/commit.c:1355 msgid "show diff in commit message template" msgstr "visa diff i mallen för incheckningsmeddelandet" -#: builtin/commit.c:1390 +#: builtin/commit.c:1357 msgid "Commit message options" msgstr "Alternativ för incheckningsmeddelande" -#: builtin/commit.c:1391 builtin/tag.c:459 +#: builtin/commit.c:1358 builtin/tag.c:459 msgid "read message from file" msgstr "läs meddelande frÃ¥n fil" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "author" msgstr "författare" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "override author for commit" msgstr "överstyr författare för incheckningen" -#: builtin/commit.c:1393 builtin/gc.c:178 +#: builtin/commit.c:1360 builtin/gc.c:178 msgid "date" msgstr "datum" -#: builtin/commit.c:1393 +#: builtin/commit.c:1360 msgid "override date for commit" msgstr "överstyr datum för inchecknignen" -#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534 -#: builtin/notes.c:691 builtin/tag.c:457 +#: builtin/commit.c:1361 builtin/merge.c:206 builtin/notes.c:537 +#: builtin/notes.c:694 builtin/tag.c:457 msgid "message" msgstr "meddelande" -#: builtin/commit.c:1394 +#: builtin/commit.c:1361 msgid "commit message" msgstr "incheckningsmeddelande" -#: builtin/commit.c:1395 +#: builtin/commit.c:1362 msgid "reuse and edit message from specified commit" msgstr "Ã¥teranvänd och redigera meddelande frÃ¥n angiven incheckning" -#: builtin/commit.c:1396 +#: builtin/commit.c:1363 msgid "reuse message from specified commit" msgstr "Ã¥teranvänd meddelande frÃ¥n angiven incheckning" -#: builtin/commit.c:1397 +#: builtin/commit.c:1364 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "använd autosquash-formaterat meddelande för att fixa angiven incheckning" -#: builtin/commit.c:1398 +#: builtin/commit.c:1365 msgid "use autosquash formatted message to squash specified commit" msgstr "" "använd autosquash-formaterat meddelande för att slÃ¥ ihop med angiven " "incheckning" -#: builtin/commit.c:1399 +#: builtin/commit.c:1366 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "jag är nu författare av incheckningen (används med -C/-c/--amend)" -#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109 +#: builtin/commit.c:1367 builtin/log.c:1068 builtin/revert.c:109 msgid "add Signed-off-by:" msgstr "lägg till Signed-off-by:" -#: builtin/commit.c:1401 +#: builtin/commit.c:1368 msgid "use specified template file" msgstr "använd angiven mallfil" -#: builtin/commit.c:1402 +#: builtin/commit.c:1369 msgid "force edit of commit" msgstr "tvinga redigering av incheckning" -#: builtin/commit.c:1403 +#: builtin/commit.c:1370 msgid "default" msgstr "standard" -#: builtin/commit.c:1403 builtin/tag.c:462 +#: builtin/commit.c:1370 builtin/tag.c:462 msgid "how to strip spaces and #comments from message" msgstr "hur blanksteg och #kommentarer skall tas bort frÃ¥n meddelande" -#: builtin/commit.c:1404 +#: builtin/commit.c:1371 msgid "include status in commit message template" msgstr "inkludera status i mallen för incheckningsmeddelandet" -#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463 +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 msgid "key id" msgstr "nyckel-id" -#: builtin/commit.c:1406 builtin/merge.c:214 +#: builtin/commit.c:1373 builtin/merge.c:214 msgid "GPG sign commit" msgstr "GPG-signera incheckning" #. end commit message options -#: builtin/commit.c:1409 +#: builtin/commit.c:1376 msgid "Commit contents options" msgstr "Alternativ för incheckningens innehÃ¥ll" -#: builtin/commit.c:1410 +#: builtin/commit.c:1377 msgid "commit all changed files" msgstr "checka in alla ändrade filer" -#: builtin/commit.c:1411 +#: builtin/commit.c:1378 msgid "add specified files to index for commit" msgstr "lägg till angivna filer till indexet för incheckning" -#: builtin/commit.c:1412 +#: builtin/commit.c:1379 msgid "interactively add files" msgstr "lägg till filer interaktivt" -#: builtin/commit.c:1413 +#: builtin/commit.c:1380 msgid "interactively add changes" msgstr "lägg till ändringar interaktivt" -#: builtin/commit.c:1414 +#: builtin/commit.c:1381 msgid "commit only specified files" msgstr "checka endast in angivna filer" -#: builtin/commit.c:1415 +#: builtin/commit.c:1382 msgid "bypass pre-commit hook" msgstr "förbigÃ¥ pre-commit-krok" -#: builtin/commit.c:1416 +#: builtin/commit.c:1383 msgid "show what would be committed" msgstr "visa vad som skulle checkas in" -#: builtin/commit.c:1424 +#: builtin/commit.c:1391 msgid "amend previous commit" msgstr "lägg till föregÃ¥ende incheckning" -#: builtin/commit.c:1425 +#: builtin/commit.c:1392 msgid "bypass post-rewrite hook" msgstr "förbigÃ¥ post-rewrite-krok" -#: builtin/commit.c:1430 +#: builtin/commit.c:1397 msgid "ok to record an empty change" msgstr "ok att registrera en tom ändring" -#: builtin/commit.c:1433 +#: builtin/commit.c:1400 msgid "ok to record a change with an empty message" msgstr "ok att registrera en ändring med tomt meddelande" -#: builtin/commit.c:1464 +#: builtin/commit.c:1432 msgid "could not parse HEAD commit" msgstr "kunde inte tolka HEAD:s incheckning" -#: builtin/commit.c:1502 builtin/merge.c:508 +#: builtin/commit.c:1470 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "kunde inte öppna \"%s\" för läsning" -#: builtin/commit.c:1509 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Trasig MERGE_HEAD-fil (%s)" -#: builtin/commit.c:1516 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "kunde inte läsa MERGE_MODE" -#: builtin/commit.c:1535 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "kunde inte läsa incheckningsmeddelande: %s" -#: builtin/commit.c:1549 +#: builtin/commit.c:1517 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Avbryter incheckning; meddelandet inte redigerat.\n" -#: builtin/commit.c:1554 +#: builtin/commit.c:1522 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Avbryter pÃ¥ grund av tomt incheckningsmeddelande.\n" -#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960 +#: builtin/commit.c:1537 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "kunde inte skriva incheckningsobjekt" -#: builtin/commit.c:1590 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "kunde inte lÃ¥sa HEAD-referens" -#: builtin/commit.c:1594 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "kunde inte uppdatera HEAD-referens" -#: builtin/commit.c:1605 +#: builtin/commit.c:1573 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4179,67 +4153,67 @@ msgstr "Kunde inte hitta fjärr-referensen HEAD" msgid "object %s not found" msgstr "objektet %s hittades inte" -#: builtin/fetch.c:260 +#: builtin/fetch.c:259 msgid "[up to date]" msgstr "[àjour]" -#: builtin/fetch.c:274 +#: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (kan inte hämta i aktuell gren)" -#: builtin/fetch.c:275 builtin/fetch.c:361 +#: builtin/fetch.c:274 builtin/fetch.c:360 msgid "[rejected]" msgstr "[refuserad]" -#: builtin/fetch.c:286 +#: builtin/fetch.c:285 msgid "[tag update]" msgstr "[uppdaterad tagg]" -#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341 +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr " (kunde inte uppdatera lokal ref)" -#: builtin/fetch.c:306 +#: builtin/fetch.c:305 msgid "[new tag]" msgstr "[ny tagg]" -#: builtin/fetch.c:309 +#: builtin/fetch.c:308 msgid "[new branch]" msgstr "[ny gren]" -#: builtin/fetch.c:312 +#: builtin/fetch.c:311 msgid "[new ref]" msgstr "[ny ref]" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "unable to update local ref" msgstr "kunde inte uppdatera lokal ref" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "forced update" msgstr "tvingad uppdatering" -#: builtin/fetch.c:363 +#: builtin/fetch.c:362 msgid "(non-fast-forward)" msgstr "(ej snabbspolad)" -#: builtin/fetch.c:394 builtin/fetch.c:686 +#: builtin/fetch.c:393 builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" msgstr "kan inte öppna %s: %s\n" -#: builtin/fetch.c:403 +#: builtin/fetch.c:402 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s sände inte alla nödvändiga objekt\n" -#: builtin/fetch.c:489 +#: builtin/fetch.c:488 #, c-format msgid "From %.*s\n" msgstr "FrÃ¥n %.*s\n" -#: builtin/fetch.c:500 +#: builtin/fetch.c:499 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -4248,55 +4222,55 @@ msgstr "" "vissa lokala referenser kunde inte uppdateras; testa att köra\n" " \"git remote prune %s\" för att ta bort gamla grenar som stÃ¥r i konflikt" -#: builtin/fetch.c:550 +#: builtin/fetch.c:549 #, c-format msgid " (%s will become dangling)" msgstr " (%s kommer bli dinglande)" -#: builtin/fetch.c:551 +#: builtin/fetch.c:550 #, c-format msgid " (%s has become dangling)" msgstr " (%s har blivit dinglande)" -#: builtin/fetch.c:558 +#: builtin/fetch.c:557 msgid "[deleted]" msgstr "[borttagen]" -#: builtin/fetch.c:559 builtin/remote.c:1055 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "(ingen)" -#: builtin/fetch.c:676 +#: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv" -#: builtin/fetch.c:710 +#: builtin/fetch.c:709 #, c-format msgid "Don't know how to fetch from %s" msgstr "Vet inte hur man hämtar frÃ¥n %s" -#: builtin/fetch.c:787 +#: builtin/fetch.c:786 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s" -#: builtin/fetch.c:790 +#: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Flaggan \"%s\" ignoreras för %s\n" -#: builtin/fetch.c:892 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "Hämtar %s\n" -#: builtin/fetch.c:894 builtin/remote.c:100 +#: builtin/fetch.c:893 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "Kunde inte hämta %s" -#: builtin/fetch.c:913 +#: builtin/fetch.c:912 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -4304,24 +4278,24 @@ msgstr "" "Inget fjärrarkiv angavs. Ange antingen en URL eller namnet pÃ¥ ett\n" "fjärrarkiv som nya incheckningar skall hämtas frÃ¥n." -#: builtin/fetch.c:933 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "Du mÃ¥ste ange namnet pÃ¥ en tagg." -#: builtin/fetch.c:985 +#: builtin/fetch.c:984 msgid "fetch --all does not take a repository argument" msgstr "fetch --all tar inte namnet pÃ¥ ett arkiv som argument" -#: builtin/fetch.c:987 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kan inte anges med referensspecifikationer" -#: builtin/fetch.c:998 +#: builtin/fetch.c:997 #, c-format msgid "No such remote or remote group: %s" msgstr "Fjärren eller fjärrgruppen finns inte: %s" -#: builtin/fetch.c:1006 +#: builtin/fetch.c:1005 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Kan inte hämta frÃ¥n grupp och ange referensspecifikationer" @@ -4330,7 +4304,7 @@ msgid "git fmt-merge-msg [-m ] [--log[=]|--no-log] [--file ]" msgstr "" "git fmt-merge-msg [-m ] [--log[=]|--no-log] [--file ]" -#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786 +#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:787 #: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192 #: builtin/tag.c:448 parse-options.h:133 parse-options.h:235 msgid "n" @@ -4466,12 +4440,7 @@ msgstr "var mer grundlig (ökar körtiden)" msgid "enable auto-gc mode" msgstr "aktivera auto-gc-läge" -#: builtin/gc.c:221 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "Packar arkivet automatiskt för optimal prestanda.\n" - -#: builtin/gc.c:224 +#: builtin/gc.c:222 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -4480,7 +4449,7 @@ msgstr "" "Packar arkivet automatiskt för optimal prestanda. Du kan även\n" "köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n" -#: builtin/gc.c:251 +#: builtin/gc.c:249 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -4491,227 +4460,230 @@ msgstr "" msgid "git grep [options] [-e] [...] [[--] ...]" msgstr "git grep [flaggor] [-e] [...] [[--] ...]" -#: builtin/grep.c:216 +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: misslyckades skapa trÃ¥d. %s" -#: builtin/grep.c:454 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "Kunde inte byta katalog (chdir): %s" -#: builtin/grep.c:530 builtin/grep.c:564 +#: builtin/grep.c:531 builtin/grep.c:565 #, c-format msgid "unable to read tree (%s)" msgstr "kunde inte läsa träd (%s)" -#: builtin/grep.c:578 +#: builtin/grep.c:579 #, c-format msgid "unable to grep from object of type %s" msgstr "Kunde inte \"grep\" frÃ¥n objekt av typen %s" -#: builtin/grep.c:636 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "flaggan \"%c\" antar ett numeriskt värde" -#: builtin/grep.c:653 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" msgstr "kan inte öppna \"%s\"" -#: builtin/grep.c:728 +#: builtin/grep.c:729 msgid "search in index instead of in the work tree" msgstr "sök i indexet istället för i arbetskatalogen" -#: builtin/grep.c:730 +#: builtin/grep.c:731 msgid "find in contents not managed by git" msgstr "sök i innehÃ¥l som inte hanteras av git" -#: builtin/grep.c:732 +#: builtin/grep.c:733 msgid "search in both tracked and untracked files" msgstr "sök i bÃ¥de spÃ¥rade och ospÃ¥rade filer" -#: builtin/grep.c:734 +#: builtin/grep.c:735 msgid "search also in ignored files" msgstr "sök även i ignorerade filer" -#: builtin/grep.c:737 +#: builtin/grep.c:738 msgid "show non-matching lines" msgstr "vis rader som inte träffas" -#: builtin/grep.c:739 +#: builtin/grep.c:740 msgid "case insensitive matching" msgstr "skiftlägesokänslig sökning" -#: builtin/grep.c:741 +#: builtin/grep.c:742 msgid "match patterns only at word boundaries" msgstr "matcha endast mönster vid ordgränser" -#: builtin/grep.c:743 +#: builtin/grep.c:744 msgid "process binary files as text" msgstr "hantera binärfiler som text" -#: builtin/grep.c:745 +#: builtin/grep.c:746 msgid "don't match patterns in binary files" msgstr "träffa inte mönster i binärfiler" -#: builtin/grep.c:748 +#: builtin/grep.c:749 msgid "descend at most levels" msgstr "gÃ¥ som mest ned nivÃ¥er" -#: builtin/grep.c:752 +#: builtin/grep.c:753 msgid "use extended POSIX regular expressions" msgstr "använd utökade POSIX-reguljära uttryck" -#: builtin/grep.c:755 +#: builtin/grep.c:756 msgid "use basic POSIX regular expressions (default)" msgstr "använd grundläggande POSIX-reguljära uttryck (standard)" -#: builtin/grep.c:758 +#: builtin/grep.c:759 msgid "interpret patterns as fixed strings" msgstr "tolka mönster som fixerade strängar" -#: builtin/grep.c:761 +#: builtin/grep.c:762 msgid "use Perl-compatible regular expressions" msgstr "använd Perlkompatibla reguljära uttryck" -#: builtin/grep.c:764 +#: builtin/grep.c:765 msgid "show line numbers" msgstr "visa radnummer" -#: builtin/grep.c:765 +#: builtin/grep.c:766 msgid "don't show filenames" msgstr "visa inte filnamn" -# %s är ett verb ("Untracked"/"Ignored"); lägg till ett -e. -#: builtin/grep.c:766 +#: builtin/grep.c:767 msgid "show filenames" msgstr "visa filnamn" -#: builtin/grep.c:768 +#: builtin/grep.c:769 msgid "show filenames relative to top directory" msgstr "visa filnamn relativa till toppkatalogen" -#: builtin/grep.c:770 +#: builtin/grep.c:771 msgid "show only filenames instead of matching lines" msgstr "visa endast filnamn istället för träffade rader" -#: builtin/grep.c:772 +#: builtin/grep.c:773 msgid "synonym for --files-with-matches" msgstr "synonym för --files-with-matches" -#: builtin/grep.c:775 +#: builtin/grep.c:776 msgid "show only the names of files without match" msgstr "visa endast namn pÃ¥ filer utan träffar" -#: builtin/grep.c:777 +#: builtin/grep.c:778 msgid "print NUL after filenames" msgstr "skriv NUL efter filnamn" -#: builtin/grep.c:779 +#: builtin/grep.c:780 msgid "show the number of matches instead of matching lines" msgstr "visa antal träffar istället för träffade rader" -#: builtin/grep.c:780 +#: builtin/grep.c:781 msgid "highlight matches" msgstr "ljusmarkera träffar" -#: builtin/grep.c:782 +#: builtin/grep.c:783 msgid "print empty line between matches from different files" msgstr "skriv tomma rader mellan träffar frÃ¥n olika filer" -#: builtin/grep.c:784 +#: builtin/grep.c:785 msgid "show filename only once above matches from same file" msgstr "visa filnamn endast en gÃ¥ng ovanför träffar frÃ¥n samma fil" -#: builtin/grep.c:787 +#: builtin/grep.c:788 msgid "show context lines before and after matches" msgstr "visa rader sammanhang före och efter träffar" -#: builtin/grep.c:790 +#: builtin/grep.c:791 msgid "show context lines before matches" msgstr "visa rader sammanhang före träffar" -#: builtin/grep.c:792 +#: builtin/grep.c:793 msgid "show context lines after matches" msgstr "visa rader sammanhang efter träffar" -#: builtin/grep.c:793 +#: builtin/grep.c:794 msgid "shortcut for -C NUM" msgstr "genväg för -C NUM" -#: builtin/grep.c:796 +#: builtin/grep.c:797 msgid "show a line with the function name before matches" msgstr "visa en rad med funktionsnamnet före träffen" -#: builtin/grep.c:798 +#: builtin/grep.c:799 msgid "show the surrounding function" msgstr "visa den omkringliggande funktionen" -#: builtin/grep.c:801 +#: builtin/grep.c:802 msgid "read patterns from file" msgstr "läs mönster frÃ¥n fil" -#: builtin/grep.c:803 +#: builtin/grep.c:804 msgid "match " msgstr "träffa " -#: builtin/grep.c:805 +#: builtin/grep.c:806 msgid "combine patterns specified with -e" msgstr "kombinera mönster som anges med -e" -#: builtin/grep.c:817 +#: builtin/grep.c:818 msgid "indicate hit with exit status without output" msgstr "ange träff med slutstatuskod utan utdata" -#: builtin/grep.c:819 +#: builtin/grep.c:820 msgid "show only matches from files that match all patterns" msgstr "visa endast träffar frÃ¥n filer som träffar alla mönster" #: builtin/grep.c:822 +msgid "show parse tree for grep expression" +msgstr "visa analysträd för grep-uttryck" + +#: builtin/grep.c:826 msgid "pager" msgstr "bläddrare" -#: builtin/grep.c:822 +#: builtin/grep.c:826 msgid "show matching files in the pager" msgstr "visa träffade filer i filbläddraren" -#: builtin/grep.c:825 +#: builtin/grep.c:829 msgid "allow calling of grep(1) (ignored by this build)" msgstr "tillÃ¥t anropa grep(1) (ignoreras av detta bygge)" -#: builtin/grep.c:826 builtin/show-ref.c:201 +#: builtin/grep.c:830 builtin/show-ref.c:201 msgid "show usage" msgstr "visa användning" -#: builtin/grep.c:917 +#: builtin/grep.c:921 msgid "no pattern given." msgstr "inget mönster angavs." -#: builtin/grep.c:931 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "felaktigt objekt %s" -#: builtin/grep.c:972 +#: builtin/grep.c:976 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager fungerar endast i arbetskatalogen" -#: builtin/grep.c:995 +#: builtin/grep.c:999 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached och --untracked kan inte användas med --no-index." -#: builtin/grep.c:1000 +#: builtin/grep.c:1004 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index och --untracked kan inte användas med revisioner." -#: builtin/grep.c:1003 +#: builtin/grep.c:1007 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard kan inte användas för spÃ¥rat innehÃ¥ll." -#: builtin/grep.c:1011 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "bÃ¥de --cached och träd angavs." @@ -5718,7 +5690,7 @@ msgstr "tillÃ¥t snabbspolning (standard)" msgid "abort if fast-forward is not possible" msgstr "avbryt om snabbspolning inte är möjlig" -#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112 +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 msgid "strategy" msgstr "strategi" @@ -6181,11 +6153,11 @@ msgstr "läs frÃ¥n standard in" msgid "allow to print `undefined` names" msgstr "tillÃ¥t att skriva \"odefinierade\" namn" -#: builtin/notes.c:23 +#: builtin/notes.c:26 msgid "git notes [--ref ] [list []]" msgstr "git notes [--ref ] [list []]" -#: builtin/notes.c:24 +#: builtin/notes.c:27 msgid "" "git notes [--ref ] add [-f] [-m | -F | (-c | -C) " "] []" @@ -6193,12 +6165,12 @@ msgstr "" "git notes [--ref ] add [-f] [-m | -F | (-c | -" "C) ] []" -#: builtin/notes.c:25 +#: builtin/notes.c:28 msgid "git notes [--ref ] copy [-f] " msgstr "" "git notes [--ref ] copy [-f] " -#: builtin/notes.c:26 +#: builtin/notes.c:29 msgid "" "git notes [--ref ] append [-m | -F | (-c | -C) " "] []" @@ -6206,226 +6178,226 @@ msgstr "" "git notes [--ref ] append [-m | -F | (-c | -C) " "] []" -#: builtin/notes.c:27 +#: builtin/notes.c:30 msgid "git notes [--ref ] edit []" msgstr "git notes [--ref ] edit []" -#: builtin/notes.c:28 +#: builtin/notes.c:31 msgid "git notes [--ref ] show []" msgstr "git notes [--ref ] show []" -#: builtin/notes.c:29 +#: builtin/notes.c:32 msgid "" "git notes [--ref ] merge [-v | -q] [-s ] " msgstr "" "git notes [--ref ] merge [-v | -q] [-s ] " "" -#: builtin/notes.c:30 +#: builtin/notes.c:33 msgid "git notes merge --commit [-v | -q]" msgstr "git notes merge --commit [-v | -q]" -#: builtin/notes.c:31 +#: builtin/notes.c:34 msgid "git notes merge --abort [-v | -q]" msgstr "git notes merge --abort [-v | -q]" -#: builtin/notes.c:32 +#: builtin/notes.c:35 msgid "git notes [--ref ] remove [...]" msgstr "git notes [--ref ] remove [...]" -#: builtin/notes.c:33 +#: builtin/notes.c:36 msgid "git notes [--ref ] prune [-n | -v]" msgstr "git notes [--ref ] prune [-n | -v]" -#: builtin/notes.c:34 +#: builtin/notes.c:37 msgid "git notes [--ref ] get-ref" msgstr "git notes [--ref ] get-ref" -#: builtin/notes.c:39 +#: builtin/notes.c:42 msgid "git notes [list []]" msgstr "git notes [list []]" -#: builtin/notes.c:44 +#: builtin/notes.c:47 msgid "git notes add [] []" msgstr "git notes add [] []" -#: builtin/notes.c:49 +#: builtin/notes.c:52 msgid "git notes copy [] " msgstr "git notes copy [] " -#: builtin/notes.c:50 +#: builtin/notes.c:53 msgid "git notes copy --stdin [ ]..." msgstr "git notes copy --stdin [ ]..." -#: builtin/notes.c:55 +#: builtin/notes.c:58 msgid "git notes append [] []" msgstr "git notes append [] []" -#: builtin/notes.c:60 +#: builtin/notes.c:63 msgid "git notes edit []" msgstr "git notes edit []" -#: builtin/notes.c:65 +#: builtin/notes.c:68 msgid "git notes show []" msgstr "git notes show []" -#: builtin/notes.c:70 +#: builtin/notes.c:73 msgid "git notes merge [] " msgstr "git notes merge [] " -#: builtin/notes.c:71 +#: builtin/notes.c:74 msgid "git notes merge --commit []" msgstr "git notes merge --commit []" -#: builtin/notes.c:72 +#: builtin/notes.c:75 msgid "git notes merge --abort []" msgstr "git notes merge --abort []" -#: builtin/notes.c:77 +#: builtin/notes.c:80 msgid "git notes remove []" msgstr "git notes remove []" -#: builtin/notes.c:82 +#: builtin/notes.c:85 msgid "git notes prune []" msgstr "git notes prune []" -#: builtin/notes.c:87 +#: builtin/notes.c:90 msgid "git notes get-ref" msgstr "git notes get-ref" -#: builtin/notes.c:139 +#: builtin/notes.c:142 #, c-format msgid "unable to start 'show' for object '%s'" msgstr "kunde inte starta \"show\" för objektet \"%s\"" -#: builtin/notes.c:145 +#: builtin/notes.c:148 msgid "can't fdopen 'show' output fd" msgstr "kunde inte öppna (fdopen) \"show\"-utdata-filhandtag" -#: builtin/notes.c:155 +#: builtin/notes.c:158 #, c-format msgid "failed to close pipe to 'show' for object '%s'" msgstr "kunde inte stänga röret till \"show\" för objektet \"%s\"" -#: builtin/notes.c:158 +#: builtin/notes.c:161 #, c-format msgid "failed to finish 'show' for object '%s'" msgstr "kunde inte avsluta \"show\" för objektet \"%s\"" -#: builtin/notes.c:175 builtin/tag.c:347 +#: builtin/notes.c:178 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "kunde inte skapa filen \"%s\"" -#: builtin/notes.c:189 +#: builtin/notes.c:192 msgid "Please supply the note contents using either -m or -F option" msgstr "Ange innehÃ¥ll för anteckningen med antingen -m eller -F" -#: builtin/notes.c:210 builtin/notes.c:973 +#: builtin/notes.c:213 builtin/notes.c:976 #, c-format msgid "Removing note for object %s\n" msgstr "Tar bort anteckning för objektet %s\n" -#: builtin/notes.c:215 +#: builtin/notes.c:218 msgid "unable to write note object" msgstr "kunde inte skriva anteckningsobjekt" -#: builtin/notes.c:217 +#: builtin/notes.c:220 #, c-format msgid "The note contents has been left in %s" msgstr "Anteckningens innehÃ¥ll har lämnats kvar i %s" -#: builtin/notes.c:251 builtin/tag.c:542 +#: builtin/notes.c:254 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/notes.c:253 builtin/tag.c:545 +#: builtin/notes.c:256 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "kunde inte öppna eller läsa \"%s\"" -#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 -#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 -#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 +#: builtin/notes.c:275 builtin/notes.c:448 builtin/notes.c:450 +#: builtin/notes.c:510 builtin/notes.c:564 builtin/notes.c:647 +#: builtin/notes.c:652 builtin/notes.c:727 builtin/notes.c:769 +#: builtin/notes.c:971 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Kunde inte slÃ¥ upp \"%s\" som en giltig referens." -#: builtin/notes.c:275 +#: builtin/notes.c:278 #, c-format msgid "Failed to read object '%s'." msgstr "Kunde inte läsa objektet \"%s\"." -#: builtin/notes.c:299 +#: builtin/notes.c:302 msgid "Cannot commit uninitialized/unreferenced notes tree" msgstr "Kan inte checka in oinitierat/orefererat anteckningsträd" -#: builtin/notes.c:340 +#: builtin/notes.c:343 #, c-format msgid "Bad notes.rewriteMode value: '%s'" msgstr "Felaktigt värde för notes.rewriteMode: '%s'" -#: builtin/notes.c:350 +#: builtin/notes.c:353 #, c-format msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value -#: builtin/notes.c:377 +#: builtin/notes.c:380 #, c-format msgid "Bad %s value: '%s'" msgstr "Felaktigt värde pÃ¥ %s: \"%s\"" -#: builtin/notes.c:441 +#: builtin/notes.c:444 #, c-format msgid "Malformed input line: '%s'." msgstr "Felaktig indatarad: \"%s\"." -#: builtin/notes.c:456 +#: builtin/notes.c:459 #, c-format msgid "Failed to copy notes from '%s' to '%s'" msgstr "Misslyckades kopiera anteckningar frÃ¥n \"%s\" till \"%s\"" -#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627 -#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759 -#: builtin/notes.c:1033 +#: builtin/notes.c:503 builtin/notes.c:557 builtin/notes.c:630 +#: builtin/notes.c:642 builtin/notes.c:715 builtin/notes.c:762 +#: builtin/notes.c:1036 msgid "too many parameters" msgstr "för mÃ¥nga parametrar" -#: builtin/notes.c:513 builtin/notes.c:772 +#: builtin/notes.c:516 builtin/notes.c:775 #, c-format msgid "No note found for object %s." msgstr "Inga anteckningar hittades för objektet %s." -#: builtin/notes.c:535 builtin/notes.c:692 +#: builtin/notes.c:538 builtin/notes.c:695 msgid "note contents as a string" msgstr "anteckningsinnehÃ¥ll som sträng" -#: builtin/notes.c:538 builtin/notes.c:695 +#: builtin/notes.c:541 builtin/notes.c:698 msgid "note contents in a file" msgstr "anteckningsinnehÃ¥ll i en fil" -#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697 -#: builtin/notes.c:700 builtin/tag.c:476 +#: builtin/notes.c:543 builtin/notes.c:546 builtin/notes.c:700 +#: builtin/notes.c:703 builtin/tag.c:476 msgid "object" msgstr "objekt" -#: builtin/notes.c:541 builtin/notes.c:698 +#: builtin/notes.c:544 builtin/notes.c:701 msgid "reuse and edit specified note object" msgstr "Ã¥teranvänd och redigera angivet anteckningsobjekt" -#: builtin/notes.c:544 builtin/notes.c:701 +#: builtin/notes.c:547 builtin/notes.c:704 msgid "reuse specified note object" msgstr "Ã¥teranvänd angivet anteckningsobjekt" -#: builtin/notes.c:546 builtin/notes.c:614 +#: builtin/notes.c:549 builtin/notes.c:617 msgid "replace existing notes" msgstr "ersätt befintliga anteckningar" -#: builtin/notes.c:580 +#: builtin/notes.c:583 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -6434,24 +6406,24 @@ msgstr "" "Kan inte lägga till anteckningar. Hittade befintliga anteckningar för " "objektet %s. Använd \"-f\" för att skriva över befintliga anteckningar" -#: builtin/notes.c:585 builtin/notes.c:662 +#: builtin/notes.c:588 builtin/notes.c:665 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "Skriver över befintliga anteckningar för objektet %s\n" -#: builtin/notes.c:615 +#: builtin/notes.c:618 msgid "read objects from stdin" msgstr "läs objekt frÃ¥n standard in" -#: builtin/notes.c:617 +#: builtin/notes.c:620 msgid "load rewriting config for (implies --stdin)" msgstr "läs omskrivningsinställning för (implicerar --stdin)" -#: builtin/notes.c:635 +#: builtin/notes.c:638 msgid "too few parameters" msgstr "för fÃ¥ parametrar" -#: builtin/notes.c:656 +#: builtin/notes.c:659 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -6460,12 +6432,12 @@ msgstr "" "Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet " "%s. Använd \"-f\" för att skriva över befintliga anteckningar" -#: builtin/notes.c:668 +#: builtin/notes.c:671 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "Anteckningar pÃ¥ källobjektet %s saknas. Kan inte kopiera." -#: builtin/notes.c:717 +#: builtin/notes.c:720 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" @@ -6474,15 +6446,15 @@ msgstr "" "Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n" "Använd \"git notes add -f -m/-F/-c/-C\" istället.\n" -#: builtin/notes.c:864 +#: builtin/notes.c:867 msgid "General options" msgstr "Allmänna flaggor" -#: builtin/notes.c:866 +#: builtin/notes.c:869 msgid "Merge options" msgstr "Flaggor för sammanslagning" -#: builtin/notes.c:868 +#: builtin/notes.c:871 msgid "" "resolve notes conflicts using the given strategy (manual/ours/theirs/union/" "cat_sort_uniq)" @@ -6490,46 +6462,46 @@ msgstr "" "läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/" "cat_sort_uniq)" -#: builtin/notes.c:870 +#: builtin/notes.c:873 msgid "Committing unmerged notes" msgstr "Checkar in ej sammanslagna anteckningar" -#: builtin/notes.c:872 +#: builtin/notes.c:875 msgid "finalize notes merge by committing unmerged notes" msgstr "" "färdigställ sammanslagning av anteckningar genom att checka in ej " "sammanslagna anteckningar" -#: builtin/notes.c:874 +#: builtin/notes.c:877 msgid "Aborting notes merge resolution" msgstr "Avbryt lösning av sammanslagning av anteckningar" -#: builtin/notes.c:876 +#: builtin/notes.c:879 msgid "abort notes merge" msgstr "avbryt sammanslagning av anteckningar" -#: builtin/notes.c:971 +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "Objektet %s har ingen anteckning\n" -#: builtin/notes.c:983 +#: builtin/notes.c:986 msgid "attempt to remove non-existent note is not an error" msgstr "försök att ta bort icke-existerande anteckningar är inte ett fel" -#: builtin/notes.c:986 +#: builtin/notes.c:989 msgid "read object names from the standard input" msgstr "läs objektnamn frÃ¥n standard in" -#: builtin/notes.c:1067 +#: builtin/notes.c:1070 msgid "notes_ref" msgstr "anteckningar-ref" -#: builtin/notes.c:1068 +#: builtin/notes.c:1071 msgid "use notes from " msgstr "använd anteckningar frÃ¥n " -#: builtin/notes.c:1103 builtin/remote.c:1598 +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "Okänt underkommando: %s" @@ -8935,7 +8907,7 @@ msgstr "Kan inte slÃ¥ ihop flera grenar i ett tomt huvud." msgid "Cannot rebase onto multiple branches" msgstr "Kan inte utföra en \"rebase\" ovanpÃ¥ flera grenar" -#: git-rebase.sh:52 +#: git-rebase.sh:53 msgid "" "When you have resolved this problem, run \"git rebase --continue\".\n" "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n" @@ -8946,27 +8918,31 @@ msgstr "" "Om du vill hoppa över patchen kör du istället \"git rebase --skip\".\n" "För att Ã¥terställa originalgrenen och avbryta kör du \"git rebase --abort\"." -#: git-rebase.sh:159 +#: git-rebase.sh:160 msgid "The pre-rebase hook refused to rebase." msgstr "Kroken pre-rebase vägrade ombaseringen." -#: git-rebase.sh:164 +#: git-rebase.sh:165 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "Det verkar som en git-am körs. Kan inte ombasera." -#: git-rebase.sh:295 +#: git-rebase.sh:296 msgid "The --exec option must be used with the --interactive option" msgstr "Flaggan --exec mÃ¥ste användas tillsammans med flaggan --interactive" -#: git-rebase.sh:300 +#: git-rebase.sh:301 msgid "No rebase in progress?" msgstr "Ingen ombasering pÃ¥gÃ¥r?" -#: git-rebase.sh:313 +#: git-rebase.sh:312 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering." + +#: git-rebase.sh:319 msgid "Cannot read HEAD" msgstr "Kan inte läsa HEAD" -#: git-rebase.sh:316 +#: git-rebase.sh:322 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -8974,12 +8950,12 @@ msgstr "" "Du mÃ¥ste redigera alla sammanslagningskonflikter och\n" "därefter markera dem som lösta med git add" -#: git-rebase.sh:334 +#: git-rebase.sh:340 #, sh-format msgid "Could not move back to $head_name" msgstr "Kunde inte flytta tillbaka till $head_name" -#: git-rebase.sh:350 +#: git-rebase.sh:359 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -9000,57 +8976,57 @@ msgstr "" "och kör programmet igen. Jag avslutar ifall du fortfarande har\n" "nÃ¥got av värde där." -#: git-rebase.sh:395 +#: git-rebase.sh:404 #, sh-format msgid "invalid upstream $upstream_name" msgstr "ogiltig uppström $upstream_name" -#: git-rebase.sh:419 +#: git-rebase.sh:428 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: mer än en sammanslagningsbas finns" -#: git-rebase.sh:422 git-rebase.sh:426 +#: git-rebase.sh:431 git-rebase.sh:435 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: ingen sammanslagningsbas finns" -#: git-rebase.sh:431 +#: git-rebase.sh:440 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "Peka pÃ¥ en giltig incheckning: $onto_name" -#: git-rebase.sh:454 +#: git-rebase.sh:463 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "ödesdigert: ingen sÃ¥dan gren: $branch_name" -#: git-rebase.sh:474 +#: git-rebase.sh:483 msgid "Please commit or stash them." msgstr "Checka in eller använd \"stash\" pÃ¥ dem." -#: git-rebase.sh:492 +#: git-rebase.sh:501 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Aktuell gren $branch_name är à jour." -#: git-rebase.sh:495 +#: git-rebase.sh:504 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad." -#: git-rebase.sh:506 +#: git-rebase.sh:515 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Ändringar frÃ¥n $mb till $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:515 +#: git-rebase.sh:524 msgid "First, rewinding head to replay your work on top of it..." msgstr "" "Först, spolar tillbaka huvudet för att spela av ditt arbete ovanpÃ¥ det..." -#: git-rebase.sh:523 +#: git-rebase.sh:532 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "Snabbspolade $branch_name till $onto_name." @@ -9379,6 +9355,27 @@ msgstr "# Undermodulers ändringar att checka in:" msgid "Synchronizing submodule url for '$name'" msgstr "Synkroniserar undermodul-url för \"$name\"" +#~ msgid " 0 files changed" +#~ msgstr " 0 filer ändrade" + +#~ msgid " %d file changed" +#~ msgid_plural " %d files changed" +#~ msgstr[0] " %d fil ändrad" +#~ msgstr[1] " %d filer ändrade" + +#~ msgid ", %d insertion(+)" +#~ msgid_plural ", %d insertions(+)" +#~ msgstr[0] ", %d tillägg(+)" +#~ msgstr[1] ", %d tillägg(+)" + +#~ msgid ", %d deletion(-)" +#~ msgid_plural ", %d deletions(-)" +#~ msgstr[0] ", %d borttagning(-)" +#~ msgstr[1] ", %d borttagningar(-)" + +#~ msgid "Auto packing the repository for optimum performance.\n" +#~ msgstr "Packar arkivet automatiskt för optimal prestanda.\n" + #~ msgid " (use \"git add\" to track)" #~ msgstr " (spÃ¥ra med \"git add\")" diff --git a/po/vi.po b/po/vi.po index 1fca321728..ca617a3ca0 100644 --- a/po/vi.po +++ b/po/vi.po @@ -6,10 +6,10 @@ # msgid "" msgstr "" -"Project-Id-Version: git-v1.7.12-437-g1084f\n" +"Project-Id-Version: git-v1.8.0-rc2-4-g42e55\n" "Report-Msgid-Bugs-To: Git Mailing List \n" -"POT-Creation-Date: 2012-09-15 10:21+0800\n" -"PO-Revision-Date: 2012-10-15 14:34+0700\n" +"POT-Creation-Date: 2012-10-16 08:38+0800\n" +"PO-Revision-Date: 2012-10-17 08:09+0700\n" "Last-Translator: Trần Ngọc Quân \n" "Language-Team: Vietnamese \n" "Language: vi\n" @@ -37,9 +37,9 @@ msgid "" "or use 'git commit -a'." msgstr "" "Sá»­a chúng trong cây làm việc,\n" -"và sau đó dùng lệnh 'git add/rm '\n" +"và sau đó dùng lệnh `git add/rm '\n" "dành riêng cho việc đánh dấu cần giải quyết và tạo lần chuyển giao,\n" -"hoặc là dùng lệnh 'git commit -a'." +"hoặc là dùng lệnh `git commit -a'." #: archive.c:10 msgid "git archive [options] [...]" @@ -76,11 +76,11 @@ msgstr "tiền tố" msgid "prepend prefix to each pathname in the archive" msgstr "nối thêm tiền tố vào từng đường dẫn tập tin trong kho lưu" -#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2332 -#: builtin/blame.c:2333 builtin/config.c:56 builtin/fast-export.c:642 -#: builtin/fast-export.c:644 builtin/grep.c:800 builtin/hash-object.c:77 -#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:537 -#: builtin/notes.c:694 builtin/read-tree.c:107 parse-options.h:149 +#: archive.c:325 builtin/archive.c:91 builtin/blame.c:2389 +#: builtin/blame.c:2390 builtin/config.c:56 builtin/fast-export.c:642 +#: builtin/fast-export.c:644 builtin/grep.c:801 builtin/hash-object.c:77 +#: builtin/ls-files.c:494 builtin/ls-files.c:497 builtin/notes.c:540 +#: builtin/notes.c:697 builtin/read-tree.c:107 parse-options.h:149 msgid "file" msgstr "tập-tin" @@ -120,7 +120,7 @@ msgstr "kho" msgid "retrieve the archive from remote repository " msgstr "nhận kho lưu từ kho chứa trên máy chá»§" -#: archive.c:346 builtin/archive.c:95 builtin/notes.c:616 +#: archive.c:346 builtin/archive.c:95 builtin/notes.c:619 msgid "command" msgstr "lệnh" @@ -138,7 +138,7 @@ msgstr "`%s' không giống như tập tin v2 bundle (cụm)" msgid "unrecognized header: %s%s (%d)" msgstr "phần đầu (header) không được thừa nhận: %s%s (%d)" -#: bundle.c:89 builtin/commit.c:714 +#: bundle.c:89 builtin/commit.c:672 #, c-format msgid "could not open '%s'" msgstr "không thể mở `%s'" @@ -147,7 +147,7 @@ msgstr "không thể mở `%s'" msgid "Repository lacks these prerequisite commits:" msgstr "Khó chứa thiếu những lần chuyển giao (commit) cần trước hết này:" -#: bundle.c:164 sequencer.c:557 sequencer.c:989 builtin/log.c:290 +#: bundle.c:164 sequencer.c:562 sequencer.c:994 builtin/log.c:290 #: builtin/log.c:727 builtin/log.c:1313 builtin/log.c:1529 builtin/merge.c:347 #: builtin/shortlog.c:181 msgid "revision walk setup failed" @@ -206,12 +206,12 @@ msgstr "không thể tạo `%s'" msgid "index-pack died" msgstr "index-pack đã chết" -#: commit.c:48 +#: commit.c:50 #, c-format msgid "could not parse %s" msgstr "không thể phân tích %s" -#: commit.c:50 +#: commit.c:52 #, c-format msgid "%s %s is not a commit!" msgstr "%s %s không phải là một lần commit!" @@ -222,7 +222,7 @@ msgstr "cạn bộ nhớ" #: connected.c:39 msgid "Could not run 'git rev-list'" -msgstr "Không thể chạy 'git rev-list'" +msgstr "Không thể chạy `git rev-list'" #: connected.c:48 #, c-format @@ -320,32 +320,7 @@ msgstr "" "Tìm thấy các lỗi trong biến cấu hình 'diff.dirstat':\n" "%s" -#: diff.c:1401 -msgid " 0 files changed" -msgstr " 0 có tập tin nào thay đổi cả" - -#: diff.c:1405 -#, c-format -msgid " %d file changed" -msgid_plural " %d files changed" -msgstr[0] " %d tập tin thay đổi" -msgstr[1] " %d tập tin thay đổi" - -#: diff.c:1422 -#, c-format -msgid ", %d insertion(+)" -msgid_plural ", %d insertions(+)" -msgstr[0] ", %d thêm(+)" -msgstr[1] ", %d thêm(+)" - -#: diff.c:1433 -#, c-format -msgid ", %d deletion(-)" -msgid_plural ", %d deletions(-)" -msgstr[0] ", %d xóa(-)" -msgstr[1] ", %d xóa(-)" - -#: diff.c:3460 +#: diff.c:3458 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -366,17 +341,17 @@ msgstr "gpg đã không đồng ý dữ liệu" msgid "gpg failed to sign the data" msgstr "gpg gặp lỗi khi ký dữ liệu" -#: grep.c:1320 +#: grep.c:1441 #, c-format msgid "'%s': unable to read %s" msgstr "`%s': không thể đọc %s" -#: grep.c:1337 +#: grep.c:1458 #, c-format msgid "'%s': %s" msgstr "`%s': %s" -#: grep.c:1348 +#: grep.c:1469 #, c-format msgid "'%s': short read %s" msgstr "`%s': đọc ngắn %s" @@ -748,103 +723,103 @@ msgstr[1] "" "Your branch and `%s' have diverged,\n" "and have %d and %d different commit each, respectively.\n" -#: sequencer.c:121 builtin/merge.c:864 builtin/merge.c:977 +#: sequencer.c:123 builtin/merge.c:864 builtin/merge.c:977 #: builtin/merge.c:1087 builtin/merge.c:1097 #, c-format msgid "Could not open '%s' for writing" msgstr "Không thể mở %s' để ghi" -#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:867 +#: sequencer.c:125 builtin/merge.c:333 builtin/merge.c:867 #: builtin/merge.c:1089 builtin/merge.c:1102 #, c-format msgid "Could not write to '%s'" msgstr "Không thể ghi vào `%s'" -#: sequencer.c:144 +#: sequencer.c:146 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add ' or 'git rm '" msgstr "" "sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sá»­a\n" -"với lệnh 'git add <đường_dẫn>' hoặc 'git rm <đường_dẫn>'" +"với lệnh `git add <đường_dẫn>' hoặc `git rm <đường_dẫn>'" -#: sequencer.c:147 +#: sequencer.c:149 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add ' or 'git rm '\n" "and commit the result with 'git commit'" msgstr "" "sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sá»­a\n" -"với lệnh 'git add <đường_dẫn>' hoặc 'git rm <đường_dẫn>'\n" -"và chuyển giao (commit) kết quả bằng lệnh 'git commit'" +"với lệnh `git add <đường_dẫn>' hoặc `git rm <đường_dẫn>'\n" +"và chuyển giao (commit) kết quả bằng lệnh `git commit'" -#: sequencer.c:160 sequencer.c:765 sequencer.c:848 +#: sequencer.c:162 sequencer.c:770 sequencer.c:853 #, c-format msgid "Could not write to %s" msgstr "Không thể ghi vào %s" -#: sequencer.c:163 +#: sequencer.c:165 #, c-format msgid "Error wrapping up %s" msgstr "Lỗi bao bọc %s" -#: sequencer.c:178 +#: sequencer.c:180 msgid "Your local changes would be overwritten by cherry-pick." msgstr "Các thay đổi nội bộ cá»§a bạn có thể bị ghi đè bởi lệnh cherry-pick." -#: sequencer.c:180 +#: sequencer.c:182 msgid "Your local changes would be overwritten by revert." msgstr "Các thay đổi nội bộ cá»§a bạn có thể bị ghi đè bởi lệnh revert." -#: sequencer.c:183 +#: sequencer.c:185 msgid "Commit your changes or stash them to proceed." msgstr "Chuyển giao (commit) các thay đổi cá»§a bạn hay stash chúng để xá»­ lý." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:233 +#: sequencer.c:235 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Không thể ghi tập tin lưu bảng mục lục mới" -#: sequencer.c:261 +#: sequencer.c:266 msgid "Could not resolve HEAD commit\n" msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n" -#: sequencer.c:282 +#: sequencer.c:287 msgid "Unable to update cache tree\n" msgstr "Không thể cập nhật cây bộ nhớ đệm\n" -#: sequencer.c:327 +#: sequencer.c:332 #, c-format msgid "Could not parse commit %s\n" msgstr "Không thể phân tích commit (lần chuyển giao) %s\n" -#: sequencer.c:332 +#: sequencer.c:337 #, c-format msgid "Could not parse parent commit %s\n" msgstr "Không thể phân tích commit (lần chuyển giao) cha mẹ %s\n" -#: sequencer.c:398 +#: sequencer.c:403 msgid "Your index file is unmerged." msgstr "Tập tin lưu mục lục cá»§a bạn không được hòa trộn." -#: sequencer.c:401 +#: sequencer.c:406 msgid "You do not have a valid HEAD" msgstr "Bạn không có HEAD nào hợp lệ" -#: sequencer.c:416 +#: sequencer.c:421 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" "Lần chuyển giao (commit) %s là một lần hòa trộn nhưng không đưa ra tùy chọn -" "m." -#: sequencer.c:424 +#: sequencer.c:429 #, c-format msgid "Commit %s does not have parent %d" msgstr "Lần chuyển giao (commit) %s không có cha mẹ %d" -#: sequencer.c:428 +#: sequencer.c:433 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" @@ -853,143 +828,143 @@ msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:439 +#: sequencer.c:444 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: không thể phân tích lần chuyển giao mẹ cá»§a %s" -#: sequencer.c:443 +#: sequencer.c:448 #, c-format msgid "Cannot get commit message for %s" msgstr "Không thể lấy thông điệp lần chuyển giao (commit) cho %s" -#: sequencer.c:527 +#: sequencer.c:532 #, c-format msgid "could not revert %s... %s" msgstr "không thể revert %s... %s" -#: sequencer.c:528 +#: sequencer.c:533 #, c-format msgid "could not apply %s... %s" msgstr "không thể apply (áp dụng miếng vá) %s... %s" -#: sequencer.c:560 +#: sequencer.c:565 msgid "empty commit set passed" msgstr "lần chuyển giao (commit) trống rỗng đặt là hợp quy cách" -#: sequencer.c:568 +#: sequencer.c:573 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: gặp lỗi đọc bảng mục lục" -#: sequencer.c:573 +#: sequencer.c:578 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục" -#: sequencer.c:631 +#: sequencer.c:636 #, c-format msgid "Cannot %s during a %s" msgstr "Không thể %s trong khi %s" -#: sequencer.c:653 +#: sequencer.c:658 #, c-format msgid "Could not parse line %d." msgstr "Không phân tích được dòng %d." -#: sequencer.c:658 +#: sequencer.c:663 msgid "No commits parsed." msgstr "Không có lần chuyển giao (commit) nào được phân tích." -#: sequencer.c:671 +#: sequencer.c:676 #, c-format msgid "Could not open %s" msgstr "Không thể mở %s" -#: sequencer.c:675 +#: sequencer.c:680 #, c-format msgid "Could not read %s." msgstr "Không thể đọc %s." -#: sequencer.c:682 +#: sequencer.c:687 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Bảng chỉ thị không thể dùng được: %s" -#: sequencer.c:710 +#: sequencer.c:715 #, c-format msgid "Invalid key: %s" msgstr "Khóa không đúng: %s" -#: sequencer.c:713 +#: sequencer.c:718 #, c-format msgid "Invalid value for %s: %s" msgstr "Giá trị không hợp lệ %s: %s" -#: sequencer.c:725 +#: sequencer.c:730 #, c-format msgid "Malformed options sheet: %s" msgstr "Bảng tùy chọn dị hình: %s" -#: sequencer.c:746 +#: sequencer.c:751 msgid "a cherry-pick or revert is already in progress" msgstr "một thao tác cherry-pick hoặc revert đang được thá»±c hiện" -#: sequencer.c:747 +#: sequencer.c:752 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "hãy thá»­ \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:751 +#: sequencer.c:756 #, c-format msgid "Could not create sequencer directory %s" msgstr "Không thể tạo thư mục xếp dãy %s" -#: sequencer.c:767 sequencer.c:852 +#: sequencer.c:772 sequencer.c:857 #, c-format msgid "Error wrapping up %s." msgstr "Lỗi bao bọc %s." -#: sequencer.c:786 sequencer.c:920 +#: sequencer.c:791 sequencer.c:925 msgid "no cherry-pick or revert in progress" msgstr "không cherry-pick hay revert trong tiến trình" -#: sequencer.c:788 +#: sequencer.c:793 msgid "cannot resolve HEAD" msgstr "không thể phân giải HEAD" -#: sequencer.c:790 +#: sequencer.c:795 msgid "cannot abort from a branch yet to be born" msgstr "không thể há»§y bỏ từ một nhánh mà nó còn chưa được tạo ra" -#: sequencer.c:812 builtin/apply.c:4005 +#: sequencer.c:817 builtin/apply.c:4005 #, c-format msgid "cannot open %s: %s" msgstr "không thể mở %s: %s" -#: sequencer.c:815 +#: sequencer.c:820 #, c-format msgid "cannot read %s: %s" msgstr "không thể đọc %s: %s" -#: sequencer.c:816 +#: sequencer.c:821 msgid "unexpected end of file" msgstr "kết thúc tập tin đột xuất" -#: sequencer.c:822 +#: sequencer.c:827 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "tập tin HEAD 'pre-cherry-pick' đã lưu `%s' bị hỏng" -#: sequencer.c:845 +#: sequencer.c:850 #, c-format msgid "Could not format %s." msgstr "Không thể định dạng %s." -#: sequencer.c:1007 +#: sequencer.c:1012 msgid "Can't revert as initial commit" msgstr "Không thể revert một lần chuyển giao (commit) khởi tạo" -#: sequencer.c:1008 +#: sequencer.c:1013 msgid "Can't cherry-pick into empty head" msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng" @@ -1404,7 +1379,7 @@ msgstr "git add [các-tùy-chọn] [--] ..." msgid "unexpected diff status %c" msgstr "trạng thái lệnh diff không như mong đợi %c" -#: builtin/add.c:67 builtin/commit.c:229 +#: builtin/add.c:67 builtin/commit.c:230 msgid "updating files failed" msgstr "Cập nhật tập tin gặp lỗi" @@ -1472,7 +1447,7 @@ msgstr "" msgid "dry run" msgstr "chạy thá»­" -#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1187 +#: builtin/add.c:320 builtin/apply.c:4354 builtin/commit.c:1154 #: builtin/count-objects.c:82 builtin/fsck.c:613 builtin/log.c:1477 #: builtin/mv.c:62 builtin/read-tree.c:112 msgid "be verbose" @@ -1550,9 +1525,9 @@ msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n" #: builtin/add.c:415 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" -msgstr "Có lẽ bạn muốn nói là 'git add .' phải không?\n" +msgstr "Có lẽ bạn muốn là `git add .' phải không?\n" -#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:289 builtin/mv.c:82 +#: builtin/add.c:421 builtin/clean.c:95 builtin/commit.c:290 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "tập tin ghi bảng mục lục bị hỏng" @@ -2087,7 +2062,7 @@ msgstr "git bisect--helper --next-all [--no-checkout]" #: builtin/bisect--helper.c:17 msgid "perform 'git bisect next'" -msgstr "thá»±c hiện 'git bisect next'" +msgstr "thá»±c hiện `git bisect next'" #: builtin/bisect--helper.c:19 msgid "update BISECT_HEAD instead of checking out the current commit" @@ -2103,97 +2078,97 @@ msgstr "git blame [các-tùy-chọn] [rev-opts] [rev] [--] tập-tin" msgid "[rev-opts] are documented in git-rev-list(1)" msgstr "[rev-opts] được mô tả trong git-rev-list(1)" -#: builtin/blame.c:2316 +#: builtin/blame.c:2373 msgid "Show blame entries as we find them, incrementally" msgstr "Hiển thị các mục `blame' như là chúng ta thấy chúng, tăng dần" -#: builtin/blame.c:2317 +#: builtin/blame.c:2374 msgid "Show blank SHA-1 for boundary commits (Default: off)" msgstr "" "Hiển thị SHA-1 trống cho những lần chuyển giao biên giới (Mặc định: off)" -#: builtin/blame.c:2318 +#: builtin/blame.c:2375 msgid "Do not treat root commits as boundaries (Default: off)" msgstr "Không coi các lần chuyển giao gốc là giới hạn (Mặc định: off)" -#: builtin/blame.c:2319 +#: builtin/blame.c:2376 msgid "Show work cost statistics" msgstr "Hiển thị thống kê công sức làm việc" -#: builtin/blame.c:2320 +#: builtin/blame.c:2377 msgid "Show output score for blame entries" msgstr "Hiển thị kết xuất điểm số có các mục tin `blame'" -#: builtin/blame.c:2321 +#: builtin/blame.c:2378 msgid "Show original filename (Default: auto)" msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)" -#: builtin/blame.c:2322 +#: builtin/blame.c:2379 msgid "Show original linenumber (Default: off)" msgstr "Hiển thị số dòng gốc (Mặc định: off)" -#: builtin/blame.c:2323 +#: builtin/blame.c:2380 msgid "Show in a format designed for machine consumption" msgstr "Hiển thị ở định dạng đã thiết kế cho sá»± tiêu dùng bằng máy" -#: builtin/blame.c:2324 +#: builtin/blame.c:2381 msgid "Show porcelain format with per-line commit information" msgstr "Hiển thị định dạng 'porcelain' với thông tin chuyển giao mỗi dòng" -#: builtin/blame.c:2325 +#: builtin/blame.c:2382 msgid "Use the same output mode as git-annotate (Default: off)" msgstr "Dùng cùng chế độ xuất ra vóigit-annotate (Mặc định: off)" -#: builtin/blame.c:2326 +#: builtin/blame.c:2383 msgid "Show raw timestamp (Default: off)" msgstr "Hiển thị dấu vết thời gian dạng thô (Mặc định: off)" -#: builtin/blame.c:2327 +#: builtin/blame.c:2384 msgid "Show long commit SHA1 (Default: off)" msgstr "Hiển thị SHA1 cá»§a lần chuyển giao (commit) dạng dài (Mặc định: off)" -#: builtin/blame.c:2328 +#: builtin/blame.c:2385 msgid "Suppress author name and timestamp (Default: off)" msgstr "Không hiển thị tên tác giả và dấu vết thời gian (Mặc định: off)" -#: builtin/blame.c:2329 +#: builtin/blame.c:2386 msgid "Show author email instead of name (Default: off)" msgstr "Hiển thị thư điện tá»­ cá»§a tác giả thay vì tên (Mặc định: off)" -#: builtin/blame.c:2330 +#: builtin/blame.c:2387 msgid "Ignore whitespace differences" msgstr "Bỏ qua các khác biệt do khoảng trắng gây ra" -#: builtin/blame.c:2331 +#: builtin/blame.c:2388 msgid "Spend extra cycles to find better match" msgstr "Tiêu thụ thêm năng tài nguyên máy móc để tìm kiếm tốt hÆ¡n nữa" -#: builtin/blame.c:2332 +#: builtin/blame.c:2389 msgid "Use revisions from instead of calling git-rev-list" msgstr "" "Sá»­ dụng điểm xét duyệt (revision) từ thay vì gọi `git-rev-list'" -#: builtin/blame.c:2333 +#: builtin/blame.c:2390 msgid "Use 's contents as the final image" msgstr "Sá»­ dụng nội dung cá»§a như là ảnh cuối cùng" -#: builtin/blame.c:2334 builtin/blame.c:2335 +#: builtin/blame.c:2391 builtin/blame.c:2392 msgid "score" msgstr "điểm số" -#: builtin/blame.c:2334 +#: builtin/blame.c:2391 msgid "Find line copies within and across files" msgstr "Tìm các bản sao chép dòng trong và ngang qua tập tin" -#: builtin/blame.c:2335 +#: builtin/blame.c:2392 msgid "Find line movements within and across files" msgstr "Tìm các di chuyển dòng trong và ngang qua tập tin" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "n,m" msgstr "n,m" -#: builtin/blame.c:2336 +#: builtin/blame.c:2393 msgid "Process only line range n,m, counting from 1" msgstr "Xá»­ lý chỉ dòng vùng n,m, tính từ 1" @@ -2401,8 +2376,8 @@ msgid "act on remote-tracking branches" msgstr "thao tác trên nhánh `remote-tracking'" #: builtin/branch.c:738 builtin/branch.c:744 builtin/branch.c:765 -#: builtin/branch.c:771 builtin/commit.c:1395 builtin/commit.c:1396 -#: builtin/commit.c:1397 builtin/commit.c:1398 builtin/tag.c:470 +#: builtin/branch.c:771 builtin/commit.c:1362 builtin/commit.c:1363 +#: builtin/commit.c:1364 builtin/commit.c:1365 builtin/tag.c:470 msgid "commit" msgstr "commit" @@ -2579,8 +2554,9 @@ msgid "git check-attr [-a | --all | attr...] [--] pathname..." msgstr "git check-attr [-a | --all | attr...] [--] tên-đường-dẫn..." #: builtin/check-attr.c:12 -msgid "git check-attr --stdin [-a | --all | attr...] < " -msgstr "git check-attr --stdin [-a | --all | attr...] < " +msgid "git check-attr --stdin [-z] [-a | --all | attr...] < " +msgstr "" +"git check-attr --stdin [-z] [-a | --all | attr...] < " #: builtin/check-attr.c:19 msgid "report all attributes set on file" @@ -2967,7 +2943,7 @@ msgstr "ép buộc" msgid "remove whole directories" msgstr "gỡ bỏ toàn bộ thư mục" -#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:802 +#: builtin/clean.c:56 builtin/describe.c:413 builtin/grep.c:803 #: builtin/ls-files.c:491 builtin/name-rev.c:231 builtin/show-ref.c:199 msgid "pattern" msgstr "mẫu" @@ -3093,7 +3069,7 @@ msgstr "lấy ra nhánh (checkout ) thay vì HEAD cá»§a máy chá»§" msgid "path to git-upload-pack on the remote" msgstr "đường dẫn đến git-upload-pack trên máy chá»§" -#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:747 +#: builtin/clone.c:93 builtin/fetch.c:83 builtin/grep.c:748 msgid "depth" msgstr "độ sâu" @@ -3170,69 +3146,69 @@ msgstr "Không tìm thấy nhánh máy chá»§ %s để nhân bản (clone)." msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "refers HEAD máy chá»§ chỉ đến ref không tồn tại, không thể checkout.\n" -#: builtin/clone.c:642 +#: builtin/clone.c:690 msgid "Too many arguments." msgstr "Có quá nhiều đối số." -#: builtin/clone.c:646 +#: builtin/clone.c:694 msgid "You must specify a repository to clone." msgstr "Bạn phải chỉ định một kho để mà nhân bản (clone)." -#: builtin/clone.c:657 +#: builtin/clone.c:705 #, c-format msgid "--bare and --origin %s options are incompatible." msgstr "tùy chọn --bare và --origin %s xung khắc nhau." -#: builtin/clone.c:671 +#: builtin/clone.c:719 #, c-format msgid "repository '%s' does not exist" msgstr "kho chứa `%s' chưa tồn tại" -#: builtin/clone.c:676 +#: builtin/clone.c:724 msgid "--depth is ignored in local clones; use file:// instead." msgstr "--depth bị lờ đi khi nhân bản nội bộ; hãy sá»­ dụng file:// để thay thế." -#: builtin/clone.c:686 +#: builtin/clone.c:734 #, c-format msgid "destination path '%s' already exists and is not an empty directory." msgstr "đường dẫn đích `%s' đã có từ trước và không phải là một thư mục rỗng." -#: builtin/clone.c:696 +#: builtin/clone.c:744 #, c-format msgid "working tree '%s' already exists." msgstr "cây làm việc `%s' đã sẵn tồn tại rồi." -#: builtin/clone.c:709 builtin/clone.c:723 +#: builtin/clone.c:757 builtin/clone.c:771 #, c-format msgid "could not create leading directories of '%s'" msgstr "không thể tạo các thư mục dẫn đầu cá»§a `%s'" -#: builtin/clone.c:712 +#: builtin/clone.c:760 #, c-format msgid "could not create work tree dir '%s'." msgstr "không thể tạo cây thư mục làm việc dir `%s'." -#: builtin/clone.c:731 +#: builtin/clone.c:779 #, c-format msgid "Cloning into bare repository '%s'...\n" msgstr "Đang nhân bản thành kho chứa bare `%s'...\n" -#: builtin/clone.c:733 +#: builtin/clone.c:781 #, c-format msgid "Cloning into '%s'...\n" msgstr "Đang nhân bản thành `%s'...\n" -#: builtin/clone.c:789 +#: builtin/clone.c:823 #, c-format msgid "Don't know how to clone %s" msgstr "Không biết làm cách nào để nhân bản (clone) %s" -#: builtin/clone.c:838 +#: builtin/clone.c:872 #, c-format msgid "Remote branch %s not found in upstream %s" msgstr "Nhánh máy chá»§ %s không tìm thấy trong thượng nguồn (upstream) %s" -#: builtin/clone.c:845 +#: builtin/clone.c:879 msgid "You appear to have cloned an empty repository." msgstr "Bạn hình như là đã nhân bản một kho trống rỗng." @@ -3268,15 +3244,15 @@ msgstr "Chèn thêm khoảng trắng giữa các cột" msgid "--command must be the first argument" msgstr "--command phải là đối số đầu tiên" -#: builtin/commit.c:33 +#: builtin/commit.c:34 msgid "git commit [options] [--] ..." msgstr "git commit [các-tùy-chọn] [--] ..." -#: builtin/commit.c:38 +#: builtin/commit.c:39 msgid "git status [options] [--] ..." msgstr "git status [các-tùy-chọn] [--] ..." -#: builtin/commit.c:43 +#: builtin/commit.c:44 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -3304,7 +3280,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:55 +#: builtin/commit.c:56 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -3317,7 +3293,7 @@ msgstr "" "hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n" "\"git reset HEAD^\".\n" -#: builtin/commit.c:60 +#: builtin/commit.c:61 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -3334,97 +3310,97 @@ msgstr "" "\n" "Nếu không, hãy thá»­ dùng `git reset'\n" -#: builtin/commit.c:256 +#: builtin/commit.c:257 msgid "failed to unpack HEAD tree object" msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây" -#: builtin/commit.c:298 +#: builtin/commit.c:299 msgid "unable to create temporary index" msgstr "không thể tạo bảng mục lục tạm thời" -#: builtin/commit.c:304 +#: builtin/commit.c:305 msgid "interactive add failed" msgstr "việc thêm tương tác gặp lỗi" -#: builtin/commit.c:337 builtin/commit.c:358 builtin/commit.c:408 +#: builtin/commit.c:338 builtin/commit.c:359 builtin/commit.c:409 msgid "unable to write new_index file" msgstr "không thể ghi tập tin lưu bảng mục lục mới (new_index)" -#: builtin/commit.c:389 +#: builtin/commit.c:390 msgid "cannot do a partial commit during a merge." msgstr "" "không thể thá»±c hiện việc chuyển giao (commit) cục bộ trong khi đang được hòa " "trộn." -#: builtin/commit.c:391 +#: builtin/commit.c:392 msgid "cannot do a partial commit during a cherry-pick." msgstr "" "không thể thá»±c hiện việc chuyển giao (commit) bộ phận trong khi đang cherry-" "pick." -#: builtin/commit.c:401 +#: builtin/commit.c:402 msgid "cannot read the index" msgstr "không đọc được bảng mục lục" -#: builtin/commit.c:421 +#: builtin/commit.c:422 msgid "unable to write temporary index file" msgstr "không thể ghi tập tin lưu bảng mục lục tạm thời" -#: builtin/commit.c:510 builtin/commit.c:516 +#: builtin/commit.c:509 builtin/commit.c:515 #, c-format msgid "invalid commit: %s" msgstr "lần chuyển giao (commit) không hợp lệ: %s" -#: builtin/commit.c:539 +#: builtin/commit.c:538 msgid "malformed --author parameter" msgstr "đối số --author bị dị hình" -#: builtin/commit.c:600 +#: builtin/commit.c:558 #, c-format msgid "Malformed ident string: '%s'" msgstr "Chuỗi thụt lề đầu dòng dị hình: `%s'" -#: builtin/commit.c:638 builtin/commit.c:671 builtin/commit.c:985 +#: builtin/commit.c:596 builtin/commit.c:629 builtin/commit.c:952 #, c-format msgid "could not lookup commit %s" msgstr "không thể tìm kiếm commit (lần chuyển giao) %s" -#: builtin/commit.c:650 builtin/shortlog.c:296 +#: builtin/commit.c:608 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(đang đọc thông điệp nhật ký từ đầu vào tiêu chuẩn)\n" -#: builtin/commit.c:652 +#: builtin/commit.c:610 msgid "could not read log from standard input" msgstr "không thể đọc nhật ký từ đầu vào tiêu chuẩn" -#: builtin/commit.c:656 +#: builtin/commit.c:614 #, c-format msgid "could not read log file '%s'" msgstr "không đọc được tệp nhật ký `%s'" -#: builtin/commit.c:662 +#: builtin/commit.c:620 msgid "commit has empty message" msgstr "lần chuyển giao (commit) có ghi chú trống rỗng" -#: builtin/commit.c:678 +#: builtin/commit.c:636 msgid "could not read MERGE_MSG" msgstr "không thể đọc MERGE_MSG" -#: builtin/commit.c:682 +#: builtin/commit.c:640 msgid "could not read SQUASH_MSG" msgstr "không thể đọc SQUASH_MSG" -#: builtin/commit.c:686 +#: builtin/commit.c:644 #, c-format msgid "could not read '%s'" msgstr "Không thể đọc `%s'." -#: builtin/commit.c:738 +#: builtin/commit.c:705 msgid "could not write commit template" msgstr "không thể ghi mẫu commit" -#: builtin/commit.c:749 +#: builtin/commit.c:716 #, c-format msgid "" "\n" @@ -3439,7 +3415,7 @@ msgstr "" "\t%s\n" "và thá»­ lại.\n" -#: builtin/commit.c:754 +#: builtin/commit.c:721 #, c-format msgid "" "\n" @@ -3454,7 +3430,7 @@ msgstr "" "\t%s\n" "và thá»­ lại.\n" -#: builtin/commit.c:766 +#: builtin/commit.c:733 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" @@ -3464,7 +3440,7 @@ msgstr "" "bắt đầu bằng `#' sẽ được bỏ qua, phần chú thích này nếu rỗng sẽ làm há»§y bỏ " "lần chuyển giao (commit).\n" -#: builtin/commit.c:771 +#: builtin/commit.c:738 msgid "" "Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" @@ -3475,140 +3451,140 @@ msgstr "" "bắt đầu bằng `#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n" "Phần chú thích này nếu rỗng sẽ làm há»§y bỏ lần chuyển giao (commit).\n" -#: builtin/commit.c:784 +#: builtin/commit.c:751 #, c-format msgid "%sAuthor: %s" msgstr "%sTác giả: %s" -#: builtin/commit.c:791 +#: builtin/commit.c:758 #, c-format msgid "%sCommitter: %s" msgstr "%sNgười chuyển giao (commit): %s" -#: builtin/commit.c:811 +#: builtin/commit.c:778 msgid "Cannot read index" msgstr "không đọc được bảng mục lục" -#: builtin/commit.c:848 +#: builtin/commit.c:815 msgid "Error building trees" msgstr "Gặp lỗi khi xây dá»±ng cây" -#: builtin/commit.c:863 builtin/tag.c:361 +#: builtin/commit.c:830 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Xin hãy áp dụng thông điệp sá»­ dụng hoặc là tùy chọn -m hoặc là -F.\n" -#: builtin/commit.c:960 +#: builtin/commit.c:927 #, c-format msgid "No existing author found with '%s'" msgstr "Không tìm thấy tác giả có sẵn với `%s'" -#: builtin/commit.c:975 builtin/commit.c:1175 +#: builtin/commit.c:942 builtin/commit.c:1142 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Chế độ cho các tập tin không bị theo vết không hợp lệ `%s'" -#: builtin/commit.c:1015 +#: builtin/commit.c:982 msgid "Using both --reset-author and --author does not make sense" msgstr "Sá»­ dụng cả hai tùy chọn --reset-author và --author không hợp lý" -#: builtin/commit.c:1026 +#: builtin/commit.c:993 msgid "You have nothing to amend." msgstr "Không có gì để amend (tu bổ) cả." -#: builtin/commit.c:1029 +#: builtin/commit.c:996 msgid "You are in the middle of a merge -- cannot amend." msgstr "" "Bạn đang ở giữa cá»§a quá trình hòa trộn -- không thể thá»±c hiện amend (tu bổ)." -#: builtin/commit.c:1031 +#: builtin/commit.c:998 msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" "Bạn đang ở giữa cá»§a quá trình cherry-pick -- không thể thá»±c hiện amend (tu " "bổ)." -#: builtin/commit.c:1034 +#: builtin/commit.c:1001 msgid "Options --squash and --fixup cannot be used together" msgstr "Các tùy chọn --squash và --fixup không thể sá»­ dụng cùng với nhau" -#: builtin/commit.c:1044 +#: builtin/commit.c:1011 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Chỉ một tùy chọn trong số -c/-C/-F/--fixup được sá»­ dụng" -#: builtin/commit.c:1046 +#: builtin/commit.c:1013 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Tùy chọn -m không thể được tổ hợp cùng với -c/-C/-F/--fixup." -#: builtin/commit.c:1054 +#: builtin/commit.c:1021 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" "--reset-author chỉ có thể được sá»­ dụng với tùy chọn -C, -c hay --amend." -#: builtin/commit.c:1071 +#: builtin/commit.c:1038 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được " "sá»­ dụng." -#: builtin/commit.c:1073 +#: builtin/commit.c:1040 msgid "No paths with --include/--only does not make sense." msgstr "Không đường dẫn với các tùy chọn --include/--only không hợp lý." -#: builtin/commit.c:1075 +#: builtin/commit.c:1042 msgid "Clever... amending the last one with dirty index." msgstr "Giỏi... tu bổ cái cuối với bảng mục lục phi nghÄ©a." -#: builtin/commit.c:1077 +#: builtin/commit.c:1044 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" "Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cÅ©ng không -o; đang " "giả định --only những-đường-dẫn..." -#: builtin/commit.c:1087 builtin/tag.c:577 +#: builtin/commit.c:1054 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "Chế độ dọn dẹp không hợp lệ %s" -#: builtin/commit.c:1092 +#: builtin/commit.c:1059 msgid "Paths with -a does not make sense." msgstr "Các đường dẫn với tùy chọn -a không hợp lý." -#: builtin/commit.c:1189 builtin/commit.c:1417 +#: builtin/commit.c:1156 builtin/commit.c:1384 msgid "show status concisely" msgstr "hiển thị trạng thái ở dạng súc tích" -#: builtin/commit.c:1191 builtin/commit.c:1419 +#: builtin/commit.c:1158 builtin/commit.c:1386 msgid "show branch information" msgstr "hiển thị thông tin nhánh" -#: builtin/commit.c:1193 builtin/commit.c:1421 builtin/push.c:389 +#: builtin/commit.c:1160 builtin/commit.c:1388 builtin/push.c:389 msgid "machine-readable output" msgstr "kết xuất dạng máy-có-thể-đọc" -#: builtin/commit.c:1196 builtin/commit.c:1423 +#: builtin/commit.c:1163 builtin/commit.c:1390 msgid "terminate entries with NUL" msgstr "chấm dứt các mục bằng NUL" -#: builtin/commit.c:1198 builtin/commit.c:1426 builtin/fast-export.c:636 +#: builtin/commit.c:1165 builtin/commit.c:1393 builtin/fast-export.c:636 #: builtin/fast-export.c:639 builtin/tag.c:461 msgid "mode" msgstr "chế độ" -#: builtin/commit.c:1199 builtin/commit.c:1426 +#: builtin/commit.c:1166 builtin/commit.c:1393 msgid "show untracked files, optional modes: all, normal, no. (Default: all)" msgstr "" "hiển thị các tập tin chưa được theo dõi dấu vết, các chế độ tùy chọn: all, " "normal, no. (Mặc định: all)" -#: builtin/commit.c:1202 +#: builtin/commit.c:1169 msgid "show ignored files" msgstr "hiển thị các tập tin ẩn" -#: builtin/commit.c:1203 parse-options.h:151 +#: builtin/commit.c:1170 parse-options.h:151 msgid "when" msgstr "khi" -#: builtin/commit.c:1204 +#: builtin/commit.c:1171 msgid "" "ignore changes to submodules, optional when: all, dirty, untracked. " "(Default: all)" @@ -3616,223 +3592,223 @@ msgstr "" "bỏ qua các thay đổi trong mô-đun con, tùy chọn khi: all, dirty, untracked. " "(Mặc định: all)" -#: builtin/commit.c:1206 +#: builtin/commit.c:1173 msgid "list untracked files in columns" msgstr "hiển thị danh sách các tập-tin chưa được theo dõi trong các cột" -#: builtin/commit.c:1275 +#: builtin/commit.c:1242 msgid "couldn't look up newly created commit" msgstr "không thể tìm thấy lần chuyển giao (commit) mới hÆ¡n đã được tạo" -#: builtin/commit.c:1277 +#: builtin/commit.c:1244 msgid "could not parse newly created commit" msgstr "" "không thể phân tích cú pháp cá»§a đối tượng chuyển giao mới hÆ¡n đã được tạo" -#: builtin/commit.c:1318 +#: builtin/commit.c:1285 msgid "detached HEAD" msgstr "đã rời khỏi HEAD" -#: builtin/commit.c:1320 +#: builtin/commit.c:1287 msgid " (root-commit)" msgstr " (root-commit)" -#: builtin/commit.c:1387 +#: builtin/commit.c:1354 msgid "suppress summary after successful commit" msgstr "không hiển thị tổng kết sau khi chuyển giao thành công" -#: builtin/commit.c:1388 +#: builtin/commit.c:1355 msgid "show diff in commit message template" msgstr "hiển thị sá»± khác biệt trong mẫu tin nhắn chuyển giao" -#: builtin/commit.c:1390 +#: builtin/commit.c:1357 msgid "Commit message options" msgstr "Các tùy chọn ghi chú commit" -#: builtin/commit.c:1391 builtin/tag.c:459 +#: builtin/commit.c:1358 builtin/tag.c:459 msgid "read message from file" msgstr "đọc chú thích từ tập tin" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "author" msgstr "tác giả" -#: builtin/commit.c:1392 +#: builtin/commit.c:1359 msgid "override author for commit" msgstr "ghi đè tác giả cho commit" -#: builtin/commit.c:1393 builtin/gc.c:178 +#: builtin/commit.c:1360 builtin/gc.c:178 msgid "date" msgstr "ngày tháng" -#: builtin/commit.c:1393 +#: builtin/commit.c:1360 msgid "override date for commit" msgstr "ghi đè ngày tháng cho commit" -#: builtin/commit.c:1394 builtin/merge.c:206 builtin/notes.c:534 -#: builtin/notes.c:691 builtin/tag.c:457 +#: builtin/commit.c:1361 builtin/merge.c:206 builtin/notes.c:537 +#: builtin/notes.c:694 builtin/tag.c:457 msgid "message" msgstr "thông điệp" -#: builtin/commit.c:1394 +#: builtin/commit.c:1361 msgid "commit message" msgstr "chú thích cá»§a lần commit" -#: builtin/commit.c:1395 +#: builtin/commit.c:1362 msgid "reuse and edit message from specified commit" msgstr "" "dùng lại các ghi chú từ lần chuyển giao (commit) đã cho nhưng có cho sá»­a chữa" -#: builtin/commit.c:1396 +#: builtin/commit.c:1363 msgid "reuse message from specified commit" msgstr "dùng lại các ghi chú từ lần chuyển giao (commit) đã cho" -#: builtin/commit.c:1397 +#: builtin/commit.c:1364 msgid "use autosquash formatted message to fixup specified commit" msgstr "" "dùng ghi chú có định dạng autosquash để sá»­a chữa lần chuyển giao đã chỉ ra" -#: builtin/commit.c:1398 +#: builtin/commit.c:1365 msgid "use autosquash formatted message to squash specified commit" msgstr "" "dùng lời nhắn có định dạng tá»± động nén để nén lại các lần chuyển giao đã chỉ " "ra" -#: builtin/commit.c:1399 +#: builtin/commit.c:1366 msgid "the commit is authored by me now (used with -C/-c/--amend)" msgstr "" "lần chuyển giao nhận tôi là tác giả (được dùng với tùy chọn -C/-c/--amend)" -#: builtin/commit.c:1400 builtin/log.c:1068 builtin/revert.c:109 +#: builtin/commit.c:1367 builtin/log.c:1068 builtin/revert.c:109 msgid "add Signed-off-by:" msgstr "thêm dòng Signed-off-by:" -#: builtin/commit.c:1401 +#: builtin/commit.c:1368 msgid "use specified template file" msgstr "sá»­ dụng tập tin mẫu đã cho" -#: builtin/commit.c:1402 +#: builtin/commit.c:1369 msgid "force edit of commit" msgstr "ép buộc sá»­a lần commit" -#: builtin/commit.c:1403 +#: builtin/commit.c:1370 msgid "default" msgstr "mặc định" -#: builtin/commit.c:1403 builtin/tag.c:462 +#: builtin/commit.c:1370 builtin/tag.c:462 msgid "how to strip spaces and #comments from message" msgstr "làm thế nào để cắt bỏ khoảng trắng và #ghichú từ mẩu tin nhắn" -#: builtin/commit.c:1404 +#: builtin/commit.c:1371 msgid "include status in commit message template" msgstr "bao gồm các trạng thái ghi mẫu ghi chú chuyển giao (commit)" -#: builtin/commit.c:1405 builtin/merge.c:213 builtin/tag.c:463 +#: builtin/commit.c:1372 builtin/merge.c:213 builtin/tag.c:463 msgid "key id" msgstr "id khóa" -#: builtin/commit.c:1406 builtin/merge.c:214 +#: builtin/commit.c:1373 builtin/merge.c:214 msgid "GPG sign commit" msgstr "ký lần commit dùng GPG" #. end commit message options -#: builtin/commit.c:1409 +#: builtin/commit.c:1376 msgid "Commit contents options" msgstr "Các tùy nội dung ghi chú commit" -#: builtin/commit.c:1410 +#: builtin/commit.c:1377 msgid "commit all changed files" msgstr "chuyển giao tất cả các tập tin có thay đổi" -#: builtin/commit.c:1411 +#: builtin/commit.c:1378 msgid "add specified files to index for commit" msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục để chuyển giao (commit)" -#: builtin/commit.c:1412 +#: builtin/commit.c:1379 msgid "interactively add files" msgstr "thêm các tập-tin bằng tương tác" -#: builtin/commit.c:1413 +#: builtin/commit.c:1380 msgid "interactively add changes" msgstr "thêm các thay đổi bằng tương tác" -#: builtin/commit.c:1414 +#: builtin/commit.c:1381 msgid "commit only specified files" msgstr "chỉ chuyển giao các tập tin đã chỉ ra" -#: builtin/commit.c:1415 +#: builtin/commit.c:1382 msgid "bypass pre-commit hook" msgstr "vòng qua móc (hook) pre-commit" -#: builtin/commit.c:1416 +#: builtin/commit.c:1383 msgid "show what would be committed" msgstr "hiển thị xem cái gì có thể được chuyển giao" -#: builtin/commit.c:1424 +#: builtin/commit.c:1391 msgid "amend previous commit" msgstr "tu bổ (amend) lần commit trước" -#: builtin/commit.c:1425 +#: builtin/commit.c:1392 msgid "bypass post-rewrite hook" msgstr "vòng qua móc (hook) post-rewrite" -#: builtin/commit.c:1430 +#: builtin/commit.c:1397 msgid "ok to record an empty change" msgstr "ok để ghi lại một thay đổi trống rỗng" -#: builtin/commit.c:1433 +#: builtin/commit.c:1400 msgid "ok to record a change with an empty message" msgstr "ok để ghi các thay đổi với lời nhắn trống rỗng" -#: builtin/commit.c:1464 +#: builtin/commit.c:1432 msgid "could not parse HEAD commit" msgstr "không thể phân tích commit (lần chuyển giao) HEAD" -#: builtin/commit.c:1502 builtin/merge.c:508 +#: builtin/commit.c:1470 builtin/merge.c:508 #, c-format msgid "could not open '%s' for reading" msgstr "không thể mở `%s' để đọc" -#: builtin/commit.c:1509 +#: builtin/commit.c:1477 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Tập tin MERGE_HEAD sai hỏng (%s)" -#: builtin/commit.c:1516 +#: builtin/commit.c:1484 msgid "could not read MERGE_MODE" msgstr "không thể đọc MERGE_MODE" -#: builtin/commit.c:1535 +#: builtin/commit.c:1503 #, c-format msgid "could not read commit message: %s" msgstr "không thể đọc thông điệp (message) commit (lần chuyển giao): %s" -#: builtin/commit.c:1549 +#: builtin/commit.c:1517 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "" "Đang bỏ qua việc chuyển giao (commit); bạn đã không biên soạn thông điệp " "(message).\n" -#: builtin/commit.c:1554 +#: builtin/commit.c:1522 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" "Đang bỏ qua lần chuyển giao (commit) bởi vì thông điệp cá»§a nó trống rỗng.\n" -#: builtin/commit.c:1569 builtin/merge.c:935 builtin/merge.c:960 +#: builtin/commit.c:1537 builtin/merge.c:935 builtin/merge.c:960 msgid "failed to write commit object" msgstr "gặp lỗi khi ghi đối tượng chuyển giao (commit)" -#: builtin/commit.c:1590 +#: builtin/commit.c:1558 msgid "cannot lock HEAD ref" msgstr "không thể khóa HEAD ref (tham chiếu)" -#: builtin/commit.c:1594 +#: builtin/commit.c:1562 msgid "cannot update HEAD ref" msgstr "không thể cập nhật ref (tham chiếu) HEAD" -#: builtin/commit.c:1605 +#: builtin/commit.c:1573 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -4264,126 +4240,126 @@ msgstr "Không thể tìm thấy máy chá»§ cho tham chiếu HEAD" msgid "object %s not found" msgstr "Không tìm thấy đối tượng %s" -#: builtin/fetch.c:260 +#: builtin/fetch.c:259 msgid "[up to date]" msgstr "[đã cập nhật]" -#: builtin/fetch.c:274 +#: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (không thể fetch (lấy) về nhánh hiện hành)" -#: builtin/fetch.c:275 builtin/fetch.c:361 +#: builtin/fetch.c:274 builtin/fetch.c:360 msgid "[rejected]" msgstr "[Bị từ chối]" -#: builtin/fetch.c:286 +#: builtin/fetch.c:285 msgid "[tag update]" msgstr "[cập nhật thẻ]" -#: builtin/fetch.c:288 builtin/fetch.c:323 builtin/fetch.c:341 +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr " (không thể cập nhật tham chiếu (ref) nội bộ)" -#: builtin/fetch.c:306 +#: builtin/fetch.c:305 msgid "[new tag]" msgstr "[thẻ mới]" -#: builtin/fetch.c:309 +#: builtin/fetch.c:308 msgid "[new branch]" msgstr "[nhánh mới]" -#: builtin/fetch.c:312 +#: builtin/fetch.c:311 msgid "[new ref]" msgstr "[ref (tham chiếu) mới]" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "unable to update local ref" msgstr "không thể cập nhật tham chiếu (ref) nội bộ" -#: builtin/fetch.c:357 +#: builtin/fetch.c:356 msgid "forced update" msgstr "cưỡng bức cập nhật" -#: builtin/fetch.c:363 +#: builtin/fetch.c:362 msgid "(non-fast-forward)" msgstr "(non-fast-forward)" -#: builtin/fetch.c:394 builtin/fetch.c:686 +#: builtin/fetch.c:393 builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" msgstr "không thể mở %s: %s\n" -#: builtin/fetch.c:403 +#: builtin/fetch.c:402 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s đã không gá»­i tất cả các đối tượng cần thiết\n" -#: builtin/fetch.c:489 +#: builtin/fetch.c:488 #, c-format msgid "From %.*s\n" msgstr "Từ %.*s\n" -#: builtin/fetch.c:500 +#: builtin/fetch.c:499 #, c-format msgid "" "some local refs could not be updated; try running\n" " 'git remote prune %s' to remove any old, conflicting branches" msgstr "" "một số tham chiếu (refs) nội bộ không thể được cập nhật; hãy thá»­ chạy\n" -" 'git remote prune %s' để bỏ đi những nhánh cÅ©, hay bị xung đột" +" `git remote prune %s' để bỏ đi những nhánh cÅ©, hay bị xung đột" -#: builtin/fetch.c:550 +#: builtin/fetch.c:549 #, c-format msgid " (%s will become dangling)" msgstr " (%s sẽ trở thành không đầu (không được quản lý))" -#: builtin/fetch.c:551 +#: builtin/fetch.c:550 #, c-format msgid " (%s has become dangling)" msgstr " (%s đã trở thành không đầu (không được quản lý))" -#: builtin/fetch.c:558 +#: builtin/fetch.c:557 msgid "[deleted]" msgstr "[đã xóa]" -#: builtin/fetch.c:559 builtin/remote.c:1055 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "(không)" -#: builtin/fetch.c:676 +#: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "" "Từ chối việc lấy (fetch) vào trong nhánh hiện tại %s cá»§a một kho chứa không " "phải kho trần (bare)" -#: builtin/fetch.c:710 +#: builtin/fetch.c:709 #, c-format msgid "Don't know how to fetch from %s" msgstr "Không biết làm cách nào để lấy về (fetch) từ %s" -#: builtin/fetch.c:787 +#: builtin/fetch.c:786 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Tùy chọn \"%s\" có giá trị \"%s\" là không hợp lệ cho %s" -#: builtin/fetch.c:790 +#: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Tùy chọn \"%s\" bị bỏ qua với %s\n" -#: builtin/fetch.c:892 +#: builtin/fetch.c:891 #, c-format msgid "Fetching %s\n" msgstr "Đang lấy (fetch) %s\n" -#: builtin/fetch.c:894 builtin/remote.c:100 +#: builtin/fetch.c:893 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "không thể fetch (lấy) %s" -#: builtin/fetch.c:913 +#: builtin/fetch.c:912 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -4391,24 +4367,24 @@ msgstr "" "Chưa chỉ ra kho chứa máy chá»§. Xin hãy chỉ định hoặc là URL hoặc\n" "tên máy chá»§ từ cái mà những điểm xét duyệt mới có thể được fetch (lấy về)." -#: builtin/fetch.c:933 +#: builtin/fetch.c:932 msgid "You need to specify a tag name." msgstr "Bạn phải định rõ tên thẻ." -#: builtin/fetch.c:985 +#: builtin/fetch.c:984 msgid "fetch --all does not take a repository argument" msgstr "lệnh lấy về \"fetch --all\" không lấy đối số kho chứa" -#: builtin/fetch.c:987 +#: builtin/fetch.c:986 msgid "fetch --all does not make sense with refspecs" msgstr "lệnh lấy về \"fetch --all\" không hợp lý với refspecs" -#: builtin/fetch.c:998 +#: builtin/fetch.c:997 #, c-format msgid "No such remote or remote group: %s" msgstr "không có nhóm máy chá»§ hay máy chá»§ như thế: %s" -#: builtin/fetch.c:1006 +#: builtin/fetch.c:1005 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Việc lấy về cả một nhóm và chỉ định refspecs không hợp lý" @@ -4417,7 +4393,7 @@ msgid "git fmt-merge-msg [-m ] [--log[=]|--no-log] [--file ]" msgstr "" "git fmt-merge-msg [-m ] [--log[=]|--no-log] [--file ]" -#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:786 +#: builtin/fmt-merge-msg.c:653 builtin/fmt-merge-msg.c:656 builtin/grep.c:787 #: builtin/merge.c:188 builtin/show-branch.c:656 builtin/show-ref.c:192 #: builtin/tag.c:448 parse-options.h:133 parse-options.h:235 msgid "n" @@ -4553,12 +4529,7 @@ msgstr "cẩn thận hÆ¡n nữa (tăng thời gian chạy)" msgid "enable auto-gc mode" msgstr "bật chế độ auto-gc" -#: builtin/gc.c:221 -#, c-format -msgid "Auto packing the repository for optimum performance.\n" -msgstr "Tá»± động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n" - -#: builtin/gc.c:224 +#: builtin/gc.c:222 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -4568,240 +4539,244 @@ msgstr "" "chạy lệnh \"git gc\" một cách thá»§ công. Hãy xem \"git help gc\" để biết thêm " "chi tiết.\n" -#: builtin/gc.c:251 +#: builtin/gc.c:249 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" -"Có quá nhiều đối tượng tá»± do không được dùng đến; hãy chạy lệnh 'git prune' " +"Có quá nhiều đối tượng tá»± do không được dùng đến; hãy chạy lệnh `git prune' " "để xóa bỏ chúng đi." #: builtin/grep.c:22 msgid "git grep [options] [-e] [...] [[--] ...]" msgstr "git grep [các-tùy-chọn] [-e] [...] [[--] <đường-dẫn>...]" -#: builtin/grep.c:216 +#: builtin/grep.c:217 #, c-format msgid "grep: failed to create thread: %s" msgstr "grep: gặp lỗi tạo tuyến (thread): %s" -#: builtin/grep.c:454 +#: builtin/grep.c:455 #, c-format msgid "Failed to chdir: %s" msgstr "Gặp lỗi với lệnh chdir: %s" -#: builtin/grep.c:530 builtin/grep.c:564 +#: builtin/grep.c:531 builtin/grep.c:565 #, c-format msgid "unable to read tree (%s)" msgstr "không thể đọc cây (%s)" -#: builtin/grep.c:578 +#: builtin/grep.c:579 #, c-format msgid "unable to grep from object of type %s" msgstr "không thể thá»±c hiện lệnh grep (lọc tìm) từ đối tượng thuộc kiểu %s" -#: builtin/grep.c:636 +#: builtin/grep.c:637 #, c-format msgid "switch `%c' expects a numerical value" msgstr "chuyển đến `%c' mong chờ một giá trị bằng số" -#: builtin/grep.c:653 +#: builtin/grep.c:654 #, c-format msgid "cannot open '%s'" msgstr "không mở được `%s'" -#: builtin/grep.c:728 +#: builtin/grep.c:729 msgid "search in index instead of in the work tree" msgstr "tìm trong bảng mục lục thay vì trong cây làm việc" -#: builtin/grep.c:730 +#: builtin/grep.c:731 msgid "find in contents not managed by git" msgstr "tìm trong nội dung không được quản lý bởi git" -#: builtin/grep.c:732 +#: builtin/grep.c:733 msgid "search in both tracked and untracked files" msgstr "tìm kiếm các tập tin được và chưa được theo dõi dấu vết" -#: builtin/grep.c:734 +#: builtin/grep.c:735 msgid "search also in ignored files" msgstr "tìm cả trong các tập tin đã bị lờ đi" -#: builtin/grep.c:737 +#: builtin/grep.c:738 msgid "show non-matching lines" msgstr "hiển thị những dòng không khớp với mẫu" -#: builtin/grep.c:739 +#: builtin/grep.c:740 msgid "case insensitive matching" msgstr "phân biệt chữ hoa/thường" -#: builtin/grep.c:741 +#: builtin/grep.c:742 msgid "match patterns only at word boundaries" msgstr "chỉ khớp mẫu tại đường ranh giới từ" -#: builtin/grep.c:743 +#: builtin/grep.c:744 msgid "process binary files as text" msgstr "xá»­ lý tập tin nhị phân như là dạng văn bản thường" -#: builtin/grep.c:745 +#: builtin/grep.c:746 msgid "don't match patterns in binary files" msgstr "không khớp mẫu trong các tập tin nhị phân" -#: builtin/grep.c:748 +#: builtin/grep.c:749 msgid "descend at most levels" msgstr "giảm xuống ít nhất mức " -#: builtin/grep.c:752 +#: builtin/grep.c:753 msgid "use extended POSIX regular expressions" msgstr "dùng biểu thức chính qui POSIX có mở rộng" -#: builtin/grep.c:755 +#: builtin/grep.c:756 msgid "use basic POSIX regular expressions (default)" msgstr "sá»­ dụng biểu thức chính quy kiểu POSIX (mặc định)" -#: builtin/grep.c:758 +#: builtin/grep.c:759 msgid "interpret patterns as fixed strings" msgstr "diễn dịch các mẫu như là chuỗi cố định" -#: builtin/grep.c:761 +#: builtin/grep.c:762 msgid "use Perl-compatible regular expressions" msgstr "sá»­ dụng biểu thức chính quy tương thích Perl" -#: builtin/grep.c:764 +#: builtin/grep.c:765 msgid "show line numbers" msgstr "hiển thị số cá»§a dòng" -#: builtin/grep.c:765 +#: builtin/grep.c:766 msgid "don't show filenames" msgstr "không hiển thị tên tập tin" -#: builtin/grep.c:766 +#: builtin/grep.c:767 msgid "show filenames" msgstr "hiển thị các tên tập tin" -#: builtin/grep.c:768 +#: builtin/grep.c:769 msgid "show filenames relative to top directory" msgstr "hiển thị tên tập tin tương đối với thư mục đỉnh (top)" -#: builtin/grep.c:770 +#: builtin/grep.c:771 msgid "show only filenames instead of matching lines" msgstr "chỉ hiển thị tên tập tin thay vì những dòng khớp với mẫu" -#: builtin/grep.c:772 +#: builtin/grep.c:773 msgid "synonym for --files-with-matches" msgstr "đồng nghÄ©a với --files-with-matches" -#: builtin/grep.c:775 +#: builtin/grep.c:776 msgid "show only the names of files without match" msgstr "chỉ hiển thị tên cho những tập tin không khớp với mẫu" -#: builtin/grep.c:777 +#: builtin/grep.c:778 msgid "print NUL after filenames" msgstr "thêm NUL vào sau tên tập tin" -#: builtin/grep.c:779 +#: builtin/grep.c:780 msgid "show the number of matches instead of matching lines" msgstr "hiển thị số lượng khớp thay vì những dòng khớp với mẫu" -#: builtin/grep.c:780 +#: builtin/grep.c:781 msgid "highlight matches" msgstr "tô sáng cái khớp" -#: builtin/grep.c:782 +#: builtin/grep.c:783 msgid "print empty line between matches from different files" msgstr "hiển thị dòng trống giữa các lần khớp từ các tập tin khác biệt" -#: builtin/grep.c:784 +#: builtin/grep.c:785 msgid "show filename only once above matches from same file" msgstr "" "hiển thị tên tập tin một lần phía trên các lần khớp từ cùng một tập tin" -#: builtin/grep.c:787 +#: builtin/grep.c:788 msgid "show context lines before and after matches" msgstr "hiển thị dòng nội dung phía trước và sau các lần khớp" -#: builtin/grep.c:790 +#: builtin/grep.c:791 msgid "show context lines before matches" msgstr "hiển thị dòng nội dung trước khớp" -#: builtin/grep.c:792 +#: builtin/grep.c:793 msgid "show context lines after matches" msgstr "hiển thị dòng nội dung sau khớp" -#: builtin/grep.c:793 +#: builtin/grep.c:794 msgid "shortcut for -C NUM" msgstr "Dạng tắt cho -C SỐ" -#: builtin/grep.c:796 +#: builtin/grep.c:797 msgid "show a line with the function name before matches" msgstr "hiển thị dòng vói tên hàm trước các lần khớp" -#: builtin/grep.c:798 +#: builtin/grep.c:799 msgid "show the surrounding function" msgstr "hiển thị hàm bao quanh" -#: builtin/grep.c:801 +#: builtin/grep.c:802 msgid "read patterns from file" msgstr "đọc mẫu từ tập-tin" -#: builtin/grep.c:803 +#: builtin/grep.c:804 msgid "match " msgstr "match " -#: builtin/grep.c:805 +#: builtin/grep.c:806 msgid "combine patterns specified with -e" msgstr "tổ hợp mẫu được chỉ ra với tùy chọn -e" -#: builtin/grep.c:817 +#: builtin/grep.c:818 msgid "indicate hit with exit status without output" msgstr "đưa ra gợi ý với trạng thái thoát mà không có kết xuất" -#: builtin/grep.c:819 +#: builtin/grep.c:820 msgid "show only matches from files that match all patterns" msgstr "chỉ hiển thị những cái khớp từ tập tin mà nó khớp toàn bộ các mẫu" #: builtin/grep.c:822 +msgid "show parse tree for grep expression" +msgstr "hiển thị cây phân tích cú pháp cho biểu thức `grep' (tìm kiếm)" + +#: builtin/grep.c:826 msgid "pager" msgstr "trang giấy" -#: builtin/grep.c:822 +#: builtin/grep.c:826 msgid "show matching files in the pager" msgstr "hiển thị các tập tin khớp trong trang giấy" -#: builtin/grep.c:825 +#: builtin/grep.c:829 msgid "allow calling of grep(1) (ignored by this build)" msgstr "cho phép gọi grep(1) (bị bỏ qua bởi lần dịch này)" -#: builtin/grep.c:826 builtin/show-ref.c:201 +#: builtin/grep.c:830 builtin/show-ref.c:201 msgid "show usage" msgstr "hiển thị cách dùng" -#: builtin/grep.c:917 +#: builtin/grep.c:921 msgid "no pattern given." msgstr "chưa chỉ ra mẫu." -#: builtin/grep.c:931 +#: builtin/grep.c:935 #, c-format msgid "bad object %s" msgstr "đối tượng sai %s" -#: builtin/grep.c:972 +#: builtin/grep.c:976 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc" -#: builtin/grep.c:995 +#: builtin/grep.c:999 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached hay --untracked không được sá»­ dụng với --no-index." -#: builtin/grep.c:1000 +#: builtin/grep.c:1004 msgid "--no-index or --untracked cannot be used with revs." msgstr "" "--no-index hay --untracked không được sá»­ dụng cùng với các tùy chọn liên " "quan đến revs." -#: builtin/grep.c:1003 +#: builtin/grep.c:1007 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard không thể sá»­ dụng cho nội dung lưu dấu vết." -#: builtin/grep.c:1011 +#: builtin/grep.c:1015 msgid "both --cached and trees are given." msgstr "cả hai --cached và các cây phải được chỉ ra." @@ -5812,7 +5787,7 @@ msgstr "cho phép fast-forward (mặc định)" msgid "abort if fast-forward is not possible" msgstr "bỏ qua nếu fast-forward không thể được" -#: builtin/merge.c:202 builtin/notes.c:867 builtin/revert.c:112 +#: builtin/merge.c:202 builtin/notes.c:870 builtin/revert.c:112 msgid "strategy" msgstr "chiến lược" @@ -5917,7 +5892,7 @@ msgstr "Không thể đọc từ `%s'" #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" -"Vẫn chưa hòa trộn các lần chuyển giao (commit); sá»­ dụng lệnh 'git commit' để " +"Vẫn chưa hòa trộn các lần chuyển giao (commit); sá»­ dụng lệnh `git commit' để " "hoàn tất việc hòa trộn.\n" #: builtin/merge.c:891 @@ -6289,11 +6264,11 @@ msgstr "đọc từ đầu vào tiêu chuẩn" msgid "allow to print `undefined` names" msgstr "cho phép hiển thị các tên `chưa định nghÄ©a'" -#: builtin/notes.c:23 +#: builtin/notes.c:26 msgid "git notes [--ref ] [list []]" msgstr "git notes [--ref ] [list [<đối-tượng>]]" -#: builtin/notes.c:24 +#: builtin/notes.c:27 msgid "" "git notes [--ref ] add [-f] [-m | -F | (-c | -C) " "] []" @@ -6301,11 +6276,11 @@ msgstr "" "git notes [--ref ] add [-f] [-m | -F | (-c | " "-C) <đối-tượng>] [<đối-tượng>]" -#: builtin/notes.c:25 +#: builtin/notes.c:28 msgid "git notes [--ref ] copy [-f] " msgstr "git notes [--ref ] copy [-f] <đến-đối-tượng>" -#: builtin/notes.c:26 +#: builtin/notes.c:29 msgid "" "git notes [--ref ] append [-m | -F | (-c | -C) " "] []" @@ -6313,228 +6288,228 @@ msgstr "" "git notes [--ref ] append [-m | -F | (-c | -" "C) <đối-tượng>] [<đối-tượng>]" -#: builtin/notes.c:27 +#: builtin/notes.c:30 msgid "git notes [--ref ] edit []" msgstr "git notes [--ref ] edit [<đối-tượng>]" -#: builtin/notes.c:28 +#: builtin/notes.c:31 msgid "git notes [--ref ] show []" msgstr "git notes [--ref ] show [<đối-tượng>]" -#: builtin/notes.c:29 +#: builtin/notes.c:32 msgid "" "git notes [--ref ] merge [-v | -q] [-s ] " msgstr "" "git notes [--ref ] merge [-v | -q] [-s ] " -#: builtin/notes.c:30 +#: builtin/notes.c:33 msgid "git notes merge --commit [-v | -q]" msgstr "git notes merge --commit [-v | -q]" -#: builtin/notes.c:31 +#: builtin/notes.c:34 msgid "git notes merge --abort [-v | -q]" msgstr "git notes merge --abort [-v | -q]" -#: builtin/notes.c:32 +#: builtin/notes.c:35 msgid "git notes [--ref ] remove [...]" msgstr "git notes [--ref ] remove [<đối-tượng>...]" -#: builtin/notes.c:33 +#: builtin/notes.c:36 msgid "git notes [--ref ] prune [-n | -v]" msgstr "git notes [--ref ] prune [-n | -v]" -#: builtin/notes.c:34 +#: builtin/notes.c:37 msgid "git notes [--ref ] get-ref" msgstr "git notes [--ref ] get-ref" -#: builtin/notes.c:39 +#: builtin/notes.c:42 msgid "git notes [list []]" msgstr "git notes [list [<đối tượng>]]" -#: builtin/notes.c:44 +#: builtin/notes.c:47 msgid "git notes add [] []" msgstr "git notes add [] [<đối-tượng>]" -#: builtin/notes.c:49 +#: builtin/notes.c:52 msgid "git notes copy [] " msgstr "git notes copy [] <đến-đối-tượng>" -#: builtin/notes.c:50 +#: builtin/notes.c:53 msgid "git notes copy --stdin [ ]..." msgstr "git notes copy --stdin [ <đến-đối-tượng>]..." -#: builtin/notes.c:55 +#: builtin/notes.c:58 msgid "git notes append [] []" msgstr "git notes append [] [<đối-tượng>]" -#: builtin/notes.c:60 +#: builtin/notes.c:63 msgid "git notes edit []" msgstr "git notes edit [<đối tượng>]" -#: builtin/notes.c:65 +#: builtin/notes.c:68 msgid "git notes show []" msgstr "git notes show [<đối tượng>]" -#: builtin/notes.c:70 +#: builtin/notes.c:73 msgid "git notes merge [] " msgstr "git notes merge [] " -#: builtin/notes.c:71 +#: builtin/notes.c:74 msgid "git notes merge --commit []" msgstr "git notes merge --commit []" -#: builtin/notes.c:72 +#: builtin/notes.c:75 msgid "git notes merge --abort []" msgstr "git notes merge --abort []" -#: builtin/notes.c:77 +#: builtin/notes.c:80 msgid "git notes remove []" msgstr "git notes remove [<đối tượng>]" -#: builtin/notes.c:82 +#: builtin/notes.c:85 msgid "git notes prune []" msgstr "git notes prune []" -#: builtin/notes.c:87 +#: builtin/notes.c:90 msgid "git notes get-ref" msgstr "git notes get-ref" -#: builtin/notes.c:139 +#: builtin/notes.c:142 #, c-format msgid "unable to start 'show' for object '%s'" msgstr "không thể khởi chạy 'show' cho đối tượng `%s'" -#: builtin/notes.c:145 +#: builtin/notes.c:148 msgid "can't fdopen 'show' output fd" msgstr "không thể fdopen 'show' (lệnh hiển thị) mô tả tập tin (fd) kết xuất" -#: builtin/notes.c:155 +#: builtin/notes.c:158 #, c-format msgid "failed to close pipe to 'show' for object '%s'" msgstr "gặp lỗi khi đóng đường ống cho lệnh 'show' cho đối tượng `%s'" -#: builtin/notes.c:158 +#: builtin/notes.c:161 #, c-format msgid "failed to finish 'show' for object '%s'" msgstr "gặp lỗi khi hoàn thành `show' cho đối tượng `%s'" -#: builtin/notes.c:175 builtin/tag.c:347 +#: builtin/notes.c:178 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "không thể tạo tập tin `%s'" -#: builtin/notes.c:189 +#: builtin/notes.c:192 msgid "Please supply the note contents using either -m or -F option" msgstr "" "Xin hãy áp dụng nội dung cá»§a ghi chú sá»­ dụng hoặc là tùy chọn -m hoặc là -F" -#: builtin/notes.c:210 builtin/notes.c:973 +#: builtin/notes.c:213 builtin/notes.c:976 #, c-format msgid "Removing note for object %s\n" msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n" -#: builtin/notes.c:215 +#: builtin/notes.c:218 msgid "unable to write note object" msgstr "không thể ghi đối tượng ghi chú (note)" -#: builtin/notes.c:217 +#: builtin/notes.c:220 #, c-format msgid "The note contents has been left in %s" msgstr "Nội dung ghi chú còn lại %s" -#: builtin/notes.c:251 builtin/tag.c:542 +#: builtin/notes.c:254 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "không thể đọc `%s'" -#: builtin/notes.c:253 builtin/tag.c:545 +#: builtin/notes.c:256 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "không thể mở để đọc hay ghi `%s'" -#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 -#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 -#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 +#: builtin/notes.c:275 builtin/notes.c:448 builtin/notes.c:450 +#: builtin/notes.c:510 builtin/notes.c:564 builtin/notes.c:647 +#: builtin/notes.c:652 builtin/notes.c:727 builtin/notes.c:769 +#: builtin/notes.c:971 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "Gặp lỗi khi giải quyết `%s' như là một tham chiếu (ref) hợp lệ." -#: builtin/notes.c:275 +#: builtin/notes.c:278 #, c-format msgid "Failed to read object '%s'." msgstr "Gặp lỗi khi đọc đối tượng `%s'." -#: builtin/notes.c:299 +#: builtin/notes.c:302 msgid "Cannot commit uninitialized/unreferenced notes tree" msgstr "" "Không thể chuyển giao (commit) chưa được khởi tạo hoặc không được tham chiếu " "cây ghi chú" -#: builtin/notes.c:340 +#: builtin/notes.c:343 #, c-format msgid "Bad notes.rewriteMode value: '%s'" msgstr "Giá trị notes.rewriteMode sai: `%s'" -#: builtin/notes.c:350 +#: builtin/notes.c:353 #, c-format msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài cá»§a refs/notes/)" #. TRANSLATORS: The first %s is the name of the #. environment variable, the second %s is its value -#: builtin/notes.c:377 +#: builtin/notes.c:380 #, c-format msgid "Bad %s value: '%s'" msgstr "Giá trị %s sai: `%s'" -#: builtin/notes.c:441 +#: builtin/notes.c:444 #, c-format msgid "Malformed input line: '%s'." msgstr "Dòng nhập vào dị hình: `%s'." -#: builtin/notes.c:456 +#: builtin/notes.c:459 #, c-format msgid "Failed to copy notes from '%s' to '%s'" msgstr "Gặp lỗi khi sao chép ghi chú (note) từ `%s' tới `%s'" -#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627 -#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759 -#: builtin/notes.c:1033 +#: builtin/notes.c:503 builtin/notes.c:557 builtin/notes.c:630 +#: builtin/notes.c:642 builtin/notes.c:715 builtin/notes.c:762 +#: builtin/notes.c:1036 msgid "too many parameters" msgstr "quá nhiều đối số" -#: builtin/notes.c:513 builtin/notes.c:772 +#: builtin/notes.c:516 builtin/notes.c:775 #, c-format msgid "No note found for object %s." msgstr "không tìm thấy ghi chú cho đối tượng %s." -#: builtin/notes.c:535 builtin/notes.c:692 +#: builtin/notes.c:538 builtin/notes.c:695 msgid "note contents as a string" msgstr "nội dung ghi chú (note) nằm trong một chuỗi" -#: builtin/notes.c:538 builtin/notes.c:695 +#: builtin/notes.c:541 builtin/notes.c:698 msgid "note contents in a file" msgstr "nội dung ghi chú (note) nằm trong một tập tin" -#: builtin/notes.c:540 builtin/notes.c:543 builtin/notes.c:697 -#: builtin/notes.c:700 builtin/tag.c:476 +#: builtin/notes.c:543 builtin/notes.c:546 builtin/notes.c:700 +#: builtin/notes.c:703 builtin/tag.c:476 msgid "object" msgstr "đối tượng" -#: builtin/notes.c:541 builtin/notes.c:698 +#: builtin/notes.c:544 builtin/notes.c:701 msgid "reuse and edit specified note object" msgstr "dùng lại nhưng có sá»­a chữa đối tượng note đã chỉ ra" -#: builtin/notes.c:544 builtin/notes.c:701 +#: builtin/notes.c:547 builtin/notes.c:704 msgid "reuse specified note object" msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra" -#: builtin/notes.c:546 builtin/notes.c:614 +#: builtin/notes.c:549 builtin/notes.c:617 msgid "replace existing notes" msgstr "thay thế ghi chú trước" -#: builtin/notes.c:580 +#: builtin/notes.c:583 #, c-format msgid "" "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -6543,24 +6518,24 @@ msgstr "" "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối tượng " "%s. Sá»­ dụng tùy chọn '-f' để ghi đè lên các ghi chú cÅ©" -#: builtin/notes.c:585 builtin/notes.c:662 +#: builtin/notes.c:588 builtin/notes.c:665 #, c-format msgid "Overwriting existing notes for object %s\n" msgstr "Đang ghi đè lên ghi chú cÅ© cho đối tượng %s\n" -#: builtin/notes.c:615 +#: builtin/notes.c:618 msgid "read objects from stdin" msgstr "đọc các đối tượng từ đầu vào tiêu chuẩn" -#: builtin/notes.c:617 +#: builtin/notes.c:620 msgid "load rewriting config for (implies --stdin)" msgstr "tải cấu hình chép lại cho (ngầm định là --stdin)" -#: builtin/notes.c:635 +#: builtin/notes.c:638 msgid "too few parameters" msgstr "quá ít đối số" -#: builtin/notes.c:656 +#: builtin/notes.c:659 #, c-format msgid "" "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " @@ -6569,29 +6544,29 @@ msgstr "" "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã có sẵn cho đối " "tượng %s. Sá»­ dụng tùy chọn '-f' để ghi đè lên các ghi chú cÅ©" -#: builtin/notes.c:668 +#: builtin/notes.c:671 #, c-format msgid "Missing notes on source object %s. Cannot copy." msgstr "Thiếu ghi chú trên đối tượng nguốn %s. Không thể sao chép." -#: builtin/notes.c:717 +#: builtin/notes.c:720 #, c-format msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" "Please use 'git notes add -f -m/-F/-c/-C' instead.\n" msgstr "" -"Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con 'edit'.\n" -"Xin hãy sá»­ dụng lệnh sau để thay thế: 'git notes add -f -m/-F/-c/-C'.\n" +"Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con `edit'.\n" +"Xin hãy sá»­ dụng lệnh sau để thay thế: `git notes add -f -m/-F/-c/-C'.\n" -#: builtin/notes.c:864 +#: builtin/notes.c:867 msgid "General options" msgstr "Tùy chọn chung" -#: builtin/notes.c:866 +#: builtin/notes.c:869 msgid "Merge options" msgstr "Tùy chọn về hòa trộn" -#: builtin/notes.c:868 +#: builtin/notes.c:871 msgid "" "resolve notes conflicts using the given strategy (manual/ours/theirs/union/" "cat_sort_uniq)" @@ -6599,46 +6574,46 @@ msgstr "" "phân giải các xung đột `notes' sá»­ dụng chiến lược đã đưa ra (manual/ours/" "theirs/union/cat_sort_uniq)" -#: builtin/notes.c:870 +#: builtin/notes.c:873 msgid "Committing unmerged notes" msgstr "Chuyển giao các note chưa được hòa trộn" -#: builtin/notes.c:872 +#: builtin/notes.c:875 msgid "finalize notes merge by committing unmerged notes" msgstr "" "các note cuối cùng được hòa trộn bởi các note chưa hòa trộn cá»§a lần chuyển " "giao" -#: builtin/notes.c:874 +#: builtin/notes.c:877 msgid "Aborting notes merge resolution" msgstr "Há»§y bỏ phân giải ghi chú (note) hòa trộn" -#: builtin/notes.c:876 +#: builtin/notes.c:879 msgid "abort notes merge" msgstr "bỏ qua hòa trộn các ghi chú (note)" -#: builtin/notes.c:971 +#: builtin/notes.c:974 #, c-format msgid "Object %s has no note\n" msgstr "Đối tượng %s không có ghi chú (note)\n" -#: builtin/notes.c:983 +#: builtin/notes.c:986 msgid "attempt to remove non-existent note is not an error" msgstr "cố gắng gỡ bỏ một note chưa từng tồn tại không phải là một lỗi" -#: builtin/notes.c:986 +#: builtin/notes.c:989 msgid "read object names from the standard input" msgstr "đọc tên đối tượng từ thiết bị nhập chuẩn" -#: builtin/notes.c:1067 +#: builtin/notes.c:1070 msgid "notes_ref" msgstr "notes_ref" -#: builtin/notes.c:1068 +#: builtin/notes.c:1071 msgid "use notes from " msgstr "dùng `notes' từ " -#: builtin/notes.c:1103 builtin/remote.c:1598 +#: builtin/notes.c:1106 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "Không hiểu câu lệnh con: %s" @@ -6851,7 +6826,7 @@ msgid "" "To choose either option permanently, see push.default in 'git help config'." msgstr "" "\n" -"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong 'git help " +"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong `git help " "config'." #: builtin/push.c:102 @@ -6953,10 +6928,10 @@ msgstr "" "\n" " git config --global push.default simple\n" "\n" -"Xem 'git help config' và tìm đến 'push.default' để có thêm thông tin.\n" +"Xem `git help config' và tìm đến `push.default' để có thêm thông tin.\n" "(chế độ 'simple' được bắt đầu sá»­ dụng từ Git 1.7.11. Sá»­ dụng chế độ tương " "tá»±\n" -"'current' thay vì 'simple' nếu bạn thỉnh thoảng phải sá»­ dụng bản Git cÅ©)" +"`current' thay vì `simple' nếu bạn thỉnh thoảng phải sá»­ dụng bản Git cÅ©)" #: builtin/push.c:199 msgid "" @@ -6973,10 +6948,10 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" "Việc cập nhật bị từ chối bởi vì đầu mút cá»§a nhánh được push nằm đằng sau bộ\n" -"phận tương ứng cá»§a máy chá»§. Hòa trộn với các thay đổi từ máy chá»§ (v.d. 'git " +"phận tương ứng cá»§a máy chá»§. Hòa trộn với các thay đổi từ máy chá»§ (v.d. `git " "pull')\n" "trước khi lại push lần nữa.\n" -"Xem trong phần 'Note about fast-forwards' từ lệnh 'git push --help' để có " +"Xem trong phần 'Note about fast-forwards' từ lệnh `git push --help' để có " "thông tin chi tiết." #: builtin/push.c:212 @@ -7004,8 +6979,8 @@ msgstr "" "Việc cập nhật bị từ chối bởi vì đầu mút cá»§a nhánh được push nằm đằng sau bộ\n" "phận tương ứng cá»§a máy chá»§. Checkou nhánh này và hòa trộn với các thay đổi " "từ máy chá»§\n" -"(v.d. 'git pull') trước khi lại push lần nữa.\n" -"Xem trong phần 'Note about fast-forwards' từ lệnh 'git push --help' để có " +"(v.d. `git pull') trước khi lại push lần nữa.\n" +"Xem trong phần 'Note about fast-forwards' từ lệnh `git push --help' để có " "thông tin chi tiết." #: builtin/push.c:258 @@ -7449,7 +7424,7 @@ msgstr " được theo vết" #: builtin/remote.c:948 msgid " stale (use 'git remote prune' to remove)" -msgstr " cÅ© (dùng 'git remote prune' để gỡ bỏ)" +msgstr " cÅ© (dùng `git remote prune' để gỡ bỏ)" #: builtin/remote.c:950 msgid " ???" @@ -7571,12 +7546,12 @@ msgstr " (trạng thái không được yêu cầu)" #: builtin/remote.c:1163 msgid " Local branch configured for 'git pull':" msgid_plural " Local branches configured for 'git pull':" -msgstr[0] " Nhánh nội bộ đã được cấu hình cho lệnh 'git pull':" -msgstr[1] " Những nhánh nội bộ đã được cấu hình cho lệnh 'git pull':" +msgstr[0] " Nhánh nội bộ đã được cấu hình cho lệnh `git pull':" +msgstr[1] " Những nhánh nội bộ đã được cấu hình cho lệnh `git pull':" #: builtin/remote.c:1171 msgid " Local refs will be mirrored by 'git push'" -msgstr " refs nội bộ sẽ được phản chiếu bởi lệnh 'git push'" +msgstr " refs nội bộ sẽ được phản chiếu bởi lệnh `git push'" #: builtin/remote.c:1178 #, c-format @@ -7830,7 +7805,7 @@ msgstr "--patch xung khắc với --{hard,mixed,soft}" #: builtin/reset.c:317 msgid "--mixed with paths is deprecated; use 'git reset -- ' instead." msgstr "" -"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh 'git " +"--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh `git " "reset -- <đường_dẫn>'." #: builtin/reset.c:319 @@ -8598,7 +8573,7 @@ msgstr "chỉ hữu ích khi cần gỡ lỗi" #: git.c:16 msgid "See 'git help ' for more information on a specific command." msgstr "" -"Chạy lệnh 'git help ' để có thêm thông tin về lệnh được chỉ ra." +"Chạy lệnh `git help ' để có thêm thông tin về lệnh được chỉ ra." #: parse-options.h:156 msgid "no-op (backward compatibility)" @@ -8849,7 +8824,7 @@ msgid "" "If there is nothing left to stage, chances are that something else\n" "already introduced the same changes; you might want to skip this patch." msgstr "" -"Không có thay đổi nào - bạn đã quên sá»­ dụng lệnh 'git add' à?\n" +"Không có thay đổi nào - bạn đã quên sá»­ dụng lệnh `git add' à?\n" "Nếu ở đây không có gì còn lại stage, tình cờ là có một số thứ khác\n" "đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỏ qua miếng " "vá này." @@ -8860,7 +8835,7 @@ msgid "" "did you forget to use 'git add'?" msgstr "" "Bạn vẫn có những đường dẫn chưa được hòa trộn trong bảng mục lục cá»§a mình\n" -"bạn đã quên sá»­ dụng lệnh 'git add' à?" +"bạn đã quên sá»­ dụng lệnh `git add' à?" #: git-am.sh:845 msgid "No changes -- Patch already applied." @@ -8914,7 +8889,7 @@ msgstr "HEAD sai - Tôi cần một HEAD" msgid "" "Checking out '$start_head' failed. Try 'git bisect reset '." msgstr "" -"Việc checkout '$start_head' gặp lỗi. Hãy thá»­ 'git bisect reset " +"Việc checkout '$start_head' gặp lỗi. Hãy thá»­ `git bisect reset " "'." #: git-bisect.sh:140 @@ -8946,7 +8921,7 @@ msgstr "Đầu vào rev sai: $rev" #: git-bisect.sh:250 msgid "'git bisect bad' can take only one argument." -msgstr "'git bisect bad' có thể lấy chỉ một đối số." +msgstr "`git bisect bad' có thể lấy chỉ một đối số." #. have bad but not good. we could bisect although #. this is less optimum. @@ -8997,7 +8972,7 @@ msgid "" "Try 'git bisect reset '." msgstr "" "Không thể check-out HEAD nguyên thá»§y cá»§a '$branch'.\n" -"Hãy thá»­ 'git bisect reset '." +"Hãy thá»­ `git bisect reset '." #: git-bisect.sh:390 msgid "No logfile given" @@ -9050,8 +9025,8 @@ msgid "" "as appropriate to mark resolution, or use 'git commit -a'." msgstr "" "Pull là không thể được bởi vì bạn có những tập tin chưa được hòa trộn.\n" -"Xin hãy sá»­a chữa chúng trước, và sau đó sá»­ dụng lệnh 'git add/rm '\n" -"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sá»­ dụng 'git " +"Xin hãy sá»­a chữa chúng trước, và sau đó sá»­ dụng lệnh `git add/rm '\n" +"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sá»­ dụng `git " "commit -a'." #: git-pull.sh:25 @@ -9088,7 +9063,7 @@ msgstr "Không thể hòa trộn nhiều nhánh và trong một head trống r msgid "Cannot rebase onto multiple branches" msgstr "Không thể thá»±c hiện lệnh rebase (cÆ¡ cấu lại) trên nhiều nhánh" -#: git-rebase.sh:52 +#: git-rebase.sh:53 msgid "" "When you have resolved this problem, run \"git rebase --continue\".\n" "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n" @@ -9101,29 +9076,35 @@ msgstr "" "Để phục hồi lại thành nhánh nguyên thá»§y và dừng việc vá lại thì chạy \"git " "rebase --abort\"." -#: git-rebase.sh:159 +#: git-rebase.sh:160 msgid "The pre-rebase hook refused to rebase." msgstr "hook (chương trình móc vào git) pre-rebase từ chối rebase." -#: git-rebase.sh:164 +#: git-rebase.sh:165 msgid "It looks like git-am is in progress. Cannot rebase." msgstr "" "Hình như đang trong quá trình thá»±c hiện lệnh git-am. Không thể chạy lệnh " "rebase." -#: git-rebase.sh:295 +#: git-rebase.sh:296 msgid "The --exec option must be used with the --interactive option" msgstr "Tùy chọn --exec phải được sá»­ dụng cùng với tùy chọn --interactive" -#: git-rebase.sh:300 +#: git-rebase.sh:301 msgid "No rebase in progress?" msgstr "Không có tiến trình rebase nào phải không?" -#: git-rebase.sh:313 +#: git-rebase.sh:312 +msgid "The --edit-todo action can only be used during interactive rebase." +msgstr "" +"Hành động `--edit-todo' chỉ có thể dùng trong quá trình `rebase' (sá»­a lịch " +"sá»­) tương tác." + +#: git-rebase.sh:319 msgid "Cannot read HEAD" msgstr "Không thể đọc HEAD" -#: git-rebase.sh:316 +#: git-rebase.sh:322 msgid "" "You must edit all merge conflicts and then\n" "mark them as resolved using git add" @@ -9131,12 +9112,12 @@ msgstr "" "Bạn phải sá»­a tất cả các lần hòa trộn xung đột và sau\n" "đó đánh dấu chúng là cần xá»­ lý sá»­ dụng lệnh git add" -#: git-rebase.sh:334 +#: git-rebase.sh:340 #, sh-format msgid "Could not move back to $head_name" msgstr "Không thể quay trở lại $head_name" -#: git-rebase.sh:350 +#: git-rebase.sh:359 #, sh-format msgid "" "It seems that there is already a $state_dir_base directory, and\n" @@ -9159,57 +9140,57 @@ msgstr "" "\n" "TÔI: là lệnh bạn vừa gọi!" -#: git-rebase.sh:395 +#: git-rebase.sh:404 #, sh-format msgid "invalid upstream $upstream_name" msgstr "thượng nguồn không hợp lệ $upstream_name" -#: git-rebase.sh:419 +#: git-rebase.sh:428 #, sh-format msgid "$onto_name: there are more than one merge bases" msgstr "$onto_name: ở đây có nhiều hÆ¡n một" -#: git-rebase.sh:422 git-rebase.sh:426 +#: git-rebase.sh:431 git-rebase.sh:435 #, sh-format msgid "$onto_name: there is no merge base" msgstr "$onto_name: ở đây không có gì để hòa trộn" -#: git-rebase.sh:431 +#: git-rebase.sh:440 #, sh-format msgid "Does not point to a valid commit: $onto_name" msgstr "Không chỉ đến một lần chuyển giao (commit) không hợp lệ: $onto_name" -#: git-rebase.sh:454 +#: git-rebase.sh:463 #, sh-format msgid "fatal: no such branch: $branch_name" msgstr "nghiêm trọng: không có nhánh như thế: $branch_name" -#: git-rebase.sh:474 +#: git-rebase.sh:483 msgid "Please commit or stash them." msgstr "Xin hãy commit hoặc stash chúng." -#: git-rebase.sh:492 +#: git-rebase.sh:501 #, sh-format msgid "Current branch $branch_name is up to date." msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi." -#: git-rebase.sh:495 +#: git-rebase.sh:504 #, sh-format msgid "Current branch $branch_name is up to date, rebase forced." msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi, lệnh rebase ép buộc." -#: git-rebase.sh:506 +#: git-rebase.sh:515 #, sh-format msgid "Changes from $mb to $onto:" msgstr "Thay đổi từ $mb thành $onto:" #. Detach HEAD and reset the tree -#: git-rebase.sh:515 +#: git-rebase.sh:524 msgid "First, rewinding head to replay your work on top of it..." msgstr "" "Trước tiên, di chuyển head để xem lại các công việc trên đỉnh cá»§a nó..." -#: git-rebase.sh:523 +#: git-rebase.sh:532 #, sh-format msgid "Fast-forwarded $branch_name to $onto_name." msgstr "Fast-forward $branch_name thành $onto_name." @@ -9547,6 +9528,27 @@ msgstr "# Những thay đổi mô-đun-con được chuyển giao (commit):" msgid "Synchronizing submodule url for '$name'" msgstr "Đang đồng bộ hóa url mô-đun-con cho '$name'" +#~ msgid " 0 files changed" +#~ msgstr " 0 có tập tin nào thay đổi cả" + +#~ msgid " %d file changed" +#~ msgid_plural " %d files changed" +#~ msgstr[0] " %d tập tin thay đổi" +#~ msgstr[1] " %d tập tin thay đổi" + +#~ msgid ", %d insertion(+)" +#~ msgid_plural ", %d insertions(+)" +#~ msgstr[0] ", %d thêm(+)" +#~ msgstr[1] ", %d thêm(+)" + +#~ msgid ", %d deletion(-)" +#~ msgid_plural ", %d deletions(-)" +#~ msgstr[0] ", %d xóa(-)" +#~ msgstr[1] ", %d xóa(-)" + +#~ msgid "Auto packing the repository for optimum performance.\n" +#~ msgstr "Tá»± động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n" + #~ msgid " (use \"git add\" to track)" #~ msgstr " (dùng \"git add\" để theo dõi dấu vết)" diff --git a/pretty.c b/pretty.c index 8b1ea9ffad..dba682828c 100644 --- a/pretty.c +++ b/pretty.c @@ -231,7 +231,7 @@ static int is_rfc822_special(char ch) } } -static int has_rfc822_specials(const char *s, int len) +static int needs_rfc822_quoting(const char *s, int len) { int i; for (i = 0; i < len; i++) @@ -240,6 +240,17 @@ static int has_rfc822_specials(const char *s, int len) return 0; } +static int last_line_length(struct strbuf *sb) +{ + int i; + + /* How many bytes are already used on the last line? */ + for (i = sb->len - 1; i >= 0; i--) + if (sb->buf[i] == '\n') + break; + return sb->len - (i + 1); +} + static void add_rfc822_quoted(struct strbuf *out, const char *s, int len) { int i; @@ -261,57 +272,110 @@ static void add_rfc822_quoted(struct strbuf *out, const char *s, int len) strbuf_addch(out, '"'); } -static int is_rfc2047_special(char ch) +enum rfc2047_type { + RFC2047_SUBJECT, + RFC2047_ADDRESS, +}; + +static int is_rfc2047_special(char ch, enum rfc2047_type type) { - return (non_ascii(ch) || (ch == '=') || (ch == '?') || (ch == '_')); + /* + * rfc2047, section 4.2: + * + * 8-bit values which correspond to printable ASCII characters other + * than "=", "?", and "_" (underscore), MAY be represented as those + * characters. (But see section 5 for restrictions.) In + * particular, SPACE and TAB MUST NOT be represented as themselves + * within encoded words. + */ + + /* + * rule out non-ASCII characters and non-printable characters (the + * non-ASCII check should be redundant as isprint() is not localized + * and only knows about ASCII, but be defensive about that) + */ + if (non_ascii(ch) || !isprint(ch)) + return 1; + + /* + * rule out special printable characters (' ' should be the only + * whitespace character considered printable, but be defensive and use + * isspace()) + */ + if (isspace(ch) || ch == '=' || ch == '?' || ch == '_') + return 1; + + /* + * rfc2047, section 5.3: + * + * As a replacement for a 'word' entity within a 'phrase', for example, + * one that precedes an address in a From, To, or Cc header. The ABNF + * definition for 'phrase' from RFC 822 thus becomes: + * + * phrase = 1*( encoded-word / word ) + * + * In this case the set of characters that may be used in a "Q"-encoded + * 'encoded-word' is restricted to: . An 'encoded-word' that appears within a + * 'phrase' MUST be separated from any adjacent 'word', 'text' or + * 'special' by 'linear-white-space'. + */ + + if (type != RFC2047_ADDRESS) + return 0; + + /* '=' and '_' are special cases and have been checked above */ + return !(isalnum(ch) || ch == '!' || ch == '*' || ch == '+' || ch == '-' || ch == '/'); } -static void add_rfc2047(struct strbuf *sb, const char *line, int len, - const char *encoding) +static int needs_rfc2047_encoding(const char *line, int len, + enum rfc2047_type type) { - static const int max_length = 78; /* per rfc2822 */ int i; - int line_len; - - /* How many bytes are already used on the current line? */ - for (i = sb->len - 1; i >= 0; i--) - if (sb->buf[i] == '\n') - break; - line_len = sb->len - (i+1); for (i = 0; i < len; i++) { int ch = line[i]; if (non_ascii(ch) || ch == '\n') - goto needquote; + return 1; if ((i + 1 < len) && (ch == '=' && line[i+1] == '?')) - goto needquote; + return 1; } - strbuf_add_wrapped_bytes(sb, line, len, 0, 1, max_length - line_len); - return; -needquote: + return 0; +} + +static void add_rfc2047(struct strbuf *sb, const char *line, int len, + const char *encoding, enum rfc2047_type type) +{ + static const int max_encoded_length = 76; /* per rfc2047 */ + int i; + int line_len = last_line_length(sb); + strbuf_grow(sb, len * 3 + strlen(encoding) + 100); strbuf_addf(sb, "=?%s?q?", encoding); line_len += strlen(encoding) + 5; /* 5 for =??q? */ for (i = 0; i < len; i++) { unsigned ch = line[i] & 0xFF; + int is_special = is_rfc2047_special(ch, type); + + /* + * According to RFC 2047, we could encode the special character + * ' ' (space) with '_' (underscore) for readability. But many + * programs do not understand this and just leave the + * underscore in place. Thus, we do nothing special here, which + * causes ' ' to be encoded as '=20', avoiding this problem. + */ - if (line_len >= max_length - 2) { + if (line_len + 2 + (is_special ? 3 : 1) > max_encoded_length) { strbuf_addf(sb, "?=\n =?%s?q?", encoding); line_len = strlen(encoding) + 5 + 1; /* =??q? plus SP */ } - /* - * We encode ' ' using '=20' even though rfc2047 - * allows using '_' for readability. Unfortunately, - * many programs do not understand this and just - * leave the underscore in place. - */ - if (is_rfc2047_special(ch) || ch == ' ' || ch == '\n') { + if (is_special) { strbuf_addf(sb, "=%02X", ch); line_len += 3; - } - else { + } else { strbuf_addch(sb, ch); line_len++; } @@ -323,6 +387,7 @@ void pp_user_info(const struct pretty_print_context *pp, const char *what, struct strbuf *sb, const char *line, const char *encoding) { + int max_length = 78; /* per rfc2822 */ char *date; int namelen; unsigned long time; @@ -340,25 +405,27 @@ void pp_user_info(const struct pretty_print_context *pp, if (pp->fmt == CMIT_FMT_EMAIL) { char *name_tail = strchr(line, '<'); int display_name_length; - int final_line; if (!name_tail) return; while (line < name_tail && isspace(name_tail[-1])) name_tail--; display_name_length = name_tail - line; strbuf_addstr(sb, "From: "); - if (!has_rfc822_specials(line, display_name_length)) { - add_rfc2047(sb, line, display_name_length, encoding); - } else { + if (needs_rfc2047_encoding(line, display_name_length, RFC2047_ADDRESS)) { + add_rfc2047(sb, line, display_name_length, + encoding, RFC2047_ADDRESS); + max_length = 76; /* per rfc2047 */ + } else if (needs_rfc822_quoting(line, display_name_length)) { struct strbuf quoted = STRBUF_INIT; add_rfc822_quoted("ed, line, display_name_length); - add_rfc2047(sb, quoted.buf, quoted.len, encoding); + strbuf_add_wrapped_bytes(sb, quoted.buf, quoted.len, + -6, 1, max_length); strbuf_release("ed); + } else { + strbuf_add_wrapped_bytes(sb, line, display_name_length, + -6, 1, max_length); } - for (final_line = 0; final_line < sb->len; final_line++) - if (sb->buf[sb->len - final_line - 1] == '\n') - break; - if (namelen - display_name_length + final_line > 78) { + if (namelen - display_name_length + last_line_length(sb) > max_length) { strbuf_addch(sb, '\n'); if (!isspace(name_tail[0])) strbuf_addch(sb, ' '); @@ -504,7 +571,7 @@ char *logmsg_reencode(const struct commit *commit, return NULL; encoding = get_header(commit, "encoding"); use_encoding = encoding ? encoding : utf8; - if (!strcmp(use_encoding, output_encoding)) + if (same_encoding(use_encoding, output_encoding)) if (encoding) /* we'll strip encoding header later */ out = xstrdup(commit->buffer); else @@ -1278,6 +1345,7 @@ void pp_title_line(const struct pretty_print_context *pp, const char *encoding, int need_8bit_cte) { + static const int max_length = 78; /* per rfc2047 */ struct strbuf title; strbuf_init(&title, 80); @@ -1287,7 +1355,12 @@ void pp_title_line(const struct pretty_print_context *pp, strbuf_grow(sb, title.len + 1024); if (pp->subject) { strbuf_addstr(sb, pp->subject); - add_rfc2047(sb, title.buf, title.len, encoding); + if (needs_rfc2047_encoding(title.buf, title.len, RFC2047_SUBJECT)) + add_rfc2047(sb, title.buf, title.len, + encoding, RFC2047_SUBJECT); + else + strbuf_add_wrapped_bytes(sb, title.buf, title.len, + -last_line_length(sb), 1, max_length); } else { strbuf_addbuf(sb, &title); } diff --git a/refs.c b/refs.c index da74a2b29a..520e50f3bc 100644 --- a/refs.c +++ b/refs.c @@ -1753,32 +1753,24 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt) struct ref_lock *lock; int err, i = 0, ret = 0, flag = 0; - lock = lock_ref_sha1_basic(refname, sha1, 0, &flag); + lock = lock_ref_sha1_basic(refname, sha1, delopt, &flag); if (!lock) return 1; if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) { /* loose */ - const char *path; - - if (!(delopt & REF_NODEREF)) { - i = strlen(lock->lk->filename) - 5; /* .lock */ - lock->lk->filename[i] = 0; - path = lock->lk->filename; - } else { - path = git_path("%s", refname); - } - err = unlink_or_warn(path); + i = strlen(lock->lk->filename) - 5; /* .lock */ + lock->lk->filename[i] = 0; + err = unlink_or_warn(lock->lk->filename); if (err && errno != ENOENT) ret = 1; - if (!(delopt & REF_NODEREF)) - lock->lk->filename[i] = '.'; + lock->lk->filename[i] = '.'; } /* removing the loose one could have resurrected an earlier * packed one. Also, if it was not loose we need to repack * without it. */ - ret |= repack_without_ref(refname); + ret |= repack_without_ref(lock->ref_name); unlink_or_warn(git_path("logs/%s", lock->ref_name)); invalidate_ref_cache(NULL); diff --git a/revision.c b/revision.c index a09e60bedb..68545c8015 100644 --- a/revision.c +++ b/revision.c @@ -1048,9 +1048,9 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format = CMIT_FMT_DEFAULT; + init_grep_defaults(); + grep_init(&revs->grep_filter, prefix); revs->grep_filter.status_only = 1; - revs->grep_filter.pattern_tail = &(revs->grep_filter.pattern_list); - revs->grep_filter.header_tail = &(revs->grep_filter.header_list); revs->grep_filter.regflags = REG_NEWLINE; diff_setup(&revs->diffopt); @@ -1604,12 +1604,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg } else if (!strcmp(arg, "--grep-debug")) { revs->grep_filter.debug = 1; } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) { - revs->grep_filter.regflags |= REG_EXTENDED; + grep_set_pattern_type_option(GREP_PATTERN_TYPE_ERE, &revs->grep_filter); } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) { revs->grep_filter.regflags |= REG_ICASE; DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE); } else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) { - revs->grep_filter.fixed = 1; + grep_set_pattern_type_option(GREP_PATTERN_TYPE_FIXED, &revs->grep_filter); } else if (!strcmp(arg, "--all-match")) { revs->grep_filter.all_match = 1; } else if ((argcount = parse_long_opt("encoding", argv, &optarg))) { @@ -1893,6 +1893,8 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s revs->diffopt.abbrev = revs->abbrev; diff_setup_done(&revs->diffopt); + grep_commit_pattern_type(GREP_PATTERN_TYPE_UNSPECIFIED, + &revs->grep_filter); compile_grep_patterns(&revs->grep_filter); if (revs->reverse && revs->reflog_info) diff --git a/sequencer.c b/sequencer.c index e3723d2095..73c396bd89 100644 --- a/sequencer.c +++ b/sequencer.c @@ -60,7 +60,7 @@ static int get_message(struct commit *commit, struct commit_message *out) out->reencoded_message = NULL; out->message = commit->buffer; - if (strcmp(encoding, git_commit_encoding)) + if (same_encoding(encoding, git_commit_encoding)) out->reencoded_message = reencode_string(commit->buffer, git_commit_encoding, encoding); if (out->reencoded_message) diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh index e127f35db9..7c4c372e37 100755 --- a/t/t1300-repo-config.sh +++ b/t/t1300-repo-config.sh @@ -803,6 +803,11 @@ test_expect_success NOT_MINGW 'get --path copes with unset $HOME' ' test_cmp expect result ' +test_expect_success 'get --path barfs on boolean variable' ' + echo "[path]bool" >.git/config && + test_must_fail git config --get --path path.bool +' + cat > expect << EOF [quote] leading = " test" diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh index 4fd83a667a..e415ee0bbf 100755 --- a/t/t1400-update-ref.sh +++ b/t/t1400-update-ref.sh @@ -74,6 +74,24 @@ test_expect_success "delete $m (by HEAD)" ' ' rm -f .git/$m +test_expect_success \ + "create $m (by HEAD)" \ + "git update-ref HEAD $A && + test $A"' = $(cat .git/'"$m"')' +test_expect_success \ + "pack refs" \ + "git pack-refs --all" +test_expect_success \ + "move $m (by HEAD)" \ + "git update-ref HEAD $B $A && + test $B"' = $(cat .git/'"$m"')' +test_expect_success "delete $m (by HEAD) should remove both packed and loose $m" ' + git update-ref -d HEAD $B && + ! grep "$m" .git/packed-refs && + ! test -f .git/$m +' +rm -f .git/$m + cp -f .git/HEAD .git/HEAD.orig test_expect_success "delete symref without dereference" ' git update-ref --no-deref -d HEAD && diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 79c8d0142e..80e6be39d7 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -262,6 +262,25 @@ test_expect_success 'config information was renamed, too' \ "test $(git config branch.s.dummy) = Hello && test_must_fail git config branch.s/s/dummy" +test_expect_success 'deleting a symref' ' + git branch target && + git symbolic-ref refs/heads/symref refs/heads/target && + echo "Deleted branch symref (was refs/heads/target)." >expect && + git branch -d symref >actual && + test_path_is_file .git/refs/heads/target && + test_path_is_missing .git/refs/heads/symref && + test_i18ncmp expect actual +' + +test_expect_success 'deleting a dangling symref' ' + git symbolic-ref refs/heads/dangling-symref nowhere && + test_path_is_file .git/refs/heads/dangling-symref && + echo "Deleted branch dangling-symref (was nowhere)." >expect && + git branch -d dangling-symref >actual && + test_path_is_missing .git/refs/heads/dangling-symref && + test_i18ncmp expect actual +' + test_expect_success 'renaming a symref is not allowed' \ ' git symbolic-ref refs/heads/master2 refs/heads/master && diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh index 3d4b1ba23f..05911492ca 100755 --- a/t/t4006-diff-mode.sh +++ b/t/t4006-diff-mode.sh @@ -32,28 +32,28 @@ test_expect_success 'prepare binary file' ' git commit -m binbin ' -test_expect_success '--stat output after text chmod' ' - test_chmod -x rezrov && - echo " 0 files changed" >expect && - git diff HEAD --stat >actual && - test_i18ncmp expect actual -' - -test_expect_success '--shortstat output after text chmod' ' - git diff HEAD --shortstat >actual && - test_i18ncmp expect actual -' - -test_expect_success '--stat output after binary chmod' ' - test_chmod +x binbin && - echo " 0 files changed" >expect && - git diff HEAD --stat >actual && - test_i18ncmp expect actual -' - -test_expect_success '--shortstat output after binary chmod' ' - git diff HEAD --shortstat >actual && - test_i18ncmp expect actual -' +# test_expect_success '--stat output after text chmod' ' +# test_chmod -x rezrov && +# echo " 0 files changed" >expect && +# git diff HEAD --stat >actual && +# test_i18ncmp expect actual +# ' +# +# test_expect_success '--shortstat output after text chmod' ' +# git diff HEAD --shortstat >actual && +# test_i18ncmp expect actual +# ' +# +# test_expect_success '--stat output after binary chmod' ' +# test_chmod +x binbin && +# echo " 0 files changed" >expect && +# git diff HEAD --stat >actual && +# test_i18ncmp expect actual +# ' +# +# test_expect_success '--shortstat output after binary chmod' ' +# git diff HEAD --shortstat >actual && +# test_i18ncmp expect actual +# ' test_done diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index 959aa26ef5..ad9f69e607 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -110,73 +110,107 @@ test_expect_success 'replay did not screw up the log message' ' test_expect_success 'extra headers' ' - git config format.headers "To: R. E. Cipient + git config format.headers "To: R E Cipient " && - git config --add format.headers "Cc: S. E. Cipient + git config --add format.headers "Cc: S E Cipient " && git format-patch --stdout master..side > patch2 && sed -e "/^\$/q" patch2 > hdrs2 && - grep "^To: R. E. Cipient \$" hdrs2 && - grep "^Cc: S. E. Cipient \$" hdrs2 + grep "^To: R E Cipient \$" hdrs2 && + grep "^Cc: S E Cipient \$" hdrs2 ' test_expect_success 'extra headers without newlines' ' - git config --replace-all format.headers "To: R. E. Cipient " && - git config --add format.headers "Cc: S. E. Cipient " && + git config --replace-all format.headers "To: R E Cipient " && + git config --add format.headers "Cc: S E Cipient " && git format-patch --stdout master..side >patch3 && sed -e "/^\$/q" patch3 > hdrs3 && - grep "^To: R. E. Cipient \$" hdrs3 && - grep "^Cc: S. E. Cipient \$" hdrs3 + grep "^To: R E Cipient \$" hdrs3 && + grep "^Cc: S E Cipient \$" hdrs3 ' test_expect_success 'extra headers with multiple To:s' ' - git config --replace-all format.headers "To: R. E. Cipient " && - git config --add format.headers "To: S. E. Cipient " && + git config --replace-all format.headers "To: R E Cipient " && + git config --add format.headers "To: S E Cipient " && git format-patch --stdout master..side > patch4 && sed -e "/^\$/q" patch4 > hdrs4 && - grep "^To: R. E. Cipient ,\$" hdrs4 && - grep "^ *S. E. Cipient \$" hdrs4 + grep "^To: R E Cipient ,\$" hdrs4 && + grep "^ *S E Cipient \$" hdrs4 ' -test_expect_success 'additional command line cc' ' +test_expect_success 'additional command line cc (ascii)' ' - git config --replace-all format.headers "Cc: R. E. Cipient " && + git config --replace-all format.headers "Cc: R E Cipient " && + git format-patch --cc="S E Cipient " --stdout master..side | sed -e "/^\$/q" >patch5 && + grep "^Cc: R E Cipient ,\$" patch5 && + grep "^ *S E Cipient \$" patch5 +' + +test_expect_failure 'additional command line cc (rfc822)' ' + + git config --replace-all format.headers "Cc: R E Cipient " && git format-patch --cc="S. E. Cipient " --stdout master..side | sed -e "/^\$/q" >patch5 && - grep "^Cc: R. E. Cipient ,\$" patch5 && - grep "^ *S. E. Cipient \$" patch5 + grep "^Cc: R E Cipient ,\$" patch5 && + grep "^ *"S. E. Cipient" \$" patch5 ' test_expect_success 'command line headers' ' git config --unset-all format.headers && - git format-patch --add-header="Cc: R. E. Cipient " --stdout master..side | sed -e "/^\$/q" >patch6 && - grep "^Cc: R. E. Cipient \$" patch6 + git format-patch --add-header="Cc: R E Cipient " --stdout master..side | sed -e "/^\$/q" >patch6 && + grep "^Cc: R E Cipient \$" patch6 ' test_expect_success 'configuration headers and command line headers' ' - git config --replace-all format.headers "Cc: R. E. Cipient " && - git format-patch --add-header="Cc: S. E. Cipient " --stdout master..side | sed -e "/^\$/q" >patch7 && - grep "^Cc: R. E. Cipient ,\$" patch7 && - grep "^ *S. E. Cipient \$" patch7 + git config --replace-all format.headers "Cc: R E Cipient " && + git format-patch --add-header="Cc: S E Cipient " --stdout master..side | sed -e "/^\$/q" >patch7 && + grep "^Cc: R E Cipient ,\$" patch7 && + grep "^ *S E Cipient \$" patch7 ' -test_expect_success 'command line To: header' ' +test_expect_success 'command line To: header (ascii)' ' git config --unset-all format.headers && + git format-patch --to="R E Cipient " --stdout master..side | sed -e "/^\$/q" >patch8 && + grep "^To: R E Cipient \$" patch8 +' + +test_expect_failure 'command line To: header (rfc822)' ' + git format-patch --to="R. E. Cipient " --stdout master..side | sed -e "/^\$/q" >patch8 && - grep "^To: R. E. Cipient \$" patch8 + grep "^To: "R. E. Cipient" \$" patch8 ' -test_expect_success 'configuration To: header' ' +test_expect_failure 'command line To: header (rfc2047)' ' + + git format-patch --to="R Ä Cipient " --stdout master..side | sed -e "/^\$/q" >patch8 && + grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= \$" patch8 +' + +test_expect_success 'configuration To: header (ascii)' ' + + git config format.to "R E Cipient " && + git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 && + grep "^To: R E Cipient \$" patch9 +' + +test_expect_failure 'configuration To: header (rfc822)' ' git config format.to "R. E. Cipient " && git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 && - grep "^To: R. E. Cipient \$" patch9 + grep "^To: "R. E. Cipient" \$" patch9 +' + +test_expect_failure 'configuration To: header (rfc2047)' ' + + git config format.to "R Ä Cipient " && + git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 && + grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= \$" patch9 ' # check_patch : Verify that looks like a half-sane @@ -190,11 +224,11 @@ check_patch () { test_expect_success '--no-to overrides config.to' ' git config --replace-all format.to \ - "R. E. Cipient " && + "R E Cipient " && git format-patch --no-to --stdout master..side | sed -e "/^\$/q" >patch10 && check_patch patch10 && - ! grep "^To: R. E. Cipient \$" patch10 + ! grep "^To: R E Cipient \$" patch10 ' test_expect_success '--no-to and --to replaces config.to' ' @@ -212,21 +246,21 @@ test_expect_success '--no-to and --to replaces config.to' ' test_expect_success '--no-cc overrides config.cc' ' git config --replace-all format.cc \ - "C. E. Cipient " && + "C E Cipient " && git format-patch --no-cc --stdout master..side | sed -e "/^\$/q" >patch12 && check_patch patch12 && - ! grep "^Cc: C. E. Cipient \$" patch12 + ! grep "^Cc: C E Cipient \$" patch12 ' test_expect_success '--no-add-header overrides config.headers' ' git config --replace-all format.headers \ - "Header1: B. E. Cipient " && + "Header1: B E Cipient " && git format-patch --no-add-header --stdout master..side | sed -e "/^\$/q" >patch13 && check_patch patch13 && - ! grep "^Header1: B. E. Cipient \$" patch13 + ! grep "^Header1: B E Cipient \$" patch13 ' test_expect_success 'multiple files' ' @@ -752,16 +786,14 @@ M64=$M8$M8$M8$M8$M8$M8$M8$M8 M512=$M64$M64$M64$M64$M64$M64$M64$M64 cat >expect <<'EOF' Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo - bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar - foo bar foo bar foo bar foo bar + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo + bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar + foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar EOF -test_expect_success 'format-patch wraps extremely long headers (ascii)' ' +test_expect_success 'format-patch wraps extremely long subject (ascii)' ' echo content >>file && git add file && git commit -m "$M512" && @@ -774,30 +806,31 @@ M8="föö bar " M64=$M8$M8$M8$M8$M8$M8$M8$M8 M512=$M64$M64$M64$M64$M64$M64$M64$M64 cat >expect <<'EOF' -Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= - =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= +Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= + =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= + =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= + =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3?= + =?UTF-8?q?=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= + =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3?= + =?UTF-8?q?=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= + =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= + =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= + =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3?= + =?UTF-8?q?=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= + =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3?= + =?UTF-8?q?=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= + =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?= + =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?= + =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3?= + =?UTF-8?q?=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?= + =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3?= + =?UTF-8?q?=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?= + =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?= EOF -test_expect_success 'format-patch wraps extremely long headers (rfc2047)' ' +test_expect_success 'format-patch wraps extremely long subject (rfc2047)' ' rm -rf patches/ && echo content >>file && git add file && @@ -807,52 +840,80 @@ test_expect_success 'format-patch wraps extremely long headers (rfc2047)' ' test_cmp expect subject ' -M8="foo_bar_" -M64=$M8$M8$M8$M8$M8$M8$M8$M8 -cat >expect < -EOF -test_expect_success 'format-patch wraps non-quotable headers' ' - rm -rf patches/ && - echo content >>file && - git add file && - git commit -mfoo --author "$M64 " && - git format-patch --stdout -1 >patch && - sed -n "/^From: /p; /^ /p; /^$/q" from && - test_cmp expect from -' - check_author() { echo content >>file && git add file && GIT_AUTHOR_NAME=$1 git commit -m author-check && git format-patch --stdout -1 >patch && - grep ^From: patch >actual && + sed -n "/^From: /p; /^ /p; /^$/q" actual && test_cmp expect actual } cat >expect <<'EOF' From: "Foo B. Bar" EOF -test_expect_success 'format-patch quotes dot in headers' ' +test_expect_success 'format-patch quotes dot in from-headers' ' check_author "Foo B. Bar" ' cat >expect <<'EOF' From: "Foo \"The Baz\" Bar" EOF -test_expect_success 'format-patch quotes double-quote in headers' ' +test_expect_success 'format-patch quotes double-quote in from-headers' ' check_author "Foo \"The Baz\" Bar" ' cat >expect <<'EOF' -From: =?UTF-8?q?"F=C3=B6o=20B.=20Bar"?= +From: =?UTF-8?q?F=C3=B6o=20Bar?= +EOF +test_expect_success 'format-patch uses rfc2047-encoded from-headers when necessary' ' + check_author "Föo Bar" +' + +cat >expect <<'EOF' +From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= EOF -test_expect_success 'rfc2047-encoded headers also double-quote 822 specials' ' +test_expect_success 'rfc2047-encoded from-headers leave no rfc822 specials' ' check_author "Föo B. Bar" ' +cat >expect < +EOF +test_expect_success 'format-patch wraps moderately long from-header (ascii)' ' + check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_" +' + +cat >expect <<'EOF' +From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar + Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo + Bar Foo Bar Foo Bar Foo Bar +EOF +test_expect_success 'format-patch wraps extremely long from-header (ascii)' ' + check_author "Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" +' + +cat >expect <<'EOF' +From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar + Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo + Bar Foo Bar Foo Bar Foo Bar" +EOF +test_expect_success 'format-patch wraps extremely long from-header (rfc822)' ' + check_author "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" +' + +cat >expect <<'EOF' +From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?= + =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?= + =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?= + =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?= + =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= +EOF +test_expect_success 'format-patch wraps extremely long from-header (rfc2047)' ' + check_author "Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar" +' + cat >expect <<'EOF' Subject: header with . in it EOF diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh index eebb1eed8b..53ec330ce8 100755 --- a/t/t4030-diff-textconv.sh +++ b/t/t4030-diff-textconv.sh @@ -84,6 +84,30 @@ test_expect_success 'status -v produces text' ' git reset --soft HEAD@{1} ' +test_expect_success 'grep-diff (-G) operates on textconv data (add)' ' + echo one >expect && + git log --root --format=%s -G0 >actual && + test_cmp expect actual +' + +test_expect_success 'grep-diff (-G) operates on textconv data (modification)' ' + echo two >expect && + git log --root --format=%s -G1 >actual && + test_cmp expect actual +' + +test_expect_success 'pickaxe (-S) operates on textconv data (add)' ' + echo one >expect && + git log --root --format=%s -S0 >actual && + test_cmp expect actual +' + +test_expect_success 'pickaxe (-S) operates on textconv data (modification)' ' + echo two >expect && + git log --root --format=%s -S1 >actual && + test_cmp expect actual +' + cat >expect.stat <<'EOF' file | Bin 2 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/t/t4049-diff-stat-count.sh b/t/t4049-diff-stat-count.sh index b41eb61ca8..5b594e878f 100755 --- a/t/t4049-diff-stat-count.sh +++ b/t/t4049-diff-stat-count.sh @@ -4,19 +4,62 @@ test_description='diff --stat-count' . ./test-lib.sh -test_expect_success setup ' +test_expect_success 'setup' ' >a && >b && >c && >d && git add a b c d && - chmod +x c d && + git commit -m initial +' + +test_expect_success 'mode-only change show as a 0-line change' ' + git reset --hard && + test_chmod +x b d && + echo a >a && + echo c >c && + cat >expect <<-\EOF + a | 1 + + b | 0 + ... + 4 files changed, 2 insertions(+) + EOF + git diff --stat --stat-count=2 HEAD >actual && + test_i18ncmp expect actual +' + +test_expect_success 'binary changes do not count in lines' ' + git reset --hard && + echo a >a && + echo c >c && + cat "$TEST_DIRECTORY"/test-binary-1.png >d && + cat >expect <<-\EOF + a | 1 + + c | 1 + + ... + 3 files changed, 2 insertions(+) + EOF + git diff --stat --stat-count=2 >actual && + test_i18ncmp expect actual +' + +test_expect_success 'exclude unmerged entries from total file count' ' + git reset --hard && echo a >a && echo b >b && + git ls-files -s a >x && + git rm -f d && + for stage in 1 2 3 + do + sed -e "s/ 0 a/ $stage d/" x + done | + git update-index --index-info && + echo d >d && cat >expect <<-\EOF a | 1 + b | 1 + - 2 files changed, 2 insertions(+) + ... + 3 files changed, 3 insertions(+) EOF git diff --stat --stat-count=2 >actual && test_i18ncmp expect actual diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 924ba536ca..a343bf6c62 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -72,9 +72,9 @@ cat > expect << EOF commit. EOF -test_expect_success 'format %w(12,1,2)' ' +test_expect_success 'format %w(11,1,2)' ' - git log -2 --format="%w(12,1,2)This is the %s commit." > actual && + git log -2 --format="%w(11,1,2)This is the %s commit." > actual && test_cmp expect actual ' @@ -230,6 +230,12 @@ test_expect_success 'log --grep -i' ' test_cmp expect actual ' +test_expect_success 'log -F -E --grep= uses ere' ' + echo second >expect && + git log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual && + test_cmp expect actual +' + cat > expect <expected && git log -z --stat --pretty="format:%s" >actual && test_i18ncmp expected actual @@ -93,7 +93,7 @@ test_expect_success 'NUL separation with --stat' ' test_expect_failure 'NUL termination with --stat' ' stat0_part=$(git diff --stat HEAD^ HEAD) && - stat1_part=$(git diff --stat --root HEAD^) && + stat1_part=$(git diff-tree --no-commit-id --stat --root HEAD^) && printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n\0" >expected && git log -z --stat --pretty="tformat:%s" >actual && test_i18ncmp expected actual diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index 5189446534..f5a79b13ae 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -1066,12 +1066,12 @@ test_expect_success GPG \ ' # usage with rfc1991 signatures -echo "rfc1991" > gpghome/gpg.conf get_tag_header rfc1991-signed-tag $commit commit $time >expect echo "RFC1991 signed tag" >>expect echo '-----BEGIN PGP MESSAGE-----' >>expect test_expect_success GPG \ 'creating a signed tag with rfc1991' ' + echo "rfc1991" >gpghome/gpg.conf && git tag -s -m "RFC1991 signed tag" rfc1991-signed-tag $commit && get_tag_msg rfc1991-signed-tag >actual && test_cmp expect actual @@ -1085,6 +1085,7 @@ chmod +x fakeeditor test_expect_success GPG \ 'reediting a signed tag body omits signature' ' + echo "rfc1991" >gpghome/gpg.conf && echo "RFC1991 signed tag" >expect && GIT_EDITOR=./fakeeditor git tag -f -s rfc1991-signed-tag $commit && test_cmp expect actual @@ -1092,11 +1093,13 @@ test_expect_success GPG \ test_expect_success GPG \ 'verifying rfc1991 signature' ' + echo "rfc1991" >gpghome/gpg.conf && git tag -v rfc1991-signed-tag ' test_expect_success GPG \ 'list tag with rfc1991 signature' ' + echo "rfc1991" >gpghome/gpg.conf && echo "rfc1991-signed-tag RFC1991 signed tag" >expect && git tag -l -n1 rfc1991-signed-tag >actual && test_cmp expect actual && diff --git a/t/t7008-grep-binary.sh b/t/t7008-grep-binary.sh index fd6410fc71..26f831984d 100755 --- a/t/t7008-grep-binary.sh +++ b/t/t7008-grep-binary.sh @@ -111,6 +111,28 @@ test_expect_success 'grep respects binary diff attribute' ' test_cmp expect actual ' +test_expect_success 'grep --cached respects binary diff attribute' ' + git grep --cached text t >actual && + test_cmp expect actual +' + +test_expect_success 'grep --cached respects binary diff attribute (2)' ' + git add .gitattributes && + rm .gitattributes && + git grep --cached text t >actual && + test_when_finished "git rm --cached .gitattributes" && + test_when_finished "git checkout .gitattributes" && + test_cmp expect actual +' + +test_expect_success 'grep revision respects binary diff attribute' ' + git commit -m new && + echo "Binary file HEAD:t matches" >expect && + git grep text HEAD -- t >actual && + test_when_finished "git reset HEAD^" && + test_cmp expect actual +' + test_expect_success 'grep respects not-binary diff attribute' ' echo binQary | q_to_nul >b && git add b && diff --git a/t/t9502-gitweb-standalone-parse-output.sh b/t/t9502-gitweb-standalone-parse-output.sh index 731e64c3ad..3a8e7d3f5a 100755 --- a/t/t9502-gitweb-standalone-parse-output.sh +++ b/t/t9502-gitweb-standalone-parse-output.sh @@ -185,5 +185,20 @@ test_expect_success 'forks: project_index lists all projects (incl. forks)' ' test_cmp expected actual ' +xss() { + echo >&2 "Checking $1..." && + gitweb_run "$1" && + if grep "$TAG" gitweb.body; then + echo >&2 "xss: $TAG should have been quoted in output" + return 1 + fi + return 0 +} + +test_expect_success 'xss checks' ' + TAG="" && + xss "a=rss&p=$TAG" && + xss "a=rss&p=foo.git&f=$TAG" +' test_done diff --git a/t/t9810-git-p4-rcs.sh b/t/t9810-git-p4-rcs.sh index fe30ad881f..0c2fc3ea1a 100755 --- a/t/t9810-git-p4-rcs.sh +++ b/t/t9810-git-p4-rcs.sh @@ -155,6 +155,25 @@ test_expect_success 'cleanup after failure' ' ) ' +# perl $File:: bug check +test_expect_success 'ktext expansion should not expand multi-line $File::' ' + ( + cd "$cli" && + cat >lv.pm <<-\EOF + my $wanted = sub { my $f = $File::Find::name; + if ( -f && $f =~ /foo/ ) { + EOF + p4 add -t ktext lv.pm && + p4 submit -d "lv.pm" + ) && + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + test_cmp "$cli/lv.pm" lv.pm + ) +' + # # Do not scrub anything but +k or +ko files. Sneak a change into # the cli file so that submit will get a conflict. Make sure that diff --git a/t/test-lib.sh b/t/test-lib.sh index 514282cbdf..489bc80fc1 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -230,7 +230,7 @@ else say_color() { test -z "$1" && test -n "$quiet" && return shift - echo "$*" + printf "%s\n" "$*" } fi diff --git a/utf8.c b/utf8.c index a544f15456..5c61bbe113 100644 --- a/utf8.c +++ b/utf8.c @@ -353,7 +353,7 @@ int strbuf_add_wrapped_text(struct strbuf *buf, c = *text; if (!c || isspace(c)) { - if (w < width || !space) { + if (w <= width || !space) { const char *start = bol; if (!c && text == start) return w; @@ -423,6 +423,13 @@ int is_encoding_utf8(const char *name) return 0; } +int same_encoding(const char *src, const char *dst) +{ + if (is_encoding_utf8(src) && is_encoding_utf8(dst)) + return 1; + return !strcasecmp(src, dst); +} + /* * Given a buffer and its encoding, return it re-encoded * with iconv. If the conversion fails, returns NULL. diff --git a/utf8.h b/utf8.h index 3c0ae7624e..93ef60042c 100644 --- a/utf8.h +++ b/utf8.h @@ -7,6 +7,7 @@ int utf8_width(const char **start, size_t *remainder_p); int utf8_strwidth(const char *string); int is_utf8(const char *text); int is_encoding_utf8(const char *name); +int same_encoding(const char *, const char *); int strbuf_add_wrapped_text(struct strbuf *buf, const char *text, int indent, int indent2, int width);