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
This commit is contained in:
Junio C Hamano 2012-07-23 20:55:33 -07:00
commit 9837911c13
3 changed files with 22 additions and 34 deletions

View File

@ -102,22 +102,20 @@ INPUT/OUTPUT FORMAT
------------------- -------------------
`git credential` reads and/or writes (depending on the action used) `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 can correspond either to keys for which `git credential` will obtain
the login/password information (e.g. host, protocol, path), or to the the login/password information (e.g. host, protocol, path), or to the
actual credential data to be obtained (login/password). actual credential data to be obtained (login/password).
The credential is split into a set of named attributes. The credential is split into a set of named attributes, with one
Attributes are provided to the helper, one per line. Each attribute is attribute per line. Each attribute is
specified by a key-value pair, separated by an `=` (equals) sign, specified by a key-value pair, separated by an `=` (equals) sign,
followed by a newline. The key may contain any bytes except `=`, followed by a newline. The key may contain any bytes except `=`,
newline, or NUL. The value may contain any bytes except newline or NUL. 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, 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 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. attributes is terminated by a blank line or end-of-file.
Git will send the following attributes (but may not send all of Git understands the following attributes:
them for a given credential; for example, a `host` attribute makes no
sense when dealing with a non-network protocol):
`protocol`:: `protocol`::
@ -142,3 +140,15 @@ sense when dealing with a non-network protocol):
`password`:: `password`::
The credential's password, if we are asking it to be stored. 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.

View File

@ -171,32 +171,6 @@ while (<STDIN>) {
## credential API management (generic functions) ## 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 { sub credential_read {
my %credential; my %credential;
my $reader = shift; my $reader = shift;
@ -214,8 +188,10 @@ sub credential_read {
sub credential_write { sub credential_write {
my $credential = shift; my $credential = shift;
my $writer = 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) ) { while (my ($key, $value) = each(%$credential) ) {
if ($value) { if (length $value && $key ne 'url') {
print $writer "$key=$value\n"; print $writer "$key=$value\n";
} }
} }
@ -254,7 +230,7 @@ sub mw_connect_maybe {
$mediawiki = MediaWiki::API->new; $mediawiki = MediaWiki::API->new;
$mediawiki->{config}->{api_url} = "$url/api.php"; $mediawiki->{config}->{api_url} = "$url/api.php";
if ($wiki_login) { if ($wiki_login) {
my %credential = credential_from_url($url); my %credential = (url => $url);
$credential{username} = $wiki_login; $credential{username} = $wiki_login;
$credential{password} = $wiki_passwd; $credential{password} = $wiki_passwd;
credential_run("fill", \%credential); credential_run("fill", \%credential);

View File

@ -172,6 +172,8 @@ int credential_read(struct credential *c, FILE *fp)
} else if (!strcmp(key, "path")) { } else if (!strcmp(key, "path")) {
free(c->path); free(c->path);
c->path = xstrdup(value); 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 * Ignore other lines; we don't know what they mean, but