- if (!path || size < len + 20 || sscanf(tree, "%o", modep) != 1)
- die("corrupt tree file 2 (%d)", size);
- *pathp = path+1;
- return sha1;
-}
-
-static char *malloc_base(const char *base, const char *path, int pathlen)
-{
- int baselen = strlen(base);
- char *newbase = malloc(baselen + pathlen + 2);
- memcpy(newbase, base, baselen);
- memcpy(newbase + baselen, path, pathlen);
- memcpy(newbase + baselen + pathlen, "/", 2);
- return newbase;
-}
-
-static void show_file(const char *prefix, const char *path, unsigned int mode, const unsigned char *sha1, const char *base);
-
-/* A whole sub-tree went away or appeared */
-static void show_tree(const char *prefix, void *tree, unsigned long size, const char *base)
-{
- while (size) {
- const char *path;
- unsigned int mode;
- const unsigned char *sha1 = extract(tree, size, &path, &mode);
-
- show_file(prefix, path, mode, sha1, base);
- update_tree_entry(&tree, &size);
+ if (!cached_only) {
+ static unsigned char no_sha1[20];
+ int changed;
+ struct stat st;
+ if (lstat(ce->name, &st) < 0) {
+ if (errno == ENOENT && match_nonexisting) {
+ *sha1p = sha1;
+ *modep = mode;
+ return 0;
+ }
+ return -1;
+ }
+ changed = ce_match_stat(ce, &st);
+ if (changed) {
+ mode = create_ce_mode(st.st_mode);
+ sha1 = no_sha1;
+ }