ls-remote: add support for showing symrefs
Sometimes it's useful to know the main branch of a git repository without actually downloading the repository. This can be done by looking at the symrefs stored in the remote repository. Currently git doesn't provide a simple way to show the symrefs stored on the remote repository, even though the information is available. Add a --symref command line argument to the ls-remote command, which shows the symrefs in the remote repository. While there, replace a literal tab in the format string with \t to make it more obvious to the reader. Suggested-by: pedro rijo <pedrorijo91@gmail.com> Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		 Thomas Gummerer
					Thomas Gummerer
				
			
				
					committed by
					
						 Junio C Hamano
						Junio C Hamano
					
				
			
			
				
	
			
			
			 Junio C Hamano
						Junio C Hamano
					
				
			
						parent
						
							ba5f28bf79
						
					
				
				
					commit
					99c08d4eb2
				
			| @ -10,7 +10,8 @@ SYNOPSIS | |||||||
| -------- | -------- | ||||||
| [verse] | [verse] | ||||||
| 'git ls-remote' [--heads] [--tags] [--refs] [--upload-pack=<exec>] | 'git ls-remote' [--heads] [--tags] [--refs] [--upload-pack=<exec>] | ||||||
| 	      [-q | --quiet] [--exit-code] [--get-url] [<repository> [<refs>...]] | 	      [-q | --quiet] [--exit-code] [--get-url] | ||||||
|  | 	      [--symref] [<repository> [<refs>...]] | ||||||
|  |  | ||||||
| DESCRIPTION | DESCRIPTION | ||||||
| ----------- | ----------- | ||||||
| @ -53,6 +54,12 @@ OPTIONS | |||||||
| 	"url.<base>.insteadOf" config setting (See linkgit:git-config[1]) and | 	"url.<base>.insteadOf" config setting (See linkgit:git-config[1]) and | ||||||
| 	exit without talking to the remote. | 	exit without talking to the remote. | ||||||
|  |  | ||||||
|  | --symref:: | ||||||
|  | 	In addition to the object pointed by it, show the underlying | ||||||
|  | 	ref pointed by it when showing a symbolic ref.  Currently, | ||||||
|  | 	upload-pack only shows the symref HEAD, so it will be the only | ||||||
|  | 	one shown by ls-remote. | ||||||
|  |  | ||||||
| <repository>:: | <repository>:: | ||||||
| 	The "remote" repository to query.  This parameter can be | 	The "remote" repository to query.  This parameter can be | ||||||
| 	either a URL or the name of a remote (see the GIT URLS and | 	either a URL or the name of a remote (see the GIT URLS and | ||||||
|  | |||||||
| @ -5,7 +5,8 @@ | |||||||
|  |  | ||||||
| static const char * const ls_remote_usage[] = { | static const char * const ls_remote_usage[] = { | ||||||
| 	N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" | 	N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=<exec>]\n" | ||||||
| 	   "                     [-q | --quiet] [--exit-code] [--get-url] [<repository> [<refs>...]]"), | 	   "                     [-q | --quiet] [--exit-code] [--get-url]\n" | ||||||
|  | 	   "                     [--symref] [<repository> [<refs>...]]"), | ||||||
| 	NULL | 	NULL | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @ -37,6 +38,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) | |||||||
| 	int get_url = 0; | 	int get_url = 0; | ||||||
| 	int quiet = 0; | 	int quiet = 0; | ||||||
| 	int status = 0; | 	int status = 0; | ||||||
|  | 	int show_symref_target = 0; | ||||||
| 	const char *uploadpack = NULL; | 	const char *uploadpack = NULL; | ||||||
| 	const char **pattern = NULL; | 	const char **pattern = NULL; | ||||||
|  |  | ||||||
| @ -58,6 +60,8 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) | |||||||
| 			 N_("take url.<base>.insteadOf into account")), | 			 N_("take url.<base>.insteadOf into account")), | ||||||
| 		OPT_SET_INT(0, "exit-code", &status, | 		OPT_SET_INT(0, "exit-code", &status, | ||||||
| 			    N_("exit with exit code 2 if no matching refs are found"), 2), | 			    N_("exit with exit code 2 if no matching refs are found"), 2), | ||||||
|  | 		OPT_BOOL(0, "symref", &show_symref_target, | ||||||
|  | 			 N_("show underlying ref in addition to the object pointed by it")), | ||||||
| 		OPT_END() | 		OPT_END() | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| @ -101,7 +105,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) | |||||||
| 			continue; | 			continue; | ||||||
| 		if (!tail_match(pattern, ref->name)) | 		if (!tail_match(pattern, ref->name)) | ||||||
| 			continue; | 			continue; | ||||||
| 		printf("%s	%s\n", oid_to_hex(&ref->old_oid), ref->name); | 		if (show_symref_target && ref->symref) | ||||||
|  | 			printf("ref: %s\t%s\n", ref->symref, ref->name); | ||||||
|  | 		printf("%s\t%s\n", oid_to_hex(&ref->old_oid), ref->name); | ||||||
| 		status = 0; /* we found something */ | 		status = 0; /* we found something */ | ||||||
| 	} | 	} | ||||||
| 	return status; | 	return status; | ||||||
|  | |||||||
| @ -163,4 +163,49 @@ test_expect_success 'overrides work between mixed transfer/upload-pack hideRefs' | |||||||
| 	grep refs/tags/magic actual | 	grep refs/tags/magic actual | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ls-remote --symref' ' | ||||||
|  | 	cat >expect <<-\EOF && | ||||||
|  | 	ref: refs/heads/master	HEAD | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	HEAD | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/heads/master | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/remotes/origin/HEAD | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/remotes/origin/master | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/tags/mark | ||||||
|  | 	EOF | ||||||
|  | 	git ls-remote --symref >actual && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ls-remote with filtered symref (refname)' ' | ||||||
|  | 	cat >expect <<-\EOF && | ||||||
|  | 	ref: refs/heads/master	HEAD | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	HEAD | ||||||
|  | 	EOF | ||||||
|  | 	git ls-remote --symref . HEAD >actual && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_failure 'ls-remote with filtered symref (--heads)' ' | ||||||
|  | 	git symbolic-ref refs/heads/foo refs/tags/mark && | ||||||
|  | 	cat >expect <<-\EOF && | ||||||
|  | 	ref: refs/tags/mark	refs/heads/foo | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/heads/foo | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/heads/master | ||||||
|  | 	EOF | ||||||
|  | 	git ls-remote --symref --heads . >actual && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ls-remote --symref omits filtered-out matches' ' | ||||||
|  | 	cat >expect <<-\EOF && | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/heads/foo | ||||||
|  | 	1bd44cb9d13204b0fe1958db0082f5028a16eb3a	refs/heads/master | ||||||
|  | 	EOF | ||||||
|  | 	git ls-remote --symref --heads . >actual && | ||||||
|  | 	test_cmp expect actual && | ||||||
|  | 	git ls-remote --symref . "refs/heads/*" >actual && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user