| // Copyright 2023 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 cipd |
| |
| import ( |
| "context" |
| "fmt" |
| "os" |
| "os/exec" |
| "path/filepath" |
| |
| "go.chromium.org/luci/cipd/common" |
| "go.chromium.org/luci/common/logging" |
| ) |
| |
| type Package struct { |
| name string |
| version string |
| binDir string |
| } |
| |
| func (p *Package) AsPin() *common.Pin { |
| return &common.Pin{ |
| PackageName: p.name, |
| InstanceID: p.version, |
| } |
| } |
| |
| var ( |
| VPythonPkg = Package{ |
| name: "infra/tools/luci/vpython/${platform}", |
| version: "git_revision:3d6ee7542a04be92a48ff1c5dc28cb3c5c15dd00", |
| } |
| CPythonPkg = Package{ |
| name: "infra/3pp/tools/cpython/${platform}", |
| version: "version:2@2.7.18.chromium.44", |
| binDir: "bin", |
| } |
| ) |
| |
| func Install(ctx context.Context, dir string, packages ...Package) ([]string, error) { |
| cmd := exec.CommandContext(ctx, "cipd", "init", dir, "-force") |
| cmd.Stdout = os.Stdout |
| cmd.Stderr = os.Stderr |
| if err := cmd.Run(); err != nil { |
| return nil, fmt.Errorf("cipd init failed: %w", err) |
| } |
| |
| var binDirs []string |
| for _, pkg := range packages { |
| logging.Infof(ctx, "Installing %v / %v to %v", pkg.name, pkg.version, dir) |
| cmd := exec.CommandContext(ctx, "cipd", "install", pkg.name, pkg.version, "-root", dir) |
| cmd.Stdout = os.Stdout |
| cmd.Stderr = os.Stderr |
| if err := cmd.Run(); err != nil { |
| return nil, fmt.Errorf("failed to install %s: %w", pkg.name, err) |
| } |
| logging.Infof(ctx, "%v successfully installed to %v", pkg.name, pkg.binDir) |
| binDirs = append(binDirs, filepath.Join(dir, pkg.binDir)) |
| } |
| |
| return binDirs, nil |
| } |