{"thread":{"id":"12314","subject":"[PATCH] Use a single implementation and API for copy_file()","startedAt":"2008-02-25T19:24:48Z","lastAt":"2008-02-25T19:24:48Z","messageCount":1,"participants":["Daniel Barkalow"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"69908","messageId":"alpine.LNX.1.00.0802251421200.19024@iabervon.org","threadId":"12314","inReplyTo":null,"subject":"[PATCH] Use a single implementation and API for copy_file()","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2008-02-25T19:24:48Z","receivedAt":"2008-02-25T19:24:48Z","isPatch":true,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"Originally by Kristian Høgsberg; I fixed the conversion of rerere, which \nhad a different API.\n\nSigned-off-by: Daniel Barkalow <barkalow@iabervon.org>\n---\nThis is a preliminary for builtin-clone, but stands on its own.\n\n builtin-init-db.c |   21 ---------------------\n builtin-rerere.c  |   19 +------------------\n cache.h           |    1 +\n copy.c            |   21 +++++++++++++++++++++\n diff.c            |    8 ++++----\n 5 files changed, 27 insertions(+), 43 deletions(-)\n\ndiff --git a/builtin-init-db.c b/builtin-init-db.c\nindex 5d7cdda..79eaf8d 100644\n--- a/builtin-init-db.c\n+++ b/builtin-init-db.c\n@@ -29,27 +29,6 @@ static void safe_create_dir(const char *dir, int share)\n \t\tdie(\"Could not make %s writable by group\\n\", dir);\n }\n \n-static int copy_file(const char *dst, const char *src, int mode)\n-{\n-\tint fdi, fdo, status;\n-\n-\tmode = (mode & 0111) ? 0777 : 0666;\n-\tif ((fdi = open(src, O_RDONLY)) < 0)\n-\t\treturn fdi;\n-\tif ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) {\n-\t\tclose(fdi);\n-\t\treturn fdo;\n-\t}\n-\tstatus = copy_fd(fdi, fdo);\n-\tif (close(fdo) != 0)\n-\t\treturn error(\"%s: write error: %s\", dst, strerror(errno));\n-\n-\tif (!status && adjust_shared_perm(dst))\n-\t\treturn -1;\n-\n-\treturn status;\n-}\n-\n static void copy_templates_1(char *path, int baselen,\n \t\t\t     char *template, int template_baselen,\n \t\t\t     DIR *dir)\ndiff --git a/builtin-rerere.c b/builtin-rerere.c\nindex b0c17bd..c607aad 100644\n--- a/builtin-rerere.c\n+++ b/builtin-rerere.c\n@@ -267,23 +267,6 @@ static int diff_two(const char *file1, const char *label1,\n \treturn 0;\n }\n \n-static int copy_file(const char *src, const char *dest)\n-{\n-\tFILE *in, *out;\n-\tchar buffer[32768];\n-\tint count;\n-\n-\tif (!(in = fopen(src, \"r\")))\n-\t\treturn error(\"Could not open %s\", src);\n-\tif (!(out = fopen(dest, \"w\")))\n-\t\treturn error(\"Could not open %s\", dest);\n-\twhile ((count = fread(buffer, 1, sizeof(buffer), in)))\n-\t\tfwrite(buffer, 1, count, out);\n-\tfclose(in);\n-\tfclose(out);\n-\treturn 0;\n-}\n-\n static int do_plain_rerere(struct path_list *rr, int fd)\n {\n \tstruct path_list conflict = { NULL, 0, 0, 1 };\n@@ -343,7 +326,7 @@ static int do_plain_rerere(struct path_list *rr, int fd)\n \t\t\tcontinue;\n \n \t\tfprintf(stderr, \"Recorded resolution for '%s'.\\n\", path);\n-\t\tcopy_file(path, rr_path(name, \"postimage\"));\n+\t\tcopy_file(rr_path(name, \"postimage\"), path, 0666);\n tail_optimization:\n \t\tif (i < rr->nr - 1)\n \t\t\tmemmove(rr->items + i,\ndiff --git a/cache.h b/cache.h\nindex 040aecf..660ea04 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -712,6 +712,7 @@ extern const char *git_log_output_encoding;\n /* IO helper functions */\n extern void maybe_flush_or_die(FILE *, const char *);\n extern int copy_fd(int ifd, int ofd);\n+extern int copy_file(const char *dst, const char *src, int mode);\n extern int read_in_full(int fd, void *buf, size_t count);\n extern int write_in_full(int fd, const void *buf, size_t count);\n extern void write_or_die(int fd, const void *buf, size_t count);\ndiff --git a/copy.c b/copy.c\nindex c225d1b..afc4fbf 100644\n--- a/copy.c\n+++ b/copy.c\n@@ -34,3 +34,24 @@ int copy_fd(int ifd, int ofd)\n \tclose(ifd);\n \treturn 0;\n }\n+\n+int copy_file(const char *dst, const char *src, int mode)\n+{\n+\tint fdi, fdo, status;\n+\n+\tmode = (mode & 0111) ? 0777 : 0666;\n+\tif ((fdi = open(src, O_RDONLY)) < 0)\n+\t\treturn fdi;\n+\tif ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) {\n+\t\tclose(fdi);\n+\t\treturn fdo;\n+\t}\n+\tstatus = copy_fd(fdi, fdo);\n+\tif (close(fdo) != 0)\n+\t\treturn error(\"%s: write error: %s\", dst, strerror(errno));\n+\n+\tif (!status && adjust_shared_perm(dst))\n+\t\treturn -1;\n+\n+\treturn status;\n+}\ndiff --git a/diff.c b/diff.c\nindex 1885013..ad16164 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -271,8 +271,8 @@ static void print_line_count(int count)\n \t}\n }\n \n-static void copy_file(int prefix, const char *data, int size,\n-\t\tconst char *set, const char *reset)\n+static void copy_file_with_prefix(int prefix, const char *data, int size,\n+\t\t\t\t  const char *set, const char *reset)\n {\n \tint ch, nl_just_seen = 1;\n \twhile (0 < size--) {\n@@ -330,9 +330,9 @@ static void emit_rewrite_diff(const char *name_a,\n \tprint_line_count(lc_b);\n \tprintf(\" @@%s\\n\", reset);\n \tif (lc_a)\n-\t\tcopy_file('-', one->data, one->size, old, reset);\n+\t\tcopy_file_with_prefix('-', one->data, one->size, old, reset);\n \tif (lc_b)\n-\t\tcopy_file('+', two->data, two->size, new, reset);\n+\t\tcopy_file_with_prefix('+', two->data, two->size, new, reset);\n }\n \n static int fill_mmfile(mmfile_t *mf, struct diff_filespec *one)\n-- \n1.5.4.2.261.g851a5.dirty"}]}