[dokuwiki] Re: How to move media and preserve the links?

  • From: Oliver Geisen <oliver.geisen@xxxxxxxxxxxx>
  • To: dokuwiki@xxxxxxxxxxxxx
  • Date: Tue, 9 Dec 2008 08:11:54 +0100

Hello,

i've got the same problem. Reorganizing the wiki's namespaces,pages and mediafiles is a common task for every wikiadmin
and should therefore be an integrated part of dokuwiki.
I do the job using a bash script (see below), but its really a hack.
One should reindex the wiki after doing that, because the script works on the filesystem level only.

One thing so solve is to handle relative namespaces [[.:----]] on moving.


Oliver

-------------------------------------------------


#!/bin/bash
#
# Move complete namespace (pages and media) to new location
# changeing all references in pages
#
# USAGE: nsmove [wikiname [old namespace [new namespace]]]
#
#----------------------------------------------------------------------- -------#
BIN=$(dirname $0)

# get commandline params
wiki="$1"
nsold="$2"
ns="$3"

if [ -z "$wiki" ]
then
    read -p "Which wiki [adminwiki]: " wiki
    test -z "$wiki" && wiki="adminwiki"
else
    echo "Use wiki: $wiki"
fi
DOKU_BASE=/opt/kreisbote/$wiki/dokuwiki
test ! -d "$DOKU_BASE" && { echo "Wiki '$wiki' does not exist!"; exit 1; }
DOKU_SAVEDIR=$($BIN/dw_savedir "$DOKU_BASE") || exit 1
DOKU_PAGES="$DOKU_SAVEDIR/pages"
DOKU_MEDIA="$DOKU_SAVEDIR/media"


if [ -z "$nsold" ]
then
    read -p "Old namespace: [[" nsold
else
    echo "Old namespace: $nsold"
fi
nsold_dir="$DOKU_PAGES/${nsold//://}"
test ! -d "$nsold_dir" && { echo "Old namespace not found: $nsold_dir"; exit 1; }

if [ -z "$ns" ]
then
    read -p "New namespace: [[" ns
else
    echo "New namespace: $ns"
fi
ns_dir="$DOKU_PAGES/${ns//://}"
test -d "$ns_dir" && { echo "New namespace already exists!"; exit 1; }

# find pages having links to namespace
echo -n "Searching pages having links into old namespace... "
pages=$(egrep -ril "\[\[$nsold\:" $DOKU_PAGES)
if [ -z "$pages" ]
then
    echo "No pages need to be changed."
else
    n=$(echo "$pages" | wc -l)
    echo "$n pages need to changed."
fi

# make backup first
echo "Backing up current pages to pages.bak..."
mkdir -p "$DOKU_PAGES.bak"
rsync -a "$DOKU_PAGES/" "$DOKU_PAGES.bak/"

# replace links to old namespace
if [ -n "$pages" ]
then
    read -p "Replace wiki links in pages to new namespace? (y/n): "
    if [ "$RESULT" == "y" ]; then
        echo "Changeing links, please wait..."
        i=0
        for file in $pages
        do
            i=$((i+1))
            echo " file $i of $n: $file"
            sed -i 's/\[\['$nsold'\:/[['$ns':/g' $file || exit 1
        done
    fi
fi

# move namespace directory
if [ -d "$nsold_dir" ]; then
    echo "Move old page namespace to new location"
    echo "  from: $nsold_dir"
    echo "  to:   $ns_dir"
    read -p "(C)ontinue, (S)kip, (A)bort: " RESULT
    case "$RESULT" in
        c|C) mv "$nsold_dir" "$ns_dir" || exit 1
            ;;
        s|S) :
            ;;
        *)  echo "Aborted by user"; exit 1;;
    esac
fi


# move media namespace diretory
media_old="$DOKU_MEDIA/${nsold//://}"
if [ -d "$media_old" ]; then
    media_new="$DOKU_MEDIA/${ns//://}"
    echo "Move old media namespace to new location"
    echo "  from: $media_old"
    echo "  to:   $media_new"
    read -p "(C)ontinue, (S)kip, (A)bort: " RESULT
    case "$RESULT" in
        c|C) mv "$media_old" "$media_new" || exit 1
            ;;
        s|S) :
            ;;
        *)  echo "Aborted by user"; exit 1;;
    esac
fi

echo "Done."

----------------

#!/usr/bin/php
<?php
#
# dw_savedir - Return the full path of the data directory for the given Dokuwiki (basedir)
#
$wikidir = $argv[1];

$STDERR = fopen('php://stderr', 'w+');
if($argc < 2){
    fwrite($STDERR, "Usage: ".basename($argv[0])." WIKIDIR\n");
    exit(1);
}
if(!is_file($wikidir.'/inc/init.php')){
fwrite($STDERR, "Given dir does not point to a dokuwiki: $wikidir \n");
    exit(1);
}
$wikidir = realpath($wikidir);
require_once($wikidir.'/inc/init.php');
$savedir = $conf['savedir'];
# is it relative?
if(substr($savedir,0,1) == '.'){
    $savedir = $wikidir.'/'.$savedir;
}
print realpath($savedir)."\n";
?>

--
DokuWiki mailing list - more info at
http://wiki.splitbrain.org/wiki:mailinglist

Other related posts: