github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/cmd/buildid/buildid.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "flag" 9 "fmt" 10 "log" 11 "os" 12 "strings" 13 14 "cmd/internal/buildid" 15 ) 16 17 func usage() { 18 fmt.Fprintf(os.Stderr, "usage: go tool buildid [-w] file\n") 19 flag.PrintDefaults() 20 os.Exit(2) 21 } 22 23 var wflag = flag.Bool("w", false, "write build ID") 24 25 func main() { 26 log.SetPrefix("buildid: ") 27 log.SetFlags(0) 28 flag.Usage = usage 29 flag.Parse() 30 if flag.NArg() != 1 { 31 usage() 32 } 33 34 file := flag.Arg(0) 35 id, err := buildid.ReadFile(file) 36 if err != nil { 37 log.Fatal(err) 38 } 39 if !*wflag { 40 fmt.Printf("%s\n", id) 41 return 42 } 43 44 f, err := os.Open(file) 45 if err != nil { 46 log.Fatal(err) 47 } 48 matches, hash, err := buildid.FindAndHash(f, id, 0) 49 if err != nil { 50 log.Fatal(err) 51 } 52 f.Close() 53 54 tail := id 55 if i := strings.LastIndex(id, "."); i >= 0 { 56 tail = tail[i+1:] 57 } 58 if len(tail) != len(hash)*2 { 59 log.Fatalf("%s: cannot find %d-byte hash in id %s", file, len(hash), id) 60 } 61 newID := id[:len(id)-len(tail)] + fmt.Sprintf("%x", hash) 62 63 f, err = os.OpenFile(file, os.O_WRONLY, 0) 64 if err != nil { 65 log.Fatal(err) 66 } 67 if err := buildid.Rewrite(f, matches, newID); err != nil { 68 log.Fatal(err) 69 } 70 if err := f.Close(); err != nil { 71 log.Fatal(err) 72 } 73 }