Remove buildidtool

This has moved into fuchsia.git //tools/debug/buildidtool now.

Bug: 343523851
Change-Id: Id6cb2dbfbc1d2877d9c8026da3714342df0dc3fc
Reviewed-on: https://fuchsia-review.googlesource.com/c/tools/+/1056793
Reviewed-by: Petr Hosek <phosek@google.com>
Commit-Queue: Auto-Submit <auto-submit@fuchsia-infra.iam.gserviceaccount.com>
Fuchsia-Auto-Submit: Roland McGrath <mcgrathr@google.com>
diff --git a/buildidtool/cmd/main.go b/buildidtool/cmd/main.go
deleted file mode 100644
index 4c2f407..0000000
--- a/buildidtool/cmd/main.go
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright 2018 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package main
-
-import (
-	"crypto/rand"
-	"encoding/hex"
-	"flag"
-	"fmt"
-	"os"
-	"path/filepath"
-	"strings"
-
-	"go.fuchsia.dev/fuchsia/tools/debug/elflib"
-	"go.fuchsia.dev/fuchsia/tools/lib/color"
-	"go.fuchsia.dev/fuchsia/tools/lib/logger"
-)
-
-type entry struct {
-	suffix string
-	file   string
-}
-
-type entryList []entry
-
-func (a *entryList) String() string {
-	return fmt.Sprintf("%v", []entry(*a))
-}
-
-func (a *entryList) Set(value string) error {
-	args := strings.SplitN(value, "=", 2)
-	if len(args) != 2 {
-		return fmt.Errorf("'%s' is not a valid entry. Must be in format <suffix>=<file>", value)
-	}
-	*a = append(*a, entry{args[0], args[1]})
-	return nil
-}
-
-var (
-	buildIDDir string
-	stamp      string
-	entries    entryList
-	colors     color.EnableColor
-	level      logger.LogLevel
-)
-
-func init() {
-	colors = color.ColorAuto
-	level = logger.FatalLevel
-
-	flag.StringVar(&buildIDDir, "build-id-dir", "", "path to .build-id dirctory")
-	flag.StringVar(&stamp, "stamp", "", "path to stamp file which acts as a stand in for the .build-id file")
-	flag.Var(&entries, "entry", "supply <suffix>=<file> to link <file> into .build-id with the given suffix")
-	flag.Var(&colors, "color", "use color in output, can be never, auto, always")
-	flag.Var(&level, "level", "output verbosity, can be fatal, error, warning, info, debug or trace")
-}
-
-func getTmpFile(path string, name string) (string, error) {
-	out := make([]byte, 16)
-	if _, err := rand.Read(out); err != nil {
-		return "", nil
-	}
-	return filepath.Join(path, name+"-"+hex.EncodeToString(out)) + ".tmp", nil
-}
-
-func atomicLink(from, to string) error {
-	// First make sure the directory already exists
-	if err := os.MkdirAll(filepath.Dir(to), 0700); err != nil {
-		return err
-	}
-	// Make a tmpFile in the same directory as 'from'
-	dir, file := filepath.Split(from)
-	tmpFile, err := getTmpFile(dir, file)
-	if err != nil {
-		return err
-	}
-	if err := os.Link(from, tmpFile); err != nil {
-		return err
-	}
-	if err := os.Rename(tmpFile, to); err != nil {
-		return err
-	}
-	// If "tmpFile" and "to" are already links to the same inode Rename does not remove tmpFile.
-	if err := os.Remove(tmpFile); !os.IsNotExist(err) {
-		return err
-	}
-	return nil
-}
-
-func atomicWrite(file, fmtStr string, args ...interface{}) error {
-	dir, base := filepath.Split(file)
-	tmpFile, err := getTmpFile(dir, base)
-	if err != nil {
-		return err
-	}
-	f, err := os.Create(tmpFile)
-	if err != nil {
-		return err
-	}
-	defer f.Close()
-	_, err = fmt.Fprintf(f, fmtStr, args...)
-	if err != nil {
-		return err
-	}
-	return os.Rename(tmpFile, file)
-}
-
-func removeOldFile(newBuildID, suffix string) error {
-	data, err := os.ReadFile(stamp)
-	if err != nil {
-		if !os.IsNotExist(err) {
-			return err
-		}
-		return nil
-	}
-	oldBuildID := string(data)
-	// Nothing to be removed if build ID wasn't previously set.
-	if oldBuildID == "" {
-		return nil
-	}
-	// We don't want to remove what we just added!
-	if newBuildID == oldBuildID {
-		return nil
-	}
-	oldPath := filepath.Join(buildIDDir, oldBuildID[:2], oldBuildID[2:]) + suffix
-	// If the file has already been removed (perhaps by another process) then
-	// just keep going.
-	if err := os.Remove(oldPath); !os.IsNotExist(err) {
-		return err
-	}
-	return nil
-}
-
-type entryInfo struct {
-	ref    elflib.BinaryFileRef
-	suffix string
-}
-
-func getEntriesInfo() ([]entryInfo, error) {
-	var outs []entryInfo
-	for _, entry := range entries {
-		f, err := os.Open(entry.file)
-		if err != nil {
-			return nil, fmt.Errorf("opening %s to read build ID: %v", entry.file, err)
-		}
-		defer f.Close()
-		buildIDs, err := elflib.GetBuildIDs(entry.file, f)
-		if err != nil {
-			return nil, fmt.Errorf("reading build ID from %s: %v", entry.file, err)
-		}
-		// Ignore entries where the binary doesn't have a build ID.
-		if len(buildIDs) == 0 {
-			continue
-		}
-		if len(buildIDs) != 1 {
-			return nil, fmt.Errorf("unexpected number of build IDs in %s. Expected 1 but found %v", entry.file, buildIDs)
-		}
-		if len(buildIDs[0]) < 2 {
-			return nil, fmt.Errorf("build ID (%s) is too short in %s", buildIDs[0], entry.file)
-		}
-		buildID := hex.EncodeToString(buildIDs[0])
-		outs = append(outs, entryInfo{elflib.BinaryFileRef{BuildID: buildID, Filepath: entry.file}, entry.suffix})
-	}
-	return outs, nil
-}
-
-func main() {
-	l := logger.NewLogger(level, color.NewColor(colors), os.Stderr, os.Stderr, "")
-	// Parse flags and check for errors.
-	flag.Parse()
-	if buildIDDir == "" {
-		l.Fatalf("-build-id-dir is required.")
-	}
-	if stamp == "" {
-		l.Fatalf("-stamp file is required.")
-	}
-	if len(entries) == 0 {
-		l.Fatalf("Need at least one -entry arg")
-	}
-	// Get the build IDs
-	infos, err := getEntriesInfo()
-	if err != nil {
-		l.Fatalf("Parsing entries: %v", err)
-	}
-	var buildID string
-	if len(infos) != 0 {
-		buildID = infos[0].ref.BuildID
-		for _, info := range infos {
-			if buildID != info.ref.BuildID {
-				l.Fatalf("%s and %s do not have the same build ID", info.ref.Filepath, infos[0].ref.Filepath)
-			}
-			if err := info.ref.Verify(); err != nil {
-				l.Fatalf("Could not verify build ID of %s: %v", info.ref.Filepath, err)
-			}
-		}
-		// Now that we know all the build IDs are in order perform operations.
-		// Make sure to not output the stamp file until all of these operations are
-		// performed to ensure that this tool is re-run if it fails mid-run.
-		buildIDRunes := []rune(buildID)
-		buildIDPathPrefix := filepath.Join(buildIDDir, string(buildIDRunes[:2]), string(buildIDRunes[2:]))
-		for _, info := range infos {
-			buildIDPath := buildIDPathPrefix + info.suffix
-			if err = atomicLink(info.ref.Filepath, buildIDPath); err != nil {
-				l.Fatalf("atomically linking %s to %s: %v", info.ref.Filepath, buildIDPath, err)
-			}
-			if err = removeOldFile(buildID, info.suffix); err != nil {
-				l.Fatalf("removing old file referenced by %s: %v", stamp, err)
-			}
-		}
-	}
-	// Update the stamp last atomically to commit all the above operations.
-	if err = atomicWrite(stamp, buildID); err != nil {
-		l.Fatalf("emitting final stamp %s: %v", stamp, err)
-	}
-}