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