*/
#include "cache.h"
+static int missing_ok = 0;
+
static int check_valid_sha1(unsigned char *sha1)
{
- char *filename = sha1_file_name(sha1);
int ret;
/* If we were anal, we'd check that the sha1 of the contents actually matches */
- ret = access(filename, R_OK);
- if (ret)
- perror(filename);
- return ret;
+ ret = has_sha1_file(sha1);
+ if (ret == 0)
+ perror(sha1_file_name(sha1));
+ return ret ? 0 : -1;
}
static int write_tree(struct cache_entry **cachep, int maxentries, const char *base, int baselen, unsigned char *returnsha1)
offset = 0;
nr = 0;
- do {
+ while (nr < maxentries) {
struct cache_entry *ce = cachep[nr];
const char *pathname = ce->name, *filename, *dirname;
int pathlen = ce_namelen(ce), entrylen;
sha1 = subdir_sha1;
}
- if (check_valid_sha1(sha1) < 0)
+ if (!missing_ok && check_valid_sha1(sha1) < 0)
exit(1);
entrylen = pathlen - baselen;
memcpy(buffer + offset, sha1, 20);
offset += 20;
nr++;
- } while (nr < maxentries);
+ }
write_sha1_file(buffer, offset, "tree", returnsha1);
free(buffer);
return nr;
}
+static const char write_tree_usage[] = "git-write-tree [--missing-ok]";
+
int main(int argc, char **argv)
{
int i, funny;
- int entries = read_cache();
+ int entries;
unsigned char sha1[20];
+
+ setup_git_directory();
+
+ entries = read_cache();
+ if (argc == 2) {
+ if (!strcmp(argv[1], "--missing-ok"))
+ missing_ok = 1;
+ else
+ die(write_tree_usage);
+ }
+
+ if (argc > 2)
+ die("too many options");
- if (entries <= 0)
- die("write-tree: no cache contents to write");
+ if (entries < 0)
+ die("git-write-tree: error reading cache");
/* Verify that the tree is merged */
funny = 0;
}
}
if (funny)
- die("write-tree: not able to write tree");
+ die("git-write-tree: not able to write tree");
/* Also verify that the cache does not have path and path/file
* at the same time. At this point we know the cache has only
}
}
if (funny)
- die("write-tree: not able to write tree");
+ die("git-write-tree: not able to write tree");
/* Ok, write it out */
if (write_tree(active_cache, entries, "", 0, sha1) != entries)
- die("write-tree: internal error");
+ die("git-write-tree: internal error");
printf("%s\n", sha1_to_hex(sha1));
return 0;
}