Commit 86c9d3da by Alan Rogers

Return GIT_FILEMODE_UNREADABLE for files that fail to stat.

parent 61bef72d
...@@ -41,7 +41,6 @@ typedef enum { ...@@ -41,7 +41,6 @@ typedef enum {
GIT_EMERGECONFLICT = -13, /*< Merge conflicts prevented operation */ GIT_EMERGECONFLICT = -13, /*< Merge conflicts prevented operation */
GIT_ELOCKED = -14, /*< Lock file prevented operation */ GIT_ELOCKED = -14, /*< Lock file prevented operation */
GIT_EMODIFIED = -15, /*< Reference value does not match expected */ GIT_EMODIFIED = -15, /*< Reference value does not match expected */
GIT_EUNREADABLE = -16, /*< File or folder is unreadable */
GIT_PASSTHROUGH = -30, /*< Internal only */ GIT_PASSTHROUGH = -30, /*< Internal only */
GIT_ITEROVER = -31, /*< Signals end of iteration with iterator */ GIT_ITEROVER = -31, /*< Signals end of iteration with iterator */
......
...@@ -204,6 +204,7 @@ typedef enum { ...@@ -204,6 +204,7 @@ typedef enum {
GIT_FILEMODE_BLOB_EXECUTABLE = 0100755, GIT_FILEMODE_BLOB_EXECUTABLE = 0100755,
GIT_FILEMODE_LINK = 0120000, GIT_FILEMODE_LINK = 0120000,
GIT_FILEMODE_COMMIT = 0160000, GIT_FILEMODE_COMMIT = 0160000,
GIT_FILEMODE_UNREADABLE = 0170000,
} git_filemode_t; } git_filemode_t;
typedef struct git_refspec git_refspec; typedef struct git_refspec git_refspec;
......
...@@ -937,10 +937,6 @@ static int handle_unmatched_new_item( ...@@ -937,10 +937,6 @@ static int handle_unmatched_new_item(
if (recurse_into_dir) { if (recurse_into_dir) {
error = git_iterator_advance_into(&info->nitem, info->new_iter); error = git_iterator_advance_into(&info->nitem, info->new_iter);
printf("error advancing into diff %d\n", error);
if (error == GIT_EUNREADABLE) {
delta_type = GIT_DELTA_UNREADABLE;
} else {
/* if real error or no error, proceed with iteration */ /* if real error or no error, proceed with iteration */
if (error != GIT_ENOTFOUND) if (error != GIT_ENOTFOUND)
return error; return error;
...@@ -954,7 +950,6 @@ static int handle_unmatched_new_item( ...@@ -954,7 +950,6 @@ static int handle_unmatched_new_item(
delta_type = GIT_DELTA_IGNORED; delta_type = GIT_DELTA_IGNORED;
} }
} }
}
/* In core git, the next two checks are effectively reversed -- /* In core git, the next two checks are effectively reversed --
* i.e. when an file contained in an ignored directory is explicitly * i.e. when an file contained in an ignored directory is explicitly
...@@ -998,8 +993,12 @@ static int handle_unmatched_new_item( ...@@ -998,8 +993,12 @@ static int handle_unmatched_new_item(
} }
} }
else if (nitem->mode == GIT_FILEMODE_UNREADABLE) {
delta_type = GIT_DELTA_UNREADABLE;
}
/* Actually create the record for this item if necessary */ /* Actually create the record for this item if necessary */
if (error != GIT_EUNREADABLE && (error = diff_delta__from_one(diff, delta_type, nitem)) != 0) if ((error = diff_delta__from_one(diff, delta_type, nitem)) != 0)
return error; return error;
/* If user requested TYPECHANGE records, then check for that instead of /* If user requested TYPECHANGE records, then check for that instead of
......
...@@ -563,7 +563,7 @@ int git_path_set_error(int errno_value, const char *path, const char *action) ...@@ -563,7 +563,7 @@ int git_path_set_error(int errno_value, const char *path, const char *action)
default: default:
giterr_set(GITERR_OS, "Could not %s '%s'", action, path); giterr_set(GITERR_OS, "Could not %s '%s'", action, path);
return GIT_EUNREADABLE; return -1;
} }
} }
...@@ -1110,6 +1110,13 @@ int git_path_dirload_with_stat( ...@@ -1110,6 +1110,13 @@ int git_path_dirload_with_stat(
git_vector_remove(contents, i--); git_vector_remove(contents, i--);
continue; continue;
} }
/* Treat the file as unreadable if we get any other error */
if (error != 0) {
giterr_clear();
error = 0;
ps->st.st_mode = GIT_FILEMODE_UNREADABLE;
continue;
}
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment