Code

builtin-clone: use strbuf in clone_local() and copy_or_link_directory()
authorMiklos Vajna <vmiklos@frugalware.org>
Fri, 21 Nov 2008 00:45:00 +0000 (01:45 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 25 Nov 2008 23:34:25 +0000 (15:34 -0800)
Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-clone.c

index 275b690b3c053595e013f9594f5bfbc2c03e3503..c590d4a179684cd33b0e22dcd823a16f8b3f26e7 100644 (file)
@@ -183,36 +183,38 @@ static void setup_reference(const char *repo)
        free(ref_git_copy);
 }
 
-static void copy_or_link_directory(char *src, char *dest)
+static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest)
 {
        struct dirent *de;
        struct stat buf;
        int src_len, dest_len;
        DIR *dir;
 
-       dir = opendir(src);
+       dir = opendir(src->buf);
        if (!dir)
-               die("failed to open %s\n", src);
+               die("failed to open %s\n", src->buf);
 
-       if (mkdir(dest, 0777)) {
+       if (mkdir(dest->buf, 0777)) {
                if (errno != EEXIST)
-                       die("failed to create directory %s\n", dest);
-               else if (stat(dest, &buf))
-                       die("failed to stat %s\n", dest);
+                       die("failed to create directory %s\n", dest->buf);
+               else if (stat(dest->buf, &buf))
+                       die("failed to stat %s\n", dest->buf);
                else if (!S_ISDIR(buf.st_mode))
-                       die("%s exists and is not a directory\n", dest);
+                       die("%s exists and is not a directory\n", dest->buf);
        }
 
-       src_len = strlen(src);
-       src[src_len] = '/';
-       dest_len = strlen(dest);
-       dest[dest_len] = '/';
+       strbuf_addch(src, '/');
+       src_len = src->len;
+       strbuf_addch(dest, '/');
+       dest_len = dest->len;
 
        while ((de = readdir(dir)) != NULL) {
-               strcpy(src + src_len + 1, de->d_name);
-               strcpy(dest + dest_len + 1, de->d_name);
-               if (stat(src, &buf)) {
-                       warning ("failed to stat %s\n", src);
+               strbuf_setlen(src, src_len);
+               strbuf_addstr(src, de->d_name);
+               strbuf_setlen(dest, dest_len);
+               strbuf_addstr(dest, de->d_name);
+               if (stat(src->buf, &buf)) {
+                       warning ("failed to stat %s\n", src->buf);
                        continue;
                }
                if (S_ISDIR(buf.st_mode)) {
@@ -221,17 +223,17 @@ static void copy_or_link_directory(char *src, char *dest)
                        continue;
                }
 
-               if (unlink(dest) && errno != ENOENT)
-                       die("failed to unlink %s\n", dest);
+               if (unlink(dest->buf) && errno != ENOENT)
+                       die("failed to unlink %s\n", dest->buf);
                if (!option_no_hardlinks) {
-                       if (!link(src, dest))
+                       if (!link(src->buf, dest->buf))
                                continue;
                        if (option_local)
-                               die("failed to create link %s\n", dest);
+                               die("failed to create link %s\n", dest->buf);
                        option_no_hardlinks = 1;
                }
-               if (copy_file(dest, src, 0666))
-                       die("failed to copy file to %s\n", dest);
+               if (copy_file(dest->buf, src->buf, 0666))
+                       die("failed to copy file to %s\n", dest->buf);
        }
        closedir(dir);
 }
@@ -240,17 +242,19 @@ static const struct ref *clone_local(const char *src_repo,
                                     const char *dest_repo)
 {
        const struct ref *ret;
-       char src[PATH_MAX];
-       char dest[PATH_MAX];
+       struct strbuf src = STRBUF_INIT;
+       struct strbuf dest = STRBUF_INIT;
        struct remote *remote;
        struct transport *transport;
 
        if (option_shared)
                add_to_alternates_file(src_repo);
        else {
-               snprintf(src, PATH_MAX, "%s/objects", src_repo);
-               snprintf(dest, PATH_MAX, "%s/objects", dest_repo);
-               copy_or_link_directory(src, dest);
+               strbuf_addf(&src, "%s/objects", src_repo);
+               strbuf_addf(&dest, "%s/objects", dest_repo);
+               copy_or_link_directory(&src, &dest);
+               strbuf_release(&src);
+               strbuf_release(&dest);
        }
 
        remote = remote_get(src_repo);