diff --git a/build b/build index 7e68f5b3..2d835afe 100755 --- a/build +++ b/build @@ -2,9 +2,18 @@ source ./env -go install -ldflags="$LD_FLAGS" github.com/coreos/dex/cmd/dex-worker -go install -ldflags="$LD_FLAGS" github.com/coreos/dex/cmd/dexctl -go install -ldflags="$LD_FLAGS" github.com/coreos/dex/cmd/dex-overlord +CMDS=( "dex-worker" "dexctl" "dex-overlord" "gendoc") +FORMAT='{{ range $i, $dep := .Deps }}{{ $dep }} {{ end }}' + +for CMD in ${CMDS[@]}; do + TARGET="github.com/coreos/dex/cmd/$CMD" + # Install command dependencies. This caches package builds and speeds + # up successive builds a lot. + go list -f="$FORMAT" $TARGET | xargs go install -ldflags="$LD_FLAGS" + + # Build the actual command. + go build -o="bin/$CMD" -ldflags="$LD_FLAGS" $TARGET +done + go build -o bin/example-app github.com/coreos/dex/examples/app go build -o bin/example-cli github.com/coreos/dex/examples/cli -go install github.com/coreos/dex/cmd/gendoc diff --git a/db/client.go b/db/client.go index eee4e755..6754368a 100644 --- a/db/client.go +++ b/db/client.go @@ -10,8 +10,6 @@ import ( "github.com/coreos/go-oidc/oidc" "github.com/go-gorp/gorp" - "github.com/lib/pq" - "github.com/mattn/go-sqlite3" "golang.org/x/crypto/bcrypt" "github.com/coreos/dex/client" @@ -217,6 +215,25 @@ func (r *clientIdentityRepo) Authenticate(creds oidc.ClientCredentials) (bool, e return ok, nil } +var alreadyExistsCheckers []func(err error) bool + +func registerAlreadyExistsChecker(f func(err error) bool) { + alreadyExistsCheckers = append(alreadyExistsCheckers, f) +} + +// isAlreadyExistsErr detects database error codes for failing a unique constraint. +// +// Because database drivers are optionally compiled, use registerAlreadyExistsChecker to +// register driver specific implementations. +func isAlreadyExistsErr(err error) bool { + for _, checker := range alreadyExistsCheckers { + if checker(err) { + return true + } + } + return false +} + func (r *clientIdentityRepo) New(id string, meta oidc.ClientMetadata) (*oidc.ClientCredentials, error) { secret, err := pcrypto.RandBytes(maxSecretLength) if err != nil { @@ -229,17 +246,9 @@ func (r *clientIdentityRepo) New(id string, meta oidc.ClientMetadata) (*oidc.Cli } if err := r.executor(nil).Insert(cim); err != nil { - switch sqlErr := err.(type) { - case *pq.Error: - if sqlErr.Code == pgErrorCodeUniqueViolation { - err = errors.New("client ID already exists") - } - case *sqlite3.Error: - if sqlErr.ExtendedCode == sqlite3.ErrConstraintUnique { - err = errors.New("client ID already exists") - } + if isAlreadyExistsErr(err) { + err = errors.New("client ID already exists") } - return nil, err } diff --git a/db/conn.go b/db/conn.go index 118b1011..56811c5e 100644 --- a/db/conn.go +++ b/db/conn.go @@ -9,10 +9,6 @@ import ( "github.com/go-gorp/gorp" "github.com/coreos/dex/repo" - - // Import database drivers - _ "github.com/lib/pq" - _ "github.com/mattn/go-sqlite3" ) type table struct { diff --git a/db/conn_postgres.go b/db/conn_postgres.go new file mode 100644 index 00000000..dd52dae3 --- /dev/null +++ b/db/conn_postgres.go @@ -0,0 +1,15 @@ +package db + +// Register the postgres driver. + +import "github.com/lib/pq" + +func init() { + registerAlreadyExistsChecker(func(err error) bool { + sqlErr, ok := err.(*pq.Error) + if !ok { + return false + } + return sqlErr.Code == pgErrorCodeUniqueViolation + }) +} diff --git a/db/conn_sqlite3.go b/db/conn_sqlite3.go new file mode 100644 index 00000000..5c2d332b --- /dev/null +++ b/db/conn_sqlite3.go @@ -0,0 +1,17 @@ +// +build cgo + +package db + +// Register the sqlite3 driver. + +import "github.com/mattn/go-sqlite3" + +func init() { + registerAlreadyExistsChecker(func(err error) bool { + sqlErr, ok := err.(*sqlite3.Error) + if !ok { + return false + } + return sqlErr.ExtendedCode == sqlite3.ErrConstraintUnique + }) +} diff --git a/env b/env index 77f046bb..bbf981c8 100644 --- a/env +++ b/env @@ -1,5 +1,4 @@ export GOPATH=${PWD}/Godeps/_workspace -export GOBIN=${PWD}/bin rm -rf $GOPATH/src/github.com/coreos/dex mkdir -p $GOPATH/src/github.com/coreos/ @@ -7,4 +6,6 @@ mkdir -p $GOPATH/src/github.com/coreos/ # Only attempt to link dex into godeps if it isn't already there [ -d $GOPATH/src/github.com/coreos/dex ] || ln -s ${PWD} $GOPATH/src/github.com/coreos/dex -LD_FLAGS="-X main.version=$(./git-version)" +export VERSION=$(./git-version) + +LD_FLAGS="-X main.version=${VERSION}" diff --git a/release b/release index 602c3ec8..21f37d6a 100755 --- a/release +++ b/release @@ -1,18 +1,24 @@ #!/bin/bash -e -VERSION=$(./git-version) - GOARCH=amd64 OSS=( "darwin" "linux" ) + +source ./env + +# cannot cross compile when GOBIN is set. +# See: +# https://golang.org/issue/9769 +# https://golang.org/issue/11778 +unset GOBIN + for GOOS in ${OSS[@]}; do name=dex-$VERSION-$GOOS-$GOARCH rm -fr $name.tar.gz $name/ mkdir $name - GOOS=$GOOS GOARCH=$GOARCH ./build - cp bin/dexctl $name/ + GOOS=$GOOS GOARCH=$GOARCH go build -o $name/dexctl -ldflags="$LD_FLAGS" github.com/coreos/dex/cmd/dexctl tar -czf $name.tar.gz $name/ echo "Created ${name}.tar.gz"