-
Notifications
You must be signed in to change notification settings - Fork 385
Add import and export logic #110
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
artemiomorales
merged 22 commits into
WordPress:trunk
from
artemiomorales:try/add-import-export-functionality
Feb 24, 2023
Merged
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit
Hold shift + click to select a range
d9543b9
Add rough import / export logic and debug input fields
artemiomorales 53f2ea7
Move export logic to PHP
artemiomorales c4bdd8f
Migrate import logic to PHP
artemiomorales 4e7813e
Add support for exporting/importing database; remove export of 'wp-in…
artemiomorales 502271d
Remove extra spaces around PHP declarations and extraneous closing tags
artemiomorales 3064736
Move DOCROOT const to config file
artemiomorales 1dcdd0e
Add error handling to custom PHP run() code; rename variables
artemiomorales 03a0a96
Install WordPress Importer by default in WP bundle
artemiomorales 00457a5
Rebuild WordPress versions
artemiomorales cd720c1
Fix full site editing
artemiomorales 9c997bb
Add UI for migration logic
artemiomorales fe837c0
Reset build/ folder to HEAD
artemiomorales e48b217
Rebuild WP bundles to include WordPress Importer
artemiomorales b505cf5
Add descriptive text for modal
artemiomorales e9c1400
Add WordPress version to export filename
artemiomorales 6e62b40
Fix bug when using PHP 7.0-7.3
artemiomorales f92cb88
Move generateZipFile() code to separate PHP file; begin adding tests
artemiomorales 6f9a3b6
Begin moving import code to separate file; add tests
artemiomorales 5333bbd
Move import overwrite logic to separate file; add tests; fix a bug
artemiomorales 0badcd2
Add known limitations regarding media, options/users, and plugins to …
artemiomorales 429f07b
Replace rmSync calls with rmdirSync to remove Typscript warnings
artemiomorales a969224
Fix code formatting and spacing issues
artemiomorales File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Move generateZipFile() code to separate PHP file; begin adding tests
In order to test the behavior of the migration feature's PHP code, I moved that code to separate files so that it can be run by Jest. This required modifying the generateZipFile() function a bit to accept parameters.
- Loading branch information
commit f92cb880570e626b8626078fcfee28735daac570
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,151 @@ | ||
| import * as phpLoaderModule from '../../../build/php-7.4.node.js'; | ||
| import { startPHP } from '../../php-wasm/php-node'; | ||
| import { existsSync, rmSync, readFileSync } from 'fs'; | ||
|
|
||
| const { TextDecoder } = require('util'); | ||
|
|
||
| // Mock files | ||
| const testDirPath = __dirname + '/__test39024'; | ||
| const fileSystemPath = testDirPath + '/filesystem'; | ||
| const wpImporterOutputPath = fileSystemPath + '/databaseExport.xml'; | ||
| const wpPath = fileSystemPath + '/wordpress'; | ||
| const wpAdminPath = wpPath + '/wp-admin'; | ||
| const wpContentPath = wpPath + '/wp-content'; | ||
| const wpIncludesPath = wpPath + '/wp-includes'; | ||
| const wpSqlDbPath = wpContentPath + '/database'; | ||
| const exportName = `wordpress-playground-export.zip`; | ||
| const exportPath = `${testDirPath}/${exportName}`; | ||
|
|
||
| // Code to test | ||
| const migrationFilePath = __dirname + '/../migration.php'; | ||
|
|
||
| describe('generateZipFile()', () => { | ||
| let php; | ||
| let migration; | ||
|
|
||
| beforeEach(async () => { | ||
| php = await startPHP(phpLoaderModule, 'NODE'); | ||
| if (existsSync(testDirPath)) { | ||
| rmSync(testDirPath, { recursive: true }); | ||
| } | ||
| migration = readFileSync(migrationFilePath); | ||
| php.mkdirTree(testDirPath); | ||
| php.mkdirTree(fileSystemPath); | ||
| php.mkdirTree(wpPath); | ||
|
|
||
| php.writeFile( | ||
| wpImporterOutputPath, | ||
| 'Mock WordPress Importer migration file' | ||
| ); | ||
|
|
||
| // WP Root | ||
| php.writeFile(`${wpPath}/test-wp-root.php`, 'Mock WP root file'); | ||
|
|
||
| // WP Admin | ||
| php.mkdirTree(wpAdminPath); | ||
| php.writeFile(`${wpAdminPath}/test-admin.php`, 'Mock WP admin file'); | ||
|
|
||
| // WP Content | ||
| php.mkdirTree(wpContentPath); | ||
| php.writeFile( | ||
| `${wpContentPath}/test-content.php`, | ||
| 'Mock WP content file' | ||
| ); | ||
| php.mkdirTree(wpSqlDbPath); | ||
| php.writeFile(`${wpSqlDbPath}/test-database.php`, 'Mock SQL content'); | ||
|
|
||
| // WP Includes | ||
| php.mkdirTree(wpIncludesPath); | ||
| php.writeFile( | ||
| `${wpIncludesPath}/test-includes.php`, | ||
| 'Mock WP includes' | ||
| ); | ||
|
|
||
| const exportWriteRequest = php.run({ | ||
| code: | ||
| migration + | ||
| ` generateZipFile("${exportPath}", "${wpImporterOutputPath}", "${wpPath}");`, | ||
| }); | ||
|
|
||
| if (exportWriteRequest.exitCode !== 0) { | ||
| throw exportWriteRequest.errors; | ||
| } | ||
| }); | ||
|
|
||
| afterAll(() => { | ||
| if (existsSync(testDirPath)) { | ||
| rmSync(testDirPath, { recursive: true }); | ||
| } | ||
| }); | ||
|
|
||
| it('should creata a ZIP file of specified WP Importer output file and WordPress files', () => { | ||
| const runTest = php.run({ | ||
| code: ` | ||
| <?php | ||
| $zip = new ZipArchive; | ||
| $res = $zip->open('${exportPath}'); | ||
| if ($res === TRUE) { | ||
| if( | ||
| $zip->getFromName('${wpImporterOutputPath}') && | ||
| $zip->getFromName('${wpPath}/test-wp-root.php') && | ||
| $zip->getFromName('${wpContentPath}/test-content.php') | ||
| ) { | ||
| echo 'success'; | ||
| } else { | ||
| echo 'failure'; | ||
| } | ||
| } | ||
| `, | ||
| }); | ||
|
|
||
| const runTestOutput = new TextDecoder().decode(runTest.body).trim(); | ||
|
|
||
| expect(runTestOutput).toEqual('success'); | ||
| }); | ||
|
|
||
| it('should omit wp-content/database directory', () => { | ||
| const runTest = php.run({ | ||
| code: ` | ||
| <?php | ||
| $zip = new ZipArchive; | ||
| $res = $zip->open('${exportPath}'); | ||
| if ($res === TRUE) { | ||
| if( | ||
| !$zip->getFromName('${wpSqlDbPath}/test-database.php') | ||
| ) { | ||
| echo 'success'; | ||
| } else { | ||
| echo 'failure'; | ||
| } | ||
| } | ||
| `, | ||
| }); | ||
|
|
||
| const runTestOutput = new TextDecoder().decode(runTest.body).trim(); | ||
|
|
||
| expect(runTestOutput).toEqual('success'); | ||
| }); | ||
|
|
||
| it('should omit wp-includes directory', () => { | ||
| const runTest = php.run({ | ||
| code: ` | ||
| <?php | ||
| $zip = new ZipArchive; | ||
| $res = $zip->open('${exportPath}'); | ||
| if ($res === TRUE) { | ||
| if( | ||
| !$zip->getFromName('${wpIncludesPath}/test-includes.php') | ||
| ) { | ||
| echo 'success'; | ||
| } else { | ||
| echo 'failure'; | ||
| } | ||
| } | ||
| `, | ||
| }); | ||
|
|
||
| const runTestOutput = new TextDecoder().decode(runTest.body).trim(); | ||
|
|
||
| expect(runTestOutput).toEqual('success'); | ||
| }); | ||
| }); | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,43 @@ | ||
| <?php | ||
|
|
||
| function generateZipFile($exportPath, $databasePath, $docRoot) { | ||
| $zip = new ZipArchive; | ||
| $res = $zip->open($exportPath, ZipArchive::CREATE); | ||
| if ($res === TRUE) { | ||
| $zip->addFile($databasePath); | ||
| $directories = array(); | ||
| $directories[] = $docRoot . '/'; | ||
|
|
||
| while(sizeof($directories)) { | ||
| $dir = array_pop($directories); | ||
|
|
||
| if ($handle = opendir($dir)) { | ||
|
|
||
| while (false !== ($entry = readdir($handle))) { | ||
|
|
||
| if ($entry == '.' || | ||
| $entry == '..') { | ||
| continue; | ||
| } | ||
|
|
||
| $entry = $dir . $entry; | ||
|
|
||
| if (is_dir($entry) && | ||
| strpos($entry, 'wp-content/database') == false && | ||
| strpos($entry, 'wp-includes') == false) { | ||
|
|
||
| $directory_path = $entry . '/'; | ||
| array_push($directories, $directory_path); | ||
|
|
||
| } elseif (is_file($entry)) { | ||
|
|
||
| $zip->addFile($entry); | ||
artemiomorales marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
| } | ||
| closedir($handle); | ||
| } | ||
| } | ||
| $zip->close(); | ||
| chmod($exportPath, 0777); | ||
| } | ||
| } | ||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.