Browse Source

show: --ignore-missing

Instead of barfing, simply ignore bad object names seen in the
input. This is useful when reading from "git notes list" output
that may refer to objects that have already been garbage collected.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 14 years ago
parent
commit
cc243c3ceb
  1. 1
      Documentation/git-rev-list.txt
  2. 4
      Documentation/rev-list-options.txt
  3. 1
      builtin/rev-parse.c
  4. 15
      revision.c
  5. 3
      revision.h

1
Documentation/git-rev-list.txt

@ -29,6 +29,7 @@ SYNOPSIS @@ -29,6 +29,7 @@ SYNOPSIS
[ \--tags[=<pattern>] ]
[ \--remotes[=<pattern>] ]
[ \--glob=<glob-pattern> ]
[ \--ignore-missing ]
[ \--stdin ]
[ \--quiet ]
[ \--topo-order ]

4
Documentation/rev-list-options.txt

@ -139,6 +139,10 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit). @@ -139,6 +139,10 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit).
is automatically prepended if missing. If pattern lacks '?', '*',
or '[', '/*' at the end is implied.

--ignore-missing::

Upon seeing an invalid object name in the input, pretend as if
the bad input was not given.

ifndef::git-rev-list[]
--bisect::

1
builtin/rev-parse.c

@ -44,6 +44,7 @@ static int is_rev_argument(const char *arg) @@ -44,6 +44,7 @@ static int is_rev_argument(const char *arg)
"--branches=",
"--branches",
"--header",
"--ignore-missing",
"--max-age=",
"--max-count=",
"--min-age=",

15
revision.c

@ -133,6 +133,8 @@ void mark_parents_uninteresting(struct commit *commit) @@ -133,6 +133,8 @@ void mark_parents_uninteresting(struct commit *commit)

static void add_pending_object_with_mode(struct rev_info *revs, struct object *obj, const char *name, unsigned mode)
{
if (!obj)
return;
if (revs->no_walk && (obj->flags & UNINTERESTING))
revs->no_walk = 0;
if (revs->reflog_info && obj->type == OBJ_COMMIT) {
@ -174,8 +176,11 @@ static struct object *get_reference(struct rev_info *revs, const char *name, con @@ -174,8 +176,11 @@ static struct object *get_reference(struct rev_info *revs, const char *name, con
struct object *object;

object = parse_object(sha1);
if (!object)
if (!object) {
if (revs->ignore_missing)
return object;
die("bad object %s", name);
}
object->flags |= flags;
return object;
}
@ -906,6 +911,8 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags) @@ -906,6 +911,8 @@ static int add_parents_only(struct rev_info *revs, const char *arg, int flags)
return 0;
while (1) {
it = get_reference(revs, arg, sha1, 0);
if (!it && revs->ignore_missing)
return 0;
if (it->type != OBJ_TAG)
break;
if (!((struct tag*)it)->tagged)
@ -1044,6 +1051,8 @@ int handle_revision_arg(const char *arg, struct rev_info *revs, @@ -1044,6 +1051,8 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
a = lookup_commit_reference(from_sha1);
b = lookup_commit_reference(sha1);
if (!a || !b) {
if (revs->ignore_missing)
return 0;
die(symmetric ?
"Invalid symmetric difference expression %s...%s" :
"Invalid revision range %s..%s",
@ -1090,7 +1099,7 @@ int handle_revision_arg(const char *arg, struct rev_info *revs, @@ -1090,7 +1099,7 @@ int handle_revision_arg(const char *arg, struct rev_info *revs,
arg++;
}
if (get_sha1_with_mode(arg, sha1, &mode))
return -1;
return revs->ignore_missing ? 0 : -1;
if (!cant_be_filename)
verify_non_filename(revs->prefix, arg);
object = get_reference(revs, arg, sha1, flags ^ local_flags);
@ -1475,6 +1484,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg @@ -1475,6 +1484,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
} else if (!strcmp(arg, "--children")) {
revs->children.name = "children";
revs->limited = 1;
} else if (!strcmp(arg, "--ignore-missing")) {
revs->ignore_missing = 1;
} else {
int opts = diff_opt_parse(&revs->diffopt, argv, argc);
if (!opts)

3
revision.h

@ -36,7 +36,8 @@ struct rev_info { @@ -36,7 +36,8 @@ struct rev_info {
const char *prefix;
const char *def;
struct pathspec prune_data;
unsigned int early_output;
unsigned int early_output:1,
ignore_missing:1;

/* Traversal flags */
unsigned int dense:1,

Loading…
Cancel
Save