mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
builtin-clone: use strbuf in clone_local() and copy_or_link_directory()
Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
32716a2c6c
commit
b9e125e07e
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue