Merge branch 'ty/migrate-trust-executable-bit' into next
The 'trust_executable_bit' (coming from the 'core.filemode' configuration) has been migrated into 'struct repo_config_values' to tie it to a specific repository instance. * ty/migrate-trust-executable-bit: environment: move has_symlinks into repo_config_values environment: move trust_executable_bit into repo_config_values read-cache: pass 'repo' to 'ce_mode_from_stat()' read-cache: remove redundant extern declarationsnext
commit
4873f289dd
6
apply.c
6
apply.c
|
|
@ -3893,8 +3893,8 @@ static int check_preimage(struct apply_state *state,
|
|||
if (*ce && !(*ce)->ce_mode)
|
||||
BUG("ce_mode == 0 for path '%s'", old_name);
|
||||
|
||||
if (trust_executable_bit || !S_ISREG(st->st_mode))
|
||||
st_mode = ce_mode_from_stat(*ce, st->st_mode);
|
||||
if (repo_trust_executable_bit(state->repo) || !S_ISREG(st->st_mode))
|
||||
st_mode = ce_mode_from_stat(state->repo, *ce, st->st_mode);
|
||||
else if (*ce)
|
||||
st_mode = (*ce)->ce_mode;
|
||||
else
|
||||
|
|
@ -4512,7 +4512,7 @@ static int try_create_file(struct apply_state *state, const char *path,
|
|||
return !!mkdir(path, 0777);
|
||||
}
|
||||
|
||||
if (has_symlinks && S_ISLNK(mode))
|
||||
if (repo_has_symlinks(state->repo) && S_ISLNK(mode))
|
||||
/* Although buf:size is counted string, it also is NUL
|
||||
* terminated.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -294,7 +294,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int len
|
|||
ce->ce_flags = create_ce_flags(0);
|
||||
ce->ce_namelen = len;
|
||||
fill_stat_cache_info(the_repository->index, ce, st);
|
||||
ce->ce_mode = ce_mode_from_stat(old, st->st_mode);
|
||||
ce->ce_mode = ce_mode_from_stat(the_repository, old, st->st_mode);
|
||||
|
||||
if (index_path(the_repository->index, &ce->oid, path, st,
|
||||
info_only ? 0 : INDEX_WRITE_OBJECT)) {
|
||||
|
|
|
|||
|
|
@ -1080,7 +1080,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
|||
/* if symlinks don't work, assume symlink if all parents
|
||||
* are symlinks
|
||||
*/
|
||||
is_file = has_symlinks;
|
||||
is_file = repo_has_symlinks(rev->repo);
|
||||
for (i = 0; !is_file && i < num_parent; i++)
|
||||
is_file = !S_ISLNK(elem->parent[i].mode);
|
||||
if (!is_file)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include "config.h"
|
||||
#include "dir.h"
|
||||
#include "environment.h"
|
||||
#include "repository.h"
|
||||
#include "gettext.h"
|
||||
#include "run-command.h"
|
||||
#include "strbuf.h"
|
||||
|
|
@ -1044,7 +1045,7 @@ int mingw_chdir(const char *dirname)
|
|||
if (xutftowcs_path(wdirname, dirname) < 0)
|
||||
return -1;
|
||||
|
||||
if (has_symlinks) {
|
||||
if (repo_has_symlinks(the_repository)) {
|
||||
HANDLE hnd = CreateFileW(wdirname, 0,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
|
||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
|
|
@ -2914,7 +2915,7 @@ int symlink(const char *target, const char *link)
|
|||
int len;
|
||||
|
||||
/* fail if symlinks are disabled or API is not supported (WinXP) */
|
||||
if (!has_symlinks) {
|
||||
if (!repo_has_symlinks(the_repository)) {
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -3184,15 +3185,23 @@ static void setup_windows_environment(void)
|
|||
if (!tmp && (tmp = getenv("USERPROFILE")))
|
||||
setenv("HOME", tmp, 1);
|
||||
}
|
||||
}
|
||||
|
||||
int mingw_platform_has_symlinks(void)
|
||||
{
|
||||
static int has_symlinks = -1;
|
||||
/*
|
||||
* Change 'core.symlinks' default to false, unless native symlinks are
|
||||
* enabled in MSys2 (via 'MSYS=winsymlinks:nativestrict'). Thus we can
|
||||
* run the test suite (which doesn't obey config files) with or without
|
||||
* symlink support.
|
||||
*/
|
||||
if (!(tmp = getenv("MSYS")) || !strstr(tmp, "winsymlinks:nativestrict"))
|
||||
has_symlinks = 0;
|
||||
if (has_symlinks < 0) {
|
||||
const char *tmp = getenv("MSYS");
|
||||
has_symlinks = (tmp && strstr(tmp, "winsymlinks:nativestrict")) ? 1 : 0;
|
||||
}
|
||||
|
||||
return has_symlinks;
|
||||
}
|
||||
|
||||
static void get_current_user_sid(PSID *sid, HANDLE *linked_token)
|
||||
|
|
|
|||
|
|
@ -208,6 +208,9 @@ void open_in_gdb(void);
|
|||
*/
|
||||
int err_win_to_posix(DWORD winerr);
|
||||
|
||||
int mingw_platform_has_symlinks(void);
|
||||
#define platform_has_symlinks() mingw_platform_has_symlinks()
|
||||
|
||||
#ifndef NO_UNIX_SOCKETS
|
||||
int mingw_have_unix_sockets(void);
|
||||
#undef have_unix_sockets
|
||||
|
|
|
|||
10
diff-lib.c
10
diff-lib.c
|
|
@ -160,7 +160,7 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
|
|||
|
||||
changed = check_removed(ce, &st);
|
||||
if (!changed)
|
||||
wt_mode = ce_mode_from_stat(ce, st.st_mode);
|
||||
wt_mode = ce_mode_from_stat(revs->repo, ce, st.st_mode);
|
||||
else {
|
||||
if (changed < 0) {
|
||||
perror(ce->name);
|
||||
|
|
@ -193,7 +193,7 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
|
|||
num_compare_stages++;
|
||||
oidcpy(&dpath->parent[stage - 2].oid,
|
||||
&nce->oid);
|
||||
dpath->parent[stage-2].mode = ce_mode_from_stat(nce, mode);
|
||||
dpath->parent[stage-2].mode = ce_mode_from_stat(revs->repo, nce, mode);
|
||||
dpath->parent[stage-2].status =
|
||||
DIFF_STATUS_MODIFIED;
|
||||
}
|
||||
|
|
@ -262,7 +262,7 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
|
|||
continue;
|
||||
} else if (revs->diffopt.ita_invisible_in_index &&
|
||||
ce_intent_to_add(ce)) {
|
||||
newmode = ce_mode_from_stat(ce, st.st_mode);
|
||||
newmode = ce_mode_from_stat(revs->repo, ce, st.st_mode);
|
||||
diff_addremove(&revs->diffopt, '+', newmode,
|
||||
null_oid(the_hash_algo), 0, ce->name, 0);
|
||||
continue;
|
||||
|
|
@ -270,7 +270,7 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
|
|||
|
||||
changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
|
||||
ce_option, &dirty_submodule);
|
||||
newmode = ce_mode_from_stat(ce, st.st_mode);
|
||||
newmode = ce_mode_from_stat(revs->repo, ce, st.st_mode);
|
||||
}
|
||||
|
||||
if (!changed && !dirty_submodule) {
|
||||
|
|
@ -338,7 +338,7 @@ static int get_stat_data(const struct cache_entry *ce,
|
|||
changed = match_stat_with_submodule(diffopt, ce, &st,
|
||||
0, dirty_submodule);
|
||||
if (changed) {
|
||||
mode = ce_mode_from_stat(ce, st.st_mode);
|
||||
mode = ce_mode_from_stat(diffopt->repo, ce, st.st_mode);
|
||||
oid = null_oid(the_hash_algo);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
3
entry.c
3
entry.c
|
|
@ -319,7 +319,8 @@ static int write_entry(struct cache_entry *ce, char *path, struct conv_attrs *ca
|
|||
* We can't make a real symlink; write out a regular file entry
|
||||
* with the symlink destination as its contents.
|
||||
*/
|
||||
if (!has_symlinks || to_tempfile)
|
||||
if (!repo_has_symlinks(state->istate && state->istate->repo ?
|
||||
state->istate->repo : the_repository) || to_tempfile)
|
||||
goto write_file_entry;
|
||||
|
||||
ret = symlink(new_blob, path);
|
||||
|
|
|
|||
|
|
@ -41,8 +41,6 @@
|
|||
static int pack_compression_seen;
|
||||
static int zlib_compression_seen;
|
||||
|
||||
int trust_executable_bit = 1;
|
||||
int has_symlinks = 1;
|
||||
int minimum_abbrev = 4, default_abbrev = -1;
|
||||
int assume_unchanged;
|
||||
char *git_commit_encoding;
|
||||
|
|
@ -148,6 +146,20 @@ int repo_ignore_case(struct repository *repo)
|
|||
0;
|
||||
}
|
||||
|
||||
int repo_trust_executable_bit(struct repository *repo)
|
||||
{
|
||||
return repo->initialized
|
||||
? repo_config_values(repo)->trust_executable_bit
|
||||
: 1;
|
||||
}
|
||||
|
||||
int repo_has_symlinks(struct repository *repo)
|
||||
{
|
||||
return repo->initialized
|
||||
? repo_config_values(repo)->has_symlinks
|
||||
: platform_has_symlinks();
|
||||
}
|
||||
|
||||
int have_git_dir(void)
|
||||
{
|
||||
return startup_info->have_repository
|
||||
|
|
@ -311,7 +323,7 @@ int git_default_core_config(const char *var, const char *value,
|
|||
|
||||
/* This needs a better name */
|
||||
if (!strcmp(var, "core.filemode")) {
|
||||
trust_executable_bit = git_config_bool(var, value);
|
||||
cfg->trust_executable_bit = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
if (!strcmp(var, "core.trustctime")) {
|
||||
|
|
@ -336,7 +348,8 @@ int git_default_core_config(const char *var, const char *value,
|
|||
}
|
||||
|
||||
if (!strcmp(var, "core.symlinks")) {
|
||||
has_symlinks = git_config_bool(var, value);
|
||||
struct repo_config_values *cfg = repo_config_values(the_repository);
|
||||
cfg->has_symlinks = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -733,6 +746,8 @@ void repo_config_values_init(struct repo_config_values *cfg)
|
|||
cfg->protect_hfs = PROTECT_HFS_DEFAULT;
|
||||
cfg->protect_ntfs = PROTECT_NTFS_DEFAULT;
|
||||
cfg->ignore_case = 0;
|
||||
cfg->trust_executable_bit = 1;
|
||||
cfg->has_symlinks = platform_has_symlinks();
|
||||
cfg->branch_track = BRANCH_TRACK_REMOTE;
|
||||
cfg->trust_ctime = 1;
|
||||
cfg->check_stat = 1;
|
||||
|
|
|
|||
|
|
@ -101,6 +101,8 @@ struct repo_config_values {
|
|||
int protect_hfs;
|
||||
int protect_ntfs;
|
||||
int ignore_case;
|
||||
int trust_executable_bit;
|
||||
int has_symlinks;
|
||||
|
||||
/* section "sparse" config values */
|
||||
int sparse_expect_files_outside_of_patterns;
|
||||
|
|
@ -151,6 +153,10 @@ int repo_protect_ntfs(struct repository *repo);
|
|||
*/
|
||||
int repo_ignore_case(struct repository *repo);
|
||||
|
||||
int repo_trust_executable_bit(struct repository *repo);
|
||||
|
||||
int repo_has_symlinks(struct repository *repo);
|
||||
|
||||
void repo_config_values_init(struct repo_config_values *cfg);
|
||||
|
||||
int is_bare_repository(struct repository *repo);
|
||||
|
|
@ -178,8 +184,6 @@ int is_bare_repository(struct repository *repo);
|
|||
int have_git_dir(void);
|
||||
|
||||
/* Environment bits from configuration mechanism */
|
||||
extern int trust_executable_bit;
|
||||
extern int has_symlinks;
|
||||
extern int minimum_abbrev, default_abbrev;
|
||||
extern int assume_unchanged;
|
||||
extern char *apply_default_whitespace;
|
||||
|
|
|
|||
|
|
@ -245,6 +245,10 @@ static inline int git_is_dir_sep(int c)
|
|||
#define is_dir_sep git_is_dir_sep
|
||||
#endif
|
||||
|
||||
#ifndef platform_has_symlinks
|
||||
#define platform_has_symlinks() 1
|
||||
#endif
|
||||
|
||||
#ifndef offset_1st_component
|
||||
static inline int git_offset_1st_component(const char *path)
|
||||
{
|
||||
|
|
|
|||
15
read-cache.c
15
read-cache.c
|
|
@ -205,13 +205,11 @@ void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, st
|
|||
|
||||
static unsigned int st_mode_from_ce(const struct cache_entry *ce)
|
||||
{
|
||||
extern int trust_executable_bit, has_symlinks;
|
||||
|
||||
switch (ce->ce_mode & S_IFMT) {
|
||||
case S_IFLNK:
|
||||
return has_symlinks ? S_IFLNK : (S_IFREG | 0644);
|
||||
return repo_has_symlinks(the_repository) ? S_IFLNK : (S_IFREG | 0644);
|
||||
case S_IFREG:
|
||||
return (ce->ce_mode & (trust_executable_bit ? 0755 : 0644)) | S_IFREG;
|
||||
return (ce->ce_mode & (repo_trust_executable_bit(the_repository) ? 0755 : 0644)) | S_IFREG;
|
||||
case S_IFGITLINK:
|
||||
return S_IFDIR | 0755;
|
||||
case S_IFDIR:
|
||||
|
|
@ -321,13 +319,13 @@ static int ce_match_stat_basic(const struct cache_entry *ce, struct stat *st)
|
|||
/* We consider only the owner x bit to be relevant for
|
||||
* "mode changes"
|
||||
*/
|
||||
if (trust_executable_bit &&
|
||||
if (repo_trust_executable_bit(the_repository) &&
|
||||
(0100 & (ce->ce_mode ^ st->st_mode)))
|
||||
changed |= MODE_CHANGED;
|
||||
break;
|
||||
case S_IFLNK:
|
||||
if (!S_ISLNK(st->st_mode) &&
|
||||
(has_symlinks || !S_ISREG(st->st_mode)))
|
||||
(repo_has_symlinks(the_repository) || !S_ISREG(st->st_mode)))
|
||||
changed |= TYPE_CHANGED;
|
||||
break;
|
||||
case S_IFGITLINK:
|
||||
|
|
@ -742,7 +740,8 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
|
|||
ce->ce_flags |= CE_INTENT_TO_ADD;
|
||||
|
||||
|
||||
if (trust_executable_bit && has_symlinks) {
|
||||
if (repo_trust_executable_bit(istate->repo) &&
|
||||
repo_has_symlinks(istate->repo)) {
|
||||
ce->ce_mode = create_ce_mode(st_mode);
|
||||
} else {
|
||||
/* If there is an existing entry, pick the mode bits and type
|
||||
|
|
@ -752,7 +751,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
|
|||
int pos = index_name_pos_also_unmerged(istate, path, namelen);
|
||||
|
||||
ent = (0 <= pos) ? istate->cache[pos] : NULL;
|
||||
ce->ce_mode = ce_mode_from_stat(ent, st_mode);
|
||||
ce->ce_mode = ce_mode_from_stat(istate->repo, ent, st_mode);
|
||||
}
|
||||
|
||||
/* When core.ignorecase=true, determine if a directory of the same name but differing
|
||||
|
|
|
|||
16
read-cache.h
16
read-cache.h
|
|
@ -4,15 +4,23 @@
|
|||
#include "read-cache-ll.h"
|
||||
#include "object.h"
|
||||
#include "pathspec.h"
|
||||
#include "environment.h"
|
||||
|
||||
static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce,
|
||||
/*
|
||||
* Determine the appropriate index mode for a file based on its stat()
|
||||
* information and the existing cache entry (if any).
|
||||
*
|
||||
* This function handles degradation for filesystems that lack
|
||||
* symlink support or reliable executable bits.
|
||||
*/
|
||||
static inline unsigned int ce_mode_from_stat(struct repository *repo,
|
||||
const struct cache_entry *ce,
|
||||
unsigned int mode)
|
||||
{
|
||||
extern int trust_executable_bit, has_symlinks;
|
||||
if (!has_symlinks && S_ISREG(mode) &&
|
||||
if (S_ISREG(mode) && !repo_has_symlinks(repo) &&
|
||||
ce && S_ISLNK(ce->ce_mode))
|
||||
return ce->ce_mode;
|
||||
if (!trust_executable_bit && S_ISREG(mode)) {
|
||||
if (S_ISREG(mode) && !repo_trust_executable_bit(repo)) {
|
||||
if (ce && S_ISREG(ce->ce_mode))
|
||||
return ce->ce_mode;
|
||||
return create_ce_mode(0666);
|
||||
|
|
|
|||
Loading…
Reference in New Issue