On Tue, Dec 02, 2014 at 08:36:07PM -0500, Jeff King wrote:
> But to answer your question: you can't currently. I would be happy to
> have a config syntax that means "reset this multi-value config option
> list to nothing", but it does not yet exist. It would be useful for more
> than just credential-helper config.
This is something I've wanted for a while, so I took another peek at it.
It turns out to be rather complicated.
This is the initial patch I came up with (don't bother reading it too
closely):
diff --git a/credential.c b/credential.c
index 1886ea5..9e84575 100644
--- a/credential.c
+++ b/credential.c
@@ -43,9 +43,6 @@ static int credential_config_callback(const char *var, const
char *value,
if (!skip_prefix(var, "credential.", &key))
return 0;
- if (!value)
- return config_error_nonbool(var);
-
dot = strrchr(key, '.');
if (dot) {
struct credential want = CREDENTIAL_INIT;
@@ -63,8 +60,13 @@ static int credential_config_callback(const char *var, const
char *value,
key = dot + 1;
}
- if (!strcmp(key, "helper"))
- string_list_append(&c->helpers, value);
+ if (!strcmp(key, "helper")) {
+ if (value)
+ string_list_append(&c->helpers, value);
+ else
+ string_list_clear(&c->helpers, 0);
+ } else if (!value)
+ return config_error_nonbool(var);
else if (!strcmp(key, "username")) {
if (!c->username)
c->username = xstrdup(value);
It allows you to do:
git -c credential.helper [-c credential.helper=foo] fetch ...
The first one "resets" the list to empty, and then you can further
append to the list after that. There are a bunch of shortcomings,
though:
1. I chose the value-less boolean as a token to reset the list (since
it is otherwise an unmeaningful error). The example above shows its
use with "-c", but you could also do:
[credential]
helper
helper = foo
in a config file itself. This is probably rather unintuitive.
But whatever syntax is chosen would need to have some mechanism for
specifying it in the config file itself, as well as in the
command-line (and therefore in the semi-public
GIT_CONFIG_PARAMETERS environment variable which is passed around).
So this is at least backwards-compatible, "just works" with
existing config code, and won't stomp on any existing working
values.
If we can accept stomping on an unlikely-used token, something
like:
git -c credential.helper=RESET fetch ...
is more sensible (and we can argue about the exact token used).
If we can accept new syntax and new config code, something like:
git -c '!credential.helper' fetch ...
is probably workable.
2. Notice how we didn't touch the config code at all here. That's
because it doesn't know anything about whether a config item is a
multi-valued list, or that the string list exists. It is up to each
individual consumer of the config callbacks to implement this
list-clearing mechanism (and obviously we should make them all
agree on the token used). So we'd probably want to make similar
changes everywhere that multi-values are used (which, to be fair,
really isn't that many, I don't think).
3. Running `git config credential.helper` doesn't know about this
mechanism either. You can either get the "last one wins" behavior,
or you can use --get-all to get all instances. We'd probably have
to teach it a new `--get-list` that recognized the magic reset
token.
None of those problems is insurmountable. It just takes a little more
code than what I wrote above. But for credential helpers specifically,
it's a bit more challenging. Because we're _not_ constructing just a
list of just credential.helper here. We're constructing a list of all
matching credential.*.helper config keys. So in something like:
[credential "http://example.com"]
helper = foo
[credential]
helper = bar
if you run "git fetch http://example.com", you'll get both helpers, in
sequence.
What should adding:
[credential]
helper = RESET
do on top of that? Intuitively, I'd say that it would only touch the
credential.helper variables. But that's not what the user probably
wants. They probably want to reset _any_ helpers that have matched. And
that's actually what the code I posted above would do. So that's good, I
guess. But I wonder if this approach is introducing more confusion than
it is worth.
Having a separate --no-respect-credential-helpers is conceptually much
simpler. But it also does not allow you to reset the list and add in a
new helper.
-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html