]> git.ipfire.org Git - thirdparty/git.git/blobdiff - builtin/rev-parse.c
Merge branch 'eb/hash-transition'
[thirdparty/git.git] / builtin / rev-parse.c
index 181c703d4c00bcce1f1715f1a8913fad0892828d..624182e507e5af9ac34a67f18d7a5dcf6fe2e58c 100644 (file)
@@ -25,6 +25,7 @@
 #include "submodule.h"
 #include "commit-reach.h"
 #include "shallow.h"
+#include "object-file-convert.h"
 
 #define DO_REVS                1
 #define DO_NOREV       2
@@ -676,6 +677,8 @@ static void print_path(const char *path, const char *prefix, enum format_type fo
 int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 {
        int i, as_is = 0, verify = 0, quiet = 0, revs_count = 0, type = 0;
+       const struct git_hash_algo *output_algo = NULL;
+       const struct git_hash_algo *compat = NULL;
        int did_repo_setup = 0;
        int has_dashdash = 0;
        int output_prefix = 0;
@@ -747,6 +750,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
 
                        prepare_repo_settings(the_repository);
                        the_repository->settings.command_requires_full_index = 0;
+                       compat = the_repository->compat_hash_algo;
                }
 
                if (!strcmp(arg, "--")) {
@@ -834,6 +838,22 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                flags |= GET_OID_QUIETLY;
                                continue;
                        }
+                       if (opt_with_value(arg, "--output-object-format", &arg)) {
+                               if (!arg)
+                                       die(_("no object format specified"));
+                               if (!strcmp(arg, the_hash_algo->name) ||
+                                   !strcmp(arg, "storage")) {
+                                       flags |= GET_OID_HASH_ANY;
+                                       output_algo = the_hash_algo;
+                                       continue;
+                               }
+                               else if (compat && !strcmp(arg, compat->name)) {
+                                       flags |= GET_OID_HASH_ANY;
+                                       output_algo = compat;
+                                       continue;
+                               }
+                               else die(_("unsupported object format: %s"), arg);
+                       }
                        if (opt_with_value(arg, "--short", &arg)) {
                                filter &= ~(DO_FLAGS|DO_NOREV);
                                verify = 1;
@@ -883,7 +903,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                                continue;
                        }
                        if (skip_prefix(arg, "--disambiguate=", &arg)) {
-                               repo_for_each_abbrev(the_repository, arg,
+                               repo_for_each_abbrev(the_repository, arg, the_hash_algo,
                                                     show_abbrev, NULL);
                                continue;
                        }
@@ -1091,6 +1111,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
                }
                if (!get_oid_with_context(the_repository, name,
                                          flags, &oid, &unused)) {
+                       if (output_algo)
+                               repo_oid_to_algop(the_repository, &oid,
+                                                 output_algo, &oid);
                        if (verify)
                                revs_count++;
                        else