Explorar el Código

Creacion del repositorio

Damian Zhaoying hace 2 años
commit
223ca75736

+ 8 - 0
README.txt

@@ -0,0 +1,8 @@
+SLOODLE Development Tools
+Edmund Edgar, 2012-05-19
+
+This repo contains tools used in creating and managing SLOODLE, a free and open source project which integrates the multi-user virtual environments of Second Life and/or OpenSim with the Moodle learning-management system.
+
+It would normally only be useful for people developing the project.
+
+See http://www.sloodle.org for more information about SLOODLE, and post any questions or comments in the forums there.

+ 3 - 0
backup_restore/README.txt

@@ -0,0 +1,3 @@
+These scripts were used in developing the backup and restore functionality of sloodle 2.
+
+They contain some hard-coded IDs that would need to be replaced to make them useful to anyone else.

+ 70 - 0
backup_restore/backuptest.php

@@ -0,0 +1,70 @@
+<?php
+$_SERVER = array();
+$_SERVER['SERVER_NAME'] = 'gershwinklata1.avatarclassroom.com';
+ 
+define('CLI_SCRIPT', 1);
+require_once('config.php');
+require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
+
+$backup_types = array(
+    'course' => backup::TYPE_1COURSE,
+    'activity' => backup::TYPE_1ACTIVITY
+);
+
+if (count($argv) < 3) {
+    print "Usage: ".$argv[0]." <user> <type> <course_or_activity_id> [<file_to_show_afterwards>]\n";
+    exit;
+}
+
+$user_doing_the_backup   = intval($argv[1]); //2; // Set this to the id of your admin accouun
+
+$backup_type_arg = $argv[2];
+
+if (!isset($backup_types[$backup_type_arg])) {
+    print "Backup type $backup_type_arg not supported.\n";
+    exit;
+}
+
+$backup_type = $backup_types[$backup_type_arg];
+
+//$course_module_to_backup = 2; // Set this to one existing choice cmid in your dev site
+$course_module_to_backup = intval($argv[3]); //27; //3; // Set this to one existing choice cmid in your dev site
+
+if (!$course_module_to_backup || !$user_doing_the_backup) {
+    print "Parameters wrong\n";
+    exit;
+}
+
+ 
+$bc = new backup_controller($backup_type, $course_module_to_backup, backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $user_doing_the_backup);
+//$bc = new backup_controller(backup::TYPE_1COURSE, $course_module_to_backup, backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $user_doing_the_backup);
+
+$bc->execute_plan();
+
+
+$backupdir = '../resources/moodledata/temp/backup';
+
+$folder = null;
+$highestmtime = 0;
+foreach (glob($backupdir.'/*') as $f) {
+    if (!is_dir($f)) {
+        continue;
+    }
+    if ( !$folder || (filemtime($f) > $highestmtime) ) {
+        $folder = $f;
+        $highestmtime = filemtime($f);
+    }
+}
+
+//$folderbits = explode('/',$folder);
+//$folder = array_pop($folderbits);
+
+print "\n\n";
+print "Most recent backup folder, probably the one I created: \n";
+print "$folder\n";
+
+if (isset($argv[4])) {
+    if ($cmd = $argv[4]) {
+        echo `cat $folder/$argv[4]`;
+    }
+}

+ 104 - 0
backup_restore/restoretest.php

@@ -0,0 +1,104 @@
+<?php
+$_SERVER = array();
+$_SERVER['SERVER_NAME'] = 'gershwinklata1.avatarclassroom.com';
+
+define('CLI_SCRIPT', 1);
+require_once('config.php');
+require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
+require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
+
+$backup_types = array(
+    'course' => backup::TYPE_1COURSE,
+    'activity' => backup::TYPE_1ACTIVITY
+);
+
+if (count($argv) < 2) {
+    print "Usage: ".$argv[0]." <user> <type> <course> [<backup_folder>]\n";
+    exit;
+}
+
+$user_doing_the_backup   = intval($argv[1]); //2; // Set this to the id of your admin accouun
+
+$backup_type_arg = $argv[2];
+
+if (!isset($backup_types[$backup_type_arg])) {
+    print "Backup type $backup_type_arg not supported.\n";
+    exit;
+}
+
+//$course_module_to_backup = 2; // Set this to one existing choice cmid in your dev site
+$courseid = intval($argv[3]); //27; //3; // Set this to one existing choice cmid in your dev site
+
+if (!$user_doing_the_backup) {
+    print "Parameters wrong\n";
+    exit;
+}
+
+if (!$courseid && ($backup_type == backup::TYPE_1ACTIVITY) ) {
+    print "For a backup of type $backup_type_arg, you need to specify a course ID to restore to.\n";
+    exit;
+}
+
+$backupdir = '../resources/moodledata/temp/backup';
+
+if (isset($argv[4])) {
+
+    $folder = $argv[4];
+
+} else {
+     
+    $folder = null;
+    $highestmtime = 0;
+    foreach (glob($backupdir.'/*') as $f) {
+        if (!is_dir($f)) {
+            continue;
+        }
+        if ( !$folder || (filemtime($f) > $highestmtime) ) {
+            $folder = $f;
+            $highestmtime = filemtime($f);
+        }
+    }   
+
+    $folderbits = explode('/',$folder); 
+    $folder = array_pop($folderbits);
+
+}
+
+echo "About to start restore from backup folder $folder\n";
+
+if (!$courseid) {
+ // Get or create category.
+    $categoryname = 'Restore test';
+    $categoryid = $DB->get_field( 'course_categories', 'id', array('name'=>$categoryname) );
+    if (!$categoryid) {
+      $categoryid = $DB->insert_record( 'course_categories', (object)array(
+        'name' => $categoryname,
+        'parent' => 0,
+        'visible' => 0
+      ));
+      $DB->set_field( 'course_categories', 'path', '/' . $categoryid, array('id'=>$categoryid) );
+    }
+
+    $shortname = 'Restore ' . date( 'His' );
+    $fullname = 'Restore Test ' . date( 'Y-m-d H:i:s' );
+
+    // Create new course.
+    $courseid = restore_dbops::create_new_course( $fullname, $shortname, $categoryid );
+
+} 
+
+// Transaction
+$transaction = $DB->start_delegated_transaction();
+
+// Create new course
+//$courseid = restore_dbops::create_new_course($fullname, $shortname, $categoryid);
+
+// Restore backup into course
+$controller = new restore_controller($folder, $courseid, 
+        backup::INTERACTIVE_NO, backup::MODE_SAMESITE, $user_doing_the_backup,
+        backup::TARGET_NEW_COURSE);
+$controller->execute_precheck();
+$controller->execute_plan();
+
+// Commit
+$transaction->allow_commit();

+ 54 - 0
deployment/latest.php

@@ -0,0 +1,54 @@
+<?php
+$v = isset($_REQUEST['v']) ? intval($_REQUEST['v']) : 0;
+
+$ext_regex = ( isset($_REQUEST['format']) && ($_REQUEST['format'] == 'zip') ) ? '\.zip' : '\.tar\.gz';
+$ext_regex = ( isset($_REQUEST['format']) && ($_REQUEST['format'] == 'iar') ) ? '\.iar' : $ext_regex;
+
+$filename = 'sloodle';
+if ($ext_regex == '\.iar') {
+    $filename = 'sloodle_rezzer';
+}
+
+$fh = opendir('.');
+
+$highest_major = 0;
+$highest_minor = 0;
+$highest_point = 0;
+$highest_filename = '';
+
+while (false !== ($entry = readdir($fh))) {
+	if (preg_match('/^'.$filename.'_v(\d+)\.(\d+)\.(\d+).*?'.$ext_regex.'$/', $entry, $matches) ) {
+		$major = $matches[1];
+		$minor = $matches[2];
+		$point = $matches[3];
+		$highest = false;
+
+		if ( ($v > 0) && ($major != $v) ) {
+			continue;	
+		}
+
+		if ($major > $highest_major) {
+			$highest = true;	
+		} else if ( ($major == $highest_major) && ($minor > $highest_minor) ) {
+			$highest = true;	
+		} else if ( ($major == $highest_major) && ($minor == $highest_minor) && ($point > $highest_point) ) {
+			$highest = true;	
+		}
+		if ($highest) {
+			$highest_major = $major;
+			$highest_minor = $minor;
+			$highest_point = $point;
+			$highest_filename = $entry;
+		}
+	}
+}
+
+if ($highest_filename != '') {
+	header('Location: '.$highest_filename);
+	exit;
+}
+header('HTTP/1.0 404 Not Found'); 
+print "File not found.";
+exit;
+
+?>

+ 115 - 0
deployment/make_tarballs.sh

@@ -0,0 +1,115 @@
+#!/bin/sh
+#
+# Script to generate a tarball / zip file based on a tag from git.
+# (C) Edmund Edgar, 2011-0831-
+# Licensed under the GPL v2 - see sloodle/COPYING for details.
+
+TAR=/bin/tar
+ZIP="/usr/bin/zip -q"
+SLOODLETOPDIR=moodle_wwwroot
+
+if [ "$1" = "" ]; then
+   echo "Usage: sloodle_development_tools/deployment/make_tarball.sh <tag> <working_dir> <location>"
+   exit
+fi
+
+if [ "$2" = "" ]; then
+   echo "Usage: sloodle_development_tools/deployment/make_tarball.sh <tag> <working_dir> <location>"
+   exit
+fi
+
+if [ "$3" = "" ]; then
+   echo "Usage: sloodle_development_tools/deployment/make_tarball.sh <tag> <working_dir> <location>"
+   exit
+fi
+
+echo $TAG;
+
+TAG=$1
+WORKINGDIR=$2
+SAVEDIR=$3
+
+if [ -d "$WORKINGDIR" ]; then
+   echo "Error: Working directory $WORKINGDIR already exists, exiting."
+   exit
+else
+   mkdir "$WORKINGDIR"
+fi
+
+echo "Creating tarball and zip for tag $TAG"
+mkdir "$WORKINGDIR/$SLOODLETOPDIR"
+cd "$WORKINGDIR/$SLOODLETOPDIR"
+
+# Everything goes under moodle_wwwroot
+
+# The module goes under mod/sloodle
+mkdir mod
+cd mod
+wget -O "$TAG.tar.gz" "https://github.com/sloodle/moodle-mod_sloodle/tarball/$TAG"
+tar zxvf "$TAG.tar.gz"
+rm "$TAG.tar.gz"
+mv sloodle-moodle-* sloodle
+cd ..
+
+# The two blocks go under blocks/
+
+
+
+mkdir blocks
+cd blocks
+
+wget -O "$TAG.tar.gz" "https://github.com/sloodle/moodle-block_sloodle_menu/tarball/$TAG"
+tar zxvf "$TAG.tar.gz"
+rm "TAG.tar.gz"
+mv sloodle-moodle-* sloodle_menu
+
+wget -O "$TAG.tar.gz" "https://github.com/sloodle/moodle-block_sloodle_backpack/tarball/$TAG"
+tar zxvf "$TAG.tar.gz"
+rm "$TAG.tar.gz"
+mv sloodle-moodle-* sloodle_backpack
+
+cd ..
+
+# The assignment plugin goes under mod/assignment/type
+
+mkdir mod/assignment
+mkdir mod/assignment/type
+cd mod/assignment/type
+
+wget -O "$TAG.tar.gz" "https://github.com/sloodle/moodle-assignment_sloodleobject/tarball/$TAG"
+tar zxvf "$TAG.tar.gz"
+rm "$TAG.tar.gz"
+mv sloodle-moodle-* sloodleobject
+
+cd ../../..
+
+cd ..
+${TAR} zcf "${SAVEDIR}/sloodle_${TAG}.tar.gz" ${SLOODLETOPDIR}/
+${ZIP} "${SAVEDIR}/sloodle_${TAG}.zip" -r ${SLOODLETOPDIR}/
+
+cd ..
+rm -rf "${WORKINGDIR}"
+
+mkdir "${WORKINGDIR}"
+
+wget -O "$TAG.tar.gz" "https://github.com/sloodle/sloodle_opensim_iar/tarball/$TAG"
+tar zxvf "$TAG.tar.gz"
+rm "$TAG.tar.gz"
+cd sloodle-sloodle_opensim_iar-*/iar
+cd iar
+tar zcvf "${SAVEDIR}/sloodle_rezzer_${TAG}.iar" archive.xml inventory/* assets/*
+cd ../../..
+rm -rf "${WORKINGDIR}"
+
+
+
+mkdir "${WORKINGDIR}"
+
+wget -O "$TAG.tar.gz" "https://github.com/edmundedgar/avatarclassroom_opensim_iar/tarball/$TAG"
+tar zxvf "$TAG.tar.gz"
+rm "$TAG.tar.gz"
+cd edmundedgar-avatarclassroom_opensim_iar-*/iar
+cd iar
+tar zcvf "${SAVEDIR}/avatarclassroom_rezzer_${TAG}.iar" archive.xml inventory/* assets/*
+cd ../../..
+rm -rf "${WORKINGDIR}"

+ 6 - 0
deployment/normal_build.sh

@@ -0,0 +1,6 @@
+#!/bin/sh
+TAG=$1
+./tag_release.sh $TAG tmp release-v2.1 1
+./make_tarballs.sh $TAG tmp /var/www/download/webroot/sloodle/
+
+

+ 283 - 0
deployment/public_distributor.php

@@ -0,0 +1,283 @@
+<?php
+/**
+*
+* Script for exposing a distributor object to public web access.
+* This is intended for use only on the servers of people who want to run a distributor for Sloodle objects.
+*
+* ( However, functionality that accesses it to send the avatar of their choice suitable objects 
+* for their Sloodle install, once written, is intended to go into the regular Sloodle distribution. )
+* 
+* It should be installed under mod/sloodle, ie. in the same directory as init.php
+*
+* Parts of this script require manual configuration. (See below)
+*
+* Distributor functionality is based on that used in view/distributor.php
+* 
+* WARNING: 
+*   As of 2009-12-18, this script does not respect course permissions or distributor public / group settings.
+*   Ideally, it should probably ignore course permissions but only run if the distributor is public.
+*   Since it is anticipated that only a few people will want to run it on their servers, it should probably either:
+*      a) Not be included in the standard Sloodle distribution, or
+*      b) Included, but with an "exit" right at the start so that it only runs if manually altered.
+*   For now, we'll check it into tools/distribution/, and install it manually where we need it.
+*
+* Usage examples: 
+* 
+* Send the object "thing" in the distributor with ID 14 to the user with the key 746ad236-d28d-4aab-93de-1e09a076c5f3
+* http://dev1.socialminds.jp/mod/sloodle/public_distributor.php?id=14&object=thing&user=746ad236-d28d-4aab-93de-1e09a076c5f3
+*
+* Send the object "thing" in the distributor with ID 14 to the user with the name Edmund Earp
+* http://dev1.socialminds.jp/mod/sloodle/public_distributor.php?id=14&object=thing&av_name=Edmund%20Earp
+*
+* @package sloodle
+* @copyright Copyright (c) 2008 to 2010 Sloodle (various contributors)
+* @license http://www.gnu.org/licenses/gpl-3.0.html GNU GPL v3
+*
+* @contributor Edmund Edgar, KK Social Minds
+* @contributor Peter R. Bloomfield
+*/
+
+//
+// Manual configuration begins
+//
+
+// List the name2key services you want to use here.
+$name2keyServices = array(
+	'http://vision-tech.org/name2key/search.php?name=' => 'LookupBasedName2KeyService',
+	'http://kdc.ethernia.net/sys/name2key.php' => 'GenericName2KeyService'
+);
+
+/* 
+If you want to receive alerts when this service is about to break, put your address and the failure threshold here.
+Probably best to keep at least one provider in reserve, eg. if you have 3 providers, have it warn you when the first 2 go down.
+*/
+$warningMailAddressesAndThresholds = array(
+	'you@example.com' => 2
+);
+
+//
+// Manual configuration ends
+//
+
+/** SLOODLE and Moodle configuration */
+require_once('init.php');
+/** General SLOODLE library functionality */
+require_once(SLOODLE_LIBROOT.'/general.php');
+
+// Get the distributor course module ID from a URL parameter.
+// NB If it turns out that it's hard to keep these stable over time,
+// ...it may be better to hard-code the distributor ID here
+// ...or to remove it and wrap this script in another one, 
+// ...eg. distributor_stable_1_0.php would set $id for the 1.0 stable distributor, then include this file
+$id = required_param('id', PARAM_INT);
+if (!$cm = get_coursemodule_from_id('sloodle', $id)) error('Course module ID was incorrect.');
+
+// Ignore the course data. If there's a public distributor, we'll let anyone use it.
+// The following was in the original view/distributor.php
+/*
+// Fetch the course data
+if (!$this->course = get_record('course', 'id', $this->cm->course)) error('Failed to retrieve course.');
+$this->sloodle_course = new SloodleCourse();
+if (!$this->sloodle_course->load($this->course)) error(get_string('failedcourseload', 'sloodle'));
+*/
+
+// Fetch the SLOODLE instance itself
+if (!$sloodle = sloodle_get_record('sloodle', 'id', $cm->instance)) error('Failed to find SLOODLE module instance');
+
+if (!$distributor = sloodle_get_record('sloodle_distributor', 'sloodleid', $sloodle->id)) error('Failed to get SLOODLE Distributor data.');
+
+$entries = sloodle_get_records('sloodle_distributor_entry', 'distributorid', $distributor->id, 'name');
+
+// If the query failed, then assume there were simply no items available
+if (!is_array($entries)) $entries = array();
+$numitems = count($entries);
+
+if (isset($_REQUEST['user'])) $send_user = $_REQUEST['user'];
+if (isset($_REQUEST['object'])) $send_object = $_REQUEST['object'];
+if (isset($_REQUEST['av_name'])) $av_name = $_REQUEST['av_name'];
+
+// If we don't have the avatar key but we do have their name, try to look up the key based on the name
+if ( empty($send_user) && ( !empty($av_name) ) ) {
+
+	$atLeastOneServiceSucceeded = false;
+
+	// Try to do a lookup on a name2key service
+	$failedServices = array();
+	foreach( $name2keyServices as $url => $cls ) {
+
+		$service = new $cls();
+		$service->setServiceBaseURL( $url );
+		$service->setAvatarName( $av_name );
+
+		if ( $service->lookup() ) {
+			$atLeastOneServiceSucceeded = true;
+			if ( $service->foundKey() ) {
+				$send_user = $service->uuid();
+				break;
+			} else if ( $service->isExhaustive() ) {
+				// The service confirmed that they key doesn't exist, so we won't trouble the other services
+				break;
+			}						
+			// If we couldn't find the key but the service may just not know about it, stay in the loop and try the next one
+		} else {
+			// The service failed to respond or its response didn't make sense, so keep going and try the next one
+			// We'll make a note of the fact that it failed so that we can tell the administrator if too many services are broken.
+			$failedServices[] = $service->queryURL();
+		}
+
+	}
+
+	if ( ( count($failedServices) > 0 ) && ( count($warningMailAddressesAndThresholds) > 0 ) ) {
+
+		foreach( $warningMailAddressesAndThresholds as $emailaddress => $threshold ) {
+			if ( count($failedServices) >= $threshold ) {
+				mail( $emailaddress, 'Sloodle name2key lookups failing', "The following lookups failed: \n".join("\n",$failedServices)."\n\nThis is above your warning threshold of $threshold.\n" );
+			}	
+		}
+
+	}
+
+	if ( !$atLeastOneServiceSucceeded ) {
+		print 'sloodleobjectdistributor:allkey2nameservicesfailed'."\n";
+		exit;
+	}
+
+	if ( empty( $send_user ) ) {
+		print 'sloodleobjectdistributor:keyfornamenotfound'."\n";
+		exit;
+	}
+	
+}
+
+if (empty($distributor->channel)) {
+	print 'sloodleobjectdistributor:nochannel'."\n";
+	exit;
+}
+
+// If the user and object parameters are set, then try to send an object
+if (!empty($send_user) && !empty($send_object)) {
+
+	// Convert the HTML entities back again
+	$send_object = htmlentities(stripslashes($send_object));
+
+	// Construct and send the request
+	$request = "1|OK\\nSENDOBJECT|$send_user|$send_object";
+	$ok = sloodle_send_xmlrpc_message($distributor->channel, 0, $request);
+
+	// What was the result?
+	if ($ok) {
+		print 'sloodleobjectdistributor:successful'."\n";
+	} else {
+		print 'sloodleobjectdistributor:failed'."\n";
+	}
+	print 'Object'.': '.$send_object."\n";
+	print 'uuid'.': '.$send_user."\n";
+	exit;
+
+}
+ 
+if ($numitems < 1) {
+	print 'sloodleobjectdistributor:noobjects'."\n";
+	exit;
+}
+
+foreach ($entries as $e) {
+	print $e->name."\n";
+}
+
+/*
+	The following is based on how http://name2key.alpha-fox.com works.
+	You just append /?name= to the URL, followed by the avatar name...
+	... and it returns either the name or the null key 00000000-0000-0000-0000-000000000000
+	This seems pretty standard - hopefully any other service we will need to use will work this way too.
+	If they don't, make a new class inheriting from GenericName2KeyService and override whatever they do differently.	
+*/
+class GenericName2KeyService {
+	
+	var $_av_name = null;
+	var $_base_url = null;
+
+	var $_result = '';
+
+	function setServiceBaseURL( $url ) {
+		// eg http://name2key.alpha-fox.com
+		$this->_base_url = $url;
+	}
+
+	function setAvatarName( $av_name) {
+		$this->_av_name = $av_name;
+	}
+
+	function queryURL() {
+		return $this->_base_url.'/?name='.urlencode($this->_av_name);
+	}
+
+	// Do a lookup, and return true if the lookup goes as expected.
+	// NB This will return true even if we couldn't find the key...
+	// ... which we'll consider a successful lookup that successfully told us that the service didn't know an avatar of that name.
+	// Use foundKey() to find out whether the key was actually there or not.
+	function lookup() {
+
+		$ch = curl_init();
+		curl_setopt( $ch, CURLOPT_URL, $this->queryURL() );
+		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
+		curl_setopt( $ch, CURLOPT_TIMEOUT,$this->timeout() ); 
+		$result = curl_exec($ch);
+		if ( $result ) {	
+			$this->_result = $this->cleanResult( $result );
+			return $this->isResultExpectedFormat( $result );
+		}
+		return false;	
+
+	}
+
+	// clean the result after we get it back
+	// if there's a new line or something, strip it.
+	function cleanResult( $result ) {
+		$result = preg_replace('/\n/', '', $result);
+		$result = preg_replace('/\r/', '', $result);
+		return $result;
+	}
+
+	// We should get either a key or a null key.
+	// Anything else - say an error message - will be considered a failure.
+	function isResultExpectedFormat( $result ) {
+		return ( preg_match('/^........-....-....-....-............$/', $result ) ); 
+	}
+
+	// Return true if we found a key
+	function foundKey() {
+		return ( ( $this->_result != '' ) && ( $this->_result != '00000000-0000-0000-0000-000000000000' ) ); 	
+	}
+
+	function uuid() {
+		if ( $this->foundKey() ) {
+			return $this->_result;
+		} else {
+			return null;
+		}
+	}
+
+	// Return true if the service claims to be able to reach all the keys on the grid.
+	// Lookup-based services should be able to do this, while database-based services should not.
+	function isExhaustive() {
+		return false;
+	}
+
+	// timeout in seconds after which we should give up waiting for a service.
+	// bear in mind that we may try several services, while the user's waiting, so we shouldn't make this too long.
+	function timeout() {
+		return 10;
+	}
+
+}
+
+class LookupBasedName2KeyService extends GenericName2KeyService {
+
+	function isExhaustive() {
+		return true;
+	}
+
+}
+
+?>

+ 47 - 0
deployment/tag_release.sh

@@ -0,0 +1,47 @@
+#!/bin/sh
+TAG=$1
+WORKINGDIR=$2
+BRANCH=$3
+AVATARCLASSROOMTOO=$4
+
+if [ "$1" = "" ]; then
+   echo "Usage: ../sloodle_development_tools/deployment/tag_release.sh <tag> <working_dir> [<branch>] [<includeavatarclassroom>]"
+   exit
+fi
+
+if [ "$2" = "" ]; then
+   echo "Usage: ../sloodle_development_tools/deployment/tag_release.sh <tag> <working_dir> [<branch>] [<includeavatarclassroom>]"
+   exit
+fi
+
+echo $TAG;
+
+mkdir $WORKINGDIR
+cd $WORKINGDIR
+
+REPOS="moodle-mod_sloodle moodle-assignment_sloodleobject moodle-block_sloodle_menu moodle-block_sloodle_backpack sloodle_opensim_iar"
+for REPO in $REPOS
+do
+	FULLREPO="git@github.com:sloodle/${REPO}.git"
+	git clone $FULLREPO 
+	cd $REPO
+	git checkout $BRANCH
+	git pull
+	git tag $TAG
+	git push --tags
+	cd ..
+	rm -rf $REPO
+done
+
+if [ "$AVATARCLASSROOMTOO" != "" ]; then
+    git clone "git@github.com:edmundedgar/avatarclassroom_opensim_iar.git"
+	cd avatarclassroom_opensim_iar
+	git pull
+	git tag $TAG
+	git push --tags
+	cd ..
+fi
+
+echo "Tag creation done, cleaning up"
+cd ..
+rm -rf $WORKINGDIR

+ 61 - 0
deployment/updateTarball.sh

@@ -0,0 +1,61 @@
+#!/bin/sh
+# 
+# Script to generate tarballs / zip files from SVN repository at Google.
+# Expects the latest sloodle module directory to have been checked out once into SVNROOT.
+# Will update itself.
+# Creates one tarball / zip per revision, and copies the latest to sloodle.tar.gz / sloodle.zip
+# (C) Edmund Edgar, 2007-09-09
+# Licensed under the GPL v2 - see sloodle/COPYING for details.
+
+ROOT=/var/www/download
+RESOURCEROOT=${ROOT}/resources
+WEBROOT=${ROOT}/webroot/sloodle/latest
+SVNROOT=${RESOURCEROOT}/svn
+CODEROOT=${RESOURCEROOT}/code
+SLOODLETOPDIR=sloodle_all
+IARROOT=$SVNROOT/$SLOODLETOPDIR/iar
+URLROOT=http://download.socialminds.jp/sloodle/latest
+
+SVN=/usr/bin/svn
+AWK=/bin/awk
+GREP=/bin/grep
+RSYNC=/usr/bin/rsync
+TAR=/bin/tar
+MV=/bin/mv
+CP=/bin/cp
+SED=/bin/sed
+ECHO=/bin/echo
+ZIP="/usr/bin/zip -q"
+CAT=/bin/cat
+
+OLDREVISION=`${CAT} ${CODEROOT}/${SLOODLETOPDIR}/sloodle/REVISION`
+REVISION=`${SVN} update ${SVNROOT}/${SLOODLETOPDIR} | ${GREP} 'At revision' | ${AWK} '{print $3}' | $SED s/\\\\.//`
+REVISION=r${REVISION}
+
+if [[ ${OLDREVISION} != ${REVISION} ]]; then
+
+	echo "Creating trunk tarball for revision $REVISION"
+
+	${RSYNC} -arz --delete ${SVNROOT}/ ${CODEROOT}/ --exclude=".svn" --exclude=".iar"
+	$ECHO ${REVISION} > ${CODEROOT}/${SLOODLETOPDIR}/sloodle/REVISION
+
+	cd ${CODEROOT}
+	${TAR} zcf ${WEBROOT}/${SLOODLETOPDIR}.${REVISION}.tar.gz ${SLOODLETOPDIR}
+
+#	${CP} ${WEBROOT}/${SLOODLETOPDIR}.${REVISION}.tar.gz ${WEBROOT}/${SLOODLETOPDIR}.tar.gz.temp
+#	${MV} ${WEBROOT}/${SLOODLETOPDIR}.tar.gz.temp ${WEBROOT}/${SLOODLETOPDIR}.tar.gz
+	${MV} ${WEBROOT}/${SLOODLETOPDIR}.${REVISION}.tar.gz ${WEBROOT}/${SLOODLETOPDIR}.tar.gz
+	echo "Updated ${URLROOT}/${SLOODLETOPDIR}.tar.gz"
+
+	${ZIP} ${WEBROOT}/${SLOODLETOPDIR}.${REVISION}.zip -r ${SLOODLETOPDIR}/
+#	${CP} ${WEBROOT}/${SLOODLETOPDIR}.${REVISION}.zip ${WEBROOT}/${SLOODLETOPDIR}.zip.temp
+#	${MV} ${WEBROOT}/${SLOODLETOPDIR}.zip.temp ${WEBROOT}/${SLOODLETOPDIR}.zip
+	${MV} ${WEBROOT}/${SLOODLETOPDIR}.${REVISION}.zip ${WEBROOT}/${SLOODLETOPDIR}.zip
+	echo "Updated ${URLROOT}/${SLOODLETOPDIR}.zip"
+
+	cd $IARROOT
+	${TAR} zcf ${WEBROOT}/development.${REVISION}.iar * --exclude=".svn"
+	${MV} ${WEBROOT}/development.${REVISION}.iar ${WEBROOT}/development.iar
+	echo "Updated ${URLROOT}/development.iar"
+
+fi

+ 54 - 0
deployment/updateTarballTags.sh

@@ -0,0 +1,54 @@
+#!/bin/sh
+# 
+# Script to generate tarballs / zip files from SVN repository at Google.
+# Expects the latest sloodle module directory to have been checked out once into SVNROOT.
+# Will update itself.
+# Creates one tarball / zip per revision, and copies the latest to sloodle.tar.gz / sloodle.zip
+# (C) Edmund Edgar, 2007-09-09
+# Licensed under the GPL v2 - see sloodle/COPYING for details.
+
+ROOT=/var/www/download
+WEBROOT=${ROOT}/webroot/sloodle # This should be a web-accessible directory where we're going to put the tarballs
+RESOURCEROOT=${ROOT}/resources # Temporary files and things all go under here - should be outside the webroot
+SVNROOT=${RESOURCEROOT}/svntags # You need to have checked out the tags directory to here
+CODEROOT=${RESOURCEROOT}/codetags # This will be for copies of the code without the .svn stuff.
+
+SVN=/usr/bin/svn
+AWK=/bin/awk
+GREP=/bin/grep
+RSYNC=/usr/bin/rsync
+TAR=/bin/tar
+MV=/bin/mv
+CP=/bin/cp
+SED=/bin/sed
+ECHO=/bin/echo
+ZIP="/usr/bin/zip -q"
+CAT=/bin/cat
+
+${SVN} update ${SVNROOT} 
+
+cd ${SVNROOT}
+
+for tag in `ls`
+do
+	echo ${tag}
+	if [ ! -f ${WEBROOT}/sloodle_all_${tag}.zip ]; # haven't done this one yet
+	then
+		${RSYNC} -arz --delete ${SVNROOT}/${tag}/ ${CODEROOT}/${tag}/ --exclude=".svn"
+
+		cd ${CODEROOT}/${tag}
+		${TAR} zcf ${WEBROOT}/sloodle_menu_${tag}.tar.gz sloodle_menu
+		${TAR} zcf ${WEBROOT}/sloodle_${tag}.tar.gz sloodle
+		${TAR} zcf ${WEBROOT}/sloodleobject_${tag}.tar.gz sloodleobject
+		${TAR} zcf ${WEBROOT}/sloodle_all_${tag}.tar.gz .
+
+		${ZIP} ${WEBROOT}/sloodle_menu_${tag}.zip -r sloodle_menu
+		${ZIP} ${WEBROOT}/sloodle_${tag}.zip -r sloodle
+		${ZIP} ${WEBROOT}/sloodleobject_${tag}.zip -r sloodleobject
+		${ZIP} ${WEBROOT}/sloodle_all_${tag}.zip -r .
+
+		#${CP} ${WEBROOT}/sloodle.${REVISION}.tar.gz ${WEBROOT}/sloodle.tar.gz.temp
+		#${MV} ${WEBROOT}/sloodle.tar.gz.temp ${WEBROOT}/sloodle.tar.gz
+		#echo "${TAR} zcvf ${WEBROOT}/sloodle.${REVISION}tar.gz . -C ${CODEROOT}"
+	fi
+done

+ 109 - 0
deployment/updateTarballTagsMakeStable.sh

@@ -0,0 +1,109 @@
+#!/bin/sh
+# 
+# Script to generate tarballs / zip files from SVN repository at Google.
+# Expects the latest sloodle module directory to have been checked out once into SVNROOT.
+# Will update itself.
+# Creates one tarball / zip per revision, and copies the latest to sloodle.tar.gz / sloodle.zip
+# (C) Edmund Edgar, 2007-09-09
+# Licensed under the GPL v2 - see sloodle/COPYING for details.
+
+ROOT=/var/www/download
+WEBROOT=${ROOT}/webroot/sloodle # This should be a web-accessible directory where we're going to put the tarballs
+RESOURCEROOT=${ROOT}/resources # Temporary files and things all go under here - should be outside the webroot
+SVNROOT=${RESOURCEROOT}/svntags # You need to have checked out the tags directory to here
+CODEROOT=${RESOURCEROOT}/codetags # This will be for copies of the code without the .svn stuff.
+URLROOT=http://download.socialminds.jp/sloodle
+
+SVN=/usr/bin/svn
+AWK=/bin/awk
+GREP=/bin/grep
+RSYNC=/usr/bin/rsync
+TAR=/bin/tar
+MV=/bin/mv
+CP=/bin/cp
+SED=/bin/sed
+ECHO=/bin/echo
+ZIP="/usr/bin/zip -q"
+CAT=/bin/cat
+
+# This is the pattern which, if we see, we will assume gives us the latest stable
+# Currently 1.x is the main production version, so anything tagged as that will be assumed to be the latest stable
+STABLEPATTERN="1.1"
+
+OUTPUT=`${SVN} update ${SVNROOT}`
+
+cd ${SVNROOT}
+
+for tag in `ls`
+do
+	# echo ${tag}
+	if [ ! -f ${WEBROOT}/sloodle_all_${tag}.zip ]; # haven't done this one yet
+	then
+		${RSYNC} -arz --delete ${SVNROOT}/${tag}/ ${CODEROOT}/${tag}/ --exclude=".svn"
+
+		echo "Creating tarballs for ${tag}"
+
+		cd ${CODEROOT}/${tag}
+		${TAR} zcf ${WEBROOT}/sloodle_menu_${tag}.tar.gz sloodle_menu
+		${TAR} zcf ${WEBROOT}/sloodle_${tag}.tar.gz sloodle
+		${TAR} zcf ${WEBROOT}/sloodleobject_${tag}.tar.gz sloodleobject
+		${TAR} zcf ${WEBROOT}/sloodle_all_${tag}.tar.gz .
+
+		${ZIP} ${WEBROOT}/sloodle_menu_${tag}.zip -r sloodle_menu
+		${ZIP} ${WEBROOT}/sloodle_${tag}.zip -r sloodle
+		${ZIP} ${WEBROOT}/sloodleobject_${tag}.zip -r sloodleobject
+		${ZIP} ${WEBROOT}/sloodle_all_${tag}.zip -r .
+
+		echo "Created ${URLROOT}/sloodle_menu_${tag}.tar.gz"
+		echo "Created ${URLROOT}/sloodle_${tag}.tar.gz"
+		echo "Created ${URLROOT}/sloodleobject_${tag}.tar.gz"
+		echo "Created ${URLROOT}/sloodle_all_${tag}.tar.gz"
+
+		echo "Created ${URLROOT}/sloodle_menu_${tag}.zip"
+		echo "Created ${URLROOT}/sloodle_${tag}.zip"
+		echo "Created ${URLROOT}/sloodleobject_${tag}.zip"
+		echo "Created ${URLROOT}/sloodle_all_${tag}.zip"
+
+                if [ `expr match "${tag}" "${STABLEPATTERN}"` -gt 0 ]
+                then
+
+			echo "Tag ${tag} matches the latest stable pattern ${STABLEPATTHEN}, copying it to latest stable location"
+
+			${CP} ${WEBROOT}/sloodle_menu_${tag}.zip ${WEBROOT}/latest/sloodle_menu_latest_stable.tmp.zip 
+			${CP} ${WEBROOT}/sloodle_${tag}.zip ${WEBROOT}/latest/sloodle_latest_stable.tmp.zip 
+			${CP} ${WEBROOT}/sloodleobject_${tag}.zip ${WEBROOT}/latest/sloodleobject_latest_stable.tmp.zip 
+			${CP} ${WEBROOT}/sloodle_all_${tag}.zip ${WEBROOT}/latest/sloodle_all_latest_stable.tmp.zip 
+
+			${CP} ${WEBROOT}/sloodle_menu_${tag}.tar.gz ${WEBROOT}/latest/sloodle_menu_latest_stable.tmp.tar.gz 
+			${CP} ${WEBROOT}/sloodle_${tag}.tar.gz ${WEBROOT}/latest/sloodle_latest_stable.tmp.tar.gz 
+			${CP} ${WEBROOT}/sloodleobject_${tag}.tar.gz ${WEBROOT}/latest/sloodleobject_latest_stable.tmp.tar.gz 
+			${CP} ${WEBROOT}/sloodle_all_${tag}.tar.gz ${WEBROOT}/latest/sloodle_all_latest_stable.tmp.tar.gz 
+
+			${MV} ${WEBROOT}/latest/sloodle_menu_latest_stable.tmp.zip ${WEBROOT}/latest/sloodle_menu_latest_stable.zip 
+			${MV} ${WEBROOT}/latest/sloodle_latest_stable.tmp.zip ${WEBROOT}/latest/sloodle_latest_stable.zip 
+			${MV} ${WEBROOT}/latest/sloodleobject_latest_stable.tmp.zip ${WEBROOT}/latest/sloodleobject_latest_stable.zip 
+			${MV} ${WEBROOT}/latest/sloodle_all_latest_stable.tmp.zip ${WEBROOT}/latest/sloodle_all_latest_stable.zip 
+
+			${MV} ${WEBROOT}/latest/sloodle_menu_latest_stable.tmp.tar.gz ${WEBROOT}/latest/sloodle_menu_latest_stable.tar.gz 
+			${MV} ${WEBROOT}/latest/sloodle_latest_stable.tmp.tar.gz ${WEBROOT}/latest/sloodle_latest_stable.tar.gz 
+			${MV} ${WEBROOT}/latest/sloodleobject_latest_stable.tmp.tar.gz ${WEBROOT}/latest/sloodleobject_latest_stable.tar.gz 
+			${MV} ${WEBROOT}/latest/sloodle_all_latest_stable.tmp.tar.gz ${WEBROOT}/latest/sloodle_all_latest_stable.tar.gz 
+
+			echo "Created ${URLROOT}/latest/sloodle_menu_latest_stable.zip"
+			echo "Created ${URLROOT}/latest/sloodle_latest_stable.zip"
+			echo "Created ${URLROOT}/latest/sloodleobject_latest_stable.zip"
+			echo "Created ${URLROOT}/latest/sloodle_all_latest_stable.zip"
+
+			echo "Created ${URLROOT}/latest/sloodle_menu_latest_stable.tar.gz"
+			echo "Created ${URLROOT}/latest/sloodle_latest_stable.tar.gz"
+			echo "Created ${URLROOT}/latest/sloodleobject_latest_stable.tar.gz"
+			echo "Created ${URLROOT}/latest/sloodle_all_latest_stable.tar.gz"
+
+
+			#${CP} ${WEBROOT}/sloodle.${REVISION}.tar.gz ${WEBROOT}/sloodle.tar.gz.temp
+			#${MV} ${WEBROOT}/sloodle.tar.gz.temp ${WEBROOT}/sloodle.tar.gz
+			#echo "${TAR} zcvf ${WEBROOT}/sloodle.${REVISION}tar.gz . -C ${CODEROOT}"
+
+		fi
+	fi
+done

+ 27 - 0
moodle_2_compatibility/migrate.sh

@@ -0,0 +1,27 @@
+#!/bin/sh -x
+# This is a script to take a Moodle <1.9 install and make it work on Moodle >=2.0
+# Copyright Edmund Edgar, 2011-06-20
+# Licensed under the same terms as Sloodle itself.
+
+if test $# -eq 0
+then
+	echo "Usage: php migrate.php /path/to/sloodle/top/dir";
+	exit 1
+fi
+
+THIS_DIR=$(cd `dirname $0` && pwd)
+APPLY_TO=$1
+
+echo "applying to ${APPLY_TO}"
+echo "applying from ${THIS_DIR}"
+
+cd ${APPLY_TO}
+
+# Replace legacy Moodle functions with sloodle_ wrappers
+find . -type f ! -regex ".*[/]\.svn[/]?.*" -exec sed -f ${THIS_DIR}/sloodle_wrappers.sed -i {} \;
+
+# Patch various misc changes, including the new wrapper functions
+patch -p1 < ${THIS_DIR}/sloodle.patch
+
+# Rename the language directories to drop the utf8 
+for x in `ls -d lang/*_utf8 | sed 's/_utf8$//' `; do mv ${x}_utf8 $x; done

+ 279 - 0
moodle_2_compatibility/sloodle.patch

@@ -0,0 +1,279 @@
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/lang/en_utf8/sloodle.php sloodle_moodle_2_0_compat/lang/en_utf8/sloodle.php
+--- sloodle_moodle_1_9_compat/lang/en_utf8/sloodle.php	2011-06-20 08:58:12.000000000 +0000
++++ sloodle_moodle_2_0_compat/lang/en_utf8/sloodle.php	2011-06-20 08:25:20.000000000 +0000
+@@ -6,6 +6,8 @@
+ * @package sloodlelang
+ */
+ 
++$string['pluginname']   = 'SLOODLE';
++
+ $string['accesslevel'] = 'Access Level';
+ $string['accesslevel:public'] = 'Public';
+ $string['accesslevel:owner'] = 'Owner';
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/lib/capability.php sloodle_moodle_2_0_compat/lib/capability.php
+--- sloodle_moodle_1_9_compat/lib/capability.php	1970-01-01 00:00:00.000000000 +0000
++++ sloodle_moodle_2_0_compat/lib/capability.php	2011-06-20 08:47:58.000000000 +0000
+@@ -0,0 +1,17 @@
++<?php 
++/* capability.php
++Edmund Edgar, 2010-06-18
++Moodle capability wrapper
++We should be able to get rid of this - the legacy thing is already deprecated as of 1.something
++*/
++
++function sloodle_has_capability($capability = null, $contextid = null, $userid = null, $kill = null) {
++	global $CFG;
++	if ($CFG->version > 2010060800) {
++		if ( $capability == 'moodle/legacy:guest' ) {
++			return false;
++		}
++	}
++	return has_capability($capability, $contextid, $userid, $kill );
++}
++?>
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/lib/db.php sloodle_moodle_2_0_compat/lib/db.php
+--- sloodle_moodle_1_9_compat/lib/db.php	1970-01-01 00:00:00.000000000 +0000
++++ sloodle_moodle_2_0_compat/lib/db.php	2011-06-20 08:24:39.000000000 +0000
+@@ -0,0 +1,165 @@
++<?php 
++/* db.lib
++Edmund Edgar, 2010-06-18
++Sloodle database compatibility wrappers
++For reasons best known to themselves, Moodle decided to suddenly rip out all their old db functions and put in a bunch of near-identical ones with slightly different syntax.
++To avoid the need for a different release, we'll go through a layer of sloodle_ functions which wrap the appropriate Moodle database call.
++We'll probably want to switch these out for the regular Moodle 2.0 calls when people have had a change to upgrade to Moodle 2.
++*/
++
++function sloodle_do_use_db_object() {
++   global $CFG;
++   return ($CFG->version > 2010060800); 
++}
++
++function sloodle_get_record($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null, $p8='*') {
++   global $DB;
++   if ( sloodle_do_use_db_object() ) {
++      return $DB->get_record($p1, sloodle_conditions_to_array($p2,$p3,$p4,$p5,$p6,$p7) );
++   } else {
++      return get_record($p1, $p2, $p3, $p4, $p5, $p6, $p6, $p8);
++   }
++}
++
++function sloodle_record_exists($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null) {
++   global $DB;
++   if ( sloodle_do_use_db_object() ) {
++      return $DB->record_exists($p1, sloodle_conditions_to_array($p2,$p3,$p4,$p5,$p6,$p7) );
++   } else {
++      return record_exists($p1, $p2, $p3, $p4, $p5, $p6, $p7);
++   }
++}
++
++function sloodle_get_records($p1=null, $p2=null, $p3=null, $p4=null, $p5='*', $p6=null, $p7=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->get_records($p1, sloodle_conditions_to_array( $p2, $p3), $p4, $p5, $p6, $p7 );
++   } else {
++      return get_records($p1, $p2, $p3, $p4, $p5, $p6, $p7);
++   }
++}
++
++function sloodle_get_records_sql($p1=null, $p2=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->get_records_sql($p1, $p2);
++   } else {
++      return get_records_sql($p1, $p2);
++   }
++}
++
++function sloodle_get_records_select( $p1=null, $p2=null, $p3=null, $p4='*', $p5=null, $p6=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->get_records_select($p1, $p2, array(), $p3, $p4, $p5, $p6); // get_records_select now has an option to pass in an array of params
++   } else {
++      return get_records_select($p1, $p2, $p3, $p4, $p5, $p6);
++   }
++}
++
++function sloodle_insert_record($p1=null, $p2=null, $returnid=true, $primarykey='id') {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->insert_record($p1, $p2, $returnid, false);  // if we need that primarykey field, I guess something will break
++   } else {
++      return insert_record($p1, $p2, $returnid, $primarykey );
++   }
++}
++
++function sloodle_update_record($p1=null, $p2=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->update_record($p1, $p2);
++   } else {
++      return update_record($p1, $p2);
++   }
++}
++
++function sloodle_count_records($p1=null, $p2=null, $p3=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->count_records($p1, array( $p2=>$p3 ) );
++   } else {
++      return count_records($p1, $p2, $p3);
++   }
++}
++
++function sloodle_delete_records($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->delete_records($p1, sloodle_conditions_to_array($p2, $p3, $p4, $p5, $p6, $p7) );
++   } else {
++      return delete_records($p1, $p2, $p3, $p4, $p5, $p6, $p7);
++   }
++}
++
++function sloodle_delete_records_select($p1=null, $p2=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->delete_records($p1, $p2);
++   } else {
++      return delete_records($p1, $p2);
++   }
++}
++
++
++function sloodle_delete_record($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->delete_record($p1, array($p2=>$p3, $p4=>$p5, $p6=>$p7) );
++   } else {
++      return delete_record($p1, $p2, $p3, $p4, $p5, $p6, $p7);
++   }
++}
++
++function sloodle_get_field($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null, $p8=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->get_field($p1, $p2, sloodle_conditions_to_array($p3, $p4, $p5, $p6, $p7, $p8) );
++   } else {
++      return get_field($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
++   }
++}
++
++function sloodle_get_field_sql($p1=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->sloodle_get_field_sql($p1);
++   } else {
++      return sloodle_get_field_sql($p1);
++   }
++}
++
++function sloodle_set_field($p1=null, $p2=null, $p3=null, $p4=null, $p5=null, $p6=null, $p7=null, $p8=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->set_field($p1, $p2, $p3, sloodle_conditions_to_array( $p4, $p5, $p6, $p7, $p8) );
++   } else {
++      return set_field($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8);
++   }
++}
++
++function sloodle_sql_ilike($p1=null) {
++   if ( sloodle_do_use_db_object() ) {
++      global $DB;
++      return $DB->sql_ilike();
++   } else {
++      return sql_ilike();
++   }
++
++}
++
++function sloodle_conditions_to_array($c1 = null, $c2 = null, $c3 = null, $c4 = null, $c5 = null, $c6 = null) {
++   $conditions = array();
++   if ($c1) {
++      $conditions[$c1] = $c2;
++   }
++   if ($c3) {
++      $conditions[$c3] = $c4;
++   }
++   if ($c5) {
++      $conditions[$c5] = $c6;
++   }
++   return $conditions;
++}
++?>
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/lib.php sloodle_moodle_2_0_compat/lib.php
+--- sloodle_moodle_1_9_compat/lib.php	2011-06-20 08:58:15.000000000 +0000
++++ sloodle_moodle_2_0_compat/lib.php	2011-06-20 08:49:38.000000000 +0000
+@@ -471,5 +471,14 @@
+     }
+ 
+ 
++function sloodle_supports($feature) {
++    switch($feature) {
++        case FEATURE_MOD_INTRO:               return true;
++        //case FEATURE_BACKUP_MOODLE2:          return true; // not sure
++
++        default: return null;
++    }
++}
++
+ 
+ ?>
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/mod_form.php sloodle_moodle_2_0_compat/mod_form.php
+--- sloodle_moodle_1_9_compat/mod_form.php	2011-06-20 08:58:15.000000000 +0000
++++ sloodle_moodle_2_0_compat/mod_form.php	2011-06-20 08:27:23.000000000 +0000
+@@ -84,15 +84,20 @@ class mod_sloodle_mod_form extends moodl
+         // Set a client-size rule that an entry is required
+         $mform->addRule('name', null, 'required', null, 'client');
+ 
+-        // Create an HTML editor for module description (intro text)
+-        $mform->addElement('htmleditor', 'intro', get_string('description'));
+-        // Make it raw type (so the HTML isn't filtered out)
+-        $mform->setType('intro', PARAM_RAW);
+-        // Make it required
+-        //$mform->addRule('intro', get_string('required'), 'required', null, 'client'); // Don't require description - PRB
+-        // Provide an HTML editor help button
+-        $mform->setHelpButton('intro', array('writing', 'questions', 'richtext'), false, 'editorhelpbutton');
+-        
++
++	if (method_exists($this,'add_intro_editor')) {
++	       $this->add_intro_editor(true);
++	} else {
++	       // Create an HTML editor for module description (intro text)
++	       $mform->addElement('htmleditor', 'intro', get_string('description'));
++	       // Make it raw type (so the HTML isn't filtered out)
++	       $mform->setType('intro', PARAM_RAW);
++	       // Make it required
++	       $mform->addRule('intro', get_string('required'), 'required', null, 'client'); // Don't require description - PRB
++	       // Provide an HTML editor help button
++	       $mform->setHelpButton('intro', array('writing', 'questions', 'richtext'), false, 'editorhelpbutton');
++	}
++
+         
+ //-------------------------------------------------------------------------------
+         
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/sl_config.php sloodle_moodle_2_0_compat/sl_config.php
+--- sloodle_moodle_1_9_compat/sl_config.php	2011-06-20 08:58:15.000000000 +0000
++++ sloodle_moodle_2_0_compat/sl_config.php	2011-06-20 08:48:21.000000000 +0000
+@@ -11,6 +11,8 @@
+ 	// Pull in the main moodle config
+ 	// NB the following is necessary for when we pull in this config.php from a module under sloodle/mod
+ 	require_once (realpath(dirname(__FILE__) . "/" . "../../config.php"));
++	require_once (realpath(dirname(__FILE__) . "/" . "lib/db.php"));
++	require_once (realpath(dirname(__FILE__) . "/" . "lib/capability.php"));
+     
+     // Is this a linker script?
+     if (defined('SLOODLE_LINKER_SCRIPT')) {
+diff -rupN --exclude=.svn sloodle_moodle_1_9_compat/version.php sloodle_moodle_2_0_compat/version.php
+--- sloodle_moodle_1_9_compat/version.php	2011-06-20 08:58:15.000000000 +0000
++++ sloodle_moodle_2_0_compat/version.php	2011-06-20 08:29:34.000000000 +0000
+@@ -6,7 +6,9 @@
+ ////////////////////////////////////////////////////////////////////////////////
+ 
+ $module->version  = 2010022202;
+-$module->requires = 2007021500;  // Requires Moodle 1.8
++//$module->requires = 2007021500;  // Requires Moodle 1.8
++// 2.0 INCOMPATIBILITY
++$module->requires = 2010000000;
+ $module->cron     = 60;
+ 
+ ?>

+ 17 - 0
moodle_2_compatibility/sloodle_wrappers.sed

@@ -0,0 +1,17 @@
+#!/bin/sed -e
+
+/sloodle_get_record/! s/get_record(/sloodle_get_record(/g
+/sloodle_get_records/! s/get_records(/sloodle_get_records(/g
+/sloodle_get_records_select/! s/get_records_select(/sloodle_get_records_select(/g
+/sloodle_get_records_sql/! s/get_records_sql(/sloodle_get_records_sql(/g
+/sloodle_get_record_sql/! s/get_record_sql(/sloodle_get_record_sql(/g
+/sloodle_get_record_select/! s/get_record_select(/sloodle_get_record_select(/g
+/sloodle_get_recordset_select/! s/get_recordset_select(/sloodle_get_recordset_select(/g
+/sloodle_get_field/! s/get_field(/sloodle_get_field(/g
+/sloodle_get_field_sql/! s/get_field_sql(/sloodle_get_field_sql(/g
+/sloodle_count_records_select/! s/count_records_select(/sloodle_count_records_select(/g
+/sloodle_count_records/! s/count_records(/sloodle_count_records(/
+/sloodle_insert_record/! s/insert_record(/sloodle_insert_record(/g
+/sloodle_update_record/! s/update_record(/sloodle_update_record(/g
+/sloodle_delete_records/! s/delete_records(/sloodle_delete_records(/g
+/sloodle_has_capability/! s/has_capability(/sloodle_has_capability(/g

+ 52 - 0
opensim_sync/fixuuid.sh

@@ -0,0 +1,52 @@
+#!/bin/bash 
+#
+# This script regenerates the asset UUIDs for all LSL scripts in an IAR file.
+# This is done so that when a script has been updated inside the IAR rather than in world...
+# ...then reimported into an SL grid that had it before, or using a viewer that already has it in the cache...
+# ...we can be sure that the new version will be used, not the old one.
+#
+# These UUIDs are generated based on the md5 hash of the contents of the script.
+# This means that given two identical scripts with different UUIDs,
+# ...it will have the side effect of combining them into a single script.
+#
+# It is intended to be used as follows on an untarred IAR, like the one in sloodle_opensim_iar:
+# cd sloodle_opensim_iar/iar
+# find . -name '*.lsl' -exec ../../sloodle_development_tools/opensim_sync/fixuuid.sh {} \;
+#
+
+OLDASSET=$1
+
+if [ ! -f "$OLDASSET" ]
+then
+	echo "Asset '$OLDASSET' not found"
+	exit 1;
+fi
+
+#./assets/432e3970-5331-b90e-b157-08e3d3fa0ef1_script.lsl
+HASH=`md5sum $OLDASSET`
+NEWUUID="${HASH:0:8}-${HASH:8:4}-${HASH:12:4}-${HASH:16:4}-${HASH:20:12}"
+
+OLDSCRIPT=`echo $OLDASSET | awk -F'/' '{print $3}'`
+OLDUUID=`echo $OLDSCRIPT | awk -F'_' '{print $1}'`
+
+if [ "$NEWUUID" = "" ] 
+then
+	echo "Could not make NEWUUID for file '$OLDASSET'"
+	exit 2
+fi
+
+if [ "$OLDUUID" = "" ] 
+then
+	echo "Could not make OLDUUID"
+	exit 2
+fi
+
+
+if [ "$NEWUUID" != "$OLDUUID" ] 
+then
+	NEWASSET="./assets/${NEWUUID}_script.lsl"
+	echo "Renaming old asset $OLDASSET to $NEWASSET"
+
+	mv $OLDASSET $NEWASSET
+	find . -name '*.xml' -exec sed -i "s/$OLDUUID/$NEWUUID/g" '{}' \;
+fi

+ 199 - 0
opensim_sync/grandRenaming.sh

@@ -0,0 +1,199 @@
+#!/bin/bash
+./renameLSL.sh mod/regbooth-1.0/sloodle_mod_regbooth-1.0.lsl mod/regbooth-1.0/objects/default/assets/sloodle_mod_regbooth-1.0.lslp
+./renameLSL.sh mod/furniture-1.0/object_scripts/presentation_seating.lslp mod/furniture-1.0/objects/default/assets/presentation_seating.lslp
+./renameLSL.sh mod/furniture-1.0/object_scripts/chalkboard.lsl mod/furniture-1.0/objects/chalkboard/assets/chalkboard.lslp
+./renameLSL.sh mod/furniture-1.0/object_scripts/sign.lsl mod/furniture-1.0/objects/sign/assets/sign.lslp
+./renameLSL.sh mod/furniture-1.0/object_scripts/twitterwall.lsl mod/furniture-1.0/objects/twitterwall/assets/twitterwall.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/game_buzzer.lsl mod/gaming-1.0/objects/gamebuzzer/assets/game_buzzer.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/sharks/shark_artificial_intelligence.lslp mod/gaming-1.0/objects/shark/assets/shark_artificial_intelligence.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/sharks/shark_pool_surface.lslp mod/gaming-1.0/objects/sharkpool/assets/shark_pool_surface.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/sharks/bloodbath.lsl mod/gaming-1.0/objects/shark/assets/bloodbath.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/sharks/fricken_laser_beams.lsl mod/gaming-1.0/objects/shark/assets/fricken_laser_beams.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/sharks/movelikeashark.lsl mod/gaming-1.0/objects/shark/assets/movelikeashark.lslp
+./renameLSL.sh mod/gaming-1.0/object_scripts/sharks/redbubbles.lsl mod/gaming-1.0/objects/shark/assets/redbubbles.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_simple_configured_panel.lsl mod/set-1.0/objects/default/assets/sloodle_set_simple_configured_panel.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_simple_door_handle.lsl mod/set-1.0/objects/default/assets/sloodle_set_simple_door_handle.lslp
+./renameLSL.sh mod/set-1.0/sloodle_httpin_forwarder.lsl mod/set-1.0/objects/default/assets/sloodle_httpin_forwarder.lslp
+./renameLSL.sh mod/set-1.0/rezzer_shared_media_open_in_browser_btn.lsl mod/set-1.0/objects/default/assets/rezzer_shared_media_open_in_browser_btn.lslp
+./renameLSL.sh mod/set-1.0/sloodle_move_teller.lsl mod/set-1.0/objects/default/assets/sloodle_move_teller.lslp
+./renameLSL.sh mod/set-1.0/sloodle_object_creator.lsl mod/set-1.0/objects/default/assets/sloodle_object_creator.lslp
+./renameLSL.sh mod/set-1.0/sloodle_rez_status_confirmer.lsl mod/set-1.0/objects/default/assets/sloodle_rez_status_confirmer.lslp
+./renameLSL.sh mod/set-1.0/sloodle_mod_set-1.0.lsl mod/set-1.0/objects/default/assets/sloodle_mod_set-1.0.lslp
+./renameLSL.sh mod/set-1.0/rezzer_reset_btn.lsl mod/set-1.0/objects/default/assets/rezzer_reset_btn.lslp
+./renameLSL.sh mod/set-1.0/sloodle_shared_media_setup.lsl mod/set-1.0/objects/default/assets/sloodle_shared_media_setup.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_effects_simple.lsl mod/set-1.0/objects/default/assets/sloodle_set_effects_simple.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_back_glow.lsl mod/set-1.0/objects/default/assets/sloodle_set_back_glow.lslp
+./renameLSL.sh mod/set-1.0/sloodle_open_in_browser.lsl mod/set-1.0/objects/default/assets/sloodle_open_in_browser.lslp
+./renameLSL.sh mod/set-1.0/sloodle_notecard_httpin.lsl mod/set-1.0/objects/default/assets/sloodle_notecard_httpin.lslp
+./renameLSL.sh mod/set-1.0/sloodle_shared_media_screen.lsl mod/set-1.0/objects/default/assets/sloodle_shared_media_screen.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_simple_mothership_handler.lsl mod/set-1.0/objects/default/assets/sloodle_set_simple_mothership_handler.lslp
+./renameLSL.sh mod/set-1.0/sloodle_rezzer_object.lsl mod/set-1.0/objects/default/assets/sloodle_rezzer_object.lslp
+./renameLSL.sh mod/set-1.0/sloodle_position_handler.lsl mod/set-1.0/objects/default/assets/sloodle_position_handler.lslp
+./renameLSL.sh mod/set-1.0/sloodle_httpin_config_requester.lsl mod/set-1.0/objects/default/assets/sloodle_httpin_config_requester.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_effects_mothership.lsl mod/set-1.0/objects/default/assets/sloodle_set_effects_mothership.lslp
+./renameLSL.sh mod/set-1.0/sloodle_set_simple_door.lsl mod/set-1.0/objects/default/assets/sloodle_set_simple_door.lslp
+./renameLSL.sh mod/set-1.0/sloodle_setup_notecard_httpin.lsl mod/set-1.0/objects/default/assets/sloodle_setup_notecard_httpin.lslp
+./renameLSL.sh mod/set-1.0/sloodle_translation_set_en.lsl mod/set-1.0/objects/default/assets/sloodle_translation_set_en.lslp
+./renameLSL.sh mod/primdrop-1.0/sloodle_mod_primdrop-1.0_FULL.lsl mod/primdrop-1.0/objects/default/assets/sloodle_mod_primdrop-1.0_FULL.lslp
+./renameLSL.sh mod/primdrop-1.0/sloodle_primdrop_inventory.lsl mod/primdrop-1.0/objects/default/assets/sloodle_primdrop_inventory.lslp
+./renameLSL.sh mod/primdrop-1.0/sloodle_mod_primdrop-1.0.lsl mod/primdrop-1.0/objects/default/assets/sloodle_mod_primdrop-1.0.lslp
+./renameLSL.sh mod/primdrop-1.0/sloodle_mod_primdrop-1.0_world.lsl mod/primdrop-1.0/objects/default/assets/sloodle_mod_primdrop-1.0_world.lslp
+./renameLSL.sh mod/regenrolbooth-1.0/sloodle_manual_reg_enrol.lsl mod/regenrolbooth-1.0/objects/default/assets/sloodle_manual_reg_enrol.lslp
+./renameLSL.sh mod/regenrolbooth-1.0/sloodle_mod_regenrolbooth-1.0.lsl mod/regenrolbooth-1.0/objects/default/assets/sloodle_mod_regenrolbooth-1.0.lslp
+./renameLSL.sh mod/distributor-1.0/sloodle_mod_distributor-1.0.lsl mod/distributor-1.0/objects/default/assets/sloodle_mod_distributor-1.0.lslp
+./renameLSL.sh mod/glossary-1.0/sloodle_mod_glossary-1.0.lsl mod/glossary-1.0/objects/default/assets/sloodle_mod_glossary-1.0.lslp
+./renameLSL.sh mod/glossary-1.0/sloodle_glossary_explainer.lsl mod/glossary-1.0/objects/default/assets/sloodle_glossary_explainer.lslp
+./renameLSL.sh mod/choice-1.0/sloodle_mod_choice-1.0.lsl mod/choice-1.0/objects/default/assets/sloodle_mod_choice-1.0.lslp
+./renameLSL.sh mod/choice-1.0/sloodle_choice_option.lsl mod/choice-1.0/objects/default/assets/sloodle_choice_option.lslp
+./renameLSL.sh mod/choice-1.0/sloodle_choice_text.lsl mod/choice-1.0/objects/default/assets/sloodle_choice_text.lslp
+./renameLSL.sh mod/choice-1.0/sloodle_choice_option_legend.lsl mod/choice-1.0/objects/default/assets/sloodle_choice_option_legend.lslp
+./renameLSL.sh mod/scoreboard-1.0/object_scripts/zztext/active_light.lsl mod/scoreboard-1.0/objects/default/assets/active_light.lslp
+./renameLSL.sh mod/scoreboard-1.0/object_scripts/zztext/_zztext_efficient_board_control.lsl mod/scoreboard-1.0/objects/default/assets/_zztext_efficient_board_control.lslp
+./renameLSL.sh mod/scoreboard-1.0/object_scripts/zztext/zztext_scoreboard-1.0.lsl mod/scoreboard-1.0/objects/default/assets/zztext_scoreboard-1.0.lslp
+./renameLSL.sh mod/scoreboard-1.0/object_scripts/zztext/btn_open_in_browser.lsl mod/scoreboard-1.0/objects/default/assets/btn_open_in_browser.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_admin_animation.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_admin_animation.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_admin_hud.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_admin_hud.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_connect_button_anim.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_connect_button_anim.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_get_hud_button_anim.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_get_hud_button_anim.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_get_hud_button.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_get_hud_button.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_show_admin_button.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_show_admin_button.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_mod_scoreboard.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_mod_scoreboard.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_admin_control_panel.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_admin_control_panel.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_connect_button.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_connect_button.lslp
+./renameLSL.sh mod/scoreboard-1.0/sloodle_admin_hud_show_hide_button.lsl mod/scoreboard-1.0/objects/default/assets/sloodle_admin_hud_show_hide_button.lslp
+./renameLSL.sh mod/presenter-2.0/sloodle_mod_presenter-2.0.lsl mod/presenter-2.0/objects/default/assets/sloodle_mod_presenter-2.0.lslp
+./renameLSL.sh mod/presenter-2.0/sloodle_mod_presenter-shared-media-2.0.lsl mod/presenter-2.0/objects/default/assets/sloodle_mod_presenter-shared-media-2.0.lslp
+./renameLSL.sh mod/accesscheckerdoor-1.0/sloodle_accesscheckerdoor_right.lsl mod/accesscheckerdoor-1.0/objects/default/assets/sloodle_accesscheckerdoor_right.lslp
+./renameLSL.sh mod/accesscheckerdoor-1.0/sloodle_mod_accesscheckerdoor-1.0.lsl mod/accesscheckerdoor-1.0/objects/default/assets/sloodle_mod_accesscheckerdoor-1.0.lslp
+./renameLSL.sh mod/accesscheckerdoor-1.0/sloodle_accesscheckerdoor_left.lsl mod/accesscheckerdoor-1.0/objects/default/assets/sloodle_accesscheckerdoor_left.lslp
+./renameLSL.sh mod/picturegloss-1.0/sloodle_mod_glossary-1.0.lsl mod/picturegloss-1.0/objects/default/assets/sloodle_mod_glossary-1.0.lslp
+./renameLSL.sh mod/picturegloss-1.0/sloodle_translation_picturegloss_en.lsl mod/picturegloss-1.0/objects/default/assets/sloodle_translation_picturegloss_en.lslp
+./renameLSL.sh mod/pwreset-1.0/sloodle_mod_pwreset-1.0.lsl mod/pwreset-1.0/objects/default/assets/sloodle_mod_pwreset-1.0.lslp
+./renameLSL.sh mod/presenter-1.0/sloodle_mod_presenter-1.0.lsl mod/presenter-1.0/objects/default/assets/sloodle_mod_presenter-1.0.lslp
+./renameLSL.sh mod/presenter-1.0/sloodle_mod_presenter-1.0.lsl.os mod/presenter-1.0/objects/default/assets/sloodle_mod_presenter-1.0.lslp.os
+./renameLSL.sh mod/building-1.0/object_scripts/hot_floor.lsl mod/building-1.0/objects/avatarclassroomfloors234/assets/hot_floor.lslp
+./renameLSL.sh mod/accesschecker-1.0/sloodle_mod_accesschecker-1.0.lsl mod/accesschecker-1.0/objects/default/assets/sloodle_mod_accesschecker-1.0.lslp
+./renameLSL.sh mod/accesschecker-1.0/sloodle_manual_reg_enrol.lsl mod/accesschecker-1.0/objects/default/assets/sloodle_manual_reg_enrol.lslp
+./renameLSL.sh mod/demo-1.0/sloodle_mod_demo-1.0.lsl mod/demo-1.0/objects/default/assets/sloodle_mod_demo-1.0.lslp
+./renameLSL.sh mod/distributor-2.0/object_scripts/vendor/sloodle_vendor.lsl mod/distributor-2.0/objects/default/assets/sloodle_vendor.lslp
+./renameLSL.sh mod/enrolbooth-1.0/_setText.lsl mod/enrolbooth-1.0/objects/default/assets/_setText.lslp
+./renameLSL.sh mod/enrolbooth-1.0/sloodle_mod_enrolbooth-1.0.lsl mod/enrolbooth-1.0/objects/default/assets/sloodle_mod_enrolbooth-1.0.lslp
+./renameLSL.sh mod/loginzone-1.0/sloodle_mod_loginzone-1.0.lsl mod/loginzone-1.0/objects/default/assets/sloodle_mod_loginzone-1.0.lslp
+./renameLSL.sh mod/quiz-1.0/sloodle_quiz_chair_poseball.lsl mod/quiz-1.0/objects/default/assets/sloodle_quiz_chair_poseball.lslp
+./renameLSL.sh mod/quiz-1.0/sloodle_mod_quiz-1.0.lsl mod/quiz-1.0/objects/default/assets/sloodle_mod_quiz-1.0.lslp
+./renameLSL.sh mod/quiz-1.0/sloodle_quiz_question_handler.lsl mod/quiz-1.0/objects/default/assets/sloodle_quiz_question_handler.lslp
+./renameLSL.sh mod/quiz-1.0/sloodle_quiz_ui.lsl mod/quiz-1.0/objects/default/assets/sloodle_quiz_ui.lslp
+./renameLSL.sh mod/moodlescreen-1.0/sloodle_moodle_screen.lsl mod/moodlescreen-1.0/objects/default/assets/sloodle_moodle_screen.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/zombie_move.lslp mod/interaction-1.0/objects/enemyrezzer/assets/zombie_move.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/sloodle_quiz_router.lslp mod/interaction-1.0/objects/enemyrezzer/assets/sloodle_quiz_router.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/well.lsl mod/interaction-1.0/objects/well/assets/well.lsl
+./renameLSL.sh mod/interaction-1.0/object_scripts/anim_magic_chest.lslp mod/interaction-1.0/objects/magicchest/assets/anim_magic_chest.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/locked_door.lslp mod/interaction-1.0/objects/lockeddoor/assets/locked_door.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/magicplant.lslp mod/interaction-1.0/objects/magicplant/assets/magicplant.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/jellyfishswim.lslp mod/interaction-1.0/objects/jellyfish/assets/jellyfishswim.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/setAlpha.lslp mod/interaction-1.0/objects/jellyfish/assets/setAlpha.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/teleporter.lslp mod/interaction-1.0/objects/teleporter/assets/teleporter.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/zombie.lslp mod/interaction-1.0/objects/enemyrezzer/assets/zombie.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/enemy.lslp mod/interaction-1.0/objects/enemyrezzer/assets/enemy.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/teleporter_using_crystals_for_opensim.lsl mod/interaction-1.0/objects/crystalteleporter/assets/teleporter_using_crystals_for_opensim.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/blue_crystal_mover.lslp mod/interaction-1.0/objects/crystalteleporter/assets/blue_crystal_mover.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/magicchest.lslp mod/interaction-1.0/objects/magicchest/assets/magicchest.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/sloodle_quiz_ui_enemy.lslp mod/interaction-1.0/objects/enemyrezzer/assets/sloodle_quiz_ui_enemy.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/touchobject.lsl mod/interaction-1.0/objects/default/assets/touchobject.lsl
+./renameLSL.sh mod/interaction-1.0/object_scripts/zombieEnemy.lslp mod/interaction-1.0/objects/enemyrezzer/assets/zombieEnemy.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/sloodle_rezzer_object_with_external_cleanup.lslp mod/interaction-1.0/objects/default/assets/sloodle_rezzer_object_with_external_cleanup.lslp
+./renameLSL.sh mod/interaction-1.0/object_scripts/teleporter_using_crystals.lsl mod/interaction-1.0/objects/teleporter/assets/teleporter_using_crystals.lslp
+./renameLSL.sh mod/interaction-1.0/sloodle_mod_touchable-1.0.lsl mod/interaction-1.0/objects/touchobject/assets/sloodle_mod_touchable-1.0.lslp
+./renameLSL.sh mod/quiz_pile_on-1.0/sloodle_quiz_pile_on_choice.lsl mod/quiz_pile_on-1.0/objects/default/assets/sloodle_quiz_pile_on_choice.lslp
+./renameLSL.sh mod/quiz_pile_on-1.0/sloodle_mod_quiz_pile_on-1.0.lsl mod/quiz_pile_on-1.0/objects/default/assets/sloodle_mod_quiz_pile_on-1.0.lslp
+./renameLSL.sh mod/chat-1.0/sloodle_mod_chat-1.0.lsl.os mod/chat-1.0/objects/default/assets/sloodle_mod_chat-1.0.lslp.os
+./renameLSL.sh mod/chat-1.0/sloodle_mod_chat-1.0.lsl mod/chat-1.0/objects/default/assets/sloodle_mod_chat-1.0.lslp
+./renameLSL.sh mod/tracker-1.0/sloodle_mod_tracker-1.0.lsl mod/tracker-1.0/objects/default/assets/sloodle_mod_tracker-1.0.lslp
+./renameLSL.sh mod/tracker-1.0/sloodle_tracker_scanner.lsl mod/tracker-1.0/objects/scanner/assets/sloodle_tracker_scanner.lslp
+./renameLSL.sh mod/tracker-1.0/sloodle_tracker_button.lsl mod/tracker-1.0/objects/default/assets/sloodle_tracker_button.lslp
+./renameLSL.sh lib/lsl/sloodle_reset_button.lsl assets/buttons/sloodle_reset_button.lslp
+./renameLSL.sh lib/lsl/mem_array.lsl assets/misc/mem_array.lslp
+./renameLSL.sh lib/lsl/sloodle_open_in_browser.lsl assets/buttons/sloodle_open_in_browser.lslp
+./renameLSL.sh lib/lsl/memory_controller.lsl assets/misc/memory_controller.lslp
+./renameLSL.sh lib/lsl/error_messages.lsl assets/misc/error_messages.lslp
+./renameLSL.sh lib/lsl/sloodle_status_codes.lsl assets/misc/sloodle_status_codes.lslp
+./renameLSL.sh toolbar/lsl/sloodle_blog_channel_display.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/sloodle_blog_channel_display.lslp
+./renameLSL.sh toolbar/lsl/sloodle_blog_hud.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/sloodle_blog_hud.lslp
+./renameLSL.sh toolbar/lsl/toolbar-menu.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/toolbar-menu.lslp
+./renameLSL.sh toolbar/lsl/blog_length_meter.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/blog_length_meter.lslp
+./renameLSL.sh toolbar/lsl/sloodle_avilister.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/sloodle_avilister.lslp
+./renameLSL.sh toolbar/lsl/toolbar-menu.lsl.os mod/toolbar_giver-1.0/objects/toolbar/assets/toolbar-menu.lslp.os
+./renameLSL.sh toolbar/lsl/sloodle_blog_visibility_display.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/sloodle_blog_visibility_display.lslp
+./renameLSL.sh toolbar/lsl/sloodle_blog_ready_display.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/sloodle_blog_ready_display.lslp
+./renameLSL.sh toolbar/lsl/sloodle_toolbar_giver.lsl mod/toolbar_giver-1.0/objects/toolbar/assets/sloodle_toolbar_giver.lslp
+./renameLSL.sh lsl/sloodle_parallel_url_loader_1.lsl assets/sloodle_parallel_url_loader_1.lslp
+./renameLSL.sh lsl/sloodle_url_loader.lsl assets/sloodle_url_loader.lslp
+./renameLSL.sh lsl/sloodle_parallel_url_loader_x.lsl assets/sloodle_parallel_url_loader_x.lslp
+./renameLSL.sh lsl/sloodle_setup_notecard.lsl assets/sloodle_setup_notecard.lslp
+./renameLSL.sh lsl/sloodle_parallel_url_loader_3.lsl assets/sloodle_parallel_url_loader_3.lslp
+./renameLSL.sh lsl/sloodle_setup_web.lsl assets/sloodle_setup_web.lslp
+./renameLSL.sh lsl/sloodle_hover_text_displayer.lsl assets/sloodle_hover_text_displayer.lslp
+./renameLSL.sh lsl/sloodle_layout_object.lsl assets/sloodle_layout_object.lslp
+./renameLSL.sh lsl/sloodle_email_login_details.lsl assets/sloodle_email_login_details.lslp
+./renameLSL.sh lsl/xytext/xytext.lsl.16 assets/xytext/xytext.lslp.16
+./renameLSL.sh lsl/xytext/xytext.lsl.24 assets/xytext/xytext.lslp.24
+./renameLSL.sh lsl/xytext/xytext.lsl.4 assets/xytext/xytext.lslp.4
+./renameLSL.sh lsl/xytext/xytext.lsl.13 assets/xytext/xytext.lslp.13
+./renameLSL.sh lsl/xytext/xytext.lsl.15 assets/xytext/xytext.lslp.15
+./renameLSL.sh lsl/xytext/xytext.lsl.14 assets/xytext/xytext.lslp.14
+./renameLSL.sh lsl/xytext/xytext.lsl.1 assets/xytext/xytext.lslp.1
+./renameLSL.sh lsl/xytext/xytext.lsl.10 assets/xytext/xytext.lslp.10
+./renameLSL.sh lsl/xytext/xytext.lsl.8 assets/xytext/xytext.lslp.8
+./renameLSL.sh lsl/xytext/xytext.lsl.17 assets/xytext/xytext.lslp.17
+./renameLSL.sh lsl/xytext/xytext.lsl.23 assets/xytext/xytext.lslp.23
+./renameLSL.sh lsl/xytext/xytext.lsl.3 assets/xytext/xytext.lslp.3
+./renameLSL.sh lsl/xytext/xytext.lsl.5 assets/xytext/xytext.lslp.5
+./renameLSL.sh lsl/xytext/xytext.lsl.22 assets/xytext/xytext.lslp.22
+./renameLSL.sh lsl/xytext/xytext.lsl.21 assets/xytext/xytext.lslp.21
+./renameLSL.sh lsl/xytext/xytext.lsl.20 assets/xytext/xytext.lslp.20
+./renameLSL.sh lsl/xytext/xytext.lsl.12 assets/xytext/xytext.lslp.12
+./renameLSL.sh lsl/xytext/xytext.lsl.18 assets/xytext/xytext.lslp.18
+./renameLSL.sh lsl/xytext/xytext.lsl.19 assets/xytext/xytext.lslp.19
+./renameLSL.sh lsl/xytext/xytext.lsl.7 assets/xytext/xytext.lslp.7
+./renameLSL.sh lsl/xytext/xytext.lsl.11 assets/xytext/xytext.lslp.11
+./renameLSL.sh lsl/xytext/xytext.lsl.2 assets/xytext/xytext.lslp.2
+./renameLSL.sh lsl/xytext/xytext.lsl.6 assets/xytext/xytext.lslp.6
+./renameLSL.sh lsl/xytext/xytext.lsl.9 assets/xytext/xytext.lslp.9
+./renameLSL.sh lsl/sloodle_setup_user.lsl assets/misc/sloodle_setup_user.lslp
+./renameLSL.sh lsl/sloodle_parallel_url_loader_2.lsl assets/misc/sloodle_parallel_url_loader_2.lsl
+./renameLSL.sh lsl/sloodle_manual_reg_enrol.lsl assets/misc/sloodle_manual_reg_enrol.lsl
+./renameLSL.sh lsl/sloodle_multi_url_loader.lsl assets/misc/sloodle_multi_url_loader.lslp
+./renameLSL.sh lsl/sloodle_error_message_handler.lsl assets/misc/sloodle_error_message_handler.lslp
+./renameLSL.sh lsl/sloodle_parallel_url_loader_0.lsl assets/misc/sloodle_parallel_url_loader_0.lslp
+./renameLSL.sh lang/en/sloodle_translation_choice_en.lsl mod/choice-1.0/objects/default/assets/lang/en/sloodle_translation_choice_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_pwreset_en.lsl mod/pwreset-1.0/objects/default/assets/lang/en/sloodle_translation_pwreset_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_quiz_pile_on_en.lsl mod/quiz_pile_on-1.0/objects/default/assets/lang/en/sloodle_translation_quiz_pile_on_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_presenter_en.lsl mod/presenter-1.0/objects/default/assets/lang/en/sloodle_translation_presenter_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_en.lsl assets/lang/en/sloodle_translation_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_regenrol_en.lsl mod/regenrolbooth-1.0/objects/default/assets/lang/en/sloodle_translation_regenrol_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_quiz_en.lsl mod/quiz-1.0/objects/default/assets/lang/en/sloodle_translation_quiz_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_toolbar_en.lsl mod/toolbar_giver-1.0/objects/default/assets/lang/en/sloodle_translation_toolbar_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_metagloss_en.lsl mod/glossary-1.0/objects/default/assets/lang/en/sloodle_translation_metagloss_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_webintercom_en.lsl mod/chat-1.0/objects/default/assets/lang/en/sloodle_translation_webintercom_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_distributor_en.lsl mod/distributor-1.0/objects/default/assets/lang/en/sloodle_translation_distributor_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_avilister_en.lsl mod/toolbar_giver-1.0/objects/default/assets/lang/en/sloodle_translation_avilister_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_assignment_en.lsl mod/primdrop-1.0/objects/default/assets/lang/en/sloodle_translation_assignment_en.lslp
+./renameLSL.sh lang/en/sloodle_translation_set_en.lsl mod/set-1.0/objects/default/assets/lang/en/sloodle_translation_set_en.lslp
+./renameLSL.sh lang/fr_utf8/sloodle_translation_toolbar_fr.lsl mod/toolbar_giver-1.0/objects/default/assets/lang/fr/sloodle_translation_toolbar_fr.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_choice_en.lsl mod/choice-1.0/objects/default/assets/lang/en/sloodle_translation_choice_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_pwreset_en.lsl mod/pwreset-1.0/objects/default/assets/lang/en/sloodle_translation_pwreset_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_quiz_pile_on_en.lsl mod/quiz_pile_on-1.0/objects/default/assets/lang/en/sloodle_translation_quiz_pile_on_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_presenter_en.lsl mod/presenter-1.0/objects/default/assets/lang/en/sloodle_translation_presenter_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_en.lsl assets/lang/en/sloodle_translation_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_regenrol_en.lsl mod/regenrolbooth-1.0/objects/default/assets/lang/en/sloodle_translation_regenrol_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_quiz_en.lsl mod/quiz-1.0/objects/default/assets/lang/en/sloodle_translation_quiz_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_toolbar_en.lsl mod/toolbar_giver-1.0/objects/default/assets/lang/en/sloodle_translation_toolbar_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_metagloss_en.lsl mod/glossary-1.0/objects/default/assets/lang/en/sloodle_translation_metagloss_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_webintercom_en.lsl mod/chat-1.0/objects/default/assets/lang/en/sloodle_translation_webintercom_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_distributor_en.lsl mod/distributor-1.0/objects/default/assets/lang/en/sloodle_translation_distributor_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_avilister_en.lsl mod/toolbar_giver-1.0/objects/default/assets/lang/en/sloodle_translation_avilister_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_assignment_en.lsl mod/primdrop-1.0/objects/default/assets/lang/en/sloodle_translation_assignment_en.lslp
+./renameLSL.sh lang/en_utf8/sloodle_translation_set_en.lsl mod/set-1.0/objects/default/assets/lang/en/sloodle_translation_set_en.lslp
+./renameLSL.sh lang/fr/sloodle_translation_toolbar_fr.lsl mod/toolbar_giver-1.0/objects/default/assets/lang/fr/sloodle_translation_toolbar_fr.lslp
+
+

+ 11 - 0
opensim_sync/markLSLScripts.sh

@@ -0,0 +1,11 @@
+#!/bin/sh
+# Commands to append a note to every LSL script under trunk with a showing where it lives in SVN.
+# This is intended to help us deploy from Subversion directly into an .oar file.
+# ...or commit code changed in an object back into Subversion without any unreliable copying-and-pasting.
+# We may need something slightly more sophisticated later to cope with moving things around.
+
+cd ../../moodle-mod_sloodle
+#find * -name '*.lsl' -exec sh -c "echo \"// Please leave the following line intact to show where the script lives in Git:\n// SLOODLE LSL Script Git Location: {} \" >> {}" \;
+find * -name '*.lsl' -exec sh -c "if ! grep -q \"SLOODLE LSL Script Subversion Location\" {}; then echo \"\n// Please leave the following line intact to show where the script lives in Git:\n// SLOODLE LSL Script Git Location: {} \" >> {}; fi" \;
+find * -name '*.lslp' -exec sh -c "if ! grep -q \"SLOODLE LSL Script Subversion Location\" {}; then echo \"\n// Please leave the following line intact to show where the script lives in Git:\n// SLOODLE LSL Script Git Location: {} \" >> {}; fi" \;
+

+ 8 - 0
opensim_sync/opensimProofLSLScripts.sh

@@ -0,0 +1,8 @@
+#!/bin/sh
+# Add markins at the top of the file to displace comments that may be there.
+# This stops OpenSim from mistaking them for script engine information.
+
+cd ../../moodle-mod_sloodle
+#find * -name '*.lsl' -exec sh -c "echo \"// Please leave the following line intact to show where the script lives in Git:\n// SLOODLE LSL Script Git Location: {} \" >> {}" \;
+find * -name '*.lsl' -exec sh -c "if ! grep -q \"The line above should\" {}; then mv {} {}.tmp; echo \"//\n// The line above should be left blank to avoid script errors in OpenSim.\n\" >> {}; cat {}.tmp >> {}; rm {}.tmp; fi" \;
+

+ 25 - 0
opensim_sync/renameLSL.sh

@@ -0,0 +1,25 @@
+#!/bin/bash 
+
+BEFORE=$1
+AFTER=$2
+
+pushd ../../moodle-mod_sloodle
+if [ ! -f "$AFTER" ]; then
+	if [ ! -d "$AFTER" ]; then
+		mkdir -p $AFTER
+		rmdir $AFTER
+		git mv $BEFORE $AFTER
+	fi
+	git mv $BEFORE $AFTER
+fi
+
+find . -type f -name '*.lslp' -print0 | xargs -0 perl -i -pe "s#$BEFORE#$AFTER#g" *.lsl
+popd
+
+pushd ../../avatarclassroom_opensim_iar/iar/assets
+perl -i -pe "s#$BEFORE#$AFTER#g" *.lsl
+popd
+
+pushd ../../sloodle_opensim_iar/iar/assets
+perl -i -pe "s#$BEFORE#$AFTER#g" *.lsl
+popd

+ 61 - 0
opensim_sync/syncGITScriptsToIAR.sh

@@ -0,0 +1,61 @@
+#!/bin/sh 
+#
+# Edmund Edgar, 2010-11-01 as part of the Sloodle Project. 
+# Licensed under the same license as Sloodle.
+# Script to copy over a single file in an opensim archive with the matching contents from Git.
+# For legacy reasons, this still says "Git".
+# Assumes that both the LSL script in the iar fila and its counterpart in GIT contain a line like the following:
+# // SLOODLE LSL Script Git Location: mod/awards-1.0/lsl/xytext_prims/xytext.lsl
+# It is intended that this script will be passed the results of a "find" command, allowing us to sync a whole .iar file in one go.
+# NB There may be some mistakes in the Git location lines in the iar file - these should turn up the first time we sync.
+#
+# Example of intended use:
+# cd working/sloodle_opensim_iar
+# git pull
+# find iar/ -name '*.lsl' -exec ../sloodle_development_tools/opensim_sync/syncGITScriptsToIAR.sh {} \;
+# git diff iar | more
+# # Scan through the changes to make sure they make sense
+# git add -a
+# git commit -a
+# git push
+
+# The name of your sloodle module checkout
+SLOODLE_ROOT=../moodle-mod_sloodle
+
+if [ $# -ne 1 ]
+then
+    echo "Usage: $0 <filename.lslp>"
+    exit 1
+fi
+
+FILE=$1
+
+if test ! -f "$FILE"
+then
+    echo "Script $FILE not found in iar file"
+    exit 2
+fi
+
+GIT_SCRIPT="`grep "SLOODLE LSL Script Git Location: " "$FILE" | awk -F': ' '{print $2}' | sed 's/\n//g' | sed 's/\s$//g'`"
+
+if test -z "$GIT_SCRIPT"
+then
+    echo "No GIT location specified in file $FILE"
+    exit 5
+fi
+
+GIT_SCRIPT="${SLOODLE_ROOT}/${GIT_SCRIPT}"
+ echo $GIT_SCRIPT
+
+
+
+if test ! -f "$GIT_SCRIPT"
+then
+    echo "Script $GIT_SCRIPT for file $FILE not found in sloodle repo"
+    exit 4
+fi
+
+if [ `diff --brief -x --ignore-eol-style $GIT_SCRIPT $FILE | wc -l` -gt 0 ]
+then
+    cp $GIT_SCRIPT $FILE
+fi

+ 63 - 0
opensim_sync/syncIARScriptsToGIT.sh

@@ -0,0 +1,63 @@
+#!/bin/sh 
+#
+# Edmund Edgar, 2010-11-01 as part of the Sloodle Project. 
+# Licensed under the same license as Sloodle.
+# Script to copy over a single file in an opensim archive with the matching contents from Git.
+# For legacy reasons, this still says "Git".
+# Assumes that both the LSL script in the iar fila and its counterpart in GIT contain a line like the following:
+# // SLOODLE LSL Script Git Location: mod/awards-1.0/lsl/xytext_prims/xytext.lslp
+# It is intended that this script will be passed the results of a "find" command, allowing us to sync a whole .iar file in one go.
+# NB There may be some mistakes in the Git location lines in the iar file - these should turn up the first time we sync.
+#
+# Example of intended use:
+# cd working/sloodle_opensim_iar
+# git pull
+# find iar/ -name '*.lslp' -exec ../sloodle_development_tools/opensim_sync/syncIARScriptsToGIT.sh {} \;
+# git diff iar | more
+# # Scan through the changes to make sure they make sense
+# git add -a
+# git commit -a
+# git push
+
+# The name of your sloodle module checkout
+SLOODLE_ROOT=../moodle-mod_sloodle
+
+if [ $# -ne 1 ]
+then
+    echo "Usage: $0 <filename.lslp>"
+    exit 1
+fi
+
+FILE=$1
+
+if test ! -f "$FILE"
+then
+    echo "Script $FILE not found in iar file"
+    exit 2
+fi
+
+GIT_SCRIPT="`grep "SLOODLE LSL Script Git Location: " "$FILE" | awk -F': ' '{print $2}' | sed 's/\n//g' | sed 's/\s$//g'`"
+
+if test -z "$GIT_SCRIPT"
+then
+    echo "No GIT location specified in file $FILE"
+    exit 5
+fi
+
+GIT_SCRIPT="${SLOODLE_ROOT}/${GIT_SCRIPT}"
+ echo $GIT_SCRIPT
+
+
+
+if test ! -f "$GIT_SCRIPT"
+then
+    echo "Script $GIT_SCRIPT for file $FILE not found in sloodle repo"
+    exit 4
+fi
+
+if [ `diff --brief -x --ignore-eol-style --ignore-all-space $GIT_SCRIPT $FILE | wc -l` -gt 0 ]
+then
+    #cp $GIT_SCRIPT $FILE
+    NEWFN=`echo $FILE | sed 's/.*\///'`
+    cp $FILE "$GIT_SCRIPT.$NEWFN"
+fi