]> git.ipfire.org Git - thirdparty/git.git/blobdiff - tree-walk.c
khash: name the structs that khash declares
[thirdparty/git.git] / tree-walk.c
index 3a94959d64a3a63b784bcadfd47cd12213f3fb2d..d3c48e06df05b707af9f753fd4a3d4641173c00c 100644 (file)
@@ -1,7 +1,12 @@
-#include "cache.h"
+#include "git-compat-util.h"
 #include "tree-walk.h"
+#include "alloc.h"
 #include "dir.h"
+#include "gettext.h"
+#include "hex.h"
+#include "object-file.h"
 #include "object-store.h"
+#include "trace2.h"
 #include "tree.h"
 #include "pathspec.h"
 #include "json-writer.h"
@@ -47,17 +52,20 @@ static int decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned l
 
        /* Initialize the descriptor entry */
        desc->entry.path = path;
-       desc->entry.mode = canon_mode(mode);
+       desc->entry.mode = (desc->flags & TREE_DESC_RAW_MODES) ? mode : canon_mode(mode);
        desc->entry.pathlen = len - 1;
        oidread(&desc->entry.oid, (const unsigned char *)path + len);
 
        return 0;
 }
 
-static int init_tree_desc_internal(struct tree_desc *desc, const void *buffer, unsigned long size, struct strbuf *err)
+static int init_tree_desc_internal(struct tree_desc *desc, const void *buffer,
+                                  unsigned long size, struct strbuf *err,
+                                  enum tree_desc_flags flags)
 {
        desc->buffer = buffer;
        desc->size = size;
+       desc->flags = flags;
        if (size)
                return decode_tree_entry(desc, buffer, size, err);
        return 0;
@@ -66,15 +74,16 @@ static int init_tree_desc_internal(struct tree_desc *desc, const void *buffer, u
 void init_tree_desc(struct tree_desc *desc, const void *buffer, unsigned long size)
 {
        struct strbuf err = STRBUF_INIT;
-       if (init_tree_desc_internal(desc, buffer, size, &err))
+       if (init_tree_desc_internal(desc, buffer, size, &err, 0))
                die("%s", err.buf);
        strbuf_release(&err);
 }
 
-int init_tree_desc_gently(struct tree_desc *desc, const void *buffer, unsigned long size)
+int init_tree_desc_gently(struct tree_desc *desc, const void *buffer, unsigned long size,
+                         enum tree_desc_flags flags)
 {
        struct strbuf err = STRBUF_INIT;
-       int result = init_tree_desc_internal(desc, buffer, size, &err);
+       int result = init_tree_desc_internal(desc, buffer, size, &err, flags);
        if (result)
                error("%s", err.buf);
        strbuf_release(&err);
@@ -89,7 +98,7 @@ void *fill_tree_descriptor(struct repository *r,
        void *buf = NULL;
 
        if (oid) {
-               buf = read_object_with_reference(r, oid, tree_type, &size, NULL);
+               buf = read_object_with_reference(r, oid, OBJ_TREE, &size, NULL);
                if (!buf)
                        die("unable to read tree %s", oid_to_hex(oid));
        }
@@ -605,7 +614,7 @@ int get_tree_entry(struct repository *r,
        unsigned long size;
        struct object_id root;
 
-       tree = read_object_with_reference(r, tree_oid, tree_type, &size, &root);
+       tree = read_object_with_reference(r, tree_oid, OBJ_TREE, &size, &root);
        if (!tree)
                return -1;
 
@@ -677,7 +686,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
                        unsigned long size;
                        tree = read_object_with_reference(r,
                                                          &current_tree_oid,
-                                                         tree_type, &size,
+                                                         OBJ_TREE, &size,
                                                          &root);
                        if (!tree)
                                goto done;