Merge branch 'jl/add-n-ignore-missing'
* jl/add-n-ignore-missing: git add: Add the "--ignore-missing" option for the dry runmaint
						commit
						8fbe9b32ce
					
				|  | @ -57,7 +57,8 @@ OPTIONS | ||||||
|  |  | ||||||
| -n:: | -n:: | ||||||
| --dry-run:: | --dry-run:: | ||||||
|         Don't actually add the file(s), just show if they exist. | 	Don't actually add the file(s), just show if they exist and/or will | ||||||
|  | 	be ignored. | ||||||
|  |  | ||||||
| -v:: | -v:: | ||||||
| --verbose:: | --verbose:: | ||||||
|  | @ -131,6 +132,12 @@ subdirectories. | ||||||
| 	them, do not abort the operation, but continue adding the | 	them, do not abort the operation, but continue adding the | ||||||
| 	others. The command shall still exit with non-zero status. | 	others. The command shall still exit with non-zero status. | ||||||
|  |  | ||||||
|  | --ignore-missing:: | ||||||
|  | 	This option can only be used together with --dry-run. By using | ||||||
|  | 	this option the user can check if any of the given files would | ||||||
|  | 	be ignored, no matter if they are already present in the work | ||||||
|  | 	tree or not. | ||||||
|  |  | ||||||
| \--:: | \--:: | ||||||
| 	This option can be used to separate command-line options from | 	This option can be used to separate command-line options from | ||||||
| 	the list of files, (useful when filenames might be mistaken | 	the list of files, (useful when filenames might be mistaken | ||||||
|  |  | ||||||
|  | @ -310,7 +310,7 @@ static const char ignore_error[] = | ||||||
| "The following paths are ignored by one of your .gitignore files:\n"; | "The following paths are ignored by one of your .gitignore files:\n"; | ||||||
|  |  | ||||||
| static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0; | static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0; | ||||||
| static int ignore_add_errors, addremove, intent_to_add; | static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0; | ||||||
|  |  | ||||||
| static struct option builtin_add_options[] = { | static struct option builtin_add_options[] = { | ||||||
| 	OPT__DRY_RUN(&show_only), | 	OPT__DRY_RUN(&show_only), | ||||||
|  | @ -325,6 +325,7 @@ static struct option builtin_add_options[] = { | ||||||
| 	OPT_BOOLEAN('A', "all", &addremove, "add all, noticing removal of tracked files"), | 	OPT_BOOLEAN('A', "all", &addremove, "add all, noticing removal of tracked files"), | ||||||
| 	OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"), | 	OPT_BOOLEAN( 0 , "refresh", &refresh_only, "don't add, only refresh the index"), | ||||||
| 	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"), | 	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, "just skip files which cannot be added because of errors"), | ||||||
|  | 	OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, "check if - even missing - files are ignored in dry run"), | ||||||
| 	OPT_END(), | 	OPT_END(), | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -385,6 +386,8 @@ int cmd_add(int argc, const char **argv, const char *prefix) | ||||||
|  |  | ||||||
| 	if (addremove && take_worktree_changes) | 	if (addremove && take_worktree_changes) | ||||||
| 		die("-A and -u are mutually incompatible"); | 		die("-A and -u are mutually incompatible"); | ||||||
|  | 	if (!show_only && ignore_missing) | ||||||
|  | 		die("Option --ignore-missing can only be used together with --dry-run"); | ||||||
| 	if ((addremove || take_worktree_changes) && !argc) { | 	if ((addremove || take_worktree_changes) && !argc) { | ||||||
| 		static const char *here[2] = { ".", NULL }; | 		static const char *here[2] = { ".", NULL }; | ||||||
| 		argc = 1; | 		argc = 1; | ||||||
|  | @ -441,10 +444,15 @@ int cmd_add(int argc, const char **argv, const char *prefix) | ||||||
| 			seen = find_used_pathspec(pathspec); | 			seen = find_used_pathspec(pathspec); | ||||||
| 		for (i = 0; pathspec[i]; i++) { | 		for (i = 0; pathspec[i]; i++) { | ||||||
| 			if (!seen[i] && pathspec[i][0] | 			if (!seen[i] && pathspec[i][0] | ||||||
| 			    && !file_exists(pathspec[i])) | 			    && !file_exists(pathspec[i])) { | ||||||
|  | 				if (ignore_missing) { | ||||||
|  | 					if (excluded(&dir, pathspec[i], DT_UNKNOWN)) | ||||||
|  | 						dir_add_ignored(&dir, pathspec[i], strlen(pathspec[i])); | ||||||
|  | 				} else | ||||||
| 					die("pathspec '%s' did not match any files", | 					die("pathspec '%s' did not match any files", | ||||||
| 					    pathspec[i]); | 					    pathspec[i]); | ||||||
| 			} | 			} | ||||||
|  | 		} | ||||||
| 		free(seen); | 		free(seen); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								dir.c
								
								
								
								
							
							
						
						
									
										2
									
								
								dir.c
								
								
								
								
							|  | @ -453,7 +453,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathna | ||||||
| 	return dir->entries[dir->nr++] = dir_entry_new(pathname, len); | 	return dir->entries[dir->nr++] = dir_entry_new(pathname, len); | ||||||
| } | } | ||||||
|  |  | ||||||
| static struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len) | struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len) | ||||||
| { | { | ||||||
| 	if (!cache_name_is_other(pathname, len)) | 	if (!cache_name_is_other(pathname, len)) | ||||||
| 		return NULL; | 		return NULL; | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								dir.h
								
								
								
								
							
							
						
						
									
										1
									
								
								dir.h
								
								
								
								
							|  | @ -72,6 +72,7 @@ extern int read_directory(struct dir_struct *, const char *path, int len, const | ||||||
| extern int excluded_from_list(const char *pathname, int pathlen, const char *basename, | extern int excluded_from_list(const char *pathname, int pathlen, const char *basename, | ||||||
| 			      int *dtype, struct exclude_list *el); | 			      int *dtype, struct exclude_list *el); | ||||||
| extern int excluded(struct dir_struct *, const char *, int *); | extern int excluded(struct dir_struct *, const char *, int *); | ||||||
|  | struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len); | ||||||
| extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, | extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, | ||||||
| 					  char **buf_p, struct exclude_list *which, int check_index); | 					  char **buf_p, struct exclude_list *which, int check_index); | ||||||
| extern void add_excludes_from_file(struct dir_struct *, const char *fname); | extern void add_excludes_from_file(struct dir_struct *, const char *fname); | ||||||
|  |  | ||||||
|  | @ -260,4 +260,29 @@ test_expect_success '"add non-existent" should fail' ' | ||||||
| 	! (git ls-files | grep "non-existent") | 	! (git ls-files | grep "non-existent") | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'git add --dry-run of existing changed file' " | ||||||
|  | 	echo new >>track-this && | ||||||
|  | 	git add --dry-run track-this >actual 2>&1 && | ||||||
|  | 	echo \"add 'track-this'\" | test_cmp - actual | ||||||
|  | " | ||||||
|  |  | ||||||
|  | test_expect_success 'git add --dry-run of non-existing file' " | ||||||
|  | 	echo ignored-file >>.gitignore && | ||||||
|  | 	! (git add --dry-run track-this ignored-file >actual 2>&1) && | ||||||
|  | 	echo \"fatal: pathspec 'ignored-file' did not match any files\" | test_cmp - actual | ||||||
|  | " | ||||||
|  |  | ||||||
|  | cat >expect <<EOF | ||||||
|  | The following paths are ignored by one of your .gitignore files: | ||||||
|  | ignored-file | ||||||
|  | Use -f if you really want to add them. | ||||||
|  | fatal: no files added | ||||||
|  | add 'track-this' | ||||||
|  | EOF | ||||||
|  |  | ||||||
|  | test_expect_success 'git add --dry-run --ignore-missing of non-existing file' ' | ||||||
|  | 	!(git add --dry-run --ignore-missing track-this ignored-file >actual 2>&1) && | ||||||
|  | 	test_cmp expect actual | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano