Merge branch 'jk/options-cleanup'
Various clean-ups to the command line option parsing. * jk/options-cleanup: apply, ls-files: simplify "-z" parsing checkout-index: disallow "--no-stage" option checkout-index: handle "--no-index" option checkout-index: handle "--no-prefix" option checkout-index: simplify "-z" option parsing give "nbuf" strbuf a more meaningful namemaint
						commit
						722c924445
					
				|  | @ -4464,16 +4464,6 @@ static int option_parse_p(const struct option *opt, | |||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int option_parse_z(const struct option *opt, | ||||
| 			  const char *arg, int unset) | ||||
| { | ||||
| 	if (unset) | ||||
| 		line_termination = '\n'; | ||||
| 	else | ||||
| 		line_termination = 0; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int option_parse_space_change(const struct option *opt, | ||||
| 			  const char *arg, int unset) | ||||
| { | ||||
|  | @ -4546,9 +4536,9 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) | |||
| 			 N_( "attempt three-way merge if a patch does not apply")), | ||||
| 		OPT_FILENAME(0, "build-fake-ancestor", &fake_ancestor, | ||||
| 			N_("build a temporary index based on embedded index information")), | ||||
| 		{ OPTION_CALLBACK, 'z', NULL, NULL, NULL, | ||||
| 			N_("paths are separated with NUL character"), | ||||
| 			PARSE_OPT_NOARG, option_parse_z }, | ||||
| 		/* Think twice before adding "--nul" synonym to this */ | ||||
| 		OPT_SET_INT('z', NULL, &line_termination, | ||||
| 			N_("paths are separated with NUL character"), '\0'), | ||||
| 		OPT_INTEGER('C', NULL, &p_context, | ||||
| 				N_("ensure at least <n> lines of context match")), | ||||
| 		{ OPTION_CALLBACK, 0, "whitespace", &whitespace_option, N_("action"), | ||||
|  |  | |||
|  | @ -72,24 +72,23 @@ static void check_attr(const char *prefix, int cnt, | |||
| static void check_attr_stdin_paths(const char *prefix, int cnt, | ||||
| 	struct git_attr_check *check) | ||||
| { | ||||
| 	struct strbuf buf, nbuf; | ||||
| 	struct strbuf buf = STRBUF_INIT; | ||||
| 	struct strbuf unquoted = STRBUF_INIT; | ||||
| 	strbuf_getline_fn getline_fn; | ||||
|  | ||||
| 	getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; | ||||
| 	strbuf_init(&buf, 0); | ||||
| 	strbuf_init(&nbuf, 0); | ||||
| 	while (getline_fn(&buf, stdin) != EOF) { | ||||
| 		if (!nul_term_line && buf.buf[0] == '"') { | ||||
| 			strbuf_reset(&nbuf); | ||||
| 			if (unquote_c_style(&nbuf, buf.buf, NULL)) | ||||
| 			strbuf_reset(&unquoted); | ||||
| 			if (unquote_c_style(&unquoted, buf.buf, NULL)) | ||||
| 				die("line is badly quoted"); | ||||
| 			strbuf_swap(&buf, &nbuf); | ||||
| 			strbuf_swap(&buf, &unquoted); | ||||
| 		} | ||||
| 		check_attr(prefix, cnt, check, buf.buf); | ||||
| 		maybe_flush_or_die(stdout, "attribute to stdout"); | ||||
| 	} | ||||
| 	strbuf_release(&buf); | ||||
| 	strbuf_release(&nbuf); | ||||
| 	strbuf_release(&unquoted); | ||||
| } | ||||
|  | ||||
| static NORETURN void error_with_usage(const char *msg) | ||||
|  |  | |||
|  | @ -115,20 +115,19 @@ static int check_ignore(struct dir_struct *dir, | |||
|  | ||||
| static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) | ||||
| { | ||||
| 	struct strbuf buf, nbuf; | ||||
| 	struct strbuf buf = STRBUF_INIT; | ||||
| 	struct strbuf unquoted = STRBUF_INIT; | ||||
| 	char *pathspec[2] = { NULL, NULL }; | ||||
| 	strbuf_getline_fn getline_fn; | ||||
| 	int num_ignored = 0; | ||||
|  | ||||
| 	getline_fn = nul_term_line ? strbuf_getline_nul : strbuf_getline_lf; | ||||
| 	strbuf_init(&buf, 0); | ||||
| 	strbuf_init(&nbuf, 0); | ||||
| 	while (getline_fn(&buf, stdin) != EOF) { | ||||
| 		if (!nul_term_line && buf.buf[0] == '"') { | ||||
| 			strbuf_reset(&nbuf); | ||||
| 			if (unquote_c_style(&nbuf, buf.buf, NULL)) | ||||
| 			strbuf_reset(&unquoted); | ||||
| 			if (unquote_c_style(&unquoted, buf.buf, NULL)) | ||||
| 				die("line is badly quoted"); | ||||
| 			strbuf_swap(&buf, &nbuf); | ||||
| 			strbuf_swap(&buf, &unquoted); | ||||
| 		} | ||||
| 		pathspec[0] = buf.buf; | ||||
| 		num_ignored += check_ignore(dir, prefix, | ||||
|  | @ -136,7 +135,7 @@ static int check_ignore_stdin_paths(struct dir_struct *dir, const char *prefix) | |||
| 		maybe_flush_or_die(stdout, "check-ignore to stdout"); | ||||
| 	} | ||||
| 	strbuf_release(&buf); | ||||
| 	strbuf_release(&nbuf); | ||||
| 	strbuf_release(&unquoted); | ||||
| 	return num_ignored; | ||||
| } | ||||
|  | ||||
|  |  | |||
|  | @ -130,33 +130,6 @@ static const char * const builtin_checkout_index_usage[] = { | |||
|  | ||||
| static struct lock_file lock_file; | ||||
|  | ||||
| static int option_parse_u(const struct option *opt, | ||||
| 			      const char *arg, int unset) | ||||
| { | ||||
| 	int *newfd = opt->value; | ||||
|  | ||||
| 	state.refresh_cache = 1; | ||||
| 	state.istate = &the_index; | ||||
| 	if (*newfd < 0) | ||||
| 		*newfd = hold_locked_index(&lock_file, 1); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int option_parse_z(const struct option *opt, | ||||
| 			  const char *arg, int unset) | ||||
| { | ||||
| 	nul_term_line = !unset; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int option_parse_prefix(const struct option *opt, | ||||
| 			       const char *arg, int unset) | ||||
| { | ||||
| 	state.base_dir = arg; | ||||
| 	state.base_dir_len = strlen(arg); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int option_parse_stage(const struct option *opt, | ||||
| 			      const char *arg, int unset) | ||||
| { | ||||
|  | @ -168,7 +141,7 @@ static int option_parse_stage(const struct option *opt, | |||
| 		if ('1' <= ch && ch <= '3') | ||||
| 			checkout_stage = arg[0] - '0'; | ||||
| 		else | ||||
| 			die("stage should be between 1 and 3 or all"); | ||||
| 			die(_("stage should be between 1 and 3 or all")); | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -181,6 +154,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) | |||
| 	int read_from_stdin = 0; | ||||
| 	int prefix_length; | ||||
| 	int force = 0, quiet = 0, not_new = 0; | ||||
| 	int index_opt = 0; | ||||
| 	struct option builtin_checkout_index_options[] = { | ||||
| 		OPT_BOOL('a', "all", &all, | ||||
| 			N_("check out all files in the index")), | ||||
|  | @ -189,22 +163,19 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) | |||
| 			N_("no warning for existing files and files not in index")), | ||||
| 		OPT_BOOL('n', "no-create", ¬_new, | ||||
| 			N_("don't checkout new files")), | ||||
| 		{ OPTION_CALLBACK, 'u', "index", &newfd, NULL, | ||||
| 			N_("update stat information in the index file"), | ||||
| 			PARSE_OPT_NOARG, option_parse_u }, | ||||
| 		{ OPTION_CALLBACK, 'z', NULL, NULL, NULL, | ||||
| 			N_("paths are separated with NUL character"), | ||||
| 			PARSE_OPT_NOARG, option_parse_z }, | ||||
| 		OPT_BOOL('u', "index", &index_opt, | ||||
| 			 N_("update stat information in the index file")), | ||||
| 		OPT_BOOL('z', NULL, &nul_term_line, | ||||
| 			N_("paths are separated with NUL character")), | ||||
| 		OPT_BOOL(0, "stdin", &read_from_stdin, | ||||
| 			N_("read list of paths from the standard input")), | ||||
| 		OPT_BOOL(0, "temp", &to_tempfile, | ||||
| 			N_("write the content to temporary files")), | ||||
| 		OPT_CALLBACK(0, "prefix", NULL, N_("string"), | ||||
| 			N_("when creating files, prepend <string>"), | ||||
| 			option_parse_prefix), | ||||
| 		OPT_CALLBACK(0, "stage", NULL, NULL, | ||||
| 		OPT_STRING(0, "prefix", &state.base_dir, N_("string"), | ||||
| 			N_("when creating files, prepend <string>")), | ||||
| 		{ OPTION_CALLBACK, 0, "stage", NULL, "1-3|all", | ||||
| 			N_("copy out the files from named stage"), | ||||
| 			option_parse_stage), | ||||
| 			PARSE_OPT_NONEG, option_parse_stage }, | ||||
| 		OPT_END() | ||||
| 	}; | ||||
|  | ||||
|  | @ -212,7 +183,6 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) | |||
| 		usage_with_options(builtin_checkout_index_usage, | ||||
| 				   builtin_checkout_index_options); | ||||
| 	git_config(git_default_config, NULL); | ||||
| 	state.base_dir = ""; | ||||
| 	prefix_length = prefix ? strlen(prefix) : 0; | ||||
|  | ||||
| 	if (read_cache() < 0) { | ||||
|  | @ -225,15 +195,17 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) | |||
| 	state.quiet = quiet; | ||||
| 	state.not_new = not_new; | ||||
|  | ||||
| 	if (state.base_dir_len || to_tempfile) { | ||||
| 		/* when --prefix is specified we do not | ||||
| 		 * want to update cache. | ||||
| 	if (!state.base_dir) | ||||
| 		state.base_dir = ""; | ||||
| 	state.base_dir_len = strlen(state.base_dir); | ||||
|  | ||||
| 	/* | ||||
| 	 * when --prefix is specified we do not want to update cache. | ||||
| 	 */ | ||||
| 		if (state.refresh_cache) { | ||||
| 			rollback_lock_file(&lock_file); | ||||
| 			newfd = -1; | ||||
| 		} | ||||
| 		state.refresh_cache = 0; | ||||
| 	if (index_opt && !state.base_dir_len && !to_tempfile) { | ||||
| 		state.refresh_cache = 1; | ||||
| 		state.istate = &the_index; | ||||
| 		newfd = hold_locked_index(&lock_file, 1); | ||||
| 	} | ||||
|  | ||||
| 	/* Check out named files first */ | ||||
|  | @ -251,7 +223,8 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) | |||
| 	} | ||||
|  | ||||
| 	if (read_from_stdin) { | ||||
| 		struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; | ||||
| 		struct strbuf buf = STRBUF_INIT; | ||||
| 		struct strbuf unquoted = STRBUF_INIT; | ||||
| 		strbuf_getline_fn getline_fn; | ||||
|  | ||||
| 		if (all) | ||||
|  | @ -261,16 +234,16 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix) | |||
| 		while (getline_fn(&buf, stdin) != EOF) { | ||||
| 			char *p; | ||||
| 			if (!nul_term_line && buf.buf[0] == '"') { | ||||
| 				strbuf_reset(&nbuf); | ||||
| 				if (unquote_c_style(&nbuf, buf.buf, NULL)) | ||||
| 				strbuf_reset(&unquoted); | ||||
| 				if (unquote_c_style(&unquoted, buf.buf, NULL)) | ||||
| 					die("line is badly quoted"); | ||||
| 				strbuf_swap(&buf, &nbuf); | ||||
| 				strbuf_swap(&buf, &unquoted); | ||||
| 			} | ||||
| 			p = prefix_path(prefix, prefix_length, buf.buf); | ||||
| 			checkout_file(p, prefix); | ||||
| 			free(p); | ||||
| 		} | ||||
| 		strbuf_release(&nbuf); | ||||
| 		strbuf_release(&unquoted); | ||||
| 		strbuf_release(&buf); | ||||
| 	} | ||||
|  | ||||
|  |  | |||
|  | @ -58,20 +58,21 @@ static void hash_object(const char *path, const char *type, const char *vpath, | |||
| static void hash_stdin_paths(const char *type, int no_filters, unsigned flags, | ||||
| 			     int literally) | ||||
| { | ||||
| 	struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; | ||||
| 	struct strbuf buf = STRBUF_INIT; | ||||
| 	struct strbuf unquoted = STRBUF_INIT; | ||||
|  | ||||
| 	while (strbuf_getline(&buf, stdin) != EOF) { | ||||
| 		if (buf.buf[0] == '"') { | ||||
| 			strbuf_reset(&nbuf); | ||||
| 			if (unquote_c_style(&nbuf, buf.buf, NULL)) | ||||
| 			strbuf_reset(&unquoted); | ||||
| 			if (unquote_c_style(&unquoted, buf.buf, NULL)) | ||||
| 				die("line is badly quoted"); | ||||
| 			strbuf_swap(&buf, &nbuf); | ||||
| 			strbuf_swap(&buf, &unquoted); | ||||
| 		} | ||||
| 		hash_object(buf.buf, type, no_filters ? NULL : buf.buf, flags, | ||||
| 			    literally); | ||||
| 	} | ||||
| 	strbuf_release(&buf); | ||||
| 	strbuf_release(&nbuf); | ||||
| 	strbuf_release(&unquoted); | ||||
| } | ||||
|  | ||||
| int cmd_hash_object(int argc, const char **argv, const char *prefix) | ||||
|  |  | |||
|  | @ -379,14 +379,6 @@ static const char * const ls_files_usage[] = { | |||
| 	NULL | ||||
| }; | ||||
|  | ||||
| static int option_parse_z(const struct option *opt, | ||||
| 			  const char *arg, int unset) | ||||
| { | ||||
| 	line_terminator = unset ? '\n' : '\0'; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static int option_parse_exclude(const struct option *opt, | ||||
| 				const char *arg, int unset) | ||||
| { | ||||
|  | @ -428,9 +420,9 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) | |||
| 	struct exclude_list *el; | ||||
| 	struct string_list exclude_list = STRING_LIST_INIT_NODUP; | ||||
| 	struct option builtin_ls_files_options[] = { | ||||
| 		{ OPTION_CALLBACK, 'z', NULL, NULL, NULL, | ||||
| 			N_("paths are separated with NUL character"), | ||||
| 			PARSE_OPT_NOARG, option_parse_z }, | ||||
| 		/* Think twice before adding "--nul" synonym to this */ | ||||
| 		OPT_SET_INT('z', NULL, &line_terminator, | ||||
| 			N_("paths are separated with NUL character"), '\0'), | ||||
| 		OPT_BOOL('t', NULL, &show_tag, | ||||
| 			N_("identify the file status with tags")), | ||||
| 		OPT_BOOL('v', NULL, &show_valid_bit, | ||||
|  |  | |||
|  | @ -1086,16 +1086,17 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) | |||
| 	} | ||||
|  | ||||
| 	if (read_from_stdin) { | ||||
| 		struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; | ||||
| 		struct strbuf buf = STRBUF_INIT; | ||||
| 		struct strbuf unquoted = STRBUF_INIT; | ||||
|  | ||||
| 		setup_work_tree(); | ||||
| 		while (getline_fn(&buf, stdin) != EOF) { | ||||
| 			char *p; | ||||
| 			if (!nul_term_line && buf.buf[0] == '"') { | ||||
| 				strbuf_reset(&nbuf); | ||||
| 				if (unquote_c_style(&nbuf, buf.buf, NULL)) | ||||
| 				strbuf_reset(&unquoted); | ||||
| 				if (unquote_c_style(&unquoted, buf.buf, NULL)) | ||||
| 					die("line is badly quoted"); | ||||
| 				strbuf_swap(&buf, &nbuf); | ||||
| 				strbuf_swap(&buf, &unquoted); | ||||
| 			} | ||||
| 			p = prefix_path(prefix, prefix_length, buf.buf); | ||||
| 			update_one(p); | ||||
|  | @ -1103,7 +1104,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) | |||
| 				chmod_path(set_executable_bit, p); | ||||
| 			free(p); | ||||
| 		} | ||||
| 		strbuf_release(&nbuf); | ||||
| 		strbuf_release(&unquoted); | ||||
| 		strbuf_release(&buf); | ||||
| 	} | ||||
|  | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano