diff options
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. @@ -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 "Команден ред" @@ -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; } |