| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- #!/usr/bin/env bun
- import { $ } from "bun"
- import pkg from "../package.json"
- const dry = process.argv.includes("--dry")
- const snapshot = process.argv.includes("--snapshot")
- const version = snapshot
- ? `0.0.0-${new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "")}`
- : await $`git describe --tags --exact-match HEAD`
- .text()
- .then((x) => x.substring(1).trim())
- .catch(() => {
- console.error("tag not found")
- process.exit(1)
- })
- console.log(`publishing ${version}`)
- const GOARCH: Record<string, string> = {
- arm64: "arm64",
- x64: "amd64",
- }
- const targets = [
- ["linux", "arm64"],
- ["linux", "x64"],
- ["darwin", "x64"],
- ["darwin", "arm64"],
- ["windows", "x64"],
- ]
- await $`rm -rf dist`
- const optionalDependencies: Record<string, string> = {}
- const npmTag = snapshot ? "snapshot" : "latest"
- for (const [os, arch] of targets) {
- console.log(`building ${os}-${arch}`)
- const name = `${pkg.name}-${os}-${arch}`
- await $`mkdir -p dist/${name}/bin`
- await $`GOOS=${os} GOARCH=${GOARCH[arch]} go build -ldflags="-s -w -X main.Version=${version}" -o ../opencode/dist/${name}/bin/tui ../tui/cmd/opencode/main.go`.cwd(
- "../tui",
- )
- await $`bun build --define OPENCODE_VERSION="'${version}'" --compile --minify --target=bun-${os}-${arch} --outfile=dist/${name}/bin/opencode ./src/index.ts ./dist/${name}/bin/tui`
- await $`rm -rf ./dist/${name}/bin/tui`
- await Bun.file(`dist/${name}/package.json`).write(
- JSON.stringify(
- {
- name,
- version,
- os: [os === "windows" ? "win32" : os],
- cpu: [arch],
- },
- null,
- 2,
- ),
- )
- if (!dry)
- await $`cd dist/${name} && bun publish --access public --tag ${npmTag}`
- optionalDependencies[name] = version
- }
- await $`mkdir -p ./dist/${pkg.name}`
- await $`cp -r ./bin ./dist/${pkg.name}/bin`
- await $`cp ./script/postinstall.js ./dist/${pkg.name}/postinstall.js`
- await Bun.file(`./dist/${pkg.name}/package.json`).write(
- JSON.stringify(
- {
- name: pkg.name + "-ai",
- bin: {
- [pkg.name]: `./bin/${pkg.name}`,
- },
- scripts: {
- postinstall: "node ./postinstall.js",
- },
- version,
- optionalDependencies,
- },
- null,
- 2,
- ),
- )
- if (!dry)
- await $`cd ./dist/${pkg.name} && bun publish --access public --tag ${npmTag}`
- if (!snapshot) {
- // Github Release
- for (const key of Object.keys(optionalDependencies)) {
- await $`cd dist/${key}/bin && zip -r ../../${key}.zip *`
- }
- const previous = await fetch(
- "https://api.github.com/repos/sst/opencode/releases/latest",
- )
- .then((res) => res.json())
- .then((data) => data.tag_name)
- const commits = await fetch(
- `https://api.github.com/repos/sst/opencode/compare/${previous}...HEAD`,
- )
- .then((res) => res.json())
- .then((data) => data.commits || [])
- const notes = commits
- .map((commit: any) => `- ${commit.commit.message.split("\n")[0]}`)
- .filter((x: string) => {
- const lower = x.toLowerCase()
- return (
- !lower.includes("chore:") &&
- !lower.includes("ci:") &&
- !lower.includes("docs:")
- )
- })
- .join("\n")
- if (!dry)
- await $`gh release create v${version} --title "v${version}" --notes ${notes} ./dist/*.zip`
- // AUR package
- const pkgbuildTemplate = await Bun.file("./script/PKGBUILD.template").text()
- const pkgbuild = pkgbuildTemplate
- .replace("{{VERSION}}", version.split("-")[0])
- .replace(
- "{{ARM64_URL}}",
- `https://github.com/sst/opencode/releases/download/v${version}/opencode-linux-arm64.zip`,
- )
- .replace(
- "{{ARM64_SHA}}",
- await $`sha256sum ./dist/opencode-linux-arm64.zip | cut -d' ' -f1`
- .text()
- .then((x) => x.trim()),
- )
- .replace(
- "{{X64_URL}}",
- `https://github.com/sst/opencode/releases/download/v${version}/opencode-linux-x64.zip`,
- )
- .replace(
- "{{X64_SHA}}",
- await $`sha256sum ./dist/opencode-linux-x64.zip | cut -d' ' -f1`
- .text()
- .then((x) => x.trim()),
- )
- await $`rm -rf ./dist/aur-opencode-bin`
- const gitEnv: Record<string, string> = process.env["AUR_KEY"]
- ? { GIT_SSH_COMMAND: `ssh -i ${process.env["AUR_KEY"]}` }
- : {}
- await $`git clone ssh://[email protected]/opencode-bin.git ./dist/aur-opencode-bin`.env(
- gitEnv,
- )
- await Bun.file("./dist/aur-opencode-bin/PKGBUILD").write(pkgbuild)
- await $`cd ./dist/aur-opencode-bin && makepkg --printsrcinfo > .SRCINFO`
- await $`cd ./dist/aur-opencode-bin && git add PKGBUILD .SRCINFO`.env(gitEnv)
- await $`cd ./dist/aur-opencode-bin && git commit -m "Update to v${version}"`.env(
- gitEnv,
- )
- if (!dry) await $`cd ./dist/aur-opencode-bin && git push`.env(gitEnv)
- }
|