@datatruck/cli 0.6.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Action/BackupAction.d.ts +1 -0
- package/Action/BackupAction.js +4 -1
- package/Action/RestoreAction.d.ts +1 -0
- package/Action/RestoreAction.js +1 -0
- package/Action/SnapshotsAction.d.ts +1 -0
- package/Command/BackupCommand.d.ts +1 -0
- package/Command/BackupCommand.js +8 -2
- package/Command/BackupSessionsCommand.js +1 -1
- package/Command/ConfigCommand.d.ts +1 -0
- package/Command/ConfigCommand.js +7 -1
- package/Command/InitCommand.js +1 -1
- package/Command/PruneCommand.js +2 -2
- package/Command/RestoreCommand.d.ts +1 -0
- package/Command/RestoreCommand.js +8 -2
- package/Command/RestoreSessionsCommand.js +1 -1
- package/Command/SnapshotsCommand.d.ts +1 -0
- package/Command/SnapshotsCommand.js +16 -2
- package/Repository/GitRepository.js +5 -0
- package/Repository/LocalRepository.d.ts +1 -0
- package/Repository/LocalRepository.js +5 -0
- package/Repository/RepositoryAbstract.d.ts +4 -1
- package/Repository/RepositoryAbstract.js +1 -0
- package/Repository/ResticRepository.d.ts +2 -2
- package/Repository/ResticRepository.js +9 -0
- package/SessionDriver/ConsoleSessionDriver.d.ts +6 -2
- package/SessionDriver/ConsoleSessionDriver.js +19 -29
- package/SessionDriver/SessionDriverAbstract.d.ts +1 -1
- package/SessionDriver/SessionDriverAbstract.js +1 -1
- package/SessionManager/BackupSessionManager.d.ts +1 -1
- package/SessionManager/BackupSessionManager.js +2 -2
- package/Task/MysqlDumpTask.d.ts +3 -2
- package/Task/MysqlDumpTask.js +35 -3
- package/Task/PostgresqlDumpTask.d.ts +3 -2
- package/Task/PostgresqlDumpTask.js +6 -5
- package/Task/SqlDumpTaskAbstract.d.ts +4 -3
- package/Task/SqlDumpTaskAbstract.js +67 -19
- package/config.schema.json +3 -0
- package/package.json +9 -9
- package/util/cli-util.d.ts +1 -0
- package/util/cli-util.js +13 -1
- package/util/datatruck/config-util.d.ts +1 -0
- package/util/datatruck/config-util.js +3 -0
- package/util/date-util.d.ts +4 -0
- package/util/date-util.js +17 -1
- package/util/entity-util.d.ts +1 -1
- package/util/fs-util.d.ts +1 -0
- package/util/process-util.d.ts +1 -0
- package/util/process-util.js +2 -2
- package/util/string-util.d.ts +1 -0
- package/util/string-util.js +21 -1
- package/CHANGELOG.md +0 -119
package/Action/BackupAction.d.ts
CHANGED
package/Action/BackupAction.js
CHANGED
|
@@ -21,6 +21,7 @@ class BackupAction {
|
|
|
21
21
|
await session.initDrivers();
|
|
22
22
|
let packages = (0, config_util_1.filterPackages)(this.config, {
|
|
23
23
|
packageNames: this.options.packageNames,
|
|
24
|
+
packageTaskNames: this.options.packageTaskNames,
|
|
24
25
|
repositoryNames: this.options.repositoryNames,
|
|
25
26
|
repositoryTypes: this.options.repositoryTypes,
|
|
26
27
|
sourceAction: "backup",
|
|
@@ -193,7 +194,9 @@ class BackupAction {
|
|
|
193
194
|
error: error?.message,
|
|
194
195
|
});
|
|
195
196
|
}
|
|
196
|
-
await session.endDrivers(
|
|
197
|
+
await session.endDrivers({
|
|
198
|
+
snapshotId: snapshot.id.slice(0, 8),
|
|
199
|
+
});
|
|
197
200
|
return {
|
|
198
201
|
total: total,
|
|
199
202
|
errors: errors,
|
package/Action/RestoreAction.js
CHANGED
|
@@ -3,6 +3,7 @@ import { If } from "../util/ts-util";
|
|
|
3
3
|
import { CommandAbstract } from "./CommandAbstract";
|
|
4
4
|
export declare type BackupCommandOptionsType<TResolved = false> = {
|
|
5
5
|
package?: If<TResolved, string[]>;
|
|
6
|
+
packageTask?: If<TResolved, string[]>;
|
|
6
7
|
repository?: If<TResolved, string[]>;
|
|
7
8
|
repositoryType?: If<TResolved, RepositoryConfigType["type"][]>;
|
|
8
9
|
tag?: If<TResolved, string[]>;
|
package/Command/BackupCommand.js
CHANGED
|
@@ -21,6 +21,11 @@ class BackupCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
21
21
|
option: "-p,--package <values>",
|
|
22
22
|
parser: string_util_1.parseStringList,
|
|
23
23
|
},
|
|
24
|
+
packageTask: {
|
|
25
|
+
description: "Package task names",
|
|
26
|
+
option: "-pt,--package-task <values>",
|
|
27
|
+
parser: string_util_1.parseStringList,
|
|
28
|
+
},
|
|
24
29
|
repository: {
|
|
25
30
|
description: "Repository names",
|
|
26
31
|
option: "-r,--repository <values>",
|
|
@@ -28,12 +33,12 @@ class BackupCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
28
33
|
},
|
|
29
34
|
repositoryType: {
|
|
30
35
|
description: "Repository types",
|
|
31
|
-
option: "-
|
|
36
|
+
option: "-rt,--repository-type <values>",
|
|
32
37
|
parser: (v) => (0, string_util_1.parseStringList)(v),
|
|
33
38
|
},
|
|
34
39
|
tag: {
|
|
35
40
|
description: "Tags",
|
|
36
|
-
option: "
|
|
41
|
+
option: "-t,--tag <values>",
|
|
37
42
|
parser: string_util_1.parseStringList,
|
|
38
43
|
},
|
|
39
44
|
date: {
|
|
@@ -47,6 +52,7 @@ class BackupCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
47
52
|
const config = await ConfigAction_1.ConfigAction.fromGlobalOptions(this.globalOptions);
|
|
48
53
|
const backup = new BackupAction_1.BackupAction(config, {
|
|
49
54
|
packageNames: this.options.package,
|
|
55
|
+
packageTaskNames: this.options.packageTask,
|
|
50
56
|
repositoryNames: this.options.repository,
|
|
51
57
|
repositoryTypes: this.options.repositoryType,
|
|
52
58
|
tags: this.options.tag,
|
|
@@ -3,6 +3,7 @@ import { If } from "../util/ts-util";
|
|
|
3
3
|
import { CommandAbstract } from "./CommandAbstract";
|
|
4
4
|
export declare type ConfigCommandOptionsType<TResolved = false> = {
|
|
5
5
|
package?: If<TResolved, string[]>;
|
|
6
|
+
packageTask?: If<TResolved, string[]>;
|
|
6
7
|
repository?: If<TResolved, string[]>;
|
|
7
8
|
repositoryType?: If<TResolved, RepositoryConfigType["type"][]>;
|
|
8
9
|
};
|
package/Command/ConfigCommand.js
CHANGED
|
@@ -14,6 +14,11 @@ class ConfigCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
14
14
|
option: "-p,--package <values>",
|
|
15
15
|
parser: string_util_1.parseStringList,
|
|
16
16
|
},
|
|
17
|
+
packageTask: {
|
|
18
|
+
description: "Package task names",
|
|
19
|
+
option: "-pt,--package-task <values>",
|
|
20
|
+
parser: string_util_1.parseStringList,
|
|
21
|
+
},
|
|
17
22
|
repository: {
|
|
18
23
|
description: "Repository names",
|
|
19
24
|
option: "-r,--repository <values>",
|
|
@@ -21,7 +26,7 @@ class ConfigCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
21
26
|
},
|
|
22
27
|
repositoryType: {
|
|
23
28
|
description: "Repository types",
|
|
24
|
-
option: "-
|
|
29
|
+
option: "-rt,--repository-type <values>",
|
|
25
30
|
parser: (v) => (0, string_util_1.parseStringList)(v),
|
|
26
31
|
},
|
|
27
32
|
});
|
|
@@ -30,6 +35,7 @@ class ConfigCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
30
35
|
const config = await ConfigAction_1.ConfigAction.fromGlobalOptions(this.globalOptions);
|
|
31
36
|
const packages = (0, config_util_1.filterPackages)(config, {
|
|
32
37
|
packageNames: this.options.package,
|
|
38
|
+
packageTaskNames: this.options.packageTask,
|
|
33
39
|
repositoryNames: this.options.repository,
|
|
34
40
|
repositoryTypes: this.options.repositoryType,
|
|
35
41
|
});
|
package/Command/InitCommand.js
CHANGED
|
@@ -18,7 +18,7 @@ class InitCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
18
18
|
},
|
|
19
19
|
repositoryType: {
|
|
20
20
|
description: "Repository types",
|
|
21
|
-
option: "-
|
|
21
|
+
option: "-rt,--repository-type <values>",
|
|
22
22
|
parser: (v) => (0, string_util_1.parseStringList)(v),
|
|
23
23
|
},
|
|
24
24
|
});
|
package/Command/PruneCommand.js
CHANGED
|
@@ -81,12 +81,12 @@ class PruneCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
81
81
|
},
|
|
82
82
|
repositoryType: {
|
|
83
83
|
description: "Repository types",
|
|
84
|
-
option: "-
|
|
84
|
+
option: "-rt,--repository-type <values>",
|
|
85
85
|
parser: (v) => (0, string_util_1.parseStringList)(v),
|
|
86
86
|
},
|
|
87
87
|
tag: {
|
|
88
88
|
description: "Tags",
|
|
89
|
-
option: "
|
|
89
|
+
option: "-t,--tag <values>",
|
|
90
90
|
parser: string_util_1.parseStringList,
|
|
91
91
|
},
|
|
92
92
|
showAll: {
|
|
@@ -4,6 +4,7 @@ import { CommandAbstract } from "./CommandAbstract";
|
|
|
4
4
|
export declare type RestoreCommandOptionsType<TResolved = false> = {
|
|
5
5
|
id: string;
|
|
6
6
|
package?: If<TResolved, string[]>;
|
|
7
|
+
packageTask?: If<TResolved, string[]>;
|
|
7
8
|
repository?: If<TResolved, string[]>;
|
|
8
9
|
repositoryType?: If<TResolved, RepositoryConfigType["type"][]>;
|
|
9
10
|
tag?: If<TResolved, string[]>;
|
|
@@ -21,6 +21,11 @@ class RestoreCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
21
21
|
option: "-p,--package <values>",
|
|
22
22
|
parser: string_util_1.parseStringList,
|
|
23
23
|
},
|
|
24
|
+
packageTask: {
|
|
25
|
+
description: "Package task names",
|
|
26
|
+
option: "-pt,--package-task <values>",
|
|
27
|
+
parser: string_util_1.parseStringList,
|
|
28
|
+
},
|
|
24
29
|
repository: {
|
|
25
30
|
description: "Repository names",
|
|
26
31
|
option: "-r,--repository <values>",
|
|
@@ -28,12 +33,12 @@ class RestoreCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
28
33
|
},
|
|
29
34
|
repositoryType: {
|
|
30
35
|
description: "Repository types",
|
|
31
|
-
option: "-
|
|
36
|
+
option: "-rt,--repository-type <values>",
|
|
32
37
|
parser: (v) => (0, string_util_1.parseStringList)(v),
|
|
33
38
|
},
|
|
34
39
|
tag: {
|
|
35
40
|
description: "Tags",
|
|
36
|
-
option: "
|
|
41
|
+
option: "-t,--tag <values>",
|
|
37
42
|
parser: string_util_1.parseStringList,
|
|
38
43
|
},
|
|
39
44
|
});
|
|
@@ -44,6 +49,7 @@ class RestoreCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
44
49
|
const restore = new RestoreAction_1.RestoreAction(config, {
|
|
45
50
|
snapshotId: this.options.id,
|
|
46
51
|
packageNames: this.options.package,
|
|
52
|
+
packageTaskNames: this.options.packageTask,
|
|
47
53
|
repositoryNames: this.options.repository,
|
|
48
54
|
repositoryTypes: this.options.repositoryType,
|
|
49
55
|
tags: this.options.tag,
|
|
@@ -5,6 +5,7 @@ import { CommandAbstract } from "./CommandAbstract";
|
|
|
5
5
|
export declare type SnapshotsCommandOptionsType<TResolved = false> = {
|
|
6
6
|
id?: If<TResolved, string[]>;
|
|
7
7
|
package?: If<TResolved, string[]>;
|
|
8
|
+
packageTask?: If<TResolved, string[]>;
|
|
8
9
|
repository?: If<TResolved, string[]>;
|
|
9
10
|
repositoryType?: If<TResolved, RepositoryConfigType["type"][]>;
|
|
10
11
|
longId?: boolean;
|
|
@@ -64,6 +64,11 @@ class SnapshotsCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
64
64
|
description: "Package names",
|
|
65
65
|
parser: string_util_1.parseStringList,
|
|
66
66
|
},
|
|
67
|
+
packageTask: {
|
|
68
|
+
description: "Package task names",
|
|
69
|
+
option: "-pt,--package-task <values>",
|
|
70
|
+
parser: string_util_1.parseStringList,
|
|
71
|
+
},
|
|
67
72
|
repository: {
|
|
68
73
|
option: "-r,--repository <names>",
|
|
69
74
|
description: "Repository names",
|
|
@@ -76,7 +81,7 @@ class SnapshotsCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
76
81
|
},
|
|
77
82
|
tag: {
|
|
78
83
|
description: "Tags",
|
|
79
|
-
option: "
|
|
84
|
+
option: "-t,--tag <values>",
|
|
80
85
|
parser: string_util_1.parseStringList,
|
|
81
86
|
},
|
|
82
87
|
});
|
|
@@ -87,6 +92,7 @@ class SnapshotsCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
87
92
|
const snapshots = new SnapshotsAction_1.SnapshotsAction(config, {
|
|
88
93
|
ids: this.options.id,
|
|
89
94
|
packageNames: this.options.package,
|
|
95
|
+
packageTaskNames: this.options.packageTask,
|
|
90
96
|
repositoryNames: this.options.repository,
|
|
91
97
|
repositoryTypes: this.options.repositoryType,
|
|
92
98
|
last: this.options.last,
|
|
@@ -103,11 +109,19 @@ class SnapshotsCommand extends CommandAbstract_1.CommandAbstract {
|
|
|
103
109
|
const dataFormat = new DataFormat_1.DataFormat({
|
|
104
110
|
items: await snapshots.exec(),
|
|
105
111
|
table: {
|
|
106
|
-
labels: [
|
|
112
|
+
labels: [
|
|
113
|
+
"Id.",
|
|
114
|
+
"Date",
|
|
115
|
+
"Package",
|
|
116
|
+
"Task",
|
|
117
|
+
"Repository",
|
|
118
|
+
"Repository type",
|
|
119
|
+
],
|
|
107
120
|
handler: (item) => [
|
|
108
121
|
this.options.longId ? item.id : item.id.slice(0, 8),
|
|
109
122
|
item.date.replace("T", " ").replace("Z", ""),
|
|
110
123
|
item.packageName,
|
|
124
|
+
item.packageTaskName || "",
|
|
111
125
|
item.repositoryName,
|
|
112
126
|
item.repositoryType,
|
|
113
127
|
],
|
|
@@ -111,6 +111,7 @@ class GitRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
111
111
|
log: data.options.verbose,
|
|
112
112
|
});
|
|
113
113
|
const pkgPatterns = (0, string_util_1.makePathPatterns)(data.options.packageNames);
|
|
114
|
+
const pkgTaskPatterns = (0, string_util_1.makePathPatterns)(data.options.packageTaskNames);
|
|
114
115
|
await git.clone({ repo: this.config.repo });
|
|
115
116
|
const tagNames = data.options.ids?.map((id) => `${GitRepository.refPrefix}/*/${id}*`) || [`${GitRepository.refPrefix}/*`];
|
|
116
117
|
const tags = await git.getTags(tagNames);
|
|
@@ -123,6 +124,8 @@ class GitRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
123
124
|
return result;
|
|
124
125
|
if (pkgPatterns && !(0, micromatch_1.isMatch)(parsedTag.package, pkgPatterns))
|
|
125
126
|
return result;
|
|
127
|
+
if (pkgTaskPatterns && !(0, micromatch_1.isMatch)(parsedTag.task || "", pkgTaskPatterns))
|
|
128
|
+
return result;
|
|
126
129
|
if (data.options.tags &&
|
|
127
130
|
!parsedTag.tags.some((value) => data.options.tags?.includes(value)))
|
|
128
131
|
return result;
|
|
@@ -131,6 +134,7 @@ class GitRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
131
134
|
id: parsedTag.id,
|
|
132
135
|
date: parsedTag.date,
|
|
133
136
|
packageName: parsedTag.package,
|
|
137
|
+
packageTaskName: parsedTag.task,
|
|
134
138
|
tags: parsedTag.tags,
|
|
135
139
|
});
|
|
136
140
|
return result;
|
|
@@ -201,6 +205,7 @@ class GitRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
201
205
|
tags: data.options.tags ?? [],
|
|
202
206
|
date: data.snapshot.date,
|
|
203
207
|
package: data.package.name,
|
|
208
|
+
task: data.package.task?.name,
|
|
204
209
|
version: nodePkg.version,
|
|
205
210
|
});
|
|
206
211
|
await git.addTag(meta.name, meta.message);
|
|
@@ -125,6 +125,7 @@ class LocalRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
125
125
|
const snapshotNames = await (0, promises_1.readdir)(this.config.outPath);
|
|
126
126
|
const snapshots = [];
|
|
127
127
|
const packagePatterns = (0, string_util_1.makePathPatterns)(data.options.packageNames);
|
|
128
|
+
const taskPatterns = (0, string_util_1.makePathPatterns)(data.options.packageTaskNames);
|
|
128
129
|
for (const snapshotName of snapshotNames) {
|
|
129
130
|
const snapshotNameData = LocalRepository.parseSnapshotName(snapshotName);
|
|
130
131
|
if (!snapshotNameData)
|
|
@@ -137,6 +138,8 @@ class LocalRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
137
138
|
continue;
|
|
138
139
|
const metaPath = (0, path_1.join)(this.config.outPath, snapshotName);
|
|
139
140
|
const meta = await LocalRepository.parseMetaData(metaPath);
|
|
141
|
+
if (taskPatterns && !(0, micromatch_1.isMatch)(meta.task || "", taskPatterns))
|
|
142
|
+
continue;
|
|
140
143
|
if (data.options.ids &&
|
|
141
144
|
!data.options.ids.some((id) => meta.id.startsWith(id)))
|
|
142
145
|
continue;
|
|
@@ -148,6 +151,7 @@ class LocalRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
148
151
|
id: meta.id,
|
|
149
152
|
date: meta.date,
|
|
150
153
|
packageName: meta.package,
|
|
154
|
+
packageTaskName: meta.task,
|
|
151
155
|
tags: meta.tags,
|
|
152
156
|
});
|
|
153
157
|
}
|
|
@@ -288,6 +292,7 @@ class LocalRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
288
292
|
date: data.snapshot.date,
|
|
289
293
|
tags: data.options.tags ?? [],
|
|
290
294
|
package: data.package.name,
|
|
295
|
+
task: data.package.task?.name,
|
|
291
296
|
version: nodePkg.version,
|
|
292
297
|
};
|
|
293
298
|
if (data.options.verbose)
|
|
@@ -11,6 +11,7 @@ export declare type SnapshotType = {
|
|
|
11
11
|
export declare type SnapshotResultType = SnapshotType & {
|
|
12
12
|
originalId: string;
|
|
13
13
|
packageName: string;
|
|
14
|
+
packageTaskName: string | undefined;
|
|
14
15
|
tags: string[];
|
|
15
16
|
};
|
|
16
17
|
export declare type ProgressDataType = {
|
|
@@ -24,7 +25,7 @@ export declare type InitDataType = {
|
|
|
24
25
|
options: InitActionOptionsType;
|
|
25
26
|
};
|
|
26
27
|
export declare type SnapshotsDataType = {
|
|
27
|
-
options: Pick<SnapshotsActionOptionsType, "ids" | "packageNames" | "verbose" | "tags">;
|
|
28
|
+
options: Pick<SnapshotsActionOptionsType, "ids" | "packageNames" | "packageTaskNames" | "verbose" | "tags">;
|
|
28
29
|
};
|
|
29
30
|
export declare type BackupDataType<TPackageConfig> = {
|
|
30
31
|
options: BackupActionOptionsType;
|
|
@@ -53,6 +54,7 @@ export declare enum SnapshotTagEnum {
|
|
|
53
54
|
SHORT_ID = "shortId",
|
|
54
55
|
DATE = "date",
|
|
55
56
|
PACKAGE = "package",
|
|
57
|
+
TASK = "task",
|
|
56
58
|
TAGS = "tags",
|
|
57
59
|
VERSION = "version"
|
|
58
60
|
}
|
|
@@ -61,6 +63,7 @@ export declare type SnapshotTagObjectType = {
|
|
|
61
63
|
[SnapshotTagEnum.SHORT_ID]: string;
|
|
62
64
|
[SnapshotTagEnum.DATE]: string;
|
|
63
65
|
[SnapshotTagEnum.PACKAGE]: string;
|
|
66
|
+
[SnapshotTagEnum.TASK]: string | undefined;
|
|
64
67
|
[SnapshotTagEnum.TAGS]: string[];
|
|
65
68
|
[SnapshotTagEnum.VERSION]: string;
|
|
66
69
|
};
|
|
@@ -7,6 +7,7 @@ var SnapshotTagEnum;
|
|
|
7
7
|
SnapshotTagEnum["SHORT_ID"] = "shortId";
|
|
8
8
|
SnapshotTagEnum["DATE"] = "date";
|
|
9
9
|
SnapshotTagEnum["PACKAGE"] = "package";
|
|
10
|
+
SnapshotTagEnum["TASK"] = "task";
|
|
10
11
|
SnapshotTagEnum["TAGS"] = "tags";
|
|
11
12
|
SnapshotTagEnum["VERSION"] = "version";
|
|
12
13
|
})(SnapshotTagEnum = exports.SnapshotTagEnum || (exports.SnapshotTagEnum = {}));
|
|
@@ -28,9 +28,9 @@ export declare class ResticRepository extends RepositoryAbstract<ResticRepositor
|
|
|
28
28
|
name: SnapshotTagEnum;
|
|
29
29
|
value: string;
|
|
30
30
|
} | null;
|
|
31
|
-
static parseSnapshotTags(tags: string[]):
|
|
31
|
+
static parseSnapshotTags(tags: string[]): SnapshotTagObjectType & {
|
|
32
32
|
tags: string[];
|
|
33
|
-
}
|
|
33
|
+
};
|
|
34
34
|
onGetSource(): string;
|
|
35
35
|
onInit(data: InitDataType): Promise<void>;
|
|
36
36
|
onSnapshots(data: SnapshotsDataType): Promise<SnapshotResultType[]>;
|
|
@@ -126,6 +126,7 @@ class ResticRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
126
126
|
log: data.options.verbose,
|
|
127
127
|
});
|
|
128
128
|
const packagePatterns = (0, string_util_1.makePathPatterns)(data.options.packageNames);
|
|
129
|
+
const taskNamePatterns = (0, string_util_1.makePathPatterns)(data.options.packageTaskNames);
|
|
129
130
|
const result = await restic.snapshots({
|
|
130
131
|
json: true,
|
|
131
132
|
tags: [
|
|
@@ -138,12 +139,15 @@ class ResticRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
138
139
|
return items;
|
|
139
140
|
if (packagePatterns && !(0, micromatch_1.isMatch)(tag.package, packagePatterns))
|
|
140
141
|
return items;
|
|
142
|
+
if (taskNamePatterns && !(0, micromatch_1.isMatch)(tag.task || "", taskNamePatterns))
|
|
143
|
+
return items;
|
|
141
144
|
const itemTags = tag.tags ?? [];
|
|
142
145
|
if (data.options.tags && !itemTags.some((t) => itemTags.includes(t)))
|
|
143
146
|
return items;
|
|
144
147
|
items.push({
|
|
145
148
|
originalId: item.id,
|
|
146
149
|
packageName: tag.package,
|
|
150
|
+
packageTaskName: tag.task,
|
|
147
151
|
date: tag.date,
|
|
148
152
|
id: tag.id,
|
|
149
153
|
tags: itemTags,
|
|
@@ -231,6 +235,11 @@ class ResticRepository extends RepositoryAbstract_1.RepositoryAbstract {
|
|
|
231
235
|
ResticRepository.buildSnapshotTag(RepositoryAbstract_1.SnapshotTagEnum.DATE, data.snapshot.date),
|
|
232
236
|
ResticRepository.buildSnapshotTag(RepositoryAbstract_1.SnapshotTagEnum.VERSION, nodePkg.version),
|
|
233
237
|
packageTag,
|
|
238
|
+
...(data.package.task?.name
|
|
239
|
+
? [
|
|
240
|
+
ResticRepository.buildSnapshotTag(RepositoryAbstract_1.SnapshotTagEnum.TASK, data.package.task?.name),
|
|
241
|
+
]
|
|
242
|
+
: []),
|
|
234
243
|
...(data.options.tags ?? []),
|
|
235
244
|
],
|
|
236
245
|
onStream: async (streamData) => {
|
|
@@ -26,10 +26,14 @@ export declare class ConsoleSessionDriver extends SessionDriverAbstract {
|
|
|
26
26
|
protected rendering?: boolean;
|
|
27
27
|
protected lastColumns?: number;
|
|
28
28
|
protected startTime: number;
|
|
29
|
+
protected chron: {
|
|
30
|
+
start: () => number;
|
|
31
|
+
elapsed: (formatted?: boolean | undefined) => string | number;
|
|
32
|
+
};
|
|
29
33
|
onInit(): Promise<void>;
|
|
30
|
-
onEnd(): Promise<void>;
|
|
34
|
+
onEnd(data?: Record<string, any>): Promise<void>;
|
|
31
35
|
onRead(): Promise<ReadResultType[]>;
|
|
32
|
-
protected printMessage(message: MessageType): void;
|
|
36
|
+
protected printMessage(message: MessageType, endMessage: boolean): void;
|
|
33
37
|
protected renderSpinner(text: string): string;
|
|
34
38
|
protected renderMessage(message: MessageType): string;
|
|
35
39
|
onWrite(data: WriteDataType): Promise<void>;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ConsoleSessionDriver = void 0;
|
|
4
4
|
const AppError_1 = require("../Error/AppError");
|
|
5
5
|
const cli_util_1 = require("../util/cli-util");
|
|
6
|
+
const date_util_1 = require("../util/date-util");
|
|
6
7
|
const SessionDriverAbstract_1 = require("./SessionDriverAbstract");
|
|
7
8
|
const chalk_1 = require("chalk");
|
|
8
9
|
const sep = (0, chalk_1.grey)(`|`);
|
|
@@ -12,42 +13,28 @@ class ConsoleSessionDriver extends SessionDriverAbstract_1.SessionDriverAbstract
|
|
|
12
13
|
constructor() {
|
|
13
14
|
super(...arguments);
|
|
14
15
|
this.prints = 0;
|
|
16
|
+
this.chron = (0, date_util_1.createChron)();
|
|
15
17
|
}
|
|
16
18
|
async onInit() {
|
|
17
|
-
this.
|
|
19
|
+
this.chron.start();
|
|
18
20
|
this.renderInterval = setInterval(() => {
|
|
19
21
|
if (this.lastMessage)
|
|
20
|
-
this.printMessage(this.lastMessage);
|
|
22
|
+
this.printMessage(this.lastMessage, false);
|
|
21
23
|
}, 100);
|
|
22
24
|
}
|
|
23
|
-
async onEnd() {
|
|
25
|
+
async onEnd(data) {
|
|
24
26
|
clearInterval(this.renderInterval);
|
|
25
27
|
if (!this.options.verbose)
|
|
26
28
|
process.stdout.write(cli_util_1.showCursorCommand);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
ellapsedValue = ellapsed / 60 / 60;
|
|
32
|
-
ellapsedUnit = `hour`;
|
|
33
|
-
}
|
|
34
|
-
else if (ellapsed > 60) {
|
|
35
|
-
ellapsedValue = ellapsed / 60;
|
|
36
|
-
ellapsedUnit = `minute`;
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
ellapsedValue = ellapsed;
|
|
40
|
-
ellapsedUnit = `second`;
|
|
41
|
-
}
|
|
42
|
-
if (ellapsedValue !== 1)
|
|
43
|
-
ellapsedUnit += `s`;
|
|
44
|
-
const message = `Completed in ${ellapsedValue.toFixed(2)} ${ellapsedUnit}`;
|
|
45
|
-
console.info(`\n${(0, chalk_1.grey)(message)}`);
|
|
29
|
+
(0, cli_util_1.logVars)({
|
|
30
|
+
...data,
|
|
31
|
+
elapsed: this.chron.elapsed(true),
|
|
32
|
+
});
|
|
46
33
|
}
|
|
47
34
|
async onRead() {
|
|
48
35
|
throw new AppError_1.AppError("Method not implemented");
|
|
49
36
|
}
|
|
50
|
-
printMessage(message) {
|
|
37
|
+
printMessage(message, endMessage) {
|
|
51
38
|
const text = this.renderMessage(message);
|
|
52
39
|
if (this.options.verbose && this.lastMessageText === text) {
|
|
53
40
|
return;
|
|
@@ -58,8 +45,10 @@ class ConsoleSessionDriver extends SessionDriverAbstract_1.SessionDriverAbstract
|
|
|
58
45
|
else {
|
|
59
46
|
const columns = process.stdout.columns;
|
|
60
47
|
const line = this.renderSpinner(text);
|
|
61
|
-
const [truncatedLine,
|
|
62
|
-
|
|
48
|
+
const [truncatedLine, truncated] = endMessage
|
|
49
|
+
? [line, false]
|
|
50
|
+
: (0, cli_util_1.truncate)(line, columns);
|
|
51
|
+
if (this.lastColumns && columns !== this.lastColumns && truncated)
|
|
63
52
|
process.stdout.write(`${cli_util_1.clearCommand}\n`);
|
|
64
53
|
process.stdout.write(`${cli_util_1.clearCommand}${truncatedLine}${cli_util_1.hideCursorCommand}`);
|
|
65
54
|
this.lastColumns = columns;
|
|
@@ -170,10 +159,11 @@ class ConsoleSessionDriver extends SessionDriverAbstract_1.SessionDriverAbstract
|
|
|
170
159
|
if (isHeader && data.action === SessionDriverAbstract_1.ActionEnum.End) {
|
|
171
160
|
return;
|
|
172
161
|
}
|
|
173
|
-
this.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
162
|
+
const endMessage = !this.options.verbose &&
|
|
163
|
+
(!hasProgress || data.action === SessionDriverAbstract_1.ActionEnum.End || isHeader);
|
|
164
|
+
this.printMessage(message, endMessage);
|
|
165
|
+
if (endMessage)
|
|
166
|
+
process.stdout.write("\n");
|
|
177
167
|
}
|
|
178
168
|
}
|
|
179
169
|
exports.ConsoleSessionDriver = ConsoleSessionDriver;
|
|
@@ -73,6 +73,6 @@ export declare abstract class SessionDriverAbstract {
|
|
|
73
73
|
});
|
|
74
74
|
onInit(): Promise<void>;
|
|
75
75
|
abstract onWrite(data: WriteDataType): Promise<void>;
|
|
76
|
-
onEnd(): Promise<void>;
|
|
76
|
+
onEnd(data?: Record<string, any>): Promise<void>;
|
|
77
77
|
abstract onRead(data: ReadDataType, entity: EntityEnum): Promise<ReadResultType[]>;
|
|
78
78
|
}
|
|
@@ -27,7 +27,7 @@ export declare class BackupSessionManager {
|
|
|
27
27
|
repositoryName: string;
|
|
28
28
|
}): number;
|
|
29
29
|
initDrivers(): Promise<void>;
|
|
30
|
-
endDrivers(): Promise<void>;
|
|
30
|
+
endDrivers(data?: Record<string, any>): Promise<void>;
|
|
31
31
|
protected alter(data: WriteDataType): Promise<number>;
|
|
32
32
|
readAll(options: BackupSessionsActionOptionsType): Promise<import("../SessionDriver/SessionDriverAbstract").ReadResultType[]>;
|
|
33
33
|
init(input: Pick<BackupSessionEntity, "packageName" | "snapshotId" | "tags">): Promise<number>;
|
|
@@ -27,10 +27,10 @@ class BackupSessionManager {
|
|
|
27
27
|
await driver.onInit();
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
async endDrivers() {
|
|
30
|
+
async endDrivers(data) {
|
|
31
31
|
const drivers = [this.options.driver, ...(this.options.altDrivers ?? [])];
|
|
32
32
|
for (const driver of drivers) {
|
|
33
|
-
await driver.onEnd();
|
|
33
|
+
await driver.onEnd(data);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
async alter(data) {
|
package/Task/MysqlDumpTask.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export declare class MysqlDumpTask extends SqlDumpTaskAbstract<MysqlDumpTaskConf
|
|
|
8
8
|
onDatabaseIsEmpty(name: string): Promise<boolean>;
|
|
9
9
|
onCreateDatabase(database: TargetDatabaseType): Promise<void>;
|
|
10
10
|
onExecQuery(query: string): Promise<import("../util/process-util").ExecResultType>;
|
|
11
|
-
onFetchTableNames(): Promise<string[]>;
|
|
12
|
-
|
|
11
|
+
onFetchTableNames(database: string): Promise<string[]>;
|
|
12
|
+
onExportTables(tableNames: string[], output: string): Promise<void>;
|
|
13
|
+
onExportStoredPrograms(output: string): Promise<void>;
|
|
13
14
|
onImport(path: string, database: string): Promise<void>;
|
|
14
15
|
}
|