(args, deps)
| 58 | ]); |
| 59 | |
| 60 | async function runReuseCommand(args, deps) { |
| 61 | deps = deps || {}; |
| 62 | const out = deps.out || process.stdout; |
| 63 | const parsed = parseReuseArgs(args || []); |
| 64 | const machineJson = parsed.jsonOut || out === process.stdout; |
| 65 | const write = (value, code) => writeJson(out, value, code, deps, machineJson); |
| 66 | if (!parsed.ok) return write(reuseFailure(parsed.reason, parsed.message), 1); |
| 67 | return withMachineJsonConsole(machineJson, deps, async () => { |
| 68 | try { |
| 69 | const asset = deps.fetchAssetById |
| 70 | ? await deps.fetchAssetById(parsed.assetId) |
| 71 | : await fetchAssetById(parsed.assetId, deps); |
| 72 | if (!asset) return write(reuseFailure('not_found', 'asset not found'), 1); |
| 73 | const cleaned = stripHubMetadata(asset); |
| 74 | const verifiedId = verifyReuseAssetId(cleaned, parsed.assetId); |
| 75 | if (!verifiedId.ok) { |
| 76 | return write(reuseFailure('internal_error', 'asset integrity verification failed'), 1); |
| 77 | } |
| 78 | if (!isReuseAssetStoreStable(cleaned)) { |
| 79 | return write(reuseFailure('internal_error', 'asset integrity verification failed'), 1); |
| 80 | } |
| 81 | const store = prepareReuseAssetStore(cleaned, deps); |
| 82 | const provenance = prepareHubProvenance(deps); |
| 83 | markHubProvenance(parsed.assetId, deps, provenance); |
| 84 | let storedId; |
| 85 | try { |
| 86 | storedId = storeReusedAsset(cleaned, deps, store); |
| 87 | if (storedId !== parsed.assetId) { |
| 88 | throw new ContractError('internal_error', 'asset integrity verification failed'); |
| 89 | } |
| 90 | } catch (e) { |
| 91 | rollbackHubProvenance(provenance); |
| 92 | throw e; |
| 93 | } |
| 94 | return write({ |
| 95 | ok: true, |
| 96 | contract: REUSE_CONTRACT, |
| 97 | status: 'ok', |
| 98 | asset_id: storedId, |
| 99 | action: 'reused', |
| 100 | }, 0); |
| 101 | } catch (e) { |
| 102 | const f = classifyError(e, 'reuse'); |
| 103 | return write(reuseFailure(f.reason, f.message), 1); |
| 104 | } |
| 105 | }); |
| 106 | } |
| 107 | |
| 108 | async function runPublishCommand(args, deps) { |
| 109 | deps = deps || {}; |
no test coverage detected