Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 38 additions & 11 deletions src/client/cli/cmd/animated_spinner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ void clear_line(std::ostream& out)
}
} // namespace

mp::AnimatedSpinner::AnimatedSpinner(std::ostream& cout)
: spinner{'|', '/', '-', '\\'}, cout{cout}, running{false}
mp::AnimatedSpinner::AnimatedSpinner(std::ostream& cout, bool is_live)
: spinner{'|', '/', '-', '\\'}, cout{cout}, is_live{is_live}, running{false}
{
}

Expand All @@ -46,9 +46,18 @@ void mp::AnimatedSpinner::start(const std::string& start_message)
{
current_message = start_message;
running = true;
clear_line(cout);
cout << start_message << " " << std::flush;
t = std::thread(&AnimatedSpinner::draw, this);

if (is_live)
{
clear_line(cout);
cout << start_message << " " << std::flush;
t = std::thread(&AnimatedSpinner::draw, this);
}
else
{
cout << start_message << "\n" << std::flush;
t = std::thread(&AnimatedSpinner::draw_plain, this);
}
}
}

Expand All @@ -69,16 +78,23 @@ void mp::AnimatedSpinner::stop()
if (t.joinable())
t.join();
}
clear_line(cout);

if (is_live)
clear_line(cout);
}

void mp::AnimatedSpinner::print(std::ostream& stream, const std::string& message)
{
stop();

stream << message;

start();
if (is_live)
{
stop();
stream << message;
start();
}
else
{
stream << message << std::flush;
}
}

void mp::AnimatedSpinner::draw()
Expand All @@ -95,3 +111,14 @@ void mp::AnimatedSpinner::draw()
cout << "\b"
<< " " << std::flush;
}

void mp::AnimatedSpinner::draw_plain()
{
std::unique_lock<decltype(mutex)> lock{mutex};
while (running)
{
cv.wait_for(lock, std::chrono::seconds(5));
if (running)
cout << "." << std::flush;
}
}
4 changes: 3 additions & 1 deletion src/client/cli/cmd/animated_spinner.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace multipass
class AnimatedSpinner
{
public:
explicit AnimatedSpinner(std::ostream& cout);
AnimatedSpinner(std::ostream& cout, bool is_live);
~AnimatedSpinner();

void start(const std::string& message);
Expand All @@ -37,8 +37,10 @@ class AnimatedSpinner

private:
void draw();
void draw_plain();
const std::vector<char> spinner;
std::ostream& cout;
const bool is_live;
bool running;
std::string current_message;
std::mutex mutex;
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/clone.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ mp::ReturnCodeVariant cmd::Clone::run(ArgParser* parser)
return parser->returnCodeFrom(parscode);
}

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};
auto action_on_success = [this, &spinner](CloneReply& reply) -> ReturnCodeVariant {
spinner.stop();
cout << reply.reply_message();
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/launch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ mp::ReturnCodeVariant cmd::Launch::request_launch(const ArgParser* parser)
{
if (!spinner)
spinner = std::make_unique<multipass::AnimatedSpinner>(
cout); // Creating just in time to work around canonical/multipass#2075
cout, term->cout_is_live()); // Creating just in time to work around canonical/multipass#2075

if (timer)
timer->resume();
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/mount.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ mp::ReturnCodeVariant cmd::Mount::run(mp::ArgParser* parser)
return parser->returnCodeFrom(ret);
}

mp::AnimatedSpinner spinner{cout};
mp::AnimatedSpinner spinner{cout, term->cout_is_live()};

auto on_success = [&spinner](mp::MountReply& reply) -> ReturnCodeVariant {
spinner.stop();
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/restart.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ mp::ReturnCodeVariant cmd::Restart::run(mp::ArgParser* parser)
if (ret != ParseCode::Ok)
return parser->returnCodeFrom(ret);

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};
auto on_success = [this, &spinner](mp::RestartReply& reply) -> ReturnCodeVariant {
spinner.stop();
if (term->is_live() && update_available(reply.update_info()))
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/restore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ mp::ReturnCodeVariant cmd::Restore::run(mp::ArgParser* parser)
if (auto ret = parse_args(parser); ret != ParseCode::Ok)
return parser->returnCodeFrom(ret);

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};

auto on_success = [this, &spinner](mp::RestoreReply& reply) -> ReturnCodeVariant {
spinner.stop();
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/snapshot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ mp::ReturnCodeVariant cmd::Snapshot::run(mp::ArgParser* parser)
if (auto ret = parse_args(parser); ret != ParseCode::Ok)
return parser->returnCodeFrom(ret);

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};

auto on_success = [this, &spinner](mp::SnapshotReply& reply) -> ReturnCodeVariant {
spinner.stop();
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/start.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ mp::ReturnCodeVariant cmd::Start::run(mp::ArgParser* parser)
return parser->returnCodeFrom(ret);
}

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};

auto on_success = [&spinner, this](mp::StartReply& reply) -> ReturnCodeVariant {
spinner.stop();
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/stop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ mp::ReturnCodeVariant cmd::Stop::run(mp::ArgParser* parser)

auto on_success = [](mp::StopReply& reply) -> ReturnCodeVariant { return ReturnCode::Ok; };

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};
auto on_failure = [this, &spinner](grpc::Status& status) -> ReturnCodeVariant {
spinner.stop();

Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/suspend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ mp::ReturnCodeVariant cmd::Suspend::run(mp::ArgParser* parser)

auto on_success = [](mp::SuspendReply& reply) -> ReturnCodeVariant { return ReturnCode::Ok; };

AnimatedSpinner spinner{cout};
AnimatedSpinner spinner{cout, term->cout_is_live()};
auto on_failure = [this, &spinner](grpc::Status& status) -> ReturnCodeVariant {
spinner.stop();
return standard_failure_handler_for(name(), cerr, status);
Expand Down
2 changes: 1 addition & 1 deletion src/client/cli/cmd/wait_ready.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ mp::ReturnCodeVariant cmd::WaitReady::run(mp::ArgParser* parser)
return parser->returnCodeFrom(ret);
}

mp::AnimatedSpinner spinner{cout};
mp::AnimatedSpinner spinner{cout, term->cout_is_live()};
spinner.start("Waiting for the Multipass daemon to be ready");

std::unique_ptr<mp::utils::Timer> timer;
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/test_common_callbacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ struct TestSpinnerCallbacks : public Test
std::ostringstream out, err;
std::istringstream in;
mpt::StubTerminal term{out, err, in};
mp::AnimatedSpinner spinner{out};
mp::AnimatedSpinner spinner{out, true};
};

enum class CommonCallbackType
Expand Down