-
Notifications
You must be signed in to change notification settings - Fork 274
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
Fix cross-device mv by switching to copy #846
Changes from 19 commits
53116ae
e985f2e
25471e2
aa23eb5
fe314c0
71b5108
b1dd043
430cd8a
0575d89
a45592e
c774621
fd8f768
6d8c576
06c2315
b760a1d
d112c05
5097fb1
b182c56
396874a
21b86e2
d9d8201
25b50f8
9e8453b
cd3902f
0a3ef1e
577d824
100c4db
ca027d4
6f97978
36c17b8
bcb225d
8da6708
cc576fc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -25,7 +25,7 @@ import { | |||||||||||||||||||||||||||||||||||||
improveWASMErrorReporting, | ||||||||||||||||||||||||||||||||||||||
UnhandledRejectionsTarget, | ||||||||||||||||||||||||||||||||||||||
} from './wasm-error-reporting'; | ||||||||||||||||||||||||||||||||||||||
import { Semaphore } from '@php-wasm/util'; | ||||||||||||||||||||||||||||||||||||||
import { Semaphore, joinPaths } from '@php-wasm/util'; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
const STRING = 'string'; | ||||||||||||||||||||||||||||||||||||||
const NUMBER = 'number'; | ||||||||||||||||||||||||||||||||||||||
|
@@ -616,6 +616,53 @@ export abstract class BasePHP implements IsomorphicLocalPHP { | |||||||||||||||||||||||||||||||||||||
this[__private__dont__use].FS.rename(fromPath, toPath); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** @inheritDoc */ | ||||||||||||||||||||||||||||||||||||||
@rethrowFileSystemError('Could not copy "{path}"') | ||||||||||||||||||||||||||||||||||||||
cp(fromPath: string, toPath: string, recursive = false) { | ||||||||||||||||||||||||||||||||||||||
const FS = this[__private__dont__use].FS; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
const fromStat = FS.stat(fromPath); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
// Emscripten directories will have the sticky-bit set | ||||||||||||||||||||||||||||||||||||||
// https://linux.die.net/man/1/chmod | ||||||||||||||||||||||||||||||||||||||
const fromIsDir = fromStat.mode & 0o40000; | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
let toExists: boolean; | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wonder if this would be more readable, what do you think?
Suggested change
|
||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||
FS.stat(toPath); | ||||||||||||||||||||||||||||||||||||||
toExists = true; | ||||||||||||||||||||||||||||||||||||||
} catch { | ||||||||||||||||||||||||||||||||||||||
toExists = false; | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
if (!fromIsDir) { | ||||||||||||||||||||||||||||||||||||||
const file = FS.readFile(fromPath, { encoding: 'binary' }); | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Isn't There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks! What about other places where |
||||||||||||||||||||||||||||||||||||||
FS.writeFile(toPath, file); | ||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What should happen if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @adam In that case, wordpress-playground/packages/php-wasm/universal/src/lib/base-php.ts Lines 658 to 665 in 8da6708
wordpress-playground/packages/php-wasm/node/src/test/php.spec.ts Lines 351 to 360 in cc576fc
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That test only covers a case when |
||||||||||||||||||||||||||||||||||||||
return; | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
if (!recursive) { | ||||||||||||||||||||||||||||||||||||||
throw new Error( | ||||||||||||||||||||||||||||||||||||||
`Cannot use non-recurive copy on directory: ${fromPath}` | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
if (!toExists) { | ||||||||||||||||||||||||||||||||||||||
FS.mkdir(toPath); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
const files = this.listFiles(fromPath); | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
files.forEach((file: string) => | ||||||||||||||||||||||||||||||||||||||
this.cp( | ||||||||||||||||||||||||||||||||||||||
joinPaths(fromPath, file), | ||||||||||||||||||||||||||||||||||||||
joinPaths(toPath, file), | ||||||||||||||||||||||||||||||||||||||
recursive | ||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||
/** @inheritDoc */ | ||||||||||||||||||||||||||||||||||||||
@rethrowFileSystemError('Could not remove directory "{path}"') | ||||||||||||||||||||||||||||||||||||||
rmdir(path: string, options: RmDirOptions = { recursive: true }) { | ||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -256,6 +256,15 @@ export interface IsomorphicLocalPHP extends RequestHandler { | |||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||
mv(oldPath: string, newPath: string): void; | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||
* Copies a file or directory in the PHP filesystem to a | ||||||||||||||||||||||||||||||||||||
* new location. | ||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's thoroughly explain what this function does in different situations, like when the target path already exists. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. wordpress-playground/packages/php-wasm/universal/src/lib/universal-php.ts Lines 259 to 275 in cc576fc
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you! As I'm read it, I have additional questions:
A
Is that the case only when the source path is a file? Or also when it's a directory?
So if the target path is a directory that does not exist yet, will it be created? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I also wonder about the semantics here. Right now this function makes an implicit assumption that says:
I don't think it always holds. Maybe the |
||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||
* @param oldPath The file or directory to be copied. | ||||||||||||||||||||||||||||||||||||
* @param newPath The new, full path to copy the file or directory to. | ||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||
cp(oldPath: string, newPath: string, recurive: boolean): void; | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||
* Removes a directory from the PHP filesystem. | ||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why change this value to 5000?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@adamziel This change was originally related to the e2e crash, which I suspected to be resource related, but I quickly determined that this wasn't the cause once I was able to get things running locally, so I've reverted this change.