mirror of
https://git.proxmox.com/git/libgit2
synced 2025-10-18 13:40:49 +00:00
Return GIT_FILEMODE_UNREADABLE for files that fail to stat.
This commit is contained in:
parent
61bef72dc3
commit
86c9d3dae2
@ -41,7 +41,6 @@ typedef enum {
|
||||
GIT_EMERGECONFLICT = -13, /*< Merge conflicts prevented operation */
|
||||
GIT_ELOCKED = -14, /*< Lock file prevented operation */
|
||||
GIT_EMODIFIED = -15, /*< Reference value does not match expected */
|
||||
GIT_EUNREADABLE = -16, /*< File or folder is unreadable */
|
||||
|
||||
GIT_PASSTHROUGH = -30, /*< Internal only */
|
||||
GIT_ITEROVER = -31, /*< Signals end of iteration with iterator */
|
||||
|
@ -204,6 +204,7 @@ typedef enum {
|
||||
GIT_FILEMODE_BLOB_EXECUTABLE = 0100755,
|
||||
GIT_FILEMODE_LINK = 0120000,
|
||||
GIT_FILEMODE_COMMIT = 0160000,
|
||||
GIT_FILEMODE_UNREADABLE = 0170000,
|
||||
} git_filemode_t;
|
||||
|
||||
typedef struct git_refspec git_refspec;
|
||||
|
31
src/diff.c
31
src/diff.c
@ -937,22 +937,17 @@ static int handle_unmatched_new_item(
|
||||
if (recurse_into_dir) {
|
||||
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 (error != GIT_ENOTFOUND)
|
||||
return error;
|
||||
giterr_clear();
|
||||
/* if real error or no error, proceed with iteration */
|
||||
if (error != GIT_ENOTFOUND)
|
||||
return error;
|
||||
giterr_clear();
|
||||
|
||||
/* if directory is empty, can't advance into it, so either skip
|
||||
* it or ignore it
|
||||
*/
|
||||
if (contains_oitem )
|
||||
return git_iterator_advance(&info->nitem, info->new_iter);
|
||||
delta_type = GIT_DELTA_IGNORED;
|
||||
}
|
||||
/* if directory is empty, can't advance into it, so either skip
|
||||
* it or ignore it
|
||||
*/
|
||||
if (contains_oitem )
|
||||
return git_iterator_advance(&info->nitem, info->new_iter);
|
||||
delta_type = GIT_DELTA_IGNORED;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 */
|
||||
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;
|
||||
|
||||
/* If user requested TYPECHANGE records, then check for that instead of
|
||||
|
11
src/path.c
11
src/path.c
@ -560,10 +560,10 @@ int git_path_set_error(int errno_value, const char *path, const char *action)
|
||||
case EEXIST:
|
||||
giterr_set(GITERR_OS, "Failed %s - '%s' already exists", action, path);
|
||||
return GIT_EEXISTS;
|
||||
|
||||
|
||||
default:
|
||||
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(
|
||||
git_vector_remove(contents, i--);
|
||||
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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user