diff options
author | brgayazov <bulat@ydb.tech> | 2023-06-01 18:36:55 +0300 |
---|---|---|
committer | brgayazov <bulat@ydb.tech> | 2023-06-01 18:36:55 +0300 |
commit | 85915cf42494dc5b4fecde3c4dbde42d8811c642 (patch) | |
tree | c4eb3818dc57c63d3a81db7a79c577d18d4570c1 | |
parent | ea304c573cd8b749e6e482859c92f81e4785565f (diff) | |
download | ydb-85915cf42494dc5b4fecde3c4dbde42d8811c642.tar.gz |
Added progress bar to rmdir -r command
8 files changed, 88 insertions, 5 deletions
diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.darwin-x86_64.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.darwin-x86_64.txt index dd8b4338eeb..38872415195 100644 --- a/ydb/public/lib/ydb_cli/common/CMakeLists.darwin-x86_64.txt +++ b/ydb/public/lib/ydb_cli/common/CMakeLists.darwin-x86_64.txt @@ -54,6 +54,7 @@ target_sources(common PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_operation.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_utils.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/progress_bar.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt index 54e51dcdd44..8f0b7768a39 100644 --- a/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt +++ b/ydb/public/lib/ydb_cli/common/CMakeLists.linux-aarch64.txt @@ -55,6 +55,7 @@ target_sources(common PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_operation.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_utils.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/progress_bar.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.linux-x86_64.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.linux-x86_64.txt index 54e51dcdd44..8f0b7768a39 100644 --- a/ydb/public/lib/ydb_cli/common/CMakeLists.linux-x86_64.txt +++ b/ydb/public/lib/ydb_cli/common/CMakeLists.linux-x86_64.txt @@ -55,6 +55,7 @@ target_sources(common PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_operation.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_utils.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/progress_bar.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp diff --git a/ydb/public/lib/ydb_cli/common/CMakeLists.windows-x86_64.txt b/ydb/public/lib/ydb_cli/common/CMakeLists.windows-x86_64.txt index dd8b4338eeb..38872415195 100644 --- a/ydb/public/lib/ydb_cli/common/CMakeLists.windows-x86_64.txt +++ b/ydb/public/lib/ydb_cli/common/CMakeLists.windows-x86_64.txt @@ -54,6 +54,7 @@ target_sources(common PRIVATE ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_operation.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/print_utils.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/profile_manager.cpp + ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/progress_bar.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/query_stats.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_list.cpp ${CMAKE_SOURCE_DIR}/ydb/public/lib/ydb_cli/common/recursive_remove.cpp diff --git a/ydb/public/lib/ydb_cli/common/common.cpp b/ydb/public/lib/ydb_cli/common/common.cpp index 6703102bfad..ac1a9f63263 100644 --- a/ydb/public/lib/ydb_cli/common/common.cpp +++ b/ydb/public/lib/ydb_cli/common/common.cpp @@ -91,13 +91,17 @@ TString ReadFromFile(TString& filePath, const TString& fileName, bool allowEmpty } size_t TermWidth() { -#ifdef _unix_ - struct winsize ws; - if (!ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws)) { - return ws.ws_col; +#if defined(_win32_) + CONSOLE_SCREEN_BUFFER_INFO screen_buf_info; + if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &screen_buf_info)) { + return screen_buf_info.srWindow.Right - screen_buf_info.srWindow.Left + 1; + } +#elif defined(_unix_) + struct winsize size; + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &size) != -1) { + return size.ws_col; } #endif - return Max<size_t>(); } diff --git a/ydb/public/lib/ydb_cli/common/progress_bar.cpp b/ydb/public/lib/ydb_cli/common/progress_bar.cpp new file mode 100644 index 00000000000..f046496b90b --- /dev/null +++ b/ydb/public/lib/ydb_cli/common/progress_bar.cpp @@ -0,0 +1,52 @@ +#include "common.h" +#include "progress_bar.h" + +#include <util/string/cast.h> + +namespace NYdb { +namespace NConsoleClient { + +TProgressBar::TProgressBar(size_t capacity) : Capacity(capacity) { +} + +void TProgressBar::AddProgress(size_t value) { + CurProgress = Min(CurProgress + value, Capacity); + size_t barLen = TermWidth(); + if (Capacity == 0 || barLen == Max<size_t>()) { + return; + } + + TString output = ToString(CurProgress * 100 / Capacity); + output += "% |"; + TString outputEnd = "| ["; + outputEnd += ToString(CurProgress); + outputEnd += "/"; + outputEnd += ToString(Capacity); + outputEnd += "]"; + + if (barLen > output.Size()) { + barLen -= output.Size(); + } else { + barLen = 1; + } + + if (barLen > outputEnd.Size()) { + barLen -= outputEnd.Size(); + } else { + barLen = 1; + } + + size_t filledBarLen = CurProgress * barLen / Capacity; + output += TString("█") * filledBarLen; + output += TString("░") * (barLen - filledBarLen); + output += outputEnd; + output += "\r"; + Cout << output; + if (CurProgress == Capacity) { + Cout << "\n"; + } + Cout.Flush(); +} + +} // namespace NConsoleClient +} // namespace NYdb diff --git a/ydb/public/lib/ydb_cli/common/progress_bar.h b/ydb/public/lib/ydb_cli/common/progress_bar.h new file mode 100644 index 00000000000..27b9f750fa8 --- /dev/null +++ b/ydb/public/lib/ydb_cli/common/progress_bar.h @@ -0,0 +1,20 @@ +#pragma once + +#include <cstddef> + +namespace NYdb { +namespace NConsoleClient { + +class TProgressBar { +public: + explicit TProgressBar(size_t capacity); + + void AddProgress(size_t value); + +private: + size_t Capacity = 0; + size_t CurProgress = 0; +}; + +} // namespace NConsoleClient +} // namespace NYdb diff --git a/ydb/public/lib/ydb_cli/common/recursive_remove.cpp b/ydb/public/lib/ydb_cli/common/recursive_remove.cpp index 642df9a4f08..07833902f9e 100644 --- a/ydb/public/lib/ydb_cli/common/recursive_remove.cpp +++ b/ydb/public/lib/ydb_cli/common/recursive_remove.cpp @@ -1,4 +1,5 @@ #include "interactive.h" +#include "progress_bar.h" #include "recursive_remove.h" #include <ydb/public/lib/ydb_cli/common/recursive_list.h> @@ -111,6 +112,7 @@ TStatus RemoveDirectoryRecursive( } } + TProgressBar bar(recursiveListResult.Entries.size()); // output order is: Root, Recursive(children)... // we need to reverse it to delete recursively for (auto it = recursiveListResult.Entries.rbegin(); it != recursiveListResult.Entries.rend(); ++it) { @@ -145,6 +147,7 @@ TStatus RemoveDirectoryRecursive( return TStatus(EStatus::UNSUPPORTED, MakeIssues(TStringBuilder() << "Unsupported entry type: " << entry.Type)); } + bar.AddProgress(1); } return TStatus(EStatus::SUCCESS, {}); |