OSDN Git Service

add wp_imgswap2.py for new OSDN Magazine
[otptools/otptools.git] / sfwman.pl
1 #!/usr/bin/perl
2 # SourceForge.JP Wiki manipulator
3 # by hylom
4 # This code is under GPL.
5 #
6
7 use warnings;
8 use strict;
9
10 use lib 'C:\Users\hirom\bin/otptools';
11
12 use utf8;
13 use open IO => ':utf8';
14 use open ':std';
15
16 use Getopt::Std;
17 use SourceForgeJP;
18 use IO::File;
19 use Term::Prompt;
20 use URI::Escape;
21 use Encode;
22 use File::Temp;
23
24 my $usage = <<EOD;
25 sfwman.pl command [options]
26
27 example:
28     sfwman.pl login -u loginname -p password
29     sfwman.pl logout
30     sfwman.pl get -p projectname -t targetpage
31     sfwman.pl edit -p projectname -t targetpage -f textfile -c comment
32     sfwman.pl delete -p projectname -t targetpage
33     sfwman.pl rdelete -p projectname -e expr
34     sfwman.pl attach -p projectname -t targetpage -f attachmentfile
35     sfwman.pl list -p projectname
36     sfwman.pl filter -p projectname -t targetpage -c filtercommand
37     sfwman.pl rfilter -p projectname -e expr -c filtercommand
38
39 EOD
40
41     my $command = shift @ARGV;
42 unless( $command ) {
43     print $usage;
44     exit;
45 }
46
47 if( $command eq 'login' ) {   #login
48     my %opts;
49     getopt('up', \%opts);
50     my $login_name;
51     my $password;
52
53     if( defined $opts{'u'} ) {
54         $login_name = $opts{'u'};
55     } else {
56         $login_name = prompt( 'x', 'loginname:', '', '' );
57     }
58
59     if( defined $opts{'p'} ) {
60         $password = $opts{'p'};
61     } else {
62         $password = prompt( 'p', 'password:', '', '' );
63         print "\n";
64     }
65
66     print "do login...\n";
67     if( login( $login_name, $password) ) {
68                 print "ok.\n";
69         } else {
70                 print "login failed.\n"
71         }
72
73 } elsif( $command eq 'attach' ) {    #attach
74     my %opts;
75     getopt('ptf', \%opts);
76
77     my $project = $opts{'p'};
78     my $page = $opts{'t'};
79     my $file = $opts{'f'};
80
81     add_attachment( $project, $page, $file );
82     
83 } elsif( $command eq 'get' ) {    #get
84     my %opts;
85     getopt('pt', \%opts);
86     my $project = $opts{'p'};
87     my $page = $opts{'t'};
88
89     getrawtext( $project, $page);
90
91 } elsif( $command eq 'list' ) {    #list
92     my %opts;
93     getopt('p', \%opts);
94     my $project = $opts{'p'};
95
96     get_page_list( $project);
97
98 } elsif( $command eq 'delete' ) {    #delete
99     my %opts;
100     getopt('pt', \%opts);
101     my $project = $opts{'p'};
102     my $page = $opts{'t'};
103
104     delete_page( $project, $page);
105
106 } elsif( $command eq 'rdelete' ) {    #regdelete
107     my %opts;
108     getopt('pe', \%opts);
109     my $project = $opts{'p'};
110     my $expr = $opts{'e'};
111
112     regdelete( $project, $expr);
113
114 } elsif( $command eq 'filter' ) {    #filter
115     my %opts;
116     getopt('ptfc', \%opts);
117     my $project = $opts{'p'};
118     my $page = $opts{'t'};
119     my $command = $opts{'f'};
120     my $comment = $opts{'c'};
121
122     filter( $project, $page, $command, $comment);
123
124 } elsif( $command eq 'rfilter' ) {    #rfilter
125     my %opts;
126     getopt('pefc', \%opts);
127     my $project = $opts{'p'};
128     my $expr = $opts{'e'};
129     my $command = $opts{'f'};
130     my $comment = $opts{'c'};
131
132     regfilter( $project, $expr, $command, $comment);
133
134 } elsif( $command eq 'edit' ) {    #edit
135     my %opts;
136     getopt('ptfc', \%opts);
137
138     my $project = $opts{'p'};
139     my $page = $opts{'t'};
140     my $file = $opts{'f'};
141     my $comment = $opts{'c'};
142
143     edit( $project, $page, $file, $comment);
144
145 } elsif( $command eq 'logout' ) {    #logout
146     print "do logout...\n";
147     logout();
148
149 } else {    #other
150     print $usage;
151     exit;
152 }
153
154 sub login {
155     my $login_name = shift @_;
156     my $password = shift @_;
157
158     my $sf = WWW::SourceForgeJP->new();
159     $sf->login( $login_name, $password );
160     print "save cookie to " . $sf->{"cookies_file"} . "\n" ;
161
162 }
163
164 sub logout {
165     my $sf = WWW::SourceForgeJP->new();
166     $sf->logout();
167 }
168
169 sub getrawtext {
170     my $project = shift @_;
171     my $page = shift @_;
172
173     my $sf = WWW::SourceForgeJP->new();
174     print $sf->Wiki->get_raw_text( $project, $page );
175 }
176
177 sub delete_page {
178     my $project = shift @_;
179     my $page = shift @_;
180
181     my $sf = WWW::SourceForgeJP->new();
182     if( $sf->Wiki->delete_page( $project, $page ) ) {
183         print "delete $page: succeed.\n";
184     } else {
185         print "delete $page: failed.\n";
186     }
187
188 }
189
190 sub get_page_list {
191     my $project = shift @_;
192
193     my $sf = WWW::SourceForgeJP->new();
194     my $page_list_ref = $sf->Wiki->get_page_list( $project );
195
196     for my $page (@{$page_list_ref}) {
197         my $page_str = uri_unescape( $page );
198
199         print $page_str, "\n";
200     }
201 }
202
203 sub edit {
204     my $project = shift @_;
205     my $page = shift @_;
206     my $file = shift @_;
207     my $comment = shift @_;
208
209     $comment = "" if( ! defined $comment );
210
211     my $file_handle = IO::File->new($file, "r") or die "$! : $file\n" ;
212     my $text = do { local $/; <$file_handle> };
213
214     my $sf = WWW::SourceForgeJP->new();
215
216     $sf->Wiki->edit_page( project => $project,
217                           page => $page,
218                           text => $text,
219                           comment => $comment );
220 }
221
222 sub add_attachment {
223     my $project = shift @_;
224     my $page = shift @_;
225     my $file = shift @_;
226
227     if( ! -e $file ) {
228         die "$file is not exist.\n";
229     }
230
231     my $sf = WWW::SourceForgeJP->new();
232
233     my $ret = $sf->Wiki->post_attachment( project => $project,
234                                           page => $page,
235                                           file => $file );
236
237     if( $ret ) {
238         print "$file: upload succeed.\n";
239     } else {
240         print "$file: upload failed.\n";
241     }
242 }
243
244 sub regdelete {
245     my $project = shift @_;
246     my $expr = shift @_;
247
248     my $sf = WWW::SourceForgeJP->new();
249     my $page_list_ref = $sf->Wiki->get_page_list( $project );
250
251     for my $page (@{$page_list_ref}) {
252         my $page_str = uri_unescape( $page );
253         if( $page_str =~ m/$expr/ ) {
254             if( $sf->Wiki->delete_page( $project, $page ) ) {
255                 print "$page_str : deleted.\n";
256             } else {
257                 print "$page_str: failed.\n";
258             }
259         }
260     }
261 }
262
263 sub filter {
264     my $project = shift @_;
265     my $page = shift @_;
266     my $command = shift @_;
267     my $comment = shift @_;
268
269     my $sf = WWW::SourceForgeJP->new();
270     my $text = $sf->Wiki->get_raw_text( $project, $page );
271
272     my $temp_fh = File::Temp->new();
273     binmode $temp_fh, ":utf8";
274     my $filename = $temp_fh->filename;
275     print $temp_fh $text;
276
277     my $filterd_text = `type $filename | $command`;
278
279     $filterd_text = Encode::decode_utf8( $filterd_text );
280 #    print $filterd_text;
281
282     my $ret = 1;
283
284     $text = Encode::encode_utf8( $filterd_text );
285
286     $ret = $sf->Wiki->edit_page( project => $project,
287                                  page => $page,
288                                  text => $text,
289                                  comment => $comment );
290
291     if( $ret ) {
292         print "$page: done.\n";
293     } else {
294         print "$page: failed.\n";
295     }
296
297 }
298
299 sub regfilter {
300     my $project = shift @_;
301     my $expr = shift @_;
302     my $command = shift @_;
303     my $comment = shift @_;
304
305     print "$project,  $command, $comment, \n";
306     die "expr is inbalid.\n" if( ! $expr );
307
308     my $sf = WWW::SourceForgeJP->new();
309     my $page_list_ref = $sf->Wiki->get_page_list( $project );
310
311     for my $page (@{$page_list_ref}) {
312         my $page_str = uri_unescape( $page );
313         if( $page_str =~ m/$expr/ ) {
314 #           print $page_str, "\n";
315 #           print $project, $page, $command, $comment, "\n";
316             filter( $project, $page, $command, $comment );
317         }
318     }
319
320 }