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