Option parsing now uses the parser API instead of a local parser.
Code is now more compact.
Description for -stateless-rpc and --advertise-refs
come from the commit (gmane/131517) where there were implemented.

Signed-off-by: Antoine Queru <antoine.qu...@grenoble-inp.fr>
Signed-off-by: Matthieu Moy <matthieu....@grenoble-inp.fr>
---

diff v1 v2:
Usage display "[options]" instead of "[--strict] [--timeout=<n>]".
"argv" is now "const char **".
"-stateless-rpc and --advertise-refs" are no more hidden.
Description has been added for every option.
Usage is displayed if there is not exactly one non option argument.

If we agree on not having hidden option anymore, I will update the doc. 
 upload-pack.c | 62 +++++++++++++++++++++++++----------------------------------
 1 file changed, 26 insertions(+), 36 deletions(-)

diff --git a/upload-pack.c b/upload-pack.c
index dc802a0..a8617ac 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -14,8 +14,12 @@
 #include "sigchain.h"
 #include "version.h"
 #include "string-list.h"
+#include "parse-options.h"
 
-static const char upload_pack_usage[] = "git upload-pack [--strict] 
[--timeout=<n>] <dir>";
+static const char * const upload_pack_usage[] = {
+       N_("git upload-pack [options] <dir>"),
+       NULL
+};
 
 /* Remember to update object flag allocation in object.h */
 #define THEY_HAVE      (1u << 11)
@@ -817,11 +821,21 @@ static int upload_pack_config(const char *var, const char 
*value, void *unused)
        return parse_hide_refs_config(var, value, "uploadpack");
 }
 
-int main(int argc, char **argv)
+int main(int argc, const char **argv)
 {
-       char *dir;
-       int i;
+       const char *dir;
        int strict = 0;
+       struct option options[] = {
+               OPT_BOOL(0, "stateless-rpc", &stateless_rpc,
+                        N_("may perform only a single read-write cycle with 
stdin and stdout")),
+               OPT_BOOL(0, "advertise-refs", &advertise_refs,
+                        N_("only the initial ref advertisement is output, 
program exits immediately")),
+               OPT_BOOL(0, "strict", &strict,
+                        N_("do not try <directory>/.git/ if <directory> is no 
Git directory")),
+               OPT_INTEGER(0, "timeout", &timeout,
+                           N_("interrupt transfer after <n> seconds of 
inactivity")),
+               OPT_END()
+       };
 
        git_setup_gettext();
 
@@ -829,41 +843,17 @@ int main(int argc, char **argv)
        git_extract_argv0_path(argv[0]);
        check_replace_refs = 0;
 
-       for (i = 1; i < argc; i++) {
-               char *arg = argv[i];
-
-               if (arg[0] != '-')
-                       break;
-               if (!strcmp(arg, "--advertise-refs")) {
-                       advertise_refs = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--stateless-rpc")) {
-                       stateless_rpc = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--strict")) {
-                       strict = 1;
-                       continue;
-               }
-               if (starts_with(arg, "--timeout=")) {
-                       timeout = atoi(arg+10);
-                       daemon_mode = 1;
-                       continue;
-               }
-               if (!strcmp(arg, "--")) {
-                       i++;
-                       break;
-               }
-       }
-
-       if (i != argc-1)
-               usage(upload_pack_usage);
+       argc = parse_options(argc, argv, NULL, options, upload_pack_usage, 0);
+       
+       if (argc != 1)
+               usage_with_options(upload_pack_usage, options);
 
-       setup_path();
+       if (timeout)
+               daemon_mode = 1;
 
-       dir = argv[i];
+       setup_path();   
 
+       dir = argv[0];
        if (!enter_repo(dir, strict))
                die("'%s' does not appear to be a git repository", dir);
 
-- 
2.8.2.403.gf2352ca

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to