f4609b896f
This also bumps the stable nixpkgs to 20.09 as of 2020-11-21, because there is some breakage in the git build related to the netrc credentials helper which someone has taken care of in nixpkgs. The stable channel is not used for anything other than git, so this should be fine. Change-Id: I3575a19dab09e1e9556cf8231d717de9890484fb
223 lines
5.9 KiB
Perl
Executable file
223 lines
5.9 KiB
Perl
Executable file
#!/usr/bin/perl -w -s
|
|
# Copyright (C) 2012
|
|
# Charles Roussel <charles.roussel@ensimag.imag.fr>
|
|
# Simon Cathebras <simon.cathebras@ensimag.imag.fr>
|
|
# Julien Khayat <julien.khayat@ensimag.imag.fr>
|
|
# Guillaume Sasdy <guillaume.sasdy@ensimag.imag.fr>
|
|
# Simon Perrat <simon.perrat@ensimag.imag.fr>
|
|
# License: GPL v2 or later
|
|
|
|
# Usage:
|
|
# ./test-gitmw.pl <command> [argument]*
|
|
# Execute in terminal using the name of the function to call as first
|
|
# parameter, and the function's arguments as following parameters
|
|
#
|
|
# Example:
|
|
# ./test-gitmw.pl "get_page" foo .
|
|
# will call <wiki_getpage> with arguments <foo> and <.>
|
|
#
|
|
# Available functions are:
|
|
# "get_page"
|
|
# "delete_page"
|
|
# "edit_page"
|
|
# "getallpagename"
|
|
|
|
use MediaWiki::API;
|
|
use Getopt::Long;
|
|
use DateTime::Format::ISO8601;
|
|
use constant SLASH_REPLACEMENT => "%2F";
|
|
|
|
#Parsing of the config file
|
|
|
|
my $configfile = "$ENV{'CURR_DIR'}/test.config";
|
|
my %config;
|
|
open my $CONFIG, "<", $configfile or die "can't open $configfile: $!";
|
|
while (<$CONFIG>)
|
|
{
|
|
chomp;
|
|
s/#.*//;
|
|
s/^\s+//;
|
|
s/\s+$//;
|
|
next unless length;
|
|
my ($key, $value) = split (/\s*=\s*/,$_, 2);
|
|
$config{$key} = $value;
|
|
last if ($key eq 'LIGHTTPD' and $value eq 'false');
|
|
last if ($key eq 'PORT');
|
|
}
|
|
close $CONFIG or die "can't close $configfile: $!";
|
|
|
|
my $wiki_address = "http://$config{'SERVER_ADDR'}".":"."$config{'PORT'}";
|
|
my $wiki_url = "$wiki_address/$config{'WIKI_DIR_NAME'}/api.php";
|
|
my $wiki_admin = "$config{'WIKI_ADMIN'}";
|
|
my $wiki_admin_pass = "$config{'WIKI_PASSW'}";
|
|
my $mw = MediaWiki::API->new;
|
|
$mw->{config}->{api_url} = $wiki_url;
|
|
|
|
|
|
# wiki_login <name> <password>
|
|
#
|
|
# Logs the user with <name> and <password> in the global variable
|
|
# of the mediawiki $mw
|
|
sub wiki_login {
|
|
$mw->login( { lgname => "$_[0]",lgpassword => "$_[1]" } )
|
|
|| die "getpage: login failed";
|
|
}
|
|
|
|
# wiki_getpage <wiki_page> <dest_path>
|
|
#
|
|
# fetch a page <wiki_page> from the wiki referenced in the global variable
|
|
# $mw and copies its content in directory dest_path
|
|
sub wiki_getpage {
|
|
my $pagename = $_[0];
|
|
my $destdir = $_[1];
|
|
|
|
my $page = $mw->get_page( { title => $pagename } );
|
|
if (!defined($page)) {
|
|
die "getpage: wiki does not exist";
|
|
}
|
|
|
|
my $content = $page->{'*'};
|
|
if (!defined($content)) {
|
|
die "getpage: page does not exist";
|
|
}
|
|
|
|
$pagename=$page->{'title'};
|
|
# Replace spaces by underscore in the page name
|
|
$pagename =~ s/ /_/g;
|
|
$pagename =~ s/\//%2F/g;
|
|
open(my $file, ">:encoding(UTF-8)", "$destdir/$pagename.mw");
|
|
print $file "$content";
|
|
close ($file);
|
|
|
|
}
|
|
|
|
# wiki_delete_page <page_name>
|
|
#
|
|
# delete the page with name <page_name> from the wiki referenced
|
|
# in the global variable $mw
|
|
sub wiki_delete_page {
|
|
my $pagename = $_[0];
|
|
|
|
my $exist=$mw->get_page({title => $pagename});
|
|
|
|
if (defined($exist->{'*'})){
|
|
$mw->edit({ action => 'delete',
|
|
title => $pagename})
|
|
|| die $mw->{error}->{code} . ": " . $mw->{error}->{details};
|
|
} else {
|
|
die "no page with such name found: $pagename\n";
|
|
}
|
|
}
|
|
|
|
# wiki_editpage <wiki_page> <wiki_content> <wiki_append> [-c=<category>] [-s=<summary>]
|
|
#
|
|
# Edit a page named <wiki_page> with content <wiki_content> on the wiki
|
|
# referenced with the global variable $mw
|
|
# If <wiki_append> == true : append <wiki_content> at the end of the actual
|
|
# content of the page <wiki_page>
|
|
# If <wik_page> doesn't exist, that page is created with the <wiki_content>
|
|
sub wiki_editpage {
|
|
my $wiki_page = $_[0];
|
|
my $wiki_content = $_[1];
|
|
my $wiki_append = $_[2];
|
|
my $summary = "";
|
|
my ($summ, $cat) = ();
|
|
GetOptions('s=s' => \$summ, 'c=s' => \$cat);
|
|
|
|
my $append = 0;
|
|
if (defined($wiki_append) && $wiki_append eq 'true') {
|
|
$append=1;
|
|
}
|
|
|
|
my $previous_text ="";
|
|
|
|
if ($append) {
|
|
my $ref = $mw->get_page( { title => $wiki_page } );
|
|
$previous_text = $ref->{'*'};
|
|
}
|
|
|
|
my $text = $wiki_content;
|
|
if (defined($previous_text)) {
|
|
$text="$previous_text$text";
|
|
}
|
|
|
|
# Eventually, add this page to a category.
|
|
if (defined($cat)) {
|
|
my $category_name="[[Category:$cat]]";
|
|
$text="$text\n $category_name";
|
|
}
|
|
if(defined($summ)){
|
|
$summary=$summ;
|
|
}
|
|
|
|
$mw->edit( { action => 'edit', title => $wiki_page, summary => $summary, text => "$text"} );
|
|
}
|
|
|
|
# wiki_getallpagename [<category>]
|
|
#
|
|
# Fetch all pages of the wiki referenced by the global variable $mw
|
|
# and print the names of each one in the file all.txt with a new line
|
|
# ("\n") between these.
|
|
# If the argument <category> is defined, then this function get only the pages
|
|
# belonging to <category>.
|
|
sub wiki_getallpagename {
|
|
# fetch the pages of the wiki
|
|
if (defined($_[0])) {
|
|
my $mw_pages = $mw->list ( { action => 'query',
|
|
list => 'categorymembers',
|
|
cmtitle => "Category:$_[0]",
|
|
cmnamespace => 0,
|
|
cmlimit => 500 },
|
|
)
|
|
|| die $mw->{error}->{code}.": ".$mw->{error}->{details};
|
|
open(my $file, ">:encoding(UTF-8)", "all.txt");
|
|
foreach my $page (@{$mw_pages}) {
|
|
print $file "$page->{title}\n";
|
|
}
|
|
close ($file);
|
|
|
|
} else {
|
|
my $mw_pages = $mw->list({
|
|
action => 'query',
|
|
list => 'allpages',
|
|
aplimit => 500,
|
|
})
|
|
|| die $mw->{error}->{code}.": ".$mw->{error}->{details};
|
|
open(my $file, ">:encoding(UTF-8)", "all.txt");
|
|
foreach my $page (@{$mw_pages}) {
|
|
print $file "$page->{title}\n";
|
|
}
|
|
close ($file);
|
|
}
|
|
}
|
|
|
|
sub wiki_upload_file {
|
|
my $file_name = $_[0];
|
|
my $resultat = $mw->edit ( {
|
|
action => 'upload',
|
|
filename => $file_name,
|
|
comment => 'upload a file',
|
|
file => [ $file_name ],
|
|
ignorewarnings=>1,
|
|
}, {
|
|
skip_encoding => 1
|
|
} ) || die $mw->{error}->{code} . ' : ' . $mw->{error}->{details};
|
|
}
|
|
|
|
|
|
|
|
# Main part of this script: parse the command line arguments
|
|
# and select which function to execute
|
|
my $fct_to_call = shift;
|
|
|
|
wiki_login($wiki_admin, $wiki_admin_pass);
|
|
|
|
my %functions_to_call = (
|
|
upload_file => \&wiki_upload_file,
|
|
get_page => \&wiki_getpage,
|
|
delete_page => \&wiki_delete_page,
|
|
edit_page => \&wiki_editpage,
|
|
getallpagename => \&wiki_getallpagename,
|
|
);
|
|
die "$0 ERROR: wrong argument" unless exists $functions_to_call{$fct_to_call};
|
|
$functions_to_call{$fct_to_call}->(map { utf8::decode($_); $_ } @ARGV);
|