22
33#include " ../subcommand/clone_subcommand.hpp"
44#include " ../utils/output.hpp"
5+ #include " ../utils/progress.hpp"
56#include " ../wrapper/repository_wrapper.hpp"
67
78clone_subcommand::clone_subcommand (const libgit2_object&, CLI::App& app)
@@ -10,81 +11,11 @@ clone_subcommand::clone_subcommand(const libgit2_object&, CLI::App& app)
1011
1112 sub->add_option (" <repository>" , m_repository, " The (possibly remote) repository to clone from." )->required ();
1213 sub->add_option (" <directory>" , m_directory, " The name of a new directory to clone into." );
14+ sub->add_flag (" --bare" , m_bare, " Create a bare Git repository." );
1315
1416 sub->callback ([this ]() { this ->run (); });
1517}
1618
17- namespace
18- {
19- int sideband_progress (const char * str, int len, void *)
20- {
21- printf (" remote: %.*s" , len, str);
22- fflush (stdout);
23- return 0 ;
24- }
25-
26- int fetch_progress (const git_indexer_progress* stats, void * payload)
27- {
28- static bool done = false ;
29-
30- // We need to copy stats into payload even if the fetch is done,
31- // because the checkout_progress callback will be called with the
32- // same payload and needs the data to be up do date.
33- auto * pr = reinterpret_cast <git_indexer_progress*>(payload);
34- *pr = *stats;
35-
36- if (done)
37- {
38- return 0 ;
39- }
40-
41- int network_percent = pr->total_objects > 0 ?
42- (100 * pr->received_objects / pr->total_objects )
43- : 0 ;
44- size_t mbytes = pr->received_bytes / (1024 *1024 );
45-
46- std::cout << " Receiving objects: " << std::setw (4 ) << network_percent
47- << " % (" << pr->received_objects << " /" << pr->total_objects << " ), "
48- << mbytes << " MiB" ;
49-
50- if (pr->received_objects == pr->total_objects )
51- {
52- std::cout << " , done." << std::endl;
53- done = true ;
54- }
55- else
56- {
57- std::cout << ' \r ' ;
58- }
59- return 0 ;
60- }
61-
62- void checkout_progress (const char * path, size_t cur, size_t tot, void * payload)
63- {
64- static bool done = false ;
65- if (done)
66- {
67- return ;
68- }
69- auto * pr = reinterpret_cast <git_indexer_progress*>(payload);
70- int deltas_percent = pr->total_deltas > 0 ?
71- (100 * pr->indexed_deltas / pr->total_deltas )
72- : 0 ;
73-
74- std::cout << " Resolving deltas: " << std::setw (4 ) << deltas_percent
75- << " % (" << pr->indexed_deltas << " /" << pr->total_deltas << " )" ;
76- if (pr->indexed_deltas == pr->total_deltas )
77- {
78- std::cout << " , done." << std::endl;
79- done = true ;
80- }
81- else
82- {
83- std::cout << ' \r ' ;
84- }
85- }
86- }
87-
8819void clone_subcommand::run ()
8920{
9021 git_indexer_progress pd;
@@ -94,9 +25,10 @@ void clone_subcommand::run()
9425 checkout_opts.progress_cb = checkout_progress;
9526 checkout_opts.progress_payload = &pd;
9627 clone_opts.checkout_opts = checkout_opts;
97- clone_opts.fetch_opts .callbacks .sideband_progress = sideband_progress;
98- clone_opts.fetch_opts .callbacks .transfer_progress = fetch_progress;
99- clone_opts.fetch_opts .callbacks .payload = &pd;
28+ clone_opts.fetch_opts .callbacks .sideband_progress = sideband_progress;
29+ clone_opts.fetch_opts .callbacks .transfer_progress = fetch_progress;
30+ clone_opts.fetch_opts .callbacks .payload = &pd;
31+ clone_opts.bare = m_bare ? 1 : 0 ;
10032
10133 std::string short_name = m_directory;
10234 if (m_directory.empty ())
0 commit comments