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