Exemple #1
0
/**
 *	check if two directories are different
 *
 *	@param string $a filename
 *	@param string $b filename
 *	@return bool
 */
function dir_is_different($a, $b)
{
    if (substr($a, -1) == '/') {
        $a = substr($a, 0, -1);
    }
    if (substr($b, -1) == '/') {
        $b = substr($b, 0, -1);
    }
    $a_fns = @scandir($a);
    $b_fns = @scandir($b);
    if ($a_fns !== $b_fns) {
        return true;
    }
    foreach ($a_fns as $fn) {
        if ($fn == '.' || $fn == '..') {
            continue;
        }
        if (is_dir($a . '/' . $fn) || is_dir($b . '/' . $fn)) {
            if (dir_is_different($a . '/' . $fn, $b . '/' . $fn)) {
                return true;
            }
        } else {
            if (file_is_different($a . '/' . $fn, $b . '/' . $fn)) {
                return true;
            }
        }
    }
    return false;
}
/**
 *	create and delete auto- revisions
 *
 *	this function operates on a specific page and takes SNAPSHOT_MIN_AGE and
 *	SNAPSHOT_MAX_AGE into account.
 *	@param array $args arguments
 *		key 'page' is the page (i.e. page.rev)
 *	@return array response
 *		true if successful
 */
function check_auto_snapshot($args)
{
    if (!isset($args['page'])) {
        return response('Required argument "page" missing', 400);
    }
    if (!page_exists($args['page'])) {
        return response('Page ' . quot($args['page']) . ' does not exist', 400);
    }
    $a = expl('.', $args['page']);
    $revs = revisions_info(array('pagename' => $a[0], 'sort' => 'time'));
    $revs = $revs['#data'];
    if ($a[1] == 'head' && SNAPSHOT_MIN_AGE != 0) {
        // we're dealing with a head revision and taking snapshots
        // find the previous auto- revision
        for ($i = 0; $i < count($revs); $i++) {
            if (substr($revs[$i]['revision'], 0, 5) == 'auto-') {
                // got it, check age
                if (time() - $revs[$i]['time'] < SNAPSHOT_MIN_AGE) {
                    log_msg('debug', 'check_auto_snapshot: age is ' . (time() - $revs[$i]['time']) . ' seconds, not creating a snapshot');
                    break;
                }
                // check if different
                if (dir_is_different(CONTENT_DIR . '/' . str_replace('.', '/', $args['page']), CONTENT_DIR . '/' . str_replace('.', '/', $revs[$i]['page']))) {
                    snapshot($args);
                } else {
                    log_msg('debug', 'check_auto_snapshot: head is identical to ' . $revs[$i]['revision'] . ', not creating a snapshot');
                }
                break;
            }
            if ($i == count($revs) - 1) {
                // no auto- revision?, create one now
                snapshot($args);
            }
        }
    }
    // delete old auto- revisions
    if (SNAPSHOT_MAX_AGE != 0) {
        for ($i = count($revs) - 1; 0 <= $i; $i--) {
            if (substr($revs[$i]['revision'], 0, 5) == 'auto-' && SNAPSHOT_MAX_AGE < time() - $revs[$i]['time']) {
                log_msg('info', 'check_auto_snapshot: deleting an old snapshot');
                delete_page(array('page' => $revs[$i]['page']));
                $i--;
            }
        }
    }
    return response(true);
}