2022-10-18 01:24:12 +00:00
// Copyright 2022 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2019-04-06 19:32:14 +00:00
package repo
import (
2024-07-17 23:26:35 +00:00
"context"
2019-04-06 19:32:14 +00:00
"fmt"
"time"
2024-07-17 23:26:35 +00:00
"github.com/urfave/cli/v3"
2021-10-12 07:25:13 +00:00
2023-12-08 07:15:08 +00:00
"go.woodpecker-ci.org/woodpecker/v2/cli/internal"
"go.woodpecker-ci.org/woodpecker/v2/woodpecker-go/woodpecker"
2019-04-06 19:32:14 +00:00
)
2021-10-27 19:03:14 +00:00
var repoUpdateCmd = & cli . Command {
2019-04-06 19:32:14 +00:00
Name : "update" ,
Usage : "update a repository" ,
2023-06-12 23:07:52 +00:00
ArgsUsage : "<repo-id|repo-full-name>" ,
2019-04-06 19:32:14 +00:00
Action : repoUpdate ,
2023-12-08 08:36:53 +00:00
Flags : [ ] cli . Flag {
2021-10-27 19:03:14 +00:00
& cli . BoolFlag {
2019-04-06 19:32:14 +00:00
Name : "trusted" ,
Usage : "repository is trusted" ,
} ,
2021-10-27 19:03:14 +00:00
& cli . BoolFlag {
2019-04-06 19:32:14 +00:00
Name : "gated" ,
Usage : "repository is gated" ,
} ,
2024-11-18 13:49:12 +00:00
& cli . StringFlag {
Name : "require-approval" ,
Usage : "repository requires approval for" ,
} ,
2021-10-27 19:03:14 +00:00
& cli . DurationFlag {
2019-04-06 19:32:14 +00:00
Name : "timeout" ,
Usage : "repository timeout" ,
} ,
2021-10-27 19:03:14 +00:00
& cli . StringFlag {
2019-04-06 19:32:14 +00:00
Name : "visibility" ,
Usage : "repository visibility" ,
} ,
2021-10-27 19:03:14 +00:00
& cli . StringFlag {
2019-04-06 19:32:14 +00:00
Name : "config" ,
2021-10-02 22:27:43 +00:00
Usage : "repository configuration path (e.g. .woodpecker.yml)" ,
2019-04-06 19:32:14 +00:00
} ,
2021-10-27 19:03:14 +00:00
& cli . IntFlag {
2022-10-18 01:24:12 +00:00
Name : "pipeline-counter" ,
Usage : "repository starting pipeline number" ,
2019-04-06 19:32:14 +00:00
} ,
2021-10-27 19:03:14 +00:00
& cli . BoolFlag {
2019-04-06 19:32:14 +00:00
Name : "unsafe" ,
2022-10-18 01:24:12 +00:00
Usage : "validate updating the pipeline-counter is unsafe" ,
2019-04-06 19:32:14 +00:00
} ,
2023-12-08 08:36:53 +00:00
} ,
2019-04-06 19:32:14 +00:00
}
2024-07-17 23:26:35 +00:00
func repoUpdate ( ctx context . Context , c * cli . Command ) error {
2023-06-12 23:07:52 +00:00
repoIDOrFullName := c . Args ( ) . First ( )
2024-07-17 23:26:35 +00:00
client , err := internal . NewClient ( ctx , c )
2019-04-06 19:32:14 +00:00
if err != nil {
return err
}
2023-06-12 23:07:52 +00:00
repoID , err := internal . ParseRepo ( client , repoIDOrFullName )
2019-04-06 19:32:14 +00:00
if err != nil {
return err
}
var (
2022-10-18 01:24:12 +00:00
visibility = c . String ( "visibility" )
config = c . String ( "config" )
timeout = c . Duration ( "timeout" )
trusted = c . Bool ( "trusted" )
gated = c . Bool ( "gated" )
2024-11-18 13:49:12 +00:00
requireApproval = c . String ( "require-approval" )
2024-07-17 23:26:35 +00:00
pipelineCounter = int ( c . Int ( "pipeline-counter" ) )
2022-10-18 01:24:12 +00:00
unsafe = c . Bool ( "unsafe" )
2019-04-06 19:32:14 +00:00
)
2021-10-02 22:27:43 +00:00
patch := new ( woodpecker . RepoPatch )
2019-04-06 19:32:14 +00:00
if c . IsSet ( "trusted" ) {
patch . IsTrusted = & trusted
}
2024-11-18 13:49:12 +00:00
// TODO: remove isGated in next major release
2019-04-06 19:32:14 +00:00
if c . IsSet ( "gated" ) {
2024-11-18 13:49:12 +00:00
if gated {
patch . RequireApproval = & woodpecker . RequireApprovalAllEvents
} else {
patch . RequireApproval = & woodpecker . RequireApprovalNone
}
}
if c . IsSet ( "require-approval" ) {
if mode := woodpecker . ApprovalMode ( requireApproval ) ; mode . Valid ( ) {
patch . RequireApproval = & mode
} else {
return fmt . Errorf ( "update approval mode failed: '%s' is no valid mode" , mode )
}
// TODO: remove isGated in next major release
if requireApproval == string ( woodpecker . RequireApprovalAllEvents ) {
trueBool := true
patch . IsGated = & trueBool
} else if requireApproval == string ( woodpecker . RequireApprovalNone ) {
falseBool := false
patch . IsGated = & falseBool
}
2019-04-06 19:32:14 +00:00
}
if c . IsSet ( "timeout" ) {
v := int64 ( timeout / time . Minute )
patch . Timeout = & v
}
if c . IsSet ( "config" ) {
patch . Config = & config
}
if c . IsSet ( "visibility" ) {
switch visibility {
case "public" , "private" , "internal" :
patch . Visibility = & visibility
}
}
2022-10-18 01:24:12 +00:00
if c . IsSet ( "pipeline-counter" ) && ! unsafe {
fmt . Printf ( "Setting the pipeline counter is an unsafe operation that could put your repository in an inconsistent state. Please use --unsafe to proceed" )
2019-04-06 19:32:14 +00:00
}
2022-10-18 01:24:12 +00:00
if c . IsSet ( "pipeline-counter" ) && unsafe {
patch . PipelineCounter = & pipelineCounter
2019-04-06 19:32:14 +00:00
}
2023-06-12 23:07:52 +00:00
repo , err := client . RepoPatch ( repoID , patch )
if err != nil {
2019-04-06 19:32:14 +00:00
return err
}
2023-06-12 23:07:52 +00:00
fmt . Printf ( "Successfully updated repository %s\n" , repo . FullName )
2019-04-06 19:32:14 +00:00
return nil
}