Commit fdd1e04ce766c40be90a7b07580842a3f8d76b2e

Jakob Pfender 2011-06-07T14:10:06

fileops: Allow differentiation between deep and shallow exists() When calling gitfo_exists() on a symbolic link, sometimes we need to simply check whether the link exists and sometimes we need to check whether the file pointed to by the symlink exists. Introduce a new function gitfo_shallow_exists that only checks if the link exists and revert gitfo_exists to the original functionality of checking whether the file pointed to by the link exists.

diff --git a/src/fileops.c b/src/fileops.c
index 92b95c5..b11119b 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -172,6 +172,12 @@ int gitfo_isfile(const char *path)
 int gitfo_exists(const char *path)
 {
 	assert(path);
+	return access(path, F_OK);
+}
+
+int gitfo_shallow_exists(const char *path)
+{
+	assert(path);
 
 	struct stat st;
 	return gitfo_lstat(path, &st);
diff --git a/src/index.c b/src/index.c
index 3d2e72e..798d9e9 100644
--- a/src/index.c
+++ b/src/index.c
@@ -411,7 +411,7 @@ static int index_init_entry(git_index_entry *entry, git_index *index, const char
 
 	git__joinpath(full_path, index->repository->path_workdir, rel_path);
 
-	if (gitfo_exists(full_path) < 0)
+	if (gitfo_shallow_exists(full_path) < 0)
 		return git__throw(GIT_ENOTFOUND, "Failed to initialize entry. %s does not exist", full_path);
 
 	if (gitfo_lstat(full_path, &st) < 0)