Skip to content

Commit 791848d

Browse files
mikolalysenkoclaude
andcommitted
Read composer.json through the VEX discovery context
The source-install veto read composer.json directly, which the VEX discovery rules forbid: every extractor reads through DiscoverCtx so unreadable files are diagnosed and Socket identities are recognized. Also add the golden entries for the dist-mirrors-before-url fixture. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1 parent 0e3d9ce commit 791848d

2 files changed

Lines changed: 53 additions & 10 deletions

File tree

‎crates/socket-patch-core/src/vex/discover/composer.rs‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,13 @@ struct InstallPreference {
9494
}
9595

9696
impl InstallPreference {
97-
/// Read quietly: composer.json is not a lock, and a missing or
98-
/// unparseable one leaves composer's default.
99-
async fn load(ctx: &DiscoverCtx<'_>, lock: &Value) -> Self {
100-
let preferred_install =
101-
crate::utils::fs::read_regular_to_string(&ctx.root.join(COMPOSER_JSON))
102-
.await
103-
.ok()
104-
.and_then(|text| serde_json::from_str::<Value>(&text).ok())
105-
.and_then(|manifest| manifest.get("config")?.get("preferred-install").cloned());
97+
/// A missing or unparseable composer.json leaves composer's default.
98+
async fn load(ctx: &DiscoverCtx<'_>, lock: &Value, out: &mut Discovery) -> Self {
99+
let preferred_install = ctx
100+
.read_text(COMPOSER_JSON, out)
101+
.await
102+
.and_then(|text| serde_json::from_str::<Value>(&text).ok())
103+
.and_then(|manifest| manifest.get("config")?.get("preferred-install").cloned());
106104
Self {
107105
preferred_install,
108106
plugin_api_version: lock
@@ -202,7 +200,7 @@ pub(crate) async fn extract(ctx: &DiscoverCtx<'_>, out: &mut Discovery) {
202200
);
203201
return;
204202
}
205-
let preference = InstallPreference::load(ctx, &doc).await;
203+
let preference = InstallPreference::load(ctx, &doc, out).await;
206204
// The inventory's own walk: `packages` then `packages-dev` (a missing
207205
// or non-array section — composer writes `"packages-dev": []`, older /
208206
// hand-trimmed locks may omit it — is simply empty).

‎crates/socket-patch-core/tests/fixtures/vex-discover-golden/redirect-composer.json‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,51 @@
126126
"elsewhere": [],
127127
"live_claims": []
128128
},
129+
"redirect/composer/composer-lock/dist-mirrors-before-url/expected": {
130+
"refs": [
131+
{
132+
"purl": "pkg:composer/monolog/monolog@2.0.0",
133+
"uuid": "44444444-4444-4444-4444-444444444444",
134+
"mode": "hosted",
135+
"source_file": "composer.lock",
136+
"artifact_rel": null,
137+
"locked_integrity": "Sha1Hex(\"abcdef0123456789abcdef0123456789abcdef01\")",
138+
"integrity_required": true,
139+
"url": "https://patch.socket.dev/patch/composer/monolog/monolog/2.0.0/11111111-1111-1111-1111-111111111111/44444444-4444-4444-4444-444444444444/monolog-2.0.0.zip",
140+
"lockfile_basis_ok": true
141+
}
142+
],
143+
"diagnostics": [],
144+
"recognized": [
145+
{
146+
"uuid": "11111111-1111-1111-1111-111111111111",
147+
"mode": "hosted",
148+
"file": "composer.lock"
149+
},
150+
{
151+
"uuid": "44444444-4444-4444-4444-444444444444",
152+
"mode": "hosted",
153+
"file": "composer.lock"
154+
}
155+
],
156+
"unlocked_pins": [],
157+
"elsewhere": [],
158+
"live_claims": [
159+
{
160+
"mode": "hosted",
161+
"uuid": "44444444-4444-4444-4444-444444444444",
162+
"purl": "pkg:composer/monolog/monolog@2.0.0"
163+
}
164+
]
165+
},
166+
"redirect/composer/composer-lock/dist-mirrors-before-url/input": {
167+
"refs": [],
168+
"diagnostics": [],
169+
"recognized": [],
170+
"unlocked_pins": [],
171+
"elsewhere": [],
172+
"live_claims": []
173+
},
129174
"redirect/composer/composer-lock/dist-mirrors/expected": {
130175
"refs": [
131176
{

0 commit comments

Comments
 (0)