1414use strict;
1515use MediaWiki::API;
1616use Git;
17+ use Git::Mediawiki qw( clean_filename smudge_filename connect_maybe
18+ EMPTY HTTP_CODE_OK) ;
1719use DateTime::Format::ISO8601;
1820use warnings;
1921
2325
2426use URI::Escape;
2527
26- # Mediawiki filenames can contain forward slashes. This variable decides by which pattern they should be replaced
27- use constant SLASH_REPLACEMENT => ' %2F' ;
28-
2928# It's not always possible to delete pages (may require some
3029# privileges). Deleted pages are replaced with this content.
3130use constant DELETED_CONTENT => " [[Category:Deleted]]\n " ;
4039# Used on Git's side to reflect empty edit messages on the wiki
4140use constant EMPTY_MESSAGE => ' *Empty MediaWiki Message*' ;
4241
43- use constant EMPTY => q{ } ;
44-
4542# Number of pages taken into account at once in submodule get_mw_page_list
4643use constant SLICE_SIZE => 50;
4744
5047# the number of links to be returned (500 links max).
5148use constant BATCH_SIZE => 10;
5249
53- use constant HTTP_CODE_OK => 200;
54-
5550if (@ARGV != 2) {
5651 exit_error_usage();
5752}
@@ -199,37 +194,6 @@ sub parse_command {
199194# MediaWiki API instance, created lazily.
200195my $mediawiki ;
201196
202- sub mw_connect_maybe {
203- if ($mediawiki ) {
204- return ;
205- }
206- $mediawiki = MediaWiki::API-> new;
207- $mediawiki -> {config }-> {api_url } = " ${url} /api.php" ;
208- if ($wiki_login ) {
209- my %credential = (
210- ' url' => $url ,
211- ' username' => $wiki_login ,
212- ' password' => $wiki_passwd
213- );
214- Git::credential(\%credential );
215- my $request = {lgname => $credential {username },
216- lgpassword => $credential {password },
217- lgdomain => $wiki_domain };
218- if ($mediawiki -> login($request )) {
219- Git::credential(\%credential , ' approve' );
220- print {*STDERR } qq( Logged in mediawiki user "$credential {username}".\n ) ;
221- } else {
222- print {*STDERR } qq( Failed to log in mediawiki user "$credential {username}" on ${url} \n ) ;
223- print {*STDERR } ' (error ' .
224- $mediawiki -> {error }-> {code } . ' : ' .
225- $mediawiki -> {error }-> {details } . " )\n " ;
226- Git::credential(\%credential , ' reject' );
227- exit 1;
228- }
229- }
230- return ;
231- }
232-
233197sub fatal_mw_error {
234198 my $action = shift ;
235199 print STDERR " fatal: could not $action .\n " ;
@@ -339,7 +303,7 @@ sub get_mw_first_pages {
339303
340304# Get the list of pages to be fetched according to configuration.
341305sub get_mw_pages {
342- mw_connect_maybe( );
306+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
343307
344308 print {*STDERR } " Listing pages on remote wiki...\n " ;
345309
@@ -529,7 +493,7 @@ sub get_last_local_revision {
529493# avoid a loop onto all tracked pages. This is useful for the fetch-by-rev
530494# option.
531495sub get_last_global_remote_rev {
532- mw_connect_maybe( );
496+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
533497
534498 my $query = {
535499 action => ' query' ,
@@ -545,7 +509,7 @@ sub get_last_global_remote_rev {
545509# Get the last remote revision concerning the tracked pages and the tracked
546510# categories.
547511sub get_last_remote_revision {
548- mw_connect_maybe( );
512+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
549513
550514 my %pages_hash = get_mw_pages();
551515 my @pages = values (%pages_hash );
@@ -601,29 +565,6 @@ sub mediawiki_smudge {
601565 return " ${string} \n " ;
602566}
603567
604- sub mediawiki_clean_filename {
605- my $filename = shift ;
606- $filename =~ s { @{[SLASH_REPLACEMENT]}} { /} g ;
607- # [, ], |, {, and } are forbidden by MediaWiki, even URL-encoded.
608- # Do a variant of URL-encoding, i.e. looks like URL-encoding,
609- # but with _ added to prevent MediaWiki from thinking this is
610- # an actual special character.
611- $filename =~ s / [\[\]\{\}\| ]/ sprintf("_%%_ %x ", ord($& ))/ ge ;
612- # If we use the uri escape before
613- # we should unescape here, before anything
614-
615- return $filename ;
616- }
617-
618- sub mediawiki_smudge_filename {
619- my $filename = shift ;
620- $filename =~ s { /} { @{[SLASH_REPLACEMENT]}} g ;
621- $filename =~ s / / _/ g ;
622- # Decode forbidden characters encoded in mediawiki_clean_filename
623- $filename =~ s / _%_([0-9a-fA-F][0-9a-fA-F])/ sprintf('%c ', hex($1 ))/ ge ;
624- return $filename ;
625- }
626-
627568sub literal_data {
628569 my ($content ) = @_ ;
629570 print {*STDOUT } ' data ' , bytes::length ($content ), " \n " , $content ;
@@ -831,7 +772,7 @@ sub mw_import_ref {
831772 return ;
832773 }
833774
834- mw_connect_maybe( );
775+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
835776
836777 print {*STDERR } " Searching revisions...\n " ;
837778 my $last_local = get_last_local_revision();
@@ -945,7 +886,7 @@ sub mw_import_revids {
945886 my %commit ;
946887 $commit {author } = $rev -> {user } || ' Anonymous' ;
947888 $commit {comment } = $rev -> {comment } || EMPTY_MESSAGE;
948- $commit {title } = mediawiki_smudge_filename ($page_title );
889+ $commit {title } = smudge_filename ($page_title );
949890 $commit {mw_revision } = $rev -> {revid };
950891 $commit {content } = mediawiki_smudge($rev -> {' *' });
951892
@@ -1006,7 +947,7 @@ sub mw_upload_file {
1006947 }
1007948 # Deleting and uploading a file requires a priviledged user
1008949 if ($file_deleted ) {
1009- mw_connect_maybe( );
950+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
1010951 my $query = {
1011952 action => ' delete' ,
1012953 title => $path ,
@@ -1022,7 +963,7 @@ sub mw_upload_file {
1022963 # Don't let perl try to interpret file content as UTF-8 => use "raw"
1023964 my $content = run_git(" cat-file blob ${new_sha1} " , ' raw' );
1024965 if ($content ne EMPTY) {
1025- mw_connect_maybe( );
966+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
1026967 $mediawiki -> {config }-> {upload_url } =
1027968 " ${url} /index.php/Special:Upload" ;
1028969 $mediawiki -> edit({
@@ -1070,7 +1011,7 @@ sub mw_push_file {
10701011 my $old_sha1 = $diff_info_split [2];
10711012 my $page_created = ($old_sha1 eq NULL_SHA1);
10721013 my $page_deleted = ($new_sha1 eq NULL_SHA1);
1073- $complete_file_name = mediawiki_clean_filename ($complete_file_name );
1014+ $complete_file_name = clean_filename ($complete_file_name );
10741015
10751016 my ($title , $extension ) = $complete_file_name =~ / ^(.*)\. ([^\. ]*)$ / ;
10761017 if (!defined ($extension )) {
@@ -1093,7 +1034,7 @@ sub mw_push_file {
10931034 $file_content = run_git(" cat-file blob ${new_sha1} " );
10941035 }
10951036
1096- mw_connect_maybe( );
1037+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
10971038
10981039 my $result = $mediawiki -> edit( {
10991040 action => ' edit' ,
@@ -1279,7 +1220,7 @@ sub mw_push_revision {
12791220}
12801221
12811222sub get_allowed_file_extensions {
1282- mw_connect_maybe( );
1223+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
12831224
12841225 my $query = {
12851226 action => ' query' ,
@@ -1303,7 +1244,7 @@ sub get_allowed_file_extensions {
13031244# Return MediaWiki id for a canonical namespace name.
13041245# Ex.: "File", "Project".
13051246sub get_mw_namespace_id {
1306- mw_connect_maybe( );
1247+ $mediawiki = connect_maybe( $mediawiki , $remotename , $url );
13071248 my $name = shift ;
13081249
13091250 if (!exists $namespace_id {$name }) {
0 commit comments