renovate 44.105.3 → 44.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/presets/gitea/common.js +4 -2
- package/dist/config/presets/gitea/common.js.map +1 -1
- package/dist/config/presets/github/index.js +7 -9
- package/dist/config/presets/github/index.js.map +1 -1
- package/dist/config/presets/gitlab/index.js +4 -15
- package/dist/config/presets/gitlab/index.js.map +1 -1
- package/dist/constants/platforms.js +94 -42
- package/dist/constants/platforms.js.map +1 -1
- package/dist/modules/datasource/rpm/index.js +7 -7
- package/dist/modules/datasource/rpm/index.js.map +1 -1
- package/dist/modules/datasource/rpm/providers/common.js +18 -18
- package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
- package/dist/modules/datasource/rpm/providers/xml.js +5 -5
- package/dist/modules/datasource/rpm/providers/xml.js.map +1 -1
- package/dist/modules/datasource/rpm/repomd.js +2 -2
- package/dist/modules/datasource/rpm/repomd.js.map +1 -1
- package/dist/modules/manager/github-actions/extract.js +5 -8
- package/dist/modules/manager/github-actions/extract.js.map +1 -1
- package/dist/modules/manager/pre-commit/extract.js +13 -13
- package/dist/modules/manager/pre-commit/extract.js.map +1 -1
- package/dist/modules/platform/bitbucket/files.js +19 -0
- package/dist/modules/platform/bitbucket/files.js.map +1 -0
- package/dist/modules/platform/bitbucket/index.js +2 -3
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/gitea/files.js +40 -0
- package/dist/modules/platform/gitea/files.js.map +1 -0
- package/dist/modules/platform/gitea/gitea-helper.js +2 -7
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +5 -4
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/labels.js.map +1 -1
- package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
- package/dist/modules/platform/github/files.js +21 -0
- package/dist/modules/platform/github/files.js.map +1 -0
- package/dist/modules/platform/github/index.js +3 -5
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/gitlab/files.js +23 -0
- package/dist/modules/platform/gitlab/files.js.map +1 -0
- package/dist/modules/platform/gitlab/index.js +3 -4
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/util/common.js +11 -16
- package/dist/util/common.js.map +1 -1
- package/dist/util/http/auth.js +5 -5
- package/dist/util/http/auth.js.map +1 -1
- package/dist/util/http/host-rules.js +7 -7
- package/dist/util/http/host-rules.js.map +1 -1
- package/dist/workers/repository/update/pr/body/index.js +3 -6
- package/dist/workers/repository/update/pr/body/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket/source.js +28 -5
- package/dist/workers/repository/update/pr/changelog/bitbucket/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket-server/source.js +30 -6
- package/dist/workers/repository/update/pr/changelog/bitbucket-server/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/forgejo/source.js +7 -4
- package/dist/workers/repository/update/pr/changelog/forgejo/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/gitea/source.js +51 -7
- package/dist/workers/repository/update/pr/changelog/gitea/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/github/source.js +53 -8
- package/dist/workers/repository/update/pr/changelog/github/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/gitlab/source.js +37 -5
- package/dist/workers/repository/update/pr/changelog/gitlab/source.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +13 -51
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +17 -5
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
- package/dist/workers/repository/update/pr/changelog/bitbucket/index.js +0 -36
- package/dist/workers/repository/update/pr/changelog/bitbucket/index.js.map +0 -1
- package/dist/workers/repository/update/pr/changelog/bitbucket-server/index.js +0 -33
- package/dist/workers/repository/update/pr/changelog/bitbucket-server/index.js.map +0 -1
- package/dist/workers/repository/update/pr/changelog/forgejo/index.js +0 -9
- package/dist/workers/repository/update/pr/changelog/forgejo/index.js.map +0 -1
- package/dist/workers/repository/update/pr/changelog/gitea/common.js +0 -56
- package/dist/workers/repository/update/pr/changelog/gitea/common.js.map +0 -1
- package/dist/workers/repository/update/pr/changelog/gitea/index.js +0 -9
- package/dist/workers/repository/update/pr/changelog/gitea/index.js.map +0 -1
- package/dist/workers/repository/update/pr/changelog/github/index.js +0 -56
- package/dist/workers/repository/update/pr/changelog/github/index.js.map +0 -1
- package/dist/workers/repository/update/pr/changelog/gitlab/index.js +0 -40
- package/dist/workers/repository/update/pr/changelog/gitlab/index.js.map +0 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
|
+
import { joinUrlParts } from "../../../util/url.js";
|
|
2
3
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
3
4
|
import { PRESET_DEP_NOT_FOUND, PRESET_INVALID, fetchPreset, parsePreset } from "../util.js";
|
|
4
|
-
import {
|
|
5
|
+
import { getRepoFile } from "../../../modules/platform/gitea/files.js";
|
|
6
|
+
import { API_PATH } from "../../../modules/platform/gitea/utils.js";
|
|
5
7
|
//#region lib/config/presets/gitea/common.ts
|
|
6
8
|
/**
|
|
7
9
|
* Builds the preset source of a platform which speaks the Gitea API.
|
|
@@ -13,7 +15,7 @@ function createPresetSource(http, defaultEndpoint) {
|
|
|
13
15
|
async function fetchJSONFile(repo, fileName, endpoint, tag) {
|
|
14
16
|
let res;
|
|
15
17
|
try {
|
|
16
|
-
res = await
|
|
18
|
+
res = await getRepoFile(http, repo, fileName, tag, { baseUrl: joinUrlParts(endpoint, API_PATH) });
|
|
17
19
|
} catch (err) {
|
|
18
20
|
if (err instanceof ExternalHostError) throw err;
|
|
19
21
|
logger.debug(`Preset file ${fileName} not found in ${repo}: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":[],"sources":["../../../../lib/config/presets/gitea/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport {
|
|
1
|
+
{"version":3,"file":"common.js","names":[],"sources":["../../../../lib/config/presets/gitea/common.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { getRepoFile } from '../../../modules/platform/gitea/files.ts';\nimport type { RepoContents } from '../../../modules/platform/gitea/schema.ts';\nimport { API_PATH } from '../../../modules/platform/gitea/utils.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport type { Nullish } from '../../../types/index.ts';\nimport type { GiteaHttp } from '../../../util/http/gitea.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport type { Preset, PresetConfig } from '../types.ts';\nimport {\n PRESET_DEP_NOT_FOUND,\n PRESET_INVALID,\n fetchPreset,\n parsePreset,\n} from '../util.ts';\n\nexport interface GiteaPresetSource {\n fetchJSONFile: (\n repo: string,\n fileName: string,\n endpoint: string,\n tag?: string | null,\n ) => Promise<Nullish<Preset>>;\n getPresetFromEndpoint: (\n repo: string,\n filePreset: string,\n presetPath?: string,\n endpoint?: string,\n tag?: string,\n ) => Promise<Nullish<Preset>>;\n getPreset: (config: PresetConfig) => Promise<Nullish<Preset>>;\n}\n\n/**\n * Builds the preset source of a platform which speaks the Gitea API.\n *\n * Forgejo is a fork of Gitea and serves the same contents API, so the Gitea\n * and Forgejo sources only differ in their Http client and default endpoint.\n */\nexport function createPresetSource(\n http: GiteaHttp,\n defaultEndpoint: string,\n): GiteaPresetSource {\n async function fetchJSONFile(\n repo: string,\n fileName: string,\n endpoint: string,\n tag?: string | null,\n ): Promise<Nullish<Preset>> {\n let res: RepoContents;\n try {\n res = await getRepoFile(http, repo, fileName, tag, {\n baseUrl: joinUrlParts(endpoint, API_PATH),\n });\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n `Preset file ${fileName} not found in ${repo}: ${err.message}`,\n );\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n\n let contentString: string;\n if (res.type === 'file') {\n contentString = res.contentString;\n } else {\n logger.debug(\n `Preset ${fileName} has unexpected type '${res.type}'. Only \\`file\\` is supported`,\n );\n throw new Error(PRESET_INVALID);\n }\n return parsePreset(contentString, fileName);\n }\n\n function getPresetFromEndpoint(\n repo: string,\n filePreset: string,\n presetPath?: string,\n endpoint = defaultEndpoint,\n tag?: string,\n ): Promise<Nullish<Preset>> {\n return fetchPreset({\n repo,\n filePreset,\n presetPath,\n endpoint,\n tag,\n fetch: fetchJSONFile,\n });\n }\n\n function getPreset({\n repo,\n presetName = 'default',\n presetPath,\n tag,\n }: PresetConfig): Promise<Nullish<Preset>> {\n return getPresetFromEndpoint(\n repo,\n presetName,\n presetPath,\n defaultEndpoint,\n tag,\n );\n }\n\n return { fetchJSONFile, getPresetFromEndpoint, getPreset };\n}\n"],"mappings":";;;;;;;;;;;;;AAuCA,SAAgB,mBACd,MACA,iBACmB;CACnB,eAAe,cACb,MACA,UACA,UACA,KAC0B;EAC1B,IAAI;EACJ,IAAI;GACF,MAAM,MAAM,YAAY,MAAM,MAAM,UAAU,KAAK,EACjD,SAAS,aAAa,UAAU,QAAQ,EAC1C,CAAC;EACH,SAAS,KAAK;GACZ,IAAI,eAAe,mBACjB,MAAM;GAER,OAAO,MACL,eAAe,SAAS,gBAAgB,KAAK,IAAI,IAAI,SACvD;GACA,MAAM,IAAI,MAAM,oBAAoB;EACtC;EAEA,IAAI;EACJ,IAAI,IAAI,SAAS,QACf,gBAAgB,IAAI;OACf;GACL,OAAO,MACL,UAAU,SAAS,wBAAwB,IAAI,KAAK,8BACtD;GACA,MAAM,IAAI,MAAM,cAAc;EAChC;EACA,OAAO,YAAY,eAAe,QAAQ;CAC5C;CAEA,SAAS,sBACP,MACA,YACA,YACA,WAAW,iBACX,KAC0B;EAC1B,OAAO,YAAY;GACjB;GACA;GACA;GACA;GACA;GACA,OAAO;EACT,CAAC;CACH;CAEA,SAAS,UAAU,EACjB,MACA,aAAa,WACb,YACA,OACyC;EACzC,OAAO,sBACL,MACA,YACA,YACA,iBACA,GACF;CACF;CAEA,OAAO;EAAE;EAAe;EAAuB;CAAU;AAC3D"}
|
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
import { fromBase64 } from "../../../util/string.js";
|
|
2
1
|
import { logger } from "../../../logger/index.js";
|
|
3
2
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
4
3
|
import { PRESET_DEP_NOT_FOUND, fetchPreset, parsePreset } from "../util.js";
|
|
5
4
|
import { GithubHttp } from "../../../util/http/github.js";
|
|
6
5
|
import { repoCacheProvider } from "../../../util/http/cache/repository-http-cache-provider.js";
|
|
7
|
-
import {
|
|
6
|
+
import { getRepoFile } from "../../../modules/platform/github/files.js";
|
|
8
7
|
//#region lib/config/presets/github/index.ts
|
|
9
8
|
const Endpoint = "https://api.github.com/";
|
|
10
9
|
const http = new GithubHttp();
|
|
11
10
|
async function fetchJSONFile(repo, fileName, endpoint, tag) {
|
|
12
|
-
let
|
|
13
|
-
if (isNonEmptyString(tag)) ref = `?ref=${tag}`;
|
|
14
|
-
const url = `${endpoint}repos/${repo}/contents/${fileName}${ref}`;
|
|
15
|
-
logger.trace({ url }, `Preset URL`);
|
|
16
|
-
let res;
|
|
11
|
+
let content;
|
|
17
12
|
try {
|
|
18
|
-
|
|
13
|
+
content = await getRepoFile(http, repo, fileName, tag, {
|
|
14
|
+
baseUrl: endpoint,
|
|
15
|
+
cacheProvider: repoCacheProvider
|
|
16
|
+
});
|
|
19
17
|
} catch (err) {
|
|
20
18
|
if (err instanceof ExternalHostError) throw err;
|
|
21
19
|
logger.debug(`Preset file ${fileName} not found in ${repo}: ${err.message}`);
|
|
22
20
|
throw new Error(PRESET_DEP_NOT_FOUND);
|
|
23
21
|
}
|
|
24
|
-
return parsePreset(
|
|
22
|
+
return parsePreset(content, fileName);
|
|
25
23
|
}
|
|
26
24
|
function getPresetFromEndpoint(repo, filePreset, presetPath, endpoint = Endpoint, tag) {
|
|
27
25
|
return fetchPreset({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/config/presets/github/index.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/config/presets/github/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { getRepoFile } from '../../../modules/platform/github/files.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport type { Nullish } from '../../../types/index.ts';\nimport { repoCacheProvider } from '../../../util/http/cache/repository-http-cache-provider.ts';\nimport { GithubHttp } from '../../../util/http/github.ts';\nimport type { Preset, PresetConfig } from '../types.ts';\nimport { PRESET_DEP_NOT_FOUND, fetchPreset, parsePreset } from '../util.ts';\n\nexport const Endpoint = 'https://api.github.com/';\n\nconst http = new GithubHttp();\n\nexport async function fetchJSONFile(\n repo: string,\n fileName: string,\n endpoint: string,\n tag?: string,\n): Promise<Nullish<Preset>> {\n let content: string;\n try {\n content = await getRepoFile(http, repo, fileName, tag, {\n baseUrl: endpoint,\n cacheProvider: repoCacheProvider,\n });\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n `Preset file ${fileName} not found in ${repo}: ${err.message}`,\n );\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n\n return parsePreset(content, fileName);\n}\n\nexport function getPresetFromEndpoint(\n repo: string,\n filePreset: string,\n presetPath?: string,\n endpoint = Endpoint,\n tag?: string,\n): Promise<Nullish<Preset>> {\n return fetchPreset({\n repo,\n filePreset,\n presetPath,\n endpoint,\n tag,\n fetch: fetchJSONFile,\n });\n}\n\nexport function getPreset({\n repo,\n presetName = 'default',\n presetPath,\n tag,\n}: PresetConfig): Promise<Nullish<Preset>> {\n return getPresetFromEndpoint(repo, presetName, presetPath, Endpoint, tag);\n}\n"],"mappings":";;;;;;;AASA,MAAa,WAAW;AAExB,MAAM,OAAO,IAAI,WAAW;AAE5B,eAAsB,cACpB,MACA,UACA,UACA,KAC0B;CAC1B,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,YAAY,MAAM,MAAM,UAAU,KAAK;GACrD,SAAS;GACT,eAAe;EACjB,CAAC;CACH,SAAS,KAAK;EACZ,IAAI,eAAe,mBACjB,MAAM;EAER,OAAO,MACL,eAAe,SAAS,gBAAgB,KAAK,IAAI,IAAI,SACvD;EACA,MAAM,IAAI,MAAM,oBAAoB;CACtC;CAEA,OAAO,YAAY,SAAS,QAAQ;AACtC;AAEA,SAAgB,sBACd,MACA,YACA,YACA,WAAW,UACX,KAC0B;CAC1B,OAAO,YAAY;EACjB;EACA;EACA;EACA;EACA;EACA,OAAO;CACT,CAAC;AACH;AAEA,SAAgB,UAAU,EACxB,MACA,aAAa,WACb,YACA,OACyC;CACzC,OAAO,sBAAsB,MAAM,YAAY,YAAY,UAAU,GAAG;AAC1E"}
|
|
@@ -2,31 +2,20 @@ import { logger } from "../../../logger/index.js";
|
|
|
2
2
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
3
3
|
import { PRESET_DEP_NOT_FOUND, fetchPreset, parsePreset } from "../util.js";
|
|
4
4
|
import { GitlabHttp } from "../../../util/http/gitlab.js";
|
|
5
|
-
import {
|
|
5
|
+
import { getRepoFile } from "../../../modules/platform/gitlab/files.js";
|
|
6
6
|
//#region lib/config/presets/gitlab/index.ts
|
|
7
7
|
const gitlabApi = new GitlabHttp();
|
|
8
8
|
const Endpoint = "https://gitlab.com/api/v4/";
|
|
9
|
-
async function getDefaultBranchName(urlEncodedPkgName, endpoint) {
|
|
10
|
-
return (await gitlabApi.getJsonUnchecked(`${endpoint}projects/${urlEncodedPkgName}`)).body.default_branch ?? "master";
|
|
11
|
-
}
|
|
12
9
|
async function fetchJSONFile(repo, fileName, endpoint, tag) {
|
|
13
|
-
let
|
|
14
|
-
let ref = "";
|
|
15
|
-
let res;
|
|
10
|
+
let content;
|
|
16
11
|
try {
|
|
17
|
-
|
|
18
|
-
const urlEncodedPkgName = encodeURIComponent(fileName);
|
|
19
|
-
if (isNonEmptyString(tag)) ref = `?ref=${tag}`;
|
|
20
|
-
else ref = `?ref=${await getDefaultBranchName(urlEncodedRepo, endpoint)}`;
|
|
21
|
-
url += `projects/${urlEncodedRepo}/repository/files/${urlEncodedPkgName}/raw${ref}`;
|
|
22
|
-
logger.trace({ url }, `Preset URL`);
|
|
23
|
-
res = await gitlabApi.getText(url);
|
|
12
|
+
content = await getRepoFile(gitlabApi, encodeURIComponent(repo), fileName, tag, { baseUrl: endpoint });
|
|
24
13
|
} catch (err) {
|
|
25
14
|
if (err instanceof ExternalHostError) throw err;
|
|
26
15
|
logger.debug(`Preset file ${fileName} not found in ${repo}: ${err.message}`);
|
|
27
16
|
throw new Error(PRESET_DEP_NOT_FOUND);
|
|
28
17
|
}
|
|
29
|
-
return parsePreset(
|
|
18
|
+
return parsePreset(content, fileName);
|
|
30
19
|
}
|
|
31
20
|
function getPresetFromEndpoint(repo, presetName, presetPath, endpoint = Endpoint, tag) {
|
|
32
21
|
return fetchPreset({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/config/presets/gitlab/index.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/config/presets/gitlab/index.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { getRepoFile } from '../../../modules/platform/gitlab/files.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport type { Nullish } from '../../../types/index.ts';\nimport { GitlabHttp } from '../../../util/http/gitlab.ts';\nimport type { Preset, PresetConfig } from '../types.ts';\nimport { PRESET_DEP_NOT_FOUND, fetchPreset, parsePreset } from '../util.ts';\n\nconst gitlabApi = new GitlabHttp();\nexport const Endpoint = 'https://gitlab.com/api/v4/';\n\nexport async function fetchJSONFile(\n repo: string,\n fileName: string,\n endpoint: string,\n tag?: string,\n): Promise<Nullish<Preset>> {\n let content: string;\n try {\n content = await getRepoFile(\n gitlabApi,\n encodeURIComponent(repo),\n fileName,\n tag,\n { baseUrl: endpoint },\n );\n } catch (err) {\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.debug(\n `Preset file ${fileName} not found in ${repo}: ${err.message}`,\n );\n throw new Error(PRESET_DEP_NOT_FOUND);\n }\n\n return parsePreset(content, fileName);\n}\n\nexport function getPresetFromEndpoint(\n repo: string,\n presetName: string,\n presetPath?: string,\n endpoint = Endpoint,\n tag?: string,\n): Promise<Nullish<Preset>> {\n return fetchPreset({\n repo,\n filePreset: presetName,\n presetPath,\n endpoint,\n tag,\n fetch: fetchJSONFile,\n });\n}\n\nexport function getPreset({\n repo,\n presetPath,\n presetName = 'default',\n tag,\n}: PresetConfig): Promise<Nullish<Preset>> {\n return getPresetFromEndpoint(repo, presetName, presetPath, Endpoint, tag);\n}\n"],"mappings":";;;;;;AAQA,MAAM,YAAY,IAAI,WAAW;AACjC,MAAa,WAAW;AAExB,eAAsB,cACpB,MACA,UACA,UACA,KAC0B;CAC1B,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,YACd,WACA,mBAAmB,IAAI,GACvB,UACA,KACA,EAAE,SAAS,SAAS,CACtB;CACF,SAAS,KAAK;EACZ,IAAI,eAAe,mBACjB,MAAM;EAER,OAAO,MACL,eAAe,SAAS,gBAAgB,KAAK,IAAI,IAAI,SACvD;EACA,MAAM,IAAI,MAAM,oBAAoB;CACtC;CAEA,OAAO,YAAY,SAAS,QAAQ;AACtC;AAEA,SAAgB,sBACd,MACA,YACA,YACA,WAAW,UACX,KAC0B;CAC1B,OAAO,YAAY;EACjB;EACA,YAAY;EACZ;EACA;EACA;EACA,OAAO;CACT,CAAC;AACH;AAEA,SAAgB,UAAU,EACxB,MACA,YACA,aAAa,WACb,OACyC;CACzC,OAAO,sBAAsB,MAAM,YAAY,YAAY,UAAU,GAAG;AAC1E"}
|
|
@@ -12,48 +12,100 @@ const PLATFORM_HOST_TYPES = [
|
|
|
12
12
|
"local",
|
|
13
13
|
"scm-manager"
|
|
14
14
|
];
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Capabilities of each platform family, so that a consumer which detected a
|
|
17
|
+
* family with `detectPlatform` can look the rest up instead of carrying its own
|
|
18
|
+
* mapping.
|
|
19
|
+
*
|
|
20
|
+
* Keys are ordered the way `detectPlatform` used to test them; both the
|
|
21
|
+
* `apiUsingHostTypes` and the `knownHosts` sets are pairwise disjoint
|
|
22
|
+
*/
|
|
23
|
+
const PLATFORM_FAMILIES = {
|
|
24
|
+
azure: {
|
|
25
|
+
apiUsingHostTypes: ["azure", "azure-tags"],
|
|
26
|
+
knownHosts: ["dev.azure.com"],
|
|
27
|
+
tagsDatasource: "azure-tags",
|
|
28
|
+
apiBaseUrl: null,
|
|
29
|
+
webDirPath: "tree/HEAD"
|
|
30
|
+
},
|
|
31
|
+
"bitbucket-server": {
|
|
32
|
+
apiUsingHostTypes: [
|
|
33
|
+
"bitbucket-server",
|
|
34
|
+
"bitbucket-server-changelog",
|
|
35
|
+
"bitbucket-server-tags"
|
|
36
|
+
],
|
|
37
|
+
knownHosts: [],
|
|
38
|
+
tagsDatasource: "bitbucket-server-tags",
|
|
39
|
+
apiBaseUrl: (baseUrl) => `${baseUrl}rest/api/1.0/`,
|
|
40
|
+
webDirPath: "browse"
|
|
41
|
+
},
|
|
42
|
+
bitbucket: {
|
|
43
|
+
apiUsingHostTypes: [
|
|
44
|
+
"bitbucket",
|
|
45
|
+
"bitbucket-changelog",
|
|
46
|
+
"bitbucket-tags"
|
|
47
|
+
],
|
|
48
|
+
knownHosts: ["bitbucket.org", "bitbucket.com"],
|
|
49
|
+
tagsDatasource: "bitbucket-tags",
|
|
50
|
+
apiBaseUrl: (_baseUrl) => "https://api.bitbucket.org/",
|
|
51
|
+
webDirPath: "src/HEAD"
|
|
52
|
+
},
|
|
53
|
+
forgejo: {
|
|
54
|
+
apiUsingHostTypes: [
|
|
55
|
+
"forgejo",
|
|
56
|
+
"forgejo-changelog",
|
|
57
|
+
"forgejo-releases",
|
|
58
|
+
"forgejo-tags"
|
|
59
|
+
],
|
|
60
|
+
knownHosts: ["codeberg.org", "codefloe.com"],
|
|
61
|
+
tagsDatasource: "forgejo-tags",
|
|
62
|
+
apiBaseUrl: (baseUrl) => `${baseUrl}api/v1/`,
|
|
63
|
+
webDirPath: "tree/HEAD"
|
|
64
|
+
},
|
|
65
|
+
gitea: {
|
|
66
|
+
apiUsingHostTypes: [
|
|
67
|
+
"gitea",
|
|
68
|
+
"gitea-changelog",
|
|
69
|
+
"gitea-releases",
|
|
70
|
+
"gitea-tags"
|
|
71
|
+
],
|
|
72
|
+
knownHosts: ["gitea.com"],
|
|
73
|
+
tagsDatasource: "gitea-tags",
|
|
74
|
+
apiBaseUrl: (baseUrl) => `${baseUrl}api/v1/`,
|
|
75
|
+
webDirPath: "tree/HEAD"
|
|
76
|
+
},
|
|
77
|
+
github: {
|
|
78
|
+
apiUsingHostTypes: [
|
|
79
|
+
"github",
|
|
80
|
+
"github-releases",
|
|
81
|
+
"github-release-attachments",
|
|
82
|
+
"github-tags",
|
|
83
|
+
"pod",
|
|
84
|
+
"hermit",
|
|
85
|
+
"github-changelog",
|
|
86
|
+
"conan"
|
|
87
|
+
],
|
|
88
|
+
knownHosts: ["github.com"],
|
|
89
|
+
tagsDatasource: "github-tags",
|
|
90
|
+
apiBaseUrl: (baseUrl) => baseUrl.startsWith("https://github.com/") ? "https://api.github.com/" : `${baseUrl}api/v3/`,
|
|
91
|
+
webDirPath: "tree/HEAD"
|
|
92
|
+
},
|
|
93
|
+
gitlab: {
|
|
94
|
+
apiUsingHostTypes: [
|
|
95
|
+
"gitlab",
|
|
96
|
+
"gitlab-releases",
|
|
97
|
+
"gitlab-tags",
|
|
98
|
+
"gitlab-packages",
|
|
99
|
+
"gitlab-changelog",
|
|
100
|
+
"pypi"
|
|
101
|
+
],
|
|
102
|
+
knownHosts: ["gitlab.com"],
|
|
103
|
+
tagsDatasource: "gitlab-tags",
|
|
104
|
+
apiBaseUrl: (baseUrl) => `${baseUrl}api/v4/`,
|
|
105
|
+
webDirPath: "tree/HEAD"
|
|
106
|
+
}
|
|
107
|
+
};
|
|
56
108
|
//#endregion
|
|
57
|
-
export {
|
|
109
|
+
export { PLATFORM_FAMILIES, PLATFORM_HOST_TYPES };
|
|
58
110
|
|
|
59
111
|
//# sourceMappingURL=platforms.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platforms.js","names":[],"sources":["../../lib/constants/platforms.ts"],"sourcesContent":["export const PLATFORM_HOST_TYPES = [\n 'azure',\n 'bitbucket',\n 'bitbucket-server',\n 'codecommit',\n 'forgejo',\n 'gerrit',\n 'gitea',\n 'github',\n 'gitlab',\n 'local',\n 'scm-manager',\n] as const;\n\nexport type PlatformId = (typeof PLATFORM_HOST_TYPES)[number];\n\
|
|
1
|
+
{"version":3,"file":"platforms.js","names":[],"sources":["../../lib/constants/platforms.ts"],"sourcesContent":["export const PLATFORM_HOST_TYPES = [\n 'azure',\n 'bitbucket',\n 'bitbucket-server',\n 'codecommit',\n 'forgejo',\n 'gerrit',\n 'gitea',\n 'github',\n 'gitlab',\n 'local',\n 'scm-manager',\n] as const;\n\nexport type PlatformId = (typeof PLATFORM_HOST_TYPES)[number];\n\n/**\n * The platform families Renovate can recognize from a URL.\n *\n * A family groups every flavour of one platform - the vendor's public instance\n * plus any self-hosted installation - because they share an API, a tags\n * datasource and a web UI layout.\n *\n * Every family is a `PlatformId`, but not every platform is a family:\n * `codecommit`, `gerrit`, `local` and `scm-manager` are never recognized from a\n * URL, so they have nothing to describe here.\n */\nconst PLATFORM_FAMILY_IDS = [\n 'azure',\n 'bitbucket',\n 'bitbucket-server',\n 'forgejo',\n 'gitea',\n 'github',\n 'gitlab',\n] as const satisfies readonly PlatformId[];\n\nexport type PlatformFamilyId = (typeof PLATFORM_FAMILY_IDS)[number];\n\nexport interface PlatformFamily {\n /**\n * `hostType` values which authenticate against this family's API, so a\n * hostRule for any of them identifies a host as belonging to the family.\n */\n apiUsingHostTypes: string[];\n\n /**\n * Hostnames `detectPlatform` recognizes as this family outright. Hosts which\n * are not listed are matched by its name heuristics or by a hostRule, so this\n * is a recognition list and says nothing about datasource defaults.\n */\n knownHosts: string[];\n\n /** Datasource which looks up git tags on this family. */\n tagsDatasource: `${PlatformFamilyId}-tags`;\n\n /**\n * Derives the API base URL from the web base URL, which always ends in a\n * slash. `null` for families Renovate has no API client for.\n */\n apiBaseUrl: ((baseUrl: string) => string) | null;\n\n /** Web UI path from a repository root to a directory at the default branch. */\n webDirPath: string;\n}\n\n/**\n * Capabilities of each platform family, so that a consumer which detected a\n * family with `detectPlatform` can look the rest up instead of carrying its own\n * mapping.\n *\n * Keys are ordered the way `detectPlatform` used to test them; both the\n * `apiUsingHostTypes` and the `knownHosts` sets are pairwise disjoint\n */\nexport const PLATFORM_FAMILIES = {\n azure: {\n apiUsingHostTypes: ['azure', 'azure-tags'],\n knownHosts: ['dev.azure.com'],\n tagsDatasource: 'azure-tags',\n apiBaseUrl: null,\n webDirPath: 'tree/HEAD',\n },\n 'bitbucket-server': {\n apiUsingHostTypes: [\n 'bitbucket-server',\n 'bitbucket-server-changelog',\n 'bitbucket-server-tags',\n ],\n // Bitbucket Data Center is self-hosted only.\n knownHosts: [] as string[],\n tagsDatasource: 'bitbucket-server-tags',\n apiBaseUrl: (baseUrl: string) => `${baseUrl}rest/api/1.0/`,\n webDirPath: 'browse',\n },\n bitbucket: {\n apiUsingHostTypes: ['bitbucket', 'bitbucket-changelog', 'bitbucket-tags'],\n knownHosts: ['bitbucket.org', 'bitbucket.com'],\n tagsDatasource: 'bitbucket-tags',\n // Bitbucket Cloud serves every instance from one API host.\n apiBaseUrl: (_baseUrl: string) => 'https://api.bitbucket.org/',\n webDirPath: 'src/HEAD',\n },\n forgejo: {\n apiUsingHostTypes: [\n 'forgejo',\n 'forgejo-changelog',\n 'forgejo-releases',\n 'forgejo-tags',\n ],\n knownHosts: ['codeberg.org', 'codefloe.com'],\n tagsDatasource: 'forgejo-tags',\n apiBaseUrl: (baseUrl: string) => `${baseUrl}api/v1/`,\n webDirPath: 'tree/HEAD',\n },\n gitea: {\n apiUsingHostTypes: [\n 'gitea',\n 'gitea-changelog',\n 'gitea-releases',\n 'gitea-tags',\n ],\n knownHosts: ['gitea.com'],\n tagsDatasource: 'gitea-tags',\n apiBaseUrl: (baseUrl: string) => `${baseUrl}api/v1/`,\n webDirPath: 'tree/HEAD',\n },\n github: {\n apiUsingHostTypes: [\n 'github',\n 'github-releases',\n 'github-release-attachments',\n 'github-tags',\n 'pod',\n 'hermit',\n 'github-changelog',\n 'conan',\n // DEPRECATED: do not add additional datasource-specific entries here, if they use `api.github.com` to look up new versions\n ],\n knownHosts: ['github.com'],\n tagsDatasource: 'github-tags',\n // Same rule as `getApiBaseUrl`, @see lib/util/github/url.ts. That helper is\n // not reused here because `lib/constants` imports nothing, and because it\n // also normalizes URLs which already carry an API path, which a base URL\n // built from a `protocol//host/` pair never does.\n apiBaseUrl: (baseUrl: string) =>\n baseUrl.startsWith('https://github.com/')\n ? 'https://api.github.com/'\n : `${baseUrl}api/v3/`,\n webDirPath: 'tree/HEAD',\n },\n gitlab: {\n apiUsingHostTypes: [\n 'gitlab',\n 'gitlab-releases',\n 'gitlab-tags',\n 'gitlab-packages',\n 'gitlab-changelog',\n 'pypi',\n ],\n knownHosts: ['gitlab.com'],\n tagsDatasource: 'gitlab-tags',\n apiBaseUrl: (baseUrl: string) => `${baseUrl}api/v4/`,\n webDirPath: 'tree/HEAD',\n },\n} satisfies Record<PlatformFamilyId, PlatformFamily>;\n"],"mappings":";AAAA,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;;AA8DA,MAAa,oBAAoB;CAC/B,OAAO;EACL,mBAAmB,CAAC,SAAS,YAAY;EACzC,YAAY,CAAC,eAAe;EAC5B,gBAAgB;EAChB,YAAY;EACZ,YAAY;CACd;CACA,oBAAoB;EAClB,mBAAmB;GACjB;GACA;GACA;EACF;EAEA,YAAY,CAAC;EACb,gBAAgB;EAChB,aAAa,YAAoB,GAAG,QAAQ;EAC5C,YAAY;CACd;CACA,WAAW;EACT,mBAAmB;GAAC;GAAa;GAAuB;EAAgB;EACxE,YAAY,CAAC,iBAAiB,eAAe;EAC7C,gBAAgB;EAEhB,aAAa,aAAqB;EAClC,YAAY;CACd;CACA,SAAS;EACP,mBAAmB;GACjB;GACA;GACA;GACA;EACF;EACA,YAAY,CAAC,gBAAgB,cAAc;EAC3C,gBAAgB;EAChB,aAAa,YAAoB,GAAG,QAAQ;EAC5C,YAAY;CACd;CACA,OAAO;EACL,mBAAmB;GACjB;GACA;GACA;GACA;EACF;EACA,YAAY,CAAC,WAAW;EACxB,gBAAgB;EAChB,aAAa,YAAoB,GAAG,QAAQ;EAC5C,YAAY;CACd;CACA,QAAQ;EACN,mBAAmB;GACjB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EAEF;EACA,YAAY,CAAC,YAAY;EACzB,gBAAgB;EAKhB,aAAa,YACX,QAAQ,WAAW,qBAAqB,IACpC,4BACA,GAAG,QAAQ;EACjB,YAAY;CACd;CACA,QAAQ;EACN,mBAAmB;GACjB;GACA;GACA;GACA;GACA;GACA;EACF;EACA,YAAY,CAAC,YAAY;EACzB,gBAAgB;EAChB,aAAa,YAAoB,GAAG,QAAQ;EAC5C,YAAY;CACd;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { withCache } from "../../../util/cache/package/with-cache.js";
|
|
2
2
|
import { Datasource } from "../datasource.js";
|
|
3
3
|
import { RpmXmlMetadataProvider } from "./providers/xml.js";
|
|
4
|
-
import {
|
|
4
|
+
import { fetchPrimaryUrl } from "./repomd.js";
|
|
5
5
|
//#region lib/modules/datasource/rpm/index.ts
|
|
6
6
|
var RpmDatasource = class RpmDatasource extends Datasource {
|
|
7
7
|
static id = "rpm";
|
|
@@ -34,8 +34,8 @@ var RpmDatasource = class RpmDatasource extends Datasource {
|
|
|
34
34
|
async _getReleases({ registryUrl, packageName }) {
|
|
35
35
|
if (!registryUrl || !packageName) return null;
|
|
36
36
|
try {
|
|
37
|
-
const
|
|
38
|
-
return await this.getReleasesByPackageName(
|
|
37
|
+
const primaryUrl = await this.getPrimaryUrl(registryUrl);
|
|
38
|
+
return await this.getReleasesByPackageName(primaryUrl, packageName);
|
|
39
39
|
} catch (err) {
|
|
40
40
|
this.handleGenericErrors(err);
|
|
41
41
|
}
|
|
@@ -48,15 +48,15 @@ var RpmDatasource = class RpmDatasource extends Datasource {
|
|
|
48
48
|
fallback: true
|
|
49
49
|
}, () => this._getReleases(config));
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
getPrimaryUrl(registryUrl) {
|
|
52
52
|
return withCache({
|
|
53
53
|
namespace: `datasource-${RpmDatasource.id}`,
|
|
54
54
|
key: registryUrl,
|
|
55
55
|
ttlMinutes: 1440
|
|
56
|
-
}, () =>
|
|
56
|
+
}, () => fetchPrimaryUrl(this.http, registryUrl));
|
|
57
57
|
}
|
|
58
|
-
getReleasesByPackageName(
|
|
59
|
-
return this.xmlProvider.getReleases(
|
|
58
|
+
getReleasesByPackageName(primaryUrl, packageName) {
|
|
59
|
+
return this.xmlProvider.getReleases(primaryUrl, packageName);
|
|
60
60
|
}
|
|
61
61
|
};
|
|
62
62
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/rpm/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\nimport { RpmXmlMetadataProvider } from './providers/xml.ts';\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/datasource/rpm/index.ts"],"sourcesContent":["import { withCache } from '../../../util/cache/package/with-cache.ts';\nimport { Datasource } from '../datasource.ts';\nimport type { GetReleasesConfig, ReleaseResult } from '../types.ts';\nimport { datasource } from './common.ts';\nimport { RpmXmlMetadataProvider } from './providers/xml.ts';\nimport { fetchPrimaryUrl } from './repomd.ts';\n\nexport class RpmDatasource extends Datasource {\n static readonly id = datasource;\n\n private readonly xmlProvider: RpmXmlMetadataProvider;\n\n constructor() {\n super(RpmDatasource.id);\n this.xmlProvider = new RpmXmlMetadataProvider(this.http);\n }\n\n /**\n * Users are able to specify custom RPM repositories as long as they follow the format.\n * There is a URI http://linux.duke.edu/metadata/common in the <sha>-primary.xml.\n * But according to this post, it's not something we can really look into or reference.\n * @see{https://lists.rpm.org/pipermail/rpm-ecosystem/2015-October/000283.html}\n */\n override readonly customRegistrySupport = true;\n\n /**\n * Users can specify multiple repositories and the datasource will aggregate the releases\n * @example\n * Every Fedora release has \"release\" and \"updates\" repositories.\n * To get the latest package version, these repositories should be aggregated.\n */\n override readonly registryStrategy = 'merge';\n\n /**\n * Fetches the release information for a given package from the registry URL.\n *\n * @param registryUrl - the registryUrl should be the folder which contains repodata.xml and its corresponding file list <sha256>-primary.xml.gz, e.g.: https://packages.microsoft.com/azurelinux/3.0/prod/cloud-native/x86_64/repodata/\n * @param packageName - the name of the package to fetch releases for.\n * @returns The release result if the package is found, otherwise null.\n */\n private async _getReleases({\n registryUrl,\n packageName,\n }: GetReleasesConfig): Promise<ReleaseResult | null> {\n if (!registryUrl || !packageName) {\n return null;\n }\n\n try {\n const primaryUrl = await this.getPrimaryUrl(registryUrl);\n return await this.getReleasesByPackageName(primaryUrl, packageName);\n } catch (err) {\n this.handleGenericErrors(err);\n }\n }\n\n getReleases(config: GetReleasesConfig): Promise<ReleaseResult | null> {\n return withCache(\n {\n namespace: `datasource-${RpmDatasource.id}`,\n key: `${config.registryUrl}:${config.packageName}`,\n ttlMinutes: 1440,\n fallback: true,\n },\n () => this._getReleases(config),\n );\n }\n\n getPrimaryUrl(registryUrl: string): Promise<string> {\n return withCache(\n {\n namespace: `datasource-${RpmDatasource.id}`,\n key: registryUrl,\n ttlMinutes: 1440,\n },\n () => fetchPrimaryUrl(this.http, registryUrl),\n );\n }\n\n getReleasesByPackageName(\n primaryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n return this.xmlProvider.getReleases(primaryUrl, packageName);\n }\n}\n"],"mappings":";;;;;AAOA,IAAa,gBAAb,MAAa,sBAAsB,WAAW;CAC5C,OAAgB,KAAA;CAEhB;CAEA,cAAc;EACZ,MAAM,cAAc,EAAE;EACtB,KAAK,cAAc,IAAI,uBAAuB,KAAK,IAAI;CACzD;;;;;;;CAQA,wBAA0C;;;;;;;CAQ1C,mBAAqC;;;;;;;;CASrC,MAAc,aAAa,EACzB,aACA,eACmD;EACnD,IAAI,CAAC,eAAe,CAAC,aACnB,OAAO;EAGT,IAAI;GACF,MAAM,aAAa,MAAM,KAAK,cAAc,WAAW;GACvD,OAAO,MAAM,KAAK,yBAAyB,YAAY,WAAW;EACpE,SAAS,KAAK;GACZ,KAAK,oBAAoB,GAAG;EAC9B;CACF;CAEA,YAAY,QAA0D;EACpE,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK,GAAG,OAAO,YAAY,GAAG,OAAO;GACrC,YAAY;GACZ,UAAU;EACZ,SACM,KAAK,aAAa,MAAM,CAChC;CACF;CAEA,cAAc,aAAsC;EAClD,OAAO,UACL;GACE,WAAW,cAAc,cAAc;GACvC,KAAK;GACL,YAAY;EACd,SACM,gBAAgB,KAAK,MAAM,WAAW,CAC9C;CACF;CAEA,yBACE,YACA,aAC+B;EAC/B,OAAO,KAAK,YAAY,YAAY,YAAY,WAAW;CAC7D;AACF"}
|
|
@@ -35,7 +35,7 @@ async function checkIfModified(url, lastDownloadTimestamp, http) {
|
|
|
35
35
|
return true;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
async function
|
|
38
|
+
async function downloadFileToCache(url, cachePath, http, lastDownloadTimestamp) {
|
|
39
39
|
let needsToDownload = true;
|
|
40
40
|
if (lastDownloadTimestamp) needsToDownload = await checkIfModified(url, lastDownloadTimestamp, http);
|
|
41
41
|
if (!needsToDownload) {
|
|
@@ -43,52 +43,52 @@ async function downloadGzipFile(url, compressedFile, http, lastDownloadTimestamp
|
|
|
43
43
|
return false;
|
|
44
44
|
}
|
|
45
45
|
const readStream = http.stream(url);
|
|
46
|
-
const writeStream = createCacheWriteStream(
|
|
46
|
+
const writeStream = createCacheWriteStream(cachePath);
|
|
47
47
|
await pipeline(readStream, writeStream);
|
|
48
|
-
const compressedStats = await statCacheFile(
|
|
48
|
+
const compressedStats = await statCacheFile(cachePath);
|
|
49
49
|
if (!compressedStats || compressedStats.size === 0) {
|
|
50
50
|
logger.debug(`Empty response body from getting ${url}.`);
|
|
51
51
|
throw new Error(`Empty response body from getting ${url}.`);
|
|
52
52
|
}
|
|
53
53
|
return true;
|
|
54
54
|
}
|
|
55
|
-
async function
|
|
56
|
-
await pipeline(createCacheReadStream(compressedFile), createGunzip(), createCacheWriteStream(
|
|
55
|
+
async function decompressFile(compressedFile, decompressedFile) {
|
|
56
|
+
await pipeline(createCacheReadStream(compressedFile), createGunzip(), createCacheWriteStream(decompressedFile));
|
|
57
57
|
}
|
|
58
|
-
async function
|
|
59
|
-
const releaseLock = await acquireLock(`
|
|
58
|
+
async function getCachedDecompressedFile(http, url, extension) {
|
|
59
|
+
const releaseLock = await acquireLock(`decompressed-file:${url}:${extension}`, "datasource-rpm");
|
|
60
60
|
try {
|
|
61
61
|
const cacheDir = await ensureCacheDir(cacheSubDir);
|
|
62
62
|
const urlHash = toSha256(url);
|
|
63
|
-
const
|
|
64
|
-
let lastTimestamp = await getFileCreationTime(
|
|
63
|
+
const decompressedFile = upath.join(cacheDir, `${urlHash}.${extension}`);
|
|
64
|
+
let lastTimestamp = await getFileCreationTime(decompressedFile);
|
|
65
65
|
const compressedFile = upath.join(cacheDir, `${randomUUID()}_${urlHash}.gz`);
|
|
66
|
-
const
|
|
66
|
+
const decompressedTempFile = upath.join(cacheDir, `${randomUUID()}_${urlHash}.${extension}`);
|
|
67
67
|
try {
|
|
68
|
-
if (await
|
|
69
|
-
await
|
|
70
|
-
await renameCacheFile(
|
|
71
|
-
lastTimestamp = await getFileCreationTime(
|
|
68
|
+
if (await downloadFileToCache(url, compressedFile, http, lastTimestamp) || !lastTimestamp) try {
|
|
69
|
+
await decompressFile(compressedFile, decompressedTempFile);
|
|
70
|
+
await renameCacheFile(decompressedTempFile, decompressedFile);
|
|
71
|
+
lastTimestamp = await getFileCreationTime(decompressedFile);
|
|
72
72
|
} catch (err) {
|
|
73
73
|
logger.warn({
|
|
74
74
|
compressedFile,
|
|
75
75
|
err,
|
|
76
76
|
extension,
|
|
77
|
-
|
|
77
|
+
decompressedFile,
|
|
78
78
|
url
|
|
79
79
|
}, "Failed to extract RPM metadata file from compressed file");
|
|
80
80
|
}
|
|
81
81
|
if (!lastTimestamp) throw new Error("Missing metadata in extracted RPM metadata file!");
|
|
82
|
-
return
|
|
82
|
+
return decompressedFile;
|
|
83
83
|
} finally {
|
|
84
84
|
if (await cachePathExists(compressedFile)) await rmCache(compressedFile);
|
|
85
|
-
if (await cachePathExists(
|
|
85
|
+
if (await cachePathExists(decompressedTempFile)) await rmCache(decompressedTempFile);
|
|
86
86
|
}
|
|
87
87
|
} finally {
|
|
88
88
|
releaseLock();
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
//#endregion
|
|
92
|
-
export { buildReleaseResult, formatRpmVersion,
|
|
92
|
+
export { buildReleaseResult, formatRpmVersion, getCachedDecompressedFile };
|
|
93
93
|
|
|
94
94
|
//# sourceMappingURL=common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["fs.statCacheFile","fs.createCacheWriteStream","fs.pipeline","fs.createCacheReadStream","fs.ensureCacheDir","fs.renameCacheFile","fs.cachePathExists","fs.rmCache"],"sources":["../../../../../lib/modules/datasource/rpm/providers/common.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { createGunzip } from 'node:zlib';\nimport { isNullOrUndefined } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport type { Http, HttpOptions } from '../../../../util/http/index.ts';\nimport { acquireLock } from '../../../../util/mutex.ts';\nimport type { ReleaseResult } from '../../types.ts';\nimport { datasource } from '../common.ts';\n\nconst cacheSubDir = datasource;\n\ntype RpmVersionValue = boolean | number | string | null | undefined;\n\nexport function formatRpmVersion(\n ver: RpmVersionValue,\n rel?: RpmVersionValue,\n): string | null {\n if (isNullOrUndefined(ver)) {\n return null;\n }\n\n const version = String(ver);\n\n if (isNullOrUndefined(rel)) {\n return version;\n }\n\n return `${version}-${String(rel)}`;\n}\n\nexport function buildReleaseResult(\n versions: Iterable<string>,\n): ReleaseResult | null {\n const uniqueVersions = [...new Set(versions)];\n\n if (uniqueVersions.length === 0) {\n return null;\n }\n\n return {\n releases: uniqueVersions.map((version) => ({ version })),\n };\n}\n\nasync function getFileCreationTime(\n filePath: string,\n): Promise<Date | undefined> {\n const stats = await fs.statCacheFile(filePath);\n return stats?.ctime;\n}\n\nasync function checkIfModified(\n url: string,\n lastDownloadTimestamp: Date,\n http: Http,\n): Promise<boolean> {\n const options: HttpOptions = {\n headers: {\n 'If-Modified-Since': lastDownloadTimestamp.toUTCString(),\n },\n };\n\n try {\n const response = await http.head(url, options);\n return response.statusCode !== 304;\n } catch (err) {\n logger.warn(\n {\n err,\n lastDownloadTimestamp,\n url,\n },\n 'Could not determine if metadata file is modified since last download',\n );\n return true;\n }\n}\n\nasync function
|
|
1
|
+
{"version":3,"file":"common.js","names":["fs.statCacheFile","fs.createCacheWriteStream","fs.pipeline","fs.createCacheReadStream","fs.ensureCacheDir","fs.renameCacheFile","fs.cachePathExists","fs.rmCache"],"sources":["../../../../../lib/modules/datasource/rpm/providers/common.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { createGunzip } from 'node:zlib';\nimport { isNullOrUndefined } from '@sindresorhus/is';\nimport upath from 'upath';\nimport { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport type { Http, HttpOptions } from '../../../../util/http/index.ts';\nimport { acquireLock } from '../../../../util/mutex.ts';\nimport type { ReleaseResult } from '../../types.ts';\nimport { datasource } from '../common.ts';\n\nconst cacheSubDir = datasource;\n\ntype RpmVersionValue = boolean | number | string | null | undefined;\n\nexport function formatRpmVersion(\n ver: RpmVersionValue,\n rel?: RpmVersionValue,\n): string | null {\n if (isNullOrUndefined(ver)) {\n return null;\n }\n\n const version = String(ver);\n\n if (isNullOrUndefined(rel)) {\n return version;\n }\n\n return `${version}-${String(rel)}`;\n}\n\nexport function buildReleaseResult(\n versions: Iterable<string>,\n): ReleaseResult | null {\n const uniqueVersions = [...new Set(versions)];\n\n if (uniqueVersions.length === 0) {\n return null;\n }\n\n return {\n releases: uniqueVersions.map((version) => ({ version })),\n };\n}\n\nasync function getFileCreationTime(\n filePath: string,\n): Promise<Date | undefined> {\n const stats = await fs.statCacheFile(filePath);\n return stats?.ctime;\n}\n\nasync function checkIfModified(\n url: string,\n lastDownloadTimestamp: Date,\n http: Http,\n): Promise<boolean> {\n const options: HttpOptions = {\n headers: {\n 'If-Modified-Since': lastDownloadTimestamp.toUTCString(),\n },\n };\n\n try {\n const response = await http.head(url, options);\n return response.statusCode !== 304;\n } catch (err) {\n logger.warn(\n {\n err,\n lastDownloadTimestamp,\n url,\n },\n 'Could not determine if metadata file is modified since last download',\n );\n return true;\n }\n}\n\nasync function downloadFileToCache(\n url: string,\n cachePath: string,\n http: Http,\n lastDownloadTimestamp?: Date,\n): Promise<boolean> {\n let needsToDownload = true;\n\n if (lastDownloadTimestamp) {\n needsToDownload = await checkIfModified(url, lastDownloadTimestamp, http);\n }\n\n if (!needsToDownload) {\n logger.debug(`No need to download ${url}, file is up to date.`);\n return false;\n }\n\n const readStream = http.stream(url);\n const writeStream = fs.createCacheWriteStream(cachePath);\n await fs.pipeline(readStream, writeStream);\n\n const compressedStats = await fs.statCacheFile(cachePath);\n if (!compressedStats || compressedStats.size === 0) {\n logger.debug(`Empty response body from getting ${url}.`);\n throw new Error(`Empty response body from getting ${url}.`);\n }\n\n return true;\n}\n\nasync function decompressFile(\n compressedFile: string,\n decompressedFile: string,\n): Promise<void> {\n await fs.pipeline(\n fs.createCacheReadStream(compressedFile),\n createGunzip(),\n fs.createCacheWriteStream(decompressedFile),\n );\n}\n\nexport async function getCachedDecompressedFile(\n http: Http,\n url: string,\n extension: 'xml',\n): Promise<string> {\n const releaseLock = await acquireLock(\n `decompressed-file:${url}:${extension}`,\n 'datasource-rpm',\n );\n\n try {\n const cacheDir = await fs.ensureCacheDir(cacheSubDir);\n const urlHash = toSha256(url);\n const decompressedFile = upath.join(cacheDir, `${urlHash}.${extension}`);\n let lastTimestamp = await getFileCreationTime(decompressedFile);\n\n const compressedFile = upath.join(\n cacheDir,\n `${randomUUID()}_${urlHash}.gz`,\n );\n const decompressedTempFile = upath.join(\n cacheDir,\n `${randomUUID()}_${urlHash}.${extension}`,\n );\n\n try {\n const wasUpdated = await downloadFileToCache(\n url,\n compressedFile,\n http,\n lastTimestamp,\n );\n\n if (wasUpdated || !lastTimestamp) {\n try {\n // Only replace the shared cache file after a successful decompress.\n await decompressFile(compressedFile, decompressedTempFile);\n await fs.renameCacheFile(decompressedTempFile, decompressedFile);\n lastTimestamp = await getFileCreationTime(decompressedFile);\n } catch (err) {\n logger.warn(\n {\n compressedFile,\n err,\n extension,\n decompressedFile,\n url,\n },\n 'Failed to extract RPM metadata file from compressed file',\n );\n }\n }\n\n if (!lastTimestamp) {\n throw new Error('Missing metadata in extracted RPM metadata file!');\n }\n\n return decompressedFile;\n } finally {\n if (await fs.cachePathExists(compressedFile)) {\n await fs.rmCache(compressedFile);\n }\n if (await fs.cachePathExists(decompressedTempFile)) {\n await fs.rmCache(decompressedTempFile);\n }\n }\n } finally {\n releaseLock();\n }\n}\n"],"mappings":";;;;;;;;;AAYA,MAAM,cAAA;AAIN,SAAgB,iBACd,KACA,KACe;CACf,IAAI,kBAAkB,GAAG,GACvB,OAAO;CAGT,MAAM,UAAU,OAAO,GAAG;CAE1B,IAAI,kBAAkB,GAAG,GACvB,OAAO;CAGT,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG;AACjC;AAEA,SAAgB,mBACd,UACsB;CACtB,MAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;CAE5C,IAAI,eAAe,WAAW,GAC5B,OAAO;CAGT,OAAO,EACL,UAAU,eAAe,KAAK,aAAa,EAAE,QAAQ,EAAE,EACzD;AACF;AAEA,eAAe,oBACb,UAC2B;CAE3B,QAAO,MADaA,cAAiB,QAAQ,EAAA,EAC/B;AAChB;AAEA,eAAe,gBACb,KACA,uBACA,MACkB;CAClB,MAAM,UAAuB,EAC3B,SAAS,EACP,qBAAqB,sBAAsB,YAAY,EACzD,EACF;CAEA,IAAI;EAEF,QAAO,MADgB,KAAK,KAAK,KAAK,OAAO,EAAA,CAC7B,eAAe;CACjC,SAAS,KAAK;EACZ,OAAO,KACL;GACE;GACA;GACA;EACF,GACA,sEACF;EACA,OAAO;CACT;AACF;AAEA,eAAe,oBACb,KACA,WACA,MACA,uBACkB;CAClB,IAAI,kBAAkB;CAEtB,IAAI,uBACF,kBAAkB,MAAM,gBAAgB,KAAK,uBAAuB,IAAI;CAG1E,IAAI,CAAC,iBAAiB;EACpB,OAAO,MAAM,uBAAuB,IAAI,sBAAsB;EAC9D,OAAO;CACT;CAEA,MAAM,aAAa,KAAK,OAAO,GAAG;CAClC,MAAM,cAAcC,uBAA0B,SAAS;CACvD,MAAMC,SAAY,YAAY,WAAW;CAEzC,MAAM,kBAAkB,MAAMF,cAAiB,SAAS;CACxD,IAAI,CAAC,mBAAmB,gBAAgB,SAAS,GAAG;EAClD,OAAO,MAAM,oCAAoC,IAAI,EAAE;EACvD,MAAM,IAAI,MAAM,oCAAoC,IAAI,EAAE;CAC5D;CAEA,OAAO;AACT;AAEA,eAAe,eACb,gBACA,kBACe;CACf,MAAME,SACJC,sBAAyB,cAAc,GACvC,aAAa,GACbF,uBAA0B,gBAAgB,CAC5C;AACF;AAEA,eAAsB,0BACpB,MACA,KACA,WACiB;CACjB,MAAM,cAAc,MAAM,YACxB,qBAAqB,IAAI,GAAG,aAC5B,gBACF;CAEA,IAAI;EACF,MAAM,WAAW,MAAMG,eAAkB,WAAW;EACpD,MAAM,UAAU,SAAS,GAAG;EAC5B,MAAM,mBAAmB,MAAM,KAAK,UAAU,GAAG,QAAQ,GAAG,WAAW;EACvE,IAAI,gBAAgB,MAAM,oBAAoB,gBAAgB;EAE9D,MAAM,iBAAiB,MAAM,KAC3B,UACA,GAAG,WAAW,EAAE,GAAG,QAAQ,IAC7B;EACA,MAAM,uBAAuB,MAAM,KACjC,UACA,GAAG,WAAW,EAAE,GAAG,QAAQ,GAAG,WAChC;EAEA,IAAI;GAQF,IAAI,MAPqB,oBACvB,KACA,gBACA,MACA,aACF,KAEkB,CAAC,eACjB,IAAI;IAEF,MAAM,eAAe,gBAAgB,oBAAoB;IACzD,MAAMC,gBAAmB,sBAAsB,gBAAgB;IAC/D,gBAAgB,MAAM,oBAAoB,gBAAgB;GAC5D,SAAS,KAAK;IACZ,OAAO,KACL;KACE;KACA;KACA;KACA;KACA;IACF,GACA,0DACF;GACF;GAGF,IAAI,CAAC,eACH,MAAM,IAAI,MAAM,kDAAkD;GAGpE,OAAO;EACT,UAAU;GACR,IAAI,MAAMC,gBAAmB,cAAc,GACzC,MAAMC,QAAW,cAAc;GAEjC,IAAI,MAAMD,gBAAmB,oBAAoB,GAC/C,MAAMC,QAAW,oBAAoB;EAEzC;CACF,UAAU;EACR,YAAY;CACd;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { logger } from "../../../../logger/index.js";
|
|
2
2
|
import { createCacheReadStream } from "../../../../util/fs/index.js";
|
|
3
|
-
import { buildReleaseResult, formatRpmVersion,
|
|
3
|
+
import { buildReleaseResult, formatRpmVersion, getCachedDecompressedFile } from "./common.js";
|
|
4
4
|
import sax from "sax";
|
|
5
5
|
//#region lib/modules/datasource/rpm/providers/xml.ts
|
|
6
6
|
var RpmXmlMetadataProvider = class {
|
|
@@ -8,8 +8,8 @@ var RpmXmlMetadataProvider = class {
|
|
|
8
8
|
constructor(http) {
|
|
9
9
|
this.http = http;
|
|
10
10
|
}
|
|
11
|
-
async getReleases(
|
|
12
|
-
const primaryXmlFile = await
|
|
11
|
+
async getReleases(primaryUrl, packageName) {
|
|
12
|
+
const primaryXmlFile = await getCachedDecompressedFile(this.http, primaryUrl, "xml");
|
|
13
13
|
const releases = /* @__PURE__ */ new Set();
|
|
14
14
|
let insidePackage = false;
|
|
15
15
|
let isTargetPackage = false;
|
|
@@ -44,7 +44,7 @@ var RpmXmlMetadataProvider = class {
|
|
|
44
44
|
saxParser.on("error", (err) => {
|
|
45
45
|
if (settled) return;
|
|
46
46
|
settled = true;
|
|
47
|
-
logger.debug(`SAX parsing error in ${
|
|
47
|
+
logger.debug(`SAX parsing error in ${primaryUrl}: ${err.message}`);
|
|
48
48
|
setImmediate(() => saxParser.removeAllListeners());
|
|
49
49
|
reject(err);
|
|
50
50
|
});
|
|
@@ -56,7 +56,7 @@ var RpmXmlMetadataProvider = class {
|
|
|
56
56
|
createCacheReadStream(primaryXmlFile).pipe(saxParser);
|
|
57
57
|
});
|
|
58
58
|
const result = buildReleaseResult(releases);
|
|
59
|
-
if (!result) logger.trace(`No releases found for package ${packageName} in ${
|
|
59
|
+
if (!result) logger.trace(`No releases found for package ${packageName} in ${primaryUrl}`);
|
|
60
60
|
return result;
|
|
61
61
|
}
|
|
62
62
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml.js","names":[],"sources":["../../../../../lib/modules/datasource/rpm/providers/xml.ts"],"sourcesContent":["import sax from 'sax';\nimport { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport type { ReleaseResult } from '../../types.ts';\nimport {\n buildReleaseResult,\n formatRpmVersion,\n
|
|
1
|
+
{"version":3,"file":"xml.js","names":[],"sources":["../../../../../lib/modules/datasource/rpm/providers/xml.ts"],"sourcesContent":["import sax from 'sax';\nimport { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport type { Http } from '../../../../util/http/index.ts';\nimport type { ReleaseResult } from '../../types.ts';\nimport {\n buildReleaseResult,\n formatRpmVersion,\n getCachedDecompressedFile,\n} from './common.ts';\n\nexport class RpmXmlMetadataProvider {\n private readonly http: Http;\n\n constructor(http: Http) {\n this.http = http;\n }\n\n async getReleases(\n primaryUrl: string,\n packageName: string,\n ): Promise<ReleaseResult | null> {\n const primaryXmlFile = await getCachedDecompressedFile(\n this.http,\n primaryUrl,\n 'xml',\n );\n const releases = new Set<string>();\n let insidePackage = false;\n let isTargetPackage = false;\n let insideName = false;\n\n const saxParser = sax.createStream(true, {\n lowercase: true,\n trim: true,\n });\n\n saxParser.on('opentag', (node: sax.Tag) => {\n if (node.name === 'package' && node.attributes.type === 'rpm') {\n insidePackage = true;\n isTargetPackage = false;\n }\n if (insidePackage && node.name === 'name') {\n insideName = true;\n }\n if (insidePackage && isTargetPackage && node.name === 'version') {\n const version = formatRpmVersion(\n node.attributes.ver,\n node.attributes.rel,\n );\n if (version) {\n releases.add(version);\n }\n }\n });\n saxParser.on('text', (text: string) => {\n if (insidePackage && insideName && text.trim() === packageName) {\n isTargetPackage = true;\n }\n });\n saxParser.on('closetag', (tag: string) => {\n if (tag === 'name' && insidePackage) {\n insideName = false;\n }\n if (tag === 'package') {\n insidePackage = false;\n isTargetPackage = false;\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n saxParser.on('error', (err: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n logger.debug(`SAX parsing error in ${primaryUrl}: ${err.message}`);\n setImmediate(() => saxParser.removeAllListeners());\n reject(err);\n });\n saxParser.on('end', () => {\n settled = true;\n setImmediate(() => saxParser.removeAllListeners());\n resolve();\n });\n fs.createCacheReadStream(primaryXmlFile).pipe(saxParser);\n });\n\n const result = buildReleaseResult(releases);\n if (!result) {\n logger.trace(\n `No releases found for package ${packageName} in ${primaryUrl}`,\n );\n }\n\n return result;\n }\n}\n"],"mappings":";;;;;AAWA,IAAa,yBAAb,MAAoC;CAClC;CAEA,YAAY,MAAY;EACtB,KAAK,OAAO;CACd;CAEA,MAAM,YACJ,YACA,aAC+B;EAC/B,MAAM,iBAAiB,MAAM,0BAC3B,KAAK,MACL,YACA,KACF;EACA,MAAM,2BAAW,IAAI,IAAY;EACjC,IAAI,gBAAgB;EACpB,IAAI,kBAAkB;EACtB,IAAI,aAAa;EAEjB,MAAM,YAAY,IAAI,aAAa,MAAM;GACvC,WAAW;GACX,MAAM;EACR,CAAC;EAED,UAAU,GAAG,YAAY,SAAkB;GACzC,IAAI,KAAK,SAAS,aAAa,KAAK,WAAW,SAAS,OAAO;IAC7D,gBAAgB;IAChB,kBAAkB;GACpB;GACA,IAAI,iBAAiB,KAAK,SAAS,QACjC,aAAa;GAEf,IAAI,iBAAiB,mBAAmB,KAAK,SAAS,WAAW;IAC/D,MAAM,UAAU,iBACd,KAAK,WAAW,KAChB,KAAK,WAAW,GAClB;IACA,IAAI,SACF,SAAS,IAAI,OAAO;GAExB;EACF,CAAC;EACD,UAAU,GAAG,SAAS,SAAiB;GACrC,IAAI,iBAAiB,cAAc,KAAK,KAAK,MAAM,aACjD,kBAAkB;EAEtB,CAAC;EACD,UAAU,GAAG,aAAa,QAAgB;GACxC,IAAI,QAAQ,UAAU,eACpB,aAAa;GAEf,IAAI,QAAQ,WAAW;IACrB,gBAAgB;IAChB,kBAAkB;GACpB;EACF,CAAC;EAED,MAAM,IAAI,SAAe,SAAS,WAAW;GAC3C,IAAI,UAAU;GACd,UAAU,GAAG,UAAU,QAAe;IACpC,IAAI,SACF;IAEF,UAAU;IACV,OAAO,MAAM,wBAAwB,WAAW,IAAI,IAAI,SAAS;IACjE,mBAAmB,UAAU,mBAAmB,CAAC;IACjD,OAAO,GAAG;GACZ,CAAC;GACD,UAAU,GAAG,aAAa;IACxB,UAAU;IACV,mBAAmB,UAAU,mBAAmB,CAAC;IACjD,QAAQ;GACV,CAAC;GACD,sBAAyB,cAAc,CAAC,CAAC,KAAK,SAAS;EACzD,CAAC;EAED,MAAM,SAAS,mBAAmB,QAAQ;EAC1C,IAAI,CAAC,QACH,OAAO,MACL,iCAAiC,YAAY,MAAM,YACrD;EAGF,OAAO;CACT;AACF"}
|
|
@@ -14,7 +14,7 @@ function getPrimaryRepodataUrl(xml, registryUrl, repomdUrl) {
|
|
|
14
14
|
const registryUrlWithoutRepodata = registryUrl.replace(regEx(/\/repodata\/?$/), "/");
|
|
15
15
|
return joinUrlParts(registryUrlWithoutRepodata, href);
|
|
16
16
|
}
|
|
17
|
-
async function
|
|
17
|
+
async function fetchPrimaryUrl(http, registryUrl) {
|
|
18
18
|
const repomdUrl = joinUrlParts(registryUrl, repomdXmlFileName);
|
|
19
19
|
const response = await http.getText(repomdUrl.toString());
|
|
20
20
|
const repomdBody = response.body.trimStart();
|
|
@@ -34,6 +34,6 @@ async function fetchPrimaryGzipUrl(http, registryUrl) {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
//#endregion
|
|
37
|
-
export {
|
|
37
|
+
export { fetchPrimaryUrl };
|
|
38
38
|
|
|
39
39
|
//# sourceMappingURL=repomd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repomd.js","names":[],"sources":["../../../../lib/modules/datasource/rpm/repomd.ts"],"sourcesContent":["import { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { datasource, repomdXmlFileName } from './common.ts';\n\nfunction getPrimaryRepodataUrl(\n xml: XmlDocument,\n registryUrl: string,\n repomdUrl: string,\n): string {\n const primaryData = xml.childWithAttribute('type', 'primary');\n\n if (!primaryData) {\n throw new Error(`No primary data found in ${repomdUrl}`);\n }\n\n const locationElement = primaryData.childNamed('location');\n if (!locationElement) {\n throw new Error(`No location element found in ${repomdUrl}`);\n }\n\n const href = locationElement.attr.href;\n if (!href) {\n throw new Error(`No href found in ${repomdUrl}`);\n }\n\n // replace trailing \"repodata/\" from registryUrl, if it exists, with a \"/\"\n // because href includes \"repodata/\"\n const registryUrlWithoutRepodata = registryUrl.replace(\n regEx(/\\/repodata\\/?$/),\n '/',\n );\n\n return joinUrlParts(registryUrlWithoutRepodata, href);\n}\n\nexport async function
|
|
1
|
+
{"version":3,"file":"repomd.js","names":[],"sources":["../../../../lib/modules/datasource/rpm/repomd.ts"],"sourcesContent":["import { XmlDocument } from 'xmldoc';\nimport { logger } from '../../../logger/index.ts';\nimport type { Http } from '../../../util/http/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { joinUrlParts } from '../../../util/url.ts';\nimport { datasource, repomdXmlFileName } from './common.ts';\n\nfunction getPrimaryRepodataUrl(\n xml: XmlDocument,\n registryUrl: string,\n repomdUrl: string,\n): string {\n const primaryData = xml.childWithAttribute('type', 'primary');\n\n if (!primaryData) {\n throw new Error(`No primary data found in ${repomdUrl}`);\n }\n\n const locationElement = primaryData.childNamed('location');\n if (!locationElement) {\n throw new Error(`No location element found in ${repomdUrl}`);\n }\n\n const href = locationElement.attr.href;\n if (!href) {\n throw new Error(`No href found in ${repomdUrl}`);\n }\n\n // replace trailing \"repodata/\" from registryUrl, if it exists, with a \"/\"\n // because href includes \"repodata/\"\n const registryUrlWithoutRepodata = registryUrl.replace(\n regEx(/\\/repodata\\/?$/),\n '/',\n );\n\n return joinUrlParts(registryUrlWithoutRepodata, href);\n}\n\nexport async function fetchPrimaryUrl(\n http: Http,\n registryUrl: string,\n): Promise<string> {\n const repomdUrl = joinUrlParts(registryUrl, repomdXmlFileName);\n const response = await http.getText(repomdUrl.toString());\n const repomdBody = response.body.trimStart();\n\n // repomd.xml may omit the XML declaration and start directly with the root element\n if (!(repomdBody.startsWith('<?xml') || repomdBody.startsWith('<repomd'))) {\n logger.debug({ datasource, url: repomdUrl }, 'Invalid response format');\n throw new Error(\n `${repomdUrl} is not in XML format. Response body: ${response.body}`,\n );\n }\n\n const xml = new XmlDocument(repomdBody);\n\n try {\n return getPrimaryRepodataUrl(xml, registryUrl, repomdUrl.toString());\n } catch (err) {\n if (\n err instanceof Error &&\n err.message.startsWith('No primary data found')\n ) {\n logger.debug(\n `No primary data found in ${repomdUrl}, xml contents: ${response.body}`,\n );\n }\n\n throw err;\n }\n}\n"],"mappings":";;;;;;AAOA,SAAS,sBACP,KACA,aACA,WACQ;CACR,MAAM,cAAc,IAAI,mBAAmB,QAAQ,SAAS;CAE5D,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,4BAA4B,WAAW;CAGzD,MAAM,kBAAkB,YAAY,WAAW,UAAU;CACzD,IAAI,CAAC,iBACH,MAAM,IAAI,MAAM,gCAAgC,WAAW;CAG7D,MAAM,OAAO,gBAAgB,KAAK;CAClC,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,oBAAoB,WAAW;CAKjD,MAAM,6BAA6B,YAAY,QAC7C,MAAM,gBAAgB,GACtB,GACF;CAEA,OAAO,aAAa,4BAA4B,IAAI;AACtD;AAEA,eAAsB,gBACpB,MACA,aACiB;CACjB,MAAM,YAAY,aAAa,aAAa,iBAAiB;CAC7D,MAAM,WAAW,MAAM,KAAK,QAAQ,UAAU,SAAS,CAAC;CACxD,MAAM,aAAa,SAAS,KAAK,UAAU;CAG3C,IAAI,EAAE,WAAW,WAAW,OAAO,KAAK,WAAW,WAAW,SAAS,IAAI;EACzE,OAAO,MAAM;GAAE,YAAA;GAAY,KAAK;EAAU,GAAG,yBAAyB;EACtE,MAAM,IAAI,MACR,GAAG,UAAU,wCAAwC,SAAS,MAChE;CACF;CAEA,MAAM,MAAM,IAAI,YAAY,UAAU;CAEtC,IAAI;EACF,OAAO,sBAAsB,KAAK,aAAa,UAAU,SAAS,CAAC;CACrE,SAAS,KAAK;EACZ,IACE,eAAe,SACf,IAAI,QAAQ,WAAW,uBAAuB,GAE9C,OAAO,MACL,4BAA4B,UAAU,kBAAkB,SAAS,MACnE;EAGF,MAAM;CACR;AACF"}
|