diff options
Diffstat (limited to 'builtin-clone.c')
-rw-r--r-- | builtin-clone.c | 109 |
1 files changed, 59 insertions, 50 deletions
diff --git a/builtin-clone.c b/builtin-clone.c index 8e1a1d3995..2feac9c5cb 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -134,9 +134,9 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare) } if (is_bare) { - char *result = xmalloc(end - start + 5); - sprintf(result, "%.*s.git", (int)(end - start), start); - return result; + struct strbuf result = STRBUF_INIT; + strbuf_addf(&result, "%.*s.git", (int)(end - start), start); + return strbuf_detach(&result, 0); } return xstrndup(start, end - start); @@ -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); @@ -354,8 +358,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix) const char *repo_name, *repo, *work_tree, *git_dir; char *path, *dir; const struct ref *refs, *head_points_at, *remote_head, *mapped_refs; - char branch_top[256], key[256], value[256]; - struct strbuf reflog_msg = STRBUF_INIT; + struct strbuf key = STRBUF_INIT, value = STRBUF_INIT; + struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT; struct transport *transport = NULL; char *src_ref_prefix = "refs/heads/"; @@ -459,35 +463,36 @@ int cmd_clone(int argc, const char **argv, const char *prefix) if (option_bare) { if (option_mirror) src_ref_prefix = "refs/"; - strcpy(branch_top, src_ref_prefix); + strbuf_addstr(&branch_top, src_ref_prefix); git_config_set("core.bare", "true"); } else { - snprintf(branch_top, sizeof(branch_top), - "refs/remotes/%s/", option_origin); + strbuf_addf(&branch_top, "refs/remotes/%s/", option_origin); } if (option_mirror || !option_bare) { /* Configure the remote */ if (option_mirror) { - snprintf(key, sizeof(key), - "remote.%s.mirror", option_origin); - git_config_set(key, "true"); + strbuf_addf(&key, "remote.%s.mirror", option_origin); + git_config_set(key.buf, "true"); + strbuf_reset(&key); } - snprintf(key, sizeof(key), "remote.%s.url", option_origin); - git_config_set(key, repo); + strbuf_addf(&key, "remote.%s.url", option_origin); + git_config_set(key.buf, repo); + strbuf_reset(&key); - snprintf(key, sizeof(key), "remote.%s.fetch", option_origin); - snprintf(value, sizeof(value), - "+%s*:%s*", src_ref_prefix, branch_top); - git_config_set_multivar(key, value, "^$", 0); + strbuf_addf(&key, "remote.%s.fetch", option_origin); + strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf); + git_config_set_multivar(key.buf, value.buf, "^$", 0); + strbuf_reset(&key); + strbuf_reset(&value); } refspec.force = 0; refspec.pattern = 1; refspec.src = src_ref_prefix; - refspec.dst = branch_top; + refspec.dst = branch_top.buf; if (path && !is_bundle) refs = clone_local(path, git_dir); @@ -541,7 +546,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) head_points_at->old_sha1, NULL, 0, DIE_ON_ERR); - strbuf_addstr(&head_ref, branch_top); + strbuf_addstr(&head_ref, branch_top.buf); strbuf_addstr(&head_ref, "HEAD"); /* Remote branch link */ @@ -549,10 +554,11 @@ int cmd_clone(int argc, const char **argv, const char *prefix) head_points_at->peer_ref->name, reflog_msg.buf); - snprintf(key, sizeof(key), "branch.%s.remote", head); - git_config_set(key, option_origin); - snprintf(key, sizeof(key), "branch.%s.merge", head); - git_config_set(key, head_points_at->name); + strbuf_addf(&key, "branch.%s.remote", head); + git_config_set(key.buf, option_origin); + strbuf_reset(&key); + strbuf_addf(&key, "branch.%s.merge", head); + git_config_set(key.buf, head_points_at->name); } } else if (remote_head) { /* Source had detached HEAD pointing somewhere. */ @@ -602,6 +608,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } strbuf_release(&reflog_msg); + strbuf_release(&branch_top); + strbuf_release(&key); + strbuf_release(&value); junk_pid = 0; return 0; } |