Permalink
Cannot retrieve contributors at this time
101 lines (98 sloc)
4.88 KB
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/@actions/artifact/lib/internal/upload-specification.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | |
if (k2 === undefined) k2 = k; | |
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); | |
}) : (function(o, m, k, k2) { | |
if (k2 === undefined) k2 = k; | |
o[k2] = m[k]; | |
})); | |
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { | |
Object.defineProperty(o, "default", { enumerable: true, value: v }); | |
}) : function(o, v) { | |
o["default"] = v; | |
}); | |
var __importStar = (this && this.__importStar) || function (mod) { | |
if (mod && mod.__esModule) return mod; | |
var result = {}; | |
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); | |
__setModuleDefault(result, mod); | |
return result; | |
}; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.getUploadSpecification = void 0; | |
const fs = __importStar(require("fs")); | |
const core_1 = require("@actions/core"); | |
const path_1 = require("path"); | |
const path_and_artifact_name_validation_1 = require("./path-and-artifact-name-validation"); | |
/** | |
* 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) { | |
// artifact name was checked earlier on, no need to check again | |
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, ''); | |
path_and_artifact_name_validation_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 |