Skip to content

Commit

Permalink
notes remove: --ignore-missing
Browse files Browse the repository at this point in the history
Depending on the application, it is not necessarily an error for an object
to lack a note, especially if the only thing the caller wants to make sure
is that notes are cleared for an object.  By passing this option from the
command line, the "git notes remove" command considers it a success if the
object did not have any note to begin with.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed May 19, 2011
1 parent c3ab1a8 commit 2d370d2
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 5 deletions.
6 changes: 5 additions & 1 deletion Documentation/git-notes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ SYNOPSIS
'git notes' merge [-v | -q] [-s <strategy> ] <notes_ref>
'git notes' merge --commit [-v | -q]
'git notes' merge --abort [-v | -q]
'git notes' remove [<object>...]
'git notes' remove [--ignore-missing] [<object>...]
'git notes' prune [-n | -v]
'git notes' get-ref

Expand Down Expand Up @@ -155,6 +155,10 @@ OPTIONS
'GIT_NOTES_REF' and the "core.notesRef" configuration. The ref
is taken to be in `refs/notes/` if it is not qualified.

--ignore-missing::
Do not consider it an error to request removing notes from an
object that does not have notes attached to it.

-n::
--dry-run::
Do not remove anything; just report the object names whose notes
Expand Down
14 changes: 10 additions & 4 deletions builtin/notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -953,7 +953,9 @@ static int merge(int argc, const char **argv, const char *prefix)
return result < 0; /* return non-zero on conflicts */
}

static int remove_one_note(struct notes_tree *t, const char *name)
#define MISSING_OK 1

static int remove_one_note(struct notes_tree *t, const char *name, unsigned flag)
{
int status;
unsigned char sha1[20];
Expand All @@ -964,12 +966,16 @@ static int remove_one_note(struct notes_tree *t, const char *name)
fprintf(stderr, _("Object %s has no note\n"), name);
else
fprintf(stderr, _("Removing note for object %s\n"), name);
return status;
return (flag & MISSING_OK) ? 0 : status;
}

static int remove_cmd(int argc, const char **argv, const char *prefix)
{
unsigned flag = 0;
struct option options[] = {
OPT_BIT(0, "ignore-missing", &flag,
"attempt to remove non-existent note is not an error",
MISSING_OK),
OPT_END()
};
struct notes_tree *t;
Expand All @@ -981,10 +987,10 @@ static int remove_cmd(int argc, const char **argv, const char *prefix)
t = init_notes_check("remove");

if (!argc) {
retval = remove_one_note(t, "HEAD");
retval = remove_one_note(t, "HEAD", flag);
} else {
while (*argv) {
retval |= remove_one_note(t, *argv);
retval |= remove_one_note(t, *argv, flag);
argv++;
}
}
Expand Down
20 changes: 20 additions & 0 deletions t/t3301-notes.sh
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,26 @@ test_expect_success 'removing is atomic' '
test "$before" = "$after"
'

test_expect_success 'removing with --ignore-missing' '
before=$(git rev-parse --verify refs/notes/commits) &&
test_when_finished "git update-ref refs/notes/commits $before" &&
# We have only two -- add another and make sure it stays
git notes add -m "extra" &&
git notes list HEAD >after-removal-expect &&
git notes remove --ignore-missing HEAD^^ HEAD^^^ HEAD^ &&
git notes list | sed -e "s/ .*//" >actual &&
test_cmp after-removal-expect actual
'

test_expect_success 'removing with --ignore-missing but bogus ref' '
before=$(git rev-parse --verify refs/notes/commits) &&
test_when_finished "git update-ref refs/notes/commits $before" &&
test_must_fail git notes remove --ignore-missing HEAD^^ HEAD^^^ NO-SUCH-COMMIT &&
after=$(git rev-parse --verify refs/notes/commits) &&
test "$before" = "$after"
'

test_expect_success 'list notes with "git notes list"' '
git notes list > output &&
test_cmp expect output
Expand Down

0 comments on commit 2d370d2

Please sign in to comment.