zarro 1.92.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/LICENSE +10 -0
- package/README.md +260 -0
- package/gulp-tasks/.editorconfig +8 -0
- package/gulp-tasks/.git +1 -0
- package/gulp-tasks/.gitignore +9 -0
- package/gulp-tasks/.gitmodules +0 -0
- package/gulp-tasks/LICENSE +24 -0
- package/gulp-tasks/README.md +144 -0
- package/gulp-tasks/build.js +135 -0
- package/gulp-tasks/clean.js +37 -0
- package/gulp-tasks/cover-dotnet.js +56 -0
- package/gulp-tasks/default-report-generator.js +51 -0
- package/gulp-tasks/default-tools-installer.js +33 -0
- package/gulp-tasks/default.js +17 -0
- package/gulp-tasks/dotnet-publish.js +23 -0
- package/gulp-tasks/generate-reports.js +7 -0
- package/gulp-tasks/get-local-nuget.js +16 -0
- package/gulp-tasks/git-submodules.js +83 -0
- package/gulp-tasks/increment-package-json-version.js +12 -0
- package/gulp-tasks/increment-package-json-version.ts +17 -0
- package/gulp-tasks/install-tools.js +24 -0
- package/gulp-tasks/modules/add-stream-on-any-handler.js +31 -0
- package/gulp-tasks/modules/alter-package-json-version.js +64 -0
- package/gulp-tasks/modules/alter-package-json-version.ts +113 -0
- package/gulp-tasks/modules/are-all-dotnet-core.js +96 -0
- package/gulp-tasks/modules/ask.js +31 -0
- package/gulp-tasks/modules/ask.ts +41 -0
- package/gulp-tasks/modules/collect-files.js +15 -0
- package/gulp-tasks/modules/collect-files.ts +16 -0
- package/gulp-tasks/modules/config-generator.js +10 -0
- package/gulp-tasks/modules/defaults.js +9 -0
- package/gulp-tasks/modules/download-nuget.js +104 -0
- package/gulp-tasks/modules/ensure-folder-exists.js +21 -0
- package/gulp-tasks/modules/env-helpers.js +49 -0
- package/gulp-tasks/modules/env-helpers.ts +67 -0
- package/gulp-tasks/modules/env.js +364 -0
- package/gulp-tasks/modules/exec.js +257 -0
- package/gulp-tasks/modules/exec.ts +346 -0
- package/gulp-tasks/modules/fail-after.js +30 -0
- package/gulp-tasks/modules/fail-after.ts +34 -0
- package/gulp-tasks/modules/fallback.js +6 -0
- package/gulp-tasks/modules/find-dirs.js +39 -0
- package/gulp-tasks/modules/find-local-nuget.js +42 -0
- package/gulp-tasks/modules/find-npm-base.js +42 -0
- package/gulp-tasks/modules/fs.js +79 -0
- package/gulp-tasks/modules/gather-paths.js +23 -0
- package/gulp-tasks/modules/gather-paths.ts +29 -0
- package/gulp-tasks/modules/generate-env-help-for.js +30 -0
- package/gulp-tasks/modules/get-tools-folder.js +12 -0
- package/gulp-tasks/modules/git-push-tags.js +33 -0
- package/gulp-tasks/modules/git-push-tags.ts +42 -0
- package/gulp-tasks/modules/git-push.js +51 -0
- package/gulp-tasks/modules/git-tag.js +36 -0
- package/gulp-tasks/modules/gulp-dotnetcover.js +537 -0
- package/gulp-tasks/modules/gulp-git-tag-from-csproj.js +50 -0
- package/gulp-tasks/modules/gulp-git-tag-from-csproj.ts +71 -0
- package/gulp-tasks/modules/gulp-git-tag-from-package-nuspec.js +55 -0
- package/gulp-tasks/modules/gulp-increment-nuget-package-dependency-version.js +40 -0
- package/gulp-tasks/modules/gulp-increment-nuget-package-version.js +87 -0
- package/gulp-tasks/modules/gulp-increment-nuget-package-version.ts +122 -0
- package/gulp-tasks/modules/gulp-msbuild.js +1 -0
- package/gulp-tasks/modules/gulp-npm-run.js +40 -0
- package/gulp-tasks/modules/gulp-npm-run.ts +52 -0
- package/gulp-tasks/modules/gulp-nuget-pack.js +168 -0
- package/gulp-tasks/modules/gulp-nuget-restore.js +106 -0
- package/gulp-tasks/modules/gulp-nunit-runner/.jshintrc +5 -0
- package/gulp-tasks/modules/gulp-nunit-runner/.npmignore +16 -0
- package/gulp-tasks/modules/gulp-nunit-runner/LICENSE +21 -0
- package/gulp-tasks/modules/gulp-nunit-runner/README.md +300 -0
- package/gulp-tasks/modules/gulp-nunit-runner/index.js +1 -0
- package/gulp-tasks/modules/gulp-nunit-runner/lib/index.js +205 -0
- package/gulp-tasks/modules/gulp-nunit-runner/lib/teamcity.js +86 -0
- package/gulp-tasks/modules/gulp-purge.js +88 -0
- package/gulp-tasks/modules/gulp-util.js +5 -0
- package/gulp-tasks/modules/gulp-version.js +8 -0
- package/gulp-tasks/modules/gulp-with-help.js +1 -0
- package/gulp-tasks/modules/gulp-xbuild.js +62 -0
- package/gulp-tasks/modules/gulp.js +92 -0
- package/gulp-tasks/modules/http-downloader.js +113 -0
- package/gulp-tasks/modules/import-npm-tasks.js +33 -0
- package/gulp-tasks/modules/increment-version-string.js +18 -0
- package/gulp-tasks/modules/increment-version.js +30 -0
- package/gulp-tasks/modules/increment-version.ts +41 -0
- package/gulp-tasks/modules/install-local-tools.js +122 -0
- package/gulp-tasks/modules/load-xml-file.js +12 -0
- package/gulp-tasks/modules/load-xml-file.ts +15 -0
- package/gulp-tasks/modules/log-config.js +31 -0
- package/gulp-tasks/modules/log.js +142 -0
- package/gulp-tasks/modules/longest-string-length.js +13 -0
- package/gulp-tasks/modules/looks-like-a-promise.js +11 -0
- package/gulp-tasks/modules/ls-r.js +52 -0
- package/gulp-tasks/modules/multi-split.js +29 -0
- package/gulp-tasks/modules/net-framework-test-assembly-filter.js +45 -0
- package/gulp-tasks/modules/nuget-push.js +66 -0
- package/gulp-tasks/modules/nuget-update-self.js +9 -0
- package/gulp-tasks/modules/nuget.js +8 -0
- package/gulp-tasks/modules/nuget.ts +14 -0
- package/gulp-tasks/modules/pad-left.js +4 -0
- package/gulp-tasks/modules/pad-right.js +4 -0
- package/gulp-tasks/modules/pad.js +25 -0
- package/gulp-tasks/modules/parse-xml-string.js +5 -0
- package/gulp-tasks/modules/parse-xml-string.ts +6 -0
- package/gulp-tasks/modules/parse-xml.js +14 -0
- package/gulp-tasks/modules/parse-xml.ts +15 -0
- package/gulp-tasks/modules/path-unquote.js +6 -0
- package/gulp-tasks/modules/promisify-function.js +19 -0
- package/gulp-tasks/modules/promisify-function.ts +18 -0
- package/gulp-tasks/modules/promisify-stream.js +73 -0
- package/gulp-tasks/modules/promisify.js +1 -0
- package/gulp-tasks/modules/quote-if-required.js +14 -0
- package/gulp-tasks/modules/read-all-git-branches.js +10 -0
- package/gulp-tasks/modules/read-all-git-branches.ts +13 -0
- package/gulp-tasks/modules/read-all-git-remotes.js +36 -0
- package/gulp-tasks/modules/read-all-git-remotes.ts +44 -0
- package/gulp-tasks/modules/read-csproj-package-version.js +16 -0
- package/gulp-tasks/modules/read-csproj-package-version.ts +26 -0
- package/gulp-tasks/modules/read-csproj-version.js +16 -0
- package/gulp-tasks/modules/read-csproj-version.ts +26 -0
- package/gulp-tasks/modules/read-current-git-branch.js +12 -0
- package/gulp-tasks/modules/read-current-git-branch.ts +16 -0
- package/gulp-tasks/modules/read-git-commit-delta-count.js +21 -0
- package/gulp-tasks/modules/read-git-commit-delta-count.ts +33 -0
- package/gulp-tasks/modules/read-git-info.js +28 -0
- package/gulp-tasks/modules/read-git-info.ts +31 -0
- package/gulp-tasks/modules/read-git-remote.js +17 -0
- package/gulp-tasks/modules/read-git-remote.ts +23 -0
- package/gulp-tasks/modules/read-last-fetch-time.js +21 -0
- package/gulp-tasks/modules/read-last-fetch-time.ts +17 -0
- package/gulp-tasks/modules/read-main-branch-name.js +48 -0
- package/gulp-tasks/modules/read-main-branch-name.ts +76 -0
- package/gulp-tasks/modules/read-nuspec-version.js +14 -0
- package/gulp-tasks/modules/read-nuspec-version.ts +22 -0
- package/gulp-tasks/modules/read-package-json.js +16 -0
- package/gulp-tasks/modules/read-package-json.ts +22 -0
- package/gulp-tasks/modules/read-package-version.js +8 -0
- package/gulp-tasks/modules/read-package-version.ts +10 -0
- package/gulp-tasks/modules/read-text-file.js +14 -0
- package/gulp-tasks/modules/read-text-file.ts +14 -0
- package/gulp-tasks/modules/reduce-gulp-noise.js +34 -0
- package/gulp-tasks/modules/register-environment-variables.js +526 -0
- package/gulp-tasks/modules/require-module.js +28 -0
- package/gulp-tasks/modules/resolve-git-branch.js +11 -0
- package/gulp-tasks/modules/resolve-git-branch.ts +13 -0
- package/gulp-tasks/modules/resolve-git-remote.js +11 -0
- package/gulp-tasks/modules/resolve-git-remote.ts +13 -0
- package/gulp-tasks/modules/resolve-masks.js +47 -0
- package/gulp-tasks/modules/resolve-nuget.js +135 -0
- package/gulp-tasks/modules/resolve-test-masks.js +10 -0
- package/gulp-tasks/modules/rewrite-file.js +26 -0
- package/gulp-tasks/modules/rewrite-file.ts +34 -0
- package/gulp-tasks/modules/rimraf.js +21 -0
- package/gulp-tasks/modules/rimraf.ts +31 -0
- package/gulp-tasks/modules/run-sequence.js +16 -0
- package/gulp-tasks/modules/safe-git.js +23 -0
- package/gulp-tasks/modules/safe-git.ts +23 -0
- package/gulp-tasks/modules/seed.js +12 -0
- package/gulp-tasks/modules/set-task-name.js +9 -0
- package/gulp-tasks/modules/sleep.js +5 -0
- package/gulp-tasks/modules/spawn-nuget.js +13 -0
- package/gulp-tasks/modules/spawn.js +103 -0
- package/gulp-tasks/modules/split-path.js +3 -0
- package/gulp-tasks/modules/stat.js +8 -0
- package/gulp-tasks/modules/status.js +57 -0
- package/gulp-tasks/modules/status.ts +71 -0
- package/gulp-tasks/modules/test-path.js +3 -0
- package/gulp-tasks/modules/testutil-finder.js +176 -0
- package/gulp-tasks/modules/throw-if-no-files.js +15 -0
- package/gulp-tasks/modules/uniq.js +6 -0
- package/gulp-tasks/modules/uniq.ts +5 -0
- package/gulp-tasks/modules/verify-exe.js +17 -0
- package/gulp-tasks/modules/version-reading-shared.js +12 -0
- package/gulp-tasks/modules/version-reading-shared.ts +16 -0
- package/gulp-tasks/modules/write-text-file.js +10 -0
- package/gulp-tasks/modules/zarro-error.js +6 -0
- package/gulp-tasks/nuget-restore.js +57 -0
- package/gulp-tasks/pack.js +118 -0
- package/gulp-tasks/purge.js +94 -0
- package/gulp-tasks/release-npm.js +58 -0
- package/gulp-tasks/release-npm.ts +81 -0
- package/gulp-tasks/start/_package.json +39 -0
- package/gulp-tasks/start/gulpfile.js +204 -0
- package/gulp-tasks/start/update-starter-packages.js +63 -0
- package/gulp-tasks/test-dotnet.js +195 -0
- package/gulp-tasks/update-git-submodules.js +11 -0
- package/gulp-tasks/update-git-submodules.ts +29 -0
- package/gulp-tasks/update-self.js +65 -0
- package/gulp-tasks/update-self.ts +88 -0
- package/gulp-tasks/verify-up-to-date.js +77 -0
- package/gulp-tasks/verify-up-to-date.ts +119 -0
- package/index-modules/contains-any.js +31 -0
- package/index-modules/gather-args.js +21 -0
- package/index-modules/handlers/help.js +17 -0
- package/index-modules/handlers/init.js +57 -0
- package/index-modules/handlers/invoke-gulp.js +111 -0
- package/index-modules/handlers/show-env.js +46 -0
- package/index-modules/is-dir.js +6 -0
- package/index-modules/is-file.js +6 -0
- package/index.js +53 -0
- package/package.json +96 -0
- package/tsconfig.json +66 -0
- package/types.d.ts +753 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
// replaces the gulp-npm-run node module
|
|
3
|
+
// which relies on ramda -- that keeps on having
|
|
4
|
+
// breaking changes released. NO MORE.
|
|
5
|
+
const
|
|
6
|
+
{ readFileSync } = require("fs"),
|
|
7
|
+
debug = require("debug")("gulp-npm-run"),
|
|
8
|
+
exec = require("./exec") as Exec,
|
|
9
|
+
path = require("path"),
|
|
10
|
+
chalk = require("ansi-colors"),
|
|
11
|
+
{ ZarroError } = requireModule("zarro-error"),
|
|
12
|
+
findNpmBase = require("./find-npm-base");
|
|
13
|
+
|
|
14
|
+
function gulpNpmRun(gulp: GulpWithHelp) {
|
|
15
|
+
const
|
|
16
|
+
packageIndex = findPackageIndex(),
|
|
17
|
+
scripts = packageIndex.scripts || {};
|
|
18
|
+
Object.keys(scripts).forEach(k => {
|
|
19
|
+
gulp.task(k, `npm script: ${k}`, async () => {
|
|
20
|
+
// npm run produces extra output, prefixed with >
|
|
21
|
+
// at the start, including package information and the script line
|
|
22
|
+
// -> we'll ignore it unless someone _really_ wants it
|
|
23
|
+
let ignoredFirstLine = false;
|
|
24
|
+
await exec("npm", [ "run", k ], undefined, {
|
|
25
|
+
stderr: (d: string) => console.error(chalk.red(d)),
|
|
26
|
+
stdout: (d: string) => {
|
|
27
|
+
if (!ignoredFirstLine) {
|
|
28
|
+
debug(`npm diagnostics:\n${d}`);
|
|
29
|
+
ignoredFirstLine = true;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log(chalk.yellow(d))
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function findPackageIndex(): PackageIndex {
|
|
40
|
+
const
|
|
41
|
+
packageIndexFolder = findNpmBase(),
|
|
42
|
+
packageIndexPath = path.join(packageIndexFolder, "package.json");
|
|
43
|
+
try {
|
|
44
|
+
const contents = readFileSync(packageIndexPath, { encoding: "utf8" });
|
|
45
|
+
return JSON.parse(contents);
|
|
46
|
+
} catch (e) {
|
|
47
|
+
throw new ZarroError(`Unable to read package.json at ${packageIndexPath}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
module.exports = gulpNpmRun;
|
|
52
|
+
})();
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
const
|
|
2
|
+
temp = require("temp"),
|
|
3
|
+
Vinyl = require("vinyl"),
|
|
4
|
+
fs = require("./fs"),
|
|
5
|
+
path = require("path"),
|
|
6
|
+
parseXml = requireModule("parse-xml"),
|
|
7
|
+
looksLikeAPromise = requireModule("looks-like-a-promise"),
|
|
8
|
+
gutil = requireModule("gulp-util"),
|
|
9
|
+
spawnNuget = requireModule("spawn-nuget"),
|
|
10
|
+
debug = require("debug")("gulp-nuget-pack"),
|
|
11
|
+
env = requireModule("env"),
|
|
12
|
+
es = require("event-stream");
|
|
13
|
+
|
|
14
|
+
env.associate([
|
|
15
|
+
"PACK_BASE_PATH",
|
|
16
|
+
"PACK_VERSION",
|
|
17
|
+
"PACK_INCLUDE_EMPTY_DIRECTORIES",
|
|
18
|
+
"PACK_INCLUDE_SYMBOLS",
|
|
19
|
+
"PACK_LEGACY_SYMBOLS"
|
|
20
|
+
], "pack");
|
|
21
|
+
|
|
22
|
+
async function grokNuspec(xmlString) {
|
|
23
|
+
const pkg = await parseXml(xmlString),
|
|
24
|
+
metadata = pkg.package.metadata[0];
|
|
25
|
+
return {
|
|
26
|
+
packageName: metadata.id[0],
|
|
27
|
+
packageVersion: metadata.version[0]
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function resolveAll(obj) {
|
|
32
|
+
const result = {};
|
|
33
|
+
for (const key of Object.keys(obj)) {
|
|
34
|
+
if (looksLikeAPromise(obj[key])) {
|
|
35
|
+
result[key] = await obj[key];
|
|
36
|
+
} else {
|
|
37
|
+
result[key] = obj[key];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function resolveRelativeBasePathOn(options, nuspecPath) {
|
|
44
|
+
if (!options.basePath) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (options.basePath.indexOf("~") === 0) {
|
|
48
|
+
const packageDir = path.dirname(nuspecPath).replace(/\\/g, "/"),
|
|
49
|
+
sliced = options.basePath.substr(1).replace(/\\/g, "/");
|
|
50
|
+
options.basePath = path.join(packageDir, sliced);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @param {PackOptions} options
|
|
56
|
+
* @param {string[]} args
|
|
57
|
+
* @returns void
|
|
58
|
+
*/
|
|
59
|
+
function addOptionalParameters(options, args) {
|
|
60
|
+
if (options.basePath) {
|
|
61
|
+
gutil.log(`packaging with base path: ${options.basePath}`);
|
|
62
|
+
args.splice(args.length, 0, "-BasePath", options.basePath);
|
|
63
|
+
}
|
|
64
|
+
if (options.excludeEmptyDirectories) {
|
|
65
|
+
args.splice(args.length, 0, "-ExcludeEmptyDirectories");
|
|
66
|
+
}
|
|
67
|
+
if (options.version) {
|
|
68
|
+
gutil.log(`Overriding package version with: ${options.version}`);
|
|
69
|
+
args.splice(args.length, 0, "-version", options.version);
|
|
70
|
+
}
|
|
71
|
+
if (options.symbols) {
|
|
72
|
+
args.splice(args.length, 0, "-Symbols");
|
|
73
|
+
if (!options.legacySymbols) {
|
|
74
|
+
args.splice(args.length, 0, "-SymbolPackageFormat", "snupkg");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @param {PackOptions} options
|
|
81
|
+
* @returns {ReadableStream}
|
|
82
|
+
*/
|
|
83
|
+
function gulpNugetPack(options) {
|
|
84
|
+
options = Object.assign({}, options);
|
|
85
|
+
options.basePath = env.resolve("PACK_BASE_PATH") || options.basePath;
|
|
86
|
+
if (options.excludeEmptyDirectories === undefined) {
|
|
87
|
+
options.excludeEmptyDirectories = env.resolve("PACK_INCLUDE_EMPTY_DIRECTORIES");
|
|
88
|
+
}
|
|
89
|
+
if (options.version === undefined) {
|
|
90
|
+
options.version = env.resolve("PACK_VERSION");
|
|
91
|
+
}
|
|
92
|
+
if (options.symbols === undefined) {
|
|
93
|
+
options.symbols = env.resolve("PACK_INCLUDE_SYMBOLS");
|
|
94
|
+
}
|
|
95
|
+
if (options.legacySymbols === undefined) {
|
|
96
|
+
options.legacySymbols = env.resolve("PACK_LEGACY_SYMBOLS");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const
|
|
100
|
+
tracked = temp.track(),
|
|
101
|
+
workDir = tracked.mkdirSync();
|
|
102
|
+
let
|
|
103
|
+
promise = Promise.resolve();
|
|
104
|
+
return es.through(
|
|
105
|
+
function write(file) {
|
|
106
|
+
promise = promise.then(async () => {
|
|
107
|
+
options = await resolveAll(options);
|
|
108
|
+
resolveRelativeBasePathOn(options, file.path);
|
|
109
|
+
const { packageName, packageVersion } = await grokNuspec(
|
|
110
|
+
file.contents.toString()
|
|
111
|
+
),
|
|
112
|
+
version = options.version || packageVersion,
|
|
113
|
+
expectedFileName = path.join(
|
|
114
|
+
workDir,
|
|
115
|
+
`${packageName}.${version}.nupkg`
|
|
116
|
+
),
|
|
117
|
+
args = [ "pack", file.path, "-OutputDirectory", workDir ];
|
|
118
|
+
|
|
119
|
+
await fs.ensureDirectoryExists(workDir);
|
|
120
|
+
addOptionalParameters(options, args);
|
|
121
|
+
|
|
122
|
+
await spawnNuget(args, {
|
|
123
|
+
stdout: () => {
|
|
124
|
+
/* suppress stdout: it's confusing anyway because it mentions temp files */
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const outputExists = await fs.exists(expectedFileName);
|
|
129
|
+
if (!outputExists) {
|
|
130
|
+
const err = `file not found: ${expectedFileName}`;
|
|
131
|
+
this.emit("error", err);
|
|
132
|
+
throw err;
|
|
133
|
+
} else {
|
|
134
|
+
logBuilt(expectedFileName);
|
|
135
|
+
this.emit(
|
|
136
|
+
"data",
|
|
137
|
+
new Vinyl({
|
|
138
|
+
path: path.basename(expectedFileName),
|
|
139
|
+
contents: await fs.readFile(expectedFileName)
|
|
140
|
+
})
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
async function end() {
|
|
146
|
+
let errored = false;
|
|
147
|
+
await promise.catch(err => {
|
|
148
|
+
errored = true;
|
|
149
|
+
this.emit("error", err);
|
|
150
|
+
});
|
|
151
|
+
if (!errored) {
|
|
152
|
+
tracked.cleanupSync();
|
|
153
|
+
this.emit("end");
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function logBuilt(packagePath) {
|
|
160
|
+
debug(`built intermediate package: ${packagePath}`);
|
|
161
|
+
gutil.log(
|
|
162
|
+
gutil.colors.yellow(`built package: ${path.basename(packagePath)}`)
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
module.exports = {
|
|
167
|
+
pack: gulpNugetPack
|
|
168
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
var
|
|
3
|
+
path = require("path"),
|
|
4
|
+
gutil = requireModule('gulp-util'),
|
|
5
|
+
es = require('event-stream'),
|
|
6
|
+
spawn = require('./spawn'),
|
|
7
|
+
log = require('./log'),
|
|
8
|
+
resolveNuget = require('./resolve-nuget'),
|
|
9
|
+
env = requireModule("env"),
|
|
10
|
+
isDotnetCore = env.resolveFlag("DOTNET_CORE"),
|
|
11
|
+
nugetExe = isDotnetCore ? (process.platform === "win32" ? "dotnet.exe" : "dotnet") : "nuget.exe",
|
|
12
|
+
debug = require('debug')('gulp-nuget-restore');
|
|
13
|
+
|
|
14
|
+
var PLUGIN_NAME = 'gulp-nuget-restore';
|
|
15
|
+
var DEBUG = true;
|
|
16
|
+
|
|
17
|
+
function nugetRestore(options) {
|
|
18
|
+
options = options || {};
|
|
19
|
+
DEBUG = options.debug || process.env.DEBUG === "*" || false;
|
|
20
|
+
options.force = options.force || false;
|
|
21
|
+
if (DEBUG) {
|
|
22
|
+
log.setThreshold(log.LogLevels.Debug);
|
|
23
|
+
}
|
|
24
|
+
var solutionFiles = [];
|
|
25
|
+
var stream = es.through(function write(file) {
|
|
26
|
+
if (!file) {
|
|
27
|
+
fail(stream, 'file may not be empty or undefined');
|
|
28
|
+
}
|
|
29
|
+
solutionFiles.push(file);
|
|
30
|
+
this.emit('data', file);
|
|
31
|
+
}, function end() {
|
|
32
|
+
restoreNugetPackagesWith(this, solutionFiles, options);
|
|
33
|
+
});
|
|
34
|
+
return stream;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function fail(stream, msg) {
|
|
38
|
+
stream.emit('error', new gutil.PluginError(PLUGIN_NAME, msg));
|
|
39
|
+
}
|
|
40
|
+
function end(stream) {
|
|
41
|
+
stream.emit('end');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function determineRestoreCommandFor(nugetPath, stream) {
|
|
45
|
+
try {
|
|
46
|
+
var nuget = resolveNuget(nugetPath);
|
|
47
|
+
debug('Resolved restore tool at: ' + nuget);
|
|
48
|
+
return nuget;
|
|
49
|
+
} catch (ex) {
|
|
50
|
+
fail(stream, [
|
|
51
|
+
`No restore tool (nuget / dotnet) resolved: ${ex}`,
|
|
52
|
+
`stack: ${ex.stack || "no stack"}`
|
|
53
|
+
].join("\n"));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function runNuget(restoreCommand, solutions, stream) {
|
|
58
|
+
debug(`restoreCmd: ${restoreCommand}`);
|
|
59
|
+
var deferred = Promise.resolve();
|
|
60
|
+
var final = solutions.reduce(function (promise, item) {
|
|
61
|
+
log.info('Restoring packages for: ' + item);
|
|
62
|
+
var pathParts = item.split(/[\\|\/]/g);
|
|
63
|
+
var sln = pathParts[pathParts.length - 1];
|
|
64
|
+
var slnFolder = pathParts.slice(0, pathParts.length - 1).join(path.sep);
|
|
65
|
+
var args = ['restore', sln];
|
|
66
|
+
if (env.resolveFlag("ENABLE_NUGET_PARALLEL_PROCESSING")) {
|
|
67
|
+
log.warning("Processing restore in parallel. If you get strange build errors, unset ENABLE_NUGET_PARALLEL_PROCESSING");
|
|
68
|
+
} else {
|
|
69
|
+
if (isDotnetCore) {
|
|
70
|
+
args.push("--disable-parallel");
|
|
71
|
+
} else {
|
|
72
|
+
args.push("-DisableParallelProcessing");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return promise.then(function () {
|
|
76
|
+
return spawn(restoreCommand, args, { cwd: slnFolder }).then(function () {
|
|
77
|
+
'Packages restored for: ' + item;
|
|
78
|
+
}).catch(function (err) {
|
|
79
|
+
throw err;
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}, deferred);
|
|
83
|
+
final.then(function () {
|
|
84
|
+
end(stream);
|
|
85
|
+
}).catch(function (err) {
|
|
86
|
+
fail(stream, err);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function restoreNugetPackagesWith(stream, solutionFiles, options) {
|
|
91
|
+
var solutions = solutionFiles.map(file => file.path);
|
|
92
|
+
if (solutions.length === 0) {
|
|
93
|
+
if (solutionFiles.length == 0) {
|
|
94
|
+
return fail(stream, 'No solutions defined for nuget restore');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
var nuget = options.nuget || nugetExe;
|
|
98
|
+
var nugetCmd = determineRestoreCommandFor(nuget, stream);
|
|
99
|
+
if (nugetCmd) {
|
|
100
|
+
runNuget(nugetCmd, solutions, stream);
|
|
101
|
+
} else {
|
|
102
|
+
fail(stream, "Can't determine nuget command");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
module.exports = nugetRestore;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
node_modules
|
|
2
|
+
test
|
|
3
|
+
.editorconfig
|
|
4
|
+
.gitignore
|
|
5
|
+
.jscsrc
|
|
6
|
+
.travis.yml
|
|
7
|
+
gulpfile.js
|
|
8
|
+
|
|
9
|
+
# Created by .ignore support plugin (hsz.mobi)
|
|
10
|
+
### JetBrains template
|
|
11
|
+
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
|
|
12
|
+
|
|
13
|
+
*.iml
|
|
14
|
+
|
|
15
|
+
## Directory-based project format:
|
|
16
|
+
.idea/
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014 Keith Morris
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
# gulp-nunit-runner
|
|
2
|
+
This is an embedded fork of [gulp-nunit-runner](https://www.npmjs.com/package/gulp-nunit-runner) since the latter appears to be unmaintained.
|
|
3
|
+
|
|
4
|
+
A [Gulp.js](http://gulpjs.com/) plugin to facilitate running [NUnit](http://www.nunit.org/) tests on .NET assemblies. Much of this work was inspired by the [gulp-nunit](https://github.com/stormid/gulp-nunit) plugin.
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
From the root of your project (where your `gulpfile.js` is), issue the following command:
|
|
9
|
+
|
|
10
|
+
```bat
|
|
11
|
+
npm install --save-dev gulp-nunit-runner
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
The plugin uses standard `gulp.src` globs to retrieve a list of assemblies that should be tested with Nunit. By default the plugin looks for the NUnit console runner in your `PATH`. You can optionally specify the NUnit `bin` folder or the full path of the runner as demonstrated below. You should add `{read: false}` to your `gulp.src` so that it doesn't actually read the files and only grabs the file names.
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
var gulp = require('gulp'),
|
|
20
|
+
nunit = require('gulp-nunit-runner');
|
|
21
|
+
|
|
22
|
+
gulp.task('unit-test', function () {
|
|
23
|
+
return gulp.src(['**/*.Test.dll'], {read: false})
|
|
24
|
+
.pipe(nunit({
|
|
25
|
+
executable: 'C:/nunit/bin/nunit-console.exe',
|
|
26
|
+
}));
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
This would result in the following command being executed (assuming you had Database and Services Test assemblies.)
|
|
31
|
+
|
|
32
|
+
```bat
|
|
33
|
+
C:/nunit/bin/nunit-console.exe "C:\full\path\to\Database.Test.dll" "C:\full\path\to\Services.Test.dll"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Note: If you use Windows paths with `\`'s, you need to escape them with another `\`. (e.g. `C:\\nunit\\bin\\nunit-console.exe`). However, you may also use forward slashes `/` instead which don't have to be escaped.
|
|
37
|
+
|
|
38
|
+
You may also add options that will be used as NUnit command line switches.
|
|
39
|
+
Any property that is a boolean `true` will simply be added to the command
|
|
40
|
+
line, String values will be added to the switch parameter separated by a
|
|
41
|
+
colon and arrays will be a comma seperated list of values.
|
|
42
|
+
|
|
43
|
+
For more information on available switches, see the NUnit documentation:
|
|
44
|
+
|
|
45
|
+
[http://www.nunit.org/index.php?p=consoleCommandLine&r=2.6.3](http://www.nunit.org/index.php?p=consoleCommandLine&r=2.6.3)
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
var gulp = require('gulp'),
|
|
49
|
+
nunit = require('gulp-nunit-runner');
|
|
50
|
+
|
|
51
|
+
gulp.task('unit-test', function () {
|
|
52
|
+
return gulp.src(['**/*.Test.dll'], {read: false})
|
|
53
|
+
.pipe(nunit({
|
|
54
|
+
executable: 'C:/nunit/bin/nunit-console.exe',
|
|
55
|
+
options: {
|
|
56
|
+
nologo: true,
|
|
57
|
+
config: 'Release',
|
|
58
|
+
transform: 'myTransform.xslt'
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
This would result in the following command:
|
|
64
|
+
|
|
65
|
+
```bat
|
|
66
|
+
C:/nunit/bin/nunit-console.exe /nologo /config:"Release" /transform:"myTransform.xslt" "C:\full\path\to\Database.Test.dll" "C:\full\path\to\Services.Test.dll"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Options
|
|
70
|
+
|
|
71
|
+
Below are all available options. With the release of NUnit 3.x, some options have been removed and some added. Version specific options have been labeled with the version they apply to. For more information on deprecated options see [here](https://github.com/nunit/nunit/wiki/Breaking-Changes#console-command-line-options). For more information on new options see [here](https://github.com/nunit/nunit/wiki/Console-Command-Line).
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
nunit({
|
|
75
|
+
|
|
76
|
+
// The NUnit bin folder or the full path of the console runner.
|
|
77
|
+
// If not specified the NUnit bin folder must be in the `PATH`.
|
|
78
|
+
executable: 'c:/Program Files/NUnit/bin',
|
|
79
|
+
|
|
80
|
+
// [2.x] If the full path of the console runner is not specified this determines
|
|
81
|
+
// what version of the console runner is used. Defaults to anycpu.
|
|
82
|
+
// NOTE: This has been superseded by the 'x86' option below in 3.x.
|
|
83
|
+
// http://www.nunit.org/index.php?p=nunit-console&r=2.6.3
|
|
84
|
+
platform: 'anycpu|x86',
|
|
85
|
+
|
|
86
|
+
// [2.x] Output TeamCity service messages.
|
|
87
|
+
// NOTE: This has been superseded by the 'teamcity' option below in 3.x.
|
|
88
|
+
// https://confluence.jetbrains.com/display/TCD8/Build+Script+Interaction+with+TeamCity
|
|
89
|
+
teamcity: true|false,
|
|
90
|
+
|
|
91
|
+
// Do not throw a gulp error and stop the stream on failing NUnit tests.
|
|
92
|
+
// This is useful on TeamCity, where tests can be muted after the tests
|
|
93
|
+
// are run, which allow the build to pass.
|
|
94
|
+
continueOnError: true|false,
|
|
95
|
+
|
|
96
|
+
// The options below map directly to the NUnit console runner. See here
|
|
97
|
+
// for more info: http://www.nunit.org/index.php?p=consoleCommandLine&r=2.6.3
|
|
98
|
+
options: {
|
|
99
|
+
|
|
100
|
+
// [3.x] Name of the test case(s), fixture(s) or namespace(s) to run.
|
|
101
|
+
test: ['TestSuite.Unit', 'TestSuite.Integration'],
|
|
102
|
+
|
|
103
|
+
// [3.x] Name of a file containing a list of the tests to run, one per line.
|
|
104
|
+
testist: 'TestsToRun.txt',
|
|
105
|
+
|
|
106
|
+
// [2.x] Name of the test case(s), fixture(s) or namespace(s) to run.
|
|
107
|
+
// NOTE: This has been superseded by the 'test' option above in 3.x.
|
|
108
|
+
run: ['TestSuite.Unit', 'TestSuite.Integration'],
|
|
109
|
+
|
|
110
|
+
// [2.x] Name of a file containing a list of the tests to run, one per line.
|
|
111
|
+
// NOTE: This has been superseded by the 'testlist' option above in 3.x.
|
|
112
|
+
runlist: 'TestsToRun.txt',
|
|
113
|
+
|
|
114
|
+
// [2.x] List of categories to include.
|
|
115
|
+
include: ['BaseLine', 'Unit'],
|
|
116
|
+
|
|
117
|
+
// [2.x] List of categories to exclude.
|
|
118
|
+
exclude: ['Database', 'Network'],
|
|
119
|
+
|
|
120
|
+
// [3.x] Test selection expression
|
|
121
|
+
where: 'cat != critical',
|
|
122
|
+
|
|
123
|
+
// Project configuration (e.g.: Debug) to load.
|
|
124
|
+
config: 'Debug',
|
|
125
|
+
|
|
126
|
+
// Process model for tests.
|
|
127
|
+
process: 'Single|Separate|Multiple',
|
|
128
|
+
|
|
129
|
+
// AppDomain Usage for tests.
|
|
130
|
+
domain: 'None|Single|Multiple',
|
|
131
|
+
|
|
132
|
+
// Framework version to be used for tests.
|
|
133
|
+
framework: 'net-1.1',
|
|
134
|
+
|
|
135
|
+
// [3.x] Run tests in a 32-bit process on 64-bit systems.
|
|
136
|
+
x86: true|false,
|
|
137
|
+
|
|
138
|
+
// [3.x] Dispose each test runner after it has finished running its tests.
|
|
139
|
+
"dispose-runners": true|false,
|
|
140
|
+
|
|
141
|
+
// Timeout for each test case in milliseconds.
|
|
142
|
+
timeout: 1000,
|
|
143
|
+
|
|
144
|
+
// [3.x] Random seed used to generate test cases.
|
|
145
|
+
seed: 5150,
|
|
146
|
+
|
|
147
|
+
// [3.x] Number of worker threads to be used in running tests.
|
|
148
|
+
workers: 5,
|
|
149
|
+
|
|
150
|
+
// Stop after the first test failure or error.
|
|
151
|
+
stoponerror: true|false,
|
|
152
|
+
|
|
153
|
+
// Wait for input before closing console window.
|
|
154
|
+
wait: true|false,
|
|
155
|
+
|
|
156
|
+
// [3.x] Pause before run to allow debugging.
|
|
157
|
+
pause: true|false,
|
|
158
|
+
|
|
159
|
+
// Work directory for output files.
|
|
160
|
+
work: 'BuildArtifacts',
|
|
161
|
+
|
|
162
|
+
// File to receive test output.
|
|
163
|
+
output: 'TestOutput.txt',
|
|
164
|
+
|
|
165
|
+
// File to receive test error output.
|
|
166
|
+
err: 'TestErrors.txt',
|
|
167
|
+
|
|
168
|
+
// Name of XML result file (Default: TestResult.xml)
|
|
169
|
+
result: 'TestResult.xml',
|
|
170
|
+
|
|
171
|
+
// [3.x] Save test info rather than running tests. Name of output file.
|
|
172
|
+
explore: 'TestInfo.xml',
|
|
173
|
+
|
|
174
|
+
// Suppress XML result output.
|
|
175
|
+
noresult: true|false,
|
|
176
|
+
|
|
177
|
+
// Label each test in stdOut.
|
|
178
|
+
labels: true|false,
|
|
179
|
+
|
|
180
|
+
// Set internal trace level.
|
|
181
|
+
trace: 'Off|Error|Warning|Info|Verbose',
|
|
182
|
+
|
|
183
|
+
// [3.x] Tells .NET to copy loaded assemblies to the shadowcopy directory.
|
|
184
|
+
shadowcopy: true|false,
|
|
185
|
+
|
|
186
|
+
// [2.x] Disable shadow copy when running in separate domain.
|
|
187
|
+
// NOTE In 3.x, The console runner now disables shadow copy by
|
|
188
|
+
// default. use new 'shadowcopy' option in 3.x to turn it on.
|
|
189
|
+
noshadow: true|false,
|
|
190
|
+
|
|
191
|
+
// [3.x] Turns on use of TeamCity service messages.
|
|
192
|
+
teamcity: true|false,
|
|
193
|
+
|
|
194
|
+
// [3.x] Suppress display of program information at start of run.
|
|
195
|
+
noheader: true|false,
|
|
196
|
+
|
|
197
|
+
// [3.x] Displays console output without color.
|
|
198
|
+
nocolor: true|false,
|
|
199
|
+
|
|
200
|
+
// [3.x] Display additional information as the test runs.
|
|
201
|
+
verbose: true|false,
|
|
202
|
+
|
|
203
|
+
// [2.x] Do not display the logo.
|
|
204
|
+
nologo: true|false,
|
|
205
|
+
|
|
206
|
+
// [2.x] Do not display progress.
|
|
207
|
+
nodots: true|false,
|
|
208
|
+
|
|
209
|
+
// [2.x] Apartment for running tests (Default is MTA).
|
|
210
|
+
apartment: 'MTA|STA',
|
|
211
|
+
|
|
212
|
+
// [2.x] Disable use of a separate thread for tests.
|
|
213
|
+
nothread: true|false,
|
|
214
|
+
|
|
215
|
+
// [2.x] Base path to be used when loading the assemblies.
|
|
216
|
+
basepath: 'src',
|
|
217
|
+
|
|
218
|
+
// [2.x] Additional directories to be probed when loading assemblies.
|
|
219
|
+
privatebinpath: ['lib', 'bin'],
|
|
220
|
+
|
|
221
|
+
// [2.x] Erase any leftover cache files and exit.
|
|
222
|
+
cleanup: true|false
|
|
223
|
+
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Release Notes
|
|
229
|
+
|
|
230
|
+
### 1.2.3
|
|
231
|
+
|
|
232
|
+
- Updated event-stream dependency for security issue. (thanks [alexmaris](https://github.com/alexmaris))
|
|
233
|
+
|
|
234
|
+
### 1.2.2
|
|
235
|
+
|
|
236
|
+
- Add parsing for number type options/switches ([alexmaris](https://github.com/alexmaris))
|
|
237
|
+
|
|
238
|
+
### 1.2.1
|
|
239
|
+
|
|
240
|
+
- Update dev dependencies
|
|
241
|
+
|
|
242
|
+
### 1.2.0
|
|
243
|
+
|
|
244
|
+
- Add continueOnError option ([cable729](https://github.com/cable729))
|
|
245
|
+
|
|
246
|
+
### 1.1.0
|
|
247
|
+
|
|
248
|
+
- Force using the `mono` command to execute the `nunit-console.exe` on non-windows systems ([dbones](https://github.com/dbones))
|
|
249
|
+
|
|
250
|
+
### 1.0.0
|
|
251
|
+
|
|
252
|
+
- Add handling of where switch for nunit3-console test runner ([Tuukka Turto](https://github.com/tuturto))
|
|
253
|
+
- Dependency update
|
|
254
|
+
- Update Travis tests to also test on node versions 4.x and 6.x
|
|
255
|
+
- Bump version to 1.0.0
|
|
256
|
+
|
|
257
|
+
### 0.5.2
|
|
258
|
+
|
|
259
|
+
- Add check for output file before creating the TeamCity output. ([Mike O'Brien](https://github.com/mikeobrien))
|
|
260
|
+
- Clean up publish package with `.npmignore`
|
|
261
|
+
|
|
262
|
+
### 0.5.1
|
|
263
|
+
- Fix #13 Running from Visual Studio Task Runner Fails
|
|
264
|
+
|
|
265
|
+
### 0.5.0
|
|
266
|
+
- Make the command line switch aware of OS so that it uses the correct character when running under mono on linux/mac.
|
|
267
|
+
|
|
268
|
+
### 0.4.2 (28 June 2015)
|
|
269
|
+
- Add NUnit 3.x options and labled 2.x options to README.md
|
|
270
|
+
|
|
271
|
+
### 0.4.1 (20 Nov 2014)
|
|
272
|
+
- Remove quotes around multi args.
|
|
273
|
+
|
|
274
|
+
### 0.4.0 (13 Nov 2014)
|
|
275
|
+
- Add build script with test, lint and watch.
|
|
276
|
+
- Add Travis CI integration.
|
|
277
|
+
- Add a TeamCity reporter.
|
|
278
|
+
- Add support for multi options e.g. include, exclude and privatebinpath.
|
|
279
|
+
- Add the ability to omit the explicit nunit path entirely and rely on it being in the PATH.
|
|
280
|
+
- Add the ability to just supply the path to the bin folder but not explicitly specify the filename.
|
|
281
|
+
- Add a platform flag that goes along with both exectable options to chose the x86 or anycpu version of nunit; defaults to anycpu.
|
|
282
|
+
- Document all the config options in the README.
|
|
283
|
+
|
|
284
|
+
### 0.3.0 (30 Sept 2014)
|
|
285
|
+
- Fixes large amount of writes by NUnit tests causing node to crash
|
|
286
|
+
- Switched to using `child_process::spawn`, much simpler command building.
|
|
287
|
+
|
|
288
|
+
### 0.2.0 (28 Sept 2014)
|
|
289
|
+
- Fixes #2 "Simultaneous runs of test tasks cause duplication"
|
|
290
|
+
- Major rearchitecture of plugin by @VoiceOfWisdom
|
|
291
|
+
- Adds release notes to README.md
|
|
292
|
+
|
|
293
|
+
### 0.1.2 (4 Sept 2014)
|
|
294
|
+
- Fixes #1 "runner fails if executable path has space"
|
|
295
|
+
|
|
296
|
+
### 0.1.1 (10 Aug 2014)
|
|
297
|
+
- Documentation update
|
|
298
|
+
|
|
299
|
+
### 0.1.0 (10 Aug 2014)
|
|
300
|
+
- Initial release
|