1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#! env perl
use strict;
use IO::All;
use LWP::UserAgent;
use URI;
use Getopt::Long;
use Config::YAML;
use Pod::Usage;
use File::Basename;
use File::Touch;
use User;
# set up configuration store
my $user_config_file = User->Home . '/.log4cplus-upload_to_wiki';
if (! -e $user_config_file)
{
touch($user_config_file);
}
my $config = Config::YAML->new(
config => $user_config_file,
output => $user_config_file,
bearer_token => '',
wiki_endpoint => 'https://sourceforge.net/rest/p/log4cplus/wiki/');
if (-r $user_config_file)
{
$config->read($user_config_file);
}
my $wiki_endpoint = $config->{wiki_endpoint};
# parse script parameters
my $bearer_token = $config->get_bearer_token;
my $file_path = '';
my $help = 0;
my $remember = 0;
if (! GetOptions("token|t=s" => \$bearer_token,
"remember" => \$remember,
"file|f=s" => \$file_path,
"help|h" => \$help))
{
pod2usage(2);
}
# evaluate script parameters
pod2usage(1) if $help;
pod2usage(-message => 'missing bearer token argument')
if $bearer_token eq '';
pod2usage(-message => 'missing input file argument')
if $file_path eq '';
# save configuration
if ($remember)
{
$config->set_bearer_token($bearer_token);
$config->write;
}
# slurp input file
print "reading file ", $file_path, "\n";
my $text = io($file_path)->utf8->slurp;
# add SF specific table of contents
$text = "[TOC]\n\n" . $text;
# construct URL for POST request
my $uri = URI->new($wiki_endpoint);
my ($file_name, undef, undef) = fileparse($file_path);
$uri->path($uri->path . $file_name);
$uri->query_form('access_token' => $bearer_token);
# get user agent
print "POSTing to ", $uri->as_string, "\n";
my $ua = LWP::UserAgent->new;
push @{ $ua->requests_redirectable }, 'POST';
# set up POST request
my $req = HTTP::Request->new(POST => $uri);
$req->content_type("application/x-www-form-urlencoded; charset='utf8'");
$req->accept_decodable;
my $content_enc = URI->new;
$content_enc->query_form('text' => $text, 'labels' => 'readme');
$req->content($content_enc->query);
print "POST body:\n", $req->as_string, "\n";
# do POST request
my $resp = $ua->request($req);
# process response
print "POST response: ";
if ($resp->is_success)
{
print $resp->decoded_content, "\n";
}
else
{
print $resp->decoded_content, "\n";
die $resp->status_line;
}
__END__
=head1 NAME
upload_to_wiki.pl - uploads a file (usually a Markdown document) as wiki page
on log4cplus SourceForge wiki.
=head1 SYNOPSIS
upload_to_wiki.pl [options] --token <bearer token> --file <file>
Options:
--help|h this help
--token|t <bearer token> SourceForge bearer token used for
authentication
--remember remember bearer token in configuration file
--file|f <file> file to be uploaded
=cut
|