X-Git-Url: https://git.octo.it/?p=git.git;a=blobdiff_plain;f=local-fetch.c;h=ffa4887570319a2cbcf4042bd6e00063a48a4b6d;hp=87a93de02f759f544ebfd1d6fb584886f483fbfc;hb=HEAD;hpb=f865a2ad981f72423aa1c19412ce57c543801957 diff --git a/local-fetch.c b/local-fetch.c index 87a93de0..ffa48875 100644 --- a/local-fetch.c +++ b/local-fetch.c @@ -52,9 +52,10 @@ static int setup_indices(void) return 0; } -static int copy_file(const char *source, const char *dest, const char *hex, +static int copy_file(const char *source, char *dest, const char *hex, int warn_if_not_exists) { + safe_create_leading_directories(dest); if (use_link) { if (!link(source, dest)) { pull_say("link %s\n", hex); @@ -82,31 +83,23 @@ static int copy_file(const char *source, const char *dest, const char *hex, } } if (use_filecopy) { - int ifd, ofd, status; - struct stat st; - void *map; + int ifd, ofd, status = 0; + ifd = open(source, O_RDONLY); - if (ifd < 0 || fstat(ifd, &st) < 0) { - int err = errno; - if (ifd >= 0) - close(ifd); - if (!warn_if_not_exists && err == ENOENT) + if (ifd < 0) { + if (!warn_if_not_exists && errno == ENOENT) return -1; fprintf(stderr, "cannot open %s\n", source); return -1; } - map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, ifd, 0); - close(ifd); - if (map == MAP_FAILED) { - fprintf(stderr, "cannot mmap %s\n", source); + ofd = open(dest, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (ofd < 0) { + fprintf(stderr, "cannot open %s\n", dest); + close(ifd); return -1; } - ofd = open(dest, O_WRONLY | O_CREAT | O_EXCL, 0666); - status = ((ofd < 0) || - (write(ofd, map, st.st_size) != st.st_size)); - munmap(map, st.st_size); - if (ofd >= 0) - close(ofd); + status = copy_fd(ifd, ofd); + close(ofd); if (status) fprintf(stderr, "cannot write %s\n", dest); else @@ -150,7 +143,7 @@ static int fetch_file(const unsigned char *sha1) static int object_name_start = -1; static char filename[PATH_MAX]; char *hex = sha1_to_hex(sha1); - const char *dest_filename = sha1_file_name(sha1); + char *dest_filename = sha1_file_name(sha1); if (object_name_start < 0) { strcpy(filename, path); /* e.g. git.git */ @@ -214,6 +207,9 @@ int main(int argc, char **argv) char *commit_id; int arg = 1; + setup_git_directory(); + git_config(git_default_config); + while (arg < argc && argv[arg][0] == '-') { if (argv[arg][1] == 't') get_tree = 1; @@ -244,6 +240,7 @@ int main(int argc, char **argv) usage(local_pull_usage); commit_id = argv[arg]; path = argv[arg + 1]; + write_ref_log_details = path; if (pull(commit_id)) return 1;