Converter file manager's methods take relative path within the backup instead of the absolute path

This commit is contained in:
David Mudrak 2011-05-29 00:18:19 +02:00
parent 64f7da2402
commit 214c492447
3 changed files with 67 additions and 11 deletions

View File

@ -501,11 +501,10 @@ class moodle1_files_handler extends moodle1_xml_handler {
* Migrates course_files in the converter workdir
*/
protected function migrate_course_files() {
$path = $this->converter->get_tempdir_path().'/course_files';
$ids = array();
$fileman = $this->converter->get_file_manager($this->converter->get_contextid(CONTEXT_COURSE), 'course', 'legacy');
if (file_exists($path)) {
$ids = $fileman->migrate_directory($path);
if (file_exists($this->converter->get_tempdir_path().'/course_files')) {
$ids = $fileman->migrate_directory('course_files');
$this->converter->set_stash('course_files_ids', $ids);
}
}

View File

@ -1027,6 +1027,9 @@ class moodle1_file_manager {
/** @var int user id */
public $userid;
/** @var string the root of the converter temp directory */
protected $basepath;
/** @var textlib instance used during the migration */
protected $textlib;
@ -1044,30 +1047,34 @@ class moodle1_file_manager {
* @param int $userid initial user id of the files being migrated
*/
public function __construct(moodle1_converter $converter, $contextid = null, $component = null, $filearea = null, $itemid = 0, $userid = null) {
// set the initial destination of the migrated files
$this->converter = $converter;
$this->contextid = $contextid;
$this->component = $component;
$this->filearea = $filearea;
$this->itemid = $itemid;
$this->userid = $userid;
// set other useful bits
$this->basepath = $converter->get_tempdir_path();
$this->textlib = textlib_get_instance();
}
/**
* Migrates one given file stored on disk
*
* @param string $sourcefullpath the full path to the source local file
* @param string $sourcepath the path to the source local file within the backup archive {@example 'moddata/foobar/file.ext'}
* @param string $filepath the file path of the migrated file, defaults to the root directory '/'
* @param string $filename the name of the migrated file, defaults to the same as the source file has
* @param int $timecreated override the timestamp of when the migrated file should appear as created
* @param int $timemodified override the timestamp of when the migrated file should appear as modified
* @return int id of the migrated file
*/
public function migrate_file($sourcefullpath, $filepath = '/', $filename = null, $timecreated = null, $timemodified = null) {
public function migrate_file($sourcepath, $filepath = '/', $filename = null, $timecreated = null, $timemodified = null) {
$sourcefullpath = $this->basepath.'/'.$sourcepath;
if (!is_readable($sourcefullpath)) {
throw new moodle1_convert_exception('file_not_readable');
throw new moodle1_convert_exception('file_not_readable', $sourcefullpath);
}
$filepath = clean_param($filepath, PARAM_PATH);
@ -1111,7 +1118,7 @@ class moodle1_file_manager {
/**
* Migrates all files in the given directory
*
* @param string $rootpath full path to the root directory containing the files (like course_files)
* @param string $rootpath path within the backup archive to the root directory containing the files {@example 'course_files'}
* @param string $relpath relative path used during the recursion - do not provide when calling this!
* @return array ids of the migrated files
*/
@ -1124,8 +1131,7 @@ class moodle1_file_manager {
$this->stash_file($filerecord);
$fileids[] = $filerecord['id'];
$fullpath = $rootpath.$relpath;
$items = new DirectoryIterator($fullpath);
$items = new DirectoryIterator($this->basepath.'/'.$rootpath.$relpath);
foreach ($items as $item) {
@ -1138,7 +1144,8 @@ class moodle1_file_manager {
}
if ($item->isFile()) {
$fileids[] = $this->migrate_file($item->getPathname(), $relpath, $item->getFilename(), $item->getCTime(), $item->getMTime());
$fileids[] = $this->migrate_file(substr($item->getPathname(), strlen($this->basepath.'/')),
$relpath, $item->getFilename(), $item->getCTime(), $item->getMTime());
} else {
$dirname = clean_param($item->getFilename(), PARAM_PATH);

View File

@ -40,6 +40,7 @@ class moodle1_converter_test extends UnitTestCase {
$this->tempdir = convert_helper::generate_id('simpletest');
check_dir_exists("$CFG->dataroot/temp/backup/$this->tempdir/course_files/sub1");
check_dir_exists("$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/7");
copy(
"$CFG->dirroot/backup/converter/moodle1/simpletest/files/moodle.xml",
"$CFG->dataroot/temp/backup/$this->tempdir/moodle.xml"
@ -52,6 +53,18 @@ class moodle1_converter_test extends UnitTestCase {
"$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
"$CFG->dataroot/temp/backup/$this->tempdir/course_files/sub1/file2.gif"
);
copy(
"$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
"$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/file1.gif"
);
copy(
"$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
"$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/icon.gif"
);
copy(
"$CFG->dirroot/backup/converter/moodle1/simpletest/files/icon.gif",
"$CFG->dataroot/temp/backup/$this->tempdir/moddata/unittest/4/7/icon.gif"
);
}
public function tearDown() {
@ -182,6 +195,43 @@ class moodle1_converter_test extends UnitTestCase {
$this->assertTrue($id2 < $id3);
}
public function test_migrate_file() {
// set-up the file manager
$converter = convert_factory::get_converter('moodle1', $this->tempdir);
$converter->create_stash_storage();
$contextid = $converter->get_contextid(CONTEXT_MODULE, 32);
$fileman = $converter->get_file_manager($contextid, 'mod_unittest', 'testarea');
// this fileman has not converted anything yet
$fileids = $fileman->get_fileids();
$this->assertIsA($fileids, 'array');
$this->assertEqual(0, count($fileids));
// migrate a single file
$fileman->itemid = 4;
$fileman->migrate_file('moddata/unittest/4/icon.gif');
$this->assertTrue(is_file($converter->get_workdir_path().'/files/4e/4ea114b0558f53e3af8dd9afc0e0810a95c2a724'));
// get the file id
$fileids = $fileman->get_fileids();
$this->assertIsA($fileids, 'array');
$this->assertEqual(1, count($fileids));
// migrate another single file into another file area
$fileman->filearea = 'anotherarea';
$fileman->itemid = 7;
$fileman->migrate_file('moddata/unittest/4/7/icon.gif', '/', 'renamed.gif');
// get the file records
$filerecordids = $converter->get_stash_itemids('files');
foreach ($filerecordids as $filerecordid) {
$filerecord = $converter->get_stash('files', $filerecordid);
$this->assertEqual('4ea114b0558f53e3af8dd9afc0e0810a95c2a724', $filerecord['contenthash']);
$this->assertEqual($contextid, $filerecord['contextid']);
$this->assertEqual('mod_unittest', $filerecord['component']);
if ($filerecord['filearea'] === 'testarea') {
$this->assertEqual(4, $filerecord['itemid']);
$this->assertEqual('icon.gif', $filerecord['filename']);
}
}
$converter->drop_stash_storage();
}
public function test_convert_run_convert() {
$converter = convert_factory::get_converter('moodle1', $this->tempdir);
$converter->convert();