Skip to content

Commit 688c113

Browse files
authored
Improve registry data extraction for older versions of composer packages (#706)
* feat: enhance registry data extraction for older versions of composer packages * fix: correct proxyquire setup for requestretry in packagistFetch tests * Remove fields marked as __unset in registry data * Add more packagistFetch tests for _extractManifest
1 parent 83e0411 commit 688c113

File tree

3 files changed

+1090
-11
lines changed

3 files changed

+1090
-11
lines changed

providers/fetch/packagistFetch.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,31 +39,46 @@ class PackagistFetch extends AbstractFetch {
3939
}
4040

4141
async _getRegistryData(spec) {
42-
let registryData
4342
const baseUrl = providerMap.packagist
4443
const { body, statusCode } = await requestRetry.get(`${baseUrl}p2/${spec.namespace}/${spec.name}.json`, {
4544
json: true
4645
})
4746
if (statusCode !== 200 || !body) return null
48-
registryData = body
47+
const registryData = body
4948

5049
// Get the array of versions for this package
5150
const packageVersions = registryData.packages[`${spec.namespace}/${spec.name}`]
51+
registryData.manifest = this._extractManifest(packageVersions, spec)
52+
if (!registryData.manifest) return null
53+
54+
registryData.releaseDate = get(registryData, 'manifest.time')
55+
delete registryData['packages']
56+
return registryData
57+
}
58+
59+
_extractManifest(packageVersions, spec) {
5260
if (!packageVersions || !Array.isArray(packageVersions)) return null
5361

5462
// Find the specific version in the array - handle both 'v1.0.0' and '1.0.0' formats
5563
const targetVersion = spec.revision
5664
const targetVersionWithV = `v${spec.revision}`
5765

58-
registryData.manifest = packageVersions.find(
66+
const targetIndex = packageVersions.findIndex(
5967
versionObj => versionObj.version === targetVersion || versionObj.version === targetVersionWithV
6068
)
69+
if (targetIndex === -1) return null
6170

62-
if (!registryData.manifest) return null
63-
64-
registryData.releaseDate = get(registryData, 'manifest.time')
65-
delete registryData['packages']
66-
return registryData
71+
const combined = {}
72+
for (let i = 0; i <= targetIndex; i++) {
73+
for (const [key, value] of Object.entries(packageVersions[i])) {
74+
if (value === '__unset') {
75+
delete combined[key]
76+
} else {
77+
combined[key] = value
78+
}
79+
}
80+
}
81+
return combined
6782
}
6883

6984
async _getPackage(request, registryData, destination) {

0 commit comments

Comments
 (0)