summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/RelNotes/2.0.4.txt5
-rw-r--r--Documentation/RelNotes/2.1.0.txt122
-rw-r--r--Documentation/git-push.txt2
-rw-r--r--Documentation/git.txt8
-rw-r--r--Documentation/technical/api-config.txt31
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--builtin/apply.c2
-rw-r--r--builtin/receive-pack.c4
-rw-r--r--builtin/rev-parse.c1
-rw-r--r--builtin/show-branch.c1
-rw-r--r--compat/mingw.c291
-rw-r--r--compat/mingw.h11
-rw-r--r--config.c12
-rw-r--r--config.mak.uname2
-rw-r--r--contrib/completion/git-completion.bash28
-rw-r--r--contrib/convert-objects/git-convert-objects.txt2
-rw-r--r--contrib/examples/git-svnimport.txt2
-rw-r--r--contrib/gitview/gitview.txt2
-rw-r--r--git-compat-util.h11
-rwxr-xr-xgitk-git/gitk12
-rw-r--r--gitk-git/po/bg.po652
-rw-r--r--refs.c235
-rw-r--r--run-command.c10
-rw-r--r--sha1_name.c4
-rw-r--r--t/annotate-tests.sh12
-rwxr-xr-xt/t0081-line-buffer.sh2
-rwxr-xr-xt/t0110-urlmatch-normalization.sh7
-rwxr-xr-xt/t1402-check-ref-format.sh16
-rwxr-xr-xt/t3901-i18n-patch.sh19
-rwxr-xr-xt/t4013-diff-various.sh10
-rwxr-xr-xt/t4018-diff-funcname.sh8
-rwxr-xr-xt/t4041-diff-submodule-option.sh6
-rwxr-xr-xt/t4201-shortlog.sh6
-rwxr-xr-xt/t4205-log-pretty-formats.sh2
-rwxr-xr-xt/t4210-log-i18n.sh4
-rwxr-xr-xt/t6006-rev-list-format.sh4
-rwxr-xr-xt/t7102-reset.sh8
-rwxr-xr-xt/t7509-commit.sh1
-rwxr-xr-xt/t8005-blame-i18n.sh8
-rwxr-xr-xt/t9800-git-p4-basic.sh2
-rwxr-xr-xt/t9807-git-p4-submit.sh2
-rwxr-xr-xt/t9814-git-p4-rename.sh10
-rwxr-xr-xt/t9902-completion.sh17
-rw-r--r--t/valgrind/default.supp15
-rw-r--r--transport.c5
45 files changed, 768 insertions, 848 deletions
diff --git a/Documentation/RelNotes/2.0.4.txt b/Documentation/RelNotes/2.0.4.txt
new file mode 100644
index 0000000000..7e340921a2
--- /dev/null
+++ b/Documentation/RelNotes/2.0.4.txt
@@ -0,0 +1,5 @@
+Git v2.0.4 Release Notes
+========================
+
+ * An earlier update to v2.0.2 broken output from "git diff-tree",
+ which is fixed in this release.
diff --git a/Documentation/RelNotes/2.1.0.txt b/Documentation/RelNotes/2.1.0.txt
index be598ad7a2..ae4753728e 100644
--- a/Documentation/RelNotes/2.1.0.txt
+++ b/Documentation/RelNotes/2.1.0.txt
@@ -12,7 +12,7 @@ Backward compatibility notes
$ git config core.pager "less -S"
to restore the traditional behaviour. It is expected that people
- find output from the most subcommands easier to read with the new
+ find output from most subcommands easier to read with the new
default, except for "blame" which tends to produce really long
lines. To override the new default only for "git blame", you can
do this:
@@ -31,7 +31,7 @@ UI, Workflows & Features
default value "FRSX" when we spawn "less" as the pager. "S" (chop
long lines instead of wrapping) has been removed from this default
set of options, because it is more or less a personal taste thing,
- as opposed to others that have good justifications (i.e. "R" is
+ as opposed to the others that have good justifications (i.e. "R" is
very much justified because many kinds of output we produce are
colored and "FX" is justified because output we produce is often
shorter than a page).
@@ -39,47 +39,47 @@ UI, Workflows & Features
* The logic and data used to compute the display width needed for
UTF-8 strings have been updated to match Unicode 7.0 better.
- * HTTP-based transports learned to propagate the error messages from
- the webserver better to the client coming over the HTTP transport.
+ * HTTP-based transports learned to better propagate the error messages from
+ the webserver to the client coming over the HTTP transport.
* The completion script for bash (in contrib/) has been updated to
- handle aliases that define complex sequence of commands better.
+ better handle aliases that define a complex sequence of commands.
- * The "core.preloadindex" configuration variable is by default
- enabled, allowing modern platforms to take advantage of the
- multiple cores they have.
+ * The "core.preloadindex" configuration variable is enabled by default,
+ allowing modern platforms to take advantage of their
+ multiple cores.
* "git clone" applies the "if cloning from a local disk, physically
- copy repository using hardlinks, unless otherwise told not to with
- --no-local" optimization when url.*.insteadOf mechanism rewrites a
- "git clone $URL" that refers to a repository over the network to a
+ copy the repository using hardlinks, unless otherwise told not to with
+ --no-local" optimization when the url.*.insteadOf mechanism rewrites a
+ remote-repository "git clone $URL" into a
clone from a local disk.
- * "git commit --date=<date>" option learned to read from more
+ * "git commit --date=<date>" option learned more
timestamp formats, including "--date=now".
* The `core.commentChar` configuration variable is used to specify a
- custom comment character other than the default "#" to be used in
- the commit log editor. This can be set to `auto` to attempt to
- choose a different character that does not conflict with what
- already starts a line in the message being edited for cases like
+ custom comment character (other than the default "#") for
+ the commit message editor. This can be set to `auto` to attempt to
+ choose a different character that does not conflict with any that
+ already starts a line in the message being edited, for cases like
"git commit --amend".
- * "git format-patch" learned --signature-file=<file> to take the mail
- signature from.
+ * "git format-patch" learned --signature-file=<file> to add the contents
+ of a file as a signature to the mail message it produces.
- * "git grep" learned grep.fullname configuration variable to force
- "--full-name" to be default. This may cause regressions on
- scripted users that do not expect this new behaviour.
+ * "git grep" learned the grep.fullname configuration variable to force
+ "--full-name" to be the default. This may cause regressions for
+ scripted users who do not expect this new behaviour.
* "git imap-send" learned to ask the credential helper for auth
material.
- * "git log" and friends now understand the value "auto" set to the
+ * "git log" and friends now understand the value "auto" for the
"log.decorate" configuration variable to enable the "--decorate"
option automatically when the output is sent to tty.
- * "git merge" without argument, even when there is an upstream
+ * "git merge" without an argument, even when there is an upstream
defined for the current branch, refused to run until
merge.defaultToUpstream is set to true. Flip the default of that
configuration variable to true.
@@ -87,22 +87,20 @@ UI, Workflows & Features
* "git mergetool" learned to drive the vimdiff3 backend.
* mergetool.prompt used to default to 'true', always asking "do you
- really want to run the tool on this path?". Among the two
- purposes this prompt serves, ignore the use case to confirm that
- the user wants to view particular path with the named tool, and
- redefine the meaning of the prompt only to confirm the choice of
- the tool made by the autodetection (for those who configured the
- tool explicitly, the prompt shown for the latter purpose is
- simply annoying).
-
- Strictly speaking, this is a backward incompatible change and the
+ really want to run the tool on this path?". The default has been
+ changed to 'false'. However, the prompt will still appear if
+ mergetool used its autodetection system to guess which tool to use.
+ Users who explicitly specify or configure a tool will no longer see
+ the prompt by default.
+
+ Strictly speaking, this is a backward incompatible change and
users need to explicitly set the variable to 'true' if they want
- to resurrect the now-ignored use case.
+ to be prompted to confirm running the tool on each path.
* "git replace" learned the "--edit" subcommand to create a
replacement by editing an existing object.
- * "git replace" learned a "--graft" option to rewrite parents of a
+ * "git replace" learned a "--graft" option to rewrite the parents of a
commit.
* "git send-email" learned "--to-cover" and "--cc-cover" options, to
@@ -117,10 +115,10 @@ UI, Workflows & Features
being edited as a comment in the editor.
* "git tag" learned to pay attention to "tag.sort" configuration, to
- be used as the default sort order when no --sort=<value> the option
+ be used as the default sort order when no --sort=<value> option
is given.
- * "git verify-commit" command to check GPG signature in signed
+ * A new "git verify-commit" command, to check GPG signatures in signed
commits, in a way similar to "git verify-tag" is used to check
signed tags, was added.
@@ -129,8 +127,8 @@ Performance, Internal Implementation, etc.
* Build procedure for 'subtree' (in contrib/) has been cleaned up.
- * The support for the profile-feedback build, which has been left
- bit-rotten for quite a while, has been updated.
+ * Support for the profile-feedback build, which has
+ bit-rotted for quite a while, has been updated.
* An experimental format to use two files (the base file and
incremental changes relative to it) to represent the index has been
@@ -138,16 +136,12 @@ Performance, Internal Implementation, etc.
when only small part of the working tree changes.
* Effort to shrink the size of patches Windows folks maintain on top
- by upstreaming them continues.
-
- * Patches maintained by msysgit folks for Windows port are being
- upstreamed here a bit by bit.
+ by upstreaming them continues. More tests that are not applicable
+ to the Windows environment are identified and either skipped or
+ made more portable.
- * The leaf function to check validity of a refname format has been
- micro-optimized, using SSE2 instructions when available. A few
- breakages during its development have been caught and fixed already
- but there might remain some more still; please test and report if
- you find any.
+ * Eradication of "test $condition -a $condition" from our scripts
+ continues.
* The `core.deltabasecachelimit` used to default to 16 MiB , but this
proved to be too small, and has been bumped to 96 MiB.
@@ -156,7 +150,7 @@ Performance, Internal Implementation, etc.
structure that is used to keep track of the work to be done.
* "git diff" that compares 3-or-more trees (e.g. parents and the
- result of a merge) have been optimized.
+ result of a merge) has been optimized.
* The API to update/delete references are being converted to handle
updates to multiple references in a transactional way. As an
@@ -192,8 +186,8 @@ notes for details).
to a tty.
(merge 38de156 mn/sideband-no-ansi later to maint).
- * Mishandling of patterns in .gitignore that has trailing SPs quoted
- with backslashes (e.g. ones that end with "\ ") have been
+ * Mishandling of patterns in .gitignore that have trailing SPs quoted
+ with backslashes (e.g. ones that end with "\ ") has been
corrected.
(merge 97c1364be6b pb/trim-trailing-spaces later to maint).
@@ -230,7 +224,7 @@ notes for details).
and to allow the caller find the length of the object.
(merge 218aa3a jk/commit-buffer-length later to maint).
- * The "mailmap.file" configuration option did not support the tilde
+ * The "mailmap.file" configuration option did not support tilde
expansion (i.e. ~user/path and ~/path).
(merge 9352fd5 ow/config-mailmap-pathname later to maint).
@@ -242,7 +236,7 @@ notes for details).
* The unix-domain socket used by the sample credential cache daemon
tried to unlink an existing stale one at a wrong path, if the path
to the socket was given as an overlong path that does not fit in
- sun_path member of the sockaddr_un structure.
+ the sun_path member of the sockaddr_un structure.
(merge 2869b3e rs/fix-unlink-unix-socket later to maint).
* An ancient rewrite passed a wrong pointer to a curl library
@@ -250,12 +244,12 @@ notes for details).
(merge 479eaa8 ah/fix-http-push later to maint).
* "--ignore-space-change" option of "git apply" ignored the spaces
- at the beginning of line too aggressively, which is inconsistent
- with the option of the same name "diff" and "git diff" have.
+ at the beginning of lines too aggressively, which is inconsistent
+ with the option of the same name that "diff" and "git diff" have.
(merge 14d3bb4 jc/apply-ignore-whitespace later to maint).
- * "git blame" miscounted number of columns needed to show localized
- timestamps, resulting in jaggy left-side-edge of the source code
+ * "git blame" miscounted the number of columns needed to show localized
+ timestamps, resulting in a jaggy left-side-edge for the source code
lines in its output.
(merge dd75553 jx/blame-align-relative-time later to maint).
@@ -269,17 +263,17 @@ notes for details).
because it incorrectly used strstr().
(merge 60a5f5f jc/fix-clone-single-starting-at-a-tag later to maint).
- * "git commit --allow-empty-messag -C $commit" did not work when the
+ * "git commit --allow-empty-message -C $commit" did not work when the
commit did not have any log message.
(merge 076cbd6 jk/commit-C-pick-empty later to maint).
* "git diff --find-copies-harder" sometimes pretended as if the mode
- bits have changed for paths that are marked with assume-unchanged
+ bits have changed for paths that are marked with the assume-unchanged
bit.
(merge 5304810 jk/diff-files-assume-unchanged later to maint).
* "filter-branch" left an empty single-parent commit that results when
- all parents of a merge commit gets mapped to the same commit, even
+ all parents of a merge commit get mapped to the same commit, even
under "--prune-empty".
(merge 79bc4ef cb/filter-branch-prune-empty-degenerate-merges later to maint).
@@ -312,10 +306,10 @@ notes for details).
mergetag that was and was not correctly validated.
(merge 42c55ce mg/fix-log-mergetag-color later to maint).
- * "log --show-signature" did not pay attention to "--graph" option.
+ * "log --show-signature" did not pay attention to the "--graph" option.
(merge cf3983d zk/log-graph-showsig later to maint).
- * "git mailinfo" used to read beyond the end of header string while
+ * "git mailinfo" used to read beyond the ends of header strings while
parsing an incoming e-mail message to extract the patch.
(merge b1a013d rs/mailinfo-header-cmp later to maint).
@@ -335,7 +329,7 @@ notes for details).
(merge fb79947 rs/pack-objects-no-unnecessary-realloc later to maint).
* Recent updates to "git repack" started to duplicate objects that
- are in packfiles marked with .keep flag into the new packfile by
+ are in packfiles marked with the .keep flag into the new packfile by
mistake.
(merge d078d85 jk/repack-pack-keep-objects later to maint).
@@ -373,14 +367,14 @@ notes for details).
* "git status", even though it is a read-only operation, tries to
update the index with refreshed lstat(2) info to optimize future
accesses to the working tree opportunistically, but this could
- race with a "read-write" operation that modify the index while it
+ race with a "read-write" operation that modifies the index while it
is running. Detect such a race and avoid overwriting the index.
(merge 426ddee ym/fix-opportunistic-index-update-race later to maint).
* "git status" (and "git commit") behaved as if changes in a modified
submodule are not there if submodule.*.ignore configuration is set,
which was misleading. The configuration is only to unclutter diff
- output during the course of development, and should not to hide
+ output during the course of development, and not to hide
changes in the "status" output to cause the users forget to commit
them.
(merge c215d3d jl/status-added-submodule-is-never-ignored later to maint).
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index 21cd455508..c0d7403b9a 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -33,7 +33,7 @@ When the command line does not specify what to push with `<refspec>...`
arguments or `--all`, `--mirror`, `--tags` options, the command finds
the default `<refspec>` by consulting `remote.*.push` configuration,
and if it is not found, honors `push.default` configuration to decide
-what to push (See gitlink:git-config[1] for the meaning of `push.default`).
+what to push (See linkgit:git-config[1] for the meaning of `push.default`).
OPTIONS[[OPTIONS]]
diff --git a/Documentation/git.txt b/Documentation/git.txt
index a0f1ede866..de7b870a35 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,9 +43,15 @@ unreleased) version of Git, that is available from the 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
-* link:v2.0.3/git.html[documentation for release 2.0.3]
+* link:v2.1.0/git.html[documentation for release 2.1]
* release notes for
+ link:RelNotes/2.1.0.txt[2.1].
+
+* link:v2.0.4/git.html[documentation for release 2.0.4]
+
+* release notes for
+ link:RelNotes/2.0.4.txt[2.0.4],
link:RelNotes/2.0.3.txt[2.0.3],
link:RelNotes/2.0.2.txt[2.0.2],
link:RelNotes/2.0.1.txt[2.0.1],
diff --git a/Documentation/technical/api-config.txt b/Documentation/technical/api-config.txt
index 230b3a0f60..edd5018e15 100644
--- a/Documentation/technical/api-config.txt
+++ b/Documentation/technical/api-config.txt
@@ -137,4 +137,33 @@ int read_file_with_include(const char *file, config_fn_t fn, void *data)
Writing Config Files
--------------------
-TODO
+Git gives multiple entry points in the Config API to write config values to
+files namely `git_config_set_in_file` and `git_config_set`, which write to
+a specific config file or to `.git/config` respectively. They both take a
+key/value pair as parameter.
+In the end they both call `git_config_set_multivar_in_file` which takes four
+parameters:
+
+- the name of the file, as a string, to which key/value pairs will be written.
+
+- the name of key, as a string. This is in canonical "flat" form: the section,
+ subsection, and variable segments will be separated by dots, and the section
+ and variable segments will be all lowercase.
+ E.g., `core.ignorecase`, `diff.SomeType.textconv`.
+
+- the value of the variable, as a string. If value is equal to NULL, it will
+ remove the matching key from the config file.
+
+- the value regex, as a string. It will disregard key/value pairs where value
+ does not match.
+
+- a multi_replace value, as an int. If value is equal to zero, nothing or only
+ one matching key/value is replaced, else all matching key/values (regardless
+ how many) are removed, before the new pair is written.
+
+It returns 0 on success.
+
+Also, there are functions `git_config_rename_section` and
+`git_config_rename_section_in_file` with parameters `old_name` and `new_name`
+for renaming or removing sections in the config files. If NULL is passed
+through `new_name` parameter, the section will be removed from the config file.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index f1bae1ce37..a4cdfbf7f6 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.1.0-rc0
+DEF_VER=v2.1.0
LF='
'
diff --git a/builtin/apply.c b/builtin/apply.c
index 9f8f5bac07..be2b4ce2fd 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -1075,7 +1075,7 @@ static int gitdiff_index(const char *line, struct patch *patch)
line = ptr + 2;
ptr = strchr(line, ' ');
- eol = strchr(line, '\n');
+ eol = strchrnul(line, '\n');
if (!ptr || eol < ptr)
ptr = eol;
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 92561bffc1..f93ac454b4 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1122,7 +1122,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
int advertise_refs = 0;
int stateless_rpc = 0;
int i;
- char *dir = NULL;
+ const char *dir = NULL;
struct command *commands;
struct sha1_array shallow = SHA1_ARRAY_INIT;
struct sha1_array ref = SHA1_ARRAY_INIT;
@@ -1157,7 +1157,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
}
if (dir)
usage(receive_pack_usage);
- dir = xstrdup(arg);
+ dir = arg;
}
if (!dir)
usage(receive_pack_usage);
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 8102aaa924..d85e08cc9c 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -151,6 +151,7 @@ static void show_rev(int type, const unsigned char *sha1, const char *name)
error("refname '%s' is ambiguous", name);
break;
}
+ free(full);
} else {
show_with_type(type, name);
}
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index 5fd4e4e488..298c95e3f8 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -777,6 +777,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)
sprintf(nth_desc, "%s@{%d}", *av, base+i);
append_ref(nth_desc, sha1, 1);
}
+ free(ref);
}
else if (all_heads + all_remotes)
snarf_refs(all_heads, all_remotes);
diff --git a/compat/mingw.c b/compat/mingw.c
index 9d435e2cf4..c5c37e53ce 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -4,6 +4,7 @@
#include <wchar.h>
#include "../strbuf.h"
#include "../run-command.h"
+#include "../cache.h"
static const int delay[] = { 0, 1, 10, 20, 40 };
@@ -898,11 +899,44 @@ static char *path_lookup(const char *cmd, char **path, int exe_only)
return prog;
}
-static int env_compare(const void *a, const void *b)
+static int do_putenv(char **env, const char *name, int size, int free_old);
+
+/* used number of elements of environ array, including terminating NULL */
+static int environ_size = 0;
+/* allocated size of environ array, in bytes */
+static int environ_alloc = 0;
+
+/*
+ * Create environment block suitable for CreateProcess. Merges current
+ * process environment and the supplied environment changes.
+ */
+static wchar_t *make_environment_block(char **deltaenv)
{
- char *const *ea = a;
- char *const *eb = b;
- return strcasecmp(*ea, *eb);
+ wchar_t *wenvblk = NULL;
+ char **tmpenv;
+ int i = 0, size = environ_size, wenvsz = 0, wenvpos = 0;
+
+ while (deltaenv && deltaenv[i])
+ i++;
+
+ /* copy the environment, leaving space for changes */
+ tmpenv = xmalloc((size + i) * sizeof(char*));
+ memcpy(tmpenv, environ, size * sizeof(char*));
+
+ /* merge supplied environment changes into the temporary environment */
+ for (i = 0; deltaenv && deltaenv[i]; i++)
+ size = do_putenv(tmpenv, deltaenv[i], size, 0);
+
+ /* create environment block from temporary environment */
+ for (i = 0; tmpenv[i]; i++) {
+ size = 2 * strlen(tmpenv[i]) + 2; /* +2 for final \0 */
+ ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz);
+ wenvpos += xutftowcs(&wenvblk[wenvpos], tmpenv[i], size) + 1;
+ }
+ /* add final \0 terminator */
+ wenvblk[wenvpos] = 0;
+ free(tmpenv);
+ return wenvblk;
}
struct pinfo_t {
@@ -913,15 +947,15 @@ struct pinfo_t {
static struct pinfo_t *pinfo = NULL;
CRITICAL_SECTION pinfo_cs;
-static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
+static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaenv,
const char *dir,
int prepend_cmd, int fhin, int fhout, int fherr)
{
STARTUPINFOW si;
PROCESS_INFORMATION pi;
- struct strbuf envblk, args;
- wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs;
- unsigned flags;
+ struct strbuf args;
+ wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs, *wenvblk = NULL;
+ unsigned flags = CREATE_UNICODE_ENVIRONMENT;
BOOL ret;
/* Determine whether or not we are associated to a console */
@@ -938,7 +972,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
* instead of CREATE_NO_WINDOW to make ssh
* recognize that it has no console.
*/
- flags = DETACHED_PROCESS;
+ flags |= DETACHED_PROCESS;
} else {
/* There is already a console. If we specified
* DETACHED_PROCESS here, too, Windows would
@@ -946,7 +980,6 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
* The same is true for CREATE_NO_WINDOW.
* Go figure!
*/
- flags = 0;
CloseHandle(cons);
}
memset(&si, 0, sizeof(si));
@@ -982,32 +1015,13 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
xutftowcs(wargs, args.buf, 2 * args.len + 1);
strbuf_release(&args);
- if (env) {
- int count = 0;
- char **e, **sorted_env;
-
- for (e = env; *e; e++)
- count++;
-
- /* environment must be sorted */
- sorted_env = xmalloc(sizeof(*sorted_env) * (count + 1));
- memcpy(sorted_env, env, sizeof(*sorted_env) * (count + 1));
- qsort(sorted_env, count, sizeof(*sorted_env), env_compare);
-
- strbuf_init(&envblk, 0);
- for (e = sorted_env; *e; e++) {
- strbuf_addstr(&envblk, *e);
- strbuf_addch(&envblk, '\0');
- }
- free(sorted_env);
- }
+ wenvblk = make_environment_block(deltaenv);
memset(&pi, 0, sizeof(pi));
ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,
- env ? envblk.buf : NULL, dir ? wdir : NULL, &si, &pi);
+ wenvblk, dir ? wdir : NULL, &si, &pi);
- if (env)
- strbuf_release(&envblk);
+ free(wenvblk);
free(wargs);
if (!ret) {
@@ -1039,10 +1053,10 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **env,
static pid_t mingw_spawnv(const char *cmd, const char **argv, int prepend_cmd)
{
- return mingw_spawnve_fd(cmd, argv, environ, NULL, prepend_cmd, 0, 1, 2);
+ return mingw_spawnve_fd(cmd, argv, NULL, NULL, prepend_cmd, 0, 1, 2);
}
-pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
+pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **deltaenv,
const char *dir,
int fhin, int fhout, int fherr)
{
@@ -1066,14 +1080,14 @@ pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env,
pid = -1;
}
else {
- pid = mingw_spawnve_fd(iprog, argv, env, dir, 1,
+ pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, 1,
fhin, fhout, fherr);
free(iprog);
}
argv[0] = argv0;
}
else
- pid = mingw_spawnve_fd(prog, argv, env, dir, 0,
+ pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, 0,
fhin, fhout, fherr);
free(prog);
}
@@ -1170,108 +1184,88 @@ int mingw_kill(pid_t pid, int sig)
return -1;
}
-static char **copy_environ(void)
-{
- char **env;
- int i = 0;
- while (environ[i])
- i++;
- env = xmalloc((i+1)*sizeof(*env));
- for (i = 0; environ[i]; i++)
- env[i] = xstrdup(environ[i]);
- env[i] = NULL;
- return env;
-}
-
-void free_environ(char **env)
-{
- int i;
- for (i = 0; env[i]; i++)
- free(env[i]);
- free(env);
+/*
+ * Compare environment entries by key (i.e. stopping at '=' or '\0').
+ */
+static int compareenv(const void *v1, const void *v2)
+{
+ const char *e1 = *(const char**)v1;
+ const char *e2 = *(const char**)v2;
+
+ for (;;) {
+ int c1 = *e1++;
+ int c2 = *e2++;
+ c1 = (c1 == '=') ? 0 : tolower(c1);
+ c2 = (c2 == '=') ? 0 : tolower(c2);
+ if (c1 > c2)
+ return 1;
+ if (c1 < c2)
+ return -1;
+ if (c1 == 0)
+ return 0;
+ }
}
-static int lookup_env(char **env, const char *name, size_t nmln)
+static int bsearchenv(char **env, const char *name, size_t size)
{
- int i;
-
- for (i = 0; env[i]; i++) {
- if (0 == strncmp(env[i], name, nmln)
- && '=' == env[i][nmln])
- /* matches */
- return i;
+ unsigned low = 0, high = size;
+ while (low < high) {
+ unsigned mid = low + ((high - low) >> 1);
+ int cmp = compareenv(&env[mid], &name);
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid;
+ else
+ return mid;
}
- return -1;
+ return ~low; /* not found, return 1's complement of insert position */
}
/*
* If name contains '=', then sets the variable, otherwise it unsets it
+ * Size includes the terminating NULL. Env must have room for size + 1 entries
+ * (in case of insert). Returns the new size. Optionally frees removed entries.
*/
-static char **env_setenv(char **env, const char *name)
+static int do_putenv(char **env, const char *name, int size, int free_old)
{
- char *eq = strchrnul(name, '=');
- int i = lookup_env(env, name, eq-name);
+ int i = bsearchenv(env, name, size - 1);
- if (i < 0) {
- if (*eq) {
- for (i = 0; env[i]; i++)
- ;
- env = xrealloc(env, (i+2)*sizeof(*env));
- env[i] = xstrdup(name);
- env[i+1] = NULL;
- }
- }
- else {
+ /* optionally free removed / replaced entry */
+ if (i >= 0 && free_old)
free(env[i]);
- if (*eq)
- env[i] = xstrdup(name);
- else
- for (; env[i]; i++)
- env[i] = env[i+1];
- }
- return env;
-}
-/*
- * Copies global environ and adjusts variables as specified by vars.
- */
-char **make_augmented_environ(const char *const *vars)
-{
- char **env = copy_environ();
-
- while (*vars)
- env = env_setenv(env, *vars++);
- return env;
+ if (strchr(name, '=')) {
+ /* if new value ('key=value') is specified, insert or replace entry */
+ if (i < 0) {
+ i = ~i;
+ memmove(&env[i + 1], &env[i], (size - i) * sizeof(char*));
+ size++;
+ }
+ env[i] = (char*) name;
+ } else if (i >= 0) {
+ /* otherwise ('key') remove existing entry */
+ size--;
+ memmove(&env[i], &env[i + 1], (size - i) * sizeof(char*));
+ }
+ return size;
}
-#undef getenv
-
-/*
- * The system's getenv looks up the name in a case-insensitive manner.
- * This version tries a case-sensitive lookup and falls back to
- * case-insensitive if nothing was found. This is necessary because,
- * as a prominent example, CMD sets 'Path', but not 'PATH'.
- * Warning: not thread-safe.
- */
-static char *getenv_cs(const char *name)
+char *mingw_getenv(const char *name)
{
- size_t len = strlen(name);
- int i = lookup_env(environ, name, len);
- if (i >= 0)
- return environ[i] + len + 1; /* skip past name and '=' */
- return getenv(name);
+ char *value;
+ int pos = bsearchenv(environ, name, environ_size - 1);
+ if (pos < 0)
+ return NULL;
+ value = strchr(environ[pos], '=');
+ return value ? &value[1] : NULL;
}
-char *mingw_getenv(const char *name)
+int mingw_putenv(const char *namevalue)
{
- char *result = getenv_cs(name);
- if (!result && !strcmp(name, "TMPDIR")) {
- /* on Windows it is TMP and TEMP */
- result = getenv_cs("TMP");
- if (!result)
- result = getenv_cs("TEMP");
- }
- return result;
+ ALLOC_GROW(environ, (environ_size + 1) * sizeof(char*), environ_alloc);
+ environ_size = do_putenv(environ, namevalue, environ_size, 1);
+ return 0;
}
/*
@@ -2049,9 +2043,23 @@ static NORETURN void die_startup()
exit(128);
}
+static void *malloc_startup(size_t size)
+{
+ void *result = malloc(size);
+ if (!result)
+ die_startup();
+ return result;
+}
+
+static char *wcstoutfdup_startup(char *buffer, const wchar_t *wcs, size_t len)
+{
+ len = xwcstoutf(buffer, wcs, len) + 1;
+ return memcpy(malloc_startup(len), buffer, len);
+}
+
void mingw_startup()
{
- int i, len, maxlen, argc;
+ int i, maxlen, argc;
char *buffer;
wchar_t **wenv, **wargv;
_startupinfo si;
@@ -2065,20 +2073,49 @@ void mingw_startup()
maxlen = wcslen(_wpgmptr);
for (i = 1; i < argc; i++)
maxlen = max(maxlen, wcslen(wargv[i]));
+ for (i = 0; wenv[i]; i++)
+ maxlen = max(maxlen, wcslen(wenv[i]));
+
+ /*
+ * nedmalloc can't free CRT memory, allocate resizable environment
+ * list. Note that xmalloc / xmemdupz etc. call getenv, so we cannot
+ * use it while initializing the environment itself.
+ */
+ environ_size = i + 1;
+ environ_alloc = alloc_nr(environ_size * sizeof(char*));
+ environ = malloc_startup(environ_alloc);
/* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */
maxlen = 3 * maxlen + 1;
- buffer = xmalloc(maxlen);
+ buffer = malloc_startup(maxlen);
/* convert command line arguments and environment to UTF-8 */
- len = xwcstoutf(buffer, _wpgmptr, maxlen);
- __argv[0] = xmemdupz(buffer, len);
- for (i = 1; i < argc; i++) {
- len = xwcstoutf(buffer, wargv[i], maxlen);
- __argv[i] = xmemdupz(buffer, len);
- }
+ __argv[0] = wcstoutfdup_startup(buffer, _wpgmptr, maxlen);
+ for (i = 1; i < argc; i++)
+ __argv[i] = wcstoutfdup_startup(buffer, wargv[i], maxlen);
+ for (i = 0; wenv[i]; i++)
+ environ[i] = wcstoutfdup_startup(buffer, wenv[i], maxlen);
+ environ[i] = NULL;
free(buffer);
+ /* sort environment for O(log n) getenv / putenv */
+ qsort(environ, i, sizeof(char*), compareenv);
+
+ /* fix Windows specific environment settings */
+
+ /* on Windows it is TMP and TEMP */
+ if (!mingw_getenv("TMPDIR")) {
+ const char *tmp = mingw_getenv("TMP");
+ if (!tmp)
+ tmp = mingw_getenv("TEMP");
+ if (tmp)
+ setenv("TMPDIR", tmp, 1);
+ }
+
+ /* simulate TERM to enable auto-color (see color.c) */
+ if (!getenv("TERM"))
+ setenv("TERM", "cygwin", 1);
+
/* initialize critical section for waitpid pinfo_t list */
InitializeCriticalSection(&pinfo_cs);
diff --git a/compat/mingw.h b/compat/mingw.h
index 510530c690..df0e3203ab 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -210,6 +210,9 @@ char *mingw_getcwd(char *pointer, int len);
char *mingw_getenv(const char *name);
#define getenv mingw_getenv
+int mingw_putenv(const char *namevalue);
+#define putenv mingw_putenv
+#define unsetenv mingw_putenv
int mingw_gethostname(char *host, int namelen);
#define gethostname mingw_gethostname
@@ -357,12 +360,8 @@ int mingw_offset_1st_component(const char *path);
void mingw_open_html(const char *path);
#define open_html mingw_open_html
-/*
- * helpers
- */
-
-char **make_augmented_environ(const char *const *vars);
-void free_environ(char **env);
+void mingw_mark_as_git_dir(const char *dir);
+#define mark_as_git_dir mingw_mark_as_git_dir
/**
* Converts UTF-8 encoded string to UTF-16LE.
diff --git a/config.c b/config.c
index 9767c4bad0..058505cb8d 100644
--- a/config.c
+++ b/config.c
@@ -817,14 +817,12 @@ static int git_default_core_config(const char *var, const char *value)
return git_config_string(&editor_program, var, value);
if (!strcmp(var, "core.commentchar")) {
- const char *comment;
- int ret = git_config_string(&comment, var, value);
- if (ret)
- return ret;
- else if (!strcasecmp(comment, "auto"))
+ if (!value)
+ return config_error_nonbool(var);
+ else if (!strcasecmp(value, "auto"))
auto_comment_line_char = 1;
- else if (comment[0] && !comment[1]) {
- comment_line_char = comment[0];
+ else if (value[0] && !value[1]) {
+ comment_line_char = value[0];
auto_comment_line_char = 0;
} else
return error("core.commentChar should only be one character");
diff --git a/config.mak.uname b/config.mak.uname
index 00cf4c6b83..15ee15e98c 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -327,7 +327,6 @@ ifeq ($(uname_S),Windows)
NO_IPV6 = YesPlease
NO_UNIX_SOCKETS = YesPlease
NO_SETENV = YesPlease
- NO_UNSETENV = YesPlease
NO_STRCASESTR = YesPlease
NO_STRLCPY = YesPlease
NO_MEMMEM = YesPlease
@@ -480,7 +479,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
NO_SYMLINK_HEAD = YesPlease
NO_UNIX_SOCKETS = YesPlease
NO_SETENV = YesPlease
- NO_UNSETENV = YesPlease
NO_STRCASESTR = YesPlease
NO_STRLCPY = YesPlease
NO_MEMMEM = YesPlease
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 7a6e1d797a..06bf262087 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1621,12 +1621,33 @@ _git_pull ()
__git_push_recurse_submodules="check on-demand"
+__git_complete_force_with_lease ()
+{
+ local cur_=$1
+
+ case "$cur_" in
+ --*=)
+ ;;
+ *:*)
+ __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
+ ;;
+ *)
+ __gitcomp_nl "$(__git_refs)" "" "$cur_"
+ ;;
+ esac
+}
+
_git_push ()
{
case "$prev" in
--repo)
__gitcomp_nl "$(__git_remotes)"
return
+ ;;
+ --recurse-submodules)
+ __gitcomp "$__git_push_recurse_submodules"
+ return
+ ;;
esac
case "$cur" in
--repo=*)
@@ -1637,11 +1658,16 @@ _git_push ()
__gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
return
;;
+ --force-with-lease=*)
+ __git_complete_force_with_lease "${cur##--force-with-lease=}"
+ return
+ ;;
--*)
__gitcomp "
--all --mirror --tags --dry-run --force --verbose
+ --quiet --prune --delete --follow-tags
--receive-pack= --repo= --set-upstream
- --recurse-submodules=
+ --force-with-lease --force-with-lease= --recurse-submodules=
"
return
;;
diff --git a/contrib/convert-objects/git-convert-objects.txt b/contrib/convert-objects/git-convert-objects.txt
index 0565d83fc4..f871880cfb 100644
--- a/contrib/convert-objects/git-convert-objects.txt
+++ b/contrib/convert-objects/git-convert-objects.txt
@@ -26,4 +26,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel
GIT
---
-Part of the gitlink:git[7] suite
+Part of the linkgit:git[7] suite
diff --git a/contrib/examples/git-svnimport.txt b/contrib/examples/git-svnimport.txt
index 3bb871e42f..3f0a9c33b5 100644
--- a/contrib/examples/git-svnimport.txt
+++ b/contrib/examples/git-svnimport.txt
@@ -176,4 +176,4 @@ Documentation by Matthias Urlichs <smurf@smurf.noris.de>.
GIT
---
-Part of the gitlink:git[7] suite
+Part of the linkgit:git[7] suite
diff --git a/contrib/gitview/gitview.txt b/contrib/gitview/gitview.txt
index 9e12f97842..7b5f9002b9 100644
--- a/contrib/gitview/gitview.txt
+++ b/contrib/gitview/gitview.txt
@@ -28,7 +28,7 @@ OPTIONS
<args>::
- All the valid option for gitlink:git-rev-list[1].
+ All the valid option for linkgit:git-rev-list[1].
Key Bindings
------------
diff --git a/git-compat-util.h b/git-compat-util.h
index 26e92f19cf..f587749b7c 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -731,17 +731,6 @@ void git_qsort(void *base, size_t nmemb, size_t size,
#endif
#endif
-#if defined(__GNUC__) && defined(__x86_64__)
-#include <emmintrin.h>
-/*
- * This is the system memory page size; it's used so that we can read
- * outside the bounds of an allocation without segfaulting.
- */
-#ifndef PAGE_SIZE
-#define PAGE_SIZE 4096
-#endif
-#endif
-
#ifdef UNRELIABLE_FSTAT
#define fstat_is_reliable() 0
#else
diff --git a/gitk-git/gitk b/gitk-git/gitk
index c8df35dee5..3520bdaebc 100755
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -2594,6 +2594,9 @@ proc makewindow {} {
bind $ctext $ctxbut {pop_diff_menu %W %X %Y %x %y}
bind $ctext <Button-1> {focus %W}
bind $ctext <<Selection>> rehighlight_search_results
+ for {set i 1} {$i < 10} {incr i} {
+ bind . <$M1B-Key-$i> [list go_to_parent $i]
+ }
set maincursor [. cget -cursor]
set textcursor [$ctext cget -cursor]
@@ -3017,6 +3020,7 @@ proc keys {} {
[mc "<Down>, n, j Move down one commit"]
[mc "<Left>, z, h Go back in history list"]
[mc "<Right>, x, l Go forward in history list"]
+[mc "<%s-n> Go to n-th parent of current commit in history list" $M1T]
[mc "<PageUp> Move up one page in commit list"]
[mc "<PageDown> Move down one page in commit list"]
[mc "<%s-Home> Scroll to top of commit list" $M1T]
@@ -7497,6 +7501,14 @@ proc goforw {} {
}
}
+proc go_to_parent {i} {
+ global parents curview targetid
+ set ps $parents($curview,$targetid)
+ if {[llength $ps] >= $i} {
+ selbyid [lindex $ps [expr $i - 1]]
+ }
+}
+
proc gettree {id} {
global treefilelist treeidlist diffids diffmergeid treepending
global nullid nullid2
diff --git a/gitk-git/po/bg.po b/gitk-git/po/bg.po
index 782397e6b5..f86a161129 100644
--- a/gitk-git/po/bg.po
+++ b/gitk-git/po/bg.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gitk master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-26 15:47-0800\n"
-"PO-Revision-Date: 2014-01-08 08:03+0200\n"
+"POT-Creation-Date: 2014-08-03 11:17+0300\n"
+"PO-Revision-Date: 2014-07-28 07:32+0300\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -22,11 +22,11 @@ msgstr ""
msgid "Couldn't get list of unmerged files:"
msgstr "Списъкът с неслети файлове не може да бъде получен:"
-#: gitk:212 gitk:2353
+#: gitk:212 gitk:2379
msgid "Color words"
msgstr "Оцветяване на думите"
-#: gitk:217 gitk:2353 gitk:8103 gitk:8136
+#: gitk:217 gitk:2379 gitk:8155 gitk:8188
msgid "Markup words"
msgstr "Отбелязване на думите"
@@ -40,13 +40,16 @@ msgstr "Грешка при изпълнение на командата с „-
#: gitk:391
msgid "No files selected: --merge specified but no files are unmerged."
-msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове."
+msgstr ""
+"Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове."
#: gitk:394
msgid ""
"No files selected: --merge specified but no unmerged files are within file "
"limit."
-msgstr "Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове в ограниченията."
+msgstr ""
+"Не са избрани файлове — указана е опцията „--merge“, но няма неслети файлове "
+"в ограниченията."
#: gitk:416 gitk:564
msgid "Error executing git log:"
@@ -56,11 +59,11 @@ msgstr "Грешка при изпълнение на „git log“:"
msgid "Reading"
msgstr "Прочитане"
-#: gitk:494 gitk:4429
+#: gitk:494 gitk:4470
msgid "Reading commits..."
msgstr "Прочитане на подаванията…"
-#: gitk:497 gitk:1635 gitk:4432
+#: gitk:497 gitk:1635 gitk:4473
msgid "No commits selected"
msgstr "Не са избрани подавания"
@@ -76,12 +79,12 @@ msgstr "Липсва информация за подавания"
msgid "mc"
msgstr "mc"
-#: gitk:1930 gitk:4222 gitk:9552 gitk:11122 gitk:11401
+#: gitk:1930 gitk:4263 gitk:9604 gitk:11174 gitk:11453
msgid "OK"
msgstr "Добре"
-#: gitk:1932 gitk:4224 gitk:9079 gitk:9158 gitk:9274 gitk:9323 gitk:9554
-#: gitk:11123 gitk:11402
+#: gitk:1932 gitk:4265 gitk:9131 gitk:9210 gitk:9326 gitk:9375 gitk:9606
+#: gitk:11175 gitk:11454
msgid "Cancel"
msgstr "Отказ"
@@ -103,7 +106,7 @@ msgstr "Изброяване на указателите"
#: gitk:2072
msgid "Start git gui"
-msgstr "Стартиране на git gui"
+msgstr "Стартиране на „git gui“"
#: gitk:2074
msgid "Quit"
@@ -137,11 +140,11 @@ msgstr "Изтриване на изгледа"
msgid "All files"
msgstr "Всички файлове"
-#: gitk:2081 gitk:3975
+#: gitk:2081 gitk:4016
msgid "View"
msgstr "Изглед"
-#: gitk:2091 gitk:2101 gitk:2945
+#: gitk:2091 gitk:2101 gitk:2976
msgid "About gitk"
msgstr "Относно gitk"
@@ -153,7 +156,7 @@ msgstr "Клавишни комбинации"
msgid "Help"
msgstr "Помощ"
-#: gitk:2183 gitk:8535
+#: gitk:2183 gitk:8587
msgid "SHA1 ID:"
msgstr "SHA1:"
@@ -165,708 +168,706 @@ msgstr "Ред"
msgid "Find"
msgstr "Търсене"
-#: gitk:2266
-msgid "next"
-msgstr "следващо"
-
-#: gitk:2267
-msgid "prev"
-msgstr "предишно"
-
-#: gitk:2268
+#: gitk:2293
msgid "commit"
msgstr "подаване"
-#: gitk:2271 gitk:2273 gitk:4590 gitk:4613 gitk:4637 gitk:6653 gitk:6725
-#: gitk:6810
+#: gitk:2297 gitk:2299 gitk:4631 gitk:4654 gitk:4678 gitk:6698 gitk:6770
+#: gitk:6855
msgid "containing:"
msgstr "съдържащо:"
-#: gitk:2274 gitk:3457 gitk:3462 gitk:4666
+#: gitk:2300 gitk:3488 gitk:3493 gitk:4707
msgid "touching paths:"
msgstr "засягащо пътищата:"
-#: gitk:2275 gitk:4680
+#: gitk:2301 gitk:4721
msgid "adding/removing string:"
msgstr "добавящо/премахващо низ"
-#: gitk:2276 gitk:4682
+#: gitk:2302 gitk:4723
msgid "changing lines matching:"
msgstr "променящо редове напасващи:"
-#: gitk:2285 gitk:2287 gitk:4669
+#: gitk:2311 gitk:2313 gitk:4710
msgid "Exact"
msgstr "Точно"
-#: gitk:2287 gitk:4757 gitk:6621
+#: gitk:2313 gitk:4798 gitk:6666
msgid "IgnCase"
msgstr "Без регистър"
-#: gitk:2287 gitk:4639 gitk:4755 gitk:6617
+#: gitk:2313 gitk:4680 gitk:4796 gitk:6662
msgid "Regexp"
-msgstr "Рег. изр."
+msgstr "Рег. израз"
-#: gitk:2289 gitk:2290 gitk:4777 gitk:4807 gitk:4814 gitk:6746 gitk:6814
+#: gitk:2315 gitk:2316 gitk:4818 gitk:4848 gitk:4855 gitk:6791 gitk:6859
msgid "All fields"
msgstr "Всички полета"
-#: gitk:2290 gitk:4774 gitk:4807 gitk:6684
+#: gitk:2316 gitk:4815 gitk:4848 gitk:6729
msgid "Headline"
msgstr "Първи ред"
-#: gitk:2291 gitk:4774 gitk:6684 gitk:6814 gitk:7283
+#: gitk:2317 gitk:4815 gitk:6729 gitk:6859 gitk:7332
msgid "Comments"
msgstr "Коментари"
-#: gitk:2291 gitk:4774 gitk:4779 gitk:4814 gitk:6684 gitk:7218 gitk:8713
-#: gitk:8728
+#: gitk:2317 gitk:4815 gitk:4820 gitk:4855 gitk:6729 gitk:7267 gitk:8765
+#: gitk:8780
msgid "Author"
msgstr "Автор"
-#: gitk:2291 gitk:4774 gitk:6684 gitk:7220
+#: gitk:2317 gitk:4815 gitk:6729 gitk:7269
msgid "Committer"
msgstr "Подаващ"
-#: gitk:2322
+#: gitk:2348
msgid "Search"
msgstr "Търсене"
-#: gitk:2330
+#: gitk:2356
msgid "Diff"
msgstr "Разлики"
-#: gitk:2332
+#: gitk:2358
msgid "Old version"
msgstr "Стара версия"
-#: gitk:2334
+#: gitk:2360
msgid "New version"
msgstr "Нова версия"
-#: gitk:2336
+#: gitk:2362
msgid "Lines of context"
msgstr "Контекст в редове"
-#: gitk:2346
+#: gitk:2372
msgid "Ignore space change"
msgstr "Празните знаци без значение"
-#: gitk:2350 gitk:2352 gitk:7842 gitk:8089
+#: gitk:2376 gitk:2378 gitk:7894 gitk:8141
msgid "Line diff"
msgstr "Поредови разлики"
-#: gitk:2417
+#: gitk:2443
msgid "Patch"
msgstr "Кръпка"
-#: gitk:2419
+#: gitk:2445
msgid "Tree"
msgstr "Дърво"
-#: gitk:2577 gitk:2597
+#: gitk:2604 gitk:2624
msgid "Diff this -> selected"
msgstr "Разлики между това и избраното"
-#: gitk:2578 gitk:2598
+#: gitk:2605 gitk:2625
msgid "Diff selected -> this"
msgstr "Разлики между избраното и това"
-#: gitk:2579 gitk:2599
+#: gitk:2606 gitk:2626
msgid "Make patch"
msgstr "Създаване на кръпка"
-#: gitk:2580 gitk:9137
+#: gitk:2607 gitk:9189
msgid "Create tag"
msgstr "Създаване на етикет"
-#: gitk:2581 gitk:9254
+#: gitk:2608 gitk:9306
msgid "Write commit to file"
msgstr "Запазване на подаването във файл"
-#: gitk:2582 gitk:9311
+#: gitk:2609 gitk:9363
msgid "Create new branch"
msgstr "Създаване на нов клон"
-#: gitk:2583
+#: gitk:2610
msgid "Cherry-pick this commit"
msgstr "Отбиране на това подаване"
-#: gitk:2584
+#: gitk:2611
msgid "Reset HEAD branch to here"
msgstr "Привеждане на върха на клона към текущото подаване"
-#: gitk:2585
+#: gitk:2612
msgid "Mark this commit"
msgstr "Отбелязване на това подаване"
-#: gitk:2586
+#: gitk:2613
msgid "Return to mark"
msgstr "Връщане към отбелязаното подаване"
-#: gitk:2587
+#: gitk:2614
msgid "Find descendant of this and mark"
msgstr "Откриване и отбелязване на наследниците"
-#: gitk:2588
+#: gitk:2615
msgid "Compare with marked commit"
msgstr "Сравнение с отбелязаното подаване"
-#: gitk:2589 gitk:2600
+#: gitk:2616 gitk:2627
msgid "Diff this -> marked commit"
msgstr "Разлики между това и отбелязаното"
-#: gitk:2590 gitk:2601
+#: gitk:2617 gitk:2628
msgid "Diff marked commit -> this"
msgstr "Разлики между отбелязаното и това"
-#: gitk:2591
+#: gitk:2618
msgid "Revert this commit"
msgstr "Отмяна на това подаване"
-#: gitk:2607
+#: gitk:2634
msgid "Check out this branch"
msgstr "Изтегляне на този клон"
-#: gitk:2608
+#: gitk:2635
msgid "Remove this branch"
msgstr "Изтриване на този клон"
-#: gitk:2615
+#: gitk:2642
msgid "Highlight this too"
msgstr "Отбелязване и на това"
-#: gitk:2616
+#: gitk:2643
msgid "Highlight this only"
msgstr "Отбелязване само на това"
-#: gitk:2617
+#: gitk:2644
msgid "External diff"
msgstr "Външна програма за разлики"
-#: gitk:2618
+#: gitk:2645
msgid "Blame parent commit"
msgstr "Анотиране на родителското подаване"
-#: gitk:2625
+#: gitk:2652
msgid "Show origin of this line"
msgstr "Показване на произхода на този ред"
-#: gitk:2626
+#: gitk:2653
msgid "Run git gui blame on this line"
msgstr "Изпълнение на „git gui blame“ върху този ред"
-#: gitk:2947
+#: gitk:2978
msgid ""
"\n"
"Gitk - a commit viewer for git\n"
"\n"
-"Copyright © 2005-2011 Paul Mackerras\n"
+"Copyright © 2005-2014 Paul Mackerras\n"
"\n"
"Use and redistribute under the terms of the GNU General Public License"
msgstr ""
"\n"
"Gitk — визуализация на подаванията в Git\n"
"\n"
-"Авторски права: © 2005-2011 Paul Mackerras\n"
+"Авторски права: © 2005-2014 Paul Mackerras\n"
"\n"
"Използвайте и разпространявайте при условията на ОПЛ на ГНУ"
-#: gitk:2955 gitk:3020 gitk:9738
+#: gitk:2986 gitk:3051 gitk:9790
msgid "Close"
msgstr "Затваряне"
-#: gitk:2976
+#: gitk:3007
msgid "Gitk key bindings"
msgstr "Клавишни комбинации"
-#: gitk:2979
+#: gitk:3010
msgid "Gitk key bindings:"
msgstr "Клавишни комбинации:"
-#: gitk:2981
+#: gitk:3012
#, tcl-format
msgid "<%s-Q>\t\tQuit"
msgstr "<%s-Q>\t\tСпиране на програмата"
-#: gitk:2982
+#: gitk:3013
#, tcl-format
msgid "<%s-W>\t\tClose window"
msgstr "<%s-W>\t\tЗатваряне на прозореца"
-#: gitk:2983
+#: gitk:3014
msgid "<Home>\t\tMove to first commit"
msgstr "<Home>\t\tКъм първото подаване"
-#: gitk:2984
+#: gitk:3015
msgid "<End>\t\tMove to last commit"
msgstr "<End>\t\tКъм последното подаване"
-#: gitk:2985
+#: gitk:3016
msgid "<Up>, p, k\tMove up one commit"
msgstr "<Up>, p, k\tЕдно подаване нагоре"
-#: gitk:2986
+#: gitk:3017
msgid "<Down>, n, j\tMove down one commit"
msgstr "<Down>, n, j\tЕдно подаване надолу"
-#: gitk:2987
+#: gitk:3018
msgid "<Left>, z, h\tGo back in history list"
msgstr "<Left>, z, h\tНазад в историята"
-#: gitk:2988
+#: gitk:3019
msgid "<Right>, x, l\tGo forward in history list"
msgstr "<Right>, x, l\tНапред в историята"
-#: gitk:2989
+#: gitk:3020
msgid "<PageUp>\tMove up one page in commit list"
-msgstr "<PageUp>\tЕдна страница нагоре в списъка с подаванията"
+msgstr "<PageUp>\tСтраница нагоре в списъка с подаванията"
-#: gitk:2990
+#: gitk:3021
msgid "<PageDown>\tMove down one page in commit list"
-msgstr "<PageDown>\tЕдна страница надолу в списъка с подаванията"
+msgstr "<PageDown>\tСтраница надолу в списъка с подаванията"
-#: gitk:2991
+#: gitk:3022
#, tcl-format
msgid "<%s-Home>\tScroll to top of commit list"
msgstr "<%s-Home>\tКъм началото на списъка с подаванията"
-#: gitk:2992
+#: gitk:3023
#, tcl-format
msgid "<%s-End>\tScroll to bottom of commit list"
msgstr "<%s-End>\tКъм края на списъка с подаванията"
-#: gitk:2993
+#: gitk:3024
#, tcl-format
msgid "<%s-Up>\tScroll commit list up one line"
-msgstr "<%s-Up>\tПридвижване на списъка с подавания с един ред нагоре"
+msgstr "<%s-Up>\tРед нагоре в списъка с подавания"
-#: gitk:2994
+#: gitk:3025
#, tcl-format
msgid "<%s-Down>\tScroll commit list down one line"
-msgstr "<%s-Down>\tПридвижване на списъка с подавания с един ред надолу"
+msgstr "<%s-Down>\tРед надолу в списъка с подавания"
-#: gitk:2995
+#: gitk:3026
#, tcl-format
msgid "<%s-PageUp>\tScroll commit list up one page"
-msgstr "<%s-PageUp>\tПридвижване на списъка с подавания с една страница нагоре"
+msgstr "<%s-PageUp>\tСтраница нагоре в списъка с подавания"
-#: gitk:2996
+#: gitk:3027
#, tcl-format
msgid "<%s-PageDown>\tScroll commit list down one page"
-msgstr "<%s-PageDown>\tПридвижване на списъка с подавания с една страница надолу"
+msgstr "<%s-PageDown>\tСтраница надолу в списъка с подавания"
-#: gitk:2997
+#: gitk:3028
msgid "<Shift-Up>\tFind backwards (upwards, later commits)"
msgstr "<Shift-Up>\tТърсене назад (визуално нагоре, исторически — последващи)"
-#: gitk:2998
+#: gitk:3029
msgid "<Shift-Down>\tFind forwards (downwards, earlier commits)"
-msgstr "<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)"
+msgstr ""
+"<Shift-Down>\tТърсене напред (визуално надолу, исторически — предхождащи)"
-#: gitk:2999
+#: gitk:3030
msgid "<Delete>, b\tScroll diff view up one page"
-msgstr "<Delete>, b\tПридвижване на изгледа за разлики една страница нагоре"
+msgstr "<Delete>, b\tСтраница нагоре в изгледа за разлики"
-#: gitk:3000
+#: gitk:3031
msgid "<Backspace>\tScroll diff view up one page"
-msgstr "<Backspace>\tПридвижване на изгледа за разлики една страница нагоре"
+msgstr "<Backspace>\tСтраница надолу в изгледа за разлики"
-#: gitk:3001
+#: gitk:3032
msgid "<Space>\t\tScroll diff view down one page"
-msgstr "<Space>\t\tПридвижване на изгледа за разлики една страница надолу"
+msgstr "<Space>\t\tСтраница надолу в изгледа за разлики"
-#: gitk:3002
+#: gitk:3033
msgid "u\t\tScroll diff view up 18 lines"
-msgstr "u\t\tПридвижване на изгледа за разлики 18 реда нагоре"
+msgstr "u\t\t18 реда нагоре в изгледа за разлики"
-#: gitk:3003
+#: gitk:3034
msgid "d\t\tScroll diff view down 18 lines"
-msgstr "d\t\tПридвижване на изгледа за разлики 18 реда надолу"
+msgstr "d\t\t18 реда надолу в изгледа за разлики"
-#: gitk:3004
+#: gitk:3035
#, tcl-format
msgid "<%s-F>\t\tFind"
msgstr "<%s-F>\t\tТърсене"
-#: gitk:3005
+#: gitk:3036
#, tcl-format
msgid "<%s-G>\t\tMove to next find hit"
msgstr "<%s-G>\t\tКъм следващата поява"
-#: gitk:3006
+#: gitk:3037
msgid "<Return>\tMove to next find hit"
msgstr "<Return>\tКъм следващата поява"
-#: gitk:3007
+#: gitk:3038
msgid "/\t\tFocus the search box"
msgstr "/\t\tФокус върху полето за търсене"
-#: gitk:3008
+#: gitk:3039
msgid "?\t\tMove to previous find hit"
msgstr "?\t\tКъм предишната поява"
-#: gitk:3009
+#: gitk:3040
msgid "f\t\tScroll diff view to next file"
-msgstr "f\t\tПридвижване на изгледа за разлики към следващия ред"
+msgstr "f\t\tСледващ файл в изгледа за разлики"
-#: gitk:3010
+#: gitk:3041
#, tcl-format
msgid "<%s-S>\t\tSearch for next hit in diff view"
msgstr "<%s-S>\t\tТърсене на следващата поява в изгледа за разлики"
-#: gitk:3011
+#: gitk:3042
#, tcl-format
msgid "<%s-R>\t\tSearch for previous hit in diff view"
msgstr "<%s-R>\t\tТърсене на предишната поява в изгледа за разлики"
-#: gitk:3012
+#: gitk:3043
#, tcl-format
msgid "<%s-KP+>\tIncrease font size"
msgstr "<%s-KP+>\tПо-голям размер на шрифта"
-#: gitk:3013
+#: gitk:3044
#, tcl-format
msgid "<%s-plus>\tIncrease font size"
msgstr "<%s-plus>\tПо-голям размер на шрифта"
-#: gitk:3014
+#: gitk:3045
#, tcl-format
msgid "<%s-KP->\tDecrease font size"
msgstr "<%s-KP->\tПо-малък размер на шрифта"
-#: gitk:3015
+#: gitk:3046
#, tcl-format
msgid "<%s-minus>\tDecrease font size"
msgstr "<%s-minus>\tПо-малък размер на шрифта"
-#: gitk:3016
+#: gitk:3047
msgid "<F5>\t\tUpdate"
msgstr "<F5>\t\tОбновяване"
-#: gitk:3471 gitk:3480
+#: gitk:3512 gitk:3521
#, tcl-format
msgid "Error creating temporary directory %s:"
msgstr "Грешка при създаването на временната директория „%s“:"
-#: gitk:3493
+#: gitk:3534
#, tcl-format
msgid "Error getting \"%s\" from %s:"
msgstr "Грешка при получаването на „%s“ от %s:"
-#: gitk:3556
+#: gitk:3597
msgid "command failed:"
msgstr "неуспешно изпълнение на команда:"
-#: gitk:3705
+#: gitk:3746
msgid "No such commit"
msgstr "Такова подаване няма"
-#: gitk:3719
+#: gitk:3760
msgid "git gui blame: command failed:"
-msgstr "git gui blame: неуспешно изпълнение на команда:"
+msgstr "„git gui blame“: неуспешно изпълнение на команда:"
-#: gitk:3750
+#: gitk:3791
#, tcl-format
msgid "Couldn't read merge head: %s"
msgstr "Върхът за сливане не може да бъде прочетен: %s"
-#: gitk:3758
+#: gitk:3799
#, tcl-format
msgid "Error reading index: %s"
msgstr "Грешка при прочитане на индекса: %s"
-#: gitk:3783
+#: gitk:3824
#, tcl-format
msgid "Couldn't start git blame: %s"
msgstr "Командата „git blame“ не може да бъде стартирана: %s"
-#: gitk:3786 gitk:6652
+#: gitk:3827 gitk:6697
msgid "Searching"
msgstr "Търсене"
-#: gitk:3818
+#: gitk:3859
#, tcl-format
msgid "Error running git blame: %s"
msgstr "Грешка при изпълнението на „git blame“: %s"
-#: gitk:3846
+#: gitk:3887
#, tcl-format
msgid "That line comes from commit %s, which is not in this view"
msgstr "Този ред идва от подаването %s, което не е в изгледа"
-#: gitk:3860
+#: gitk:3901
msgid "External diff viewer failed:"
msgstr "Неуспешно изпълнение на външната програма за разлики:"
-#: gitk:3978
+#: gitk:4019
msgid "Gitk view definition"
msgstr "Дефиниция на изглед в Gitk"
-#: gitk:3982
+#: gitk:4023
msgid "Remember this view"
msgstr "Запазване на този изглед"
-#: gitk:3983
+#: gitk:4024
msgid "References (space separated list):"
msgstr "Указатели (списък с разделител интервал):"
-#: gitk:3984
+#: gitk:4025
msgid "Branches & tags:"
msgstr "Клони и етикети:"
-#: gitk:3985
+#: gitk:4026
msgid "All refs"
msgstr "Всички указатели"
-#: gitk:3986
+#: gitk:4027
msgid "All (local) branches"
msgstr "Всички (локални) клони"
-#: gitk:3987
+#: gitk:4028
msgid "All tags"
msgstr "Всички етикети"
-#: gitk:3988
+#: gitk:4029
msgid "All remote-tracking branches"
msgstr "Всички следящи клони"
-#: gitk:3989
+#: gitk:4030
msgid "Commit Info (regular expressions):"
msgstr "Информация за подаване (рег. изр.):"
-#: gitk:3990
+#: gitk:4031
msgid "Author:"
msgstr "Автор:"
-#: gitk:3991
+#: gitk:4032
msgid "Committer:"
msgstr "Подал:"
-#: gitk:3992
+#: gitk:4033
msgid "Commit Message:"
msgstr "Съобщение при подаване:"
-#: gitk:3993
+#: gitk:4034
msgid "Matches all Commit Info criteria"
msgstr "Съвпадение по коя да е информация за подаването"
-#: gitk:3994
+#: gitk:4035
msgid "Changes to Files:"
msgstr "Промени по файловете:"
-#: gitk:3995
+#: gitk:4036
msgid "Fixed String"
msgstr "Дословен низ"
-#: gitk:3996
+#: gitk:4037
msgid "Regular Expression"
msgstr "Регулярен израз"
-#: gitk:3997
+#: gitk:4038
msgid "Search string:"
msgstr "Низ за търсене:"
-#: gitk:3998
+#: gitk:4039
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“):"
+msgstr ""
+"Дата на подаване („2 weeks ago“ (преди 2 седмици), „2009-03-17 15:27:38“, "
+"„March 17, 2009 15:27:38“):"
-#: gitk:3999
+#: gitk:4040
msgid "Since:"
msgstr "От:"
-#: gitk:4000
+#: gitk:4041
msgid "Until:"
msgstr "До:"
-#: gitk:4001
+#: gitk:4042
msgid "Limit and/or skip a number of revisions (positive integer):"
-msgstr "Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло число):"
+msgstr ""
+"Ограничаване и/или прескачане на определен брой версии (неотрицателно цяло "
+"число):"
-#: gitk:4002
+#: gitk:4043
msgid "Number to show:"
msgstr "Брой показани:"
-#: gitk:4003
+#: gitk:4044
msgid "Number to skip:"
msgstr "Брой прескочени:"
-#: gitk:4004
+#: gitk:4045
msgid "Miscellaneous options:"
msgstr "Разни:"
-#: gitk:4005
+#: gitk:4046
msgid "Strictly sort by date"
msgstr "Подреждане по дата"
-#: gitk:4006
+#: gitk:4047
msgid "Mark branch sides"
msgstr "Отбелязване на страните по клона"
-#: gitk:4007
+#: gitk:4048
msgid "Limit to first parent"
-msgstr "Само първият родител"
+msgstr "Само първия родител"
-#: gitk:4008
+#: gitk:4049
msgid "Simple history"
msgstr "Опростена история"
-#: gitk:4009
+#: gitk:4050
msgid "Additional arguments to git log:"
msgstr "Допълнителни аргументи към „git log“:"
-#: gitk:4010
+#: gitk:4051
msgid "Enter files and directories to include, one per line:"
msgstr "Въведете файловете и директориите за включване, по елемент на ред"
-#: gitk:4011
+#: gitk:4052
msgid "Command to generate more commits to include:"
-msgstr "Команда за генерирането на допълнителни подавания, които да бъдат включени:"
+msgstr ""
+"Команда за генерирането на допълнителни подавания, които да бъдат включени:"
-#: gitk:4135
+#: gitk:4176
msgid "Gitk: edit view"
msgstr "Gitk: редактиране на изглед"
-#: gitk:4143
+#: gitk:4184
msgid "-- criteria for selecting revisions"
msgstr "— критерии за избор на версии"
-#: gitk:4148
+#: gitk:4189
msgid "View Name"
msgstr "Име на изглед"
-#: gitk:4223
+#: gitk:4264
msgid "Apply (F5)"
msgstr "Прилагане (F5)"
-#: gitk:4261
+#: gitk:4302
msgid "Error in commit selection arguments:"
msgstr "Грешка в аргументите за избор на подавания:"
-#: gitk:4314 gitk:4366 gitk:4827 gitk:4841 gitk:6107 gitk:12184 gitk:12185
+#: gitk:4355 gitk:4407 gitk:4868 gitk:4882 gitk:6152 gitk:12281 gitk:12282
msgid "None"
msgstr "Няма"
-#: gitk:4924 gitk:4929
+#: gitk:4965 gitk:4970
msgid "Descendant"
msgstr "Наследник"
-#: gitk:4925
+#: gitk:4966
msgid "Not descendant"
msgstr "Не е наследник"
-#: gitk:4932 gitk:4937
+#: gitk:4973 gitk:4978
msgid "Ancestor"
msgstr "Предшественик"
-#: gitk:4933
+#: gitk:4974
msgid "Not ancestor"
msgstr "Не е предшественик"
-#: gitk:5223
+#: gitk:5268
msgid "Local changes checked in to index but not committed"
msgstr "Локални промени добавени към индекса, но неподадени"
-#: gitk:5259
+#: gitk:5304
msgid "Local uncommitted changes, not checked in to index"
msgstr "Локални промени извън индекса"
-#: gitk:7032
+#: gitk:7077
msgid "and many more"
msgstr "и още много"
-#: gitk:7035
+#: gitk:7080
msgid "many"
msgstr "много"
-#: gitk:7222
+#: gitk:7271
msgid "Tags:"
msgstr "Етикети:"
-#: gitk:7239 gitk:7245 gitk:8708
+#: gitk:7288 gitk:7294 gitk:8760
msgid "Parent"
msgstr "Родител"
-#: gitk:7250
+#: gitk:7299
msgid "Child"
msgstr "Дете"
-#: gitk:7259
+#: gitk:7308
msgid "Branch"
msgstr "Клон"
-#: gitk:7262
+#: gitk:7311
msgid "Follows"
msgstr "Следва"
-#: gitk:7265
+#: gitk:7314
msgid "Precedes"
msgstr "Предшества"
-#: gitk:7849
+#: gitk:7901
#, tcl-format
msgid "Error getting diffs: %s"
msgstr "Грешка при получаването на разликите: %s"
-#: gitk:8533
+#: gitk:8585
msgid "Goto:"
msgstr "Към ред:"
-#: gitk:8554
+#: gitk:8606
#, tcl-format
msgid "Short SHA1 id %s is ambiguous"
-msgstr "Съкратената SHA1 %s не е еднозначна"
+msgstr "Съкратената сума по SHA1 %s не е еднозначна"
-#: gitk:8561
+#: gitk:8613
#, tcl-format
msgid "Revision %s is not known"
msgstr "Непозната версия %s"
-#: gitk:8571
+#: gitk:8623
#, tcl-format
msgid "SHA1 id %s is not known"
-msgstr "Непозната SHA1 %s"
+msgstr "Непозната сума по SHA1 %s"
-#: gitk:8573
+#: gitk:8625
#, tcl-format
msgid "Revision %s is not in the current view"
msgstr "Версия %s не е в текущия изглед"
-#: gitk:8715 gitk:8730
+#: gitk:8767 gitk:8782
msgid "Date"
msgstr "Дата"
-#: gitk:8718
+#: gitk:8770
msgid "Children"
msgstr "Деца"
-#: gitk:8781
+#: gitk:8833
#, tcl-format
msgid "Reset %s branch to here"
msgstr "Зануляване на клона „%s“ към текущото подаване"
-#: gitk:8783
+#: gitk:8835
msgid "Detached head: can't reset"
msgstr "Несвързан връх: невъзможно зануляване"
-#: gitk:8888 gitk:8894
+#: gitk:8940 gitk:8946
msgid "Skipping merge commit "
msgstr "Пропускане на подаването на сливането"
-#: gitk:8903 gitk:8908
+#: gitk:8955 gitk:8960
msgid "Error getting patch ID for "
msgstr "Грешка при получаването на идентификатора на "
-#: gitk:8904 gitk:8909
+#: gitk:8956 gitk:8961
msgid " - stopping\n"
msgstr " — спиране\n"
-#: gitk:8914 gitk:8917 gitk:8925 gitk:8939 gitk:8948
+#: gitk:8966 gitk:8969 gitk:8977 gitk:8991 gitk:9000
msgid "Commit "
msgstr "Подаване"
-#: gitk:8918
+#: gitk:8970
msgid ""
" is the same patch as\n"
" "
@@ -874,7 +875,7 @@ msgstr ""
" е същата кръпка като\n"
" "
-#: gitk:8926
+#: gitk:8978
msgid ""
" differs from\n"
" "
@@ -882,135 +883,138 @@ msgstr ""
" се различава от\n"
" "
-#: gitk:8928
+#: gitk:8980
msgid ""
"Diff of commits:\n"
"\n"
-msgstr "Разлика между подаванията:\n\n"
+msgstr ""
+"Разлика между подаванията:\n"
+"\n"
-#: gitk:8940 gitk:8949
+#: gitk:8992 gitk:9001
#, tcl-format
msgid " has %s children - stopping\n"
msgstr " има %s деца — спиране\n"
-#: gitk:8968
+#: gitk:9020
#, tcl-format
msgid "Error writing commit to file: %s"
msgstr "Грешка при запазването на подаването във файл: %s"
-#: gitk:8974
+#: gitk:9026
#, tcl-format
msgid "Error diffing commits: %s"
msgstr "Грешка при изчисляването на разликите между подаванията: %s"
-#: gitk:9020
+#: gitk:9072
msgid "Top"
msgstr "Най-горе"
-#: gitk:9021
+#: gitk:9073
msgid "From"
msgstr "От"
-#: gitk:9026
+#: gitk:9078
msgid "To"
msgstr "До"
-#: gitk:9050
+#: gitk:9102
msgid "Generate patch"
msgstr "Генериране на кръпка"
-#: gitk:9052
+#: gitk:9104
msgid "From:"
msgstr "От:"
-#: gitk:9061
+#: gitk:9113
msgid "To:"
msgstr "До:"
-#: gitk:9070
+#: gitk:9122
msgid "Reverse"
msgstr "Обръщане"
-#: gitk:9072 gitk:9268
+#: gitk:9124 gitk:9320
msgid "Output file:"
msgstr "Запазване във файла:"
-#: gitk:9078
+#: gitk:9130
msgid "Generate"
msgstr "Генериране"
-#: gitk:9116
+#: gitk:9168
msgid "Error creating patch:"
msgstr "Грешка при създаването на кръпка:"
-#: gitk:9139 gitk:9256 gitk:9313
+#: gitk:9191 gitk:9308 gitk:9365
msgid "ID:"
msgstr "Идентификатор:"
-#: gitk:9148
+#: gitk:9200
msgid "Tag name:"
msgstr "Име на етикет:"
-#: gitk:9151
+#: gitk:9203
msgid "Tag message is optional"
msgstr "Съобщението за етикет е незадължително"
-#: gitk:9153
+#: gitk:9205
msgid "Tag message:"
msgstr "Съобщение за етикет:"
-#: gitk:9157 gitk:9322
+#: gitk:9209 gitk:9374
msgid "Create"
msgstr "Създаване"
-#: gitk:9175
+#: gitk:9227
msgid "No tag name specified"
msgstr "Липсва име на етикет"
-#: gitk:9179
+#: gitk:9231
#, tcl-format
msgid "Tag \"%s\" already exists"
msgstr "Етикетът „%s“ вече съществува"
-#: gitk:9189
+#: gitk:9241
msgid "Error creating tag:"
msgstr "Грешка при създаването на етикет:"
-#: gitk:9265
+#: gitk:9317
msgid "Command:"
msgstr "Команда:"
-#: gitk:9273
+#: gitk:9325
msgid "Write"
-msgstr "Pdmdpldke"
+msgstr "Запазване"
-#: gitk:9291
+#: gitk:9343
msgid "Error writing commit:"
msgstr "Грешка при запазването на подаването:"
-#: gitk:9318
+#: gitk:9370
msgid "Name:"
msgstr "Име:"
-#: gitk:9341
+#: gitk:9393
msgid "Please specify a name for the new branch"
msgstr "Укажете име за новия клон"
-#: gitk:9346
+#: gitk:9398
#, tcl-format
msgid "Branch '%s' already exists. Overwrite?"
msgstr "Клонът „%s“ вече съществува. Да бъде ли презаписан?"
-#: gitk:9413
+#: gitk:9465
#, tcl-format
msgid "Commit %s is already included in branch %s -- really re-apply it?"
-msgstr "Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?"
+msgstr ""
+"Подаването „%s“ вече е включено в клона „%s“ — да бъде ли приложено отново?"
-#: gitk:9418
+#: gitk:9470
msgid "Cherry-picking"
msgstr "Отбиране"
-#: gitk:9427
+#: gitk:9479
#, tcl-format
msgid ""
"Cherry-pick failed because of local changes to file '%s'.\n"
@@ -1019,7 +1023,7 @@ msgstr ""
"Неуспешно отбиране, защото във файла „%s“ има локални промени.\n"
"Подайте, занулете или ги скатайте и пробвайте отново."
-#: gitk:9433
+#: gitk:9485
msgid ""
"Cherry-pick failed because of merge conflict.\n"
"Do you wish to run git citool to resolve it?"
@@ -1027,20 +1031,20 @@ msgstr ""
"Неуспешно отбиране поради конфликти при сливане.\n"
"Искате ли да ги коригирате чрез „git citool“?"
-#: gitk:9449 gitk:9507
+#: gitk:9501 gitk:9559
msgid "No changes committed"
msgstr "Не са подадени промени"
-#: gitk:9476
+#: gitk:9528
#, tcl-format
msgid "Commit %s is not included in branch %s -- really revert it?"
msgstr "Подаването „%s“ не е включено в клона „%s“. Да бъде ли отменено?"
-#: gitk:9481
+#: gitk:9533
msgid "Reverting"
msgstr "Отмяна"
-#: gitk:9489
+#: gitk:9541
#, tcl-format
msgid ""
"Revert failed because of local changes to the following files:%s Please "
@@ -1049,7 +1053,7 @@ msgstr ""
"Неуспешна отмяна, защото във файла „%s“ има локални промени.\n"
"Подайте, занулете или ги скатайте и пробвайте отново.<"
-#: gitk:9493
+#: gitk:9545
msgid ""
"Revert failed because of merge conflict.\n"
" Do you wish to run git citool to resolve it?"
@@ -1057,28 +1061,28 @@ msgstr ""
"Неуспешно отмяна поради конфликти при сливане.\n"
"Искате ли да ги коригирате чрез „git citool“?"
-#: gitk:9536
+#: gitk:9588
msgid "Confirm reset"
msgstr "Потвърждаване на зануляването"
-#: gitk:9538
+#: gitk:9590
#, tcl-format
msgid "Reset branch %s to %s?"
-msgstr "Да се занули ли клона „%s“ към „%s“?"
+msgstr "Да се занули ли клонът „%s“ към „%s“?"
-#: gitk:9540
+#: gitk:9592
msgid "Reset type:"
msgstr "Вид зануляване:"
-#: gitk:9543
+#: gitk:9595
msgid "Soft: Leave working tree and index untouched"
msgstr "Слабо: работното дърво и индекса остават същите"
-#: gitk:9546
+#: gitk:9598
msgid "Mixed: Leave working tree untouched, reset index"
msgstr "Смесено: работното дърво остава същото, индексът се занулява"
-#: gitk:9549
+#: gitk:9601
msgid ""
"Hard: Reset working tree and index\n"
"(discard ALL local changes)"
@@ -1086,249 +1090,251 @@ msgstr ""
"Силно: зануляване и на работното дърво, и на индекса\n"
"(*ВСИЧКИ* локални промени ще бъдат безвъзвратно загубени)"
-#: gitk:9566
+#: gitk:9618
msgid "Resetting"
msgstr "Зануляване"
-#: gitk:9626
+#: gitk:9678
msgid "Checking out"
msgstr "Изтегляне"
-#: gitk:9679
+#: gitk:9731
msgid "Cannot delete the currently checked-out branch"
msgstr "Текущо изтегленият клон не може да бъде изтрит"
-#: gitk:9685
+#: gitk:9737
#, tcl-format
msgid ""
"The commits on branch %s aren't on any other branch.\n"
"Really delete branch %s?"
msgstr ""
"Подаванията на клона „%s“ не са на никой друг клон.\n"
-"Наистина ли да се изтрие клона „%s“?"
+"Наистина ли да се изтрие клонът „%s“?"
-#: gitk:9716
+#: gitk:9768
#, tcl-format
msgid "Tags and heads: %s"
msgstr "Етикети и върхове: %s"
-#: gitk:9731
+#: gitk:9783
msgid "Filter"
msgstr "Филтриране"
-#: gitk:10027
+#: gitk:10079
msgid ""
"Error reading commit topology information; branch and preceding/following "
"tag information will be incomplete."
-msgstr "Грешка при прочитането на топологията на подаванията. Информацията за клона и предшестващите/следващите етикети ще е непълна."
+msgstr ""
+"Грешка при прочитането на топологията на подаванията. Информацията за клона "
+"и предшестващите/следващите етикети ще е непълна."
-#: gitk:11004
+#: gitk:11056
msgid "Tag"
msgstr "Етикет"
-#: gitk:11008
+#: gitk:11060
msgid "Id"
msgstr "Идентификатор"
-#: gitk:11091
+#: gitk:11143
msgid "Gitk font chooser"
msgstr "Избор на шрифт за Gitk"
-#: gitk:11108
+#: gitk:11160
msgid "B"
msgstr "Ч"
-#: gitk:11111
+#: gitk:11163
msgid "I"
msgstr "К"
-#: gitk:11229
+#: gitk:11281
msgid "Commit list display options"
msgstr "Настройки на списъка с подавания"
-#: gitk:11232
+#: gitk:11284
msgid "Maximum graph width (lines)"
msgstr "Максимална широчина на графа (в редове)"
-#: gitk:11235
+#: gitk:11287
#, tcl-format
msgid "Maximum graph width (% of pane)"
msgstr "Максимална широчина на графа (% от панела)"
-#: gitk:11238
+#: gitk:11290
msgid "Show local changes"
msgstr "Показване на локалните промени"
-#: gitk:11241
+#: gitk:11293
msgid "Auto-select SHA1 (length)"
msgstr "Автоматично избиране на SHA1 (дължина)"
-#: gitk:11245
+#: gitk:11297
msgid "Hide remote refs"
msgstr "Скриване на отдалечените указатели"
-#: gitk:11249
+#: gitk:11301
msgid "Diff display options"
msgstr "Настройки на показването на разликите"
-#: gitk:11251
+#: gitk:11303
msgid "Tab spacing"
msgstr "Широчина на табулатора"
-#: gitk:11254
+#: gitk:11306
msgid "Display nearby tags/heads"
msgstr "Извеждане на близките етикети и върхове"
-#: gitk:11257
+#: gitk:11309
msgid "Maximum # tags/heads to show"
msgstr "Максимален брой етикети/върхове за показване"
-#: gitk:11260
+#: gitk:11312
msgid "Limit diffs to listed paths"
msgstr "Разлика само в избраните пътища"
-#: gitk:11263
+#: gitk:11315
msgid "Support per-file encodings"
msgstr "Поддръжка на различни кодирания за всеки файл"
-#: gitk:11269 gitk:11416
+#: gitk:11321 gitk:11468
msgid "External diff tool"
msgstr "Външен инструмент за разлики"
-#: gitk:11270
+#: gitk:11322
msgid "Choose..."
msgstr "Избор…"
-#: gitk:11275
+#: gitk:11327
msgid "General options"
msgstr "Общи настройки"
-#: gitk:11278
+#: gitk:11330
msgid "Use themed widgets"
msgstr "Използване на тема за графичните обекти"
-#: gitk:11280
+#: gitk:11332
msgid "(change requires restart)"
msgstr "(промяната изисква рестартиране на Gitk)"
-#: gitk:11282
+#: gitk:11334
msgid "(currently unavailable)"
msgstr "(в момента недостъпно)"
-#: gitk:11293
+#: gitk:11345
msgid "Colors: press to choose"
msgstr "Цветове: избира се с натискане"
-#: gitk:11296
+#: gitk:11348
msgid "Interface"
msgstr "Интерфейс"
-#: gitk:11297
+#: gitk:11349
msgid "interface"
msgstr "интерфейс"
-#: gitk:11300
+#: gitk:11352
msgid "Background"
msgstr "Фон"
-#: gitk:11301 gitk:11331
+#: gitk:11353 gitk:11383
msgid "background"
-msgstr "Фон"
+msgstr "фон"
-#: gitk:11304
+#: gitk:11356
msgid "Foreground"
msgstr "Знаци"
-#: gitk:11305
+#: gitk:11357
msgid "foreground"
msgstr "знаци"
-#: gitk:11308
+#: gitk:11360
msgid "Diff: old lines"
msgstr "Разлика: стари редове"
-#: gitk:11309
+#: gitk:11361
msgid "diff old lines"
msgstr "разлика, стари редове"
-#: gitk:11313
+#: gitk:11365
msgid "Diff: new lines"
msgstr "Разлика: нови редове"
-#: gitk:11314
+#: gitk:11366
msgid "diff new lines"
msgstr "разлика, нови редове"
-#: gitk:11318
+#: gitk:11370
msgid "Diff: hunk header"
msgstr "Разлика: начало на парче"
-#: gitk:11320
+#: gitk:11372
msgid "diff hunk header"
msgstr "разлика, начало на парче"
-#: gitk:11324
+#: gitk:11376
msgid "Marked line bg"
msgstr "Фон на отбелязан ред"
-#: gitk:11326
+#: gitk:11378
msgid "marked line background"
-msgstr "Фон на отбелязан ред"
+msgstr "фон на отбелязан ред"
-#: gitk:11330
+#: gitk:11382
msgid "Select bg"
msgstr "Избор на фон"
-#: gitk:11339
+#: gitk:11391
msgid "Fonts: press to choose"
msgstr "Шрифтове: избира се с натискане"
-#: gitk:11341
+#: gitk:11393
msgid "Main font"
msgstr "Основен шрифт"
-#: gitk:11342
+#: gitk:11394
msgid "Diff display font"
msgstr "Шрифт за разликите"
-#: gitk:11343
+#: gitk:11395
msgid "User interface font"
msgstr "Шрифт на интерфейса"
-#: gitk:11365
+#: gitk:11417
msgid "Gitk preferences"
msgstr "Настройки на Gitk"
-#: gitk:11374
+#: gitk:11426
msgid "General"
msgstr "Общи"
-#: gitk:11375
+#: gitk:11427
msgid "Colors"
msgstr "Цветове"
-#: gitk:11376
+#: gitk:11428
msgid "Fonts"
msgstr "Шрифтове"
-#: gitk:11426
+#: gitk:11478
#, tcl-format
msgid "Gitk: choose color for %s"
-msgstr "Gitk: избор на цвят на %s"
+msgstr "Gitk: избор на цвят на „%s“"
-#: gitk:12080
+#: gitk:12177
msgid "Cannot find a git repository here."
msgstr "Тук липсва хранилище на Git."
-#: gitk:12127
+#: gitk:12224
#, tcl-format
msgid "Ambiguous argument '%s': both revision and filename"
msgstr "Нееднозначен аргумент „%s“: има и такава версия, и такъв файл"
-#: gitk:12139
+#: gitk:12236
msgid "Bad arguments to gitk:"
msgstr "Неправилни аргументи на gitk:"
-#: gitk:12242
+#: gitk:12339
msgid "Command line"
msgstr "Команден ред"
diff --git a/refs.c b/refs.c
index 84b9070b8d..27927f2319 100644
--- a/refs.c
+++ b/refs.c
@@ -7,27 +7,21 @@
/*
* How to handle various characters in refnames:
- * This table is used by both the SIMD and non-SIMD code. It has
- * some cases that are only useful for the SIMD; these are handled
- * equivalently to the listed disposition in the non-SIMD code.
* 0: An acceptable character for refs
- * 1: @, look for a following { to reject @{ in refs (SIMD or = 0)
- * 2: \0: End-of-component and string
- * 3: /: End-of-component (SIMD or = 2)
- * 4: ., look for a preceding . to reject .. in refs
- * 5: {, look for a preceding @ to reject @{ in refs
- * 6: *, usually a bad character except, once as a wildcard (SIMD or = 7)
- * 7: A bad character except * (see check_refname_component below)
+ * 1: End-of-component
+ * 2: ., look for a preceding . to reject .. in refs
+ * 3: {, look for a preceding @ to reject @{ in refs
+ * 4: A bad character: ASCII control characters, "~", "^", ":" or SP
*/
static unsigned char refname_disposition[256] = {
- 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 4, 3,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 7, 0,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 7, 7
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
};
/*
@@ -39,9 +33,8 @@ static unsigned char refname_disposition[256] = {
* - any path component of it begins with ".", or
* - it has double dots "..", or
* - it has ASCII control character, "~", "^", ":" or SP, anywhere, or
- * - it has pattern-matching notation "*", "?", "[", anywhere, or
- * - it ends with a "/", or
- * - it ends with ".lock", or
+ * - it ends with a "/".
+ * - it ends with ".lock"
* - it contains a "\" (backslash)
*/
static int check_refname_component(const char *refname, int flags)
@@ -53,19 +46,17 @@ static int check_refname_component(const char *refname, int flags)
int ch = *cp & 255;
unsigned char disp = refname_disposition[ch];
switch (disp) {
- case 2: /* fall-through */
- case 3:
+ case 1:
goto out;
- case 4:
+ case 2:
if (last == '.')
return -1; /* Refname contains "..". */
break;
- case 5:
+ case 3:
if (last == '@')
return -1; /* Refname contains "@{". */
break;
- case 6: /* fall-through */
- case 7:
+ case 4:
return -1;
}
last = ch;
@@ -88,7 +79,7 @@ out:
return cp - refname;
}
-static int check_refname_format_bytewise(const char *refname, int flags)
+int check_refname_format(const char *refname, int flags)
{
int component_len, component_count = 0;
@@ -124,196 +115,6 @@ static int check_refname_format_bytewise(const char *refname, int flags)
return 0;
}
-#if defined(__GNUC__) && defined(__x86_64__)
-#define SSE_VECTOR_BYTES 16
-
-/* Vectorized version of check_refname_format. */
-int check_refname_format(const char *refname, int flags)
-{
- const char *cp = refname;
-
- const __m128i dot = _mm_set1_epi8('.');
- const __m128i at = _mm_set1_epi8('@');
- const __m128i curly = _mm_set1_epi8('{');
- const __m128i slash = _mm_set1_epi8('/');
- const __m128i zero = _mm_set1_epi8('\000');
- const __m128i el = _mm_set1_epi8('l');
-
- /* below '*', all characters are forbidden or rare */
- const __m128i star_ub = _mm_set1_epi8('*' + 1);
-
- const __m128i colon = _mm_set1_epi8(':');
- const __m128i question = _mm_set1_epi8('?');
-
- /* '['..'^' contains 4 characters: 3 forbidden and 1 rare */
- const __m128i bracket_lb = _mm_set1_epi8('[' - 1);
- const __m128i caret_ub = _mm_set1_epi8('^' + 1);
-
- /* '~' and above are forbidden */
- const __m128i tilde_lb = _mm_set1_epi8('~' - 1);
-
- int component_count = 0;
- int orig_flags = flags;
-
- if (refname[0] == 0 || refname[0] == '/') {
- /* entirely empty ref or initial ref component */
- return -1;
- }
-
- /*
- * Initial ref component of '.'; below we look for /. so we'll
- * miss this.
- */
- if (refname[0] == '.') {
- if (refname[1] == '/' || refname[1] == '\0')
- return -1;
- if (!(flags & REFNAME_DOT_COMPONENT))
- return -1;
- }
- while(1) {
- __m128i tmp, tmp1, result;
- uint64_t mask;
-
- if ((uintptr_t) cp % PAGE_SIZE > PAGE_SIZE - SSE_VECTOR_BYTES - 1)
- /*
- * End-of-page; fall back to slow method for
- * this entire ref.
- */
- return check_refname_format_bytewise(refname, orig_flags);
-
- tmp = _mm_loadu_si128((__m128i *)cp);
- tmp1 = _mm_loadu_si128((__m128i *)(cp + 1));
-
- /*
- * This range (note the lt) contains some
- * permissible-but-rare characters (including all
- * characters >= 128), which we handle later. It also
- * includes \000.
- */
- result = _mm_cmplt_epi8(tmp, star_ub);
-
- result = _mm_or_si128(result, _mm_cmpeq_epi8(tmp, question));
- result = _mm_or_si128(result, _mm_cmpeq_epi8(tmp, colon));
-
- /* This range contains the permissible ] as bycatch */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpgt_epi8(tmp, bracket_lb),
- _mm_cmplt_epi8(tmp, caret_ub)));
-
- result = _mm_or_si128(result, _mm_cmpgt_epi8(tmp, tilde_lb));
-
- /* .. */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpeq_epi8(tmp, dot),
- _mm_cmpeq_epi8(tmp1, dot)));
- /* @{ */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpeq_epi8(tmp, at),
- _mm_cmpeq_epi8(tmp1, curly)));
- /* // */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpeq_epi8(tmp, slash),
- _mm_cmpeq_epi8(tmp1, slash)));
- /* trailing / */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpeq_epi8(tmp, slash),
- _mm_cmpeq_epi8(tmp1, zero)));
- /* .l, beginning of .lock */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpeq_epi8(tmp, dot),
- _mm_cmpeq_epi8(tmp1, el)));
- /*
- * Even though /. is not necessarily an error, we flag
- * it anyway. If we find it, we'll check if it's valid
- * and if so we'll advance just past it.
- */
- result = _mm_or_si128(result, _mm_and_si128(
- _mm_cmpeq_epi8(tmp, slash),
- _mm_cmpeq_epi8(tmp1, dot)));
-
- mask = _mm_movemask_epi8(result);
- if (mask) {
- /*
- * We've found either end-of-string, or some
- * probably-bad character or substring.
- */
- int i = __builtin_ctz(mask);
- switch (refname_disposition[cp[i] & 255]) {
- case 0: /* fall-through */
- case 5:
- /*
- * bycatch: a good character that's in
- * one of the ranges of mostly-forbidden
- * characters
- */
- cp += i + 1;
- break;
- case 1:
- if (cp[i + 1] == '{')
- return -1;
- cp += i + 1;
- break;
- case 2:
- if (!(flags & REFNAME_ALLOW_ONELEVEL)
- && !component_count && !strchr(refname, '/'))
- /* Refname has only one component. */
- return -1;
- return 0;
- case 3:
- component_count ++;
- /*
- * Even if leading dots are allowed, don't
- * allow "." as a component (".." is
- * prevented by case 4 below).
- */
- if (cp[i + 1] == '.') {
- if (cp[i + 2] == '\0')
- return -1;
- if (flags & REFNAME_DOT_COMPONENT) {
- /* skip to just after the /. */
- cp += i + 2;
- break;
- }
- return -1;
- } else if (cp[i + 1] == '/' || cp[i + 1] == '\0')
- return -1;
- break;
- case 4:
- if (cp[i + 1] == '.' || cp[i + 1] == '\0')
- return -1;
- /* .lock as end-of-component or end-of-string */
- if ((!strncmp(cp + i, ".lock", 5))
- && (cp[i + 5] == '/' || cp[i + 5] == 0))
- return -1;
- cp += 1;
- break;
- case 6:
- if (((cp == refname + i) || cp[i - 1] == '/')
- && (cp[i + 1] == '/' || cp[i + 1] == 0))
- if (flags & REFNAME_REFSPEC_PATTERN) {
- flags &= ~REFNAME_REFSPEC_PATTERN;
- /* restart after the * */
- cp += i + 1;
- continue;
- }
- /* fall-through */
- case 7:
- return -1;
- }
- } else
- cp += SSE_VECTOR_BYTES;
- }
-}
-
-#else
-
-int check_refname_format (const char *refname, int flags)
-{
- return check_refname_format_bytewise(refname, flags);
-}
-
-#endif
-
struct ref_entry;
/*
diff --git a/run-command.c b/run-command.c
index 576dfeaa3f..35a3ebf07b 100644
--- a/run-command.c
+++ b/run-command.c
@@ -454,7 +454,6 @@ fail_pipe:
{
int fhin = 0, fhout = 1, fherr = 2;
const char **sargv = cmd->argv;
- char **env = environ;
if (cmd->no_stdin)
fhin = open("/dev/null", O_RDWR);
@@ -479,24 +478,19 @@ fail_pipe:
else if (cmd->out > 1)
fhout = dup(cmd->out);
- if (cmd->env)
- env = make_augmented_environ(cmd->env);
-
if (cmd->git_cmd)
cmd->argv = prepare_git_cmd(cmd->argv);
else if (cmd->use_shell)
cmd->argv = prepare_shell_cmd(cmd->argv);
- cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, env, cmd->dir,
- fhin, fhout, fherr);
+ cmd->pid = mingw_spawnvpe(cmd->argv[0], cmd->argv, (char**) cmd->env,
+ cmd->dir, fhin, fhout, fherr);
failed_errno = errno;
if (cmd->pid < 0 && (!cmd->silent_exec_failure || errno != ENOENT))
error("cannot spawn %s: %s", cmd->argv[0], strerror(errno));
if (cmd->clean_on_exit && cmd->pid >= 0)
mark_child_for_cleanup(cmd->pid);
- if (cmd->env)
- free_environ(env);
if (cmd->git_cmd)
free(cmd->argv);
diff --git a/sha1_name.c b/sha1_name.c
index 6ccd3a53f8..63ee66fedd 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -540,8 +540,10 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
char *tmp = xstrndup(str + at + 2, reflog_len);
at_time = approxidate_careful(tmp, &errors);
free(tmp);
- if (errors)
+ if (errors) {
+ free(real_ref);
return -1;
+ }
}
if (read_ref_at(real_ref, at_time, nth, sha1, NULL,
&co_time, &co_tz, &co_cnt)) {
diff --git a/t/annotate-tests.sh b/t/annotate-tests.sh
index 304c7b7d87..071e4d7d3e 100644
--- a/t/annotate-tests.sh
+++ b/t/annotate-tests.sh
@@ -1,6 +1,17 @@
# This file isn't used as a test script directly, instead it is
# sourced from t8001-annotate.sh and t8002-blame.sh.
+if test_have_prereq MINGW
+then
+ sanitize_L () {
+ echo "$1" | sed 'sX\(^-L\|,\)\^\?/X&\\;*Xg'
+ }
+else
+ sanitize_L () {
+ echo "$1"
+ }
+fi
+
check_count () {
head= &&
file='file' &&
@@ -10,6 +21,7 @@ check_count () {
case "$1" in
-h) head="$2"; shift; shift ;;
-f) file="$2"; shift; shift ;;
+ -L*) options="$options $(sanitize_L "$1")"; shift ;;
-*) options="$options $1"; shift ;;
*) break ;;
esac
diff --git a/t/t0081-line-buffer.sh b/t/t0081-line-buffer.sh
index bd83ed371a..25dba008f3 100755
--- a/t/t0081-line-buffer.sh
+++ b/t/t0081-line-buffer.sh
@@ -29,7 +29,7 @@ test_expect_success '0-length read, send along greeting' '
test_cmp expect actual
'
-test_expect_success 'read from file descriptor' '
+test_expect_success NOT_MINGW 'read from file descriptor' '
rm -f input &&
echo hello >expect &&
echo hello >input &&
diff --git a/t/t0110-urlmatch-normalization.sh b/t/t0110-urlmatch-normalization.sh
index 8d6096d4d1..410d5768ca 100755
--- a/t/t0110-urlmatch-normalization.sh
+++ b/t/t0110-urlmatch-normalization.sh
@@ -117,7 +117,7 @@ test_expect_success 'url general escapes' '
test "$(test-urlmatch-normalization -p "X://W?'\!'")" = "x://w/?'\!'"
'
-test_expect_success 'url high-bit escapes' '
+test_expect_success !MINGW 'url high-bit escapes' '
test "$(test-urlmatch-normalization -p "$(cat "$tu-1")")" = "x://q/%01%02%03%04%05%06%07%08%0E%0F%10%11%12" &&
test "$(test-urlmatch-normalization -p "$(cat "$tu-2")")" = "x://q/%13%14%15%16%17%18%19%1B%1C%1D%1E%1F%7F" &&
test "$(test-urlmatch-normalization -p "$(cat "$tu-3")")" = "x://q/%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F" &&
@@ -127,7 +127,10 @@ test_expect_success 'url high-bit escapes' '
test "$(test-urlmatch-normalization -p "$(cat "$tu-7")")" = "x://q/%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF" &&
test "$(test-urlmatch-normalization -p "$(cat "$tu-8")")" = "x://q/%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF" &&
test "$(test-urlmatch-normalization -p "$(cat "$tu-9")")" = "x://q/%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF" &&
- test "$(test-urlmatch-normalization -p "$(cat "$tu-10")")" = "x://q/%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF" &&
+ test "$(test-urlmatch-normalization -p "$(cat "$tu-10")")" = "x://q/%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF"
+'
+
+test_expect_success 'url utf-8 escapes' '
test "$(test-urlmatch-normalization -p "$(cat "$tu-11")")" = "x://q/%C2%80%DF%BF%E0%A0%80%EF%BF%BD%F0%90%80%80%F0%AF%BF%BD"
'
diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh
index 9aeb352b3d..4bc7141226 100755
--- a/t/t1402-check-ref-format.sh
+++ b/t/t1402-check-ref-format.sh
@@ -48,6 +48,7 @@ invalid_ref './foo/bar'
invalid_ref 'foo/./bar'
invalid_ref 'foo/bar/.'
invalid_ref '.refs/foo'
+invalid_ref 'refs/heads/foo.'
invalid_ref 'heads/foo..bar'
invalid_ref 'heads/foo?bar'
valid_ref 'foo./bar'
@@ -64,7 +65,6 @@ valid_ref "$(printf 'heads/fu\303\237')"
invalid_ref 'heads/*foo/bar' --refspec-pattern
invalid_ref 'heads/foo*/bar' --refspec-pattern
invalid_ref 'heads/f*o/bar' --refspec-pattern
-invalid_ref 'heads/foo*//bar' --refspec-pattern
ref='foo'
invalid_ref "$ref"
@@ -129,20 +129,6 @@ valid_ref NOT_MINGW "$ref" '--allow-onelevel --normalize'
invalid_ref NOT_MINGW "$ref" '--refspec-pattern --normalize'
valid_ref NOT_MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize'
-
-valid_ref 'refs/heads/a-very-long-refname'
-invalid_ref 'refs/heads/.a-very-long-refname'
-invalid_ref 'refs/heads/abcdefgh0123..'
-invalid_ref 'refs/heads/abcdefgh01234..'
-invalid_ref 'refs/heads/abcdefgh012345..'
-invalid_ref 'refs/heads/abcdefgh0123456..'
-invalid_ref 'refs/heads/abcdefgh01234567..'
-valid_ref 'refs/heads/abcdefgh0123.a'
-valid_ref 'refs/heads/abcdefgh01234.a'
-valid_ref 'refs/heads/abcdefgh012345.a'
-valid_ref 'refs/heads/abcdefgh0123456.a'
-valid_ref 'refs/heads/abcdefgh01234567.a'
-
test_expect_success "check-ref-format --branch @{-1}" '
T=$(git write-tree) &&
sha1=$(echo A | git commit-tree $T) &&
diff --git a/t/t3901-i18n-patch.sh b/t/t3901-i18n-patch.sh
index 31a5770b34..55c8a2f576 100755
--- a/t/t3901-i18n-patch.sh
+++ b/t/t3901-i18n-patch.sh
@@ -54,10 +54,13 @@ test_expect_success setup '
git add yours &&
git commit -s -m "Second on side" &&
- # the second one on the side branch is ISO-8859-1
- git config i18n.commitencoding ISO8859-1 &&
- # use author and committer name in ISO-8859-1 to match it.
- . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
+ if test_have_prereq NOT_MINGW
+ then
+ # the second one on the side branch is ISO-8859-1
+ git config i18n.commitencoding ISO8859-1 &&
+ # use author and committer name in ISO-8859-1 to match it.
+ . "$TEST_DIRECTORY"/t3901-8859-1.txt
+ fi &&
test_tick &&
echo Yet another >theirs &&
git add theirs &&
@@ -119,7 +122,7 @@ test_expect_success 'rebase (U/L)' '
check_encoding 2
'
-test_expect_success 'rebase (L/L)' '
+test_expect_success NOT_MINGW 'rebase (L/L)' '
# In this test we want ISO-8859-1 encoded commits as the result
git config i18n.commitencoding ISO8859-1 &&
git config i18n.logoutputencoding ISO8859-1 &&
@@ -131,7 +134,7 @@ test_expect_success 'rebase (L/L)' '
check_encoding 2 8859
'
-test_expect_success 'rebase (L/U)' '
+test_expect_success NOT_MINGW 'rebase (L/U)' '
# This is pathological -- use UTF-8 as intermediate form
# to get ISO-8859-1 results.
git config i18n.commitencoding ISO8859-1 &&
@@ -159,7 +162,7 @@ test_expect_success 'cherry-pick(U/U)' '
check_encoding 3
'
-test_expect_success 'cherry-pick(L/L)' '
+test_expect_success NOT_MINGW 'cherry-pick(L/L)' '
# Both the commitencoding and logoutputencoding is set to ISO-8859-1
git config i18n.commitencoding ISO8859-1 &&
@@ -189,7 +192,7 @@ test_expect_success 'cherry-pick(U/L)' '
check_encoding 3
'
-test_expect_success 'cherry-pick(L/U)' '
+test_expect_success NOT_MINGW 'cherry-pick(L/U)' '
# Again, the commitencoding is set to ISO-8859-1 but
# logoutputencoding is set to UTF-8.
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index 805b055c89..6ec6072118 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -324,4 +324,14 @@ test_expect_success 'diff --cached -- file on unborn branch' '
test_cmp "$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0" result
'
+test_expect_success 'diff-tree --stdin with log formatting' '
+ cat >expect <<-\EOF &&
+ Side
+ Third
+ Second
+ EOF
+ git rev-list master | git diff-tree --stdin --format=%s -s >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index 34591c23da..1dbaa3864a 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -52,15 +52,15 @@ do
echo "*.java diff=$p" >.gitattributes &&
test_expect_code 1 git diff --no-index \
A.java B.java 2>msg &&
- ! test_i18ngrep fatal msg &&
- ! test_i18ngrep error msg
+ test_i18ngrep ! fatal msg &&
+ test_i18ngrep ! error msg
'
test_expect_success "builtin $p wordRegex pattern compiles" '
echo "*.java diff=$p" >.gitattributes &&
test_expect_code 1 git diff --no-index --word-diff \
A.java B.java 2>msg &&
- ! test_i18ngrep fatal msg &&
- ! test_i18ngrep error msg
+ test_i18ngrep ! fatal msg &&
+ test_i18ngrep ! error msg
'
done
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index 463d63bde0..e4328964a7 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -26,8 +26,10 @@ add_file () {
echo "$name" >"$name" &&
git add "$name" &&
test_tick &&
- msg_added_iso88591=$(echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding) &&
- git -c "i18n.commitEncoding=$test_encoding" commit -m "$msg_added_iso88591"
+ # "git commit -m" would break MinGW, as Windows refuse to pass
+ # $test_encoding encoded parameter to git.
+ echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding |
+ git -c "i18n.commitEncoding=$test_encoding" commit -F -
done >/dev/null &&
git rev-parse --short --verify HEAD
)
diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh
index 97fcb31d6e..565c020c45 100755
--- a/t/t4201-shortlog.sh
+++ b/t/t4201-shortlog.sh
@@ -93,7 +93,7 @@ test_expect_success 'output from user-defined format is re-wrapped' '
test_cmp expect log.predictable
'
-test_expect_success 'shortlog wrapping' '
+test_expect_success NOT_MINGW 'shortlog wrapping' '
cat >expect <<\EOF &&
A U Thor (5):
Test
@@ -114,7 +114,7 @@ EOF
test_cmp expect out
'
-test_expect_success 'shortlog from non-git directory' '
+test_expect_success NOT_MINGW 'shortlog from non-git directory' '
git log HEAD >log &&
GIT_DIR=non-existing git shortlog -w <log >out &&
test_cmp expect out
@@ -159,7 +159,7 @@ $DSCHO (2):
EOF
-test_expect_success 'shortlog encoding' '
+test_expect_success NOT_MINGW 'shortlog encoding' '
git reset --hard "$commit" &&
git config --unset i18n.commitencoding &&
echo 2 > a1 &&
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index c84ec9ae61..349c531989 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -31,7 +31,7 @@ test_expect_success 'set up basic repos' '
git add foo &&
test_tick &&
git config i18n.commitEncoding $test_encoding &&
- git commit -m "$(commit_msg $test_encoding)" &&
+ commit_msg $test_encoding | git commit -F - &&
git add bar &&
test_tick &&
git commit -m "add bar" &&
diff --git a/t/t4210-log-i18n.sh b/t/t4210-log-i18n.sh
index 52a74729ba..9110404e55 100755
--- a/t/t4210-log-i18n.sh
+++ b/t/t4210-log-i18n.sh
@@ -34,7 +34,7 @@ test_expect_success 'log --grep searches in log output encoding (utf8)' '
test_cmp expect actual
'
-test_expect_success 'log --grep searches in log output encoding (latin1)' '
+test_expect_success NOT_MINGW 'log --grep searches in log output encoding (latin1)' '
cat >expect <<-\EOF &&
latin1
utf8
@@ -43,7 +43,7 @@ test_expect_success 'log --grep searches in log output encoding (latin1)' '
test_cmp expect actual
'
-test_expect_success 'log --grep does not find non-reencoded values (utf8)' '
+test_expect_success NOT_MINGW 'log --grep does not find non-reencoded values (utf8)' '
>expect &&
git log --encoding=utf8 --format=%s --grep=$latin1_e >actual &&
test_cmp expect actual
diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
index 88ed3191e8..a02a45afd2 100755
--- a/t/t6006-rev-list-format.sh
+++ b/t/t6006-rev-list-format.sh
@@ -35,13 +35,13 @@ test_expect_success 'setup' '
: >foo &&
git add foo &&
git config i18n.commitEncoding $test_encoding &&
- git commit -m "$added_iso88591" &&
+ echo "$added_iso88591" | git commit -F - &&
head1=$(git rev-parse --verify HEAD) &&
head1_short=$(git rev-parse --verify --short $head1) &&
tree1=$(git rev-parse --verify HEAD:) &&
tree1_short=$(git rev-parse --verify --short $tree1) &&
echo "$changed" > foo &&
- git commit -a -m "$changed_iso88591" &&
+ echo "$changed_iso88591" | git commit -a -F - &&
head2=$(git rev-parse --verify HEAD) &&
head2_short=$(git rev-parse --verify --short $head2) &&
tree2=$(git rev-parse --verify HEAD:) &&
diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
index ee703bed64..98bcfe21aa 100755
--- a/t/t7102-reset.sh
+++ b/t/t7102-reset.sh
@@ -44,7 +44,9 @@ test_expect_success 'creating initial files and commits' '
echo "1st line 2nd file" >secondfile &&
echo "2nd line 2nd file" >>secondfile &&
- git -c "i18n.commitEncoding=$test_encoding" commit -a -m "$(commit_msg $test_encoding)" &&
+ # "git commit -m" would break MinGW, as Windows refuse to pass
+ # $test_encoding encoded parameter to git.
+ commit_msg $test_encoding | git -c "i18n.commitEncoding=$test_encoding" commit -a -F - &&
head5=$(git rev-parse --verify HEAD)
'
# git log --pretty=oneline # to see those SHA1 involved
@@ -334,7 +336,9 @@ test_expect_success 'redoing the last two commits should succeed' '
echo "1st line 2nd file" >secondfile &&
echo "2nd line 2nd file" >>secondfile &&
- git -c "i18n.commitEncoding=$test_encoding" commit -a -m "$(commit_msg $test_encoding)" &&
+ # "git commit -m" would break MinGW, as Windows refuse to pass
+ # $test_encoding encoded parameter to git.
+ commit_msg $test_encoding | git -c "i18n.commitEncoding=$test_encoding" commit -a -F - &&
check_changes $head5
'
diff --git a/t/t7509-commit.sh b/t/t7509-commit.sh
index b61fd3c3c4..9ac794052d 100755
--- a/t/t7509-commit.sh
+++ b/t/t7509-commit.sh
@@ -77,6 +77,7 @@ test_expect_success '--amend option copies authorship' '
git commit -a --amend -m "amend test" &&
author_header Initial >expect &&
author_header HEAD >actual &&
+ test_cmp expect actual &&
echo "amend test" >expect &&
message_body HEAD >actual &&
diff --git a/t/t8005-blame-i18n.sh b/t/t8005-blame-i18n.sh
index cb390559f9..a6e73d0635 100755
--- a/t/t8005-blame-i18n.sh
+++ b/t/t8005-blame-i18n.sh
@@ -33,7 +33,7 @@ author $SJIS_NAME
summary $SJIS_MSG
EOF
-test_expect_success \
+test_expect_success NOT_MINGW \
'blame respects i18n.commitencoding' '
git blame --incremental file | \
egrep "^(author|summary) " > actual &&
@@ -49,7 +49,7 @@ author $EUC_JAPAN_NAME
summary $EUC_JAPAN_MSG
EOF
-test_expect_success \
+test_expect_success NOT_MINGW \
'blame respects i18n.logoutputencoding' '
git config i18n.logoutputencoding eucJP &&
git blame --incremental file | \
@@ -66,7 +66,7 @@ author $UTF8_NAME
summary $UTF8_MSG
EOF
-test_expect_success \
+test_expect_success NOT_MINGW \
'blame respects --encoding=UTF-8' '
git blame --incremental --encoding=UTF-8 file | \
egrep "^(author|summary) " > actual &&
@@ -82,7 +82,7 @@ author $UTF8_NAME
summary $UTF8_MSG
EOF
-test_expect_success \
+test_expect_success NOT_MINGW \
'blame respects --encoding=none' '
git blame --incremental --encoding=none file | \
egrep "^(author|summary) " > actual &&
diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index 665607c9cb..5b562122a1 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -145,7 +145,7 @@ test_expect_success 'exit when p4 fails to produce marshaled output' '
test_expect_code 1 git p4 clone --dest="$git" //depot >errs 2>&1
) &&
cat errs &&
- ! test_i18ngrep Traceback errs
+ test_i18ngrep ! Traceback errs
'
# Hide a file from p4d, make sure we catch its complaint. This won't fail in
diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh
index 7fab2ed977..1f74a88385 100755
--- a/t/t9807-git-p4-submit.sh
+++ b/t/t9807-git-p4-submit.sh
@@ -404,7 +404,7 @@ test_expect_success 'submit --prepare-p4-only' '
git p4 submit --prepare-p4-only >out &&
test_i18ngrep "prepared for submission" out &&
test_i18ngrep "must be deleted" out &&
- ! test_i18ngrep "everything below this line is just the diff" out
+ test_i18ngrep ! "everything below this line is just the diff" out
) &&
(
cd "$cli" &&
diff --git a/t/t9814-git-p4-rename.sh b/t/t9814-git-p4-rename.sh
index 1fc1f5f2af..95f4421f71 100755
--- a/t/t9814-git-p4-rename.sh
+++ b/t/t9814-git-p4-rename.sh
@@ -177,7 +177,10 @@ test_expect_success 'detect copies' '
level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
test -n "$level" && test "$level" -gt 0 && test "$level" -lt 98 &&
src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
- test "$src" = file10 || test "$src" = file11 &&
+ case "$src" in
+ file10 | file11) : ;; # happy
+ *) false ;; # not
+ &&
git config git-p4.detectCopies $(($level + 2)) &&
git p4 submit &&
p4 filelog //depot/file12 &&
@@ -191,7 +194,10 @@ test_expect_success 'detect copies' '
level=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f1 | cut -d" " -f5 | sed "s/C0*//") &&
test -n "$level" && test "$level" -gt 2 && test "$level" -lt 100 &&
src=$(git diff-tree -r -C --find-copies-harder HEAD | sed 1d | cut -f2) &&
- test "$src" = file10 || test "$src" = file11 || test "$src" = file12 &&
+ case "$src" in
+ file10 | file11 | file12) : ;; # happy
+ *) false ;; # not
+ &&
git config git-p4.detectCopies $(($level - 2)) &&
git p4 submit &&
p4 filelog //depot/file13 &&
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 1d1c1063a3..f10a75290e 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -212,9 +212,18 @@ test_expect_success '__gitdir - non-existing $GIT_DIR' '
)
'
+function pwd_P_W () {
+ if test_have_prereq MINGW
+ then
+ pwd -W
+ else
+ pwd -P
+ fi
+}
+
test_expect_success '__gitdir - gitfile in cwd' '
- echo "$(pwd -P)/otherrepo/.git" >expected &&
- echo "gitdir: $TRASH_DIRECTORY/otherrepo/.git" >subdir/.git &&
+ echo "$(pwd_P_W)/otherrepo/.git" >expected &&
+ echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
test_when_finished "rm -f subdir/.git" &&
(
cd subdir &&
@@ -224,8 +233,8 @@ test_expect_success '__gitdir - gitfile in cwd' '
'
test_expect_success '__gitdir - gitfile in parent' '
- echo "$(pwd -P)/otherrepo/.git" >expected &&
- echo "gitdir: $TRASH_DIRECTORY/otherrepo/.git" >subdir/.git &&
+ echo "$(pwd_P_W)/otherrepo/.git" >expected &&
+ echo "gitdir: $(pwd_P_W)/otherrepo/.git" >subdir/.git &&
test_when_finished "rm -f subdir/.git" &&
(
cd subdir/subsubdir &&
diff --git a/t/valgrind/default.supp b/t/valgrind/default.supp
index 9d51c92b74..0a6724fcc4 100644
--- a/t/valgrind/default.supp
+++ b/t/valgrind/default.supp
@@ -49,18 +49,3 @@
Memcheck:Addr4
fun:copy_ref
}
-{
- ignore-sse-check_refname_format-addr
- Memcheck:Addr8
- fun:check_refname_format
-}
-{
- ignore-sse-check_refname_format-cond
- Memcheck:Cond
- fun:check_refname_format
-}
-{
- ignore-sse-check_refname_format-value
- Memcheck:Value8
- fun:check_refname_format
-}
diff --git a/transport.c b/transport.c
index 80ed1262c2..662421bb5e 100644
--- a/transport.c
+++ b/transport.c
@@ -1357,11 +1357,11 @@ static int refs_from_alternate_cb(struct alternate_object_database *e,
while (other[len-1] == '/')
other[--len] = '\0';
if (len < 8 || memcmp(other + len - 8, "/objects", 8))
- return 0;
+ goto out;
/* Is this a git repository with refs? */
memcpy(other + len - 8, "/refs", 6);
if (!is_directory(other))
- return 0;
+ goto out;
other[len - 8] = '\0';
remote = remote_get(other);
transport = transport_get(remote, other);
@@ -1370,6 +1370,7 @@ static int refs_from_alternate_cb(struct alternate_object_database *e,
extra = extra->next)
cb->fn(extra, cb->data);
transport_disconnect(transport);
+out:
free(other);
return 0;
}