mirror of https://github.com/go-gitea/gitea
Make git push options accept short name (#32245)
Just like what most CLI parsers do: `--opt` means `opt=true` Then users could use `-o force-push` as `-o force-push=true`pull/31610/head^2
parent
900ac62251
commit
afa8dd45af
@ -0,0 +1,45 @@ |
|||||||
|
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package private |
||||||
|
|
||||||
|
import ( |
||||||
|
"strconv" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"code.gitea.io/gitea/modules/optional" |
||||||
|
) |
||||||
|
|
||||||
|
// GitPushOptions is a wrapper around a map[string]string
|
||||||
|
type GitPushOptions map[string]string |
||||||
|
|
||||||
|
// GitPushOptions keys
|
||||||
|
const ( |
||||||
|
GitPushOptionRepoPrivate = "repo.private" |
||||||
|
GitPushOptionRepoTemplate = "repo.template" |
||||||
|
GitPushOptionForcePush = "force-push" |
||||||
|
) |
||||||
|
|
||||||
|
// Bool checks for a key in the map and parses as a boolean
|
||||||
|
// An option without value is considered true, eg: "-o force-push" or "-o repo.private"
|
||||||
|
func (g GitPushOptions) Bool(key string) optional.Option[bool] { |
||||||
|
if val, ok := g[key]; ok { |
||||||
|
if val == "" { |
||||||
|
return optional.Some(true) |
||||||
|
} |
||||||
|
if b, err := strconv.ParseBool(val); err == nil { |
||||||
|
return optional.Some(b) |
||||||
|
} |
||||||
|
} |
||||||
|
return optional.None[bool]() |
||||||
|
} |
||||||
|
|
||||||
|
// AddFromKeyValue adds a key value pair to the map by "key=value" format or "key" for empty value
|
||||||
|
func (g GitPushOptions) AddFromKeyValue(line string) { |
||||||
|
kv := strings.SplitN(line, "=", 2) |
||||||
|
if len(kv) == 2 { |
||||||
|
g[kv[0]] = kv[1] |
||||||
|
} else { |
||||||
|
g[kv[0]] = "" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package private |
||||||
|
|
||||||
|
import ( |
||||||
|
"testing" |
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert" |
||||||
|
) |
||||||
|
|
||||||
|
func TestGitPushOptions(t *testing.T) { |
||||||
|
o := GitPushOptions{} |
||||||
|
|
||||||
|
v := o.Bool("no-such") |
||||||
|
assert.False(t, v.Has()) |
||||||
|
assert.False(t, v.Value()) |
||||||
|
|
||||||
|
o.AddFromKeyValue("opt1=a=b") |
||||||
|
o.AddFromKeyValue("opt2=false") |
||||||
|
o.AddFromKeyValue("opt3=true") |
||||||
|
o.AddFromKeyValue("opt4") |
||||||
|
|
||||||
|
assert.Equal(t, "a=b", o["opt1"]) |
||||||
|
assert.False(t, o.Bool("opt1").Value()) |
||||||
|
assert.True(t, o.Bool("opt2").Has()) |
||||||
|
assert.False(t, o.Bool("opt2").Value()) |
||||||
|
assert.True(t, o.Bool("opt3").Value()) |
||||||
|
assert.True(t, o.Bool("opt4").Value()) |
||||||
|
} |
Loading…
Reference in new issue