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)
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.

View file

@ -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);

View file

@ -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