builtin-remote: split show_or_prune() in two separate functions
This allow us to add different features to each of them and keep the code simple at the same time. Also create a get_remote_ref_states() to avoid duplicated code. Signed-off-by: Olivier Marin <dkr@freesurf.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									0ecfcb3b70
								
							
						
					
					
						commit
						67a7e2d071
					
				|  | @ -419,7 +419,32 @@ static void show_list(const char *title, struct path_list *list) | ||||||
| 	printf("\n"); | 	printf("\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int show_or_prune(int argc, const char **argv, int prune) | static int get_remote_ref_states(const char *name, | ||||||
|  | 				 struct ref_states *states, | ||||||
|  | 				 int query) | ||||||
|  | { | ||||||
|  | 	struct transport *transport; | ||||||
|  | 	const struct ref *ref; | ||||||
|  |  | ||||||
|  | 	states->remote = remote_get(name); | ||||||
|  | 	if (!states->remote) | ||||||
|  | 		return error("No such remote: %s", name); | ||||||
|  |  | ||||||
|  | 	read_branches(); | ||||||
|  |  | ||||||
|  | 	if (query) { | ||||||
|  | 		transport = transport_get(NULL, states->remote->url_nr > 0 ? | ||||||
|  | 			states->remote->url[0] : NULL); | ||||||
|  | 		ref = transport_get_remote_refs(transport); | ||||||
|  | 		transport_disconnect(transport); | ||||||
|  |  | ||||||
|  | 		get_ref_states(ref, states); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int show(int argc, const char **argv) | ||||||
| { | { | ||||||
| 	int no_query = 0, result = 0; | 	int no_query = 0, result = 0; | ||||||
| 	struct option options[] = { | 	struct option options[] = { | ||||||
|  | @ -431,42 +456,15 @@ static int show_or_prune(int argc, const char **argv, int prune) | ||||||
|  |  | ||||||
| 	argc = parse_options(argc, argv, options, builtin_remote_usage, 0); | 	argc = parse_options(argc, argv, options, builtin_remote_usage, 0); | ||||||
|  |  | ||||||
| 	if (argc < 1) { | 	if (argc < 1) | ||||||
| 		if (!prune) |  | ||||||
| 		return show_all(); | 		return show_all(); | ||||||
| 		usage_with_options(builtin_remote_usage, options); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	memset(&states, 0, sizeof(states)); | 	memset(&states, 0, sizeof(states)); | ||||||
| 	for (; argc; argc--, argv++) { | 	for (; argc; argc--, argv++) { | ||||||
| 		struct transport *transport; |  | ||||||
| 		const struct ref *ref; |  | ||||||
| 		struct strbuf buf; | 		struct strbuf buf; | ||||||
| 		int i; | 		int i; | ||||||
|  |  | ||||||
| 		states.remote = remote_get(*argv); | 		get_remote_ref_states(*argv, &states, !no_query); | ||||||
| 		if (!states.remote) |  | ||||||
| 			return error("No such remote: %s", *argv); |  | ||||||
|  |  | ||||||
| 		read_branches(); |  | ||||||
|  |  | ||||||
| 		if (!no_query) { |  | ||||||
| 			transport = transport_get(NULL, |  | ||||||
| 				states.remote->url_nr > 0 ? |  | ||||||
| 				states.remote->url[0] : NULL); |  | ||||||
| 			ref = transport_get_remote_refs(transport); |  | ||||||
| 			transport_disconnect(transport); |  | ||||||
|  |  | ||||||
| 			get_ref_states(ref, &states); |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (prune) { |  | ||||||
| 			for (i = 0; i < states.stale.nr; i++) { |  | ||||||
| 				const char *refname = states.stale.items[i].util; |  | ||||||
| 				result |= delete_ref(refname, NULL); |  | ||||||
| 			} |  | ||||||
| 			goto cleanup_states; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		printf("* remote %s\n  URL: %s\n", *argv, | 		printf("* remote %s\n  URL: %s\n", *argv, | ||||||
| 			states.remote->url_nr > 0 ? | 			states.remote->url_nr > 0 ? | ||||||
|  | @ -513,7 +511,42 @@ static int show_or_prune(int argc, const char **argv, int prune) | ||||||
| 			} | 			} | ||||||
| 			printf("\n"); | 			printf("\n"); | ||||||
| 		} | 		} | ||||||
| cleanup_states: |  | ||||||
|  | 		/* NEEDSWORK: free remote */ | ||||||
|  | 		path_list_clear(&states.new, 0); | ||||||
|  | 		path_list_clear(&states.stale, 0); | ||||||
|  | 		path_list_clear(&states.tracked, 0); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return result; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int prune(int argc, const char **argv) | ||||||
|  | { | ||||||
|  | 	int no_query = 0, result = 0; | ||||||
|  | 	struct option options[] = { | ||||||
|  | 		OPT_GROUP("prune specific options"), | ||||||
|  | 		OPT_BOOLEAN('n', NULL, &no_query, "do not query remotes"), | ||||||
|  | 		OPT_END() | ||||||
|  | 	}; | ||||||
|  | 	struct ref_states states; | ||||||
|  |  | ||||||
|  | 	argc = parse_options(argc, argv, options, builtin_remote_usage, 0); | ||||||
|  |  | ||||||
|  | 	if (argc < 1) | ||||||
|  | 		usage_with_options(builtin_remote_usage, options); | ||||||
|  |  | ||||||
|  | 	memset(&states, 0, sizeof(states)); | ||||||
|  | 	for (; argc; argc--, argv++) { | ||||||
|  | 		int i; | ||||||
|  |  | ||||||
|  | 		get_remote_ref_states(*argv, &states, !no_query); | ||||||
|  |  | ||||||
|  | 		for (i = 0; i < states.stale.nr; i++) { | ||||||
|  | 			const char *refname = states.stale.items[i].util; | ||||||
|  | 			result |= delete_ref(refname, NULL); | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		/* NEEDSWORK: free remote */ | 		/* NEEDSWORK: free remote */ | ||||||
| 		path_list_clear(&states.new, 0); | 		path_list_clear(&states.new, 0); | ||||||
| 		path_list_clear(&states.stale, 0); | 		path_list_clear(&states.stale, 0); | ||||||
|  | @ -634,9 +667,9 @@ int cmd_remote(int argc, const char **argv, const char *prefix) | ||||||
| 	else if (!strcmp(argv[0], "rm")) | 	else if (!strcmp(argv[0], "rm")) | ||||||
| 		result = rm(argc, argv); | 		result = rm(argc, argv); | ||||||
| 	else if (!strcmp(argv[0], "show")) | 	else if (!strcmp(argv[0], "show")) | ||||||
| 		result = show_or_prune(argc, argv, 0); | 		result = show(argc, argv); | ||||||
| 	else if (!strcmp(argv[0], "prune")) | 	else if (!strcmp(argv[0], "prune")) | ||||||
| 		result = show_or_prune(argc, argv, 1); | 		result = prune(argc, argv); | ||||||
| 	else if (!strcmp(argv[0], "update")) | 	else if (!strcmp(argv[0], "update")) | ||||||
| 		result = update(argc, argv); | 		result = update(argc, argv); | ||||||
| 	else { | 	else { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Olivier Marin
						Olivier Marin