Merge branch 'mv/clone-strbuf'
* mv/clone-strbuf: builtin_clone: use strbuf in cmd_clone() builtin-clone: use strbuf in clone_local() and copy_or_link_directory() builtin-clone: use strbuf in guess_dir_name()maint
commit
14de7393f1
109
builtin-clone.c
109
builtin-clone.c
|
@ -134,9 +134,9 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_bare) {
|
if (is_bare) {
|
||||||
char *result = xmalloc(end - start + 5);
|
struct strbuf result = STRBUF_INIT;
|
||||||
sprintf(result, "%.*s.git", (int)(end - start), start);
|
strbuf_addf(&result, "%.*s.git", (int)(end - start), start);
|
||||||
return result;
|
return strbuf_detach(&result, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return xstrndup(start, end - start);
|
return xstrndup(start, end - start);
|
||||||
|
@ -183,36 +183,38 @@ static void setup_reference(const char *repo)
|
||||||
free(ref_git_copy);
|
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 dirent *de;
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
int src_len, dest_len;
|
int src_len, dest_len;
|
||||||
DIR *dir;
|
DIR *dir;
|
||||||
|
|
||||||
dir = opendir(src);
|
dir = opendir(src->buf);
|
||||||
if (!dir)
|
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)
|
if (errno != EEXIST)
|
||||||
die("failed to create directory %s\n", dest);
|
die("failed to create directory %s\n", dest->buf);
|
||||||
else if (stat(dest, &buf))
|
else if (stat(dest->buf, &buf))
|
||||||
die("failed to stat %s\n", dest);
|
die("failed to stat %s\n", dest->buf);
|
||||||
else if (!S_ISDIR(buf.st_mode))
|
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);
|
strbuf_addch(src, '/');
|
||||||
src[src_len] = '/';
|
src_len = src->len;
|
||||||
dest_len = strlen(dest);
|
strbuf_addch(dest, '/');
|
||||||
dest[dest_len] = '/';
|
dest_len = dest->len;
|
||||||
|
|
||||||
while ((de = readdir(dir)) != NULL) {
|
while ((de = readdir(dir)) != NULL) {
|
||||||
strcpy(src + src_len + 1, de->d_name);
|
strbuf_setlen(src, src_len);
|
||||||
strcpy(dest + dest_len + 1, de->d_name);
|
strbuf_addstr(src, de->d_name);
|
||||||
if (stat(src, &buf)) {
|
strbuf_setlen(dest, dest_len);
|
||||||
warning ("failed to stat %s\n", src);
|
strbuf_addstr(dest, de->d_name);
|
||||||
|
if (stat(src->buf, &buf)) {
|
||||||
|
warning ("failed to stat %s\n", src->buf);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (S_ISDIR(buf.st_mode)) {
|
if (S_ISDIR(buf.st_mode)) {
|
||||||
|
@ -221,17 +223,17 @@ static void copy_or_link_directory(char *src, char *dest)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlink(dest) && errno != ENOENT)
|
if (unlink(dest->buf) && errno != ENOENT)
|
||||||
die("failed to unlink %s\n", dest);
|
die("failed to unlink %s\n", dest->buf);
|
||||||
if (!option_no_hardlinks) {
|
if (!option_no_hardlinks) {
|
||||||
if (!link(src, dest))
|
if (!link(src->buf, dest->buf))
|
||||||
continue;
|
continue;
|
||||||
if (option_local)
|
if (option_local)
|
||||||
die("failed to create link %s\n", dest);
|
die("failed to create link %s\n", dest->buf);
|
||||||
option_no_hardlinks = 1;
|
option_no_hardlinks = 1;
|
||||||
}
|
}
|
||||||
if (copy_file(dest, src, 0666))
|
if (copy_file(dest->buf, src->buf, 0666))
|
||||||
die("failed to copy file to %s\n", dest);
|
die("failed to copy file to %s\n", dest->buf);
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
}
|
}
|
||||||
|
@ -240,17 +242,19 @@ static const struct ref *clone_local(const char *src_repo,
|
||||||
const char *dest_repo)
|
const char *dest_repo)
|
||||||
{
|
{
|
||||||
const struct ref *ret;
|
const struct ref *ret;
|
||||||
char src[PATH_MAX];
|
struct strbuf src = STRBUF_INIT;
|
||||||
char dest[PATH_MAX];
|
struct strbuf dest = STRBUF_INIT;
|
||||||
struct remote *remote;
|
struct remote *remote;
|
||||||
struct transport *transport;
|
struct transport *transport;
|
||||||
|
|
||||||
if (option_shared)
|
if (option_shared)
|
||||||
add_to_alternates_file(src_repo);
|
add_to_alternates_file(src_repo);
|
||||||
else {
|
else {
|
||||||
snprintf(src, PATH_MAX, "%s/objects", src_repo);
|
strbuf_addf(&src, "%s/objects", src_repo);
|
||||||
snprintf(dest, PATH_MAX, "%s/objects", dest_repo);
|
strbuf_addf(&dest, "%s/objects", dest_repo);
|
||||||
copy_or_link_directory(src, dest);
|
copy_or_link_directory(&src, &dest);
|
||||||
|
strbuf_release(&src);
|
||||||
|
strbuf_release(&dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
remote = remote_get(src_repo);
|
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;
|
const char *repo_name, *repo, *work_tree, *git_dir;
|
||||||
char *path, *dir;
|
char *path, *dir;
|
||||||
const struct ref *refs, *head_points_at, *remote_head, *mapped_refs;
|
const struct ref *refs, *head_points_at, *remote_head, *mapped_refs;
|
||||||
char branch_top[256], key[256], value[256];
|
struct strbuf key = STRBUF_INIT, value = STRBUF_INIT;
|
||||||
struct strbuf reflog_msg = STRBUF_INIT;
|
struct strbuf branch_top = STRBUF_INIT, reflog_msg = STRBUF_INIT;
|
||||||
struct transport *transport = NULL;
|
struct transport *transport = NULL;
|
||||||
char *src_ref_prefix = "refs/heads/";
|
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_bare) {
|
||||||
if (option_mirror)
|
if (option_mirror)
|
||||||
src_ref_prefix = "refs/";
|
src_ref_prefix = "refs/";
|
||||||
strcpy(branch_top, src_ref_prefix);
|
strbuf_addstr(&branch_top, src_ref_prefix);
|
||||||
|
|
||||||
git_config_set("core.bare", "true");
|
git_config_set("core.bare", "true");
|
||||||
} else {
|
} else {
|
||||||
snprintf(branch_top, sizeof(branch_top),
|
strbuf_addf(&branch_top, "refs/remotes/%s/", option_origin);
|
||||||
"refs/remotes/%s/", option_origin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (option_mirror || !option_bare) {
|
if (option_mirror || !option_bare) {
|
||||||
/* Configure the remote */
|
/* Configure the remote */
|
||||||
if (option_mirror) {
|
if (option_mirror) {
|
||||||
snprintf(key, sizeof(key),
|
strbuf_addf(&key, "remote.%s.mirror", option_origin);
|
||||||
"remote.%s.mirror", option_origin);
|
git_config_set(key.buf, "true");
|
||||||
git_config_set(key, "true");
|
strbuf_reset(&key);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(key, sizeof(key), "remote.%s.url", option_origin);
|
strbuf_addf(&key, "remote.%s.url", option_origin);
|
||||||
git_config_set(key, repo);
|
git_config_set(key.buf, repo);
|
||||||
|
strbuf_reset(&key);
|
||||||
|
|
||||||
snprintf(key, sizeof(key), "remote.%s.fetch", option_origin);
|
strbuf_addf(&key, "remote.%s.fetch", option_origin);
|
||||||
snprintf(value, sizeof(value),
|
strbuf_addf(&value, "+%s*:%s*", src_ref_prefix, branch_top.buf);
|
||||||
"+%s*:%s*", src_ref_prefix, branch_top);
|
git_config_set_multivar(key.buf, value.buf, "^$", 0);
|
||||||
git_config_set_multivar(key, value, "^$", 0);
|
strbuf_reset(&key);
|
||||||
|
strbuf_reset(&value);
|
||||||
}
|
}
|
||||||
|
|
||||||
refspec.force = 0;
|
refspec.force = 0;
|
||||||
refspec.pattern = 1;
|
refspec.pattern = 1;
|
||||||
refspec.src = src_ref_prefix;
|
refspec.src = src_ref_prefix;
|
||||||
refspec.dst = branch_top;
|
refspec.dst = branch_top.buf;
|
||||||
|
|
||||||
if (path && !is_bundle)
|
if (path && !is_bundle)
|
||||||
refs = clone_local(path, git_dir);
|
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,
|
head_points_at->old_sha1,
|
||||||
NULL, 0, DIE_ON_ERR);
|
NULL, 0, DIE_ON_ERR);
|
||||||
|
|
||||||
strbuf_addstr(&head_ref, branch_top);
|
strbuf_addstr(&head_ref, branch_top.buf);
|
||||||
strbuf_addstr(&head_ref, "HEAD");
|
strbuf_addstr(&head_ref, "HEAD");
|
||||||
|
|
||||||
/* Remote branch link */
|
/* Remote branch link */
|
||||||
|
@ -549,10 +554,11 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
|
||||||
head_points_at->peer_ref->name,
|
head_points_at->peer_ref->name,
|
||||||
reflog_msg.buf);
|
reflog_msg.buf);
|
||||||
|
|
||||||
snprintf(key, sizeof(key), "branch.%s.remote", head);
|
strbuf_addf(&key, "branch.%s.remote", head);
|
||||||
git_config_set(key, option_origin);
|
git_config_set(key.buf, option_origin);
|
||||||
snprintf(key, sizeof(key), "branch.%s.merge", head);
|
strbuf_reset(&key);
|
||||||
git_config_set(key, head_points_at->name);
|
strbuf_addf(&key, "branch.%s.merge", head);
|
||||||
|
git_config_set(key.buf, head_points_at->name);
|
||||||
}
|
}
|
||||||
} else if (remote_head) {
|
} else if (remote_head) {
|
||||||
/* Source had detached HEAD pointing somewhere. */
|
/* 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(&reflog_msg);
|
||||||
|
strbuf_release(&branch_top);
|
||||||
|
strbuf_release(&key);
|
||||||
|
strbuf_release(&value);
|
||||||
junk_pid = 0;
|
junk_pid = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue