Skip to content

Commit

Permalink
notes: track whether notes_trees were changed at all
Browse files Browse the repository at this point in the history
Currently, the notes copying is a bit wasteful since it always creates
new trees, even if no notes were copied at all.

Teach add_note() and remove_note() to flag the affected notes tree as
changed ('dirty').  Then teach builtin/notes.c to use this knowledge
and avoid committing trees that weren't changed.

Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Acked-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Thomas Rast authored and Junio C Hamano committed Mar 13, 2010
1 parent dcf783a commit 7f710ea
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 0 deletions.
2 changes: 2 additions & 0 deletions builtin-notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,8 @@ int commit_notes(struct notes_tree *t, const char *msg)
t = &default_notes_tree;
if (!t->initialized || !t->ref || !*t->ref)
die("Cannot commit uninitialized/unreferenced notes tree");
if (!t->dirty)
return 0; /* don't have to commit an unchanged tree */

/* Prepare commit message and reflog message */
strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */
Expand Down
3 changes: 3 additions & 0 deletions notes.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
t->ref = notes_ref ? xstrdup(notes_ref) : NULL;
t->combine_notes = combine_notes;
t->initialized = 1;
t->dirty = 0;

if (flags & NOTES_INIT_EMPTY || !notes_ref ||
read_ref(notes_ref, object_sha1))
Expand Down Expand Up @@ -1011,6 +1012,7 @@ void add_note(struct notes_tree *t, const unsigned char *object_sha1,
if (!t)
t = &default_notes_tree;
assert(t->initialized);
t->dirty = 1;
if (!combine_notes)
combine_notes = t->combine_notes;
l = (struct leaf_node *) xmalloc(sizeof(struct leaf_node));
Expand All @@ -1026,6 +1028,7 @@ void remove_note(struct notes_tree *t, const unsigned char *object_sha1)
if (!t)
t = &default_notes_tree;
assert(t->initialized);
t->dirty = 1;
hashcpy(l.key_sha1, object_sha1);
hashclr(l.val_sha1);
return note_tree_remove(t, t->root, 0, &l);
Expand Down
1 change: 1 addition & 0 deletions notes.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ extern struct notes_tree {
char *ref;
combine_notes_fn *combine_notes;
int initialized;
int dirty;
} default_notes_tree;

/*
Expand Down

0 comments on commit 7f710ea

Please sign in to comment.