@@ -134,9 +134,9 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
134
134
}
135
135
136
136
if (is_bare ) {
137
- char * result = xmalloc ( end - start + 5 ) ;
138
- sprintf ( result , "%.*s.git" , (int )(end - start ), start );
139
- return result ;
137
+ struct strbuf result = STRBUF_INIT ;
138
+ strbuf_addf ( & result , "%.*s.git" , (int )(end - start ), start );
139
+ return strbuf_detach ( & result , 0 ) ;
140
140
}
141
141
142
142
return xstrndup (start , end - start );
@@ -183,36 +183,38 @@ static void setup_reference(const char *repo)
183
183
free (ref_git_copy );
184
184
}
185
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
187
{
188
188
struct dirent * de ;
189
189
struct stat buf ;
190
190
int src_len , dest_len ;
191
191
DIR * dir ;
192
192
193
- dir = opendir (src );
193
+ dir = opendir (src -> buf );
194
194
if (!dir )
195
- die ("failed to open %s\n" , src );
195
+ die ("failed to open %s\n" , src -> buf );
196
196
197
- if (mkdir (dest , 0777 )) {
197
+ if (mkdir (dest -> buf , 0777 )) {
198
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
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
204
}
205
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
210
211
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 );
216
218
continue ;
217
219
}
218
220
if (S_ISDIR (buf .st_mode )) {
@@ -221,17 +223,17 @@ static void copy_or_link_directory(char *src, char *dest)
221
223
continue ;
222
224
}
223
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 );
226
228
if (!option_no_hardlinks ) {
227
- if (!link (src , dest ))
229
+ if (!link (src -> buf , dest -> buf ))
228
230
continue ;
229
231
if (option_local )
230
- die ("failed to create link %s\n" , dest );
232
+ die ("failed to create link %s\n" , dest -> buf );
231
233
option_no_hardlinks = 1 ;
232
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 );
235
237
}
236
238
closedir (dir );
237
239
}
@@ -240,17 +242,19 @@ static const struct ref *clone_local(const char *src_repo,
240
242
const char * dest_repo )
241
243
{
242
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 ;
245
247
struct remote * remote ;
246
248
struct transport * transport ;
247
249
248
250
if (option_shared )
249
251
add_to_alternates_file (src_repo );
250
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 );
254
258
}
255
259
256
260
remote = remote_get (src_repo );
@@ -354,8 +358,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
354
358
const char * repo_name , * repo , * work_tree , * git_dir ;
355
359
char * path , * dir ;
356
360
const struct ref * refs , * head_points_at , * remote_head , * mapped_refs ;
357
- char branch_top [ 256 ], key [ 256 ] , value [ 256 ] ;
358
- struct strbuf reflog_msg = STRBUF_INIT ;
361
+ struct strbuf key = STRBUF_INIT , value = STRBUF_INIT ;
362
+ struct strbuf branch_top = STRBUF_INIT , reflog_msg = STRBUF_INIT ;
359
363
struct transport * transport = NULL ;
360
364
char * src_ref_prefix = "refs/heads/" ;
361
365
@@ -459,35 +463,36 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
459
463
if (option_bare ) {
460
464
if (option_mirror )
461
465
src_ref_prefix = "refs/" ;
462
- strcpy ( branch_top , src_ref_prefix );
466
+ strbuf_addstr ( & branch_top , src_ref_prefix );
463
467
464
468
git_config_set ("core.bare" , "true" );
465
469
} else {
466
- snprintf (branch_top , sizeof (branch_top ),
467
- "refs/remotes/%s/" , option_origin );
470
+ strbuf_addf (& branch_top , "refs/remotes/%s/" , option_origin );
468
471
}
469
472
470
473
if (option_mirror || !option_bare ) {
471
474
/* Configure the remote */
472
475
if (option_mirror ) {
473
- snprintf ( key , sizeof ( key ),
474
- "remote.%s.mirror" , option_origin );
475
- git_config_set ( key , "true" );
476
+ strbuf_addf ( & key , "remote.%s.mirror" , option_origin );
477
+ git_config_set ( key . buf , "true" );
478
+ strbuf_reset ( & key );
476
479
}
477
480
478
- snprintf (key , sizeof (key ), "remote.%s.url" , option_origin );
479
- git_config_set (key , repo );
481
+ strbuf_addf (& key , "remote.%s.url" , option_origin );
482
+ git_config_set (key .buf , repo );
483
+ strbuf_reset (& key );
480
484
481
- snprintf (key , sizeof (key ), "remote.%s.fetch" , option_origin );
482
- snprintf (value , sizeof (value ),
483
- "+%s*:%s*" , src_ref_prefix , branch_top );
484
- git_config_set_multivar (key , value , "^$" , 0 );
485
+ strbuf_addf (& key , "remote.%s.fetch" , option_origin );
486
+ strbuf_addf (& value , "+%s*:%s*" , src_ref_prefix , branch_top .buf );
487
+ git_config_set_multivar (key .buf , value .buf , "^$" , 0 );
488
+ strbuf_reset (& key );
489
+ strbuf_reset (& value );
485
490
}
486
491
487
492
refspec .force = 0 ;
488
493
refspec .pattern = 1 ;
489
494
refspec .src = src_ref_prefix ;
490
- refspec .dst = branch_top ;
495
+ refspec .dst = branch_top . buf ;
491
496
492
497
if (path && !is_bundle )
493
498
refs = clone_local (path , git_dir );
@@ -541,18 +546,19 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
541
546
head_points_at -> old_sha1 ,
542
547
NULL , 0 , DIE_ON_ERR );
543
548
544
- strbuf_addstr (& head_ref , branch_top );
549
+ strbuf_addstr (& head_ref , branch_top . buf );
545
550
strbuf_addstr (& head_ref , "HEAD" );
546
551
547
552
/* Remote branch link */
548
553
create_symref (head_ref .buf ,
549
554
head_points_at -> peer_ref -> name ,
550
555
reflog_msg .buf );
551
556
552
- snprintf (key , sizeof (key ), "branch.%s.remote" , head );
553
- git_config_set (key , option_origin );
554
- snprintf (key , sizeof (key ), "branch.%s.merge" , head );
555
- git_config_set (key , head_points_at -> name );
557
+ strbuf_addf (& key , "branch.%s.remote" , head );
558
+ git_config_set (key .buf , option_origin );
559
+ strbuf_reset (& key );
560
+ strbuf_addf (& key , "branch.%s.merge" , head );
561
+ git_config_set (key .buf , head_points_at -> name );
556
562
}
557
563
} else if (remote_head ) {
558
564
/* Source had detached HEAD pointing somewhere. */
@@ -602,6 +608,9 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
602
608
}
603
609
604
610
strbuf_release (& reflog_msg );
611
+ strbuf_release (& branch_top );
612
+ strbuf_release (& key );
613
+ strbuf_release (& value );
605
614
junk_pid = 0 ;
606
615
return 0 ;
607
616
}
0 commit comments