From 929e37d3dfef13895ef6e4b54c7d45962b234461 Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Mon, 7 Sep 2009 10:48:01 +0200 Subject: grep: fix exit status if external_grep() punts If external_grep() is called and punts, grep_cache() mistakenly reported a hit, even if there were none. The bug can be triggered by calling "git grep --no-color" from a subdirectory. Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- builtin-grep.c | 1 + 1 file changed, 1 insertion(+) diff --git a/builtin-grep.c b/builtin-grep.c index f88a912ac..da2f4fe1b 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -448,6 +448,7 @@ static int grep_cache(struct grep_opt *opt, const char **paths, int cached) hit = external_grep(opt, paths, cached); if (hit >= 0) return hit; + hit = 0; } #endif -- cgit v1.2.1 From 493b7a08d80535def6756b281873e4e0937ba6c2 Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Sat, 5 Sep 2009 14:31:17 +0200 Subject: grep: accept relative paths outside current working directory "git grep" would barf at relative paths pointing outside the current working directory (or subdirectories thereof). Use quote_path_relative(), which can handle such cases just fine. [jc: added tests.] Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- builtin-grep.c | 38 +++++++++++--------------------------- grep.h | 1 + t/t7002-grep.sh | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/builtin-grep.c b/builtin-grep.c index da2f4fe1b..eda2c8848 100644 --- a/builtin-grep.c +++ b/builtin-grep.c @@ -11,6 +11,7 @@ #include "tree-walk.h" #include "builtin.h" #include "grep.h" +#include "quote.h" #ifndef NO_EXTERNAL_GREP #ifdef __unix__ @@ -114,8 +115,8 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, const char unsigned long size; char *data; enum object_type type; - char *to_free = NULL; int hit; + struct strbuf pathbuf = STRBUF_INIT; data = read_sha1_file(sha1, &type, &size); if (!data) { @@ -123,26 +124,13 @@ static int grep_sha1(struct grep_opt *opt, const unsigned char *sha1, const char return 0; } if (opt->relative && opt->prefix_length) { - static char name_buf[PATH_MAX]; - char *cp; - int name_len = strlen(name) - opt->prefix_length + 1; - - if (!tree_name_len) - name += opt->prefix_length; - else { - if (ARRAY_SIZE(name_buf) <= name_len) - cp = to_free = xmalloc(name_len); - else - cp = name_buf; - memcpy(cp, name, tree_name_len); - strcpy(cp + tree_name_len, - name + tree_name_len + opt->prefix_length); - name = cp; - } + quote_path_relative(name + tree_name_len, -1, &pathbuf, opt->prefix); + strbuf_insert(&pathbuf, 0, name, tree_name_len); + name = pathbuf.buf; } hit = grep_buffer(opt, name, data, size); + strbuf_release(&pathbuf); free(data); - free(to_free); return hit; } @@ -152,6 +140,7 @@ static int grep_file(struct grep_opt *opt, const char *filename) int i; char *data; size_t sz; + struct strbuf buf = STRBUF_INIT; if (lstat(filename, &st) < 0) { err_ret: @@ -176,8 +165,9 @@ static int grep_file(struct grep_opt *opt, const char *filename) } close(i); if (opt->relative && opt->prefix_length) - filename += opt->prefix_length; + filename = quote_path_relative(filename, -1, &buf, opt->prefix); i = grep_buffer(opt, filename, data, sz); + strbuf_release(&buf); free(data); return i; } @@ -582,6 +572,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix) int i; memset(&opt, 0, sizeof(opt)); + opt.prefix = prefix; opt.prefix_length = (prefix && *prefix) ? strlen(prefix) : 0; opt.relative = 1; opt.pathname = 1; @@ -857,15 +848,8 @@ int cmd_grep(int argc, const char **argv, const char *prefix) verify_filename(prefix, argv[j]); } - if (i < argc) { + if (i < argc) paths = get_pathspec(prefix, argv + i); - if (opt.prefix_length && opt.relative) { - /* Make sure we do not get outside of paths */ - for (i = 0; paths[i]; i++) - if (strncmp(prefix, paths[i], opt.prefix_length)) - die("git grep: cannot generate relative filenames containing '..'"); - } - } else if (prefix) { paths = xcalloc(2, sizeof(const char *)); paths[0] = prefix; diff --git a/grep.h b/grep.h index a67005de6..5b767c931 100644 --- a/grep.h +++ b/grep.h @@ -59,6 +59,7 @@ struct grep_opt { struct grep_pat *pattern_list; struct grep_pat **pattern_tail; struct grep_expr *pattern_expression; + const char *prefix; int prefix_length; regex_t regexp; unsigned linenum:1; diff --git a/t/t7002-grep.sh b/t/t7002-grep.sh index 7868af8f1..fe87834fb 100755 --- a/t/t7002-grep.sh +++ b/t/t7002-grep.sh @@ -212,4 +212,21 @@ test_expect_success 'grep with CE_VALID file' ' git checkout t/t ' +test_expect_success 'grep from a subdirectory to search wider area (1)' ' + mkdir -p s && + ( + cd s && git grep "x x x" .. + ) +' + +test_expect_success 'grep from a subdirectory to search wider area (2)' ' + mkdir -p s && + ( + cd s || exit 1 + ( git grep xxyyzz .. >out ; echo $? >status ) + ! test -s out && + test 1 = $(cat status) + ) +' + test_done -- cgit v1.2.1 From 59b8d38f6e4f19b93c5dc4493ab11706acd101b5 Mon Sep 17 00:00:00 2001 From: Tay Ray Chuan Date: Wed, 9 Sep 2009 20:33:50 +0800 Subject: http.c: remove verification of remote packs Make http.c::fetch_pack_index() no longer check for the remote pack with a HEAD request before fetching the corresponding pack index file. Not only does sending a HEAD request before we do a GET incur a performance penalty, it does not offer any significant error- prevention advantages (pack fetching in the *_http_pack_request() methods is capable of handling any errors on its own). This addresses an issue raised elsewhere: http://code.google.com/p/msysgit/issues/detail?id=323 http://support.github.com/discussions/repos/957-cant-clone-over-http-or-git Signed-off-by: Tay Ray Chuan Signed-off-by: Junio C Hamano --- http.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/http.c b/http.c index d60f7f767..d0cc1b334 100644 --- a/http.c +++ b/http.c @@ -869,17 +869,6 @@ static int fetch_pack_index(unsigned char *sha1, const char *base_url) char *url; struct strbuf buf = STRBUF_INIT; - /* Don't use the index if the pack isn't there */ - end_url_with_slash(&buf, base_url); - strbuf_addf(&buf, "objects/pack/pack-%s.pack", hex); - url = strbuf_detach(&buf, 0); - - if (http_get_strbuf(url, NULL, 0)) { - ret = error("Unable to verify pack %s is available", - hex); - goto cleanup; - } - if (has_pack_index(sha1)) { ret = 0; goto cleanup; -- cgit v1.2.1 From d3d7d47e6e0c3077fa39ffcca2b7f5f48ea97812 Mon Sep 17 00:00:00 2001 From: Mark Lodato Date: Sat, 12 Sep 2009 20:33:23 -0400 Subject: svn: properly escape arguments for authors-prog Previously, the call to authors-prog was not properly escaped, so any special characters in the Subversion username, such as spaces and semi-colons, would be interpreted by the shell rather than being passed in as the first argument. Now all unsafe characters are escaped using "git rev-parse --sq-quote" [ew: switched from "\Q..\E" to "rev-parse --sq-quote"] Signed-off-by: Mark Lodato Signed-off-by: Eric Wong Signed-off-by: Junio C Hamano --- git-svn.perl | 1 + t/t9138-git-svn-authors-prog.sh | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/git-svn.perl b/git-svn.perl index d07581072..24bdbf5b8 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -2810,6 +2810,7 @@ sub other_gs { sub call_authors_prog { my ($orig_author) = @_; + $orig_author = command_oneline('rev-parse', '--sq-quote', $orig_author); my $author = `$::_authors_prog $orig_author`; if ($? != 0) { die "$::_authors_prog failed with exit code $?\n" diff --git a/t/t9138-git-svn-authors-prog.sh b/t/t9138-git-svn-authors-prog.sh index a4b00f2a3..83cc5fc9d 100755 --- a/t/t9138-git-svn-authors-prog.sh +++ b/t/t9138-git-svn-authors-prog.sh @@ -66,4 +66,18 @@ test_expect_success 'authors-file overrode authors-prog' ' ) ' +git --git-dir=x/.git config --unset svn.authorsfile +git --git-dir=x/.git config --unset svn.authorsprog + +test_expect_success 'authors-prog handled special characters in username' ' + svn mkdir -m bad --username "xyz; touch evil" "$svnrepo"/bad && + ( + cd x && + git svn --authors-prog=../svn-authors-prog fetch && + git rev-list -1 --pretty=raw refs/remotes/git-svn | + grep "^author xyz; touch evil " && + ! test -f evil + ) +' + test_done -- cgit v1.2.1 From 7fb6bcff2dece2ff9fbc5ebfe526d9b2a7e764c4 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 13 Sep 2009 01:04:23 -0700 Subject: GIT 1.6.4.3 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.4.3.txt | 29 +++++++++++++++++++++++++++++ Documentation/git.txt | 3 ++- GIT-VERSION-GEN | 2 +- RelNotes | 2 +- 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 Documentation/RelNotes-1.6.4.3.txt diff --git a/Documentation/RelNotes-1.6.4.3.txt b/Documentation/RelNotes-1.6.4.3.txt new file mode 100644 index 000000000..4f29babde --- /dev/null +++ b/Documentation/RelNotes-1.6.4.3.txt @@ -0,0 +1,29 @@ +GIT v1.6.4.3 Release Notes +========================== + +Fixes since v1.6.4.2 +-------------------- + +* "git clone" from an empty repository gave unnecessary error message, + even though it did everything else correctly. + +* "git cvsserver" invoked git commands via "git-foo" style, which has long + been deprecated. + +* "git fetch" and "git clone" had an extra sanity check to verify the + presense of the corresponding *.pack file before downloading *.idx + file by issuing a HEAD request. Github server however sometimes + gave 500 (Internal server error) response to HEAD even if a GET + request for *.pack file to the same URL would have succeeded, and broke + clone over HTTP from some of their repositories. As a workaround, this + verification has been removed (as it is not absolutely necessary). + +* "git grep" did not like relative pathname to refer outside the current + directory when run from a subdirectory. + +* an error message from "git push" was formatted in a very ugly way. + +* "git svn" did not quote the subversion user name correctly when + running its author-prog helper program. + +Other minor documentation updates are included. diff --git a/Documentation/git.txt b/Documentation/git.txt index ad44cac71..f91cabb4c 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,10 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.6.4.2/git.html[documentation for release 1.6.4.2] +* link:v1.6.4.3/git.html[documentation for release 1.6.4.3] * release notes for + link:RelNotes-1.6.4.3.txt[1.6.4.3], link:RelNotes-1.6.4.2.txt[1.6.4.2], link:RelNotes-1.6.4.1.txt[1.6.4.1], link:RelNotes-1.6.4.txt[1.6.4]. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 76c6dd2fe..7956bc94a 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.6.4.2 +DEF_VER=v1.6.4.3 LF=' ' diff --git a/RelNotes b/RelNotes index 0bcee0748..ed984e3b4 120000 --- a/RelNotes +++ b/RelNotes @@ -1 +1 @@ -Documentation/RelNotes-1.6.4.2.txt \ No newline at end of file +Documentation/RelNotes-1.6.4.3.txt \ No newline at end of file -- cgit v1.2.1