From: Charles Roussel <charles.roussel@xxxxxxxxxx> install_wiki.sh expects the first argument to be 'install' or 'delete' 'install' installs a MediaWiki on the web's server with SQLite3 'delete' deletes the previously created wiki. Note those functionnalities are made to be used from the user command line in the directory t/ install_wiki also defines a function cmd_reset which clear all content of the previously created wiki. Note this functionnality is made to be used only by our test function in a subdirectory of t/ Signed-off-by: Guillaume Sasdy <guillaume.sasdy@xxxxxxxxxxxxxxx> Signed-off-by: Simon Cathebras <Simon.Cathebras@xxxxxxxxxxxxxxx> Signed-off-by: Simon Perrat <Simon.Perrat@xxxxxxxxxxxxxxx> Signed-off-by: Charles Roussel <Charles.Roussel@xxxxxxxxxxxxxxx> Signed-off-by: Julien Khayat <Julien.Khayat@xxxxxxxxxxxxxxx> --- t/install-wiki.sh | 38 ++++++++++ t/install-wiki/LocalSettings.php | 129 ++++++++++++++++++++++++++++++++++ t/install-wiki/wikidb.sqlite | Bin 0 -> 210944 bytes t/test-gitmw-lib.sh | 147 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 314 insertions(+) create mode 100755 t/install-wiki.sh create mode 100644 t/install-wiki/LocalSettings.php create mode 100644 t/install-wiki/wikidb.sqlite create mode 100755 t/test-gitmw-lib.sh mode change 100644 => 100755 t/test-lib-functions.sh mode change 100644 => 100755 t/test-lib.sh diff --git a/t/install-wiki.sh b/t/install-wiki.sh new file mode 100755 index 0000000..322f46d --- /dev/null +++ b/t/install-wiki.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# This script installs or deletes a MediaWiki on your computer. +# It requires a web server with PHP and SQLite running. In addition, if you +# do not have MediaWiki sources on your computer, the option 'install' +# downloads them for you. +# Please set the CONFIGURATION VARIABLES in ./test-gitmw-lib.sh + +. ./test-gitmw-lib.sh + +usage () { + echo "Usage: " + echo " ./install-wiki.sh <install|delete|--help|-h>" + echo " install: Install a wiki on your computer." + echo " delete: Delete the wiki and all its pages and content" +} + + +# Argument: install, delete, --help | -h +case "$1" in + "install") + wiki_install + exit 0 + ;; + "delete") + wiki_delete + exit 0 + ;; + "--help" | "-h") + usage + exit 0 + ;; + *) + usage + exit 0 + ;; +esac + diff --git a/t/install-wiki/LocalSettings.php b/t/install-wiki/LocalSettings.php new file mode 100644 index 0000000..c2fe3d5 --- /dev/null +++ b/t/install-wiki/LocalSettings.php @@ -0,0 +1,129 @@ +<?php +# This file was automatically generated by the MediaWiki 1.19.0 +# installer. If you make manual changes, please keep track in case you +# need to recreate them later. +# +# See includes/DefaultSettings.php for all configurable settings +# and their default values, but don't forget to make changes in _this_ +# file, not there. +# +# Further documentation for configuration settings may be found at: +# http://www.mediawiki.org/wiki/Manual:Configuration_settings + +# Protect against web entry +if ( !defined( 'MEDIAWIKI' ) ) { + exit; +} + +## Uncomment this to disable output compression +# $wgDisableOutputCompression = true; + +$wgSitename = "Git-MediaWiki-Test"; +$wgMetaNamespace = "Git-MediaWiki-Test"; + +## The URL base path to the directory containing the wiki; +## defaults for all runtime URL paths are based off of this. +## For more information on customizing the URLs please see: +## http://www.mediawiki.org/wiki/Manual:Short_URL +$wgScriptPath = "@WG_SCRIPT_PATH@"; +$wgScriptExtension = ".php"; + +## The protocol and server name to use in fully-qualified URLs +$wgServer = "@WG_SERVER@"; + +## The relative URL path to the skins directory +$wgStylePath = "$wgScriptPath/skins"; + +## The relative URL path to the logo. Make sure you change this from the default, +## or else you'll overwrite your logo when you upgrade! +$wgLogo = "$wgStylePath/common/images/wiki.png"; + +## UPO means: this is also a user preference option + +$wgEnableEmail = true; +$wgEnableUserEmail = true; # UPO + +$wgEmergencyContact = "apache@localhost"; +$wgPasswordSender = "apache@localhost"; + +$wgEnotifUserTalk = false; # UPO +$wgEnotifWatchlist = false; # UPO +$wgEmailAuthentication = true; + +## Database settings +$wgDBtype = "sqlite"; +$wgDBserver = ""; +$wgDBname = "wikidb"; +$wgDBuser = ""; +$wgDBpassword = ""; + +# SQLite-specific settings +$wgSQLiteDataDir = "@WG_SQLITE_DATADIR@"; + + +## Shared memory settings +$wgMainCacheType = CACHE_NONE; +$wgMemCachedServers = array(); + +## To enable image uploads, make sure the 'images' directory +## is writable, then set this to true: +$wgEnableUploads = false; +$wgUseImageMagick = true; +$wgImageMagickConvertCommand ="@CONVERT@"; + +# InstantCommons allows wiki to use images from http://commons.wikimedia.org +$wgUseInstantCommons = false; + +## If you use ImageMagick (or any other shell command) on a +## Linux server, this will need to be set to the name of an +## available UTF-8 locale +$wgShellLocale = "en_US.utf8"; + +## If you want to use image uploads under safe mode, +## create the directories images/archive, images/thumb and +## images/temp, and make them all writable. Then uncomment +## this, if it's not already uncommented: +#$wgHashedUploadDirectory = false; + +## Set $wgCacheDirectory to a writable directory on the web server +## to make your wiki go slightly faster. The directory should not +## be publically accessible from the web. +#$wgCacheDirectory = "$IP/cache"; + +# Site language code, should be one of the list in ./languages/Names.php +$wgLanguageCode = "en"; + +$wgSecretKey = "1c912bfe3519fb70f5dc523ecc698111cd43d81a11c585b3eefb28f29c2699b7"; +#$wgSecretKey = "@SECRETKEY@"; + + +# Site upgrade key. Must be set to a string (default provided) to turn on the +# web installer while LocalSettings.php is in place +$wgUpgradeKey = "ddae7dc87cd0a645"; + +## Default skin: you can change the default skin. Use the internal symbolic +## names, ie 'standard', 'nostalgia', 'cologneblue', 'monobook', 'vector': +$wgDefaultSkin = "vector"; + +## For attaching licensing metadata to pages, and displaying an +## appropriate copyright notice / icon. GNU Free Documentation +## License and Creative Commons licenses are supported so far. +$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright +$wgRightsUrl = ""; +$wgRightsText = ""; +$wgRightsIcon = ""; + +# Path to the GNU diff3 utility. Used for conflict resolution. +$wgDiff3 = "/usr/bin/diff3"; + +# Query string length limit for ResourceLoader. You should only set this if +# your web server has a query string length limit (then set it to that limit), +# or if you have suhosin.get.max_value_length set in php.ini (then set it to +# that value) +$wgResourceLoaderMaxQueryLength = -1; + + + +# End of automatically generated settings. +# Add more configuration options below. + diff --git a/t/install-wiki/wikidb.sqlite b/t/install-wiki/wikidb.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..809047334bf15891de943b480171beb2558f7cb8 GIT binary patch literal 210944 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 literal 0 HcmV?d00001 diff --git a/t/test-gitmw-lib.sh b/t/test-gitmw-lib.sh new file mode 100755 index 0000000..b1023d7 --- /dev/null +++ b/t/test-gitmw-lib.sh @@ -0,0 +1,147 @@ +# +# CONFIGURATION VARIABLES +# You might want to change those ones ... +# +WIKI_DIR_NAME="wiki" # Name of the wiki's directory +WIKI_DIR_INST="/var/www" # Directory of the web server +TMP="/tmp" # Temporary directory for downloads + # Absolute address needed! +SERVER_ADDR="localhost" # Web server's address + +# +# CONFIGURATION +# You should not change those ones unless you know what you to +# +# Do not change the variables below +MW_VERSION="mediawiki-1.19.0" +DB_FILE="wikidb.sqlite" +FILES_FOLDER="install-wiki" +WIKI_ADMIN="WikiAdmin" +WIKI_PASSW="AdminPass" + +fail () { + echo "$1" + exit 1 +} + + + +# Install a wiki in your web server directory. +wiki_install () { + + # Copy the generic LocalSettings.php in the web server's directory + # And modify parameters according to the ones set at the top + # of this script. + # Note that LocalSettings.php is never modified. + if [ ! -f "$FILES_FOLDER/LocalSettings.php" ] ; then + fail "Can't find $FILES_FOLDER/LocalSettings.php " \ + "in the current folder. + Please run the script inside its folder." + fi + cp "$FILES_FOLDER/LocalSettings.php" \ + "$FILES_FOLDER/LocalSettings-tmp.php" || + fail "Unable to copy $FILES_FOLDER/LocalSettings.php " \ + "to $FILES_FOLDER/LocalSettings-tmp.php" + + # Parse and set the LocalSettings file of the user according to the + # CONFIGURATION VARIABLES section at the beginning of this script + file_swap="$FILES_FOLDER/LocalSettings-swap.php" + sed "s,@WG_SCRIPT_PATH@,/$WIKI_DIR_NAME," \ + "$FILES_FOLDER/LocalSettings-tmp.php" > "$file_swap" + mv "$file_swap" "$FILES_FOLDER/LocalSettings-tmp.php" + sed "s,@WG_SERVER@,http://$SERVER_ADDR," \ + "$FILES_FOLDER/LocalSettings-tmp.php" > "$file_swap" + mv "$file_swap" "$FILES_FOLDER/LocalSettings-tmp.php" + sed "s,@WG_SQLITE_DATADIR@,$TMP," \ + "$FILES_FOLDER/LocalSettings-tmp.php" > "$file_swap" + mv "$file_swap" "$FILES_FOLDER/LocalSettings-tmp.php" + + mkdir -p "$WIKI_DIR_INST/$WIKI_DIR_NAME" + if [ ! -d "$WIKI_DIR_INST/$WIKI_DIR_NAME" ] ; then + fail "Folder $WIKI_DIR_INST/$WIKI_DIR_NAME doesn't exist. Please create it + and launch the script again." + fi + + mv "$FILES_FOLDER/LocalSettings-tmp.php" \ + "$WIKI_DIR_INST/$WIKI_DIR_NAME/LocalSettings.php" || + fail "Unable to move $FILES_FOLDER/LocalSettings-tmp.php" \ + "in $WIKI_DIR_INST/$WIKI_DIR_NAME" + echo "File $FILES_FOLDER/LocalSettings.php is set in $WIKI_DIR_INST/$WIKI_DIR_NAME" + + chmod ugo+w "$FILES_FOLDER/$DB_FILE" + reset_db_wiki "." + + # Fetch MediaWiki's archive if not already present in the TMP directory + cd "$TMP" + if [ ! -f "$MW_VERSION.tar.gz" ] ; then + echo "Downloading $MW_VERSION sources ..." + wget http://download.wikimedia.org/mediawiki/1.19/mediawiki-1.19.0.tar.gz || + fail "Unable to download" \ + "http://download.wikimedia.org/mediawiki/1.19/mediawiki-1.19.0.tar.gz. + Please fix your connection and launch the script again." + fi + tar xfz "$MW_VERSION.tar.gz" + echo "$MW_VERSION.tar.gz downloaded in `pwd`. You can delete it later if you want." + + # Copy the files of MediaWiki wiki in the web server's directory. + cd "$MW_VERSION" + cp -Rf * "$WIKI_DIR_INST/$WIKI_DIR_NAME/" || + fail "Unable to copy WikiMedia's files from `pwd` to $WIKI_DIR_INST/$WIKI_DIR_NAME" + + set_admin_wiki + + echo "Your wiki has been installed. You can check it at http://$SERVER_ADDR/$WIKI_DIR_NAME" +} + +# Copy the initial database of the wiki over the actual one. +# Argument $1 is the relative path to the folder $FILES_FOLDER +# +# Warning: This function should be not called by user. This is a private +# function used by wiki_install and wiki_delete +reset_db_wiki () { + + # Copy initial database of the wiki + if [ ! -f "$1/$FILES_FOLDER/$DB_FILE" ] ; then + fail "Can't find $1/$FILES_FOLDER/$DB_FILE in the current folder." + fi + cp --preserve=mode,ownership "$1/$FILES_FOLDER/$DB_FILE" "$TMP" || + fail "Can't copy $1/$FILES_FOLDER/$DB_FILE in $TMP" + echo "File $FILES_FOLDER/$DB_FILE is set in $TMP" +} + +# Set the admin WikiAdmin with password AdminPass in the database. +# +# Warning: This function should be not called by user. This is a private +# function used by wiki_install and wiki_delete +set_admin_wiki () { + + #Add the admin + my_pwd="`pwd`" + cd "$WIKI_DIR_INST/$WIKI_DIR_NAME/maintenance/" + php changePassword.php --user="$WIKI_ADMIN" --password="$WIKI_PASSW" || + fail "Unable to add an admin with the script $WIKI_DIR_INST/$WIKI_DIR_NAME/maintenance/ + changePassword.php. Check you have the perms to do it." + echo "Admin \"$WIKI_ADMIN\" has password \"$WIKI_PASSW\"" + cd "$my_pwd" +} + +# Reset the database of the wiki and the password of the admin +# +# Warning: This function must be called only in a subdirectory of t/ directory +wiki_reset () { + reset_db_wiki ".." + set_admin_wiki +} + +# Delete the wiki created in the web server's directory and all its content +# saved in the database. +wiki_delete () { + # Delete the wiki's directory. + rm -rf "$WIKI_DIR_INST/$WIKI_DIR_NAME" || + fail "Wiki's directory $WIKI_DIR_INST/" \ + "$WIKI_DIR_NAME could not be deleted" + + # Delete the wiki's SQLite database + rm -f "$TMP/$DB_FILE" || fail "Database $TMP/$DB_FILE could not be deleted." +} + diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh old mode 100644 new mode 100755 diff --git a/t/test-lib.sh b/t/test-lib.sh old mode 100644 new mode 100755 -- 1.7.10.2.568.g4c26a3a -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html