diff options
74 files changed, 5471 insertions, 448 deletions
diff --git a/Documentation/Makefile b/Documentation/Makefile index 36c58fc64..fc6b2cf9e 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -2,6 +2,9 @@ MAN1_TXT = MAN5_TXT = MAN7_TXT = +TECH_DOCS = +ARTICLES = +SP_ARTICLES = MAN1_TXT += $(filter-out \ $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \ @@ -37,12 +40,12 @@ MAN_HTML = $(patsubst %.txt,%.html,$(MAN_TXT)) OBSOLETE_HTML = git-remote-helpers.html DOC_HTML = $(MAN_HTML) $(OBSOLETE_HTML) -ARTICLES = howto-index +ARTICLES += howto-index ARTICLES += everyday ARTICLES += git-tools ARTICLES += git-bisect-lk2009 # with their own formatting rules. -SP_ARTICLES = user-manual +SP_ARTICLES += user-manual SP_ARTICLES += howto/new-command SP_ARTICLES += howto/revert-branch-rebase SP_ARTICLES += howto/using-merge-subtree @@ -60,7 +63,8 @@ SP_ARTICLES += howto/maintain-git API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt))) SP_ARTICLES += $(API_DOCS) -TECH_DOCS = technical/index-format +TECH_DOCS += technical/http-protocol +TECH_DOCS += technical/index-format TECH_DOCS += technical/pack-format TECH_DOCS += technical/pack-heuristics TECH_DOCS += technical/pack-protocol diff --git a/Documentation/RelNotes/1.9.txt b/Documentation/RelNotes/1.9.txt index 7bcf371c5..43c7b682a 100644 --- a/Documentation/RelNotes/1.9.txt +++ b/Documentation/RelNotes/1.9.txt @@ -87,6 +87,8 @@ Foreign interfaces, subsystems and ports. * The build procedure is aware of MirBSD now. + * Various "git p4", "git svn" and "gitk" updates. + UI, Workflows & Features @@ -215,6 +217,50 @@ Unless otherwise noted, all the fixes since v1.8.5 in the maintenance track are contained in this release (see the maintenance releases' notes for details). + * The pathspec matching code, while comparing two trees (e.g. "git + diff A B -- path1 path2") was too agrresive and failed to match + some paths when multiple pathspecs were involved. + (merge e4ddb05 as/tree-walk-fix-aggressive-short-cut later to maint). + + * "git repack --max-pack-size=8g" stopped being parsed correctly when + the command was reimplemented in C. + (merge b861e23 sb/repack-in-c later to maint). + + * An earlier update in v1.8.4.x to "git rev-list --objects" with + negative ref had performance regression. + (merge 200abe7 jk/mark-edges-uninteresting later to maint). + + * A recent update to "git send-email" broke platforms where + /etc/ssl/certs/ directory exists, but it cannot used as SSL_ca_path + (e.g. Fedora rawhide). + (merge 01645b7 rk/send-email-ssl-cert later to maint). + + * A handful of bugs around interpreting $branch@{upstream} notation + and its lookalike, when $branch part has interesting characters, + e.g. "@", and ":", have been fixed. + (merge 9892d5d jk/interpret-branch-name-fix later to maint). + + * "git clone" would fail to clone from a repository that has a ref + directly under "refs/", e.g. "refs/stash", because different + validation paths do different things on such a refname. Loosen the + client side's validation to allow such a ref. + (merge 4c22408 jk/allow-fetch-onelevel-refname later to maint). + + * "git log --left-right A...B" lost the "leftness" of commits + reachable from A when A is a tag as a side effect of a recent + bugfix. This is a regression in 1.8.4.x series. + (merge a743528 jc/revision-range-unpeel later to maint). + + * documentations to "git pull" hinted there is an "-m" option because + it incorrectly shared the documentation with "git merge". + (merge 08f19cf jc/maint-pull-docfix later to maint). + + * "git diff A B submod" and "git diff A B submod/" ought to have done + the same for a submodule "submod", but didn't. + + * "git clone $origin foo\bar\baz" on Windows failed to create the + leading directories (i.e. a moral-equivalent of "mkdir -p"). + * "submodule.*.update=checkout", when propagated from .gitmodules to .git/config, turned into a "submodule.*.update=none", which did not make much sense. diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 91294f89c..33ad2adf5 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -232,8 +232,8 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode. commit, your HEAD becomes "detached" and you are no longer on any branch (see below for details). + -As a special case, the `"@{-N}"` syntax for the N-th last branch -checks out the branch (instead of detaching). You may also specify +As a special case, the `"@{-N}"` syntax for the N-th last branch/commit +checks out branches (instead of detaching). You may also specify `-` which is synonymous with `"@{-1}"`. + As a further special case, you may use `"A...B"` as a shortcut for the diff --git a/Documentation/git-column.txt b/Documentation/git-column.txt index 5d6f1cc46..03d18465d 100644 --- a/Documentation/git-column.txt +++ b/Documentation/git-column.txt @@ -43,11 +43,6 @@ OPTIONS --padding=<N>:: The number of spaces between columns. One space by default. - -Author ------- -Written by Nguyen Thai Ngoc Duy <pclouds@gmail.com> - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index 94f5c465d..42408752d 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -219,13 +219,9 @@ eval=`git for-each-ref --shell --format="$fmt" \ eval "$eval" ------------ -Author ------- -Written by Junio C Hamano <gitster@pobox.com>. - -Documentation -------------- -Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. +SEE ALSO +-------- +linkgit:git-show-ref[1] GIT --- diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.txt index e3bcdb50e..e8c13f60a 100644 --- a/Documentation/git-http-backend.txt +++ b/Documentation/git-http-backend.txt @@ -263,14 +263,6 @@ identifying information of the remote user who performed the push. All CGI environment variables are available to each of the hooks invoked by the 'git-receive-pack'. -Author ------- -Written by Shawn O. Pearce <spearce@spearce.org>. - -Documentation --------------- -Documentation by Shawn O. Pearce <spearce@spearce.org>. - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt index 46ef0466b..84bb0fecb 100644 --- a/Documentation/git-notes.txt +++ b/Documentation/git-notes.txt @@ -375,16 +375,6 @@ does not match any refs is silently ignored. If not set in the environment, the list of notes to copy depends on the `notes.rewrite.<command>` and `notes.rewriteRef` settings. - -Author ------- -Written by Johannes Schindelin <johannes.schindelin@gmx.de> and -Johan Herland <johan@herland.net> - -Documentation -------------- -Documentation by Johannes Schindelin and Johan Herland - GIT --- Part of the linkgit:git[7] suite diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index 8cba16d67..6ab5f9497 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -168,7 +168,8 @@ All commands except clone accept these options. --git-dir <dir>:: Set the 'GIT_DIR' environment variable. See linkgit:git[1]. ---verbose, -v:: +-v:: +--verbose:: Provide more progress information. Sync options @@ -279,7 +280,8 @@ These options can be used to modify 'git p4 submit' behavior. Export tags from Git as p4 labels. Tags found in Git are applied to the perforce working directory. ---dry-run, -n:: +-n:: +--dry-run:: Show just what commits would be submitted to p4; do not change state in Git or p4. diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index 6083aab87..200eb2226 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -99,10 +99,10 @@ must be given before the options meant for 'git fetch'. Options related to merging ~~~~~~~~~~~~~~~~~~~~~~~~~~ -include::merge-options.txt[] - :git-pull: 1 +include::merge-options.txt[] + -r:: --rebase[=false|true|preserve]:: When true, rebase the current branch on top of the upstream diff --git a/Documentation/git-remote-ext.txt b/Documentation/git-remote-ext.txt index 8cfc748ae..cd0bb77e4 100644 --- a/Documentation/git-remote-ext.txt +++ b/Documentation/git-remote-ext.txt @@ -116,11 +116,6 @@ begins with `ext::`. Examples: determined by the helper using environment variables (see above). -Documentation --------------- -Documentation by Ilari Liusvaara, Jonathan Nieder and the Git list -<git@vger.kernel.org> - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-remote-fd.txt b/Documentation/git-remote-fd.txt index 933c2adaf..bcd37668e 100644 --- a/Documentation/git-remote-fd.txt +++ b/Documentation/git-remote-fd.txt @@ -50,10 +50,6 @@ EXAMPLES `git push fd::7,8/bar master`:: Same as above. -Documentation --------------- -Documentation by Ilari Liusvaara and the Git list <git@vger.kernel.org> - GIT --- Part of the linkgit:git[1] suite diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt index b0a309b11..ffd1b03a9 100644 --- a/Documentation/git-show-ref.txt +++ b/Documentation/git-show-ref.txt @@ -175,6 +175,7 @@ FILES SEE ALSO -------- +linkgit:git-for-each-ref[1], linkgit:git-ls-remote[1], linkgit:git-update-ref[1], linkgit:gitrepository-layout[5] diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index b322a2666..643c1ba92 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -930,9 +930,12 @@ state. DEFINING MACRO ATTRIBUTES ------------------------- -Custom macro attributes can be defined only in the `.gitattributes` -file at the toplevel (i.e. not in any subdirectory). The built-in -macro attribute "binary" is equivalent to: +Custom macro attributes can be defined only in top-level gitattributes +files (`$GIT_DIR/info/attributes`, the `.gitattributes` file at the +top level of the working tree, or the global or system-wide +gitattributes files), not in `.gitattributes` files in working tree +subdirectories. The built-in macro attribute "binary" is equivalent +to: ------------ [attr]binary -diff -merge -text diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 205e80ef8..b08d34d84 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -7,7 +7,7 @@ gitignore - Specifies intentionally untracked files to ignore SYNOPSIS -------- -$GIT_DIR/info/exclude, .gitignore +$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore DESCRIPTION ----------- diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt index d44e14c13..1e9e38ae4 100644 --- a/Documentation/gitk.txt +++ b/Documentation/gitk.txt @@ -98,6 +98,22 @@ linkgit:git-rev-list[1] for a complete list. (See "History simplification" in linkgit:git-log[1] for a more detailed explanation.) +-L<start>,<end>:<file>:: +-L:<regex>:<file>:: + + Trace the evolution of the line range given by "<start>,<end>" + (or the funcname regex <regex>) within the <file>. You may + not give any pathspec limiters. This is currently limited to + a walk starting from a single revision, i.e., you may only + give zero or one positive revision arguments. + You can specify this option more than once. ++ +*Note:* gitk (unlike linkgit:git-log[1]) currently only understands +this option if you specify it "glued together" with its argument. Do +*not* put a space after `-L`. ++ +include::line-range-format.txt[] + <revision range>:: Limit the revisions to show. This can be either a single revision diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt index afba8d4f3..e1343155f 100644 --- a/Documentation/merge-options.txt +++ b/Documentation/merge-options.txt @@ -14,9 +14,12 @@ inspect and further tweak the merge result before committing. further edit the auto-generated merge message, so that the user can explain and justify the merge. The `--no-edit` option can be used to accept the auto-generated message (this is generally - discouraged). The `--edit` (or `-e`) option is still useful if you are - giving a draft message with the `-m` option from the command line - and want to edit it in the editor. + discouraged). +ifndef::git-pull[] +The `--edit` (or `-e`) option is still useful if you are +giving a draft message with the `-m` option from the command line +and want to edit it in the editor. +endif::git-pull[] + Older scripts may depend on the historical behaviour of not allowing the user to edit the merge log message. They will see an editor opened when diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt index 2c06ed34a..5a286d0d6 100644 --- a/Documentation/revisions.txt +++ b/Documentation/revisions.txt @@ -88,7 +88,7 @@ some output processing may assume ref names in UTF-8. branch 'blabla' then '@\{1\}' means the same as 'blabla@\{1\}'. '@\{-<n>\}', e.g. '@\{-1\}':: - The construct '@\{-<n>\}' means the <n>th branch checked out + The construct '@\{-<n>\}' means the <n>th branch/commit checked out before the current one. '<branchname>@\{upstream\}', e.g. 'master@\{upstream\}', '@\{u\}':: diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt index d21d77d1d..544373b16 100644 --- a/Documentation/technical/http-protocol.txt +++ b/Documentation/technical/http-protocol.txt @@ -20,13 +20,13 @@ URL syntax documented by RFC 1738, so they are of the form: http://<host>:<port>/<path>?<searchpart> -Within this documentation the placeholder $GIT_URL will stand for +Within this documentation the placeholder `$GIT_URL` will stand for the http:// repository URL entered by the end-user. -Servers SHOULD handle all requests to locations matching $GIT_URL, as +Servers SHOULD handle all requests to locations matching `$GIT_URL`, as both the "smart" and "dumb" HTTP protocols used by Git operate by appending additional path components onto the end of the user -supplied $GIT_URL string. +supplied `$GIT_URL` string. An example of a dumb client requesting for a loose object: @@ -43,10 +43,10 @@ An example of a request to a submodule: $GIT_URL: http://example.com/git/repo.git/path/submodule.git URL request: http://example.com/git/repo.git/path/submodule.git/info/refs -Clients MUST strip a trailing '/', if present, from the user supplied -$GIT_URL string to prevent empty path tokens ('//') from appearing +Clients MUST strip a trailing `/`, if present, from the user supplied +`$GIT_URL` string to prevent empty path tokens (`//`) from appearing in any URL sent to a server. Compatible clients MUST expand -'$GIT_URL/info/refs' as 'foo/info/refs' and not 'foo//info/refs'. +`$GIT_URL/info/refs` as `foo/info/refs` and not `foo//info/refs`. Authentication @@ -103,14 +103,14 @@ Except where noted, all standard HTTP behavior SHOULD be assumed by both client and server. This includes (but is not necessarily limited to): -If there is no repository at $GIT_URL, or the resource pointed to by a -location matching $GIT_URL does not exist, the server MUST NOT respond -with '200 OK' response. A server SHOULD respond with -'404 Not Found', '410 Gone', or any other suitable HTTP status code +If there is no repository at `$GIT_URL`, or the resource pointed to by a +location matching `$GIT_URL` does not exist, the server MUST NOT respond +with `200 OK` response. A server SHOULD respond with +`404 Not Found`, `410 Gone`, or any other suitable HTTP status code which does not imply the resource exists as requested. -If there is a repository at $GIT_URL, but access is not currently -permitted, the server MUST respond with the '403 Forbidden' HTTP +If there is a repository at `$GIT_URL`, but access is not currently +permitted, the server MUST respond with the `403 Forbidden` HTTP status code. Servers SHOULD support both HTTP 1.0 and HTTP 1.1. @@ -126,9 +126,9 @@ Servers MAY return ETag and/or Last-Modified headers. Clients MAY revalidate cached entities by including If-Modified-Since and/or If-None-Match request headers. -Servers MAY return '304 Not Modified' if the relevant headers appear +Servers MAY return `304 Not Modified` if the relevant headers appear in the request and the entity has not changed. Clients MUST treat -'304 Not Modified' identical to '200 OK' by reusing the cached entity. +`304 Not Modified` identical to `200 OK` by reusing the cached entity. Clients MAY reuse a cached entity without revalidation if the Cache-Control and/or Expires header permits caching. Clients and @@ -148,7 +148,7 @@ HTTP clients that only support the "dumb" protocol MUST discover references by making a request for the special info/refs file of the repository. -Dumb HTTP clients MUST make a GET request to $GIT_URL/info/refs, +Dumb HTTP clients MUST make a `GET` request to `$GIT_URL/info/refs`, without any search/query parameters. C: GET $GIT_URL/info/refs HTTP/1.0 @@ -161,21 +161,21 @@ without any search/query parameters. S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{} The Content-Type of the returned info/refs entity SHOULD be -"text/plain; charset=utf-8", but MAY be any content type. +`text/plain; charset=utf-8`, but MAY be any content type. Clients MUST NOT attempt to validate the returned Content-Type. Dumb servers MUST NOT return a return type starting with -"application/x-git-". +`application/x-git-`. Cache-Control headers MAY be returned to disable caching of the returned entity. When examining the response clients SHOULD only examine the HTTP -status code. Valid responses are '200 OK', or '304 Not Modified'. +status code. Valid responses are `200 OK`, or `304 Not Modified`. The returned content is a UNIX formatted text file describing each ref and its known value. The file SHOULD be sorted by name according to the C locale ordering. The file SHOULD NOT include -the default ref named 'HEAD'. +the default ref named `HEAD`. info_refs = *( ref_record ) ref_record = any_ref / peeled_ref @@ -192,13 +192,14 @@ HTTP clients that support the "smart" protocol (or both the a parameterized request for the info/refs file of the repository. The request MUST contain exactly one query parameter, -'service=$servicename', where $servicename MUST be the service +`service=$servicename`, where `$servicename` MUST be the service name the client wishes to contact to complete the operation. The request MUST NOT contain additional query parameters. C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0 - dumb server reply: +dumb server reply: + S: 200 OK S: S: 95dcfa3633004da0049d3d0fa03f80589cbcaf31 refs/heads/maint @@ -206,7 +207,8 @@ The request MUST NOT contain additional query parameters. S: 2cb58b79488a98d2721cea644875a8dd0026b115 refs/tags/v1.0 S: a3c2e2402b99163d1d59756e5f207ae21cccba4c refs/tags/v1.0^{} - smart server reply: +smart server reply: + S: 200 OK S: Content-Type: application/x-git-upload-pack-advertisement S: Cache-Control: no-cache @@ -228,7 +230,7 @@ Smart Server Response ^^^^^^^^^^^^^^^^^^^^^ If the server does not recognize the requested service name, or the requested service name has been disabled by the server administrator, -the server MUST respond with the '403 Forbidden' HTTP status code. +the server MUST respond with the `403 Forbidden` HTTP status code. Otherwise, smart servers MUST respond with the smart server reply format for the requested service name. @@ -236,35 +238,35 @@ format for the requested service name. Cache-Control headers SHOULD be used to disable caching of the returned entity. -The Content-Type MUST be 'application/x-$servicename-advertisement'. +The Content-Type MUST be `application/x-$servicename-advertisement`. Clients SHOULD fall back to the dumb protocol if another content type is returned. When falling back to the dumb protocol clients -SHOULD NOT make an additional request to $GIT_URL/info/refs, but +SHOULD NOT make an additional request to `$GIT_URL/info/refs`, but instead SHOULD use the response already in hand. Clients MUST NOT continue if they do not support the dumb protocol. -Clients MUST validate the status code is either '200 OK' or -'304 Not Modified'. +Clients MUST validate the status code is either `200 OK` or +`304 Not Modified`. Clients MUST validate the first five bytes of the response entity -matches the regex "^[0-9a-f]{4}#". If this test fails, clients +matches the regex `^[0-9a-f]{4}#`. If this test fails, clients MUST NOT continue. Clients MUST parse the entire response as a sequence of pkt-line records. -Clients MUST verify the first pkt-line is "# service=$servicename". +Clients MUST verify the first pkt-line is `# service=$servicename`. Servers MUST set $servicename to be the request parameter value. Servers SHOULD include an LF at the end of this line. Clients MUST ignore an LF at the end of the line. -Servers MUST terminate the response with the magic "0000" end +Servers MUST terminate the response with the magic `0000` end pkt-line marker. The returned response is a pkt-line stream describing each ref and its known value. The stream SHOULD be sorted by name according to the C locale ordering. The stream SHOULD include the default ref -named 'HEAD' as the first ref. The stream MUST include capability +named `HEAD` as the first ref. The stream MUST include capability declarations behind a NUL on the first ref. smart_reply = PKT-LINE("# service=$servicename" LF) @@ -286,12 +288,13 @@ declarations behind a NUL on the first ref. peeled_ref = PKT-LINE(obj-id SP name LF) PKT-LINE(obj-id SP name "^{}" LF + Smart Service git-upload-pack ------------------------------ -This service reads from the repository pointed to by $GIT_URL. +This service reads from the repository pointed to by `$GIT_URL`. Clients MUST first perform ref discovery with -'$GIT_URL/info/refs?service=git-upload-pack'. +`$GIT_URL/info/refs?service=git-upload-pack`. C: POST $GIT_URL/git-upload-pack HTTP/1.0 C: Content-Type: application/x-git-upload-pack-request @@ -313,10 +316,10 @@ to prevent caching of the response. Servers SHOULD support all capabilities defined here. -Clients MUST send at least one 'want' command in the request body. -Clients MUST NOT reference an id in a 'want' command which did not +Clients MUST send at least one "want" command in the request body. +Clients MUST NOT reference an id in a "want" command which did not appear in the response obtained through ref discovery unless the -server advertises capability "allow-tip-sha1-in-want". +server advertises capability `allow-tip-sha1-in-want`. compute_request = want_list have_list @@ -332,128 +335,128 @@ server advertises capability "allow-tip-sha1-in-want". have_list = *PKT-LINE("have" SP id LF) TODO: Document this further. -TODO: Don't use uppercase for variable names below. The Negotiation Algorithm ~~~~~~~~~~~~~~~~~~~~~~~~~ The computation to select the minimal pack proceeds as follows -(c = client, s = server): +(C = client, S = server): + +'init step:' + +C: Use ref discovery to obtain the advertised refs. + +C: Place any object seen into set `advertised`. - init step: - (c) Use ref discovery to obtain the advertised refs. - (c) Place any object seen into set ADVERTISED. +C: Build an empty set, `common`, to hold the objects that are later + determined to be on both ends. - (c) Build an empty set, COMMON, to hold the objects that are later - determined to be on both ends. - (c) Build a set, WANT, of the objects from ADVERTISED the client - wants to fetch, based on what it saw during ref discovery. +C: Build a set, `want`, of the objects from `advertised` the client + wants to fetch, based on what it saw during ref discovery. - (c) Start a queue, C_PENDING, ordered by commit time (popping newest - first). Add all client refs. When a commit is popped from - the queue its parents SHOULD be automatically inserted back. - Commits MUST only enter the queue once. +C: Start a queue, `c_pending`, ordered by commit time (popping newest + first). Add all client refs. When a commit is popped from + the queue its parents SHOULD be automatically inserted back. + Commits MUST only enter the queue once. - one compute step: - (c) Send one $GIT_URL/git-upload-pack request: +'one compute step:' - C: 0032want <WANT #1>............................... - C: 0032want <WANT #2>............................... +C: Send one `$GIT_URL/git-upload-pack` request: + + C: 0032want <want #1>............................... + C: 0032want <want #2>............................... .... - C: 0032have <COMMON #1>............................. - C: 0032have <COMMON #2>............................. + C: 0032have <common #1>............................. + C: 0032have <common #2>............................. .... - C: 0032have <HAVE #1>............................... - C: 0032have <HAVE #2>............................... + C: 0032have <have #1>............................... + C: 0032have <have #2>............................... .... C: 0000 - The stream is organized into "commands", with each command - appearing by itself in a pkt-line. Within a command line - the text leading up to the first space is the command name, - and the remainder of the line to the first LF is the value. - Command lines are terminated with an LF as the last byte of - the pkt-line value. +The stream is organized into "commands", with each command +appearing by itself in a pkt-line. Within a command line +the text leading up to the first space is the command name, +and the remainder of the line to the first LF is the value. +Command lines are terminated with an LF as the last byte of +the pkt-line value. - Commands MUST appear in the following order, if they appear - at all in the request stream: +Commands MUST appear in the following order, if they appear +at all in the request stream: - * want - * have +* "want" +* "have" - The stream is terminated by a pkt-line flush ("0000"). +The stream is terminated by a pkt-line flush (`0000`). - A single "want" or "have" command MUST have one hex formatted - SHA-1 as its value. Multiple SHA-1s MUST be sent by sending - multiple commands. +A single "want" or "have" command MUST have one hex formatted +SHA-1 as its value. Multiple SHA-1s MUST be sent by sending +multiple commands. - The HAVE list is created by popping the first 32 commits - from C_PENDING. Less can be supplied if C_PENDING empties. +The `have` list is created by popping the first 32 commits +from `c_pending`. Less can be supplied if `c_pending` empties. - If the client has sent 256 HAVE commits and has not yet - received one of those back from S_COMMON, or the client has - emptied C_PENDING it SHOULD include a "done" command to let - the server know it won't proceed: +If the client has sent 256 "have" commits and has not yet +received one of those back from `s_common`, or the client has +emptied `c_pending` it SHOULD include a "done" command to let +the server know it won't proceed: C: 0009done - (s) Parse the git-upload-pack request: - - Verify all objects in WANT are directly reachable from refs. - - The server MAY walk backwards through history or through - the reflog to permit slightly stale requests. +S: Parse the git-upload-pack request: - If no WANT objects are received, send an error: +Verify all objects in `want` are directly reachable from refs. -TODO: Define error if no want lines are requested. +The server MAY walk backwards through history or through +the reflog to permit slightly stale requests. - If any WANT object is not reachable, send an error: +If no "want" objects are received, send an error: +TODO: Define error if no "want" lines are requested. -TODO: Define error if an invalid want is requested. +If any "want" object is not reachable, send an error: +TODO: Define error if an invalid "want" is requested. - Create an empty list, S_COMMON. +Create an empty list, `s_common`. - If 'have' was sent: +If "have" was sent: - Loop through the objects in the order supplied by the client. - For each object, if the server has the object reachable from - a ref, add it to S_COMMON. If a commit is added to S_COMMON, - do not add any ancestors, even if they also appear in HAVE. +Loop through the objects in the order supplied by the client. - (s) Send the git-upload-pack response: +For each object, if the server has the object reachable from +a ref, add it to `s_common`. If a commit is added to `s_common`, +do not add any ancestors, even if they also appear in `have`. - If the server has found a closed set of objects to pack or the - request ends with "done", it replies with the pack. +S: Send the git-upload-pack response: +If the server has found a closed set of objects to pack or the +request ends with "done", it replies with the pack. TODO: Document the pack based response - S: PACK... - The returned stream is the side-band-64k protocol supported - by the git-upload-pack service, and the pack is embedded into - stream 1. Progress messages from the server side MAY appear - in stream 2. + S: PACK... - Here a "closed set of objects" is defined to have at least - one path from every WANT to at least one COMMON object. +The returned stream is the side-band-64k protocol supported +by the git-upload-pack service, and the pack is embedded into +stream 1. Progress messages from the server side MAY appear +in stream 2. - If the server needs more information, it replies with a - status continue response: +Here a "closed set of objects" is defined to have at least +one path from every "want" to at least one "common" object. +If the server needs more information, it replies with a +status continue response: TODO: Document the non-pack response - (c) Parse the upload-pack response: - -TODO: Document parsing response +C: Parse the upload-pack response: + TODO: Document parsing response - Do another compute step. +'Do another compute step.' Smart Service git-receive-pack ------------------------------ -This service reads from the repository pointed to by $GIT_URL. +This service reads from the repository pointed to by `$GIT_URL`. Clients MUST first perform ref discovery with -'$GIT_URL/info/refs?service=git-receive-pack'. +`$GIT_URL/info/refs?service=git-receive-pack`. C: POST $GIT_URL/git-receive-pack HTTP/1.0 C: Content-Type: application/x-git-receive-pack-request diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index e66a5abb0..35031650f 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.9-rc0 +DEF_VER=v1.9-rc1 LF=' ' @@ -1773,7 +1773,7 @@ $(SCRIPT_LIB) : % : %.sh GIT-SCRIPT-DEFINES git.res: git.rc GIT-VERSION-FILE $(QUIET_RC)$(RC) \ - $(join -DMAJOR= -DMINOR= -DPATCH=, $(wordlist 1,3,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \ + $(join -DMAJOR= -DMINOR=, $(wordlist 1,2,$(subst -, ,$(subst ., ,$(GIT_VERSION))))) \ -DGIT_VERSION="\\\"$(GIT_VERSION)\\\"" $< -o $@ ifndef NO_PERL @@ -2050,10 +2050,10 @@ git-imap-send$X: imap-send.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO) -git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS) +git-http-fetch$X: http.o http-walker.o http-fetch.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(CURL_LIBCURL) -git-http-push$X: revision.o http.o http-push.o GIT-LDFLAGS $(GITLIBS) +git-http-push$X: http.o http-push.o GIT-LDFLAGS $(GITLIBS) $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) diff --git a/builtin/init-db.c b/builtin/init-db.c index b3f03cf0d..c7c76bbf2 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -515,13 +515,14 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) saved = shared_repository; shared_repository = 0; switch (safe_create_leading_directories_const(argv[0])) { - case -3: + case SCLD_OK: + case SCLD_PERMS: + break; + case SCLD_EXISTS: errno = EEXIST; /* fallthru */ - case -1: - die_errno(_("cannot mkdir %s"), argv[0]); - break; default: + die_errno(_("cannot mkdir %s"), argv[0]); break; } shared_repository = saved; diff --git a/builtin/merge.c b/builtin/merge.c index 4941a6c36..e576a7fdc 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -367,7 +367,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead sha1_to_hex(commit->object.sha1)); pretty_print_commit(&ctx, commit, &out); } - if (write(fd, out.buf, out.len) < 0) + if (write_in_full(fd, out.buf, out.len) != out.len) die_errno(_("Writing SQUASH_MSG")); if (close(fd)) die_errno(_("Finishing SQUASH_MSG")); diff --git a/builtin/repack.c b/builtin/repack.c index ba66c6e37..6284846d8 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -129,10 +129,10 @@ int cmd_repack(int argc, const char **argv, const char *prefix) /* variables to be filled by option parsing */ int pack_everything = 0; int delete_redundant = 0; - char *unpack_unreachable = NULL; - int window = 0, window_memory = 0; - int depth = 0; - int max_pack_size = 0; + const char *unpack_unreachable = NULL; + const char *window = NULL, *window_memory = NULL; + const char *depth = NULL; + const char *max_pack_size = NULL; int no_reuse_delta = 0, no_reuse_object = 0; int no_update_server_info = 0; int quiet = 0; @@ -157,13 +157,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix) N_("pass --local to git-pack-objects")), OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"), N_("with -A, do not loosen objects older than this")), - OPT_INTEGER(0, "window", &window, + OPT_STRING(0, "window", &window, N_("n"), N_("size of the window used for delta compression")), - OPT_INTEGER(0, "window-memory", &window_memory, + OPT_STRING(0, "window-memory", &window_memory, N_("bytes"), N_("same as the above, but limit memory size instead of entries count")), - OPT_INTEGER(0, "depth", &depth, + OPT_STRING(0, "depth", &depth, N_("n"), N_("limits the maximum delta depth")), - OPT_INTEGER(0, "max-pack-size", &max_pack_size, + OPT_STRING(0, "max-pack-size", &max_pack_size, N_("bytes"), N_("maximum size of each packfile")), OPT_END() }; @@ -185,13 +185,13 @@ int cmd_repack(int argc, const char **argv, const char *prefix) argv_array_push(&cmd_args, "--all"); argv_array_push(&cmd_args, "--reflog"); if (window) - argv_array_pushf(&cmd_args, "--window=%u", window); + argv_array_pushf(&cmd_args, "--window=%s", window); if (window_memory) - argv_array_pushf(&cmd_args, "--window-memory=%u", window_memory); + argv_array_pushf(&cmd_args, "--window-memory=%s", window_memory); if (depth) - argv_array_pushf(&cmd_args, "--depth=%u", depth); + argv_array_pushf(&cmd_args, "--depth=%s", depth); if (max_pack_size) - argv_array_pushf(&cmd_args, "--max_pack_size=%u", max_pack_size); + argv_array_pushf(&cmd_args, "--max-pack-size=%s", max_pack_size); if (no_reuse_delta) argv_array_pushf(&cmd_args, "--no-reuse-delta"); if (no_reuse_object) @@ -737,8 +737,29 @@ enum sharedrepo { }; int git_config_perm(const char *var, const char *value); int adjust_shared_perm(const char *path); -int safe_create_leading_directories(char *path); -int safe_create_leading_directories_const(const char *path); + +/* + * Create the directory containing the named path, using care to be + * somewhat safe against races. Return one of the scld_error values + * to indicate success/failure. + * + * SCLD_VANISHED indicates that one of the ancestor directories of the + * path existed at one point during the function call and then + * suddenly vanished, probably because another process pruned the + * directory while we were working. To be robust against this kind of + * race, callers might want to try invoking the function again when it + * returns SCLD_VANISHED. + */ +enum scld_error { + SCLD_OK = 0, + SCLD_FAILED = -1, + SCLD_PERMS = -2, + SCLD_EXISTS = -3, + SCLD_VANISHED = -4 +}; +enum scld_error safe_create_leading_directories(char *path); +enum scld_error safe_create_leading_directories_const(const char *path); + int mkdir_in_gitdir(const char *path); extern void home_config_paths(char **global, char **xdg, char *file); extern char *expand_user_path(const char *path); @@ -894,9 +915,12 @@ extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref); extern int interpret_branch_name(const char *str, int len, struct strbuf *); extern int get_sha1_mb(const char *str, unsigned char *sha1); -extern int refname_match(const char *abbrev_name, const char *full_name, const char **rules); -extern const char *ref_rev_parse_rules[]; -#define ref_fetch_rules ref_rev_parse_rules +/* + * Return true iff abbrev_name is a possible abbreviation for + * full_name according to the rules defined by ref_rev_parse_rules in + * refs.c. + */ +extern int refname_match(const char *abbrev_name, const char *full_name); extern int create_symref(const char *ref, const char *refs_heads_master, const char *logmsg); extern int validate_headref(const char *ref); diff --git a/compat/mingw.c b/compat/mingw.c index fecb98bcf..e9892f8ee 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -304,23 +304,6 @@ int mingw_open (const char *filename, int oflags, ...) return fd; } -#undef write -ssize_t mingw_write(int fd, const void *buf, size_t count) -{ - /* - * While write() calls to a file on a local disk are translated - * into WriteFile() calls with a maximum size of 64KB on Windows - * XP and 256KB on Vista, no such cap is placed on writes to - * files over the network on Windows XP. Unfortunately, there - * seems to be a limit of 32MB-28KB on X64 and 64MB-32KB on x86; - * bigger writes fail on Windows XP. - * So we cap to a nice 31MB here to avoid write failures over - * the net without changing the number of WriteFile() calls in - * the local case. - */ - return write(fd, buf, min(count, 31 * 1024 * 1024)); -} - static BOOL WINAPI ctrl_ignore(DWORD type) { return TRUE; diff --git a/compat/mingw.h b/compat/mingw.h index 92cd728d3..e033e720c 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -180,9 +180,6 @@ int mingw_rmdir(const char *path); int mingw_open (const char *filename, int oflags, ...); #define open mingw_open -ssize_t mingw_write(int fd, const void *buf, size_t count); -#define write mingw_write - int mingw_fgetc(FILE *stream); #define fgetc mingw_fgetc diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 8aaf214b7..9525343fc 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -1499,6 +1499,12 @@ _git_mergetool () _git_merge_base () { + case "$cur" in + --*) + __gitcomp "--octopus --independent --is-ancestor --fork-point" + return + ;; + esac __gitcomp_nl "$(__git_refs)" } @@ -1631,7 +1637,7 @@ _git_rebase () --preserve-merges --stat --no-stat --committer-date-is-author-date --ignore-date --ignore-whitespace --whitespace= - --autosquash + --autosquash --fork-point --no-fork-point " return diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh index 7d7af0327..dc59a9103 100755 --- a/contrib/subtree/git-subtree.sh +++ b/contrib/subtree/git-subtree.sh @@ -9,10 +9,10 @@ if [ $# -eq 0 ]; then fi OPTS_SPEC="\ git subtree add --prefix=<prefix> <commit> -git subtree add --prefix=<prefix> <repository> <commit> +git subtree add --prefix=<prefix> <repository> <ref> git subtree merge --prefix=<prefix> <commit> -git subtree pull --prefix=<prefix> <repository> <refspec...> -git subtree push --prefix=<prefix> <repository> <refspec...> +git subtree pull --prefix=<prefix> <repository> <ref> +git subtree push --prefix=<prefix> <repository> <ref> git subtree split --prefix=<prefix> <commit...> -- h,help show the help @@ -489,6 +489,12 @@ ensure_clean() fi } +ensure_valid_ref_format() +{ + git check-ref-format "refs/heads/$1" || + die "'$1' does not look like a ref" +} + cmd_add() { if [ -e "$dir" ]; then @@ -508,8 +514,7 @@ cmd_add() # specified directory. Allowing a refspec might be # misleading because we won't do anything with any other # branches fetched via the refspec. - git rev-parse -q --verify "$2^{commit}" >/dev/null || - die "'$2' does not refer to a commit" + ensure_valid_ref_format "$2" "cmd_add_repository" "$@" else @@ -699,7 +704,11 @@ cmd_merge() cmd_pull() { + if [ $# -ne 2 ]; then + die "You must provide <repository> <ref>" + fi ensure_clean + ensure_valid_ref_format "$2" git fetch "$@" || exit $? revs=FETCH_HEAD set -- $revs @@ -709,8 +718,9 @@ cmd_pull() cmd_push() { if [ $# -ne 2 ]; then - die "You must provide <repository> <refspec>" + die "You must provide <repository> <ref>" fi + ensure_valid_ref_format "$2" if [ -e "$dir" ]; then repository=$1 refspec=$2 diff --git a/contrib/subtree/git-subtree.txt b/contrib/subtree/git-subtree.txt index e0957eee5..02669b153 100644 --- a/contrib/subtree/git-subtree.txt +++ b/contrib/subtree/git-subtree.txt @@ -9,10 +9,10 @@ git-subtree - Merge subtrees together and split repository into subtrees SYNOPSIS -------- [verse] -'git subtree' add -P <prefix> <refspec> -'git subtree' add -P <prefix> <repository> <refspec> -'git subtree' pull -P <prefix> <repository> <refspec...> -'git subtree' push -P <prefix> <repository> <refspec...> +'git subtree' add -P <prefix> <commit> +'git subtree' add -P <prefix> <repository> <ref> +'git subtree' pull -P <prefix> <repository> <ref> +'git subtree' push -P <prefix> <repository> <ref> 'git subtree' merge -P <prefix> <commit> 'git subtree' split -P <prefix> [OPTIONS] [<commit>] @@ -68,7 +68,7 @@ COMMANDS -------- add:: Create the <prefix> subtree by importing its contents - from the given <refspec> or <repository> and remote <refspec>. + from the given <commit> or <repository> and remote <ref>. A new commit is created automatically, joining the imported project's history with your own. With '--squash', imports only a single commit from the subproject, rather than its @@ -90,13 +90,13 @@ merge:: pull:: Exactly like 'merge', but parallels 'git pull' in that - it fetches the given commit from the specified remote + it fetches the given ref from the specified remote repository. push:: Does a 'split' (see below) using the <prefix> supplied and then does a 'git push' to push the result to the - repository and refspec. This can be used to push your + repository and ref. This can be used to push your subtree to different branches of the remote repository. split:: @@ -4139,9 +4139,9 @@ void diff_debug_filespec(struct diff_filespec *s, int x, const char *one) DIFF_FILE_VALID(s) ? "valid" : "invalid", s->mode, s->sha1_valid ? sha1_to_hex(s->sha1) : ""); - fprintf(stderr, "queue[%d] %s size %lu flags %d\n", + fprintf(stderr, "queue[%d] %s size %lu\n", x, one ? one : "", - s->size, s->xfrm_flags); + s->size); } void diff_debug_filepair(const struct diff_filepair *p, int i) diff --git a/diffcore.h b/diffcore.h index 1c16c8595..79de8cf28 100644 --- a/diffcore.h +++ b/diffcore.h @@ -29,10 +29,8 @@ struct diff_filespec { char *path; void *data; void *cnt_data; - const char *funcname_pattern_ident; unsigned long size; int count; /* Reference count */ - int xfrm_flags; /* for use by the xfrm */ int rename_used; /* Count of rename users */ unsigned short mode; /* file mode */ unsigned sha1_valid : 1; /* if true, use sha1 and trust mode; @@ -43,13 +41,13 @@ struct diff_filespec { unsigned should_free : 1; /* data should be free()'ed */ unsigned should_munmap : 1; /* data should be munmap()'ed */ unsigned dirty_submodule : 2; /* For submodules: its work tree is dirty */ - unsigned is_stdin : 1; #define DIRTY_SUBMODULE_UNTRACKED 1 #define DIRTY_SUBMODULE_MODIFIED 2 + unsigned is_stdin : 1; unsigned has_more_entries : 1; /* only appear in combined diff */ - struct userdiff_driver *driver; /* data should be considered "binary"; -1 means "don't know yet" */ - int is_binary; + int is_binary : 2; + struct userdiff_driver *driver; }; extern struct diff_filespec *alloc_filespec(const char *); @@ -1511,8 +1511,13 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up) flag &= ~REMOVE_DIR_KEEP_TOPLEVEL; dir = opendir(path->buf); if (!dir) { - /* an empty dir could be removed even if it is unreadble */ - if (!keep_toplevel) + if (errno == ENOENT) + return keep_toplevel ? -1 : 0; + else if (errno == EACCES && !keep_toplevel) + /* + * An empty dir could be removable even if it + * is unreadable: + */ return rmdir(path->buf); else return -1; @@ -1528,13 +1533,21 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up) strbuf_setlen(path, len); strbuf_addstr(path, e->d_name); - if (lstat(path->buf, &st)) - ; /* fall thru */ - else if (S_ISDIR(st.st_mode)) { + if (lstat(path->buf, &st)) { + if (errno == ENOENT) + /* + * file disappeared, which is what we + * wanted anyway + */ + continue; + /* fall thru */ + } else if (S_ISDIR(st.st_mode)) { if (!remove_dir_recurse(path, flag, &kept_down)) continue; /* happy */ - } else if (!only_empty && !unlink(path->buf)) + } else if (!only_empty && + (!unlink(path->buf) || errno == ENOENT)) { continue; /* happy, too */ + } /* path too long, stat fails, or non-directory still exists */ ret = -1; @@ -1544,7 +1557,7 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up) strbuf_setlen(path, original_len); if (!ret && !keep_toplevel && !kept_down) - ret = rmdir(path->buf); + ret = (!rmdir(path->buf) || errno == ENOENT) ? 0 : -1; else if (kept_up) /* * report the uplevel that it is not an error that we diff --git a/fetch-pack.c b/fetch-pack.c index d52de74c4..90fdd4982 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -506,7 +506,7 @@ static void filter_refs(struct fetch_pack_args *args, next = ref->next; if (!memcmp(ref->name, "refs/", 5) && - check_refname_format(ref->name + 5, 0)) + check_refname_format(ref->name, 0)) ; /* trash */ else { while (i < nr_sought) { diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN index 0a1f8d4f8..a9ea21826 100755 --- a/git-gui/GIT-VERSION-GEN +++ b/git-gui/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=0.18.GITGUI +DEF_VER=0.19.GITGUI LF=' ' diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index db46ac50b..cf2209b4f 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -3224,18 +3224,28 @@ unset i # -- Diff and Commit Area # -${NS}::panedwindow .vpane.lower -orient vertical -${NS}::frame .vpane.lower.commarea -${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -height 500 -.vpane.lower add .vpane.lower.diff -.vpane.lower add .vpane.lower.commarea -.vpane add .vpane.lower -if {$use_ttk} { - .vpane.lower pane .vpane.lower.diff -weight 1 - .vpane.lower pane .vpane.lower.commarea -weight 0 +if {$have_tk85} { + ${NS}::panedwindow .vpane.lower -orient vertical + ${NS}::frame .vpane.lower.commarea + ${NS}::frame .vpane.lower.diff -relief sunken -borderwidth 1 -height 500 + .vpane.lower add .vpane.lower.diff + .vpane.lower add .vpane.lower.commarea + .vpane add .vpane.lower + if {$use_ttk} { + .vpane.lower pane .vpane.lower.diff -weight 1 + .vpane.lower pane .vpane.lower.commarea -weight 0 + } else { + .vpane.lower paneconfigure .vpane.lower.diff -stretch always + .vpane.lower paneconfigure .vpane.lower.commarea -stretch never + } } else { - .vpane.lower paneconfigure .vpane.lower.diff -stretch always - .vpane.lower paneconfigure .vpane.lower.commarea -stretch never + frame .vpane.lower -height 300 -width 400 + frame .vpane.lower.commarea + frame .vpane.lower.diff -relief sunken -borderwidth 1 + pack .vpane.lower.diff -fill both -expand 1 + pack .vpane.lower.commarea -side bottom -fill x + .vpane add .vpane.lower + .vpane paneconfigure .vpane.lower -sticky nsew } # -- Commit Area Buttons diff --git a/git-gui/po/bg.po b/git-gui/po/bg.po new file mode 100644 index 000000000..89b3a4e53 --- /dev/null +++ b/git-gui/po/bg.po @@ -0,0 +1,2694 @@ +# Bulgarian translation of git-gui po-file. +# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014. +# +# +msgid "" +msgstr "" +"Project-Id-Version: git-gui master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-01-13 20:45+0200\n" +"PO-Revision-Date: 2014-01-13 21:31+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: git-gui.sh:859 +#, tcl-format +msgid "Invalid font specified in %s:" +msgstr "Указан е неправилен шрифт в %s:" + +#: git-gui.sh:912 +msgid "Main Font" +msgstr "Основен шрифт" + +#: git-gui.sh:913 +msgid "Diff/Console Font" +msgstr "Шрифт за разликите/конзолата" + +#: git-gui.sh:928 git-gui.sh:942 git-gui.sh:955 git-gui.sh:1045 +#: git-gui.sh:1064 git-gui.sh:3115 +msgid "git-gui: fatal error" +msgstr "git-gui: фатална грешка" + +#: git-gui.sh:929 +msgid "Cannot find git in PATH." +msgstr "Командата git липсва в пътя (PATH)." + +#: git-gui.sh:956 +msgid "Cannot parse Git version string:" +msgstr "Низът с версията на Git не може да бъде интерпретиран:" + +#: git-gui.sh:981 +#, tcl-format +msgid "" +"Git version cannot be determined.\n" +"\n" +"%s claims it is version '%s'.\n" +"\n" +"%s requires at least Git 1.5.0 or later.\n" +"\n" +"Assume '%s' is version 1.5.0?\n" +msgstr "" +"Версията на Git не може да бъде определена.\n" +"\n" +"Версията на %s изглежда, че е „%s“.\n" +"\n" +"%s изисква Git, версия поне 1.5.0.\n" +"\n" +"Да се приеме ли, че „%s“ е версия 1.5.0?\n" + +#: git-gui.sh:1278 +msgid "Git directory not found:" +msgstr "Директорията на Git не е открита:" + +#: git-gui.sh:1312 +msgid "Cannot move to top of working directory:" +msgstr "Не може да се премине към родителската директория." + +#: git-gui.sh:1320 +msgid "Cannot use bare repository:" +msgstr "Голо хранилище не може да се използва:" + +#: git-gui.sh:1328 +msgid "No working directory" +msgstr "Работната директория липсва" + +#: git-gui.sh:1500 lib/checkout_op.tcl:306 +msgid "Refreshing file status..." +msgstr "Обновяване на състоянието на файла…" + +#: git-gui.sh:1560 +msgid "Scanning for modified files ..." +msgstr "Проверка за променени файлове…" + +#: git-gui.sh:1632 +msgid "Calling prepare-commit-msg hook..." +msgstr "Куката prepare-commit-msg се изпълнява в момента…" + +#: git-gui.sh:1649 +msgid "Commit declined by prepare-commit-msg hook." +msgstr "Подаването е отхвърлено от куката prepare-commit-msg." + +#: git-gui.sh:1807 lib/browser.tcl:252 +msgid "Ready." +msgstr "Готово." + +#: git-gui.sh:1965 +#, tcl-format +msgid "Displaying only %s of %s files." +msgstr "Показване на само %s от %s файла." + +#: git-gui.sh:2091 +msgid "Unmodified" +msgstr "Непроменен" + +#: git-gui.sh:2093 +msgid "Modified, not staged" +msgstr "Променен, но не е в индекса" + +#: git-gui.sh:2094 git-gui.sh:2106 +msgid "Staged for commit" +msgstr "В индекса за подаване" + +#: git-gui.sh:2095 git-gui.sh:2107 +msgid "Portions staged for commit" +msgstr "Части са в индекса за подаване" + +#: git-gui.sh:2096 git-gui.sh:2108 +msgid "Staged for commit, missing" +msgstr "В индекса за подаване, но липсва" + +#: git-gui.sh:2098 +msgid "File type changed, not staged" +msgstr "Видът на файла е сменен, но не е в индекса" + +#: git-gui.sh:2099 git-gui.sh:2100 +msgid "File type changed, old type staged for commit" +msgstr "Видът на файла е сменен, в индекса е старият" + +#: git-gui.sh:2101 +msgid "File type changed, staged" +msgstr "Видът на файла е сменен и е в индекса" + +#: git-gui.sh:2102 +msgid "File type change staged, modification not staged" +msgstr "Видът на файла е сменен, промяната не е в индекса" + +#: git-gui.sh:2103 +msgid "File type change staged, file missing" +msgstr "Видът на файла е сменен, файлът липсва" + +#: git-gui.sh:2105 +msgid "Untracked, not staged" +msgstr "Неследен" + +#: git-gui.sh:2110 +msgid "Missing" +msgstr "Липсващ" + +#: git-gui.sh:2111 +msgid "Staged for removal" +msgstr "В индекса за изтриване" + +#: git-gui.sh:2112 +msgid "Staged for removal, still present" +msgstr "В индекса за изтриване, но още го има" + +#: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117 +#: git-gui.sh:2118 git-gui.sh:2119 +msgid "Requires merge resolution" +msgstr "Изисква коригиране при сливане" + +#: git-gui.sh:2154 +msgid "Starting gitk... please wait..." +msgstr "Стартиране на gitk…, изчакайте…" + +#: git-gui.sh:2166 +msgid "Couldn't find gitk in PATH" +msgstr "В пътищата, определени от променливата PATH, липсва изпълним gitk" + +#: git-gui.sh:2225 +msgid "Couldn't find git gui in PATH" +msgstr "В пътищата, определени от променливата PATH, липсва изпълним git gui" + +#: git-gui.sh:2644 lib/choose_repository.tcl:40 +msgid "Repository" +msgstr "Хранилище" + +#: git-gui.sh:2645 +msgid "Edit" +msgstr "Редактиране" + +#: git-gui.sh:2647 lib/choose_rev.tcl:567 +msgid "Branch" +msgstr "Клон" + +#: git-gui.sh:2650 lib/choose_rev.tcl:554 +msgid "Commit@@noun" +msgstr "Подаване" + +#: git-gui.sh:2653 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170 +msgid "Merge" +msgstr "Сливане" + +#: git-gui.sh:2654 lib/choose_rev.tcl:563 +msgid "Remote" +msgstr "Отдалечено хранилище" + +#: git-gui.sh:2657 +msgid "Tools" +msgstr "Команди" + +#: git-gui.sh:2666 +msgid "Explore Working Copy" +msgstr "Разглеждане на работното копие" + +#: git-gui.sh:2672 +msgid "Git Bash" +msgstr "Bash на Git" + +#: git-gui.sh:2682 +msgid "Browse Current Branch's Files" +msgstr "Разглеждане на файловете в текущия клон" + +#: git-gui.sh:2686 +msgid "Browse Branch Files..." +msgstr "Разглеждане на текущия клон" + +#: git-gui.sh:2691 +msgid "Visualize Current Branch's History" +msgstr "Визуализация на историята на текущия клон" + +#: git-gui.sh:2695 +msgid "Visualize All Branch History" +msgstr "Визуализация на историята на всички клонове" + +#: git-gui.sh:2702 +#, tcl-format +msgid "Browse %s's Files" +msgstr "Разглеждане на файловете в %s" + +#: git-gui.sh:2704 +#, tcl-format +msgid "Visualize %s's History" +msgstr "Визуализация на историята на %s" + +#: git-gui.sh:2709 lib/database.tcl:40 lib/database.tcl:66 +msgid "Database Statistics" +msgstr "Статистика на базата от данни" + +#: git-gui.sh:2712 lib/database.tcl:33 +msgid "Compress Database" +msgstr "Компресиране на базата от данни" + +#: git-gui.sh:2715 +msgid "Verify Database" +msgstr "Проверка на базата от данни" + +#: git-gui.sh:2722 git-gui.sh:2726 git-gui.sh:2730 lib/shortcut.tcl:8 +#: lib/shortcut.tcl:40 lib/shortcut.tcl:72 +msgid "Create Desktop Icon" +msgstr "Добавяне на икона на работния плот" + +#: git-gui.sh:2738 lib/choose_repository.tcl:192 lib/choose_repository.tcl:200 +msgid "Quit" +msgstr "Спиране на програмата" + +#: git-gui.sh:2746 +msgid "Undo" +msgstr "Отмяна" + +#: git-gui.sh:2749 +msgid "Redo" +msgstr "Повторение" + +#: git-gui.sh:2753 git-gui.sh:3348 +msgid "Cut" +msgstr "Отрязване" + +#: git-gui.sh:2756 git-gui.sh:3351 git-gui.sh:3425 git-gui.sh:3510 +#: lib/console.tcl:69 +msgid "Copy" +msgstr "Копиране" + +#: git-gui.sh:2759 git-gui.sh:3354 +msgid "Paste" +msgstr "Поставяне" + +#: git-gui.sh:2762 git-gui.sh:3357 lib/remote_branch_delete.tcl:39 +#: lib/branch_delete.tcl:28 +msgid "Delete" +msgstr "Изтриване" + +#: git-gui.sh:2766 git-gui.sh:3361 git-gui.sh:3514 lib/console.tcl:71 +msgid "Select All" +msgstr "Избиране на всичко" + +#: git-gui.sh:2775 +msgid "Create..." +msgstr "Създаване…" + +#: git-gui.sh:2781 +msgid "Checkout..." +msgstr "Изтегляне…" + +#: git-gui.sh:2787 +msgid "Rename..." +msgstr "Преименуване…" + +#: git-gui.sh:2792 +msgid "Delete..." +msgstr "Изтриване…" + +#: git-gui.sh:2797 +msgid "Reset..." +msgstr "Отмяна на промените…" + +#: git-gui.sh:2807 +msgid "Done" +msgstr "Готово" + +#: git-gui.sh:2809 +msgid "Commit@@verb" +msgstr "Подаване" + +#: git-gui.sh:2818 git-gui.sh:3289 +msgid "New Commit" +msgstr "Подаване" + +#: git-gui.sh:2826 git-gui.sh:3296 +msgid "Amend Last Commit" +msgstr "Поправяне на последното подаване" + +#: git-gui.sh:2836 git-gui.sh:3250 lib/remote_branch_delete.tcl:101 +msgid "Rescan" +msgstr "Обновяване" + +#: git-gui.sh:2842 +msgid "Stage To Commit" +msgstr "Към индекса за подаване" + +#: git-gui.sh:2848 +msgid "Stage Changed Files To Commit" +msgstr "Всички променени файлове към индекса за подаване" + +#: git-gui.sh:2854 +msgid "Unstage From Commit" +msgstr "Изваждане от индекса за подаване" + +#: git-gui.sh:2860 lib/index.tcl:442 +msgid "Revert Changes" +msgstr "Връщане на оригинала" + +#: git-gui.sh:2868 git-gui.sh:3561 git-gui.sh:3592 +msgid "Show Less Context" +msgstr "По-малко контекст" + +#: git-gui.sh:2872 git-gui.sh:3565 git-gui.sh:3596 +msgid "Show More Context" +msgstr "Повече контекст" + +#: git-gui.sh:2879 git-gui.sh:3263 git-gui.sh:3372 +msgid "Sign Off" +msgstr "Подписване" + +#: git-gui.sh:2895 +msgid "Local Merge..." +msgstr "Локално сливане…" + +#: git-gui.sh:2900 +msgid "Abort Merge..." +msgstr "Преустановяване на сливане…" + +#: git-gui.sh:2912 git-gui.sh:2940 +msgid "Add..." +msgstr "Добавяне…" + +#: git-gui.sh:2916 +msgid "Push..." +msgstr "Избутване…" + +#: git-gui.sh:2920 +msgid "Delete Branch..." +msgstr "Изтриване на клон…" + +#: git-gui.sh:2930 git-gui.sh:3543 +msgid "Options..." +msgstr "Опции…" + +#: git-gui.sh:2941 +msgid "Remove..." +msgstr "Премахване…" + +#: git-gui.sh:2950 lib/choose_repository.tcl:54 +msgid "Help" +msgstr "Помощ" + +#: git-gui.sh:2954 git-gui.sh:2958 lib/choose_repository.tcl:48 +#: lib/choose_repository.tcl:57 lib/about.tcl:14 +#, tcl-format +msgid "About %s" +msgstr "Относно %s" + +#: git-gui.sh:2982 +msgid "Online Documentation" +msgstr "Документация в Интернет" + +#: git-gui.sh:2985 lib/choose_repository.tcl:51 lib/choose_repository.tcl:60 +msgid "Show SSH Key" +msgstr "Показване на ключа за SSH" + +#: git-gui.sh:3004 git-gui.sh:3136 +msgid "Usage" +msgstr "Употреба" + +#: git-gui.sh:3085 lib/blame.tcl:573 +msgid "Error" +msgstr "Грешка" + +#: git-gui.sh:3116 +#, tcl-format +msgid "fatal: cannot stat path %s: No such file or directory" +msgstr "" +"фатално: пътят %s не може да бъде открит: такъв файл или директория няма" + +#: git-gui.sh:3149 +msgid "Current Branch:" +msgstr "Текущ клон:" + +#: git-gui.sh:3175 +msgid "Staged Changes (Will Commit)" +msgstr "Промени в индекса (за подаване)" + +#: git-gui.sh:3195 +msgid "Unstaged Changes" +msgstr "Промени извън индекса" + +#: git-gui.sh:3256 +msgid "Stage Changed" +msgstr "Индексът е променен" + +#: git-gui.sh:3275 lib/transport.tcl:137 lib/transport.tcl:229 +msgid "Push" +msgstr "Изтласкване" + +#: git-gui.sh:3310 +msgid "Initial Commit Message:" +msgstr "Първоначално съобщение при подаване:" + +#: git-gui.sh:3311 +msgid "Amended Commit Message:" +msgstr "Поправено съобщение при подаване:" + +#: git-gui.sh:3312 +msgid "Amended Initial Commit Message:" +msgstr "Поправено първоначално съобщение при подаване:" + +#: git-gui.sh:3313 +msgid "Amended Merge Commit Message:" +msgstr "Поправено съобщение при подаване със сливане:" + +#: git-gui.sh:3314 +msgid "Merge Commit Message:" +msgstr "Съобщение при подаване със сливане:" + +#: git-gui.sh:3315 +msgid "Commit Message:" +msgstr "Съобщение при подаване:" + +#: git-gui.sh:3364 git-gui.sh:3518 lib/console.tcl:73 +msgid "Copy All" +msgstr "Копиране на всичко" + +#: git-gui.sh:3388 lib/blame.tcl:105 +msgid "File:" +msgstr "Файл:" + +#: git-gui.sh:3506 +msgid "Refresh" +msgstr "Обновяване" + +#: git-gui.sh:3527 +msgid "Decrease Font Size" +msgstr "По-едър шрифт" + +#: git-gui.sh:3531 +msgid "Increase Font Size" +msgstr "По-дребен шрифт" + +#: git-gui.sh:3539 lib/blame.tcl:294 +msgid "Encoding" +msgstr "Кодиране" + +#: git-gui.sh:3550 +msgid "Apply/Reverse Hunk" +msgstr "Прилагане/връщане на парче" + +#: git-gui.sh:3555 +msgid "Apply/Reverse Line" +msgstr "Прилагане/връщане на ред" + +#: git-gui.sh:3574 +msgid "Run Merge Tool" +msgstr "Изпълнение на програмата за сливане" + +#: git-gui.sh:3579 +msgid "Use Remote Version" +msgstr "Версия от отдалеченото хранилище" + +#: git-gui.sh:3583 +msgid "Use Local Version" +msgstr "Локална версия" + +#: git-gui.sh:3587 +msgid "Revert To Base" +msgstr "Връщане към родителската версия" + +#: git-gui.sh:3605 +msgid "Visualize These Changes In The Submodule" +msgstr "Визуализиране на промените в подмодула" + +#: git-gui.sh:3609 +msgid "Visualize Current Branch History In The Submodule" +msgstr "Визуализация на историята на текущия клон в историята за подмодула" + +#: git-gui.sh:3613 +msgid "Visualize All Branch History In The Submodule" +msgstr "Визуализация на историята на всички клони в историята за подмодула" + +#: git-gui.sh:3618 +msgid "Start git gui In The Submodule" +msgstr "Стартиране на „git gui“ за подмодула" + +#: git-gui.sh:3653 +msgid "Unstage Hunk From Commit" +msgstr "Изваждане на парчето от подаването" + +#: git-gui.sh:3655 +msgid "Unstage Lines From Commit" +msgstr "Изваждане на редовете от подаването" + +#: git-gui.sh:3657 +msgid "Unstage Line From Commit" +msgstr "Изваждане на реда от подаването" + +#: git-gui.sh:3660 +msgid "Stage Hunk For Commit" +msgstr "Добавяне на парчето за подаване" + +#: git-gui.sh:3662 +msgid "Stage Lines For Commit" +msgstr "Добавяне на редовете за подаване" + +#: git-gui.sh:3664 +msgid "Stage Line For Commit" +msgstr "Добавяне на реда за подаване" + +#: git-gui.sh:3689 +msgid "Initializing..." +msgstr "Инициализиране…" + +#: git-gui.sh:3832 +#, tcl-format +msgid "" +"Possible environment issues exist.\n" +"\n" +"The following environment variables are probably\n" +"going to be ignored by any Git subprocess run\n" +"by %s:\n" +"\n" +msgstr "" +"Възможно е да има проблем със средата.\n" +"\n" +"Най-вероятно следните променливи няма да бъдат\n" +"взети под внимание от подпроцесите Git изпълнени\n" +"от %s:\n" +"\n" + +#: git-gui.sh:3861 +msgid "" +"\n" +"This is due to a known issue with the\n" +"Tcl binary distributed by Cygwin." +msgstr "" +"\n" +"Това е познат проблем и се дължи на\n" +"версията на Tcl включена в Cygwin." + +#: git-gui.sh:3866 +#, tcl-format +msgid "" +"\n" +"\n" +"A good replacement for %s\n" +"is placing values for the user.name and\n" +"user.email settings into your personal\n" +"~/.gitconfig file.\n" +msgstr "" +"\n" +"\n" +"Добър заместител на %s\n" +"е да поставите настройките user.name и\n" +"user.email в личния си файл ~/.gitconfig.\n" + +#: lib/spellcheck.tcl:57 +msgid "Unsupported spell checker" +msgstr "Тази програма за проверка на правописа не се поддържа" + +#: lib/spellcheck.tcl:65 +msgid "Spell checking is unavailable" +msgstr "Липсва програма за проверка на правописа" + +#: lib/spellcheck.tcl:68 +msgid "Invalid spell checking configuration" +msgstr "Неправилни настройки на проверката на правописа" + +#: lib/spellcheck.tcl:70 +#, tcl-format +msgid "Reverting dictionary to %s." +msgstr "Ползване на речник за език „%s“." + +#: lib/spellcheck.tcl:73 +msgid "Spell checker silently failed on startup" +msgstr "Програмата за правопис даже не стартира успешно." + +#: lib/spellcheck.tcl:80 +msgid "Unrecognized spell checker" +msgstr "Непозната програма за проверка на правописа" + +#: lib/spellcheck.tcl:186 +msgid "No Suggestions" +msgstr "Няма предложения" + +#: lib/spellcheck.tcl:388 +msgid "Unexpected EOF from spell checker" +msgstr "Неочакван край на файл от програмата за проверка на правописа" + +#: lib/spellcheck.tcl:392 +msgid "Spell Checker Failed" +msgstr "Грешка в програмата за проверка на правописа" + +#: lib/remote_add.tcl:20 +msgid "Add Remote" +msgstr "Добавяне на отдалечено хранилище" + +#: lib/remote_add.tcl:25 +msgid "Add New Remote" +msgstr "Добавяне на отдалечено хранилище" + +#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37 +msgid "Add" +msgstr "Добавяне" + +#: lib/remote_add.tcl:34 lib/browser.tcl:292 lib/branch_checkout.tcl:30 +#: lib/transport.tcl:141 lib/branch_rename.tcl:32 lib/choose_font.tcl:45 +#: lib/option.tcl:127 lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 +#: lib/tools_dlg.tcl:345 lib/remote_branch_delete.tcl:43 +#: lib/checkout_op.tcl:579 lib/branch_create.tcl:37 lib/branch_delete.tcl:34 +#: lib/merge.tcl:174 +msgid "Cancel" +msgstr "Отказване" + +#: lib/remote_add.tcl:39 +msgid "Remote Details" +msgstr "Данни за отдалеченото хранилище" + +#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44 +msgid "Name:" +msgstr "Име:" + +#: lib/remote_add.tcl:50 +msgid "Location:" +msgstr "Местоположение:" + +#: lib/remote_add.tcl:60 +msgid "Further Action" +msgstr "Следващо действие" + +#: lib/remote_add.tcl:63 +msgid "Fetch Immediately" +msgstr "Незабавно доставяне" + +#: lib/remote_add.tcl:69 +msgid "Initialize Remote Repository and Push" +msgstr "Инициализиране на отдалеченото хранилище и изтласкване на промените" + +#: lib/remote_add.tcl:75 +msgid "Do Nothing Else Now" +msgstr "Да не се прави нищо" + +#: lib/remote_add.tcl:100 +msgid "Please supply a remote name." +msgstr "Задайте име за отдалеченото хранилище." + +#: lib/remote_add.tcl:113 +#, tcl-format +msgid "'%s' is not an acceptable remote name." +msgstr "Отдалечено хранилище не може да се казва „%s“." + +#: lib/remote_add.tcl:124 +#, tcl-format +msgid "Failed to add remote '%s' of location '%s'." +msgstr "Неуспешно добавяне на отдалеченото хранилище „%s“ от адрес „%s“." + +#: lib/remote_add.tcl:132 lib/transport.tcl:6 +#, tcl-format +msgid "fetch %s" +msgstr "доставяне на „%s“" + +#: lib/remote_add.tcl:133 +#, tcl-format +msgid "Fetching the %s" +msgstr "Доставяне на „%s“" + +#: lib/remote_add.tcl:156 +#, tcl-format +msgid "Do not know how to initialize repository at location '%s'." +msgstr "Хранилището с местоположение „%s“ не може да бъде инициализирано." + +#: lib/remote_add.tcl:162 lib/transport.tcl:54 lib/transport.tcl:92 +#: lib/transport.tcl:110 +#, tcl-format +msgid "push %s" +msgstr "изтласкване на „%s“" + +#: lib/remote_add.tcl:163 +#, tcl-format +msgid "Setting up the %s (at %s)" +msgstr "Добавяне на хранилище „%s“ (с адрес „%s“)" + +#: lib/browser.tcl:17 +msgid "Starting..." +msgstr "Стартиране…" + +#: lib/browser.tcl:27 +msgid "File Browser" +msgstr "Файлов браузър" + +#: lib/browser.tcl:132 lib/browser.tcl:149 +#, tcl-format +msgid "Loading %s..." +msgstr "Зареждане на „%s“…" + +#: lib/browser.tcl:193 +msgid "[Up To Parent]" +msgstr "[Към родителя]" + +#: lib/browser.tcl:275 lib/browser.tcl:282 +msgid "Browse Branch Files" +msgstr "Разглеждане на файловете в клона" + +#: lib/browser.tcl:288 lib/choose_repository.tcl:406 +#: lib/choose_repository.tcl:493 lib/choose_repository.tcl:502 +#: lib/choose_repository.tcl:1029 +msgid "Browse" +msgstr "Разглеждане" + +#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321 +msgid "Revision" +msgstr "Версия" + +#: 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 "Сигурни ли сте, че искате да стартирате „%1$s“ върху „%2$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/branch_checkout.tcl:16 lib/branch_checkout.tcl:21 +msgid "Checkout Branch" +msgstr "Клон за изтегляне" + +#: lib/branch_checkout.tcl:26 +msgid "Checkout" +msgstr "Изтегляне" + +#: lib/branch_checkout.tcl:39 lib/option.tcl:309 lib/branch_create.tcl:69 +msgid "Options" +msgstr "Опции" + +#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92 +msgid "Fetch Tracking Branch" +msgstr "Изтегляне на промените от следения клон" + +#: lib/branch_checkout.tcl:47 +msgid "Detach From Local Branch" +msgstr "Изтриване от локалния клон" + +#: 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: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 "Изтласкване на %s %s към %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:165 lib/remote_branch_delete.tcl:51 +msgid "Remote:" +msgstr "Отдалечено хранилище:" + +#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72 +msgid "Arbitrary Location:" +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 "Максимална компресия (за бавни мрежови връзки)" + +#: lib/transport.tcl:215 +msgid "Include tags" +msgstr "Включване на етикетите" + +#: lib/status_bar.tcl:87 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s… %*i от общо %*i %s (%3i%%)" + +#: 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/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:55 lib/checkout_op.tcl:146 lib/console.tcl:81 +#: lib/database.tcl:30 +msgid "Close" +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 "" +"Could not start ssh-keygen:\n" +"\n" +"%s" +msgstr "" +"Програмата „ssh-keygen“ не може да бъде стартирана:\n" +"\n" +"%s" + +#: 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/branch_rename.tcl:15 lib/branch_rename.tcl:23 +msgid "Rename Branch" +msgstr "Преименуване на клон" + +#: lib/branch_rename.tcl:28 +msgid "Rename" +msgstr "Преименуване" + +#: lib/branch_rename.tcl:38 +msgid "Branch:" +msgstr "Клон:" + +#: lib/branch_rename.tcl:46 +msgid "New Name:" +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/branch_rename.tcl:102 lib/checkout_op.tcl:202 +#, tcl-format +msgid "Branch '%s' already exists." +msgstr "Клонът „%s“ вече съществува." + +#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165 +#, tcl-format +msgid "'%s' is not an acceptable branch name." +msgstr "„%s“ не може да се използва за име на клон." + +#: lib/branch_rename.tcl:123 +#, tcl-format +msgid "Failed to rename '%s'." +msgstr "Неуспешно преименуване на „%s“." + +#: 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/option.tcl:11 +#, tcl-format +msgid "Invalid global encoding '%s'" +msgstr "Неправилно глобално кодиране „%s“" + +#: lib/option.tcl:19 +#, tcl-format +msgid "Invalid repo encoding '%s'" +msgstr "Неправилно кодиране „%s“ на хранилището" + +#: lib/option.tcl:119 +msgid "Restore Defaults" +msgstr "Стандартни настройки" + +#: lib/option.tcl:123 +msgid "Save" +msgstr "Запазване" + +#: lib/option.tcl:133 +#, tcl-format +msgid "%s Repository" +msgstr "Хранилище „%s“" + +#: lib/option.tcl:134 +msgid "Global (All Repositories)" +msgstr "Глобално (за всички хранилища)" + +#: lib/option.tcl:140 +msgid "User Name" +msgstr "Потребителско име" + +#: lib/option.tcl:141 +msgid "Email Address" +msgstr "Адрес на е-поща" + +#: 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 "Извеждане на статистика след сливанията" + +#: 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/option.tcl:150 +msgid "Match Tracking Branches" +msgstr "Напасване на следящите клонове" + +#: lib/option.tcl:151 +msgid "Use Textconv For Diffs and Blames" +msgstr "Използване на „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 "Брой редове за контекста при извеждане на разликите" + +#: lib/option.tcl:157 +msgid "Additional Diff Parameters" +msgstr "Допълнителни параметри за разликите" + +#: 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 "Предупреждение при подаване към несвързан връх" + +#: lib/option.tcl:162 +msgid "Staging of untracked files" +msgstr "Добавяне на неследените файлове към индекса" + +#: lib/option.tcl:163 +msgid "Show untracked files" +msgstr "Показване на неследените файлове" + +#: lib/option.tcl:209 +msgid "Change" +msgstr "Смяна" + +#: lib/option.tcl:253 +msgid "Spelling Dictionary:" +msgstr "Правописен речник:" + +#: lib/option.tcl:283 +msgid "Change Font" +msgstr "Смяна на шрифта" + +#: lib/option.tcl:287 +#, tcl-format +msgid "Choose %s" +msgstr "Избор на „%s“" + +#: lib/option.tcl:293 +msgid "pt." +msgstr "тчк." + +#: lib/option.tcl:307 +msgid "Preferences" +msgstr "Настройки" + +#: lib/option.tcl:344 +msgid "Failed to completely save options:" +msgstr "Неуспешно запазване на настройките:" + +#: 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 "" +"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." +msgstr "" +"Разликата показва само разликите с конфликт.\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/mergetool.tcl:146 +msgid "Conflict file does not exist" +msgstr "Файлът, в който е конфликтът, не съществува" + +#: lib/mergetool.tcl:246 +#, tcl-format +msgid "Not a GUI merge tool: '%s'" +msgstr "Това не е графична програма за сливане: „%s“" + +#: 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 "" +"Error retrieving versions:\n" +"%s" +msgstr "" +"Грешка при изтеглянето на версии:\n" +"%s" + +#: lib/mergetool.tcl:350 +#, tcl-format +msgid "" +"Could not start the merge tool:\n" +"\n" +"%s" +msgstr "" +"Програмата за сливане не може да бъде стартирана:\n" +"\n" +"%s" + +#: lib/mergetool.tcl:354 +msgid "Running merge tool..." +msgstr "Стартиране на програмата за сливане…" + +#: lib/mergetool.tcl:382 lib/mergetool.tcl:390 +msgid "Merge tool failed." +msgstr "Грешка в програмата за сливане." + +#: 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:46 +msgid "Tool Details" +msgstr "Подробности за командата" + +#: lib/tools_dlg.tcl:49 +msgid "Use '/' separators to create a submenu tree:" +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 "" +"Could not add tool:\n" +"%s" +msgstr "" +"Командата не може да бъде добавена:\n" +"%s" + +#: lib/tools_dlg.tcl:187 +msgid "Remove Tool" +msgstr "Премахване на команда" + +#: lib/tools_dlg.tcl:193 +msgid "Remove Tool Commands" +msgstr "Премахване на команди" + +#: lib/tools_dlg.tcl:198 +msgid "Remove" +msgstr "Премахване" + +#: lib/tools_dlg.tcl:231 +msgid "(Blue denotes repository-local tools)" +msgstr "(команди към локалното хранилище са обозначени в синьо)" + +#: lib/tools_dlg.tcl:292 +#, tcl-format +msgid "Run Command: %s" +msgstr "Изпълнение на командата „%s“" + +#: lib/tools_dlg.tcl:306 +msgid "Arguments" +msgstr "Аргументи" + +#: lib/tools_dlg.tcl:336 lib/checkout_op.tcl:567 lib/merge.tcl:166 +msgid "Visualize" +msgstr "Визуализация" + +#: lib/tools_dlg.tcl:341 +msgid "OK" +msgstr "Добре" + +#: lib/search.tcl:48 +msgid "Find:" +msgstr "Търсене:" + +#: lib/search.tcl:50 +msgid "Next" +msgstr "Следваща поява" + +#: lib/search.tcl:51 +msgid "Prev" +msgstr "Предишна поява" + +#: lib/search.tcl:52 +msgid "RegExp" +msgstr "Рег. изр." + +#: lib/search.tcl:54 +msgid "Case" +msgstr "Регистър" + +#: lib/shortcut.tcl:21 lib/shortcut.tcl:62 +msgid "Cannot write shortcut:" +msgstr "Клавишната комбинация не може да бъде запазена:" + +#: lib/shortcut.tcl:137 +msgid "Cannot write icon:" +msgstr "Иконата не може да бъде запазена:" + +#: lib/diff.tcl:64 +#, tcl-format +msgid "" +"No differences detected.\n" +"\n" +"%s has no changes.\n" +"\n" +"The modification date of this file was updated by another application, but " +"the content within the file was not changed.\n" +"\n" +"A rescan will be automatically started to find other files which may have " +"the same state." +msgstr "" +"Не са открити разлики.\n" +"\n" +"Няма промени в „%s“.\n" +"\n" +"Времето на промяна на файла е бил зададен от друга програма, но съдържанието " +"му не е променено.\n" +"\n" +"Автоматично ще започне нова проверка дали няма други файлове в това " +"състояние." + +#: lib/diff.tcl:104 +#, tcl-format +msgid "Loading diff of %s..." +msgstr "Зареждане на разликите в „%s“…" + +#: lib/diff.tcl:125 +msgid "" +"LOCAL: deleted\n" +"REMOTE:\n" +msgstr "" +"ЛОКАЛНО: изтрит\n" +"ОТДАЛЕЧЕНО:\n" + +#: lib/diff.tcl:130 +msgid "" +"REMOTE: deleted\n" +"LOCAL:\n" +msgstr "" +"ОТДАЛЕЧЕНО: изтрит\n" +"ЛОКАЛНО:\n" + +#: lib/diff.tcl:137 +msgid "LOCAL:\n" +msgstr "ЛОКАЛНО:\n" + +#: lib/diff.tcl:140 +msgid "REMOTE:\n" +msgstr "ОТДАЛЕЧЕНО:\n" + +#: lib/diff.tcl:202 lib/diff.tcl:337 +#, tcl-format +msgid "Unable to display %s" +msgstr "Не може да бъде показан файлът „%s“" + +#: lib/diff.tcl:203 +msgid "Error loading file:" +msgstr "Грешка при зареждане на файл:" + +#: lib/diff.tcl:210 +msgid "Git Repository (subproject)" +msgstr "Хранилище на Git (подпроект)" + +#: lib/diff.tcl:222 +msgid "* Binary file (not showing content)." +msgstr "⁃ Двоичен файл (съдържанието не се показва)." + +#: lib/diff.tcl:227 +#, tcl-format +msgid "" +"* Untracked file is %d bytes.\n" +"* Showing only first %d bytes.\n" +msgstr "" +"⁃ Неследеният файл е %d байта.\n" +"⁃ Показват се само първите %d байта.\n" + +#: lib/diff.tcl:233 +#, tcl-format +msgid "" +"\n" +"* Untracked file clipped here by %s.\n" +"* To see the entire file, use an external editor.\n" +msgstr "" +"\n" +"⁃ Неследеният файл е отрязан дотук %s.\n" +"⁃ Използвайте външен редактор, за да видите целия файл.\n" + +#: lib/diff.tcl:338 lib/blame.tcl:1128 +msgid "Error loading diff:" +msgstr "Грешка при зареждане на разлика:" + +#: lib/diff.tcl:557 +msgid "Failed to unstage selected hunk." +msgstr "Избраното парче не може да бъде извадено от индекса." + +#: lib/diff.tcl:564 +msgid "Failed to stage selected hunk." +msgstr "Избраното парче не може да бъде добавен към индекса." + +#: lib/diff.tcl:643 +msgid "Failed to unstage selected line." +msgstr "Избраният ред не може да бъде изваден от индекса." + +#: lib/diff.tcl:651 +msgid "Failed to stage selected line." +msgstr "Избраният ред не може да бъде добавен към индекса." + +#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 +msgid "Delete Branch Remotely" +msgstr "Изтриване на отдалечения клон" + +#: lib/remote_branch_delete.tcl:48 +msgid "From Repository" +msgstr "От хранилище" + +#: lib/remote_branch_delete.tcl:88 +msgid "Branches" +msgstr "Клонове" + +#: lib/remote_branch_delete.tcl:110 +msgid "Delete Only If" +msgstr "Изтриване, само ако" + +#: lib/remote_branch_delete.tcl:112 +msgid "Merged Into:" +msgstr "Слят в:" + +#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53 +msgid "Always (Do not perform merge checks)" +msgstr "Винаги (без проверка за сливане)" + +#: lib/remote_branch_delete.tcl:153 +msgid "A branch is required for 'Merged Into'." +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/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/remote_branch_delete.tcl:208 +msgid "Please select one or more branches to delete." +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/remote_branch_delete.tcl:227 +#, tcl-format +msgid "Deleting branches from %s" +msgstr "Изтриване на клони от „%s“" + +#: lib/remote_branch_delete.tcl:300 +msgid "No repository selected." +msgstr "Не е избрано хранилище." + +#: lib/remote_branch_delete.tcl:305 +#, tcl-format +msgid "Scanning %s..." +msgstr "Претърсване на „%s“…" + +#: lib/choose_repository.tcl:32 +msgid "Git Gui" +msgstr "ГПИ на Git" + +#: lib/choose_repository.tcl:91 lib/choose_repository.tcl:396 +msgid "Create New Repository" +msgstr "Създаване на ново хранилище" + +#: lib/choose_repository.tcl:97 +msgid "New..." +msgstr "Ново…" + +#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:480 +msgid "Clone Existing Repository" +msgstr "Клониране на съществуващо хранилище" + +#: lib/choose_repository.tcl:115 +msgid "Clone..." +msgstr "Клониране…" + +#: lib/choose_repository.tcl:122 lib/choose_repository.tcl:1019 +msgid "Open Existing Repository" +msgstr "Отваряне на съществуващо хранилище" + +#: lib/choose_repository.tcl:128 +msgid "Open..." +msgstr "Отваряне…" + +#: lib/choose_repository.tcl:141 +msgid "Recent Repositories" +msgstr "Скоро ползвани" + +#: lib/choose_repository.tcl:147 +msgid "Open Recent Repository:" +msgstr "Отваряне на хранилище ползвано наскоро:" + +#: lib/choose_repository.tcl:315 lib/choose_repository.tcl:322 +#: lib/choose_repository.tcl:329 +#, tcl-format +msgid "Failed to create repository %s:" +msgstr "Неуспешно създаване на хранилището „%s“:" + +#: lib/choose_repository.tcl:391 lib/branch_create.tcl:33 +msgid "Create" +msgstr "Създаване" + +#: lib/choose_repository.tcl:401 +msgid "Directory:" +msgstr "Директория:" + +#: lib/choose_repository.tcl:431 lib/choose_repository.tcl:552 +#: lib/choose_repository.tcl:1053 +msgid "Git Repository" +msgstr "Хранилище на Git" + +#: lib/choose_repository.tcl:456 +#, tcl-format +msgid "Directory %s already exists." +msgstr "Вече съществува директория „%s“." + +#: lib/choose_repository.tcl:460 +#, tcl-format +msgid "File %s already exists." +msgstr "Вече съществува файл „%s“." + +#: lib/choose_repository.tcl:475 +msgid "Clone" +msgstr "Клониране" + +#: lib/choose_repository.tcl:488 +msgid "Source Location:" +msgstr "Адрес на източника:" + +#: lib/choose_repository.tcl:497 +msgid "Target Directory:" +msgstr "Целева директория:" + +#: lib/choose_repository.tcl:507 +msgid "Clone Type:" +msgstr "Вид клониране:" + +#: lib/choose_repository.tcl:512 +msgid "Standard (Fast, Semi-Redundant, Hardlinks)" +msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)" + +#: lib/choose_repository.tcl:517 +msgid "Full Copy (Slower, Redundant Backup)" +msgstr "Пълно (бавно, пълноценно резервно копие)" + +#: lib/choose_repository.tcl:522 +msgid "Shared (Fastest, Not Recommended, No Backup)" +msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)" + +#: lib/choose_repository.tcl:558 lib/choose_repository.tcl:605 +#: lib/choose_repository.tcl:751 lib/choose_repository.tcl:821 +#: lib/choose_repository.tcl:1059 lib/choose_repository.tcl:1067 +#, tcl-format +msgid "Not a Git repository: %s" +msgstr "Това не е хранилище на Git: %s" + +#: lib/choose_repository.tcl:594 +msgid "Standard only available for local repository." +msgstr "Само локални хранилища могат да се клонират стандартно" + +#: lib/choose_repository.tcl:598 +msgid "Shared only available for local repository." +msgstr "Само локални хранилища могат да се клонират споделено" + +#: lib/choose_repository.tcl:619 +#, tcl-format +msgid "Location %s already exists." +msgstr "Вече съществува местоположението „%s“." + +#: lib/choose_repository.tcl:630 +msgid "Failed to configure origin" +msgstr "Неуспешно настройване на хранилището-източник" + +#: lib/choose_repository.tcl:642 +msgid "Counting objects" +msgstr "Преброяване на обекти" + +#: lib/choose_repository.tcl:643 +msgid "buckets" +msgstr "клетки" + +#: lib/choose_repository.tcl:667 +#, tcl-format +msgid "Unable to copy objects/info/alternates: %s" +msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s" + +#: lib/choose_repository.tcl:703 +#, tcl-format +msgid "Nothing to clone from %s." +msgstr "Няма какво да се клонира от „%s“." + +#: lib/choose_repository.tcl:705 lib/choose_repository.tcl:919 +#: lib/choose_repository.tcl:931 +msgid "The 'master' branch has not been initialized." +msgstr "Основният клон — „master“ не е инициализиран." + +#: lib/choose_repository.tcl:718 +msgid "Hardlinks are unavailable. Falling back to copying." +msgstr "Не се поддържат твърди връзки. Преминава се към копиране." + +#: lib/choose_repository.tcl:730 +#, tcl-format +msgid "Cloning from %s" +msgstr "Клониране на „%s“" + +#: lib/choose_repository.tcl:761 +msgid "Copying objects" +msgstr "Копиране на обекти" + +#: lib/choose_repository.tcl:762 +msgid "KiB" +msgstr "KiB" + +#: lib/choose_repository.tcl:786 +#, tcl-format +msgid "Unable to copy object: %s" +msgstr "Неуспешно копиране на обект: %s" + +#: lib/choose_repository.tcl:796 +msgid "Linking objects" +msgstr "Създаване на връзки към обектите" + +#: lib/choose_repository.tcl:797 +msgid "objects" +msgstr "обекти" + +#: lib/choose_repository.tcl:805 +#, tcl-format +msgid "Unable to hardlink object: %s" +msgstr "Неуспешно създаване на твърда връзка към обект: %s" + +#: lib/choose_repository.tcl:860 +msgid "Cannot fetch branches and objects. See console output for details." +msgstr "" +"Клоните и обектите не могат да бъдат изтеглени. За повече информация " +"погледнете изхода на конзолата." + +#: lib/choose_repository.tcl:871 +msgid "Cannot fetch tags. See console output for details." +msgstr "" +"Етикетите не могат да бъдат изтеглени. За повече информация погледнете " +"изхода на конзолата." + +#: lib/choose_repository.tcl:895 +msgid "Cannot determine HEAD. See console output for details." +msgstr "" +"Върхът HEAD не може да бъде определен. За повече информация погледнете " +"изхода на конзолата." + +#: lib/choose_repository.tcl:904 +#, tcl-format +msgid "Unable to cleanup %s" +msgstr "Не може да се зачисти „%s“" + +#: lib/choose_repository.tcl:910 +msgid "Clone failed." +msgstr "Неуспешно клониране." + +#: lib/choose_repository.tcl:917 +msgid "No default branch obtained." +msgstr "Не е получен клон по подразбиране." + +#: lib/choose_repository.tcl:928 +#, tcl-format +msgid "Cannot resolve %s as a commit." +msgstr "Няма подаване отговарящо на „%s“." + +#: lib/choose_repository.tcl:940 +msgid "Creating working directory" +msgstr "Създаване на работната директория" + +#: lib/choose_repository.tcl:941 lib/index.tcl:70 lib/index.tcl:136 +#: lib/index.tcl:207 +msgid "files" +msgstr "файлове" + +#: lib/choose_repository.tcl:970 +msgid "Initial file checkout failed." +msgstr "Неуспешно първоначално изтегляне." + +#: lib/choose_repository.tcl:1014 +msgid "Open" +msgstr "Отваряне" + +#: lib/choose_repository.tcl:1024 +msgid "Repository:" +msgstr "Хранилище:" + +#: lib/choose_repository.tcl:1073 +#, tcl-format +msgid "Failed to open repository %s:" +msgstr "Неуспешно отваряне на хранилището „%s“:" + +#: lib/about.tcl:26 +msgid "git-gui - a graphical user interface for Git." +msgstr "git-gui — графичен интерфейс за Git." + +#: lib/checkout_op.tcl:85 +#, tcl-format +msgid "Fetching %s from %s" +msgstr "Доставяне на „%s“ от „%s“" + +#: lib/checkout_op.tcl:133 +#, tcl-format +msgid "fatal: Cannot resolve %s" +msgstr "фатална грешка: „%s“ не може да се открие" + +#: lib/checkout_op.tcl:175 +#, tcl-format +msgid "Branch '%s' does not exist." +msgstr "Клонът „%s“ не съществува." + +#: lib/checkout_op.tcl:194 +#, tcl-format +msgid "Failed to configure simplified git-pull for '%s'." +msgstr "Неуспешно настройване на опростен git-pull за „%s“." + +#: lib/checkout_op.tcl:229 +#, tcl-format +msgid "" +"Branch '%s' already exists.\n" +"\n" +"It cannot fast-forward to %s.\n" +"A merge is required." +msgstr "" +"Клонът „%s“ съществува.\n" +"\n" +"Той не може да бъде тривиално превъртян до %s.\n" +"Необходимо е сливане." + +#: lib/checkout_op.tcl:243 +#, tcl-format +msgid "Merge strategy '%s' not supported." +msgstr "Стратегия за сливане „%s“ не се поддържа." + +#: lib/checkout_op.tcl:262 +#, tcl-format +msgid "Failed to update '%s'." +msgstr "Неуспешно обновяване на „%s“." + +#: lib/checkout_op.tcl:274 +msgid "Staging area (index) is already locked." +msgstr "Индексът вече е заключен." + +#: lib/checkout_op.tcl:289 +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 the current branch can be changed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"Състоянието при последната проверка не отговаря на състоянието на " +"хранилището.\n" +"\n" +"Някой друг процес за Git е променил хранилището междувременно. Състоянието " +"трябва да бъде проверено, преди да се премине към нов клон.\n" +"\n" +"Автоматично ще започне нова проверка.\n" + +#: lib/checkout_op.tcl:345 +#, tcl-format +msgid "Updating working directory to '%s'..." +msgstr "Работната директория се привежда към „%s“…" + +#: lib/checkout_op.tcl:346 +msgid "files checked out" +msgstr "файла са изтеглени" + +#: lib/checkout_op.tcl:376 +#, tcl-format +msgid "Aborted checkout of '%s' (file level merging is required)." +msgstr "" +"Преустановяване на изтеглянето на „%s“ (необходимо е пофайлово сливане)." + +#: lib/checkout_op.tcl:377 +msgid "File level merge required." +msgstr "Необходимо е пофайлово сливане." + +#: lib/checkout_op.tcl:381 +#, tcl-format +msgid "Staying on branch '%s'." +msgstr "Оставане върху клона „%s“." + +#: lib/checkout_op.tcl:452 +msgid "" +"You are no longer on a local branch.\n" +"\n" +"If you wanted to be on a branch, create one now starting from 'This Detached " +"Checkout'." +msgstr "" +"Вече не сте на локален клон.\n" +"\n" +"Ако искате да сте на клон, създайте базиран на „Това несвързано изтегляне“." + +#: lib/checkout_op.tcl:503 lib/checkout_op.tcl:507 +#, tcl-format +msgid "Checked out '%s'." +msgstr "„%s“ е изтеглен." + +#: lib/checkout_op.tcl:535 +#, tcl-format +msgid "Resetting '%s' to '%s' will lose the following commits:" +msgstr "" +"Зануляването на „%s“ към „%s“ ще доведе до загубването на следните подавания:" + +#: lib/checkout_op.tcl:557 +msgid "Recovering lost commits may not be easy." +msgstr "Възстановяването на загубените подавания може да е трудно." + +#: lib/checkout_op.tcl:562 +#, tcl-format +msgid "Reset '%s'?" +msgstr "Зануляване на „%s“?" + +#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85 +msgid "Reset" +msgstr "Отначало" + +#: lib/checkout_op.tcl:635 +#, tcl-format +msgid "" +"Failed to set current branch.\n" +"\n" +"This working directory is only partially switched. We successfully updated " +"your files, but failed to update an internal Git file.\n" +"\n" +"This should not have occurred. %s will now close and give up." +msgstr "" +"Неуспешно задаване на текущия клон.\n" +"\n" +"Работната директория е само частично обновена: файловете са обновени " +"успешно, но някой от вътрешните, служебни файлове на Git не е бил.\n" +"\n" +"Това състояние е аварийно и не трябва да се случва. Програмата „%s“ ще " +"преустанови работа." + +#: lib/branch_create.tcl:23 +msgid "Create Branch" +msgstr "Създаване на клон" + +#: lib/branch_create.tcl:28 +msgid "Create New Branch" +msgstr "Създаване на нов клон" + +#: lib/branch_create.tcl:42 +msgid "Branch Name" +msgstr "Име на клона" + +#: lib/branch_create.tcl:57 +msgid "Match Tracking Branch Name" +msgstr "Съвпадане по името на следения клон" + +#: lib/branch_create.tcl:66 +msgid "Starting Revision" +msgstr "Начална версия" + +#: lib/branch_create.tcl:72 +msgid "Update Existing Branch:" +msgstr "Обновяване на съществуващ клон:" + +#: lib/branch_create.tcl:75 +msgid "No" +msgstr "Не" + +#: lib/branch_create.tcl:80 +msgid "Fast Forward Only" +msgstr "Само тривиално превъртащо сливане" + +#: lib/branch_create.tcl:97 +msgid "Checkout After Creation" +msgstr "Преминаване към клона след създаването му" + +#: lib/branch_create.tcl:132 +msgid "Please select a tracking branch." +msgstr "Изберете клон за следени." + +#: lib/branch_create.tcl:141 +#, tcl-format +msgid "Tracking branch %s is not a branch in the remote repository." +msgstr "Клонът, който се следи „%s“ не съществува в отдалеченото хранилище." + +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "В момента се извършва действие, изчакайте…" + +#: lib/console.tcl:186 +msgid "Success" +msgstr "Успех" + +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "Грешка: неуспешно изпълнение на команда" + +#: lib/choose_rev.tcl:52 +msgid "This Detached Checkout" +msgstr "Това несвързано изтегляне" + +#: lib/choose_rev.tcl:60 +msgid "Revision Expression:" +msgstr "Израз за версия" + +#: lib/choose_rev.tcl:72 +msgid "Local Branch" +msgstr "Локален клон" + +#: lib/choose_rev.tcl:77 +msgid "Tracking Branch" +msgstr "Следящ клон" + +#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544 +msgid "Tag" +msgstr "Етикет" + +#: lib/choose_rev.tcl:321 +#, tcl-format +msgid "Invalid revision: %s" +msgstr "Неправилна версия: %s" + +#: lib/choose_rev.tcl:342 +msgid "No revision selected." +msgstr "Не е избрана версия." + +#: lib/choose_rev.tcl:350 +msgid "Revision expression is empty." +msgstr "Изразът за версия е празен." + +#: lib/choose_rev.tcl:537 +msgid "Updated" +msgstr "Обновен" + +#: lib/choose_rev.tcl:565 +msgid "URL" +msgstr "Адрес" + +#: lib/line.tcl:17 +msgid "Goto Line:" +msgstr "Към ред:" + +#: lib/line.tcl:23 +msgid "Go" +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/commit.tcl:18 +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" +msgstr "" +"По време на сливане не може да поправяте.\n" +"\n" +"В момента все още не сте завършили операция по сливане. Не може да поправите " +"предишното подаване, освен ако първо не преустановите текущото сливане.\n" + +#: 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 "" +"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 another commit can be created.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" +"Състоянието при последната проверка не отговаря на състоянието на " +"хранилището.\n" +"\n" +"Някой друг процес за Git е променил хранилището междувременно. Състоянието " +"трябва да бъде проверено преди ново подаване.\n" +"\n" +"Автоматично ще започне нова проверка.\n" + +#: lib/commit.tcl:173 +#, 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" +msgstr "" +"Неслетите файлове не могат да бъдат подавани.\n" +"\n" +"Във файла „%s“ има конфликти при сливане. За да го подадете, трябва първо да " +"коригирате конфликтите и да добавите файла към индекса за подаване.\n" + +#: lib/commit.tcl:181 +#, 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" + +#: lib/commit.tcl:189 +msgid "" +"No changes to commit.\n" +"\n" +"You must stage at least 1 file before you can commit.\n" +msgstr "" +"Няма промени за подаване.\n" +"\n" +"Трябва да добавите поне 1 файл към индекса, преди да подадете.\n" + +#: lib/commit.tcl:204 +msgid "" +"Please supply a commit message.\n" +"\n" +"A good commit message has the following format:\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" +msgstr "" +"Задайте добро съобщение при подаване.\n" +"\n" +"Използвайте следния формат:\n" +"\n" +"⁃ Първи ред: описание в едно изречение на промяната.\n" +"⁃ Втори ред: празен.\n" +"⁃ Останалите редове: опишете защо се налага тази промяна.\n" + +#: lib/commit.tcl:235 +msgid "Calling pre-commit hook..." +msgstr "Изпълняване на куката преди подаване…" + +#: lib/commit.tcl:250 +msgid "Commit declined by pre-commit hook." +msgstr "Подаването е отхвърлено от куката преди подаване." + +#: lib/commit.tcl:269 +msgid "" +"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" +" \n" +"Сигурни ли сте, че искате да подадете точно сега?" + +#: lib/commit.tcl:290 +msgid "Calling commit-msg hook..." +msgstr "Изпълняване на куката за съобщението при подаване…" + +#: lib/commit.tcl:305 +msgid "Commit declined by commit-msg hook." +msgstr "Подаването е отхвърлено от куката за съобщението при подаване." + +#: lib/commit.tcl:318 +msgid "Committing changes..." +msgstr "Подаване на промените." + +#: lib/commit.tcl:334 +msgid "write-tree failed:" +msgstr "неуспешно запазване на дървото (write-tree):" + +#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400 +msgid "Commit failed." +msgstr "Неуспешно подаване." + +#: lib/commit.tcl:352 +#, tcl-format +msgid "Commit %s appears to be corrupt" +msgstr "Подаването „%s“ изглежда повредено" + +#: lib/commit.tcl:357 +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/commit.tcl:364 +msgid "No changes to commit." +msgstr "Няма промени за подаване." + +#: lib/commit.tcl:378 +msgid "commit-tree failed:" +msgstr "неуспешно подаване на дървото (commit-tree):" + +#: lib/commit.tcl:399 +msgid "update-ref failed:" +msgstr "неуспешно обновяване на указателите (update-ref):" + +#: lib/commit.tcl:492 +#, tcl-format +msgid "Created commit %s: %s" +msgstr "Успешно подаване %s: %s" + +#: lib/branch_delete.tcl:16 +msgid "Delete Branch" +msgstr "Изтриване на клон" + +#: lib/branch_delete.tcl:21 +msgid "Delete Local Branch" +msgstr "Изтриване на локален клон" + +#: lib/branch_delete.tcl:39 +msgid "Local Branches" +msgstr "Локални клони" + +#: lib/branch_delete.tcl:51 +msgid "Delete Only If Merged Into" +msgstr "Изтриване, само ако промените са слети и другаде" + +#: lib/branch_delete.tcl:103 +#, tcl-format +msgid "The following branches are not completely merged into %s:" +msgstr "Не всички промени в клоните са слети в %s:" + +#: lib/branch_delete.tcl:141 +#, tcl-format +msgid "" +"Failed to delete branches:\n" +"%s" +msgstr "" +"Неуспешно триене на клони:\n" +"%s" + +#: lib/blame.tcl:73 +msgid "File Viewer" +msgstr "Преглед на файлове" + +#: lib/blame.tcl:79 +msgid "Commit:" +msgstr "Подаване:" + +#: lib/blame.tcl:280 +msgid "Copy Commit" +msgstr "Копиране на подаване" + +#: lib/blame.tcl:284 +msgid "Find Text..." +msgstr "Търсене на текст…" + +#: 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 "В момента тече процес на анотиране." + +#: lib/blame.tcl:879 +msgid "Running thorough copy detection..." +msgstr "Изпълнява се цялостен процес на откриване на копиране…" + +#: lib/blame.tcl:947 +msgid "Loading annotation..." +msgstr "Зареждане на анотации…" + +#: 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: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/index.tcl:6 +msgid "Unable to unlock the index." +msgstr "Индексът не може да бъде отключен." + +#: lib/index.tcl:17 +msgid "Index Error" +msgstr "Грешка в индекса" + +#: lib/index.tcl:19 +msgid "" +"Updating the Git index failed. A rescan will be automatically started to " +"resynchronize git-gui." +msgstr "" +"Неуспешно обновяване на индекса на Git. Автоматично ще започне нова проверка " +"за синхронизирането на git-gui." + +#: lib/index.tcl:30 +msgid "Continue" +msgstr "Продължаване" + +#: lib/index.tcl:33 +msgid "Unlock Index" +msgstr "Отключване на индекса" + +#: lib/index.tcl:298 +#, tcl-format +msgid "Unstaging %s from commit" +msgstr "Изваждане на %s от подаването" + +#: lib/index.tcl:337 +msgid "Ready to commit." +msgstr "Готовност за подаване." + +#: lib/index.tcl:350 +#, tcl-format +msgid "Adding %s" +msgstr "Добавяне на „%s“" + +#: 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:430 +#, tcl-format +msgid "Revert changes in these %i files?" +msgstr "Да се махнат ли промените в тези %i файла?" + +#: lib/index.tcl:438 +msgid "Any unstaged changes will be permanently lost by the revert." +msgstr "" +"Всички промени, които не са били вкарани в индекса, ще бъдат безвъзвратно " +"загубени." + +#: lib/index.tcl:441 +msgid "Do Nothing" +msgstr "Нищо да не се прави" + +#: lib/index.tcl:459 +msgid "Reverting selected files" +msgstr "Махане на промените в избраните файлове" + +#: lib/index.tcl:463 +#, tcl-format +msgid "Reverting %s" +msgstr "Махане на промените в „%s“" + +#: 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/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Неправилни данни от Git: %s" + +#: lib/database.tcl:42 +msgid "Number of loose objects" +msgstr "Брой непакетирани обекти" + +#: lib/database.tcl:43 +msgid "Disk space used by loose objects" +msgstr "Дисково пространство заето от непакетирани обекти" + +#: lib/database.tcl:44 +msgid "Number of packed objects" +msgstr "Брой пакетирани обекти" + +#: lib/database.tcl:45 +msgid "Number of packs" +msgstr "Брой пакети" + +#: lib/database.tcl:46 +msgid "Disk space used by packed objects" +msgstr "Дисково пространство заето от пакетирани обекти" + +#: lib/database.tcl:47 +msgid "Packed objects waiting for pruning" +msgstr "Пакетирани обекти за окастряне" + +#: lib/database.tcl:48 +msgid "Garbage files" +msgstr "Файлове за боклука" + +#: lib/database.tcl:72 +msgid "Compressing the object database" +msgstr "Компресиране на базата с данни за обектите" + +#: lib/database.tcl:83 +msgid "Verifying the object database with fsck-objects" +msgstr "Проверка на базата с данни за обектите с програмата fsck-objects" + +#: lib/database.tcl:107 +#, tcl-format +msgid "" +"This repository currently has approximately %i loose objects.\n" +"\n" +"To maintain optimal performance it is strongly recommended that you compress " +"the database.\n" +"\n" +"Compress the database now?" +msgstr "" +"В това хранилище в момента има към %i непакетирани обекти.\n" +"\n" +"Зd добра производителност се препоръчва да компресирате базата с данни за " +"обектите.\n" +"\n" +"Да се започне ли компресирането?" + +#: lib/error.tcl:20 lib/error.tcl:116 +msgid "error" +msgstr "грешка" + +#: lib/error.tcl:36 +msgid "warning" +msgstr "предупреждение" + +#: lib/error.tcl:96 +msgid "You must correct the above errors before committing." +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/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" +"\n" + +#: lib/merge.tcl:45 +#, tcl-format +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/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/merge.tcl:108 +#, tcl-format +msgid "%s of %s" +msgstr "%s от общо %s" + +#: lib/merge.tcl:122 +#, tcl-format +msgid "Merging %s and %s..." +msgstr "Сливане на „%s“ и „%s“…" + +#: lib/merge.tcl:133 +msgid "Merge completed successfully." +msgstr "Сливането завърши успешно." + +#: lib/merge.tcl:135 +msgid "Merge failed. Conflict resolution is required." +msgstr "Неуспешно сливане — има конфликти за коригиране." + +#: lib/merge.tcl:160 +#, tcl-format +msgid "Merge Into %s" +msgstr "Сливане в „%s“" + +#: lib/merge.tcl:179 +msgid "Revision To Merge" +msgstr "Версия за сливане" + +#: lib/merge.tcl:214 +msgid "" +"Cannot abort while amending.\n" +"\n" +"You must finish amending this commit.\n" +msgstr "" +"Поправянето не може да бъде преустановено.\n" +"\n" +"Трябва да завършите поправката на това подаване.\n" + +#: 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/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/merge.tcl:241 +msgid "Aborting" +msgstr "Преустановяване" + +#: lib/merge.tcl:241 +msgid "files reset" +msgstr "файла със занулени промени" + +#: lib/merge.tcl:269 +msgid "Abort failed." +msgstr "Неуспешно преустановяване." + +#: lib/merge.tcl:271 +msgid "Abort completed. Ready." +msgstr "Успешно преустановяване. Готовност за следващо действие." diff --git a/git-gui/po/glossary/bg.po b/git-gui/po/glossary/bg.po new file mode 100644 index 000000000..8b71fad9a --- /dev/null +++ b/git-gui/po/glossary/bg.po @@ -0,0 +1,287 @@ +# Bulgarian translation of git-gui-glossary po-file. +# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014. +# +# +msgid "" +msgstr "" +"Project-Id-Version: git-gui-glossary master\n" +"POT-Creation-Date: 2014-01-13 21:39+0200\n" +"PO-Revision-Date: 2014-01-13 21:39+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)" +msgid "" +"English Term (Dear translator: This file will never be visible to the user!)" +msgstr "Термин" + +#. "" +msgid "amend" +msgstr "поправям" + +#. "" +msgid "annotate" +msgstr "анотирам" + +#. "A 'branch' is an active line of development." +msgid "branch [noun]" +msgstr "клон, разклонение [съществително]" + +#. "" +msgid "branch [verb]" +msgstr "разклонявам [глагол]" + +#. "" +msgid "checkout [noun]" +msgstr "изтегляне [съществително]" + +#. "The action of updating the working tree to a revision which was stored in the object database." +msgid "checkout [verb]" +msgstr "изтегляне [глагол]" + +#. "" +msgid "clone [verb]" +msgstr "клонирам [глагол]" + +#. "A single point in the git history." +msgid "commit [noun]" +msgstr "подаване [съществително]" + +#. "The action of storing a new snapshot of the project's state in the git history." +msgid "commit [verb]" +msgstr "подавам [съществително]" + +#. "" +msgid "diff [noun]" +msgstr "разлика/промени [съществително]" + +#. "" +msgid "diff [verb]" +msgstr "изчислявам разлика/промени [глагол]" + +#. "A fast-forward is a special type of merge where you have a revision and you are merging another branch's changes that happen to be a descendant of what you have." +msgid "fast forward merge" +msgstr "превъртащо/директно/тривиално сливане" + +#. "Fetching a branch means to get the branch's head from a remote repository, to find out which objects are missing from the local object database, and to get them, too." +msgid "fetch" +msgstr "доставяне" + +#. "One context of consecutive lines in a whole patch, which consists of many such hunks" +msgid "hunk" +msgstr "парче" + +#. "A collection of files. The index is a stored version of your working tree." +msgid "index (in git-gui: staging area)" +msgstr "скеле/индекс/изба" + +#. "A successful merge results in the creation of a new commit representing the result of the merge." +msgid "merge [noun]" +msgstr "сливане/обединяване [съществително]" + +#. "To bring the contents of another branch into the current branch." +msgid "merge [verb]" +msgstr "сливам/обединявам [глагол]" + +#. "" +msgid "message" +msgstr "съобщение" + +#. "Deletes all stale tracking branches under <name>. These stale branches have already been removed from the remote repository referenced by <name>, but are still locally available in 'remotes/<name>'." +msgid "prune" +msgstr "окастрям" + +#. "Pulling a branch means to fetch it and merge it." +msgid "pull" +msgstr "издърпвам" + +#. "Pushing a branch means to get the branch's head ref from a remote repository, and ... (well, can someone please explain it for mere mortals?)" +msgid "push" +msgstr "изтласквам" + +#. "" +msgid "redo" +msgstr "повтарям/правя наново" + +#. "An other repository ('remote'). One might have a set of remotes whose branches one tracks." +msgid "remote" +msgstr "отдалечено хранилище" + +#. "A collection of refs (?) together with an object database containing all objects which are reachable from the refs... (oops, you've lost me here. Again, please an explanation for mere mortals?)" +msgid "repository" +msgstr "хранилище" + +#. "" +msgid "reset" +msgstr "занулявам/отменям" + +#. "" +msgid "revert" +msgstr "връщам/отменям" + +#. "A particular state of files and directories which was stored in the object database." +msgid "revision" +msgstr "версия" + +#. "" +msgid "sign off" +msgstr "подписвам" + +#. "" +msgid "staging area" +msgstr "скеле/индекс/изба" + +#. "" +msgid "status" +msgstr "състояние" + +#. "A ref pointing to a tag or commit object" +msgid "tag [noun]" +msgstr "етикет [съществително]" + +#. "" +msgid "tag [verb]" +msgstr "задавам етикет [глагол]" + +#. "A regular git branch that is used to follow changes from another repository." +msgid "tracking branch" +msgstr "следящ клон" + +#. "" +msgid "undo" +msgstr "отменям" + +#. "" +msgid "update" +msgstr "обновявам" + +#. "" +msgid "verify" +msgstr "проверявам" + +#. "The tree of actual checked out files." +msgid "working copy, working tree" +msgstr "работно копие/работно дърво" + +#. "a commit that succeeds the current one in git's graph of commits (not necessarily directly)" +msgid "ancestor" +msgstr "предшественик" + +#. "prematurely stop and abandon an operation" +msgid "abort" +msgstr "преустановявам" + +#. "a repository with only .git directory, without working directory" +msgid "bare repository" +msgstr "голо хранилище" + +#. "a parent version of the current file" +msgid "base" +msgstr "родителска версия" + +#. "get the authors responsible for each line in a file" +msgid "blame" +msgstr "анотирам/анотиране" + +#. "to select and apply a single commit without merging" +msgid "cherry-pick" +msgstr "отбирам" + +#. "a commit that directly succeeds the current one in git's graph of commits" +msgid "child" +msgstr "дете" + +#. "clean the state of the git repository, often after manually stopped operation" +msgid "cleanup" +msgstr "зачиствам" + +#. "a message that gets attached with any commit" +msgid "commit message" +msgstr "съобщение при подаване" + +#. "a commit that precedes the current one in git's graph of commits (not necessarily directly)" +msgid "descendant" +msgstr "наследник" + +#. "checkout of a revision rather than a some head" +msgid "detached checkout" +msgstr "несвързано изтегляне" + +#. "any merge strategy that works on a file by file basis" +msgid "file level merging" +msgstr "пофайлово сливане" + +#. "the last revision in a branch" +msgid "head" +msgstr "глава/връх (на клон, разработка)" + +#. "script that gets executed automatically on some event" +msgid "hook" +msgstr "кука/автоматичен скрипт" + +#. "the first checkout during a clone operation" +msgid "initial checkout" +msgstr "първоначално изтегляне" + +#. "a branch that resides in the local git repository" +msgid "local branch" +msgstr "локален клон" + +#. "a Git object that is not part of any pack" +msgid "loose object" +msgstr "непакетиран обект" + +#. "a branch called by convention 'master' that exists in a newly created git repository" +msgid "master branch" +msgstr "основен клон" + +#. "a remote called by convention 'origin' that the current git repository has been cloned from" +msgid "origin" +msgstr "хранилище-източник" + +#. "a file containing many git objects packed together" +msgid "pack [noun]" +msgstr "етикет" + +#. "a Git object part of some pack" +msgid "packed object" +msgstr "пакетиран обект" + +#. "a commit that directly precedes the current one in git's graph of commits" +msgid "parent" +msgstr "родител" + +#. "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)" +msgid "reflog" +msgstr "журнал на указателите" + +#. "decide which changes from alternative versions of a file should persist in Git" +msgid "resolve (a conflict)" +msgstr "коригирам (конфликт)" + +#. "abandon changes and go to pristine version" +msgid "revert changes" +msgstr "връщане на оригинала" + +#. "expression that signifies a revision in git" +msgid "revision expression" +msgstr "израз за версия" + +#. "add some content of files and directories to the staging area in preparation for a commit" +msgid "stage/unstage" +msgstr "(добавяне) към скелето за подаване/изваждане от скелето за подаване" + +#. "temporarily save changes in a stack without committing" +msgid "stash" +msgstr "скатавам промени" + +#. "file whose content is tracked/not tracked by git" +msgid "tracked/untracked" +msgstr "следен/неследен" diff --git a/git-gui/po/glossary/git-gui-glossary.txt b/git-gui/po/glossary/git-gui-glossary.txt index 9b31f6915..409304692 100644 --- a/git-gui/po/glossary/git-gui-glossary.txt +++ b/git-gui/po/glossary/git-gui-glossary.txt @@ -36,3 +36,32 @@ "update" "" "verify" "" "working copy, working tree" "The tree of actual checked out files." +"ancestor" "a commit that succeeds the current one in git's graph of commits (not necessarily directly)" +"abort" "prematurely stop and abandon an operation" +"bare repository" "a repository with only .git directory, without working directory" +"base" "a parent version of the current file" +"blame" "get the authors responsible for each line in a file" +"cherry-pick" "to select and apply a single commit without merging" +"child" "a commit that directly succeeds the current one in git's graph of commits" +"cleanup" "clean the state of the git repository, often after manually stopped operation" +"commit message" "a message that gets attached with any commit" +"descendant" "a commit that precedes the current one in git's graph of commits (not necessarily directly)" +"detached checkout" "checkout of a revision rather than a some head" +"file level merging" "any merge strategy that works on a file by file basis" +"head" "the last revision in a branch" +"hook" "script that gets executed automatically on some event" +"initial checkout" "the first checkout during a clone operation" +"local branch" "a branch that resides in the local git repository" +"loose object" "a Git object that is not part of any pack" +"master branch" "a branch called by convention 'master' that exists in a newly created git repository" +"origin" "a remote called by convention 'origin' that the current git repository has been cloned from" +"pack [noun]" "a file containing many git objects packed together" +"packed object" "a Git object part of some pack" +"parent" "a commit that directly precedes the current one in git's graph of commits" +"reflog" "the log file containing all states of the HEAD reference (in other words past pristine states of the working copy)" +"resolve (a conflict)" "decide which changes from alternative versions of a file should persist in Git" +"revert changes" "abandon changes and go to pristine version" +"revision expression" "expression that signifies a revision in git" +"stage/unstage" "add some content of files and directories to the staging area in preparation for a commit" +"stash" "temporarily save changes in a stack without committing" +"tracked/untracked" "file whose content is tracked/not tracked by git" diff --git a/git-gui/po/po2msg.sh b/git-gui/po/po2msg.sh index 1e9f99252..1e9f99252 100644..100755 --- a/git-gui/po/po2msg.sh +++ b/git-gui/po/po2msg.sh diff --git a/git-gui/windows/git-gui.sh b/git-gui/windows/git-gui.sh index b1845c505..b1845c505 100644..100755 --- a/git-gui/windows/git-gui.sh +++ b/git-gui/windows/git-gui.sh @@ -310,8 +310,8 @@ def split_p4_type(p4type): # # return the raw p4 type of a file (text, text+ko, etc) # -def p4_type(file): - results = p4CmdList(["fstat", "-T", "headType", file]) +def p4_type(f): + results = p4CmdList(["fstat", "-T", "headType", wildcard_encode(f)]) return results[0]['headType'] # @@ -1220,7 +1220,7 @@ class P4Submit(Command, P4UserMap): editor = os.environ.get("P4EDITOR") else: editor = read_pipe("git var GIT_EDITOR").strip() - system(editor + " " + template_file) + system([editor, template_file]) # If the file was not saved, prompt to see if this patch should # be skipped. But skip this verification step if configured so. @@ -1871,7 +1871,7 @@ class View(object): # assume error is "... file(s) not in client view" continue if "clientFile" not in res: - die("No clientFile from 'p4 where %s'" % depot_path) + die("No clientFile in 'p4 where' output") if "unmap" in res: # it will list all of them, but only one not unmap-ped continue @@ -2075,7 +2075,14 @@ class P4Sync(Command, P4UserMap): # p4 print on a symlink sometimes contains "target\n"; # if it does, remove the newline data = ''.join(contents) - if data[-1] == '\n': + if not data: + # Some version of p4 allowed creating a symlink that pointed + # to nothing. This causes p4 errors when checking out such + # a change, and errors here too. Work around it by ignoring + # the bad symlink; hopefully a future change fixes it. + print "\nIgnoring empty symlink in %s" % file['depotFile'] + return + elif data[-1] == '\n': contents = [data[:-1]] else: contents = [data] diff --git a/git-send-email.perl b/git-send-email.perl index 2016d9c61..fdb0029b5 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -1095,7 +1095,8 @@ sub ssl_verify_params { } if (!defined $smtp_ssl_cert_path) { - $smtp_ssl_cert_path = "/etc/ssl/certs"; + # use the OpenSSL defaults + return (SSL_verify_mode => SSL_VERIFY_PEER()); } if ($smtp_ssl_cert_path eq "") { @@ -1,6 +1,6 @@ 1 VERSIONINFO -FILEVERSION MAJOR,MINOR,PATCH,0 -PRODUCTVERSION MAJOR,MINOR,PATCH,0 +FILEVERSION MAJOR,MINOR,0,0 +PRODUCTVERSION MAJOR,MINOR,0,0 BEGIN BLOCK "StringFileInfo" BEGIN diff --git a/gitk-git/gitk b/gitk-git/gitk index 33c3a6c6b..90764e894 100755 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -2,7 +2,7 @@ # Tcl ignores the next line -*- tcl -*- \ exec wish "$0" -- "$@" -# Copyright © 2005-2011 Paul Mackerras. All rights reserved. +# Copyright © 2005-2014 Paul Mackerras. All rights reserved. # This program is free software; it may be used, copied, modified # and distributed under the terms of the GNU General Public Licence, # either version 2, or (at your option) any later version. @@ -2263,9 +2263,35 @@ proc makewindow {} { # build up the bottom bar of upper window ${NS}::label .tf.lbar.flabel -text "[mc "Find"] " - ${NS}::button .tf.lbar.fnext -text [mc "next"] -command {dofind 1 1} - ${NS}::button .tf.lbar.fprev -text [mc "prev"] -command {dofind -1 1} + + set bm_down_data { + #define down_width 16 + #define down_height 16 + static unsigned char down_bits[] = { + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x87, 0xe1, 0x8e, 0x71, 0x9c, 0x39, 0xb8, 0x1d, + 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}; + } + image create bitmap bm-down -data $bm_down_data -foreground $uifgcolor + ${NS}::button .tf.lbar.fnext -width 26 -command {dofind 1 1} + .tf.lbar.fnext configure -image bm-down + + set bm_up_data { + #define up_width 16 + #define up_height 16 + static unsigned char up_bits[] = { + 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, + 0xb8, 0x1d, 0x9c, 0x39, 0x8e, 0x71, 0x87, 0xe1, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01}; + } + image create bitmap bm-up -data $bm_up_data -foreground $uifgcolor + ${NS}::button .tf.lbar.fprev -width 26 -command {dofind -1 1} + .tf.lbar.fprev configure -image bm-up + ${NS}::label .tf.lbar.flab2 -text " [mc "commit"] " + pack .tf.lbar.flabel .tf.lbar.fnext .tf.lbar.fprev .tf.lbar.flab2 \ -side left -fill y set gdttype [mc "containing:"] @@ -2403,7 +2429,7 @@ proc makewindow {} { $ctext tag conf msep -font textfontbold $ctext tag conf found -back $foundbgcolor $ctext tag conf currentsearchhit -back $currentsearchhitbgcolor - $ctext tag conf wwrap -wrap word + $ctext tag conf wwrap -wrap word -lmargin2 1c $ctext tag conf bold -font textfontbold .pwbottom add .bleft @@ -2761,14 +2787,17 @@ proc savestuff {w} { global linkfgcolor circleoutlinecolor global autoselect autosellen extdifftool perfile_attrs markbgcolor use_ttk global hideremotes want_ttk maxrefs + global config_file config_file_tmp if {$stuffsaved} return if {![winfo viewable .]} return catch { - if {[file exists ~/.gitk-new]} {file delete -force ~/.gitk-new} - set f [open "~/.gitk-new" w] + if {[file exists $config_file_tmp]} { + file delete -force $config_file_tmp + } + set f [open $config_file_tmp w] if {$::tcl_platform(platform) eq {windows}} { - file attributes "~/.gitk-new" -hidden true + file attributes $config_file_tmp -hidden true } puts $f [list set mainfont $mainfont] puts $f [list set textfont $textfont] @@ -2845,7 +2874,7 @@ proc savestuff {w} { } puts $f "}" close $f - file rename -force "~/.gitk-new" "~/.gitk" + file rename -force $config_file_tmp $config_file } set stuffsaved 1 } @@ -2947,7 +2976,7 @@ proc about {} { message $w.m -text [mc " Gitk - a commit viewer for git -Copyright \u00a9 2005-2011 Paul Mackerras +Copyright \u00a9 2005-2014 Paul Mackerras Use and redistribute under the terms of the GNU General Public License"] \ -justify center -aspect 400 -border 2 -bg white -relief groove @@ -7922,7 +7951,7 @@ proc blobdiffmaybeseehere {ateof} { if {$diffseehere >= 0} { mark_ctext_line [lindex [split $diffseehere .] 0] } - maybe_scroll_ctext ateof + maybe_scroll_ctext $ateof } proc getblobdiffline {bdf ids} { @@ -12058,7 +12087,29 @@ namespace import ::msgcat::mc ## And eventually load the actual message catalog ::msgcat::mcload $gitk_msgsdir -catch {source ~/.gitk} +catch { + # follow the XDG base directory specification by default. See + # http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + if {[info exists env(XDG_CONFIG_HOME)] && $env(XDG_CONFIG_HOME) ne ""} { + # XDG_CONFIG_HOME environment variable is set + set config_file [file join $env(XDG_CONFIG_HOME) git gitk] + set config_file_tmp [file join $env(XDG_CONFIG_HOME) git gitk-tmp] + } else { + # default XDG_CONFIG_HOME + set config_file "~/.config/git/gitk" + set config_file_tmp "~/.config/git/gitk-tmp" + } + if {![file exists $config_file]} { + # for backward compatibility use the old config file if it exists + if {[file exists "~/.gitk"]} { + set config_file "~/.gitk" + set config_file_tmp "~/.gitk-tmp" + } elseif {![file exists [file dirname $config_file]]} { + file mkdir [file dirname $config_file] + } + } + source $config_file +} parsefont mainfont $mainfont eval font create mainfont [fontflags mainfont] diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po new file mode 100644 index 000000000..782397e6b --- /dev/null +++ b/gitk-git/po/bg.po @@ -0,0 +1,1334 @@ +# Bulgarian translation of gitk po-file. +# Copyright (C) 2014 Alexander Shopov <ash@kambanaria.org>. +# This file is distributed under the same license as the git package. +# Alexander Shopov <ash@kambanaria.org>, 2014. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gitk master\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-01-26 15:47-0800\n" +"PO-Revision-Date: 2014-01-08 08:03+0200\n" +"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n" +"Language-Team: Bulgarian <dict@fsa-bg.org>\n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: gitk:140 +msgid "Couldn't get list of unmerged files:" +msgstr "Списъкът с неслети файлове не може да бъде получен:" + +#: gitk:212 gitk:2353 +msgid "Color words" +msgstr "Оцветяване на думите" + +#: gitk:217 gitk:2353 gitk:8103 gitk:8136 +msgid "Markup words" +msgstr "Отбелязване на думите" + +#: gitk:322 +msgid "Error parsing revisions:" +msgstr "Грешка при разбор на версиите:" + +#: gitk:378 +msgid "Error executing --argscmd command:" +msgstr "Грешка при изпълнение на командата с „--argscmd“." + +#: gitk:391 +msgid "No files selected: --merge specified but no files are unmerged." +msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове." + +#: gitk:394 +msgid "" +"No files selected: --merge specified but no unmerged files are within file " +"limit." +msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове в ограниченията." + +#: gitk:416 gitk:564 +msgid "Error executing git log:" +msgstr "Грешка при изпълнение на „git log“:" + +#: gitk:434 gitk:580 +msgid "Reading" +msgstr "Прочитане" + +#: gitk:494 gitk:4429 +msgid "Reading commits..." +msgstr "Прочитане на подаванията…" + +#: gitk:497 gitk:1635 gitk:4432 +msgid "No commits selected" +msgstr "Не са избрани подавания" + +#: gitk:1509 +msgid "Can't parse git log output:" +msgstr "Изходът от „git log“ не може да се анализира:" + +#: gitk:1738 +msgid "No commit information available" +msgstr "Липсва информация за подавания" + +#: gitk:1895 +msgid "mc" +msgstr "mc" + +#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401 +msgid "OK" +msgstr "Добре" + +#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554 +#: gitk:11123 gitk:11402 +msgid "Cancel" +msgstr "Отказ" + +#: gitk:2067 +msgid "Update" +msgstr "Обновяване" + +#: gitk:2068 +msgid "Reload" +msgstr "Презареждане" + +#: gitk:2069 +msgid "Reread references" +msgstr "Наново прочитане на настройките" + +#: gitk:2070 +msgid "List references" +msgstr "Изброяване на указателите" + +#: gitk:2072 +msgid "Start git gui" +msgstr "Стартиране на git gui" + +#: gitk:2074 +msgid "Quit" +msgstr "Спиране на програмата" + +#: gitk:2066 +msgid "File" +msgstr "Файл" + +#: gitk:2078 +msgid "Preferences" +msgstr "Настройки" + +#: gitk:2077 +msgid "Edit" +msgstr "Редактиране" + +#: gitk:2082 +msgid "New view..." +msgstr "Нов изглед…" + +#: gitk:2083 +msgid "Edit view..." +msgstr "Редактиране на изгледа…" + +#: gitk:2084 +msgid "Delete view" +msgstr "Изтриване на изгледа" + +#: gitk:2086 +msgid "All files" +msgstr "Всички файлове" + +#: gitk:2081 gitk:3975 +msgid "View" +msgstr "Изглед" + +#: gitk:2091 gitk:2101 gitk:2945 +msgid "About gitk" +msgstr "Относно gitk" + +#: gitk:2092 gitk:2106 +msgid "Key bindings" +msgstr "Клавишни комбинации" + +#: gitk:2090 gitk:2105 +msgid "Help" +msgstr "Помощ" + +#: gitk:2183 gitk:8535 +msgid "SHA1 ID:" +msgstr "SHA1:" + +#: gitk:2227 +msgid "Row" +msgstr "Ред" + +#: gitk:2265 +msgid "Find" +msgstr "Търсене" + +#: gitk:2266 +msgid "next" +msgstr "следващо" + +#: gitk:2267 +msgid "prev" +msgstr "предишно" + +#: gitk:2268 +msgid "commit" +msgstr "подаване" + +#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725 +#: gitk:6810 +msgid "containing:" +msgstr "съдържащо:" + +#: gitk:2274 gitk:3457 gitk:3462 gitk:4666 +msgid "touching paths:" +msgstr "засягащо пътищата:" + +#: gitk:2275 gitk:4680 +msgid "adding/removing string:" +msgstr "добавящо/премахващо низ" + +#: gitk:2276 gitk:4682 +msgid "changing lines matching:" +msgstr "променящо редове напасващи:" + +#: gitk:2285 gitk:2287 gitk:4669 +msgid "Exact" +msgstr "Точно" + +#: gitk:2287 gitk:4757 gitk:6621 +msgid "IgnCase" +msgstr "Без регистър" + +#: gitk:2287 gitk:4639 gitk:4755 gitk:6617 +msgid "Regexp" +msgstr "Рег. изр." + +#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814 +msgid "All fields" +msgstr "Всички полета" + +#: gitk:2290 gitk:4774 gitk:4807 gitk:6684 +msgid "Headline" +msgstr "Първи ред" + +#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283 +msgid "Comments" +msgstr "Коментари" + +#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713 +#: gitk:8728 +msgid "Author" +msgstr "Автор" + +#: gitk:2291 gitk:4774 gitk:6684 gitk:7220 +msgid "Committer" +msgstr "Подаващ" + +#: gitk:2322 +msgid "Search" +msgstr "Търсене" + +#: gitk:2330 +msgid "Diff" +msgstr "Разлики" + +#: gitk:2332 +msgid "Old version" +msgstr "Стара версия" + +#: gitk:2334 +msgid "New version" +msgstr "Нова версия" + +#: gitk:2336 +msgid "Lines of context" +msgstr "Контекст в редове" + +#: gitk:2346 +msgid "Ignore space change" +msgstr "Празните знаци без значение" + +#: gitk:2350 gitk:2352 gitk:7842 gitk:8089 +msgid "Line diff" +msgstr "Поредови разлики" + +#: gitk:2417 +msgid "Patch" +msgstr "Кръпка" + +#: gitk:2419 +msgid "Tree" +msgstr "Дърво" + +#: gitk:2577 gitk:2597 +msgid "Diff this -> selected" +msgstr "Разлики между това и избраното" + +#: gitk:2578 gitk:2598 +msgid "Diff selected -> this" +msgstr "Разлики между избраното и това" + +#: gitk:2579 gitk:2599 +msgid "Make patch" +msgstr "Създаване на кръпка" + +#: gitk:2580 gitk:9137 +msgid "Create tag" +msgstr "Създаване на етикет" + +#: gitk:2581 gitk:9254 +msgid "Write commit to file" +msgstr "Запазване на подаването във файл" + +#: gitk:2582 gitk:9311 +msgid "Create new branch" +msgstr "Създаване на нов клон" + +#: gitk:2583 +msgid "Cherry-pick this commit" +msgstr "Отбиране на това подаване" + +#: gitk:2584 +msgid "Reset HEAD branch to here" +msgstr "Привеждане на върха на клона към текущото подаване" + +#: gitk:2585 +msgid "Mark this commit" +msgstr "Отбелязване на това подаване" + +#: gitk:2586 +msgid "Return to mark" +msgstr "Връщане към отбелязаното подаване" + +#: gitk:2587 +msgid "Find descendant of this and mark" +msgstr "Откриване и отбелязване на наследниците" + +#: gitk:2588 +msgid "Compare with marked commit" +msgstr "Сравнение с отбелязаното подаване" + +#: gitk:2589 gitk:2600 +msgid "Diff this -> marked commit" +msgstr "Разлики между това и отбелязаното" + +#: gitk:2590 gitk:2601 +msgid "Diff marked commit -> this" +msgstr "Разлики между отбелязаното и това" + +#: gitk:2591 +msgid "Revert this commit" +msgstr "Отмяна на това подаване" + +#: gitk:2607 +msgid "Check out this branch" +msgstr "Изтегляне на този клон" + +#: gitk:2608 +msgid "Remove this branch" +msgstr "Изтриване на този клон" + +#: gitk:2615 +msgid "Highlight this too" +msgstr "Отбелязване и на това" + +#: gitk:2616 +msgid "Highlight this only" +msgstr "Отбелязване само на това" + +#: gitk:2617 +msgid "External diff" +msgstr "Външна програма за разлики" + +#: gitk:2618 +msgid "Blame parent commit" +msgstr "Анотиране на родителското подаване" + +#: gitk:2625 +msgid "Show origin of this line" +msgstr "Показване на произхода на този ред" + +#: gitk:2626 +msgid "Run git gui blame on this line" +msgstr "Изпълнение на „git gui blame“ върху този ред" + +#: gitk:2947 +msgid "" +"\n" +"Gitk - a commit viewer for git\n" +"\n" +"Copyright © 2005-2011 Paul Mackerras\n" +"\n" +"Use and redistribute under the terms of the GNU General Public License" +msgstr "" +"\n" +"Gitk — визуализация на подаванията в Git\n" +"\n" +"Авторски права: © 2005-2011 Paul Mackerras\n" +"\n" +"Използвайте и разпространявайте при условията на ОПЛ на ГНУ" + +#: gitk:2955 gitk:3020 gitk:9738 +msgid "Close" +msgstr "Затваряне" + +#: gitk:2976 +msgid "Gitk key bindings" +msgstr "Клавишни комбинации" + +#: gitk:2979 +msgid "Gitk key bindings:" +msgstr "Клавишни комбинации:" + +#: gitk:2981 +#, tcl-format +msgid "<%s-Q>\t\tQuit" +msgstr "<%s-Q>\t\tСпиране на програмата" + +#: gitk:2982 +#, tcl-format +msgid "<%s-W>\t\tClose window" +msgstr "<%s-W>\t\tЗатваряне на прозореца" + +#: gitk:2983 +msgid "<Home>\t\tMove to first commit" +msgstr "<Home>\t\tКъм първото подаване" + +#: gitk:2984 +msgid "<End>\t\tMove to last commit" +msgstr "<End>\t\tКъм последното подаване" + +#: gitk:2985 +msgid "<Up>, p, k\tMove up one commit" +msgstr "<Up>, p, k\tЕдно подаване нагоре" + +#: gitk:2986 +msgid "<Down>, n, j\tMove down one commit" +msgstr "<Down>, n, j\tЕдно подаване надолу" + +#: gitk:2987 +msgid "<Left>, z, h\tGo back in history list" +msgstr "<Left>, z, h\tНазад в историята" + +#: gitk:2988 +msgid "<Right>, x, l\tGo forward in history list" +msgstr "<Right>, x, l\tНапред в историята" + +#: gitk:2989 +msgid "<PageUp>\tMove up one page in commit list" +msgstr "<PageUp>\tЕдна страница нагоре в списъка с подаванията" + +#: gitk:2990 +msgid "<PageDown>\tMove down one page in commit list" +msgstr "<PageDown>\tЕдна страница надолу в списъка с подаванията" + +#: gitk:2991 +#, tcl-format +msgid "<%s-Home>\tScroll to top of commit list" +msgstr "<%s-Home>\tКъм началото на списъка с подаванията" + +#: gitk:2992 +#, tcl-format +msgid "<%s-End>\tScroll to bottom of commit list" +msgstr "<%s-End>\tКъм края на списъка с подаванията" + +#: gitk:2993 +#, tcl-format +msgid "<%s-Up>\tScroll commit list up one line" +msgstr "<%s-Up>\tПридвижване на списъка с подавания с един ред нагоре" + +#: gitk:2994 +#, tcl-format +msgid "<%s-Down>\tScroll commit list down one line" +msgstr "<%s-Down>\tПридвижване на списъка с подавания с един ред надолу" + +#: gitk:2995 +#, tcl-format +msgid "<%s-PageUp>\tScroll commit list up one page" +msgstr "<%s-PageUp>\tПридвижване на списъка с подавания с една страница нагоре" + +#: gitk:2996 +#, tcl-format +msgid "<%s-PageDown>\tScroll commit list down one page" +msgstr "<%s-PageDown>\tПридвижване на списъка с подавания с една страница надолу" + +#: gitk:2997 +msgid "<Shift-Up>\tFind backwards (upwards, later commits)" +msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)" + +#: gitk:2998 +msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)" +msgstr "<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)" + +#: gitk:2999 +msgid "<Delete>, b\tScroll diff view up one page" +msgstr "<Delete>, b\tПридвижване на изгледа за разлики една страница нагоре" + +#: gitk:3000 +msgid "<Backspace>\tScroll diff view up one page" +msgstr "<Backspace>\tПридвижване на изгледа за разлики една страница нагоре" + +#: gitk:3001 +msgid "<Space>\t\tScroll diff view down one page" +msgstr "<Space>\t\tПридвижване на изгледа за разлики една страница надолу" + +#: gitk:3002 +msgid "u\t\tScroll diff view up 18 lines" +msgstr "u\t\tПридвижване на изгледа за разлики 18 реда нагоре" + +#: gitk:3003 +msgid "d\t\tScroll diff view down 18 lines" +msgstr "d\t\tПридвижване на изгледа за разлики 18 реда надолу" + +#: gitk:3004 +#, tcl-format +msgid "<%s-F>\t\tFind" +msgstr "<%s-F>\t\tТърсене" + +#: gitk:3005 +#, tcl-format +msgid "<%s-G>\t\tMove to next find hit" +msgstr "<%s-G>\t\tКъм следващата поява" + +#: gitk:3006 +msgid "<Return>\tMove to next find hit" +msgstr "<Return>\tКъм следващата поява" + +#: gitk:3007 +msgid "/\t\tFocus the search box" +msgstr "/\t\tФокус върху полето за търсене" + +#: gitk:3008 +msgid "?\t\tMove to previous find hit" +msgstr "?\t\tКъм предишната поява" + +#: gitk:3009 +msgid "f\t\tScroll diff view to next file" +msgstr "f\t\tПридвижване на изгледа за разлики към следващия ред" + +#: gitk:3010 +#, tcl-format +msgid "<%s-S>\t\tSearch for next hit in diff view" +msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики" + +#: gitk:3011 +#, tcl-format +msgid "<%s-R>\t\tSearch for previous hit in diff view" +msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики" + +#: gitk:3012 +#, tcl-format +msgid "<%s-KP+>\tIncrease font size" +msgstr "<%s-KP+>\tПо-голям размер на шрифта" + +#: gitk:3013 +#, tcl-format +msgid "<%s-plus>\tIncrease font size" +msgstr "<%s-plus>\tПо-голям размер на шрифта" + +#: gitk:3014 +#, tcl-format +msgid "<%s-KP->\tDecrease font size" +msgstr "<%s-KP->\tПо-малък размер на шрифта" + +#: gitk:3015 +#, tcl-format +msgid "<%s-minus>\tDecrease font size" +msgstr "<%s-minus>\tПо-малък размер на шрифта" + +#: gitk:3016 +msgid "<F5>\t\tUpdate" +msgstr "<F5>\t\tОбновяване" + +#: gitk:3471 gitk:3480 +#, tcl-format +msgid "Error creating temporary directory %s:" +msgstr "Грешка при създаването на временната директория „%s“:" + +#: gitk:3493 +#, tcl-format +msgid "Error getting \"%s\" from %s:" +msgstr "Грешка при получаването на „%s“ от %s:" + +#: gitk:3556 +msgid "command failed:" +msgstr "неуспешно изпълнение на команда:" + +#: gitk:3705 +msgid "No such commit" +msgstr "Такова подаване няма" + +#: gitk:3719 +msgid "git gui blame: command failed:" +msgstr "git gui blame: неуспешно изпълнение на команда:" + +#: gitk:3750 +#, tcl-format +msgid "Couldn't read merge head: %s" +msgstr "Върхът за сливане не може да бъде прочетен: %s" + +#: gitk:3758 +#, tcl-format +msgid "Error reading index: %s" +msgstr "Грешка при прочитане на индекса: %s" + +#: gitk:3783 +#, tcl-format +msgid "Couldn't start git blame: %s" +msgstr "Командата „git blame“ не може да бъде стартирана: %s" + +#: gitk:3786 gitk:6652 +msgid "Searching" +msgstr "Търсене" + +#: gitk:3818 +#, tcl-format +msgid "Error running git blame: %s" +msgstr "Грешка при изпълнението на „git blame“: %s" + +#: gitk:3846 +#, tcl-format +msgid "That line comes from commit %s, which is not in this view" +msgstr "Този ред идва от подаването %s, което не е в изгледа" + +#: gitk:3860 +msgid "External diff viewer failed:" +msgstr "Неуспешно изпълнение на външната програма за разлики:" + +#: gitk:3978 +msgid "Gitk view definition" +msgstr "Дефиниция на изглед в Gitk" + +#: gitk:3982 +msgid "Remember this view" +msgstr "Запазване на този изглед" + +#: gitk:3983 +msgid "References (space separated list):" +msgstr "Указатели (списък с разделител интервал):" + +#: gitk:3984 +msgid "Branches & tags:" +msgstr "Клони и етикети:" + +#: gitk:3985 +msgid "All refs" +msgstr "Всички указатели" + +#: gitk:3986 +msgid "All (local) branches" +msgstr "Всички (локални) клони" + +#: gitk:3987 +msgid "All tags" +msgstr "Всички етикети" + +#: gitk:3988 +msgid "All remote-tracking branches" +msgstr "Всички следящи клони" + +#: gitk:3989 +msgid "Commit Info (regular expressions):" +msgstr "Информация за подаване (рег. изр.):" + +#: gitk:3990 +msgid "Author:" +msgstr "Автор:" + +#: gitk:3991 +msgid "Committer:" +msgstr "Подал:" + +#: gitk:3992 +msgid "Commit Message:" +msgstr "Съобщение при подаване:" + +#: gitk:3993 +msgid "Matches all Commit Info criteria" +msgstr "Съвпадение по коя да е информация за подаването" + +#: gitk:3994 +msgid "Changes to Files:" +msgstr "Промени по файловете:" + +#: gitk:3995 +msgid "Fixed String" +msgstr "Дословен низ" + +#: gitk:3996 +msgid "Regular Expression" +msgstr "Регулярен израз" + +#: gitk:3997 +msgid "Search string:" +msgstr "Низ за търсене:" + +#: gitk:3998 +msgid "" +"Commit Dates (\"2 weeks ago\", \"2009-03-17 15:27:38\", \"March 17, 2009 " +"15:27:38\"):" +msgstr "Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, „March 17, 2009 15:27:38“):" + +#: gitk:3999 +msgid "Since:" +msgstr "От:" + +#: gitk:4000 +msgid "Until:" +msgstr "До:" + +#: gitk:4001 +msgid "Limit and/or skip a number of revisions (positive integer):" +msgstr "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло число):" + +#: gitk:4002 +msgid "Number to show:" +msgstr "Брой показани:" + +#: gitk:4003 +msgid "Number to skip:" +msgstr "Брой прескочени:" + +#: gitk:4004 +msgid "Miscellaneous options:" +msgstr "Разни:" + +#: gitk:4005 +msgid "Strictly sort by date" +msgstr "Подреждане по дата" + +#: gitk:4006 +msgid "Mark branch sides" +msgstr "Отбелязване на страните по клона" + +#: gitk:4007 +msgid "Limit to first parent" +msgstr "Само първият родител" + +#: gitk:4008 +msgid "Simple history" +msgstr "Опростена история" + +#: gitk:4009 +msgid "Additional arguments to git log:" +msgstr "Допълнителни аргументи към „git log“:" + +#: gitk:4010 +msgid "Enter files and directories to include, one per line:" +msgstr "Въведете файловете и директориите за включване, по елемент на ред" + +#: gitk:4011 +msgid "Command to generate more commits to include:" +msgstr "Команда за генерирането на допълнителни подавания, които да бъдат включени:" + +#: gitk:4135 +msgid "Gitk: edit view" +msgstr "Gitk: редактиране на изглед" + +#: gitk:4143 +msgid "-- criteria for selecting revisions" +msgstr "— критерии за избор на версии" + +#: gitk:4148 +msgid "View Name" +msgstr "Име на изглед" + +#: gitk:4223 +msgid "Apply (F5)" +msgstr "Прилагане (F5)" + +#: gitk:4261 +msgid "Error in commit selection arguments:" +msgstr "Грешка в аргументите за избор на подавания:" + +#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185 +msgid "None" +msgstr "Няма" + +#: gitk:4924 gitk:4929 +msgid "Descendant" +msgstr "Наследник" + +#: gitk:4925 +msgid "Not descendant" +msgstr "Не е наследник" + +#: gitk:4932 gitk:4937 +msgid "Ancestor" +msgstr "Предшественик" + +#: gitk:4933 +msgid "Not ancestor" +msgstr "Не е предшественик" + +#: gitk:5223 +msgid "Local changes checked in to index but not committed" +msgstr "Локални промени добавени към индекса, но неподадени" + +#: gitk:5259 +msgid "Local uncommitted changes, not checked in to index" +msgstr "Локални промени извън индекса" + +#: gitk:7032 +msgid "and many more" +msgstr "и още много" + +#: gitk:7035 +msgid "many" +msgstr "много" + +#: gitk:7222 +msgid "Tags:" +msgstr "Етикети:" + +#: gitk:7239 gitk:7245 gitk:8708 +msgid "Parent" +msgstr "Родител" + +#: gitk:7250 +msgid "Child" +msgstr "Дете" + +#: gitk:7259 +msgid "Branch" +msgstr "Клон" + +#: gitk:7262 +msgid "Follows" +msgstr "Следва" + +#: gitk:7265 +msgid "Precedes" +msgstr "Предшества" + +#: gitk:7849 +#, tcl-format +msgid "Error getting diffs: %s" +msgstr "Грешка при получаването на разликите: %s" + +#: gitk:8533 +msgid "Goto:" +msgstr "Към ред:" + +#: gitk:8554 +#, tcl-format +msgid "Short SHA1 id %s is ambiguous" +msgstr "Съкратената SHA1 %s не е еднозначна" + +#: gitk:8561 +#, tcl-format +msgid "Revision %s is not known" +msgstr "Непозната версия %s" + +#: gitk:8571 +#, tcl-format +msgid "SHA1 id %s is not known" +msgstr "Непозната SHA1 %s" + +#: gitk:8573 +#, tcl-format +msgid "Revision %s is not in the current view" +msgstr "Версия %s не е в текущия изглед" + +#: gitk:8715 gitk:8730 +msgid "Date" +msgstr "Дата" + +#: gitk:8718 +msgid "Children" +msgstr "Деца" + +#: gitk:8781 +#, tcl-format +msgid "Reset %s branch to here" +msgstr "Зануляване на клона „%s“ към текущото подаване" + +#: gitk:8783 +msgid "Detached head: can't reset" +msgstr "Несвързан връх: невъзможно зануляване" + +#: gitk:8888 gitk:8894 +msgid "Skipping merge commit " +msgstr "Пропускане на подаването на сливането" + +#: gitk:8903 gitk:8908 +msgid "Error getting patch ID for " +msgstr "Грешка при получаването на идентификатора на " + +#: gitk:8904 gitk:8909 +msgid " - stopping\n" +msgstr " — спиране\n" + +#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948 +msgid "Commit " +msgstr "Подаване" + +#: gitk:8918 +msgid "" +" is the same patch as\n" +" " +msgstr "" +" е същата кръпка като\n" +" " + +#: gitk:8926 +msgid "" +" differs from\n" +" " +msgstr "" +" се различава от\n" +" " + +#: gitk:8928 +msgid "" +"Diff of commits:\n" +"\n" +msgstr "Разлика между подаванията:\n\n" + +#: gitk:8940 gitk:8949 +#, tcl-format +msgid " has %s children - stopping\n" +msgstr " има %s деца — спиране\n" + +#: gitk:8968 +#, tcl-format +msgid "Error writing commit to file: %s" +msgstr "Грешка при запазването на подаването във файл: %s" + +#: gitk:8974 +#, tcl-format +msgid "Error diffing commits: %s" +msgstr "Грешка при изчисляването на разликите между подаванията: %s" + +#: gitk:9020 +msgid "Top" +msgstr "Най-горе" + +#: gitk:9021 +msgid "From" +msgstr "От" + +#: gitk:9026 +msgid "To" +msgstr "До" + +#: gitk:9050 +msgid "Generate patch" +msgstr "Генериране на кръпка" + +#: gitk:9052 +msgid "From:" +msgstr "От:" + +#: gitk:9061 +msgid "To:" +msgstr "До:" + +#: gitk:9070 +msgid "Reverse" +msgstr "Обръщане" + +#: gitk:9072 gitk:9268 +msgid "Output file:" +msgstr "Запазване във файла:" + +#: gitk:9078 +msgid "Generate" +msgstr "Генериране" + +#: gitk:9116 +msgid "Error creating patch:" +msgstr "Грешка при създаването на кръпка:" + +#: gitk:9139 gitk:9256 gitk:9313 +msgid "ID:" +msgstr "Идентификатор:" + +#: gitk:9148 +msgid "Tag name:" +msgstr "Име на етикет:" + +#: gitk:9151 +msgid "Tag message is optional" +msgstr "Съобщението за етикет е незадължително" + +#: gitk:9153 +msgid "Tag message:" +msgstr "Съобщение за етикет:" + +#: gitk:9157 gitk:9322 +msgid "Create" +msgstr "Създаване" + +#: gitk:9175 +msgid "No tag name specified" +msgstr "Липсва име на етикет" + +#: gitk:9179 +#, tcl-format +msgid "Tag \"%s\" already exists" +msgstr "Етикетът „%s“ вече съществува" + +#: gitk:9189 +msgid "Error creating tag:" +msgstr "Грешка при създаването на етикет:" + +#: gitk:9265 +msgid "Command:" +msgstr "Команда:" + +#: gitk:9273 +msgid "Write" +msgstr "Pdmdpldke" + +#: gitk:9291 +msgid "Error writing commit:" +msgstr "Грешка при запазването на подаването:" + +#: gitk:9318 +msgid "Name:" +msgstr "Име:" + +#: gitk:9341 +msgid "Please specify a name for the new branch" +msgstr "Укажете име за новия клон" + +#: gitk:9346 +#, tcl-format +msgid "Branch '%s' already exists. Overwrite?" +msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?" + +#: gitk:9413 +#, tcl-format +msgid "Commit %s is already included in branch %s -- really re-apply it?" +msgstr "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?" + +#: gitk:9418 +msgid "Cherry-picking" +msgstr "Отбиране" + +#: gitk:9427 +#, tcl-format +msgid "" +"Cherry-pick failed because of local changes to file '%s'.\n" +"Please commit, reset or stash your changes and try again." +msgstr "" +"Неуспешно отбиране, защото във файла „%s“ има локални промени.\n" +"Подайте, занулете или ги скатайте и пробвайте отново." + +#: gitk:9433 +msgid "" +"Cherry-pick failed because of merge conflict.\n" +"Do you wish to run git citool to resolve it?" +msgstr "" +"Неуспешно отбиране поради конфликти при сливане.\n" +"Искате ли да ги коригирате чрез „git citool“?" + +#: gitk:9449 gitk:9507 +msgid "No changes committed" +msgstr "Не са подадени промени" + +#: gitk:9476 +#, tcl-format +msgid "Commit %s is not included in branch %s -- really revert it?" +msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?" + +#: gitk:9481 +msgid "Reverting" +msgstr "Отмяна" + +#: gitk:9489 +#, tcl-format +msgid "" +"Revert failed because of local changes to the following files:%s Please " +"commit, reset or stash your changes and try again." +msgstr "" +"Неуспешна отмяна, защото във файла „%s“ има локални промени.\n" +"Подайте, занулете или ги скатайте и пробвайте отново.<" + +#: gitk:9493 +msgid "" +"Revert failed because of merge conflict.\n" +" Do you wish to run git citool to resolve it?" +msgstr "" +"Неуспешно отмяна поради конфликти при сливане.\n" +"Искате ли да ги коригирате чрез „git citool“?" + +#: gitk:9536 +msgid "Confirm reset" +msgstr "Потвърждаване на зануляването" + +#: gitk:9538 +#, tcl-format +msgid "Reset branch %s to %s?" +msgstr "Да се занули ли клона „%s“ към „%s“?" + +#: gitk:9540 +msgid "Reset type:" +msgstr "Вид зануляване:" + +#: gitk:9543 +msgid "Soft: Leave working tree and index untouched" +msgstr "Слабо: работното дърво и индекса остават същите" + +#: gitk:9546 +msgid "Mixed: Leave working tree untouched, reset index" +msgstr "Смесено: работното дърво остава същото, индексът се занулява" + +#: gitk:9549 +msgid "" +"Hard: Reset working tree and index\n" +"(discard ALL local changes)" +msgstr "" +"Силно: зануляване и на работното дърво, и на индекса\n" +"(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)" + +#: gitk:9566 +msgid "Resetting" +msgstr "Зануляване" + +#: gitk:9626 +msgid "Checking out" +msgstr "Изтегляне" + +#: gitk:9679 +msgid "Cannot delete the currently checked-out branch" +msgstr "Текущо изтегленият клон не може да бъде изтрит" + +#: gitk:9685 +#, tcl-format +msgid "" +"The commits on branch %s aren't on any other branch.\n" +"Really delete branch %s?" +msgstr "" +"Подаванията на клона „%s“ не са на никой друг клон.\n" +"Наистина ли да се изтрие клона „%s“?" + +#: gitk:9716 +#, tcl-format +msgid "Tags and heads: %s" +msgstr "Етикети и върхове: %s" + +#: gitk:9731 +msgid "Filter" +msgstr "Филтриране" + +#: gitk:10027 +msgid "" +"Error reading commit topology information; branch and preceding/following " +"tag information will be incomplete." +msgstr "Грешка при прочитането на топологията на подаванията. Информацията за клона и предшестващите/следващите етикети ще е непълна." + +#: gitk:11004 +msgid "Tag" +msgstr "Етикет" + +#: gitk:11008 +msgid "Id" +msgstr "Идентификатор" + +#: gitk:11091 +msgid "Gitk font chooser" +msgstr "Избор на шрифт за Gitk" + +#: gitk:11108 +msgid "B" +msgstr "Ч" + +#: gitk:11111 +msgid "I" +msgstr "К" + +#: gitk:11229 +msgid "Commit list display options" +msgstr "Настройки на списъка с подавания" + +#: gitk:11232 +msgid "Maximum graph width (lines)" +msgstr "Максимална широчина на графа (в редове)" + +#: gitk:11235 +#, tcl-format +msgid "Maximum graph width (% of pane)" +msgstr "Максимална широчина на графа (% от панела)" + +#: gitk:11238 +msgid "Show local changes" +msgstr "Показване на локалните промени" + +#: gitk:11241 +msgid "Auto-select SHA1 (length)" +msgstr "Автоматично избиране на SHA1 (дължина)" + +#: gitk:11245 +msgid "Hide remote refs" +msgstr "Скриване на отдалечените указатели" + +#: gitk:11249 +msgid "Diff display options" +msgstr "Настройки на показването на разликите" + +#: gitk:11251 +msgid "Tab spacing" +msgstr "Широчина на табулатора" + +#: gitk:11254 +msgid "Display nearby tags/heads" +msgstr "Извеждане на близките етикети и върхове" + +#: gitk:11257 +msgid "Maximum # tags/heads to show" +msgstr "Максимален брой етикети/върхове за показване" + +#: gitk:11260 +msgid "Limit diffs to listed paths" +msgstr "Разлика само в избраните пътища" + +#: gitk:11263 +msgid "Support per-file encodings" +msgstr "Поддръжка на различни кодирания за всеки файл" + +#: gitk:11269 gitk:11416 +msgid "External diff tool" +msgstr "Външен инструмент за разлики" + +#: gitk:11270 +msgid "Choose..." +msgstr "Избор…" + +#: gitk:11275 +msgid "General options" +msgstr "Общи настройки" + +#: gitk:11278 +msgid "Use themed widgets" +msgstr "Използване на тема за графичните обекти" + +#: gitk:11280 +msgid "(change requires restart)" +msgstr "(промяната изисква рестартиране на Gitk)" + +#: gitk:11282 +msgid "(currently unavailable)" +msgstr "(в момента недостъпно)" + +#: gitk:11293 +msgid "Colors: press to choose" +msgstr "Цветове: избира се с натискане" + +#: gitk:11296 +msgid "Interface" +msgstr "Интерфейс" + +#: gitk:11297 +msgid "interface" +msgstr "интерфейс" + +#: gitk:11300 +msgid "Background" +msgstr "Фон" + +#: gitk:11301 gitk:11331 +msgid "background" +msgstr "Фон" + +#: gitk:11304 +msgid "Foreground" +msgstr "Знаци" + +#: gitk:11305 +msgid "foreground" +msgstr "знаци" + +#: gitk:11308 +msgid "Diff: old lines" +msgstr "Разлика: стари редове" + +#: gitk:11309 +msgid "diff old lines" +msgstr "разлика, стари редове" + +#: gitk:11313 +msgid "Diff: new lines" +msgstr "Разлика: нови редове" + +#: gitk:11314 +msgid "diff new lines" +msgstr "разлика, нови редове" + +#: gitk:11318 +msgid "Diff: hunk header" +msgstr "Разлика: начало на парче" + +#: gitk:11320 +msgid "diff hunk header" +msgstr "разлика, начало на парче" + +#: gitk:11324 +msgid "Marked line bg" +msgstr "Фон на отбелязан ред" + +#: gitk:11326 +msgid "marked line background" +msgstr "Фон на отбелязан ред" + +#: gitk:11330 +msgid "Select bg" +msgstr "Избор на фон" + +#: gitk:11339 +msgid "Fonts: press to choose" +msgstr "Шрифтове: избира се с натискане" + +#: gitk:11341 +msgid "Main font" +msgstr "Основен шрифт" + +#: gitk:11342 +msgid "Diff display font" +msgstr "Шрифт за разликите" + +#: gitk:11343 +msgid "User interface font" +msgstr "Шрифт на интерфейса" + +#: gitk:11365 +msgid "Gitk preferences" +msgstr "Настройки на Gitk" + +#: gitk:11374 +msgid "General" +msgstr "Общи" + +#: gitk:11375 +msgid "Colors" +msgstr "Цветове" + +#: gitk:11376 +msgid "Fonts" +msgstr "Шрифтове" + +#: gitk:11426 +#, tcl-format +msgid "Gitk: choose color for %s" +msgstr "Gitk: избор на цвят на %s" + +#: gitk:12080 +msgid "Cannot find a git repository here." +msgstr "Тук липсва хранилище на Git." + +#: gitk:12127 +#, tcl-format +msgid "Ambiguous argument '%s': both revision and filename" +msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл" + +#: gitk:12139 +msgid "Bad arguments to gitk:" +msgstr "Неправилни аргументи на gitk:" + +#: gitk:12242 +msgid "Command line" +msgstr "Команден ред" diff --git a/gitk-git/po/po2msg.sh b/gitk-git/po/po2msg.sh index c63248e37..c63248e37 100644..100755 --- a/gitk-git/po/po2msg.sh +++ b/gitk-git/po/po2msg.sh diff --git a/list-objects.c b/list-objects.c index 6cbedf028..206816fa9 100644 --- a/list-objects.c +++ b/list-objects.c @@ -162,15 +162,17 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge) } mark_edge_parents_uninteresting(commit, revs, show_edge); } - for (i = 0; i < revs->cmdline.nr; i++) { - struct object *obj = revs->cmdline.rev[i].item; - struct commit *commit = (struct commit *)obj; - if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING)) - continue; - mark_tree_uninteresting(commit->tree); - if (revs->edge_hint && !(obj->flags & SHOWN)) { - obj->flags |= SHOWN; - show_edge(commit); + if (revs->edge_hint) { + for (i = 0; i < revs->cmdline.nr; i++) { + struct object *obj = revs->cmdline.rev[i].item; + struct commit *commit = (struct commit *)obj; + if (obj->type != OBJ_COMMIT || !(obj->flags & UNINTERESTING)) + continue; + mark_tree_uninteresting(commit->tree); + if (!(obj->flags & SHOWN)) { + obj->flags |= SHOWN; + show_edge(commit); + } } } } diff --git a/merge-recursive.c b/merge-recursive.c index a18bd15dd..8400a8e93 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -693,7 +693,7 @@ static int make_room_for_path(struct merge_options *o, const char *path) /* Make sure leading directories are created */ status = safe_create_leading_directories_const(path); if (status) { - if (status == -3) { + if (status == SCLD_EXISTS) { /* something else exists */ error(msg, path, _(": perhaps a D/F conflict?")); return -1; diff --git a/perl/Git/SVN.pm b/perl/Git/SVN.pm index 5273ee886..6e804a271 100644 --- a/perl/Git/SVN.pm +++ b/perl/Git/SVN.pm @@ -1599,6 +1599,7 @@ sub tie_for_persistent_memoization { my %lookup_svn_merge_cache; my %check_cherry_pick_cache; my %has_no_changes_cache; + my %_rev_list_cache; tie_for_persistent_memoization(\%lookup_svn_merge_cache, "$cache_path/lookup_svn_merge"); @@ -1620,6 +1621,14 @@ sub tie_for_persistent_memoization { SCALAR_CACHE => ['HASH' => \%has_no_changes_cache], LIST_CACHE => 'FAULT', ; + + tie_for_persistent_memoization(\%_rev_list_cache, + "$cache_path/_rev_list"); + memoize '_rev_list', + SCALAR_CACHE => 'FAULT', + LIST_CACHE => ['HASH' => \%_rev_list_cache], + ; + } sub unmemoize_svn_mergeinfo_functions { @@ -1629,6 +1638,7 @@ sub tie_for_persistent_memoization { Memoize::unmemoize 'lookup_svn_merge'; Memoize::unmemoize 'check_cherry_pick'; Memoize::unmemoize 'has_no_changes'; + Memoize::unmemoize '_rev_list'; } sub clear_memoized_mergeinfo_caches { @@ -1959,11 +1969,25 @@ sub rebuild_from_rev_db { unlink $path or croak "unlink: $!"; } +#define a global associate map to record rebuild status +my %rebuild_status; +#define a global associate map to record rebuild verify status +my %rebuild_verify_status; + sub rebuild { my ($self) = @_; my $map_path = $self->map_path; my $partial = (-e $map_path && ! -z $map_path); - return unless ::verify_ref($self->refname.'^0'); + my $verify_key = $self->refname.'^0'; + if (!$rebuild_verify_status{$verify_key}) { + my $verify_result = ::verify_ref($verify_key); + if ($verify_result) { + $rebuild_verify_status{$verify_key} = 1; + } + } + if (!$rebuild_verify_status{$verify_key}) { + return; + } if (!$partial && ($self->use_svm_props || $self->no_metadata)) { my $rev_db = $self->rev_db_path; $self->rebuild_from_rev_db($rev_db); @@ -1977,10 +2001,21 @@ sub rebuild { print "Rebuilding $map_path ...\n" if (!$partial); my ($base_rev, $head) = ($partial ? $self->rev_map_max_norebuild(1) : (undef, undef)); + my $key_value = ($head ? "$head.." : "") . $self->refname; + if (exists $rebuild_status{$key_value}) { + print "Done rebuilding $map_path\n" if (!$partial || !$head); + my $rev_db_path = $self->rev_db_path; + if (-f $self->rev_db_path) { + unlink $self->rev_db_path or croak "unlink: $!"; + } + $self->unlink_rev_db_symlink; + return; + } my ($log, $ctx) = - command_output_pipe(qw/rev-list --pretty=raw --reverse/, - ($head ? "$head.." : "") . $self->refname, + command_output_pipe(qw/rev-list --pretty=raw --reverse/, + $key_value, '--'); + $rebuild_status{$key_value} = 1; my $metadata_url = $self->metadata_url; remove_username($metadata_url); my $svn_uuid = $self->rewrite_uuid || $self->ra_uuid; @@ -1880,7 +1880,7 @@ const char *prettify_refname(const char *name) 0); } -const char *ref_rev_parse_rules[] = { +static const char *ref_rev_parse_rules[] = { "%.*s", "refs/%.*s", "refs/tags/%.*s", @@ -1890,12 +1890,12 @@ const char *ref_rev_parse_rules[] = { NULL }; -int refname_match(const char *abbrev_name, const char *full_name, const char **rules) +int refname_match(const char *abbrev_name, const char *full_name) { const char **p; const int abbrev_name_len = strlen(abbrev_name); - for (p = rules; *p; p++) { + for (p = ref_rev_parse_rules; *p; p++) { if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) { return 1; } @@ -2039,6 +2039,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, int type, lflags; int mustexist = (old_sha1 && !is_null_sha1(old_sha1)); int missing = 0; + int attempts_remaining = 3; lock = xcalloc(1, sizeof(struct ref_lock)); lock->lock_fd = -1; @@ -2080,7 +2081,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, lock->lk = xcalloc(1, sizeof(struct lock_file)); - lflags = LOCK_DIE_ON_ERROR; + lflags = 0; if (flags & REF_NODEREF) { refname = orig_refname; lflags |= LOCK_NODEREF; @@ -2093,13 +2094,32 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) lock->force_write = 1; - if (safe_create_leading_directories(ref_file)) { + retry: + switch (safe_create_leading_directories(ref_file)) { + case SCLD_OK: + break; /* success */ + case SCLD_VANISHED: + if (--attempts_remaining > 0) + goto retry; + /* fall through */ + default: last_errno = errno; error("unable to create directory for %s", ref_file); goto error_return; } lock->lock_fd = hold_lock_file_for_update(lock->lk, ref_file, lflags); + if (lock->lock_fd < 0) { + if (errno == ENOENT && --attempts_remaining > 0) + /* + * Maybe somebody just deleted one of the + * directories leading to ref_file. Try + * again: + */ + goto retry; + else + unable_to_lock_index_die(ref_file, errno); + } return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock; error_return: @@ -2508,6 +2528,51 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt) */ #define TMP_RENAMED_LOG "logs/refs/.tmp-renamed-log" +static int rename_tmp_log(const char *newrefname) +{ + int attempts_remaining = 4; + + retry: + switch (safe_create_leading_directories(git_path("logs/%s", newrefname))) { + case SCLD_OK: + break; /* success */ + case SCLD_VANISHED: + if (--attempts_remaining > 0) + goto retry; + /* fall through */ + default: + error("unable to create directory for %s", newrefname); + return -1; + } + + if (rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newrefname))) { + if ((errno==EISDIR || errno==ENOTDIR) && --attempts_remaining > 0) { + /* + * rename(a, b) when b is an existing + * directory ought to result in ISDIR, but + * Solaris 5.8 gives ENOTDIR. Sheesh. + */ + if (remove_empty_directories(git_path("logs/%s", newrefname))) { + error("Directory not empty: logs/%s", newrefname); + return -1; + } + goto retry; + } else if (errno == ENOENT && --attempts_remaining > 0) { + /* + * Maybe another process just deleted one of + * the directories in the path to newrefname. + * Try again from the beginning. + */ + goto retry; + } else { + error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s", + newrefname, strerror(errno)); + return -1; + } + } + return 0; +} + int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg) { unsigned char sha1[20], orig_sha1[20]; @@ -2555,30 +2620,9 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms } } - if (log && safe_create_leading_directories(git_path("logs/%s", newrefname))) { - error("unable to create directory for %s", newrefname); + if (log && rename_tmp_log(newrefname)) goto rollback; - } - retry: - if (log && rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newrefname))) { - if (errno==EISDIR || errno==ENOTDIR) { - /* - * rename(a, b) when b is an existing - * directory ought to result in ISDIR, but - * Solaris 5.8 gives ENOTDIR. Sheesh. - */ - if (remove_empty_directories(git_path("logs/%s", newrefname))) { - error("Directory not empty: logs/%s", newrefname); - goto rollback; - } - goto retry; - } else { - error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s", - newrefname, strerror(errno)); - goto rollback; - } - } logmoved = log; lock = lock_ref_sha1_basic(newrefname, NULL, 0, NULL); @@ -1000,7 +1000,7 @@ int count_refspec_match(const char *pattern, char *name = refs->name; int namelen = strlen(name); - if (!refname_match(pattern, name, ref_rev_parse_rules)) + if (!refname_match(pattern, name)) continue; /* A match is "weak" if it is with refs outside @@ -1571,7 +1571,7 @@ int branch_merge_matches(struct branch *branch, { if (!branch || i < 0 || i >= branch->merge_nr) return 0; - return refname_match(branch->merge[i]->src, refname, ref_fetch_rules); + return refname_match(branch->merge[i]->src, refname); } static int ignore_symref_update(const char *refname) @@ -1624,7 +1624,7 @@ static const struct ref *find_ref_by_name_abbrev(const struct ref *refs, const c { const struct ref *ref; for (ref = refs; ref; ref = ref->next) { - if (refname_match(name, ref->name, ref_fetch_rules)) + if (refname_match(name, ref->name)) return ref; } return NULL; @@ -2121,7 +2121,7 @@ static void apply_cas(struct push_cas_option *cas, /* Find an explicit --<option>=<name>[:<value>] entry */ for (i = 0; i < cas->nr; i++) { struct push_cas *entry = &cas->entry[i]; - if (!refname_match(entry->refname, ref->name, ref_rev_parse_rules)) + if (!refname_match(entry->refname, ref->name)) continue; ref->expect_old_sha1 = 1; if (!entry->use_tracking) diff --git a/revision.c b/revision.c index a68fde6e9..a0df72f32 100644 --- a/revision.c +++ b/revision.c @@ -104,17 +104,12 @@ static void mark_blob_uninteresting(struct blob *blob) blob->object.flags |= UNINTERESTING; } -void mark_tree_uninteresting(struct tree *tree) +static void mark_tree_contents_uninteresting(struct tree *tree) { struct tree_desc desc; struct name_entry entry; struct object *obj = &tree->object; - if (!tree) - return; - if (obj->flags & UNINTERESTING) - return; - obj->flags |= UNINTERESTING; if (!has_sha1_file(obj->sha1)) return; if (parse_tree(tree) < 0) @@ -142,6 +137,18 @@ void mark_tree_uninteresting(struct tree *tree) free_tree_buffer(tree); } +void mark_tree_uninteresting(struct tree *tree) +{ + struct object *obj = &tree->object; + + if (!tree) + return; + if (obj->flags & UNINTERESTING) + return; + obj->flags |= UNINTERESTING; + mark_tree_contents_uninteresting(tree); +} + void mark_parents_uninteresting(struct commit *commit) { struct commit_list *parents = NULL, *l; @@ -276,6 +283,7 @@ static struct commit *handle_commit(struct rev_info *revs, return NULL; die("bad object %s", sha1_to_hex(tag->tagged->sha1)); } + object->flags |= flags; } /* @@ -287,7 +295,6 @@ static struct commit *handle_commit(struct rev_info *revs, if (parse_commit(commit) < 0) die("unable to parse commit %s", name); if (flags & UNINTERESTING) { - commit->object.flags |= UNINTERESTING; mark_parents_uninteresting(commit); revs->limited = 1; } @@ -305,7 +312,7 @@ static struct commit *handle_commit(struct rev_info *revs, if (!revs->tree_objects) return NULL; if (flags & UNINTERESTING) { - mark_tree_uninteresting(tree); + mark_tree_contents_uninteresting(tree); return NULL; } add_pending_object(revs, object, ""); @@ -316,13 +323,10 @@ static struct commit *handle_commit(struct rev_info *revs, * Blob object? You know the drill by now.. */ if (object->type == OBJ_BLOB) { - struct blob *blob = (struct blob *)object; if (!revs->blob_objects) return NULL; - if (flags & UNINTERESTING) { - mark_blob_uninteresting(blob); + if (flags & UNINTERESTING) return NULL; - } add_pending_object(revs, object, ""); return NULL; } diff --git a/sha1_file.c b/sha1_file.c index e13bd2c3e..6e8c05d10 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -105,50 +105,63 @@ int mkdir_in_gitdir(const char *path) return adjust_shared_perm(path); } -int safe_create_leading_directories(char *path) +enum scld_error safe_create_leading_directories(char *path) { - char *pos = path + offset_1st_component(path); - struct stat st; + char *next_component = path + offset_1st_component(path); + enum scld_error ret = SCLD_OK; + + while (ret == SCLD_OK && next_component) { + struct stat st; + char *slash = next_component, slash_character; + + while (*slash && !is_dir_sep(*slash)) + slash++; - while (pos) { - pos = strchr(pos, '/'); - if (!pos) + if (!*slash) break; - while (*++pos == '/') - ; - if (!*pos) + + next_component = slash + 1; + while (is_dir_sep(*next_component)) + next_component++; + if (!*next_component) break; - *--pos = '\0'; + + slash_character = *slash; + *slash = '\0'; if (!stat(path, &st)) { /* path exists */ - if (!S_ISDIR(st.st_mode)) { - *pos = '/'; - return -3; - } - } - else if (mkdir(path, 0777)) { + if (!S_ISDIR(st.st_mode)) + ret = SCLD_EXISTS; + } else if (mkdir(path, 0777)) { if (errno == EEXIST && - !stat(path, &st) && S_ISDIR(st.st_mode)) { + !stat(path, &st) && S_ISDIR(st.st_mode)) ; /* somebody created it since we checked */ - } else { - *pos = '/'; - return -1; - } - } - else if (adjust_shared_perm(path)) { - *pos = '/'; - return -2; + else if (errno == ENOENT) + /* + * Either mkdir() failed because + * somebody just pruned the containing + * directory, or stat() failed because + * the file that was in our way was + * just removed. Either way, inform + * the caller that it might be worth + * trying again: + */ + ret = SCLD_VANISHED; + else + ret = SCLD_FAILED; + } else if (adjust_shared_perm(path)) { + ret = SCLD_PERMS; } - *pos++ = '/'; + *slash = slash_character; } - return 0; + return ret; } -int safe_create_leading_directories_const(const char *path) +enum scld_error safe_create_leading_directories_const(const char *path) { /* path points to cache entries, so xstrdup before messing with it */ char *buf = xstrdup(path); - int result = safe_create_leading_directories(buf); + enum scld_error result = safe_create_leading_directories(buf); free(buf); return result; } diff --git a/sha1_name.c b/sha1_name.c index a5578f718..6fca8692d 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -430,7 +430,7 @@ static inline int upstream_mark(const char *string, int len) } static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags); -static int interpret_nth_prior_checkout(const char *name, struct strbuf *buf); +static int interpret_nth_prior_checkout(const char *name, int namelen, struct strbuf *buf); static int get_sha1_basic(const char *str, int len, unsigned char *sha1) { @@ -492,7 +492,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1) struct strbuf buf = STRBUF_INIT; int detached; - if (interpret_nth_prior_checkout(str, &buf) > 0) { + if (interpret_nth_prior_checkout(str, len, &buf) > 0) { detached = (buf.len == 40 && !get_sha1_hex(buf.buf, sha1)); strbuf_release(&buf); if (detached) @@ -929,7 +929,8 @@ static int grab_nth_branch_switch(unsigned char *osha1, unsigned char *nsha1, * Parse @{-N} syntax, return the number of characters parsed * if successful; otherwise signal an error with negative value. */ -static int interpret_nth_prior_checkout(const char *name, struct strbuf *buf) +static int interpret_nth_prior_checkout(const char *name, int namelen, + struct strbuf *buf) { long nth; int retval; @@ -937,9 +938,11 @@ static int interpret_nth_prior_checkout(const char *name, struct strbuf *buf) const char *brace; char *num_end; + if (namelen < 4) + return -1; if (name[0] != '@' || name[1] != '{' || name[2] != '-') return -1; - brace = strchr(name, '}'); + brace = memchr(name, '}', namelen); if (!brace) return -1; nth = strtol(name + 3, &num_end, 10); @@ -1012,7 +1015,7 @@ static int interpret_empty_at(const char *name, int namelen, int len, struct str return -1; /* make sure it's a single @, or @@{.*}, not @foo */ - next = strchr(name + len + 1, '@'); + next = memchr(name + len + 1, '@', namelen - len - 1); if (next && next[1] != '{') return -1; if (!next) @@ -1046,6 +1049,57 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu return ret - used + len; } +static void set_shortened_ref(struct strbuf *buf, const char *ref) +{ + char *s = shorten_unambiguous_ref(ref, 0); + strbuf_reset(buf); + strbuf_addstr(buf, s); + free(s); +} + +static const char *get_upstream_branch(const char *branch_buf, int len) +{ + char *branch = xstrndup(branch_buf, len); + struct branch *upstream = branch_get(*branch ? branch : NULL); + + /* + * Upstream can be NULL only if branch refers to HEAD and HEAD + * points to something different than a branch. + */ + if (!upstream) + die(_("HEAD does not point to a branch")); + if (!upstream->merge || !upstream->merge[0]->dst) { + if (!ref_exists(upstream->refname)) + die(_("No such branch: '%s'"), branch); + if (!upstream->merge) { + die(_("No upstream configured for branch '%s'"), + upstream->name); + } + die( + _("Upstream branch '%s' not stored as a remote-tracking branch"), + upstream->merge[0]->src); + } + free(branch); + + return upstream->merge[0]->dst; +} + +static int interpret_upstream_mark(const char *name, int namelen, + int at, struct strbuf *buf) +{ + int len; + + len = upstream_mark(name + at, namelen - at); + if (!len) + return -1; + + if (memchr(name, ':', at)) + return -1; + + set_shortened_ref(buf, get_upstream_branch(name, at)); + return len + at; +} + /* * This reads short-hand syntax that not only evaluates to a commit * object name, but also can act as if the end user spelled the name @@ -1069,10 +1123,9 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu */ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf) { - char *cp; - struct branch *upstream; - int len = interpret_nth_prior_checkout(name, buf); - int tmp_len; + char *at; + const char *start; + int len = interpret_nth_prior_checkout(name, namelen, buf); if (!namelen) namelen = strlen(name); @@ -1086,44 +1139,20 @@ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf) return reinterpret(name, namelen, len, buf); } - cp = strchr(name, '@'); - if (!cp) - return -1; - - len = interpret_empty_at(name, namelen, cp - name, buf); - if (len > 0) - return reinterpret(name, namelen, len, buf); + for (start = name; + (at = memchr(start, '@', namelen - (start - name))); + start = at + 1) { - tmp_len = upstream_mark(cp, namelen - (cp - name)); - if (!tmp_len) - return -1; + len = interpret_empty_at(name, namelen, at - name, buf); + if (len > 0) + return reinterpret(name, namelen, len, buf); - len = cp + tmp_len - name; - cp = xstrndup(name, cp - name); - upstream = branch_get(*cp ? cp : NULL); - /* - * Upstream can be NULL only if cp refers to HEAD and HEAD - * points to something different than a branch. - */ - if (!upstream) - die(_("HEAD does not point to a branch")); - if (!upstream->merge || !upstream->merge[0]->dst) { - if (!ref_exists(upstream->refname)) - die(_("No such branch: '%s'"), cp); - if (!upstream->merge) { - die(_("No upstream configured for branch '%s'"), - upstream->name); - } - die( - _("Upstream branch '%s' not stored as a remote-tracking branch"), - upstream->merge[0]->src); + len = interpret_upstream_mark(name, namelen, at - name, buf); + if (len > 0) + return len; } - free(cp); - cp = shorten_unambiguous_ref(upstream->merge[0]->dst, 0); - strbuf_reset(buf); - strbuf_addstr(buf, cp); - free(cp); - return len; + + return -1; } int strbuf_branchname(struct strbuf *sb, const char *name) diff --git a/streaming.c b/streaming.c index 9659f18be..d7c9f32f0 100644 --- a/streaming.c +++ b/streaming.c @@ -538,7 +538,7 @@ int stream_blob_to_fd(int fd, unsigned const char *sha1, struct stream_filter *f goto close_and_exit; } if (kept && (lseek(fd, kept - 1, SEEK_CUR) == (off_t) -1 || - write(fd, "", 1) != 1)) + xwrite(fd, "", 1) != 1)) goto close_and_exit; result = 0; diff --git a/t/lib-git-p4.sh b/t/lib-git-p4.sh index ccd918e79..5aa8adcf9 100644 --- a/t/lib-git-p4.sh +++ b/t/lib-git-p4.sh @@ -47,15 +47,22 @@ P4DPORT=$((10669 + ($testid - $git_p4_test_start))) P4PORT=localhost:$P4DPORT P4CLIENT=client -P4EDITOR=: +P4USER=author +P4EDITOR=true unset P4CHARSET -export P4PORT P4CLIENT P4EDITOR P4CHARSET +export P4PORT P4CLIENT P4USER P4EDITOR P4CHARSET db="$TRASH_DIRECTORY/db" cli="$TRASH_DIRECTORY/cli" git="$TRASH_DIRECTORY/git" pidfile="$TRASH_DIRECTORY/p4d.pid" +# git p4 submit generates a temp file, which will +# not get cleaned up if the submission fails. Don't +# clutter up /tmp on the test machine. +TMPDIR="$TRASH_DIRECTORY" +export TMPDIR + start_p4d() { mkdir -p "$db" "$cli" "$git" && rm -f "$pidfile" && @@ -96,12 +103,24 @@ start_p4d() { return 1 fi + # build a p4 user so author@example.com has an entry + p4_add_user author + # build a client client_view "//depot/... //client/..." && return 0 } +p4_add_user() { + name=$1 && + p4 user -f -i <<-EOF + User: $name + Email: $name@example.com + FullName: Dr. $name + EOF +} + kill_p4d() { pid=$(cat "$pidfile") # it had better exist for the first kill diff --git a/t/perf/p0001-rev-list.sh b/t/perf/p0001-rev-list.sh index 4f71a63b0..16359d51a 100755 --- a/t/perf/p0001-rev-list.sh +++ b/t/perf/p0001-rev-list.sh @@ -14,4 +14,16 @@ test_perf 'rev-list --all --objects' ' git rev-list --all --objects >/dev/null ' +test_expect_success 'create new unreferenced commit' ' + commit=$(git commit-tree HEAD^{tree} -p HEAD) +' + +test_perf 'rev-list $commit --not --all' ' + git rev-list $commit --not --all >/dev/null +' + +test_perf 'rev-list --objects $commit --not --all' ' + git rev-list --objects $commit --not --all >/dev/null +' + test_done diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh index 2a19e797e..178694ee6 100755 --- a/t/t1507-rev-parse-upstream.sh +++ b/t/t1507-rev-parse-upstream.sh @@ -17,6 +17,9 @@ test_expect_success 'setup' ' test_commit 4 && git branch --track my-side origin/side && git branch --track local-master master && + git branch --track fun@ny origin/side && + git branch --track @funny origin/side && + git branch --track funny@ origin/side && git remote add -t master master-only .. && git fetch master-only && git branch bad-upstream && @@ -54,6 +57,24 @@ test_expect_success 'my-side@{upstream} resolves to correct full name' ' test refs/remotes/origin/side = "$(full_name my-side@{u})" ' +test_expect_success 'upstream of branch with @ in middle' ' + full_name fun@ny@{u} >actual && + echo refs/remotes/origin/side >expect && + test_cmp expect actual +' + +test_expect_success 'upstream of branch with @ at start' ' + full_name @funny@{u} >actual && + echo refs/remotes/origin/side >expect && + test_cmp expect actual +' + +test_expect_success 'upstream of branch with @ at end' ' + full_name funny@@{u} >actual && + echo refs/remotes/origin/side >expect && + test_cmp expect actual +' + test_expect_success 'refs/heads/my-side@{upstream} does not resolve to my-side{upstream}' ' test_must_fail full_name refs/heads/my-side@{upstream} ' @@ -210,4 +231,20 @@ test_expect_success 'log -g other@{u}@{now}' ' test_cmp expect actual ' +test_expect_success '@{reflog}-parsing does not look beyond colon' ' + echo content >@{yesterday} && + git add @{yesterday} && + git commit -m "funny reflog file" && + git hash-object @{yesterday} >expect && + git rev-parse HEAD:@{yesterday} >actual +' + +test_expect_success '@{upstream}-parsing does not look beyond colon' ' + echo content >@{upstream} && + git add @{upstream} && + git commit -m "funny upstream file" && + git hash-object @{upstream} >expect && + git rev-parse HEAD:@{upstream} >actual +' + test_done diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh index ceb844985..078e1195d 100755 --- a/t/t1508-at-combinations.sh +++ b/t/t1508-at-combinations.sh @@ -9,8 +9,11 @@ check() { if test '$2' = 'commit' then git log -1 --format=%s '$1' >actual - else + elif test '$2' = 'ref' + then git rev-parse --symbolic-full-name '$1' >actual + else + git cat-file -p '$1' >actual fi && test_cmp expect actual " @@ -82,4 +85,14 @@ check HEAD ref refs/heads/old-branch check "HEAD@{1}" commit new-two check "@{1}" commit old-one +test_expect_success 'create path with @' ' + echo content >normal && + echo content >fun@ny && + git add normal fun@ny && + git commit -m "funny path" +' + +check "@:normal" blob content +check "@:fun@ny" blob content + test_done diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh index af5134b70..9f5659f7f 100755 --- a/t/t4010-diff-pathspec.sh +++ b/t/t4010-diff-pathspec.sh @@ -110,4 +110,34 @@ test_expect_success 'diff-tree -r with wildcard' ' test_cmp expected result ' +test_expect_success 'setup submodules' ' + test_tick && + git init submod && + ( cd submod && test_commit first; ) && + git add submod && + git commit -m first && + ( cd submod && test_commit second; ) && + git add submod && + git commit -m second +' + +test_expect_success 'diff-tree ignores trailing slash on submodule path' ' + git diff --name-only HEAD^ HEAD submod >expect && + git diff --name-only HEAD^ HEAD submod/ >actual && + test_cmp expect actual +' + +test_expect_success 'diff multiple wildcard pathspecs' ' + mkdir path2 && + echo rezrov >path2/file1 && + git update-index --add path2/file1 && + tree3=`git write-tree` && + git diff --name-only $tree $tree3 -- "path2*1" "path1*1" >actual && + cat <<-\EOF >expect && + path1/file1 + path2/file1 + EOF + test_cmp expect actual +' + test_done diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 12674ac09..ab28594c6 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -640,4 +640,15 @@ test_expect_success 'branchname D/F conflict resolved by --prune' ' test_cmp expect actual ' +test_expect_success 'fetching a one-level ref works' ' + test_commit extra && + git reset --hard HEAD^ && + git update-ref refs/foo extra && + git init one-level && + ( + cd one-level && + git fetch .. HEAD refs/foo + ) +' + test_done diff --git a/t/t6000-rev-list-misc.sh b/t/t6000-rev-list-misc.sh index 15e3d6476..3794e4cea 100755 --- a/t/t6000-rev-list-misc.sh +++ b/t/t6000-rev-list-misc.sh @@ -56,4 +56,21 @@ test_expect_success 'rev-list A..B and rev-list ^A B are the same' ' test_cmp expect actual ' +test_expect_success 'propagate uninteresting flag down correctly' ' + git rev-list --objects ^HEAD^{tree} HEAD^{tree} >actual && + >expect && + test_cmp expect actual +' + +test_expect_success 'symleft flag bit is propagated down from tag' ' + git log --format="%m %s" --left-right v1.0...master >actual && + cat >expect <<-\EOF && + > two + > one + < another + < that + EOF + test_cmp expect actual +' + test_done diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index 7fe3367b6..b9365b431 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -40,7 +40,7 @@ test_expect_failure TTY 'pager runs from subdir' ' test_expect_success TTY 'LESS and LV envvars are set for pagination' ' ( sane_unset LESS LV && - PAGER="env >pager-env.out" && + PAGER="env >pager-env.out; wc" && export PAGER && test_terminal git log diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh index f04798f87..94eec83b3 100755 --- a/t/t7501-commit.sh +++ b/t/t7501-commit.sh @@ -57,6 +57,7 @@ test_expect_success 'using invalid commit with -C' ' ' test_expect_success 'nothing to commit' ' + git reset --hard && test_must_fail git commit -m initial ' diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh index d954b846a..b45bd1e76 100755 --- a/t/t7700-repack.sh +++ b/t/t7700-repack.sh @@ -17,7 +17,7 @@ test_expect_success 'objects in packs marked .keep are not repacked' ' # The second pack will contain the excluded object packsha1=$(git rev-list --objects --all | grep file2 | git pack-objects pack) && - touch -r pack-$packsha1.pack pack-$packsha1.keep && + >pack-$packsha1.keep && objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 | sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") && mv pack-* .git/objects/pack/ && diff --git a/t/t9802-git-p4-filetype.sh b/t/t9802-git-p4-filetype.sh index a82744bab..66d3fc91a 100755 --- a/t/t9802-git-p4-filetype.sh +++ b/t/t9802-git-p4-filetype.sh @@ -250,6 +250,89 @@ test_expect_success 'ignore apple' ' ) ' +test_expect_success SYMLINKS 'create p4 symlink' ' + cd "$cli" && + ln -s symlink-target symlink && + p4 add symlink && + p4 submit -d "add symlink" +' + +test_expect_success SYMLINKS 'ensure p4 symlink parsed correctly' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot@all && + ( + cd "$git" && + test -L symlink && + test $(readlink symlink) = symlink-target + ) +' + +test_expect_success SYMLINKS 'empty symlink target' ' + ( + # first create the file as a file + cd "$cli" && + >empty-symlink && + p4 add empty-symlink && + p4 submit -d "add empty-symlink as a file" + ) && + ( + # now change it to be a symlink to "target1" + cd "$cli" && + p4 edit empty-symlink && + p4 reopen -t symlink empty-symlink && + rm empty-symlink && + ln -s target1 empty-symlink && + p4 add empty-symlink && + p4 submit -d "make empty-symlink point to target1" + ) && + ( + # Hack the p4 depot to make the symlink point to nothing; + # this should not happen in reality, but shows up + # in p4 repos in the wild. + # + # The sed expression changes this: + # @@ + # text + # @target1 + # @ + # to this: + # @@ + # text + # @@ + # + cd "$db/depot" && + sed "/@target1/{; s/target1/@/; n; d; }" \ + empty-symlink,v >empty-symlink,v.tmp && + mv empty-symlink,v.tmp empty-symlink,v + ) && + ( + # Make sure symlink really is empty. Asking + # p4 to sync here will make it generate errors. + cd "$cli" && + p4 print -q //depot/empty-symlink#2 >out && + test ! -s out + ) && + test_when_finished cleanup_git && + + # make sure git p4 handles it without error + git p4 clone --dest="$git" //depot@all && + + # fix the symlink, make it point to "target2" + ( + cd "$cli" && + p4 open empty-symlink && + rm empty-symlink && + ln -s target2 empty-symlink && + p4 submit -d "make empty-symlink point to target2" + ) && + cleanup_git && + git p4 clone --dest="$git" //depot@all && + ( + cd "$git" && + test $(readlink empty-symlink) = target2 + ) +' + test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9805-git-p4-skip-submit-edit.sh b/t/t9805-git-p4-skip-submit-edit.sh index ff2cc7970..89311886d 100755 --- a/t/t9805-git-p4-skip-submit-edit.sh +++ b/t/t9805-git-p4-skip-submit-edit.sh @@ -17,7 +17,7 @@ test_expect_success 'init depot' ' ) ' -# this works because EDITOR is set to : +# this works because P4EDITOR is set to true test_expect_success 'no config, unedited, say yes' ' git p4 clone --dest="$git" //depot && test_when_finished cleanup_git && @@ -90,7 +90,9 @@ test_expect_success 'no config, edited' ' cd "$git" && echo line >>file1 && git commit -a -m "change 5" && - P4EDITOR="" EDITOR="\"$TRASH_DIRECTORY/ed.sh\"" git p4 submit && + P4EDITOR="$TRASH_DIRECTORY/ed.sh" && + export P4EDITOR && + git p4 submit && p4 changes //depot/... >wc && test_line_count = 5 wc ) diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index 1fb7bc7cf..4caf36e00 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -17,7 +17,7 @@ test_expect_success 'init depot' ' ) ' -test_expect_failure 'is_cli_file_writeable function' ' +test_expect_success 'is_cli_file_writeable function' ' ( cd "$cli" && echo a >a && diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh index 77f63492d..23a827fa7 100755 --- a/t/t9809-git-p4-client-view.sh +++ b/t/t9809-git-p4-client-view.sh @@ -76,28 +76,28 @@ test_expect_success 'init depot' ' ' # double % for printf -test_expect_success 'unsupported view wildcard %%n' ' +test_expect_success 'view wildcard %%n' ' client_view "//depot/%%%%1/sub/... //client/sub/%%%%1/..." && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' -test_expect_success 'unsupported view wildcard *' ' +test_expect_success 'view wildcard *' ' client_view "//depot/*/bar/... //client/*/bar/..." && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' -test_expect_success 'wildcard ... only supported at end of spec 1' ' +test_expect_success 'wildcard ... in the middle' ' client_view "//depot/.../file11 //client/.../file11" && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' -test_expect_success 'wildcard ... only supported at end of spec 2' ' +test_expect_success 'wildcard ... in the middle and at the end' ' client_view "//depot/.../a/... //client/.../a/..." && test_when_finished cleanup_git && - test_must_fail git p4 clone --use-client-spec --dest="$git" //depot + git p4 clone --use-client-spec --dest="$git" //depot ' test_expect_success 'basic map' ' diff --git a/t/t9812-git-p4-wildcards.sh b/t/t9812-git-p4-wildcards.sh index 67633257f..c7472cbf5 100755 --- a/t/t9812-git-p4-wildcards.sh +++ b/t/t9812-git-p4-wildcards.sh @@ -161,6 +161,56 @@ test_expect_success 'wildcard files submit back to p4, delete' ' ) ' +test_expect_success 'p4 deleted a wildcard file' ' + ( + cd "$cli" && + echo "wild delete test" >wild@delete && + p4 add -f wild@delete && + p4 submit -d "add wild@delete" + ) && + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + test_path_is_file wild@delete + ) && + ( + cd "$cli" && + # must use its encoded name + p4 delete wild%40delete && + p4 submit -d "delete wild@delete" + ) && + ( + cd "$git" && + git p4 sync && + git merge --ff-only p4/master && + test_path_is_missing wild@delete + ) +' + +test_expect_success 'wildcard files requiring keyword scrub' ' + ( + cd "$cli" && + cat <<-\EOF >scrub@wild && + $Id$ + line2 + EOF + p4 add -t text+k -f scrub@wild && + p4 submit -d "scrub at wild" + ) && + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + git config git-p4.attemptRCSCleanup true && + sed "s/^line2/line2 edit/" <scrub@wild >scrub@wild.tmp && + mv -f scrub@wild.tmp scrub@wild && + git commit -m "scrub at wild line2 edit" scrub@wild && + git p4 submit + ) +' + test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9813-git-p4-preserve-users.sh b/t/t9813-git-p4-preserve-users.sh index f2e85e518..166b840bf 100755 --- a/t/t9813-git-p4-preserve-users.sh +++ b/t/t9813-git-p4-preserve-users.sh @@ -19,16 +19,6 @@ test_expect_success 'create files' ' ) ' -p4_add_user() { - name=$1 fullname=$2 && - p4 user -f -i <<-EOF && - User: $name - Email: $name@localhost - FullName: $fullname - EOF - p4 passwd -P secret $name -} - p4_grant_admin() { name=$1 && { @@ -51,8 +41,8 @@ make_change_by_user() { # Test username support, submitting as user 'alice' test_expect_success 'preserve users' ' - p4_add_user alice Alice && - p4_add_user bob Bob && + p4_add_user alice && + p4_add_user bob && p4_grant_admin alice && git p4 clone --dest="$git" //depot && test_when_finished cleanup_git && @@ -60,8 +50,8 @@ test_expect_success 'preserve users' ' cd "$git" && echo "username: a change by alice" >>file1 && echo "username: a change by bob" >>file2 && - git commit --author "Alice <alice@localhost>" -m "a change by alice" file1 && - git commit --author "Bob <bob@localhost>" -m "a change by bob" file2 && + git commit --author "Alice <alice@example.com>" -m "a change by alice" file1 && + git commit --author "Bob <bob@example.com>" -m "a change by bob" file2 && git config git-p4.skipSubmitEditCheck true && P4EDITOR=touch P4USER=alice P4PASSWD=secret git p4 commit --preserve-user && p4_check_commit_author file1 alice && @@ -78,7 +68,7 @@ test_expect_success 'refuse to preserve users without perms' ' cd "$git" && git config git-p4.skipSubmitEditCheck true && echo "username-noperms: a change by alice" >>file1 && - git commit --author "Alice <alice@localhost>" -m "perms: a change by alice" file1 && + git commit --author "Alice <alice@example.com>" -m "perms: a change by alice" file1 && P4EDITOR=touch P4USER=bob P4PASSWD=secret && export P4EDITOR P4USER P4PASSWD && test_must_fail git p4 commit --preserve-user && @@ -94,9 +84,9 @@ test_expect_success 'preserve user where author is unknown to p4' ' cd "$git" && git config git-p4.skipSubmitEditCheck true && echo "username-bob: a change by bob" >>file1 && - git commit --author "Bob <bob@localhost>" -m "preserve: a change by bob" file1 && + git commit --author "Bob <bob@example.com>" -m "preserve: a change by bob" file1 && echo "username-unknown: a change by charlie" >>file1 && - git commit --author "Charlie <charlie@localhost>" -m "preserve: a change by charlie" file1 && + git commit --author "Charlie <charlie@example.com>" -m "preserve: a change by charlie" file1 && P4EDITOR=touch P4USER=alice P4PASSWD=secret && export P4EDITOR P4USER P4PASSWD && test_must_fail git p4 commit --preserve-user && @@ -121,24 +111,24 @@ test_expect_success 'not preserving user with mixed authorship' ' ( cd "$git" && git config git-p4.skipSubmitEditCheck true && - p4_add_user derek Derek && + p4_add_user derek && - make_change_by_user usernamefile3 Derek derek@localhost && + make_change_by_user usernamefile3 Derek derek@example.com && P4EDITOR=cat P4USER=alice P4PASSWD=secret && export P4EDITOR P4USER P4PASSWD && git p4 commit |\ - grep "git author derek@localhost does not match" && + grep "git author derek@example.com does not match" && - make_change_by_user usernamefile3 Charlie charlie@localhost && + make_change_by_user usernamefile3 Charlie charlie@example.com && git p4 commit |\ - grep "git author charlie@localhost does not match" && + grep "git author charlie@example.com does not match" && - make_change_by_user usernamefile3 alice alice@localhost && + make_change_by_user usernamefile3 alice alice@example.com && git p4 commit |\ test_must_fail grep "git author.*does not match" && git config git-p4.skipUserNameCheck true && - make_change_by_user usernamefile3 Charlie charlie@localhost && + make_change_by_user usernamefile3 Charlie charlie@example.com && git p4 commit |\ test_must_fail grep "git author.*does not match" && diff --git a/t/t9816-git-p4-locked.sh b/t/t9816-git-p4-locked.sh new file mode 100755 index 000000000..e71e54334 --- /dev/null +++ b/t/t9816-git-p4-locked.sh @@ -0,0 +1,145 @@ +#!/bin/sh + +test_description='git p4 locked file behavior' + +. ./lib-git-p4.sh + +test_expect_success 'start p4d' ' + start_p4d +' + +# See +# http://www.perforce.com/perforce/doc.current/manuals/p4sag/03_superuser.html#1088563 +# for suggestions on how to configure "sitewide pessimistic locking" +# where only one person can have a file open for edit at a time. +test_expect_success 'init depot' ' + ( + cd "$cli" && + echo "TypeMap: +l //depot/..." | p4 typemap -i && + echo file1 >file1 && + p4 add file1 && + p4 submit -d "add file1" + ) +' + +test_expect_success 'edit with lock not taken' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line2 >>file1 && + git add file1 && + git commit -m "line2 in file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) +' + +test_expect_failure 'add with lock not taken' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line1 >>add-lock-not-taken && + git add file2 && + git commit -m "add add-lock-not-taken" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +lock_in_another_client() { + # build a different client + cli2="$TRASH_DIRECTORY/cli2" && + mkdir -p "$cli2" && + test_when_finished "p4 client -f -d client2 && rm -rf \"$cli2\"" && + ( + cd "$cli2" && + P4CLIENT=client2 && + cli="$cli2" && + client_view "//depot/... //client2/..." && + p4 sync && + p4 open file1 + ) +} + +test_expect_failure 'edit with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync -f file1" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo line3 >>file1 && + git add file1 && + git commit -m "line3 in file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +test_expect_failure 'delete with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync -f file1" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git rm file1 && + git commit -m "delete file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +test_expect_failure 'chmod with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync -f file1" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + chmod +x file1 && + git add file1 && + git commit -m "chmod +x file1" && + git config git-p4.skipSubmitEdit true && + git p4 submit --verbose + ) +' + +test_expect_failure 'copy with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 revert file2 && rm -f file2" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + cp file1 file2 && + git add file2 && + git commit -m "cp file1 to file2" && + git config git-p4.skipSubmitEdit true && + git config git-p4.detectCopies true && + git p4 submit --verbose + ) +' + +test_expect_failure 'move with lock taken' ' + lock_in_another_client && + test_when_finished cleanup_git && + test_when_finished "cd \"$cli\" && p4 sync file1 && rm -f file2" && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git mv file1 file2 && + git commit -m "mv file1 to file2" && + git config git-p4.skipSubmitEdit true && + git config git-p4.detectRenames true && + git p4 submit --verbose + ) +' + +test_expect_success 'kill p4d' ' + kill_p4d +' + +test_done diff --git a/transport-helper.c b/transport-helper.c index 087f617d3..ad72fbd53 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -1135,9 +1135,8 @@ static int udt_do_write(struct unidirectional_transfer *t) return 0; /* Nothing to write. */ transfer_debug("%s is writable", t->dest_name); - bytes = write(t->dest, t->buf, t->bufuse); - if (bytes < 0 && errno != EWOULDBLOCK && errno != EAGAIN && - errno != EINTR) { + bytes = xwrite(t->dest, t->buf, t->bufuse); + if (bytes < 0 && errno != EWOULDBLOCK) { error("write(%s) failed: %s", t->dest_name, strerror(errno)); return -1; } else if (bytes > 0) { diff --git a/tree-walk.c b/tree-walk.c index 680afda06..79dba1d0f 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -543,7 +543,7 @@ static int match_entry(const struct pathspec_item *item, if (matchlen > pathlen) { if (match[pathlen] != '/') return 0; - if (!S_ISDIR(entry->mode)) + if (!S_ISDIR(entry->mode) && !S_ISGITLINK(entry->mode)) return 0; } @@ -749,7 +749,7 @@ match_wildcards: if (item->nowildcard_len && !match_wildcard_base(item, base_str, baselen, &matched)) - return entry_not_interesting; + continue; /* * Concatenate base and entry->path into one and do |