Code

Additional fast-import tree delta corruption cleanups.
authorShawn O. Pearce <spearce@spearce.org>
Tue, 29 Aug 2006 02:06:13 +0000 (22:06 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Sun, 14 Jan 2007 07:15:11 +0000 (02:15 -0500)
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
fast-import.c

index 34ff946fa39efb93085f534419ba35b1a572b56e..e35a89f6cd8388d70ee7a388c284c46816ba97bb 100644 (file)
@@ -478,6 +478,8 @@ static struct branch* new_branch(const char *name)
        b = pool_calloc(1, sizeof(struct branch));
        b->name = pool_strdup(name);
        b->table_next_branch = branch_table[hc];
+       b->branch_tree.versions[0].mode = S_IFDIR;
+       b->branch_tree.versions[1].mode = S_IFDIR;
        branch_table[hc] = b;
        branch_count++;
        return b;
@@ -955,9 +957,9 @@ static void store_tree(struct tree_entry *root)
                        store_tree(t->entries[i]);
        }
 
-       if (is_null_sha1(root->versions[0].sha1)
-                       || !find_object(root->versions[0].sha1)
-                       || !S_ISDIR(root->versions[0].mode)) {
+       if (!S_ISDIR(root->versions[0].mode)
+                       || is_null_sha1(root->versions[0].sha1)
+                       || !find_object(root->versions[0].sha1)) {
                lo.data = NULL;
                lo.depth = 0;
        } else {
@@ -967,13 +969,12 @@ static void store_tree(struct tree_entry *root)
                lo.no_free = 1;
                hashcpy(lo.sha1, root->versions[0].sha1);
        }
-       mktree(t, 1, &new_len, &new_tree);
 
+       mktree(t, 1, &new_len, &new_tree);
        store_object(OBJ_TREE, new_tree.buffer, new_len,
                &lo, root->versions[1].sha1, 0);
 
        t->delta_depth = lo.depth;
-       hashcpy(root->versions[0].sha1, root->versions[1].sha1);
        for (i = 0, j = 0, del = 0; i < t->entry_count; i++) {
                struct tree_entry *e = t->entries[i];
                if (e->versions[1].mode) {
@@ -1024,7 +1025,6 @@ static int tree_content_set(
                        if (!S_ISDIR(e->versions[1].mode)) {
                                e->tree = new_tree_content(8);
                                e->versions[1].mode = S_IFDIR;
-                               hashclr(e->versions[1].sha1);
                        }
                        if (!e->tree)
                                load_tree(e);
@@ -1046,7 +1046,6 @@ static int tree_content_set(
        if (slash1) {
                e->tree = new_tree_content(8);
                e->versions[1].mode = S_IFDIR;
-               hashclr(e->versions[1].sha1);
                tree_content_set(e, slash1 + 1, sha1, mode);
        } else {
                e->tree = NULL;
@@ -1564,6 +1563,8 @@ static void cmd_new_commit()
 
        /* build the tree and the commit */
        store_tree(&b->branch_tree);
+       hashcpy(b->branch_tree.versions[0].sha1,
+               b->branch_tree.versions[1].sha1);
        size_dbuf(&new_data, 97 + msglen
                + (author
                        ? strlen(author) + strlen(committer)
@@ -1823,9 +1824,9 @@ int main(int argc, const char **argv)
                fclose(branch_log);
 
        fprintf(stderr, "%s statistics:\n", argv[0]);
-       fprintf(stderr, "---------------------------------------------------\n");
+       fprintf(stderr, "---------------------------------------------------------------------\n");
        fprintf(stderr, "Alloc'd objects: %10lu (%10lu overflow  )\n", alloc_count, alloc_count - est_obj_cnt);
-       fprintf(stderr, "Total objects:   %10lu (%10lu duplicates)\n", object_count, duplicate_count);
+       fprintf(stderr, "Total objects:   %10lu (%10lu duplicates                  )\n", object_count, duplicate_count);
        fprintf(stderr, "      blobs  :   %10lu (%10lu duplicates %10lu deltas)\n", object_count_by_type[OBJ_BLOB], duplicate_count_by_type[OBJ_BLOB], delta_count_by_type[OBJ_BLOB]);
        fprintf(stderr, "      trees  :   %10lu (%10lu duplicates %10lu deltas)\n", object_count_by_type[OBJ_TREE], duplicate_count_by_type[OBJ_TREE], delta_count_by_type[OBJ_TREE]);
        fprintf(stderr, "      commits:   %10lu (%10lu duplicates %10lu deltas)\n", object_count_by_type[OBJ_COMMIT], duplicate_count_by_type[OBJ_COMMIT], delta_count_by_type[OBJ_COMMIT]);
@@ -1837,12 +1838,11 @@ int main(int argc, const char **argv)
        fprintf(stderr, "       pools:    %10lu KiB\n", total_allocd/1024);
        fprintf(stderr, "     objects:    %10lu KiB\n", (alloc_count*sizeof(struct object_entry))/1024);
        fprintf(stderr, "Pack remaps:     %10lu\n", remap_count);
-       fprintf(stderr, "---------------------------------------------------\n");
-
        stat(pack_name, &sb);
        fprintf(stderr, "Pack size:       %10lu KiB\n", (unsigned long)(sb.st_size/1024));
        stat(idx_name, &sb);
        fprintf(stderr, "Index size:      %10lu KiB\n", (unsigned long)(sb.st_size/1024));
+       fprintf(stderr, "---------------------------------------------------------------------\n");
 
        fprintf(stderr, "\n");