11caeb00aSHarry Fuecks#!/usr/bin/php -d short_open_tag=on 21caeb00aSHarry Fuecks<?php 31caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 4*78ba70a7Schrisif ('cli' != php_sapi_name()) die(); 5*78ba70a7Schris 61caeb00aSHarry Fuecksif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 71caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/init.php'; 81caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/common.php'; 91caeb00aSHarry Fuecksrequire_once DOKU_INC.'inc/cliopts.php'; 101caeb00aSHarry Fuecks 111caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 121caeb00aSHarry Fuecksfunction usage($action) { 131caeb00aSHarry Fuecks switch ( $action ) { 141caeb00aSHarry Fuecks case 'checkout': 151caeb00aSHarry Fuecks print "Usage: dwpage.php [opts] checkout <wiki:page> [working_file] 161caeb00aSHarry Fuecks 171caeb00aSHarry Fuecks Checks out a file from the repository, using the wiki id and obtaining 181caeb00aSHarry Fuecks a lock for the page. 191caeb00aSHarry Fuecks If a working_file is specified, this is where the page is copied to. 201caeb00aSHarry Fuecks Otherwise defaults to the same as the wiki page in the current 211caeb00aSHarry Fuecks working directory. 221caeb00aSHarry Fuecks 231caeb00aSHarry Fuecks EXAMPLE 241caeb00aSHarry Fuecks $ ./dwpage.php checkout wiki:syntax ./new_syntax.txt 251caeb00aSHarry Fuecks 261caeb00aSHarry Fuecks OPTIONS 271caeb00aSHarry Fuecks -h, --help=<action>: get help 281caeb00aSHarry Fuecks -f: force obtaining a lock for the page (generally bad idea) 291caeb00aSHarry Fuecks"; 301caeb00aSHarry Fuecks break; 311caeb00aSHarry Fuecks case 'commit': 321caeb00aSHarry Fuecks print "Usage: dwpage.php [opts] -m \"Msg\" commit <working_file> <wiki:page> 331caeb00aSHarry Fuecks 341caeb00aSHarry Fuecks Checks in the working_file into the repository using the specified 351caeb00aSHarry Fuecks wiki id, archiving the previous version. 361caeb00aSHarry Fuecks 371caeb00aSHarry Fuecks EXAMPLE 381caeb00aSHarry Fuecks $ ./dwpage.php -m \"Some message\" commit ./new_syntax.txt wiki:syntax 391caeb00aSHarry Fuecks 401caeb00aSHarry Fuecks OPTIONS 411caeb00aSHarry Fuecks -h, --help=<action>: get help 421caeb00aSHarry Fuecks -f: force obtaining a lock for the page (generally bad idea) 431caeb00aSHarry Fuecks -m (required): Summary message describing the change 441caeb00aSHarry Fuecks"; 451caeb00aSHarry Fuecks break; 461caeb00aSHarry Fuecks case 'lock': 471caeb00aSHarry Fuecks print "Usage: dwpage.php [opts] lock <wiki:page> 481caeb00aSHarry Fuecks 491caeb00aSHarry Fuecks Obtains or updates a lock for a wiki page 501caeb00aSHarry Fuecks 511caeb00aSHarry Fuecks EXAMPLE 521caeb00aSHarry Fuecks $ ./dwpage.php lock wiki:syntax 531caeb00aSHarry Fuecks 541caeb00aSHarry Fuecks OPTIONS 551caeb00aSHarry Fuecks -h, --help=<action>: get help 561caeb00aSHarry Fuecks -f: force obtaining a lock for the page (generally bad idea) 571caeb00aSHarry Fuecks"; 581caeb00aSHarry Fuecks break; 591caeb00aSHarry Fuecks case 'unlock': 601caeb00aSHarry Fuecks print "Usage: dwpage.php [opts] unlock <wiki:page> 611caeb00aSHarry Fuecks 621caeb00aSHarry Fuecks Removes a lock for a wiki page. 631caeb00aSHarry Fuecks 641caeb00aSHarry Fuecks EXAMPLE 651caeb00aSHarry Fuecks $ ./dwpage.php unlock wiki:syntax 661caeb00aSHarry Fuecks 671caeb00aSHarry Fuecks OPTIONS 681caeb00aSHarry Fuecks -h, --help=<action>: get help 691caeb00aSHarry Fuecks -f: force obtaining a lock for the page (generally bad idea) 701caeb00aSHarry Fuecks"; 711caeb00aSHarry Fuecks break; 721caeb00aSHarry Fuecks default: 731caeb00aSHarry Fuecks print "Usage: dwpage.php [opts] <action> 741caeb00aSHarry Fuecks 751caeb00aSHarry Fuecks Utility to help command line Dokuwiki page editing, allow 761caeb00aSHarry Fuecks pages to be checked out for editing then committed after changes 771caeb00aSHarry Fuecks 781caeb00aSHarry Fuecks Normal operation would be; 791caeb00aSHarry Fuecks 801caeb00aSHarry Fuecks 811caeb00aSHarry Fuecks 821caeb00aSHarry Fuecks ACTIONS 83a9b9af8cSAndreas Abeck checkout: see $ dwpage.php --help=checkout 84a9b9af8cSAndreas Abeck commit: see $ dwpage.php --help=commit 85a9b9af8cSAndreas Abeck lock: see $ dwpage.php --help=lock 861caeb00aSHarry Fuecks 871caeb00aSHarry Fuecks OPTIONS 881caeb00aSHarry Fuecks -h, --help=<action>: get help 891caeb00aSHarry Fuecks e.g. $ ./dwpage.php -hcommit 901caeb00aSHarry Fuecks e.g. $ ./dwpage.php --help=commit 911caeb00aSHarry Fuecks"; 921caeb00aSHarry Fuecks break; 931caeb00aSHarry Fuecks } 941caeb00aSHarry Fuecks} 951caeb00aSHarry Fuecks 961caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 971caeb00aSHarry Fuecksfunction getUser() { 981caeb00aSHarry Fuecks $user = getenv('USER'); 991caeb00aSHarry Fuecks if (empty ($username)) { 1001caeb00aSHarry Fuecks $user = getenv('USERNAME'); 1011caeb00aSHarry Fuecks } else { 1021caeb00aSHarry Fuecks return $user; 1031caeb00aSHarry Fuecks } 1041caeb00aSHarry Fuecks if (empty ($username)) { 1051caeb00aSHarry Fuecks $user = 'admin'; 1061caeb00aSHarry Fuecks } 1071caeb00aSHarry Fuecks return $user; 1081caeb00aSHarry Fuecks} 1091caeb00aSHarry Fuecks 1101caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1111caeb00aSHarry Fuecksfunction getSuppliedArgument($OPTS, $short, $long) { 1121caeb00aSHarry Fuecks $arg = $OPTS->get($short); 1131caeb00aSHarry Fuecks if ( is_null($arg) ) { 1141caeb00aSHarry Fuecks $arg = $OPTS->get($long); 1151caeb00aSHarry Fuecks } 1161caeb00aSHarry Fuecks return $arg; 1171caeb00aSHarry Fuecks} 1181caeb00aSHarry Fuecks 1191caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1201caeb00aSHarry Fuecksfunction obtainLock($WIKI_ID) { 1211caeb00aSHarry Fuecks 1221caeb00aSHarry Fuecks global $USERNAME; 1231caeb00aSHarry Fuecks 1241caeb00aSHarry Fuecks if ( !file_exists(wikiFN($WIKI_ID)) ) { 1251caeb00aSHarry Fuecks fwrite( STDERR, "$WIKI_ID does not yet exist\n"); 1261caeb00aSHarry Fuecks } 1271caeb00aSHarry Fuecks 1281caeb00aSHarry Fuecks $_SERVER['REMOTE_USER'] = $USERNAME; 1291caeb00aSHarry Fuecks if ( checklock($WIKI_ID) ) { 1301caeb00aSHarry Fuecks fwrite( STDERR, "Page $WIKI_ID is already locked by another user\n"); 1311caeb00aSHarry Fuecks exit(1); 1321caeb00aSHarry Fuecks } 1331caeb00aSHarry Fuecks 1341caeb00aSHarry Fuecks lock($WIKI_ID); 1351caeb00aSHarry Fuecks 1361caeb00aSHarry Fuecks $_SERVER['REMOTE_USER'] = '_'.$USERNAME.'_'; 1371caeb00aSHarry Fuecks 1381caeb00aSHarry Fuecks if ( checklock($WIKI_ID) != $USERNAME ) { 1391caeb00aSHarry Fuecks 1401caeb00aSHarry Fuecks fwrite( STDERR, "Unable to obtain lock for $WIKI_ID\n" ); 1411caeb00aSHarry Fuecks exit(1); 1421caeb00aSHarry Fuecks 1431caeb00aSHarry Fuecks } 1441caeb00aSHarry Fuecks} 1451caeb00aSHarry Fuecks 1461caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1471caeb00aSHarry Fuecksfunction clearLock($WIKI_ID) { 1481caeb00aSHarry Fuecks 1491caeb00aSHarry Fuecks global $USERNAME ; 1501caeb00aSHarry Fuecks 1511caeb00aSHarry Fuecks if ( !file_exists(wikiFN($WIKI_ID)) ) { 1521caeb00aSHarry Fuecks fwrite( STDERR, "$WIKI_ID does not yet exist\n"); 1531caeb00aSHarry Fuecks } 1541caeb00aSHarry Fuecks 1551caeb00aSHarry Fuecks $_SERVER['REMOTE_USER'] = $USERNAME; 1561caeb00aSHarry Fuecks if ( checklock($WIKI_ID) ) { 1571caeb00aSHarry Fuecks fwrite( STDERR, "Page $WIKI_ID is locked by another user\n"); 1581caeb00aSHarry Fuecks exit(1); 1591caeb00aSHarry Fuecks } 1601caeb00aSHarry Fuecks 1611caeb00aSHarry Fuecks unlock($WIKI_ID); 1621caeb00aSHarry Fuecks 163c9b4bd1eSBen Coburn if ( file_exists(wikiLockFN($WIKI_ID)) ) { 1641caeb00aSHarry Fuecks fwrite( STDERR, "Unable to clear lock for $WIKI_ID\n" ); 1651caeb00aSHarry Fuecks exit(1); 1661caeb00aSHarry Fuecks } 1671caeb00aSHarry Fuecks 1681caeb00aSHarry Fuecks} 1691caeb00aSHarry Fuecks 1701caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1711caeb00aSHarry Fuecksfunction deleteLock($WIKI_ID) { 1721caeb00aSHarry Fuecks 173c9b4bd1eSBen Coburn $wikiLockFN = wikiLockFN($WIKI_ID); 1741caeb00aSHarry Fuecks 1751caeb00aSHarry Fuecks if ( file_exists($wikiLockFN) ) { 1761caeb00aSHarry Fuecks if ( !unlink($wikiLockFN) ) { 1771caeb00aSHarry Fuecks fwrite( STDERR, "Unable to delete $wikiLockFN\n" ); 1781caeb00aSHarry Fuecks exit(1); 1791caeb00aSHarry Fuecks } 1801caeb00aSHarry Fuecks } 1811caeb00aSHarry Fuecks 1821caeb00aSHarry Fuecks} 1831caeb00aSHarry Fuecks 1841caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1851caeb00aSHarry Fuecks$USERNAME = getUser(); 1861caeb00aSHarry Fuecks$CWD = getcwd(); 1871caeb00aSHarry Fuecks$SYSTEM_ID = '127.0.0.1'; 1881caeb00aSHarry Fuecks 1891caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 1901caeb00aSHarry Fuecks$OPTS = Doku_Cli_Opts::getOptions( 1911caeb00aSHarry Fuecks __FILE__, 1921caeb00aSHarry Fuecks 'h::fm:u:s:', 1931caeb00aSHarry Fuecks array( 1941caeb00aSHarry Fuecks 'help==', 1951caeb00aSHarry Fuecks 'user=', 1961caeb00aSHarry Fuecks 'system=', 1971caeb00aSHarry Fuecks ) 1981caeb00aSHarry Fuecks); 1991caeb00aSHarry Fuecks 2001caeb00aSHarry Fuecksif ( $OPTS->isError() ) { 2011caeb00aSHarry Fuecks print $OPTS->getMessage()."\n"; 2021caeb00aSHarry Fuecks exit(1); 2031caeb00aSHarry Fuecks} 2041caeb00aSHarry Fuecks 2051caeb00aSHarry Fuecksif ( $OPTS->has('h') or $OPTS->has('help') or !$OPTS->hasArgs() ) { 2061caeb00aSHarry Fuecks usage(getSuppliedArgument($OPTS,'h','help')); 2071caeb00aSHarry Fuecks exit(0); 2081caeb00aSHarry Fuecks} 2091caeb00aSHarry Fuecks 2101caeb00aSHarry Fuecksif ( $OPTS->has('u') or $OPTS->has('user') ) { 2111caeb00aSHarry Fuecks $USERNAME = getSuppliedArgument($OPTS,'u','user'); 2121caeb00aSHarry Fuecks} 2131caeb00aSHarry Fuecks 2141caeb00aSHarry Fuecksif ( $OPTS->has('s') or $OPTS->has('system') ) { 2151caeb00aSHarry Fuecks $SYSTEM_ID = getSuppliedArgument($OPTS,'s','system'); 2161caeb00aSHarry Fuecks} 2171caeb00aSHarry Fuecks 2181caeb00aSHarry Fuecks#------------------------------------------------------------------------------ 2191caeb00aSHarry Fuecksswitch ( $OPTS->arg(0) ) { 2201caeb00aSHarry Fuecks 2211caeb00aSHarry Fuecks #---------------------------------------------------------------------- 2221caeb00aSHarry Fuecks case 'checkout': 2231caeb00aSHarry Fuecks 2241caeb00aSHarry Fuecks $WIKI_ID = $OPTS->arg(1); 2251caeb00aSHarry Fuecks 2261caeb00aSHarry Fuecks if ( !$WIKI_ID ) { 2271caeb00aSHarry Fuecks fwrite( STDERR, "Wiki page ID required\n"); 2281caeb00aSHarry Fuecks exit(1); 2291caeb00aSHarry Fuecks } 2301caeb00aSHarry Fuecks 2311caeb00aSHarry Fuecks $WIKI_FN = wikiFN($WIKI_ID); 2321caeb00aSHarry Fuecks 2331caeb00aSHarry Fuecks if ( !file_exists($WIKI_FN) ) { 2341caeb00aSHarry Fuecks fwrite( STDERR, "$WIKI_ID does not yet exist\n"); 2351caeb00aSHarry Fuecks exit(1); 2361caeb00aSHarry Fuecks } 2371caeb00aSHarry Fuecks 2381caeb00aSHarry Fuecks $TARGET_FN = $OPTS->arg(2); 2391caeb00aSHarry Fuecks 2401caeb00aSHarry Fuecks if ( empty($TARGET_FN) ) { 2411caeb00aSHarry Fuecks $TARGET_FN = getcwd().'/'.basename($WIKI_FN); 2421caeb00aSHarry Fuecks } 2431caeb00aSHarry Fuecks 2441caeb00aSHarry Fuecks if ( !file_exists(dirname($TARGET_FN)) ) { 2451caeb00aSHarry Fuecks fwrite( STDERR, "Directory ".dirname($TARGET_FN)." does not exist\n"); 2461caeb00aSHarry Fuecks exit(1); 2471caeb00aSHarry Fuecks } 2481caeb00aSHarry Fuecks 2491caeb00aSHarry Fuecks if ( stristr( realpath(dirname($TARGET_FN)), realpath($conf['datadir']) ) !== FALSE ) { 2501caeb00aSHarry Fuecks fwrite( STDERR, "Attempt to check out file into data directory - not allowed\n"); 2511caeb00aSHarry Fuecks exit(1); 2521caeb00aSHarry Fuecks } 2531caeb00aSHarry Fuecks 2541caeb00aSHarry Fuecks if ( $OPTS->has('f') ) { 2551caeb00aSHarry Fuecks deleteLock($WIKI_ID); 2561caeb00aSHarry Fuecks } 2571caeb00aSHarry Fuecks 2581caeb00aSHarry Fuecks obtainLock($WIKI_ID); 2591caeb00aSHarry Fuecks 2601caeb00aSHarry Fuecks # Need to lock the file first? 2611caeb00aSHarry Fuecks if ( !copy($WIKI_FN, $TARGET_FN) ) { 2621caeb00aSHarry Fuecks fwrite( STDERR, "Unable to copy $WIKI_FN to $TARGET_FN\n"); 2631caeb00aSHarry Fuecks clearLock($WIKI_ID); 2641caeb00aSHarry Fuecks exit(1); 2651caeb00aSHarry Fuecks } 2661caeb00aSHarry Fuecks 2671caeb00aSHarry Fuecks print "$WIKI_ID > $TARGET_FN\n"; 2681caeb00aSHarry Fuecks exit(0); 2691caeb00aSHarry Fuecks 2701caeb00aSHarry Fuecks break; 2711caeb00aSHarry Fuecks 2721caeb00aSHarry Fuecks #---------------------------------------------------------------------- 2731caeb00aSHarry Fuecks case 'commit': 2741caeb00aSHarry Fuecks 2751caeb00aSHarry Fuecks $TARGET_FN = $OPTS->arg(1); 2761caeb00aSHarry Fuecks 2771caeb00aSHarry Fuecks if ( !$TARGET_FN ) { 2781caeb00aSHarry Fuecks fwrite( STDERR, "Target filename required\n"); 2791caeb00aSHarry Fuecks exit(1); 2801caeb00aSHarry Fuecks } 2811caeb00aSHarry Fuecks 2821caeb00aSHarry Fuecks if ( !file_exists($TARGET_FN) ) { 2831caeb00aSHarry Fuecks fwrite( STDERR, "$TARGET_FN does not exist\n"); 2841caeb00aSHarry Fuecks exit(1); 2851caeb00aSHarry Fuecks } 2861caeb00aSHarry Fuecks 2871caeb00aSHarry Fuecks if ( !is_readable($TARGET_FN) ) { 2881caeb00aSHarry Fuecks fwrite( STDERR, "Cannot read from $TARGET_FN\n"); 2891caeb00aSHarry Fuecks exit(1); 2901caeb00aSHarry Fuecks } 2911caeb00aSHarry Fuecks 2921caeb00aSHarry Fuecks $WIKI_ID = $OPTS->arg(2); 2931caeb00aSHarry Fuecks 2941caeb00aSHarry Fuecks if ( !$WIKI_ID ) { 2951caeb00aSHarry Fuecks fwrite( STDERR, "Wiki page ID required\n"); 2961caeb00aSHarry Fuecks exit(1); 2971caeb00aSHarry Fuecks } 2981caeb00aSHarry Fuecks 2991caeb00aSHarry Fuecks if ( !$OPTS->has('m') ) { 3001caeb00aSHarry Fuecks fwrite( STDERR, "Summary message required\n"); 3011caeb00aSHarry Fuecks exit(1); 3021caeb00aSHarry Fuecks } 3031caeb00aSHarry Fuecks 3041caeb00aSHarry Fuecks if ( $OPTS->has('f') ) { 3051caeb00aSHarry Fuecks deleteLock($WIKI_ID); 3061caeb00aSHarry Fuecks } 3071caeb00aSHarry Fuecks 3081caeb00aSHarry Fuecks $_SERVER['REMOTE_USER'] = $USERNAME; 3091caeb00aSHarry Fuecks if ( checklock($WIKI_ID) ) { 3101caeb00aSHarry Fuecks fwrite( STDERR, "$WIKI_ID is locked by another user\n"); 3111caeb00aSHarry Fuecks exit(1); 3121caeb00aSHarry Fuecks } 3131caeb00aSHarry Fuecks 3141caeb00aSHarry Fuecks obtainLock($WIKI_ID); 3151caeb00aSHarry Fuecks 3161caeb00aSHarry Fuecks saveWikiText($WIKI_ID, file_get_contents($TARGET_FN), $OPTS->get('m')); 3171caeb00aSHarry Fuecks 3181caeb00aSHarry Fuecks clearLock($WIKI_ID); 3191caeb00aSHarry Fuecks 3201caeb00aSHarry Fuecks exit(0); 3211caeb00aSHarry Fuecks 3221caeb00aSHarry Fuecks break; 3231caeb00aSHarry Fuecks 3241caeb00aSHarry Fuecks #---------------------------------------------------------------------- 3251caeb00aSHarry Fuecks case 'lock': 3261caeb00aSHarry Fuecks 3271caeb00aSHarry Fuecks $WIKI_ID = $OPTS->arg(1); 3281caeb00aSHarry Fuecks 3291caeb00aSHarry Fuecks if ( !$WIKI_ID ) { 3301caeb00aSHarry Fuecks fwrite( STDERR, "Wiki page ID required\n"); 3311caeb00aSHarry Fuecks exit(1); 3321caeb00aSHarry Fuecks } 3331caeb00aSHarry Fuecks 3341caeb00aSHarry Fuecks if ( $OPTS->has('f') ) { 3351caeb00aSHarry Fuecks deleteLock($WIKI_ID); 3361caeb00aSHarry Fuecks } 3371caeb00aSHarry Fuecks 3381caeb00aSHarry Fuecks obtainLock($WIKI_ID); 3391caeb00aSHarry Fuecks 3401caeb00aSHarry Fuecks print "Locked : $WIKI_ID\n"; 3411caeb00aSHarry Fuecks exit(0); 3421caeb00aSHarry Fuecks 3431caeb00aSHarry Fuecks break; 3441caeb00aSHarry Fuecks 3451caeb00aSHarry Fuecks #---------------------------------------------------------------------- 3461caeb00aSHarry Fuecks case 'unlock': 3471caeb00aSHarry Fuecks 3481caeb00aSHarry Fuecks $WIKI_ID = $OPTS->arg(1); 3491caeb00aSHarry Fuecks 3501caeb00aSHarry Fuecks if ( !$WIKI_ID ) { 3511caeb00aSHarry Fuecks fwrite( STDERR, "Wiki page ID required\n"); 3521caeb00aSHarry Fuecks exit(1); 3531caeb00aSHarry Fuecks } 3541caeb00aSHarry Fuecks 3551caeb00aSHarry Fuecks if ( $OPTS->has('f') ) { 3561caeb00aSHarry Fuecks deleteLock($WIKI_ID); 3571caeb00aSHarry Fuecks } else { 3581caeb00aSHarry Fuecks clearLock($WIKI_ID); 3591caeb00aSHarry Fuecks } 3601caeb00aSHarry Fuecks 3611caeb00aSHarry Fuecks print "Unlocked : $WIKI_ID\n"; 3621caeb00aSHarry Fuecks exit(0); 3631caeb00aSHarry Fuecks 3641caeb00aSHarry Fuecks break; 3651caeb00aSHarry Fuecks 3661caeb00aSHarry Fuecks #---------------------------------------------------------------------- 3671caeb00aSHarry Fuecks default: 3681caeb00aSHarry Fuecks 3691caeb00aSHarry Fuecks fwrite( STDERR, "Invalid action ".$OPTS->arg(0)."\n" ); 3701caeb00aSHarry Fuecks exit(1); 3711caeb00aSHarry Fuecks 3721caeb00aSHarry Fuecks break; 3731caeb00aSHarry Fuecks 3741caeb00aSHarry Fuecks} 3751caeb00aSHarry Fuecks 376