Skip to content

Commit 192f7a0

Browse files
Benoit Persongitster
authored andcommitted
git-remote-mediawiki: factoring code between git-remote-mediawiki and Git::Mediawiki
For now, Git::Mediawiki contains nothing. This first patch moves some of git-remote-mediawiki.perl's factorisable code into Git::Mediawiki. In the same time, it removes the side effects of that code and renames the fucntions and constants moved to expose a better API. Signed-off-by: Benoit Person <[email protected]> Signed-off-by: Matthieu Moy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent c7956f9 commit 192f7a0

File tree

2 files changed

+89
-73
lines changed

2 files changed

+89
-73
lines changed

contrib/mw-to-git/Git/Mediawiki.pm

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,82 @@ require Exporter;
1818
@EXPORT = ();
1919

2020
# Methods which can be called as standalone functions as well:
21-
@EXPORT_OK = ();
21+
@EXPORT_OK = qw(clean_filename smudge_filename connect_maybe
22+
EMPTY HTTP_CODE_OK);
23+
}
24+
25+
# Mediawiki filenames can contain forward slashes. This variable decides by which pattern they should be replaced
26+
use constant SLASH_REPLACEMENT => '%2F';
27+
28+
# Used to test for empty strings
29+
use constant EMPTY => q{};
30+
31+
# HTTP codes
32+
use constant HTTP_CODE_OK => 200;
33+
34+
sub clean_filename {
35+
my $filename = shift;
36+
$filename =~ s{@{[SLASH_REPLACEMENT]}}{/}g;
37+
# [, ], |, {, and } are forbidden by MediaWiki, even URL-encoded.
38+
# Do a variant of URL-encoding, i.e. looks like URL-encoding,
39+
# but with _ added to prevent MediaWiki from thinking this is
40+
# an actual special character.
41+
$filename =~ s/[\[\]\{\}\|]/sprintf("_%%_%x", ord($&))/ge;
42+
# If we use the uri escape before
43+
# we should unescape here, before anything
44+
45+
return $filename;
46+
}
47+
48+
sub smudge_filename {
49+
my $filename = shift;
50+
$filename =~ s{/}{@{[SLASH_REPLACEMENT]}}g;
51+
$filename =~ s/ /_/g;
52+
# Decode forbidden characters encoded in clean_filename
53+
$filename =~ s/_%_([0-9a-fA-F][0-9a-fA-F])/sprintf('%c', hex($1))/ge;
54+
return $filename;
55+
}
56+
57+
sub connect_maybe {
58+
my $wiki = shift;
59+
if ($wiki) {
60+
return $wiki;
61+
}
62+
63+
my $remote_name = shift;
64+
my $remote_url = shift;
65+
my ($wiki_login, $wiki_password, $wiki_domain);
66+
67+
$wiki_login = Git::config("remote.${remote_name}.mwLogin");
68+
$wiki_password = Git::config("remote.${remote_name}.mwPassword");
69+
$wiki_domain = Git::config("remote.${remote_name}.mwDomain");
70+
71+
$wiki = MediaWiki::API->new;
72+
$wiki->{config}->{api_url} = "${remote_url}/api.php";
73+
if ($wiki_login) {
74+
my %credential = (
75+
'url' => $remote_url,
76+
'username' => $wiki_login,
77+
'password' => $wiki_password
78+
);
79+
Git::credential(\%credential);
80+
my $request = {lgname => $credential{username},
81+
lgpassword => $credential{password},
82+
lgdomain => $wiki_domain};
83+
if ($wiki->login($request)) {
84+
Git::credential(\%credential, 'approve');
85+
print {*STDERR} qq(Logged in mediawiki user "$credential{username}".\n);
86+
} else {
87+
print {*STDERR} qq(Failed to log in mediawiki user "$credential{username}" on ${remote_url}\n);
88+
print {*STDERR} ' (error ' .
89+
$wiki->{error}->{code} . ': ' .
90+
$wiki->{error}->{details} . ")\n";
91+
Git::credential(\%credential, 'reject');
92+
exit 1;
93+
}
94+
}
95+
96+
return $wiki;
2297
}
2398

2499
1; # Famous last words

contrib/mw-to-git/git-remote-mediawiki.perl

Lines changed: 13 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use strict;
1515
use MediaWiki::API;
1616
use Git;
17+
use Git::Mediawiki qw(clean_filename smudge_filename connect_maybe
18+
EMPTY HTTP_CODE_OK);
1719
use DateTime::Format::ISO8601;
1820
use warnings;
1921

@@ -23,9 +25,6 @@
2325

2426
use 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.
3130
use constant DELETED_CONTENT => "[[Category:Deleted]]\n";
@@ -40,8 +39,6 @@
4039
# Used on Git's side to reflect empty edit messages on the wiki
4140
use 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
4643
use constant SLICE_SIZE => 50;
4744

@@ -50,8 +47,6 @@
5047
# the number of links to be returned (500 links max).
5148
use constant BATCH_SIZE => 10;
5249

53-
use constant HTTP_CODE_OK => 200;
54-
5550
if (@ARGV != 2) {
5651
exit_error_usage();
5752
}
@@ -199,37 +194,6 @@ sub parse_command {
199194
# MediaWiki API instance, created lazily.
200195
my $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-
233197
sub 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.
341305
sub 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.
531495
sub 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.
547511
sub 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-
627568
sub 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

12811222
sub 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".
13051246
sub 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

Comments
 (0)