go.fuchsia.dev/jiri@v0.0.0-20240502161911-b66513b29486/cmd/jiri/run_hooks.go (about)

     1  // Copyright 2017 The Fuchsia 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  	"go.fuchsia.dev/jiri"
     9  	"go.fuchsia.dev/jiri/cmdline"
    10  	"go.fuchsia.dev/jiri/project"
    11  )
    12  
    13  var runHooksFlags struct {
    14  	localManifest  bool
    15  	hookTimeout    uint
    16  	attempts       uint
    17  	fetchPackages  bool
    18  	packagesToSkip arrayFlag
    19  }
    20  
    21  var cmdRunHooks = &cmdline.Command{
    22  	Runner: jiri.RunnerFunc(runHooks),
    23  	Name:   "run-hooks",
    24  	Short:  "Run hooks using local manifest",
    25  	Long: `
    26  Run hooks using local manifest JIRI_HEAD version if -local-manifest flag is
    27  false, else it runs hooks using current manifest checkout version.
    28  `,
    29  }
    30  
    31  func init() {
    32  	cmdRunHooks.Flags.BoolVar(&runHooksFlags.localManifest, "local-manifest", false, "Use local checked out manifest.")
    33  	cmdRunHooks.Flags.UintVar(&runHooksFlags.hookTimeout, "hook-timeout", project.DefaultHookTimeout, "Timeout in minutes for running the hooks operation.")
    34  	cmdRunHooks.Flags.UintVar(&runHooksFlags.attempts, "attempts", 1, "Number of attempts before failing.")
    35  	cmdRunHooks.Flags.BoolVar(&runHooksFlags.fetchPackages, "fetch-packages", true, "Use fetching packages using jiri.")
    36  	cmdRunHooks.Flags.Var(&runHooksFlags.packagesToSkip, "package-to-skip", "Skip fetching this package. Repeatable.")
    37  }
    38  
    39  func runHooks(jirix *jiri.X, args []string) (err error) {
    40  	localProjects, err := project.LocalProjects(jirix, project.FastScan)
    41  	if err != nil {
    42  		return err
    43  	}
    44  	if runHooksFlags.attempts < 1 {
    45  		return jirix.UsageErrorf("Number of attempts should be >= 1")
    46  	}
    47  	jirix.Attempts = runHooksFlags.attempts
    48  
    49  	// Get hooks.
    50  	var hooks project.Hooks
    51  	var pkgs project.Packages
    52  	if !runHooksFlags.localManifest {
    53  		_, hooks, pkgs, err = project.LoadUpdatedManifest(jirix, localProjects, runHooksFlags.localManifest)
    54  	} else {
    55  		_, hooks, pkgs, err = project.LoadManifestFile(jirix, jirix.JiriManifestFile(), localProjects, runHooksFlags.localManifest)
    56  	}
    57  	if err != nil {
    58  		return err
    59  	}
    60  	if err = project.RunHooks(jirix, hooks, runHooksFlags.hookTimeout); err != nil {
    61  		return err
    62  	}
    63  	if err := project.FilterOptionalProjectsPackages(jirix, jirix.FetchingAttrs, nil, pkgs); err != nil {
    64  		return err
    65  	}
    66  	project.FilterPackagesByName(jirix, pkgs, runHooksFlags.packagesToSkip)
    67  	// Get packages if the fetchPackages is true
    68  	if runHooksFlags.fetchPackages && len(pkgs) > 0 {
    69  		// Extend timeout for packages to be 5 times the timeout of a single hook.
    70  		return project.FetchPackages(jirix, pkgs, runHooksFlags.hookTimeout*5)
    71  	}
    72  	return nil
    73  }