git-remote-mediawiki: put long code into a subroutine
[gitweb.git] / contrib / mw-to-git / git-remote-mediawiki.perl
index 74344f63dbe55cfc58f26e6b1749a49d63a03b38..bc31ba49fcb862d1f11d5284f332d4eef17cb289 100755 (executable)
@@ -22,7 +22,6 @@
 binmode STDOUT, ":encoding(UTF-8)";
 
 use URI::Escape;
-use IPC::Open2;
 
 # Mediawiki filenames can contain forward slashes. This variable decides by which pattern they should be replaced
 use constant SLASH_REPLACEMENT => "%2F";
 $dumb_push = ($dumb_push eq "true");
 
 my $wiki_name = $url;
-$wiki_name =~ s/[^\/]*:\/\///;
+$wiki_name =~ s{[^/]*://}{};
 # If URL is like http://user:password@example.com/, we clearly don't
 # want the password in $wiki_name. While we're there, also remove user
 # and '@' sign, to avoid author like MWUser@HTTPUser@host.com
 $wiki_name =~ s/^.*@//;
 
 # Commands parser
-my $entry;
-my @cmd;
 while (<STDIN>) {
        chomp;
-       @cmd = split(/ /);
-       if (defined($cmd[0])) {
-               # Line not blank
-               if ($cmd[0] eq "capabilities") {
-                       die("Too many arguments for capabilities") unless (!defined($cmd[1]));
-                       mw_capabilities();
-               } elsif ($cmd[0] eq "list") {
-                       die("Too many arguments for list") unless (!defined($cmd[2]));
-                       mw_list($cmd[1]);
-               } elsif ($cmd[0] eq "import") {
-                       die("Invalid arguments for import") unless ($cmd[1] ne "" && !defined($cmd[2]));
-                       mw_import($cmd[1]);
-               } elsif ($cmd[0] eq "option") {
-                       die("Too many arguments for option") unless ($cmd[1] ne "" && $cmd[2] ne "" && !defined($cmd[3]));
-                       mw_option($cmd[1],$cmd[2]);
-               } elsif ($cmd[0] eq "push") {
-                       mw_push($cmd[1]);
-               } else {
-                       print STDERR "Unknown command. Aborting...\n";
-                       last;
-               }
-       } else {
-               # blank line: we should terminate
+
+       if (!parse_command($_)) {
                last;
        }
 
 
 ########################## Functions ##############################
 
+sub parse_command {
+       my ($line) = @_;
+       my @cmd = split(/ /, $line);
+       if (!defined $cmd[0]) {
+               return 0;
+       }
+       if ($cmd[0] eq "capabilities") {
+               die("Too many arguments for capabilities\n")
+                   if (defined($cmd[1]));
+               mw_capabilities();
+       } elsif ($cmd[0] eq "list") {
+               die("Too many arguments for list\n") if (defined($cmd[2]));
+               mw_list($cmd[1]);
+       } elsif ($cmd[0] eq "import") {
+               die("Invalid arguments for import\n")
+                   if ($cmd[1] eq "" || defined($cmd[2]));
+               mw_import($cmd[1]);
+       } elsif ($cmd[0] eq "option") {
+               die("Too many arguments for option\n")
+                   if ($cmd[1] eq "" || $cmd[2] eq "" || defined($cmd[3]));
+               mw_option($cmd[1],$cmd[2]);
+       } elsif ($cmd[0] eq "push") {
+               mw_push($cmd[1]);
+       } else {
+               print STDERR "Unknown command. Aborting...\n";
+               return 0;
+       }
+       return 1;
+}
+
 # MediaWiki API instance, created lazily.
 my $mediawiki;
 
@@ -221,11 +227,11 @@ sub get_mw_page_list {
        my $pages = shift;
        my @some_pages = @$page_list;
        while (@some_pages) {
-               my $last = 50;
-               if ($#some_pages < $last) {
-                       $last = $#some_pages;
+               my $last_page = 50;
+               if ($#some_pages < $last_page) {
+                       $last_page = $#some_pages;
                }
-               my @slice = @some_pages[0..$last];
+               my @slice = @some_pages[0..$last_page];
                get_mw_first_pages(\@slice, $pages);
                @some_pages = @some_pages[51..$#some_pages];
        }
@@ -247,7 +253,7 @@ sub get_mw_tracked_categories {
                        cmtitle => $category,
                        cmlimit => 'max' } )
                        || die $mediawiki->{error}->{code} . ': '
-                               . $mediawiki->{error}->{details};
+                               . $mediawiki->{error}->{details} . "\n";
                foreach my $page (@{$mw_pages}) {
                        $pages->{$page->{title}} = $page;
                }
@@ -338,8 +344,12 @@ sub get_mw_pages {
 sub run_git {
        my $args = shift;
        my $encoding = (shift || "encoding(UTF-8)");
-       open(my $git, "-|:$encoding", "git " . $args);
-       my $res = do { local $/; <$git> };
+       open(my $git, "-|:$encoding", "git " . $args)
+           or die "Unable to open: $!\n";
+       my $res = do {
+               local $/ = undef;
+               <$git>
+       };
        close($git);
 
        return $res;
@@ -454,14 +464,14 @@ sub get_mw_mediafile_for_page_revision {
 }
 
 sub download_mw_mediafile {
-       my $url = shift;
+       my $download_url = shift;
 
-       my $response = $mediawiki->{ua}->get($url);
+       my $response = $mediawiki->{ua}->get($download_url);
        if ($response->code == 200) {
                return $response->decoded_content;
        } else {
                print STDERR "Error downloading mediafile from :\n";
-               print STDERR "URL: $url\n";
+               print STDERR "URL: $download_url\n";
                print STDERR "Server response: " . $response->code . " " . $response->message . "\n";
                exit 1;
        }
@@ -564,7 +574,7 @@ sub mediawiki_smudge {
 
 sub mediawiki_clean_filename {
        my $filename = shift;
-       $filename =~ s/@{[SLASH_REPLACEMENT]}/\//g;
+       $filename =~ s{@{[SLASH_REPLACEMENT]}}{/}g;
        # [, ], |, {, and } are forbidden by MediaWiki, even URL-encoded.
        # Do a variant of URL-encoding, i.e. looks like URL-encoding,
        # but with _ added to prevent MediaWiki from thinking this is
@@ -578,7 +588,7 @@ sub mediawiki_clean_filename {
 
 sub mediawiki_smudge_filename {
        my $filename = shift;
-       $filename =~ s/\//@{[SLASH_REPLACEMENT]}/g;
+       $filename =~ s{/}{@{[SLASH_REPLACEMENT]}}g;
        $filename =~ s/ /_/g;
        # Decode forbidden characters encoded in mediawiki_clean_filename
        $filename =~ s/_%_([0-9a-fA-F][0-9a-fA-F])/sprintf("%c", hex($1))/ge;
@@ -766,7 +776,7 @@ sub get_more_refs {
                } elsif ($line eq "\n") {
                        return @refs;
                } else {
-                       die("Invalid command in a '$cmd' batch: ". $_);
+                       die("Invalid command in a '$cmd' batch: $_\n");
                }
        }
        return;
@@ -878,7 +888,7 @@ sub mw_import_revids {
                my $result = $mediawiki->api($query);
 
                if (!$result) {
-                       die "Failed to retrieve modified page for revision $pagerevid";
+                       die "Failed to retrieve modified page for revision $pagerevid\n";
                }
 
                if (defined($result->{query}->{badrevids}->{$pagerevid})) {
@@ -887,7 +897,7 @@ sub mw_import_revids {
                }
 
                if (!defined($result->{query}->{pages})) {
-                       die "Invalid revision $pagerevid.";
+                       die "Invalid revision $pagerevid.\n";
                }
 
                my @result_pages = values(%{$result->{query}->{pages}});
@@ -998,7 +1008,7 @@ sub mw_upload_file {
                        }, {
                                skip_encoding => 1
                        } ) || die $mediawiki->{error}->{code} . ':'
-                                . $mediawiki->{error}->{details};
+                                . $mediawiki->{error}->{details} . "\n";
                        my $last_file_page = $mediawiki->get_page({title => $path});
                        $newrevid = $last_file_page->{revid};
                        print STDERR "Pushed file: $new_sha1 - $complete_file_name.\n";
@@ -1078,7 +1088,7 @@ sub mw_push_file {
                                # Other errors. Shouldn't happen => just die()
                                die 'Fatal: Error ' .
                                    $mediawiki->{error}->{code} .
-                                   ' from mediwiki: ' . $mediawiki->{error}->{details};
+                                   ' from mediwiki: ' . $mediawiki->{error}->{details} . "\n";
                        }
                }
                $newrevid = $result->{edit}->{newrevid};
@@ -1100,7 +1110,7 @@ sub mw_push {
        my $pushed;
        for my $refspec (@refsspecs) {
                my ($force, $local, $remote) = $refspec =~ /^(\+)?([^:]*):([^:]*)$/
-                   or die("Invalid refspec for push. Expected <src>:<dst> or +<src>:<dst>");
+                   or die("Invalid refspec for push. Expected <src>:<dst> or +<src>:<dst>\n");
                if ($force) {
                        print STDERR "Warning: forced push not allowed on a MediaWiki.\n";
                }
@@ -1172,7 +1182,7 @@ sub mw_push_revision {
                                        $local_ancestry{$parent} = $child;
                                }
                        } elsif (!$line =~ /^([a-f0-9]+)/) {
-                               die "Unexpected output from git rev-list: $line";
+                               die "Unexpected output from git rev-list: $line\n";
                        }
                }
                while ($parsed_sha1 ne $HEAD_sha1) {
@@ -1192,7 +1202,7 @@ sub mw_push_revision {
                my @history = split(/\n/, $history);
                @history = @history[1..$#history];
                foreach my $line (reverse @history) {
-                       my @commit_info_split = split(/ |\n/, $line);
+                       my @commit_info_split = split(/[ \n]/, $line);
                        push(@commit_pairs, \@commit_info_split);
                }
        }
@@ -1226,7 +1236,7 @@ sub mw_push_revision {
                                return error_non_fast_forward($remote);
                        }
                        if ($status ne "ok") {
-                               die("Unknown error from mw_push_file()");
+                               die("Unknown error from mw_push_file()\n");
                        }
                }
                unless ($dumb_push) {
@@ -1271,7 +1281,7 @@ sub get_mw_namespace_id {
                # Look at configuration file, if the record for that namespace is
                # already cached. Namespaces are stored in form:
                # "Name_of_namespace:Id_namespace", ex.: "File:6".
-               my @temp = split(/[\n]/, run_git("config --get-all remote."
+               my @temp = split(/\n/, run_git("config --get-all remote."
                                                . $remotename .".namespaceCache"));
                chomp(@temp);
                foreach my $ns (@temp) {