Thread (35 messages) 35 messages, 3 authors, 2016-06-15

Re: [PATCH 2/5] config.c: move worktree-specific variables to .git/worktrees/...

From: Duy Nguyen <hidden>
Date: 2016-06-15 23:07:23

On Sun, Dec 6, 2015 at 8:47 AM, Eric Sunshine [off-list ref] wrote:
On Wed, Dec 2, 2015 at 2:13 PM, Nguyễn Thái Ngọc Duy [off-list ref] wrote:
quoted
.git/info/config.worktree is a pattern list that splits .git/config in
to sets: the worktree set matches the patterns, the commmon set does
not.

In normal worktrees, both sets are stored in .git/config. The
config.worktree has no effect. Nothing is changed.

In linked worktrees, the common and worktree sets are read from and
saved to .git/config and .git/config.worktree respectively. Config
keys in .git/config that belong to the worktree set is ignored. Those
are for the main worktree only. Similarly, keys not matching the
patterns come from .git/config, duplicate keys from
.git/config.worktree are ignored.

The effect is similar to the $GIT_DIR/$GIT_COMMON_DIR split, we can
define that some vars can be shared and some cannot. And as a result
of the $GIT_DIR/$GIT_COMMON_DIR split, config.worktree is actually
found at .git/worktrees/<id>/config.worktree.
Why does this worktree-specific file need/have a .worktree suffix?
I think in the beginning it was supposed to support git-new-workdir as
well. With a separate name, you can symlink .git/config back to
original repo and create a new .git/config.worktree. The actual code
in this patch does not support this though. I guess as 'git worktree'
is maturing, we probably don't have to worry about git-new-workdir and
could drop .worktree suffix.
quoted
+static int is_config_local(const char *key_)
+{
+       static struct strbuf key = STRBUF_INIT;
+       int i, dtype;
+
+       if (!config_local.nr)
+               return 0;
+
+       strbuf_reset(&key);
+       strbuf_addstr(&key, key_);
Why does 'key' need to be static considering that it is overwritten on
each call and its value is never accessed after the function returns?
Mostly to avoid re-allocation because this function will be called for
every configuration variable. But this may be premature optimization.
On top of that, if we go with builtin per-worktree list only as being
discussed, then we can drop exclude machinery, we don't have to
preprocess "key" and we can finally kill this "strbuf key".
quoted
@@ -198,4 +198,30 @@ test_expect_success 'local clone from linked checkout' '
+test_expect_success 'setting worktree.foo goes to config.worktree' '
+       echo worKtree.Foo >> .git/info/config.worktree &&
Perhaps? s/>> />/
Yeah. In the previous iteration, config.worktree would contain the
default list (core.worktree and stuff) so > may force following tests
to re-initialize config.worktree again. But that's now gone and >
makes more sense.
quoted
+test_expect_success 'shared config still goes to config' '
+       git config random.key randomValue &&
+       git --git-dir=wt.foo/.git config random.key >actual &&
What about also testing the opposite scenario?

    git --git-dir=wt.foo/.git  config random.key randomValue &&
    git config random.key >actual &&
Yep. Will do.
-- 
Duy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help