diff options
104 files changed, 3073 insertions, 1777 deletions
@@ -48,6 +48,7 @@ David Kågedal <davidk@lysator.liu.se> David Reiss <dreiss@facebook.com> <dreiss@dreiss-vmware.(none)> David S. Miller <davem@davemloft.net> David Turner <novalis@novalis.org> <dturner@twopensource.com> +David Turner <novalis@novalis.org> <dturner@twosigma.com> Deskin Miller <deskinm@umich.edu> Dirk Süsserott <newsletter@dirk.my1.cc> Eric Blake <eblake@redhat.com> <ebb9@byu.net> diff --git a/.travis.yml b/.travis.yml index 477c3d2efb..37a1e1fb6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -78,7 +78,7 @@ before_install: FORMULA=$1 SHA=$(brew fetch --force $FORMULA 2>&1 | grep ^SHA256: | cut -d ' ' -f 2) sed -E -i.bak "s/sha256 \"[0-9a-f]{64}\"/sha256 \"$SHA\"/g" \ - /usr/local/Library/Taps/homebrew/homebrew-binary/$FORMULA.rb + "$(brew --repository homebrew/homebrew-binary)/$FORMULA.rb" } brew update --quiet brew tap homebrew/binary --quiet diff --git a/Documentation/RelNotes/2.10.1.txt b/Documentation/RelNotes/2.10.1.txt new file mode 100644 index 0000000000..70462f7f7e --- /dev/null +++ b/Documentation/RelNotes/2.10.1.txt @@ -0,0 +1,131 @@ +Git v2.10.1 Release Notes +========================= + +Fixes since v2.10 +----------------- + + * Clarify various ways to specify the "revision ranges" in the + documentation. + + * "diff-highlight" script (in contrib/) learned to work better with + "git log -p --graph" output. + + * The test framework left the number of tests and success/failure + count in the t/test-results directory, keyed by the name of the + test script plus the process ID. The latter however turned out not + to serve any useful purpose. The process ID part of the filename + has been removed. + + * Having a submodule whose ".git" repository is somehow corrupt + caused a few commands that recurse into submodules loop forever. + + * "git symbolic-ref -d HEAD" happily removes the symbolic ref, but + the resulting repository becomes an invalid one. Teach the command + to forbid removal of HEAD. + + * A test spawned a short-lived background process, which sometimes + prevented the test directory from getting removed at the end of the + script on some platforms. + + * Update a few tests that used to use GIT_CURL_VERBOSE to use the + newer GIT_TRACE_CURL. + + * Update Japanese translation for "git-gui". + + * "git fetch http::/site/path" did not die correctly and segfaulted + instead. + + * "git commit-tree" stopped reading commit.gpgsign configuration + variable that was meant for Porcelain "git commit" in Git 2.9; we + forgot to update "git gui" to look at the configuration to match + this change. + + * "git log --cherry-pick" used to include merge commits as candidates + to be matched up with other commits, resulting a lot of wasted time. + The patch-id generation logic has been updated to ignore merges to + avoid the wastage. + + * The http transport (with curl-multi option, which is the default + these days) failed to remove curl-easy handle from a curlm session, + which led to unnecessary API failures. + + * "git diff -W" output needs to extend the context backward to + include the header line of the current function and also forward to + include the body of the entire current function up to the header + line of the next one. This process may have to merge to adjacent + hunks, but the code forgot to do so in some cases. + + * Performance tests done via "t/perf" did not use the same set of + build configuration if the user relied on autoconf generated + configuration. + + * "git format-patch --base=..." feature that was recently added + showed the base commit information after "-- " e-mail signature + line, which turned out to be inconvenient. The base information + has been moved above the signature line. + + * Even when "git pull --rebase=preserve" (and the underlying "git + rebase --preserve") can complete without creating any new commit + (i.e. fast-forwards), it still insisted on having a usable ident + information (read: user.email is set correctly), which was less + than nice. As the underlying commands used inside "git rebase" + would fail with a more meaningful error message and advice text + when the bogus ident matters, this extra check was removed. + + * "git gc --aggressive" used to limit the delta-chain length to 250, + which is way too deep for gaining additional space savings and is + detrimental for runtime performance. The limit has been reduced to + 50. + + * Documentation for individual configuration variables to control use + of color (like `color.grep`) said that their default value is + 'false', instead of saying their default is taken from `color.ui`. + When we updated the default value for color.ui from 'false' to + 'auto' quite a while ago, all of them broke. This has been + corrected. + + * A shell script example in check-ref-format documentation has been + fixed. + + * "git checkout <word>" does not follow the usual disambiguation + rules when the <word> can be both a rev and a path, to allow + checking out a branch 'foo' in a project that happens to have a + file 'foo' in the working tree without having to disambiguate. + This was poorly documented and the check was incorrect when the + command was run from a subdirectory. + + * Some codepaths in "git diff" used regexec(3) on a buffer that was + mmap(2)ed, which may not have a terminating NUL, leading to a read + beyond the end of the mapped region. This was fixed by introducing + a regexec_buf() helper that takes a <ptr,len> pair with REG_STARTEND + extension. + + * The procedure to build Git on Mac OS X for Travis CI hardcoded the + internal directory structure we assumed HomeBrew uses, which was a + no-no. The procedure has been updated to ask HomeBrew things we + need to know to fix this. + + * When "git rebase -i" is given a broken instruction, it told the + user to fix it with "--edit-todo", but didn't say what the step + after that was (i.e. "--continue"). + + * "git add --chmod=+x" added recently lacked documentation, which has + been corrected. + + * "git add --chmod=+x <pathspec>" added recently only toggled the + executable bit for paths that are either new or modified. This has + been corrected to flip the executable bit for all paths that match + the given pathspec. + + * "git pack-objects --include-tag" was taught that when we know that + we are sending an object C, we want a tag B that directly points at + C but also a tag A that points at the tag B. We used to miss the + intermediate tag B in some cases. + + * Documentation around tools to import from CVS was fairly outdated. + + * In the codepath that comes up with the hostname to be used in an + e-mail when the user didn't tell us, we looked at ai_canonname + field in struct addrinfo without making sure it is not NULL first. + +Also contains minor documentation updates and code clean-ups. diff --git a/Documentation/RelNotes/2.10.2.txt b/Documentation/RelNotes/2.10.2.txt new file mode 100644 index 0000000000..ed2de0dc20 --- /dev/null +++ b/Documentation/RelNotes/2.10.2.txt @@ -0,0 +1,45 @@ +Git v2.10.2 Release Notes +========================= + +Fixes since v2.10.1 +------------------- + + * The code that parses the format parameter of for-each-ref command + has seen a micro-optimization. + + * The "graph" API used in "git log --graph" miscounted the number of + output columns consumed so far when drawing a padding line, which + has been fixed; this did not affect any existing code as nobody + tried to write anything after the padding on such a line, though. + + * Almost everybody uses DEFAULT_ABBREV to refer to the default + setting for the abbreviation, but "git blame" peeked into + underlying variable bypassing the macro for no good reason. + + * Doc update to clarify what "log -3 --reverse" does. + + * An author name, that spelled a backslash-quoted double quote in the + human readable part "My \"double quoted\" name", was not unquoted + correctly while applying a patch from a piece of e-mail. + + * The original command line syntax for "git merge", which was "git + merge <msg> HEAD <parent>...", has been deprecated for quite some + time, and "git gui" was the last in-tree user of the syntax. This + is finally fixed, so that we can move forward with the deprecation. + + * Codepaths that read from an on-disk loose object were too loose in + validating what they are reading is a proper object file and + sometimes read past the data they read from the disk, which has + been corrected. H/t to Gustavo Grieco for reporting. + + * "git worktree", even though it used the default_abbrev setting that + ought to be affected by core.abbrev configuration variable, ignored + the variable setting. The command has been taught to read the + default set of configuration variables to correct this. + + * A low-level function verify_packfile() was meant to show errors + that were detected without dying itself, but under some conditions + it didn't and died instead, which has been fixed. + + +Also contains minor documentation updates and code clean-ups. diff --git a/Documentation/RelNotes/2.9.4.txt b/Documentation/RelNotes/2.9.4.txt new file mode 100644 index 0000000000..01e864278b --- /dev/null +++ b/Documentation/RelNotes/2.9.4.txt @@ -0,0 +1,83 @@ +Git v2.9.4 Release Notes +======================== + +Fixes since v2.9.3 +------------------ + + * There are certain house-keeping tasks that need to be performed at + the very beginning of any Git program, and programs that are not + built-in commands had to do them exactly the same way as "git" + potty does. It was easy to make mistakes in one-off standalone + programs (like test helpers). A common "main()" function that + calls cmd_main() of individual program has been introduced to + make it harder to make mistakes. + + * "git merge" with renormalization did not work well with + merge-recursive, due to "safer crlf" conversion kicking in when it + shouldn't. + + * The reflog output format is documented better, and a new format + --date=unix to report the seconds-since-epoch (without timezone) + has been added. + + * "git push --force-with-lease" already had enough logic to allow + ensuring that such a push results in creation of a ref (i.e. the + receiving end did not have another push from sideways that would be + discarded by our force-pushing), but didn't expose this possibility + to the users. It does so now. + + * "import-tars" fast-import script (in contrib/) used to ignore a + hardlink target and replaced it with an empty file, which has been + corrected to record the same blob as the other file the hardlink is + shared with. + + * "git mv dir non-existing-dir/" did not work in some environments + the same way as existing mainstream platforms. The code now moves + "dir" to "non-existing-dir", without relying on rename("A", "B/") + that strips the trailing slash of '/'. + + * The "t/" hierarchy is prone to get an unusual pathname; "make test" + has been taught to make sure they do not contain paths that cannot + be checked out on Windows (and the mechanism can be reusable to + catch pathnames that are not portable to other platforms as need + arises). + + * When "git merge-recursive" works on history with many criss-cross + merges in "verbose" mode, the names the command assigns to the + virtual merge bases could have overwritten each other by unintended + reuse of the same piece of memory. + + * "git checkout --detach <branch>" used to give the same advice + message as that is issued when "git checkout <tag>" (or anything + that is not a branch name) is given, but asking with "--detach" is + an explicit enough sign that the user knows what is going on. The + advice message has been squelched in this case. + + * "git difftool" by default ignores the error exit from the backend + commands it spawns, because often they signal that they found + differences by exiting with a non-zero status code just like "diff" + does; the exit status codes 126 and above however are special in + that they are used to signal that the command is not executable, + does not exist, or killed by a signal. "git difftool" has been + taught to notice these exit status codes. + + * On Windows, help.browser configuration variable used to be ignored, + which has been corrected. + + * The "git -c var[=val] cmd" facility to append a configuration + variable definition at the end of the search order was described in + git(1) manual page, but not in git-config(1), which was more likely + place for people to look for when they ask "can I make a one-shot + override, and if so how?" + + * The tempfile (hence its user lockfile) API lets the caller to open + a file descriptor to a temporary file, write into it and then + finalize it by first closing the filehandle and then either + removing or renaming the temporary file. When the process spawns a + subprocess after obtaining the file descriptor, and if the + subprocess has not exited when the attempt to remove or rename is + made, the last step fails on Windows, because the subprocess has + the file descriptor still open. Open tempfile with O_CLOEXEC flag + to avoid this (on Windows, this is mapped to O_NOINHERIT). + +Also contains minor documentation updates and code clean-ups. diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index 500230c054..08352deaae 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -122,9 +122,14 @@ without external resources. Instead of giving a URL to a mailing list archive, summarize the relevant points of the discussion. If you want to reference a previous commit in the history of a stable -branch use the format "abbreviated sha1 (subject, date)". So for example -like this: "Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30) -noticed [...]". +branch, use the format "abbreviated sha1 (subject, date)", +with the subject enclosed in a pair of double-quotes, like this: + + Commit f86a374 ("pack-bitmap.c: fix a memleak", 2015-03-30) + noticed that ... + +The "Copy commit summary" command of gitk can be used to obtain this +format. (3) Generate your patch using Git tools out of your commits. diff --git a/Documentation/config.txt b/Documentation/config.txt index 0bcb6790d6..a077c64ef0 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -953,7 +953,8 @@ color.branch:: A boolean to enable/disable color in the output of linkgit:git-branch[1]. May be set to `always`, `false` (or `never`) or `auto` (or `true`), in which case colors are used - only when the output is to a terminal. Defaults to false. + only when the output is to a terminal. If unset, then the + value of `color.ui` is used (`auto` by default). color.branch.<slot>:: Use customized color for branch coloration. `<slot>` is one of @@ -968,7 +969,8 @@ color.diff:: linkgit:git-log[1], and linkgit:git-show[1] will use color for all patches. If it is set to `true` or `auto`, those commands will only use color when output is to the terminal. - Defaults to false. + If unset, then the value of `color.ui` is used (`auto` by + default). + This does not affect linkgit:git-format-patch[1] or the 'git-diff-{asterisk}' plumbing commands. Can be overridden on the @@ -991,7 +993,8 @@ color.decorate.<slot>:: color.grep:: When set to `always`, always highlight matches. When `false` (or `never`), never. When set to `true` or `auto`, use color only - when the output is written to the terminal. Defaults to `false`. + when the output is written to the terminal. If unset, then the + value of `color.ui` is used (`auto` by default). color.grep.<slot>:: Use customized color for grep colorization. `<slot>` specifies which @@ -1024,7 +1027,8 @@ color.interactive:: and displays (such as those used by "git-add --interactive" and "git-clean --interactive"). When false (or `never`), never. When set to `true` or `auto`, use colors only when the output is - to the terminal. Defaults to false. + to the terminal. If unset, then the value of `color.ui` is + used (`auto` by default). color.interactive.<slot>:: Use customized color for 'git add --interactive' and 'git clean @@ -1040,13 +1044,15 @@ color.showBranch:: A boolean to enable/disable color in the output of linkgit:git-show-branch[1]. May be set to `always`, `false` (or `never`) or `auto` (or `true`), in which case colors are used - only when the output is to a terminal. Defaults to false. + only when the output is to a terminal. If unset, then the + value of `color.ui` is used (`auto` by default). color.status:: A boolean to enable/disable color in the output of linkgit:git-status[1]. May be set to `always`, `false` (or `never`) or `auto` (or `true`), in which case colors are used - only when the output is to a terminal. Defaults to false. + only when the output is to a terminal. If unset, then the + value of `color.ui` is used (`auto` by default). color.status.<slot>:: Use customized color for status colorization. `<slot>` is @@ -1366,7 +1372,7 @@ fsck.skipList:: gc.aggressiveDepth:: The depth parameter used in the delta compression algorithm used by 'git gc --aggressive'. This defaults - to 250. + to 50. gc.aggressiveWindow:: The window size parameter used in the delta compression diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index 6a96a669c2..7ed63dce0b 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -11,7 +11,7 @@ SYNOPSIS 'git add' [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] - [--] [<pathspec>...] + [--chmod=(+|-)x] [--] [<pathspec>...] DESCRIPTION ----------- @@ -165,6 +165,11 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files. be ignored, no matter if they are already present in the work tree or not. +--chmod=(+|-)x:: + Override the executable bit of the added files. The executable + bit is only changed in the index, the files on disk are left + unchanged. + \--:: This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index 91a3622ee4..8611a99120 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -118,8 +118,8 @@ $ git check-ref-format --branch @{-1} * Determine the reference name to use for a new branch: + ------------ -$ ref=$(git check-ref-format --normalize "refs/heads/$newbranch") || -die "we do not like '$newbranch' as a branch name." +$ ref=$(git check-ref-format --normalize "refs/heads/$newbranch")|| +{ echo "we do not like '$newbranch' as a branch name." >&2 ; exit 1 ; } ------------ GIT diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 7a2201b051..8e2c0662dd 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -419,6 +419,18 @@ $ git reflog -2 HEAD # or $ git log -g -2 HEAD ------------ +ARGUMENT DISAMBIGUATION +----------------------- + +When there is only one argument given and it is not `--` (e.g. "git +checkout abc"), and when the argument is both a valid `<tree-ish>` +(e.g. a branch "abc" exists) and a valid `<pathspec>` (e.g. a file +or a directory whose name is "abc" exists), Git would usually ask +you to disambiguate. Because checking out a branch is so common an +operation, however, "git checkout abc" takes "abc" as a `<tree-ish>` +in such a situation. Use `git checkout -- <pathspec>` if you want +to checkout these paths out of the index. + EXAMPLES -------- diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt index 41207a24b0..de1ebed67d 100644 --- a/Documentation/git-cvsimport.txt +++ b/Documentation/git-cvsimport.txt @@ -22,7 +22,7 @@ DESCRIPTION deprecated; it does not work with cvsps version 3 and later. If you are performing a one-shot import of a CVS repository consider using http://cvs2svn.tigris.org/cvs2git.html[cvs2git] or -https://github.com/BartMassey/parsecvs[parsecvs]. +http://www.catb.org/esr/cvs-fast-export/[cvs-fast-export]. Imports a CVS repository into Git. It will either create a new repository, or incrementally import into an existing one. diff --git a/Documentation/git.txt b/Documentation/git.txt index bd659c4471..b8bec711f4 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,6 +43,12 @@ unreleased) version of Git, that is available from the 'master' branch of the `git.git` repository. Documentation for older releases are available here: +* link:v2.10.1/git.html[documentation for release 2.10.1] + +* release notes for + link:RelNotes/2.10.1.txt[2.10.1], + link:RelNotes/2.10.0.txt[2.10]. + * link:v2.9.3/git.html[documentation for release 2.9.3] * release notes for diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.txt index b06e852a85..4c6143c511 100644 --- a/Documentation/gitcvs-migration.txt +++ b/Documentation/gitcvs-migration.txt @@ -116,8 +116,12 @@ they create are writable and searchable by other group members. Importing a CVS archive ----------------------- +NOTE: These instructions use the `git-cvsimport` script which ships with +git, but other importers may provide better results. See the note in +linkgit:git-cvsimport[1] for other options. + First, install version 2.1 or higher of cvsps from -http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make +https://github.com/andreyvit/cvsps[https://github.com/andreyvit/cvsps] and make sure it is in your path. Then cd to a checked out CVS working directory of the project you are interested in and run linkgit:git-cvsimport[1]: diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt index a68d860fa3..e382dd96df 100644 --- a/Documentation/gitk.txt +++ b/Documentation/gitk.txt @@ -70,7 +70,7 @@ linkgit:git-rev-list[1] for a complete list. --left-right:: - Mark which side of a symmetric diff a commit is reachable + Mark which side of a symmetric difference a commit is reachable from. Commits from the left side are prefixed with a `<` symbol and those from the right with a `>` symbol. diff --git a/Documentation/gitrevisions.txt b/Documentation/gitrevisions.txt index e903eb7860..27dec5b91d 100644 --- a/Documentation/gitrevisions.txt +++ b/Documentation/gitrevisions.txt @@ -15,9 +15,9 @@ DESCRIPTION Many Git commands take revision parameters as arguments. Depending on the command, they denote a specific commit or, for commands which -walk the revision graph (such as linkgit:git-log[1]), all commits which can -be reached from that commit. In the latter case one can also specify a -range of revisions explicitly. +walk the revision graph (such as linkgit:git-log[1]), all commits which are +reachable from that commit. For commands that walk the revision graph one can +also specify a range of revisions explicitly. In addition, some Git commands (such as linkgit:git-show[1]) also take revision parameters which denote other objects than commits, e.g. blobs diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index b95d67ec01..a942d57f73 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -172,7 +172,7 @@ endif::git-rev-list[] respecting the `auto` settings of the former if we are going to a terminal). `auto` alone (i.e. `%C(auto)`) will turn on auto coloring on the next placeholders until the color is switched again. -- '%m': left, right or boundary mark +- '%m': left (`<`), right (`>`) or boundary (`-`) mark - '%n': newline - '%%': a raw '%' - '%x00': print a byte from a hex code diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index a779c9dfec..5da7cf5a8d 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -225,7 +225,7 @@ excluded from the output. --left-only:: --right-only:: - List only commits on the respective side of a symmetric range, + List only commits on the respective side of a symmetric difference, i.e. only those which would be marked `<` resp. `>` by `--left-right`. + @@ -657,8 +657,9 @@ avoid showing the commits from two parallel development track mixed together. --reverse:: - Output the commits in reverse order. - Cannot be combined with `--walk-reflogs`. + Output the commits chosen to be shown (see Commit Limiting + section above) in reverse order. Cannot be combined with + `--walk-reflogs`. Object Traversal ~~~~~~~~~~~~~~~~ @@ -796,7 +797,7 @@ ifdef::git-rev-list[] endif::git-rev-list[] --left-right:: - Mark which side of a symmetric diff a commit is reachable from. + Mark which side of a symmetric difference a commit is reachable from. Commits from the left side are prefixed with `<` and those from the right with `>`. If combined with `--boundary`, those commits are prefixed with `-`. diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index abae363983..4bed5b1ab7 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -237,48 +237,74 @@ SPECIFYING RANGES ----------------- History traversing commands such as `git log` operate on a set -of commits, not just a single commit. To these commands, -specifying a single revision with the notation described in the -previous section means the set of commits reachable from that -commit, following the commit ancestry chain. - -To exclude commits reachable from a commit, a prefix '{caret}' -notation is used. E.g. '{caret}r1 r2' means commits reachable -from 'r2' but exclude the ones reachable from 'r1'. - -This set operation appears so often that there is a shorthand -for it. When you have two commits 'r1' and 'r2' (named according -to the syntax explained in SPECIFYING REVISIONS above), you can ask -for commits that are reachable from r2 excluding those that are reachable -from r1 by '{caret}r1 r2' and it can be written as 'r1..r2'. - -A similar notation 'r1\...r2' is called symmetric difference -of 'r1' and 'r2' and is defined as -'r1 r2 --not $(git merge-base --all r1 r2)'. -It is the set of commits that are reachable from either one of -'r1' or 'r2' but not from both. - -In these two shorthands, you can omit one end and let it default to HEAD. +of commits, not just a single commit. + +For these commands, +specifying a single revision, using the notation described in the +previous section, means the set of commits `reachable` from the given +commit. + +A commit's reachable set is the commit itself and the commits in +its ancestry chain. + + +Commit Exclusions +~~~~~~~~~~~~~~~~~ + +'{caret}<rev>' (caret) Notation:: + To exclude commits reachable from a commit, a prefix '{caret}' + notation is used. E.g. '{caret}r1 r2' means commits reachable + from 'r2' but exclude the ones reachable from 'r1' (i.e. 'r1' and + its ancestors). + +Dotted Range Notations +~~~~~~~~~~~~~~~~~~~~~~ + +The '..' (two-dot) Range Notation:: + The '{caret}r1 r2' set operation appears so often that there is a shorthand + for it. When you have two commits 'r1' and 'r2' (named according + to the syntax explained in SPECIFYING REVISIONS above), you can ask + for commits that are reachable from r2 excluding those that are reachable + from r1 by '{caret}r1 r2' and it can be written as 'r1..r2'. + +The '...' (three dot) Symmetric Difference Notation:: + A similar notation 'r1\...r2' is called symmetric difference + of 'r1' and 'r2' and is defined as + 'r1 r2 --not $(git merge-base --all r1 r2)'. + It is the set of commits that are reachable from either one of + 'r1' (left side) or 'r2' (right side) but not from both. + +In these two shorthand notations, you can omit one end and let it default to HEAD. For example, 'origin..' is a shorthand for 'origin..HEAD' and asks "What did I do since I forked from the origin branch?" Similarly, '..origin' is a shorthand for 'HEAD..origin' and asks "What did the origin do since I forked from them?" Note that '..' would mean 'HEAD..HEAD' which is an empty range that is both reachable and unreachable from HEAD. -Two other shorthands for naming a set that is formed by a commit -and its parent commits exist. The 'r1{caret}@' notation means all -parents of 'r1'. 'r1{caret}!' includes commit 'r1' but excludes -all of its parents. +Other <rev>{caret} Parent Shorthand Notations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Two other shorthands exist, particularly useful for merge commits, +for naming a set that is formed by a commit and its parent commits. + +The 'r1{caret}@' notation means all parents of 'r1'. + +The 'r1{caret}!' notation includes commit 'r1' but excludes all of its parents. +By itself, this notation denotes the single commit 'r1'. + +While '<rev>{caret}<n>' was about specifying a single commit parent, these +two notations consider all its parents. For example you can say +'HEAD{caret}2{caret}@', however you cannot say 'HEAD{caret}@{caret}2'. -To summarize: +Revision Range Summary +---------------------- '<rev>':: - Include commits that are reachable from (i.e. ancestors of) - <rev>. + Include commits that are reachable from <rev> (i.e. <rev> and its + ancestors). '{caret}<rev>':: - Exclude commits that are reachable from (i.e. ancestors of) - <rev>. + Exclude commits that are reachable from <rev> (i.e. <rev> and its + ancestors). '<rev1>..<rev2>':: Include commits that are reachable from <rev2> but exclude @@ -300,16 +326,27 @@ To summarize: as giving commit '<rev>' and then all its parents prefixed with '{caret}' to exclude them (and their ancestors). -Here are a handful of examples: - - D G H D - D F G H I J D F - ^G D H D - ^D B E I J F B - B..C C - B...C G H D E B C - ^D B C E I J F B C - C I J F C - C^@ I J F - C^! C - F^! D G H D F +Here are a handful of examples using the Loeliger illustration above, +with each step in the notation's expansion and selection carefully +spelt out: + + Args Expanded arguments Selected commits + D G H D + D F G H I J D F + ^G D H D + ^D B E I J F B + ^D B C E I J F B C + C I J F C + B..C = ^B C C + B...C = B ^F C G H D E B C + C^@ = C^1 + = F I J F + B^@ = B^1 B^2 B^3 + = D E F D G H E F I J + C^! = C ^C^@ + = C ^C^1 + = C ^F C + B^! = B ^B^@ + = B ^B^1 ^B^2 ^B^3 + = B ^D ^E ^F B + F^! D = F ^I ^J D G H D F diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 1ca5c0e366..7d5c4771b4 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v2.10.0-rc2 +DEF_VER=v2.10.1 LF=' ' @@ -296,7 +296,13 @@ all:: # Define USE_NED_ALLOCATOR if you want to replace the platforms default # memory allocators with the nedmalloc allocator written by Niall Douglas. # -# Define NO_REGEX if you have no or inferior regex support in your C library. +# Define OVERRIDE_STRDUP to override the libc version of strdup(3). +# This is necessary when using a custom allocator in order to avoid +# crashes due to allocation and free working on different 'heaps'. +# It's defined automatically if USE_NED_ALLOCATOR is set. +# +# Define NO_REGEX if your C library lacks regex support with REG_STARTEND +# feature. # # Define HAVE_DEV_TTY if your system can open /dev/tty to interact with the # user. @@ -1456,8 +1462,14 @@ ifdef NATIVE_CRLF endif ifdef USE_NED_ALLOCATOR - COMPAT_CFLAGS += -Icompat/nedmalloc - COMPAT_OBJS += compat/nedmalloc/nedmalloc.o + COMPAT_CFLAGS += -Icompat/nedmalloc + COMPAT_OBJS += compat/nedmalloc/nedmalloc.o + OVERRIDE_STRDUP = YesPlease +endif + +ifdef OVERRIDE_STRDUP + COMPAT_CFLAGS += -DOVERRIDE_STRDUP + COMPAT_OBJS += compat/strdup.o endif ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT @@ -2029,7 +2041,7 @@ endif ifdef USE_NED_ALLOCATOR compat/nedmalloc/nedmalloc.sp compat/nedmalloc/nedmalloc.o: EXTRA_CPPFLAGS = \ - -DNDEBUG -DOVERRIDE_STRDUP -DREPLACE_SYSTEM_ALLOCATOR + -DNDEBUG -DREPLACE_SYSTEM_ALLOCATOR compat/nedmalloc/nedmalloc.sp: SPARSE_FLAGS += -Wno-non-pointer-null endif @@ -1 +1 @@ -Documentation/RelNotes/2.10.0.txt
\ No newline at end of file +Documentation/RelNotes/2.10.2.txt
\ No newline at end of file diff --git a/builtin/add.c b/builtin/add.c index b1dddb4ac6..e8fb80b36e 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -26,10 +26,25 @@ static int patch_interactive, add_interactive, edit_interactive; static int take_worktree_changes; struct update_callback_data { - int flags, force_mode; + int flags; int add_errors; }; +static void chmod_pathspec(struct pathspec *pathspec, int force_mode) +{ + int i; + + for (i = 0; i < active_nr; i++) { + struct cache_entry *ce = active_cache[i]; + + if (pathspec && !ce_path_match(ce, pathspec, NULL)) + continue; + + if (chmod_cache_entry(ce, force_mode) < 0) + fprintf(stderr, "cannot chmod '%s'", ce->name); + } +} + static int fix_unmerged_status(struct diff_filepair *p, struct update_callback_data *data) { @@ -65,8 +80,7 @@ static void update_callback(struct diff_queue_struct *q, die(_("unexpected diff status %c"), p->status); case DIFF_STATUS_MODIFIED: case DIFF_STATUS_TYPE_CHANGED: - if (add_file_to_index(&the_index, path, - data->flags, data->force_mode)) { + if (add_file_to_index(&the_index, path, data->flags)) { if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) die(_("updating files failed")); data->add_errors++; @@ -84,15 +98,14 @@ static void update_callback(struct diff_queue_struct *q, } } -int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, - int flags, int force_mode) +int add_files_to_cache(const char *prefix, + const struct pathspec *pathspec, int flags) { struct update_callback_data data; struct rev_info rev; memset(&data, 0, sizeof(data)); data.flags = flags; - data.force_mode = force_mode; init_revisions(&rev, prefix); setup_revisions(0, NULL, &rev, NULL); @@ -281,7 +294,7 @@ static int add_config(const char *var, const char *value, void *cb) return git_default_config(var, value, cb); } -static int add_files(struct dir_struct *dir, int flags, int force_mode) +static int add_files(struct dir_struct *dir, int flags) { int i, exit_status = 0; @@ -294,8 +307,7 @@ static int add_files(struct dir_struct *dir, int flags, int force_mode) } for (i = 0; i < dir->nr; i++) - if (add_file_to_index(&the_index, dir->entries[i]->name, - flags, force_mode)) { + if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) { if (!ignore_add_errors) die(_("adding files failed")); exit_status = 1; @@ -308,7 +320,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) int exit_status = 0; struct pathspec pathspec; struct dir_struct dir; - int flags, force_mode; + int flags; int add_new_files; int require_pathspec; char *seen = NULL; @@ -342,13 +354,8 @@ int cmd_add(int argc, const char **argv, const char *prefix) if (!show_only && ignore_missing) die(_("Option --ignore-missing can only be used together with --dry-run")); - if (!chmod_arg) - force_mode = 0; - else if (!strcmp(chmod_arg, "-x")) - force_mode = 0666; - else if (!strcmp(chmod_arg, "+x")) - force_mode = 0777; - else + if (chmod_arg && ((chmod_arg[0] != '-' && chmod_arg[0] != '+') || + chmod_arg[1] != 'x' || chmod_arg[2])) die(_("--chmod param '%s' must be either -x or +x"), chmod_arg); add_new_files = !take_worktree_changes && !refresh_only; @@ -441,11 +448,13 @@ int cmd_add(int argc, const char **argv, const char *prefix) plug_bulk_checkin(); - exit_status |= add_files_to_cache(prefix, &pathspec, flags, force_mode); + exit_status |= add_files_to_cache(prefix, &pathspec, flags); if (add_new_files) - exit_status |= add_files(&dir, flags, force_mode); + exit_status |= add_files(&dir, flags); + if (chmod_arg && pathspec.nr) + chmod_pathspec(&pathspec, chmod_arg[0]); unplug_bulk_checkin(); finish: diff --git a/builtin/am.c b/builtin/am.c index 739b34dcf2..9e2ae5cba4 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -2222,7 +2222,7 @@ int cmd_am(int argc, const char **argv, const char *prefix) int in_progress; const char * const usage[] = { - N_("git am [<options>] [(<mbox>|<Maildir>)...]"), + N_("git am [<options>] [(<mbox> | <Maildir>)...]"), N_("git am [<options>] (--continue | --skip | --abort)"), NULL }; diff --git a/builtin/blame.c b/builtin/blame.c index a5bbf91e49..f618392e55 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -2111,7 +2111,7 @@ static void find_alignment(struct scoreboard *sb, int *option) unsigned largest_score = 0; struct blame_entry *e; int compute_auto_abbrev = (abbrev < 0); - int auto_abbrev = default_abbrev; + int auto_abbrev = DEFAULT_ABBREV; for (e = sb->ent; e; e = e->next) { struct origin *suspect = e->suspect; diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 2dfe6265f7..560f6c2cc7 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -440,7 +440,7 @@ static int batch_objects(struct batch_options *opt) } static const char * const cat_file_usage[] = { - N_("git cat-file (-t [--allow-unknown-type]|-s [--allow-unknown-type]|-e|-p|<type>|--textconv) <object>"), + N_("git cat-file (-t [--allow-unknown-type] | -s [--allow-unknown-type] | -e | -p | <type> | --textconv) <object>"), N_("git cat-file (--batch | --batch-check) [--follow-symlinks]"), NULL }; diff --git a/builtin/checkout.c b/builtin/checkout.c index 8672d0724f..32cf317ec2 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -154,8 +154,8 @@ static int check_stages(unsigned stages, const struct cache_entry *ce, int pos) return 0; } -static int checkout_stage(int stage, struct cache_entry *ce, int pos, - struct checkout *state) +static int checkout_stage(int stage, const struct cache_entry *ce, int pos, + const struct checkout *state) { while (pos < active_nr && !strcmp(active_cache[pos]->name, ce->name)) { @@ -169,7 +169,7 @@ static int checkout_stage(int stage, struct cache_entry *ce, int pos, return error(_("path '%s' does not have their version"), ce->name); } -static int checkout_merged(int pos, struct checkout *state) +static int checkout_merged(int pos, const struct checkout *state) { struct cache_entry *ce = active_cache[pos]; const char *path = ce->name; @@ -548,7 +548,7 @@ static int merge_working_tree(const struct checkout_opts *opts, * entries in the index. */ - add_files_to_cache(NULL, NULL, 0, 0); + add_files_to_cache(NULL, NULL, 0); /* * NEEDSWORK: carrying over local changes * when branches have different end-of-line @@ -985,7 +985,7 @@ static int parse_branchname_arg(int argc, const char **argv, int recover_with_dwim = dwim_new_local_branch_ok; if (!has_dash_dash && - (check_filename(NULL, arg) || !no_wildcard(arg))) + (check_filename(opts->prefix, arg) || !no_wildcard(arg))) recover_with_dwim = 0; /* * Accept "git checkout foo" and "git checkout foo --" @@ -1038,7 +1038,7 @@ static int parse_branchname_arg(int argc, const char **argv, if (!*source_tree) /* case (1): want a tree */ die(_("reference is not a tree: %s"), arg); - if (!has_dash_dash) {/* case (3).(d) -> (1) */ + if (!has_dash_dash) { /* case (3).(d) -> (1) */ /* * Do not complain the most common case * git checkout branch @@ -1046,7 +1046,7 @@ static int parse_branchname_arg(int argc, const char **argv, * it would be extremely annoying. */ if (argc) - verify_non_filename(NULL, arg); + verify_non_filename(opts->prefix, arg); } else { argcount++; argv++; diff --git a/builtin/commit.c b/builtin/commit.c index 77e3dc8494..7a1ade0d27 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -387,7 +387,7 @@ static const char *prepare_index(int argc, const char **argv, const char *prefix */ if (all || (also && pathspec.nr)) { hold_locked_index(&index_lock, 1); - add_files_to_cache(also ? prefix : NULL, &pathspec, 0, 0); + add_files_to_cache(also ? prefix : NULL, &pathspec, 0); refresh_cache_or_die(refresh_flags); update_main_cache_tree(WRITE_TREE_SILENT); if (write_locked_index(&the_index, &index_lock, CLOSE_LOCK)) diff --git a/builtin/gc.c b/builtin/gc.c index 332bcf7e7a..069950d0b4 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -28,7 +28,7 @@ static const char * const builtin_gc_usage[] = { static int pack_refs = 1; static int prune_reflogs = 1; -static int aggressive_depth = 250; +static int aggressive_depth = 50; static int aggressive_window = 250; static int gc_auto_threshold = 6700; static int gc_auto_pack_limit = 50; diff --git a/builtin/log.c b/builtin/log.c index 92dc34dcb0..cd9c4a46d1 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1042,7 +1042,6 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, diff_flush(&opts); fprintf(rev->diffopt.file, "\n"); - print_signature(rev->diffopt.file); } static const char *clean_message_id(const char *msg_id) @@ -1361,7 +1360,7 @@ static void print_bases(struct base_tree_info *bases, FILE *file) return; /* Show the base commit */ - fprintf(file, "base-commit: %s\n", oid_to_hex(&bases->base_commit)); + fprintf(file, "\nbase-commit: %s\n", oid_to_hex(&bases->base_commit)); /* Show the prerequisite patches */ for (i = bases->nr_patch_id - 1; i >= 0; i--) @@ -1720,6 +1719,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) make_cover_letter(&rev, use_stdout, origin, nr, list, branch_name, quiet); print_bases(&bases, rev.diffopt.file); + print_signature(rev.diffopt.file); total++; start_number--; } @@ -1779,13 +1779,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (!use_stdout) rev.shown_one = 0; if (shown) { + print_bases(&bases, rev.diffopt.file); if (rev.mime_boundary) fprintf(rev.diffopt.file, "\n--%s%s--\n\n\n", mime_boundary_leader, rev.mime_boundary); else print_signature(rev.diffopt.file); - print_bases(&bases, rev.diffopt.file); } if (!use_stdout) fclose(rev.diffopt.file); diff --git a/builtin/mv.c b/builtin/mv.c index 446a316738..2f43877bc9 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -26,7 +26,7 @@ static const char **internal_copy_pathspec(const char *prefix, int i; const char **result; ALLOC_ARRAY(result, count + 1); - memcpy(result, pathspec, count * sizeof(const char *)); + COPY_ARRAY(result, pathspec, count); result[count] = NULL; for (i = 0; i < count; i++) { int length = strlen(result[i]); diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 4a63398960..0954375be9 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -2123,6 +2123,35 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size, #define ll_find_deltas(l, s, w, d, p) find_deltas(l, &s, w, d, p) #endif +static void add_tag_chain(const struct object_id *oid) +{ + struct tag *tag; + + /* + * We catch duplicates already in add_object_entry(), but we'd + * prefer to do this extra check to avoid having to parse the + * tag at all if we already know that it's being packed (e.g., if + * it was included via bitmaps, we would not have parsed it + * previously). + */ + if (packlist_find(&to_pack, oid->hash, NULL)) + return; + + tag = lookup_tag(oid->hash); + while (1) { + if (!tag || parse_tag(tag) || !tag->tagged) + die("unable to pack objects reachable from tag %s", + oid_to_hex(oid)); + + add_object_entry(tag->object.oid.hash, OBJ_TAG, NULL, 0); + + if (tag->tagged->type != OBJ_TAG) + return; + + tag = (struct tag *)tag->tagged; + } +} + static int add_ref_tag(const char *path, const struct object_id *oid, int flag, void *cb_data) { struct object_id peeled; @@ -2130,7 +2159,7 @@ static int add_ref_tag(const char *path, const struct object_id *oid, int flag, if (starts_with(path, "refs/tags/") && /* is a tag? */ !peel_ref(path, peeled.hash) && /* peelable? */ packlist_find(&to_pack, peeled.hash, NULL)) /* object packed? */ - add_object_entry(oid->hash, OBJ_TAG, NULL, 0); + add_tag_chain(oid); return 0; } diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index 9c29a64e43..96eed94468 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -56,6 +56,8 @@ int cmd_symbolic_ref(int argc, const char **argv, const char *prefix) ret = check_symref(argv[0], 1, 0, 0); if (ret) die("Cannot delete %s, not a symbolic ref", argv[0]); + if (!strcmp(argv[0], "HEAD")) + die("deleting '%s' is not allowed", argv[0]); return delete_ref(argv[0], NULL, REF_NODEREF); } diff --git a/builtin/update-index.c b/builtin/update-index.c index ba04b197d8..9e9e04059c 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -419,30 +419,18 @@ static int add_cacheinfo(unsigned int mode, const unsigned char *sha1, return 0; } -static void chmod_path(int flip, const char *path) +static void chmod_path(char flip, const char *path) { int pos; struct cache_entry *ce; - unsigned int mode; pos = cache_name_pos(path, strlen(path)); if (pos < 0) goto fail; ce = active_cache[pos]; - mode = ce->ce_mode; - if (!S_ISREG(mode)) - goto fail; - switch (flip) { - case '+': - ce->ce_mode |= 0111; break; - case '-': - ce->ce_mode &= ~0111; break; - default: + if (chmod_cache_entry(ce, flip) < 0) goto fail; - } - cache_tree_invalidate_path(&the_index, path); - ce->ce_flags |= CE_UPDATE_IN_BASE; - active_cache_changed |= CE_ENTRY_CHANGED; + report("chmod %cx '%s'", flip, path); return; fail: diff --git a/builtin/worktree.c b/builtin/worktree.c index 6dcf7bd9d2..5c4854d3e4 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -528,6 +528,8 @@ int cmd_worktree(int ac, const char **av, const char *prefix) OPT_END() }; + git_config(git_default_config, NULL); + if (ac < 2) usage_with_options(worktree_usage, options); if (!prefix) @@ -367,8 +367,9 @@ extern void free_name_hash(struct index_state *istate); #define rename_cache_entry_at(pos, new_name) rename_index_entry_at(&the_index, (pos), (new_name)) #define remove_cache_entry_at(pos) remove_index_entry_at(&the_index, (pos)) #define remove_file_from_cache(path) remove_file_from_index(&the_index, (path)) -#define add_to_cache(path, st, flags) add_to_index(&the_index, (path), (st), (flags), 0) -#define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags), 0) +#define add_to_cache(path, st, flags) add_to_index(&the_index, (path), (st), (flags)) +#define add_file_to_cache(path, flags) add_file_to_index(&the_index, (path), (flags)) +#define chmod_cache_entry(ce, flip) chmod_index_entry(&the_index, (ce), (flip)) #define refresh_cache(flags) refresh_index(&the_index, (flags), NULL, NULL, NULL) #define ce_match_stat(ce, st, options) ie_match_stat(&the_index, (ce), (st), (options)) #define ce_modified(ce, st, options) ie_modified(&the_index, (ce), (st), (options)) @@ -581,9 +582,10 @@ extern int remove_file_from_index(struct index_state *, const char *path); #define ADD_CACHE_IGNORE_ERRORS 4 #define ADD_CACHE_IGNORE_REMOVAL 8 #define ADD_CACHE_INTENT 16 -extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags, int force_mode); -extern int add_file_to_index(struct index_state *, const char *path, int flags, int force_mode); +extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags); +extern int add_file_to_index(struct index_state *, const char *path, int flags); extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, unsigned int refresh_options); +extern int chmod_index_entry(struct index_state *, struct cache_entry *ce, char flip); extern int ce_same_name(const struct cache_entry *a, const struct cache_entry *b); extern void set_object_name_for_intent_to_add_entry(struct cache_entry *ce); extern int index_name_is_other(const struct index_state *, const char *, int); @@ -1139,6 +1141,16 @@ static inline unsigned int hexval(unsigned char c) return hexval_table[c]; } +/* + * Convert two consecutive hexadecimal digits into a char. Return a + * negative value on error. Don't run over the end of short strings. + */ +static inline int hex2chr(const char *s) +{ + int val = hexval(s[0]); + return (val < 0) ? val : (val << 4) | hexval(s[1]); +} + /* Convert to/from hex/sha1 representation */ #define MINIMUM_ABBREV minimum_abbrev #define DEFAULT_ABBREV default_abbrev @@ -1818,7 +1830,7 @@ void packet_trace_identity(const char *prog); * return 0 if success, 1 - if addition of a file failed and * ADD_FILES_IGNORE_ERRORS was specified in flags */ -int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int flags, int force_mode); +int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int flags); /* diff.c */ extern int diff_auto_refresh_index; @@ -215,7 +215,7 @@ int color_parse_mem(const char *value, int value_len, char *dst) /* [fg [bg]] [attr]... */ while (len > 0) { const char *word = ptr; - struct color c; + struct color c = { COLOR_UNSPECIFIED }; int val, wordlen = 0; while (len > 0 && !isspace(word[wordlen])) { @@ -931,7 +931,7 @@ static int remove_redundant(struct commit **array, int cnt) } /* Now collect the result */ - memcpy(work, array, sizeof(*array) * cnt); + COPY_ARRAY(work, array, cnt); for (i = filled = 0; i < cnt; i++) if (!redundant[i]) array[filled++] = work[i]; diff --git a/compat/nedmalloc/nedmalloc.c b/compat/nedmalloc/nedmalloc.c index 2d4ef59013..1cc31c3502 100644 --- a/compat/nedmalloc/nedmalloc.c +++ b/compat/nedmalloc/nedmalloc.c @@ -948,22 +948,6 @@ void **nedpindependent_comalloc(nedpool *p, size_t elems, size_t *sizes, void ** return ret; } -#ifdef OVERRIDE_STRDUP -/* - * This implementation is purely there to override the libc version, to - * avoid a crash due to allocation and free on different 'heaps'. - */ -char *strdup(const char *s1) -{ - size_t len = strlen(s1) + 1; - char *s2 = malloc(len); - - if (s2) - memcpy(s2, s1, len); - return s2; -} -#endif - #if defined(__cplusplus) } #endif diff --git a/compat/strdup.c b/compat/strdup.c new file mode 100644 index 0000000000..f3fb978eb3 --- /dev/null +++ b/compat/strdup.c @@ -0,0 +1,11 @@ +#include "../git-compat-util.h" + +char *gitstrdup(const char *s1) +{ + size_t len = strlen(s1) + 1; + char *s2 = malloc(len); + + if (s2) + memcpy(s2, s1, len); + return s2; +} diff --git a/contrib/coccinelle/array.cocci b/contrib/coccinelle/array.cocci new file mode 100644 index 0000000000..2d7f25d99f --- /dev/null +++ b/contrib/coccinelle/array.cocci @@ -0,0 +1,26 @@ +@@ +type T; +T *dst; +T *src; +expression n; +@@ +- memcpy(dst, src, n * sizeof(*dst)); ++ COPY_ARRAY(dst, src, n); + +@@ +type T; +T *dst; +T *src; +expression n; +@@ +- memcpy(dst, src, n * sizeof(*src)); ++ COPY_ARRAY(dst, src, n); + +@@ +type T; +T *dst; +T *src; +expression n; +@@ +- memcpy(dst, src, n * sizeof(T)); ++ COPY_ARRAY(dst, src, n); diff --git a/contrib/diff-highlight/Makefile b/contrib/diff-highlight/Makefile new file mode 100644 index 0000000000..9018724524 --- /dev/null +++ b/contrib/diff-highlight/Makefile @@ -0,0 +1,5 @@ +# nothing to build +all: + +test: + $(MAKE) -C t diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight index ffefc31a98..81bd8040e3 100755 --- a/contrib/diff-highlight/diff-highlight +++ b/contrib/diff-highlight/diff-highlight @@ -21,6 +21,10 @@ my $RESET = "\x1b[m"; my $COLOR = qr/\x1b\[[0-9;]*m/; my $BORING = qr/$COLOR|\s/; +# The patch portion of git log -p --graph should only ever have preceding | and +# not / or \ as merge history only shows up on the commit line. +my $GRAPH = qr/$COLOR?\|$COLOR?\s+/; + my @removed; my @added; my $in_hunk; @@ -32,12 +36,12 @@ $SIG{PIPE} = 'DEFAULT'; while (<>) { if (!$in_hunk) { print; - $in_hunk = /^$COLOR*\@/; + $in_hunk = /^$GRAPH*$COLOR*\@\@ /; } - elsif (/^$COLOR*-/) { + elsif (/^$GRAPH*$COLOR*-/) { push @removed, $_; } - elsif (/^$COLOR*\+/) { + elsif (/^$GRAPH*$COLOR*\+/) { push @added, $_; } else { @@ -46,7 +50,7 @@ while (<>) { @added = (); print; - $in_hunk = /^$COLOR*[\@ ]/; + $in_hunk = /^$GRAPH*$COLOR*[\@ ]/; } # Most of the time there is enough output to keep things streaming, @@ -163,6 +167,9 @@ sub highlight_pair { } } +# we split either by $COLOR or by character. This has the side effect of +# leaving in graph cruft. It works because the graph cruft does not contain "-" +# or "+" sub split_line { local $_ = shift; return utf8::decode($_) ? @@ -211,8 +218,8 @@ sub is_pair_interesting { my $suffix_a = join('', @$a[($sa+1)..$#$a]); my $suffix_b = join('', @$b[($sb+1)..$#$b]); - return $prefix_a !~ /^$COLOR*-$BORING*$/ || - $prefix_b !~ /^$COLOR*\+$BORING*$/ || + return $prefix_a !~ /^$GRAPH*$COLOR*-$BORING*$/ || + $prefix_b !~ /^$GRAPH*$COLOR*\+$BORING*$/ || $suffix_a !~ /^$BORING*$/ || $suffix_b !~ /^$BORING*$/; } diff --git a/contrib/diff-highlight/t/.gitignore b/contrib/diff-highlight/t/.gitignore new file mode 100644 index 0000000000..7dcbb232cd --- /dev/null +++ b/contrib/diff-highlight/t/.gitignore @@ -0,0 +1,2 @@ +/trash directory* +/test-results diff --git a/contrib/diff-highlight/t/Makefile b/contrib/diff-highlight/t/Makefile new file mode 100644 index 0000000000..5ff5275496 --- /dev/null +++ b/contrib/diff-highlight/t/Makefile @@ -0,0 +1,22 @@ +-include ../../../config.mak.autogen +-include ../../../config.mak + +# copied from ../../t/Makefile +SHELL_PATH ?= $(SHELL) +SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) +T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh) + +all: test +test: $(T) + +.PHONY: help clean all test $(T) + +help: + @echo 'Run "$(MAKE) test" to launch test scripts' + @echo 'Run "$(MAKE) clean" to remove trash folders' + +$(T): + @echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS) + +clean: + $(RM) -r 'trash directory'.* diff --git a/contrib/diff-highlight/t/t9400-diff-highlight.sh b/contrib/diff-highlight/t/t9400-diff-highlight.sh new file mode 100755 index 0000000000..3b43dbed74 --- /dev/null +++ b/contrib/diff-highlight/t/t9400-diff-highlight.sh @@ -0,0 +1,296 @@ +#!/bin/sh + +test_description='Test diff-highlight' + +CURR_DIR=$(pwd) +TEST_OUTPUT_DIRECTORY=$(pwd) +TEST_DIRECTORY="$CURR_DIR"/../../../t +DIFF_HIGHLIGHT="$CURR_DIR"/../diff-highlight + +CW="$(printf "\033[7m")" # white +CR="$(printf "\033[27m")" # reset + +. "$TEST_DIRECTORY"/test-lib.sh + +if ! test_have_prereq PERL +then + skip_all='skipping diff-highlight tests; perl not available' + test_done +fi + +# dh_test is a test helper function which takes 3 file names as parameters. The +# first 2 files are used to generate diff and commit output, which is then +# piped through diff-highlight. The 3rd file should contain the expected output +# of diff-highlight (minus the diff/commit header, ie. everything after and +# including the first @@ line). +dh_test () { + a="$1" b="$2" && + + cat >patch.exp && + + { + cat "$a" >file && + git add file && + git commit -m "Add a file" && + + cat "$b" >file && + git diff file >diff.raw && + git commit -a -m "Update a file" && + git show >commit.raw + } >/dev/null && + + "$DIFF_HIGHLIGHT" <diff.raw | test_strip_patch_header >diff.act && + "$DIFF_HIGHLIGHT" <commit.raw | test_strip_patch_header >commit.act && + test_cmp patch.exp diff.act && + test_cmp patch.exp commit.act +} + +test_strip_patch_header () { + sed -n '/^@@/,$p' $* +} + +# dh_test_setup_history generates a contrived graph such that we have at least +# 1 nesting (E) and 2 nestings (F). +# +# A branch +# / +# D---E---F master +# +# git log --all --graph +# * commit +# | A +# | * commit +# | | F +# | * commit +# |/ +# | E +# * commit +# D +# +dh_test_setup_history () { + echo "file1" >file1 && + echo "file2" >file2 && + echo "file3" >file3 && + + cat file1 >file && + git add file && + git commit -m "D" && + + git checkout -b branch && + cat file2 >file && + git commit -a -m "A" && + + git checkout master && + cat file2 >file && + git commit -a -m "E" && + + cat file3 >file && + git commit -a -m "F" +} + +left_trim () { + "$PERL_PATH" -pe 's/^\s+//' +} + +trim_graph () { + # graphs start with * or | + # followed by a space or / or \ + "$PERL_PATH" -pe 's@^((\*|\|)( |/|\\))+@@' +} + +test_expect_success 'diff-highlight highlights the beginning of a line' ' + cat >a <<-\EOF && + aaa + bbb + ccc + EOF + + cat >b <<-\EOF && + aaa + 0bb + ccc + EOF + + dh_test a b <<-EOF + @@ -1,3 +1,3 @@ + aaa + -${CW}b${CR}bb + +${CW}0${CR}bb + ccc + EOF +' + +test_expect_success 'diff-highlight highlights the end of a line' ' + cat >a <<-\EOF && + aaa + bbb + ccc + EOF + + cat >b <<-\EOF && + aaa + bb0 + ccc + EOF + + dh_test a b <<-EOF + @@ -1,3 +1,3 @@ + aaa + -bb${CW}b${CR} + +bb${CW}0${CR} + ccc + EOF +' + +test_expect_success 'diff-highlight highlights the middle of a line' ' + cat >a <<-\EOF && + aaa + bbb + ccc + EOF + + cat >b <<-\EOF && + aaa + b0b + ccc + EOF + + dh_test a b <<-EOF + @@ -1,3 +1,3 @@ + aaa + -b${CW}b${CR}b + +b${CW}0${CR}b + ccc + EOF +' + +test_expect_success 'diff-highlight does not highlight whole line' ' + cat >a <<-\EOF && + aaa + bbb + ccc + EOF + + cat >b <<-\EOF && + aaa + 000 + ccc + EOF + + dh_test a b <<-EOF + @@ -1,3 +1,3 @@ + aaa + -bbb + +000 + ccc + EOF +' + +test_expect_failure 'diff-highlight highlights mismatched hunk size' ' + cat >a <<-\EOF && + aaa + bbb + EOF + + cat >b <<-\EOF && + aaa + b0b + ccc + EOF + + dh_test a b <<-EOF + @@ -1,3 +1,3 @@ + aaa + -b${CW}b${CR}b + +b${CW}0${CR}b + +ccc + EOF +' + +# These two code points share the same leading byte in UTF-8 representation; +# a naive byte-wise diff would highlight only the second byte. +# +# - U+00f3 ("o" with acute) +o_accent=$(printf '\303\263') +# - U+00f8 ("o" with stroke) +o_stroke=$(printf '\303\270') + +test_expect_success 'diff-highlight treats multibyte utf-8 as a unit' ' + echo "unic${o_accent}de" >a && + echo "unic${o_stroke}de" >b && + dh_test a b <<-EOF + @@ -1 +1 @@ + -unic${CW}${o_accent}${CR}de + +unic${CW}${o_stroke}${CR}de + EOF +' + +# Unlike the UTF-8 above, these are combining code points which are meant +# to modify the character preceding them: +# +# - U+0301 (combining acute accent) +combine_accent=$(printf '\314\201') +# - U+0302 (combining circumflex) +combine_circum=$(printf '\314\202') + +test_expect_failure 'diff-highlight treats combining code points as a unit' ' + echo "unico${combine_accent}de" >a && + echo "unico${combine_circum}de" >b && + dh_test a b <<-EOF + @@ -1 +1 @@ + -unic${CW}o${combine_accent}${CR}de + +unic${CW}o${combine_circum}${CR}de + EOF +' + +test_expect_success 'diff-highlight works with the --graph option' ' + dh_test_setup_history && + + # topo-order so that the order of the commits is the same as with --graph + # trim graph elements so we can do a diff + # trim leading space because our trim_graph is not perfect + git log --branches -p --topo-order | + "$DIFF_HIGHLIGHT" | left_trim >graph.exp && + git log --branches -p --graph | + "$DIFF_HIGHLIGHT" | trim_graph | left_trim >graph.act && + test_cmp graph.exp graph.act +' + +# Most combined diffs won't meet diff-highlight's line-number filter. So we +# create one here where one side drops a line and the other modifies it. That +# should result in a diff like: +# +# - modified content +# ++resolved content +# +# which naively looks like one side added "+resolved". +test_expect_success 'diff-highlight ignores combined diffs' ' + echo "content" >file && + git add file && + git commit -m base && + + >file && + git commit -am master && + + git checkout -b other HEAD^ && + echo "modified content" >file && + git commit -am other && + + test_must_fail git merge master && + echo "resolved content" >file && + git commit -am resolved && + + cat >expect <<-\EOF && + --- a/file + +++ b/file + @@@ -1,1 -1,0 +1,1 @@@ + - modified content + ++resolved content + EOF + + git show -c | "$DIFF_HIGHLIGHT" >actual.raw && + sed -n "/^---/,\$p" <actual.raw >actual && + test_cmp expect actual +' + +test_done @@ -354,7 +354,6 @@ struct emit_callback { const char **label_path; struct diff_words_data *diff_words; struct diff_options *opt; - int *found_changesp; struct strbuf *header; }; @@ -722,7 +721,6 @@ static void emit_rewrite_diff(const char *name_a, memset(&ecbdata, 0, sizeof(ecbdata)); ecbdata.color_diff = want_color(o->use_color); - ecbdata.found_changesp = &o->found_changes; ecbdata.ws_rule = whitespace_rule(name_b); ecbdata.opt = o; if (ecbdata.ws_rule & WS_BLANK_AT_EOF) { @@ -951,7 +949,8 @@ static int find_word_boundaries(mmfile_t *buffer, regex_t *word_regex, { if (word_regex && *begin < buffer->size) { regmatch_t match[1]; - if (!regexec(word_regex, buffer->ptr + *begin, 1, match, 0)) { + if (!regexec_buf(word_regex, buffer->ptr + *begin, + buffer->size - *begin, 1, match, 0)) { char *p = memchr(buffer->ptr + *begin + match[0].rm_so, '\n', match[0].rm_eo - match[0].rm_so); *end = p ? p - buffer->ptr : match[0].rm_eo + *begin; @@ -1216,12 +1215,13 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) struct diff_options *o = ecbdata->opt; const char *line_prefix = diff_line_prefix(o); + o->found_changes = 1; + if (ecbdata->header) { - fprintf(ecbdata->opt->file, "%s", ecbdata->header->buf); + fprintf(o->file, "%s", ecbdata->header->buf); strbuf_reset(ecbdata->header); ecbdata->header = NULL; } - *(ecbdata->found_changesp) = 1; if (ecbdata->label_path[0]) { const char *name_a_tab, *name_b_tab; @@ -1229,9 +1229,9 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) name_a_tab = strchr(ecbdata->label_path[0], ' ') ? "\t" : ""; name_b_tab = strchr(ecbdata->label_path[1], ' ') ? "\t" : ""; - fprintf(ecbdata->opt->file, "%s%s--- %s%s%s\n", + fprintf(o->file, "%s%s--- %s%s%s\n", line_prefix, meta, ecbdata->label_path[0], reset, name_a_tab); - fprintf(ecbdata->opt->file, "%s%s+++ %s%s%s\n", + fprintf(o->file, "%s%s+++ %s%s%s\n", line_prefix, meta, ecbdata->label_path[1], reset, name_b_tab); ecbdata->label_path[0] = ecbdata->label_path[1] = NULL; } @@ -1249,15 +1249,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) find_lno(line, ecbdata); emit_hunk_header(ecbdata, line, len); if (line[len-1] != '\n') - putc('\n', ecbdata->opt->file); - return; - } - - if (len < 1) { - emit_line(ecbdata->opt, reset, reset, line, len); - if (ecbdata->diff_words - && ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN) - fputs("~\n", ecbdata->opt->file); + putc('\n', o->file); return; } @@ -1282,8 +1274,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) } diff_words_flush(ecbdata); if (ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN) { - emit_line(ecbdata->opt, context, reset, line, len); - fputs("~\n", ecbdata->opt->file); + emit_line(o, context, reset, line, len); + fputs("~\n", o->file); } else { /* * Skip the prefix character, if any. With @@ -1294,7 +1286,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) line++; len--; } - emit_line(ecbdata->opt, context, reset, line, len); + emit_line(o, context, reset, line, len); } return; } @@ -1316,8 +1308,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) default: /* incomplete line at the end */ ecbdata->lno_in_preimage++; - emit_line(ecbdata->opt, - diff_get_color(ecbdata->color_diff, DIFF_CONTEXT), + emit_line(o, diff_get_color(ecbdata->color_diff, DIFF_CONTEXT), reset, line, len); break; } @@ -2438,7 +2429,6 @@ static void builtin_diff(const char *name_a, memset(&ecbdata, 0, sizeof(ecbdata)); ecbdata.label_path = lbl; ecbdata.color_diff = want_color(o->use_color); - ecbdata.found_changesp = &o->found_changes; ecbdata.ws_rule = whitespace_rule(name_b); if (ecbdata.ws_rule & WS_BLANK_AT_EOF) check_blank_at_eof(&mf1, &mf2, &ecbdata); diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c index 55067cab6c..9795ca1c15 100644 --- a/diffcore-pickaxe.c +++ b/diffcore-pickaxe.c @@ -23,7 +23,6 @@ static void diffgrep_consume(void *priv, char *line, unsigned long len) { struct diffgrep_cb *data = priv; regmatch_t regmatch; - int hold; if (line[0] != '+' && line[0] != '-') return; @@ -33,11 +32,8 @@ static void diffgrep_consume(void *priv, char *line, unsigned long len) * caller early. */ return; - /* Yuck -- line ought to be "const char *"! */ - hold = line[len]; - line[len] = '\0'; - data->hit = !regexec(data->regexp, line + 1, 1, ®match, 0); - line[len] = hold; + data->hit = !regexec_buf(data->regexp, line + 1, len - 1, 1, + ®match, 0); } static int diff_grep(mmfile_t *one, mmfile_t *two, @@ -50,9 +46,11 @@ static int diff_grep(mmfile_t *one, mmfile_t *two, xdemitconf_t xecfg; if (!one) - return !regexec(regexp, two->ptr, 1, ®match, 0); + return !regexec_buf(regexp, two->ptr, two->size, + 1, ®match, 0); if (!two) - return !regexec(regexp, one->ptr, 1, ®match, 0); + return !regexec_buf(regexp, one->ptr, one->size, + 1, ®match, 0); /* * We have both sides; need to run textual diff and see if @@ -83,8 +81,8 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws) regmatch_t regmatch; int flags = 0; - assert(data[sz] == '\0'); - while (*data && !regexec(regexp, data, 1, ®match, flags)) { + while (*data && + !regexec_buf(regexp, data, sz, 1, ®match, flags)) { flags |= REG_NOTBOL; data += regmatch.rm_eo; if (*data && regmatch.rm_so == regmatch.rm_eo) diff --git a/git-compat-util.h b/git-compat-util.h index db89ba7748..aec8cc9890 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -436,6 +436,7 @@ static inline int const_error(void) return -1; } #define error(...) (error(__VA_ARGS__), const_error()) +#define error_errno(...) (error_errno(__VA_ARGS__), const_error()) #endif extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params)); @@ -663,6 +664,14 @@ void *gitmemmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); #endif +#ifdef OVERRIDE_STRDUP +#ifdef strdup +#undef strdup +#endif +#define strdup gitstrdup +char *gitstrdup(const char *s); +#endif + #ifdef NO_GETPAGESIZE #define getpagesize() sysconf(_SC_PAGESIZE) #endif @@ -789,6 +798,14 @@ extern FILE *fopen_for_writing(const char *path); #define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc))) #define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc))) +#define COPY_ARRAY(dst, src, n) copy_array((dst), (src), (n), sizeof(*(dst)) + \ + BUILD_ASSERT_OR_ZERO(sizeof(*(dst)) == sizeof(*(src)))) +static inline void copy_array(void *dst, const void *src, size_t n, size_t size) +{ + if (n) + memcpy(dst, src, st_mult(size, n)); +} + /* * These functions help you allocate structs with flex arrays, and copy * the data directly into the array. For example, if you had: @@ -965,6 +982,19 @@ void git_qsort(void *base, size_t nmemb, size_t size, #define qsort git_qsort #endif +#ifndef REG_STARTEND +#error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd" +#endif + +static inline int regexec_buf(const regex_t *preg, const char *buf, size_t size, + size_t nmatch, regmatch_t pmatch[], int eflags) +{ + assert(nmatch > 0 && pmatch); + pmatch[0].rm_so = 0; + pmatch[0].rm_eo = size; + return regexec(preg, buf, nmatch, pmatch, eflags | REG_STARTEND); +} + #ifndef DIR_HAS_BSD_GROUP_SEMANTICS # define FORCE_DIR_SET_GID S_ISGID #else diff --git a/git-gui/lib/commit.tcl b/git-gui/lib/commit.tcl index 864b687057..01d2cc280b 100644 --- a/git-gui/lib/commit.tcl +++ b/git-gui/lib/commit.tcl @@ -369,6 +369,9 @@ A rescan will be automatically started now. # -- Create the commit. # set cmd [list commit-tree $tree_id] + if {[is_config_true commit.gpgsign]} { + lappend cmd -S + } foreach p [concat $PARENT $MERGE_HEAD] { lappend cmd -p $p } diff --git a/git-gui/lib/merge.tcl b/git-gui/lib/merge.tcl index 460d32fa22..5ab6f8f102 100644 --- a/git-gui/lib/merge.tcl +++ b/git-gui/lib/merge.tcl @@ -112,12 +112,7 @@ method _start {} { close $fh set _last_merged_branch $branch - set cmd [list git] - lappend cmd merge - lappend cmd --strategy=recursive - lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]] - lappend cmd HEAD - lappend cmd $name + set cmd [list git merge --strategy=recursive FETCH_HEAD] ui_status [mc "Merging %s and %s..." $current_branch $stitle] set cons [console::new [mc "Merge"] "merge $stitle"] diff --git a/git-gui/po/ja.po b/git-gui/po/ja.po index 9aff249d5f..208651c1af 100644 --- a/git-gui/po/ja.po +++ b/git-gui/po/ja.po @@ -1,47 +1,50 @@ # Translation of git-gui to Japanese # Copyright (C) 2007 Shawn Pearce # This file is distributed under the same license as the git-gui package. +# # しらいし ななこ <nanako3@bluebottle.com>, 2007. +# Satoshi Yasushima <s.yasushima@gmail.com>, 2016. # msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-26 15:47-0800\n" -"PO-Revision-Date: 2010-02-02 19:03+0900\n" -"Last-Translator: しらいし ななこ <nanako3@lavabit.com>\n" +"POT-Creation-Date: 2016-05-27 17:52+0900\n" +"PO-Revision-Date: 2016-06-22 12:50+0900\n" +"Last-Translator: Satoshi Yasushima <s.yasushima@gmail.com>\n" "Language-Team: Japanese\n" +"Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: git-gui.sh:41 git-gui.sh:793 git-gui.sh:807 git-gui.sh:820 git-gui.sh:903 -#: git-gui.sh:922 -msgid "git-gui: fatal error" -msgstr "git-gui: 致命的なエラー" - -#: git-gui.sh:743 +#: git-gui.sh:861 #, tcl-format msgid "Invalid font specified in %s:" msgstr "%s に無効なフォントが指定されています:" -#: git-gui.sh:779 +#: git-gui.sh:915 msgid "Main Font" msgstr "主フォント" -#: git-gui.sh:780 +#: git-gui.sh:916 msgid "Diff/Console Font" msgstr "diff/コンソール・フォント" -#: git-gui.sh:794 +#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048 git-gui.sh:1067 +#: git-gui.sh:3125 +msgid "git-gui: fatal error" +msgstr "git-gui: 致命的なエラー" + +#: git-gui.sh:932 msgid "Cannot find git in PATH." msgstr "PATH 中に git が見つかりません" -#: git-gui.sh:821 +#: git-gui.sh:959 msgid "Cannot parse Git version string:" msgstr "Git バージョン名が理解できません:" -#: git-gui.sh:839 +#: git-gui.sh:984 #, tcl-format msgid "" "Git version cannot be determined.\n" @@ -60,475 +63,502 @@ msgstr "" "\n" "'%s' はバージョン 1.5.0 と思って良いですか?\n" -#: git-gui.sh:1128 +#: git-gui.sh:1281 msgid "Git directory not found:" msgstr "Git ディレクトリが見つかりません:" -#: git-gui.sh:1146 +#: git-gui.sh:1315 msgid "Cannot move to top of working directory:" msgstr "作業ディレクトリの最上位に移動できません" -#: git-gui.sh:1154 +#: git-gui.sh:1323 msgid "Cannot use bare repository:" msgstr "裸のリポジトリは使えません:" -#: git-gui.sh:1162 +#: git-gui.sh:1331 msgid "No working directory" msgstr "作業ディレクトリがありません" -#: git-gui.sh:1334 lib/checkout_op.tcl:306 +#: git-gui.sh:1503 lib/checkout_op.tcl:306 msgid "Refreshing file status..." msgstr "ファイル状態を更新しています…" -#: git-gui.sh:1390 +#: git-gui.sh:1563 msgid "Scanning for modified files ..." msgstr "変更されたファイルをスキャンしています…" -#: git-gui.sh:1454 +#: git-gui.sh:1639 msgid "Calling prepare-commit-msg hook..." msgstr "prepare-commit-msg フックを実行中・・・" -#: git-gui.sh:1471 +#: git-gui.sh:1656 msgid "Commit declined by prepare-commit-msg hook." msgstr "prepare-commit-msg フックがコミットを拒否しました" -#: git-gui.sh:1629 lib/browser.tcl:246 +#: git-gui.sh:1814 lib/browser.tcl:252 msgid "Ready." msgstr "準備完了" -#: git-gui.sh:1787 +#: git-gui.sh:1978 #, tcl-format -msgid "Displaying only %s of %s files." -msgstr "全体で%s個の内の%sファイルだけ表示しています" +msgid "" +"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files." +msgstr "" +"表示可能な限界 (gui.maxfilesdisplayed = %s) に達しため、全体で%s個のファイル" +"を表示できません" -#: git-gui.sh:1913 +#: git-gui.sh:2101 msgid "Unmodified" msgstr "変更無し" -#: git-gui.sh:1915 +#: git-gui.sh:2103 msgid "Modified, not staged" msgstr "変更あり、コミット未予定" -#: git-gui.sh:1916 git-gui.sh:1924 +#: git-gui.sh:2104 git-gui.sh:2116 msgid "Staged for commit" msgstr "コミット予定済" -#: git-gui.sh:1917 git-gui.sh:1925 +#: git-gui.sh:2105 git-gui.sh:2117 msgid "Portions staged for commit" msgstr "部分的にコミット予定済" -#: git-gui.sh:1918 git-gui.sh:1926 +#: git-gui.sh:2106 git-gui.sh:2118 msgid "Staged for commit, missing" msgstr "コミット予定済、ファイル無し" -#: git-gui.sh:1920 +#: git-gui.sh:2108 msgid "File type changed, not staged" msgstr "ファイル型変更、コミット未予定" -#: git-gui.sh:1921 +#: git-gui.sh:2109 git-gui.sh:2110 +msgid "File type changed, old type staged for commit" +msgstr "ファイル型変更、旧型コミット予定済" + +#: git-gui.sh:2111 msgid "File type changed, staged" msgstr "ファイル型変更、コミット予定済" -#: git-gui.sh:1923 +#: git-gui.sh:2112 +msgid "File type change staged, modification not staged" +msgstr "ファイル型変更コミット予定済、変更コミット未予定" + +#: git-gui.sh:2113 +msgid "File type change staged, file missing" +msgstr "ファイル型変更コミット予定済、ファイル無し" + +#: git-gui.sh:2115 msgid "Untracked, not staged" msgstr "管理外、コミット未予定" -#: git-gui.sh:1928 +#: git-gui.sh:2120 msgid "Missing" msgstr "ファイル無し" -#: git-gui.sh:1929 +#: git-gui.sh:2121 msgid "Staged for removal" msgstr "削除予定済" -#: git-gui.sh:1930 +#: git-gui.sh:2122 msgid "Staged for removal, still present" msgstr "削除予定済、ファイル未削除" -#: git-gui.sh:1932 git-gui.sh:1933 git-gui.sh:1934 git-gui.sh:1935 -#: git-gui.sh:1936 git-gui.sh:1937 +#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127 +#: git-gui.sh:2128 git-gui.sh:2129 msgid "Requires merge resolution" msgstr "要マージ解決" -#: git-gui.sh:1972 +#: git-gui.sh:2164 msgid "Starting gitk... please wait..." msgstr "gitk を起動中…お待ち下さい…" -#: git-gui.sh:1984 +#: git-gui.sh:2176 msgid "Couldn't find gitk in PATH" msgstr "PATH 中に gitk が見つかりません" -#: git-gui.sh:2043 +#: git-gui.sh:2235 msgid "Couldn't find git gui in PATH" msgstr "PATH 中に git gui が見つかりません" -#: git-gui.sh:2455 lib/choose_repository.tcl:36 +#: git-gui.sh:2654 lib/choose_repository.tcl:41 msgid "Repository" msgstr "リポジトリ" -#: git-gui.sh:2456 +#: git-gui.sh:2655 msgid "Edit" msgstr "編集" -#: git-gui.sh:2458 lib/choose_rev.tcl:561 +#: git-gui.sh:2657 lib/choose_rev.tcl:567 msgid "Branch" msgstr "ブランチ" -#: git-gui.sh:2461 lib/choose_rev.tcl:548 +#: git-gui.sh:2660 lib/choose_rev.tcl:554 msgid "Commit@@noun" msgstr "コミット" -#: git-gui.sh:2464 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 +#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 msgid "Merge" msgstr "マージ" -#: git-gui.sh:2465 lib/choose_rev.tcl:557 +#: git-gui.sh:2664 lib/choose_rev.tcl:563 msgid "Remote" msgstr "リモート" -#: git-gui.sh:2468 +#: git-gui.sh:2667 msgid "Tools" msgstr "ツール" -#: git-gui.sh:2477 +#: git-gui.sh:2676 msgid "Explore Working Copy" msgstr "ワーキングコピーをブラウズ" -#: git-gui.sh:2483 +#: git-gui.sh:2682 +msgid "Git Bash" +msgstr "" + +#: git-gui.sh:2692 msgid "Browse Current Branch's Files" msgstr "現在のブランチのファイルを見る" -#: git-gui.sh:2487 +#: git-gui.sh:2696 msgid "Browse Branch Files..." msgstr "ブランチのファイルを見る…" -#: git-gui.sh:2492 +#: git-gui.sh:2701 msgid "Visualize Current Branch's History" msgstr "現在のブランチの履歴を見る" -#: git-gui.sh:2496 +#: git-gui.sh:2705 msgid "Visualize All Branch History" msgstr "全てのブランチの履歴を見る" -#: git-gui.sh:2503 +#: git-gui.sh:2712 #, tcl-format msgid "Browse %s's Files" msgstr "ブランチ %s のファイルを見る" -#: git-gui.sh:2505 +#: git-gui.sh:2714 #, tcl-format msgid "Visualize %s's History" msgstr "ブランチ %s の履歴を見る" -#: git-gui.sh:2510 lib/database.tcl:27 lib/database.tcl:67 +#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66 msgid "Database Statistics" msgstr "データベース統計" -#: git-gui.sh:2513 lib/database.tcl:34 +#: git-gui.sh:2722 lib/database.tcl:33 msgid "Compress Database" msgstr "データベース圧縮" -#: git-gui.sh:2516 +#: git-gui.sh:2725 msgid "Verify Database" msgstr "データベース検証" -#: git-gui.sh:2523 git-gui.sh:2527 git-gui.sh:2531 lib/shortcut.tcl:8 +#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8 #: lib/shortcut.tcl:40 lib/shortcut.tcl:72 msgid "Create Desktop Icon" msgstr "デスクトップ・アイコンを作る" -#: git-gui.sh:2539 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191 +#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201 msgid "Quit" msgstr "終了" -#: git-gui.sh:2547 +#: git-gui.sh:2756 msgid "Undo" msgstr "元に戻す" -#: git-gui.sh:2550 +#: git-gui.sh:2759 msgid "Redo" msgstr "やり直し" -#: git-gui.sh:2554 git-gui.sh:3109 +#: git-gui.sh:2763 git-gui.sh:3368 msgid "Cut" msgstr "切り取り" -#: git-gui.sh:2557 git-gui.sh:3112 git-gui.sh:3186 git-gui.sh:3259 +#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530 #: lib/console.tcl:69 msgid "Copy" msgstr "コピー" -#: git-gui.sh:2560 git-gui.sh:3115 +#: git-gui.sh:2769 git-gui.sh:3374 msgid "Paste" msgstr "貼り付け" -#: git-gui.sh:2563 git-gui.sh:3118 lib/branch_delete.tcl:26 -#: lib/remote_branch_delete.tcl:38 +#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39 +#: lib/branch_delete.tcl:28 msgid "Delete" msgstr "削除" -#: git-gui.sh:2567 git-gui.sh:3122 git-gui.sh:3263 lib/console.tcl:71 +#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71 msgid "Select All" msgstr "全て選択" -#: git-gui.sh:2576 +#: git-gui.sh:2785 msgid "Create..." msgstr "作成…" -#: git-gui.sh:2582 +#: git-gui.sh:2791 msgid "Checkout..." msgstr "チェックアウト" -#: git-gui.sh:2588 +#: git-gui.sh:2797 msgid "Rename..." msgstr "名前変更…" -#: git-gui.sh:2593 +#: git-gui.sh:2802 msgid "Delete..." msgstr "削除…" -#: git-gui.sh:2598 +#: git-gui.sh:2807 msgid "Reset..." msgstr "リセット…" -#: git-gui.sh:2608 +#: git-gui.sh:2817 msgid "Done" msgstr "完了" -#: git-gui.sh:2610 +#: git-gui.sh:2819 msgid "Commit@@verb" msgstr "コミット" -#: git-gui.sh:2619 git-gui.sh:3050 +#: git-gui.sh:2828 git-gui.sh:3309 msgid "New Commit" msgstr "新規コミット" -#: git-gui.sh:2627 git-gui.sh:3057 +#: git-gui.sh:2836 git-gui.sh:3316 msgid "Amend Last Commit" msgstr "最新コミットを訂正" -#: git-gui.sh:2637 git-gui.sh:3011 lib/remote_branch_delete.tcl:99 +#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101 msgid "Rescan" msgstr "再スキャン" -#: git-gui.sh:2643 +#: git-gui.sh:2852 msgid "Stage To Commit" msgstr "コミット予定する" -#: git-gui.sh:2649 +#: git-gui.sh:2858 msgid "Stage Changed Files To Commit" msgstr "変更されたファイルをコミット予定" -#: git-gui.sh:2655 +#: git-gui.sh:2864 msgid "Unstage From Commit" msgstr "コミットから降ろす" -#: git-gui.sh:2661 lib/index.tcl:412 +#: git-gui.sh:2870 lib/index.tcl:442 msgid "Revert Changes" msgstr "変更を元に戻す" -#: git-gui.sh:2669 git-gui.sh:3310 git-gui.sh:3341 +#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612 msgid "Show Less Context" msgstr "文脈を少なく" -#: git-gui.sh:2673 git-gui.sh:3314 git-gui.sh:3345 +#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616 msgid "Show More Context" msgstr "文脈を多く" -#: git-gui.sh:2680 git-gui.sh:3024 git-gui.sh:3133 +#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392 msgid "Sign Off" msgstr "署名" -#: git-gui.sh:2696 +#: git-gui.sh:2905 msgid "Local Merge..." msgstr "ローカル・マージ…" -#: git-gui.sh:2701 +#: git-gui.sh:2910 msgid "Abort Merge..." msgstr "マージ中止…" -#: git-gui.sh:2713 git-gui.sh:2741 +#: git-gui.sh:2922 git-gui.sh:2950 msgid "Add..." msgstr "追加" -#: git-gui.sh:2717 +#: git-gui.sh:2926 msgid "Push..." msgstr "プッシュ…" -#: git-gui.sh:2721 +#: git-gui.sh:2930 msgid "Delete Branch..." msgstr "ブランチ削除..." -#: git-gui.sh:2731 git-gui.sh:3292 +#: git-gui.sh:2940 git-gui.sh:3563 msgid "Options..." msgstr "オプション…" -#: git-gui.sh:2742 +#: git-gui.sh:2951 msgid "Remove..." msgstr "削除..." -#: git-gui.sh:2751 lib/choose_repository.tcl:50 +#: git-gui.sh:2960 lib/choose_repository.tcl:55 msgid "Help" msgstr "ヘルプ" -#: git-gui.sh:2755 git-gui.sh:2759 lib/about.tcl:14 -#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53 +#: git-gui.sh:2964 git-gui.sh:2968 lib/about.tcl:14 +#: lib/choose_repository.tcl:49 lib/choose_repository.tcl:58 #, tcl-format msgid "About %s" msgstr "%s について" -#: git-gui.sh:2783 +#: git-gui.sh:2992 msgid "Online Documentation" msgstr "オンライン・ドキュメント" -#: git-gui.sh:2786 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56 +#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61 msgid "Show SSH Key" msgstr "SSH キーを表示" -#: git-gui.sh:2893 +#: git-gui.sh:3014 git-gui.sh:3146 +msgid "Usage" +msgstr "使い方" + +#: git-gui.sh:3095 lib/blame.tcl:573 +msgid "Error" +msgstr "エラー" + +#: git-gui.sh:3126 #, tcl-format msgid "fatal: cannot stat path %s: No such file or directory" msgstr "" "致命的: パス %s が stat できません。そのようなファイルやディレクトリはありま" "せん" -#: git-gui.sh:2926 +#: git-gui.sh:3159 msgid "Current Branch:" msgstr "現在のブランチ" -#: git-gui.sh:2947 +#: git-gui.sh:3185 msgid "Staged Changes (Will Commit)" msgstr "ステージングされた(コミット予定済の)変更" -#: git-gui.sh:2967 +#: git-gui.sh:3205 msgid "Unstaged Changes" msgstr "コミット予定に入っていない変更" -#: git-gui.sh:3017 +#: git-gui.sh:3276 msgid "Stage Changed" msgstr "変更をコミット予定に入れる" -#: git-gui.sh:3036 lib/transport.tcl:104 lib/transport.tcl:193 +#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229 msgid "Push" msgstr "プッシュ" -#: git-gui.sh:3071 +#: git-gui.sh:3330 msgid "Initial Commit Message:" msgstr "最初のコミットメッセージ:" -#: git-gui.sh:3072 +#: git-gui.sh:3331 msgid "Amended Commit Message:" msgstr "訂正したコミットメッセージ:" -#: git-gui.sh:3073 +#: git-gui.sh:3332 msgid "Amended Initial Commit Message:" msgstr "訂正した最初のコミットメッセージ:" -#: git-gui.sh:3074 +#: git-gui.sh:3333 msgid "Amended Merge Commit Message:" msgstr "訂正したマージコミットメッセージ:" -#: git-gui.sh:3075 +#: git-gui.sh:3334 msgid "Merge Commit Message:" msgstr "マージコミットメッセージ:" -#: git-gui.sh:3076 +#: git-gui.sh:3335 msgid "Commit Message:" msgstr "コミットメッセージ:" -#: git-gui.sh:3125 git-gui.sh:3267 lib/console.tcl:73 +#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73 msgid "Copy All" msgstr "全てコピー" -#: git-gui.sh:3149 lib/blame.tcl:104 +#: git-gui.sh:3408 lib/blame.tcl:105 msgid "File:" msgstr "ファイル:" -#: git-gui.sh:3255 +#: git-gui.sh:3526 msgid "Refresh" msgstr "再読み込み" -#: git-gui.sh:3276 +#: git-gui.sh:3547 msgid "Decrease Font Size" msgstr "フォントを小さく" -#: git-gui.sh:3280 +#: git-gui.sh:3551 msgid "Increase Font Size" msgstr "フォントを大きく" -#: git-gui.sh:3288 lib/blame.tcl:281 +#: git-gui.sh:3559 lib/blame.tcl:294 msgid "Encoding" msgstr "エンコーディング" -#: git-gui.sh:3299 +#: git-gui.sh:3570 msgid "Apply/Reverse Hunk" msgstr "パッチを適用/取り消す" -#: git-gui.sh:3304 +#: git-gui.sh:3575 msgid "Apply/Reverse Line" msgstr "パッチ行を適用/取り消す" -#: git-gui.sh:3323 +#: git-gui.sh:3594 msgid "Run Merge Tool" msgstr "マージツールを起動" -#: git-gui.sh:3328 +#: git-gui.sh:3599 msgid "Use Remote Version" msgstr "リモートの方を採用" -#: git-gui.sh:3332 +#: git-gui.sh:3603 msgid "Use Local Version" msgstr "ローカルの方を採用" -#: git-gui.sh:3336 +#: git-gui.sh:3607 msgid "Revert To Base" msgstr "ベース版を採用" -#: git-gui.sh:3354 +#: git-gui.sh:3625 msgid "Visualize These Changes In The Submodule" msgstr "サブモジュール内のこれらの変更を見る" -#: git-gui.sh:3358 +#: git-gui.sh:3629 msgid "Visualize Current Branch History In The Submodule" msgstr "サブモジュール内で現在のブランチの履歴を見る" -#: git-gui.sh:3362 +#: git-gui.sh:3633 msgid "Visualize All Branch History In The Submodule" msgstr "サブモジュール内で全てのブランチの履歴を見る" -#: git-gui.sh:3367 +#: git-gui.sh:3638 msgid "Start git gui In The Submodule" msgstr "サブモジュール内でgit guiを起動する" -#: git-gui.sh:3389 +#: git-gui.sh:3673 msgid "Unstage Hunk From Commit" msgstr "パッチをコミット予定から外す" -#: git-gui.sh:3391 +#: git-gui.sh:3675 msgid "Unstage Lines From Commit" msgstr "コミット予定から行を外す" -#: git-gui.sh:3393 +#: git-gui.sh:3677 msgid "Unstage Line From Commit" msgstr "コミット予定から行を外す" -#: git-gui.sh:3396 +#: git-gui.sh:3680 msgid "Stage Hunk For Commit" msgstr "パッチをコミット予定に加える" -#: git-gui.sh:3398 +#: git-gui.sh:3682 msgid "Stage Lines For Commit" msgstr "パッチ行をコミット予定に加える" -#: git-gui.sh:3400 +#: git-gui.sh:3684 msgid "Stage Line For Commit" msgstr "パッチ行をコミット予定に加える" -#: git-gui.sh:3424 +#: git-gui.sh:3709 msgid "Initializing..." msgstr "初期化しています…" -#: git-gui.sh:3541 +#: git-gui.sh:3852 #, tcl-format msgid "" "Possible environment issues exist.\n" @@ -543,7 +573,7 @@ msgstr "" "以下の環境変数は %s が起動する Git サブプロセスによって無視されるでしょう:\n" "\n" -#: git-gui.sh:3570 +#: git-gui.sh:3881 msgid "" "\n" "This is due to a known issue with the\n" @@ -553,7 +583,7 @@ msgstr "" "これは Cygwin で配布されている Tcl バイナリに\n" "関しての既知の問題によります" -#: git-gui.sh:3575 +#: git-gui.sh:3886 #, tcl-format msgid "" "\n" @@ -568,249 +598,294 @@ msgstr "" "個人的な ~/.gitconfig ファイル内で user.name と user.email の値を設定\n" "するのが、%s の良い代用となります\n" -#: lib/about.tcl:26 -msgid "git-gui - a graphical user interface for Git." -msgstr "Git のグラフィカルUI git-gui" - -#: lib/blame.tcl:72 -msgid "File Viewer" -msgstr "ファイルピューワ" - -#: lib/blame.tcl:78 -msgid "Commit:" -msgstr "コミット:" - -#: lib/blame.tcl:271 -msgid "Copy Commit" -msgstr "コミットをコピー" - -#: lib/blame.tcl:275 -msgid "Find Text..." -msgstr "テキストを検索" - -#: lib/blame.tcl:284 -msgid "Do Full Copy Detection" -msgstr "コピー検知" - -#: lib/blame.tcl:288 -msgid "Show History Context" -msgstr "文脈を見せる" +#: lib/merge.tcl:13 +msgid "" +"Cannot merge while amending.\n" +"\n" +"You must finish amending this commit before starting any type of merge.\n" +msgstr "" +"訂正中にはマージできません。\n" +"\n" +"訂正処理を完了するまでは新たにマージを開始できません。\n" -#: lib/blame.tcl:291 -msgid "Blame Parent Commit" -msgstr "親コミットを註釈" +#: lib/merge.tcl:27 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before a merge can be performed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"最後にスキャンした状態はリポジトリの状態と合致しません。\n" +"\n" +"最後にスキャンして以後、別の Git プログラムがリポジトリを変更しています。マー" +"ジを開始する前に、再スキャンが必要です。\n" +"\n" +"自動的に再スキャンを開始します。\n" -#: lib/blame.tcl:450 +#: lib/merge.tcl:45 #, tcl-format -msgid "Reading %s..." -msgstr "%s を読んでいます…" - -#: lib/blame.tcl:557 -msgid "Loading copy/move tracking annotations..." -msgstr "コピー・移動追跡データを読んでいます…" - -#: lib/blame.tcl:577 -msgid "lines annotated" -msgstr "行を注釈しました" +msgid "" +"You are in the middle of a conflicted merge.\n" +"\n" +"File %s has merge conflicts.\n" +"\n" +"You must resolve them, stage the file, and commit to complete the current " +"merge. Only then can you begin another merge.\n" +msgstr "" +"衝突のあったマージの途中です。\n" +"\n" +"ファイル %s にはマージ中の衝突が残っています。\n" +"\n" +"このファイルの衝突を解決し、コミット予定に加えて、コミットすることでマージを" +"完了します。そうやって始めて、新たなマージを開始できるようになります。\n" -#: lib/blame.tcl:769 -msgid "Loading original location annotations..." -msgstr "元位置行の注釈データを読んでいます…" +#: lib/merge.tcl:55 +#, tcl-format +msgid "" +"You are in the middle of a change.\n" +"\n" +"File %s is modified.\n" +"\n" +"You should complete the current commit before starting a merge. Doing so " +"will help you abort a failed merge, should the need arise.\n" +msgstr "" +"変更の途中です。\n" +"\n" +"ファイル %s は変更中です。\n" +"\n" +"現在のコミットを完了してからマージを開始して下さい。そうする方がマージに失敗" +"したときの回復が楽です。\n" -#: lib/blame.tcl:772 -msgid "Annotation complete." -msgstr "注釈完了しました" +#: lib/merge.tcl:108 +#, tcl-format +msgid "%s of %s" +msgstr "%s の %s ブランチ" -#: lib/blame.tcl:802 -msgid "Busy" -msgstr "実行中" +#: lib/merge.tcl:122 +#, tcl-format +msgid "Merging %s and %s..." +msgstr "%s と %s をマージ中・・・" -#: lib/blame.tcl:803 -msgid "Annotation process is already running." -msgstr "すでに blame プロセスを実行中です。" +#: lib/merge.tcl:133 +msgid "Merge completed successfully." +msgstr "マージが完了しました" -#: lib/blame.tcl:842 -msgid "Running thorough copy detection..." -msgstr "コピー検知を実行中…" +#: lib/merge.tcl:135 +msgid "Merge failed. Conflict resolution is required." +msgstr "マージが失敗しました。衝突の解決が必要です。" -#: lib/blame.tcl:910 -msgid "Loading annotation..." -msgstr "注釈を読み込んでいます…" +#: lib/merge.tcl:160 +#, tcl-format +msgid "Merge Into %s" +msgstr "%s にマージ" -#: lib/blame.tcl:963 -msgid "Author:" -msgstr "作者:" +#: lib/merge.tcl:166 lib/checkout_op.tcl:567 lib/tools_dlg.tcl:336 +msgid "Visualize" +msgstr "可視化" -#: lib/blame.tcl:967 -msgid "Committer:" -msgstr "コミット者:" +#: lib/merge.tcl:174 lib/remote_branch_delete.tcl:43 lib/branch_delete.tcl:34 +#: lib/checkout_op.tcl:579 lib/branch_rename.tcl:32 lib/tools_dlg.tcl:41 +#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/option.tcl:127 +#: lib/transport.tcl:141 lib/choose_font.tcl:45 lib/branch_checkout.tcl:30 +#: lib/browser.tcl:292 lib/remote_add.tcl:34 lib/branch_create.tcl:37 +msgid "Cancel" +msgstr "中止" -#: lib/blame.tcl:972 -msgid "Original File:" -msgstr "元ファイル" +#: lib/merge.tcl:179 +msgid "Revision To Merge" +msgstr "マージするリビジョン" -#: lib/blame.tcl:1020 -msgid "Cannot find HEAD commit:" -msgstr "HEAD コミットが見つかりません" +#: lib/merge.tcl:214 +msgid "" +"Cannot abort while amending.\n" +"\n" +"You must finish amending this commit.\n" +msgstr "" +"訂正中には中止できません。\n" +"\n" +"まず今のコミット訂正を完了させて下さい。\n" -#: lib/blame.tcl:1075 -msgid "Cannot find parent commit:" -msgstr "親コミットが見つかりません:" +#: lib/merge.tcl:224 +msgid "" +"Abort merge?\n" +"\n" +"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with aborting the current merge?" +msgstr "" +"マージを中断しますか?\n" +"\n" +"現在のマージを中断すると、コミットしていない全ての変更が失われます。\n" +"\n" +"マージを中断してよろしいですか?" -#: lib/blame.tcl:1090 -msgid "Unable to display parent" -msgstr "親を表示できません" +#: lib/merge.tcl:230 +msgid "" +"Reset changes?\n" +"\n" +"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" +"\n" +"Continue with resetting the current changes?" +msgstr "" +"変更点をリセットしますか?\n" +"\n" +"変更点をリセットすると、コミットしていない全ての変更が失われます。\n" +"\n" +"リセットしてよろしいですか?" -#: lib/blame.tcl:1091 lib/diff.tcl:320 -msgid "Error loading diff:" -msgstr "diff を読む際のエラーです:" +#: lib/merge.tcl:241 +msgid "Aborting" +msgstr "中断しています" -#: lib/blame.tcl:1231 -msgid "Originally By:" -msgstr "原作者:" +#: lib/merge.tcl:241 +msgid "files reset" +msgstr "リセットしたファイル" -#: lib/blame.tcl:1237 -msgid "In File:" -msgstr "ファイル:" +#: lib/merge.tcl:269 +msgid "Abort failed." +msgstr "中断に失敗しました。" -#: lib/blame.tcl:1242 -msgid "Copied Or Moved Here By:" -msgstr "複写・移動者:" +#: lib/merge.tcl:271 +msgid "Abort completed. Ready." +msgstr "中断完了。" -#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 -msgid "Checkout Branch" -msgstr "ブランチをチェックアウト" +#: lib/error.tcl:20 lib/error.tcl:116 +msgid "error" +msgstr "エラー" -#: lib/branch_checkout.tcl:23 -msgid "Checkout" -msgstr "チェックアウト" +#: lib/error.tcl:36 +msgid "warning" +msgstr "警告" -#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 -#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282 -#: lib/checkout_op.tcl:579 lib/choose_font.tcl:43 lib/merge.tcl:172 -#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42 -#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352 -#: lib/transport.tcl:108 -msgid "Cancel" -msgstr "中止" +#: lib/error.tcl:96 +msgid "You must correct the above errors before committing." +msgstr "コミットする前に、以上のエラーを修正して下さい" -#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328 -msgid "Revision" -msgstr "リビジョン" +#: lib/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Git から出た無効な日付: %s" -#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280 -msgid "Options" -msgstr "オプション" +#: lib/encoding.tcl:443 +msgid "Default" +msgstr "デフォールト" -#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 -msgid "Fetch Tracking Branch" -msgstr "トラッキング・ブランチをフェッチ" +#: lib/encoding.tcl:448 +#, tcl-format +msgid "System (%s)" +msgstr "システム (%s)" -#: lib/branch_checkout.tcl:44 -msgid "Detach From Local Branch" -msgstr "ローカル・ブランチから削除" +#: lib/encoding.tcl:459 lib/encoding.tcl:465 +msgid "Other" +msgstr "その他" -#: lib/branch_create.tcl:22 -msgid "Create Branch" -msgstr "ブランチを作成" +#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 +msgid "Delete Branch Remotely" +msgstr "リモートブランチ削除" -#: lib/branch_create.tcl:27 -msgid "Create New Branch" -msgstr "ブランチを新規作成" +#: lib/remote_branch_delete.tcl:48 +msgid "From Repository" +msgstr "元のリポジトリ" -#: lib/branch_create.tcl:31 lib/choose_repository.tcl:381 -msgid "Create" -msgstr "作成" +#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:165 +msgid "Remote:" +msgstr "リモート:" -#: lib/branch_create.tcl:40 -msgid "Branch Name" -msgstr "ブランチ名" +#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:187 +msgid "Arbitrary Location:" +msgstr "任意の位置:" -#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50 -msgid "Name:" -msgstr "名前:" +#: lib/remote_branch_delete.tcl:88 +msgid "Branches" +msgstr "ブランチ" -#: lib/branch_create.tcl:58 -msgid "Match Tracking Branch Name" -msgstr "トラッキング・ブランチ名を合わせる" +#: lib/remote_branch_delete.tcl:110 +msgid "Delete Only If" +msgstr "条件付で削除" -#: lib/branch_create.tcl:66 -msgid "Starting Revision" -msgstr "初期リビジョン" +#: lib/remote_branch_delete.tcl:112 +msgid "Merged Into:" +msgstr "マージ先:" -#: lib/branch_create.tcl:72 -msgid "Update Existing Branch:" -msgstr "既存のブランチを更新:" +#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53 +msgid "Always (Do not perform merge checks)" +msgstr "無条件(マージ検査をしない)" -#: lib/branch_create.tcl:75 -msgid "No" -msgstr "いいえ" +#: lib/remote_branch_delete.tcl:153 +msgid "A branch is required for 'Merged Into'." +msgstr "'マージ先' にはブランチが必要です。" -#: lib/branch_create.tcl:80 -msgid "Fast Forward Only" -msgstr "早送りのみ" +#: lib/remote_branch_delete.tcl:185 +#, tcl-format +msgid "" +"The following branches are not completely merged into %s:\n" +"\n" +" - %s" +msgstr "" +"以下のブランチは %s に完全にマージされていません:\n" +"\n" +" - %s" -#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571 -msgid "Reset" -msgstr "リセット" +#: lib/remote_branch_delete.tcl:190 +#, tcl-format +msgid "" +"One or more of the merge tests failed because you have not fetched the " +"necessary commits. Try fetching from %s first." +msgstr "" +"必要なコミットが不足しているために、マージ検査が失敗しました。まず %s から" +"フェッチして下さい。" -#: lib/branch_create.tcl:97 -msgid "Checkout After Creation" -msgstr "作成してすぐチェックアウト" +#: lib/remote_branch_delete.tcl:208 +msgid "Please select one or more branches to delete." +msgstr "削除するブランチを選択して下さい。" -#: lib/branch_create.tcl:131 -msgid "Please select a tracking branch." -msgstr "トラッキング・ブランチを選択して下さい。" +#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115 +msgid "" +"Recovering deleted branches is difficult.\n" +"\n" +"Delete the selected branches?" +msgstr "" +"削除したブランチを回復するのは困難です。\n" +"\n" +"選択したブランチを削除して良いですか?" -#: lib/branch_create.tcl:140 +#: lib/remote_branch_delete.tcl:227 #, tcl-format -msgid "Tracking branch %s is not a branch in the remote repository." -msgstr "トラッキング・ブランチ %s は遠隔リポジトリのブランチではありません。" +msgid "Deleting branches from %s" +msgstr "%s からブランチを削除しています。" -#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 -msgid "Please supply a branch name." -msgstr "ブランチ名を指定して下さい。" +#: lib/remote_branch_delete.tcl:300 +msgid "No repository selected." +msgstr "リポジトリが選択されていません。" -#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 +#: lib/remote_branch_delete.tcl:305 #, tcl-format -msgid "'%s' is not an acceptable branch name." -msgstr "'%s' はブランチ名に使えません。" +msgid "Scanning %s..." +msgstr "%s をスキャンしています…" -#: lib/branch_delete.tcl:15 +#: lib/branch_delete.tcl:16 msgid "Delete Branch" msgstr "ブランチ削除" -#: lib/branch_delete.tcl:20 +#: lib/branch_delete.tcl:21 msgid "Delete Local Branch" msgstr "ローカル・ブランチを削除" -#: lib/branch_delete.tcl:37 +#: lib/branch_delete.tcl:39 msgid "Local Branches" msgstr "ローカル・ブランチ" -#: lib/branch_delete.tcl:52 +#: lib/branch_delete.tcl:51 msgid "Delete Only If Merged Into" msgstr "マージ済みの時のみ削除" -#: lib/branch_delete.tcl:54 lib/remote_branch_delete.tcl:119 -msgid "Always (Do not perform merge checks)" -msgstr "無条件(マージ検査をしない)" - #: lib/branch_delete.tcl:103 #, tcl-format msgid "The following branches are not completely merged into %s:" msgstr "以下のブランチは %s に完全にマージされていません:" -#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:217 -msgid "" -"Recovering deleted branches is difficult.\n" -"\n" -"Delete the selected branches?" -msgstr "" -"削除したブランチを回復するのは困難です。\n" -"\n" -"選択したブランチを削除して良いですか?" - #: lib/branch_delete.tcl:141 #, tcl-format msgid "" @@ -820,62 +895,63 @@ msgstr "" "以下のブランチを削除できません:\n" "%s" -#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 -msgid "Rename Branch" -msgstr "ブランチの名前変更" +#: lib/choose_rev.tcl:52 +msgid "This Detached Checkout" +msgstr "分離されたチェックアウト" -#: lib/branch_rename.tcl:26 -msgid "Rename" -msgstr "名前変更" +#: lib/choose_rev.tcl:60 +msgid "Revision Expression:" +msgstr "リビジョン式:" -#: lib/branch_rename.tcl:36 -msgid "Branch:" -msgstr "ブランチ:" +#: lib/choose_rev.tcl:72 +msgid "Local Branch" +msgstr "ローカル・ブランチ" -#: lib/branch_rename.tcl:39 -msgid "New Name:" -msgstr "新しい名前:" +#: lib/choose_rev.tcl:77 +msgid "Tracking Branch" +msgstr "トラッキング・ブランチ" -#: lib/branch_rename.tcl:75 -msgid "Please select a branch to rename." -msgstr "名前を変更するブランチを選んで下さい。" +#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 +msgid "Tag" +msgstr "タグ" -#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:202 +#: lib/choose_rev.tcl:321 #, tcl-format -msgid "Branch '%s' already exists." -msgstr "'%s'というブランチは既に存在します。" +msgid "Invalid revision: %s" +msgstr "無効なリビジョン: %s" -#: lib/branch_rename.tcl:117 -#, tcl-format -msgid "Failed to rename '%s'." -msgstr "'%s'の名前変更に失敗しました。" +#: lib/choose_rev.tcl:342 +msgid "No revision selected." +msgstr "リビジョンが未選択です。" -#: lib/browser.tcl:17 -msgid "Starting..." -msgstr "起動中…" +#: lib/choose_rev.tcl:350 +msgid "Revision expression is empty." +msgstr "リビジョン式が空です。" -#: lib/browser.tcl:26 -msgid "File Browser" -msgstr "ファイル・ブラウザ" +#: lib/choose_rev.tcl:537 +msgid "Updated" +msgstr "更新しました" -#: lib/browser.tcl:126 lib/browser.tcl:143 -#, tcl-format -msgid "Loading %s..." -msgstr "%s をロード中…" +#: lib/choose_rev.tcl:565 +msgid "URL" +msgstr "URL" -#: lib/browser.tcl:187 -msgid "[Up To Parent]" -msgstr "[上位フォルダへ]" +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "実行中…お待ち下さい…" -#: lib/browser.tcl:267 lib/browser.tcl:273 -msgid "Browse Branch Files" -msgstr "現在のブランチのファイルを見る" +#: lib/console.tcl:81 lib/checkout_op.tcl:146 lib/database.tcl:30 +#: lib/sshkey.tcl:55 +msgid "Close" +msgstr "閉じる" -#: lib/browser.tcl:278 lib/choose_repository.tcl:398 -#: lib/choose_repository.tcl:486 lib/choose_repository.tcl:497 -#: lib/choose_repository.tcl:1028 -msgid "Browse" -msgstr "ブラウズ" +#: lib/console.tcl:186 +msgid "Success" +msgstr "成功" + +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "エラー: コマンドが失敗しました" #: lib/checkout_op.tcl:85 #, tcl-format @@ -887,11 +963,6 @@ msgstr "%s から %s をフェッチしています" msgid "fatal: Cannot resolve %s" msgstr "致命的エラー: %s を解決できません" -#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:31 -#: lib/sshkey.tcl:53 -msgid "Close" -msgstr "閉じる" - #: lib/checkout_op.tcl:175 #, tcl-format msgid "Branch '%s' does not exist." @@ -902,6 +973,11 @@ msgstr "ブランチ'%s'は存在しません。" msgid "Failed to configure simplified git-pull for '%s'." msgstr "'%s' に簡易 git-pull を設定できませんでした" +#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102 +#, tcl-format +msgid "Branch '%s' already exists." +msgstr "'%s'というブランチは既に存在します。" + #: lib/checkout_op.tcl:229 #, tcl-format msgid "" @@ -999,9 +1075,9 @@ msgstr "失なわれたコミットを回復するのは簡単ではありませ msgid "Reset '%s'?" msgstr "'%s' をリセットしますか?" -#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:343 -msgid "Visualize" -msgstr "可視化" +#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85 +msgid "Reset" +msgstr "リセット" #: lib/checkout_op.tcl:635 #, tcl-format @@ -1019,509 +1095,838 @@ msgstr "" "ましたが、 Git の内部データを更新できませんでした。\n" "起こるはずのないエラーです。あきらめて %s を終了します。" -#: lib/choose_font.tcl:39 -msgid "Select" -msgstr "選択" +#: lib/blame.tcl:73 +msgid "File Viewer" +msgstr "ファイルピューワ" -#: lib/choose_font.tcl:53 -msgid "Font Family" -msgstr "フォント・ファミリー" +#: lib/blame.tcl:79 +msgid "Commit:" +msgstr "コミット:" -#: lib/choose_font.tcl:74 -msgid "Font Size" -msgstr "フォントの大きさ" +#: lib/blame.tcl:280 +msgid "Copy Commit" +msgstr "コミットをコピー" -#: lib/choose_font.tcl:91 -msgid "Font Example" -msgstr "フォント・サンプル" +#: lib/blame.tcl:284 +msgid "Find Text..." +msgstr "テキストを検索" -#: lib/choose_font.tcl:103 -msgid "" -"This is example text.\n" -"If you like this text, it can be your font." -msgstr "" -"これはサンプル文です。\n" -"このフォントが気に入ればお使いになれます。" +#: lib/blame.tcl:288 +msgid "Goto Line..." +msgstr "指定行に移動…" + +#: lib/blame.tcl:297 +msgid "Do Full Copy Detection" +msgstr "コピー検知" + +#: lib/blame.tcl:301 +msgid "Show History Context" +msgstr "文脈を見せる" + +#: lib/blame.tcl:304 +msgid "Blame Parent Commit" +msgstr "親コミットを注釈" + +#: lib/blame.tcl:466 +#, tcl-format +msgid "Reading %s..." +msgstr "%s を読んでいます…" + +#: lib/blame.tcl:594 +msgid "Loading copy/move tracking annotations..." +msgstr "コピー・移動追跡データを読んでいます…" + +#: lib/blame.tcl:614 +msgid "lines annotated" +msgstr "行を注釈しました" + +#: lib/blame.tcl:806 +msgid "Loading original location annotations..." +msgstr "元位置行の注釈データを読んでいます…" + +#: lib/blame.tcl:809 +msgid "Annotation complete." +msgstr "注釈完了しました" + +#: lib/blame.tcl:839 +msgid "Busy" +msgstr "実行中" + +#: lib/blame.tcl:840 +msgid "Annotation process is already running." +msgstr "すでに blame プロセスを実行中です。" + +#: lib/blame.tcl:879 +msgid "Running thorough copy detection..." +msgstr "コピー検知を実行中…" + +#: lib/blame.tcl:947 +msgid "Loading annotation..." +msgstr "注釈を読み込んでいます…" -#: lib/choose_repository.tcl:28 +#: lib/blame.tcl:1000 +msgid "Author:" +msgstr "作者:" + +#: lib/blame.tcl:1004 +msgid "Committer:" +msgstr "コミット者:" + +#: lib/blame.tcl:1009 +msgid "Original File:" +msgstr "元ファイル" + +#: lib/blame.tcl:1057 +msgid "Cannot find HEAD commit:" +msgstr "HEAD コミットが見つかりません" + +#: lib/blame.tcl:1112 +msgid "Cannot find parent commit:" +msgstr "親コミットが見つかりません:" + +#: lib/blame.tcl:1127 +msgid "Unable to display parent" +msgstr "親を表示できません" + +#: lib/blame.tcl:1128 lib/diff.tcl:356 +msgid "Error loading diff:" +msgstr "diff を読む際のエラーです:" + +#: lib/blame.tcl:1269 +msgid "Originally By:" +msgstr "原作者:" + +#: lib/blame.tcl:1275 +msgid "In File:" +msgstr "ファイル:" + +#: lib/blame.tcl:1280 +msgid "Copied Or Moved Here By:" +msgstr "複写・移動者:" + +#: lib/about.tcl:26 +msgid "git-gui - a graphical user interface for Git." +msgstr "Git のグラフィカルUI git-gui" + +#: lib/choose_repository.tcl:33 msgid "Git Gui" msgstr "Git GUI" -#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:386 +#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412 msgid "Create New Repository" msgstr "新しいリポジトリを作る" -#: lib/choose_repository.tcl:93 +#: lib/choose_repository.tcl:98 msgid "New..." msgstr "新規…" -#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:471 +#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496 msgid "Clone Existing Repository" msgstr "既存リポジトリを複製する" -#: lib/choose_repository.tcl:106 +#: lib/choose_repository.tcl:116 msgid "Clone..." msgstr "複製…" -#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:1016 +#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064 msgid "Open Existing Repository" msgstr "既存リポジトリを開く" -#: lib/choose_repository.tcl:119 +#: lib/choose_repository.tcl:129 msgid "Open..." msgstr "開く…" -#: lib/choose_repository.tcl:132 +#: lib/choose_repository.tcl:142 msgid "Recent Repositories" msgstr "最近使ったリポジトリ" -#: lib/choose_repository.tcl:138 +#: lib/choose_repository.tcl:148 msgid "Open Recent Repository:" msgstr "最近使ったリポジトリを開く" -#: lib/choose_repository.tcl:306 lib/choose_repository.tcl:313 -#: lib/choose_repository.tcl:320 +#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323 +#: lib/choose_repository.tcl:330 #, tcl-format msgid "Failed to create repository %s:" msgstr "リポジトリ %s を作製できません:" -#: lib/choose_repository.tcl:391 +#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33 +msgid "Create" +msgstr "作成" + +#: lib/choose_repository.tcl:417 msgid "Directory:" msgstr "ディレクトリ:" -#: lib/choose_repository.tcl:423 lib/choose_repository.tcl:550 -#: lib/choose_repository.tcl:1052 +#: lib/choose_repository.tcl:422 lib/choose_repository.tcl:509 +#: lib/choose_repository.tcl:518 lib/choose_repository.tcl:1074 +#: lib/browser.tcl:288 +msgid "Browse" +msgstr "ブラウズ" + +#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573 +#: lib/choose_repository.tcl:1098 msgid "Git Repository" msgstr "GIT リポジトリ" -#: lib/choose_repository.tcl:448 +#: lib/choose_repository.tcl:472 #, tcl-format msgid "Directory %s already exists." msgstr "ディレクトリ '%s' は既に存在します。" -#: lib/choose_repository.tcl:452 +#: lib/choose_repository.tcl:476 #, tcl-format msgid "File %s already exists." msgstr "ファイル '%s' は既に存在します。" -#: lib/choose_repository.tcl:466 +#: lib/choose_repository.tcl:491 msgid "Clone" msgstr "複製" -#: lib/choose_repository.tcl:479 +#: lib/choose_repository.tcl:504 msgid "Source Location:" msgstr "ソースの位置" -#: lib/choose_repository.tcl:490 +#: lib/choose_repository.tcl:513 msgid "Target Directory:" msgstr "先ディレクトリ:" -#: lib/choose_repository.tcl:502 +#: lib/choose_repository.tcl:523 msgid "Clone Type:" msgstr "複製方式:" -#: lib/choose_repository.tcl:508 +#: lib/choose_repository.tcl:528 msgid "Standard (Fast, Semi-Redundant, Hardlinks)" msgstr "標準(高速・中冗長度・ハードリンク)" -#: lib/choose_repository.tcl:514 +#: lib/choose_repository.tcl:533 msgid "Full Copy (Slower, Redundant Backup)" msgstr "全複写(低速・冗長バックアップ)" -#: lib/choose_repository.tcl:520 +#: lib/choose_repository.tcl:538 msgid "Shared (Fastest, Not Recommended, No Backup)" msgstr "共有(最高速・非推奨・バックアップ無し)" -#: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603 -#: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819 -#: lib/choose_repository.tcl:1058 lib/choose_repository.tcl:1066 +#: lib/choose_repository.tcl:545 +msgid "Recursively clone submodules too" +msgstr "サブモジュールも再帰的に複製する" + +#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626 +#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842 +#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112 #, tcl-format msgid "Not a Git repository: %s" msgstr "Git リポジトリではありません: %s" -#: lib/choose_repository.tcl:592 +#: lib/choose_repository.tcl:615 msgid "Standard only available for local repository." msgstr "標準方式は同一計算機上のリポジトリにのみ使えます。" -#: lib/choose_repository.tcl:596 +#: lib/choose_repository.tcl:619 msgid "Shared only available for local repository." msgstr "共有方式は同一計算機上のリポジトリにのみ使えます。" -#: lib/choose_repository.tcl:617 +#: lib/choose_repository.tcl:640 #, tcl-format msgid "Location %s already exists." msgstr "'%s' は既に存在します。" -#: lib/choose_repository.tcl:628 +#: lib/choose_repository.tcl:651 msgid "Failed to configure origin" msgstr "origin を設定できませんでした" -#: lib/choose_repository.tcl:640 +#: lib/choose_repository.tcl:663 msgid "Counting objects" msgstr "オブジェクトを数えています" -#: lib/choose_repository.tcl:641 +#: lib/choose_repository.tcl:664 msgid "buckets" msgstr "バケツ" -#: lib/choose_repository.tcl:665 +#: lib/choose_repository.tcl:688 #, tcl-format msgid "Unable to copy objects/info/alternates: %s" msgstr "objects/info/alternates を複写できません: %s" -#: lib/choose_repository.tcl:701 +#: lib/choose_repository.tcl:724 #, tcl-format msgid "Nothing to clone from %s." msgstr "%s から複製する内容はありません" -#: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917 -#: lib/choose_repository.tcl:929 +#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940 +#: lib/choose_repository.tcl:952 msgid "The 'master' branch has not been initialized." msgstr "'master' ブランチが初期化されていません" -#: lib/choose_repository.tcl:716 +#: lib/choose_repository.tcl:739 msgid "Hardlinks are unavailable. Falling back to copying." msgstr "ハードリンクが作れないので、コピーします" -#: lib/choose_repository.tcl:728 +#: lib/choose_repository.tcl:751 #, tcl-format msgid "Cloning from %s" msgstr "%s から複製しています" -#: lib/choose_repository.tcl:759 +#: lib/choose_repository.tcl:782 msgid "Copying objects" msgstr "オブジェクトを複写しています" -#: lib/choose_repository.tcl:760 +#: lib/choose_repository.tcl:783 msgid "KiB" msgstr "KiB" -#: lib/choose_repository.tcl:784 +#: lib/choose_repository.tcl:807 #, tcl-format msgid "Unable to copy object: %s" msgstr "オブジェクトを複写できません: %s" -#: lib/choose_repository.tcl:794 +#: lib/choose_repository.tcl:817 msgid "Linking objects" msgstr "オブジェクトを連結しています" -#: lib/choose_repository.tcl:795 +#: lib/choose_repository.tcl:818 msgid "objects" msgstr "オブジェクト" -#: lib/choose_repository.tcl:803 +#: lib/choose_repository.tcl:826 #, tcl-format msgid "Unable to hardlink object: %s" msgstr "オブジェクトをハードリンクできません: %s" -#: lib/choose_repository.tcl:858 +#: lib/choose_repository.tcl:881 msgid "Cannot fetch branches and objects. See console output for details." msgstr "ブランチやオブジェクトを取得できません。コンソール出力を見て下さい" -#: lib/choose_repository.tcl:869 +#: lib/choose_repository.tcl:892 msgid "Cannot fetch tags. See console output for details." msgstr "タグを取得できません。コンソール出力を見て下さい" -#: lib/choose_repository.tcl:893 +#: lib/choose_repository.tcl:916 msgid "Cannot determine HEAD. See console output for details." msgstr "HEAD を確定できません。コンソール出力を見て下さい" -#: lib/choose_repository.tcl:902 +#: lib/choose_repository.tcl:925 #, tcl-format msgid "Unable to cleanup %s" msgstr "%s を掃除できません" -#: lib/choose_repository.tcl:908 +#: lib/choose_repository.tcl:931 msgid "Clone failed." msgstr "複写に失敗しました。" -#: lib/choose_repository.tcl:915 +#: lib/choose_repository.tcl:938 msgid "No default branch obtained." msgstr "デフォールト・ブランチが取得されませんでした" -#: lib/choose_repository.tcl:926 +#: lib/choose_repository.tcl:949 #, tcl-format msgid "Cannot resolve %s as a commit." msgstr "%s をコミットとして解釈できません" -#: lib/choose_repository.tcl:938 +#: lib/choose_repository.tcl:961 msgid "Creating working directory" msgstr "作業ディレクトリを作成しています" -#: lib/choose_repository.tcl:939 lib/index.tcl:67 lib/index.tcl:130 -#: lib/index.tcl:198 +#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136 +#: lib/index.tcl:207 msgid "files" msgstr "ファイル" -#: lib/choose_repository.tcl:968 +#: lib/choose_repository.tcl:981 +msgid "Cannot clone submodules." +msgstr "サブモジュールが複製できません。" + +#: lib/choose_repository.tcl:990 +msgid "Cloning submodules" +msgstr "サブモジュールを複製しています" + +#: lib/choose_repository.tcl:1015 msgid "Initial file checkout failed." msgstr "初期チェックアウトに失敗しました" -#: lib/choose_repository.tcl:1011 +#: lib/choose_repository.tcl:1059 msgid "Open" msgstr "開く" -#: lib/choose_repository.tcl:1021 +#: lib/choose_repository.tcl:1069 msgid "Repository:" msgstr "リポジトリ:" -#: lib/choose_repository.tcl:1072 +#: lib/choose_repository.tcl:1118 #, tcl-format msgid "Failed to open repository %s:" msgstr "リポジトリ %s を開けません:" -#: lib/choose_rev.tcl:53 -msgid "This Detached Checkout" -msgstr "分離されたチェックアウト" +#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23 +msgid "Rename Branch" +msgstr "ブランチの名前変更" -#: lib/choose_rev.tcl:60 -msgid "Revision Expression:" -msgstr "リビジョン式:" +#: lib/branch_rename.tcl:28 +msgid "Rename" +msgstr "名前変更" -#: lib/choose_rev.tcl:74 -msgid "Local Branch" -msgstr "ローカル・ブランチ" +#: lib/branch_rename.tcl:38 +msgid "Branch:" +msgstr "ブランチ:" -#: lib/choose_rev.tcl:79 -msgid "Tracking Branch" -msgstr "トラッキング・ブランチ" +#: lib/branch_rename.tcl:46 +msgid "New Name:" +msgstr "新しい名前:" -#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538 -msgid "Tag" -msgstr "タグ" +#: lib/branch_rename.tcl:81 +msgid "Please select a branch to rename." +msgstr "名前を変更するブランチを選んで下さい。" + +#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154 +msgid "Please supply a branch name." +msgstr "ブランチ名を指定して下さい。" -#: lib/choose_rev.tcl:317 +#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165 #, tcl-format -msgid "Invalid revision: %s" -msgstr "無効なリビジョン: %s" +msgid "'%s' is not an acceptable branch name." +msgstr "'%s' はブランチ名に使えません。" -#: lib/choose_rev.tcl:338 -msgid "No revision selected." -msgstr "リビジョンが未選択です。" +#: lib/branch_rename.tcl:123 +#, tcl-format +msgid "Failed to rename '%s'." +msgstr "'%s'の名前変更に失敗しました。" -#: lib/choose_rev.tcl:346 -msgid "Revision expression is empty." -msgstr "リビジョン式が空です。" +#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 +msgid "Cannot write shortcut:" +msgstr "ショートカットが書けません:" -#: lib/choose_rev.tcl:531 -msgid "Updated" -msgstr "更新しました" +#: lib/shortcut.tcl:137 +msgid "Cannot write icon:" +msgstr "アイコンが書けません:" -#: lib/choose_rev.tcl:559 -msgid "URL" -msgstr "URL" +#: lib/search.tcl:48 +msgid "Find:" +msgstr "検索:" -#: lib/commit.tcl:9 -msgid "" -"There is nothing to amend.\n" -"\n" -"You are about to create the initial commit. There is no commit before this " -"to amend.\n" -msgstr "" -"訂正するコミットがそもそもありません。\n" -"\n" -"これから作るのは最初のコミットです。その前にはまだ訂正するようなコミットはあ" -"りません。\n" +#: lib/search.tcl:50 +msgid "Next" +msgstr "次" -#: lib/commit.tcl:18 +#: lib/search.tcl:51 +msgid "Prev" +msgstr "前" + +#: lib/search.tcl:52 +msgid "RegExp" +msgstr "正規表現" + +#: lib/search.tcl:54 +msgid "Case" +msgstr "大文字小文字を区別" + +#: lib/status_bar.tcl:87 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%1$s ... %4$*i %6$s 中の %2$*i (%7$3i%%)" + +#: lib/tools_dlg.tcl:22 +msgid "Add Tool" +msgstr "ツールの追加" + +#: lib/tools_dlg.tcl:28 +msgid "Add New Tool Command" +msgstr "新規ツールコマンドの追加" + +#: lib/tools_dlg.tcl:34 +msgid "Add globally" +msgstr "全体に追加" + +#: lib/tools_dlg.tcl:37 lib/remote_add.tcl:30 +msgid "Add" +msgstr "追加" + +#: lib/tools_dlg.tcl:46 +msgid "Tool Details" +msgstr "ツールの詳細" + +#: lib/tools_dlg.tcl:49 +msgid "Use '/' separators to create a submenu tree:" +msgstr "'/' でサブメニューを区切ります:" + +#: lib/tools_dlg.tcl:51 lib/remote_add.tcl:41 lib/branch_create.tcl:44 +msgid "Name:" +msgstr "名前:" + +#: lib/tools_dlg.tcl:60 +msgid "Command:" +msgstr "コマンド:" + +#: lib/tools_dlg.tcl:71 +msgid "Show a dialog before running" +msgstr "起動する前にダイアログを表示" + +#: lib/tools_dlg.tcl:77 +msgid "Ask the user to select a revision (sets $REVISION)" +msgstr "ユーザにコミットを一つ選ばせる ($REVISION にセットします)" + +#: lib/tools_dlg.tcl:82 +msgid "Ask the user for additional arguments (sets $ARGS)" +msgstr "ユーザに他の引数を追加させる ($ARGS にセットします)" + +#: lib/tools_dlg.tcl:89 +msgid "Don't show the command output window" +msgstr "コマンドからの出力ウィンドウを見せない" + +#: lib/tools_dlg.tcl:94 +msgid "Run only if a diff is selected ($FILENAME not empty)" +msgstr "パッチが選ばれているときだけ動かす($FILENAME が空でない)" + +#: lib/tools_dlg.tcl:118 +msgid "Please supply a name for the tool." +msgstr "ツール名を指定して下さい。" + +#: lib/tools_dlg.tcl:126 +#, tcl-format +msgid "Tool '%s' already exists." +msgstr "ツール '%s' は既に存在します。" + +#: lib/tools_dlg.tcl:148 +#, tcl-format msgid "" -"Cannot amend while merging.\n" -"\n" -"You are currently in the middle of a merge that has not been fully " -"completed. You cannot amend the prior commit unless you first abort the " -"current merge activity.\n" +"Could not add tool:\n" +"%s" msgstr "" -"マージ中にコミットの訂正はできません。\n" -"\n" -"現在はまだマージの途中です。先にこのマージを中止しないと、前のコミットの訂正" -"はできません\n" +"ツールを追加できません:\n" +"%s" -#: lib/commit.tcl:48 -msgid "Error loading commit data for amend:" -msgstr "訂正するコミットのデータを読めません:" +#: lib/tools_dlg.tcl:187 +msgid "Remove Tool" +msgstr "ツールの削除" -#: lib/commit.tcl:75 -msgid "Unable to obtain your identity:" -msgstr "ユーザの正体を確認できません:" +#: lib/tools_dlg.tcl:193 +msgid "Remove Tool Commands" +msgstr "ツールコマンドの削除" -#: lib/commit.tcl:80 -msgid "Invalid GIT_COMMITTER_IDENT:" -msgstr "GIT_COMMITTER_IDENT が無効です:" +#: lib/tools_dlg.tcl:198 +msgid "Remove" +msgstr "削除" -#: lib/commit.tcl:129 +#: lib/tools_dlg.tcl:231 +msgid "(Blue denotes repository-local tools)" +msgstr "(青色はローカルレポジトリのツールです)" + +#: lib/tools_dlg.tcl:292 #, tcl-format -msgid "warning: Tcl does not support encoding '%s'." -msgstr "警告: Tcl はエンコーディング '%s' をサポートしていません" +msgid "Run Command: %s" +msgstr "コマンドを起動: %s" -#: lib/commit.tcl:149 +#: lib/tools_dlg.tcl:306 +msgid "Arguments" +msgstr "引数" + +#: lib/tools_dlg.tcl:321 lib/branch_checkout.tcl:35 lib/browser.tcl:297 +msgid "Revision" +msgstr "リビジョン" + +#: lib/tools_dlg.tcl:341 +msgid "OK" +msgstr "OK" + +#: lib/tools.tcl:75 +#, tcl-format +msgid "Running %s requires a selected file." +msgstr "ファイルを選択してから %s を起動してください。" + +#: lib/tools.tcl:91 +#, tcl-format +msgid "Are you sure you want to run %1$s on file \"%2$s\"?" +msgstr "本当にファイル \"%2$s\"で %1$s を起動しますか?" + +#: lib/tools.tcl:95 +#, tcl-format +msgid "Are you sure you want to run %s?" +msgstr "本当に %s を起動しますか?" + +#: lib/tools.tcl:116 +#, tcl-format +msgid "Tool: %s" +msgstr "ツール: %s" + +#: lib/tools.tcl:117 +#, tcl-format +msgid "Running: %s" +msgstr "実行中: %s" + +#: lib/tools.tcl:155 +#, tcl-format +msgid "Tool completed successfully: %s" +msgstr "ツールが完了しました: %s" + +#: lib/tools.tcl:157 +#, tcl-format +msgid "Tool failed: %s" +msgstr "ツールが失敗しました: %s" + +#: lib/mergetool.tcl:8 +msgid "Force resolution to the base version?" +msgstr "共通の版を使いますか?" + +#: lib/mergetool.tcl:9 +msgid "Force resolution to this branch?" +msgstr "自分の側の版を使いますか?" + +#: lib/mergetool.tcl:10 +msgid "Force resolution to the other branch?" +msgstr "相手制の版を使いますか?" + +#: lib/mergetool.tcl:14 +#, tcl-format msgid "" -"Last scanned state does not match repository state.\n" +"Note that the diff shows only conflicting changes.\n" "\n" -"Another Git program has modified this repository since the last scan. A " -"rescan must be performed before another commit can be created.\n" +"%s will be overwritten.\n" "\n" -"The rescan will be automatically started now.\n" +"This operation can be undone only by restarting the merge." msgstr "" -"最後にスキャンした状態はリポジトリの状態と合致しません。\n" +"競合する変更点だけが表示されていることに注意してください。\n" "\n" -"最後にスキャンして以後、別の Git プログラムがリポジトリを変更しています。新し" -"くコミットする前に、再スキャンが必要です。\n" +"%s は上書きされます。\n" "\n" -"自動的に再スキャンを開始します。\n" +"やり直すにはマージ全体をやり直してください。" -#: lib/commit.tcl:172 +#: lib/mergetool.tcl:45 #, tcl-format -msgid "" -"Unmerged files cannot be committed.\n" -"\n" -"File %s has merge conflicts. You must resolve them and stage the file " -"before committing.\n" +msgid "File %s seems to have unresolved conflicts, still stage?" msgstr "" -"マージしていないファイルはコミットできません。\n" -"\n" -"ファイル %s にはマージ衝突が残っています。まず解決してコミット予定に加える必" -"要があります。\n" +"ファイル %s には解決していない競合部分がまだあるようですが、いいですか?" + +#: lib/mergetool.tcl:60 +#, tcl-format +msgid "Adding resolution for %s" +msgstr "%s への解決をステージします" + +#: lib/mergetool.tcl:141 +msgid "Cannot resolve deletion or link conflicts using a tool" +msgstr "ツールでは削除やリンク競合は扱えません" -#: lib/commit.tcl:180 +#: lib/mergetool.tcl:146 +msgid "Conflict file does not exist" +msgstr "競合ファイルは存在しません。" + +#: lib/mergetool.tcl:246 #, tcl-format -msgid "" -"Unknown file state %s detected.\n" -"\n" -"File %s cannot be committed by this program.\n" -msgstr "" -"不明なファイル状態 %s です。\n" -"\n" -"ファイル %s は本プログラムではコミットできません。\n" +msgid "Not a GUI merge tool: '%s'" +msgstr "GUI マージツールではありません: %s" -#: lib/commit.tcl:188 +#: lib/mergetool.tcl:275 +#, tcl-format +msgid "Unsupported merge tool '%s'" +msgstr "マージツール '%s' はサポートしていません" + +#: lib/mergetool.tcl:310 +msgid "Merge tool is already running, terminate it?" +msgstr "マージツールはすでに起動しています。終了しますか?" + +#: lib/mergetool.tcl:330 +#, tcl-format msgid "" -"No changes to commit.\n" -"\n" -"You must stage at least 1 file before you can commit.\n" +"Error retrieving versions:\n" +"%s" msgstr "" -"コミットする変更がありません。\n" -"\n" -"最低一つの変更をコミット予定に加えてからコミットして下さい。\n" +"版の取り出し時にエラーが出ました:\n" +"%s" -#: lib/commit.tcl:203 +#: lib/mergetool.tcl:350 +#, tcl-format msgid "" -"Please supply a commit message.\n" -"\n" -"A good commit message has the following format:\n" +"Could not start the merge tool:\n" "\n" -"- First line: Describe in one sentence what you did.\n" -"- Second line: Blank\n" -"- Remaining lines: Describe why this change is good.\n" +"%s" msgstr "" -"コミット・メッセージを入力して下さい。\n" -"\n" -"正しいコミット・メッセージは:\n" +"マージツールが起動できません:\n" "\n" -"- 第1行: 何をしたか、を1行で要約。\n" -"- 第2行: 空白\n" -"- 残りの行: なぜ、この変更が良い変更か、の説明。\n" - -#: lib/commit.tcl:234 -msgid "Calling pre-commit hook..." -msgstr "コミット前フックを実行中・・・" +"%s" -#: lib/commit.tcl:249 -msgid "Commit declined by pre-commit hook." -msgstr "コミット前フックがコミットを拒否しました" +#: lib/mergetool.tcl:354 +msgid "Running merge tool..." +msgstr "マージツールを実行しています..." -#: lib/commit.tcl:272 -msgid "Calling commit-msg hook..." -msgstr "コミット・メッセージ・フックを実行中・・・" +#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 +msgid "Merge tool failed." +msgstr "マージツールが失敗しました。" -#: lib/commit.tcl:287 -msgid "Commit declined by commit-msg hook." -msgstr "コミット・メッセージ・フックがコミットを拒否しました" +#: lib/option.tcl:11 +#, tcl-format +msgid "Invalid global encoding '%s'" +msgstr "全体エンコーディングに 無効な %s が指定されています" -#: lib/commit.tcl:300 -msgid "Committing changes..." -msgstr "変更点をコミット中・・・" +#: lib/option.tcl:19 +#, tcl-format +msgid "Invalid repo encoding '%s'" +msgstr "リポジトリエンコーディングに 無効な %s が指定されています" -#: lib/commit.tcl:316 -msgid "write-tree failed:" -msgstr "write-tree が失敗しました:" +#: lib/option.tcl:119 +msgid "Restore Defaults" +msgstr "既定値に戻す" -#: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382 -msgid "Commit failed." -msgstr "コミットに失敗しました。" +#: lib/option.tcl:123 +msgid "Save" +msgstr "保存" -#: lib/commit.tcl:334 +#: lib/option.tcl:133 #, tcl-format -msgid "Commit %s appears to be corrupt" -msgstr "コミット %s は壊れています" +msgid "%s Repository" +msgstr "%s リポジトリ" -#: lib/commit.tcl:339 -msgid "" -"No changes to commit.\n" -"\n" -"No files were modified by this commit and it was not a merge commit.\n" -"\n" -"A rescan will be automatically started now.\n" -msgstr "" -"コミットする変更がありません。\n" -"\n" -"マージでなく、また、一つも変更点がありません。\n" -"\n" -"自動的に再スキャンを開始します。\n" +#: lib/option.tcl:134 +msgid "Global (All Repositories)" +msgstr "大域(全てのリポジトリ)" -#: lib/commit.tcl:346 -msgid "No changes to commit." -msgstr "コミットする変更がありません。" +#: lib/option.tcl:140 +msgid "User Name" +msgstr "ユーザ名" -#: lib/commit.tcl:360 -msgid "commit-tree failed:" -msgstr "commit-tree が失敗しました:" +#: lib/option.tcl:141 +msgid "Email Address" +msgstr "電子メールアドレス" -#: lib/commit.tcl:381 -msgid "update-ref failed:" -msgstr "update-ref が失敗しました:" +#: lib/option.tcl:143 +msgid "Summarize Merge Commits" +msgstr "マージコミットの要約" + +#: lib/option.tcl:144 +msgid "Merge Verbosity" +msgstr "マージの冗長度" + +#: lib/option.tcl:145 +msgid "Show Diffstat After Merge" +msgstr "マージ後に diffstat を表示" + +#: lib/option.tcl:146 +msgid "Use Merge Tool" +msgstr "マージツールを使用" + +#: lib/option.tcl:148 +msgid "Trust File Modification Timestamps" +msgstr "ファイル変更時刻を信頼する" + +#: lib/option.tcl:149 +msgid "Prune Tracking Branches During Fetch" +msgstr "フェッチ中にトラッキングブランチを刈る" -#: lib/commit.tcl:469 +#: lib/option.tcl:150 +msgid "Match Tracking Branches" +msgstr "トラッキングブランチを合わせる" + +#: lib/option.tcl:151 +msgid "Use Textconv For Diffs and Blames" +msgstr "diff と注釈に textconv を使う" + +#: lib/option.tcl:152 +msgid "Blame Copy Only On Changed Files" +msgstr "変更されたファイルのみコピー検知を行なう" + +#: lib/option.tcl:153 +msgid "Maximum Length of Recent Repositories List" +msgstr "最近使ったリポジトリ一覧の上限" + +#: lib/option.tcl:154 +msgid "Minimum Letters To Blame Copy On" +msgstr "コピーを検知する最少文字数" + +#: lib/option.tcl:155 +msgid "Blame History Context Radius (days)" +msgstr "注釈する履歴半径(日数)" + +#: lib/option.tcl:156 +msgid "Number of Diff Context Lines" +msgstr "diff の文脈行数" + +#: lib/option.tcl:157 +msgid "Additional Diff Parameters" +msgstr "diff の追加引数" + +#: lib/option.tcl:158 +msgid "Commit Message Text Width" +msgstr "コミットメッセージのテキスト幅" + +#: lib/option.tcl:159 +msgid "New Branch Name Template" +msgstr "新しいブランチ名のテンプレート" + +#: lib/option.tcl:160 +msgid "Default File Contents Encoding" +msgstr "ファイル内容のデフォールトエンコーディング" + +#: lib/option.tcl:161 +msgid "Warn before committing to a detached head" +msgstr "分離 HEAD のコミット前に警告する" + +#: lib/option.tcl:162 +msgid "Staging of untracked files" +msgstr "管理外のファイルをコミット予定する" + +#: lib/option.tcl:163 +msgid "Show untracked files" +msgstr "管理外のファイルを表示する" + +#: lib/option.tcl:164 +msgid "Tab spacing" +msgstr "タブ幅" + +#: lib/option.tcl:210 +msgid "Change" +msgstr "変更" + +#: lib/option.tcl:254 +msgid "Spelling Dictionary:" +msgstr "スペルチェック辞書" + +#: lib/option.tcl:284 +msgid "Change Font" +msgstr "フォントを変更" + +#: lib/option.tcl:288 #, tcl-format -msgid "Created commit %s: %s" -msgstr "コミット %s を作成しました: %s" +msgid "Choose %s" +msgstr "%s を選択" -#: lib/console.tcl:59 -msgid "Working... please wait..." -msgstr "実行中…お待ち下さい…" +#: lib/option.tcl:294 +msgid "pt." +msgstr "ポイント" -#: lib/console.tcl:186 -msgid "Success" -msgstr "成功" +#: lib/option.tcl:308 +msgid "Preferences" +msgstr "設定" -#: lib/console.tcl:200 -msgid "Error: Command Failed" -msgstr "エラー: コマンドが失敗しました" +#: lib/option.tcl:310 lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 +msgid "Options" +msgstr "オプション" -#: lib/database.tcl:43 +#: lib/option.tcl:345 +msgid "Failed to completely save options:" +msgstr "完全にオプションを保存できません:" + +#: lib/database.tcl:42 msgid "Number of loose objects" msgstr "ばらばらなオブジェクトの数" -#: lib/database.tcl:44 +#: lib/database.tcl:43 msgid "Disk space used by loose objects" msgstr "ばらばらなオブジェクトの使用するディスク量" -#: lib/database.tcl:45 +#: lib/database.tcl:44 msgid "Number of packed objects" msgstr "パックされたオブジェクトの数" -#: lib/database.tcl:46 +#: lib/database.tcl:45 msgid "Number of packs" msgstr "パックの数" -#: lib/database.tcl:47 +#: lib/database.tcl:46 msgid "Disk space used by packed objects" msgstr "パックされたオブジェクトの使用するディスク量" -#: lib/database.tcl:48 +#: lib/database.tcl:47 msgid "Packed objects waiting for pruning" msgstr "パックに存在するので捨てて良いオブジェクトの数" -#: lib/database.tcl:49 +#: lib/database.tcl:48 msgid "Garbage files" msgstr "ゴミファイル" @@ -1549,12 +1954,132 @@ msgstr "" "\n" "データベースを圧縮しますか?" -#: lib/date.tcl:25 +#: lib/transport.tcl:6 lib/remote_add.tcl:132 #, tcl-format -msgid "Invalid date from Git: %s" -msgstr "Git から出た無効な日付: %s" +msgid "fetch %s" +msgstr "%s を取得" -#: lib/diff.tcl:64 +#: lib/transport.tcl:7 +#, tcl-format +msgid "Fetching new changes from %s" +msgstr "%s から新しい変更をフェッチしています" + +#: lib/transport.tcl:18 +#, tcl-format +msgid "remote prune %s" +msgstr "リモート刈込 %s" + +#: lib/transport.tcl:19 +#, tcl-format +msgid "Pruning tracking branches deleted from %s" +msgstr "%s から削除されたトラッキング・ブランチを刈っています" + +#: lib/transport.tcl:25 +msgid "fetch all remotes" +msgstr "すべてのリモートを取得" + +#: lib/transport.tcl:26 +msgid "Fetching new changes from all remotes" +msgstr "すべてのリモートから新しい変更をフェッチしています" + +#: lib/transport.tcl:40 +msgid "remote prune all remotes" +msgstr "リモート刈込 すべてのリモート" + +#: lib/transport.tcl:41 +msgid "Pruning tracking branches deleted from all remotes" +msgstr "すべてのリモートから削除されたトラッキング・ブランチを刈っています" + +#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110 +#: lib/remote_add.tcl:162 +#, tcl-format +msgid "push %s" +msgstr "%s をプッシュ" + +#: lib/transport.tcl:55 +#, tcl-format +msgid "Pushing changes to %s" +msgstr "%s へ変更をプッシュしています" + +#: lib/transport.tcl:93 +#, tcl-format +msgid "Mirroring to %s" +msgstr "%s へミラーしています" + +#: lib/transport.tcl:111 +#, tcl-format +msgid "Pushing %s %s to %s" +msgstr "%3$s へ %1$s %2$s をプッシュしています" + +#: lib/transport.tcl:132 +msgid "Push Branches" +msgstr "ブランチをプッシュ" + +#: lib/transport.tcl:147 +msgid "Source Branches" +msgstr "元のブランチ" + +#: lib/transport.tcl:162 +msgid "Destination Repository" +msgstr "送り先リポジトリ" + +#: lib/transport.tcl:205 +msgid "Transfer Options" +msgstr "通信オプション" + +#: lib/transport.tcl:207 +msgid "Force overwrite existing branch (may discard changes)" +msgstr "既存ブランチを上書き(変更を破棄する可能性があります)" + +#: lib/transport.tcl:211 +msgid "Use thin pack (for slow network connections)" +msgstr "Thin Pack を使う(遅いネットワーク接続)" + +#: lib/transport.tcl:215 +msgid "Include tags" +msgstr "タグを含める" + +#: lib/choose_font.tcl:41 +msgid "Select" +msgstr "選択" + +#: lib/choose_font.tcl:55 +msgid "Font Family" +msgstr "フォント・ファミリー" + +#: lib/choose_font.tcl:76 +msgid "Font Size" +msgstr "フォントの大きさ" + +#: lib/choose_font.tcl:93 +msgid "Font Example" +msgstr "フォント・サンプル" + +#: lib/choose_font.tcl:105 +msgid "" +"This is example text.\n" +"If you like this text, it can be your font." +msgstr "" +"これはサンプル文です。\n" +"このフォントが気に入ればお使いになれます。" + +#: lib/remote.tcl:200 +msgid "Push to" +msgstr "プッシュ先" + +#: lib/remote.tcl:218 +msgid "Remove Remote" +msgstr "リモートを削除" + +#: lib/remote.tcl:223 +msgid "Prune from" +msgstr "から刈込む…" + +#: lib/remote.tcl:228 +msgid "Fetch from" +msgstr "取得元" + +#: lib/diff.tcl:77 #, tcl-format msgid "" "No differences detected.\n" @@ -1576,12 +2101,12 @@ msgstr "" "\n" "同様な状態のファイルを探すために、自動的に再スキャンを開始します。" -#: lib/diff.tcl:104 +#: lib/diff.tcl:117 #, tcl-format msgid "Loading diff of %s..." msgstr "%s の変更点をロード中…" -#: lib/diff.tcl:125 +#: lib/diff.tcl:140 msgid "" "LOCAL: deleted\n" "REMOTE:\n" @@ -1589,7 +2114,7 @@ msgstr "" "LOCAL: 削除\n" "Remote:\n" -#: lib/diff.tcl:130 +#: lib/diff.tcl:145 msgid "" "REMOTE: deleted\n" "LOCAL:\n" @@ -1597,32 +2122,32 @@ msgstr "" "REMOTE: 削除\n" "LOCAL:\n" -#: lib/diff.tcl:137 +#: lib/diff.tcl:152 msgid "LOCAL:\n" msgstr "LOCAL:\n" -#: lib/diff.tcl:140 +#: lib/diff.tcl:155 msgid "REMOTE:\n" msgstr "REMOTE\n" -#: lib/diff.tcl:202 lib/diff.tcl:319 +#: lib/diff.tcl:217 lib/diff.tcl:355 #, tcl-format msgid "Unable to display %s" msgstr "%s を表示できません" -#: lib/diff.tcl:203 +#: lib/diff.tcl:218 msgid "Error loading file:" msgstr "ファイルを読む際のエラーです:" -#: lib/diff.tcl:210 +#: lib/diff.tcl:225 msgid "Git Repository (subproject)" msgstr "Git リポジトリ(サブプロジェクト)" -#: lib/diff.tcl:222 +#: lib/diff.tcl:237 msgid "* Binary file (not showing content)." msgstr "* バイナリファイル(内容は表示しません)" -#: lib/diff.tcl:227 +#: lib/diff.tcl:242 #, tcl-format msgid "" "* Untracked file is %d bytes.\n" @@ -1631,7 +2156,7 @@ msgstr "" "* 管理外のファイルの大きさは %d バイトです。\n" "* 最初の %d バイトだけ表示しています。\n" -#: lib/diff.tcl:233 +#: lib/diff.tcl:248 #, tcl-format msgid "" "\n" @@ -1643,56 +2168,47 @@ msgstr "" "* %s は管理外のファイルをここで切りおとしました。\n" "* 全体を見るには外部エディタを使ってください。\n" -#: lib/diff.tcl:482 +#: lib/diff.tcl:578 msgid "Failed to unstage selected hunk." msgstr "選択されたパッチをコミット予定から外せません。" -#: lib/diff.tcl:489 +#: lib/diff.tcl:585 msgid "Failed to stage selected hunk." msgstr "選択されたパッチをコミット予定に加えられません。" -#: lib/diff.tcl:568 +#: lib/diff.tcl:664 msgid "Failed to unstage selected line." msgstr "選択されたパッチ行をコミット予定から外せません。" -#: lib/diff.tcl:576 +#: lib/diff.tcl:672 msgid "Failed to stage selected line." msgstr "選択されたパッチ行をコミット予定に加えられません。" -#: lib/encoding.tcl:443 -msgid "Default" -msgstr "デフォールト" - -#: lib/encoding.tcl:448 -#, tcl-format -msgid "System (%s)" -msgstr "システム (%s)" - -#: lib/encoding.tcl:459 lib/encoding.tcl:465 -msgid "Other" -msgstr "その他" +#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 +msgid "Checkout Branch" +msgstr "ブランチをチェックアウト" -#: lib/error.tcl:20 lib/error.tcl:114 -msgid "error" -msgstr "エラー" +#: lib/branch_checkout.tcl:26 +msgid "Checkout" +msgstr "チェックアウト" -#: lib/error.tcl:36 -msgid "warning" -msgstr "警告" +#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 +msgid "Fetch Tracking Branch" +msgstr "トラッキング・ブランチをフェッチ" -#: lib/error.tcl:94 -msgid "You must correct the above errors before committing." -msgstr "コミットする前に、以上のエラーを修正して下さい" +#: lib/branch_checkout.tcl:47 +msgid "Detach From Local Branch" +msgstr "ローカル・ブランチから削除" #: lib/index.tcl:6 msgid "Unable to unlock the index." msgstr "インデックスをロックできません" -#: lib/index.tcl:15 +#: lib/index.tcl:17 msgid "Index Error" msgstr "索引エラー" -#: lib/index.tcl:17 +#: lib/index.tcl:19 msgid "" "Updating the Git index failed. A rescan will be automatically started to " "resynchronize git-gui." @@ -1700,433 +2216,330 @@ msgstr "" "GIT インデックスの更新が失敗しました。git-gui と同期をとるために再スキャンし" "ます。" -#: lib/index.tcl:28 +#: lib/index.tcl:30 msgid "Continue" msgstr "続行" -#: lib/index.tcl:31 +#: lib/index.tcl:33 msgid "Unlock Index" msgstr "インデックスのロック解除" -#: lib/index.tcl:289 +#: lib/index.tcl:298 #, tcl-format msgid "Unstaging %s from commit" msgstr "コミットから '%s' を降ろす" -#: lib/index.tcl:328 +#: lib/index.tcl:337 msgid "Ready to commit." msgstr "コミット準備完了" -#: lib/index.tcl:341 +#: lib/index.tcl:350 #, tcl-format msgid "Adding %s" msgstr "コミットに %s を加えています" -#: lib/index.tcl:398 +#: lib/index.tcl:380 +#, tcl-format +msgid "Stage %d untracked files?" +msgstr "管理外の %d ファイルをコミット予定としますか?" + +#: lib/index.tcl:428 #, tcl-format msgid "Revert changes in file %s?" msgstr "ファイル %s にした変更を元に戻しますか?" -#: lib/index.tcl:400 +#: lib/index.tcl:430 #, tcl-format msgid "Revert changes in these %i files?" msgstr "これら %i 個のファイルにした変更を元に戻しますか?" -#: lib/index.tcl:408 +#: lib/index.tcl:438 msgid "Any unstaged changes will be permanently lost by the revert." msgstr "変更を元に戻すとコミット予定していない変更は全て失われます。" -#: lib/index.tcl:411 +#: lib/index.tcl:441 msgid "Do Nothing" msgstr "何もしない" -#: lib/index.tcl:429 +#: lib/index.tcl:459 msgid "Reverting selected files" msgstr "選択されたファイルにした変更を元に戻します" -#: lib/index.tcl:433 +#: lib/index.tcl:463 #, tcl-format msgid "Reverting %s" msgstr "%s にした変更を元に戻します" -#: lib/merge.tcl:13 +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "キーがありません。" + +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "公開鍵がありました: %s" + +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "鍵を生成" + +#: lib/sshkey.tcl:58 +msgid "Copy To Clipboard" +msgstr "クリップボードにコピー" + +#: lib/sshkey.tcl:72 +msgid "Your OpenSSH Public Key" +msgstr "あなたの OpenSSH 公開鍵" + +#: lib/sshkey.tcl:80 +msgid "Generating..." +msgstr "生成中..." + +#: lib/sshkey.tcl:86 +#, tcl-format msgid "" -"Cannot merge while amending.\n" +"Could not start ssh-keygen:\n" "\n" -"You must finish amending this commit before starting any type of merge.\n" +"%s" msgstr "" -"訂正中にはマージできません。\n" +"ssh-keygen を起動できません:\n" "\n" -"訂正処理を完了するまでは新たにマージを開始できません。\n" +"%s" -#: lib/merge.tcl:27 +#: lib/sshkey.tcl:113 +msgid "Generation failed." +msgstr "生成に失敗しました。" + +#: lib/sshkey.tcl:120 +msgid "Generation succeeded, but no keys found." +msgstr "生成には成功しましたが、鍵が見つかりません。" + +#: lib/sshkey.tcl:123 +#, tcl-format +msgid "Your key is in: %s" +msgstr "あなたの鍵は %s にあります" + +#: lib/commit.tcl:9 msgid "" -"Last scanned state does not match repository state.\n" -"\n" -"Another Git program has modified this repository since the last scan. A " -"rescan must be performed before a merge can be performed.\n" +"There is nothing to amend.\n" "\n" -"The rescan will be automatically started now.\n" +"You are about to create the initial commit. There is no commit before this " +"to amend.\n" msgstr "" -"最後にスキャンした状態はリポジトリの状態と合致しません。\n" -"\n" -"最後にスキャンして以後、別の Git プログラムがリポジトリを変更しています。マー" -"ジを開始する前に、再スキャンが必要です。\n" +"訂正するコミットがそもそもありません。\n" "\n" -"自動的に再スキャンを開始します。\n" +"これから作るのは最初のコミットです。その前にはまだ訂正するようなコミットはあ" +"りません。\n" -#: lib/merge.tcl:45 -#, tcl-format +#: lib/commit.tcl:18 msgid "" -"You are in the middle of a conflicted merge.\n" -"\n" -"File %s has merge conflicts.\n" +"Cannot amend while merging.\n" "\n" -"You must resolve them, stage the file, and commit to complete the current " -"merge. Only then can you begin another merge.\n" +"You are currently in the middle of a merge that has not been fully " +"completed. You cannot amend the prior commit unless you first abort the " +"current merge activity.\n" msgstr "" -"衝突のあったマージの途中です。\n" -"\n" -"ファイル %s にはマージ中の衝突が残っています。\n" +"マージ中にコミットの訂正はできません。\n" "\n" -"このファイルの衝突を解決し、コミット予定に加えて、コミットすることでマージを" -"完了します。そうやって始めて、新たなマージを開始できるようになります。\n" +"現在はまだマージの途中です。先にこのマージを中止しないと、前のコミットの訂正" +"はできません\n" -#: lib/merge.tcl:55 +#: lib/commit.tcl:48 +msgid "Error loading commit data for amend:" +msgstr "訂正するコミットのデータを読めません:" + +#: lib/commit.tcl:75 +msgid "Unable to obtain your identity:" +msgstr "ユーザの正体を確認できません:" + +#: lib/commit.tcl:80 +msgid "Invalid GIT_COMMITTER_IDENT:" +msgstr "GIT_COMMITTER_IDENT が無効です:" + +#: lib/commit.tcl:129 #, tcl-format +msgid "warning: Tcl does not support encoding '%s'." +msgstr "警告: Tcl はエンコーディング '%s' をサポートしていません" + +#: lib/commit.tcl:149 msgid "" -"You are in the middle of a change.\n" +"Last scanned state does not match repository state.\n" "\n" -"File %s is modified.\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before another commit can be created.\n" "\n" -"You should complete the current commit before starting a merge. Doing so " -"will help you abort a failed merge, should the need arise.\n" +"The rescan will be automatically started now.\n" msgstr "" -"変更の途中です。\n" +"最後にスキャンした状態はリポジトリの状態と合致しません。\n" "\n" -"ファイル %s は変更中です。\n" +"最後にスキャンして以後、別の Git プログラムがリポジトリを変更しています。新し" +"くコミットする前に、再スキャンが必要です。\n" "\n" -"現在のコミットを完了してからマージを開始して下さい。そうする方がマージに失敗" -"したときの回復が楽です。\n" - -#: lib/merge.tcl:107 -#, tcl-format -msgid "%s of %s" -msgstr "%s の %s ブランチ" +"自動的に再スキャンを開始します。\n" -#: lib/merge.tcl:120 +#: lib/commit.tcl:173 #, tcl-format -msgid "Merging %s and %s..." -msgstr "%s と %s をマージ中・・・" - -#: lib/merge.tcl:131 -msgid "Merge completed successfully." -msgstr "マージが完了しました" - -#: lib/merge.tcl:133 -msgid "Merge failed. Conflict resolution is required." -msgstr "マージが失敗しました。衝突の解決が必要です。" +msgid "" +"Unmerged files cannot be committed.\n" +"\n" +"File %s has merge conflicts. You must resolve them and stage the file " +"before committing.\n" +msgstr "" +"マージしていないファイルはコミットできません。\n" +"\n" +"ファイル %s にはマージ衝突が残っています。まず解決してコミット予定に加える必" +"要があります。\n" -#: lib/merge.tcl:158 +#: lib/commit.tcl:181 #, tcl-format -msgid "Merge Into %s" -msgstr "%s にマージ" - -#: lib/merge.tcl:177 -msgid "Revision To Merge" -msgstr "マージするリビジョン" - -#: lib/merge.tcl:212 msgid "" -"Cannot abort while amending.\n" +"Unknown file state %s detected.\n" "\n" -"You must finish amending this commit.\n" +"File %s cannot be committed by this program.\n" msgstr "" -"訂正中には中止できません。\n" +"不明なファイル状態 %s です。\n" "\n" -"まず今のコミット訂正を完了させて下さい。\n" +"ファイル %s は本プログラムではコミットできません。\n" -#: lib/merge.tcl:222 +#: lib/commit.tcl:189 msgid "" -"Abort merge?\n" -"\n" -"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n" +"No changes to commit.\n" "\n" -"Continue with aborting the current merge?" +"You must stage at least 1 file before you can commit.\n" msgstr "" -"マージを中断しますか?\n" -"\n" -"現在のマージを中断すると、コミットしていない全ての変更が失われます。\n" +"コミットする変更がありません。\n" "\n" -"マージを中断してよろしいですか?" +"最低一つの変更をコミット予定に加えてからコミットして下さい。\n" -#: lib/merge.tcl:228 +#: lib/commit.tcl:204 msgid "" -"Reset changes?\n" +"Please supply a commit message.\n" "\n" -"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n" +"A good commit message has the following format:\n" "\n" -"Continue with resetting the current changes?" +"- First line: Describe in one sentence what you did.\n" +"- Second line: Blank\n" +"- Remaining lines: Describe why this change is good.\n" msgstr "" -"変更点をリセットしますか?\n" +"コミット・メッセージを入力して下さい。\n" "\n" -"変更点をリセットすると、コミットしていない全ての変更が失われます。\n" +"正しいコミット・メッセージは:\n" "\n" -"リセットしてよろしいですか?" - -#: lib/merge.tcl:239 -msgid "Aborting" -msgstr "中断しています" - -#: lib/merge.tcl:239 -msgid "files reset" -msgstr "リセットしたファイル" - -#: lib/merge.tcl:267 -msgid "Abort failed." -msgstr "中断に失敗しました。" - -#: lib/merge.tcl:269 -msgid "Abort completed. Ready." -msgstr "中断完了。" - -#: lib/mergetool.tcl:8 -msgid "Force resolution to the base version?" -msgstr "共通の版を使いますか?" +"- 第1行: 何をしたか、を1行で要約。\n" +"- 第2行: 空白\n" +"- 残りの行: なぜ、この変更が良い変更か、の説明。\n" -#: lib/mergetool.tcl:9 -msgid "Force resolution to this branch?" -msgstr "自分の側の版を使いますか?" +#: lib/commit.tcl:235 +msgid "Calling pre-commit hook..." +msgstr "コミット前フックを実行中・・・" -#: lib/mergetool.tcl:10 -msgid "Force resolution to the other branch?" -msgstr "相手制の版を使いますか?" +#: lib/commit.tcl:250 +msgid "Commit declined by pre-commit hook." +msgstr "コミット前フックがコミットを拒否しました" -#: lib/mergetool.tcl:14 -#, tcl-format +#: lib/commit.tcl:269 msgid "" -"Note that the diff shows only conflicting changes.\n" -"\n" -"%s will be overwritten.\n" -"\n" -"This operation can be undone only by restarting the merge." +"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 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" +" Do you really want to proceed with your Commit?" msgstr "" -"競合する変更点だけが表示されていることに注意してください。\n" +"分離 HEAD での変更をコミットしようとしています。" +"これは潜在的に危険な行為で、理由は別のブランチへの切り替えで" +"変更が消失し、reflog からの事後復旧も困難となるためです。" +"おそらくこのコミットはキャンセルし新しく作成したブランチで" +"行うべきです。\n" "\n" -"%s は上書きされます。\n" -"\n" -"やり直すにはマージ全体をやり直してください。" +" 本当にコミットを続行しますか?" -#: lib/mergetool.tcl:45 -#, tcl-format -msgid "File %s seems to have unresolved conflicts, still stage?" -msgstr "" -"ファイル %s には解決していない競合部分がまだあるようですが、いいですか?" - -#: lib/mergetool.tcl:60 -#, tcl-format -msgid "Adding resolution for %s" -msgstr "%s への解決をステージします" - -#: lib/mergetool.tcl:141 -msgid "Cannot resolve deletion or link conflicts using a tool" -msgstr "ツールでは削除やリンク競合は扱えません" +#: lib/commit.tcl:290 +msgid "Calling commit-msg hook..." +msgstr "コミット・メッセージ・フックを実行中・・・" -#: lib/mergetool.tcl:146 -msgid "Conflict file does not exist" -msgstr "競合ファイルは存在しません。" +#: lib/commit.tcl:305 +msgid "Commit declined by commit-msg hook." +msgstr "コミット・メッセージ・フックがコミットを拒否しました" -#: lib/mergetool.tcl:264 -#, tcl-format -msgid "Not a GUI merge tool: '%s'" -msgstr "GUI マージツールではありません: %s" +#: lib/commit.tcl:318 +msgid "Committing changes..." +msgstr "変更点をコミット中・・・" -#: lib/mergetool.tcl:268 -#, tcl-format -msgid "Unsupported merge tool '%s'" -msgstr "マージツール '%s' はサポートしていません" +#: lib/commit.tcl:334 +msgid "write-tree failed:" +msgstr "write-tree が失敗しました:" -#: lib/mergetool.tcl:303 -msgid "Merge tool is already running, terminate it?" -msgstr "マージツールはすでに起動しています。終了しますか?" +#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 +msgid "Commit failed." +msgstr "コミットに失敗しました。" -#: lib/mergetool.tcl:323 +#: lib/commit.tcl:352 #, tcl-format -msgid "" -"Error retrieving versions:\n" -"%s" -msgstr "" -"版の取り出し時にエラーが出ました:\n" -"%s" +msgid "Commit %s appears to be corrupt" +msgstr "コミット %s は壊れています" -#: lib/mergetool.tcl:343 -#, tcl-format +#: lib/commit.tcl:357 msgid "" -"Could not start the merge tool:\n" +"No changes to commit.\n" "\n" -"%s" +"No files were modified by this commit and it was not a merge commit.\n" +"\n" +"A rescan will be automatically started now.\n" msgstr "" -"マージツールが起動できません:\n" +"コミットする変更がありません。\n" "\n" -"%s" - -#: lib/mergetool.tcl:347 -msgid "Running merge tool..." -msgstr "マージツールを実行しています..." - -#: lib/mergetool.tcl:375 lib/mergetool.tcl:383 -msgid "Merge tool failed." -msgstr "マージツールが失敗しました。" - -#: lib/option.tcl:11 -#, tcl-format -msgid "Invalid global encoding '%s'" -msgstr "全体エンコーディングに 無効な %s が指定されています" +"マージでなく、また、一つも変更点がありません。\n" +"\n" +"自動的に再スキャンを開始します。\n" -#: lib/option.tcl:19 -#, tcl-format -msgid "Invalid repo encoding '%s'" -msgstr "リポジトリエンコーディングに 無効な %s が指定されています" +#: lib/commit.tcl:364 +msgid "No changes to commit." +msgstr "コミットする変更がありません。" -#: lib/option.tcl:117 -msgid "Restore Defaults" -msgstr "既定値に戻す" +#: lib/commit.tcl:378 +msgid "commit-tree failed:" +msgstr "commit-tree が失敗しました:" -#: lib/option.tcl:121 -msgid "Save" -msgstr "保存" +#: lib/commit.tcl:399 +msgid "update-ref failed:" +msgstr "update-ref が失敗しました:" -#: lib/option.tcl:131 +#: lib/commit.tcl:492 #, tcl-format -msgid "%s Repository" -msgstr "%s リポジトリ" - -#: lib/option.tcl:132 -msgid "Global (All Repositories)" -msgstr "大域(全てのリポジトリ)" - -#: lib/option.tcl:138 -msgid "User Name" -msgstr "ユーザ名" - -#: lib/option.tcl:139 -msgid "Email Address" -msgstr "電子メールアドレス" - -#: lib/option.tcl:141 -msgid "Summarize Merge Commits" -msgstr "マージコミットの要約" - -#: lib/option.tcl:142 -msgid "Merge Verbosity" -msgstr "マージの冗長度" - -#: lib/option.tcl:143 -msgid "Show Diffstat After Merge" -msgstr "マージ後に diffstat を表示" - -#: lib/option.tcl:144 -msgid "Use Merge Tool" -msgstr "マージツールを使用" - -#: lib/option.tcl:146 -msgid "Trust File Modification Timestamps" -msgstr "ファイル変更時刻を信頼する" - -#: lib/option.tcl:147 -msgid "Prune Tracking Branches During Fetch" -msgstr "フェッチ中にトラッキングブランチを刈る" - -#: lib/option.tcl:148 -msgid "Match Tracking Branches" -msgstr "トラッキングブランチを合わせる" - -#: lib/option.tcl:149 -msgid "Blame Copy Only On Changed Files" -msgstr "変更されたファイルのみコピー検知を行なう" - -#: lib/option.tcl:150 -msgid "Minimum Letters To Blame Copy On" -msgstr "コピーを検知する最少文字数" - -#: lib/option.tcl:151 -msgid "Blame History Context Radius (days)" -msgstr "註釈する履歴半径(日数)" - -#: lib/option.tcl:152 -msgid "Number of Diff Context Lines" -msgstr "diff の文脈行数" - -#: lib/option.tcl:153 -msgid "Commit Message Text Width" -msgstr "コミットメッセージのテキスト幅" - -#: lib/option.tcl:154 -msgid "New Branch Name Template" -msgstr "新しいブランチ名のテンプレート" - -#: lib/option.tcl:155 -msgid "Default File Contents Encoding" -msgstr "ファイル内容のデフォールトエンコーディング" - -#: lib/option.tcl:203 -msgid "Change" -msgstr "変更" +msgid "Created commit %s: %s" +msgstr "コミット %s を作成しました: %s" -#: lib/option.tcl:230 -msgid "Spelling Dictionary:" -msgstr "スペルチェック辞書" +#: lib/browser.tcl:17 +msgid "Starting..." +msgstr "起動中…" -#: lib/option.tcl:254 -msgid "Change Font" -msgstr "フォントを変更" +#: lib/browser.tcl:27 +msgid "File Browser" +msgstr "ファイル・ブラウザ" -#: lib/option.tcl:258 +#: lib/browser.tcl:132 lib/browser.tcl:149 #, tcl-format -msgid "Choose %s" -msgstr "%s を選択" - -#: lib/option.tcl:264 -msgid "pt." -msgstr "ポイント" - -#: lib/option.tcl:278 -msgid "Preferences" -msgstr "設定" - -#: lib/option.tcl:314 -msgid "Failed to completely save options:" -msgstr "完全にオプションを保存できません:" - -#: lib/remote.tcl:163 -msgid "Remove Remote" -msgstr "リモートを削除" - -#: lib/remote.tcl:168 -msgid "Prune from" -msgstr "から刈込む…" +msgid "Loading %s..." +msgstr "%s をロード中…" -#: lib/remote.tcl:173 -msgid "Fetch from" -msgstr "取得元" +#: lib/browser.tcl:193 +msgid "[Up To Parent]" +msgstr "[上位フォルダへ]" -#: lib/remote.tcl:215 -msgid "Push to" -msgstr "プッシュ先" +#: lib/browser.tcl:275 lib/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "現在のブランチのファイルを見る" -#: lib/remote_add.tcl:19 +#: lib/remote_add.tcl:20 msgid "Add Remote" msgstr "リモートを追加" -#: lib/remote_add.tcl:24 +#: lib/remote_add.tcl:25 msgid "Add New Remote" msgstr "リモートを新規に追加" -#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36 -msgid "Add" -msgstr "追加" - -#: lib/remote_add.tcl:37 +#: lib/remote_add.tcl:39 msgid "Remote Details" msgstr "リモートの詳細" @@ -2134,155 +2547,104 @@ msgstr "リモートの詳細" msgid "Location:" msgstr "場所:" -#: lib/remote_add.tcl:62 +#: lib/remote_add.tcl:60 msgid "Further Action" msgstr "その他の動作" -#: lib/remote_add.tcl:65 +#: lib/remote_add.tcl:63 msgid "Fetch Immediately" msgstr "即座に取得" -#: lib/remote_add.tcl:71 +#: lib/remote_add.tcl:69 msgid "Initialize Remote Repository and Push" msgstr "リモートレポジトリを初期化してプッシュ" -#: lib/remote_add.tcl:77 +#: lib/remote_add.tcl:75 msgid "Do Nothing Else Now" msgstr "何もしない" -#: lib/remote_add.tcl:101 +#: lib/remote_add.tcl:100 msgid "Please supply a remote name." msgstr "リモート名を指定して下さい。" -#: lib/remote_add.tcl:114 +#: lib/remote_add.tcl:113 #, tcl-format msgid "'%s' is not an acceptable remote name." msgstr "'%s' はリモート名に使えません。" -#: lib/remote_add.tcl:125 +#: lib/remote_add.tcl:124 #, tcl-format msgid "Failed to add remote '%s' of location '%s'." msgstr "場所 '%2$s' のリモート '%1$s'の名前変更に失敗しました。" -#: lib/remote_add.tcl:133 lib/transport.tcl:6 -#, tcl-format -msgid "fetch %s" -msgstr "%s を取得" - -#: lib/remote_add.tcl:134 +#: lib/remote_add.tcl:133 #, tcl-format msgid "Fetching the %s" msgstr "%s からフェッチしています" -#: lib/remote_add.tcl:157 +#: lib/remote_add.tcl:156 #, tcl-format msgid "Do not know how to initialize repository at location '%s'." msgstr "リポジトリ '%s' を初期化できません。" -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 -#: lib/transport.tcl:81 -#, tcl-format -msgid "push %s" -msgstr "%s をプッシュ" - -#: lib/remote_add.tcl:164 +#: lib/remote_add.tcl:163 #, tcl-format msgid "Setting up the %s (at %s)" msgstr "%2$s にある %1$s をセットアップします" -#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 -msgid "Delete Branch Remotely" -msgstr "遠隔でブランチ削除" - -#: lib/remote_branch_delete.tcl:47 -msgid "From Repository" -msgstr "元のリポジトリ" +#: lib/line.tcl:17 +msgid "Goto Line:" +msgstr "行番号" -#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 -msgid "Remote:" -msgstr "リモート:" +#: lib/line.tcl:23 +msgid "Go" +msgstr "移動" -#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 -msgid "Arbitrary Location:" -msgstr "任意の位置:" +#: lib/branch_create.tcl:23 +msgid "Create Branch" +msgstr "ブランチを作成" -#: lib/remote_branch_delete.tcl:84 -msgid "Branches" -msgstr "ブランチ" +#: lib/branch_create.tcl:28 +msgid "Create New Branch" +msgstr "ブランチを新規作成" -#: lib/remote_branch_delete.tcl:109 -msgid "Delete Only If" -msgstr "条件付で削除" +#: lib/branch_create.tcl:42 +msgid "Branch Name" +msgstr "ブランチ名" -#: lib/remote_branch_delete.tcl:111 -msgid "Merged Into:" -msgstr "マージ先:" +#: lib/branch_create.tcl:57 +msgid "Match Tracking Branch Name" +msgstr "トラッキング・ブランチ名を合わせる" -#: lib/remote_branch_delete.tcl:152 -msgid "A branch is required for 'Merged Into'." -msgstr "'マージ先' にはブランチが必要です。" +#: lib/branch_create.tcl:66 +msgid "Starting Revision" +msgstr "初期リビジョン" -#: lib/remote_branch_delete.tcl:184 -#, tcl-format -msgid "" -"The following branches are not completely merged into %s:\n" -"\n" -" - %s" -msgstr "" -"以下のブランチは %s に完全にマージされていません:\n" -"\n" -" - %s" +#: lib/branch_create.tcl:72 +msgid "Update Existing Branch:" +msgstr "既存のブランチを更新:" -#: lib/remote_branch_delete.tcl:189 -#, tcl-format -msgid "" -"One or more of the merge tests failed because you have not fetched the " -"necessary commits. Try fetching from %s first." -msgstr "" -"必要なコミットが不足しているために、マージ検査が失敗しました。まず %s から" -"フェッチして下さい。" +#: lib/branch_create.tcl:75 +msgid "No" +msgstr "いいえ" -#: lib/remote_branch_delete.tcl:207 -msgid "Please select one or more branches to delete." -msgstr "削除するブランチを選択して下さい。" +#: lib/branch_create.tcl:80 +msgid "Fast Forward Only" +msgstr "早送りのみ" -#: lib/remote_branch_delete.tcl:226 -#, tcl-format -msgid "Deleting branches from %s" -msgstr "%s からブランチを削除しています。" +#: lib/branch_create.tcl:97 +msgid "Checkout After Creation" +msgstr "作成してすぐチェックアウト" -#: lib/remote_branch_delete.tcl:292 -msgid "No repository selected." -msgstr "リポジトリが選択されていません。" +#: lib/branch_create.tcl:132 +msgid "Please select a tracking branch." +msgstr "トラッキング・ブランチを選択して下さい。" -#: lib/remote_branch_delete.tcl:297 +#: lib/branch_create.tcl:141 #, tcl-format -msgid "Scanning %s..." -msgstr "%s をスキャンしています…" - -#: lib/search.tcl:21 -msgid "Find:" -msgstr "検索:" - -#: lib/search.tcl:23 -msgid "Next" -msgstr "次" - -#: lib/search.tcl:24 -msgid "Prev" -msgstr "前" - -#: lib/search.tcl:25 -msgid "Case-Sensitive" -msgstr "大文字小文字を区別" - -#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 -msgid "Cannot write shortcut:" -msgstr "ショートカットが書けません:" - -#: lib/shortcut.tcl:137 -msgid "Cannot write icon:" -msgstr "アイコンが書けません:" +msgid "Tracking branch %s is not a branch in the remote repository." +msgstr "" +"トラッキング・ブランチ %s はリモートリポジトリのブランチではありません。" #: lib/spellcheck.tcl:57 msgid "Unsupported spell checker" @@ -2320,236 +2682,3 @@ msgstr "スペルチェッカーが予想外の EOF を返しました" #: lib/spellcheck.tcl:392 msgid "Spell Checker Failed" msgstr "スペルチェック失敗" - -#: lib/sshkey.tcl:31 -msgid "No keys found." -msgstr "キーがありません。" - -#: lib/sshkey.tcl:34 -#, tcl-format -msgid "Found a public key in: %s" -msgstr "公開鍵がありました: %s" - -#: lib/sshkey.tcl:40 -msgid "Generate Key" -msgstr "鍵を生成" - -#: lib/sshkey.tcl:56 -msgid "Copy To Clipboard" -msgstr "クリップボードにコピー" - -#: lib/sshkey.tcl:70 -msgid "Your OpenSSH Public Key" -msgstr "あなたの OpenSSH 公開鍵" - -#: lib/sshkey.tcl:78 -msgid "Generating..." -msgstr "生成中..." - -#: lib/sshkey.tcl:84 -#, tcl-format -msgid "" -"Could not start ssh-keygen:\n" -"\n" -"%s" -msgstr "" -"ssh-keygen を起動できません:\n" -"\n" -"%s" - -#: lib/sshkey.tcl:111 -msgid "Generation failed." -msgstr "生成に失敗しました。" - -#: lib/sshkey.tcl:118 -msgid "Generation succeeded, but no keys found." -msgstr "生成には成功しましたが、鍵が見つかりません。" - -#: lib/sshkey.tcl:121 -#, tcl-format -msgid "Your key is in: %s" -msgstr "あなたの鍵は %s にあります" - -#: lib/status_bar.tcl:83 -#, tcl-format -msgid "%s ... %*i of %*i %s (%3i%%)" -msgstr "%1$s ... %4$*i %6$s 中の %2$*i (%7$3i%%)" - -#: lib/tools.tcl:75 -#, tcl-format -msgid "Running %s requires a selected file." -msgstr "ファイルを選択してから %s を起動してください。" - -#: lib/tools.tcl:90 -#, tcl-format -msgid "Are you sure you want to run %s?" -msgstr "本当に %s を起動しますか?" - -#: lib/tools.tcl:110 -#, tcl-format -msgid "Tool: %s" -msgstr "ツール: %s" - -#: lib/tools.tcl:111 -#, tcl-format -msgid "Running: %s" -msgstr "実行中: %s" - -#: lib/tools.tcl:149 -#, tcl-format -msgid "Tool completed successfully: %s" -msgstr "ツールが完了しました: %s" - -#: lib/tools.tcl:151 -#, tcl-format -msgid "Tool failed: %s" -msgstr "ツールが失敗しました: %s" - -#: lib/tools_dlg.tcl:22 -msgid "Add Tool" -msgstr "ツールの追加" - -#: lib/tools_dlg.tcl:28 -msgid "Add New Tool Command" -msgstr "新規ツールコマンドの追加" - -#: lib/tools_dlg.tcl:33 -msgid "Add globally" -msgstr "全体に追加" - -#: lib/tools_dlg.tcl:45 -msgid "Tool Details" -msgstr "ツールの詳細" - -#: lib/tools_dlg.tcl:48 -msgid "Use '/' separators to create a submenu tree:" -msgstr "'/' でサブメニューを区切ります:" - -#: lib/tools_dlg.tcl:61 -msgid "Command:" -msgstr "コマンド:" - -#: lib/tools_dlg.tcl:74 -msgid "Show a dialog before running" -msgstr "起動する前にダイアログを表示" - -#: lib/tools_dlg.tcl:80 -msgid "Ask the user to select a revision (sets $REVISION)" -msgstr "ユーザにコミットを一つ選ばせる ($REVISION にセットします)" - -#: lib/tools_dlg.tcl:85 -msgid "Ask the user for additional arguments (sets $ARGS)" -msgstr "ユーザに他の引数を追加させる ($ARGS にセットします)" - -#: lib/tools_dlg.tcl:92 -msgid "Don't show the command output window" -msgstr "コマンドからの出力ウィンドウを見せない" - -#: lib/tools_dlg.tcl:97 -msgid "Run only if a diff is selected ($FILENAME not empty)" -msgstr "パッチが選ばれているときだけ動かす($FILENAME が空でない)" - -#: lib/tools_dlg.tcl:121 -msgid "Please supply a name for the tool." -msgstr "ツール名を指定して下さい。" - -#: lib/tools_dlg.tcl:129 -#, tcl-format -msgid "Tool '%s' already exists." -msgstr "ツール '%s' は既に存在します。" - -#: lib/tools_dlg.tcl:151 -#, tcl-format -msgid "" -"Could not add tool:\n" -"%s" -msgstr "" -"ツールを追加できません:\n" -"%s" - -#: lib/tools_dlg.tcl:190 -msgid "Remove Tool" -msgstr "ツールの削除" - -#: lib/tools_dlg.tcl:196 -msgid "Remove Tool Commands" -msgstr "ツールコマンドの削除" - -#: lib/tools_dlg.tcl:200 -msgid "Remove" -msgstr "削除" - -#: lib/tools_dlg.tcl:236 -msgid "(Blue denotes repository-local tools)" -msgstr "(青色はローカルレポジトリのツールです)" - -#: lib/tools_dlg.tcl:297 -#, tcl-format -msgid "Run Command: %s" -msgstr "コマンドを起動: %s" - -#: lib/tools_dlg.tcl:311 -msgid "Arguments" -msgstr "引数" - -#: lib/tools_dlg.tcl:348 -msgid "OK" -msgstr "OK" - -#: lib/transport.tcl:7 -#, tcl-format -msgid "Fetching new changes from %s" -msgstr "%s から新しい変更をフェッチしています" - -#: lib/transport.tcl:18 -#, tcl-format -msgid "remote prune %s" -msgstr "遠隔刈込 %s" - -#: lib/transport.tcl:19 -#, tcl-format -msgid "Pruning tracking branches deleted from %s" -msgstr "%s から削除されたトラッキング・ブランチを刈っています" - -#: lib/transport.tcl:26 -#, tcl-format -msgid "Pushing changes to %s" -msgstr "%s へ変更をプッシュしています" - -#: lib/transport.tcl:64 -#, tcl-format -msgid "Mirroring to %s" -msgstr "%s へミラーしています" - -#: lib/transport.tcl:82 -#, tcl-format -msgid "Pushing %s %s to %s" -msgstr "%3$s へ %1$s %2$s をプッシュしています" - -#: lib/transport.tcl:100 -msgid "Push Branches" -msgstr "ブランチをプッシュ" - -#: lib/transport.tcl:114 -msgid "Source Branches" -msgstr "元のブランチ" - -#: lib/transport.tcl:131 -msgid "Destination Repository" -msgstr "送り先リポジトリ" - -#: lib/transport.tcl:169 -msgid "Transfer Options" -msgstr "通信オプション" - -#: lib/transport.tcl:171 -msgid "Force overwrite existing branch (may discard changes)" -msgstr "既存ブランチを上書き(変更を破棄する可能性があります)" - -#: lib/transport.tcl:175 -msgid "Use thin pack (for slow network connections)" -msgstr "Thin Pack を使う(遅いネットワーク接続)" - -#: lib/transport.tcl:179 -msgid "Include tags" -msgstr "タグを含める" diff --git a/git-merge-octopus.sh b/git-merge-octopus.sh index 308eafd1d3..bcf0d92ec2 100755 --- a/git-merge-octopus.sh +++ b/git-merge-octopus.sh @@ -30,7 +30,7 @@ do esac done -# Reject if this is not an Octopus -- resolve should be used instead. +# Reject if this is not an octopus -- resolve should be used instead. case "$remotes" in ?*' '?*) ;; @@ -59,7 +59,7 @@ do # conflicts. Last round failed and we still had # a head to merge. gettextln "Automated merge did not work." - gettextln "Should not be doing an Octopus." + gettextln "Should not be doing an octopus." exit 2 esac diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 7e558b068c..ca994c5c54 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -1041,7 +1041,7 @@ The possible behaviours are: ignore, warn, error.")" # placed before the commit of the next action checkout_onto - warn "$(gettext "You can fix this with 'git rebase --edit-todo'.")" + warn "$(gettext "You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'.")" die "$(gettext "Or you can abort the rebase with 'git rebase --abort'.")" fi } @@ -1082,7 +1082,7 @@ If they are meant to go into a new commit, run: git commit \$gpg_sign_opt_quoted -In both case, once you're done, continue with: +In both cases, once you're done, continue with: git rebase --continue ")" @@ -1141,9 +1141,6 @@ To continue rebase after editing, run: ;; esac -git var GIT_COMMITTER_IDENT >/dev/null || - die "$(gettext "You need to set your committer info first")" - comment_for_reflog start if test ! -z "$switch_to" @@ -1145,6 +1145,7 @@ int graph_next_line(struct git_graph *graph, struct strbuf *sb) static void graph_padding_line(struct git_graph *graph, struct strbuf *sb) { int i; + int chars_written = 0; if (graph->state != GRAPH_COMMIT) { graph_next_line(graph, sb); @@ -1160,14 +1161,21 @@ static void graph_padding_line(struct git_graph *graph, struct strbuf *sb) */ for (i = 0; i < graph->num_columns; i++) { struct column *col = &graph->columns[i]; + strbuf_write_column(sb, col, '|'); - if (col->commit == graph->commit && graph->num_parents > 2) - strbuf_addchars(sb, ' ', (graph->num_parents - 2) * 2); - else + chars_written++; + + if (col->commit == graph->commit && graph->num_parents > 2) { + int len = (graph->num_parents - 2) * 2; + strbuf_addchars(sb, ' ', len); + chars_written += len; + } else { strbuf_addch(sb, ' '); + chars_written++; + } } - graph_pad_horizontally(graph, sb, graph->num_columns); + graph_pad_horizontally(graph, sb, chars_written); /* * Update graph->prev_state since we have output a padding line @@ -898,17 +898,6 @@ static int fixmatch(struct grep_pat *p, char *line, char *eol, } } -static int regmatch(const regex_t *preg, char *line, char *eol, - regmatch_t *match, int eflags) -{ -#ifdef REG_STARTEND - match->rm_so = 0; - match->rm_eo = eol - line; - eflags |= REG_STARTEND; -#endif - return regexec(preg, line, 1, match, eflags); -} - static int patmatch(struct grep_pat *p, char *line, char *eol, regmatch_t *match, int eflags) { @@ -919,7 +908,8 @@ static int patmatch(struct grep_pat *p, char *line, char *eol, else if (p->pcre_regexp) hit = !pcrematch(p, line, eol, match, eflags); else - hit = !regmatch(&p->regexp, line, eol, match, eflags); + hit = !regexec_buf(&p->regexp, line, eol - line, 1, match, + eflags); return hit; } @@ -39,16 +39,8 @@ int get_sha1_hex(const char *hex, unsigned char *sha1) { int i; for (i = 0; i < GIT_SHA1_RAWSZ; i++) { - unsigned int val; - /* - * hex[1]=='\0' is caught when val is checked below, - * but if hex[0] is NUL we have to avoid reading - * past the end of the string: - */ - if (!hex[0]) - return -1; - val = (hexval(hex[0]) << 4) | hexval(hex[1]); - if (val & ~0xff) + int val = hex2chr(hex); + if (val < 0) return -1; *sha1++ = val; hex += 2; @@ -201,6 +201,13 @@ static void finish_active_slot(struct active_request_slot *slot) slot->callback_func(slot->callback_data); } +static void xmulti_remove_handle(struct active_request_slot *slot) +{ +#ifdef USE_CURL_MULTI + curl_multi_remove_handle(curlm, slot->curl); +#endif +} + #ifdef USE_CURL_MULTI static void process_curl_messages(void) { @@ -216,7 +223,7 @@ static void process_curl_messages(void) slot->curl != curl_message->easy_handle) slot = slot->next; if (slot != NULL) { - curl_multi_remove_handle(curlm, slot->curl); + xmulti_remove_handle(slot); slot->curl_result = curl_result; finish_active_slot(slot); } else { @@ -723,7 +730,7 @@ static CURL *get_curl_handle(void) * precedence here, as in CURL. */ if (!curl_http_proxy) { - if (!strcmp(http_auth.protocol, "https")) { + if (http_auth.protocol && !strcmp(http_auth.protocol, "https")) { var_override(&curl_http_proxy, getenv("HTTPS_PROXY")); var_override(&curl_http_proxy, getenv("https_proxy")); } else { @@ -881,9 +888,7 @@ void http_cleanup(void) while (slot != NULL) { struct active_request_slot *next = slot->next; if (slot->curl != NULL) { -#ifdef USE_CURL_MULTI - curl_multi_remove_handle(curlm, slot->curl); -#endif + xmulti_remove_handle(slot); curl_easy_cleanup(slot->curl); } free(slot); @@ -1022,6 +1027,8 @@ int start_active_slot(struct active_request_slot *slot) if (curlm_result != CURLM_OK && curlm_result != CURLM_CALL_MULTI_PERFORM) { + warning("curl_multi_add_handle failed: %s", + curl_multi_strerror(curlm_result)); active_requests--; slot->in_use = 0; return 0; @@ -1161,13 +1168,13 @@ void run_active_slot(struct active_request_slot *slot) static void release_active_slot(struct active_request_slot *slot) { closedown_active_slot(slot); - if (slot->curl && curl_session_count > min_curl_sessions) { -#ifdef USE_CURL_MULTI - curl_multi_remove_handle(curlm, slot->curl); -#endif - curl_easy_cleanup(slot->curl); - slot->curl = NULL; - curl_session_count--; + if (slot->curl) { + xmulti_remove_handle(slot); + if (curl_session_count > min_curl_sessions) { + curl_easy_cleanup(slot->curl); + slot->curl = NULL; + curl_session_count--; + } } #ifdef USE_CURL_MULTI fill_active_slots(); @@ -101,7 +101,7 @@ static int canonical_name(const char *host, struct strbuf *out) memset (&hints, '\0', sizeof (hints)); hints.ai_flags = AI_CANONNAME; if (!getaddrinfo(host, NULL, &hints, &ai)) { - if (ai && strchr(ai->ai_canonname, '.')) { + if (ai && ai->ai_canonname && strchr(ai->ai_canonname, '.')) { strbuf_addstr(out, ai->ai_canonname); status = 0; } diff --git a/mailinfo.c b/mailinfo.c index e19abe3cb9..b4118a0275 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -54,6 +54,86 @@ static void parse_bogus_from(struct mailinfo *mi, const struct strbuf *line) get_sane_name(&mi->name, &mi->name, &mi->email); } +static const char *unquote_comment(struct strbuf *outbuf, const char *in) +{ + int c; + int take_next_litterally = 0; + + strbuf_addch(outbuf, '('); + + while ((c = *in++) != 0) { + if (take_next_litterally == 1) { + take_next_litterally = 0; + } else { + switch (c) { + case '\\': + take_next_litterally = 1; + continue; + case '(': + in = unquote_comment(outbuf, in); + continue; + case ')': + strbuf_addch(outbuf, ')'); + return in; + } + } + + strbuf_addch(outbuf, c); + } + + return in; +} + +static const char *unquote_quoted_string(struct strbuf *outbuf, const char *in) +{ + int c; + int take_next_litterally = 0; + + while ((c = *in++) != 0) { + if (take_next_litterally == 1) { + take_next_litterally = 0; + } else { + switch (c) { + case '\\': + take_next_litterally = 1; + continue; + case '"': + return in; + } + } + + strbuf_addch(outbuf, c); + } + + return in; +} + +static void unquote_quoted_pair(struct strbuf *line) +{ + struct strbuf outbuf; + const char *in = line->buf; + int c; + + strbuf_init(&outbuf, line->len); + + while ((c = *in++) != 0) { + switch (c) { + case '"': + in = unquote_quoted_string(&outbuf, in); + continue; + case '(': + in = unquote_comment(&outbuf, in); + continue; + } + + strbuf_addch(&outbuf, c); + } + + strbuf_swap(&outbuf, line); + strbuf_release(&outbuf); + +} + static void handle_from(struct mailinfo *mi, const struct strbuf *from) { char *at; @@ -63,6 +143,8 @@ static void handle_from(struct mailinfo *mi, const struct strbuf *from) strbuf_init(&f, from->len); strbuf_addbuf(&f, from); + unquote_quoted_pair(&f); + at = strchr(f.buf, '@'); if (!at) { parse_bogus_from(mi, from); diff --git a/pack-check.c b/pack-check.c index d123846ea2..c5c7763323 100644 --- a/pack-check.c +++ b/pack-check.c @@ -57,11 +57,8 @@ static int verify_packfile(struct packed_git *p, int err = 0; struct idx_entry *entries; - /* Note that the pack header checks are actually performed by - * use_pack when it first opens the pack file. If anything - * goes wrong during those checks then the call will die out - * immediately. - */ + if (!is_pack_valid(p)) + return error("packfile %s cannot be accessed", p->pack_name); git_SHA1_Init(&ctx); do { diff --git a/pack-revindex.c b/pack-revindex.c index 96d51c3467..6bc7c94033 100644 --- a/pack-revindex.c +++ b/pack-revindex.c @@ -107,7 +107,7 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max) * we have to move it back from the temporary storage. */ if (from != entries) - memcpy(entries, tmp, n * sizeof(*entries)); + COPY_ARRAY(entries, tmp, n); free(tmp); free(pos); diff --git a/patch-ids.c b/patch-ids.c index 082412aca6..ce285c2e0c 100644 --- a/patch-ids.c +++ b/patch-ids.c @@ -4,9 +4,18 @@ #include "sha1-lookup.h" #include "patch-ids.h" +static int patch_id_defined(struct commit *commit) +{ + /* must be 0 or 1 parents */ + return !commit->parents || !commit->parents->next; +} + int commit_patch_id(struct commit *commit, struct diff_options *options, unsigned char *sha1, int diff_header_only) { + if (!patch_id_defined(commit)) + return -1; + if (commit->parents) diff_tree_sha1(commit->parents->item->object.oid.hash, commit->object.oid.hash, "", options); @@ -45,6 +54,7 @@ int init_patch_ids(struct patch_ids *ids) { memset(ids, 0, sizeof(*ids)); diff_setup(&ids->diffopts); + ids->diffopts.detect_rename = 0; DIFF_OPT_SET(&ids->diffopts, RECURSIVE); diff_setup_done(&ids->diffopts); hashmap_init(&ids->patches, (hashmap_cmp_fn)patch_id_cmp, 256); @@ -76,6 +86,9 @@ struct patch_id *has_commit_patch_id(struct commit *commit, { struct patch_id patch; + if (!patch_id_defined(commit)) + return NULL; + memset(&patch, 0, sizeof(patch)); if (init_patch_id_entry(&patch, commit, ids)) return NULL; @@ -88,6 +101,9 @@ struct patch_id *add_commit_patch_id(struct commit *commit, { struct patch_id *key = xcalloc(1, sizeof(*key)); + if (!patch_id_defined(commit)) + return NULL; + if (init_patch_id_entry(key, commit, ids)) { free(key); return NULL; diff --git a/pathspec.c b/pathspec.c index 24e0dd5232..49a53607bb 100644 --- a/pathspec.c +++ b/pathspec.c @@ -485,8 +485,7 @@ void copy_pathspec(struct pathspec *dst, const struct pathspec *src) { *dst = *src; ALLOC_ARRAY(dst->items, dst->nr); - memcpy(dst->items, src->items, - sizeof(struct pathspec_item) * dst->nr); + COPY_ARRAY(dst->items, src->items, dst->nr); } void clear_pathspec(struct pathspec *pathspec) diff --git a/pathspec.h b/pathspec.h index 4a80f6fc96..59809e4793 100644 --- a/pathspec.h +++ b/pathspec.h @@ -96,7 +96,5 @@ static inline int ps_strcmp(const struct pathspec_item *item, extern char *find_pathspecs_matching_against_index(const struct pathspec *pathspec); extern void add_pathspec_matches_against_index(const struct pathspec *pathspec, char *seen); -extern const char *check_path_for_gitlink(const char *path); -extern void die_if_path_beyond_symlink(const char *path, const char *prefix); #endif /* PATHSPEC_H */ diff --git a/pkt-line.c b/pkt-line.c index 62fdb37079..30489c60b1 100644 --- a/pkt-line.c +++ b/pkt-line.c @@ -172,27 +172,8 @@ static int get_packet_data(int fd, char **src_buf, size_t *src_size, static int packet_length(const char *linelen) { - int n; - int len = 0; - - for (n = 0; n < 4; n++) { - unsigned char c = linelen[n]; - len <<= 4; - if (c >= '0' && c <= '9') { - len += c - '0'; - continue; - } - if (c >= 'a' && c <= 'f') { - len += c - 'a' + 10; - continue; - } - if (c >= 'A' && c <= 'F') { - len += c - 'A' + 10; - continue; - } - return -1; - } - return len; + int val = hex2chr(linelen); + return (val < 0) ? val : (val << 8) | hex2chr(linelen + 2); } int packet_read(int fd, char **src_buf, size_t *src_len, @@ -1065,7 +1065,7 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ const struct commit *commit = c->commit; const char *msg = c->message; struct commit_list *p; - int h1, h2; + int ch; /* these are independent of the commit */ switch (placeholder[0]) { @@ -1089,14 +1089,11 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */ return 1; case 'x': /* %x00 == NUL, %x0a == LF, etc. */ - if (0 <= (h1 = hexval_table[0xff & placeholder[1]]) && - h1 <= 16 && - 0 <= (h2 = hexval_table[0xff & placeholder[2]]) && - h2 <= 16) { - strbuf_addch(sb, (h1<<4)|h2); - return 3; - } else + ch = hex2chr(placeholder + 1); + if (ch < 0) return 0; + strbuf_addch(sb, ch); + return 3; case 'w': if (placeholder[1] == '(') { unsigned long width = 0, indent1 = 0, indent2 = 0; diff --git a/read-cache.c b/read-cache.c index 491e52d120..248432af43 100644 --- a/read-cache.c +++ b/read-cache.c @@ -627,7 +627,7 @@ void set_object_name_for_intent_to_add_entry(struct cache_entry *ce) hashcpy(ce->sha1, sha1); } -int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags, int force_mode) +int add_to_index(struct index_state *istate, const char *path, struct stat *st, int flags) { int size, namelen, was_same; mode_t st_mode = st->st_mode; @@ -656,11 +656,10 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, else ce->ce_flags |= CE_INTENT_TO_ADD; - if (S_ISREG(st_mode) && force_mode) - ce->ce_mode = create_ce_mode(force_mode); - else if (trust_executable_bit && has_symlinks) + + if (trust_executable_bit && has_symlinks) { ce->ce_mode = create_ce_mode(st_mode); - else { + } else { /* If there is an existing entry, pick the mode bits and type * from it, otherwise assume unexecutable regular file. */ @@ -719,13 +718,12 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, return 0; } -int add_file_to_index(struct index_state *istate, const char *path, - int flags, int force_mode) +int add_file_to_index(struct index_state *istate, const char *path, int flags) { struct stat st; if (lstat(path, &st)) die_errno("unable to stat '%s'", path); - return add_to_index(istate, path, &st, flags, force_mode); + return add_to_index(istate, path, &st, flags); } struct cache_entry *make_cache_entry(unsigned int mode, @@ -756,6 +754,35 @@ struct cache_entry *make_cache_entry(unsigned int mode, return ret; } +/* + * Chmod an index entry with either +x or -x. + * + * Returns -1 if the chmod for the particular cache entry failed (if it's + * not a regular file), -2 if an invalid flip argument is passed in, 0 + * otherwise. + */ +int chmod_index_entry(struct index_state *istate, struct cache_entry *ce, + char flip) +{ + if (!S_ISREG(ce->ce_mode)) + return -1; + switch (flip) { + case '+': + ce->ce_mode |= 0111; + break; + case '-': + ce->ce_mode &= ~0111; + break; + default: + return -2; + } + cache_tree_invalidate_path(istate, ce->name); + ce->ce_flags |= CE_UPDATE_IN_BASE; + istate->cache_changed |= CE_ENTRY_CHANGED; + + return 0; +} + int ce_same_name(const struct cache_entry *a, const struct cache_entry *b) { int len = ce_namelen(a); diff --git a/ref-filter.c b/ref-filter.c index bc551a752c..9a8f55e45a 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -235,7 +235,7 @@ int parse_ref_filter_atom(const char *atom, const char *ep) { const char *sp; const char *arg; - int i, at; + int i, at, atom_len; sp = atom; if (*sp == '*' && sp < ep) @@ -250,19 +250,19 @@ int parse_ref_filter_atom(const char *atom, const char *ep) return i; } + /* + * If the atom name has a colon, strip it and everything after + * it off - it specifies the format for this entry, and + * shouldn't be used for checking against the valid_atom + * table. + */ + arg = memchr(sp, ':', ep - sp); + atom_len = (arg ? arg : ep) - sp; + /* Is the atom a valid one? */ for (i = 0; i < ARRAY_SIZE(valid_atom); i++) { int len = strlen(valid_atom[i].name); - - /* - * If the atom name has a colon, strip it and everything after - * it off - it specifies the format for this entry, and - * shouldn't be used for checking against the valid_atom - * table. - */ - arg = memchr(sp, ':', ep - sp); - if (len == (arg ? arg : ep) - sp && - !memcmp(valid_atom[i].name, sp, len)) + if (len == atom_len && !memcmp(valid_atom[i].name, sp, len)) break; } @@ -1576,24 +1576,6 @@ void ref_array_sort(struct ref_sorting *sorting, struct ref_array *array) qsort(array->items, array->nr, sizeof(struct ref_array_item *), compare_refs); } -static int hex1(char ch) -{ - if ('0' <= ch && ch <= '9') - return ch - '0'; - else if ('a' <= ch && ch <= 'f') - return ch - 'a' + 10; - else if ('A' <= ch && ch <= 'F') - return ch - 'A' + 10; - return -1; -} -static int hex2(const char *cp) -{ - if (cp[0] && cp[1]) - return (hex1(cp[0]) << 4) | hex1(cp[1]); - else - return -1; -} - static void append_literal(const char *cp, const char *ep, struct ref_formatting_state *state) { struct strbuf *s = &state->stack->output; @@ -1603,7 +1585,7 @@ static void append_literal(const char *cp, const char *ep, struct ref_formatting if (cp[1] == '%') cp++; else { - int ch = hex2(cp + 1); + int ch = hex2chr(cp + 1); if (0 <= ch) { strbuf_addch(s, ch); cp += 3; diff --git a/sha1_file.c b/sha1_file.c index 3045aeabda..7a4f8f8661 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1572,7 +1572,9 @@ unsigned long unpack_object_header_buffer(const unsigned char *buf, return used; } -int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz) +static int unpack_sha1_short_header(git_zstream *stream, + unsigned char *map, unsigned long mapsize, + void *buffer, unsigned long bufsiz) { /* Get the data stream */ memset(stream, 0, sizeof(*stream)); @@ -1585,13 +1587,31 @@ int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long ma return git_inflate(stream, 0); } +int unpack_sha1_header(git_zstream *stream, + unsigned char *map, unsigned long mapsize, + void *buffer, unsigned long bufsiz) +{ + int status = unpack_sha1_short_header(stream, map, mapsize, + buffer, bufsiz); + + if (status < Z_OK) + return status; + + /* Make sure we have the terminating NUL */ + if (!memchr(buffer, '\0', stream->next_out - (unsigned char *)buffer)) + return -1; + return 0; +} + static int unpack_sha1_header_to_strbuf(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz, struct strbuf *header) { int status; - status = unpack_sha1_header(stream, map, mapsize, buffer, bufsiz); + status = unpack_sha1_short_header(stream, map, mapsize, buffer, bufsiz); + if (status < Z_OK) + return -1; /* * Check if entire header is unpacked in the first iteration. @@ -1682,6 +1702,8 @@ static int parse_sha1_header_extended(const char *hdr, struct object_info *oi, */ for (;;) { char c = *hdr++; + if (!c) + return -1; if (c == ' ') break; type_len++; diff --git a/split-index.c b/split-index.c index 3c75d4b9ce..35da553655 100644 --- a/split-index.c +++ b/split-index.c @@ -83,8 +83,7 @@ void move_cache_to_base_index(struct index_state *istate) si->base->timestamp = istate->timestamp; ALLOC_GROW(si->base->cache, istate->cache_nr, si->base->cache_alloc); si->base->cache_nr = istate->cache_nr; - memcpy(si->base->cache, istate->cache, - sizeof(*istate->cache) * istate->cache_nr); + COPY_ARRAY(si->base->cache, istate->cache, istate->cache_nr); mark_base_index_entries(si->base); for (i = 0; i < si->base->cache_nr; i++) si->base->cache[i]->ce_flags &= ~CE_UPDATE_IN_BASE; @@ -141,8 +140,7 @@ void merge_base_index(struct index_state *istate) istate->cache = NULL; istate->cache_alloc = 0; ALLOC_GROW(istate->cache, istate->cache_nr, istate->cache_alloc); - memcpy(istate->cache, si->base->cache, - sizeof(*istate->cache) * istate->cache_nr); + COPY_ARRAY(istate->cache, si->base->cache, istate->cache_nr); si->nr_deletions = 0; si->nr_replacements = 0; @@ -187,7 +187,7 @@ void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len) void strbuf_remove(struct strbuf *sb, size_t pos, size_t len) { - strbuf_splice(sb, pos, len, NULL, 0); + strbuf_splice(sb, pos, len, "", 0); } void strbuf_add(struct strbuf *sb, const void *data, size_t len) diff --git a/streaming.c b/streaming.c index 811fcc24d2..90feec9db6 100644 --- a/streaming.c +++ b/streaming.c @@ -337,17 +337,17 @@ static open_method_decl(loose) st->u.loose.mapped = map_sha1_file(sha1, &st->u.loose.mapsize); if (!st->u.loose.mapped) return -1; - if (unpack_sha1_header(&st->z, - st->u.loose.mapped, - st->u.loose.mapsize, - st->u.loose.hdr, - sizeof(st->u.loose.hdr)) < 0) { + if ((unpack_sha1_header(&st->z, + st->u.loose.mapped, + st->u.loose.mapsize, + st->u.loose.hdr, + sizeof(st->u.loose.hdr)) < 0) || + (parse_sha1_header(st->u.loose.hdr, &st->size) < 0)) { git_inflate_end(&st->z); munmap(st->u.loose.mapped, st->u.loose.mapsize); return -1; } - parse_sha1_header(st->u.loose.hdr, &st->size); st->u.loose.hdr_used = strlen(st->u.loose.hdr) + 1; st->u.loose.hdr_avail = st->z.total_out; st->z_state = z_used; diff --git a/submodule.c b/submodule.c index 1b5cdfb7e7..e8258f061a 100644 --- a/submodule.c +++ b/submodule.c @@ -1160,4 +1160,5 @@ void prepare_submodule_repo_env(struct argv_array *out) if (strcmp(*var, CONFIG_DATA_ENVIRONMENT)) argv_array_push(out, *var); } + argv_array_push(out, "GIT_DIR=.git"); } diff --git a/t/perf/run b/t/perf/run index cfd70129bb..e8adedadfd 100755 --- a/t/perf/run +++ b/t/perf/run @@ -30,7 +30,13 @@ unpack_git_rev () { } build_git_rev () { rev=$1 - cp ../../config.mak build/$rev/config.mak + for config in config.mak config.mak.autogen config.status + do + if test -e "../../$config" + then + cp "../../$config" "build/$rev/" + fi + done (cd build/$rev && make $GIT_PERF_MAKE_OPTS) || die "failed to build revision '$mydir'" } diff --git a/t/t1401-symbolic-ref.sh b/t/t1401-symbolic-ref.sh index ca3fa406c3..eec3e90f9c 100755 --- a/t/t1401-symbolic-ref.sh +++ b/t/t1401-symbolic-ref.sh @@ -33,18 +33,25 @@ test_expect_success 'symbolic-ref refuses bare sha1' ' ' reset_to_sane -test_expect_success 'symbolic-ref deletes HEAD' ' - git symbolic-ref -d HEAD && +test_expect_success 'HEAD cannot be removed' ' + test_must_fail git symbolic-ref -d HEAD +' + +reset_to_sane + +test_expect_success 'symbolic-ref can be deleted' ' + git symbolic-ref NOTHEAD refs/heads/foo && + git symbolic-ref -d NOTHEAD && test_path_is_file .git/refs/heads/foo && - test_path_is_missing .git/HEAD + test_path_is_missing .git/NOTHEAD ' reset_to_sane -test_expect_success 'symbolic-ref deletes dangling HEAD' ' - git symbolic-ref HEAD refs/heads/missing && - git symbolic-ref -d HEAD && +test_expect_success 'symbolic-ref can delete dangling symref' ' + git symbolic-ref NOTHEAD refs/heads/missing && + git symbolic-ref -d NOTHEAD && test_path_is_missing .git/refs/heads/missing && - test_path_is_missing .git/HEAD + test_path_is_missing .git/NOTHEAD ' reset_to_sane diff --git a/t/t2010-checkout-ambiguous.sh b/t/t2010-checkout-ambiguous.sh index e76e84afbb..2e47fe01cf 100755 --- a/t/t2010-checkout-ambiguous.sh +++ b/t/t2010-checkout-ambiguous.sh @@ -41,6 +41,15 @@ test_expect_success 'check ambiguity' ' test_must_fail git checkout world all ' +test_expect_success 'check ambiguity in subdir' ' + mkdir sub && + # not ambiguous because sub/world does not exist + git -C sub checkout world ../all && + echo hello >sub/world && + # ambiguous because sub/world does exist + test_must_fail git -C sub checkout world ../all +' + test_expect_success 'disambiguate checking out from a tree-ish' ' echo bye > world && git checkout world -- world && diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh index 468a000e4b..3e5ac81bd2 100755 --- a/t/t2024-checkout-dwim.sh +++ b/t/t2024-checkout-dwim.sh @@ -174,6 +174,18 @@ test_expect_success 'checkout of branch with a file having the same name fails' test_branch master ' +test_expect_success 'checkout of branch with a file in subdir having the same name fails' ' + git checkout -B master && + test_might_fail git branch -D spam && + + >spam && + mkdir sub && + mv spam sub/spam && + test_must_fail git -C sub checkout spam && + test_must_fail git rev-parse --verify refs/heads/spam && + test_branch master +' + test_expect_success 'checkout <branch> -- succeeds, even if a file with the same name exists' ' git checkout -B master && test_might_fail git branch -D spam && diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh index dfe02f4818..32ac6e09bd 100755 --- a/t/t2107-update-index-basic.sh +++ b/t/t2107-update-index-basic.sh @@ -80,4 +80,17 @@ test_expect_success '.lock files cleaned up' ' ) ' +test_expect_success '--chmod=+x and chmod=-x in the same argument list' ' + >A && + >B && + git add A B && + git update-index --chmod=+x A --chmod=-x B && + cat >expect <<-\EOF && + 100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 A + 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 B + EOF + git ls-files --stage A B >actual && + test_cmp expect actual +' + test_done diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 597e94e294..e38e296388 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -1195,7 +1195,7 @@ To avoid this message, use "drop" to explicitly remove a commit. Use 'git config rebase.missingCommitsCheck' to change the level of warnings. The possible behaviours are: ignore, warn, error. -You can fix this with 'git rebase --edit-todo'. +You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'. Or you can abort the rebase with 'git rebase --abort'. EOF @@ -1219,7 +1219,7 @@ cat >expect <<EOF Warning: the command isn't recognized in the following line: - badcmd $(git rev-list --oneline -1 master~1) -You can fix this with 'git rebase --edit-todo'. +You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'. Or you can abort the rebase with 'git rebase --abort'. EOF @@ -1254,7 +1254,7 @@ cat >expect <<EOF Warning: the SHA-1 is missing or isn't a commit in the following line: - edit XXXXXXX False commit -You can fix this with 'git rebase --edit-todo'. +You can fix this with 'git rebase --edit-todo' and then run 'git rebase --continue'. Or you can abort the rebase with 'git rebase --abort'. EOF diff --git a/t/t3700-add.sh b/t/t3700-add.sh index 2978cb9d64..924a266126 100755 --- a/t/t3700-add.sh +++ b/t/t3700-add.sh @@ -349,4 +349,52 @@ test_expect_success POSIXPERM,SYMLINKS 'git add --chmod=+x with symlinks' ' test_mode_in_index 100755 foo2 ' +test_expect_success 'git add --chmod=[+-]x changes index with already added file' ' + echo foo >foo3 && + git add foo3 && + git add --chmod=+x foo3 && + test_mode_in_index 100755 foo3 && + echo foo >xfoo3 && + chmod 755 xfoo3 && + git add xfoo3 && + git add --chmod=-x xfoo3 && + test_mode_in_index 100644 xfoo3 +' + +test_expect_success POSIXPERM 'git add --chmod=[+-]x does not change the working tree' ' + echo foo >foo4 && + git add foo4 && + git add --chmod=+x foo4 && + ! test -x foo4 +' + +test_expect_success 'no file status change if no pathspec is given' ' + >foo5 && + >foo6 && + git add foo5 foo6 && + git add --chmod=+x && + test_mode_in_index 100644 foo5 && + test_mode_in_index 100644 foo6 +' + +test_expect_success 'no file status change if no pathspec is given in subdir' ' + mkdir -p sub && + ( + cd sub && + >sub-foo1 && + >sub-foo2 && + git add . && + git add --chmod=+x && + test_mode_in_index 100644 sub-foo1 && + test_mode_in_index 100644 sub-foo2 + ) +' + +test_expect_success 'all statuses changed in folder if . is given' ' + git add --chmod=+x . && + test $(git ls-files --stage | grep ^100644 | wc -l) -eq 0 && + git add --chmod=-x . && + test $(git ls-files --stage | grep ^100755 | wc -l) -eq 0 +' + test_done diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh index b0579dd452..8d90a6e500 100755 --- a/t/t4014-format-patch.sh +++ b/t/t4014-format-patch.sh @@ -754,9 +754,22 @@ test_expect_success 'format-patch --ignore-if-in-upstream HEAD' ' git format-patch --ignore-if-in-upstream HEAD ' +git_version="$(git --version | sed "s/.* //")" + +signature() { + printf "%s\n%s\n\n" "-- " "${1:-$git_version}" +} + +test_expect_success 'format-patch default signature' ' + git format-patch --stdout -1 | tail -n 3 >output && + signature >expect && + test_cmp expect output +' + test_expect_success 'format-patch --signature' ' - git format-patch --stdout --signature="my sig" -1 >output && - grep "my sig" output + git format-patch --stdout --signature="my sig" -1 | tail -n 3 >output && + signature "my sig" >expect && + test_cmp expect output ' test_expect_success 'format-patch with format.signature config' ' @@ -1502,12 +1515,12 @@ test_expect_success 'format-patch -o overrides format.outputDirectory' ' test_expect_success 'format-patch --base' ' git checkout side && - git format-patch --stdout --base=HEAD~3 -1 >patch && - grep "^base-commit:" patch >actual && - grep "^prerequisite-patch-id:" patch >>actual && - echo "base-commit: $(git rev-parse HEAD~3)" >expected && + git format-patch --stdout --base=HEAD~3 -1 | tail -n 7 >actual && + echo >expected && + echo "base-commit: $(git rev-parse HEAD~3)" >>expected && echo "prerequisite-patch-id: $(git show --patch HEAD~2 | git patch-id --stable | awk "{print \$1}")" >>expected && echo "prerequisite-patch-id: $(git show --patch HEAD~1 | git patch-id --stable | awk "{print \$1}")" >>expected && + signature >> expected && test_cmp expected actual ' @@ -1605,6 +1618,14 @@ test_expect_success 'format-patch --base overrides format.useAutoBase' ' test_cmp expected actual ' +test_expect_success 'format-patch --base with --attach' ' + git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch && + sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \ + patch >actual && + test_write_lines 1 2 >expect && + test_cmp expect actual +' + test_expect_success 'format-patch --pretty=mboxrd' ' sp=" " && cat >msg <<-INPUT_END && diff --git a/t/t4051-diff-function-context.sh b/t/t4051-diff-function-context.sh index b79b87790b..6154acb456 100755 --- a/t/t4051-diff-function-context.sh +++ b/t/t4051-diff-function-context.sh @@ -67,6 +67,15 @@ test_expect_success 'setup' ' commit_and_tag long_common_tail file.c && git checkout initial && + cat "$dir/hello.c" "$dir/dummy.c" >file.c && + commit_and_tag hello_dummy file.c && + + # overlap function context of 1st change and -u context of 2nd change + grep -v "delete me from hello" <"$dir/hello.c" >file.c && + sed 2p <"$dir/dummy.c" >>file.c && + commit_and_tag changed_hello_dummy file.c && + + git checkout initial && grep -v "delete me from hello" <file.c >file.c.new && mv file.c.new file.c && cat "$dir/appended1.c" >>file.c && @@ -179,4 +188,20 @@ test_expect_success ' context does not include other functions' ' test $(grep -c "^[ +-].*Begin" changed_hello_appended.diff) -le 2 ' +check_diff changed_hello_dummy 'changed two consecutive functions' + +test_expect_success ' context includes begin' ' + grep "^ .*Begin of hello" changed_hello_dummy.diff && + grep "^ .*Begin of dummy" changed_hello_dummy.diff +' + +test_expect_success ' context includes end' ' + grep "^ .*End of hello" changed_hello_dummy.diff && + grep "^ .*End of dummy" changed_hello_dummy.diff +' + +test_expect_success ' overlapping hunks are merged' ' + test $(grep -c "^@@" changed_hello_dummy.diff) -eq 1 +' + test_done diff --git a/t/t4062-diff-pickaxe.sh b/t/t4062-diff-pickaxe.sh new file mode 100755 index 0000000000..f0bf50bda7 --- /dev/null +++ b/t/t4062-diff-pickaxe.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Copyright (c) 2016 Johannes Schindelin +# + +test_description='Pickaxe options' + +. ./test-lib.sh + +test_expect_success setup ' + test_commit initial && + printf "%04096d" 0 >4096-zeroes.txt && + git add 4096-zeroes.txt && + test_tick && + git commit -m "A 4k file" +' +test_expect_success '-G matches' ' + git diff --name-only -G "^0{4096}$" HEAD^ >out && + test 4096-zeroes.txt = "$(cat out)" +' + +test_done diff --git a/t/t5100-mailinfo.sh b/t/t5100-mailinfo.sh index 1a5a546230..45d228ebc8 100755 --- a/t/t5100-mailinfo.sh +++ b/t/t5100-mailinfo.sh @@ -7,8 +7,10 @@ test_description='git mailinfo and git mailsplit test' . ./test-lib.sh +DATA="$TEST_DIRECTORY/t5100" + test_expect_success 'split sample box' \ - 'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last && + 'git mailsplit -o. "$DATA/sample.mbox" >last && last=$(cat last) && echo total is $last && test $(cat last) = 17' @@ -16,28 +18,28 @@ test_expect_success 'split sample box' \ check_mailinfo () { mail=$1 opt=$2 mo="$mail$opt" - git mailinfo -u $opt msg$mo patch$mo <$mail >info$mo && - test_cmp "$TEST_DIRECTORY"/t5100/msg$mo msg$mo && - test_cmp "$TEST_DIRECTORY"/t5100/patch$mo patch$mo && - test_cmp "$TEST_DIRECTORY"/t5100/info$mo info$mo + git mailinfo -u $opt "msg$mo" "patch$mo" <"$mail" >"info$mo" && + test_cmp "$DATA/msg$mo" "msg$mo" && + test_cmp "$DATA/patch$mo" "patch$mo" && + test_cmp "$DATA/info$mo" "info$mo" } for mail in 00* do test_expect_success "mailinfo $mail" ' - check_mailinfo $mail "" && - if test -f "$TEST_DIRECTORY"/t5100/msg$mail--scissors + check_mailinfo "$mail" "" && + if test -f "$DATA/msg$mail--scissors" then - check_mailinfo $mail --scissors + check_mailinfo "$mail" --scissors fi && - if test -f "$TEST_DIRECTORY"/t5100/msg$mail--no-inbody-headers + if test -f "$DATA/msg$mail--no-inbody-headers" then - check_mailinfo $mail --no-inbody-headers + check_mailinfo "$mail" --no-inbody-headers fi && - if test -f "$TEST_DIRECTORY"/t5100/msg$mail--message-id + if test -f "$DATA/msg$mail--message-id" then - check_mailinfo $mail --message-id + check_mailinfo "$mail" --message-id fi ' done @@ -45,7 +47,7 @@ done test_expect_success 'split box with rfc2047 samples' \ 'mkdir rfc2047 && - git mailsplit -orfc2047 "$TEST_DIRECTORY"/t5100/rfc2047-samples.mbox \ + git mailsplit -orfc2047 "$DATA/rfc2047-samples.mbox" \ >rfc2047/last && last=$(cat rfc2047/last) && echo total is $last && @@ -54,20 +56,20 @@ test_expect_success 'split box with rfc2047 samples' \ for mail in rfc2047/00* do test_expect_success "mailinfo $mail" ' - git mailinfo -u $mail-msg $mail-patch <$mail >$mail-info && + git mailinfo -u "$mail-msg" "$mail-patch" <"$mail" >"$mail-info" && echo msg && - test_cmp "$TEST_DIRECTORY"/t5100/empty $mail-msg && + test_cmp "$DATA/empty" "$mail-msg" && echo patch && - test_cmp "$TEST_DIRECTORY"/t5100/empty $mail-patch && + test_cmp "$DATA/empty" "$mail-patch" && echo info && - test_cmp "$TEST_DIRECTORY"/t5100/rfc2047-info-$(basename $mail) $mail-info + test_cmp "$DATA/rfc2047-info-$(basename $mail)" "$mail-info" ' done test_expect_success 'respect NULs' ' - git mailsplit -d3 -o. "$TEST_DIRECTORY"/t5100/nul-plain && - test_cmp "$TEST_DIRECTORY"/t5100/nul-plain 001 && + git mailsplit -d3 -o. "$DATA/nul-plain" && + test_cmp "$DATA/nul-plain" 001 && (cat 001 | git mailinfo msg patch) && test_line_count = 4 patch @@ -75,52 +77,52 @@ test_expect_success 'respect NULs' ' test_expect_success 'Preserve NULs out of MIME encoded message' ' - git mailsplit -d5 -o. "$TEST_DIRECTORY"/t5100/nul-b64.in && - test_cmp "$TEST_DIRECTORY"/t5100/nul-b64.in 00001 && + git mailsplit -d5 -o. "$DATA/nul-b64.in" && + test_cmp "$DATA/nul-b64.in" 00001 && git mailinfo msg patch <00001 && - test_cmp "$TEST_DIRECTORY"/t5100/nul-b64.expect patch + test_cmp "$DATA/nul-b64.expect" patch ' test_expect_success 'mailinfo on from header without name works' ' mkdir info-from && - git mailsplit -oinfo-from "$TEST_DIRECTORY"/t5100/info-from.in && - test_cmp "$TEST_DIRECTORY"/t5100/info-from.in info-from/0001 && + git mailsplit -oinfo-from "$DATA/info-from.in" && + test_cmp "$DATA/info-from.in" info-from/0001 && git mailinfo info-from/msg info-from/patch \ <info-from/0001 >info-from/out && - test_cmp "$TEST_DIRECTORY"/t5100/info-from.expect info-from/out + test_cmp "$DATA/info-from.expect" info-from/out ' test_expect_success 'mailinfo finds headers after embedded From line' ' mkdir embed-from && - git mailsplit -oembed-from "$TEST_DIRECTORY"/t5100/embed-from.in && - test_cmp "$TEST_DIRECTORY"/t5100/embed-from.in embed-from/0001 && + git mailsplit -oembed-from "$DATA/embed-from.in" && + test_cmp "$DATA/embed-from.in" embed-from/0001 && git mailinfo embed-from/msg embed-from/patch \ <embed-from/0001 >embed-from/out && - test_cmp "$TEST_DIRECTORY"/t5100/embed-from.expect embed-from/out + test_cmp "$DATA/embed-from.expect" embed-from/out ' test_expect_success 'mailinfo on message with quoted >From' ' mkdir quoted-from && - git mailsplit -oquoted-from "$TEST_DIRECTORY"/t5100/quoted-from.in && - test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.in quoted-from/0001 && + git mailsplit -oquoted-from "$DATA/quoted-from.in" && + test_cmp "$DATA/quoted-from.in" quoted-from/0001 && git mailinfo quoted-from/msg quoted-from/patch \ <quoted-from/0001 >quoted-from/out && - test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.expect quoted-from/msg + test_cmp "$DATA/quoted-from.expect" quoted-from/msg ' test_expect_success 'mailinfo unescapes with --mboxrd' ' mkdir mboxrd && git mailsplit -omboxrd --mboxrd \ - "$TEST_DIRECTORY"/t5100/sample.mboxrd >last && + "$DATA/sample.mboxrd" >last && test x"$(cat last)" = x2 && for i in 0001 0002 do git mailinfo mboxrd/msg mboxrd/patch \ <mboxrd/$i >mboxrd/out && - test_cmp "$TEST_DIRECTORY"/t5100/${i}mboxrd mboxrd/msg + test_cmp "$DATA/${i}mboxrd" mboxrd/msg done && sp=" " && echo "From " >expect && @@ -142,4 +144,18 @@ test_expect_success 'mailinfo unescapes with --mboxrd' ' test_cmp expect mboxrd/msg ' +test_expect_success 'mailinfo handles rfc2822 quoted-string' ' + mkdir quoted-string && + git mailinfo /dev/null /dev/null <"$DATA/quoted-string.in" \ + >quoted-string/info && + test_cmp "$DATA/quoted-string.expect" quoted-string/info +' + +test_expect_success 'mailinfo handles rfc2822 comment' ' + mkdir comment && + git mailinfo /dev/null /dev/null <"$DATA/comment.in" \ + >comment/info && + test_cmp "$DATA/comment.expect" comment/info +' + test_done diff --git a/t/t5100/comment.expect b/t/t5100/comment.expect new file mode 100644 index 0000000000..7228177984 --- /dev/null +++ b/t/t5100/comment.expect @@ -0,0 +1,5 @@ +Author: A U Thor (this is (really) a comment (honestly)) +Email: somebody@example.com +Subject: testing comments +Date: Sun, 25 May 2008 00:38:18 -0700 + diff --git a/t/t5100/comment.in b/t/t5100/comment.in new file mode 100644 index 0000000000..c53a192dfe --- /dev/null +++ b/t/t5100/comment.in @@ -0,0 +1,9 @@ +From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001 +From: "A U Thor" <somebody@example.com> (this is \(really\) a comment (honestly)) +Date: Sun, 25 May 2008 00:38:18 -0700 +Subject: [PATCH] testing comments + + + +--- +patch diff --git a/t/t5100/quoted-string.expect b/t/t5100/quoted-string.expect new file mode 100644 index 0000000000..cab1bcebf9 --- /dev/null +++ b/t/t5100/quoted-string.expect @@ -0,0 +1,5 @@ +Author: Author "The Author" Name +Email: somebody@example.com +Subject: testing quoted-pair +Date: Sun, 25 May 2008 00:38:18 -0700 + diff --git a/t/t5100/quoted-string.in b/t/t5100/quoted-string.in new file mode 100644 index 0000000000..e2e627ae23 --- /dev/null +++ b/t/t5100/quoted-string.in @@ -0,0 +1,9 @@ +From 1234567890123456789012345678901234567890 Mon Sep 17 00:00:00 2001 +From: "Author \"The Author\" Name" <somebody@example.com> +Date: Sun, 25 May 2008 00:38:18 -0700 +Subject: [PATCH] testing quoted-pair + + + +--- +patch diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh index f314ad5079..a5eca210b8 100755 --- a/t/t5305-include-tag.sh +++ b/t/t5305-include-tag.sh @@ -25,58 +25,94 @@ test_expect_success setup ' } >obj-list ' -rm -rf clone.git test_expect_success 'pack without --include-tag' ' - packname_1=$(git pack-objects \ + packname=$(git pack-objects \ --window=0 \ - test-1 <obj-list) + test-no-include <obj-list) ' test_expect_success 'unpack objects' ' - ( - GIT_DIR=clone.git && - export GIT_DIR && - git init && - git unpack-objects -n <test-1-${packname_1}.pack && - git unpack-objects <test-1-${packname_1}.pack - ) + rm -rf clone.git && + git init clone.git && + git -C clone.git unpack-objects <test-no-include-${packname}.pack ' test_expect_success 'check unpacked result (have commit, no tag)' ' git rev-list --objects $commit >list.expect && - ( - test_must_fail env GIT_DIR=clone.git git cat-file -e $tag && - git rev-list --objects $commit - ) >list.actual && + test_must_fail git -C clone.git cat-file -e $tag && + git -C clone.git rev-list --objects $commit >list.actual && test_cmp list.expect list.actual ' -rm -rf clone.git test_expect_success 'pack with --include-tag' ' - packname_1=$(git pack-objects \ + packname=$(git pack-objects \ --window=0 \ --include-tag \ - test-2 <obj-list) + test-include <obj-list) ' test_expect_success 'unpack objects' ' - ( - GIT_DIR=clone.git && - export GIT_DIR && - git init && - git unpack-objects -n <test-2-${packname_1}.pack && - git unpack-objects <test-2-${packname_1}.pack - ) + rm -rf clone.git && + git init clone.git && + git -C clone.git unpack-objects <test-include-${packname}.pack ' test_expect_success 'check unpacked result (have commit, have tag)' ' git rev-list --objects mytag >list.expect && - ( - GIT_DIR=clone.git && - export GIT_DIR && - git rev-list --objects $tag - ) >list.actual && + git -C clone.git rev-list --objects $tag >list.actual && test_cmp list.expect list.actual ' +# A tag of a tag, where the "inner" tag is not otherwise +# reachable, and a full peel points to a commit reachable from HEAD. +test_expect_success 'create hidden inner tag' ' + test_commit commit && + git tag -m inner inner HEAD && + git tag -m outer outer inner && + git tag -d inner +' + +test_expect_success 'pack explicit outer tag' ' + packname=$( + { + echo HEAD && + echo outer + } | + git pack-objects --revs test-hidden-explicit + ) +' + +test_expect_success 'unpack objects' ' + rm -rf clone.git && + git init clone.git && + git -C clone.git unpack-objects <test-hidden-explicit-${packname}.pack +' + +test_expect_success 'check unpacked result (have all objects)' ' + git -C clone.git rev-list --objects $(git rev-parse outer HEAD) +' + +test_expect_success 'pack implied outer tag' ' + packname=$( + echo HEAD | + git pack-objects --revs --include-tag test-hidden-implied + ) +' + +test_expect_success 'unpack objects' ' + rm -rf clone.git && + git init clone.git && + git -C clone.git unpack-objects <test-hidden-implied-${packname}.pack +' + +test_expect_success 'check unpacked result (have all objects)' ' + git -C clone.git rev-list --objects $(git rev-parse outer HEAD) +' + +test_expect_success 'single-branch clone can transfer tag' ' + rm -rf clone.git && + git clone --no-local --single-branch -b master . clone.git && + git -C clone.git fsck +' + test_done diff --git a/t/t5526-fetch-submodules.sh b/t/t5526-fetch-submodules.sh index 954d0e43f5..f3b0a8d30a 100755 --- a/t/t5526-fetch-submodules.sh +++ b/t/t5526-fetch-submodules.sh @@ -485,4 +485,39 @@ test_expect_success 'fetching submodules respects parallel settings' ' ) ' +test_expect_success 'fetching submodule into a broken repository' ' + # Prepare src and src/sub nested in it + git init src && + ( + cd src && + git init sub && + git -C sub commit --allow-empty -m "initial in sub" && + git submodule add -- ./sub sub && + git commit -m "initial in top" + ) && + + # Clone the old-fashoned way + git clone src dst && + git -C dst clone ../src/sub sub && + + # Make sure that old-fashoned layout is still supported + git -C dst status && + + # "diff" would find no change + git -C dst diff --exit-code && + + # Recursive-fetch works fine + git -C dst fetch --recurse-submodules && + + # Break the receiving submodule + rm -f dst/sub/.git/HEAD && + + # NOTE: without the fix the following tests will recurse forever! + # They should terminate with an error. + + test_must_fail git -C dst status && + test_must_fail git -C dst diff && + test_must_fail git -C dst fetch --recurse-submodules +' + test_done diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh index 4840c71f02..d38bf32470 100755 --- a/t/t5541-http-push-smart.sh +++ b/t/t5541-http-push-smart.sh @@ -74,7 +74,7 @@ test_expect_success 'push to remote repository (standard)' ' test_tick && git commit -m path2 && HEAD=$(git rev-parse --verify HEAD) && - GIT_CURL_VERBOSE=1 git push -v -v 2>err && + GIT_TRACE_CURL=true git push -v -v 2>err && ! grep "Expect: 100-continue" err && grep "POST git-receive-pack ([0-9]* bytes)" err && (cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git && diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh index 3484b6f0f3..7641417b4a 100755 --- a/t/t5550-http-fetch-dumb.sh +++ b/t/t5550-http-fetch-dumb.sh @@ -263,15 +263,15 @@ check_language () { >expect ;; ?*) - echo "Accept-Language: $1" >expect + echo "=> Send header: Accept-Language: $1" >expect ;; esac && - GIT_CURL_VERBOSE=1 \ + GIT_TRACE_CURL=true \ LANGUAGE=$2 \ git ls-remote "$HTTPD_URL/dumb/repo.git" >output 2>&1 && tr -d '\015' <output | sort -u | - sed -ne '/^Accept-Language:/ p' >actual && + sed -ne '/^=> Send header: Accept-Language:/ p' >actual && test_cmp expect actual } @@ -295,8 +295,16 @@ ja;q=0.95, zh;q=0.94, sv;q=0.93, pt;q=0.92, nb;q=0.91, *;q=0.90" \ ' test_expect_success 'git client does not send an empty Accept-Language' ' - GIT_CURL_VERBOSE=1 LANGUAGE= git ls-remote "$HTTPD_URL/dumb/repo.git" 2>stderr && - ! grep "^Accept-Language:" stderr + GIT_TRACE_CURL=true LANGUAGE= git ls-remote "$HTTPD_URL/dumb/repo.git" 2>stderr && + ! grep "^=> Send header: Accept-Language:" stderr +' + +test_expect_success 'remote-http complains cleanly about malformed urls' ' + # do not actually issue "list" or other commands, as we do not + # want to rely on what curl would actually do with such a broken + # URL. This is just about making sure we do not segfault during + # initialization. + test_must_fail git remote-http http::/example.com/repo.git ' stop_httpd diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh index 2f375eb94d..1ec5b2747a 100755 --- a/t/t5551-http-fetch-smart.sh +++ b/t/t5551-http-fetch-smart.sh @@ -43,12 +43,21 @@ cat >exp <<EOF < Content-Type: application/x-git-upload-pack-result EOF test_expect_success 'clone http repository' ' - GIT_CURL_VERBOSE=1 git clone --quiet $HTTPD_URL/smart/repo.git clone 2>err && + GIT_TRACE_CURL=true git clone --quiet $HTTPD_URL/smart/repo.git clone 2>err && test_cmp file clone/file && tr '\''\015'\'' Q <err | sed -e " s/Q\$// /^[*] /d + /^== Info:/d + /^=> Send header, /d + /^=> Send header:$/d + /^<= Recv header, /d + /^<= Recv header:$/d + s/=> Send header: // + s/= Recv header:// + /^<= Recv data/d + /^=> Send data/d /^$/d /^< $/d @@ -261,9 +270,9 @@ test_expect_success CMDLINE_LIMIT \ ' test_expect_success 'large fetch-pack requests can be split across POSTs' ' - GIT_CURL_VERBOSE=1 git -c http.postbuffer=65536 \ + GIT_TRACE_CURL=true git -c http.postbuffer=65536 \ clone --bare "$HTTPD_URL/smart/repo.git" split.git 2>err && - grep "^> POST" err >posts && + grep "^=> Send header: POST" err >posts && test_line_count = 2 posts ' diff --git a/t/t6026-merge-attr.sh b/t/t6026-merge-attr.sh index dd8f88d187..7a6e33e673 100755 --- a/t/t6026-merge-attr.sh +++ b/t/t6026-merge-attr.sh @@ -185,7 +185,9 @@ test_expect_success 'custom merge does not lock index' ' git reset --hard anchor && write_script sleep-one-second.sh <<-\EOF && sleep 1 & + echo $! >sleep.pid EOF + test_when_finished "kill \$(cat sleep.pid)" && test_write_lines >.gitattributes \ "* merge=ours" "text merge=sleep-one-second" && diff --git a/t/t7517-per-repo-email.sh b/t/t7517-per-repo-email.sh index 337e6e30c3..2a22fa7588 100755 --- a/t/t7517-per-repo-email.sh +++ b/t/t7517-per-repo-email.sh @@ -36,4 +36,51 @@ test_expect_success 'succeeds cloning if global email is not set' ' git clone . clone ' +test_expect_success 'set up rebase scenarios' ' + # temporarily enable an actual ident for this setup + test_config user.email foo@example.com && + test_commit new && + git branch side-without-commit HEAD^ && + git checkout -b side-with-commit HEAD^ && + test_commit side +' + +test_expect_success 'fast-forward rebase does not care about ident' ' + git checkout -B tmp side-without-commit && + git rebase master +' + +test_expect_success 'non-fast-forward rebase refuses to write commits' ' + test_when_finished "git rebase --abort || true" && + git checkout -B tmp side-with-commit && + test_must_fail git rebase master +' + +test_expect_success 'fast-forward rebase does not care about ident (interactive)' ' + git checkout -B tmp side-without-commit && + git rebase -i master +' + +test_expect_success 'non-fast-forward rebase refuses to write commits (interactive)' ' + test_when_finished "git rebase --abort || true" && + git checkout -B tmp side-with-commit && + test_must_fail git rebase -i master +' + +test_expect_success 'noop interactive rebase does not care about ident' ' + git checkout -B tmp side-with-commit && + git rebase -i HEAD^ +' + +test_expect_success 'fast-forward rebase does not care about ident (preserve)' ' + git checkout -B tmp side-without-commit && + git rebase -p master +' + +test_expect_success 'non-fast-forward rebase refuses to write commits (preserve)' ' + test_when_finished "git rebase --abort || true" && + git checkout -B tmp side-with-commit && + test_must_fail git rebase -p master +' + test_done diff --git a/t/t9903-bash-prompt.sh b/t/t9903-bash-prompt.sh index 0db4469c89..97c9b32c2e 100755 --- a/t/t9903-bash-prompt.sh +++ b/t/t9903-bash-prompt.sh @@ -177,7 +177,7 @@ test_expect_success 'prompt - interactive rebase' ' git checkout b1 && test_when_finished "git checkout master" && git rebase -i HEAD^ && - test_when_finished "git rebase --abort" + test_when_finished "git rebase --abort" && __git_ps1 >"$actual" && test_cmp expected "$actual" ' diff --git a/t/test-lib.sh b/t/test-lib.sh index d731d66e36..ac56512a1c 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -89,6 +89,7 @@ unset VISUAL EMAIL LANGUAGE COLUMNS $("$PERL_PATH" -e ' UNZIP PERF_ CURL_VERBOSE + TRACE_CURL )); my @vars = grep(/^GIT_/ && !/^GIT_($ok)/o, @env); print join("\n", @vars); @@ -687,9 +688,9 @@ test_done () { test_results_dir="$TEST_OUTPUT_DIRECTORY/test-results" mkdir -p "$test_results_dir" base=${0##*/} - test_results_path="$test_results_dir/${base%.sh}-$$.counts" + test_results_path="$test_results_dir/${base%.sh}.counts" - cat >>"$test_results_path" <<-EOF + cat >"$test_results_path" <<-EOF total $test_count success $test_success fixed $test_fixed diff --git a/transport.c b/transport.c index cf8de6e888..94d6dc3725 100644 --- a/transport.c +++ b/transport.c @@ -771,7 +771,7 @@ static void die_with_unpushed_submodules(struct string_list *needs_pushing) fprintf(stderr, _("The following submodule paths contain changes that can\n" "not be found on any remote:\n")); for (i = 0; i < needs_pushing->nr; i++) - printf(" %s\n", needs_pushing->items[i].string); + fprintf(stderr, " %s\n", needs_pushing->items[i].string); fprintf(stderr, _("\nPlease try\n\n" " git push --recurse-submodules=on-demand\n\n" "or cd to the path and use\n\n" diff --git a/unpack-trees.c b/unpack-trees.c index 11c37fbc58..2a963f9a7f 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -123,9 +123,9 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts, msgs[ERROR_SPARSE_NOT_UPTODATE_FILE] = _("Cannot update sparse checkout: the following entries are not up-to-date:\n%s"); msgs[ERROR_WOULD_LOSE_ORPHANED_OVERWRITTEN] = - _("The following Working tree files would be overwritten by sparse checkout update:\n%s"); + _("The following working tree files would be overwritten by sparse checkout update:\n%s"); msgs[ERROR_WOULD_LOSE_ORPHANED_REMOVED] = - _("The following Working tree files would be removed by sparse checkout update:\n%s"); + _("The following working tree files would be removed by sparse checkout update:\n%s"); opts->show_all_errors = 1; /* rejected paths may not have a static buffer */ @@ -218,8 +218,8 @@ static void unlink_entry(const struct cache_entry *ce) schedule_dir_for_removal(ce->name, ce_namelen(ce)); } -static struct checkout state; -static int check_updates(struct unpack_trees_options *o) +static int check_updates(struct unpack_trees_options *o, + const struct checkout *state) { unsigned cnt = 0, total = 0; struct progress *progress = NULL; @@ -264,7 +264,7 @@ static int check_updates(struct unpack_trees_options *o) display_progress(progress, ++cnt); ce->ce_flags &= ~CE_UPDATE; if (o->update && !o->dry_run) { - errs |= checkout_entry(ce, &state, NULL); + errs |= checkout_entry(ce, state, NULL); } } } @@ -1094,6 +1094,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options int i, ret; static struct cache_entry *dfc; struct exclude_list el; + struct checkout state; if (len > MAX_UNPACK_TREES) die("unpack_trees takes at most %d trees", MAX_UNPACK_TREES); @@ -1239,7 +1240,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options } o->src_index = NULL; - ret = check_updates(o) ? (-2) : 0; + ret = check_updates(o, &state) ? (-2) : 0; if (o->dst_index) { if (!ret) { if (!o->result.cache_tree) @@ -29,25 +29,6 @@ int is_url(const char *url) return (url[0] == ':' && url[1] == '/' && url[2] == '/'); } -static int url_decode_char(const char *q) -{ - int i; - unsigned char val = 0; - for (i = 0; i < 2; i++) { - unsigned char c = *q++; - val <<= 4; - if (c >= '0' && c <= '9') - val += c - '0'; - else if (c >= 'a' && c <= 'f') - val += c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - val += c - 'A' + 10; - else - return -1; - } - return val; -} - static char *url_decode_internal(const char **query, int len, const char *stop_at, struct strbuf *out, int decode_plus) @@ -66,7 +47,7 @@ static char *url_decode_internal(const char **query, int len, } if (c == '%') { - int val = url_decode_char(q + 1); + int val = hex2chr(q + 1); if (0 <= val) { strbuf_addch(out, val); q += 3; @@ -148,6 +148,7 @@ void NORETURN die_errno(const char *fmt, ...) va_end(params); } +#undef error_errno int error_errno(const char *fmt, ...) { char buf[1024]; diff --git a/vcs-svn/fast_export.c b/vcs-svn/fast_export.c index bd0f2c2b86..97cba39cdf 100644 --- a/vcs-svn/fast_export.c +++ b/vcs-svn/fast_export.c @@ -73,7 +73,7 @@ void fast_export_begin_note(uint32_t revision, const char *author, static int firstnote = 1; size_t loglen = strlen(log); printf("commit %s\n", note_ref); - printf("committer %s <%s@%s> %ld +0000\n", author, author, "local", timestamp); + printf("committer %s <%s@%s> %lu +0000\n", author, author, "local", timestamp); printf("data %"PRIuMAX"\n", (uintmax_t)loglen); fwrite(log, loglen, 1, stdout); if (firstnote) { @@ -107,7 +107,7 @@ void fast_export_begin_commit(uint32_t revision, const char *author, } printf("commit %s\n", local_ref); printf("mark :%"PRIu32"\n", revision); - printf("committer %s <%s@%s> %ld +0000\n", + printf("committer %s <%s@%s> %lu +0000\n", *author ? author : "nobody", *author ? author : "nobody", *uuid ? uuid : "local", timestamp); diff --git a/xdiff-interface.c b/xdiff-interface.c index f34ea762e4..50702a215d 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -214,11 +214,10 @@ struct ff_regs { static long ff_regexp(const char *line, long len, char *buffer, long buffer_size, void *priv) { - char *line_buffer; struct ff_regs *regs = priv; regmatch_t pmatch[2]; int i; - int result = -1; + int result; /* Exclude terminating newline (and cr) from matching */ if (len > 0 && line[len-1] == '\n') { @@ -228,18 +227,16 @@ static long ff_regexp(const char *line, long len, len--; } - line_buffer = xstrndup(line, len); /* make NUL terminated */ - for (i = 0; i < regs->nr; i++) { struct ff_reg *reg = regs->array + i; - if (!regexec(®->re, line_buffer, 2, pmatch, 0)) { + if (!regexec_buf(®->re, line, len, 2, pmatch, 0)) { if (reg->negate) - goto fail; + return -1; break; } } if (regs->nr <= i) - goto fail; + return -1; i = pmatch[1].rm_so >= 0 ? 1 : 0; line += pmatch[i].rm_so; result = pmatch[i].rm_eo - pmatch[i].rm_so; @@ -248,8 +245,6 @@ static long ff_regexp(const char *line, long len, while (result > 0 && (isspace(line[result - 1]))) result--; memcpy(buffer, line, result); - fail: - free(line_buffer); return result; } diff --git a/xdiff/xemit.c b/xdiff/xemit.c index 49aa16ff78..7389ce4102 100644 --- a/xdiff/xemit.c +++ b/xdiff/xemit.c @@ -22,15 +22,6 @@ #include "xinclude.h" - - - -static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec); -static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *ecb); - - - - static long xdl_get_rec(xdfile_t *xdf, long ri, char const **rec) { *rec = xdf->recs[ri]->ptr; @@ -248,7 +239,7 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, if (xche->next) { long l = XDL_MIN(xche->next->i1, xe->xdf1.nrec - 1); - if (l <= e1 || + if (l - xecfg->ctxlen <= e1 || get_func_line(xe, xecfg, NULL, l, e1) < 0) { xche = xche->next; goto post_context_calculation; |