log: convert to parse-options
Use parse-options in cmd_log_init instead of manually iterating through them. This makes the code a bit cleaner but more importantly allows us to catch the "--quiet" option which causes some of the log-related commands to misbehave as it would otherwise get passed on to the diff. Signed-off-by: Carlos Martín Nieto <cmn@elego.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		
				
					committed by
					
						
						Junio C Hamano
					
				
			
			
				
	
			
			
			
						parent
						
							06ff44951a
						
					
				
				
					commit
					1c40c36b9a
				
			@ -25,12 +25,15 @@ static const char *default_date_mode = NULL;
 | 
			
		||||
 | 
			
		||||
static int default_show_root = 1;
 | 
			
		||||
static int decoration_style;
 | 
			
		||||
static int decoration_given;
 | 
			
		||||
static const char *fmt_patch_subject_prefix = "PATCH";
 | 
			
		||||
static const char *fmt_pretty;
 | 
			
		||||
 | 
			
		||||
static const char * const builtin_log_usage =
 | 
			
		||||
static const char * const builtin_log_usage[] = {
 | 
			
		||||
	"git log [<options>] [<since>..<until>] [[--] <path>...]\n"
 | 
			
		||||
	"   or: git show [options] <object>...";
 | 
			
		||||
	"   or: git show [options] <object>...",
 | 
			
		||||
	NULL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int parse_decoration_style(const char *var, const char *value)
 | 
			
		||||
{
 | 
			
		||||
@ -49,12 +52,41 @@ static int parse_decoration_style(const char *var, const char *value)
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int decorate_callback(const struct option *opt, const char *arg, int unset)
 | 
			
		||||
{
 | 
			
		||||
	if (unset)
 | 
			
		||||
		decoration_style = 0;
 | 
			
		||||
	else if (arg)
 | 
			
		||||
		decoration_style = parse_decoration_style("command line", arg);
 | 
			
		||||
	else
 | 
			
		||||
		decoration_style = DECORATE_SHORT_REFS;
 | 
			
		||||
 | 
			
		||||
	if (decoration_style < 0)
 | 
			
		||||
		die("invalid --decorate option: %s", arg);
 | 
			
		||||
 | 
			
		||||
	decoration_given = 1;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void cmd_log_init(int argc, const char **argv, const char *prefix,
 | 
			
		||||
			 struct rev_info *rev, struct setup_revision_opt *opt)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	int decoration_given = 0;
 | 
			
		||||
	struct userformat_want w;
 | 
			
		||||
	int quiet = 0, source = 0;
 | 
			
		||||
 | 
			
		||||
	const struct option builtin_log_options[] = {
 | 
			
		||||
		OPT_BOOLEAN(0, "quiet", &quiet, "supress diff output"),
 | 
			
		||||
		OPT_BOOLEAN(0, "source", &source, "show source"),
 | 
			
		||||
		{ OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options",
 | 
			
		||||
		  PARSE_OPT_OPTARG, decorate_callback},
 | 
			
		||||
		OPT_END()
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	argc = parse_options(argc, argv, prefix,
 | 
			
		||||
			     builtin_log_options, builtin_log_usage,
 | 
			
		||||
			     PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN |
 | 
			
		||||
			     PARSE_OPT_KEEP_DASHDASH);
 | 
			
		||||
 | 
			
		||||
	rev->abbrev = DEFAULT_ABBREV;
 | 
			
		||||
	rev->commit_format = CMIT_FMT_DEFAULT;
 | 
			
		||||
@ -69,14 +101,12 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,
 | 
			
		||||
	if (default_date_mode)
 | 
			
		||||
		rev->date_mode = parse_date_format(default_date_mode);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Check for -h before setup_revisions(), or "git log -h" will
 | 
			
		||||
	 * fail when run without a git directory.
 | 
			
		||||
	 */
 | 
			
		||||
	if (argc == 2 && !strcmp(argv[1], "-h"))
 | 
			
		||||
		usage(builtin_log_usage);
 | 
			
		||||
	argc = setup_revisions(argc, argv, rev, opt);
 | 
			
		||||
 | 
			
		||||
	/* Any arguments at this point are not recognized */
 | 
			
		||||
	if (argc > 1)
 | 
			
		||||
		die("unrecognized argument: %s", argv[1]);
 | 
			
		||||
 | 
			
		||||
	memset(&w, 0, sizeof(w));
 | 
			
		||||
	userformat_find_requirements(NULL, &w);
 | 
			
		||||
 | 
			
		||||
@ -92,26 +122,9 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,
 | 
			
		||||
		if (rev->diffopt.nr_paths != 1)
 | 
			
		||||
			usage("git logs can only follow renames on one pathname at a time");
 | 
			
		||||
	}
 | 
			
		||||
	for (i = 1; i < argc; i++) {
 | 
			
		||||
		const char *arg = argv[i];
 | 
			
		||||
		if (!strcmp(arg, "--decorate")) {
 | 
			
		||||
			decoration_style = DECORATE_SHORT_REFS;
 | 
			
		||||
			decoration_given = 1;
 | 
			
		||||
		} else if (!prefixcmp(arg, "--decorate=")) {
 | 
			
		||||
			const char *v = skip_prefix(arg, "--decorate=");
 | 
			
		||||
			decoration_style = parse_decoration_style(arg, v);
 | 
			
		||||
			if (decoration_style < 0)
 | 
			
		||||
				die("invalid --decorate option: %s", arg);
 | 
			
		||||
			decoration_given = 1;
 | 
			
		||||
		} else if (!strcmp(arg, "--no-decorate")) {
 | 
			
		||||
			decoration_style = 0;
 | 
			
		||||
		} else if (!strcmp(arg, "--source")) {
 | 
			
		||||
			rev->show_source = 1;
 | 
			
		||||
		} else if (!strcmp(arg, "-h")) {
 | 
			
		||||
			usage(builtin_log_usage);
 | 
			
		||||
		} else
 | 
			
		||||
			die("unrecognized argument: %s", arg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (source)
 | 
			
		||||
		rev->show_source = 1;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * defeat log.decorate configuration interacting with --pretty=raw
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user