Commit 86e356ee51b07049202078b1ad2f23ac7136075e

Russell Belfer 2011-12-18T12:08:50

Restore missing lstat in index_entry_init In an effort to remove duplicate code, I accidentally left the stat structure uninitialized in this function. This patch restores that data gathering.

diff --git a/src/index.c b/src/index.c
index 9baab16..43e8efa 100644
--- a/src/index.c
+++ b/src/index.c
@@ -297,6 +297,8 @@ static int index_entry_init(git_index_entry **entry_out, git_index *index, const
 	git_index_entry *entry = NULL;
 	struct stat st;
 	git_oid oid;
+	const char *workdir;
+	git_buf full_path = GIT_BUF_INIT;
 	int error;
 
 	if (INDEX_OWNER(index) == NULL)
@@ -307,6 +309,23 @@ static int index_entry_init(git_index_entry **entry_out, git_index *index, const
 		return git__throw(GIT_ERROR,
 			"Failed to initialize entry. Invalid stage %i", stage);
 
+	workdir = git_repository_workdir(INDEX_OWNER(index));
+	if (workdir == NULL)
+		return git__throw(GIT_EBAREINDEX,
+			"Failed to initialize entry. Cannot resolved workdir");
+
+	error = git_buf_joinpath(&full_path, workdir, rel_path);
+	if (error < GIT_SUCCESS)
+		return error;
+
+	if (p_lstat(full_path.ptr, &st) < 0) {
+		error = git__throw(GIT_ENOTFOUND, "Failed to initialize entry. '%s' cannot be opened. %s", full_path.ptr, strerror(errno));
+		git_buf_free(&full_path);
+		return error;
+	}
+
+	git_buf_free(&full_path); /* done with full path */
+
 	/* There is no need to validate the rel_path here, since it will be
 	 * immediately validated by the call to git_blob_create_fromfile.
 	 */