diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2007-03-05 12:49:02 -0500 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2007-03-05 12:50:29 -0500 |
commit | 6b4318e604ca729d5d7508a744f0155555094fae (patch) | |
tree | b8b65b5963737f9cd6663fc49fc6f902768b648a | |
parent | 5ced0572217f82f20c4a3460492768e07c08aeea (diff) | |
parent | 2f6dc35d2ad0bd2a8648902a692f087f47d1ee86 (diff) | |
download | git-6b4318e604ca729d5d7508a744f0155555094fae.tar.gz git-6b4318e604ca729d5d7508a744f0155555094fae.tar.xz |
Merge branch 'maint'
* maint:
fast-import: Fail if a non-existant commit is used for merge
fast-import: Avoid infinite loop after reset
[sp: Minor evil merge to deal with type_names array moving
to be private in 'master'.]
-rw-r--r-- | fast-import.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/fast-import.c b/fast-import.c index 65e99c2e8..cc3347b23 100644 --- a/fast-import.c +++ b/fast-import.c @@ -220,7 +220,8 @@ struct branch const char *name; struct tree_entry branch_tree; uintmax_t last_commit; - unsigned int pack_id; + unsigned active : 1; + unsigned pack_id : PACK_ID_BITS; unsigned char sha1[20]; }; @@ -528,6 +529,7 @@ static struct branch *new_branch(const char *name) b->table_next_branch = branch_table[hc]; b->branch_tree.versions[0].mode = S_IFDIR; b->branch_tree.versions[1].mode = S_IFDIR; + b->active = 0; b->pack_id = MAX_PACK_ID; branch_table[hc] = b; branch_count++; @@ -1547,6 +1549,7 @@ static void unload_one_branch(void) e = active_branches; active_branches = e->active_next_branch; } + e->active = 0; e->active_next_branch = NULL; if (e->branch_tree.tree) { release_tree_content_recursive(e->branch_tree.tree); @@ -1559,10 +1562,13 @@ static void unload_one_branch(void) static void load_branch(struct branch *b) { load_tree(&b->branch_tree); - b->active_next_branch = active_branches; - active_branches = b; - cur_active_branches++; - branch_load_count++; + if (!b->active) { + b->active = 1; + b->active_next_branch = active_branches; + active_branches = b; + cur_active_branches++; + branch_load_count++; + } } static void file_change_m(struct branch *b) @@ -1746,7 +1752,14 @@ static struct hash_list *cmd_merge(unsigned int *count) if (oe->type != OBJ_COMMIT) die("Mark :%" PRIuMAX " not a commit", idnum); hashcpy(n->sha1, oe->sha1); - } else if (get_sha1(from, n->sha1)) + } else if (!get_sha1(from, n->sha1)) { + unsigned long size; + char *buf = read_object_with_reference(n->sha1, + commit_type, &size, n->sha1); + if (!buf || size < 46) + die("Not a valid commit: %s", from); + free(buf); + } else die("Invalid ref name or SHA1 expression: %s", from); n->next = NULL; |