Merge branch 'cm/remote-mediawiki'
authorJunio C Hamano <gitster@pobox.com>
Thu, 20 Jun 2013 23:02:42 +0000 (16:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 20 Jun 2013 23:02:42 +0000 (16:02 -0700)
* cm/remote-mediawiki:
git-remote-mediawiki: display message when launched directly

1  2 
contrib/mw-to-git/git-remote-mediawiki.perl
index 717387275cdb0fd7e4999503cd53261e11f851a1,9b71972fc7393b4d5ece06bedbe83e5a0ae14ad0..c1a967b3d14e87fedebd093c473e1d6f6eb4e94c
@@@ -13,7 -13,6 +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
@@@ -42,6 -41,10 +42,10 @@@ use constant NULL_SHA1 => "000000000000
  # Used on Git's side to reflect empty edit messages on the wiki
  use constant EMPTY_MESSAGE => '*Empty MediaWiki Message*';
  
+ if (@ARGV != 2) {
+       exit_error_usage();
+ }
  my $remotename = $ARGV[0];
  my $url = $ARGV[1];
  
@@@ -157,6 -160,68 +161,17 @@@ 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.";
 -      }
 -}
 -
+ ## error handling
+ sub exit_error_usage {
+       die "ERROR: git-remote-mediawiki module was not called with a correct number of\n" .
+           "parameters\n" .
+           "You may obtain this error because you attempted to run the git-remote-mediawiki\n" .
+             "module directly.\n" .
+           "This module can be used the following way:\n" .
+           "\tgit clone mediawiki://<address of a mediawiki>\n" .
+           "Then, use git commit, push and pull as with every normal git repository.\n";
+ }
  # MediaWiki API instance, created lazily.
  my $mediawiki;
  
@@@ -167,45 -232,27 +182,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;
@@@ -258,7 -305,10 +273,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;
@@@ -281,7 -331,10 +296,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) {