-static int force = 0, quiet = 0;
-
-static void create_directories(const char *path)
-{
- int len = strlen(path);
- char *buf = malloc(len + 1);
- const char *slash = path;
-
- while ((slash = strchr(slash+1, '/')) != NULL) {
- len = slash - path;
- memcpy(buf, path, len);
- buf[len] = 0;
- mkdir(buf, 0700);
- }
-}
-
-static int create_file(const char *path, unsigned int mode)
-{
- int fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0600);
- if (fd < 0) {
- if (errno == ENOENT) {
- create_directories(path);
- fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0600);
- }
- }
- if (fd >= 0)
- fchmod(fd, mode);
- return fd;
-}
-
-static int write_entry(struct cache_entry *ce)
-{
- int fd;
- void *new;
- unsigned long size;
- long wrote;
- char type[20];
-
- new = read_sha1_file(ce->sha1, type, &size);
- if (!new || strcmp(type, "blob")) {
- fprintf(stderr, "checkout-cache: unable to read sha1 file of %s (%s)\n",
- ce->name, sha1_to_hex(ce->sha1));
- return -1;
- }
- fd = create_file(ce->name, ce->st_mode);
- if (fd < 0) {
- fprintf(stderr, "checkout-cache: unable to create %s (%s)\n",
- ce->name, strerror(errno));
- free(new);
- return -1;
- }
- wrote = write(fd, new, size);
- close(fd);
- free(new);
- if (wrote == size)
- return 0;
- fprintf(stderr, "checkout-cache: unable to write %s\n", ce->name);
- return -1;
-}
-
-static int checkout_entry(struct cache_entry *ce)
-{
- if (!force) {
- struct stat st;
-
- if (!stat(ce->name, &st)) {
- unsigned changed = cache_match_stat(ce, &st);
- if (changed && !quiet)
- fprintf(stderr, "checkout-cache: %s already exists\n", ce->name);
- return 0;
- }
- }
- return write_entry(ce);
-}