170
#define DEPTH_BITS 13
171
#define MAX_DEPTH ((1<<DEPTH_BITS)-1)
172
173
+/*
174
+ * We abuse the setuid bit on directories to mean "do not delta".
175
+ */
176
+#define NO_DELTA S_ISUID
177
+
178
struct object_entry {
179
struct pack_idx_entry idx;
180
struct object_entry *next;
1419
struct tree_entry *e = t->entries[i];
1420
if (!e->versions[v].mode)
1421
continue;
1417
- strbuf_addf(b, "%o %s%c", (unsigned int)e->versions[v].mode,
1418
- e->name->str_dat, '\0');
1422
+ strbuf_addf(b, "%o %s%c",
1423
+ (unsigned int)(e->versions[v].mode & ~NO_DELTA),
1424
+ e->name->str_dat, '\0');
1425
strbuf_add(b, e->versions[v].sha1, 20);
1426
}
1427
}
1431
struct tree_content *t = root->tree;
1432
unsigned int i, j, del;
1433
struct last_object lo = { STRBUF_INIT, 0, 0, /* no_swap */ 1 };
1428
- struct object_entry *le;
1434
+ struct object_entry *le = NULL;
1435
1436
if (!is_null_sha1(root->versions[1].sha1))
1437
return;
1441
store_tree(t->entries[i]);
1442
}
1443
1438
- le = find_object(root->versions[0].sha1);
1444
+ if (!(root->versions[0].mode & NO_DELTA))
1445
+ le = find_object(root->versions[0].sha1);
1446
if (S_ISDIR(root->versions[0].mode) && le && le->pack_id == pack_id) {
1447
mktree(t, 0, &old_tree);
1448
lo.data = old_tree;
1476
{
1477
if (!S_ISDIR(mode))
1478
die("Root cannot be a non-directory");
1479
+ hashclr(root->versions[0].sha1);
1480
hashcpy(root->versions[1].sha1, sha1);
1481
if (root->tree)
1482
release_tree_content_recursive(root->tree);
1521
if (e->tree)
1522
release_tree_content_recursive(e->tree);
1523
e->tree = subtree;
1524
+
1525
+ /*
1526
+ * We need to leave e->versions[0].sha1 alone
1527
+ * to avoid modifying the preimage tree used
1528
+ * when writing out the parent directory.
1529
+ * But after replacing the subdir with a
1530
+ * completely different one, it's not a good
1531
+ * delta base any more, and besides, we've
1532
+ * thrown away the tree entries needed to
1533
+ * make a delta against it.
1534
+ *
1535
+ * So let's just explicitly disable deltas
1536
+ * for the subtree.
1537
+ */
1538
+ if (S_ISDIR(e->versions[0].mode))
1539
+ e->versions[0].mode |= NO_DELTA;
1540
+
1541
hashclr(root->versions[1].sha1);
1542
return 1;
1543
}
2952
/* mode SP type SP object_name TAB path LF */
2953
strbuf_reset(&line);
2954
strbuf_addf(&line, "%06o %s %s\t",
2930
- mode, type, sha1_to_hex(sha1));
2955
+ mode & ~NO_DELTA, type, sha1_to_hex(sha1));
2956
quote_c_style(path, &line, NULL, 0);
2957
strbuf_addch(&line, '\n');
2958
}