Merge branch 'ms/ls-remote-exit-with-status'

* ms/ls-remote-exit-with-status:
  ls-remote: the --exit-code option reports "no matching refs"
This commit is contained in:
Junio C Hamano 2011-05-23 10:27:08 -07:00
commit 3c0ae619e6
3 changed files with 40 additions and 3 deletions

View File

@ -10,7 +10,7 @@ SYNOPSIS
-------- --------
[verse] [verse]
'git ls-remote' [--heads] [--tags] [-u <exec> | --upload-pack <exec>] 'git ls-remote' [--heads] [--tags] [-u <exec> | --upload-pack <exec>]
<repository> [<refs>...] [--exit-code] <repository> [<refs>...]
DESCRIPTION DESCRIPTION
----------- -----------
@ -36,6 +36,12 @@ OPTIONS
SSH and where the SSH daemon does not use the PATH configured by the SSH and where the SSH daemon does not use the PATH configured by the
user. user.
--exit-code::
Exit with status "2" when no matching refs are found in the remote
repository. Usually the command exits with status "0" to indicate
it successfully talked with the remote repository, whether it
found any matching refs.
<repository>:: <repository>::
Location of the repository. The shorthand defined in Location of the repository. The shorthand defined in
$GIT_DIR/branches/ can be used. Use "." (dot) to list references in $GIT_DIR/branches/ can be used. Use "." (dot) to list references in

View File

@ -5,7 +5,7 @@
static const char ls_remote_usage[] = static const char ls_remote_usage[] =
"git ls-remote [--heads] [--tags] [-u <exec> | --upload-pack <exec>]\n" "git ls-remote [--heads] [--tags] [-u <exec> | --upload-pack <exec>]\n"
" [-q|--quiet] [<repository> [<refs>...]]"; " [-q|--quiet] [--exit-code] [<repository> [<refs>...]]";
/* /*
* Is there one among the list of patterns that match the tail part * Is there one among the list of patterns that match the tail part
@ -35,6 +35,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
unsigned flags = 0; unsigned flags = 0;
int get_url = 0; int get_url = 0;
int quiet = 0; int quiet = 0;
int status = 0;
const char *uploadpack = NULL; const char *uploadpack = NULL;
const char **pattern = NULL; const char **pattern = NULL;
@ -74,6 +75,11 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
get_url = 1; get_url = 1;
continue; continue;
} }
if (!strcmp("--exit-code", arg)) {
/* return this code if no refs are reported */
status = 2;
continue;
}
usage(ls_remote_usage); usage(ls_remote_usage);
} }
dest = arg; dest = arg;
@ -121,6 +127,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
if (!tail_match(pattern, ref->name)) if (!tail_match(pattern, ref->name))
continue; continue;
printf("%s %s\n", sha1_to_hex(ref->old_sha1), ref->name); printf("%s %s\n", sha1_to_hex(ref->old_sha1), ref->name);
status = 0; /* we found something */
} }
return 0; return status;
} }

View File

@ -123,4 +123,28 @@ test_expect_success 'confuses pattern as remote when no remote specified' '
' '
test_expect_success 'die with non-2 for wrong repository even with --exit-code' '
git ls-remote --exit-code ./no-such-repository ;# not &&
status=$? &&
test $status != 2 && test $status != 0
'
test_expect_success 'Report success even when nothing matches' '
git ls-remote other.git "refs/nsn/*" >actual &&
>expect &&
test_cmp expect actual
'
test_expect_success 'Report no-match with --exit-code' '
test_expect_code 2 git ls-remote --exit-code other.git "refs/nsn/*" >actual &&
>expect &&
test_cmp expect actual
'
test_expect_success 'Report match with --exit-code' '
git ls-remote --exit-code other.git "refs/tags/*" >actual &&
git ls-remote . tags/mark >expect &&
test_cmp expect actual
'
test_done test_done