From: Junio C Hamano Date: Thu, 20 Jun 2013 23:02:42 +0000 (-0700) Subject: Merge branch 'cm/remote-mediawiki' X-Git-Tag: v1.8.4-rc0~155 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/0c36f3a198fab35c694a1e38c57227989c98e48e?ds=inline;hp=-c Merge branch 'cm/remote-mediawiki' * cm/remote-mediawiki: git-remote-mediawiki: display message when launched directly --- 0c36f3a198fab35c694a1e38c57227989c98e48e diff --combined contrib/mw-to-git/git-remote-mediawiki.perl index 717387275c,9b71972fc7..c1a967b3d1 --- a/contrib/mw-to-git/git-remote-mediawiki.perl +++ b/contrib/mw-to-git/git-remote-mediawiki.perl @@@ -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 () ########################## Functions ############################## + ## 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://
\n" . + "Then, use git commit, push and pull as with every normal git repository.\n"; + } + -## 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; @@@ -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) {