Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

config: introduce an Operating System-specific includeIf condition #1429

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions Documentation/config.txt
Expand Up @@ -186,6 +186,11 @@ As for the naming of this keyword, it is for forwards compatibiliy with
a naming scheme that supports more variable-based include conditions,
but currently Git only supports the exact keyword described above.

`os`::
The data that follows this keyword is taken as the name of an
Operating System, e.g. `Linux` or `Windows`; If it matches the
current Operating System, the include condition is met.

A few more notes on matching via `gitdir` and `gitdir/i`:

* Symlinks in `$GIT_DIR` are not resolved before matching.
Expand Down
11 changes: 11 additions & 0 deletions config.c
Expand Up @@ -394,6 +394,15 @@ static int include_by_remote_url(struct config_include_data *inc,
inc->remote_urls);
}

static int include_by_os(const char *cond, size_t cond_len)
{
struct utsname uname_info;

return !uname(&uname_info) &&
!strncasecmp(uname_info.sysname, cond, cond_len) &&
!uname_info.sysname[cond_len];
}

static int include_condition_is_true(struct config_include_data *inc,
const char *cond, size_t cond_len)
{
Expand All @@ -408,6 +417,8 @@ static int include_condition_is_true(struct config_include_data *inc,
else if (skip_prefix_mem(cond, cond_len, "hasconfig:remote.*.url:", &cond,
&cond_len))
return include_by_remote_url(inc, cond, cond_len);
else if (skip_prefix_mem(cond, cond_len, "os:", &cond, &cond_len))
return include_by_os(cond, cond_len);

/* unknown conditionals are always false */
return 0;
Expand Down
16 changes: 16 additions & 0 deletions t/t1309-early-config.sh
Expand Up @@ -100,4 +100,20 @@ test_expect_success 'onbranch config outside of git repo' '
nongit git help
'

test_expect_success '[includeIf "os:..."]' '
test_config x.y 0 &&
echo "[x] y = z" >.git/xyz &&

if test_have_prereq MINGW
then
uname_s=Windows
else
uname_s="$(uname -s)"
fi &&
test_config "includeIf.os:not-$uname_s.path" xyz &&
test 0 = "$(git config x.y)" &&
test_config "includeIf.os:$uname_s.path" xyz &&
test z = "$(git config x.y)"
'

test_done