OSDN Git Service

move defualt_markup_rules to each subrules.
[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 }
161
162 sub logout {
163     my $sf = WWW::SourceForgeJP->new();
164     $sf->logout();
165 }
166
167 sub getrawtext {
168     my $project = shift @_;
169     my $page = shift @_;
170
171     my $sf = WWW::SourceForgeJP->new();
172     print $sf->Wiki->get_raw_text( $project, $page );
173 }
174
175 sub delete_page {
176     my $project = shift @_;
177     my $page = shift @_;
178
179     my $sf = WWW::SourceForgeJP->new();
180     if( $sf->Wiki->delete_page( $project, $page ) ) {
181         print "delete $page: succeed.\n";
182     } else {
183         print "delete $page: failed.\n";
184     }
185
186 }
187
188 sub get_page_list {
189     my $project = shift @_;
190
191     my $sf = WWW::SourceForgeJP->new();
192     my $page_list_ref = $sf->Wiki->get_page_list( $project );
193
194     for my $page (@{$page_list_ref}) {
195         my $page_str = uri_unescape( $page );
196
197         print $page_str, "\n";
198     }
199 }
200
201 sub edit {
202     my $project = shift @_;
203     my $page = shift @_;
204     my $file = shift @_;
205     my $comment = shift @_;
206
207     $comment = "" if( ! defined $comment );
208
209     my $file_handle = IO::File->new($file, "r") or die "$! : $file\n" ;
210     my $text = do { local $/; <$file_handle> };
211
212     my $sf = WWW::SourceForgeJP->new();
213
214     $sf->Wiki->edit_page( project => $project,
215                           page => $page,
216                           text => $text,
217                           comment => $comment );
218 }
219
220 sub add_attachment {
221     my $project = shift @_;
222     my $page = shift @_;
223     my $file = shift @_;
224
225     if( ! -e $file ) {
226         die "$file is not exist.\n";
227     }
228
229     my $sf = WWW::SourceForgeJP->new();
230
231     my $ret = $sf->Wiki->post_attachment( project => $project,
232                                           page => $page,
233                                           file => $file );
234
235     if( $ret ) {
236         print "$file: upload succeed.\n";
237     } else {
238         print "$file: upload failed.\n";
239     }
240 }
241
242 sub regdelete {
243     my $project = shift @_;
244     my $expr = shift @_;
245
246     my $sf = WWW::SourceForgeJP->new();
247     my $page_list_ref = $sf->Wiki->get_page_list( $project );
248
249     for my $page (@{$page_list_ref}) {
250         my $page_str = uri_unescape( $page );
251         if( $page_str =~ m/$expr/ ) {
252             if( $sf->Wiki->delete_page( $project, $page ) ) {
253                 print "$page_str : deleted.\n";
254             } else {
255                 print "$page_str: failed.\n";
256             }
257         }
258     }
259 }
260
261 sub filter {
262     my $project = shift @_;
263     my $page = shift @_;
264     my $command = shift @_;
265     my $comment = shift @_;
266
267     my $sf = WWW::SourceForgeJP->new();
268     my $text = $sf->Wiki->get_raw_text( $project, $page );
269
270     my $temp_fh = File::Temp->new();
271     binmode $temp_fh, ":utf8";
272     my $filename = $temp_fh->filename;
273     print $temp_fh $text;
274
275     my $filterd_text = `type $filename | $command`;
276
277     $filterd_text = Encode::decode_utf8( $filterd_text );
278 #    print $filterd_text;
279
280     my $ret = 1;
281
282     $text = Encode::encode_utf8( $filterd_text );
283
284     $ret = $sf->Wiki->edit_page( project => $project,
285                                  page => $page,
286                                  text => $text,
287                                  comment => $comment );
288
289     if( $ret ) {
290         print "$page: done.\n";
291     } else {
292         print "$page: failed.\n";
293     }
294
295 }
296
297 sub regfilter {
298     my $project = shift @_;
299     my $expr = shift @_;
300     my $command = shift @_;
301     my $comment = shift @_;
302
303     print "$project,  $command, $comment, \n";
304     die "expr is inbalid.\n" if( ! $expr );
305
306     my $sf = WWW::SourceForgeJP->new();
307     my $page_list_ref = $sf->Wiki->get_page_list( $project );
308
309     for my $page (@{$page_list_ref}) {
310         my $page_str = uri_unescape( $page );
311         if( $page_str =~ m/$expr/ ) {
312 #           print $page_str, "\n";
313 #           print $project, $page, $command, $comment, "\n";
314             filter( $project, $page, $command, $comment );
315         }
316     }
317
318 }