-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.js
147 lines (113 loc) · 2.82 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
const fs = require('node:fs');
const path = require('node:path');
const { execFileSync, execFile } = require('node:child_process');
const util = require('node:util');
function runCommandSync(bin, args) {
return execFileSync(bin, args, {
encoding: 'utf-8'
});
}
async function runCommand(bin, args) {
const { stdout } = await util.promisify(execFile)(bin, args, {
encoding: 'utf-8'
});
return stdout;
}
function* directoryWalkSync(dirPath) {
const queue = [dirPath];
let item;
while ((item = queue.shift())) {
const dir = fs.opendirSync(item);
let dirent;
while ((dirent = dir.readSync())) {
const direntPath = path.join(item, dirent.name);
if (dirent.isDirectory()) {
queue.push(direntPath);
}
yield {
dirent,
direntPath,
};
}
dir.closeSync();
}
}
async function* directoryWalk(dirPath) {
const queue = [dirPath];
let item;
while (item = queue.shift()) {
const dir = await fs.promises.opendir(item);
for await (const dirent of dir) {
const direntPath = path.join(item, dirent.name);
if (dirent.isDirectory()) {
queue.push(direntPath);
}
yield {
dirent,
direntPath
};
}
}
}
// the earliest creation date of all files in the directory
function getFolderCreatedDateSync(dirPath) {
let birthtime = Infinity;
for (const item of directoryWalkSync(dirPath)) {
if (item.dirent.isDirectory()) {
continue;
}
const stats = fs.statSync(item.direntPath);
if (stats.birthtime < birthtime) {
birthtime = stats.birthtime;
}
}
return birthtime;
}
async function getFolderCreatedDate(dirPath) {
let birthtime = Infinity;
for await (const item of directoryWalk(dirPath)) {
if (item.dirent.isDirectory()) {
continue;
}
const stats = await fs.promises.stat(item.direntPath);
if (stats.birthtime < birthtime) {
birthtime = stats.birthtime;
}
}
return birthtime;
}
// the oldest modified date of all files in the directory
function getFolderModifiedDateSync(dirPath) {
let mtime = -Infinity;
for (const item of directoryWalkSync(dirPath)) {
if (item.dirent.isDirectory()) {
continue;
}
const stats = fs.statSync(item.direntPath);
if (stats.mtime > mtime) {
mtime = stats.mtime;
}
}
return mtime;
}
async function getFolderModifiedDate(dirPath) {
let mtime = -Infinity;
for await (const item of directoryWalk(dirPath)) {
if (item.dirent.isDirectory()) {
continue;
}
const stats = await fs.promises.stat(item.direntPath);
if (stats.mtime > mtime) {
mtime = stats.mtime;
}
}
return mtime;
}
module.exports = {
runCommand,
runCommandSync,
getFolderCreatedDate,
getFolderModifiedDate,
getFolderCreatedDateSync,
getFolderModifiedDateSync
}