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  }