diff --git a/__tests__/annotations.test.ts b/__tests__/annotations.test.ts
index 762dbd3..6f53d43 100644
--- a/__tests__/annotations.test.ts
+++ b/__tests__/annotations.test.ts
@@ -1,10 +1,17 @@
-import { testCaseAnnotation, parseNunit, Annotation, TestResult, readResults } from '../src/nunit'
-import {parseStringPromise } from 'xml2js'
-import { promises as fs } from "fs";
+import {
+ testCaseAnnotation,
+ parseNunit,
+ Annotation,
+ TestResult,
+ readResults
+} from '../src/nunit'
+import {parseStringPromise} from 'xml2js'
+import {promises as fs} from 'fs'
+import path from 'path';
-test('parse TestCase', async () => {
- const data = `
+test('parse TestCase', async () => {
+ const data = `
@@ -20,46 +27,50 @@ test('parse TestCase', async () => {
]]>
`
- const testCase: any = await parseStringPromise(data, {
- trim: true,
- mergeAttrs: true,
- explicitArray: false,
- })
-
- const annotation = testCaseAnnotation(testCase['test-case']);
+ const testCase: any = await parseStringPromise(data, {
+ trim: true,
+ mergeAttrs: true,
+ explicitArray: false
+ })
- expect(annotation).toBeTruthy();
+ const annotation = testCaseAnnotation(testCase['test-case'])
- expect(annotation.path).toContain("Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs");
- expect(annotation.start_line).toBe(895);
- expect(annotation.end_line).toBe(895);
- expect(annotation.title).toBe("Failed test ServerUpdate in Mirror.Tests.NetworkIdentityTests")
- expect(annotation.message).toBe("Expected: 1\n But was: 0")
- expect(annotation.annotation_level).toBe('failure');
+ expect(annotation).toBeTruthy()
+ expect(annotation.path).toContain(
+ path.join('Assets','Mirror','Tests','Editor','NetworkIdentityTests.cs')
+ )
+ expect(annotation.start_line).toBe(895)
+ expect(annotation.end_line).toBe(895)
+ expect(annotation.title).toBe(
+ 'Failed test ServerUpdate in Mirror.Tests.NetworkIdentityTests'
+ )
+ expect(annotation.message).toBe('Expected: 1\n But was: 0')
+ expect(annotation.annotation_level).toBe('failure')
})
-
test('parse Results', async () => {
+ const data = await fs.readFile('__tests__/editmode-results.xml', 'utf8')
- const data = await fs.readFile("__tests__/editmode-results.xml", 'utf8')
-
- const results = await parseNunit(data);
- expect(results.passed).toBe(332);
- expect(results.failed).toBe(1);
+ const results = await parseNunit(data)
+ expect(results.passed).toBe(332)
+ expect(results.failed).toBe(1)
- const annotation = results.annotations[0];
- expect(annotation.path).toContain("Assets/Mirror/Tests/Editor/NetworkIdentityTests.cs");
- expect(annotation.start_line).toBe(895);
- expect(annotation.end_line).toBe(895);
- expect(annotation.title).toBe("Failed test ServerUpdate in Mirror.Tests.NetworkIdentityTests")
- expect(annotation.message).toBe("Expected: 1\n But was: 0")
- expect(annotation.annotation_level).toBe('failure');
-});
+ const annotation = results.annotations[0]
+ expect(annotation.path).toContain(
+ path.join('Assets','Mirror','Tests','Editor','NetworkIdentityTests.cs')
+ )
+ expect(annotation.start_line).toBe(895)
+ expect(annotation.end_line).toBe(895)
+ expect(annotation.title).toBe(
+ 'Failed test ServerUpdate in Mirror.Tests.NetworkIdentityTests'
+ )
+ expect(annotation.message).toMatch(/Expected: 1\s+But was: 0/)
+ expect(annotation.annotation_level).toBe('failure')
+})
test('parse all Results', async () => {
+ var results = await readResults('__tests__/*.xml')
- var results = await readResults("__tests__/*.xml");
-
- expect(results.annotations).toHaveLength(6);
-});
\ No newline at end of file
+ expect(results.annotations).toHaveLength(6)
+})
diff --git a/dist/index.js b/dist/index.js
index c750155..cec542a 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -2043,7 +2043,7 @@ module.exports = windowsRelease;
module.exports = validate;
-const { RequestError } = __webpack_require__(102);
+const { RequestError } = __webpack_require__(524);
const get = __webpack_require__(854);
const set = __webpack_require__(883);
@@ -2291,8 +2291,8 @@ class TestResult {
}
exports.TestResult = TestResult;
function sanitizePath(filename) {
- if (filename.startsWith("/github/workspace"))
- return path_1.relative("/github/workspace", filename);
+ if (filename.startsWith('/github/workspace'))
+ return path_1.relative('/github/workspace', filename);
else
return path_1.relative(process.cwd(), filename).replace(/\\/g, '/');
}
@@ -2349,6 +2349,32 @@ async function readResults(path) {
exports.readResults = readResults;
+/***/ }),
+
+/***/ 82:
+/***/ (function(__unusedmodule, exports) {
+
+"use strict";
+
+// We use any as a valid input type
+/* eslint-disable @typescript-eslint/no-explicit-any */
+Object.defineProperty(exports, "__esModule", { value: true });
+/**
+ * Sanitizes an input into a string so it can be passed into issueCommand safely
+ * @param input input to sanitize into a string
+ */
+function toCommandValue(input) {
+ if (input === null || input === undefined) {
+ return '';
+ }
+ else if (typeof input === 'string' || input instanceof String) {
+ return input;
+ }
+ return JSON.stringify(input);
+}
+exports.toCommandValue = toCommandValue;
+//# sourceMappingURL=utils.js.map
+
/***/ }),
/***/ 85:
@@ -3531,61 +3557,34 @@ function expand(str, isTop) {
"use strict";
-
-Object.defineProperty(exports, '__esModule', { value: true });
-
-function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
-
-var deprecation = __webpack_require__(692);
-var once = _interopDefault(__webpack_require__(969));
-
-const logOnce = once(deprecation => console.warn(deprecation));
-/**
- * Error with extra properties to help with debugging
- */
-
-class RequestError extends Error {
- constructor(message, statusCode, options) {
- super(message); // Maintains proper stack trace (only available on V8)
-
- /* istanbul ignore next */
-
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, this.constructor);
+// For internal use, subject to change.
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+ result["default"] = mod;
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+// We use any as a valid input type
+/* eslint-disable @typescript-eslint/no-explicit-any */
+const fs = __importStar(__webpack_require__(747));
+const os = __importStar(__webpack_require__(87));
+const utils_1 = __webpack_require__(82);
+function issueCommand(command, message) {
+ const filePath = process.env[`GITHUB_${command}`];
+ if (!filePath) {
+ throw new Error(`Unable to find environment variable for file command ${command}`);
}
-
- this.name = "HttpError";
- this.status = statusCode;
- Object.defineProperty(this, "code", {
- get() {
- logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));
- return statusCode;
- }
-
- });
- this.headers = options.headers || {}; // redact request credentials without mutating original request options
-
- const requestCopy = Object.assign({}, options.request);
-
- if (options.request.headers.authorization) {
- requestCopy.headers = Object.assign({}, options.request.headers, {
- authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]")
- });
+ if (!fs.existsSync(filePath)) {
+ throw new Error(`Missing file at path: ${filePath}`);
}
-
- requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit
- // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications
- .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended
- // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header
- .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
- this.request = requestCopy;
- }
-
+ fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {
+ encoding: 'utf8'
+ });
}
-
-exports.RequestError = RequestError;
-//# sourceMappingURL=index.js.map
-
+exports.issueCommand = issueCommand;
+//# sourceMappingURL=file-command.js.map
/***/ }),
@@ -5069,6 +5068,7 @@ async function run() {
const path = core_1.getInput('path');
const numFailures = parseInt(core_1.getInput('numFailures'));
const accessToken = core_1.getInput('access-token');
+ const title = core_1.getInput('reportTitle');
const results = await nunit_1.readResults(path);
const octokit = new github_1.GitHub(accessToken);
const summary = results.failed > 0
@@ -5094,13 +5094,13 @@ async function run() {
const pr = github_1.context.payload.pull_request;
await octokit.checks.create({
head_sha: (pr && pr['head'] && pr['head'].sha) || github_1.context.sha,
- name: 'Tests Results',
+ name: `Tests Report: ${title}`,
owner: github_1.context.repo.owner,
repo: github_1.context.repo.repo,
status: 'completed',
- conclusion: results.failed > 0 ? 'failure' : 'success',
+ conclusion: results.failed > 0 || results.passed === 0 ? 'failure' : 'success',
output: {
- title: 'Test Results',
+ title,
summary,
annotations: results.annotations.slice(0, numFailures),
text: details
@@ -5177,7 +5177,7 @@ module.exports = require("timers");
module.exports = authenticationRequestError;
-const { RequestError } = __webpack_require__(102);
+const { RequestError } = __webpack_require__(524);
function authenticationRequestError(state, error, options) {
/* istanbul ignore next */
@@ -5494,6 +5494,77 @@ function applyAcceptHeader (res, headers) {
}
+/***/ }),
+
+/***/ 270:
+/***/ (function(module, __unusedexports, __webpack_require__) {
+
+// Generated by CoffeeScript 1.12.7
+(function() {
+ var XMLDOMConfiguration, XMLDOMErrorHandler, XMLDOMStringList;
+
+ XMLDOMErrorHandler = __webpack_require__(724);
+
+ XMLDOMStringList = __webpack_require__(556);
+
+ module.exports = XMLDOMConfiguration = (function() {
+ function XMLDOMConfiguration() {
+ var clonedSelf;
+ this.defaultParams = {
+ "canonical-form": false,
+ "cdata-sections": false,
+ "comments": false,
+ "datatype-normalization": false,
+ "element-content-whitespace": true,
+ "entities": true,
+ "error-handler": new XMLDOMErrorHandler(),
+ "infoset": true,
+ "validate-if-schema": false,
+ "namespaces": true,
+ "namespace-declarations": true,
+ "normalize-characters": false,
+ "schema-location": '',
+ "schema-type": '',
+ "split-cdata-sections": true,
+ "validate": false,
+ "well-formed": true
+ };
+ this.params = clonedSelf = Object.create(this.defaultParams);
+ }
+
+ Object.defineProperty(XMLDOMConfiguration.prototype, 'parameterNames', {
+ get: function() {
+ return new XMLDOMStringList(Object.keys(this.defaultParams));
+ }
+ });
+
+ XMLDOMConfiguration.prototype.getParameter = function(name) {
+ if (this.params.hasOwnProperty(name)) {
+ return this.params[name];
+ } else {
+ return null;
+ }
+ };
+
+ XMLDOMConfiguration.prototype.canSetParameter = function(name, value) {
+ return true;
+ };
+
+ XMLDOMConfiguration.prototype.setParameter = function(name, value) {
+ if (value != null) {
+ return this.params[name] = value;
+ } else {
+ return delete this.params[name];
+ }
+ };
+
+ return XMLDOMConfiguration;
+
+ })();
+
+}).call(this);
+
+
/***/ }),
/***/ 280:
@@ -8937,6 +9008,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
const os = __importStar(__webpack_require__(87));
+const utils_1 = __webpack_require__(82);
/**
* Commands
*
@@ -8991,13 +9063,13 @@ class Command {
}
}
function escapeData(s) {
- return (s || '')
+ return utils_1.toCommandValue(s)
.replace(/%/g, '%25')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A');
}
function escapeProperty(s) {
- return (s || '')
+ return utils_1.toCommandValue(s)
.replace(/%/g, '%25')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A')
@@ -9013,7 +9085,7 @@ function escapeProperty(s) {
module.exports = authenticationRequestError;
-const { RequestError } = __webpack_require__(102);
+const { RequestError } = __webpack_require__(524);
function authenticationRequestError(state, error, options) {
if (!error.headers) throw error;
@@ -9650,6 +9722,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
const command_1 = __webpack_require__(431);
+const file_command_1 = __webpack_require__(102);
+const utils_1 = __webpack_require__(82);
const os = __importStar(__webpack_require__(87));
const path = __importStar(__webpack_require__(622));
/**
@@ -9672,11 +9746,21 @@ var ExitCode;
/**
* Sets env variable for this action and future actions in the job
* @param name the name of the variable to set
- * @param val the value of the variable
+ * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify
*/
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
function exportVariable(name, val) {
- process.env[name] = val;
- command_1.issueCommand('set-env', { name }, val);
+ const convertedVal = utils_1.toCommandValue(val);
+ process.env[name] = convertedVal;
+ const filePath = process.env['GITHUB_ENV'] || '';
+ if (filePath) {
+ const delimiter = '_GitHubActionsFileCommandDelimeter_';
+ const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
+ file_command_1.issueCommand('ENV', commandValue);
+ }
+ else {
+ command_1.issueCommand('set-env', { name }, convertedVal);
+ }
}
exports.exportVariable = exportVariable;
/**
@@ -9692,7 +9776,13 @@ exports.setSecret = setSecret;
* @param inputPath
*/
function addPath(inputPath) {
- command_1.issueCommand('add-path', {}, inputPath);
+ const filePath = process.env['GITHUB_PATH'] || '';
+ if (filePath) {
+ file_command_1.issueCommand('PATH', inputPath);
+ }
+ else {
+ command_1.issueCommand('add-path', {}, inputPath);
+ }
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
}
exports.addPath = addPath;
@@ -9715,12 +9805,22 @@ exports.getInput = getInput;
* Sets the value of an output.
*
* @param name name of the output to set
- * @param value value to store
+ * @param value value to store. Non-string values will be converted to a string via JSON.stringify
*/
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
function setOutput(name, value) {
command_1.issueCommand('set-output', { name }, value);
}
exports.setOutput = setOutput;
+/**
+ * Enables or disables the echoing of commands into stdout for the rest of the step.
+ * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set.
+ *
+ */
+function setCommandEcho(enabled) {
+ command_1.issue('echo', enabled ? 'on' : 'off');
+}
+exports.setCommandEcho = setCommandEcho;
//-----------------------------------------------------------------------
// Results
//-----------------------------------------------------------------------
@@ -9754,18 +9854,18 @@ function debug(message) {
exports.debug = debug;
/**
* Adds an error issue
- * @param message error issue message
+ * @param message error issue message. Errors will be converted to string via toString()
*/
function error(message) {
- command_1.issue('error', message);
+ command_1.issue('error', message instanceof Error ? message.toString() : message);
}
exports.error = error;
/**
* Adds an warning issue
- * @param message warning issue message
+ * @param message warning issue message. Errors will be converted to string via toString()
*/
function warning(message) {
- command_1.issue('warning', message);
+ command_1.issue('warning', message instanceof Error ? message.toString() : message);
}
exports.warning = warning;
/**
@@ -9823,8 +9923,9 @@ exports.group = group;
* Saves state for current action, the state can only be retrieved by this action's post job execution.
*
* @param name name of the state to store
- * @param value value to store
+ * @param value value to store. Non-string values will be converted to a string via JSON.stringify
*/
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
function saveState(name, value) {
command_1.issueCommand('save-state', { name }, value);
}
@@ -10797,72 +10898,64 @@ module.exports.Collection = Hook.Collection
/***/ }),
/***/ 524:
-/***/ (function(module, __unusedexports, __webpack_require__) {
+/***/ (function(__unusedmodule, exports, __webpack_require__) {
-// Generated by CoffeeScript 1.12.7
-(function() {
- var XMLDOMConfiguration, XMLDOMErrorHandler, XMLDOMStringList;
+"use strict";
- XMLDOMErrorHandler = __webpack_require__(724);
- XMLDOMStringList = __webpack_require__(556);
+Object.defineProperty(exports, '__esModule', { value: true });
- module.exports = XMLDOMConfiguration = (function() {
- function XMLDOMConfiguration() {
- var clonedSelf;
- this.defaultParams = {
- "canonical-form": false,
- "cdata-sections": false,
- "comments": false,
- "datatype-normalization": false,
- "element-content-whitespace": true,
- "entities": true,
- "error-handler": new XMLDOMErrorHandler(),
- "infoset": true,
- "validate-if-schema": false,
- "namespaces": true,
- "namespace-declarations": true,
- "normalize-characters": false,
- "schema-location": '',
- "schema-type": '',
- "split-cdata-sections": true,
- "validate": false,
- "well-formed": true
- };
- this.params = clonedSelf = Object.create(this.defaultParams);
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+
+var deprecation = __webpack_require__(692);
+var once = _interopDefault(__webpack_require__(969));
+
+const logOnce = once(deprecation => console.warn(deprecation));
+/**
+ * Error with extra properties to help with debugging
+ */
+
+class RequestError extends Error {
+ constructor(message, statusCode, options) {
+ super(message); // Maintains proper stack trace (only available on V8)
+
+ /* istanbul ignore next */
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
}
- Object.defineProperty(XMLDOMConfiguration.prototype, 'parameterNames', {
- get: function() {
- return new XMLDOMStringList(Object.keys(this.defaultParams));
+ this.name = "HttpError";
+ this.status = statusCode;
+ Object.defineProperty(this, "code", {
+ get() {
+ logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));
+ return statusCode;
}
- });
- XMLDOMConfiguration.prototype.getParameter = function(name) {
- if (this.params.hasOwnProperty(name)) {
- return this.params[name];
- } else {
- return null;
- }
- };
+ });
+ this.headers = options.headers || {}; // redact request credentials without mutating original request options
- XMLDOMConfiguration.prototype.canSetParameter = function(name, value) {
- return true;
- };
+ const requestCopy = Object.assign({}, options.request);
- XMLDOMConfiguration.prototype.setParameter = function(name, value) {
- if (value != null) {
- return this.params[name] = value;
- } else {
- return delete this.params[name];
- }
- };
+ if (options.request.headers.authorization) {
+ requestCopy.headers = Object.assign({}, options.request.headers, {
+ authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]")
+ });
+ }
- return XMLDOMConfiguration;
+ requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit
+ // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications
+ .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended
+ // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header
+ .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
+ this.request = requestCopy;
+ }
- })();
+}
-}).call(this);
+exports.RequestError = RequestError;
+//# sourceMappingURL=index.js.map
/***/ }),
@@ -10945,6 +11038,7 @@ var HttpCodes;
HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
+ HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";
HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
@@ -10969,8 +11063,18 @@ function getProxyUrl(serverUrl) {
return proxyUrl ? proxyUrl.href : '';
}
exports.getProxyUrl = getProxyUrl;
-const HttpRedirectCodes = [HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect];
-const HttpResponseRetryCodes = [HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout];
+const HttpRedirectCodes = [
+ HttpCodes.MovedPermanently,
+ HttpCodes.ResourceMoved,
+ HttpCodes.SeeOther,
+ HttpCodes.TemporaryRedirect,
+ HttpCodes.PermanentRedirect
+];
+const HttpResponseRetryCodes = [
+ HttpCodes.BadGateway,
+ HttpCodes.ServiceUnavailable,
+ HttpCodes.GatewayTimeout
+];
const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
const ExponentialBackoffCeiling = 10;
const ExponentialBackoffTimeSlice = 5;
@@ -11095,18 +11199,22 @@ class HttpClient {
*/
async request(verb, requestUrl, data, headers) {
if (this._disposed) {
- throw new Error("Client has already been disposed.");
+ throw new Error('Client has already been disposed.');
}
let parsedUrl = url.parse(requestUrl);
let info = this._prepareRequest(verb, parsedUrl, headers);
// Only perform retries on reads since writes may not be idempotent.
- let maxTries = (this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1) ? this._maxRetries + 1 : 1;
+ let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1
+ ? this._maxRetries + 1
+ : 1;
let numTries = 0;
let response;
while (numTries < maxTries) {
response = await this.requestRaw(info, data);
// Check if it's an authentication challenge
- if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) {
+ if (response &&
+ response.message &&
+ response.message.statusCode === HttpCodes.Unauthorized) {
let authenticationHandler;
for (let i = 0; i < this.handlers.length; i++) {
if (this.handlers[i].canHandleAuthentication(response)) {
@@ -11124,21 +11232,32 @@ class HttpClient {
}
}
let redirectsRemaining = this._maxRedirects;
- while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1
- && this._allowRedirects
- && redirectsRemaining > 0) {
- const redirectUrl = response.message.headers["location"];
+ while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 &&
+ this._allowRedirects &&
+ redirectsRemaining > 0) {
+ const redirectUrl = response.message.headers['location'];
if (!redirectUrl) {
// if there's no location to redirect to, we won't
break;
}
let parsedRedirectUrl = url.parse(redirectUrl);
- if (parsedUrl.protocol == 'https:' && parsedUrl.protocol != parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) {
- throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.");
+ if (parsedUrl.protocol == 'https:' &&
+ parsedUrl.protocol != parsedRedirectUrl.protocol &&
+ !this._allowRedirectDowngrade) {
+ throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');
}
// we need to finish reading the response before reassigning response
// which will leak the open socket.
await response.readBody();
+ // strip authorization header if redirected to a different hostname
+ if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {
+ for (let header in headers) {
+ // header names are case insensitive
+ if (header.toLowerCase() === 'authorization') {
+ delete headers[header];
+ }
+ }
+ }
// let's make the request with the new redirectUrl
info = this._prepareRequest(verb, parsedRedirectUrl, headers);
response = await this.requestRaw(info, data);
@@ -11189,8 +11308,8 @@ class HttpClient {
*/
requestRawWithCallback(info, data, onResult) {
let socket;
- if (typeof (data) === 'string') {
- info.options.headers["Content-Length"] = Buffer.byteLength(data, 'utf8');
+ if (typeof data === 'string') {
+ info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
}
let callbackCalled = false;
let handleResult = (err, res) => {
@@ -11203,7 +11322,7 @@ class HttpClient {
let res = new HttpClientResponse(msg);
handleResult(null, res);
});
- req.on('socket', (sock) => {
+ req.on('socket', sock => {
socket = sock;
});
// If we ever get disconnected, we want the socket to timeout eventually
@@ -11218,10 +11337,10 @@ class HttpClient {
// res should have headers
handleResult(err, null);
});
- if (data && typeof (data) === 'string') {
+ if (data && typeof data === 'string') {
req.write(data, 'utf8');
}
- if (data && typeof (data) !== 'string') {
+ if (data && typeof data !== 'string') {
data.on('close', function () {
req.end();
});
@@ -11248,31 +11367,34 @@ class HttpClient {
const defaultPort = usingSsl ? 443 : 80;
info.options = {};
info.options.host = info.parsedUrl.hostname;
- info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort;
- info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
+ info.options.port = info.parsedUrl.port
+ ? parseInt(info.parsedUrl.port)
+ : defaultPort;
+ info.options.path =
+ (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
info.options.method = method;
info.options.headers = this._mergeHeaders(headers);
if (this.userAgent != null) {
- info.options.headers["user-agent"] = this.userAgent;
+ info.options.headers['user-agent'] = this.userAgent;
}
info.options.agent = this._getAgent(info.parsedUrl);
// gives handlers an opportunity to participate
if (this.handlers) {
- this.handlers.forEach((handler) => {
+ this.handlers.forEach(handler => {
handler.prepareRequest(info.options);
});
}
return info;
}
_mergeHeaders(headers) {
- const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {});
+ const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
if (this.requestOptions && this.requestOptions.headers) {
return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));
}
return lowercaseKeys(headers || {});
}
_getExistingOrDefaultHeader(additionalHeaders, header, _default) {
- const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {});
+ const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
let clientHeader;
if (this.requestOptions && this.requestOptions.headers) {
clientHeader = lowercaseKeys(this.requestOptions.headers)[header];
@@ -11310,7 +11432,7 @@ class HttpClient {
proxyAuth: proxyUrl.auth,
host: proxyUrl.hostname,
port: proxyUrl.port
- },
+ }
};
let tunnelAgent;
const overHttps = proxyUrl.protocol === 'https:';
@@ -11337,7 +11459,9 @@ class HttpClient {
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
// we have to cast it to any and change it directly
- agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false });
+ agent.options = Object.assign(agent.options || {}, {
+ rejectUnauthorized: false
+ });
}
return agent;
}
@@ -11398,7 +11522,7 @@ class HttpClient {
msg = contents;
}
else {
- msg = "Failed request: (" + statusCode + ")";
+ msg = 'Failed request: (' + statusCode + ')';
}
let err = new Error(msg);
// attach statusCode and body obj (if available) to the error object
@@ -27444,7 +27568,7 @@ if (process.platform === 'linux') {
XMLDOMImplementation = __webpack_require__(515);
- XMLDOMConfiguration = __webpack_require__(524);
+ XMLDOMConfiguration = __webpack_require__(270);
XMLNode = __webpack_require__(733);
@@ -33164,7 +33288,7 @@ exports.requestLog = requestLog;
/***/ 919:
/***/ (function(module) {
-module.exports = {"_args":[["@octokit/rest@16.43.1","/Users/557659/nunit-reporter"]],"_from":"@octokit/rest@16.43.1","_id":"@octokit/rest@16.43.1","_inBundle":false,"_integrity":"sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==","_location":"/@actions/github/@octokit/rest","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"@octokit/rest@16.43.1","name":"@octokit/rest","escapedName":"@octokit%2frest","scope":"@octokit","rawSpec":"16.43.1","saveSpec":null,"fetchSpec":"16.43.1"},"_requiredBy":["/@actions/github"],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz","_spec":"16.43.1","_where":"/Users/557659/nunit-reporter","author":{"name":"Gregor Martynus","url":"https://github.com/gr2m"},"bugs":{"url":"https://github.com/octokit/rest.js/issues"},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"contributors":[{"name":"Mike de Boer","email":"info@mikedeboer.nl"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Joe Gallo","email":"joe@brassafrax.com"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"description":"GitHub REST API client for Node.js","devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"files":["index.js","index.d.ts","lib","plugins"],"homepage":"https://github.com/octokit/rest.js#readme","keywords":["octokit","github","rest","api-client"],"license":"MIT","name":"@octokit/rest","nyc":{"ignore":["test"]},"publishConfig":{"access":"public"},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"repository":{"type":"git","url":"git+https://github.com/octokit/rest.js.git"},"scripts":{"build":"npm-run-all build:*","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","build:ts":"npm run -s update-endpoints:typescript","coverage":"nyc report --reporter=html && open coverage/index.html","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","prebuild:browser":"mkdirp dist/","pretest":"npm run -s lint","prevalidate:ts":"npm run -s build:ts","start-fixtures-server":"octokit-fixtures-server","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts"},"types":"index.d.ts","version":"16.43.1"};
+module.exports = {"_args":[["@octokit/rest@16.43.1","C:\\Repositories\\nunit-reporter"]],"_from":"@octokit/rest@16.43.1","_id":"@octokit/rest@16.43.1","_inBundle":false,"_integrity":"sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==","_location":"/@actions/github/@octokit/rest","_phantomChildren":{},"_requested":{"type":"version","registry":true,"raw":"@octokit/rest@16.43.1","name":"@octokit/rest","escapedName":"@octokit%2frest","scope":"@octokit","rawSpec":"16.43.1","saveSpec":null,"fetchSpec":"16.43.1"},"_requiredBy":["/@actions/github"],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz","_spec":"16.43.1","_where":"C:\\Repositories\\nunit-reporter","author":{"name":"Gregor Martynus","url":"https://github.com/gr2m"},"bugs":{"url":"https://github.com/octokit/rest.js/issues"},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"contributors":[{"name":"Mike de Boer","email":"info@mikedeboer.nl"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Joe Gallo","email":"joe@brassafrax.com"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"description":"GitHub REST API client for Node.js","devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"files":["index.js","index.d.ts","lib","plugins"],"homepage":"https://github.com/octokit/rest.js#readme","keywords":["octokit","github","rest","api-client"],"license":"MIT","name":"@octokit/rest","nyc":{"ignore":["test"]},"publishConfig":{"access":"public"},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"repository":{"type":"git","url":"git+https://github.com/octokit/rest.js.git"},"scripts":{"build":"npm-run-all build:*","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","build:ts":"npm run -s update-endpoints:typescript","coverage":"nyc report --reporter=html && open coverage/index.html","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","prebuild:browser":"mkdirp dist/","pretest":"npm run -s lint","prevalidate:ts":"npm run -s build:ts","start-fixtures-server":"octokit-fixtures-server","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts"},"types":"index.d.ts","version":"16.43.1"};
/***/ }),
@@ -33456,12 +33580,10 @@ function getProxyUrl(reqUrl) {
}
let proxyVar;
if (usingSsl) {
- proxyVar = process.env["https_proxy"] ||
- process.env["HTTPS_PROXY"];
+ proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY'];
}
else {
- proxyVar = process.env["http_proxy"] ||
- process.env["HTTP_PROXY"];
+ proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY'];
}
if (proxyVar) {
proxyUrl = url.parse(proxyVar);
@@ -33473,7 +33595,7 @@ function checkBypass(reqUrl) {
if (!reqUrl.hostname) {
return false;
}
- let noProxy = process.env["no_proxy"] || process.env["NO_PROXY"] || '';
+ let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';
if (!noProxy) {
return false;
}
@@ -33494,7 +33616,10 @@ function checkBypass(reqUrl) {
upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);
}
// Compare request host against noproxy
- for (let upperNoProxyItem of noProxy.split(',').map(x => x.trim().toUpperCase()).filter(x => x)) {
+ for (let upperNoProxyItem of noProxy
+ .split(',')
+ .map(x => x.trim().toUpperCase())
+ .filter(x => x)) {
if (upperReqHosts.some(x => x === upperNoProxyItem)) {
return true;
}
diff --git a/src/main.ts b/src/main.ts
index 027ee7c..2f6293e 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -24,7 +24,7 @@ async function run(): Promise {
let details =
results.failed === 0
- ? `** ${results.passed} tests passed**`
+ ? `**${results.passed} tests passed**`
: `
**${results.passed} tests passed**
**${results.failed} tests failed**
@@ -44,16 +44,17 @@ async function run(): Promise {
const pr = context.payload.pull_request
await octokit.checks.create({
head_sha: (pr && pr['head'] && pr['head'].sha) || context.sha,
- name: 'Tests Report',
+ name: `${title}`,
owner: context.repo.owner,
repo: context.repo.repo,
status: 'completed',
- conclusion: results.failed > 0 || results.passed === 0 ? 'failure' : 'success',
+ conclusion:
+ results.failed > 0 || results.passed === 0 ? 'failure' : 'success',
output: {
title,
summary,
annotations: results.annotations.slice(0, numFailures),
- text: details
+ "text": details
}
})
} catch (error) {
diff --git a/src/nunit.ts b/src/nunit.ts
index 4e21134..68a4fd2 100644
--- a/src/nunit.ts
+++ b/src/nunit.ts
@@ -91,10 +91,9 @@ export class TestResult {
}
function sanitizePath(filename: string): string {
- if (filename.startsWith("/github/workspace"))
- return relative("/github/workspace", filename);
- else
- return relative(process.cwd(), filename).replace(/\\/g, '/')
+ if (filename.startsWith('/github/workspace'))
+ return relative('/github/workspace', filename)
+ else return relative(process.cwd(), filename).replace(/\\/g, '/')
}
function getTestCases(testsuite: any): any[] {