source: documentation/trunk/packages/dokuwiki-2011-05-25a/bin/dwpage.php@ 25027

Last change on this file since 25027 was 25027, checked in by jmt12, 12 years ago

Adding the packages directory, and within it a configured version of dokuwiki all ready to run

  • Property svn:executable set to *
File size: 9.3 KB
RevLine 
[25027]1#!/usr/bin/php
2<?php
3#------------------------------------------------------------------------------
4if ('cli' != php_sapi_name()) die();
5
6ini_set('memory_limit','128M');
7if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
8require_once DOKU_INC.'inc/init.php';
9require_once DOKU_INC.'inc/common.php';
10require_once DOKU_INC.'inc/cliopts.php';
11
12#------------------------------------------------------------------------------
13function usage($action) {
14 switch ( $action ) {
15 case 'checkout':
16 print "Usage: dwpage.php [opts] checkout <wiki:page> [working_file]
17
18 Checks out a file from the repository, using the wiki id and obtaining
19 a lock for the page.
20 If a working_file is specified, this is where the page is copied to.
21 Otherwise defaults to the same as the wiki page in the current
22 working directory.
23
24 EXAMPLE
25 $ ./dwpage.php checkout wiki:syntax ./new_syntax.txt
26
27 OPTIONS
28 -h, --help=<action>: get help
29 -f: force obtaining a lock for the page (generally bad idea)
30";
31 break;
32 case 'commit':
33 print "Usage: dwpage.php [opts] -m \"Msg\" commit <working_file> <wiki:page>
34
35 Checks in the working_file into the repository using the specified
36 wiki id, archiving the previous version.
37
38 EXAMPLE
39 $ ./dwpage.php -m \"Some message\" commit ./new_syntax.txt wiki:syntax
40
41 OPTIONS
42 -h, --help=<action>: get help
43 -f: force obtaining a lock for the page (generally bad idea)
44 -t, trivial: minor change
45 -m (required): Summary message describing the change
46";
47 break;
48 case 'lock':
49 print "Usage: dwpage.php [opts] lock <wiki:page>
50
51 Obtains or updates a lock for a wiki page
52
53 EXAMPLE
54 $ ./dwpage.php lock wiki:syntax
55
56 OPTIONS
57 -h, --help=<action>: get help
58 -f: force obtaining a lock for the page (generally bad idea)
59";
60 break;
61 case 'unlock':
62 print "Usage: dwpage.php [opts] unlock <wiki:page>
63
64 Removes a lock for a wiki page.
65
66 EXAMPLE
67 $ ./dwpage.php unlock wiki:syntax
68
69 OPTIONS
70 -h, --help=<action>: get help
71 -f: force obtaining a lock for the page (generally bad idea)
72";
73 break;
74 default:
75 print "Usage: dwpage.php [opts] <action>
76
77 Utility to help command line Dokuwiki page editing, allow
78 pages to be checked out for editing then committed after changes
79
80 Normal operation would be;
81
82
83
84 ACTIONS
85 checkout: see $ dwpage.php --help=checkout
86 commit: see $ dwpage.php --help=commit
87 lock: see $ dwpage.php --help=lock
88
89 OPTIONS
90 -h, --help=<action>: get help
91 e.g. $ ./dwpage.php -hcommit
92 e.g. $ ./dwpage.php --help=commit
93";
94 break;
95 }
96}
97
98#------------------------------------------------------------------------------
99function getUser() {
100 $user = getenv('USER');
101 if (empty ($user)) {
102 $user = getenv('USERNAME');
103 } else {
104 return $user;
105 }
106 if (empty ($user)) {
107 $user = 'admin';
108 }
109 return $user;
110}
111
112#------------------------------------------------------------------------------
113function getSuppliedArgument($OPTS, $short, $long) {
114 $arg = $OPTS->get($short);
115 if ( is_null($arg) ) {
116 $arg = $OPTS->get($long);
117 }
118 return $arg;
119}
120
121#------------------------------------------------------------------------------
122function obtainLock($WIKI_ID) {
123
124 global $USERNAME;
125
126 if ( !file_exists(wikiFN($WIKI_ID)) ) {
127 fwrite( STDERR, "$WIKI_ID does not yet exist\n");
128 }
129
130 $_SERVER['REMOTE_USER'] = $USERNAME;
131 if ( checklock($WIKI_ID) ) {
132 fwrite( STDERR, "Page $WIKI_ID is already locked by another user\n");
133 exit(1);
134 }
135
136 lock($WIKI_ID);
137
138 $_SERVER['REMOTE_USER'] = '_'.$USERNAME.'_';
139
140 if ( checklock($WIKI_ID) != $USERNAME ) {
141
142 fwrite( STDERR, "Unable to obtain lock for $WIKI_ID\n" );
143 exit(1);
144
145 }
146}
147
148#------------------------------------------------------------------------------
149function clearLock($WIKI_ID) {
150
151 global $USERNAME ;
152
153 if ( !file_exists(wikiFN($WIKI_ID)) ) {
154 fwrite( STDERR, "$WIKI_ID does not yet exist\n");
155 }
156
157 $_SERVER['REMOTE_USER'] = $USERNAME;
158 if ( checklock($WIKI_ID) ) {
159 fwrite( STDERR, "Page $WIKI_ID is locked by another user\n");
160 exit(1);
161 }
162
163 unlock($WIKI_ID);
164
165 if ( file_exists(wikiLockFN($WIKI_ID)) ) {
166 fwrite( STDERR, "Unable to clear lock for $WIKI_ID\n" );
167 exit(1);
168 }
169
170}
171
172#------------------------------------------------------------------------------
173function deleteLock($WIKI_ID) {
174
175 $wikiLockFN = wikiLockFN($WIKI_ID);
176
177 if ( file_exists($wikiLockFN) ) {
178 if ( !unlink($wikiLockFN) ) {
179 fwrite( STDERR, "Unable to delete $wikiLockFN\n" );
180 exit(1);
181 }
182 }
183
184}
185
186#------------------------------------------------------------------------------
187$USERNAME = getUser();
188$CWD = getcwd();
189$SYSTEM_ID = '127.0.0.1';
190
191#------------------------------------------------------------------------------
192$OPTS = Doku_Cli_Opts::getOptions(
193 __FILE__,
194 'h::fm:u:s:t',
195 array(
196 'help==',
197 'user=',
198 'system=',
199 'trivial',
200 )
201);
202
203if ( $OPTS->isError() ) {
204 print $OPTS->getMessage()."\n";
205 exit(1);
206}
207
208if ( $OPTS->has('h') or $OPTS->has('help') or !$OPTS->hasArgs() ) {
209 usage(getSuppliedArgument($OPTS,'h','help'));
210 exit(0);
211}
212
213if ( $OPTS->has('u') or $OPTS->has('user') ) {
214 $USERNAME = getSuppliedArgument($OPTS,'u','user');
215}
216
217if ( $OPTS->has('s') or $OPTS->has('system') ) {
218 $SYSTEM_ID = getSuppliedArgument($OPTS,'s','system');
219}
220
221#------------------------------------------------------------------------------
222switch ( $OPTS->arg(0) ) {
223
224 #----------------------------------------------------------------------
225 case 'checkout':
226
227 $WIKI_ID = $OPTS->arg(1);
228
229 if ( !$WIKI_ID ) {
230 fwrite( STDERR, "Wiki page ID required\n");
231 exit(1);
232 }
233
234 $WIKI_FN = wikiFN($WIKI_ID);
235
236 if ( !file_exists($WIKI_FN) ) {
237 fwrite( STDERR, "$WIKI_ID does not yet exist\n");
238 exit(1);
239 }
240
241 $TARGET_FN = $OPTS->arg(2);
242
243 if ( empty($TARGET_FN) ) {
244 $TARGET_FN = getcwd().'/'.basename($WIKI_FN);
245 }
246
247 if ( !file_exists(dirname($TARGET_FN)) ) {
248 fwrite( STDERR, "Directory ".dirname($TARGET_FN)." does not exist\n");
249 exit(1);
250 }
251
252 if ( stristr( realpath(dirname($TARGET_FN)), realpath($conf['datadir']) ) !== false ) {
253 fwrite( STDERR, "Attempt to check out file into data directory - not allowed\n");
254 exit(1);
255 }
256
257 if ( $OPTS->has('f') ) {
258 deleteLock($WIKI_ID);
259 }
260
261 obtainLock($WIKI_ID);
262
263 # Need to lock the file first?
264 if ( !copy($WIKI_FN, $TARGET_FN) ) {
265 fwrite( STDERR, "Unable to copy $WIKI_FN to $TARGET_FN\n");
266 clearLock($WIKI_ID);
267 exit(1);
268 }
269
270 print "$WIKI_ID > $TARGET_FN\n";
271 exit(0);
272
273 break;
274
275 #----------------------------------------------------------------------
276 case 'commit':
277
278 $TARGET_FN = $OPTS->arg(1);
279
280 if ( !$TARGET_FN ) {
281 fwrite( STDERR, "Target filename required\n");
282 exit(1);
283 }
284
285 if ( !file_exists($TARGET_FN) ) {
286 fwrite( STDERR, "$TARGET_FN does not exist\n");
287 exit(1);
288 }
289
290 if ( !is_readable($TARGET_FN) ) {
291 fwrite( STDERR, "Cannot read from $TARGET_FN\n");
292 exit(1);
293 }
294
295 $WIKI_ID = $OPTS->arg(2);
296
297 if ( !$WIKI_ID ) {
298 fwrite( STDERR, "Wiki page ID required\n");
299 exit(1);
300 }
301
302 if ( !$OPTS->has('m') ) {
303 fwrite( STDERR, "Summary message required\n");
304 exit(1);
305 }
306
307 if ( $OPTS->has('f') ) {
308 deleteLock($WIKI_ID);
309 }
310
311 $_SERVER['REMOTE_USER'] = $USERNAME;
312 if ( checklock($WIKI_ID) ) {
313 fwrite( STDERR, "$WIKI_ID is locked by another user\n");
314 exit(1);
315 }
316
317 obtainLock($WIKI_ID);
318
319 saveWikiText($WIKI_ID, file_get_contents($TARGET_FN), $OPTS->get('m'), $OPTS->has('t'));
320
321 clearLock($WIKI_ID);
322
323 exit(0);
324
325 break;
326
327 #----------------------------------------------------------------------
328 case 'lock':
329
330 $WIKI_ID = $OPTS->arg(1);
331
332 if ( !$WIKI_ID ) {
333 fwrite( STDERR, "Wiki page ID required\n");
334 exit(1);
335 }
336
337 if ( $OPTS->has('f') ) {
338 deleteLock($WIKI_ID);
339 }
340
341 obtainLock($WIKI_ID);
342
343 print "Locked : $WIKI_ID\n";
344 exit(0);
345
346 break;
347
348 #----------------------------------------------------------------------
349 case 'unlock':
350
351 $WIKI_ID = $OPTS->arg(1);
352
353 if ( !$WIKI_ID ) {
354 fwrite( STDERR, "Wiki page ID required\n");
355 exit(1);
356 }
357
358 if ( $OPTS->has('f') ) {
359 deleteLock($WIKI_ID);
360 } else {
361 clearLock($WIKI_ID);
362 }
363
364 print "Unlocked : $WIKI_ID\n";
365 exit(0);
366
367 break;
368
369 #----------------------------------------------------------------------
370 default:
371
372 fwrite( STDERR, "Invalid action ".$OPTS->arg(0)."\n" );
373 exit(1);
374
375 break;
376
377}
378
Note: See TracBrowser for help on using the repository browser.