test-dump-cache-tree.con commit builtin-am: extract patch and commit info with git-mailinfo (3e20dcf)
   1#include "cache.h"
   2#include "tree.h"
   3#include "cache-tree.h"
   4
   5
   6static void dump_one(struct cache_tree *it, const char *pfx, const char *x)
   7{
   8        if (it->entry_count < 0)
   9                printf("%-40s %s%s (%d subtrees)\n",
  10                       "invalid", x, pfx, it->subtree_nr);
  11        else
  12                printf("%s %s%s (%d entries, %d subtrees)\n",
  13                       sha1_to_hex(it->sha1), x, pfx,
  14                       it->entry_count, it->subtree_nr);
  15}
  16
  17static int dump_cache_tree(struct cache_tree *it,
  18                           struct cache_tree *ref,
  19                           const char *pfx)
  20{
  21        int i;
  22        int errs = 0;
  23
  24        if (!it || !ref)
  25                /* missing in either */
  26                return 0;
  27
  28        if (it->entry_count < 0) {
  29                /* invalid */
  30                dump_one(it, pfx, "");
  31                dump_one(ref, pfx, "#(ref) ");
  32        }
  33        else {
  34                dump_one(it, pfx, "");
  35                if (hashcmp(it->sha1, ref->sha1) ||
  36                    ref->entry_count != it->entry_count ||
  37                    ref->subtree_nr != it->subtree_nr) {
  38                        /* claims to be valid but is lying */
  39                        dump_one(ref, pfx, "#(ref) ");
  40                        errs = 1;
  41                }
  42        }
  43
  44        for (i = 0; i < it->subtree_nr; i++) {
  45                char path[PATH_MAX];
  46                struct cache_tree_sub *down = it->down[i];
  47                struct cache_tree_sub *rdwn;
  48
  49                rdwn = cache_tree_sub(ref, down->name);
  50                sprintf(path, "%s%.*s/", pfx, down->namelen, down->name);
  51                if (dump_cache_tree(down->cache_tree, rdwn->cache_tree, path))
  52                        errs = 1;
  53        }
  54        return errs;
  55}
  56
  57int main(int ac, char **av)
  58{
  59        struct index_state istate;
  60        struct cache_tree *another = cache_tree();
  61        if (read_cache() < 0)
  62                die("unable to read index file");
  63        istate = the_index;
  64        istate.cache_tree = another;
  65        cache_tree_update(&istate, WRITE_TREE_DRY_RUN);
  66        return dump_cache_tree(active_cache_tree, another, "");
  67}