Skip to content

Commit ebf96c2

Browse files
mvdir updated to crash less often.
1 parent 1fc36e5 commit ebf96c2

File tree

1 file changed

+55
-31
lines changed

1 file changed

+55
-31
lines changed

packages/simplr-mvdir/src/index.ts

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,45 @@ export async function move(
99
recursively: boolean = true,
1010
removeFromDirectory = true,
1111
rootFrom?: string) {
12+
try {
13+
from = path.resolve(from);
14+
to = path.resolve(to);
1215

13-
from = path.resolve(from);
14-
to = path.resolve(to);
16+
rootFrom = rootFrom || from;
1517

16-
rootFrom = rootFrom || from;
18+
const files = await fs.readdir(from);
19+
for (const file of files) {
20+
const stats = await fs.stat(path.join(from, file));
21+
if (await stats.isFile()) {
22+
const fileResolved = path.resolve(from, file);
23+
const fromDirectory = path.dirname(fileResolved);
24+
const toDirectory = fromDirectory.replace(rootFrom, to);
25+
const toFile = path.join(toDirectory, fileResolved.replace(fromDirectory, ""));
1726

18-
const files = await fs.readdir(from);
19-
for (const file of files) {
20-
const stats = await fs.stat(path.join(from, file));
21-
if (await stats.isFile()) {
22-
const fileResolved = path.resolve(from, file);
23-
const fromDirectory = path.dirname(fileResolved);
24-
const toDirectory = fromDirectory.replace(rootFrom, to);
25-
const toFile = path.join(toDirectory, fileResolved.replace(fromDirectory, ""));
26-
27-
try {
28-
await mkdirpAsync(toDirectory);
29-
await fs.rename(fileResolved, toFile);
30-
} catch (err) {
31-
console.log(err);
27+
try {
28+
await mkdirpAsync(toDirectory);
29+
await fs.rename(fileResolved, toFile);
30+
} catch (err) {
31+
console.log(err);
32+
}
3233
}
33-
}
34-
if (await stats.isDirectory()) {
35-
if (recursively === true) {
36-
const fromDirectory = path.join(from, file);
37-
await move(fromDirectory, to, recursively, removeFromDirectory, from);
38-
if (removeFromDirectory === true && await fs.exists(fromDirectory)) {
39-
await waitForEmptyAndRemoveDirAsync(fromDirectory);
34+
if (await stats.isDirectory()) {
35+
if (recursively === true) {
36+
const fromDirectory = path.join(from, file);
37+
await tryAndRetry(async () => {
38+
await move(fromDirectory, to, recursively, removeFromDirectory, from);
39+
});
40+
if (removeFromDirectory === true && fs.existsSync(fromDirectory)) {
41+
await waitForEmptyAndRemoveDirAsync(fromDirectory);
42+
}
4043
}
4144
}
4245
}
43-
}
44-
if (removeFromDirectory === true && await fs.exists(from)) {
45-
await waitForEmptyAndRemoveDirAsync(from);
46+
if (removeFromDirectory === true && fs.existsSync(from)) {
47+
await waitForEmptyAndRemoveDirAsync(from);
48+
}
49+
} catch (err) {
50+
console.error("That's an error: ", JSON.stringify(err));
4651
}
4752
}
4853

@@ -59,11 +64,18 @@ async function mkdirpAsync(dir: string) {
5964
}
6065

6166
async function waitForEmptyAndRemoveDirAsync(dir: string) {
62-
let files;
63-
while ((files = await fs.readdir(dir)) && files!.length > 0) {
67+
let files = fs.readdirSync(dir);
68+
while (files.length > 0) {
6469
await sleep(10);
70+
if (fs.existsSync(dir)) {
71+
files = fs.readdirSync(dir);
72+
} else {
73+
files = [];
74+
}
75+
}
76+
if (fs.existsSync(dir)) {
77+
fs.rmdirSync(dir);
6578
}
66-
await fs.rmdir(dir);
6779
}
6880

6981
function sleep(milliseconds: number) {
@@ -88,5 +100,17 @@ async function rmdir(dir: string) {
88100
await fs.unlink(filename);
89101
}
90102
}
91-
await fs.rmdir(dir);
103+
if (await fs.exists(dir)) {
104+
await fs.rmdir(dir);
105+
}
106+
}
107+
async function tryAndRetry(action: Function, maxTries = 5) {
108+
while (true) {
109+
try {
110+
action();
111+
break;
112+
} catch (err) {
113+
await sleep(10);
114+
}
115+
}
92116
}

0 commit comments

Comments
 (0)