-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, 0755);
- }
-}
-
-static int create_file(const char *path, unsigned int mode)
-{
- int fd;
-
- mode = (mode & 0100) ? 777 : 666;
- fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
- if (fd < 0) {
- if (errno == ENOENT) {
- create_directories(path);
- fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
- }
- }
- 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")) {
- return error("checkout-cache: unable to read sha1 file of %s (%s)",
- ce->name, sha1_to_hex(ce->sha1));
- }
- fd = create_file(ce->name, ntohl(ce->ce_mode));
- if (fd < 0) {
- free(new);
- return error("checkout-cache: unable to create %s (%s)",
- ce->name, strerror(errno));
- }
- wrote = write(fd, new, size);
- close(fd);
- free(new);
- if (wrote != size)
- return error("checkout-cache: unable to write %s", ce->name);
- return 0;
-}
-
-static int checkout_entry(struct cache_entry *ce)
-{
- struct stat st;
-
- if (!stat(ce->name, &st)) {
- unsigned changed = cache_match_stat(ce, &st);
- if (!changed)
- return 0;
- if (!force) {
- if (!quiet)
- fprintf(stderr, "checkout-cache: %s already exists\n", ce->name);
- return 0;
- }
-
- /*
- * We unlink the old file, to get the new one with the
- * right permissions (including umask, which is nasty
- * to emulate by hand - much easier to let the system
- * just do the right thing)
- */
- unlink(ce->name);
- }
- return write_entry(ce);
-}