renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
142 lines (141 loc) • 5.94 kB
JavaScript
import { REPOSITORY_NO_PACKAGE_FILES } from "../../../../constants/error-messages.js";
import { GlobalConfig } from "../../../../config/global.js";
import { logger } from "../../../../logger/index.js";
import { mergeChildConfig } from "../../../../config/utils.js";
import { getInheritedOrGlobal } from "../../../../util/common.js";
import { getCache } from "../../../../util/cache/repository/index.js";
import { getBranchCommit, setGitAuthor } from "../../../../util/git/index.js";
import { scm } from "../../../../modules/platform/scm.js";
import { platform } from "../../../../modules/platform/index.js";
import "../../../../config/index.js";
import { getOnboardingConfig } from "./config.js";
import { deleteOnboardingCache, hasOnboardingBranchChanged, isOnboardingBranchConflicted, isOnboardingBranchModified, setOnboardingCache } from "./onboarding-branch-cache.js";
import { OnboardingState } from "../common.js";
import { mergeRenovateConfig } from "../../init/merge.js";
import { extractAllDependencies } from "../../extract/index.js";
import { checkIfConfigured } from "../../configured.js";
import { getOnboardingPr, isOnboarded } from "./check.js";
import { createOnboardingBranch } from "./create.js";
import { rebaseOnboardingBranch } from "./rebase.js";
import { isNonEmptyObject, isNullOrUndefined } from "@sindresorhus/is";
//#region lib/workers/repository/onboarding/branch/index.ts
async function checkOnboardingBranch(config) {
logger.debug("checkOnboarding()");
logger.trace({ config });
const onboardingBranch = getInheritedOrGlobal("onboardingBranch");
const defaultBranch = config.defaultBranch;
let isConflicted = false;
let isModified = false;
const repoIsOnboarded = await isOnboarded(config);
if (repoIsOnboarded) {
logger.debug("Repo is onboarded");
deleteOnboardingCache();
return {
...config,
repoIsOnboarded
};
}
checkIfConfigured(config);
logger.debug("Repo is not onboarded");
setGitAuthor(config.gitAuthor);
const onboardingPr = await getOnboardingPr(config);
const branchList = [onboardingBranch];
if (onboardingPr) {
logger.debug("Onboarding PR already exists");
isModified = await isOnboardingBranchModified(onboardingBranch, defaultBranch);
if (!isModified) {
const commit = await rebaseOnboardingBranch(config, onboardingPr.bodyStruct?.rawConfigHash);
if (commit) logger.info({
branch: onboardingBranch,
commit,
onboarding: true
}, "Branch updated");
// istanbul ignore if
if (platform.refreshPr) await platform.refreshPr(onboardingPr.number);
}
if (config.onboardingRebaseCheckbox) handleOnboardingManualRebase(onboardingPr);
if (isConfigHashPresent(onboardingPr) && isOnboardingCacheValid(defaultBranch, onboardingBranch) && !(config.onboardingRebaseCheckbox && OnboardingState.prUpdateRequested)) {
logger.debug("Skip processing since the onboarding branch is up to date and default branch has not changed");
OnboardingState.onboardingCacheValid = true;
return {
...config,
repoIsOnboarded,
onboardingBranch,
branchList
};
}
OnboardingState.onboardingCacheValid = false;
if (isModified) {
if (hasOnboardingBranchChanged(onboardingBranch)) invalidateExtractCache(config.baseBranch);
isConflicted = await isOnboardingBranchConflicted(config.baseBranch, onboardingBranch);
}
} else {
logger.debug("Onboarding PR does not exist");
let mergedConfig = mergeChildConfig(config, await getOnboardingConfig(config));
mergedConfig = await mergeRenovateConfig(mergedConfig);
if (Object.entries((await extractAllDependencies(mergedConfig)).packageFiles).length === 0) {
if (getInheritedOrGlobal("onboardingNoDeps") !== "enabled") throw new Error(REPOSITORY_NO_PACKAGE_FILES);
}
logger.debug("Need to create onboarding PR");
if (config.onboardingRebaseCheckbox) OnboardingState.prUpdateRequested = true;
const commit = await createOnboardingBranch(mergedConfig);
// istanbul ignore if
if (commit) logger.info({
branch: onboardingBranch,
commit,
onboarding: true
}, "Branch created");
}
if (!GlobalConfig.get("dryRun")) {
if (!isConflicted) {
logger.debug("Merge onboarding branch in default branch");
await scm.mergeToLocal(onboardingBranch);
}
}
setOnboardingCache(getBranchCommit(config.defaultBranch), getBranchCommit(onboardingBranch), isConflicted, isModified);
return {
...config,
repoIsOnboarded,
onboardingBranch,
branchList
};
}
function handleOnboardingManualRebase(onboardingPr) {
const pl = GlobalConfig.get("platform");
const { rebaseRequested } = onboardingPr.bodyStruct ?? {};
if (![
"github",
"gitlab",
"gitea"
].includes(pl)) {
logger.trace(`Platform '${pl}' does not support extended markdown`);
OnboardingState.prUpdateRequested = true;
} else if (isNullOrUndefined(rebaseRequested)) {
logger.debug("No rebase checkbox was found in the onboarding PR");
OnboardingState.prUpdateRequested = true;
} else if (rebaseRequested) {
logger.debug("Manual onboarding PR update requested");
OnboardingState.prUpdateRequested = true;
}
}
function invalidateExtractCache(baseBranch) {
const cache = getCache();
cache.scan ??= {};
if (cache.scan?.[baseBranch]) delete cache.scan[baseBranch];
}
function isOnboardingCacheValid(defaultBranch, onboardingBranch) {
const onboardingBranchCache = getCache()?.onboardingBranchCache;
return !!(isNonEmptyObject(onboardingBranchCache) && onboardingBranchCache.defaultBranchSha === getBranchCommit(defaultBranch) && onboardingBranchCache.onboardingBranchSha === getBranchCommit(onboardingBranch) && onboardingBranchCache.configFileName && onboardingBranchCache.configFileParsed);
}
function isConfigHashPresent(pr) {
const platform = GlobalConfig.get("platform");
if (![
"github",
"gitlab",
"gitea"
].includes(platform)) return true;
return !!pr.bodyStruct?.rawConfigHash;
}
//#endregion
export { checkOnboardingBranch };
//# sourceMappingURL=index.js.map