From 2c626e5fa8a46f647b88fb32d7b28d573e8631bf Mon Sep 17 00:00:00 2001 From: Mike Ralphson Date: Thu, 26 Feb 2009 16:31:52 +0100 Subject: [PATCH 01/21] Fix odb_mkstemp() on AIX The AIX mkstemp() modifies its template parameter to an empty string if the call fails. The existing code had already recomputed the template, but too late to be good. See also 6ff6af62, which fixed this problem in a different spot. Signed-off-by: Mike Ralphson Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- wrapper.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wrapper.c b/wrapper.c index 231a58f1a9..5e9de294d5 100644 --- a/wrapper.c +++ b/wrapper.c @@ -208,9 +208,10 @@ int odb_mkstemp(char *template, size_t limit, const char *pattern) return fd; /* slow path */ - safe_create_leading_directories(template); + /* some mkstemp implementations erase template on failure */ snprintf(template, limit, "%s/%s", get_object_directory(), pattern); + safe_create_leading_directories(template); return xmkstemp(template); } From 2591838beece01f98773109a7c6932525be2d144 Mon Sep 17 00:00:00 2001 From: Jay Soffian Date: Thu, 26 Feb 2009 18:44:40 -0500 Subject: [PATCH 02/21] t5540-http-push.sh: avoid non-portable grep -P OS X's GNU grep does not support -P/--perl-regexp. We use a basic RE instead, and simplify the pattern slightly by replacing '+' with '*' so it can be more easily expressed using a basic RE. The important part of pattern, checking for a SHA-1 has suffix in the successful PUT/MOVE operations, remains the same. Also, a-z instead of a-f was an obvious mistake in the original RE. Here are samples of what we want to match: 127.0.0.1 - - [26/Feb/2009:22:38:13 +0000] "PUT /test_repo.git/objects/3e/a4fbb9e18a401a6463c595d08118fcb9fb7426_fab55116904c665a95438bcc78521444a7db6096 HTTP/1.1" 201 277 127.0.0.1 - - [26/Feb/2009:22:38:13 +0000] "MOVE /test_repo.git/objects/3e/a4fbb9e18a401a6463c595d08118fcb9fb7426_fab55116904c665a95438bcc78521444a7db6096 HTTP/1.1" 201 277 Signed-off-by: Jay Soffian Signed-off-by: Junio C Hamano --- t/t5540-http-push.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/t/t5540-http-push.sh b/t/t5540-http-push.sh index 11b343274f..10e5fd0d5a 100755 --- a/t/t5540-http-push.sh +++ b/t/t5540-http-push.sh @@ -94,10 +94,15 @@ test_expect_success 'MKCOL sends directory names with trailing slashes' ' ' -test_expect_success 'PUT and MOVE sends object to URLs with SHA-1 hash suffix' ' +x1="[0-9a-f]" +x2="$x1$x1" +x5="$x1$x1$x1$x1$x1" +x38="$x5$x5$x5$x5$x5$x5$x5$x1$x1$x1" +x40="$x38$x2" - grep -P "\"(?:PUT|MOVE) .+objects/[\da-z]{2}/[\da-z]{38}_[\da-z\-]{40} HTTP/[0-9.]+\" 20\d" \ - < "$HTTPD_ROOT_PATH"/access.log +test_expect_success 'PUT and MOVE sends object to URLs with SHA-1 hash suffix' ' + sed -e "s/PUT /OP /" -e "s/MOVE /OP /" "$HTTPD_ROOT_PATH"/access.log | + grep -e "\"OP .*/objects/$x2/${x38}_$x40 HTTP/[.0-9]*\" 20[0-9] " ' From c767184d8f99404d456b32a2c6c5c41d6db7a847 Mon Sep 17 00:00:00 2001 From: Michael J Gruber Date: Thu, 26 Feb 2009 10:52:53 +0100 Subject: [PATCH 03/21] git-am: Keep index in case of abort with dirty index git am --abort resets the index unconditionally. But in case a previous git am exited due to a dirty index it is preferable to keep that index. Make it so. Signed-off-by: Michael J Gruber Signed-off-by: Junio C Hamano --- git-am.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/git-am.sh b/git-am.sh index 8bcb206022..351b4f86fa 100755 --- a/git-am.sh +++ b/git-am.sh @@ -230,11 +230,14 @@ then ;; ,t) git rerere clear - git read-tree --reset -u HEAD ORIG_HEAD - git reset ORIG_HEAD + test -f "$dotest/dirtyindex" || { + git read-tree --reset -u HEAD ORIG_HEAD + git reset ORIG_HEAD + } rm -fr "$dotest" exit ;; esac + rm -f "$dotest/dirtyindex" else # Make sure we are not given --skip, --resolved, nor --abort test "$skip$resolved$abort" = "" || @@ -287,7 +290,11 @@ fi case "$resolved" in '') files=$(git diff-index --cached --name-only HEAD --) || exit - test "$files" && die "Dirty index: cannot apply patches (dirty: $files)" + if test "$files" + then + : >"$dotest/dirtyindex" + die "Dirty index: cannot apply patches (dirty: $files)" + fi esac if test "$(cat "$dotest/utf8")" = t From 2d56a136435bd40f9b6b75103eb4d75003154c9f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 26 Feb 2009 11:24:29 -0800 Subject: [PATCH 04/21] git-am: make --abort less dangerous When you are in the middle of "git rebase", "git am --abort" by mistake would have referred to nonexistent ORIG_HEAD and barfed, or worse yet, used a stale ORIG_HEAD and taken you to an unexpected commit. Also the option parsing did not reject "git am --abort --skip". Signed-off-by: Junio C Hamano --- git-am.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/git-am.sh b/git-am.sh index 351b4f86fa..d3390755fc 100755 --- a/git-am.sh +++ b/git-am.sh @@ -221,6 +221,9 @@ then resume=yes case "$skip,$abort" in + t,t) + die "Please make up your mind. --skip or --abort?" + ;; t,) git rerere clear git read-tree --reset -u HEAD HEAD @@ -229,6 +232,10 @@ then git update-ref ORIG_HEAD $orig_head ;; ,t) + if test -f "$dotest/rebasing" + then + exec git rebase --abort + fi git rerere clear test -f "$dotest/dirtyindex" || { git read-tree --reset -u HEAD ORIG_HEAD From 1b249ffe8dff12849e3e215b46b245daecfadba0 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Fri, 27 Feb 2009 07:31:22 +0100 Subject: [PATCH 05/21] bisect: fix quoting TRIED revs when "bad" commit is also "skip"ped When the "bad" commit was also "skip"ped and when more than one commit was skipped, the "filter_skipped" function would have printed something like: bisect_rev=| (where and are hexadecimal sha1 hashes) and this would have been evaled later as piping "bisect_rev=" into "", which would have failed. So this patch makes the "filter_skipped" function properly quote what it outputs, so that it will print something like: bisect_rev='|' which will be properly evaled later. The caller was not stopping properly because the scriptlet this function returned to be evaled was not strung together with && and because of this, an error in an earlier part of the output was simply ignored. A test case is added to the test suite. And while at it, we also initialize the VARS, FOUND and TRIED variables, so that we protect ourselves from environment variables the user may have with these names. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- git-bisect.sh | 76 ++++++++++++++++++++----------------- t/t6030-bisect-porcelain.sh | 25 ++++++++++++ 2 files changed, 66 insertions(+), 35 deletions(-) diff --git a/git-bisect.sh b/git-bisect.sh index 97ac600873..f9a5c0bdf4 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -269,56 +269,62 @@ filter_skipped() { # Let's parse the output of: # "git rev-list --bisect-vars --bisect-all ..." - eval_rev_list "$_eval" | while read hash line - do - case "$VARS,$FOUND,$TRIED,$hash" in - # We display some vars. - 1,*,*,*) echo "$hash $line" ;; - - # Split line. - ,*,*,---*) ;; - - # We had nothing to search. + eval_rev_list "$_eval" | { + VARS= FOUND= TRIED= + while read hash line + do + case "$VARS,$FOUND,$TRIED,$hash" in + 1,*,*,*) + # "bisect_foo=bar" read from rev-list output. + echo "$hash &&" + ;; + ,*,*,---*) + # Separator + ;; ,,,bisect_rev*) - echo "bisect_rev=" + # We had nothing to search. + echo "bisect_rev= &&" VARS=1 ;; - - # We did not find a good bisect rev. - # This should happen only if the "bad" - # commit is also a "skip" commit. ,,*,bisect_rev*) - echo "bisect_rev=$TRIED" + # We did not find a good bisect rev. + # This should happen only if the "bad" + # commit is also a "skip" commit. + echo "bisect_rev='$TRIED' &&" VARS=1 ;; - - # We are searching. ,,*,*) + # We are searching. TRIED="${TRIED:+$TRIED|}$hash" case "$_skip" in *$hash*) ;; *) - echo "bisect_rev=$hash" - echo "bisect_tried=\"$TRIED\"" + echo "bisect_rev=$hash &&" + echo "bisect_tried='$TRIED' &&" FOUND=1 ;; esac ;; - - # We have already found a rev to be tested. - ,1,*,bisect_rev*) VARS=1 ;; - ,1,*,*) ;; - - # ??? - *) die "filter_skipped error " \ - "VARS: '$VARS' " \ - "FOUND: '$FOUND' " \ - "TRIED: '$TRIED' " \ - "hash: '$hash' " \ - "line: '$line'" - ;; - esac - done + ,1,*,bisect_rev*) + # We have already found a rev to be tested. + VARS=1 + ;; + ,1,*,*) + ;; + *) + # Unexpected input + echo "die 'filter_skipped error'" + die "filter_skipped error " \ + "VARS: '$VARS' " \ + "FOUND: '$FOUND' " \ + "TRIED: '$TRIED' " \ + "hash: '$hash' " \ + "line: '$line'" + ;; + esac + done + echo ':' + } } exit_if_skipped_commits () { diff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh index 36c9a6965f..0b81e65aa3 100755 --- a/t/t6030-bisect-porcelain.sh +++ b/t/t6030-bisect-porcelain.sh @@ -224,6 +224,31 @@ test_expect_success 'bisect skip: cannot tell between 2 commits' ' fi ' +# $HASH1 is good, $HASH4 is both skipped and bad, we skip $HASH3 +# and $HASH2 is good, +# so we should not be able to tell the first bad commit +# among $HASH3 and $HASH4 +test_expect_success 'bisect skip: with commit both bad and skipped' ' + git bisect start && + git bisect skip && + git bisect bad && + git bisect good $HASH1 && + git bisect skip && + if git bisect good > my_bisect_log.txt + then + echo Oops, should have failed. + false + else + test $? -eq 2 && + grep "first bad commit could be any of" my_bisect_log.txt && + ! grep $HASH1 my_bisect_log.txt && + ! grep $HASH2 my_bisect_log.txt && + grep $HASH3 my_bisect_log.txt && + grep $HASH4 my_bisect_log.txt && + git bisect reset + fi +' + # We want to automatically find the commit that # introduced "Another" into hello. test_expect_success \ From cce074a2760940cb78232ce2201ab5590e274d4a Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Fri, 27 Feb 2009 07:31:22 +0100 Subject: [PATCH 06/21] bisect: fix another instance of eval'ed string When there is nothing to be skipped, the output from rev-list --bisect-vars was eval'ed without first being strung together with &&; this is probably not a problem as it is much less likely to be a bad input than the list handcrafted by the filter_skip function, but it still is a good discipline. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- git-bisect.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/git-bisect.sh b/git-bisect.sh index f9a5c0bdf4..b95dbbbbb2 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -263,7 +263,13 @@ filter_skipped() { _skip="$2" if [ -z "$_skip" ]; then - eval_rev_list "$_eval" + eval_rev_list "$_eval" | { + while read line + do + echo "$line &&" + done + echo ':' + } return fi From 48679e5c2d059b9b198d6f414dd80aa921d23002 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 27 Feb 2009 19:40:16 -0800 Subject: [PATCH 07/21] git-svn: disable broken symlink workaround by default Even though this will break things for some extremely rare repositories used by broken Windows clients, it's probably not worth enabling this by default as it has negatively affected many more users than it has helped from what we've seen so far. The extremely rare repositories that have broken symlinks in them will be silently corrupted in import; but users can still reenable this option and restart the import. Signed-off-by: Eric Wong Signed-off-by: Junio C Hamano --- git-svn.perl | 2 +- t/t9131-git-svn-empty-symlink.sh | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/git-svn.perl b/git-svn.perl index d967594ee7..a676a4c78e 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -3297,7 +3297,7 @@ sub new { sub _mark_empty_symlinks { my ($git_svn, $switch_path) = @_; my $bool = Git::config_bool('svn.brokenSymlinkWorkaround'); - return {} if (defined($bool) && ! $bool); + return {} if (!defined($bool)) || (defined($bool) && ! $bool); my %ret; my ($rev, $cmt) = $git_svn->last_rev_commit; diff --git a/t/t9131-git-svn-empty-symlink.sh b/t/t9131-git-svn-empty-symlink.sh index 20529a878c..8f35e294aa 100755 --- a/t/t9131-git-svn-empty-symlink.sh +++ b/t/t9131-git-svn-empty-symlink.sh @@ -83,6 +83,8 @@ EOF ' test_expect_success 'clone using git svn' 'git svn clone -r1 "$svnrepo" x' +test_expect_success 'enable broken symlink workaround' \ + '(cd x && git config svn.brokenSymlinkWorkaround true)' test_expect_success '"bar" is an empty file' 'test -f x/bar && ! test -s x/bar' test_expect_success 'get "bar" => symlink fix from svn' \ '(cd x && git svn rebase)' @@ -97,4 +99,12 @@ test_expect_success 'get "bar" => symlink fix from svn' \ '(cd y && git svn rebase)' test_expect_success '"bar" does not become a symlink' '! test -L y/bar' +# svn.brokenSymlinkWorkaround is unset +test_expect_success 'clone using git svn' 'git svn clone -r1 "$svnrepo" z' +test_expect_success '"bar" is an empty file' 'test -f z/bar && ! test -s z/bar' +test_expect_success 'get "bar" => symlink fix from svn' \ + '(cd z && git svn rebase)' +test_expect_success '"bar" does not become a symlink' '! test -L z/bar' + + test_done From 736e619a1be92fcb6eac0155b51bc93d1dcc3157 Mon Sep 17 00:00:00 2001 From: Ben Walton Date: Fri, 27 Feb 2009 22:11:45 -0500 Subject: [PATCH 08/21] git-svn - return original format_svn_date semantics When %z was removed from the strftime call and subsituted with a local gmt offset calculation, time() was no longer the default for all time functions as it was with the previous localtime(shift). This is now corrected so that format_svn_time behaves as it used to. Signed-off-by: Ben Walton Acked-by: Eric Wong Signed-off-by: Junio C Hamano --- git-svn.perl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-svn.perl b/git-svn.perl index a676a4c78e..959eb52f3f 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -4738,7 +4738,7 @@ sub run_pager { sub format_svn_date { # some systmes don't handle or mishandle %z, so be creative. - my $t = shift; + my $t = shift || time; my $gm = timelocal(gmtime($t)); my $sign = qw( + + - )[ $t <=> $gm ]; my $gmoff = sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]); From 749485f6225455eefd4a2af31e2c98068f20464d Mon Sep 17 00:00:00 2001 From: Todd Zullinger Date: Sat, 28 Feb 2009 13:42:02 -0500 Subject: [PATCH 09/21] git-rebase: Update --whitespace documentation The parameters accepted by the --whitespace option of "git apply" have changed over time, and the documentation for "git rebase" was out of sync. Remove the specific parameter list from the "git rebase" documentation and simply point to the "git apply" documentation for details, as is already done in the "git am" documentation. Signed-off-by: Todd Zullinger Signed-off-by: Junio C Hamano --- Documentation/git-rebase.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 30487de48f..da3c38cd60 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -243,7 +243,7 @@ OPTIONS context exist they all must match. By default no context is ever ignored. ---whitespace=:: +--whitespace=