version.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #!/usr/bin/env bun
  2. import { Script } from "@opencode-ai/script"
  3. import { $ } from "bun"
  4. import { Effect } from "effect"
  5. const tag = `v${Script.version}`
  6. const sha = process.env.GITHUB_SHA ?? (await $`git rev-parse HEAD`.text()).trim()
  7. const betaPreview = Script.preview && Script.channel === "beta"
  8. const changelog = Effect.promise(() => $`bun script/changelog.ts --to ${sha}`.cwd(process.cwd()))
  9. const readNotes = Effect.promise(() => Bun.file(`${process.cwd()}/UPCOMING_CHANGELOG.md`).text()).pipe(
  10. Effect.catchAll(() => Effect.succeed("No notable changes")),
  11. )
  12. const writeOutput = (lines: ReadonlyArray<string>) =>
  13. process.env.GITHUB_OUTPUT
  14. ? Effect.promise(() => Bun.write(process.env.GITHUB_OUTPUT!, lines.join("\n")))
  15. : Effect.void
  16. const createRelease = (notesFile?: string) => {
  17. if (!notesFile && betaPreview) {
  18. return Effect.promise(
  19. () => $`gh release create ${tag} -d --target ${sha} --title ${tag} --repo ${process.env.GH_REPO}`,
  20. )
  21. }
  22. if (notesFile)
  23. return Effect.promise(() => $`gh release create ${tag} -d --target ${sha} --title ${tag} --notes-file ${notesFile}`)
  24. return Effect.void
  25. }
  26. const viewRelease = betaPreview
  27. ? Effect.promise(() => $`gh release view ${tag} --json tagName,databaseId --repo ${process.env.GH_REPO}`.json())
  28. : Effect.promise(() => $`gh release view ${tag} --json tagName,databaseId`.json())
  29. const output = Effect.gen(function* () {
  30. const lines = [`version=${Script.version}`]
  31. if (!Script.preview) {
  32. yield* changelog
  33. const body = yield* readNotes
  34. const notesFile = `${process.env.RUNNER_TEMP ?? "/tmp"}/opencode-release-notes.txt`
  35. yield* Effect.promise(() => Bun.write(notesFile, body))
  36. yield* createRelease(notesFile)
  37. const release = yield* viewRelease
  38. lines.push(`release=${release.databaseId}`, `tag=${release.tagName}`)
  39. } else if (Script.channel === "beta") {
  40. yield* createRelease()
  41. const release = yield* viewRelease
  42. lines.push(`release=${release.databaseId}`, `tag=${release.tagName}`)
  43. }
  44. lines.push(`repo=${process.env.GH_REPO}`)
  45. yield* writeOutput(lines)
  46. })
  47. await Effect.runPromise(output)