4 #include "cache-tree.h"
 
  10 struct cache_tree *cache_tree(void)
 
  12         struct cache_tree *it = xcalloc(1, sizeof(struct cache_tree));
 
  17 void cache_tree_free(struct cache_tree **it_p)
 
  20         struct cache_tree *it = *it_p;
 
  24         for (i = 0; i < it->subtree_nr; i++)
 
  26                         cache_tree_free(&it->down[i]->cache_tree);
 
  34 static int subtree_name_cmp(const char *one, int onelen,
 
  35                             const char *two, int twolen)
 
  41         return memcmp(one, two, onelen);
 
  44 static int subtree_pos(struct cache_tree *it, const char *path, int pathlen)
 
  46         struct cache_tree_sub **down = it->down;
 
  51                 int mi = (lo + hi) / 2;
 
  52                 struct cache_tree_sub *mdl = down[mi];
 
  53                 int cmp = subtree_name_cmp(path, pathlen,
 
  54                                            mdl->name, mdl->namelen);
 
  65 static struct cache_tree_sub *find_subtree(struct cache_tree *it,
 
  70         struct cache_tree_sub *down;
 
  71         int pos = subtree_pos(it, path, pathlen);
 
  78         if (it->subtree_alloc <= it->subtree_nr) {
 
  79                 it->subtree_alloc = alloc_nr(it->subtree_alloc);
 
  80                 it->down = xrealloc(it->down, it->subtree_alloc *
 
  85         down = xmalloc(sizeof(*down) + pathlen + 1);
 
  86         down->cache_tree = NULL;
 
  87         down->namelen = pathlen;
 
  88         memcpy(down->name, path, pathlen);
 
  89         down->name[pathlen] = 0;
 
  91         if (pos < it->subtree_nr)
 
  92                 memmove(it->down + pos + 1,
 
  94                         sizeof(down) * (it->subtree_nr - pos - 1));
 
  99 struct cache_tree_sub *cache_tree_sub(struct cache_tree *it, const char *path)
 
 101         int pathlen = strlen(path);
 
 102         return find_subtree(it, path, pathlen, 1);
 
 105 void cache_tree_invalidate_path(struct cache_tree *it, const char *path)
 
 108          * ==> invalidate self
 
 109          * ==> find "a", have it invalidate "b/c"
 
 111          * ==> invalidate self
 
 112          * ==> if "a" exists as a subtree, remove it.
 
 116         struct cache_tree_sub *down;
 
 119         fprintf(stderr, "cache-tree invalidate <%s>\n", path);
 
 124         slash = strchr(path, '/');
 
 125         it->entry_count = -1;
 
 128                 namelen = strlen(path);
 
 129                 pos = subtree_pos(it, path, namelen);
 
 131                         cache_tree_free(&it->down[pos]->cache_tree);
 
 136                          * move 4 and 5 up one place (2 entries)
 
 137                          * 2 = 6 - 3 - 1 = subtree_nr - pos - 1
 
 139                         memmove(it->down+pos, it->down+pos+1,
 
 140                                 sizeof(struct cache_tree_sub *) *
 
 141                                 (it->subtree_nr - pos - 1));
 
 146         namelen = slash - path;
 
 147         down = find_subtree(it, path, namelen, 0);
 
 149                 cache_tree_invalidate_path(down->cache_tree, slash + 1);
 
 152 static int verify_cache(struct cache_entry **cache,
 
 153                         int entries, int silent)
 
 157         /* Verify that the tree is merged */
 
 159         for (i = 0; i < entries; i++) {
 
 160                 struct cache_entry *ce = cache[i];
 
 165                                 fprintf(stderr, "...\n");
 
 169                                 fprintf(stderr, "%s: unmerged (%s)\n",
 
 170                                         ce->name, sha1_to_hex(ce->sha1));
 
 172                                 fprintf(stderr, "%s: not added yet\n",
 
 179         /* Also verify that the cache does not have path and path/file
 
 180          * at the same time.  At this point we know the cache has only
 
 184         for (i = 0; i < entries - 1; i++) {
 
 185                 /* path/file always comes after path because of the way
 
 186                  * the cache is sorted.  Also path can appear only once,
 
 187                  * which means conflicting one would immediately follow.
 
 189                 const char *this_name = cache[i]->name;
 
 190                 const char *next_name = cache[i+1]->name;
 
 191                 int this_len = strlen(this_name);
 
 192                 if (this_len < strlen(next_name) &&
 
 193                     strncmp(this_name, next_name, this_len) == 0 &&
 
 194                     next_name[this_len] == '/') {
 
 196                                 fprintf(stderr, "...\n");
 
 199                         fprintf(stderr, "You have both %s and %s\n",
 
 200                                 this_name, next_name);
 
 208 static void discard_unused_subtrees(struct cache_tree *it)
 
 210         struct cache_tree_sub **down = it->down;
 
 211         int nr = it->subtree_nr;
 
 213         for (dst = src = 0; src < nr; src++) {
 
 214                 struct cache_tree_sub *s = down[src];
 
 218                         cache_tree_free(&s->cache_tree);
 
 225 int cache_tree_fully_valid(struct cache_tree *it)
 
 230         if (it->entry_count < 0 || !has_sha1_file(it->sha1))
 
 232         for (i = 0; i < it->subtree_nr; i++) {
 
 233                 if (!cache_tree_fully_valid(it->down[i]->cache_tree))
 
 239 static int update_one(struct cache_tree *it,
 
 240                       struct cache_entry **cache,
 
 247         struct strbuf buffer;
 
 250         if (0 <= it->entry_count && has_sha1_file(it->sha1))
 
 251                 return it->entry_count;
 
 254          * We first scan for subtrees and update them; we start by
 
 255          * marking existing subtrees -- the ones that are unmarked
 
 256          * should not be in the result.
 
 258         for (i = 0; i < it->subtree_nr; i++)
 
 259                 it->down[i]->used = 0;
 
 262          * Find the subtrees and update them.
 
 264         for (i = 0; i < entries; i++) {
 
 265                 struct cache_entry *ce = cache[i];
 
 266                 struct cache_tree_sub *sub;
 
 267                 const char *path, *slash;
 
 268                 int pathlen, sublen, subcnt;
 
 271                 pathlen = ce_namelen(ce);
 
 272                 if (pathlen <= baselen || memcmp(base, path, baselen))
 
 273                         break; /* at the end of this level */
 
 275                 slash = strchr(path + baselen, '/');
 
 279                  * a/bbb/c (base = a/, slash = /c)
 
 281                  * path+baselen = bbb/c, sublen = 3
 
 283                 sublen = slash - (path + baselen);
 
 284                 sub = find_subtree(it, path + baselen, sublen, 1);
 
 285                 if (!sub->cache_tree)
 
 286                         sub->cache_tree = cache_tree();
 
 287                 subcnt = update_one(sub->cache_tree,
 
 288                                     cache + i, entries - i,
 
 290                                     baselen + sublen + 1,
 
 299         discard_unused_subtrees(it);
 
 302          * Then write out the tree object for this level.
 
 304         strbuf_init(&buffer, 8192);
 
 306         for (i = 0; i < entries; i++) {
 
 307                 struct cache_entry *ce = cache[i];
 
 308                 struct cache_tree_sub *sub;
 
 309                 const char *path, *slash;
 
 311                 const unsigned char *sha1;
 
 315                 pathlen = ce_namelen(ce);
 
 316                 if (pathlen <= baselen || memcmp(base, path, baselen))
 
 317                         break; /* at the end of this level */
 
 319                 slash = strchr(path + baselen, '/');
 
 321                         entlen = slash - (path + baselen);
 
 322                         sub = find_subtree(it, path + baselen, entlen, 0);
 
 324                                 die("cache-tree.c: '%.*s' in '%s' not found",
 
 325                                     entlen, path + baselen, path);
 
 326                         i += sub->cache_tree->entry_count - 1;
 
 327                         sha1 = sub->cache_tree->sha1;
 
 333                         entlen = pathlen - baselen;
 
 335                 if (mode != S_IFGITLINK && !missing_ok && !has_sha1_file(sha1)) {
 
 336                         strbuf_release(&buffer);
 
 337                         return error("invalid object %06o %s for '%.*s'",
 
 338                                 mode, sha1_to_hex(sha1), entlen+baselen, path);
 
 341                 if (ce->ce_flags & (CE_REMOVE | CE_INTENT_TO_ADD))
 
 342                         continue; /* entry being removed or placeholder */
 
 344                 strbuf_grow(&buffer, entlen + 100);
 
 345                 strbuf_addf(&buffer, "%o %.*s%c", mode, entlen, path + baselen, '\0');
 
 346                 strbuf_add(&buffer, sha1, 20);
 
 349                 fprintf(stderr, "cache-tree update-one %o %.*s\n",
 
 350                         mode, entlen, path + baselen);
 
 355                 hash_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
 
 356         else if (write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1)) {
 
 357                 strbuf_release(&buffer);
 
 361         strbuf_release(&buffer);
 
 364         fprintf(stderr, "cache-tree update-one (%d ent, %d subtree) %s\n",
 
 365                 it->entry_count, it->subtree_nr,
 
 366                 sha1_to_hex(it->sha1));
 
 371 int cache_tree_update(struct cache_tree *it,
 
 372                       struct cache_entry **cache,
 
 379         i = verify_cache(cache, entries, silent);
 
 382         i = update_one(it, cache, entries, "", 0, missing_ok, dryrun);
 
 388 static void write_one(struct strbuf *buffer, struct cache_tree *it,
 
 389                       const char *path, int pathlen)
 
 393         /* One "cache-tree" entry consists of the following:
 
 394          * path (NUL terminated)
 
 395          * entry_count, subtree_nr ("%d %d\n")
 
 396          * tree-sha1 (missing if invalid)
 
 397          * subtree_nr "cache-tree" entries for subtrees.
 
 399         strbuf_grow(buffer, pathlen + 100);
 
 400         strbuf_add(buffer, path, pathlen);
 
 401         strbuf_addf(buffer, "%c%d %d\n", 0, it->entry_count, it->subtree_nr);
 
 404         if (0 <= it->entry_count)
 
 405                 fprintf(stderr, "cache-tree <%.*s> (%d ent, %d subtree) %s\n",
 
 406                         pathlen, path, it->entry_count, it->subtree_nr,
 
 407                         sha1_to_hex(it->sha1));
 
 409                 fprintf(stderr, "cache-tree <%.*s> (%d subtree) invalid\n",
 
 410                         pathlen, path, it->subtree_nr);
 
 413         if (0 <= it->entry_count) {
 
 414                 strbuf_add(buffer, it->sha1, 20);
 
 416         for (i = 0; i < it->subtree_nr; i++) {
 
 417                 struct cache_tree_sub *down = it->down[i];
 
 419                         struct cache_tree_sub *prev = it->down[i-1];
 
 420                         if (subtree_name_cmp(down->name, down->namelen,
 
 421                                              prev->name, prev->namelen) <= 0)
 
 422                                 die("fatal - unsorted cache subtree");
 
 424                 write_one(buffer, down->cache_tree, down->name, down->namelen);
 
 428 void cache_tree_write(struct strbuf *sb, struct cache_tree *root)
 
 430         write_one(sb, root, "", 0);
 
 433 static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
 
 435         const char *buf = *buffer;
 
 436         unsigned long size = *size_p;
 
 439         struct cache_tree *it;
 
 443         /* skip name, but make sure name exists */
 
 444         while (size && *buf) {
 
 454         it->entry_count = strtol(cp, &ep, 10);
 
 458         subtree_nr = strtol(cp, &ep, 10);
 
 461         while (size && *buf && *buf != '\n') {
 
 468         if (0 <= it->entry_count) {
 
 471                 hashcpy(it->sha1, (const unsigned char*)buf);
 
 477         if (0 <= it->entry_count)
 
 478                 fprintf(stderr, "cache-tree <%s> (%d ent, %d subtree) %s\n",
 
 479                         *buffer, it->entry_count, subtree_nr,
 
 480                         sha1_to_hex(it->sha1));
 
 482                 fprintf(stderr, "cache-tree <%s> (%d subtrees) invalid\n",
 
 483                         *buffer, subtree_nr);
 
 487          * Just a heuristic -- we do not add directories that often but
 
 488          * we do not want to have to extend it immediately when we do,
 
 491         it->subtree_alloc = subtree_nr + 2;
 
 492         it->down = xcalloc(it->subtree_alloc, sizeof(struct cache_tree_sub *));
 
 493         for (i = 0; i < subtree_nr; i++) {
 
 494                 /* read each subtree */
 
 495                 struct cache_tree *sub;
 
 496                 struct cache_tree_sub *subtree;
 
 497                 const char *name = buf;
 
 499                 sub = read_one(&buf, &size);
 
 502                 subtree = cache_tree_sub(it, name);
 
 503                 subtree->cache_tree = sub;
 
 505         if (subtree_nr != it->subtree_nr)
 
 506                 die("cache-tree: internal error");
 
 512         cache_tree_free(&it);
 
 516 struct cache_tree *cache_tree_read(const char *buffer, unsigned long size)
 
 519                 return NULL; /* not the whole tree */
 
 520         return read_one(&buffer, &size);
 
 523 static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *path)
 
 529                 struct cache_tree_sub *sub;
 
 531                 slash = strchr(path, '/');
 
 533                         slash = path + strlen(path);
 
 534                 /* between path and slash is the name of the
 
 535                  * subtree to look for.
 
 537                 sub = find_subtree(it, path, slash - path, 0);
 
 540                 it = sub->cache_tree;
 
 542                         while (*slash && *slash == '/')
 
 544                 if (!slash || !*slash)
 
 545                         return it; /* prefix ended with slashes */
 
 551 int write_cache_as_tree(unsigned char *sha1, int flags, const char *prefix)
 
 553         int entries, was_valid, newfd;
 
 554         struct lock_file *lock_file;
 
 557          * We can't free this memory, it becomes part of a linked list
 
 560         lock_file = xcalloc(1, sizeof(struct lock_file));
 
 562         newfd = hold_locked_index(lock_file, 1);
 
 564         entries = read_cache();
 
 566                 return WRITE_TREE_UNREADABLE_INDEX;
 
 567         if (flags & WRITE_TREE_IGNORE_CACHE_TREE)
 
 568                 cache_tree_free(&(active_cache_tree));
 
 570         if (!active_cache_tree)
 
 571                 active_cache_tree = cache_tree();
 
 573         was_valid = cache_tree_fully_valid(active_cache_tree);
 
 575                 int missing_ok = flags & WRITE_TREE_MISSING_OK;
 
 577                 if (cache_tree_update(active_cache_tree,
 
 578                                       active_cache, active_nr,
 
 579                                       missing_ok, 0, 0) < 0)
 
 580                         return WRITE_TREE_UNMERGED_INDEX;
 
 582                         if (!write_cache(newfd, active_cache, active_nr) &&
 
 583                             !commit_lock_file(lock_file))
 
 586                 /* Not being able to write is fine -- we are only interested
 
 587                  * in updating the cache-tree part, and if the next caller
 
 588                  * ends up using the old index with unupdated cache-tree part
 
 589                  * it misses the work we did here, but that is just a
 
 590                  * performance penalty and not a big deal.
 
 595                 struct cache_tree *subtree =
 
 596                         cache_tree_find(active_cache_tree, prefix);
 
 598                         return WRITE_TREE_PREFIX_ERROR;
 
 599                 hashcpy(sha1, subtree->sha1);
 
 602                 hashcpy(sha1, active_cache_tree->sha1);
 
 605                 rollback_lock_file(lock_file);
 
 610 static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
 
 612         struct tree_desc desc;
 
 613         struct name_entry entry;
 
 616         hashcpy(it->sha1, tree->object.sha1);
 
 617         init_tree_desc(&desc, tree->buffer, tree->size);
 
 619         while (tree_entry(&desc, &entry)) {
 
 620                 if (!S_ISDIR(entry.mode))
 
 623                         struct cache_tree_sub *sub;
 
 624                         struct tree *subtree = lookup_tree(entry.sha1);
 
 625                         if (!subtree->object.parsed)
 
 627                         sub = cache_tree_sub(it, entry.path);
 
 628                         sub->cache_tree = cache_tree();
 
 629                         prime_cache_tree_rec(sub->cache_tree, subtree);
 
 630                         cnt += sub->cache_tree->entry_count;
 
 633         it->entry_count = cnt;
 
 636 void prime_cache_tree(struct cache_tree **it, struct tree *tree)
 
 640         prime_cache_tree_rec(*it, tree);
 
 644  * find the cache_tree that corresponds to the current level without
 
 645  * exploding the full path into textual form.  The root of the
 
 646  * cache tree is given as "root", and our current level is "info".
 
 647  * (1) When at root level, info->prev is NULL, so it is "root" itself.
 
 648  * (2) Otherwise, find the cache_tree that corresponds to one level
 
 649  *     above us, and find ourselves in there.
 
 651 static struct cache_tree *find_cache_tree_from_traversal(struct cache_tree *root,
 
 652                                                          struct traverse_info *info)
 
 654         struct cache_tree *our_parent;
 
 658         our_parent = find_cache_tree_from_traversal(root, info->prev);
 
 659         return cache_tree_find(our_parent, info->name.path);
 
 662 int cache_tree_matches_traversal(struct cache_tree *root,
 
 663                                  struct name_entry *ent,
 
 664                                  struct traverse_info *info)
 
 666         struct cache_tree *it;
 
 668         it = find_cache_tree_from_traversal(root, info);
 
 669         it = cache_tree_find(it, ent->path);
 
 670         if (it && it->entry_count > 0 && !hashcmp(ent->sha1, it->sha1))
 
 671                 return it->entry_count;
 
 675 int update_main_cache_tree (int silent)
 
 677         if (!the_index.cache_tree)
 
 678                 the_index.cache_tree = cache_tree();
 
 679         return cache_tree_update(the_index.cache_tree,
 
 680                                  the_index.cache, the_index.cache_nr, 0, 0, silent);