Commit f004c4a8a78ec1ac109b0a0c78cdebe47a5df215

Russell Belfer 2012-08-21T17:26:39

Add public API for internal ignores This creates a public API for adding to the internal ignores list, which already existing but was not accessible. This adds the new default value for core.excludesfile also.

diff --git a/include/git2.h b/include/git2.h
index 4016748..805044a 100644
--- a/include/git2.h
+++ b/include/git2.h
@@ -41,6 +41,7 @@
 #include "git2/checkout.h"
 
 #include "git2/attr.h"
+#include "git2/ignore.h"
 #include "git2/branch.h"
 #include "git2/refspec.h"
 #include "git2/net.h"
diff --git a/src/attr.c b/src/attr.c
index de714a6..8a7ff28 100644
--- a/src/attr.c
+++ b/src/attr.c
@@ -612,6 +612,16 @@ int git_attr_cache__init(git_repository *repo)
 	if (ret < 0 && ret != GIT_ENOTFOUND)
 		return ret;
 
+	if (ret == GIT_ENOTFOUND) {
+		git_buf dflt = GIT_BUF_INIT;
+
+		ret = git_futils_find_global_file(&dflt, GIT_IGNORE_CONFIG_DEFAULT);
+		if (!ret)
+			cache->cfg_excl_file = git_buf_detach(&dflt);
+
+		git_buf_free(&dflt);
+	}
+
 	giterr_clear();
 
 	/* allocate hashtable for attribute and ignore file contents */
diff --git a/src/attr.h b/src/attr.h
index a35b116..78cfb57 100644
--- a/src/attr.h
+++ b/src/attr.h
@@ -12,6 +12,7 @@
 
 #define GIT_ATTR_CONFIG   "core.attributesfile"
 #define GIT_IGNORE_CONFIG "core.excludesfile"
+#define GIT_IGNORE_CONFIG_DEFAULT ".config/git/ignore"
 
 typedef struct {
 	int initialized;
diff --git a/src/ignore.c b/src/ignore.c
index 93d979f..b81676b 100644
--- a/src/ignore.c
+++ b/src/ignore.c
@@ -1,3 +1,4 @@
+#include "git2/ignore.h"
 #include "ignore.h"
 #include "path.h"
 
@@ -203,3 +204,34 @@ cleanup:
 	git_attr_path__free(&path);
 	return 0;
 }
+
+int git_ignore_add_rule(
+	git_repository *repo,
+	const char *rules)
+{
+	int error;
+	git_attr_file *ign_internal;
+
+	error = git_attr_cache__internal_file(
+		repo, GIT_IGNORE_INTERNAL, &ign_internal);
+
+	if (!error && ign_internal != NULL)
+		error = parse_ignore_file(repo, rules, ign_internal);
+
+	return error;
+}
+
+int git_ignore_clear_internal_rules(
+	git_repository *repo)
+{
+	int error;
+	git_attr_file *ign_internal;
+
+	error = git_attr_cache__internal_file(
+		repo, GIT_IGNORE_INTERNAL, &ign_internal);
+
+	if (!error && ign_internal != NULL)
+		git_attr_file__clear_rules(ign_internal);
+
+	return error;
+}