return error;
}
+int git_attr_cache__is_cached(git_repository *repo, const char *path)
+{
+ const char *cache_key = path;
+ if (repo && git__prefixcmp(cache_key, git_repository_workdir(repo)) == 0)
+ cache_key += strlen(git_repository_workdir(repo));
+ return (git_hashtable_lookup(repo->attrcache.files, cache_key) == NULL);
+}
/* add git_attr_file to vector of files, loading if needed */
int git_attr_cache__push_file(
const char *filename,
int (*loader)(git_repository *, const char *, git_attr_file *));
+/* returns GIT_SUCCESS if path is in cache */
+extern int git_attr_cache__is_cached(git_repository *repo, const char *path);
+
#endif
#include "clar_libgit2.h"
#include "fileops.h"
#include "git2/attr.h"
+#include "attr.h"
static git_repository *g_repo = NULL;
git_buf_free(&b);
}
+
+ cl_git_pass(git_attr_cache__is_cached(g_repo, ".git/info/attributes"));
+ cl_git_pass(git_attr_cache__is_cached(g_repo, ".gitattributes"));
+ cl_git_pass(git_attr_cache__is_cached(g_repo, "sub/.gitattributes"));
}
void test_attr_repo__get_many(void)
#include "clar_libgit2.h"
#include "fileops.h"
#include "git2/attr.h"
+#include "attr.h"
static git_repository *g_repo = NULL;
const char *path;
int expected;
} test_cases[] = {
+ /* patterns "sub" and "ign" from .gitignore */
{ "file", 0 },
{ "ign", 1 },
{ "sub", 1 },
{ "sub/sub/file", 0 },
{ "sub/sub/ign", 1 },
{ "sub/sub/sub", 1 },
+ /* pattern "dir/" from .gitignore */
+ { "dir", 1 },
+ { "dir/", 1 },
+ { "sub/dir", 1 },
+ { "sub/dir/", 1 },
+ { "sub/sub/dir", 0 }, /* dir is not actually a dir, but a file */
{ NULL, 0 }
}, *one_test;
cl_git_pass(git_status_should_ignore(g_repo, one_test->path, &ignored));
cl_assert_(ignored == one_test->expected, one_test->path);
}
+
+ /* confirm that ignore files were cached */
+ cl_git_pass(git_attr_cache__is_cached(g_repo, ".git/info/exclude"));
+ cl_git_pass(git_attr_cache__is_cached(g_repo, ".gitignore"));
}