8 #include "string-list.h"
 
  12  * Use a non-balancing simple 16-tree structure with struct int_node as
 
  13  * internal nodes, and struct leaf_node as leaf nodes. Each int_node has a
 
  14  * 16-array of pointers to its children.
 
  15  * The bottom 2 bits of each pointer is used to identify the pointer type
 
  16  * - ptr & 3 == 0 - NULL pointer, assert(ptr == NULL)
 
  17  * - ptr & 3 == 1 - pointer to next internal node - cast to struct int_node *
 
  18  * - ptr & 3 == 2 - pointer to note entry - cast to struct leaf_node *
 
  19  * - ptr & 3 == 3 - pointer to subtree entry - cast to struct leaf_node *
 
  21  * The root node is a statically allocated struct int_node.
 
  28  * Leaf nodes come in two variants, note entries and subtree entries,
 
  29  * distinguished by the LSb of the leaf node pointer (see above).
 
  30  * As a note entry, the key is the SHA1 of the referenced object, and the
 
  31  * value is the SHA1 of the note object.
 
  32  * As a subtree entry, the key is the prefix SHA1 (w/trailing NULs) of the
 
  33  * referenced object, using the last byte of the key to store the length of
 
  34  * the prefix. The value is the SHA1 of the tree object containing the notes
 
  38         unsigned char key_sha1[20];
 
  39         unsigned char val_sha1[20];
 
  43  * A notes tree may contain entries that are not notes, and that do not follow
 
  44  * the naming conventions of notes. There are typically none/few of these, but
 
  45  * we still need to keep track of them. Keep a simple linked list sorted alpha-
 
  46  * betically on the non-note path. The list is populated when parsing tree
 
  47  * objects in load_subtree(), and the non-notes are correctly written back into
 
  48  * the tree objects produced by write_notes_tree().
 
  51         struct non_note *next; /* grounded (last->next == NULL) */
 
  54         unsigned char sha1[20];
 
  57 #define PTR_TYPE_NULL     0
 
  58 #define PTR_TYPE_INTERNAL 1
 
  59 #define PTR_TYPE_NOTE     2
 
  60 #define PTR_TYPE_SUBTREE  3
 
  62 #define GET_PTR_TYPE(ptr)       ((uintptr_t) (ptr) & 3)
 
  63 #define CLR_PTR_TYPE(ptr)       ((void *) ((uintptr_t) (ptr) & ~3))
 
  64 #define SET_PTR_TYPE(ptr, type) ((void *) ((uintptr_t) (ptr) | (type)))
 
  66 #define GET_NIBBLE(n, sha1) (((sha1[(n) >> 1]) >> ((~(n) & 0x01) << 2)) & 0x0f)
 
  68 #define SUBTREE_SHA1_PREFIXCMP(key_sha1, subtree_sha1) \
 
  69         (memcmp(key_sha1, subtree_sha1, subtree_sha1[19]))
 
  71 struct notes_tree default_notes_tree;
 
  73 static struct string_list display_notes_refs;
 
  74 static struct notes_tree **display_notes_trees;
 
  76 static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
 
  77                 struct int_node *node, unsigned int n);
 
  80  * Search the tree until the appropriate location for the given key is found:
 
  81  * 1. Start at the root node, with n = 0
 
  82  * 2. If a[0] at the current level is a matching subtree entry, unpack that
 
  83  *    subtree entry and remove it; restart search at the current level.
 
  84  * 3. Use the nth nibble of the key as an index into a:
 
  85  *    - If a[n] is an int_node, recurse from #2 into that node and increment n
 
  86  *    - If a matching subtree entry, unpack that subtree entry (and remove it);
 
  87  *      restart search at the current level.
 
  88  *    - Otherwise, we have found one of the following:
 
  89  *      - a subtree entry which does not match the key
 
  90  *      - a note entry which may or may not match the key
 
  91  *      - an unused leaf node (NULL)
 
  92  *      In any case, set *tree and *n, and return pointer to the tree location.
 
  94 static void **note_tree_search(struct notes_tree *t, struct int_node **tree,
 
  95                 unsigned char *n, const unsigned char *key_sha1)
 
  99         void *p = (*tree)->a[0];
 
 101         if (GET_PTR_TYPE(p) == PTR_TYPE_SUBTREE) {
 
 102                 l = (struct leaf_node *) CLR_PTR_TYPE(p);
 
 103                 if (!SUBTREE_SHA1_PREFIXCMP(key_sha1, l->key_sha1)) {
 
 104                         /* unpack tree and resume search */
 
 105                         (*tree)->a[0] = NULL;
 
 106                         load_subtree(t, l, *tree, *n);
 
 108                         return note_tree_search(t, tree, n, key_sha1);
 
 112         i = GET_NIBBLE(*n, key_sha1);
 
 114         switch (GET_PTR_TYPE(p)) {
 
 115         case PTR_TYPE_INTERNAL:
 
 116                 *tree = CLR_PTR_TYPE(p);
 
 118                 return note_tree_search(t, tree, n, key_sha1);
 
 119         case PTR_TYPE_SUBTREE:
 
 120                 l = (struct leaf_node *) CLR_PTR_TYPE(p);
 
 121                 if (!SUBTREE_SHA1_PREFIXCMP(key_sha1, l->key_sha1)) {
 
 122                         /* unpack tree and resume search */
 
 123                         (*tree)->a[i] = NULL;
 
 124                         load_subtree(t, l, *tree, *n);
 
 126                         return note_tree_search(t, tree, n, key_sha1);
 
 130                 return &((*tree)->a[i]);
 
 135  * To find a leaf_node:
 
 136  * Search to the tree location appropriate for the given key:
 
 137  * If a note entry with matching key, return the note entry, else return NULL.
 
 139 static struct leaf_node *note_tree_find(struct notes_tree *t,
 
 140                 struct int_node *tree, unsigned char n,
 
 141                 const unsigned char *key_sha1)
 
 143         void **p = note_tree_search(t, &tree, &n, key_sha1);
 
 144         if (GET_PTR_TYPE(*p) == PTR_TYPE_NOTE) {
 
 145                 struct leaf_node *l = (struct leaf_node *) CLR_PTR_TYPE(*p);
 
 146                 if (!hashcmp(key_sha1, l->key_sha1))
 
 153  * How to consolidate an int_node:
 
 154  * If there are > 1 non-NULL entries, give up and return non-zero.
 
 155  * Otherwise replace the int_node at the given index in the given parent node
 
 156  * with the only entry (or a NULL entry if no entries) from the given tree,
 
 159 static int note_tree_consolidate(struct int_node *tree,
 
 160         struct int_node *parent, unsigned char index)
 
 165         assert(tree && parent);
 
 166         assert(CLR_PTR_TYPE(parent->a[index]) == tree);
 
 168         for (i = 0; i < 16; i++) {
 
 169                 if (GET_PTR_TYPE(tree->a[i]) != PTR_TYPE_NULL) {
 
 170                         if (p) /* more than one entry */
 
 176         /* replace tree with p in parent[index] */
 
 177         parent->a[index] = p;
 
 183  * To remove a leaf_node:
 
 184  * Search to the tree location appropriate for the given leaf_node's key:
 
 185  * - If location does not hold a matching entry, abort and do nothing.
 
 186  * - Copy the matching entry's value into the given entry.
 
 187  * - Replace the matching leaf_node with a NULL entry (and free the leaf_node).
 
 188  * - Consolidate int_nodes repeatedly, while walking up the tree towards root.
 
 190 static void note_tree_remove(struct notes_tree *t,
 
 191                 struct int_node *tree, unsigned char n,
 
 192                 struct leaf_node *entry)
 
 195         struct int_node *parent_stack[20];
 
 197         void **p = note_tree_search(t, &tree, &n, entry->key_sha1);
 
 199         assert(GET_PTR_TYPE(entry) == 0); /* no type bits set */
 
 200         if (GET_PTR_TYPE(*p) != PTR_TYPE_NOTE)
 
 201                 return; /* type mismatch, nothing to remove */
 
 202         l = (struct leaf_node *) CLR_PTR_TYPE(*p);
 
 203         if (hashcmp(l->key_sha1, entry->key_sha1))
 
 204                 return; /* key mismatch, nothing to remove */
 
 206         /* we have found a matching entry */
 
 207         hashcpy(entry->val_sha1, l->val_sha1);
 
 209         *p = SET_PTR_TYPE(NULL, PTR_TYPE_NULL);
 
 211         /* consolidate this tree level, and parent levels, if possible */
 
 213                 return; /* cannot consolidate top level */
 
 214         /* first, build stack of ancestors between root and current node */
 
 215         parent_stack[0] = t->root;
 
 216         for (i = 0; i < n; i++) {
 
 217                 j = GET_NIBBLE(i, entry->key_sha1);
 
 218                 parent_stack[i + 1] = CLR_PTR_TYPE(parent_stack[i]->a[j]);
 
 220         assert(i == n && parent_stack[i] == tree);
 
 221         /* next, unwind stack until note_tree_consolidate() is done */
 
 223                !note_tree_consolidate(parent_stack[i], parent_stack[i - 1],
 
 224                                       GET_NIBBLE(i - 1, entry->key_sha1)))
 
 229  * To insert a leaf_node:
 
 230  * Search to the tree location appropriate for the given leaf_node's key:
 
 231  * - If location is unused (NULL), store the tweaked pointer directly there
 
 232  * - If location holds a note entry that matches the note-to-be-inserted, then
 
 233  *   combine the two notes (by calling the given combine_notes function).
 
 234  * - If location holds a note entry that matches the subtree-to-be-inserted,
 
 235  *   then unpack the subtree-to-be-inserted into the location.
 
 236  * - If location holds a matching subtree entry, unpack the subtree at that
 
 237  *   location, and restart the insert operation from that level.
 
 238  * - Else, create a new int_node, holding both the node-at-location and the
 
 239  *   node-to-be-inserted, and store the new int_node into the location.
 
 241 static int note_tree_insert(struct notes_tree *t, struct int_node *tree,
 
 242                 unsigned char n, struct leaf_node *entry, unsigned char type,
 
 243                 combine_notes_fn combine_notes)
 
 245         struct int_node *new_node;
 
 247         void **p = note_tree_search(t, &tree, &n, entry->key_sha1);
 
 250         assert(GET_PTR_TYPE(entry) == 0); /* no type bits set */
 
 251         l = (struct leaf_node *) CLR_PTR_TYPE(*p);
 
 252         switch (GET_PTR_TYPE(*p)) {
 
 255                 if (is_null_sha1(entry->val_sha1))
 
 258                         *p = SET_PTR_TYPE(entry, type);
 
 263                         if (!hashcmp(l->key_sha1, entry->key_sha1)) {
 
 264                                 /* skip concatenation if l == entry */
 
 265                                 if (!hashcmp(l->val_sha1, entry->val_sha1))
 
 268                                 ret = combine_notes(l->val_sha1,
 
 270                                 if (!ret && is_null_sha1(l->val_sha1))
 
 271                                         note_tree_remove(t, tree, n, entry);
 
 276                 case PTR_TYPE_SUBTREE:
 
 277                         if (!SUBTREE_SHA1_PREFIXCMP(l->key_sha1,
 
 280                                 load_subtree(t, entry, tree, n);
 
 287         case PTR_TYPE_SUBTREE:
 
 288                 if (!SUBTREE_SHA1_PREFIXCMP(entry->key_sha1, l->key_sha1)) {
 
 289                         /* unpack 'l' and restart insert */
 
 291                         load_subtree(t, l, tree, n);
 
 293                         return note_tree_insert(t, tree, n, entry, type,
 
 299         /* non-matching leaf_node */
 
 300         assert(GET_PTR_TYPE(*p) == PTR_TYPE_NOTE ||
 
 301                GET_PTR_TYPE(*p) == PTR_TYPE_SUBTREE);
 
 302         if (is_null_sha1(entry->val_sha1)) { /* skip insertion of empty note */
 
 306         new_node = (struct int_node *) xcalloc(sizeof(struct int_node), 1);
 
 307         ret = note_tree_insert(t, new_node, n + 1, l, GET_PTR_TYPE(*p),
 
 311         *p = SET_PTR_TYPE(new_node, PTR_TYPE_INTERNAL);
 
 312         return note_tree_insert(t, new_node, n + 1, entry, type, combine_notes);
 
 315 /* Free the entire notes data contained in the given tree */
 
 316 static void note_tree_free(struct int_node *tree)
 
 319         for (i = 0; i < 16; i++) {
 
 320                 void *p = tree->a[i];
 
 321                 switch (GET_PTR_TYPE(p)) {
 
 322                 case PTR_TYPE_INTERNAL:
 
 323                         note_tree_free(CLR_PTR_TYPE(p));
 
 326                 case PTR_TYPE_SUBTREE:
 
 327                         free(CLR_PTR_TYPE(p));
 
 333  * Convert a partial SHA1 hex string to the corresponding partial SHA1 value.
 
 334  * - hex      - Partial SHA1 segment in ASCII hex format
 
 335  * - hex_len  - Length of above segment. Must be multiple of 2 between 0 and 40
 
 336  * - sha1     - Partial SHA1 value is written here
 
 337  * - sha1_len - Max #bytes to store in sha1, Must be >= hex_len / 2, and < 20
 
 338  * Returns -1 on error (invalid arguments or invalid SHA1 (not in hex format)).
 
 339  * Otherwise, returns number of bytes written to sha1 (i.e. hex_len / 2).
 
 340  * Pads sha1 with NULs up to sha1_len (not included in returned length).
 
 342 static int get_sha1_hex_segment(const char *hex, unsigned int hex_len,
 
 343                 unsigned char *sha1, unsigned int sha1_len)
 
 345         unsigned int i, len = hex_len >> 1;
 
 346         if (hex_len % 2 != 0 || len > sha1_len)
 
 348         for (i = 0; i < len; i++) {
 
 349                 unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
 
 355         for (; i < sha1_len; i++)
 
 360 static int non_note_cmp(const struct non_note *a, const struct non_note *b)
 
 362         return strcmp(a->path, b->path);
 
 365 static void add_non_note(struct notes_tree *t, const char *path,
 
 366                 unsigned int mode, const unsigned char *sha1)
 
 368         struct non_note *p = t->prev_non_note, *n;
 
 369         n = (struct non_note *) xmalloc(sizeof(struct non_note));
 
 371         n->path = xstrdup(path);
 
 373         hashcpy(n->sha1, sha1);
 
 374         t->prev_non_note = n;
 
 376         if (!t->first_non_note) {
 
 377                 t->first_non_note = n;
 
 381         if (non_note_cmp(p, n) < 0)
 
 383         else if (non_note_cmp(t->first_non_note, n) <= 0)
 
 384                 p = t->first_non_note;
 
 386                 /* n sorts before t->first_non_note */
 
 387                 n->next = t->first_non_note;
 
 388                 t->first_non_note = n;
 
 392         /* n sorts equal or after p */
 
 393         while (p->next && non_note_cmp(p->next, n) <= 0)
 
 396         if (non_note_cmp(p, n) == 0) { /* n ~= p; overwrite p with n */
 
 397                 assert(strcmp(p->path, n->path) == 0);
 
 399                 hashcpy(p->sha1, n->sha1);
 
 401                 t->prev_non_note = p;
 
 405         /* n sorts between p and p->next */
 
 410 static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
 
 411                 struct int_node *node, unsigned int n)
 
 413         unsigned char object_sha1[20];
 
 414         unsigned int prefix_len;
 
 416         struct tree_desc desc;
 
 417         struct name_entry entry;
 
 422         buf = fill_tree_descriptor(&desc, subtree->val_sha1);
 
 424                 die("Could not read %s for notes-index",
 
 425                      sha1_to_hex(subtree->val_sha1));
 
 427         prefix_len = subtree->key_sha1[19];
 
 428         assert(prefix_len * 2 >= n);
 
 429         memcpy(object_sha1, subtree->key_sha1, prefix_len);
 
 430         while (tree_entry(&desc, &entry)) {
 
 431                 path_len = strlen(entry.path);
 
 432                 len = get_sha1_hex_segment(entry.path, path_len,
 
 433                                 object_sha1 + prefix_len, 20 - prefix_len);
 
 435                         goto handle_non_note; /* entry.path is not a SHA1 */
 
 439                  * If object SHA1 is complete (len == 20), assume note object
 
 440                  * If object SHA1 is incomplete (len < 20), and current
 
 441                  * component consists of 2 hex chars, assume note subtree
 
 444                         type = PTR_TYPE_NOTE;
 
 445                         l = (struct leaf_node *)
 
 446                                 xcalloc(sizeof(struct leaf_node), 1);
 
 447                         hashcpy(l->key_sha1, object_sha1);
 
 448                         hashcpy(l->val_sha1, entry.sha1);
 
 450                                 if (!S_ISDIR(entry.mode) || path_len != 2)
 
 451                                         goto handle_non_note; /* not subtree */
 
 452                                 l->key_sha1[19] = (unsigned char) len;
 
 453                                 type = PTR_TYPE_SUBTREE;
 
 455                         if (note_tree_insert(t, node, n, l, type,
 
 456                                              combine_notes_concatenate))
 
 457                                 die("Failed to load %s %s into notes tree "
 
 459                                     type == PTR_TYPE_NOTE ? "note" : "subtree",
 
 460                                     sha1_to_hex(l->key_sha1), t->ref);
 
 466                  * Determine full path for this non-note entry:
 
 467                  * The filename is already found in entry.path, but the
 
 468                  * directory part of the path must be deduced from the subtree
 
 469                  * containing this entry. We assume here that the overall notes
 
 470                  * tree follows a strict byte-based progressive fanout
 
 471                  * structure (i.e. using 2/38, 2/2/36, etc. fanouts, and not
 
 472                  * e.g. 4/36 fanout). This means that if a non-note is found at
 
 473                  * path "dead/beef", the following code will register it as
 
 474                  * being found on "de/ad/beef".
 
 475                  * On the other hand, if you use such non-obvious non-note
 
 476                  * paths in the middle of a notes tree, you deserve what's
 
 477                  * coming to you ;). Note that for non-notes that are not
 
 478                  * SHA1-like at the top level, there will be no problems.
 
 480                  * To conclude, it is strongly advised to make sure non-notes
 
 481                  * have at least one non-hex character in the top-level path
 
 485                         char non_note_path[PATH_MAX];
 
 486                         char *p = non_note_path;
 
 487                         const char *q = sha1_to_hex(subtree->key_sha1);
 
 489                         for (i = 0; i < prefix_len; i++) {
 
 494                         strcpy(p, entry.path);
 
 495                         add_non_note(t, non_note_path, entry.mode, entry.sha1);
 
 502  * Determine optimal on-disk fanout for this part of the notes tree
 
 504  * Given a (sub)tree and the level in the internal tree structure, determine
 
 505  * whether or not the given existing fanout should be expanded for this
 
 508  * Values of the 'fanout' variable:
 
 509  * - 0: No fanout (all notes are stored directly in the root notes tree)
 
 512  * - 3: 2/2/2/34 fanout
 
 515 static unsigned char determine_fanout(struct int_node *tree, unsigned char n,
 
 516                 unsigned char fanout)
 
 519          * The following is a simple heuristic that works well in practice:
 
 520          * For each even-numbered 16-tree level (remember that each on-disk
 
 521          * fanout level corresponds to _two_ 16-tree levels), peek at all 16
 
 522          * entries at that tree level. If all of them are either int_nodes or
 
 523          * subtree entries, then there are likely plenty of notes below this
 
 524          * level, so we return an incremented fanout.
 
 527         if ((n % 2) || (n > 2 * fanout))
 
 529         for (i = 0; i < 16; i++) {
 
 530                 switch (GET_PTR_TYPE(tree->a[i])) {
 
 531                 case PTR_TYPE_SUBTREE:
 
 532                 case PTR_TYPE_INTERNAL:
 
 541 static void construct_path_with_fanout(const unsigned char *sha1,
 
 542                 unsigned char fanout, char *path)
 
 544         unsigned int i = 0, j = 0;
 
 545         const char *hex_sha1 = sha1_to_hex(sha1);
 
 548                 path[i++] = hex_sha1[j++];
 
 549                 path[i++] = hex_sha1[j++];
 
 553         strcpy(path + i, hex_sha1 + j);
 
 556 static int for_each_note_helper(struct notes_tree *t, struct int_node *tree,
 
 557                 unsigned char n, unsigned char fanout, int flags,
 
 558                 each_note_fn fn, void *cb_data)
 
 564         static char path[40 + 19 + 1];  /* hex SHA1 + 19 * '/' + NUL */
 
 566         fanout = determine_fanout(tree, n, fanout);
 
 567         for (i = 0; i < 16; i++) {
 
 570                 switch (GET_PTR_TYPE(p)) {
 
 571                 case PTR_TYPE_INTERNAL:
 
 572                         /* recurse into int_node */
 
 573                         ret = for_each_note_helper(t, CLR_PTR_TYPE(p), n + 1,
 
 574                                 fanout, flags, fn, cb_data);
 
 576                 case PTR_TYPE_SUBTREE:
 
 577                         l = (struct leaf_node *) CLR_PTR_TYPE(p);
 
 579                          * Subtree entries in the note tree represent parts of
 
 580                          * the note tree that have not yet been explored. There
 
 581                          * is a direct relationship between subtree entries at
 
 582                          * level 'n' in the tree, and the 'fanout' variable:
 
 583                          * Subtree entries at level 'n <= 2 * fanout' should be
 
 584                          * preserved, since they correspond exactly to a fanout
 
 585                          * directory in the on-disk structure. However, subtree
 
 586                          * entries at level 'n > 2 * fanout' should NOT be
 
 587                          * preserved, but rather consolidated into the above
 
 588                          * notes tree level. We achieve this by unconditionally
 
 589                          * unpacking subtree entries that exist below the
 
 590                          * threshold level at 'n = 2 * fanout'.
 
 592                         if (n <= 2 * fanout &&
 
 593                             flags & FOR_EACH_NOTE_YIELD_SUBTREES) {
 
 594                                 /* invoke callback with subtree */
 
 595                                 unsigned int path_len =
 
 596                                         l->key_sha1[19] * 2 + fanout;
 
 597                                 assert(path_len < 40 + 19);
 
 598                                 construct_path_with_fanout(l->key_sha1, fanout,
 
 600                                 /* Create trailing slash, if needed */
 
 601                                 if (path[path_len - 1] != '/')
 
 602                                         path[path_len++] = '/';
 
 603                                 path[path_len] = '\0';
 
 604                                 ret = fn(l->key_sha1, l->val_sha1, path,
 
 607                         if (n > fanout * 2 ||
 
 608                             !(flags & FOR_EACH_NOTE_DONT_UNPACK_SUBTREES)) {
 
 609                                 /* unpack subtree and resume traversal */
 
 611                                 load_subtree(t, l, tree, n);
 
 617                         l = (struct leaf_node *) CLR_PTR_TYPE(p);
 
 618                         construct_path_with_fanout(l->key_sha1, fanout, path);
 
 619                         ret = fn(l->key_sha1, l->val_sha1, path, cb_data);
 
 628 struct tree_write_stack {
 
 629         struct tree_write_stack *next;
 
 631         char path[2]; /* path to subtree in next, if any */
 
 634 static inline int matches_tree_write_stack(struct tree_write_stack *tws,
 
 635                 const char *full_path)
 
 637         return  full_path[0] == tws->path[0] &&
 
 638                 full_path[1] == tws->path[1] &&
 
 642 static void write_tree_entry(struct strbuf *buf, unsigned int mode,
 
 643                 const char *path, unsigned int path_len, const
 
 646         strbuf_addf(buf, "%o %.*s%c", mode, path_len, path, '\0');
 
 647         strbuf_add(buf, sha1, 20);
 
 650 static void tree_write_stack_init_subtree(struct tree_write_stack *tws,
 
 653         struct tree_write_stack *n;
 
 655         assert(tws->path[0] == '\0' && tws->path[1] == '\0');
 
 656         n = (struct tree_write_stack *)
 
 657                 xmalloc(sizeof(struct tree_write_stack));
 
 659         strbuf_init(&n->buf, 256 * (32 + 40)); /* assume 256 entries per tree */
 
 660         n->path[0] = n->path[1] = '\0';
 
 662         tws->path[0] = path[0];
 
 663         tws->path[1] = path[1];
 
 666 static int tree_write_stack_finish_subtree(struct tree_write_stack *tws)
 
 669         struct tree_write_stack *n = tws->next;
 
 672                 ret = tree_write_stack_finish_subtree(n);
 
 675                 ret = write_sha1_file(n->buf.buf, n->buf.len, tree_type, s);
 
 678                 strbuf_release(&n->buf);
 
 681                 write_tree_entry(&tws->buf, 040000, tws->path, 2, s);
 
 682                 tws->path[0] = tws->path[1] = '\0';
 
 687 static int write_each_note_helper(struct tree_write_stack *tws,
 
 688                 const char *path, unsigned int mode,
 
 689                 const unsigned char *sha1)
 
 691         size_t path_len = strlen(path);
 
 695         /* Determine common part of tree write stack */
 
 696         while (tws && 3 * n < path_len &&
 
 697                matches_tree_write_stack(tws, path + 3 * n)) {
 
 702         /* tws point to last matching tree_write_stack entry */
 
 703         ret = tree_write_stack_finish_subtree(tws);
 
 707         /* Start subtrees needed to satisfy path */
 
 708         while (3 * n + 2 < path_len && path[3 * n + 2] == '/') {
 
 709                 tree_write_stack_init_subtree(tws, path + 3 * n);
 
 714         /* There should be no more directory components in the given path */
 
 715         assert(memchr(path + 3 * n, '/', path_len - (3 * n)) == NULL);
 
 717         /* Finally add given entry to the current tree object */
 
 718         write_tree_entry(&tws->buf, mode, path + 3 * n, path_len - (3 * n),
 
 724 struct write_each_note_data {
 
 725         struct tree_write_stack *root;
 
 726         struct non_note *next_non_note;
 
 729 static int write_each_non_note_until(const char *note_path,
 
 730                 struct write_each_note_data *d)
 
 732         struct non_note *n = d->next_non_note;
 
 734         while (n && (!note_path || (cmp = strcmp(n->path, note_path)) <= 0)) {
 
 735                 if (note_path && cmp == 0)
 
 736                         ; /* do nothing, prefer note to non-note */
 
 738                         ret = write_each_note_helper(d->root, n->path, n->mode,
 
 745         d->next_non_note = n;
 
 749 static int write_each_note(const unsigned char *object_sha1,
 
 750                 const unsigned char *note_sha1, char *note_path,
 
 753         struct write_each_note_data *d =
 
 754                 (struct write_each_note_data *) cb_data;
 
 755         size_t note_path_len = strlen(note_path);
 
 756         unsigned int mode = 0100644;
 
 758         if (note_path[note_path_len - 1] == '/') {
 
 761                 note_path[note_path_len] = '\0';
 
 764         assert(note_path_len <= 40 + 19);
 
 766         /* Weave non-note entries into note entries */
 
 767         return  write_each_non_note_until(note_path, d) ||
 
 768                 write_each_note_helper(d->root, note_path, mode, note_sha1);
 
 771 struct note_delete_list {
 
 772         struct note_delete_list *next;
 
 773         const unsigned char *sha1;
 
 776 static int prune_notes_helper(const unsigned char *object_sha1,
 
 777                 const unsigned char *note_sha1, char *note_path,
 
 780         struct note_delete_list **l = (struct note_delete_list **) cb_data;
 
 781         struct note_delete_list *n;
 
 783         if (has_sha1_file(object_sha1))
 
 784                 return 0; /* nothing to do for this note */
 
 786         /* failed to find object => prune this note */
 
 787         n = (struct note_delete_list *) xmalloc(sizeof(*n));
 
 789         n->sha1 = object_sha1;
 
 794 int combine_notes_concatenate(unsigned char *cur_sha1,
 
 795                 const unsigned char *new_sha1)
 
 797         char *cur_msg = NULL, *new_msg = NULL, *buf;
 
 798         unsigned long cur_len, new_len, buf_len;
 
 799         enum object_type cur_type, new_type;
 
 802         /* read in both note blob objects */
 
 803         if (!is_null_sha1(new_sha1))
 
 804                 new_msg = read_sha1_file(new_sha1, &new_type, &new_len);
 
 805         if (!new_msg || !new_len || new_type != OBJ_BLOB) {
 
 809         if (!is_null_sha1(cur_sha1))
 
 810                 cur_msg = read_sha1_file(cur_sha1, &cur_type, &cur_len);
 
 811         if (!cur_msg || !cur_len || cur_type != OBJ_BLOB) {
 
 814                 hashcpy(cur_sha1, new_sha1);
 
 818         /* we will separate the notes by two newlines anyway */
 
 819         if (cur_msg[cur_len - 1] == '\n')
 
 822         /* concatenate cur_msg and new_msg into buf */
 
 823         buf_len = cur_len + 2 + new_len;
 
 824         buf = (char *) xmalloc(buf_len);
 
 825         memcpy(buf, cur_msg, cur_len);
 
 827         buf[cur_len + 1] = '\n';
 
 828         memcpy(buf + cur_len + 2, new_msg, new_len);
 
 832         /* create a new blob object from buf */
 
 833         ret = write_sha1_file(buf, buf_len, blob_type, cur_sha1);
 
 838 int combine_notes_overwrite(unsigned char *cur_sha1,
 
 839                 const unsigned char *new_sha1)
 
 841         hashcpy(cur_sha1, new_sha1);
 
 845 int combine_notes_ignore(unsigned char *cur_sha1,
 
 846                 const unsigned char *new_sha1)
 
 851 static int string_list_add_note_lines(struct string_list *sort_uniq_list,
 
 852                                       const unsigned char *sha1)
 
 857         struct strbuf buf = STRBUF_INIT;
 
 858         struct strbuf **lines = NULL;
 
 861         if (is_null_sha1(sha1))
 
 864         /* read_sha1_file NUL-terminates */
 
 865         data = read_sha1_file(sha1, &t, &len);
 
 866         if (t != OBJ_BLOB || !data || !len) {
 
 868                 return t != OBJ_BLOB || !data;
 
 871         strbuf_attach(&buf, data, len, len + 1);
 
 872         lines = strbuf_split(&buf, '\n');
 
 874         for (i = 0; lines[i]; i++) {
 
 875                 if (lines[i]->buf[lines[i]->len - 1] == '\n')
 
 876                         strbuf_setlen(lines[i], lines[i]->len - 1);
 
 878                         continue; /* skip empty lines */
 
 879                 list_index = string_list_find_insert_index(sort_uniq_list,
 
 882                         continue; /* skip duplicate lines */
 
 883                 string_list_insert_at_index(sort_uniq_list, list_index,
 
 887         strbuf_list_free(lines);
 
 888         strbuf_release(&buf);
 
 892 static int string_list_join_lines_helper(struct string_list_item *item,
 
 895         struct strbuf *buf = cb_data;
 
 896         strbuf_addstr(buf, item->string);
 
 897         strbuf_addch(buf, '\n');
 
 901 int combine_notes_cat_sort_uniq(unsigned char *cur_sha1,
 
 902                 const unsigned char *new_sha1)
 
 904         struct string_list sort_uniq_list = { NULL, 0, 0, 1 };
 
 905         struct strbuf buf = STRBUF_INIT;
 
 908         /* read both note blob objects into unique_lines */
 
 909         if (string_list_add_note_lines(&sort_uniq_list, cur_sha1))
 
 911         if (string_list_add_note_lines(&sort_uniq_list, new_sha1))
 
 914         /* create a new blob object from sort_uniq_list */
 
 915         if (for_each_string_list(&sort_uniq_list,
 
 916                                  string_list_join_lines_helper, &buf))
 
 919         ret = write_sha1_file(buf.buf, buf.len, blob_type, cur_sha1);
 
 922         strbuf_release(&buf);
 
 923         string_list_clear(&sort_uniq_list, 0);
 
 927 static int string_list_add_one_ref(const char *path, const unsigned char *sha1,
 
 930         struct string_list *refs = cb;
 
 931         if (!unsorted_string_list_has_string(refs, path))
 
 932                 string_list_append(refs, path);
 
 936 void string_list_add_refs_by_glob(struct string_list *list, const char *glob)
 
 938         if (has_glob_specials(glob)) {
 
 939                 for_each_glob_ref(string_list_add_one_ref, glob, list);
 
 941                 unsigned char sha1[20];
 
 942                 if (get_sha1(glob, sha1))
 
 943                         warning("notes ref %s is invalid", glob);
 
 944                 if (!unsorted_string_list_has_string(list, glob))
 
 945                         string_list_append(list, glob);
 
 949 void string_list_add_refs_from_colon_sep(struct string_list *list,
 
 952         struct strbuf globbuf = STRBUF_INIT;
 
 953         struct strbuf **split;
 
 956         strbuf_addstr(&globbuf, globs);
 
 957         split = strbuf_split(&globbuf, ':');
 
 959         for (i = 0; split[i]; i++) {
 
 962                 if (split[i]->buf[split[i]->len-1] == ':')
 
 963                         strbuf_setlen(split[i], split[i]->len-1);
 
 964                 string_list_add_refs_by_glob(list, split[i]->buf);
 
 967         strbuf_list_free(split);
 
 968         strbuf_release(&globbuf);
 
 971 static int notes_display_config(const char *k, const char *v, void *cb)
 
 975         if (*load_refs && !strcmp(k, "notes.displayref")) {
 
 977                         config_error_nonbool(k);
 
 978                 string_list_add_refs_by_glob(&display_notes_refs, v);
 
 984 const char *default_notes_ref(void)
 
 986         const char *notes_ref = NULL;
 
 988                 notes_ref = getenv(GIT_NOTES_REF_ENVIRONMENT);
 
 990                 notes_ref = notes_ref_name; /* value of core.notesRef config */
 
 992                 notes_ref = GIT_NOTES_DEFAULT_REF;
 
 996 void init_notes(struct notes_tree *t, const char *notes_ref,
 
 997                 combine_notes_fn combine_notes, int flags)
 
 999         unsigned char sha1[20], object_sha1[20];
 
1001         struct leaf_node root_tree;
 
1004                 t = &default_notes_tree;
 
1005         assert(!t->initialized);
 
1008                 notes_ref = default_notes_ref();
 
1011                 combine_notes = combine_notes_concatenate;
 
1013         t->root = (struct int_node *) xcalloc(sizeof(struct int_node), 1);
 
1014         t->first_non_note = NULL;
 
1015         t->prev_non_note = NULL;
 
1016         t->ref = notes_ref ? xstrdup(notes_ref) : NULL;
 
1017         t->combine_notes = combine_notes;
 
1021         if (flags & NOTES_INIT_EMPTY || !notes_ref ||
 
1022             read_ref(notes_ref, object_sha1))
 
1024         if (get_tree_entry(object_sha1, "", sha1, &mode))
 
1025                 die("Failed to read notes tree referenced by %s (%s)",
 
1026                     notes_ref, sha1_to_hex(object_sha1));
 
1028         hashclr(root_tree.key_sha1);
 
1029         hashcpy(root_tree.val_sha1, sha1);
 
1030         load_subtree(t, &root_tree, t->root, 0);
 
1033 struct notes_tree **load_notes_trees(struct string_list *refs)
 
1035         struct string_list_item *item;
 
1037         struct notes_tree **trees;
 
1038         trees = xmalloc((refs->nr+1) * sizeof(struct notes_tree *));
 
1039         for_each_string_list_item(item, refs) {
 
1040                 struct notes_tree *t = xcalloc(1, sizeof(struct notes_tree));
 
1041                 init_notes(t, item->string, combine_notes_ignore, 0);
 
1042                 trees[counter++] = t;
 
1044         trees[counter] = NULL;
 
1048 void init_display_notes(struct display_notes_opt *opt)
 
1050         char *display_ref_env;
 
1051         int load_config_refs = 0;
 
1052         display_notes_refs.strdup_strings = 1;
 
1054         assert(!display_notes_trees);
 
1056         if (!opt || opt->use_default_notes > 0 ||
 
1057             (opt->use_default_notes == -1 && !opt->extra_notes_refs.nr)) {
 
1058                 string_list_append(&display_notes_refs, default_notes_ref());
 
1059                 display_ref_env = getenv(GIT_NOTES_DISPLAY_REF_ENVIRONMENT);
 
1060                 if (display_ref_env) {
 
1061                         string_list_add_refs_from_colon_sep(&display_notes_refs,
 
1063                         load_config_refs = 0;
 
1065                         load_config_refs = 1;
 
1068         git_config(notes_display_config, &load_config_refs);
 
1071                 struct string_list_item *item;
 
1072                 for_each_string_list_item(item, &opt->extra_notes_refs)
 
1073                         string_list_add_refs_by_glob(&display_notes_refs,
 
1077         display_notes_trees = load_notes_trees(&display_notes_refs);
 
1078         string_list_clear(&display_notes_refs, 0);
 
1081 int add_note(struct notes_tree *t, const unsigned char *object_sha1,
 
1082                 const unsigned char *note_sha1, combine_notes_fn combine_notes)
 
1084         struct leaf_node *l;
 
1087                 t = &default_notes_tree;
 
1088         assert(t->initialized);
 
1091                 combine_notes = t->combine_notes;
 
1092         l = (struct leaf_node *) xmalloc(sizeof(struct leaf_node));
 
1093         hashcpy(l->key_sha1, object_sha1);
 
1094         hashcpy(l->val_sha1, note_sha1);
 
1095         return note_tree_insert(t, t->root, 0, l, PTR_TYPE_NOTE, combine_notes);
 
1098 int remove_note(struct notes_tree *t, const unsigned char *object_sha1)
 
1103                 t = &default_notes_tree;
 
1104         assert(t->initialized);
 
1105         hashcpy(l.key_sha1, object_sha1);
 
1106         hashclr(l.val_sha1);
 
1107         note_tree_remove(t, t->root, 0, &l);
 
1108         if (is_null_sha1(l.val_sha1)) /* no note was removed */
 
1114 const unsigned char *get_note(struct notes_tree *t,
 
1115                 const unsigned char *object_sha1)
 
1117         struct leaf_node *found;
 
1120                 t = &default_notes_tree;
 
1121         assert(t->initialized);
 
1122         found = note_tree_find(t, t->root, 0, object_sha1);
 
1123         return found ? found->val_sha1 : NULL;
 
1126 int for_each_note(struct notes_tree *t, int flags, each_note_fn fn,
 
1130                 t = &default_notes_tree;
 
1131         assert(t->initialized);
 
1132         return for_each_note_helper(t, t->root, 0, 0, flags, fn, cb_data);
 
1135 int write_notes_tree(struct notes_tree *t, unsigned char *result)
 
1137         struct tree_write_stack root;
 
1138         struct write_each_note_data cb_data;
 
1142                 t = &default_notes_tree;
 
1143         assert(t->initialized);
 
1145         /* Prepare for traversal of current notes tree */
 
1146         root.next = NULL; /* last forward entry in list is grounded */
 
1147         strbuf_init(&root.buf, 256 * (32 + 40)); /* assume 256 entries */
 
1148         root.path[0] = root.path[1] = '\0';
 
1149         cb_data.root = &root;
 
1150         cb_data.next_non_note = t->first_non_note;
 
1152         /* Write tree objects representing current notes tree */
 
1153         ret = for_each_note(t, FOR_EACH_NOTE_DONT_UNPACK_SUBTREES |
 
1154                                 FOR_EACH_NOTE_YIELD_SUBTREES,
 
1155                         write_each_note, &cb_data) ||
 
1156                 write_each_non_note_until(NULL, &cb_data) ||
 
1157                 tree_write_stack_finish_subtree(&root) ||
 
1158                 write_sha1_file(root.buf.buf, root.buf.len, tree_type, result);
 
1159         strbuf_release(&root.buf);
 
1163 void prune_notes(struct notes_tree *t, int flags)
 
1165         struct note_delete_list *l = NULL;
 
1168                 t = &default_notes_tree;
 
1169         assert(t->initialized);
 
1171         for_each_note(t, 0, prune_notes_helper, &l);
 
1174                 if (flags & NOTES_PRUNE_VERBOSE)
 
1175                         printf("%s\n", sha1_to_hex(l->sha1));
 
1176                 if (!(flags & NOTES_PRUNE_DRYRUN))
 
1177                         remove_note(t, l->sha1);
 
1182 void free_notes(struct notes_tree *t)
 
1185                 t = &default_notes_tree;
 
1187                 note_tree_free(t->root);
 
1189         while (t->first_non_note) {
 
1190                 t->prev_non_note = t->first_non_note->next;
 
1191                 free(t->first_non_note->path);
 
1192                 free(t->first_non_note);
 
1193                 t->first_non_note = t->prev_non_note;
 
1196         memset(t, 0, sizeof(struct notes_tree));
 
1199 void format_note(struct notes_tree *t, const unsigned char *object_sha1,
 
1200                 struct strbuf *sb, const char *output_encoding, int flags)
 
1202         static const char utf8[] = "utf-8";
 
1203         const unsigned char *sha1;
 
1205         unsigned long linelen, msglen;
 
1206         enum object_type type;
 
1209                 t = &default_notes_tree;
 
1210         if (!t->initialized)
 
1211                 init_notes(t, NULL, NULL, 0);
 
1213         sha1 = get_note(t, object_sha1);
 
1217         if (!(msg = read_sha1_file(sha1, &type, &msglen)) || !msglen ||
 
1223         if (output_encoding && *output_encoding &&
 
1224                         strcmp(utf8, output_encoding)) {
 
1225                 char *reencoded = reencode_string(msg, output_encoding, utf8);
 
1229                         msglen = strlen(msg);
 
1233         /* we will end the annotation by a newline anyway */
 
1234         if (msglen && msg[msglen - 1] == '\n')
 
1237         if (flags & NOTES_SHOW_HEADER) {
 
1238                 const char *ref = t->ref;
 
1239                 if (!ref || !strcmp(ref, GIT_NOTES_DEFAULT_REF)) {
 
1240                         strbuf_addstr(sb, "\nNotes:\n");
 
1242                         if (!prefixcmp(ref, "refs/"))
 
1244                         if (!prefixcmp(ref, "notes/"))
 
1246                         strbuf_addf(sb, "\nNotes (%s):\n", ref);
 
1250         for (msg_p = msg; msg_p < msg + msglen; msg_p += linelen + 1) {
 
1251                 linelen = strchrnul(msg_p, '\n') - msg_p;
 
1253                 if (flags & NOTES_INDENT)
 
1254                         strbuf_addstr(sb, "    ");
 
1255                 strbuf_add(sb, msg_p, linelen);
 
1256                 strbuf_addch(sb, '\n');
 
1262 void format_display_notes(const unsigned char *object_sha1,
 
1263                           struct strbuf *sb, const char *output_encoding, int flags)
 
1266         assert(display_notes_trees);
 
1267         for (i = 0; display_notes_trees[i]; i++)
 
1268                 format_note(display_notes_trees[i], object_sha1, sb,
 
1269                             output_encoding, flags);
 
1272 int copy_note(struct notes_tree *t,
 
1273               const unsigned char *from_obj, const unsigned char *to_obj,
 
1274               int force, combine_notes_fn combine_notes)
 
1276         const unsigned char *note = get_note(t, from_obj);
 
1277         const unsigned char *existing_note = get_note(t, to_obj);
 
1279         if (!force && existing_note)
 
1283                 return add_note(t, to_obj, note, combine_notes);
 
1284         else if (existing_note)
 
1285                 return add_note(t, to_obj, null_sha1, combine_notes);
 
1290 void expand_notes_ref(struct strbuf *sb)
 
1292         if (!prefixcmp(sb->buf, "refs/notes/"))
 
1293                 return; /* we're happy */
 
1294         else if (!prefixcmp(sb->buf, "notes/"))
 
1295                 strbuf_insert(sb, 0, "refs/", 5);
 
1297                 strbuf_insert(sb, 0, "refs/notes/", 11);