mirror of
https://github.com/github/codeql-action.git
synced 2025-12-27 01:30:10 +08:00
88 lines
4.2 KiB
JavaScript
88 lines
4.2 KiB
JavaScript
"use strict";
|
|
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 });
|
|
const fs = __importStar(require("fs"));
|
|
const core_1 = require("@actions/core");
|
|
const path_1 = require("path");
|
|
const utils_1 = require("./utils");
|
|
/**
|
|
* Creates a specification that describes how each file that is part of the artifact will be uploaded
|
|
* @param artifactName the name of the artifact being uploaded. Used during upload to denote where the artifact is stored on the server
|
|
* @param rootDirectory an absolute file path that denotes the path that should be removed from the beginning of each artifact file
|
|
* @param artifactFiles a list of absolute file paths that denote what should be uploaded as part of the artifact
|
|
*/
|
|
function getUploadSpecification(artifactName, rootDirectory, artifactFiles) {
|
|
utils_1.checkArtifactName(artifactName);
|
|
const specifications = [];
|
|
if (!fs.existsSync(rootDirectory)) {
|
|
throw new Error(`Provided rootDirectory ${rootDirectory} does not exist`);
|
|
}
|
|
if (!fs.lstatSync(rootDirectory).isDirectory()) {
|
|
throw new Error(`Provided rootDirectory ${rootDirectory} is not a valid directory`);
|
|
}
|
|
// Normalize and resolve, this allows for either absolute or relative paths to be used
|
|
rootDirectory = path_1.normalize(rootDirectory);
|
|
rootDirectory = path_1.resolve(rootDirectory);
|
|
/*
|
|
Example to demonstrate behavior
|
|
|
|
Input:
|
|
artifactName: my-artifact
|
|
rootDirectory: '/home/user/files/plz-upload'
|
|
artifactFiles: [
|
|
'/home/user/files/plz-upload/file1.txt',
|
|
'/home/user/files/plz-upload/file2.txt',
|
|
'/home/user/files/plz-upload/dir/file3.txt'
|
|
]
|
|
|
|
Output:
|
|
specifications: [
|
|
['/home/user/files/plz-upload/file1.txt', 'my-artifact/file1.txt'],
|
|
['/home/user/files/plz-upload/file1.txt', 'my-artifact/file2.txt'],
|
|
['/home/user/files/plz-upload/file1.txt', 'my-artifact/dir/file3.txt']
|
|
]
|
|
*/
|
|
for (let file of artifactFiles) {
|
|
if (!fs.existsSync(file)) {
|
|
throw new Error(`File ${file} does not exist`);
|
|
}
|
|
if (!fs.lstatSync(file).isDirectory()) {
|
|
// Normalize and resolve, this allows for either absolute or relative paths to be used
|
|
file = path_1.normalize(file);
|
|
file = path_1.resolve(file);
|
|
if (!file.startsWith(rootDirectory)) {
|
|
throw new Error(`The rootDirectory: ${rootDirectory} is not a parent directory of the file: ${file}`);
|
|
}
|
|
// Check for forbidden characters in file paths that will be rejected during upload
|
|
const uploadPath = file.replace(rootDirectory, '');
|
|
utils_1.checkArtifactFilePath(uploadPath);
|
|
/*
|
|
uploadFilePath denotes where the file will be uploaded in the file container on the server. During a run, if multiple artifacts are uploaded, they will all
|
|
be saved in the same container. The artifact name is used as the root directory in the container to separate and distinguish uploaded artifacts
|
|
|
|
path.join handles all the following cases and would return 'artifact-name/file-to-upload.txt
|
|
join('artifact-name/', 'file-to-upload.txt')
|
|
join('artifact-name/', '/file-to-upload.txt')
|
|
join('artifact-name', 'file-to-upload.txt')
|
|
join('artifact-name', '/file-to-upload.txt')
|
|
*/
|
|
specifications.push({
|
|
absoluteFilePath: file,
|
|
uploadFilePath: path_1.join(artifactName, uploadPath)
|
|
});
|
|
}
|
|
else {
|
|
// Directories are rejected by the server during upload
|
|
core_1.debug(`Removing ${file} from rawSearchResults because it is a directory`);
|
|
}
|
|
}
|
|
return specifications;
|
|
}
|
|
exports.getUploadSpecification = getUploadSpecification;
|
|
//# sourceMappingURL=upload-specification.js.map
|