diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-07-24 07:55:33 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-07-24 07:55:33 +0400 |
commit | 9837911c139cefae24c7bc68751cd1cfdc950554 (patch) | |
tree | 007d5c9ef1f3b4c40955967ecb7d7fc12683bab1 | |
parent | 331eb92bbcbb114ff07d0b0a7b78dae9d0a75f4c (diff) | |
parent | 77eab053a48a2062665c42f63348ae12290de03f (diff) |
Merge branch 'jk/mediawiki-credential'
* jk/mediawiki-credential:
mw-to-git: use git-credential's URL parser
credential: convert "url" attribute into its parsed subparts
mw-to-git: check blank credential attributes via length
docs/credential: minor clarity fixups
-rw-r--r-- | Documentation/git-credential.txt | 22 | ||||
-rwxr-xr-x | contrib/mw-to-git/git-remote-mediawiki | 32 | ||||
-rw-r--r-- | credential.c | 2 |
3 files changed, 22 insertions, 34 deletions
diff --git a/Documentation/git-credential.txt b/Documentation/git-credential.txt index a81684e15f..53adee3203 100644 --- a/Documentation/git-credential.txt +++ b/Documentation/git-credential.txt @@ -102,22 +102,20 @@ INPUT/OUTPUT FORMAT ------------------- `git credential` reads and/or writes (depending on the action used) -credential information in its standard input/output. These information +credential information in its standard input/output. This information can correspond either to keys for which `git credential` will obtain the login/password information (e.g. host, protocol, path), or to the actual credential data to be obtained (login/password). -The credential is split into a set of named attributes. -Attributes are provided to the helper, one per line. Each attribute is +The credential is split into a set of named attributes, with one +attribute per line. Each attribute is specified by a key-value pair, separated by an `=` (equals) sign, followed by a newline. The key may contain any bytes except `=`, newline, or NUL. The value may contain any bytes except newline or NUL. In both cases, all bytes are treated as-is (i.e., there is no quoting, and one cannot transmit a value with newline or NUL in it). The list of attributes is terminated by a blank line or end-of-file. -Git will send the following attributes (but may not send all of -them for a given credential; for example, a `host` attribute makes no -sense when dealing with a non-network protocol): +Git understands the following attributes: `protocol`:: @@ -142,3 +140,15 @@ sense when dealing with a non-network protocol): `password`:: The credential's password, if we are asking it to be stored. + +`url`:: + + When this special attribute is read by `git credential`, the + value is parsed as a URL and treated as if its constituent parts + were read (e.g., `url=https://example.com` would behave as if + `protocol=https` and `host=example.com` had been provided). This + can help callers avoid parsing URLs themselves. Note that any + components which are missing from the URL (e.g., there is no + username in the example above) will be set to empty; if you want + to provide a URL and override some attributes, provide the URL + attribute first, followed by any overrides. diff --git a/contrib/mw-to-git/git-remote-mediawiki b/contrib/mw-to-git/git-remote-mediawiki index dc137409b1..8647c92df8 100755 --- a/contrib/mw-to-git/git-remote-mediawiki +++ b/contrib/mw-to-git/git-remote-mediawiki @@ -171,32 +171,6 @@ while (<STDIN>) { ## credential API management (generic functions) -sub credential_from_url { - my $url = shift; - my $parsed = URI->new($url); - my %credential; - - if ($parsed->scheme) { - $credential{protocol} = $parsed->scheme; - } - if ($parsed->host) { - $credential{host} = $parsed->host; - } - if ($parsed->path) { - $credential{path} = $parsed->path; - } - if ($parsed->userinfo) { - if ($parsed->userinfo =~ /([^:]*):(.*)/) { - $credential{username} = $1; - $credential{password} = $2; - } else { - $credential{username} = $parsed->userinfo; - } - } - - return %credential; -} - sub credential_read { my %credential; my $reader = shift; @@ -214,8 +188,10 @@ sub credential_read { sub credential_write { my $credential = shift; my $writer = shift; + # url overwrites other fields, so it must come first + print $writer "url=$credential->{url}\n" if exists $credential->{url}; while (my ($key, $value) = each(%$credential) ) { - if ($value) { + if (length $value && $key ne 'url') { print $writer "$key=$value\n"; } } @@ -254,7 +230,7 @@ sub mw_connect_maybe { $mediawiki = MediaWiki::API->new; $mediawiki->{config}->{api_url} = "$url/api.php"; if ($wiki_login) { - my %credential = credential_from_url($url); + my %credential = (url => $url); $credential{username} = $wiki_login; $credential{password} = $wiki_passwd; credential_run("fill", \%credential); diff --git a/credential.c b/credential.c index 2c400073fa..e54753c75d 100644 --- a/credential.c +++ b/credential.c @@ -172,6 +172,8 @@ int credential_read(struct credential *c, FILE *fp) } else if (!strcmp(key, "path")) { free(c->path); c->path = xstrdup(value); + } else if (!strcmp(key, "url")) { + credential_from_url(c, value); } /* * Ignore other lines; we don't know what they mean, but |