From: Ignacio Encinas <ignacio@iencinas.com>
To: git@vger.kernel.org
Cc: Ignacio Encinas <ignacio@iencinas.com>
Subject: [PATCH v3 2/2] config: learn the "hostname:" includeIf condition
Date: Tue, 19 Mar 2024 19:37:22 +0100 [thread overview]
Message-ID: <20240319183722.211300-3-ignacio@iencinas.com> (raw)
In-Reply-To: <20240319183722.211300-1-ignacio@iencinas.com>
Currently, customizing the configuration depending on the machine running
git has to be done manually.
Add support for a new includeIf keyword "hostname:" to conditionally
include configuration files depending on the hostname.
Signed-off-by: Ignacio Encinas <ignacio@iencinas.com>
---
Documentation/config.txt | 10 ++++++++++
config.c | 17 ++++++++++++++++
t/t1305-config-include.sh | 42 +++++++++++++++++++++++++++++++++++++++
3 files changed, 69 insertions(+)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index e3a74dd1c19d..268a9fab7be0 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -186,6 +186,12 @@ As for the naming of this keyword, it is for forwards compatibility with
a naming scheme that supports more variable-based include conditions,
but currently Git only supports the exact keyword described above.
+`hostname`::
+ The data that follows the keyword `hostname:` is taken to be a
+ pattern with standard globbing wildcards. If the current
+ hostname (output of gethostname(2)) matches the
+ pattern, 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.
@@ -261,6 +267,10 @@ Example
path = foo.inc
[remote "origin"]
url = https://example.com/git
+
+; include only if the hostname of the machine matches some-hostname
+[includeIf "hostname:some-hostname"]
+ path = foo.inc
----
Values
diff --git a/config.c b/config.c
index 3cfeb3d8bd99..50b3f6d24c50 100644
--- a/config.c
+++ b/config.c
@@ -317,6 +317,21 @@ static int include_by_branch(const char *cond, size_t cond_len)
return ret;
}
+static int include_by_hostname(const char *cond, size_t cond_len)
+{
+ int ret;
+ char my_host[HOST_NAME_MAX + 1];
+ struct strbuf pattern = STRBUF_INIT;
+
+ if (xgethostname(my_host, sizeof(my_host)))
+ return 0;
+
+ strbuf_add(&pattern, cond, cond_len);
+ ret = !wildmatch(pattern.buf, my_host, 0);
+ strbuf_release(&pattern);
+ return ret;
+}
+
static int add_remote_url(const char *var, const char *value,
const struct config_context *ctx UNUSED, void *data)
{
@@ -406,6 +421,8 @@ static int include_condition_is_true(const struct key_value_info *kvi,
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, "hostname:", &cond, &cond_len))
+ return include_by_hostname(cond, cond_len);
/* unknown conditionals are always false */
return 0;
diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh
index 5cde79ef8c4f..ef9272fd8e53 100755
--- a/t/t1305-config-include.sh
+++ b/t/t1305-config-include.sh
@@ -357,4 +357,46 @@ test_expect_success 'include cycles are detected' '
grep "exceeded maximum include depth" stderr
'
+test_expect_success 'conditional include, hostname' '
+ cat >>.git/config <<-EOF &&
+ [includeIf "hostname:$(test-tool xgethostname)a"]
+ path = bar12
+ EOF
+ cat >>.git/bar12 <<-EOF &&
+ [test]
+ twelve=12
+ EOF
+
+ test_must_fail git config test.twelve &&
+
+ cat >>.git/config <<-EOF &&
+ [includeIf "hostname:$(test-tool xgethostname)"]
+ path = bar12
+ EOF
+ echo 12 >expect &&
+ git config test.twelve >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'conditional include, hostname, wildcard' '
+ cat >>.git/config <<-EOF &&
+ [includeIf "hostname:$(test-tool xgethostname)a*"]
+ path = bar13
+ EOF
+ cat >>.git/bar13 <<-EOF &&
+ [test]
+ thirteen = 13
+ EOF
+
+ test_must_fail git config test.thirteen &&
+
+ cat >>.git/config <<-EOF &&
+ [includeIf "hostname:$(test-tool xgethostname)*"]
+ path = bar13
+ EOF
+ echo 13 >expect &&
+ git config test.thirteen >actual &&
+ test_cmp expect actual
+'
+
test_done
--
2.44.0
next prev parent reply other threads:[~2024-03-19 18:38 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-07 20:50 [RFC PATCH 0/1] Add hostname condition to includeIf Ignacio Encinas
2024-03-07 20:50 ` [RFC PATCH 1/1] config: learn the "hostname:" includeIf condition Ignacio Encinas
2024-03-07 21:40 ` Junio C Hamano
2024-03-09 10:47 ` Ignacio Encinas Rubio
2024-03-09 17:38 ` Junio C Hamano
2024-03-09 18:18 ` [PATCH v2 0/1] Add hostname condition to includeIf Ignacio Encinas
2024-03-09 18:18 ` [PATCH v2 1/1] config: learn the "hostname:" includeIf condition Ignacio Encinas
2024-03-10 16:59 ` Junio C Hamano
2024-03-10 18:46 ` Ignacio Encinas Rubio
2024-03-11 17:39 ` Junio C Hamano
2024-03-13 21:53 ` Ignacio Encinas Rubio
2024-03-16 6:57 ` Jeff King
2024-03-16 11:19 ` Ignacio Encinas Rubio
2024-03-16 16:00 ` Taylor Blau
2024-03-16 16:46 ` Ignacio Encinas Rubio
2024-03-16 17:02 ` Junio C Hamano
2024-03-16 17:41 ` rsbecker
2024-03-16 18:05 ` Ignacio Encinas Rubio
2024-03-16 18:49 ` rsbecker
2024-03-18 8:17 ` Jeff King
2024-03-16 16:01 ` Taylor Blau
2024-03-16 16:50 ` Ignacio Encinas Rubio
2024-03-19 18:37 ` [PATCH v3 0/2] Add hostname condition to includeIf Ignacio Encinas
2024-03-19 18:37 ` [PATCH v3 1/2] t: add a test helper for getting hostname Ignacio Encinas
2024-03-19 20:31 ` Junio C Hamano
2024-03-19 20:57 ` Jeff King
2024-03-19 21:00 ` Junio C Hamano
2024-03-19 21:11 ` Jeff King
2024-03-19 21:44 ` Junio C Hamano
2024-03-21 0:11 ` Chris Torek
2024-03-19 20:56 ` Jeff King
2024-03-19 18:37 ` Ignacio Encinas [this message]
2024-03-19 20:53 ` [PATCH v3 2/2] config: learn the "hostname:" includeIf condition Junio C Hamano
2024-03-19 21:04 ` Jeff King
2024-03-19 21:32 ` Ignacio Encinas Rubio
2024-03-19 20:55 ` [PATCH v3 0/2] Add hostname condition to includeIf Eric Sunshine
2024-03-19 21:12 ` Junio C Hamano
2024-03-19 21:13 ` Eric Sunshine
2024-03-20 0:19 ` Jeff King
2024-03-20 2:49 ` Eric Sunshine
2024-03-20 3:07 ` Eric Sunshine
2024-03-20 14:34 ` Chris Torek
2024-03-20 16:37 ` Eric Sunshine
2024-03-20 20:51 ` Jeff King
2024-03-20 16:49 ` Junio C Hamano
2024-03-19 21:36 ` Dirk Gouders
2024-03-19 22:03 ` rsbecker
2024-03-19 22:26 ` Dirk Gouders
2024-03-19 22:31 ` rsbecker
2024-03-19 22:59 ` Junio C Hamano
2024-03-19 21:22 ` Ignacio Encinas Rubio
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240319183722.211300-3-ignacio@iencinas.com \
--to=ignacio@iencinas.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).