Git 2.32
[git] / t / helper / test-read-cache.c
1 #include "test-tool.h"
2 #include "cache.h"
3 #include "config.h"
4 #include "blob.h"
5 #include "commit.h"
6 #include "tree.h"
7 #include "sparse-index.h"
8
9 static void print_cache_entry(struct cache_entry *ce)
10 {
11         const char *type;
12         printf("%06o ", ce->ce_mode & 0177777);
13
14         if (S_ISSPARSEDIR(ce->ce_mode))
15                 type = tree_type;
16         else if (S_ISGITLINK(ce->ce_mode))
17                 type = commit_type;
18         else
19                 type = blob_type;
20
21         printf("%s %s\t%s\n",
22                type,
23                oid_to_hex(&ce->oid),
24                ce->name);
25 }
26
27 static void print_cache(struct index_state *istate)
28 {
29         int i;
30         for (i = 0; i < istate->cache_nr; i++)
31                 print_cache_entry(istate->cache[i]);
32 }
33
34 int cmd__read_cache(int argc, const char **argv)
35 {
36         struct repository *r = the_repository;
37         int i, cnt = 1;
38         const char *name = NULL;
39         int table = 0, expand = 0;
40
41         initialize_the_repository();
42         prepare_repo_settings(r);
43         r->settings.command_requires_full_index = 0;
44
45         for (++argv, --argc; *argv && starts_with(*argv, "--"); ++argv, --argc) {
46                 if (skip_prefix(*argv, "--print-and-refresh=", &name))
47                         continue;
48                 if (!strcmp(*argv, "--table"))
49                         table = 1;
50                 else if (!strcmp(*argv, "--expand"))
51                         expand = 1;
52         }
53
54         if (argc == 1)
55                 cnt = strtol(argv[0], NULL, 0);
56         setup_git_directory();
57         git_config(git_default_config, NULL);
58
59         for (i = 0; i < cnt; i++) {
60                 repo_read_index(r);
61
62                 if (expand)
63                         ensure_full_index(r->index);
64
65                 if (name) {
66                         int pos;
67
68                         refresh_index(r->index, REFRESH_QUIET,
69                                       NULL, NULL, NULL);
70                         pos = index_name_pos(r->index, name, strlen(name));
71                         if (pos < 0)
72                                 die("%s not in index", name);
73                         printf("%s is%s up to date\n", name,
74                                ce_uptodate(r->index->cache[pos]) ? "" : " not");
75                         write_file(name, "%d\n", i);
76                 }
77                 if (table)
78                         print_cache(r->index);
79                 discard_index(r->index);
80         }
81         return 0;
82 }