aboutsummaryrefslogtreecommitdiffstats
path: root/plumbing/format/config/option.go
diff options
context:
space:
mode:
Diffstat (limited to 'plumbing/format/config/option.go')
-rw-r--r--plumbing/format/config/option.go51
1 files changed, 42 insertions, 9 deletions
diff --git a/plumbing/format/config/option.go b/plumbing/format/config/option.go
index 3c391c6..d4775e4 100644
--- a/plumbing/format/config/option.go
+++ b/plumbing/format/config/option.go
@@ -1,6 +1,7 @@
package config
import (
+ "fmt"
"strings"
)
@@ -21,6 +22,15 @@ func (o *Option) IsKey(key string) bool {
return strings.ToLower(o.Key) == strings.ToLower(key)
}
+func (opts Options) GoString() string {
+ var strs []string
+ for _, opt := range opts {
+ strs = append(strs, fmt.Sprintf("%#v", opt))
+ }
+
+ return strings.Join(strs, ", ")
+}
+
// Get gets the value for the given key if set,
// otherwise it returns the empty string.
//
@@ -69,16 +79,39 @@ func (opts Options) withAddedOption(key string, value string) Options {
return append(opts, &Option{key, value})
}
-func (opts Options) withSettedOption(key string, value string) Options {
- for i := len(opts) - 1; i >= 0; i-- {
- o := opts[i]
- if o.IsKey(key) {
- result := make(Options, len(opts))
- copy(result, opts)
- result[i] = &Option{key, value}
- return result
+func (opts Options) withSettedOption(key string, values ...string) Options {
+ var result Options
+ var added []string
+ for _, o := range opts {
+ if !o.IsKey(key) {
+ result = append(result, o)
+ continue
+ }
+
+ if contains(values, o.Value) {
+ added = append(added, o.Value)
+ result = append(result, o)
+ continue
+ }
+ }
+
+ for _, value := range values {
+ if contains(added, value) {
+ continue
+ }
+
+ result = result.withAddedOption(key, value)
+ }
+
+ return result
+}
+
+func contains(haystack []string, needle string) bool {
+ for _, s := range haystack {
+ if s == needle {
+ return true
}
}
- return opts.withAddedOption(key, value)
+ return false
}