Browse Source

exclude-promisor-objects: declare when option is allowed

The --exclude-promisor-objects option causes some funny behavior in at
least two commands: log and blame. It causes a BUG crash:

	$ git log --exclude-promisor-objects
	BUG: revision.c:2143: exclude_promisor_objects can only be used
	when fetch_if_missing is 0
	Aborted
	[134]

Fix this such that the option is treated like any other unknown option.
The commands that must support it are limited, so declare in those
commands that the flag is supported. In particular:

	pack-objects
	prune
	rev-list

The commands were found by searching for logic which parses
--exclude-promisor-objects outside of revision.c. Extra logic outside of
revision.c is needed because fetch_if_missing must be turned on before
revision.c sees the option or it will BUG-crash. The above list is
supported by the fact that no other command is introspectively invoked
by another command passing --exclude-promisor-object.

Signed-off-by: Matthew DeVore <matvore@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Matthew DeVore 6 years ago committed by Junio C Hamano
parent
commit
669b1d2aae
  1. 1
      builtin/pack-objects.c
  2. 1
      builtin/prune.c
  3. 1
      builtin/rev-list.c
  4. 3
      revision.c
  5. 1
      revision.h
  6. 4
      t/t4202-log.sh
  7. 4
      t/t8002-blame.sh

1
builtin/pack-objects.c

@ -2853,6 +2853,7 @@ static void get_object_list(int ac, const char **av) @@ -2853,6 +2853,7 @@ static void get_object_list(int ac, const char **av)

init_revisions(&revs, NULL);
save_commit_buffer = 0;
revs.allow_exclude_promisor_objects_opt = 1;
setup_revisions(ac, av, &revs, NULL);

/* make sure shallows are read */

1
builtin/prune.c

@ -118,6 +118,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) @@ -118,6 +118,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
save_commit_buffer = 0;
check_replace_refs = 0;
ref_paranoia = 1;
revs.allow_exclude_promisor_objects_opt = 1;
init_revisions(&revs, prefix);

argc = parse_options(argc, argv, prefix, options, prune_usage, 0);

1
builtin/rev-list.c

@ -370,6 +370,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) @@ -370,6 +370,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
git_config(git_default_config, NULL);
init_revisions(&revs, prefix);
revs.abbrev = DEFAULT_ABBREV;
revs.allow_exclude_promisor_objects_opt = 1;
revs.commit_format = CMIT_FMT_UNSPECIFIED;

/*

3
revision.c

@ -2105,7 +2105,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg @@ -2105,7 +2105,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->limited = 1;
} else if (!strcmp(arg, "--ignore-missing")) {
revs->ignore_missing = 1;
} else if (!strcmp(arg, "--exclude-promisor-objects")) {
} else if (revs->allow_exclude_promisor_objects_opt &&
!strcmp(arg, "--exclude-promisor-objects")) {
if (fetch_if_missing)
die("BUG: exclude_promisor_objects can only be used when fetch_if_missing is 0");
revs->exclude_promisor_objects = 1;

1
revision.h

@ -124,6 +124,7 @@ struct rev_info { @@ -124,6 +124,7 @@ struct rev_info {
tree_blobs_in_commit_order:1,

/* for internal use only */
allow_exclude_promisor_objects_opt:1,
exclude_promisor_objects:1;

/* Diff flags */

4
t/t4202-log.sh

@ -1668,4 +1668,8 @@ test_expect_success 'log --source paints symmetric ranges' ' @@ -1668,4 +1668,8 @@ test_expect_success 'log --source paints symmetric ranges' '
test_cmp expect actual
'

test_expect_success '--exclude-promisor-objects does not BUG-crash' '
test_must_fail git log --exclude-promisor-objects source-a
'

test_done

4
t/t8002-blame.sh

@ -118,4 +118,8 @@ test_expect_success '--no-abbrev works like --abbrev=40' ' @@ -118,4 +118,8 @@ test_expect_success '--no-abbrev works like --abbrev=40' '
check_abbrev 40 --no-abbrev
'

test_expect_success '--exclude-promisor-objects does not BUG-crash' '
test_must_fail git blame --exclude-promisor-objects one
'

test_done

Loading…
Cancel
Save