diff options
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | src/zen/cmds/projectstore_cmd.cpp | 36 |
2 files changed, 34 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index bd1ff27c6..647aedd23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ## +- Improvement: Provide shorter project store name in list when not conflicting with other project names - Improvement: `zen project-details` is now `zen project-op-details` and uses the standard resolving logic for project id and oplog id - Improvement: If there is only one project in the project store, auto-resolve to that if no project id is given - Improvement: Nicer progress bar during oplog import/export diff --git a/src/zen/cmds/projectstore_cmd.cpp b/src/zen/cmds/projectstore_cmd.cpp index afcf71346..a0118576b 100644 --- a/src/zen/cmds/projectstore_cmd.cpp +++ b/src/zen/cmds/projectstore_cmd.cpp @@ -328,6 +328,36 @@ namespace { return SB.ToString(); } + std::string FmtProjectIdArray(const std::vector<std::string>& ProjectIds, + std::string_view Separator = ", "sv, + std::string_view Quotes = "'"sv) + { + std::vector<std::string> PrettyProjectIds; + PrettyProjectIds.reserve(ProjectIds.size()); + for (const std::string& ProjectId : ProjectIds) + { + auto PrettyProjectId = [Quotes, &ProjectIds](const std::string& ProjectId) -> std::string { + if (std::string::size_type DotPos = ProjectId.find('.'); DotPos != std::string::npos) + { + const std::string ConflictProjectId = ProjectId.substr(0, DotPos + 1); + auto It = std::find_if(ProjectIds.begin(), + ProjectIds.end(), + [&ProjectId, &ConflictProjectId](const std::string& CheckForConflictProjectId) { + return (ProjectId != CheckForConflictProjectId) && + CheckForConflictProjectId.starts_with(ConflictProjectId); + }); + if (It == ProjectIds.end()) + { + return fmt::format("{}{}{} ({})", Quotes, ProjectId.substr(0, DotPos), Quotes, ProjectId); + } + } + return fmt::format("{}{}{}", Quotes, ProjectId, Quotes); + }; + PrettyProjectIds.push_back(PrettyProjectId(ProjectId)); + } + return FmtArray(PrettyProjectIds, Separator, ""); + } + std::string ResolveProject(HttpClient& Http, std::string_view OptionalProjectName) { std::vector<std::string> AvailableProjects = GetProjectIds(Http); @@ -352,7 +382,7 @@ namespace { } else { - ZEN_CONSOLE("Available projects at {}: {}", Http.GetBaseUri(), FmtArray(AvailableProjects)); + ZEN_CONSOLE("Available projects at {}: {}", Http.GetBaseUri(), FmtProjectIdArray(AvailableProjects)); return {}; } } @@ -363,7 +393,7 @@ namespace { ZEN_CONSOLE("Unable to match project name '{}' at {}, available projects: {}", OptionalProjectName, Http.GetBaseUri(), - FmtArray(AvailableProjects)); + FmtProjectIdArray(AvailableProjects)); return {}; } @@ -375,7 +405,7 @@ namespace { ZEN_CONSOLE("Project name is ambigous '{}' at {}: possible matches: {}", OptionalProjectName, Http.GetBaseUri(), - FmtArray(MatchingProjectIds)); + FmtProjectIdArray(MatchingProjectIds)); return {}; } |