summaryrefslogtreecommitdiff
path: root/t/helper/test-read-cache.c
diff options
context:
space:
mode:
Diffstat (limited to 't/helper/test-read-cache.c')
-rw-r--r--t/helper/test-read-cache.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c
new file mode 100644
index 0000000000..b52c174acc
--- /dev/null
+++ b/t/helper/test-read-cache.c
@@ -0,0 +1,82 @@
+#include "test-tool.h"
+#include "cache.h"
+#include "config.h"
+#include "blob.h"
+#include "commit.h"
+#include "tree.h"
+#include "sparse-index.h"
+
+static void print_cache_entry(struct cache_entry *ce)
+{
+ const char *type;
+ printf("%06o ", ce->ce_mode & 0177777);
+
+ if (S_ISSPARSEDIR(ce->ce_mode))
+ type = tree_type;
+ else if (S_ISGITLINK(ce->ce_mode))
+ type = commit_type;
+ else
+ type = blob_type;
+
+ printf("%s %s\t%s\n",
+ type,
+ oid_to_hex(&ce->oid),
+ ce->name);
+}
+
+static void print_cache(struct index_state *istate)
+{
+ int i;
+ for (i = 0; i < istate->cache_nr; i++)
+ print_cache_entry(istate->cache[i]);
+}
+
+int cmd__read_cache(int argc, const char **argv)
+{
+ struct repository *r = the_repository;
+ int i, cnt = 1;
+ const char *name = NULL;
+ int table = 0, expand = 0;
+
+ initialize_the_repository();
+ prepare_repo_settings(r);
+ r->settings.command_requires_full_index = 0;
+
+ for (++argv, --argc; *argv && starts_with(*argv, "--"); ++argv, --argc) {
+ if (skip_prefix(*argv, "--print-and-refresh=", &name))
+ continue;
+ if (!strcmp(*argv, "--table"))
+ table = 1;
+ else if (!strcmp(*argv, "--expand"))
+ expand = 1;
+ }
+
+ if (argc == 1)
+ cnt = strtol(argv[0], NULL, 0);
+ setup_git_directory();
+ git_config(git_default_config, NULL);
+
+ for (i = 0; i < cnt; i++) {
+ repo_read_index(r);
+
+ if (expand)
+ ensure_full_index(r->index);
+
+ if (name) {
+ int pos;
+
+ refresh_index(r->index, REFRESH_QUIET,
+ NULL, NULL, NULL);
+ pos = index_name_pos(r->index, name, strlen(name));
+ if (pos < 0)
+ die("%s not in index", name);
+ printf("%s is%s up to date\n", name,
+ ce_uptodate(r->index->cache[pos]) ? "" : " not");
+ write_file(name, "%d\n", i);
+ }
+ if (table)
+ print_cache(r->index);
+ discard_index(r->index);
+ }
+ return 0;
+}