10d68f6afSOliver Tappe /*
20d68f6afSOliver Tappe * Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de>
30d68f6afSOliver Tappe * Distributed under the terms of the MIT License.
40d68f6afSOliver Tappe */
50d68f6afSOliver Tappe
60d68f6afSOliver Tappe
70d68f6afSOliver Tappe #include "package_repo.h"
80d68f6afSOliver Tappe
90d68f6afSOliver Tappe #include <errno.h>
100d68f6afSOliver Tappe #include <getopt.h>
110d68f6afSOliver Tappe #include <stdio.h>
120d68f6afSOliver Tappe #include <stdlib.h>
130d68f6afSOliver Tappe #include <string.h>
140d68f6afSOliver Tappe
150d68f6afSOliver Tappe extern const char* __progname;
160d68f6afSOliver Tappe const char* kCommandName = __progname;
170d68f6afSOliver Tappe
180d68f6afSOliver Tappe
190d68f6afSOliver Tappe static const char* kUsage =
200d68f6afSOliver Tappe "Usage: %s <command> <command args>\n"
210d68f6afSOliver Tappe "Creates or inspects a Haiku package repository file.\n"
220d68f6afSOliver Tappe "\n"
230d68f6afSOliver Tappe "Commands:\n"
248e727451SOliver Tappe " create [ <options> ] <repo-info> <package-file ...> \n"
258e727451SOliver Tappe " Creates a package repository from the information found in \n"
268e727451SOliver Tappe " <repo-info>, adding the given package files.\n"
270d68f6afSOliver Tappe "\n"
280d68f6afSOliver Tappe " -C <dir> - Change to directory <dir> before starting.\n"
290d68f6afSOliver Tappe " -q - be quiet (don't show any output except for errors).\n"
300d68f6afSOliver Tappe " -v - be verbose (list package attributes as encountered).\n"
310d68f6afSOliver Tappe "\n"
320d68f6afSOliver Tappe " list [ <options> ] <package-repo>\n"
330d68f6afSOliver Tappe " Lists the contents of package repository file <package-repo>.\n"
340d68f6afSOliver Tappe "\n"
35*5a8a2b50SAugustin Cavalier " -f - print canonical filenames of packages.\n"
360d68f6afSOliver Tappe " -v - be verbose (list attributes of all packages found).\n"
370d68f6afSOliver Tappe "\n"
388e727451SOliver Tappe " update [ <options> ] <source-repo> <new-repo> <package-list-file> \n"
39da33beabSOliver Tappe " Creates package repository file <new-repo> with all the packages\n"
40da33beabSOliver Tappe " contained in <package-list-file>. If possible, package-infos are\n"
418e727451SOliver Tappe " taken from <source-repo> to avoid the need for recomputing the\n"
428e727451SOliver Tappe " checksum of all packages.\n"
43da33beabSOliver Tappe " <old-repo> and <new-repo> can be the same file.\n"
44a272ee79SMichael Lotz " When -t is specified, filenames in the package-list-file are assumed\n"
45a272ee79SMichael Lotz " to be equal to their canonical name that can be reconstructed from\n"
46a272ee79SMichael Lotz " the repository file. This removes the need for accessing the files\n"
47a272ee79SMichael Lotz " and they are allowed to be completely missing.\n"
48da33beabSOliver Tappe "\n"
49da33beabSOliver Tappe " -C <dir> - Change to directory <dir> before starting.\n"
50da33beabSOliver Tappe " -q - be quiet (don't show any output except for errors).\n"
51da33beabSOliver Tappe " -v - be verbose (list package attributes as encountered).\n"
52a272ee79SMichael Lotz " -t - Trust filenames in package-list-file to be canonical.\n"
53da33beabSOliver Tappe "\n"
540d68f6afSOliver Tappe "Common Options:\n"
550d68f6afSOliver Tappe " -h, --help - Print this usage info.\n"
560d68f6afSOliver Tappe ;
570d68f6afSOliver Tappe
580d68f6afSOliver Tappe
590d68f6afSOliver Tappe void
print_usage_and_exit(bool error)600d68f6afSOliver Tappe print_usage_and_exit(bool error)
610d68f6afSOliver Tappe {
620d68f6afSOliver Tappe fprintf(error ? stderr : stdout, kUsage, kCommandName);
630d68f6afSOliver Tappe exit(error ? 1 : 0);
640d68f6afSOliver Tappe }
650d68f6afSOliver Tappe
660d68f6afSOliver Tappe
670d68f6afSOliver Tappe int
main(int argc,const char * const * argv)680d68f6afSOliver Tappe main(int argc, const char* const* argv)
690d68f6afSOliver Tappe {
700d68f6afSOliver Tappe if (argc < 2)
710d68f6afSOliver Tappe print_usage_and_exit(true);
720d68f6afSOliver Tappe
730d68f6afSOliver Tappe const char* command = argv[1];
740d68f6afSOliver Tappe if (strcmp(command, "create") == 0)
750d68f6afSOliver Tappe return command_create(argc - 1, argv + 1);
760d68f6afSOliver Tappe
770d68f6afSOliver Tappe if (strcmp(command, "list") == 0)
780d68f6afSOliver Tappe return command_list(argc - 1, argv + 1);
790d68f6afSOliver Tappe
80da33beabSOliver Tappe if (strcmp(command, "update") == 0)
81da33beabSOliver Tappe return command_update(argc - 1, argv + 1);
82da33beabSOliver Tappe
830d68f6afSOliver Tappe if (strcmp(command, "help") == 0)
840d68f6afSOliver Tappe print_usage_and_exit(false);
850d68f6afSOliver Tappe else
860d68f6afSOliver Tappe print_usage_and_exit(true);
870d68f6afSOliver Tappe
880d68f6afSOliver Tappe // never gets here
890d68f6afSOliver Tappe return 0;
900d68f6afSOliver Tappe }
91