68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package embeddedpostgres
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
// VersionStrategy provides a strategy that can be used to determine which version of Postgres should be used based on
|
|
// the operating system, architecture and desired Postgres version.
|
|
type VersionStrategy func() (operatingSystem string, architecture string, postgresVersion PostgresVersion)
|
|
|
|
func defaultVersionStrategy(config Config, goos, arch string, linuxMachineName func() string, shouldUseAlpineLinuxBuild func() bool) VersionStrategy {
|
|
return func() (string, string, PostgresVersion) {
|
|
goos := goos
|
|
arch := arch
|
|
|
|
if goos == "linux" {
|
|
// the zonkyio/embedded-postgres-binaries project produces
|
|
// arm binaries with the following name schema:
|
|
// 32bit: arm32v6 / arm32v7
|
|
// 64bit (aarch64): arm64v8
|
|
if arch == "arm64" {
|
|
arch += "v8"
|
|
} else if arch == "arm" {
|
|
machineName := linuxMachineName()
|
|
if strings.HasPrefix(machineName, "armv7") {
|
|
arch += "32v7"
|
|
} else if strings.HasPrefix(machineName, "armv6") {
|
|
arch += "32v6"
|
|
}
|
|
}
|
|
|
|
if shouldUseAlpineLinuxBuild() {
|
|
arch += "-alpine"
|
|
}
|
|
}
|
|
|
|
// postgres below version 14.2 is not available for macos on arm
|
|
if goos == "darwin" && arch == "arm64" {
|
|
var majorVer, minorVer int
|
|
if _, err := fmt.Sscanf(string(config.version), "%d.%d", &majorVer, &minorVer); err == nil &&
|
|
(majorVer < 14 || (majorVer == 14 && minorVer < 2)) {
|
|
arch = "amd64"
|
|
} else {
|
|
arch += "v8"
|
|
}
|
|
}
|
|
|
|
return goos, arch, config.version
|
|
}
|
|
}
|
|
|
|
func linuxMachineName() string {
|
|
var uname string
|
|
|
|
if output, err := exec.Command("uname", "-m").Output(); err == nil {
|
|
uname = string(output)
|
|
}
|
|
|
|
return uname
|
|
}
|
|
|
|
func shouldUseAlpineLinuxBuild() bool {
|
|
_, err := os.Stat("/etc/alpine-release")
|
|
return err == nil
|
|
}
|