zarro 1.103.0 → 1.103.1
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/gulp-tasks/modules/install-local-tools.js +123 -122
- package/gulp-tasks/modules/nuget.js +3 -3
- package/gulp-tasks/modules/nuget.ts +18 -14
- package/gulp-tasks/modules/try-do.js +2 -2
- package/gulp-tasks/modules/try-do.ts +5 -5
- package/gulp-tasks/nuget-restore.js +0 -1
- package/package.json +1 -1
- package/types.d.ts +5 -2
|
@@ -1,122 +1,123 @@
|
|
|
1
|
-
const
|
|
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
|
-
const
|
|
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
|
-
// - allows
|
|
63
|
-
|
|
64
|
-
var
|
|
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
|
-
.then(() =>
|
|
102
|
-
.then(() =>
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
1
|
+
const
|
|
2
|
+
resolveNuget = require("./resolve-nuget"),
|
|
3
|
+
downloadNuget = require("./download-nuget"),
|
|
4
|
+
nugetUpdateSelf = require("./nuget-update-self"),
|
|
5
|
+
debug = require("debug")("install-local-tools"),
|
|
6
|
+
gutil = requireModule("gulp-util"),
|
|
7
|
+
path = require("path"),
|
|
8
|
+
fs = require("fs"),
|
|
9
|
+
getToolsFolder = require("./get-tools-folder"),
|
|
10
|
+
nuget = require("./nuget"),
|
|
11
|
+
ensureFolderExists = require("./ensure-folder-exists"),
|
|
12
|
+
{ ZarroError } = requireModule("zarro-error"),
|
|
13
|
+
del = require("del");
|
|
14
|
+
|
|
15
|
+
function cleanFoldersFrom(toolsFolder) {
|
|
16
|
+
const dirs = fs
|
|
17
|
+
.readdirSync(toolsFolder)
|
|
18
|
+
.map(p => path.join(toolsFolder, p))
|
|
19
|
+
.filter(p => {
|
|
20
|
+
const stat = fs.lstatSync(p);
|
|
21
|
+
return stat.isDirectory();
|
|
22
|
+
});
|
|
23
|
+
if (dirs.length) {
|
|
24
|
+
debug(`Will delete the following tools sub-folders:`);
|
|
25
|
+
dirs.forEach(d => {
|
|
26
|
+
debug(` - ${d}`);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return del(dirs);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function downloadOrUpdateNuget(targetFolder) {
|
|
33
|
+
const nugetPath = path.join(targetFolder, "nuget.exe");
|
|
34
|
+
const nuget = resolveNuget(nugetPath, false);
|
|
35
|
+
if (nuget && !nuget.match(/dotnet/i)) {
|
|
36
|
+
if (!process.env.SKIP_NUGET_UPDATES) {
|
|
37
|
+
gutil.log("nuget.exe already exists... attempting self-update");
|
|
38
|
+
console.log(`NUGET: (${nuget})`);
|
|
39
|
+
return nugetUpdateSelf(nuget);
|
|
40
|
+
}
|
|
41
|
+
return nuget;
|
|
42
|
+
}
|
|
43
|
+
debug(`Attempting to get tools nuget to: ${targetFolder}`);
|
|
44
|
+
return downloadNuget(targetFolder);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function generateNugetSourcesOptions(toolSpecifiedSource) {
|
|
48
|
+
if (toolSpecifiedSource) {
|
|
49
|
+
return ["-source", toolSpecifiedSource];
|
|
50
|
+
}
|
|
51
|
+
return (process.env.NUGET_SOURCES || "")
|
|
52
|
+
.split(",")
|
|
53
|
+
.reduce((acc, cur) => acc.concat(cur ? ["-source", cur] : []), []);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function generateNugetInstallArgsFor(toolSpec) {
|
|
57
|
+
// accept a tool package in the formats:
|
|
58
|
+
// packagename (eg 'nunit')
|
|
59
|
+
// - retrieves the package according to the system config (original & default behavior)
|
|
60
|
+
// source/packagename (eg 'proget.mycompany.moo/nunit')
|
|
61
|
+
// - retrieves the package from the named source (same as nuget.exe install nunit -source proget.mycompany.moo}
|
|
62
|
+
// - allows consumer to be specific about where the package should come from
|
|
63
|
+
// - allows third-parties to be specific about their packages being from, eg, nuget.org
|
|
64
|
+
var parts = toolSpec.split("/");
|
|
65
|
+
var toolPackage = parts.splice(parts.length - 1);
|
|
66
|
+
return ["install", toolPackage].concat(generateNugetSourcesOptions(parts[0]));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// gulp4 doesn't seem to protect against repeated dependencies, so this is a safeguard
|
|
70
|
+
// here to prevent accidental parallel install
|
|
71
|
+
let
|
|
72
|
+
installingPromise = null,
|
|
73
|
+
installingRequest = null;
|
|
74
|
+
module.exports = {
|
|
75
|
+
install: (requiredTools, overrideToolsFolder) => {
|
|
76
|
+
if (!requiredTools) {
|
|
77
|
+
throw new ZarroError("No required tools set");
|
|
78
|
+
}
|
|
79
|
+
if (!Array.isArray(requiredTools)) {
|
|
80
|
+
requiredTools = [requiredTools];
|
|
81
|
+
}
|
|
82
|
+
const target = overrideToolsFolder || getToolsFolder();
|
|
83
|
+
// TODO: should allow subsequent installations, ie if
|
|
84
|
+
// a prior install asked for tools "A" and "B", a subsequent
|
|
85
|
+
// request for "C" should just wait and then do the work
|
|
86
|
+
if (installingPromise) {
|
|
87
|
+
debug("default tools installer already running...");
|
|
88
|
+
const missing = requiredTools.reduce((acc, cur) => {
|
|
89
|
+
if (installingRequest.indexOf(cur) === -1) {
|
|
90
|
+
acc.push(cur);
|
|
91
|
+
}
|
|
92
|
+
return acc;
|
|
93
|
+
}, []);
|
|
94
|
+
if (missing.length) {
|
|
95
|
+
return Promist.reject("multiple tools installations are not (yet) supported");
|
|
96
|
+
}
|
|
97
|
+
return installingPromise;
|
|
98
|
+
}
|
|
99
|
+
installingRequest = requiredTools;
|
|
100
|
+
return installingPromise = ensureFolderExists(target)
|
|
101
|
+
.then(() => cleanFoldersFrom(target))
|
|
102
|
+
.then(() => downloadOrUpdateNuget(target))
|
|
103
|
+
.then(() =>
|
|
104
|
+
Promise.all(
|
|
105
|
+
requiredTools.map(tool => {
|
|
106
|
+
debug(`install: ${tool}`);
|
|
107
|
+
return nuget(
|
|
108
|
+
generateNugetInstallArgsFor(tool),
|
|
109
|
+
{ cwd: target }
|
|
110
|
+
);
|
|
111
|
+
})
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
.then(() => {
|
|
115
|
+
debug("tool installation complete");
|
|
116
|
+
});
|
|
117
|
+
},
|
|
118
|
+
clean: overrideToolsFolder => {
|
|
119
|
+
debug("cleaning tools folder");
|
|
120
|
+
const target = overrideToolsFolder || getToolsFolder();
|
|
121
|
+
return cleanFoldersFrom(target);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
(function () {
|
|
3
|
-
const resolveNuget =
|
|
3
|
+
const resolveNuget = requireModule("resolve-nuget"), findLocalNuget = requireModule("find-local-nuget"), tryDo = requireModule("try-do"), exec = requireModule("exec");
|
|
4
4
|
module.exports = async function (args, execOpts) {
|
|
5
|
-
const resolvedNuget =
|
|
6
|
-
return exec(nugetPath, argsCopy, execOpts);
|
|
5
|
+
const resolvedNuget = resolveNuget(undefined, false), nugetPath = resolvedNuget || await findLocalNuget(), argsCopy = args.slice();
|
|
6
|
+
return await tryDo(() => exec(nugetPath, argsCopy, execOpts), "RESTORE_RETRIES");
|
|
7
7
|
};
|
|
8
8
|
})();
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
(function() {
|
|
2
|
-
const
|
|
3
|
-
resolveNuget =
|
|
4
|
-
findLocalNuget =
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
(function() {
|
|
2
|
+
const
|
|
3
|
+
resolveNuget = requireModule<ResolveNuget>("resolve-nuget"),
|
|
4
|
+
findLocalNuget = requireModule<FindLocalNuget>("find-local-nuget"),
|
|
5
|
+
tryDo = requireModule<TryDo<string>>("try-do"),
|
|
6
|
+
exec = requireModule<Exec>("exec");
|
|
7
|
+
|
|
8
|
+
module.exports = async function(args: string[], execOpts: ExecOpts) {
|
|
9
|
+
const
|
|
10
|
+
resolvedNuget = resolveNuget(undefined, false),
|
|
11
|
+
nugetPath = resolvedNuget || await findLocalNuget(),
|
|
12
|
+
argsCopy = args.slice();
|
|
13
|
+
return await tryDo(
|
|
14
|
+
() => exec(nugetPath, argsCopy, execOpts),
|
|
15
|
+
"RESTORE_RETRIES"
|
|
16
|
+
)
|
|
17
|
+
}
|
|
18
|
+
})();
|
|
@@ -13,8 +13,7 @@
|
|
|
13
13
|
let retryCount = 0;
|
|
14
14
|
while (totalAttempts-- > 0) {
|
|
15
15
|
try {
|
|
16
|
-
await logic();
|
|
17
|
-
return;
|
|
16
|
+
return await logic();
|
|
18
17
|
}
|
|
19
18
|
catch (e) {
|
|
20
19
|
if (totalAttempts > 0) {
|
|
@@ -47,6 +46,7 @@
|
|
|
47
46
|
}
|
|
48
47
|
}
|
|
49
48
|
}
|
|
49
|
+
throw new Error("Should have either completed or thrown by now");
|
|
50
50
|
}
|
|
51
51
|
module.exports = tryDo;
|
|
52
52
|
})();
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
env = requireModule<Env>("env"),
|
|
4
4
|
chalk = require("ansi-colors");
|
|
5
5
|
|
|
6
|
-
async function tryDo(
|
|
7
|
-
logic:
|
|
6
|
+
async function tryDo<T>(
|
|
7
|
+
logic: AsyncVoidFunc<T>,
|
|
8
8
|
retries: number | string,
|
|
9
9
|
onTransientError: ErrorReporter,
|
|
10
10
|
onFinalFailure: VoidVoid
|
|
11
|
-
): Promise<
|
|
11
|
+
): Promise<T> {
|
|
12
12
|
// always attempt at least once
|
|
13
13
|
const requestedRetries = typeof retries === "string"
|
|
14
14
|
? env.resolveNumber(retries)
|
|
@@ -22,8 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
while (totalAttempts-- > 0) {
|
|
24
24
|
try {
|
|
25
|
-
await logic();
|
|
26
|
-
return;
|
|
25
|
+
return await logic();
|
|
27
26
|
} catch (e) {
|
|
28
27
|
if (totalAttempts > 0) {
|
|
29
28
|
if (onTransientError) {
|
|
@@ -51,6 +50,7 @@
|
|
|
51
50
|
}
|
|
52
51
|
}
|
|
53
52
|
}
|
|
53
|
+
throw new Error("Should have either completed or thrown by now");
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
module.exports = tryDo;
|
|
@@ -6,7 +6,6 @@ const
|
|
|
6
6
|
nugetRestore = requireModule("./gulp-nuget-restore"),
|
|
7
7
|
promisify = requireModule("promisify"),
|
|
8
8
|
resolveMasks = requireModule("resolve-masks"),
|
|
9
|
-
{ ZarroError } = requireModule("zarro-error"),
|
|
10
9
|
tryDo = requireModule("try-do"),
|
|
11
10
|
findLocalNuget = requireModule("find-local-nuget");
|
|
12
11
|
|
package/package.json
CHANGED
package/types.d.ts
CHANGED
|
@@ -21,11 +21,14 @@ declare global {
|
|
|
21
21
|
|
|
22
22
|
type VoidVoid = () => void;
|
|
23
23
|
type AsyncVoidVoid = () => Promise<void>;
|
|
24
|
-
type
|
|
24
|
+
type AsyncVoidFunc<T> = () => Promise<T>;
|
|
25
25
|
type ErrorReporter = (e: Error) => Promise<void> | void;
|
|
26
26
|
type GulpCallback =
|
|
27
27
|
(() => Promise<any> | NodeJS.EventEmitter) | ((done: VoidVoid) => Promise<any> | NodeJS.EventEmitter)
|
|
28
|
-
type TryDo = (logic:
|
|
28
|
+
type TryDo<T> = (logic: AsyncVoidFunc<T>, retries: number | string, onTransientError?: ErrorReporter, onFinalFailure?: VoidVoid) => Promise<void>;
|
|
29
|
+
type Optional<T> = T | undefined;
|
|
30
|
+
type ResolveNuget = (nugetPath: Optional<string>, errorOnMissing: boolean) => string;
|
|
31
|
+
type FindLocalNuget = () => Promise<string>;
|
|
29
32
|
|
|
30
33
|
interface GulpWithHelp {
|
|
31
34
|
task(name: string, callback: GulpCallback): void;
|