diff --git a/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap b/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap
index 5623be7f0ea016..2974a346ed69a5 100644
--- a/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap
+++ b/lib/workers/repository/__snapshots__/dependency-dashboard.spec.ts.snap
@@ -425,7 +425,6 @@ This repository currently has no open or pending branches.
no-ver-no-digest/Dockerfile
- - \`ubuntu no version found\`
diff --git a/lib/workers/repository/dependency-dashboard.spec.ts b/lib/workers/repository/dependency-dashboard.spec.ts
index 79a6992544b24d..30acc6197524c5 100644
--- a/lib/workers/repository/dependency-dashboard.spec.ts
+++ b/lib/workers/repository/dependency-dashboard.spec.ts
@@ -762,16 +762,10 @@ describe('workers/repository/dependency-dashboard', () => {
it('does not truncates as there is enough space to fit', () => {
PackageFiles.add('main', packageFiles);
- const nonTruncated = PackageFiles.getDashboardMarkdown(
- config,
- Infinity
- );
+ const nonTruncated = PackageFiles.getDashboardMarkdown(Infinity);
const len = (title + note + nonTruncated).length;
- const truncated = PackageFiles.getDashboardMarkdown(config, len);
- const truncatedWithTitle = PackageFiles.getDashboardMarkdown(
- config,
- len
- );
+ const truncated = PackageFiles.getDashboardMarkdown(len);
+ const truncatedWithTitle = PackageFiles.getDashboardMarkdown(len);
expect(truncated.length === nonTruncated.length).toBeTrue();
expect(truncatedWithTitle.includes(note)).toBeFalse();
});
@@ -779,47 +773,35 @@ describe('workers/repository/dependency-dashboard', () => {
it('removes a branch with no managers', () => {
PackageFiles.add('main', packageFiles);
PackageFiles.add('dev', packageFilesWithDigest);
- const md = PackageFiles.getDashboardMarkdown(config, Infinity, false);
+ const md = PackageFiles.getDashboardMarkdown(Infinity, false);
const len = md.length;
PackageFiles.add('empty/branch', {});
- const truncated = PackageFiles.getDashboardMarkdown(
- config,
- len,
- false
- );
+ const truncated = PackageFiles.getDashboardMarkdown(len, false);
expect(truncated.includes('empty/branch')).toBeFalse();
expect(truncated.length === len).toBeTrue();
});
it('removes a manager with no package files', () => {
PackageFiles.add('main', packageFiles);
- const md = PackageFiles.getDashboardMarkdown(config, Infinity, false);
+ const md = PackageFiles.getDashboardMarkdown(Infinity, false);
const len = md.length;
PackageFiles.add('dev', { dockerfile: [] });
- const truncated = PackageFiles.getDashboardMarkdown(
- config,
- len,
- false
- );
+ const truncated = PackageFiles.getDashboardMarkdown(len, false);
expect(truncated.includes('dev')).toBeFalse();
expect(truncated.length === len).toBeTrue();
});
it('does nothing when there are no base branches left', () => {
- const truncated = PackageFiles.getDashboardMarkdown(
- config,
- -1,
- false
- );
+ const truncated = PackageFiles.getDashboardMarkdown(-1, false);
expect(truncated).toBe('');
});
it('removes an entire base branch', () => {
PackageFiles.add('main', packageFiles);
- const md = PackageFiles.getDashboardMarkdown(config, Infinity);
+ const md = PackageFiles.getDashboardMarkdown(Infinity);
const len = md.length + note.length;
PackageFiles.add('dev', packageFilesWithDigest);
- const truncated = PackageFiles.getDashboardMarkdown(config, len);
+ const truncated = PackageFiles.getDashboardMarkdown(len);
expect(truncated.includes('dev')).toBeFalse();
expect(truncated.length === len).toBeTrue();
});
@@ -827,13 +809,9 @@ describe('workers/repository/dependency-dashboard', () => {
it('ensures original data is unchanged', () => {
PackageFiles.add('main', packageFiles);
PackageFiles.add('dev', packageFilesWithDigest);
- const pre = PackageFiles.getDashboardMarkdown(config, Infinity);
- const truncated = PackageFiles.getDashboardMarkdown(
- config,
- -1,
- false
- );
- const post = PackageFiles.getDashboardMarkdown(config, Infinity);
+ const pre = PackageFiles.getDashboardMarkdown(Infinity);
+ const truncated = PackageFiles.getDashboardMarkdown(-1, false);
+ const post = PackageFiles.getDashboardMarkdown(Infinity);
expect(truncated).toBe('');
expect(pre === post).toBeTrue();
expect(post.includes('main')).toBeTrue();
diff --git a/lib/workers/repository/dependency-dashboard.ts b/lib/workers/repository/dependency-dashboard.ts
index 979ed31a358065..ffa718a4d8eed0 100644
--- a/lib/workers/repository/dependency-dashboard.ts
+++ b/lib/workers/repository/dependency-dashboard.ts
@@ -337,7 +337,6 @@ export async function ensureDependencyDashboard(
// fit the detected dependencies section
const footer = getFooter(config);
issueBody += PackageFiles.getDashboardMarkdown(
- config,
GitHubMaxPrBodyLen - issueBody.length - footer.length
);
diff --git a/lib/workers/repository/package-files.ts b/lib/workers/repository/package-files.ts
index c5a7f39f31d62c..6bd9c43b3a17ed 100644
--- a/lib/workers/repository/package-files.ts
+++ b/lib/workers/repository/package-files.ts
@@ -1,5 +1,4 @@
import is from '@sindresorhus/is';
-import type { RenovateConfig } from '../../config/types';
import { logger } from '../../logger';
import type { PackageFile } from '../../modules/manager/types';
import { clone } from '../../util/clone';
@@ -15,7 +14,7 @@ export class PackageFiles {
{ baseBranch },
`PackageFiles.add() - Package file saved for branch`
);
- this.data.set(baseBranch, clone(packageFiles));
+ this.data.set(baseBranch, packageFiles);
}
static clear(): void {
@@ -32,15 +31,10 @@ export class PackageFiles {
* This does not mutate the original PackageFiles data
* Note: setHeader=false is used for testing purposes only
* Mainly for comparing truncated and non-truncated markdown
- * @param config
* @param maxLength
* @param setHeader
*/
- static getDashboardMarkdown(
- config: RenovateConfig,
- maxLength: number,
- setHeader = true
- ): string {
+ static getDashboardMarkdown(maxLength: number, setHeader = true): string {
const note =
'> **Note**\n> Detected dependencies section has been truncated\n';
const title = `## Detected dependencies\n\n`;
@@ -53,28 +47,30 @@ export class PackageFiles {
let header = '';
let removed = false;
let truncated = false;
- let restore: (() => void) | null = null;
+
+ const data = new Map(clone(Array.from(this.data)));
+
+ // filter all deps with skip reason
+ for (const managers of [...data.values()].filter(is.truthy)) {
+ for (const files of Object.values(managers).filter(is.truthy)) {
+ for (const file of files.filter((f) => is.truthy(f.deps))) {
+ file.deps = file.deps.filter(is.truthy).filter((d) => !d.skipReason);
+ }
+ }
+ }
do {
// shorten markdown until it fits
- md = PackageFiles.getDashboardMarkdownInternal(config);
+ md = PackageFiles.getDashboardMarkdownInternal(data);
if (md.length > mdMaxLength) {
- // backup data
- if (!restore) {
- restore = this.backup();
- }
// truncate data
- removed = PackageFiles.pop();
+ removed = PackageFiles.pop(data);
}
if (removed) {
truncated = true; // used to set the truncation Note
}
} while (removed && md.length > mdMaxLength);
- if (restore) {
- restore();
- } // restore original PackageFiles data
-
header += title;
header += truncated ? note : '';
@@ -83,14 +79,16 @@ export class PackageFiles {
/**
* Generates the "detected dependencies" markdown
- * @param config
+ * @param data
*/
- private static getDashboardMarkdownInternal(config: RenovateConfig): string {
+ private static getDashboardMarkdownInternal(
+ data: Map | null>
+ ): string {
const none = 'None detected\n\n';
- const pad = this.data.size > 1; // padding condition for a multi base branch repo
+ const pad = data.size > 1; // padding condition for a multi base branch repo
let deps = '';
- for (const [branch, packageFiles] of this.data) {
+ for (const [branch, packageFiles] of data) {
deps += pad
? `Branch ${branch}
\n\n\n`
: '';
@@ -107,8 +105,6 @@ export class PackageFiles {
continue;
}
- const placeHolder = `no version found`;
-
for (const manager of managers) {
deps += `${manager}
\n\n\n`;
for (const packageFile of packageFiles[manager]) {
@@ -118,9 +114,7 @@ export class PackageFiles {
const ver = dep.currentValue;
const digest = dep.currentDigest;
const version =
- ver && digest
- ? `${ver}@${digest}`
- : `${digest ?? ver ?? placeHolder}`;
+ ver && digest ? `${ver}@${digest}` : `${digest ?? ver!}`;
// TODO: types (#7154)
deps += ` - \`${dep.depName!} ${version}\`\n`;
}
@@ -134,40 +128,33 @@ export class PackageFiles {
return deps;
}
- private static backup(): () => void {
- const backup = this.data; // backup data
- // deep clone data
- this.data = new Map(clone(Array.from(this.data))); // only mutate cloned data
-
- return () => {
- this.data = backup;
- };
- }
-
/**
* Removes the last dependency/entry in the PackageFiles data
* i.e. the last line in the tobe generated detected dependency section
+ * @param data
* @Returns true if anything that translates to a markdown written line was deleted
* otherwise false is returned
*/
- private static pop(): boolean {
+ private static pop(
+ data: Map | null>
+ ): boolean {
// get detected managers list of the last listed base branch
- const [branch, managers] = Array.from(this.data).pop() ?? [];
+ const [branch, managers] = Array.from(data).pop() ?? [];
if (!branch) {
return false;
}
// delete base branch listing if it has no managers left
if (!managers || is.emptyObject(managers)) {
- return this.data.delete(branch);
+ return data.delete(branch);
}
// get all manifest files for the last listed manager
- const [manager, packageFiles] = Object.entries(managers).pop() ?? [];
+ const [manager, packageFiles] = Object.entries(managers).pop()!;
// delete current manager if it has no manifest files left
if (!packageFiles || is.emptyArray(packageFiles)) {
- return delete managers[manager!];
+ return delete managers[manager];
}
// delete manifest file if it has no deps left