Merge branch 'bp/mediawiki-credential'
authorJunio C Hamano <gitster@pobox.com>
Fri, 14 Jun 2013 15:46:17 +0000 (08:46 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 14 Jun 2013 15:46:17 +0000 (08:46 -0700)
The bridge to MediaWiki has been updated to use the credential
helper interface in Git.pm, losing its own and the original
implementation the former was based on.

* bp/mediawiki-credential:
git-remote-mediawiki: use Git.pm functions for credentials

1  2 
contrib/mw-to-git/git-remote-mediawiki.perl
index f0c348cd2878e94ecb5a05500efebb970f221843,6672e4c0d62c3d8fa51188a1bd803dfbd2e642c3..717387275cdb0fd7e4999503cd53261e11f851a1
@@@ -13,6 -13,7 +13,7 @@@
  
  use strict;
  use MediaWiki::API;
+ use Git;
  use DateTime::Format::ISO8601;
  
  # By default, use UTF-8 to communicate with Git and the user
@@@ -156,57 -157,6 +157,6 @@@ while (<STDIN>) 
  
  ########################## Functions ##############################
  
- ## credential API management (generic functions)
- sub credential_read {
-       my %credential;
-       my $reader = shift;
-       my $op = shift;
-       while (<$reader>) {
-               my ($key, $value) = /([^=]*)=(.*)/;
-               if (not defined $key) {
-                       die "ERROR receiving response from git credential $op:\n$_\n";
-               }
-               $credential{$key} = $value;
-       }
-       return %credential;
- }
- 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 (length $value && $key ne 'url') {
-                       print $writer "$key=$value\n";
-               }
-       }
- }
- sub credential_run {
-       my $op = shift;
-       my $credential = shift;
-       my $pid = open2(my $reader, my $writer, "git credential $op");
-       credential_write($credential, $writer);
-       print $writer "\n";
-       close($writer);
-       if ($op eq "fill") {
-               %$credential = credential_read($reader, $op);
-       } else {
-               if (<$reader>) {
-                       die "ERROR while running git credential $op:\n$_";
-               }
-       }
-       close($reader);
-       waitpid($pid, 0);
-       my $child_exit_status = $? >> 8;
-       if ($child_exit_status != 0) {
-               die "'git credential $op' failed with code $child_exit_status.";
-       }
- }
  # MediaWiki API instance, created lazily.
  my $mediawiki;
  
@@@ -217,43 -167,29 +167,45 @@@ sub mw_connect_maybe 
        $mediawiki = MediaWiki::API->new;
        $mediawiki->{config}->{api_url} = "$url/api.php";
        if ($wiki_login) {
-               my %credential = (url => $url);
-               $credential{username} = $wiki_login;
-               $credential{password} = $wiki_passwd;
-               credential_run("fill", \%credential);
+               my %credential = (
+                       'url' => $url,
+                       'username' => $wiki_login,
+                       'password' => $wiki_passwd
+               );
+               Git::credential(\%credential);
                my $request = {lgname => $credential{username},
                               lgpassword => $credential{password},
                               lgdomain => $wiki_domain};
                if ($mediawiki->login($request)) {
-                       credential_run("approve", \%credential);
+                       Git::credential(\%credential, 'approve');
                        print STDERR "Logged in mediawiki user \"$credential{username}\".\n";
                } else {
                        print STDERR "Failed to log in mediawiki user \"$credential{username}\" on $url\n";
                        print STDERR "  (error " .
                                $mediawiki->{error}->{code} . ': ' .
                                $mediawiki->{error}->{details} . ")\n";
-                       credential_run("reject", \%credential);
+                       Git::credential(\%credential, 'reject');
                        exit 1;
                }
        }
  }
  
 +sub fatal_mw_error {
 +      my $action = shift;
 +      print STDERR "fatal: could not $action.\n";
 +      print STDERR "fatal: '$url' does not appear to be a mediawiki\n";
 +      if ($url =~ /^https/) {
 +              print STDERR "fatal: make sure '$url/api.php' is a valid page\n";
 +              print STDERR "fatal: and the SSL certificate is correct.\n";
 +      } else {
 +              print STDERR "fatal: make sure '$url/api.php' is a valid page.\n";
 +      }
 +      print STDERR "fatal: (error " .
 +          $mediawiki->{error}->{code} . ': ' .
 +          $mediawiki->{error}->{details} . ")\n";
 +      exit 1;
 +}
 +
  ## Functions for listing pages on the remote wiki
  sub get_mw_tracked_pages {
        my $pages = shift;
@@@ -306,7 -242,10 +258,7 @@@ sub get_mw_all_pages 
                aplimit => 'max'
        });
        if (!defined($mw_pages)) {
 -              print STDERR "fatal: could not get the list of wiki pages.\n";
 -              print STDERR "fatal: '$url' does not appear to be a mediawiki\n";
 -              print STDERR "fatal: make sure '$url/api.php' is a valid page.\n";
 -              exit 1;
 +              fatal_mw_error("get the list of wiki pages");
        }
        foreach my $page (@{$mw_pages}) {
                $pages->{$page->{title}} = $page;
@@@ -329,7 -268,10 +281,7 @@@ sub get_mw_first_pages 
                titles => $titles,
        });
        if (!defined($mw_pages)) {
 -              print STDERR "fatal: could not query the list of wiki pages.\n";
 -              print STDERR "fatal: '$url' does not appear to be a mediawiki\n";
 -              print STDERR "fatal: make sure '$url/api.php' is a valid page.\n";
 -              exit 1;
 +              fatal_mw_error("query the list of wiki pages");
        }
        while (my ($id, $page) = each(%{$mw_pages->{query}->{pages}})) {
                if ($id < 0) {