| # This test checks that VCS information is stamped into Go binaries even when |
| # the current commit is signed and the use has configured git to display commit |
| # signatures. |
| |
| [!exec:git] skip |
| [!exec:gpg] skip |
| [short] skip |
| env GOBIN=$GOPATH/bin |
| env GNUPGHOME=$WORK/.gpupg |
| mkdir $GNUPGHOME |
| chmod 0700 $GNUPGHOME |
| |
| # Create GPG key |
| exec gpg --batch --passphrase '' --quick-generate-key gopher@golang.org |
| exec gpg --list-secret-keys --with-colons gopher@golang.org |
| cp stdout keyinfo.txt |
| go run extract_key_id.go keyinfo.txt |
| cp stdout keyid.txt |
| |
| # Initialize repo |
| cd repo/ |
| exec git init |
| exec git config user.email gopher@golang.org |
| exec git config user.name 'J.R. Gopher' |
| exec git config --add log.showSignature true |
| go run ../configure_signing_key.go ../keyid.txt |
| |
| # Create signed commit |
| cd a |
| exec git add -A |
| exec git commit -m 'initial commit' --gpg-sign |
| exec git log |
| |
| # Verify commit signature does not interfere with versioning |
| go install |
| go version -m $GOBIN/a |
| stdout '^\tbuild\tvcs\.revision=' |
| stdout '^\tbuild\tvcs\.time=' |
| stdout '^\tbuild\tvcs\.modified=false$' |
| |
| -- repo/README -- |
| Far out in the uncharted backwaters of the unfashionable end of the western |
| spiral arm of the Galaxy lies a small, unregarded yellow sun. |
| -- repo/a/go.mod -- |
| module example.com/a |
| |
| go 1.18 |
| -- repo/a/a.go -- |
| package main |
| |
| func main() {} |
| |
| -- extract_key_id.go -- |
| package main |
| |
| import "fmt" |
| import "io/ioutil" |
| import "os" |
| import "strings" |
| |
| func main() { |
| err := run(os.Args[1]) |
| if err != nil { |
| panic(err) |
| } |
| } |
| |
| func run(keyInfoFilePath string) error { |
| contents, err := ioutil.ReadFile(keyInfoFilePath) |
| if err != nil { |
| return err |
| } |
| lines := strings.Split(string(contents), "\n") |
| for _, line := range lines { |
| fields := strings.Split(line, ":") |
| if fields[0] == "sec" { |
| fmt.Print(fields[4]) |
| return nil |
| } |
| } |
| return fmt.Errorf("key ID not found in: %s", keyInfoFilePath) |
| } |
| |
| -- configure_signing_key.go -- |
| package main |
| |
| import "io/ioutil" |
| import "os" |
| import "os/exec" |
| |
| func main() { |
| err := run(os.Args[1]) |
| if err != nil { |
| panic(err) |
| } |
| } |
| |
| func run(keyIdFilePath string) error { |
| keyId, err := ioutil.ReadFile(keyIdFilePath) |
| if err != nil { |
| return err |
| } |
| gitCmd := exec.Command("git", "config", "user.signingKey", string(keyId)) |
| return gitCmd.Run() |
| } |