From: Shashank S via GitGitGadget Date: Tue, 27 Oct 2026 11:14:48 GMT Subject: [PATCH] test-chmtime: use parse_options() to parse command-line flags Message-ID: From: Shashank S Mogaveera cmd__chmtime() currently parses the '-v'/'--verbose' and '-g'/'--get' flags manually using strcmp() checks and manual index tracking. Refactor cmd__chmtime() to use parse_options() and usage_with_options() instead. Pass PARSE_OPT_KEEP_UNKNOWN_OPT so that negative relative time offsets (such as '-86400') are not rejected as unknown short options and remain in argv for timespec_arg() to parse. Signed-off-by: Shashank S Mogaveera --- [Outreachy]test-chmtime: use parse_options() to parse command-line flags Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2280%2Fshashu8660%2Foutreachy3-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2280/shashu8660/outreachy3-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/2280 t/helper/test-chmtime.c | 46 +++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/t/helper/test-chmtime.c b/t/helper/test-chmtime.c index 0e5538833a..dc6281b1d6 100644 --- a/t/helper/test-chmtime.c +++ b/t/helper/test-chmtime.c @@ -38,10 +38,13 @@ */ #include "test-tool.h" #include "git-compat-util.h" +#include "parse-options.h" #include -static const char usage_str[] = - "(-v|--verbose|-g|--get) (+|=|=+|=-|-) ..."; +static const char * const chmtime_usage[] = { + "test-tool chmtime (-v|--verbose|-g|--get) (+|=|=+|=-|-) ...", + NULL +}; static int timespec_arg(const char *arg, long int *set_time, int *set_eq) { @@ -68,40 +71,37 @@ static int timespec_arg(const char *arg, long int *set_time, int *set_eq) int cmd__chmtime(int argc, const char **argv) { - static int verbose; - static int get; + int verbose = 0; + int get = 0; - int i = 1; + int i = 0; /* no mtime change by default */ int set_eq = 0; long int set_time = 0; - if (argc < 3) - goto usage; + struct option options[] = { + OPT_BOOL('v', "verbose", &verbose, "print the mtime and the file name"), + OPT_BOOL('g', "get", &get, "print only the mtime"), + OPT_END() + }; - if (strcmp(argv[i], "--get") == 0 || strcmp(argv[i], "-g") == 0) { - get = 1; - ++i; - } else if (strcmp(argv[i], "--verbose") == 0 || strcmp(argv[i], "-v") == 0) { - verbose = 1; - ++i; - } + argc = parse_options(argc, argv, NULL, options, chmtime_usage, + PARSE_OPT_KEEP_UNKNOWN_OPT); - if (i == argc) { - goto usage; - } + if (argc < 1 || (!get && !verbose && argc < 2)) + usage_with_options(chmtime_usage, options); if (timespec_arg(argv[i], &set_time, &set_eq)) { ++i; } else { if (get == 0 && verbose == 0) { fprintf(stderr, "Not a base-10 integer: %s\n", argv[i] + 1); - goto usage; + usage_with_options(chmtime_usage, options); } } if (i == argc) - goto usage; + usage_with_options(chmtime_usage, options); for (; i < argc; i++) { struct stat sb; @@ -110,7 +110,7 @@ int cmd__chmtime(int argc, const char **argv) if (stat(argv[i], &sb) < 0) { fprintf(stderr, "Failed to stat %s: %s. Skipping\n", - argv[i], strerror(errno)); + argv[i], strerror(errno)); continue; } @@ -150,14 +150,10 @@ int cmd__chmtime(int argc, const char **argv) } #endif fprintf(stderr, "Failed to modify time on %s: %s\n", - argv[i], strerror(errno)); + argv[i], strerror(errno)); return 1; } } return 0; - -usage: - fprintf(stderr, "usage: %s %s\n", argv[0], usage_str); - return 1; } base-commit: 7e34d8174dcda3435d1404c9a30bef46afe6c13e -- gitgitgadget