Merge branch 'MDL-39442-copy-addon' of git://github.com/mudrd8mz/moodle

Conflicts:
	admin/tool/installaddon/version.php
This commit is contained in:
Dan Poltawski 2013-05-06 10:00:23 +01:00
commit 4736236959
4 changed files with 62 additions and 2 deletions

View File

@ -388,6 +388,52 @@ class tool_installaddon_installer {
}
}
/**
* Moves the given source into a new location recursively
*
* This is cross-device safe implementation to be used instead of the native rename() function.
* See https://bugs.php.net/bug.php?id=54097 for more details.
*
* @param string $source full path to the existing directory
* @param string $target full path to the new location of the directory
*/
public function move_directory($source, $target) {
if (file_exists($target)) {
throw new tool_installaddon_installer_exception('err_folder_already_exists', array('path' => $target));
}
if (is_dir($source)) {
$handle = opendir($source);
} else {
throw new tool_installaddon_installer_exception('err_no_such_folder', array('path' => $source));
}
make_writable_directory($target);
while ($filename = readdir($handle)) {
$sourcepath = $source.'/'.$filename;
$targetpath = $target.'/'.$filename;
if ($filename === '.' or $filename === '..') {
continue;
}
if (is_dir($sourcepath)) {
$this->move_directory($sourcepath, $targetpath);
} else {
rename($sourcepath, $targetpath);
}
}
closedir($handle);
rmdir($source);
clearstatcache();
}
//// End of external API ///////////////////////////////////////////////////
/**

View File

@ -71,6 +71,6 @@ if (file_exists($plugintypepath.'/'.$pluginname)) {
get_string('invaliddata', 'core_error'));
}
rename($zipcontentpath.'/'.$pluginname, $plugintypepath.'/'.$pluginname);
$installer->move_directory($zipcontentpath.'/'.$pluginname, $plugintypepath.'/'.$pluginname);
fulldelete($CFG->tempdir.'/tool_installaddon/'.$jobid);
redirect(new moodle_url('/admin'));

View File

@ -125,6 +125,20 @@ class tool_installaddon_installer_test extends advanced_testcase {
)));
$this->assertSame(false, $installer->testable_decode_remote_request($request));
}
public function test_move_directory() {
$jobid = md5(rand().uniqid('test_', true));
$jobroot = make_temp_directory('tool_installaddon/'.$jobid);
$contentsdir = make_temp_directory('tool_installaddon/'.$jobid.'/contents/sub/folder');
file_put_contents($contentsdir.'/readme.txt', 'Hello world!');
$installer = tool_installaddon_installer::instance();
$installer->move_directory($jobroot.'/contents', $jobroot.'/moved');
$this->assertFalse(is_dir($jobroot.'/contents'));
$this->assertTrue(is_file($jobroot.'/moved/sub/folder/readme.txt'));
$this->assertSame('Hello world!', file_get_contents($jobroot.'/moved/sub/folder/readme.txt'));
}
}

View File

@ -26,4 +26,4 @@ defined('MOODLE_INTERNAL') || die();
$plugin->component = 'tool_installaddon';
$plugin->version = 2013050100;
$plugin->requires = 2013050100;
$plugin->maturity = MATURITY_BETA;
$plugin->maturity = MATURITY_STABLE;