notes: track whether notes_trees were changed at all
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>
This commit is contained in:
parent
dcf783a261
commit
7f710ea982
@ -249,6 +249,8 @@ int commit_notes(struct notes_tree *t, const char *msg)
|
|||||||
t = &default_notes_tree;
|
t = &default_notes_tree;
|
||||||
if (!t->initialized || !t->ref || !*t->ref)
|
if (!t->initialized || !t->ref || !*t->ref)
|
||||||
die("Cannot commit uninitialized/unreferenced notes tree");
|
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 */
|
/* Prepare commit message and reflog message */
|
||||||
strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */
|
strbuf_addstr(&buf, "notes: "); /* commit message starts at index 7 */
|
||||||
|
3
notes.c
3
notes.c
@ -933,6 +933,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
|
|||||||
t->ref = notes_ref ? xstrdup(notes_ref) : NULL;
|
t->ref = notes_ref ? xstrdup(notes_ref) : NULL;
|
||||||
t->combine_notes = combine_notes;
|
t->combine_notes = combine_notes;
|
||||||
t->initialized = 1;
|
t->initialized = 1;
|
||||||
|
t->dirty = 0;
|
||||||
|
|
||||||
if (flags & NOTES_INIT_EMPTY || !notes_ref ||
|
if (flags & NOTES_INIT_EMPTY || !notes_ref ||
|
||||||
read_ref(notes_ref, object_sha1))
|
read_ref(notes_ref, object_sha1))
|
||||||
@ -1011,6 +1012,7 @@ void add_note(struct notes_tree *t, const unsigned char *object_sha1,
|
|||||||
if (!t)
|
if (!t)
|
||||||
t = &default_notes_tree;
|
t = &default_notes_tree;
|
||||||
assert(t->initialized);
|
assert(t->initialized);
|
||||||
|
t->dirty = 1;
|
||||||
if (!combine_notes)
|
if (!combine_notes)
|
||||||
combine_notes = t->combine_notes;
|
combine_notes = t->combine_notes;
|
||||||
l = (struct leaf_node *) xmalloc(sizeof(struct leaf_node));
|
l = (struct leaf_node *) xmalloc(sizeof(struct leaf_node));
|
||||||
@ -1026,6 +1028,7 @@ void remove_note(struct notes_tree *t, const unsigned char *object_sha1)
|
|||||||
if (!t)
|
if (!t)
|
||||||
t = &default_notes_tree;
|
t = &default_notes_tree;
|
||||||
assert(t->initialized);
|
assert(t->initialized);
|
||||||
|
t->dirty = 1;
|
||||||
hashcpy(l.key_sha1, object_sha1);
|
hashcpy(l.key_sha1, object_sha1);
|
||||||
hashclr(l.val_sha1);
|
hashclr(l.val_sha1);
|
||||||
return note_tree_remove(t, t->root, 0, &l);
|
return note_tree_remove(t, t->root, 0, &l);
|
||||||
|
Loading…
Reference in New Issue
Block a user