diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts index 52a4e68fbcb82337ae47ab4e49c2f10d434d3f04..43ff10a7c359adda2488ca6895fc781d3805b886 100644 --- a/lib/util/git/index.ts +++ b/lib/util/git/index.ts @@ -31,6 +31,7 @@ import { checkForPlatformFailure, handleCommitError } from './error'; import { configSigningKey, writePrivateKey } from './private-key'; import type { CommitFilesConfig, + CommitResult, CommitSha, LocalConfig, StatusResult, @@ -696,15 +697,15 @@ async function handleCommitAuth(localDir: string): Promise<void> { await writeGitAuthor(); } -export async function commitFiles({ +export async function prepareCommit({ branchName, files, message, force = false, -}: CommitFilesConfig): Promise<CommitSha | null> { +}: CommitFilesConfig): Promise<CommitResult | null> { const { localDir } = GlobalConfig.get(); await syncGit(); - logger.debug(`Committing files to branch ${branchName}`); + logger.debug(`Preparing files for commiting to branch ${branchName}`); await handleCommitAuth(localDir); try { await git.reset(ResetMode.HARD); @@ -796,6 +797,29 @@ export async function commitFiles({ return null; } + const result: CommitResult = { + sha: commit, + files: files.filter((fileChange) => { + if (fileChange.type === 'deletion') { + return deletedFiles.includes(fileChange.path); + } + return addedModifiedFiles.includes(fileChange.path); + }), + }; + + return result; + } catch (err) /* istanbul ignore next */ { + return handleCommitError(files, branchName, err); + } +} + +export async function pushCommit({ + branchName, + files, +}: CommitFilesConfig): Promise<void> { + await syncGit(); + logger.debug(`Pushing branch ${branchName}`); + try { const pushOptions: TaskOptions = { '--force-with-lease': null, '-u': null, @@ -811,20 +835,41 @@ export async function commitFiles({ ); delete pushRes.repo; logger.debug({ result: pushRes }, 'git push'); - // Fetch it after create + incLimitedValue(Limit.Commits); + } catch (err) /* istanbul ignore next */ { + handleCommitError(files, branchName, err); + } +} + +export async function fetchCommit({ + branchName, + files, +}: CommitFilesConfig): Promise<CommitSha | null> { + await syncGit(); + logger.debug(`Fetching branch ${branchName}`); + try { const ref = `refs/heads/${branchName}:refs/remotes/origin/${branchName}`; await git.fetch(['origin', ref, '--force']); - config.branchCommits[branchName] = ( - await git.revparse([branchName]) - ).trim(); + const commit = (await git.revparse([branchName])).trim(); + config.branchCommits[branchName] = commit; config.branchIsModified[branchName] = false; - incLimitedValue(Limit.Commits); return commit; } catch (err) /* istanbul ignore next */ { return handleCommitError(files, branchName, err); } } +export async function commitFiles( + config: CommitFilesConfig +): Promise<CommitSha | null> { + const commitResult = await prepareCommit(config); + if (!commitResult) { + return null; + } + await pushCommit(config); + return fetchCommit(config); +} + export function getUrl({ protocol, auth, diff --git a/lib/util/git/types.ts b/lib/util/git/types.ts index d1f2537f2d4c6ab02404dd90c04fa125d8324b83..1b309f2d3697fbb69870bb92ec8c5a1a2973603a 100644 --- a/lib/util/git/types.ts +++ b/lib/util/git/types.ts @@ -76,3 +76,8 @@ export interface CommitFilesConfig { message: string; force?: boolean; } + +export interface CommitResult { + sha: string; + files: FileChange[]; +}