From: nguyenkimthuat <nguyenkimthuat@xxxxxxxxx> This patch adds the functionnality to export the file attachements from the local git's repository using the API of mediawiki. It also provides the possibility for an user to delete a page in the local repository Git which means the page will be deleted in the wiki site after user do the 'push'. Signed-off-by: VOLEK Pavel <Pavel.Volek@xxxxxxxxxxxxxxx> Signed-off-by: NGUYEN Kim Thuat <Kim-Thuat.Nguyen@xxxxxxxxxxxxxxx> Signed-off-by: ROUCHER IGLESIAS Javier <roucherj@xxxxxxxxxxxxxxx> Signed-off-by: Matthieu Moy <Matthieu.Moy@xxxxxxx> --- contrib/mw-to-git/git-remote-mediawiki | 126 +++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/contrib/mw-to-git/git-remote-mediawiki b/contrib/mw-to-git/git-remote-mediawiki index c18bfa1..2fd0e5b 100755 --- a/contrib/mw-to-git/git-remote-mediawiki +++ b/contrib/mw-to-git/git-remote-mediawiki @@ -275,6 +275,14 @@ sub run_git { return $res; } +sub run_git_raw { + no encoding 'utf8'; + open(my $g,"-|","git " . $_[0]); + my $r = do { local $/; <$g> }; + close($g); + + return $r; +} sub get_last_local_revision { # Get note regarding last mediawiki revision @@ -644,6 +652,11 @@ sub mw_push_file { my $page_deleted = ($new_sha1 eq NULL_SHA1); $complete_file_name = mediawiki_clean_filename($complete_file_name); + my %hashFiles = get_file_extensions_maybe($complete_file_name); + my $path = "File:".$complete_file_name; + my @extensions = split(/\./, $complete_file_name); + my $extension = pop(@extensions); + if (substr($complete_file_name,-3) eq ".mw") { my $title = substr($complete_file_name,0,-3); @@ -653,39 +666,74 @@ sub mw_push_file { # special priviledges. A common # convention is to replace the page # with this content instead: - $file_content = DELETED_CONTENT; + mw_connect_maybe(); + my $re = $mediawiki->edit( { + action => 'delete', + title => $title, + reason => $summary + } )|| die $mediawiki-> {error}->{code} . ':' . $mediawiki->{error}->{details}; } else { $file_content = run_git("cat-file blob $new_sha1"); - } - - mw_connect_maybe(); - my $result = $mediawiki->edit( { - action => 'edit', - summary => $summary, - title => $title, - basetimestamp => $basetimestamps{$newrevid}, - text => mediawiki_clean($file_content, $page_created), - }, { - skip_encoding => 1 # Helps with names with accentuated characters - }); - if (!$result) { - if ($mediawiki->{error}->{code} == 3) { - # edit conflicts, considered as non-fast-forward - print STDERR 'Warning: Error ' . - $mediawiki->{error}->{code} . - ' from mediwiki: ' . $mediawiki->{error}->{details} . - ".\n"; - return ($newrevid, "non-fast-forward"); - } else { - # Other errors. Shouldn't happen => just die() - die 'Fatal: Error ' . - $mediawiki->{error}->{code} . - ' from mediwiki: ' . $mediawiki->{error}->{details}; + mw_connect_maybe(); + + my $result = $mediawiki->edit( { + action => 'edit', + summary => $summary, + title => $title, + basetimestamp => $basetimestamps{$newrevid}, + text => mediawiki_clean($file_content, $page_created), + }, { + skip_encoding => 1 # Helps with names with accentuated characters + }); + if (!$result) { + if ($mediawiki->{error}->{code} == 3) { + # edit conflicts, considered as non-fast-forward + print STDERR 'Warning: Error ' . + $mediawiki->{error}->{code} . + ' from mediwiki: ' . $mediawiki->{error}->{details} .".\n"; + return ($newrevid, "non-fast-forward"); + } else { + # Other errors. Shouldn't happen => just die() + die 'Fatal: Error ' . + $mediawiki->{error}->{code} . ' from mediwiki: ' . $mediawiki->{error}->{details}; + } } + $newrevid = $result->{edit}->{newrevid}; + print STDERR "Pushed file: $new_sha1 - $title\n"; + } + elsif (exists($hashFiles{$extension})) + { + # Deleting and uploading a file require the priviledge of the user + if ($page_deleted) { + mw_connect_maybe(); + my $res = $mediawiki->edit( { + action => 'delete', + title => $path, + reason => $summary + } )|| die $mediawiki-> {error}->{code} . ':' . $mediawiki->{error}->{details}; + } else { + my $content = run_git_raw("cat-file blob $new_sha1"); + if ($content ne "") { + mw_connect_maybe(); + $mediawiki->{config}->{upload_url} = "$url/index.php/Special:Upload"; + + my $res = $mediawiki->edit ( { + action => 'upload', + filename => $complete_file_name, + comment => $summary, + file => [undef, $complete_file_name, Content => $content ], + ignorewarnings=>1, + }, { + skip_encoding => 1 # Helps with names with accentuated characters + } ) || die $mediawiki-> {error}->{code} . ':' . $mediawiki->{error}->{details}; + my $last_file_page = $mediawiki->get_page({title =>$path}); + $newrevid = $last_file_page->{revid}; + print STDERR "Pushed file: $new_sha1 - $complete_file_name\n"; + } else { + print STDERR "Empty file. Can not upload \n "; + } } - $newrevid = $result->{edit}->{newrevid}; - print STDERR "Pushed file: $new_sha1 - $title\n"; } else { print STDERR "$complete_file_name not a mediawiki file (Not pushable on this version of git-remote-mediawiki).\n" } @@ -825,3 +873,25 @@ sub mw_push_revision { print STDOUT "ok $remote\n"; return 1; } + +sub get_file_extensions_maybe { + my $file_name = shift; + my $est_mw_page = substr($file_name,-3) eq ".mw"; + if(!$est_mw_page) { + mw_connect_maybe(); + + my $query = { + action => 'query', + meta => 'siteinfo', + siprop => 'fileextensions' + }; + + my $result = $mediawiki->api($query); + my @file_extensions= map $_->{ext},@{$result->{query}->{fileextensions}}; + my %hashFile = map {$_ => 1}@file_extensions; + + return %hashFile; + } else { + return ; + } +} -- 1.7.10.2.552.gaa3bb87 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html