Skip to content

Commit

Permalink
notes: dry-run and verbose options for prune
Browse files Browse the repository at this point in the history
Introduce -n and -v options for "git notes prune" in complete analogy to
"git prune" so that one can check for dangling notes easily.

The output is a list of names of objects whose notes would be resp.
are removed so that one can check the object ("git show sha1") as well as
the note ("git notes show sha1").

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
Acked-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Michael J Gruber authored and Junio C Hamano committed May 20, 2010
1 parent 0e4607c commit a9f2adf
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 10 deletions.
9 changes: 8 additions & 1 deletion Documentation/git-notes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ SYNOPSIS
'git notes' edit [<object>]
'git notes' show [<object>]
'git notes' remove [<object>]
'git notes' prune
'git notes' prune [-n | -v]


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

-n::
Do not remove anything; just report the object names whose notes
would be removed.

-v::
Report all object names whose notes are removed.


NOTES
-----
Expand Down
13 changes: 9 additions & 4 deletions builtin/notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ static const char * const git_notes_usage[] = {
"git notes [--ref <notes_ref>] edit [<object>]",
"git notes [--ref <notes_ref>] show [<object>]",
"git notes [--ref <notes_ref>] remove [<object>]",
"git notes [--ref <notes_ref>] prune",
"git notes [--ref <notes_ref>] prune [-n | -v]",
NULL
};

Expand Down Expand Up @@ -67,7 +67,7 @@ static const char * const git_notes_remove_usage[] = {
};

static const char * const git_notes_prune_usage[] = {
"git notes prune",
"git notes prune [<options>]",
NULL
};

Expand Down Expand Up @@ -792,7 +792,10 @@ static int remove_cmd(int argc, const char **argv, const char *prefix)
static int prune(int argc, const char **argv, const char *prefix)
{
struct notes_tree *t;
int show_only = 0, verbose = 0;
struct option options[] = {
OPT_BOOLEAN('n', NULL, &show_only, "do not remove, show only"),
OPT_BOOLEAN('v', NULL, &verbose, "report pruned notes"),
OPT_END()
};

Expand All @@ -806,8 +809,10 @@ static int prune(int argc, const char **argv, const char *prefix)

t = init_notes_check("prune");

prune_notes(t);
commit_notes(t, "Notes removed by 'git notes prune'");
prune_notes(t, (verbose ? NOTES_PRUNE_VERBOSE : 0) |
(show_only ? NOTES_PRUNE_VERBOSE|NOTES_PRUNE_DRYRUN : 0) );
if (!show_only)
commit_notes(t, "Notes removed by 'git notes prune'");
free_notes(t);
return 0;
}
Expand Down
7 changes: 5 additions & 2 deletions notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,7 @@ int write_notes_tree(struct notes_tree *t, unsigned char *result)
return ret;
}

void prune_notes(struct notes_tree *t)
void prune_notes(struct notes_tree *t, int flags)
{
struct note_delete_list *l = NULL;

Expand All @@ -1094,7 +1094,10 @@ void prune_notes(struct notes_tree *t)
for_each_note(t, 0, prune_notes_helper, &l);

while (l) {
remove_note(t, l->sha1);
if (flags & NOTES_PRUNE_VERBOSE)
printf("%s\n", sha1_to_hex(l->sha1));
if (!(flags & NOTES_PRUNE_DRYRUN))
remove_note(t, l->sha1);
l = l->next;
}
}
Expand Down
5 changes: 4 additions & 1 deletion notes.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ int for_each_note(struct notes_tree *t, int flags, each_note_fn fn,
*/
int write_notes_tree(struct notes_tree *t, unsigned char *result);

/* Flags controlling the operation of prune */
#define NOTES_PRUNE_VERBOSE 1
#define NOTES_PRUNE_DRYRUN 2
/*
* Remove all notes annotating non-existing objects from the given notes tree
*
Expand All @@ -181,7 +184,7 @@ int write_notes_tree(struct notes_tree *t, unsigned char *result);
* structure are not persistent until a subsequent call to write_notes_tree()
* returns zero.
*/
void prune_notes(struct notes_tree *t);
void prune_notes(struct notes_tree *t, int flags);

/*
* Free (and de-initialize) the given notes_tree structure
Expand Down
48 changes: 46 additions & 2 deletions t/t3306-notes-prune.sh
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,15 @@ test_expect_success 'verify commits and notes' '

test_expect_success 'remove some commits' '
git reset --hard HEAD~2 &&
git reset --hard HEAD~1 &&
git reflog expire --expire=now HEAD &&
git gc --prune=now
'

test_expect_success 'verify that commits are gone' '
! git cat-file -p 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&
! git cat-file -p 08341ad9e94faa089d60fd3f523affb25c6da189 &&
git cat-file -p 08341ad9e94faa089d60fd3f523affb25c6da189 &&
git cat-file -p ab5f302035f2e7aaf04265f08b42034c23256e1f
'

Expand All @@ -79,11 +79,55 @@ test_expect_success 'verify that notes are still present' '
git notes show ab5f302035f2e7aaf04265f08b42034c23256e1f
'

test_expect_success 'prune -n does not remove notes' '
git notes list > expect &&
git notes prune -n &&
git notes list > actual &&
test_cmp expect actual
'

cat > expect <<EOF
5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29
EOF

test_expect_success 'prune -n lists prunable notes' '
git notes prune -n > actual &&
test_cmp expect actual
'


test_expect_success 'prune notes' '
git notes prune
'

test_expect_success 'verify that notes are gone' '
! git notes show 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&
git notes show 08341ad9e94faa089d60fd3f523affb25c6da189 &&
git notes show ab5f302035f2e7aaf04265f08b42034c23256e1f
'

test_expect_success 'remove some commits' '
git reset --hard HEAD~1 &&
git reflog expire --expire=now HEAD &&
git gc --prune=now
'

cat > expect <<EOF
08341ad9e94faa089d60fd3f523affb25c6da189
EOF

test_expect_success 'prune -v notes' '
git notes prune -v > actual &&
test_cmp expect actual
'

test_expect_success 'verify that notes are gone' '
! git notes show 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&
Expand Down

0 comments on commit a9f2adf

Please sign in to comment.