diff --git a/cmd/repos/create.go b/cmd/repos/create.go index 7b7a54c..a54f86c 100644 --- a/cmd/repos/create.go +++ b/cmd/repos/create.go @@ -87,6 +87,10 @@ var CmdRepoCreate = cli.Command{ Name: "trustmodel", Usage: "select trust model (committer,collaborator,collaborator+committer)", }, + &cli.StringFlag{ + Name: "object-format", + Usage: "select git object format (sha1,sha256)", + }, }, flags.LoginOutputFlags...), } @@ -112,18 +116,26 @@ func runRepoCreate(cmd *cli.Context) error { } } + if ctx.IsSet("object-format") { + format := ctx.String("object-format") + if format != "sha1" && format != "sha256" { + return fmt.Errorf("invalid object format '%s', must be either 'sha1' or 'sha256'", format) + } + } + opts := gitea.CreateRepoOption{ - Name: ctx.String("name"), - Description: ctx.String("description"), - Private: ctx.Bool("private"), - AutoInit: ctx.Bool("init"), - IssueLabels: ctx.String("labels"), - Gitignores: ctx.String("gitignores"), - License: ctx.String("license"), - Readme: ctx.String("readme"), - DefaultBranch: ctx.String("branch"), - Template: ctx.Bool("template"), - TrustModel: trustmodel, + Name: ctx.String("name"), + Description: ctx.String("description"), + Private: ctx.Bool("private"), + AutoInit: ctx.Bool("init"), + IssueLabels: ctx.String("labels"), + Gitignores: ctx.String("gitignores"), + License: ctx.String("license"), + Readme: ctx.String("readme"), + DefaultBranch: ctx.String("branch"), + Template: ctx.Bool("template"), + TrustModel: trustmodel, + ObjectFormatName: ctx.String("object-format"), } if len(ctx.String("owner")) != 0 { repo, _, err = client.CreateOrgRepo(ctx.String("owner"), opts) diff --git a/cmd/repos/create_test.go b/cmd/repos/create_test.go new file mode 100644 index 0000000..a3723ec --- /dev/null +++ b/cmd/repos/create_test.go @@ -0,0 +1,68 @@ +// Copyright 2024 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package repos + +import ( + "testing" + + "code.gitea.io/sdk/gitea" + "github.com/stretchr/testify/assert" + "github.com/urfave/cli/v2" +) + +func TestCreateRepoObjectFormat(t *testing.T) { + tests := []struct { + name string + args []string + wantOpts gitea.CreateRepoOption + wantErr bool + errContains string + }{ + { + name: "create repo with sha1 object format", + args: []string{"--name", "test-sha1", "--object-format", "sha1"}, + wantOpts: gitea.CreateRepoOption{ + Name: "test-sha1", + ObjectFormatName: "sha1", + }, + wantErr: false, + }, + { + name: "create repo with sha256 object format", + args: []string{"--name", "test-sha256", "--object-format", "sha256"}, + wantOpts: gitea.CreateRepoOption{ + Name: "test-sha256", + ObjectFormatName: "sha256", + }, + wantErr: false, + }, + { + name: "create repo with invalid object format", + args: []string{"--name", "test-invalid", "--object-format", "invalid"}, + wantErr: true, + errContains: "invalid object format", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + app := cli.NewApp() + app.Commands = []*cli.Command{&CmdRepoCreate} + args := append([]string{"tea", "repo", "create"}, tt.args...) + + err := app.Run(args) + if tt.wantErr { + assert.Error(t, err) + if tt.errContains != "" { + assert.Contains(t, err.Error(), tt.errContains) + } + return + } + + assert.NoError(t, err) + // Note: We can't directly test the CreateRepoOption since it's created inside runRepoCreate + // In a real test environment, we would mock the client and verify the options passed to it + }) + } +}