Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Documentation/config.txt
Original file line number Diff line number Diff line change
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; If it matches the output of `uname -s`, 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
Original file line number Diff line number Diff line change
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
10 changes: 10 additions & 0 deletions t/t1309-early-config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,14 @@ 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 &&
uname_s="$(uname -s)" &&
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