From 458a86aacb49b152f65b810140295477d49f2f31 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 21 Apr 2013 13:11:53 +0200 Subject: [PATCH] pkgman: Organize commands by category --- src/bin/pkgman/Command.cpp | 16 +++++++- src/bin/pkgman/Command.h | 13 ++++-- src/bin/pkgman/command_add_repo.cpp | 3 +- src/bin/pkgman/command_drop_repo.cpp | 3 +- src/bin/pkgman/command_install.cpp | 3 +- src/bin/pkgman/command_list_repos.cpp | 3 +- src/bin/pkgman/command_refresh.cpp | 3 +- .../pkgman/command_resolve_dependencies.cpp | 2 +- src/bin/pkgman/command_search.cpp | 3 +- src/bin/pkgman/command_uninstall.cpp | 3 +- src/bin/pkgman/pkgman.cpp | 40 +++++++++++++++---- src/bin/pkgman/pkgman.h | 7 ++++ 12 files changed, 77 insertions(+), 22 deletions(-) diff --git a/src/bin/pkgman/Command.cpp b/src/bin/pkgman/Command.cpp index 31c4b48c8f..b00921bb27 100644 --- a/src/bin/pkgman/Command.cpp +++ b/src/bin/pkgman/Command.cpp @@ -23,11 +23,12 @@ compare_commands_by_name(const Command* a, const Command* b) Command::Command(const BString& name, const BString& shortUsage, - const BString& longUsage) + const BString& longUsage, const BString& category) : fName(name), fShortUsage(shortUsage), - fLongUsage(longUsage) + fLongUsage(longUsage), + fCategory(category) { fShortUsage.ReplaceAll("%command%", fName); fLongUsage.ReplaceAll("%command%", fName); @@ -100,6 +101,17 @@ CommandManager::GetCommands(const char* prefix, CommandList& _commands) } +void +CommandManager::GetCommandsForCategory(const char* category, + CommandList& _commands) +{ + for (int32 i = 0; Command* command = fCommands.ItemAt(i); i++) { + if (command->Category() == category) + _commands.AddItem(command); + } +} + + CommandManager::CommandManager() : fCommands(20, true) diff --git a/src/bin/pkgman/Command.h b/src/bin/pkgman/Command.h index 4d9c6ccc23..d1a53776f6 100644 --- a/src/bin/pkgman/Command.h +++ b/src/bin/pkgman/Command.h @@ -17,14 +17,16 @@ class Command { public: Command(const BString& name, const BString& shortUsage, - const BString& longUsage); + const BString& longUsage, + const BString& category); virtual ~Command(); void Init(const char* programName); const BString& Name() const { return fName; } const BString& ShortUsage() const { return fShortUsage; } - const BString& LongUsage() const { return fName; } + const BString& LongUsage() const { return fLongUsage; } + const BString& Category() const { return fCategory; } void PrintUsage(bool error) const; void PrintUsageAndExit(bool error) const; @@ -35,6 +37,7 @@ private: BString fName; BString fShortUsage; BString fLongUsage; + BString fCategory; }; @@ -52,6 +55,8 @@ public: { return fCommands; } void GetCommands(const char* prefix, CommandList& _commands); + void GetCommandsForCategory(const char* category, + CommandList& _commands); private: CommandManager(); @@ -70,11 +75,11 @@ struct CommandRegistrar { }; -#define DEFINE_COMMAND(className, name, shortUsage, longUsage) \ +#define DEFINE_COMMAND(className, name, shortUsage, longUsage, category) \ struct className : Command { \ className() \ : \ - Command(name, shortUsage, longUsage) \ + Command(name, shortUsage, longUsage, category) \ { \ } \ \ diff --git a/src/bin/pkgman/command_add_repo.cpp b/src/bin/pkgman/command_add_repo.cpp index 798ae6a780..6605f3900b 100644 --- a/src/bin/pkgman/command_add_repo.cpp +++ b/src/bin/pkgman/command_add_repo.cpp @@ -38,7 +38,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(AddRepoCommand, "add-repo", kShortUsage, kLongUsage) +DEFINE_COMMAND(AddRepoCommand, "add-repo", kShortUsage, kLongUsage, + kCommandCategoryRepositories) int diff --git a/src/bin/pkgman/command_drop_repo.cpp b/src/bin/pkgman/command_drop_repo.cpp index 0703fb1011..9c4988a8bf 100644 --- a/src/bin/pkgman/command_drop_repo.cpp +++ b/src/bin/pkgman/command_drop_repo.cpp @@ -36,7 +36,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(DropRepoCommand, "drop-repo", kShortUsage, kLongUsage) +DEFINE_COMMAND(DropRepoCommand, "drop-repo", kShortUsage, kLongUsage, + kCommandCategoryRepositories) int diff --git a/src/bin/pkgman/command_install.cpp b/src/bin/pkgman/command_install.cpp index a1f49c73d8..b0e3134856 100644 --- a/src/bin/pkgman/command_install.cpp +++ b/src/bin/pkgman/command_install.cpp @@ -38,7 +38,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(InstallCommand, "install", kShortUsage, kLongUsage) +DEFINE_COMMAND(InstallCommand, "install", kShortUsage, kLongUsage, + kCommandCategoryPackages) int diff --git a/src/bin/pkgman/command_list_repos.cpp b/src/bin/pkgman/command_list_repos.cpp index e0465121ac..b4e5ac3891 100644 --- a/src/bin/pkgman/command_list_repos.cpp +++ b/src/bin/pkgman/command_list_repos.cpp @@ -42,7 +42,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(ListReposCommand, "list-repos", kShortUsage, kLongUsage) +DEFINE_COMMAND(ListReposCommand, "list-repos", kShortUsage, kLongUsage, + kCommandCategoryRepositories) int diff --git a/src/bin/pkgman/command_refresh.cpp b/src/bin/pkgman/command_refresh.cpp index 4eddeae2a0..20fbb13639 100644 --- a/src/bin/pkgman/command_refresh.cpp +++ b/src/bin/pkgman/command_refresh.cpp @@ -37,7 +37,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(RefreshCommand, "refresh", kShortUsage, kLongUsage) +DEFINE_COMMAND(RefreshCommand, "refresh", kShortUsage, kLongUsage, + kCommandCategoryRepositories) int diff --git a/src/bin/pkgman/command_resolve_dependencies.cpp b/src/bin/pkgman/command_resolve_dependencies.cpp index 575719a570..f9b425696a 100644 --- a/src/bin/pkgman/command_resolve_dependencies.cpp +++ b/src/bin/pkgman/command_resolve_dependencies.cpp @@ -55,7 +55,7 @@ static const char* const kLongUsage = DEFINE_COMMAND(ResolveDependenciesCommand, "resolve-dependencies", kShortUsage, - kLongUsage) + kLongUsage, kCommandCategoryOther) static void diff --git a/src/bin/pkgman/command_search.cpp b/src/bin/pkgman/command_search.cpp index 9d2a72b6c0..2dc9d4a82a 100644 --- a/src/bin/pkgman/command_search.cpp +++ b/src/bin/pkgman/command_search.cpp @@ -47,7 +47,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(SearchCommand, "search", kShortUsage, kLongUsage) +DEFINE_COMMAND(SearchCommand, "search", kShortUsage, kLongUsage, + kCommandCategoryPackages) static int diff --git a/src/bin/pkgman/command_uninstall.cpp b/src/bin/pkgman/command_uninstall.cpp index 5743603e73..0aa4305a43 100644 --- a/src/bin/pkgman/command_uninstall.cpp +++ b/src/bin/pkgman/command_uninstall.cpp @@ -38,7 +38,8 @@ static const char* const kLongUsage = "\n"; -DEFINE_COMMAND(UninstallCommand, "uninstall", kShortUsage, kLongUsage) +DEFINE_COMMAND(UninstallCommand, "uninstall", kShortUsage, kLongUsage, + kCommandCategoryPackages) int diff --git a/src/bin/pkgman/pkgman.cpp b/src/bin/pkgman/pkgman.cpp index eddf6fbbf3..d0843ae328 100644 --- a/src/bin/pkgman/pkgman.cpp +++ b/src/bin/pkgman/pkgman.cpp @@ -18,27 +18,51 @@ extern const char* __progname; const char* kProgramName = __progname; +const BString kCommandCategoryPackages("packages"); +const BString kCommandCategoryRepositories("repositories"); +const BString kCommandCategoryOther("other"); + + static const char* const kUsage = "Usage: %s \n" - "Manages packages and package repository.\n" + "Manages packages and package repositories.\n" "\n" - "Commands:\n" + "Package management commands:\n" + "%s" + "Repository management commands:\n" + "%s" + "Other commands:\n" "%s" "Common Options:\n" - " -h, --help - Print this usage info.\n" + " -h, --help - Print usage info.\n" ; +static BString +get_commands_usage_for_category(const char* category) +{ + BString commandsUsage; + CommandList commands; + CommandManager::Default()->GetCommandsForCategory(category, commands); + for (int32 i = 0; Command* command = commands.ItemAt(i); i++) + commandsUsage << command->ShortUsage() << '\n'; + return commandsUsage; +} + + void print_usage_and_exit(bool error) { - BString commandsUsage; - const CommandList& commands = CommandManager::Default()->Commands(); - for (int32 i = 0; Command* command = commands.ItemAt(i); i++) - commandsUsage << command->ShortUsage() << '\n'; + BString packageCommandsUsage + = get_commands_usage_for_category(kCommandCategoryPackages); + BString repositoryCommandsUsage + = get_commands_usage_for_category(kCommandCategoryRepositories); + BString otherCommandsUsage + = get_commands_usage_for_category(kCommandCategoryOther); fprintf(error ? stderr : stdout, kUsage, kProgramName, - commandsUsage.String()); + packageCommandsUsage.String(), repositoryCommandsUsage.String(), + otherCommandsUsage.String()); exit(error ? 1 : 0); } diff --git a/src/bin/pkgman/pkgman.h b/src/bin/pkgman/pkgman.h index eb308853c0..c061fd9d39 100644 --- a/src/bin/pkgman/pkgman.h +++ b/src/bin/pkgman/pkgman.h @@ -10,6 +10,8 @@ #include #include +#include + extern const char* kProgramName; @@ -36,4 +38,9 @@ do { \ void print_usage_and_exit(bool error); +extern const BString kCommandCategoryPackages; +extern const BString kCommandCategoryRepositories; +extern const BString kCommandCategoryOther; + + #endif // PKGMAN_H