mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 14:02:48 +00:00
checkout: overwrite files with differing modes
When a file exists on disk and we're checking out a file that differs in executableness, remove the old file. This allows us to recreate the new file with p_open, which will take the new mode into account and handle setting the umask properly. Remove any notion of chmod'ing existing files, since it is now handled by the aforementioned removal and was incorrect, as it did not take umask into account.
This commit is contained in:
parent
6fe322843b
commit
eea7c85024
@ -243,6 +243,12 @@ static int checkout_action_common(
|
||||
if (delta->new_file.mode == GIT_FILEMODE_LINK && wd != NULL)
|
||||
*action |= CHECKOUT_ACTION__REMOVE;
|
||||
|
||||
/* if the file is on disk and doesn't match our mode, force update */
|
||||
if (wd &&
|
||||
GIT_PERMS_IS_EXEC(wd->mode) !=
|
||||
GIT_PERMS_IS_EXEC(delta->new_file.mode))
|
||||
*action |= CHECKOUT_ACTION__REMOVE;
|
||||
|
||||
notify = GIT_CHECKOUT_NOTIFY_UPDATED;
|
||||
}
|
||||
|
||||
@ -1500,15 +1506,6 @@ static int blob_content_to_file(
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
if (GIT_PERMS_IS_EXEC(mode)) {
|
||||
data->perfdata.chmod_calls++;
|
||||
|
||||
if ((error = p_chmod(path, mode)) < 0) {
|
||||
giterr_set(GITERR_OS, "Failed to set permissions on '%s'", path);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
if (st) {
|
||||
data->perfdata.stat_calls++;
|
||||
|
||||
|
@ -996,7 +996,8 @@ mode_t read_filemode(const char *path)
|
||||
git_buf_joinpath(&fullpath, "testrepo", path);
|
||||
cl_must_pass(p_stat(fullpath.ptr, &st));
|
||||
|
||||
result = GIT_PERMS_IS_EXEC(st.st_mode) ? 0100755 : 0100644;
|
||||
result = GIT_PERMS_IS_EXEC(st.st_mode) ?
|
||||
GIT_FILEMODE_BLOB_EXECUTABLE : GIT_FILEMODE_BLOB;
|
||||
|
||||
git_buf_free(&fullpath);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user