gitweb: Run in FastCGI mode if gitweb script has .fcgi extension
[gitweb.git] / notes.c
diff --git a/notes.c b/notes.c
index 225a16608a516f6a4f9563727874174dbe03287b..e425e198278bfb5c6a039dc88825568f1518e875 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -629,8 +629,8 @@ static void write_tree_entry(struct strbuf *buf, unsigned int mode,
                const char *path, unsigned int path_len, const
                unsigned char *sha1)
 {
-               strbuf_addf(buf, "%06o %.*s%c", mode, path_len, path, '\0');
-               strbuf_add(buf, sha1, 20);
+       strbuf_addf(buf, "%o %.*s%c", mode, path_len, path, '\0');
+       strbuf_add(buf, sha1, 20);
 }
 
 static void tree_write_stack_init_subtree(struct tree_write_stack *tws,
@@ -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))
@@ -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));
@@ -1026,9 +1028,10 @@ 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);
+       note_tree_remove(t, t->root, 0, &l);
 }
 
 const unsigned char *get_note(struct notes_tree *t,
@@ -1185,3 +1188,21 @@ void format_display_notes(const unsigned char *object_sha1,
                format_note(display_notes_trees[i], object_sha1, sb,
                            output_encoding, flags);
 }
+
+int copy_note(struct notes_tree *t,
+             const unsigned char *from_obj, const unsigned char *to_obj,
+             int force, combine_notes_fn combine_fn)
+{
+       const unsigned char *note = get_note(t, from_obj);
+       const unsigned char *existing_note = get_note(t, to_obj);
+
+       if (!force && existing_note)
+               return 1;
+
+       if (note)
+               add_note(t, to_obj, note, combine_fn);
+       else if (existing_note)
+               add_note(t, to_obj, null_sha1, combine_fn);
+
+       return 0;
+}