Commit f58cc280c9ddeff6fd85f56e70073c3ed4fb0650

Edward Thomson 2015-02-03T00:28:32

attr_session: keep a temp buffer

diff --git a/src/attr_file.c b/src/attr_file.c
index 2ebd3b9..8997946 100644
--- a/src/attr_file.c
+++ b/src/attr_file.c
@@ -861,6 +861,7 @@ void git_attr_session__free(git_attr_session *session)
 		return;
 
 	git_buf_free(&session->sysdir);
+	git_buf_free(&session->tmp);
 
 	memset(session, 0, sizeof(git_attr_session));
 }
diff --git a/src/attr_file.h b/src/attr_file.h
index 5c64f7c..aa9a16d 100644
--- a/src/attr_file.h
+++ b/src/attr_file.h
@@ -114,6 +114,7 @@ typedef struct {
 	unsigned int init_setup:1,
 		init_sysdir:1;
 	git_buf sysdir;
+	git_buf tmp;
 } git_attr_session;
 
 extern int git_attr_session__init(git_attr_session *attr_session, git_repository *repo);
diff --git a/src/attrcache.c b/src/attrcache.c
index f75edad..9a9b9d0 100644
--- a/src/attrcache.c
+++ b/src/attrcache.c
@@ -149,6 +149,7 @@ static int attr_cache_lookup(
 	git_attr_file **out_file,
 	git_attr_file_entry **out_entry,
 	git_repository *repo,
+	git_attr_session *attr_session,
 	git_attr_file_source source,
 	const char *base,
 	const char *filename)
@@ -162,9 +163,12 @@ static int attr_cache_lookup(
 
 	/* join base and path as needed */
 	if (base != NULL && git_path_root(filename) < 0) {
-		if (git_buf_joinpath(&path, base, filename) < 0)
+		git_buf *p = attr_session ? &attr_session->tmp : &path;
+
+		if (git_buf_joinpath(p, base, filename) < 0)
 			return -1;
-		filename = path.ptr;
+
+		filename = p->ptr;
 	}
 
 	relfile = filename;
@@ -208,7 +212,7 @@ int git_attr_cache__get(
 	git_attr_file *file = NULL, *updated = NULL;
 
 	if ((error = attr_cache_lookup(
-			&file, &entry, repo, source, base, filename)) < 0)
+			&file, &entry, repo, attr_session, source, base, filename)) < 0)
 		return error;
 
 	/* load file if we don't have one or if existing one is out of date */