// readManifest implements the ReadManifest logic and provides an // optional flag that can be used to fetch the latest manifest updates // from the manifest repository. func readManifest(ctx *tool.Context, update bool) (Hosts, Projects, Tools, Hooks, error) { ctx.TimerPush("read manifest") defer ctx.TimerPop() if update { manifestPath, err := ToAbs(".manifest") if err != nil { return nil, nil, nil, nil, err } project := Project{ Path: manifestPath, Protocol: "git", Revision: "HEAD", RemoteBranch: "master", } if err := resetProject(ctx, project); err != nil { return nil, nil, nil, nil, err } } path, err := ResolveManifestPath(ctx.Manifest()) if err != nil { return nil, nil, nil, nil, err } hosts, projects, tools, hooks, stack := Hosts{}, Projects{}, Tools{}, Hooks{}, map[string]struct{}{} if err := loadManifest(ctx, path, hosts, projects, tools, hooks, stack); err != nil { return nil, nil, nil, nil, err } return hosts, projects, tools, hooks, nil }
func getManifest(ctx *tool.Context) string { manifest := ctx.Manifest() if manifest != "" { return manifest } return defaultManifest }
func updateProjects(ctx *tool.Context, remoteProjects Projects, gc bool) error { ctx.TimerPush("update projects") defer ctx.TimerPop() scanMode := FastScan if gc { scanMode = FullScan } localProjects, err := LocalProjects(ctx, scanMode) if err != nil { return err } gitHost, gitHostErr := GitHost(ctx) if gitHostErr == nil && googlesource.IsGoogleSourceHost(gitHost) { // Attempt to get the repo statuses from remote so we can detect when a // local project is already up-to-date. if repoStatuses, err := googlesource.GetRepoStatuses(ctx, gitHost); err != nil { // Log the error but don't fail. fmt.Fprintf(ctx.Stderr(), "Error fetching repo statuses from remote: %v\n", err) } else { for name, rp := range remoteProjects { status, ok := repoStatuses[rp.Name] if !ok { continue } masterRev, ok := status.Branches["master"] if !ok || masterRev == "" { continue } rp.Revision = masterRev remoteProjects[name] = rp } } } ops, err := computeOperations(localProjects, remoteProjects, gc) if err != nil { return err } for _, op := range ops { if err := op.Test(ctx); err != nil { return err } } failed := false manifest := &Manifest{Label: ctx.Manifest()} for _, op := range ops { updateFn := func() error { return op.Run(ctx, manifest) } // Always log the output of updateFn, irrespective of // the value of the verbose flag. opts := runutil.Opts{Verbose: true} if err := ctx.Run().FunctionWithOpts(opts, updateFn, "%v", op); err != nil { fmt.Fprintf(ctx.Stderr(), "%v\n", err) failed = true } } if failed { return cmdline.ErrExitCode(2) } if err := writeCurrentManifest(ctx, manifest); err != nil { return err } return nil }