3 #include <git2/clone.h>
12 typedef struct progress_data
{
13 git_transfer_progress fetch_progress
;
14 size_t completed_steps
;
19 static void print_progress(const progress_data
*pd
)
21 int network_percent
= pd
->fetch_progress
.total_objects
> 0 ?
22 (100*pd
->fetch_progress
.received_objects
) / pd
->fetch_progress
.total_objects
:
24 int index_percent
= pd
->fetch_progress
.total_objects
> 0 ?
25 (100*pd
->fetch_progress
.indexed_objects
) / pd
->fetch_progress
.total_objects
:
28 int checkout_percent
= pd
->total_steps
> 0
29 ? (100 * pd
->completed_steps
) / pd
->total_steps
31 int kbytes
= pd
->fetch_progress
.received_bytes
/ 1024;
33 if (pd
->fetch_progress
.total_objects
&&
34 pd
->fetch_progress
.received_objects
== pd
->fetch_progress
.total_objects
) {
35 printf("Resolving deltas %d/%d\r",
36 pd
->fetch_progress
.indexed_deltas
,
37 pd
->fetch_progress
.total_deltas
);
39 printf("net %3d%% (%4d kb, %5d/%5d) / idx %3d%% (%5d/%5d) / chk %3d%% (%4" PRIuZ
"/%4" PRIuZ
") %s\n",
40 network_percent
, kbytes
,
41 pd
->fetch_progress
.received_objects
, pd
->fetch_progress
.total_objects
,
42 index_percent
, pd
->fetch_progress
.indexed_objects
, pd
->fetch_progress
.total_objects
,
44 pd
->completed_steps
, pd
->total_steps
,
49 static int sideband_progress(const char *str
, int len
, void *payload
)
51 (void)payload
; /* unused */
53 printf("remote: %.*s", len
, str
);
58 static int fetch_progress(const git_transfer_progress
*stats
, void *payload
)
60 progress_data
*pd
= (progress_data
*)payload
;
61 pd
->fetch_progress
= *stats
;
65 static void checkout_progress(const char *path
, size_t cur
, size_t tot
, void *payload
)
67 progress_data
*pd
= (progress_data
*)payload
;
68 pd
->completed_steps
= cur
;
69 pd
->total_steps
= tot
;
75 int do_clone(git_repository
*repo
, int argc
, char **argv
)
77 progress_data pd
= {{0}};
78 git_repository
*cloned_repo
= NULL
;
79 git_clone_options clone_opts
= GIT_CLONE_OPTIONS_INIT
;
80 git_checkout_options checkout_opts
= GIT_CHECKOUT_OPTIONS_INIT
;
81 const char *url
= argv
[1];
82 const char *path
= argv
[2];
85 (void)repo
; /* unused */
89 printf ("USAGE: %s <url> <path>\n", argv
[0]);
94 checkout_opts
.checkout_strategy
= GIT_CHECKOUT_SAFE
;
95 checkout_opts
.progress_cb
= checkout_progress
;
96 checkout_opts
.progress_payload
= &pd
;
97 clone_opts
.checkout_opts
= checkout_opts
;
98 clone_opts
.fetch_opts
.callbacks
.sideband_progress
= sideband_progress
;
99 clone_opts
.fetch_opts
.callbacks
.transfer_progress
= &fetch_progress
;
100 clone_opts
.fetch_opts
.callbacks
.credentials
= cred_acquire_cb
;
101 clone_opts
.fetch_opts
.callbacks
.payload
= &pd
;
104 error
= git_clone(&cloned_repo
, url
, path
, &clone_opts
);
107 const git_error
*err
= git_error_last();
108 if (err
) printf("ERROR %d: %s\n", err
->klass
, err
->message
);
109 else printf("ERROR %d: no detailed info\n", error
);
111 else if (cloned_repo
) git_repository_free(cloned_repo
);