[25027] | 1 | #!/usr/bin/php
|
---|
| 2 | <?php
|
---|
| 3 | #------------------------------------------------------------------------------
|
---|
| 4 | if ('cli' != php_sapi_name()) die();
|
---|
| 5 |
|
---|
| 6 | ini_set('memory_limit','128M');
|
---|
| 7 | if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
|
---|
| 8 | require_once DOKU_INC.'inc/init.php';
|
---|
| 9 | require_once DOKU_INC.'inc/common.php';
|
---|
| 10 | require_once DOKU_INC.'inc/cliopts.php';
|
---|
| 11 |
|
---|
| 12 | #------------------------------------------------------------------------------
|
---|
| 13 | function 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 | #------------------------------------------------------------------------------
|
---|
| 99 | function 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 | #------------------------------------------------------------------------------
|
---|
| 113 | function 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 | #------------------------------------------------------------------------------
|
---|
| 122 | function 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 | #------------------------------------------------------------------------------
|
---|
| 149 | function 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 | #------------------------------------------------------------------------------
|
---|
| 173 | function 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 |
|
---|
| 203 | if ( $OPTS->isError() ) {
|
---|
| 204 | print $OPTS->getMessage()."\n";
|
---|
| 205 | exit(1);
|
---|
| 206 | }
|
---|
| 207 |
|
---|
| 208 | if ( $OPTS->has('h') or $OPTS->has('help') or !$OPTS->hasArgs() ) {
|
---|
| 209 | usage(getSuppliedArgument($OPTS,'h','help'));
|
---|
| 210 | exit(0);
|
---|
| 211 | }
|
---|
| 212 |
|
---|
| 213 | if ( $OPTS->has('u') or $OPTS->has('user') ) {
|
---|
| 214 | $USERNAME = getSuppliedArgument($OPTS,'u','user');
|
---|
| 215 | }
|
---|
| 216 |
|
---|
| 217 | if ( $OPTS->has('s') or $OPTS->has('system') ) {
|
---|
| 218 | $SYSTEM_ID = getSuppliedArgument($OPTS,'s','system');
|
---|
| 219 | }
|
---|
| 220 |
|
---|
| 221 | #------------------------------------------------------------------------------
|
---|
| 222 | switch ( $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 |
|
---|