2 # SourceForge.JP Wiki manipulator
4 # This code is under GPL.
10 use lib 'C:\Users\hirom\bin/otptools';
13 use open IO => ':utf8';
25 sfwman.pl command [options]
28 sfwman.pl login -u loginname -p password
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
41 my $command = shift @ARGV;
47 if( $command eq 'login' ) { #login
53 if( defined $opts{'u'} ) {
54 $login_name = $opts{'u'};
56 $login_name = prompt( 'x', 'loginname:', '', '' );
59 if( defined $opts{'p'} ) {
60 $password = $opts{'p'};
62 $password = prompt( 'p', 'password:', '', '' );
66 print "do login...\n";
67 if( login( $login_name, $password) ) {
70 print "login failed.\n"
73 } elsif( $command eq 'attach' ) { #attach
75 getopt('ptf', \%opts);
77 my $project = $opts{'p'};
78 my $page = $opts{'t'};
79 my $file = $opts{'f'};
81 add_attachment( $project, $page, $file );
83 } elsif( $command eq 'get' ) { #get
86 my $project = $opts{'p'};
87 my $page = $opts{'t'};
89 getrawtext( $project, $page);
91 } elsif( $command eq 'list' ) { #list
94 my $project = $opts{'p'};
96 get_page_list( $project);
98 } elsif( $command eq 'delete' ) { #delete
100 getopt('pt', \%opts);
101 my $project = $opts{'p'};
102 my $page = $opts{'t'};
104 delete_page( $project, $page);
106 } elsif( $command eq 'rdelete' ) { #regdelete
108 getopt('pe', \%opts);
109 my $project = $opts{'p'};
110 my $expr = $opts{'e'};
112 regdelete( $project, $expr);
114 } elsif( $command eq 'filter' ) { #filter
116 getopt('ptfc', \%opts);
117 my $project = $opts{'p'};
118 my $page = $opts{'t'};
119 my $command = $opts{'f'};
120 my $comment = $opts{'c'};
122 filter( $project, $page, $command, $comment);
124 } elsif( $command eq 'rfilter' ) { #rfilter
126 getopt('pefc', \%opts);
127 my $project = $opts{'p'};
128 my $expr = $opts{'e'};
129 my $command = $opts{'f'};
130 my $comment = $opts{'c'};
132 regfilter( $project, $expr, $command, $comment);
134 } elsif( $command eq 'edit' ) { #edit
136 getopt('ptfc', \%opts);
138 my $project = $opts{'p'};
139 my $page = $opts{'t'};
140 my $file = $opts{'f'};
141 my $comment = $opts{'c'};
143 edit( $project, $page, $file, $comment);
145 } elsif( $command eq 'logout' ) { #logout
146 print "do logout...\n";
155 my $login_name = shift @_;
156 my $password = shift @_;
158 my $sf = WWW::SourceForgeJP->new();
159 $sf->login( $login_name, $password );
163 my $sf = WWW::SourceForgeJP->new();
168 my $project = shift @_;
171 my $sf = WWW::SourceForgeJP->new();
172 print $sf->Wiki->get_raw_text( $project, $page );
176 my $project = shift @_;
179 my $sf = WWW::SourceForgeJP->new();
180 if( $sf->Wiki->delete_page( $project, $page ) ) {
181 print "delete $page: succeed.\n";
183 print "delete $page: failed.\n";
189 my $project = shift @_;
191 my $sf = WWW::SourceForgeJP->new();
192 my $page_list_ref = $sf->Wiki->get_page_list( $project );
194 for my $page (@{$page_list_ref}) {
195 my $page_str = uri_unescape( $page );
197 print $page_str, "\n";
202 my $project = shift @_;
205 my $comment = shift @_;
207 $comment = "" if( ! defined $comment );
209 my $file_handle = IO::File->new($file, "r") or die "$! : $file\n" ;
210 my $text = do { local $/; <$file_handle> };
212 my $sf = WWW::SourceForgeJP->new();
214 $sf->Wiki->edit_page( project => $project,
217 comment => $comment );
221 my $project = shift @_;
226 die "$file is not exist.\n";
229 my $sf = WWW::SourceForgeJP->new();
231 my $ret = $sf->Wiki->post_attachment( project => $project,
236 print "$file: upload succeed.\n";
238 print "$file: upload failed.\n";
243 my $project = shift @_;
246 my $sf = WWW::SourceForgeJP->new();
247 my $page_list_ref = $sf->Wiki->get_page_list( $project );
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";
255 print "$page_str: failed.\n";
262 my $project = shift @_;
264 my $command = shift @_;
265 my $comment = shift @_;
267 my $sf = WWW::SourceForgeJP->new();
268 my $text = $sf->Wiki->get_raw_text( $project, $page );
270 my $temp_fh = File::Temp->new();
271 binmode $temp_fh, ":utf8";
272 my $filename = $temp_fh->filename;
273 print $temp_fh $text;
275 my $filterd_text = `type $filename | $command`;
277 $filterd_text = Encode::decode_utf8( $filterd_text );
278 # print $filterd_text;
282 $text = Encode::encode_utf8( $filterd_text );
284 $ret = $sf->Wiki->edit_page( project => $project,
287 comment => $comment );
290 print "$page: done.\n";
292 print "$page: failed.\n";
298 my $project = shift @_;
300 my $command = shift @_;
301 my $comment = shift @_;
303 print "$project, $command, $comment, \n";
304 die "expr is inbalid.\n" if( ! $expr );
306 my $sf = WWW::SourceForgeJP->new();
307 my $page_list_ref = $sf->Wiki->get_page_list( $project );
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 );