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