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 );
160 print "save cookie to " . $sf->{"cookies_file"} . "\n" ;
165 my $sf = WWW::SourceForgeJP->new();
170 my $project = shift @_;
173 my $sf = WWW::SourceForgeJP->new();
174 print $sf->Wiki->get_raw_text( $project, $page );
178 my $project = shift @_;
181 my $sf = WWW::SourceForgeJP->new();
182 if( $sf->Wiki->delete_page( $project, $page ) ) {
183 print "delete $page: succeed.\n";
185 print "delete $page: failed.\n";
191 my $project = shift @_;
193 my $sf = WWW::SourceForgeJP->new();
194 my $page_list_ref = $sf->Wiki->get_page_list( $project );
196 for my $page (@{$page_list_ref}) {
197 my $page_str = uri_unescape( $page );
199 print $page_str, "\n";
204 my $project = shift @_;
207 my $comment = shift @_;
209 $comment = "" if( ! defined $comment );
211 my $file_handle = IO::File->new($file, "r") or die "$! : $file\n" ;
212 my $text = do { local $/; <$file_handle> };
214 my $sf = WWW::SourceForgeJP->new();
216 $sf->Wiki->edit_page( project => $project,
219 comment => $comment );
223 my $project = shift @_;
228 die "$file is not exist.\n";
231 my $sf = WWW::SourceForgeJP->new();
233 my $ret = $sf->Wiki->post_attachment( project => $project,
238 print "$file: upload succeed.\n";
240 print "$file: upload failed.\n";
245 my $project = shift @_;
248 my $sf = WWW::SourceForgeJP->new();
249 my $page_list_ref = $sf->Wiki->get_page_list( $project );
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";
257 print "$page_str: failed.\n";
264 my $project = shift @_;
266 my $command = shift @_;
267 my $comment = shift @_;
269 my $sf = WWW::SourceForgeJP->new();
270 my $text = $sf->Wiki->get_raw_text( $project, $page );
272 my $temp_fh = File::Temp->new();
273 binmode $temp_fh, ":utf8";
274 my $filename = $temp_fh->filename;
275 print $temp_fh $text;
277 my $filterd_text = `type $filename | $command`;
279 $filterd_text = Encode::decode_utf8( $filterd_text );
280 # print $filterd_text;
284 $text = Encode::encode_utf8( $filterd_text );
286 $ret = $sf->Wiki->edit_page( project => $project,
289 comment => $comment );
292 print "$page: done.\n";
294 print "$page: failed.\n";
300 my $project = shift @_;
302 my $command = shift @_;
303 my $comment = shift @_;
305 print "$project, $command, $comment, \n";
306 die "expr is inbalid.\n" if( ! $expr );
308 my $sf = WWW::SourceForgeJP->new();
309 my $page_list_ref = $sf->Wiki->get_page_list( $project );
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 );