Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: platform=local #22010

Merged
merged 9 commits into from May 10, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/config/presets/local/index.ts
Expand Up @@ -24,6 +24,7 @@ const resolvers = {
gitea,
github,
gitlab,
local: null,
viceice marked this conversation as resolved.
Show resolved Hide resolved
} satisfies Record<PlatformId, Resolver | null>;

export function getPreset({
Expand Down
3 changes: 2 additions & 1 deletion lib/constants/platforms.ts
Expand Up @@ -5,7 +5,8 @@ export type PlatformId =
| 'bitbucket-server'
| 'gitea'
| 'github'
| 'gitlab';
| 'gitlab'
| 'local';

export const GITHUB_API_USING_HOST_TYPES = [
'github',
Expand Down
2 changes: 2 additions & 0 deletions lib/modules/platform/api.ts
Expand Up @@ -6,6 +6,7 @@ import * as codecommit from './codecommit';
import * as gitea from './gitea';
import * as github from './github';
import * as gitlab from './gitlab';
import * as local from './local';
import type { Platform } from './types';

const api = new Map<PlatformId, Platform>();
Expand All @@ -18,3 +19,4 @@ api.set(codecommit.id, codecommit);
api.set(gitea.id, gitea);
api.set(github.id, github);
api.set(gitlab.id, gitlab);
api.set(local.id, local);
124 changes: 124 additions & 0 deletions lib/modules/platform/local/index.ts
viceice marked this conversation as resolved.
Show resolved Hide resolved
@@ -0,0 +1,124 @@
/* istanbul ignore file */
rarkins marked this conversation as resolved.
Show resolved Hide resolved
import type { BranchStatus } from '../../../types';
import type {
Issue,
PlatformParams,
PlatformResult,
Pr,
RepoResult,
} from '../types';

export const id = 'local';

export function initPlatform(params: PlatformParams): Promise<PlatformResult> {
return Promise.resolve({
dryRun: 'lookup',
viceice marked this conversation as resolved.
Show resolved Hide resolved
endpoint: 'local',
persistRepoData: true,
viceice marked this conversation as resolved.
Show resolved Hide resolved
requireConfig: 'optional',
viceice marked this conversation as resolved.
Show resolved Hide resolved
});
}

export function getRepos(): Promise<string[]> {
return Promise.resolve([]);
}

export function initRepo(): Promise<RepoResult> {
return Promise.resolve({
defaultBranch: '',
isFork: false,
repoFingerprint: '',
viceice marked this conversation as resolved.
Show resolved Hide resolved
});
}

export function getRepoForceRebase(): Promise<boolean> {
return Promise.resolve(false);
}

export function findIssue(): Promise<null> {
return Promise.resolve(null);
}

export function getIssueList(): Promise<Issue[]> {
return Promise.resolve([]);
}

export function getRawFile(): Promise<string | null> {
return Promise.resolve(null);
}

export function getJsonFile(): Promise<Record<string, unknown> | null> {
return Promise.resolve(null);
}

export function getPrList(): Promise<Pr[]> {
return Promise.resolve([]);
}

export function ensureIssueClosing(): Promise<void> {
return Promise.resolve();
}

export function ensureIssue(): Promise<null> {
return Promise.resolve(null);
}

export function massageMarkdown(input: string): string {
return input;
}

export function updatePr(): Promise<void> {
return Promise.resolve();
}

export function mergePr(): Promise<boolean> {
return Promise.resolve(false);
}

export function addReviewers(): Promise<void> {
return Promise.resolve();
}

export function addAssignees(): Promise<void> {
return Promise.resolve();
}

export function createPr(): Promise<null> {
return Promise.resolve(null);
}

export function deleteLabel(): Promise<void> {
return Promise.resolve();
}

export function setBranchStatus(): Promise<void> {
return Promise.resolve();
}

export function getBranchStatus(): Promise<BranchStatus> {
return Promise.resolve('red');
}

export function getBranchStatusCheck(): Promise<null> {
return Promise.resolve(null);
}

export function ensureCommentRemoval(): Promise<void> {
return Promise.resolve();
}

export function ensureComment(): Promise<boolean> {
return Promise.resolve(false);
}

export function getPr(): Promise<null> {
return Promise.resolve(null);
}

export function findPr(): Promise<null> {
return Promise.resolve(null);
}

export function getBranchPr(): Promise<null> {
return Promise.resolve(null);
}
46 changes: 46 additions & 0 deletions lib/modules/platform/local/scm.ts
@@ -0,0 +1,46 @@
/* istanbul ignore file */
rarkins marked this conversation as resolved.
Show resolved Hide resolved
import { glob } from 'glob';
import type { CommitFilesConfig, CommitSha } from '../../../util/git/types';
import type { PlatformScm } from '../types';

let fileList: string[] | undefined;
rarkins marked this conversation as resolved.
Show resolved Hide resolved
export class LocalFs implements PlatformScm {
fileList: string[] | undefined;
JamieMagee marked this conversation as resolved.
Show resolved Hide resolved
rarkins marked this conversation as resolved.
Show resolved Hide resolved

isBranchBehindBase(branchName: string, baseBranch: string): Promise<boolean> {
return Promise.resolve(false);
}
isBranchModified(branchName: string): Promise<boolean> {
return Promise.resolve(false);
}
isBranchConflicted(baseBranch: string, branch: string): Promise<boolean> {
return Promise.resolve(false);
}
branchExists(branchName: string): Promise<boolean> {
return Promise.resolve(true);
}
getBranchCommit(branchName: string): Promise<string | null> {
return Promise.resolve(null);
}
deleteBranch(branchName: string): Promise<void> {
return Promise.resolve();
}
commitAndPush(commitConfig: CommitFilesConfig): Promise<string | null> {
return Promise.resolve(null);
}

async getFileList(): Promise<string[]> {
fileList ??= await glob('**', {
rarkins marked this conversation as resolved.
Show resolved Hide resolved
dot: true,
nodir: true,
ignore: {
childrenIgnored: (p) => p.isNamed('.git') || p.isNamed('node_modules'),
JamieMagee marked this conversation as resolved.
Show resolved Hide resolved
rarkins marked this conversation as resolved.
Show resolved Hide resolved
},
});
return fileList;
}

checkoutBranch(branchName: string): Promise<CommitSha> {
return Promise.resolve('');
}
}
2 changes: 2 additions & 0 deletions lib/modules/platform/scm.ts
Expand Up @@ -3,6 +3,7 @@ import type { PlatformId } from '../../constants';
import { PLATFORM_NOT_FOUND } from '../../constants/error-messages';
import { DefaultGitScm } from './default-scm';
import { GithubScm } from './github/scm';
import { LocalFs } from './local/scm';
import type { PlatformScm } from './types';

export const platformScmImpls = new Map<PlatformId, Constructor<PlatformScm>>();
Expand All @@ -13,6 +14,7 @@ platformScmImpls.set('bitbucket-server', DefaultGitScm);
platformScmImpls.set('gitea', DefaultGitScm);
platformScmImpls.set('github', GithubScm);
platformScmImpls.set('gitlab', DefaultGitScm);
platformScmImpls.set('local', LocalFs);

let _scm: PlatformScm | undefined;

Expand Down
5 changes: 5 additions & 0 deletions lib/util/fs/index.spec.ts
Expand Up @@ -134,6 +134,11 @@ describe('util/fs/index', () => {
});

describe('deleteLocalFile', () => {
it('throws if platform is local', async () => {
GlobalConfig.set({ platform: 'local' });
await expect(deleteLocalFile('foo/bar/file.txt')).rejects.toThrow();
});

it('deletes file', async () => {
const filePath = `${localDir}/foo/bar/file.txt`;
await fs.outputFile(filePath, 'foobar');
Expand Down
4 changes: 4 additions & 0 deletions lib/util/fs/index.ts
Expand Up @@ -65,6 +65,10 @@ export async function writeLocalFile(
}

export async function deleteLocalFile(fileName: string): Promise<void> {
// This a failsafe and hopefully will never be triggered
if (GlobalConfig.get('platform') === 'local') {
throw new Error('Cannot delete file when platform=local');
}
const localDir = GlobalConfig.get('localDir');
if (localDir) {
const localFileName = ensureLocalPath(fileName);
Expand Down
4 changes: 4 additions & 0 deletions lib/util/git/index.ts
Expand Up @@ -379,6 +379,10 @@ export async function syncGit(): Promise<void> {
if (gitInitialized) {
return;
}
// istanbul ignore if: failsafe
if (GlobalConfig.get('platform') === 'local') {
throw new Error('Cannot sync git when platform=local');
}
gitInitialized = true;
const localDir = GlobalConfig.get('localDir')!;
logger.debug(`Initializing git repository into ${localDir}`);
Expand Down
6 changes: 6 additions & 0 deletions lib/workers/global/autodiscover.spec.ts
Expand Up @@ -25,6 +25,12 @@ describe('workers/global/autodiscover', () => {
});
});

it('throws if local and repositories defined', async () => {
config.platform = 'local';
config.repositories = ['a'];
await expect(autodiscoverRepositories(config)).rejects.toThrow();
});

it('returns if not autodiscovering', async () => {
expect(await autodiscoverRepositories(config)).toEqual(config);
});
Expand Down
12 changes: 12 additions & 0 deletions lib/workers/global/autodiscover.ts
Expand Up @@ -13,6 +13,18 @@ function repoName(value: string | { repository: string }): string {
export async function autodiscoverRepositories(
config: AllConfig
): Promise<AllConfig> {
if (config.platform === 'local') {
if (config.repositories?.length) {
logger.debug(
{ repositories: config.repositories },
'Found repositories when in local mode'
);
throw new Error(
'Invalid configuration: repositories list not supported when platform=local'
);
}
config.repositories = ['local'];
}
if (!config.autodiscover) {
if (!config.repositories?.length) {
logger.warn(
Expand Down
11 changes: 7 additions & 4 deletions lib/workers/global/index.ts
Expand Up @@ -37,10 +37,13 @@ export async function getRepositoryConfig(
);
// TODO: types (#7154)
const platform = GlobalConfig.get('platform')!;
repoConfig.localDir = upath.join(
repoConfig.baseDir,
`./repos/${platform}/${repoConfig.repository}`
);
repoConfig.localDir =
platform === 'local'
? process.cwd()
: upath.join(
repoConfig.baseDir,
`./repos/${platform}/${repoConfig.repository}`
);
await fs.ensureDir(repoConfig.localDir);
delete repoConfig.baseDir;
return configParser.filterConfig(repoConfig, 'repository');
Expand Down
2 changes: 1 addition & 1 deletion lib/workers/repository/process/index.ts
Expand Up @@ -108,7 +108,7 @@ export async function extractDependencies(
branchList: [],
packageFiles: null!,
};
if (config.baseBranches?.length) {
if (GlobalConfig.get('platform') !== 'local' && config.baseBranches?.length) {
viceice marked this conversation as resolved.
Show resolved Hide resolved
config.baseBranches = unfoldBaseBranches(config.baseBranches);
logger.debug({ baseBranches: config.baseBranches }, 'baseBranches');
const extracted: Record<string, Record<string, PackageFile[]>> = {};
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -196,6 +196,7 @@
"global-agent": "3.0.0",
"good-enough-parser": "1.1.22",
"got": "11.8.6",
"glob": "10.2.2",
"graph-data-structure": "3.3.0",
"handlebars": "4.7.7",
"hasha": "5.2.2",
Expand Down Expand Up @@ -307,7 +308,6 @@
"eslint-plugin-promise": "6.1.1",
"eslint-plugin-typescript-enum": "2.1.0",
"expect-more-jest": "5.5.0",
"glob": "10.2.2",
"graphql": "16.6.0",
"husky": "8.0.3",
"jest": "29.5.0",
Expand Down