1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-03 21:27:25 +02:00

Quality control for e_file::unzipGithubArchive()

- MOD: PHPDoc for e_file::unzipGithubArchive()
- NEW: e_file::unzipGithubArchive(): Added exclusions for files that don't exist in production
- NEW: e_file::unzipGithubArchive(): Accept a destination path argument for a custom extraction location
- NEW: Restored unimplemented skipped list in e_file::unzipGithubArchive()
- FIX: e_file::unzipGithubArchive(): Extraction fails if parent directory of file doesn't exist
- MOD: Type hint for Base::$deployer
- NEW: Basic test for e_file::unzipGithubArchive()
This commit is contained in:
Nick Liu
2019-12-27 11:33:21 -06:00
parent 3fca73064a
commit 3b4240bbae
3 changed files with 414 additions and 320 deletions

View File

@@ -1664,10 +1664,16 @@ class e_file
} }
/**
* Download and extract a zipped copy of e107
* @param string $url "core" to download the e107 core from Git master or
public function unzipGithubArchive($url='core') * a custom download URL
* @param string $destination_path The e107 root where the downloaded archive should be extracted,
* with a directory separator at the end
* @return array|bool FALSE on failure;
* An array of successful and failed path extractions
*/
public function unzipGithubArchive($url='core', $destination_path = e_BASE)
{ {
switch($url) switch($url)
@@ -1675,8 +1681,21 @@ class e_file
case "core": case "core":
$localfile = 'e107-master.zip'; $localfile = 'e107-master.zip';
$remotefile = 'https://codeload.github.com/e107inc/e107/zip/master'; $remotefile = 'https://codeload.github.com/e107inc/e107/zip/master';
$excludes = array('e107-master/install.php','e107-master/favicon.ico'); $excludes = array(
$excludeMatch = false; 'e107-master/.codeclimate.yml',
'e107-master/.editorconfig',
'e107-master/.gitignore',
'e107-master/.gitmodules',
'e107-master/CONTRIBUTING.md', # moved to ./.github/CONTRIBUTING.md
'e107-master/LICENSE',
'e107-master/README.md',
'e107-master/install.php',
'e107-master/favicon.ico',
);
$excludeMatch = array(
'/.github/',
'/e107_tests/',
);
break; break;
// language. // language.
@@ -1712,18 +1731,18 @@ class e_file
$excludes[] = $zipBase; $excludes[] = $zipBase;
$newFolders = array( $newFolders = array(
$zipBase.'/e107_admin/' => e_BASE.e107::getFolder('ADMIN'), $zipBase.'/e107_admin/' => $destination_path.e107::getFolder('ADMIN'),
$zipBase.'/e107_core/' => e_BASE.e107::getFolder('CORE'), $zipBase.'/e107_core/' => $destination_path.e107::getFolder('CORE'),
$zipBase.'/e107_docs/' => e_BASE.e107::getFolder('DOCS'), $zipBase.'/e107_docs/' => $destination_path.e107::getFolder('DOCS'),
$zipBase.'/e107_handlers/' => e_BASE.e107::getFolder('HANDLERS'), $zipBase.'/e107_handlers/' => $destination_path.e107::getFolder('HANDLERS'),
$zipBase.'/e107_images/' => e_BASE.e107::getFolder('IMAGES'), $zipBase.'/e107_images/' => $destination_path.e107::getFolder('IMAGES'),
$zipBase.'/e107_languages/' => e_BASE.e107::getFolder('LANGUAGES'), $zipBase.'/e107_languages/' => $destination_path.e107::getFolder('LANGUAGES'),
$zipBase.'/e107_media/' => e_BASE.e107::getFolder('MEDIA'), $zipBase.'/e107_media/' => $destination_path.e107::getFolder('MEDIA'),
$zipBase.'/e107_plugins/' => e_BASE.e107::getFolder('PLUGINS'), $zipBase.'/e107_plugins/' => $destination_path.e107::getFolder('PLUGINS'),
$zipBase.'/e107_system/' => e_BASE.e107::getFolder('SYSTEM'), $zipBase.'/e107_system/' => $destination_path.e107::getFolder('SYSTEM'),
$zipBase.'/e107_themes/' => e_BASE.e107::getFolder('THEMES'), $zipBase.'/e107_themes/' => $destination_path.e107::getFolder('THEMES'),
$zipBase.'/e107_web/' => e_BASE.e107::getFolder('WEB'), $zipBase.'/e107_web/' => $destination_path.e107::getFolder('WEB'),
$zipBase.'/' => e_BASE $zipBase.'/' => $destination_path
); );
$srch = array_keys($newFolders); $srch = array_keys($newFolders);
@@ -1734,35 +1753,28 @@ class e_file
$error = array(); $error = array();
$success = array(); $success = array();
// $skipped = array(); $skipped = array();
foreach($unarc as $k=>$v) foreach($unarc as $k=>$v)
{ {
if($this->matchFound($v['stored_filename'],$excludeMatch)) if($this->matchFound($v['stored_filename'],$excludeMatch) ||
{ in_array($v['stored_filename'],$excludes))
continue;
}
if(in_array($v['stored_filename'],$excludes))
{ {
$skipped[] = $v['stored_filename'];
continue; continue;
} }
$oldPath = $v['filename']; $oldPath = $v['filename'];
$newPath = str_replace($srch,$repl, $v['stored_filename']); $newPath = str_replace($srch,$repl, $v['stored_filename']);
/*
$success[] = $newPath;
continue;*/
if($v['folder'] ==1 && is_dir($newPath)) if($v['folder'] ==1 && is_dir($newPath))
{ {
// $skipped[] = $newPath. " (already exists)"; // $skipped[] = $newPath. " (already exists)";
continue; continue;
} }
mkdir(dirname($newPath), 0755, true);
if(!rename($oldPath,$newPath)) if(!rename($oldPath,$newPath))
{ {
$error[] = $newPath; $error[] = $newPath;
@@ -1774,9 +1786,7 @@ class e_file
} }
return array('success'=>$success, 'error'=>$error, 'skipped'=>$skipped);
return array('success'=>$success, 'error'=>$error);
} }

View File

@@ -7,6 +7,9 @@ include_once(codecept_root_dir() . "lib/deployers/DeployerFactory.php");
abstract class Base extends \Codeception\Module abstract class Base extends \Codeception\Module
{ {
/**
* @var \Deployer
*/
protected $deployer; protected $deployer;
protected $deployer_components = ['db', 'fs']; protected $deployer_components = ['db', 'fs'];

View File

@@ -1,16 +1,16 @@
<?php <?php
/** /**
* e107 website system * e107 website system
* *
* Copyright (C) 2008-2018 e107 Inc (e107.org) * Copyright (C) 2008-2019 e107 Inc (e107.org)
* Released under the terms and conditions of the * Released under the terms and conditions of the
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
* *
*/ */
class e_fileTest extends \Codeception\Test\Unit class e_fileTest extends \Codeception\Test\Unit
{ {
/** @var e_file */ /** @var e_file */
protected $fl; protected $fl;
@@ -104,7 +104,7 @@
} }
} }
/* /*
public function testSend() public function testSend()
{ {
@@ -174,7 +174,7 @@
{ {
} }
*/ */
public function testFile_size_decode() public function testFile_size_decode()
{ {
$arr = array( $arr = array(
@@ -194,7 +194,7 @@
} }
} }
/* /*
public function testZip() public function testZip()
{ {
@@ -245,7 +245,7 @@
} }
/* /*
public function testPrepareDirectory() public function testPrepareDirectory()
{ {
@@ -275,12 +275,93 @@
{ {
} }
*/
public function testUnzipGithubArchive() public function testUnzipGithubArchive()
{ {
$prefix = 'e107-master';
$fake_e107_files = [
'desired' => [
'/index.php',
'/e107_admin/index.html',
'/e107_core/index.html',
'/e107_docs/index.html',
'/e107_handlers/index.html',
'/e107_images/index.html',
'/e107_languages/index.html',
'/e107_media/index.html',
'/e107_plugins/index.html',
'/e107_system/index.html',
'/e107_themes/index.html',
'/e107_web/index.html',
],
'undesired' => [
'/.github/codecov.yml',
'/e107_tests/index.php',
'/.codeclimate.yml',
'/.editorconfig',
'/.gitignore',
'/.gitmodules',
'/CONTRIBUTING.md',
'/LICENSE',
'/README.md',
'/install.php',
'/favicon.ico',
]
];
$src_dest_map = array(
'/e107_admin/' => '/'.e107::getFolder('ADMIN'),
'/e107_core/' => '/'.e107::getFolder('CORE'),
'/e107_docs/' => '/'.e107::getFolder('DOCS'),
'/e107_handlers/' => '/'.e107::getFolder('HANDLERS'),
'/e107_images/' => '/'.e107::getFolder('IMAGES'),
'/e107_languages/' => '/'.e107::getFolder('LANGUAGES'),
'/e107_media/' => '/'.e107::getFolder('MEDIA'),
'/e107_plugins/' => '/'.e107::getFolder('PLUGINS'),
'/e107_system/' => '/'.e107::getFolder('SYSTEM'),
'/e107_themes/' => '/'.e107::getFolder('THEMES'),
'/e107_web/' => '/'.e107::getFolder('WEB'),
);
/**
* @var e_file
*/
$e_file = $this->make('e_file', [
'getRemoteFile' => function($remote_url, $local_file, $type='temp') use ($fake_e107_files, $prefix)
{
touch(e_TEMP.$local_file);
$archive = new ZipArchive();
$archive->open(e_TEMP.$local_file, ZipArchive::OVERWRITE);
array_walk_recursive($fake_e107_files, function($fake_filename) use ($archive, $prefix)
{
$archive->addFromString($prefix.$fake_filename, $fake_filename);
});
$archive->close();
}
]);
$destination = e_TEMP."fake-git-remote-destination/";
mkdir($destination);
$results = $e_file->unzipGithubArchive('core', $destination);
$this->assertEmpty($results['error'], "Errors not expected from Git remote update");
$extraction_mapping = array_flip(e107::getInstance()->e107_dirs);
foreach($fake_e107_files['desired'] as $desired_filename)
{
foreach ($src_dest_map as $src => $dest)
{
$desired_filename = preg_replace("/^".preg_quote($src, '/')."/", $dest, $desired_filename);
}
$this->assertContains(realpath($destination.$desired_filename), $results['success'],
"Desired file did not appear in file system");
}
foreach($fake_e107_files['undesired'] as $undesired_filename)
{
$this->assertContains($prefix.$undesired_filename, $results['skipped']);
}
} }
/*
public function testGetRootFolder() public function testGetRootFolder()
{ {
@@ -300,4 +381,4 @@
{ {
}*/ }*/
} }