describe: when failing, tell the user about options that work
Users seem to call git-describe without reading the manpage, and then wonder why it doesn't work with unannotated tags by default. Make a minimal effort towards seeing if there would have been unannotated tags, and tell the user. Specifically, we say that --tags could work if we found any unannotated tags. If not, we say that --always would have given results. Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									cd0f8e6d63
								
							
						
					
					
						commit
						4d23660e79
					
				|  | @ -96,8 +96,6 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void | ||||||
| 	if (!all) { | 	if (!all) { | ||||||
| 		if (!prio) | 		if (!prio) | ||||||
| 			return 0; | 			return 0; | ||||||
| 		if (!tags && prio < 2) |  | ||||||
| 			return 0; |  | ||||||
| 	} | 	} | ||||||
| 	add_to_known_names(all ? path + 5 : path + 10, commit, prio, sha1); | 	add_to_known_names(all ? path + 5 : path + 10, commit, prio, sha1); | ||||||
| 	return 0; | 	return 0; | ||||||
|  | @ -184,6 +182,7 @@ static void describe(const char *arg, int last_one) | ||||||
| 	struct possible_tag all_matches[MAX_TAGS]; | 	struct possible_tag all_matches[MAX_TAGS]; | ||||||
| 	unsigned int match_cnt = 0, annotated_cnt = 0, cur_match; | 	unsigned int match_cnt = 0, annotated_cnt = 0, cur_match; | ||||||
| 	unsigned long seen_commits = 0; | 	unsigned long seen_commits = 0; | ||||||
|  | 	unsigned int unannotated_cnt = 0; | ||||||
|  |  | ||||||
| 	if (get_sha1(arg, sha1)) | 	if (get_sha1(arg, sha1)) | ||||||
| 		die("Not a valid object name %s", arg); | 		die("Not a valid object name %s", arg); | ||||||
|  | @ -217,7 +216,9 @@ static void describe(const char *arg, int last_one) | ||||||
| 		seen_commits++; | 		seen_commits++; | ||||||
| 		n = c->util; | 		n = c->util; | ||||||
| 		if (n) { | 		if (n) { | ||||||
| 			if (match_cnt < max_candidates) { | 			if (!tags && !all && n->prio < 2) { | ||||||
|  | 				unannotated_cnt++; | ||||||
|  | 			} else if (match_cnt < max_candidates) { | ||||||
| 				struct possible_tag *t = &all_matches[match_cnt++]; | 				struct possible_tag *t = &all_matches[match_cnt++]; | ||||||
| 				t->name = n; | 				t->name = n; | ||||||
| 				t->depth = seen_commits - 1; | 				t->depth = seen_commits - 1; | ||||||
|  | @ -259,7 +260,14 @@ static void describe(const char *arg, int last_one) | ||||||
| 			printf("%s\n", find_unique_abbrev(sha1, abbrev)); | 			printf("%s\n", find_unique_abbrev(sha1, abbrev)); | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		die("cannot describe '%s'", sha1_to_hex(sha1)); | 		if (unannotated_cnt) | ||||||
|  | 			die("No annotated tags can describe '%s'.\n" | ||||||
|  | 			    "However, there were unannotated tags: try --tags.", | ||||||
|  | 			    sha1_to_hex(sha1)); | ||||||
|  | 		else | ||||||
|  | 			die("No tags can describe '%s'.\n" | ||||||
|  | 			    "Try --always, or create some tags.", | ||||||
|  | 			    sha1_to_hex(sha1)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qsort(all_matches, match_cnt, sizeof(all_matches[0]), compare_pt); | 	qsort(all_matches, match_cnt, sizeof(all_matches[0]), compare_pt); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Thomas Rast
						Thomas Rast