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>
Miklos Vajna committed
Nov 21, 2008 at 01:45 UTC
b9e125e07e349275b16d177b8ee6bad140da31ab
1 file changed
+31
-27
builtin-clone.c
+31
-27
@@ -183,36 +183,38 @@ static void setup_reference(const char *repo)
183
free(ref_git_copy);
184
}
185
186
-static void copy_or_link_directory(char *src, char *dest)
186
+static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest)
187
{
188
struct dirent *de;
189
struct stat buf;
190
int src_len, dest_len;
191
DIR *dir;
192
193
- dir = opendir(src);
193
+ dir = opendir(src->buf);
194
if (!dir)
195
- die("failed to open %s\n", src);
195
+ die("failed to open %s\n", src->buf);
196
197
- if (mkdir(dest, 0777)) {
197
+ if (mkdir(dest->buf, 0777)) {
198
if (errno != EEXIST)
199
- die("failed to create directory %s\n", dest);
200
- else if (stat(dest, &buf))
201
- die("failed to stat %s\n", dest);
199
+ die("failed to create directory %s\n", dest->buf);
200
+ else if (stat(dest->buf, &buf))
201
+ die("failed to stat %s\n", dest->buf);
202
else if (!S_ISDIR(buf.st_mode))
203
- die("%s exists and is not a directory\n", dest);
203
+ die("%s exists and is not a directory\n", dest->buf);
204
}
205
206
- src_len = strlen(src);
207
- src[src_len] = '/';
208
- dest_len = strlen(dest);
209
- dest[dest_len] = '/';
206
+ strbuf_addch(src, '/');
207
+ src_len = src->len;
208
+ strbuf_addch(dest, '/');
209
+ dest_len = dest->len;
210
211
while ((de = readdir(dir)) != NULL) {
212
- strcpy(src + src_len + 1, de->d_name);
213
- strcpy(dest + dest_len + 1, de->d_name);
214
- if (stat(src, &buf)) {
215
- warning ("failed to stat %s\n", src);
212
+ strbuf_setlen(src, src_len);
213
+ strbuf_addstr(src, de->d_name);
214
+ strbuf_setlen(dest, dest_len);
215
+ strbuf_addstr(dest, de->d_name);
216
+ if (stat(src->buf, &buf)) {
217
+ warning ("failed to stat %s\n", src->buf);
218
continue;
219
}
220
if (S_ISDIR(buf.st_mode)) {
@@ -221,17 +223,17 @@ static void copy_or_link_directory(char *src, char *dest)
223
continue;
224
}
225
224
- if (unlink(dest) && errno != ENOENT)
225
- die("failed to unlink %s\n", dest);
226
+ if (unlink(dest->buf) && errno != ENOENT)
227
+ die("failed to unlink %s\n", dest->buf);
228
if (!option_no_hardlinks) {
227
- if (!link(src, dest))
229
+ if (!link(src->buf, dest->buf))
230
continue;
231
if (option_local)
230
- die("failed to create link %s\n", dest);
232
+ die("failed to create link %s\n", dest->buf);
233
option_no_hardlinks = 1;
234
}
233
- if (copy_file(dest, src, 0666))
234
- die("failed to copy file to %s\n", dest);
235
+ if (copy_file(dest->buf, src->buf, 0666))
236
+ die("failed to copy file to %s\n", dest->buf);
237
}
238
closedir(dir);
239
}
@@ -240,17 +242,19 @@ static const struct ref *clone_local(const char *src_repo,
242
const char *dest_repo)
243
{
244
const struct ref *ret;
243
- char src[PATH_MAX];
244
- char dest[PATH_MAX];
245
+ struct strbuf src = STRBUF_INIT;
246
+ struct strbuf dest = STRBUF_INIT;
247
struct remote *remote;
248
struct transport *transport;
249
250
if (option_shared)
251
add_to_alternates_file(src_repo);
252
else {
251
- snprintf(src, PATH_MAX, "%s/objects", src_repo);
252
- snprintf(dest, PATH_MAX, "%s/objects", dest_repo);
253
- copy_or_link_directory(src, dest);
253
+ strbuf_addf(&src, "%s/objects", src_repo);
254
+ strbuf_addf(&dest, "%s/objects", dest_repo);
255
+ copy_or_link_directory(&src, &dest);
256
+ strbuf_release(&src);
257
+ strbuf_release(&dest);
258
}
259
260
remote = remote_get(src_repo);