]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/rev-parse.c
rev-parse: handle --end-of-options
[thirdparty/git.git] / builtin / rev-parse.c
index 79689286d83dbf1b6b254cb823d65e1dc20f70fc..69ba7326cf823a774d3d673a283cfe08a0fce3fc 100644 (file)
@@ -595,6 +595,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
        struct object_context unused;
        struct strbuf buf = STRBUF_INIT;
        const int hexsz = the_hash_algo->hexsz;
+       int seen_end_of_options = 0;
 
        if (argc > 1 && !strcmp("--parseopt", argv[1]))
                return cmd_parseopt(argc - 1, argv + 1, prefix);
@@ -628,21 +629,23 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                        continue;
                }
 
-               if (!strcmp(arg, "--local-env-vars")) {
-                       int i;
-                       for (i = 0; local_repo_env[i]; i++)
-                               printf("%s\n", local_repo_env[i]);
-                       continue;
-               }
-               if (!strcmp(arg, "--resolve-git-dir")) {
-                       const char *gitdir = argv[++i];
-                       if (!gitdir)
-                               die("--resolve-git-dir requires an argument");
-                       gitdir = resolve_gitdir(gitdir);
-                       if (!gitdir)
-                               die("not a gitdir '%s'", argv[i]);
-                       puts(gitdir);
-                       continue;
+               if (!seen_end_of_options) {
+                       if (!strcmp(arg, "--local-env-vars")) {
+                               int i;
+                               for (i = 0; local_repo_env[i]; i++)
+                                       printf("%s\n", local_repo_env[i]);
+                               continue;
+                       }
+                       if (!strcmp(arg, "--resolve-git-dir")) {
+                               const char *gitdir = argv[++i];
+                               if (!gitdir)
+                                       die("--resolve-git-dir requires an argument");
+                               gitdir = resolve_gitdir(gitdir);
+                               if (!gitdir)
+                                       die("not a gitdir '%s'", argv[i]);
+                               puts(gitdir);
+                               continue;
+                       }
                }
 
                /* The rest of the options require a git repository. */
@@ -652,14 +655,15 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                        did_repo_setup = 1;
                }
 
-               if (*arg == '-') {
-                       if (!strcmp(arg, "--")) {
-                               as_is = 2;
-                               /* Pass on the "--" if we show anything but files.. */
-                               if (filter & (DO_FLAGS | DO_REVS))
-                                       show_file(arg, 0);
-                               continue;
-                       }
+               if (!strcmp(arg, "--")) {
+                       as_is = 2;
+                       /* Pass on the "--" if we show anything but files.. */
+                       if (filter & (DO_FLAGS | DO_REVS))
+                               show_file(arg, 0);
+                       continue;
+               }
+
+               if (!seen_end_of_options && *arg == '-') {
                        if (!strcmp(arg, "--git-path")) {
                                if (!argv[i + 1])
                                        die("--git-path requires an argument");
@@ -937,6 +941,12 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                puts(the_hash_algo->name);
                                continue;
                        }
+                       if (!strcmp(arg, "--end-of-options")) {
+                               seen_end_of_options = 1;
+                               if (filter & (DO_FLAGS | DO_REVS))
+                                       show_file(arg, 0);
+                               continue;
+                       }
                        if (show_flag(arg) && verify)
                                die_no_single_rev(quiet);
                        continue;