Merge branch 'cb/maint-ls-files-error-report'
* cb/maint-ls-files-error-report: ls-files: fix pathspec display on errormaint
						commit
						6133e4da54
					
				|  | @ -201,7 +201,7 @@ static int checkout_merged(int pos, struct checkout *state) | ||||||
| } | } | ||||||
|  |  | ||||||
| static int checkout_paths(struct tree *source_tree, const char **pathspec, | static int checkout_paths(struct tree *source_tree, const char **pathspec, | ||||||
| 			  struct checkout_opts *opts) | 			  const char *prefix, struct checkout_opts *opts) | ||||||
| { | { | ||||||
| 	int pos; | 	int pos; | ||||||
| 	struct checkout state; | 	struct checkout state; | ||||||
|  | @ -231,7 +231,7 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, | ||||||
| 		match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched); | 		match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (report_path_error(ps_matched, pathspec, 0)) | 	if (report_path_error(ps_matched, pathspec, prefix)) | ||||||
| 		return 1; | 		return 1; | ||||||
|  |  | ||||||
| 	/* "checkout -m path" to recreate conflicted state */ | 	/* "checkout -m path" to recreate conflicted state */ | ||||||
|  | @ -1064,7 +1064,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) | ||||||
| 		if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge) | 		if (1 < !!opts.writeout_stage + !!opts.force + !!opts.merge) | ||||||
| 			die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.")); | 			die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\nchecking out of the index.")); | ||||||
|  |  | ||||||
| 		return checkout_paths(source_tree, pathspec, &opts); | 		return checkout_paths(source_tree, pathspec, prefix, &opts); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (patch_mode) | 	if (patch_mode) | ||||||
|  |  | ||||||
|  | @ -274,7 +274,7 @@ static int list_paths(struct string_list *list, const char *with_tree, | ||||||
| 			item->util = item; /* better a valid pointer than a fake one */ | 			item->util = item; /* better a valid pointer than a fake one */ | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return report_path_error(m, pattern, prefix ? strlen(prefix) : 0); | 	return report_path_error(m, pattern, prefix); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void add_remove_files(struct string_list *list) | static void add_remove_files(struct string_list *list) | ||||||
|  |  | ||||||
|  | @ -353,11 +353,13 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| int report_path_error(const char *ps_matched, const char **pathspec, int prefix_len) | int report_path_error(const char *ps_matched, const char **pathspec, const char *prefix) | ||||||
| { | { | ||||||
| 	/* | 	/* | ||||||
| 	 * Make sure all pathspec matched; otherwise it is an error. | 	 * Make sure all pathspec matched; otherwise it is an error. | ||||||
| 	 */ | 	 */ | ||||||
|  | 	struct strbuf sb = STRBUF_INIT; | ||||||
|  | 	const char *name; | ||||||
| 	int num, errors = 0; | 	int num, errors = 0; | ||||||
| 	for (num = 0; pathspec[num]; num++) { | 	for (num = 0; pathspec[num]; num++) { | ||||||
| 		int other, found_dup; | 		int other, found_dup; | ||||||
|  | @ -382,10 +384,12 @@ int report_path_error(const char *ps_matched, const char **pathspec, int prefix_ | ||||||
| 		if (found_dup) | 		if (found_dup) | ||||||
| 			continue; | 			continue; | ||||||
|  |  | ||||||
|  | 		name = quote_path_relative(pathspec[num], -1, &sb, prefix); | ||||||
| 		error("pathspec '%s' did not match any file(s) known to git.", | 		error("pathspec '%s' did not match any file(s) known to git.", | ||||||
| 		      pathspec[num] + prefix_len); | 		      name); | ||||||
| 		errors++; | 		errors++; | ||||||
| 	} | 	} | ||||||
|  | 	strbuf_release(&sb); | ||||||
| 	return errors; | 	return errors; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -577,7 +581,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) | ||||||
|  |  | ||||||
| 	if (ps_matched) { | 	if (ps_matched) { | ||||||
| 		int bad; | 		int bad; | ||||||
| 		bad = report_path_error(ps_matched, pathspec, prefix_len); | 		bad = report_path_error(ps_matched, pathspec, prefix); | ||||||
| 		if (bad) | 		if (bad) | ||||||
| 			fprintf(stderr, "Did you forget to 'git add'?\n"); | 			fprintf(stderr, "Did you forget to 'git add'?\n"); | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								cache.h
								
								
								
								
							
							
						
						
									
										2
									
								
								cache.h
								
								
								
								
							|  | @ -1195,7 +1195,7 @@ extern int ws_blank_line(const char *line, int len, unsigned ws_rule); | ||||||
| #define ws_tab_width(rule)     ((rule) & WS_TAB_WIDTH_MASK) | #define ws_tab_width(rule)     ((rule) & WS_TAB_WIDTH_MASK) | ||||||
|  |  | ||||||
| /* ls-files */ | /* ls-files */ | ||||||
| int report_path_error(const char *ps_matched, const char **pathspec, int prefix_offset); | int report_path_error(const char *ps_matched, const char **pathspec, const char *prefix); | ||||||
| void overlay_tree_on_cache(const char *tree_name, const char *prefix); | void overlay_tree_on_cache(const char *tree_name, const char *prefix); | ||||||
|  |  | ||||||
| char *alias_lookup(const char *alias); | char *alias_lookup(const char *alias); | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								quote.c
								
								
								
								
							
							
						
						
									
										6
									
								
								quote.c
								
								
								
								
							|  | @ -325,8 +325,12 @@ static const char *path_relative(const char *in, int len, | ||||||
|  |  | ||||||
| 	if (len < 0) | 	if (len < 0) | ||||||
| 		len = strlen(in); | 		len = strlen(in); | ||||||
| 	if (prefix && prefix_len < 0) | 	if (prefix_len < 0) { | ||||||
|  | 		if (prefix) | ||||||
| 			prefix_len = strlen(prefix); | 			prefix_len = strlen(prefix); | ||||||
|  | 		else | ||||||
|  | 			prefix_len = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	off = 0; | 	off = 0; | ||||||
| 	i = 0; | 	i = 0; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,70 @@ | ||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | test_description='ls-files tests with relative paths | ||||||
|  |  | ||||||
|  | This test runs git ls-files with various relative path arguments. | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | . ./test-lib.sh | ||||||
|  |  | ||||||
|  | new_line=' | ||||||
|  | ' | ||||||
|  | sq=\' | ||||||
|  |  | ||||||
|  | test_expect_success 'prepare' ' | ||||||
|  | 	: >never-mind-me && | ||||||
|  | 	git add never-mind-me && | ||||||
|  | 	mkdir top && | ||||||
|  | 	( | ||||||
|  | 		cd top && | ||||||
|  | 		mkdir sub && | ||||||
|  | 		x="x xa xbc xdef xghij xklmno" && | ||||||
|  | 		y=$(echo "$x" | tr x y) && | ||||||
|  | 		touch $x && | ||||||
|  | 		touch $y && | ||||||
|  | 		cd sub && | ||||||
|  | 		git add ../x* | ||||||
|  | 	) | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ls-files with mixed levels' ' | ||||||
|  | 	( | ||||||
|  | 		cd top/sub && | ||||||
|  | 		cat >expect <<-EOF && | ||||||
|  | 		../../never-mind-me | ||||||
|  | 		../x | ||||||
|  | 		EOF | ||||||
|  | 		git ls-files $(cat expect) >actual && | ||||||
|  | 		test_cmp expect actual | ||||||
|  | 	) | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ls-files -c' ' | ||||||
|  | 	( | ||||||
|  | 		cd top/sub && | ||||||
|  | 		for f in ../y* | ||||||
|  | 		do | ||||||
|  | 			echo "error: pathspec $sq$f$sq did not match any file(s) known to git." | ||||||
|  | 		done >expect && | ||||||
|  | 		echo "Did you forget to ${sq}git add${sq}?" >>expect && | ||||||
|  | 		ls ../x* >>expect && | ||||||
|  | 		test_must_fail git ls-files -c --error-unmatch ../[xy]* >actual 2>&1 && | ||||||
|  | 		test_cmp expect actual | ||||||
|  | 	) | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'ls-files -o' ' | ||||||
|  | 	( | ||||||
|  | 		cd top/sub && | ||||||
|  | 		for f in ../x* | ||||||
|  | 		do | ||||||
|  | 			echo "error: pathspec $sq$f$sq did not match any file(s) known to git." | ||||||
|  | 		done >expect && | ||||||
|  | 		echo "Did you forget to ${sq}git add${sq}?" >>expect && | ||||||
|  | 		ls ../y* >>expect && | ||||||
|  | 		test_must_fail git ls-files -o --error-unmatch ../[xy]* >actual 2>&1 && | ||||||
|  | 		test_cmp expect actual | ||||||
|  | 	) | ||||||
|  | ' | ||||||
|  |  | ||||||
|  | test_done | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano