Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 1 | // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 4 | package main |
| 5 | |
| 6 | import ( |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 7 | "context" |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 8 | "github.com/maruel/subcommands" |
Sean Abraham | 842ea6c | 2020-06-25 16:52:12 -0600 | [diff] [blame] | 9 | "go.chromium.org/chromiumos/infra/go/internal/branch" |
Jack Neus | b0aeb84 | 2019-08-20 10:18:20 -0600 | [diff] [blame] | 10 | mv "go.chromium.org/chromiumos/infra/go/internal/chromeos_version" |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 11 | "go.chromium.org/chromiumos/infra/go/internal/gerrit" |
Jack Neus | de4ed49 | 2019-08-20 15:26:33 -0600 | [diff] [blame] | 12 | "go.chromium.org/chromiumos/infra/go/internal/git" |
Jack Neus | 07088fa | 2019-08-20 11:58:08 -0600 | [diff] [blame] | 13 | "go.chromium.org/chromiumos/infra/go/internal/repo" |
Sean Abraham | 842ea6c | 2020-06-25 16:52:12 -0600 | [diff] [blame] | 14 | "go.chromium.org/luci/auth" |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 15 | "go.chromium.org/luci/common/errors" |
Julio Hurtado | 516392f | 2020-11-12 20:19:35 +0000 | [diff] [blame] | 16 | "io/ioutil" |
Mike Frysinger | d6ff88f | 2020-12-22 22:58:22 -0500 | [diff] [blame] | 17 | "os" |
Julio Hurtado | 516392f | 2020-11-12 20:19:35 +0000 | [diff] [blame] | 18 | "strings" |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 19 | ) |
| 20 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 21 | const ( |
| 22 | branchCreatorGroup = "mdb/chromeos-branch-creators" |
| 23 | ) |
| 24 | |
| 25 | func getCmdCreateBranch(opts auth.Options) *subcommands.Command { |
Sean Abraham | 7e0369b | 2020-06-23 14:10:08 -0600 | [diff] [blame] | 26 | return &subcommands.Command{ |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 27 | UsageLine: "create <options>", |
| 28 | ShortDesc: "Create a branch.", |
| 29 | LongDesc: "Create a branch using the newer Gerrit API-based branching approach.", |
Sean Abraham | 7e0369b | 2020-06-23 14:10:08 -0600 | [diff] [blame] | 30 | CommandRun: func() subcommands.CommandRun { |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 31 | c := &createBranch{} |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 32 | c.InitFlags(opts) |
Sean Abraham | 7e0369b | 2020-06-23 14:10:08 -0600 | [diff] [blame] | 33 | // Arguments for determining branch name. |
Julio Hurtado | 9972f73 | 2020-11-04 19:34:28 +0000 | [diff] [blame] | 34 | c.Flags.StringVar(&c.file, "file", "", |
| 35 | "File path to manifest file. Can be either absolute or relative to branch_util binary.") |
Sean Abraham | 7e0369b | 2020-06-23 14:10:08 -0600 | [diff] [blame] | 36 | c.Flags.StringVar(&c.descriptor, "descriptor", "", |
| 37 | "Optional descriptor for this branch. Typically, this is a build "+ |
| 38 | "target or a device, depending on the nature of the branch. Used "+ |
| 39 | "to generate the branch name. Cannot be used with --custom.") |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 40 | c.Flags.StringVar(&c.buildSpecManifest, "buildspec-manifest", "", |
| 41 | "Path to manifest within manifest-versions repo, relative to "+ |
Mike Frysinger | fde4651 | 2020-12-22 18:31:51 -0500 | [diff] [blame] | 42 | "https://chrome-internal.googlesource.com/chromeos/manifest-versions/+/HEAD/buildspecs/ "+ |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 43 | "e.g. 85/13277.0.0.xml") |
Sean Abraham | 7e0369b | 2020-06-23 14:10:08 -0600 | [diff] [blame] | 44 | c.Flags.BoolVar(&c.release, "release", false, |
| 45 | "The new branch is a release branch. "+ |
| 46 | "Named as 'release-<descriptor>-R<Milestone>-<Major Version>.B'.") |
| 47 | c.Flags.BoolVar(&c.factory, "factory", false, |
| 48 | "The new branch is a factory branch. "+ |
| 49 | "Named as 'factory-<Descriptor>-<Major Version>.B'.") |
| 50 | c.Flags.BoolVar(&c.firmware, "firmware", false, |
| 51 | "The new branch is a firmware branch. "+ |
| 52 | "Named as 'firmware-<Descriptor>-<Major Version>.B'.") |
| 53 | c.Flags.BoolVar(&c.stabilize, "stabilize", false, |
| 54 | "The new branch is a minibranch. "+ |
| 55 | "Named as 'stabilize-<Descriptor>-<Major Version>.B'.") |
| 56 | c.Flags.StringVar(&c.custom, "custom", "", |
| 57 | "Use a custom branch type with an explicit name. "+ |
| 58 | "WARNING: custom names are dangerous. This tool greps branch "+ |
| 59 | "names to determine which versions have already been branched. "+ |
| 60 | "Version validation is not possible when the naming convention "+ |
| 61 | "is broken. Use this at your own risk.") |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 62 | c.Flags.Float64Var(&c.gerritWriteQps, "gerrit-write-qps", 1.0, |
| 63 | "Maximum QPS to use for Gerrit API write operations.") |
Sean Abraham | 7e0369b | 2020-06-23 14:10:08 -0600 | [diff] [blame] | 64 | return c |
| 65 | }, |
| 66 | } |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 67 | } |
| 68 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 69 | type createBranch struct { |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 70 | CommonFlags |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 71 | yes bool |
| 72 | descriptor string |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 73 | buildSpecManifest string |
| 74 | release bool |
| 75 | factory bool |
| 76 | firmware bool |
| 77 | stabilize bool |
| 78 | custom string |
| 79 | gerritWriteQps float64 |
| 80 | file string |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 81 | } |
| 82 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 83 | func (c *createBranch) validate(args []string) (bool, string) { |
Julio Hurtado | 9972f73 | 2020-11-04 19:34:28 +0000 | [diff] [blame] | 84 | if c.buildSpecManifest == "" && c.file == "" { |
| 85 | return false, "must set --buildspec-manifest or --file" |
| 86 | } |
| 87 | if c.buildSpecManifest != "" && c.file != "" { |
| 88 | return false, "--buildspec-manifest and --file cannot be used together" |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 89 | } |
Sean Abraham | 842ea6c | 2020-06-25 16:52:12 -0600 | [diff] [blame] | 90 | _, ok := branch.BranchType(c.release, c.factory, c.firmware, c.stabilize, c.custom) |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 91 | if !ok { |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 92 | return false, "must select exactly one branch type " + |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 93 | "(--release, --factory, --firmware, --stabilize, --custom)." |
| 94 | } |
Jack Neus | 4c3d518 | 2019-06-27 10:01:16 -0600 | [diff] [blame] | 95 | if c.descriptor != "" && c.custom != "" { |
| 96 | return false, "--descriptor cannot be used with --custom." |
| 97 | } |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 98 | return true, "" |
| 99 | } |
| 100 | |
Jack Neus | 4c3d518 | 2019-06-27 10:01:16 -0600 | [diff] [blame] | 101 | // Getters so that functions using the branchCommand interface |
| 102 | // can access CommonFlags in the underlying struct. |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 103 | func (c *createBranch) getRoot() string { |
Jack Neus | 4c3d518 | 2019-06-27 10:01:16 -0600 | [diff] [blame] | 104 | return c.Root |
| 105 | } |
| 106 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 107 | func (c *createBranch) getManifestUrl() string { |
Jack Neus | 4c3d518 | 2019-06-27 10:01:16 -0600 | [diff] [blame] | 108 | return c.ManifestUrl |
| 109 | } |
| 110 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 111 | func (c *createBranch) Run(a subcommands.Application, args []string, |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 112 | env subcommands.Env) int { |
Jack Neus | 4c3d518 | 2019-06-27 10:01:16 -0600 | [diff] [blame] | 113 | // Common setup (argument validation, repo init, etc.) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 114 | |
Jack Neus | 4c3d518 | 2019-06-27 10:01:16 -0600 | [diff] [blame] | 115 | ret := Run(c, a, args, env) |
| 116 | if ret != 0 { |
| 117 | return ret |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 118 | } |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 119 | ctx := context.Background() |
| 120 | authOpts, err := c.authFlags.Options() |
| 121 | if err != nil { |
| 122 | branch.LogErr(errors.Annotate(err, "failed to configure auth").Err().Error()) |
| 123 | return 1 |
| 124 | } |
| 125 | |
| 126 | authedClient, err := auth.NewAuthenticator(ctx, auth.SilentLogin, authOpts).Client() |
| 127 | |
| 128 | if err != nil { |
Mike Frysinger | d6ff88f | 2020-12-22 22:58:22 -0500 | [diff] [blame] | 129 | branch.LogErr(errors.Annotate(err, "Please run `%s auth-login` and sign in with your @google.com account", os.Args[0]).Err().Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 130 | return 1 |
| 131 | } |
| 132 | |
| 133 | if c.Push { |
| 134 | inGroup, err := branch.CheckSelfGroupMembership(authedClient, "https://chromium-review.googlesource.com", branchCreatorGroup) |
| 135 | if err != nil { |
| 136 | branch.LogErr(errors.Annotate(err, "failed to confirm that the running user is in %v", branchCreatorGroup).Err().Error()) |
| 137 | return 1 |
| 138 | } |
| 139 | if !inGroup { |
| 140 | branch.LogErr("you appear not to be in %v, and so you won't be able to create a branch.\n"+ |
| 141 | "See http://go/cros-branch#access for instructions for gaining access.", branchCreatorGroup) |
| 142 | return 1 |
| 143 | } |
| 144 | } |
| 145 | |
Jack Neus | 07088fa | 2019-08-20 11:58:08 -0600 | [diff] [blame] | 146 | if c.file != "" { |
| 147 | // Branch from file. |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 148 | file, err := repo.LoadManifestFromFileWithIncludes(c.file) |
| 149 | if err != nil { |
| 150 | branch.LogErr(errors.Annotate(err, "Error: Failed to load manifest from file ").Err().Error()) |
| 151 | return 1 |
| 152 | } |
| 153 | branch.LogErr("Got manifest from filepath %v", c.file) |
| 154 | branch.WorkingManifest = *file |
| 155 | } else { |
| 156 | file, err := gerrit.DownloadFileFromGitiles(authedClient, ctx, "chrome-internal.googlesource.com", |
Julio Hurtado | 516392f | 2020-11-12 20:19:35 +0000 | [diff] [blame] | 157 | "chromeos/manifest-versions", "main", "buildspecs/"+c.buildSpecManifest) |
| 158 | |
| 159 | // Temporary fix for while repos are being renamed due to COIL Initiative |
| 160 | if strings.Contains(err.Error(), "NotFound") || strings.Contains(err.Error(), "not found") { |
| 161 | file, err = gerrit.DownloadFileFromGitiles(authedClient, ctx, "chrome-internal.googlesource.com", |
| 162 | "chromeos/manifest-versions", "master", "buildspecs/"+c.buildSpecManifest) |
| 163 | } |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 164 | if err != nil { |
| 165 | branch.LogErr(errors.Annotate(err, "failed to fetch buildspec %v", c.buildSpecManifest).Err().Error()) |
| 166 | return 1 |
| 167 | } |
| 168 | branch.LogErr("Got %v from Gitiles", c.buildSpecManifest) |
| 169 | wm, err := ioutil.TempFile("", "working-manifest.xml") |
| 170 | if err != nil { |
| 171 | branch.LogErr("%s\n", err.Error()) |
| 172 | return 1 |
| 173 | } |
| 174 | _, err = wm.WriteString(file) |
| 175 | if err != nil { |
| 176 | branch.LogErr("%s\n", err.Error()) |
| 177 | return 1 |
| 178 | } |
| 179 | branch.WorkingManifest, err = repo.LoadManifestFromFile(wm.Name()) |
Jack Neus | 07088fa | 2019-08-20 11:58:08 -0600 | [diff] [blame] | 180 | if err != nil { |
| 181 | err = errors.Annotate(err, "failed to load manifests").Err() |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 182 | branch.LogErr("%s\n", err.Error()) |
Jack Neus | 07088fa | 2019-08-20 11:58:08 -0600 | [diff] [blame] | 183 | return 1 |
| 184 | } |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 185 | branch.LogErr("Fetched working manifest.\n") |
Jack Neus | 3484275 | 2019-08-14 11:31:23 -0600 | [diff] [blame] | 186 | } |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 187 | |
Jack Neus | 8c232b4 | 2019-08-21 19:35:11 -0600 | [diff] [blame] | 188 | // Use manifest-internal as a sentinel repository to get the appropriate branch name. |
| 189 | // We know that manifest-internal is a single-checkout so its revision should be |
| 190 | // master or the name of the Chrome OS branch. |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 191 | manifestInternal, err := branch.WorkingManifest.GetUniqueProject("chromeos/manifest-internal") |
Jack Neus | 8c232b4 | 2019-08-21 19:35:11 -0600 | [diff] [blame] | 192 | if err != nil { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 193 | branch.LogErr(errors.Annotate(err, "Could not get chromeos/manifest-internal project.").Err().Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 194 | return 1 |
Jack Neus | 8c232b4 | 2019-08-21 19:35:11 -0600 | [diff] [blame] | 195 | } |
| 196 | sourceRevision := manifestInternal.Revision |
Sean Abraham | 6f071d4 | 2019-08-28 09:06:34 -0600 | [diff] [blame] | 197 | sourceUpstream := git.StripRefs(manifestInternal.Upstream) |
Julio Hurtado | 8770a66 | 2021-01-13 22:31:29 +0000 | [diff] [blame^] | 198 | |
| 199 | // This string replacement is needed since chromiumos-overlay's master branch |
| 200 | // has been renamed to main. This replacement swaps the name so the correct |
| 201 | // upstream is used. crbug.com/1163216 for reference. |
| 202 | if sourceUpstream == "master" { |
| 203 | sourceUpstream = "main" |
| 204 | } |
| 205 | |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 206 | branch.LogErr("Using sourceRevision %s for manifestInternal", sourceRevision) |
| 207 | branch.LogErr("Using sourceUpstream %s for manifestInternal", sourceUpstream) |
Jack Neus | 8c232b4 | 2019-08-21 19:35:11 -0600 | [diff] [blame] | 208 | |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 209 | // Validate the version. |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 210 | // Double check that the checkout has a zero patch number. Otherwise we cannot branch from it. |
Sean Abraham | 7ed78ba | 2020-06-24 17:35:42 -0600 | [diff] [blame] | 211 | versionProject, err := branch.WorkingManifest.GetProjectByPath(branch.VersionFileProjectPath) |
Jack Neus | 8c232b4 | 2019-08-21 19:35:11 -0600 | [diff] [blame] | 212 | if err != nil { |
Sean Abraham | 7ed78ba | 2020-06-24 17:35:42 -0600 | [diff] [blame] | 213 | err = errors.Annotate(err, "could not get project %s from manifest", branch.VersionFileProjectPath).Err() |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 214 | branch.LogErr("%s\n", err) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 215 | return 1 |
Jack Neus | 57e8a5a | 2019-08-12 17:43:10 -0600 | [diff] [blame] | 216 | } |
| 217 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 218 | // Fetch chromeos_version.sh from the source branch |
| 219 | versionFile, err := gerrit.DownloadFileFromGitiles(authedClient, ctx, |
| 220 | "chromium.googlesource.com", versionProject.Name, versionProject.Revision, mv.VersionFileProjectPath) |
| 221 | |
| 222 | if err != nil { |
| 223 | branch.LogErr(errors.Annotate(err, "failed to fetch versionFile").Err().Error()) |
| 224 | return 1 |
| 225 | } |
| 226 | |
| 227 | vinfo, err := mv.ParseVersionInfo([]byte(versionFile)) |
Jack Neus | 6c72a8a | 2019-07-15 09:52:21 -0600 | [diff] [blame] | 228 | if err != nil { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 229 | branch.LogErr(errors.Annotate(err, "error reading version").Err().Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 230 | return 1 |
Jack Neus | 6c72a8a | 2019-07-15 09:52:21 -0600 | [diff] [blame] | 231 | } |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 232 | |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 233 | if vinfo.PatchNumber != 0 { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 234 | branch.LogErr("Cannot branch version with nonzero patch number (version %s).", |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 235 | vinfo.VersionString()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 236 | return 1 |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 237 | } |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 238 | branch.LogErr("Version found: %s.\n", vinfo.VersionString()) |
| 239 | |
| 240 | branch.LogErr("Have manifest = %v", manifestInternal) |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 241 | |
Julio Hurtado | 7eb30d9 | 2020-10-07 21:51:06 +0000 | [diff] [blame] | 242 | branchType := "" |
| 243 | |
| 244 | switch { |
| 245 | case c.release: |
| 246 | branchType = "release" |
| 247 | case c.factory: |
| 248 | branchType = "factory" |
| 249 | case c.firmware: |
| 250 | branchType = "firmware" |
| 251 | case c.stabilize: |
| 252 | branchType = "stabilize" |
| 253 | default: |
| 254 | branchType = "custom" |
| 255 | |
| 256 | } |
| 257 | |
| 258 | if err = branch.CheckIfAlreadyBranched(vinfo, manifestInternal, c.Force, branchType); err != nil { |
Sean Abraham | 842ea6c | 2020-06-25 16:52:12 -0600 | [diff] [blame] | 259 | branch.LogErr("%v", err) |
| 260 | return 1 |
Jack Neus | 1c9298a | 2019-07-08 09:40:41 -0600 | [diff] [blame] | 261 | } |
| 262 | |
Sean Abraham | 842ea6c | 2020-06-25 16:52:12 -0600 | [diff] [blame] | 263 | branchName := branch.NewBranchName(vinfo, c.custom, c.descriptor, c.release, c.factory, c.firmware, c.stabilize) |
Sean Abraham | 7ed78ba | 2020-06-24 17:35:42 -0600 | [diff] [blame] | 264 | componentToBump, err := branch.WhichVersionShouldBump(vinfo) |
Jack Neus | 6c72a8a | 2019-07-15 09:52:21 -0600 | [diff] [blame] | 265 | if err != nil { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 266 | branch.LogErr(err.Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 267 | return 1 |
Jack Neus | 6c72a8a | 2019-07-15 09:52:21 -0600 | [diff] [blame] | 268 | } |
| 269 | |
Jack Neus | cc82542 | 2019-07-11 10:32:54 -0600 | [diff] [blame] | 270 | // Generate git branch names. |
Sean Abraham | 7ed78ba | 2020-06-24 17:35:42 -0600 | [diff] [blame] | 271 | branches := branch.ProjectBranches(branchName, git.StripRefs(sourceRevision)) |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 272 | branch.LogOut("Creating branch: %s\n", branchName) |
Jack Neus | de4ed49 | 2019-08-20 15:26:33 -0600 | [diff] [blame] | 273 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 274 | projectBranches, err := branch.GerritProjectBranches(branches) |
| 275 | if err != nil { |
| 276 | branch.LogErr(err.Error()) |
| 277 | return 1 |
Jack Neus | cc82542 | 2019-07-11 10:32:54 -0600 | [diff] [blame] | 278 | } |
| 279 | |
Jack Neus | db35be3 | 2019-08-23 13:13:10 -0600 | [diff] [blame] | 280 | // Repair manifest repositories. |
Sean Abraham | 7ed78ba | 2020-06-24 17:35:42 -0600 | [diff] [blame] | 281 | if err = branch.RepairManifestRepositories(branches, !c.Push, c.Force); err != nil { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 282 | branch.LogErr(err.Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 283 | return 1 |
Jack Neus | cc82542 | 2019-07-11 10:32:54 -0600 | [diff] [blame] | 284 | } |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 285 | |
| 286 | // Create git branches for new branch. Exclude the ManifestProjects, which we just updated. |
| 287 | if err = branch.CreateRemoteBranchesApi(authedClient, branch.GetNonManifestBranches(projectBranches), !c.Push, c.gerritWriteQps); err != nil { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 288 | branch.LogErr(err.Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 289 | return 1 |
Jack Neus | d2a15a4 | 2019-08-13 15:38:45 -0600 | [diff] [blame] | 290 | } |
Jack Neus | cc82542 | 2019-07-11 10:32:54 -0600 | [diff] [blame] | 291 | |
Jack Neus | 6c72a8a | 2019-07-15 09:52:21 -0600 | [diff] [blame] | 292 | // Bump version. |
Sean Abraham | 7ed78ba | 2020-06-24 17:35:42 -0600 | [diff] [blame] | 293 | if err = branch.BumpForCreate(componentToBump, c.release, c.Push, branchName, sourceUpstream); err != nil { |
Sean Abraham | c2c5a6a | 2020-06-23 17:54:41 -0600 | [diff] [blame] | 294 | branch.LogErr(err.Error()) |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 295 | return 1 |
Jack Neus | 6c72a8a | 2019-07-15 09:52:21 -0600 | [diff] [blame] | 296 | } |
Jack Neus | 8c232b4 | 2019-08-21 19:35:11 -0600 | [diff] [blame] | 297 | |
Julio Hurtado | 36804fc | 2020-11-03 19:12:31 +0000 | [diff] [blame] | 298 | if !c.Push { |
| 299 | branch.LogErr("Dry run (no --push): completed successfully") |
| 300 | } |
Jack Neus | 3fb4278 | 2019-06-27 10:13:12 -0600 | [diff] [blame] | 301 | return 0 |
| 302 | } |