blob: c8ba2ac3379a1ec21310f10f144ce5f67c4df4e7 [file] [log] [blame]
// 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
}