verify-wrapper-public-remotes.mjs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { spawnSync } from 'node:child_process'
  2. import { readFile } from 'node:fs/promises'
  3. import { dirname, join, resolve } from 'node:path'
  4. import { fileURLToPath } from 'node:url'
  5. const scriptDir = dirname(fileURLToPath(import.meta.url))
  6. const sourceRoot = resolve(scriptDir, '..')
  7. const args = process.argv.slice(2)
  8. const selectedHosts = new Set(
  9. args
  10. .filter(arg => arg.startsWith('--host='))
  11. .map(arg => arg.slice('--host='.length))
  12. )
  13. const allowedHosts = new Set(['github', 'gitee'])
  14. for (const host of selectedHosts) {
  15. if (!allowedHosts.has(host)) {
  16. throw new Error(`Unsupported host ${host}. Use --host=github or --host=gitee.`)
  17. }
  18. }
  19. const hosts = selectedHosts.size ? [...selectedHosts] : [...allowedHosts]
  20. const wrapperManifest = JSON.parse(
  21. await readFile(join(sourceRoot, 'ecosystem', 'wrappers.json'), 'utf8')
  22. )
  23. function lsRemote(url) {
  24. const result = spawnSync('git', ['ls-remote', '--heads', url], {
  25. cwd: sourceRoot,
  26. encoding: 'utf8',
  27. stdio: 'pipe',
  28. timeout: 20_000
  29. })
  30. if (result.status !== 0) {
  31. const detail = (result.stderr || result.stdout || '').trim()
  32. throw new Error(detail || `git ls-remote failed for ${url}`)
  33. }
  34. return result.stdout
  35. .trim()
  36. .split('\n')
  37. .filter(Boolean)
  38. .map(line => line.split('\t')[1]?.replace('refs/heads/', ''))
  39. .filter(Boolean)
  40. }
  41. const failures = []
  42. let checked = 0
  43. const targets = [
  44. {
  45. id: 'core',
  46. github: wrapperManifest.corePackage.github,
  47. gitee: wrapperManifest.corePackage.gitee
  48. },
  49. ...wrapperManifest.wrappers
  50. ]
  51. for (const wrapper of targets) {
  52. for (const host of hosts) {
  53. const url = wrapper[host]
  54. checked += 1
  55. let branches
  56. try {
  57. branches = lsRemote(url)
  58. } catch (error) {
  59. failures.push(`${wrapper.id} ${host} repository is not reachable: ${url}\n${error.message}`)
  60. continue
  61. }
  62. if (!branches.includes('main')) {
  63. failures.push(`${wrapper.id} ${host} repository is missing main branch: ${url}`)
  64. continue
  65. }
  66. console.log(`${host}\t${wrapper.id}\tok\t${url}`)
  67. }
  68. }
  69. if (failures.length) {
  70. throw new Error(`Public core/component remote verification failed:\n${failures.join('\n')}`)
  71. }
  72. console.log(`Verified ${checked} public core/component remotes.`)