From 2bf1033478a65c1067e1a7922a91406c797852ed Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Tue, 1 Jun 2010 19:13:40 -0500 Subject: [PATCH 1/7] t/t5800: skip if python version is older than 2.5 This test script depends on the git-remote-testgit python script. This python script makes use of the hashlib module which was released in python version 2.5. So, add a new pre-requisite named PYTHON_2_5_OR_NEWER to test-lib.sh and check for it in t5800. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- t/t5800-remote-helpers.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/t/t5800-remote-helpers.sh b/t/t5800-remote-helpers.sh index 75a0163c07..22c7df47fb 100755 --- a/t/t5800-remote-helpers.sh +++ b/t/t5800-remote-helpers.sh @@ -7,9 +7,15 @@ test_description='Test remote-helper import and export commands' . ./test-lib.sh -if ! test_have_prereq PYTHON +if test_have_prereq PYTHON && "$PYTHON_PATH" -c ' +import sys +if sys.hexversion < 0x02050000: + sys.exit(1) +' then - say 'skipping git remote-testgit tests: requires Python support' + : +else + say 'skipping git remote-testgit tests: requires Python 2.5 or newer' test_done fi From 53dfac44c93d5861f0ab60fc38e1a2d3b67e8c62 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Tue, 1 Jun 2010 19:13:41 -0500 Subject: [PATCH 2/7] git-request-pull.sh: remove -e switch to shell interpreter which breaks ksh The -e option causes the shell to exit immediately when a command exits with a non-zero exit status. This does not seem to cause a problem for Bash, but it does cause a problem for the Korn shell, like Solaris's xpg4/sh, whose unset utility returns non-zero if it is passed a variable name which was not previously set. When using xpg4/sh, git-request-pull exits while sourcing git-sh-setup since git-sh-setup tries to unset the CDPATH environment variable. When git-request-pull was originally written, it did not do any error checking and it used this shell feature to exit when an error occurred. This script now performs proper error checking and provides useful error messages, so this -e option appears to be merely a historical artifact and can be removed. Kudos to Jonathan Nieder for introducing t5150 which exercises the request-pull code path. Suggested-by: Brandon Casey Signed-off-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- git-request-pull.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/git-request-pull.sh b/git-request-pull.sh index 74238b0313..6fdea397dd 100755 --- a/git-request-pull.sh +++ b/git-request-pull.sh @@ -1,4 +1,4 @@ -#!/bin/sh -e +#!/bin/sh # Copyright 2005, Ryan Anderson # # This file is licensed under the GPL v2, or a later version @@ -70,10 +70,10 @@ git show -s --format='The following changes since commit %H: %s (%ci) -are available in the git repository at:' $baserev -echo " $url $branch" -echo +are available in the git repository at:' $baserev && +echo " $url $branch" && +echo && -git shortlog ^$baserev $headrev -git diff -M --stat --summary $patch $merge_base..$headrev +git shortlog ^$baserev $headrev && +git diff -M --stat --summary $patch $merge_base..$headrev || exit exit $status From 6f89384fe0c5a131d055c19fffe22f8d087a0a7e Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Tue, 1 Jun 2010 19:13:42 -0500 Subject: [PATCH 3/7] t/t5150: remove space from sed script Solaris's xpg4/sed and IRIX's sed fail to parse these negated matching expressions when the '!' is separated from the command that follows. Signed-off-by: Brandon Casey Acked-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- t/t5150-request-pull.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh index 169d3ea376..9cc0a42ea9 100755 --- a/t/t5150-request-pull.sh +++ b/t/t5150-request-pull.sh @@ -67,7 +67,7 @@ test_expect_success 'setup: two scripts for reading pull requests' ' cat <<-\EOT >read-request.sed && #!/bin/sed -nf - / in the git repository at:$/! d + / in the git repository at:$/!d n /^$/ n s/^[ ]*\(.*\) \([^ ]*\)/please pull\ @@ -102,7 +102,7 @@ test_expect_success 'setup: two scripts for reading pull requests' ' /^ [a-zA-Z]/ n /^[a-zA-Z]* ([0-9]*):\$/ n /^\$/ N - /^\n[a-zA-Z]* ([0-9]*):\$/! { + /^\n[a-zA-Z]* ([0-9]*):\$/!{ a\\ SHORTLOG D From c289c315c2bfcd5fde99f9e4dbb109f89e29dfce Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Wed, 2 Jun 2010 10:32:26 -0500 Subject: [PATCH 4/7] t/t7006: ignore return status of shell's unset builtin The unset builtin of Solaris's xpg4/sh returns non-zero if it is passed a variable name which was not previously set. Since the unset is not likely to fail, ignore its return status, but add a semicolon as a clue that the '&&' was deliberately left off. Signed-off-by: Brandon Casey Acked-by: Jonathan Nieder Signed-off-by: Junio C Hamano --- t/t7006-pager.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh index 3bc7a2a796..a6f3677731 100755 --- a/t/t7006-pager.sh +++ b/t/t7006-pager.sh @@ -40,7 +40,7 @@ else fi test_expect_success 'setup' ' - unset GIT_PAGER GIT_PAGER_IN_USE && + unset GIT_PAGER GIT_PAGER_IN_USE; test_might_fail git config --unset core.pager && PAGER="cat >paginated.out" && @@ -159,7 +159,7 @@ test_expect_success 'color when writing to a file intended for a pager' ' ' test_expect_success 'determine default pager' ' - unset PAGER GIT_PAGER && + unset PAGER GIT_PAGER; test_might_fail git config --unset core.pager || cleanup_fail && @@ -173,7 +173,7 @@ then fi test_expect_success SIMPLEPAGER 'default pager is used by default' ' - unset PAGER GIT_PAGER && + unset PAGER GIT_PAGER; test_might_fail git config --unset core.pager && rm -f default_pager_used || cleanup_fail && @@ -192,7 +192,7 @@ test_expect_success SIMPLEPAGER 'default pager is used by default' ' ' test_expect_success TTY 'PAGER overrides default pager' ' - unset GIT_PAGER && + unset GIT_PAGER; test_might_fail git config --unset core.pager && rm -f PAGER_used || cleanup_fail && @@ -204,7 +204,7 @@ test_expect_success TTY 'PAGER overrides default pager' ' ' test_expect_success TTY 'core.pager overrides PAGER' ' - unset GIT_PAGER && + unset GIT_PAGER; rm -f core.pager_used || cleanup_fail && From 6508eedf670c180934db880b50a9a6b930acbf02 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Tue, 1 Jun 2010 19:13:44 -0500 Subject: [PATCH 5/7] t/aggregate-results: accomodate systems with small max argument list length IRIX 6.5 has a default maximum argument list length of 20480. The file glob that is passed to aggregate-results currently exceeds this length, and so the script cannot run successfully. Work around this issue by passing the file names in via the standard input rather than the argument list. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- t/Makefile | 4 +++- t/aggregate-results.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/t/Makefile b/t/Makefile index 25c559bb49..cd008a3c0f 100644 --- a/t/Makefile +++ b/t/Makefile @@ -35,7 +35,9 @@ aggregate-results-and-cleanup: $(T) $(MAKE) clean aggregate-results: - '$(SHELL_PATH_SQ)' ./aggregate-results.sh test-results/t*-* + for f in test-results/t*-*; do \ + echo "$$f"; \ + done | '$(SHELL_PATH_SQ)' ./aggregate-results.sh # we can test NO_OPTIMIZE_COMMITS independently of LC_ALL full-svn-test: diff --git a/t/aggregate-results.sh b/t/aggregate-results.sh index d5bab75d7d..d206b7c4cf 100755 --- a/t/aggregate-results.sh +++ b/t/aggregate-results.sh @@ -6,7 +6,7 @@ failed=0 broken=0 total=0 -for file +while read file do while read type value do From ae45732214a092baa8b78a5cea462e4a7a538165 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Wed, 9 Jun 2010 16:23:59 -0500 Subject: [PATCH 6/7] Makefile: add PYTHON_PATH to GIT-BUILD-OPTIONS The PYTHON_PATH environment variable is not set when running test scripts manually i.e. when not using 'make test'. Scripts which attempt to use this variable will fail. So add it to the list of variables written to the GIT-BUILD-OPTIONS file so that the test suite will import it when running the test scripts. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index d5d6565c86..7b5de0c873 100644 --- a/Makefile +++ b/Makefile @@ -1885,6 +1885,7 @@ GIT-CFLAGS: FORCE GIT-BUILD-OPTIONS: FORCE @echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@ @echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@ + @echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@ @echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@ @echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@ @echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@ From 23b093ee087e99049585487f59e262a0e0662b6e Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Wed, 9 Jun 2010 19:24:54 -0500 Subject: [PATCH 7/7] Remove python 2.5'isms The following python 2.5 features were worked around: * the sha module is used as a fallback when the hashlib module is not available * the 'any' built-in method was replaced with a 'for' loop * a conditional expression was replaced with an 'if' statement * the subprocess.check_call method was replaced by a call to subprocess.Popen followed by a call to subprocess.wait with a check of its return status These changes allow the python infrastructure to be used with python 2.4 which is distributed with RedHat's RHEL 5, for example. t5800 was updated to check for python >= 2.4 to reflect these changes. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- git-remote-testgit.py | 15 ++++++++++++--- git_remote_helpers/git/exporter.py | 4 +++- git_remote_helpers/git/importer.py | 4 +++- git_remote_helpers/git/non_local.py | 16 ++++++++++++---- git_remote_helpers/git/repo.py | 9 +++++++-- t/t5800-remote-helpers.sh | 4 ++-- 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/git-remote-testgit.py b/git-remote-testgit.py index 92539222c5..df9d512f1a 100644 --- a/git-remote-testgit.py +++ b/git-remote-testgit.py @@ -1,6 +1,12 @@ #!/usr/bin/env python -import hashlib +# hashlib is only available in python >= 2.5 +try: + import hashlib + _digest = hashlib.sha1 +except ImportError: + import sha + _digest = sha.new import sys import os sys.path.insert(0, os.getenv("GITPYTHONLIB",".")) @@ -19,7 +25,7 @@ def get_repo(alias, url): repo.get_revs() repo.get_head() - hasher = hashlib.sha1() + hasher = _digest() hasher.update(repo.path) repo.hash = hasher.hexdigest() @@ -133,7 +139,10 @@ def do_export(repo, args): path = os.path.join(dirname, 'testgit.marks') print path - print path if os.path.exists(path) else "" + if os.path.exists(path): + print path + else: + print "" sys.stdout.flush() update_local_repo(repo) diff --git a/git_remote_helpers/git/exporter.py b/git_remote_helpers/git/exporter.py index dfaab00b5f..f40f9d6a29 100644 --- a/git_remote_helpers/git/exporter.py +++ b/git_remote_helpers/git/exporter.py @@ -48,4 +48,6 @@ class GitExporter(object): args = ["sed", "s_refs/heads/_" + self.repo.prefix + "_g"] - subprocess.check_call(args, stdin=p1.stdout) + child = subprocess.Popen(args, stdin=p1.stdout) + if child.wait() != 0: + raise CalledProcessError diff --git a/git_remote_helpers/git/importer.py b/git_remote_helpers/git/importer.py index af2919d92c..70a712729b 100644 --- a/git_remote_helpers/git/importer.py +++ b/git_remote_helpers/git/importer.py @@ -35,4 +35,6 @@ class GitImporter(object): if os.path.exists(path): args.append("--import-marks=" + path) - subprocess.check_call(args) + child = subprocess.Popen(args) + if child.wait() != 0: + raise CalledProcessError diff --git a/git_remote_helpers/git/non_local.py b/git_remote_helpers/git/non_local.py index d75ef8f214..f27389bb94 100644 --- a/git_remote_helpers/git/non_local.py +++ b/git_remote_helpers/git/non_local.py @@ -29,7 +29,9 @@ class NonLocalGit(object): os.makedirs(path) args = ["git", "clone", "--bare", "--quiet", self.repo.gitpath, path] - subprocess.check_call(args) + child = subprocess.Popen(args) + if child.wait() != 0: + raise CalledProcessError return path @@ -43,10 +45,14 @@ class NonLocalGit(object): die("could not find repo at %s", path) args = ["git", "--git-dir=" + path, "fetch", "--quiet", self.repo.gitpath] - subprocess.check_call(args) + child = subprocess.Popen(args) + if child.wait() != 0: + raise CalledProcessError args = ["git", "--git-dir=" + path, "update-ref", "refs/heads/master", "FETCH_HEAD"] - subprocess.check_call(args) + child = subprocess.Popen(args) + if child.wait() != 0: + raise CalledProcessError def push(self, base): """Pushes from the non-local repo to base. @@ -58,4 +64,6 @@ class NonLocalGit(object): die("could not find repo at %s", path) args = ["git", "--git-dir=" + path, "push", "--quiet", self.repo.gitpath] - subprocess.check_call(args) + child = subprocess.Popen(args) + if child.wait() != 0: + raise CalledProcessError diff --git a/git_remote_helpers/git/repo.py b/git_remote_helpers/git/repo.py index 82d5f78c7e..58e1cdb560 100644 --- a/git_remote_helpers/git/repo.py +++ b/git_remote_helpers/git/repo.py @@ -19,7 +19,10 @@ def is_remote(url): prefixes = ["http", "file", "git"] - return any(url.startswith(i) for i in prefixes) + for prefix in prefixes: + if url.startswith(prefix): + return True + return False class GitRepo(object): """Repo object representing a repo. @@ -50,7 +53,9 @@ class GitRepo(object): path = ".cached_revs" ofile = open(path, "w") - subprocess.check_call(args, stdout=ofile) + child = subprocess.Popen(args, stdout=ofile) + if child.wait() != 0: + raise CalledProcessError output = open(path).readlines() self.revmap = dict(sanitize(i) for i in output) if "HEAD" in self.revmap: diff --git a/t/t5800-remote-helpers.sh b/t/t5800-remote-helpers.sh index 22c7df47fb..4ee7b65ce6 100755 --- a/t/t5800-remote-helpers.sh +++ b/t/t5800-remote-helpers.sh @@ -9,13 +9,13 @@ test_description='Test remote-helper import and export commands' if test_have_prereq PYTHON && "$PYTHON_PATH" -c ' import sys -if sys.hexversion < 0x02050000: +if sys.hexversion < 0x02040000: sys.exit(1) ' then : else - say 'skipping git remote-testgit tests: requires Python 2.5 or newer' + say 'skipping git remote-testgit tests: requires Python 2.4 or newer' test_done fi