builtin/describe.c: print debug statements earlier
[gitweb.git] / notes.c
diff --git a/notes.c b/notes.c
index e83f5e81363a9eadef850a89ada36551ad29b797..5c62862574399acb486530d3fab5a7f659eb7c2f 100644 (file)
--- a/notes.c
+++ b/notes.c
@@ -335,25 +335,18 @@ static void note_tree_free(struct int_node *tree)
 }
 
 /*
- * Convert a partial SHA1 hex string to the corresponding partial SHA1 value.
- * - hex      - Partial SHA1 segment in ASCII hex format
- * - hex_len  - Length of above segment. Must be multiple of 2 between 0 and 40
- * - oid      - Partial SHA1 value is written here
- * Return 0 on success or -1 on error (invalid arguments or input not
- * in hex format).
+ * Read `len` pairs of hexadecimal digits from `hex` and write the
+ * values to `binary` as `len` bytes. Return 0 on success, or -1 if
+ * the input does not consist of hex digits).
  */
-static int get_oid_hex_segment(const char *hex, unsigned int hex_len,
-               unsigned char *oid)
+static int hex_to_bytes(unsigned char *binary, const char *hex, size_t len)
 {
-       unsigned int i, len = hex_len >> 1;
-       if (hex_len % 2 != 0)
-               return -1;
-       for (i = 0; i < len; i++) {
+       for (; len; len--, hex += 2) {
                unsigned int val = (hexval(hex[0]) << 4) | hexval(hex[1]);
+
                if (val & ~0xff)
                        return -1;
-               *oid++ = val;
-               hex += 2;
+               *binary++ = val;
        }
        return 0;
 }
@@ -413,23 +406,26 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                struct int_node *node, unsigned int n)
 {
        struct object_id object_oid;
-       unsigned int prefix_len;
+       size_t prefix_len;
        void *buf;
        struct tree_desc desc;
        struct name_entry entry;
 
-       buf = fill_tree_descriptor(&desc, subtree->val_oid.hash);
+       buf = fill_tree_descriptor(&desc, &subtree->val_oid);
        if (!buf)
                die("Could not read %s for notes-index",
                     oid_to_hex(&subtree->val_oid));
 
        prefix_len = subtree->key_oid.hash[KEY_INDEX];
-       assert(prefix_len * 2 >= n);
+       if (prefix_len >= GIT_SHA1_RAWSZ)
+               BUG("prefix_len (%"PRIuMAX") is out of range", (uintmax_t)prefix_len);
+       if (prefix_len * 2 < n)
+               BUG("prefix_len (%"PRIuMAX") is too small", (uintmax_t)prefix_len);
        memcpy(object_oid.hash, subtree->key_oid.hash, prefix_len);
        while (tree_entry(&desc, &entry)) {
                unsigned char type;
                struct leaf_node *l;
-               int path_len = strlen(entry.path);
+               size_t path_len = strlen(entry.path);
 
                if (path_len == 2 * (GIT_SHA1_RAWSZ - prefix_len)) {
                        /* This is potentially the remainder of the SHA-1 */
@@ -438,8 +434,8 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                                /* notes must be blobs */
                                goto handle_non_note;
 
-                       if (get_oid_hex_segment(entry.path, path_len,
-                                               object_oid.hash + prefix_len))
+                       if (hex_to_bytes(object_oid.hash + prefix_len, entry.path,
+                                        GIT_SHA1_RAWSZ - prefix_len))
                                goto handle_non_note; /* entry.path is not a SHA1 */
 
                        type = PTR_TYPE_NOTE;
@@ -451,8 +447,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                                /* internal nodes must be trees */
                                goto handle_non_note;
 
-                       if (get_oid_hex_segment(entry.path, 2,
-                                               object_oid.hash + len++))
+                       if (hex_to_bytes(object_oid.hash + len++, entry.path, 1))
                                goto handle_non_note; /* entry.path is not a SHA1 */
 
                        /*
@@ -494,7 +489,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
                {
                        struct strbuf non_note_path = STRBUF_INIT;
                        const char *q = oid_to_hex(&subtree->key_oid);
-                       int i;
+                       size_t i;
                        for (i = 0; i < prefix_len; i++) {
                                strbuf_addch(&non_note_path, *q++);
                                strbuf_addch(&non_note_path, *q++);
@@ -1030,7 +1025,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
        t->dirty = 0;
 
        if (flags & NOTES_INIT_EMPTY || !notes_ref ||
-           get_sha1_treeish(notes_ref, object_oid.hash))
+           get_oid_treeish(notes_ref, &object_oid))
                return;
        if (flags & NOTES_INIT_WRITABLE && read_ref(notes_ref, object_oid.hash))
                die("Cannot use notes ref %s", notes_ref);