|
6 | 6 | "io"
|
7 | 7 | "time"
|
8 | 8 |
|
| 9 | + "github.com/google/uuid" |
9 | 10 | "golang.org/x/exp/slices"
|
10 | 11 | "golang.org/x/xerrors"
|
11 | 12 |
|
@@ -213,6 +214,7 @@ type prepWorkspaceBuildArgs struct {
|
213 | 214 | NewWorkspaceName string
|
214 | 215 |
|
215 | 216 | UpdateWorkspace bool
|
| 217 | + WorkspaceID uuid.UUID |
216 | 218 | }
|
217 | 219 |
|
218 | 220 | type buildParameters struct {
|
@@ -340,8 +342,17 @@ PromptRichParamLoop:
|
340 | 342 | }
|
341 | 343 |
|
342 | 344 | if args.UpdateWorkspace && !templateVersionParameter.Mutable {
|
343 |
| - _, _ = fmt.Fprintln(inv.Stdout, cliui.Styles.Warn.Render(fmt.Sprintf(`Parameter %q is not mutable, so can't be customized after workspace creation.`, templateVersionParameter.Name))) |
344 |
| - continue |
| 345 | + // Check if the immutable parameter was used in the previous build. If so, then it isn't a fresh one |
| 346 | + // and the user should be warned. |
| 347 | + exists, err := workspaceBuildParameterExists(ctx, client, args.WorkspaceID, templateVersionParameter) |
| 348 | + if err != nil { |
| 349 | + return nil, err |
| 350 | + } |
| 351 | + |
| 352 | + if exists { |
| 353 | + _, _ = fmt.Fprintln(inv.Stdout, cliui.Styles.Warn.Render(fmt.Sprintf(`Parameter %q is not mutable, so can't be customized after workspace creation.`, templateVersionParameter.Name))) |
| 354 | + continue |
| 355 | + } |
345 | 356 | }
|
346 | 357 |
|
347 | 358 | parameterValue, err := getWorkspaceBuildParameterValueFromMapOrInput(inv, parameterMapFromFile, templateVersionParameter)
|
@@ -414,3 +425,17 @@ PromptRichParamLoop:
|
414 | 425 | richParameters: richParameters,
|
415 | 426 | }, nil
|
416 | 427 | }
|
| 428 | + |
| 429 | +func workspaceBuildParameterExists(ctx context.Context, client *codersdk.Client, workspaceID uuid.UUID, templateVersionParameter codersdk.TemplateVersionParameter) (bool, error) { |
| 430 | + lastBuildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceID) |
| 431 | + if err != nil { |
| 432 | + return false, xerrors.Errorf("can't fetch last workspace build parameters: %w", err) |
| 433 | + } |
| 434 | + |
| 435 | + for _, p := range lastBuildParameters { |
| 436 | + if p.Name == templateVersionParameter.Name { |
| 437 | + return true, nil |
| 438 | + } |
| 439 | + } |
| 440 | + return false, nil |
| 441 | +} |
0 commit comments