]> git.proxmox.com Git - libgit2.git/blobdiff - src/attr_file.h
Merge pull request #968 from arrbee/diff-support-typechange
[libgit2.git] / src / attr_file.h
index 6284c5386280a15e5150eb4f03ed9494c02cf438..877daf3065ac473a074e279260b5f923e875fd87 100644 (file)
@@ -9,18 +9,25 @@
 
 #include "git2/attr.h"
 #include "vector.h"
-#include "hashtable.h"
+#include "pool.h"
+#include "buffer.h"
 
 #define GIT_ATTR_FILE                  ".gitattributes"
 #define GIT_ATTR_FILE_INREPO   "info/attributes"
 #define GIT_ATTR_FILE_SYSTEM   "gitattributes"
-#define GIT_ATTR_CONFIG                        "core.attributesfile"
 
 #define GIT_ATTR_FNMATCH_NEGATIVE      (1U << 0)
 #define GIT_ATTR_FNMATCH_DIRECTORY     (1U << 1)
 #define GIT_ATTR_FNMATCH_FULLPATH      (1U << 2)
 #define GIT_ATTR_FNMATCH_MACRO         (1U << 3)
 #define GIT_ATTR_FNMATCH_IGNORE                (1U << 4)
+#define GIT_ATTR_FNMATCH_HASWILD       (1U << 5)
+#define GIT_ATTR_FNMATCH_ALLOWSPACE    (1U << 6)
+#define GIT_ATTR_FNMATCH_ICASE         (1U << 7)
+
+extern const char *git_attr__true;
+extern const char *git_attr__false;
+extern const char *git_attr__unset;
 
 typedef struct {
        char *pattern;
@@ -36,42 +43,61 @@ typedef struct {
 typedef struct {
        git_refcount unused;
        const char *name;
-    unsigned long name_hash;
+    uint32_t name_hash;
 } git_attr_name;
 
 typedef struct {
        git_refcount rc;                /* for macros */
        char *name;
-    unsigned long name_hash;
+    uint32_t name_hash;
     const char *value;
-       int is_allocated;
 } git_attr_assignment;
 
 typedef struct {
-       char *path;                             /* cache the path this was loaded from */
+       git_time_t seconds;
+       git_off_t  size;
+       unsigned int ino;
+} git_attr_file_stat_sig;
+
+typedef struct {
+       char *key;                              /* cache "source#path" this was loaded from */
        git_vector rules;               /* vector of <rule*> or <fnmatch*> */
+       git_pool *pool;
+       bool pool_is_allocated;
+       union {
+               git_oid oid;
+               git_attr_file_stat_sig st;
+       } cache_data;
 } git_attr_file;
 
 typedef struct {
-       const char *path;
-       const char *basename;
-       int is_dir;
+       git_buf  full;
+       char    *path;
+       char    *basename;
+       int      is_dir;
 } git_attr_path;
 
+typedef enum {
+       GIT_ATTR_FILE_FROM_FILE = 0,
+       GIT_ATTR_FILE_FROM_INDEX = 1
+} git_attr_file_source;
+
 /*
  * git_attr_file API
  */
 
-extern int git_attr_file__new(git_attr_file **attrs_ptr);
+extern int git_attr_file__new(
+       git_attr_file **attrs_ptr, git_attr_file_source src, const char *path, git_pool *pool);
+
+extern int git_attr_file__new_and_load(
+       git_attr_file **attrs_ptr, const char *path);
+
 extern void git_attr_file__free(git_attr_file *file);
 
-extern int git_attr_file__from_buffer(
-       git_repository *repo, const char *buf, git_attr_file *file);
-extern int git_attr_file__from_file(
-       git_repository *repo, const char *path, git_attr_file *file);
+extern void git_attr_file__clear_rules(git_attr_file *file);
 
-extern int git_attr_file__set_path(
-       git_repository *repo, const char *path, git_attr_file *file);
+extern int git_attr_file__parse_buffer(
+       git_repository *repo, void *parsedata, const char *buf, git_attr_file *file);
 
 extern int git_attr_file__lookup_one(
        git_attr_file *file,
@@ -84,7 +110,7 @@ extern int git_attr_file__lookup_one(
        git_vector_rforeach(&(file)->rules, (iter), (rule)) \
                if (git_attr_rule__match((rule), (path)))
 
-extern unsigned long git_attr_file__name_hash(const char *name);
+extern uint32_t git_attr_file__name_hash(const char *name);
 
 
 /*
@@ -93,6 +119,7 @@ extern unsigned long git_attr_file__name_hash(const char *name);
 
 extern int git_attr_fnmatch__parse(
        git_attr_fnmatch *spec,
+       git_pool *pool,
        const char *source,
        const char **base);
 
@@ -112,8 +139,11 @@ extern git_attr_assignment *git_attr_rule__lookup_assignment(
 extern int git_attr_path__init(
        git_attr_path *info, const char *path, const char *base);
 
+extern void git_attr_path__free(git_attr_path *info);
+
 extern int git_attr_assignment__parse(
        git_repository *repo, /* needed to expand macros */
+       git_pool *pool,
        git_vector *assigns,
        const char **scan);