mirror of
https://github.com/joaquinjsb/gitea-release-please-action
synced 2026-05-13 22:51:36 +02:00
chore: build dist release-please-action (#448)
This commit is contained in:
committed by
GitHub
parent
d30f7b96c9
commit
732da67043
366
dist/index.js
vendored
366
dist/index.js
vendored
@@ -71091,7 +71091,7 @@ function preprocessCommitMessage(commit) {
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.DuplicateReleaseError = exports.AuthError = exports.GitHubAPIError = exports.MissingRequiredFileError = exports.ConfigurationError = void 0;
|
exports.FileNotFoundError = exports.DuplicateReleaseError = exports.AuthError = exports.GitHubAPIError = exports.MissingRequiredFileError = exports.ConfigurationError = void 0;
|
||||||
class ConfigurationError extends Error {
|
class ConfigurationError extends Error {
|
||||||
constructor(message, releaserName, repository) {
|
constructor(message, releaserName, repository) {
|
||||||
super(`${releaserName} (${repository}): ${message}`);
|
super(`${releaserName} (${repository}): ${message}`);
|
||||||
@@ -71116,6 +71116,7 @@ class GitHubAPIError extends Error {
|
|||||||
this.body = GitHubAPIError.parseErrorBody(requestError);
|
this.body = GitHubAPIError.parseErrorBody(requestError);
|
||||||
this.name = GitHubAPIError.name;
|
this.name = GitHubAPIError.name;
|
||||||
this.cause = requestError;
|
this.cause = requestError;
|
||||||
|
this.stack = requestError.stack;
|
||||||
}
|
}
|
||||||
static parseErrorBody(requestError) {
|
static parseErrorBody(requestError) {
|
||||||
const body = requestError.response;
|
const body = requestError.response;
|
||||||
@@ -71143,6 +71144,14 @@ class DuplicateReleaseError extends GitHubAPIError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.DuplicateReleaseError = DuplicateReleaseError;
|
exports.DuplicateReleaseError = DuplicateReleaseError;
|
||||||
|
class FileNotFoundError extends Error {
|
||||||
|
constructor(path) {
|
||||||
|
super(`Failed to find file: ${path}`);
|
||||||
|
this.path = path;
|
||||||
|
this.name = FileNotFoundError.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.FileNotFoundError = FileNotFoundError;
|
||||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
@@ -71402,6 +71411,7 @@ exports.GH_GRAPHQL_URL = 'https://api.github.com';
|
|||||||
const logger_1 = __nccwpck_require__(68809);
|
const logger_1 = __nccwpck_require__(68809);
|
||||||
const manifest_1 = __nccwpck_require__(31999);
|
const manifest_1 = __nccwpck_require__(31999);
|
||||||
const signoff_commit_message_1 = __nccwpck_require__(2686);
|
const signoff_commit_message_1 = __nccwpck_require__(2686);
|
||||||
|
const file_cache_1 = __nccwpck_require__(9405);
|
||||||
class GitHub {
|
class GitHub {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
/**
|
/**
|
||||||
@@ -71446,58 +71456,6 @@ class GitHub {
|
|||||||
maxRetries -= 1;
|
maxRetries -= 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
/**
|
|
||||||
* Fetch the contents of a file with the Contents API
|
|
||||||
*
|
|
||||||
* @param {string} path The path to the file in the repository
|
|
||||||
* @param {string} branch The branch to fetch from
|
|
||||||
* @returns {GitHubFileContents}
|
|
||||||
* @throws {GitHubAPIError} on other API errors
|
|
||||||
*/
|
|
||||||
this.getFileContentsWithSimpleAPI = wrapAsync(async (path, ref, isBranch = true) => {
|
|
||||||
ref = isBranch ? fullyQualifyBranchRef(ref) : ref;
|
|
||||||
const options = {
|
|
||||||
owner: this.repository.owner,
|
|
||||||
repo: this.repository.repo,
|
|
||||||
path,
|
|
||||||
ref,
|
|
||||||
};
|
|
||||||
const resp = await this.request('GET /repos/:owner/:repo/contents/:path', options);
|
|
||||||
return {
|
|
||||||
parsedContent: Buffer.from(resp.data.content, 'base64').toString('utf8'),
|
|
||||||
content: resp.data.content,
|
|
||||||
sha: resp.data.sha,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Fetch the contents of a file using the Git data API
|
|
||||||
*
|
|
||||||
* @param {string} path The path to the file in the repository
|
|
||||||
* @param {string} branch The branch to fetch from
|
|
||||||
* @returns {GitHubFileContents}
|
|
||||||
* @throws {GitHubAPIError} on other API errors
|
|
||||||
*/
|
|
||||||
this.getFileContentsWithDataAPI = wrapAsync(async (path, branch) => {
|
|
||||||
const repoTree = await this.octokit.git.getTree({
|
|
||||||
owner: this.repository.owner,
|
|
||||||
repo: this.repository.repo,
|
|
||||||
tree_sha: branch,
|
|
||||||
});
|
|
||||||
const blobDescriptor = repoTree.data.tree.find(tree => tree.path === path);
|
|
||||||
if (!blobDescriptor) {
|
|
||||||
throw new Error(`Could not find requested path: ${path}`);
|
|
||||||
}
|
|
||||||
const resp = await this.octokit.git.getBlob({
|
|
||||||
owner: this.repository.owner,
|
|
||||||
repo: this.repository.repo,
|
|
||||||
file_sha: blobDescriptor.sha,
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
parsedContent: Buffer.from(resp.data.content, 'base64').toString('utf8'),
|
|
||||||
content: resp.data.content,
|
|
||||||
sha: resp.data.sha,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of paths to all files with a given name.
|
* Returns a list of paths to all files with a given name.
|
||||||
*
|
*
|
||||||
@@ -71775,6 +71733,7 @@ class GitHub {
|
|||||||
this.octokit = options.octokitAPIs.octokit;
|
this.octokit = options.octokitAPIs.octokit;
|
||||||
this.request = options.octokitAPIs.request;
|
this.request = options.octokitAPIs.request;
|
||||||
this.graphql = options.octokitAPIs.graphql;
|
this.graphql = options.octokitAPIs.graphql;
|
||||||
|
this.fileCache = new file_cache_1.RepositoryFileCache(this.octokit, this.repository);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Build a new GitHub client with auto-detected default branch.
|
* Build a new GitHub client with auto-detected default branch.
|
||||||
@@ -72247,15 +72206,7 @@ class GitHub {
|
|||||||
*/
|
*/
|
||||||
async getFileContentsOnBranch(path, branch) {
|
async getFileContentsOnBranch(path, branch) {
|
||||||
logger_1.logger.debug(`Fetching ${path} from branch ${branch}`);
|
logger_1.logger.debug(`Fetching ${path} from branch ${branch}`);
|
||||||
try {
|
return await this.fileCache.getFileContents(path, branch);
|
||||||
return await this.getFileContentsWithSimpleAPI(path, branch);
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
if (err.status === 403) {
|
|
||||||
return await this.getFileContentsWithDataAPI(path, branch);
|
|
||||||
}
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
async getFileJson(path, branch) {
|
async getFileJson(path, branch) {
|
||||||
const content = await this.getFileContentsOnBranch(path, branch);
|
const content = await this.getFileContentsOnBranch(path, branch);
|
||||||
@@ -72314,18 +72265,10 @@ class GitHub {
|
|||||||
for (const update of updates) {
|
for (const update of updates) {
|
||||||
let content;
|
let content;
|
||||||
try {
|
try {
|
||||||
if (update.cachedFileContents) {
|
content = await this.getFileContentsOnBranch(update.path, defaultBranch);
|
||||||
// we already loaded the file contents earlier, let's not
|
|
||||||
// hit GitHub again.
|
|
||||||
content = { data: update.cachedFileContents };
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const fileContent = await this.getFileContentsOnBranch(update.path, defaultBranch);
|
|
||||||
content = { data: fileContent };
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
if (err.status !== 404)
|
if (!(err instanceof errors_1.FileNotFoundError))
|
||||||
throw err;
|
throw err;
|
||||||
// if the file is missing and create = false, just continue
|
// if the file is missing and create = false, just continue
|
||||||
// to the next update, otherwise create the file.
|
// to the next update, otherwise create the file.
|
||||||
@@ -72335,13 +72278,13 @@ class GitHub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const contentText = content
|
const contentText = content
|
||||||
? Buffer.from(content.data.content, 'base64').toString('utf8')
|
? Buffer.from(content.content, 'base64').toString('utf8')
|
||||||
: undefined;
|
: undefined;
|
||||||
const updatedContent = update.updater.updateContent(contentText);
|
const updatedContent = update.updater.updateContent(contentText);
|
||||||
if (updatedContent) {
|
if (updatedContent) {
|
||||||
changes.set(update.path, {
|
changes.set(update.path, {
|
||||||
content: updatedContent,
|
content: updatedContent,
|
||||||
mode: '100644',
|
mode: (content === null || content === void 0 ? void 0 : content.mode) || file_cache_1.DEFAULT_FILE_MODE,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72381,17 +72324,6 @@ class GitHub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.GitHub = GitHub;
|
exports.GitHub = GitHub;
|
||||||
// Takes a potentially unqualified branch name, and turns it
|
|
||||||
// into a fully qualified ref.
|
|
||||||
//
|
|
||||||
// e.g. main -> refs/heads/main
|
|
||||||
function fullyQualifyBranchRef(refName) {
|
|
||||||
let final = refName;
|
|
||||||
if (final.indexOf('/') < 0) {
|
|
||||||
final = `refs/heads/${final}`;
|
|
||||||
}
|
|
||||||
return final;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Normalize a provided prefix by removing leading and trailing
|
* Normalize a provided prefix by removing leading and trailing
|
||||||
* slashes.
|
* slashes.
|
||||||
@@ -72462,6 +72394,7 @@ const factory_1 = __nccwpck_require__(75695);
|
|||||||
const pull_request_body_1 = __nccwpck_require__(70774);
|
const pull_request_body_1 = __nccwpck_require__(70774);
|
||||||
const merge_1 = __nccwpck_require__(90514);
|
const merge_1 = __nccwpck_require__(90514);
|
||||||
const release_please_manifest_1 = __nccwpck_require__(9817);
|
const release_please_manifest_1 = __nccwpck_require__(9817);
|
||||||
|
const errors_1 = __nccwpck_require__(93637);
|
||||||
exports.DEFAULT_RELEASE_PLEASE_CONFIG = 'release-please-config.json';
|
exports.DEFAULT_RELEASE_PLEASE_CONFIG = 'release-please-config.json';
|
||||||
exports.DEFAULT_RELEASE_PLEASE_MANIFEST = '.release-please-manifest.json';
|
exports.DEFAULT_RELEASE_PLEASE_MANIFEST = '.release-please-manifest.json';
|
||||||
exports.ROOT_PROJECT_PATH = '.';
|
exports.ROOT_PROJECT_PATH = '.';
|
||||||
@@ -72963,7 +72896,25 @@ class Manifest {
|
|||||||
for (const release of releases) {
|
for (const release of releases) {
|
||||||
promises.push(this.createRelease(release));
|
promises.push(this.createRelease(release));
|
||||||
}
|
}
|
||||||
const githubReleases = await Promise.all(promises);
|
const duplicateReleases = [];
|
||||||
|
const githubReleases = [];
|
||||||
|
for (const promise of promises) {
|
||||||
|
try {
|
||||||
|
githubReleases.push(await promise);
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
if (err instanceof errors_1.DuplicateReleaseError) {
|
||||||
|
logger_1.logger.warn(`Duplicate release tag: ${err.tag}`);
|
||||||
|
duplicateReleases.push(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (duplicateReleases.length > 0 && githubReleases.length === 0) {
|
||||||
|
throw duplicateReleases[0];
|
||||||
|
}
|
||||||
// adjust tags on pullRequest
|
// adjust tags on pullRequest
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
this.github.removeIssueLabels(this.labels, pullRequest.number),
|
this.github.removeIssueLabels(this.labels, pullRequest.number),
|
||||||
@@ -73067,6 +73018,8 @@ async function parseConfig(github, configFile, branch) {
|
|||||||
for (const path in config.packages) {
|
for (const path in config.packages) {
|
||||||
repositoryConfig[path] = mergeReleaserConfig(defaultConfig, extractReleaserConfig(config.packages[path]));
|
repositoryConfig[path] = mergeReleaserConfig(defaultConfig, extractReleaserConfig(config.packages[path]));
|
||||||
}
|
}
|
||||||
|
const configLabel = config['label'];
|
||||||
|
const configReleaseLabel = config['release-label'];
|
||||||
const manifestOptions = {
|
const manifestOptions = {
|
||||||
bootstrapSha: config['bootstrap-sha'],
|
bootstrapSha: config['bootstrap-sha'],
|
||||||
lastReleaseSha: config['last-release-sha'],
|
lastReleaseSha: config['last-release-sha'],
|
||||||
@@ -73074,6 +73027,8 @@ async function parseConfig(github, configFile, branch) {
|
|||||||
separatePullRequests: config['separate-pull-requests'],
|
separatePullRequests: config['separate-pull-requests'],
|
||||||
groupPullRequestTitlePattern: config['group-pull-request-title-pattern'],
|
groupPullRequestTitlePattern: config['group-pull-request-title-pattern'],
|
||||||
plugins: config['plugins'],
|
plugins: config['plugins'],
|
||||||
|
labels: configLabel === undefined ? undefined : [configLabel],
|
||||||
|
releaseLabels: configReleaseLabel === undefined ? undefined : [configReleaseLabel],
|
||||||
};
|
};
|
||||||
return { config: repositoryConfig, options: manifestOptions };
|
return { config: repositoryConfig, options: manifestOptions };
|
||||||
}
|
}
|
||||||
@@ -73796,6 +73751,13 @@ class NodeWorkspace extends workspace_1.WorkspacePlugin {
|
|||||||
throw new Error(`Could not find graph package for ${pkg.name}`);
|
throw new Error(`Could not find graph package for ${pkg.name}`);
|
||||||
}
|
}
|
||||||
const updatedPackage = pkg.clone();
|
const updatedPackage = pkg.clone();
|
||||||
|
// Update version of the package
|
||||||
|
const newVersion = updatedVersions.get(updatedPackage.name);
|
||||||
|
if (newVersion) {
|
||||||
|
logger_1.logger.info(`Updating ${updatedPackage.name} to ${newVersion}`);
|
||||||
|
updatedPackage.version = newVersion.toString();
|
||||||
|
}
|
||||||
|
// Update dependency versions
|
||||||
for (const [depName, resolved] of graphPackage.localDependencies) {
|
for (const [depName, resolved] of graphPackage.localDependencies) {
|
||||||
const depVersion = updatedVersions.get(depName);
|
const depVersion = updatedVersions.get(depName);
|
||||||
if (depVersion && resolved.type !== 'directory') {
|
if (depVersion && resolved.type !== 'directory') {
|
||||||
@@ -73810,7 +73772,10 @@ class NodeWorkspace extends workspace_1.WorkspacePlugin {
|
|||||||
update.updater = new raw_content_1.RawContent(json_stringify_1.jsonStringify(updatedPackage.toJSON(), updatedPackage.rawContent));
|
update.updater = new raw_content_1.RawContent(json_stringify_1.jsonStringify(updatedPackage.toJSON(), updatedPackage.rawContent));
|
||||||
}
|
}
|
||||||
else if (update.updater instanceof changelog_1.Changelog) {
|
else if (update.updater instanceof changelog_1.Changelog) {
|
||||||
update.updater.changelogEntry = appendDependenciesSectionToChangelog(update.updater.changelogEntry, dependencyNotes);
|
if (dependencyNotes) {
|
||||||
|
update.updater.changelogEntry =
|
||||||
|
appendDependenciesSectionToChangelog(update.updater.changelogEntry, dependencyNotes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return update;
|
return update;
|
||||||
});
|
});
|
||||||
@@ -73837,6 +73802,12 @@ class NodeWorkspace extends workspace_1.WorkspacePlugin {
|
|||||||
throw new Error(`Could not find graph package for ${pkg.name}`);
|
throw new Error(`Could not find graph package for ${pkg.name}`);
|
||||||
}
|
}
|
||||||
const updatedPackage = pkg.clone();
|
const updatedPackage = pkg.clone();
|
||||||
|
// Update version of the package
|
||||||
|
const newVersion = updatedVersions.get(updatedPackage.name);
|
||||||
|
if (newVersion) {
|
||||||
|
logger_1.logger.info(`Updating ${updatedPackage.name} to ${newVersion}`);
|
||||||
|
updatedPackage.version = newVersion.toString();
|
||||||
|
}
|
||||||
for (const [depName, resolved] of graphPackage.localDependencies) {
|
for (const [depName, resolved] of graphPackage.localDependencies) {
|
||||||
const depVersion = updatedVersions.get(depName);
|
const depVersion = updatedVersions.get(depName);
|
||||||
if (depVersion && resolved.type !== 'directory') {
|
if (depVersion && resolved.type !== 'directory') {
|
||||||
@@ -73867,7 +73838,7 @@ class NodeWorkspace extends workspace_1.WorkspacePlugin {
|
|||||||
createIfMissing: false,
|
createIfMissing: false,
|
||||||
updater: new changelog_1.Changelog({
|
updater: new changelog_1.Changelog({
|
||||||
version,
|
version,
|
||||||
changelogEntry: dependencyNotes,
|
changelogEntry: appendDependenciesSectionToChangelog('', dependencyNotes),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@@ -78153,8 +78124,12 @@ exports.BranchName = BranchName;
|
|||||||
* @see https://github.com/googleapis/releasetool
|
* @see https://github.com/googleapis/releasetool
|
||||||
*/
|
*/
|
||||||
const AUTORELEASE_PATTERN = /^release-?(?<component>[\w-.]*)?-v(?<version>[0-9].*)$/;
|
const AUTORELEASE_PATTERN = /^release-?(?<component>[\w-.]*)?-v(?<version>[0-9].*)$/;
|
||||||
|
const RELEASE_PLEASE_BRANCH_PREFIX = 'release-please--branches';
|
||||||
class AutoreleaseBranchName extends BranchName {
|
class AutoreleaseBranchName extends BranchName {
|
||||||
static matches(branchName) {
|
static matches(branchName) {
|
||||||
|
if (branchName.startsWith(RELEASE_PLEASE_BRANCH_PREFIX)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return !!branchName.match(AUTORELEASE_PATTERN);
|
return !!branchName.match(AUTORELEASE_PATTERN);
|
||||||
}
|
}
|
||||||
constructor(branchName) {
|
constructor(branchName) {
|
||||||
@@ -78361,6 +78336,219 @@ exports.CommitSplit = CommitSplit;
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 9405:
|
||||||
|
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Copyright 2022 Google LLC
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
|
exports.BranchFileCache = exports.RepositoryFileCache = exports.DEFAULT_FILE_MODE = void 0;
|
||||||
|
const logger_1 = __nccwpck_require__(68809);
|
||||||
|
const errors_1 = __nccwpck_require__(93637);
|
||||||
|
exports.DEFAULT_FILE_MODE = '100644';
|
||||||
|
/**
|
||||||
|
* This class is a read-through cache aimed at minimizing the
|
||||||
|
* number of API requests needed to fetch file data/contents.
|
||||||
|
* It lazy-caches data as it reads and will return cached data
|
||||||
|
* for resources already fetched.
|
||||||
|
*/
|
||||||
|
class RepositoryFileCache {
|
||||||
|
/**
|
||||||
|
* Instantiate a new loading cache instance
|
||||||
|
*
|
||||||
|
* @param {Octokit} octokit An authenticated octokit instance
|
||||||
|
* @param {Repository} repository The repository we are fetching data for
|
||||||
|
*/
|
||||||
|
constructor(octokit, repository) {
|
||||||
|
this.octokit = octokit;
|
||||||
|
this.repository = repository;
|
||||||
|
this.cache = new Map();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Fetch file contents for given path on a given branch. If the
|
||||||
|
* data has already been fetched, return a cached copy.
|
||||||
|
*
|
||||||
|
* @param {string} path Path to the file
|
||||||
|
* @param {string} branch Branch to fetch the file from
|
||||||
|
* @returns {GitHubFileContents} The file contents
|
||||||
|
*/
|
||||||
|
async getFileContents(path, branch) {
|
||||||
|
let fileCache = this.cache.get(branch);
|
||||||
|
if (!fileCache) {
|
||||||
|
fileCache = new BranchFileCache(this.octokit, this.repository, branch);
|
||||||
|
this.cache.set(branch, fileCache);
|
||||||
|
}
|
||||||
|
return await fileCache.getFileContents(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.RepositoryFileCache = RepositoryFileCache;
|
||||||
|
/**
|
||||||
|
* This class is a read-through cache for a single branch aimed
|
||||||
|
* at minimizing the number of API requests needed to fetch file
|
||||||
|
* data/contents. It lazy-caches data as it reads and will return
|
||||||
|
* cached data for resources already fetched.
|
||||||
|
*/
|
||||||
|
class BranchFileCache {
|
||||||
|
/**
|
||||||
|
* Instantiate a new loading cache instance
|
||||||
|
*
|
||||||
|
* @param {Octokit} octokit An authenticated octokit instance
|
||||||
|
* @param {Repository} repository The repository we are fetching data for
|
||||||
|
* @param {string} branch The branch we are fetching data from
|
||||||
|
*/
|
||||||
|
constructor(octokit, repository, branch) {
|
||||||
|
this.octokit = octokit;
|
||||||
|
this.repository = repository;
|
||||||
|
this.branch = branch;
|
||||||
|
this.cache = new Map();
|
||||||
|
this.treeCache = new Map();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Fetch file contents for given path. If the data has already been
|
||||||
|
* fetched, return the cached copy.
|
||||||
|
*
|
||||||
|
* @param {string} path Path to the file
|
||||||
|
* @param {string} branch Branch to fetch the file from
|
||||||
|
* @returns {GitHubFileContents} The file contents
|
||||||
|
*/
|
||||||
|
async getFileContents(path) {
|
||||||
|
const cached = this.cache.get(path);
|
||||||
|
if (cached) {
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
const fetched = await this.fetchFileContents(path);
|
||||||
|
this.cache.set(path, fetched);
|
||||||
|
return fetched;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Actually fetch the file contents. Uses the tree API to fetch file
|
||||||
|
* data.
|
||||||
|
*
|
||||||
|
* @param {string} path Path to the file
|
||||||
|
*/
|
||||||
|
async fetchFileContents(path) {
|
||||||
|
// try to use the entire git tree if it's not too big
|
||||||
|
const treeEntries = await this.getFullTree();
|
||||||
|
if (treeEntries) {
|
||||||
|
logger_1.logger.debug(`Using full tree to find ${path}`);
|
||||||
|
const found = treeEntries.find(entry => entry.path === path);
|
||||||
|
if (found === null || found === void 0 ? void 0 : found.sha) {
|
||||||
|
return await this.fetchContents(found.sha, found);
|
||||||
|
}
|
||||||
|
throw new errors_1.FileNotFoundError(path);
|
||||||
|
}
|
||||||
|
// full tree is too big, use data API to fetch
|
||||||
|
const parts = path.split('/');
|
||||||
|
let treeSha = this.branch;
|
||||||
|
let found;
|
||||||
|
for (const part of parts) {
|
||||||
|
const tree = await this.getTree(treeSha);
|
||||||
|
found = tree.find(item => item.path === part);
|
||||||
|
if (!(found === null || found === void 0 ? void 0 : found.sha)) {
|
||||||
|
throw new errors_1.FileNotFoundError(path);
|
||||||
|
}
|
||||||
|
treeSha = found.sha;
|
||||||
|
}
|
||||||
|
if (found === null || found === void 0 ? void 0 : found.sha) {
|
||||||
|
return await this.fetchContents(found.sha, found);
|
||||||
|
}
|
||||||
|
throw new errors_1.FileNotFoundError(path);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Return the full recursive git tree. If already fetched, return
|
||||||
|
* the cached version. If the tree is too big, return null.
|
||||||
|
*
|
||||||
|
* @returns {TreeEntry[]} The tree entries
|
||||||
|
*/
|
||||||
|
async getFullTree() {
|
||||||
|
if (this.treeEntries === undefined) {
|
||||||
|
// fetch all tree entries recursively
|
||||||
|
const { data: { tree, truncated }, } = await this.octokit.git.getTree({
|
||||||
|
owner: this.repository.owner,
|
||||||
|
repo: this.repository.repo,
|
||||||
|
tree_sha: this.branch,
|
||||||
|
recursive: 'true',
|
||||||
|
});
|
||||||
|
if (truncated) {
|
||||||
|
// the full tree is too big to use, mark it as unusable
|
||||||
|
this.treeEntries = null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.treeEntries = tree;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.treeEntries;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the git tree for a given SHA. If already fetched, return
|
||||||
|
* the cached version.
|
||||||
|
*
|
||||||
|
* @param {string} sha The tree SHA
|
||||||
|
* @returns {TreeEntry[]} The tree entries
|
||||||
|
*/
|
||||||
|
async getTree(sha) {
|
||||||
|
const cached = this.treeCache.get(sha);
|
||||||
|
if (cached) {
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
const fetched = await this.fetchTree(sha);
|
||||||
|
this.treeCache.set(sha, fetched);
|
||||||
|
return fetched;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Fetch the git tree via the GitHub API
|
||||||
|
*
|
||||||
|
* @param {string} sha The tree SHA
|
||||||
|
* @returns {TreeEntry[]} The tree entries
|
||||||
|
*/
|
||||||
|
async fetchTree(sha) {
|
||||||
|
const { data: { tree }, } = await this.octokit.git.getTree({
|
||||||
|
owner: this.repository.owner,
|
||||||
|
repo: this.repository.repo,
|
||||||
|
tree_sha: sha,
|
||||||
|
recursive: 'false',
|
||||||
|
});
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Fetch the git blob from the GitHub API and convert into a
|
||||||
|
* GitHubFileContents object.
|
||||||
|
*
|
||||||
|
* @param {string} blobSha The git blob SHA
|
||||||
|
* @param {TreeEntry} treeEntry The associated tree object
|
||||||
|
*/
|
||||||
|
async fetchContents(blobSha, treeEntry) {
|
||||||
|
const { data: { content }, } = await this.octokit.git.getBlob({
|
||||||
|
owner: this.repository.owner,
|
||||||
|
repo: this.repository.repo,
|
||||||
|
file_sha: blobSha,
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
sha: blobSha,
|
||||||
|
mode: treeEntry.mode || exports.DEFAULT_FILE_MODE,
|
||||||
|
content,
|
||||||
|
parsedContent: Buffer.from(content, 'base64').toString('utf8'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.BranchFileCache = BranchFileCache;
|
||||||
|
//# sourceMappingURL=file-cache.js.map
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
/***/ 13170:
|
/***/ 13170:
|
||||||
/***/ ((__unused_webpack_module, exports) => {
|
/***/ ((__unused_webpack_module, exports) => {
|
||||||
|
|
||||||
@@ -96835,7 +97023,7 @@ module.exports = JSON.parse("{\"amp\":\"&\",\"apos\":\"'\",\"gt\":\">\",\"lt\":\
|
|||||||
/***/ ((module) => {
|
/***/ ((module) => {
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
module.exports = {"i8":"13.4.10"};
|
module.exports = {"i8":"13.4.14"};
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user