@ -1437,6 +1437,20 @@ static void store_tree(struct tree_entry *root)
@@ -1437,6 +1437,20 @@ static void store_tree(struct tree_entry *root)
t->entry_count -= del;
}
static void tree_content_replace(
struct tree_entry *root,
const unsigned char *sha1,
const uint16_t mode,
struct tree_content *newtree)
{
if (!S_ISDIR(mode))
die("Root cannot be a non-directory");
hashcpy(root->versions[1].sha1, sha1);
if (root->tree)
release_tree_content_recursive(root->tree);
root->tree = newtree;
}
static int tree_content_set(
struct tree_entry *root,
const char *p,
@ -1444,7 +1458,7 @@ static int tree_content_set(
@@ -1444,7 +1458,7 @@ static int tree_content_set(
const uint16_t mode,
struct tree_content *subtree)
{
struct tree_content *t = root->tree;
struct tree_content *t;
const char *slash1;
unsigned int i, n;
struct tree_entry *e;
@ -1454,20 +1468,14 @@ static int tree_content_set(
@@ -1454,20 +1468,14 @@ static int tree_content_set(
n = slash1 - p;
else
n = strlen(p);
if (!slash1 && !n) {
if (!S_ISDIR(mode))
die("Root cannot be a non-directory");
hashcpy(root->versions[1].sha1, sha1);
if (root->tree)
release_tree_content_recursive(root->tree);
root->tree = subtree;
return 1;
}
if (!n)
die("Empty path component found in input");
if (!slash1 && !S_ISDIR(mode) && subtree)
die("Non-directories cannot have subtrees");
if (!root->tree)
load_tree(root);
t = root->tree;
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp(p, e->name->str_dat, n)) {
@ -1523,7 +1531,7 @@ static int tree_content_remove(
@@ -1523,7 +1531,7 @@ static int tree_content_remove(
const char *p,
struct tree_entry *backup_leaf)
{
struct tree_content *t = root->tree;
struct tree_content *t;
const char *slash1;
unsigned int i, n;
struct tree_entry *e;
@ -1534,6 +1542,9 @@ static int tree_content_remove(
@@ -1534,6 +1542,9 @@ static int tree_content_remove(
else
n = strlen(p);
if (!root->tree)
load_tree(root);
t = root->tree;
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp(p, e->name->str_dat, n)) {
@ -1581,7 +1592,7 @@ static int tree_content_get(
@@ -1581,7 +1592,7 @@ static int tree_content_get(
const char *p,
struct tree_entry *leaf)
{
struct tree_content *t = root->tree;
struct tree_content *t;
const char *slash1;
unsigned int i, n;
struct tree_entry *e;
@ -1592,6 +1603,9 @@ static int tree_content_get(
@@ -1592,6 +1603,9 @@ static int tree_content_get(
else
n = strlen(p);
if (!root->tree)
load_tree(root);
t = root->tree;
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp(p, e->name->str_dat, n)) {
@ -2218,6 +2232,10 @@ static void file_change_m(struct branch *b)
@@ -2218,6 +2232,10 @@ static void file_change_m(struct branch *b)
command_buf.buf);
}
if (!*p) {
tree_content_replace(&b->branch_tree, sha1, mode, NULL);
return;
}
tree_content_set(&b->branch_tree, p, sha1, mode, NULL);
}
@ -2276,6 +2294,13 @@ static void file_change_cr(struct branch *b, int rename)
@@ -2276,6 +2294,13 @@ static void file_change_cr(struct branch *b, int rename)
tree_content_get(&b->branch_tree, s, &leaf);
if (!leaf.versions[1].mode)
die("Path %s not in branch", s);
if (!*d) { /* C "path/to/subdir" "" */
tree_content_replace(&b->branch_tree,
leaf.versions[1].sha1,
leaf.versions[1].mode,
leaf.tree);
return;
}
tree_content_set(&b->branch_tree, d,
leaf.versions[1].sha1,
leaf.versions[1].mode,