Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
songlinfeng
container-toolkit
Commits
d7e13eb9
Commit
d7e13eb9
authored
Oct 22, 2025
by
songlinfeng
Browse files
add dtk-container-toolkit
parent
fcdba4f3
Changes
345
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
3468 additions
and
0 deletions
+3468
-0
vendor/github.com/urfave/cli/v2/context.go
vendor/github.com/urfave/cli/v2/context.go
+272
-0
vendor/github.com/urfave/cli/v2/docs.go
vendor/github.com/urfave/cli/v2/docs.go
+203
-0
vendor/github.com/urfave/cli/v2/errors.go
vendor/github.com/urfave/cli/v2/errors.go
+178
-0
vendor/github.com/urfave/cli/v2/fish.go
vendor/github.com/urfave/cli/v2/fish.go
+196
-0
vendor/github.com/urfave/cli/v2/flag-spec.yaml
vendor/github.com/urfave/cli/v2/flag-spec.yaml
+131
-0
vendor/github.com/urfave/cli/v2/flag.go
vendor/github.com/urfave/cli/v2/flag.go
+419
-0
vendor/github.com/urfave/cli/v2/flag_bool.go
vendor/github.com/urfave/cli/v2/flag_bool.go
+178
-0
vendor/github.com/urfave/cli/v2/flag_duration.go
vendor/github.com/urfave/cli/v2/flag_duration.go
+108
-0
vendor/github.com/urfave/cli/v2/flag_ext.go
vendor/github.com/urfave/cli/v2/flag_ext.go
+48
-0
vendor/github.com/urfave/cli/v2/flag_float64.go
vendor/github.com/urfave/cli/v2/flag_float64.go
+107
-0
vendor/github.com/urfave/cli/v2/flag_float64_slice.go
vendor/github.com/urfave/cli/v2/flag_float64_slice.go
+216
-0
vendor/github.com/urfave/cli/v2/flag_generic.go
vendor/github.com/urfave/cli/v2/flag_generic.go
+131
-0
vendor/github.com/urfave/cli/v2/flag_int.go
vendor/github.com/urfave/cli/v2/flag_int.go
+109
-0
vendor/github.com/urfave/cli/v2/flag_int64.go
vendor/github.com/urfave/cli/v2/flag_int64.go
+108
-0
vendor/github.com/urfave/cli/v2/flag_int64_slice.go
vendor/github.com/urfave/cli/v2/flag_int64_slice.go
+215
-0
vendor/github.com/urfave/cli/v2/flag_int_slice.go
vendor/github.com/urfave/cli/v2/flag_int_slice.go
+226
-0
vendor/github.com/urfave/cli/v2/flag_path.go
vendor/github.com/urfave/cli/v2/flag_path.go
+102
-0
vendor/github.com/urfave/cli/v2/flag_string.go
vendor/github.com/urfave/cli/v2/flag_string.go
+100
-0
vendor/github.com/urfave/cli/v2/flag_string_slice.go
vendor/github.com/urfave/cli/v2/flag_string_slice.go
+216
-0
vendor/github.com/urfave/cli/v2/flag_timestamp.go
vendor/github.com/urfave/cli/v2/flag_timestamp.go
+205
-0
No files found.
Too many changes to show.
To preserve performance only
345 of 345+
files are displayed.
Plain diff
Email patch
vendor/github.com/urfave/cli/v2/context.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"context"
"flag"
"fmt"
"strings"
)
// Context is a type that is passed through to
// each Handler action in a cli application. Context
// can be used to retrieve context-specific args and
// parsed command-line options.
type
Context
struct
{
context
.
Context
App
*
App
Command
*
Command
shellComplete
bool
flagSet
*
flag
.
FlagSet
parentContext
*
Context
}
// NewContext creates a new context. For use in when invoking an App or Command action.
func
NewContext
(
app
*
App
,
set
*
flag
.
FlagSet
,
parentCtx
*
Context
)
*
Context
{
c
:=
&
Context
{
App
:
app
,
flagSet
:
set
,
parentContext
:
parentCtx
}
if
parentCtx
!=
nil
{
c
.
Context
=
parentCtx
.
Context
c
.
shellComplete
=
parentCtx
.
shellComplete
if
parentCtx
.
flagSet
==
nil
{
parentCtx
.
flagSet
=
&
flag
.
FlagSet
{}
}
}
c
.
Command
=
&
Command
{}
if
c
.
Context
==
nil
{
c
.
Context
=
context
.
Background
()
}
return
c
}
// NumFlags returns the number of flags set
func
(
cCtx
*
Context
)
NumFlags
()
int
{
return
cCtx
.
flagSet
.
NFlag
()
}
// Set sets a context flag to a value.
func
(
cCtx
*
Context
)
Set
(
name
,
value
string
)
error
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
fs
.
Set
(
name
,
value
)
}
return
fmt
.
Errorf
(
"no such flag -%s"
,
name
)
}
// IsSet determines if the flag was actually set
func
(
cCtx
*
Context
)
IsSet
(
name
string
)
bool
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
isSet
:=
false
fs
.
Visit
(
func
(
f
*
flag
.
Flag
)
{
if
f
.
Name
==
name
{
isSet
=
true
}
})
if
isSet
{
return
true
}
f
:=
cCtx
.
lookupFlag
(
name
)
if
f
==
nil
{
return
false
}
if
f
.
IsSet
()
{
return
true
}
// now redo flagset search on aliases
aliases
:=
f
.
Names
()
fs
.
Visit
(
func
(
f
*
flag
.
Flag
)
{
for
_
,
alias
:=
range
aliases
{
if
f
.
Name
==
alias
{
isSet
=
true
}
}
})
if
isSet
{
return
true
}
}
return
false
}
// LocalFlagNames returns a slice of flag names used in this context.
func
(
cCtx
*
Context
)
LocalFlagNames
()
[]
string
{
var
names
[]
string
cCtx
.
flagSet
.
Visit
(
makeFlagNameVisitor
(
&
names
))
// Check the flags which have been set via env or file
if
cCtx
.
Command
!=
nil
&&
cCtx
.
Command
.
Flags
!=
nil
{
for
_
,
f
:=
range
cCtx
.
Command
.
Flags
{
if
f
.
IsSet
()
{
names
=
append
(
names
,
f
.
Names
()
...
)
}
}
}
// Sort out the duplicates since flag could be set via multiple
// paths
m
:=
map
[
string
]
struct
{}{}
var
unames
[]
string
for
_
,
name
:=
range
names
{
if
_
,
ok
:=
m
[
name
];
!
ok
{
m
[
name
]
=
struct
{}{}
unames
=
append
(
unames
,
name
)
}
}
return
unames
}
// FlagNames returns a slice of flag names used by the this context and all of
// its parent contexts.
func
(
cCtx
*
Context
)
FlagNames
()
[]
string
{
var
names
[]
string
for
_
,
pCtx
:=
range
cCtx
.
Lineage
()
{
names
=
append
(
names
,
pCtx
.
LocalFlagNames
()
...
)
}
return
names
}
// Lineage returns *this* context and all of its ancestor contexts in order from
// child to parent
func
(
cCtx
*
Context
)
Lineage
()
[]
*
Context
{
var
lineage
[]
*
Context
for
cur
:=
cCtx
;
cur
!=
nil
;
cur
=
cur
.
parentContext
{
lineage
=
append
(
lineage
,
cur
)
}
return
lineage
}
// Count returns the num of occurrences of this flag
func
(
cCtx
*
Context
)
Count
(
name
string
)
int
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
if
cf
,
ok
:=
fs
.
Lookup
(
name
)
.
Value
.
(
Countable
);
ok
{
return
cf
.
Count
()
}
}
return
0
}
// Value returns the value of the flag corresponding to `name`
func
(
cCtx
*
Context
)
Value
(
name
string
)
interface
{}
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
fs
.
Lookup
(
name
)
.
Value
.
(
flag
.
Getter
)
.
Get
()
}
return
nil
}
// Args returns the command line arguments associated with the context.
func
(
cCtx
*
Context
)
Args
()
Args
{
ret
:=
args
(
cCtx
.
flagSet
.
Args
())
return
&
ret
}
// NArg returns the number of the command line arguments.
func
(
cCtx
*
Context
)
NArg
()
int
{
return
cCtx
.
Args
()
.
Len
()
}
func
(
cCtx
*
Context
)
lookupFlag
(
name
string
)
Flag
{
for
_
,
c
:=
range
cCtx
.
Lineage
()
{
if
c
.
Command
==
nil
{
continue
}
for
_
,
f
:=
range
c
.
Command
.
Flags
{
for
_
,
n
:=
range
f
.
Names
()
{
if
n
==
name
{
return
f
}
}
}
}
if
cCtx
.
App
!=
nil
{
for
_
,
f
:=
range
cCtx
.
App
.
Flags
{
for
_
,
n
:=
range
f
.
Names
()
{
if
n
==
name
{
return
f
}
}
}
}
return
nil
}
func
(
cCtx
*
Context
)
lookupFlagSet
(
name
string
)
*
flag
.
FlagSet
{
for
_
,
c
:=
range
cCtx
.
Lineage
()
{
if
c
.
flagSet
==
nil
{
continue
}
if
f
:=
c
.
flagSet
.
Lookup
(
name
);
f
!=
nil
{
return
c
.
flagSet
}
}
cCtx
.
onInvalidFlag
(
name
)
return
nil
}
func
(
cCtx
*
Context
)
checkRequiredFlags
(
flags
[]
Flag
)
requiredFlagsErr
{
var
missingFlags
[]
string
for
_
,
f
:=
range
flags
{
if
rf
,
ok
:=
f
.
(
RequiredFlag
);
ok
&&
rf
.
IsRequired
()
{
var
flagPresent
bool
var
flagName
string
flagNames
:=
f
.
Names
()
flagName
=
flagNames
[
0
]
for
_
,
key
:=
range
flagNames
{
if
cCtx
.
IsSet
(
strings
.
TrimSpace
(
key
))
{
flagPresent
=
true
}
}
if
!
flagPresent
&&
flagName
!=
""
{
missingFlags
=
append
(
missingFlags
,
flagName
)
}
}
}
if
len
(
missingFlags
)
!=
0
{
return
&
errRequiredFlags
{
missingFlags
:
missingFlags
}
}
return
nil
}
func
(
cCtx
*
Context
)
onInvalidFlag
(
name
string
)
{
for
cCtx
!=
nil
{
if
cCtx
.
App
!=
nil
&&
cCtx
.
App
.
InvalidFlagAccessHandler
!=
nil
{
cCtx
.
App
.
InvalidFlagAccessHandler
(
cCtx
,
name
)
break
}
cCtx
=
cCtx
.
parentContext
}
}
func
makeFlagNameVisitor
(
names
*
[]
string
)
func
(
*
flag
.
Flag
)
{
return
func
(
f
*
flag
.
Flag
)
{
nameParts
:=
strings
.
Split
(
f
.
Name
,
","
)
name
:=
strings
.
TrimSpace
(
nameParts
[
0
])
for
_
,
part
:=
range
nameParts
{
part
=
strings
.
TrimSpace
(
part
)
if
len
(
part
)
>
len
(
name
)
{
name
=
part
}
}
if
name
!=
""
{
*
names
=
append
(
*
names
,
name
)
}
}
}
vendor/github.com/urfave/cli/v2/docs.go
0 → 100644
View file @
d7e13eb9
//go:build !urfave_cli_no_docs
// +build !urfave_cli_no_docs
package
cli
import
(
"bytes"
"fmt"
"io"
"sort"
"strings"
"text/template"
"github.com/cpuguy83/go-md2man/v2/md2man"
)
// ToMarkdown creates a markdown string for the `*App`
// The function errors if either parsing or writing of the string fails.
func
(
a
*
App
)
ToMarkdown
()
(
string
,
error
)
{
var
w
bytes
.
Buffer
if
err
:=
a
.
writeDocTemplate
(
&
w
,
0
);
err
!=
nil
{
return
""
,
err
}
return
w
.
String
(),
nil
}
// ToMan creates a man page string with section number for the `*App`
// The function errors if either parsing or writing of the string fails.
func
(
a
*
App
)
ToManWithSection
(
sectionNumber
int
)
(
string
,
error
)
{
var
w
bytes
.
Buffer
if
err
:=
a
.
writeDocTemplate
(
&
w
,
sectionNumber
);
err
!=
nil
{
return
""
,
err
}
man
:=
md2man
.
Render
(
w
.
Bytes
())
return
string
(
man
),
nil
}
// ToMan creates a man page string for the `*App`
// The function errors if either parsing or writing of the string fails.
func
(
a
*
App
)
ToMan
()
(
string
,
error
)
{
man
,
err
:=
a
.
ToManWithSection
(
8
)
return
man
,
err
}
type
cliTemplate
struct
{
App
*
App
SectionNum
int
Commands
[]
string
GlobalArgs
[]
string
SynopsisArgs
[]
string
}
func
(
a
*
App
)
writeDocTemplate
(
w
io
.
Writer
,
sectionNum
int
)
error
{
const
name
=
"cli"
t
,
err
:=
template
.
New
(
name
)
.
Parse
(
MarkdownDocTemplate
)
if
err
!=
nil
{
return
err
}
return
t
.
ExecuteTemplate
(
w
,
name
,
&
cliTemplate
{
App
:
a
,
SectionNum
:
sectionNum
,
Commands
:
prepareCommands
(
a
.
Commands
,
0
),
GlobalArgs
:
prepareArgsWithValues
(
a
.
VisibleFlags
()),
SynopsisArgs
:
prepareArgsSynopsis
(
a
.
VisibleFlags
()),
})
}
func
prepareCommands
(
commands
[]
*
Command
,
level
int
)
[]
string
{
var
coms
[]
string
for
_
,
command
:=
range
commands
{
if
command
.
Hidden
{
continue
}
usageText
:=
prepareUsageText
(
command
)
usage
:=
prepareUsage
(
command
,
usageText
)
prepared
:=
fmt
.
Sprintf
(
"%s %s
\n\n
%s%s"
,
strings
.
Repeat
(
"#"
,
level
+
2
),
strings
.
Join
(
command
.
Names
(),
", "
),
usage
,
usageText
,
)
flags
:=
prepareArgsWithValues
(
command
.
VisibleFlags
())
if
len
(
flags
)
>
0
{
prepared
+=
fmt
.
Sprintf
(
"
\n
%s"
,
strings
.
Join
(
flags
,
"
\n
"
))
}
coms
=
append
(
coms
,
prepared
)
// recursively iterate subcommands
if
len
(
command
.
Subcommands
)
>
0
{
coms
=
append
(
coms
,
prepareCommands
(
command
.
Subcommands
,
level
+
1
)
...
,
)
}
}
return
coms
}
func
prepareArgsWithValues
(
flags
[]
Flag
)
[]
string
{
return
prepareFlags
(
flags
,
", "
,
"**"
,
"**"
,
`""`
,
true
)
}
func
prepareArgsSynopsis
(
flags
[]
Flag
)
[]
string
{
return
prepareFlags
(
flags
,
"|"
,
"["
,
"]"
,
"[value]"
,
false
)
}
func
prepareFlags
(
flags
[]
Flag
,
sep
,
opener
,
closer
,
value
string
,
addDetails
bool
,
)
[]
string
{
args
:=
[]
string
{}
for
_
,
f
:=
range
flags
{
flag
,
ok
:=
f
.
(
DocGenerationFlag
)
if
!
ok
{
continue
}
modifiedArg
:=
opener
for
_
,
s
:=
range
flag
.
Names
()
{
trimmed
:=
strings
.
TrimSpace
(
s
)
if
len
(
modifiedArg
)
>
len
(
opener
)
{
modifiedArg
+=
sep
}
if
len
(
trimmed
)
>
1
{
modifiedArg
+=
fmt
.
Sprintf
(
"--%s"
,
trimmed
)
}
else
{
modifiedArg
+=
fmt
.
Sprintf
(
"-%s"
,
trimmed
)
}
}
modifiedArg
+=
closer
if
flag
.
TakesValue
()
{
modifiedArg
+=
fmt
.
Sprintf
(
"=%s"
,
value
)
}
if
addDetails
{
modifiedArg
+=
flagDetails
(
flag
)
}
args
=
append
(
args
,
modifiedArg
+
"
\n
"
)
}
sort
.
Strings
(
args
)
return
args
}
// flagDetails returns a string containing the flags metadata
func
flagDetails
(
flag
DocGenerationFlag
)
string
{
description
:=
flag
.
GetUsage
()
if
flag
.
TakesValue
()
{
defaultText
:=
flag
.
GetDefaultText
()
if
defaultText
==
""
{
defaultText
=
flag
.
GetValue
()
}
if
defaultText
!=
""
{
description
+=
" (default: "
+
defaultText
+
")"
}
}
return
": "
+
description
}
func
prepareUsageText
(
command
*
Command
)
string
{
if
command
.
UsageText
==
""
{
return
""
}
// Remove leading and trailing newlines
preparedUsageText
:=
strings
.
Trim
(
command
.
UsageText
,
"
\n
"
)
var
usageText
string
if
strings
.
Contains
(
preparedUsageText
,
"
\n
"
)
{
// Format multi-line string as a code block using the 4 space schema to allow for embedded markdown such
// that it will not break the continuous code block.
for
_
,
ln
:=
range
strings
.
Split
(
preparedUsageText
,
"
\n
"
)
{
usageText
+=
fmt
.
Sprintf
(
" %s
\n
"
,
ln
)
}
}
else
{
// Style a single line as a note
usageText
=
fmt
.
Sprintf
(
">%s
\n
"
,
preparedUsageText
)
}
return
usageText
}
func
prepareUsage
(
command
*
Command
,
usageText
string
)
string
{
if
command
.
Usage
==
""
{
return
""
}
usage
:=
command
.
Usage
+
"
\n
"
// Add a newline to the Usage IFF there is a UsageText
if
usageText
!=
""
{
usage
+=
"
\n
"
}
return
usage
}
vendor/github.com/urfave/cli/v2/errors.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"fmt"
"io"
"os"
"strings"
)
// OsExiter is the function used when the app exits. If not set defaults to os.Exit.
var
OsExiter
=
os
.
Exit
// ErrWriter is used to write errors to the user. This can be anything
// implementing the io.Writer interface and defaults to os.Stderr.
var
ErrWriter
io
.
Writer
=
os
.
Stderr
// MultiError is an error that wraps multiple errors.
type
MultiError
interface
{
error
Errors
()
[]
error
}
// newMultiError creates a new MultiError. Pass in one or more errors.
func
newMultiError
(
err
...
error
)
MultiError
{
ret
:=
multiError
(
err
)
return
&
ret
}
type
multiError
[]
error
// Error implements the error interface.
func
(
m
*
multiError
)
Error
()
string
{
errs
:=
make
([]
string
,
len
(
*
m
))
for
i
,
err
:=
range
*
m
{
errs
[
i
]
=
err
.
Error
()
}
return
strings
.
Join
(
errs
,
"
\n
"
)
}
// Errors returns a copy of the errors slice
func
(
m
*
multiError
)
Errors
()
[]
error
{
errs
:=
make
([]
error
,
len
(
*
m
))
for
_
,
err
:=
range
*
m
{
errs
=
append
(
errs
,
err
)
}
return
errs
}
type
requiredFlagsErr
interface
{
error
getMissingFlags
()
[]
string
}
type
errRequiredFlags
struct
{
missingFlags
[]
string
}
func
(
e
*
errRequiredFlags
)
Error
()
string
{
numberOfMissingFlags
:=
len
(
e
.
missingFlags
)
if
numberOfMissingFlags
==
1
{
return
fmt
.
Sprintf
(
"Required flag %q not set"
,
e
.
missingFlags
[
0
])
}
joinedMissingFlags
:=
strings
.
Join
(
e
.
missingFlags
,
", "
)
return
fmt
.
Sprintf
(
"Required flags %q not set"
,
joinedMissingFlags
)
}
func
(
e
*
errRequiredFlags
)
getMissingFlags
()
[]
string
{
return
e
.
missingFlags
}
// ErrorFormatter is the interface that will suitably format the error output
type
ErrorFormatter
interface
{
Format
(
s
fmt
.
State
,
verb
rune
)
}
// ExitCoder is the interface checked by `App` and `Command` for a custom exit
// code
type
ExitCoder
interface
{
error
ExitCode
()
int
}
type
exitError
struct
{
exitCode
int
err
error
}
// NewExitError calls Exit to create a new ExitCoder.
//
// Deprecated: This function is a duplicate of Exit and will eventually be removed.
func
NewExitError
(
message
interface
{},
exitCode
int
)
ExitCoder
{
return
Exit
(
message
,
exitCode
)
}
// Exit wraps a message and exit code into an error, which by default is
// handled with a call to os.Exit during default error handling.
//
// This is the simplest way to trigger a non-zero exit code for an App without
// having to call os.Exit manually. During testing, this behavior can be avoided
// by overriding the ExitErrHandler function on an App or the package-global
// OsExiter function.
func
Exit
(
message
interface
{},
exitCode
int
)
ExitCoder
{
var
err
error
switch
e
:=
message
.
(
type
)
{
case
ErrorFormatter
:
err
=
fmt
.
Errorf
(
"%+v"
,
message
)
case
error
:
err
=
e
default
:
err
=
fmt
.
Errorf
(
"%+v"
,
message
)
}
return
&
exitError
{
err
:
err
,
exitCode
:
exitCode
,
}
}
func
(
ee
*
exitError
)
Error
()
string
{
return
ee
.
err
.
Error
()
}
func
(
ee
*
exitError
)
ExitCode
()
int
{
return
ee
.
exitCode
}
func
(
ee
*
exitError
)
Unwrap
()
error
{
return
ee
.
err
}
// HandleExitCoder handles errors implementing ExitCoder by printing their
// message and calling OsExiter with the given exit code.
//
// If the given error instead implements MultiError, each error will be checked
// for the ExitCoder interface, and OsExiter will be called with the last exit
// code found, or exit code 1 if no ExitCoder is found.
//
// This function is the default error-handling behavior for an App.
func
HandleExitCoder
(
err
error
)
{
if
err
==
nil
{
return
}
if
exitErr
,
ok
:=
err
.
(
ExitCoder
);
ok
{
if
err
.
Error
()
!=
""
{
if
_
,
ok
:=
exitErr
.
(
ErrorFormatter
);
ok
{
_
,
_
=
fmt
.
Fprintf
(
ErrWriter
,
"%+v
\n
"
,
err
)
}
else
{
_
,
_
=
fmt
.
Fprintln
(
ErrWriter
,
err
)
}
}
OsExiter
(
exitErr
.
ExitCode
())
return
}
if
multiErr
,
ok
:=
err
.
(
MultiError
);
ok
{
code
:=
handleMultiError
(
multiErr
)
OsExiter
(
code
)
return
}
}
func
handleMultiError
(
multiErr
MultiError
)
int
{
code
:=
1
for
_
,
merr
:=
range
multiErr
.
Errors
()
{
if
multiErr2
,
ok
:=
merr
.
(
MultiError
);
ok
{
code
=
handleMultiError
(
multiErr2
)
}
else
if
merr
!=
nil
{
fmt
.
Fprintln
(
ErrWriter
,
merr
)
if
exitErr
,
ok
:=
merr
.
(
ExitCoder
);
ok
{
code
=
exitErr
.
ExitCode
()
}
}
}
return
code
}
vendor/github.com/urfave/cli/v2/fish.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"bytes"
"fmt"
"io"
"strings"
"text/template"
)
// ToFishCompletion creates a fish completion string for the `*App`
// The function errors if either parsing or writing of the string fails.
func
(
a
*
App
)
ToFishCompletion
()
(
string
,
error
)
{
var
w
bytes
.
Buffer
if
err
:=
a
.
writeFishCompletionTemplate
(
&
w
);
err
!=
nil
{
return
""
,
err
}
return
w
.
String
(),
nil
}
type
fishCompletionTemplate
struct
{
App
*
App
Completions
[]
string
AllCommands
[]
string
}
func
(
a
*
App
)
writeFishCompletionTemplate
(
w
io
.
Writer
)
error
{
const
name
=
"cli"
t
,
err
:=
template
.
New
(
name
)
.
Parse
(
FishCompletionTemplate
)
if
err
!=
nil
{
return
err
}
allCommands
:=
[]
string
{}
// Add global flags
completions
:=
a
.
prepareFishFlags
(
a
.
VisibleFlags
(),
allCommands
)
// Add help flag
if
!
a
.
HideHelp
{
completions
=
append
(
completions
,
a
.
prepareFishFlags
([]
Flag
{
HelpFlag
},
allCommands
)
...
,
)
}
// Add version flag
if
!
a
.
HideVersion
{
completions
=
append
(
completions
,
a
.
prepareFishFlags
([]
Flag
{
VersionFlag
},
allCommands
)
...
,
)
}
// Add commands and their flags
completions
=
append
(
completions
,
a
.
prepareFishCommands
(
a
.
VisibleCommands
(),
&
allCommands
,
[]
string
{})
...
,
)
return
t
.
ExecuteTemplate
(
w
,
name
,
&
fishCompletionTemplate
{
App
:
a
,
Completions
:
completions
,
AllCommands
:
allCommands
,
})
}
func
(
a
*
App
)
prepareFishCommands
(
commands
[]
*
Command
,
allCommands
*
[]
string
,
previousCommands
[]
string
)
[]
string
{
completions
:=
[]
string
{}
for
_
,
command
:=
range
commands
{
if
command
.
Hidden
{
continue
}
var
completion
strings
.
Builder
completion
.
WriteString
(
fmt
.
Sprintf
(
"complete -r -c %s -n '%s' -a '%s'"
,
a
.
Name
,
a
.
fishSubcommandHelper
(
previousCommands
),
strings
.
Join
(
command
.
Names
(),
" "
),
))
if
command
.
Usage
!=
""
{
completion
.
WriteString
(
fmt
.
Sprintf
(
" -d '%s'"
,
escapeSingleQuotes
(
command
.
Usage
)))
}
if
!
command
.
HideHelp
{
completions
=
append
(
completions
,
a
.
prepareFishFlags
([]
Flag
{
HelpFlag
},
command
.
Names
())
...
,
)
}
*
allCommands
=
append
(
*
allCommands
,
command
.
Names
()
...
)
completions
=
append
(
completions
,
completion
.
String
())
completions
=
append
(
completions
,
a
.
prepareFishFlags
(
command
.
VisibleFlags
(),
command
.
Names
())
...
,
)
// recursively iterate subcommands
if
len
(
command
.
Subcommands
)
>
0
{
completions
=
append
(
completions
,
a
.
prepareFishCommands
(
command
.
Subcommands
,
allCommands
,
command
.
Names
(),
)
...
,
)
}
}
return
completions
}
func
(
a
*
App
)
prepareFishFlags
(
flags
[]
Flag
,
previousCommands
[]
string
)
[]
string
{
completions
:=
[]
string
{}
for
_
,
f
:=
range
flags
{
flag
,
ok
:=
f
.
(
DocGenerationFlag
)
if
!
ok
{
continue
}
completion
:=
&
strings
.
Builder
{}
completion
.
WriteString
(
fmt
.
Sprintf
(
"complete -c %s -n '%s'"
,
a
.
Name
,
a
.
fishSubcommandHelper
(
previousCommands
),
))
fishAddFileFlag
(
f
,
completion
)
for
idx
,
opt
:=
range
flag
.
Names
()
{
if
idx
==
0
{
completion
.
WriteString
(
fmt
.
Sprintf
(
" -l %s"
,
strings
.
TrimSpace
(
opt
),
))
}
else
{
completion
.
WriteString
(
fmt
.
Sprintf
(
" -s %s"
,
strings
.
TrimSpace
(
opt
),
))
}
}
if
flag
.
TakesValue
()
{
completion
.
WriteString
(
" -r"
)
}
if
flag
.
GetUsage
()
!=
""
{
completion
.
WriteString
(
fmt
.
Sprintf
(
" -d '%s'"
,
escapeSingleQuotes
(
flag
.
GetUsage
())))
}
completions
=
append
(
completions
,
completion
.
String
())
}
return
completions
}
func
fishAddFileFlag
(
flag
Flag
,
completion
*
strings
.
Builder
)
{
switch
f
:=
flag
.
(
type
)
{
case
*
GenericFlag
:
if
f
.
TakesFile
{
return
}
case
*
StringFlag
:
if
f
.
TakesFile
{
return
}
case
*
StringSliceFlag
:
if
f
.
TakesFile
{
return
}
case
*
PathFlag
:
if
f
.
TakesFile
{
return
}
}
completion
.
WriteString
(
" -f"
)
}
func
(
a
*
App
)
fishSubcommandHelper
(
allCommands
[]
string
)
string
{
fishHelper
:=
fmt
.
Sprintf
(
"__fish_%s_no_subcommand"
,
a
.
Name
)
if
len
(
allCommands
)
>
0
{
fishHelper
=
fmt
.
Sprintf
(
"__fish_seen_subcommand_from %s"
,
strings
.
Join
(
allCommands
,
" "
),
)
}
return
fishHelper
}
func
escapeSingleQuotes
(
input
string
)
string
{
return
strings
.
Replace
(
input
,
`'`
,
`\'`
,
-
1
)
}
vendor/github.com/urfave/cli/v2/flag-spec.yaml
0 → 100644
View file @
d7e13eb9
# NOTE: this file is used by the tool defined in
# ./cmd/urfave-cli-genflags/main.go which uses the
# `Spec` type that maps to this file structure.
flag_types
:
bool
:
struct_fields
:
-
name
:
Count
type
:
int
pointer
:
true
-
name
:
DisableDefaultText
type
:
bool
-
name
:
Action
type
:
"
func(*Context,
bool)
error"
float64
:
struct_fields
:
-
name
:
Action
type
:
"
func(*Context,
float64)
error"
Float64Slice
:
value_pointer
:
true
skip_interfaces
:
-
fmt.Stringer
struct_fields
:
-
name
:
separator
type
:
separatorSpec
-
name
:
Action
type
:
"
func(*Context,
[]float64)
error"
int
:
struct_fields
:
-
name
:
Base
type
:
int
-
name
:
Action
type
:
"
func(*Context,
int)
error"
IntSlice
:
value_pointer
:
true
skip_interfaces
:
-
fmt.Stringer
struct_fields
:
-
name
:
separator
type
:
separatorSpec
-
name
:
Action
type
:
"
func(*Context,
[]int)
error"
int64
:
struct_fields
:
-
name
:
Base
type
:
int
-
name
:
Action
type
:
"
func(*Context,
int64)
error"
Int64Slice
:
value_pointer
:
true
skip_interfaces
:
-
fmt.Stringer
struct_fields
:
-
name
:
separator
type
:
separatorSpec
-
name
:
Action
type
:
"
func(*Context,
[]int64)
error"
uint
:
struct_fields
:
-
name
:
Base
type
:
int
-
name
:
Action
type
:
"
func(*Context,
uint)
error"
UintSlice
:
value_pointer
:
true
skip_interfaces
:
-
fmt.Stringer
struct_fields
:
-
name
:
separator
type
:
separatorSpec
-
name
:
Action
type
:
"
func(*Context,
[]uint)
error"
uint64
:
struct_fields
:
-
name
:
Base
type
:
int
-
name
:
Action
type
:
"
func(*Context,
uint64)
error"
Uint64Slice
:
value_pointer
:
true
skip_interfaces
:
-
fmt.Stringer
struct_fields
:
-
name
:
separator
type
:
separatorSpec
-
name
:
Action
type
:
"
func(*Context,
[]uint64)
error"
string
:
struct_fields
:
-
name
:
TakesFile
type
:
bool
-
name
:
Action
type
:
"
func(*Context,
string)
error"
StringSlice
:
value_pointer
:
true
skip_interfaces
:
-
fmt.Stringer
struct_fields
:
-
name
:
separator
type
:
separatorSpec
-
name
:
TakesFile
type
:
bool
-
name
:
Action
type
:
"
func(*Context,
[]string)
error"
-
name
:
KeepSpace
type
:
bool
time.Duration
:
struct_fields
:
-
name
:
Action
type
:
"
func(*Context,
time.Duration)
error"
Timestamp
:
value_pointer
:
true
struct_fields
:
-
name
:
Layout
type
:
string
-
name
:
Timezone
type
:
"
*time.Location"
-
name
:
Action
type
:
"
func(*Context,
*time.Time)
error"
Generic
:
no_destination_pointer
:
true
struct_fields
:
-
name
:
TakesFile
type
:
bool
-
name
:
Action
type
:
"
func(*Context,
interface{})
error"
Path
:
struct_fields
:
-
name
:
TakesFile
type
:
bool
-
name
:
Action
type
:
"
func(*Context,
Path)
error"
vendor/github.com/urfave/cli/v2/flag.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"errors"
"flag"
"fmt"
"io"
"os"
"regexp"
"runtime"
"strings"
"syscall"
"time"
)
const
defaultPlaceholder
=
"value"
const
(
defaultSliceFlagSeparator
=
","
disableSliceFlagSeparator
=
false
)
var
(
slPfx
=
fmt
.
Sprintf
(
"sl:::%d:::"
,
time
.
Now
()
.
UTC
()
.
UnixNano
())
commaWhitespace
=
regexp
.
MustCompile
(
"[, ]+.*"
)
)
// BashCompletionFlag enables bash-completion for all commands and subcommands
var
BashCompletionFlag
Flag
=
&
BoolFlag
{
Name
:
"generate-bash-completion"
,
Hidden
:
true
,
}
// VersionFlag prints the version for the application
var
VersionFlag
Flag
=
&
BoolFlag
{
Name
:
"version"
,
Aliases
:
[]
string
{
"v"
},
Usage
:
"print the version"
,
DisableDefaultText
:
true
,
}
// HelpFlag prints the help for all commands and subcommands.
// Set to nil to disable the flag. The subcommand
// will still be added unless HideHelp or HideHelpCommand is set to true.
var
HelpFlag
Flag
=
&
BoolFlag
{
Name
:
"help"
,
Aliases
:
[]
string
{
"h"
},
Usage
:
"show help"
,
DisableDefaultText
:
true
,
}
// FlagStringer converts a flag definition to a string. This is used by help
// to display a flag.
var
FlagStringer
FlagStringFunc
=
stringifyFlag
// Serializer is used to circumvent the limitations of flag.FlagSet.Set
type
Serializer
interface
{
Serialize
()
string
}
// FlagNamePrefixer converts a full flag name and its placeholder into the help
// message flag prefix. This is used by the default FlagStringer.
var
FlagNamePrefixer
FlagNamePrefixFunc
=
prefixedNames
// FlagEnvHinter annotates flag help message with the environment variable
// details. This is used by the default FlagStringer.
var
FlagEnvHinter
FlagEnvHintFunc
=
withEnvHint
// FlagFileHinter annotates flag help message with the environment variable
// details. This is used by the default FlagStringer.
var
FlagFileHinter
FlagFileHintFunc
=
withFileHint
// FlagsByName is a slice of Flag.
type
FlagsByName
[]
Flag
func
(
f
FlagsByName
)
Len
()
int
{
return
len
(
f
)
}
func
(
f
FlagsByName
)
Less
(
i
,
j
int
)
bool
{
if
len
(
f
[
j
]
.
Names
())
==
0
{
return
false
}
else
if
len
(
f
[
i
]
.
Names
())
==
0
{
return
true
}
return
lexicographicLess
(
f
[
i
]
.
Names
()[
0
],
f
[
j
]
.
Names
()[
0
])
}
func
(
f
FlagsByName
)
Swap
(
i
,
j
int
)
{
f
[
i
],
f
[
j
]
=
f
[
j
],
f
[
i
]
}
// ActionableFlag is an interface that wraps Flag interface and RunAction operation.
type
ActionableFlag
interface
{
Flag
RunAction
(
*
Context
)
error
}
// Flag is a common interface related to parsing flags in cli.
// For more advanced flag parsing techniques, it is recommended that
// this interface be implemented.
type
Flag
interface
{
fmt
.
Stringer
// Apply Flag settings to the given flag set
Apply
(
*
flag
.
FlagSet
)
error
Names
()
[]
string
IsSet
()
bool
}
// RequiredFlag is an interface that allows us to mark flags as required
// it allows flags required flags to be backwards compatible with the Flag interface
type
RequiredFlag
interface
{
Flag
IsRequired
()
bool
}
// DocGenerationFlag is an interface that allows documentation generation for the flag
type
DocGenerationFlag
interface
{
Flag
// TakesValue returns true if the flag takes a value, otherwise false
TakesValue
()
bool
// GetUsage returns the usage string for the flag
GetUsage
()
string
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
GetValue
()
string
// GetDefaultText returns the default text for this flag
GetDefaultText
()
string
// GetEnvVars returns the env vars for this flag
GetEnvVars
()
[]
string
}
// DocGenerationSliceFlag extends DocGenerationFlag for slice-based flags.
type
DocGenerationSliceFlag
interface
{
DocGenerationFlag
// IsSliceFlag returns true for flags that can be given multiple times.
IsSliceFlag
()
bool
}
// VisibleFlag is an interface that allows to check if a flag is visible
type
VisibleFlag
interface
{
Flag
// IsVisible returns true if the flag is not hidden, otherwise false
IsVisible
()
bool
}
// CategorizableFlag is an interface that allows us to potentially
// use a flag in a categorized representation.
type
CategorizableFlag
interface
{
VisibleFlag
GetCategory
()
string
}
// Countable is an interface to enable detection of flag values which support
// repetitive flags
type
Countable
interface
{
Count
()
int
}
func
flagSet
(
name
string
,
flags
[]
Flag
,
spec
separatorSpec
)
(
*
flag
.
FlagSet
,
error
)
{
set
:=
flag
.
NewFlagSet
(
name
,
flag
.
ContinueOnError
)
for
_
,
f
:=
range
flags
{
if
c
,
ok
:=
f
.
(
customizedSeparator
);
ok
{
c
.
WithSeparatorSpec
(
spec
)
}
if
err
:=
f
.
Apply
(
set
);
err
!=
nil
{
return
nil
,
err
}
}
set
.
SetOutput
(
io
.
Discard
)
return
set
,
nil
}
func
copyFlag
(
name
string
,
ff
*
flag
.
Flag
,
set
*
flag
.
FlagSet
)
{
switch
ff
.
Value
.
(
type
)
{
case
Serializer
:
_
=
set
.
Set
(
name
,
ff
.
Value
.
(
Serializer
)
.
Serialize
())
default
:
_
=
set
.
Set
(
name
,
ff
.
Value
.
String
())
}
}
func
normalizeFlags
(
flags
[]
Flag
,
set
*
flag
.
FlagSet
)
error
{
visited
:=
make
(
map
[
string
]
bool
)
set
.
Visit
(
func
(
f
*
flag
.
Flag
)
{
visited
[
f
.
Name
]
=
true
})
for
_
,
f
:=
range
flags
{
parts
:=
f
.
Names
()
if
len
(
parts
)
==
1
{
continue
}
var
ff
*
flag
.
Flag
for
_
,
name
:=
range
parts
{
name
=
strings
.
Trim
(
name
,
" "
)
if
visited
[
name
]
{
if
ff
!=
nil
{
return
errors
.
New
(
"Cannot use two forms of the same flag: "
+
name
+
" "
+
ff
.
Name
)
}
ff
=
set
.
Lookup
(
name
)
}
}
if
ff
==
nil
{
continue
}
for
_
,
name
:=
range
parts
{
name
=
strings
.
Trim
(
name
,
" "
)
if
!
visited
[
name
]
{
copyFlag
(
name
,
ff
,
set
)
}
}
}
return
nil
}
func
visibleFlags
(
fl
[]
Flag
)
[]
Flag
{
var
visible
[]
Flag
for
_
,
f
:=
range
fl
{
if
vf
,
ok
:=
f
.
(
VisibleFlag
);
ok
&&
vf
.
IsVisible
()
{
visible
=
append
(
visible
,
f
)
}
}
return
visible
}
func
prefixFor
(
name
string
)
(
prefix
string
)
{
if
len
(
name
)
==
1
{
prefix
=
"-"
}
else
{
prefix
=
"--"
}
return
}
// Returns the placeholder, if any, and the unquoted usage string.
func
unquoteUsage
(
usage
string
)
(
string
,
string
)
{
for
i
:=
0
;
i
<
len
(
usage
);
i
++
{
if
usage
[
i
]
==
'`'
{
for
j
:=
i
+
1
;
j
<
len
(
usage
);
j
++
{
if
usage
[
j
]
==
'`'
{
name
:=
usage
[
i
+
1
:
j
]
usage
=
usage
[
:
i
]
+
name
+
usage
[
j
+
1
:
]
return
name
,
usage
}
}
break
}
}
return
""
,
usage
}
func
prefixedNames
(
names
[]
string
,
placeholder
string
)
string
{
var
prefixed
string
for
i
,
name
:=
range
names
{
if
name
==
""
{
continue
}
prefixed
+=
prefixFor
(
name
)
+
name
if
placeholder
!=
""
{
prefixed
+=
" "
+
placeholder
}
if
i
<
len
(
names
)
-
1
{
prefixed
+=
", "
}
}
return
prefixed
}
func
envFormat
(
envVars
[]
string
,
prefix
,
sep
,
suffix
string
)
string
{
if
len
(
envVars
)
>
0
{
return
fmt
.
Sprintf
(
" [%s%s%s]"
,
prefix
,
strings
.
Join
(
envVars
,
sep
),
suffix
)
}
return
""
}
func
defaultEnvFormat
(
envVars
[]
string
)
string
{
return
envFormat
(
envVars
,
"$"
,
", $"
,
""
)
}
func
withEnvHint
(
envVars
[]
string
,
str
string
)
string
{
envText
:=
""
if
runtime
.
GOOS
!=
"windows"
||
os
.
Getenv
(
"PSHOME"
)
!=
""
{
envText
=
defaultEnvFormat
(
envVars
)
}
else
{
envText
=
envFormat
(
envVars
,
"%"
,
"%, %"
,
"%"
)
}
return
str
+
envText
}
func
FlagNames
(
name
string
,
aliases
[]
string
)
[]
string
{
var
ret
[]
string
for
_
,
part
:=
range
append
([]
string
{
name
},
aliases
...
)
{
// v1 -> v2 migration warning zone:
// Strip off anything after the first found comma or space, which
// *hopefully* makes it a tiny bit more obvious that unexpected behavior is
// caused by using the v1 form of stringly typed "Name".
ret
=
append
(
ret
,
commaWhitespace
.
ReplaceAllString
(
part
,
""
))
}
return
ret
}
func
withFileHint
(
filePath
,
str
string
)
string
{
fileText
:=
""
if
filePath
!=
""
{
fileText
=
fmt
.
Sprintf
(
" [%s]"
,
filePath
)
}
return
str
+
fileText
}
func
formatDefault
(
format
string
)
string
{
return
" (default: "
+
format
+
")"
}
func
stringifyFlag
(
f
Flag
)
string
{
// enforce DocGeneration interface on flags to avoid reflection
df
,
ok
:=
f
.
(
DocGenerationFlag
)
if
!
ok
{
return
""
}
placeholder
,
usage
:=
unquoteUsage
(
df
.
GetUsage
())
needsPlaceholder
:=
df
.
TakesValue
()
if
needsPlaceholder
&&
placeholder
==
""
{
placeholder
=
defaultPlaceholder
}
defaultValueString
:=
""
// set default text for all flags except bool flags
// for bool flags display default text if DisableDefaultText is not
// set
if
bf
,
ok
:=
f
.
(
*
BoolFlag
);
!
ok
||
!
bf
.
DisableDefaultText
{
if
s
:=
df
.
GetDefaultText
();
s
!=
""
{
defaultValueString
=
fmt
.
Sprintf
(
formatDefault
(
"%s"
),
s
)
}
}
usageWithDefault
:=
strings
.
TrimSpace
(
usage
+
defaultValueString
)
pn
:=
prefixedNames
(
df
.
Names
(),
placeholder
)
sliceFlag
,
ok
:=
f
.
(
DocGenerationSliceFlag
)
if
ok
&&
sliceFlag
.
IsSliceFlag
()
{
pn
=
pn
+
" [ "
+
pn
+
" ]"
}
return
withEnvHint
(
df
.
GetEnvVars
(),
fmt
.
Sprintf
(
"%s
\t
%s"
,
pn
,
usageWithDefault
))
}
func
hasFlag
(
flags
[]
Flag
,
fl
Flag
)
bool
{
for
_
,
existing
:=
range
flags
{
if
fl
==
existing
{
return
true
}
}
return
false
}
// Return the first value from a list of environment variables and files
// (which may or may not exist), a description of where the value was found,
// and a boolean which is true if a value was found.
func
flagFromEnvOrFile
(
envVars
[]
string
,
filePath
string
)
(
value
string
,
fromWhere
string
,
found
bool
)
{
for
_
,
envVar
:=
range
envVars
{
envVar
=
strings
.
TrimSpace
(
envVar
)
if
value
,
found
:=
syscall
.
Getenv
(
envVar
);
found
{
return
value
,
fmt
.
Sprintf
(
"environment variable %q"
,
envVar
),
true
}
}
for
_
,
fileVar
:=
range
strings
.
Split
(
filePath
,
","
)
{
if
fileVar
!=
""
{
if
data
,
err
:=
os
.
ReadFile
(
fileVar
);
err
==
nil
{
return
string
(
data
),
fmt
.
Sprintf
(
"file %q"
,
filePath
),
true
}
}
}
return
""
,
""
,
false
}
type
customizedSeparator
interface
{
WithSeparatorSpec
(
separatorSpec
)
}
type
separatorSpec
struct
{
sep
string
disabled
bool
customized
bool
}
func
(
s
separatorSpec
)
flagSplitMultiValues
(
val
string
)
[]
string
{
var
(
disabled
bool
=
s
.
disabled
sep
string
=
s
.
sep
)
if
!
s
.
customized
{
disabled
=
disableSliceFlagSeparator
sep
=
defaultSliceFlagSeparator
}
if
disabled
{
return
[]
string
{
val
}
}
return
strings
.
Split
(
val
,
sep
)
}
vendor/github.com/urfave/cli/v2/flag_bool.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"errors"
"flag"
"fmt"
"strconv"
)
// boolValue needs to implement the boolFlag internal interface in flag
// to be able to capture bool fields and values
//
// type boolFlag interface {
// Value
// IsBoolFlag() bool
// }
type
boolValue
struct
{
destination
*
bool
count
*
int
}
func
newBoolValue
(
val
bool
,
p
*
bool
,
count
*
int
)
*
boolValue
{
*
p
=
val
return
&
boolValue
{
destination
:
p
,
count
:
count
,
}
}
func
(
b
*
boolValue
)
Set
(
s
string
)
error
{
v
,
err
:=
strconv
.
ParseBool
(
s
)
if
err
!=
nil
{
err
=
errors
.
New
(
"parse error"
)
return
err
}
*
b
.
destination
=
v
if
b
.
count
!=
nil
{
*
b
.
count
=
*
b
.
count
+
1
}
return
err
}
func
(
b
*
boolValue
)
Get
()
interface
{}
{
return
*
b
.
destination
}
func
(
b
*
boolValue
)
String
()
string
{
if
b
.
destination
!=
nil
{
return
strconv
.
FormatBool
(
*
b
.
destination
)
}
return
strconv
.
FormatBool
(
false
)
}
func
(
b
*
boolValue
)
IsBoolFlag
()
bool
{
return
true
}
func
(
b
*
boolValue
)
Count
()
int
{
if
b
.
count
!=
nil
&&
*
b
.
count
>
0
{
return
*
b
.
count
}
return
0
}
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
BoolFlag
)
TakesValue
()
bool
{
return
false
}
// GetUsage returns the usage string for the flag
func
(
f
*
BoolFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
BoolFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
BoolFlag
)
GetValue
()
string
{
return
""
}
// GetDefaultText returns the default text for this flag
func
(
f
*
BoolFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
if
f
.
defaultValueSet
{
return
fmt
.
Sprintf
(
"%v"
,
f
.
defaultValue
)
}
return
fmt
.
Sprintf
(
"%v"
,
f
.
Value
)
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
BoolFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// RunAction executes flag action if set
func
(
f
*
BoolFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Bool
(
f
.
Name
))
}
return
nil
}
// Apply populates the flag given the flag set and environment
func
(
f
*
BoolFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
valBool
,
err
:=
strconv
.
ParseBool
(
val
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as bool value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
Value
=
valBool
}
else
{
// empty value implies that the env is defined but set to empty string, we have to assume that this is
// what the user wants. If user doesnt want this then the env needs to be deleted or the flag removed from
// file
f
.
Value
=
false
}
f
.
HasBeenSet
=
true
}
count
:=
f
.
Count
dest
:=
f
.
Destination
if
count
==
nil
{
count
=
new
(
int
)
}
// since count will be incremented for each alias as well
// subtract number of aliases from overall count
*
count
-=
len
(
f
.
Aliases
)
if
dest
==
nil
{
dest
=
new
(
bool
)
}
for
_
,
name
:=
range
f
.
Names
()
{
value
:=
newBoolValue
(
f
.
Value
,
dest
,
count
)
set
.
Var
(
value
,
name
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
BoolFlag
)
Get
(
ctx
*
Context
)
bool
{
return
ctx
.
Bool
(
f
.
Name
)
}
// Bool looks up the value of a local BoolFlag, returns
// false if not found
func
(
cCtx
*
Context
)
Bool
(
name
string
)
bool
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupBool
(
name
,
fs
)
}
return
false
}
func
lookupBool
(
name
string
,
set
*
flag
.
FlagSet
)
bool
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
parsed
,
err
:=
strconv
.
ParseBool
(
f
.
Value
.
String
())
if
err
!=
nil
{
return
false
}
return
parsed
}
return
false
}
vendor/github.com/urfave/cli/v2/flag_duration.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
"time"
)
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
DurationFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
DurationFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
DurationFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
DurationFlag
)
GetValue
()
string
{
return
f
.
Value
.
String
()
}
// GetDefaultText returns the default text for this flag
func
(
f
*
DurationFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
if
f
.
defaultValueSet
{
return
f
.
defaultValue
.
String
()
}
return
f
.
Value
.
String
()
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
DurationFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
DurationFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
valDuration
,
err
:=
time
.
ParseDuration
(
val
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as duration value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
Value
=
valDuration
f
.
HasBeenSet
=
true
}
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
DurationVar
(
f
.
Destination
,
name
,
f
.
Value
,
f
.
Usage
)
continue
}
set
.
Duration
(
name
,
f
.
Value
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
DurationFlag
)
Get
(
ctx
*
Context
)
time
.
Duration
{
return
ctx
.
Duration
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
DurationFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Duration
(
f
.
Name
))
}
return
nil
}
// Duration looks up the value of a local DurationFlag, returns
// 0 if not found
func
(
cCtx
*
Context
)
Duration
(
name
string
)
time
.
Duration
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupDuration
(
name
,
fs
)
}
return
0
}
func
lookupDuration
(
name
string
,
set
*
flag
.
FlagSet
)
time
.
Duration
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
parsed
,
err
:=
time
.
ParseDuration
(
f
.
Value
.
String
())
if
err
!=
nil
{
return
0
}
return
parsed
}
return
0
}
vendor/github.com/urfave/cli/v2/flag_ext.go
0 → 100644
View file @
d7e13eb9
package
cli
import
"flag"
type
extFlag
struct
{
f
*
flag
.
Flag
}
func
(
e
*
extFlag
)
Apply
(
fs
*
flag
.
FlagSet
)
error
{
fs
.
Var
(
e
.
f
.
Value
,
e
.
f
.
Name
,
e
.
f
.
Usage
)
return
nil
}
func
(
e
*
extFlag
)
Names
()
[]
string
{
return
[]
string
{
e
.
f
.
Name
}
}
func
(
e
*
extFlag
)
IsSet
()
bool
{
return
false
}
func
(
e
*
extFlag
)
String
()
string
{
return
FlagStringer
(
e
)
}
func
(
e
*
extFlag
)
IsVisible
()
bool
{
return
true
}
func
(
e
*
extFlag
)
TakesValue
()
bool
{
return
false
}
func
(
e
*
extFlag
)
GetUsage
()
string
{
return
e
.
f
.
Usage
}
func
(
e
*
extFlag
)
GetValue
()
string
{
return
e
.
f
.
Value
.
String
()
}
func
(
e
*
extFlag
)
GetDefaultText
()
string
{
return
e
.
f
.
DefValue
}
func
(
e
*
extFlag
)
GetEnvVars
()
[]
string
{
return
nil
}
vendor/github.com/urfave/cli/v2/flag_float64.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
"strconv"
)
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
Float64Flag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
Float64Flag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
Float64Flag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
Float64Flag
)
GetValue
()
string
{
return
fmt
.
Sprintf
(
"%v"
,
f
.
Value
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
Float64Flag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
if
f
.
defaultValueSet
{
return
fmt
.
Sprintf
(
"%v"
,
f
.
defaultValue
)
}
return
fmt
.
Sprintf
(
"%v"
,
f
.
Value
)
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
Float64Flag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
Float64Flag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
valFloat
,
err
:=
strconv
.
ParseFloat
(
val
,
64
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as float64 value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
Value
=
valFloat
f
.
HasBeenSet
=
true
}
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
Float64Var
(
f
.
Destination
,
name
,
f
.
Value
,
f
.
Usage
)
continue
}
set
.
Float64
(
name
,
f
.
Value
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
Float64Flag
)
Get
(
ctx
*
Context
)
float64
{
return
ctx
.
Float64
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
Float64Flag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Float64
(
f
.
Name
))
}
return
nil
}
// Float64 looks up the value of a local Float64Flag, returns
// 0 if not found
func
(
cCtx
*
Context
)
Float64
(
name
string
)
float64
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupFloat64
(
name
,
fs
)
}
return
0
}
func
lookupFloat64
(
name
string
,
set
*
flag
.
FlagSet
)
float64
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
parsed
,
err
:=
strconv
.
ParseFloat
(
f
.
Value
.
String
(),
64
)
if
err
!=
nil
{
return
0
}
return
parsed
}
return
0
}
vendor/github.com/urfave/cli/v2/flag_float64_slice.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"encoding/json"
"flag"
"fmt"
"strconv"
"strings"
)
// Float64Slice wraps []float64 to satisfy flag.Value
type
Float64Slice
struct
{
slice
[]
float64
separator
separatorSpec
hasBeenSet
bool
}
// NewFloat64Slice makes a *Float64Slice with default values
func
NewFloat64Slice
(
defaults
...
float64
)
*
Float64Slice
{
return
&
Float64Slice
{
slice
:
append
([]
float64
{},
defaults
...
)}
}
// clone allocate a copy of self object
func
(
f
*
Float64Slice
)
clone
()
*
Float64Slice
{
n
:=
&
Float64Slice
{
slice
:
make
([]
float64
,
len
(
f
.
slice
)),
hasBeenSet
:
f
.
hasBeenSet
,
}
copy
(
n
.
slice
,
f
.
slice
)
return
n
}
func
(
f
*
Float64Slice
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
f
.
separator
=
spec
}
// Set parses the value into a float64 and appends it to the list of values
func
(
f
*
Float64Slice
)
Set
(
value
string
)
error
{
if
!
f
.
hasBeenSet
{
f
.
slice
=
[]
float64
{}
f
.
hasBeenSet
=
true
}
if
strings
.
HasPrefix
(
value
,
slPfx
)
{
// Deserializing assumes overwrite
_
=
json
.
Unmarshal
([]
byte
(
strings
.
Replace
(
value
,
slPfx
,
""
,
1
)),
&
f
.
slice
)
f
.
hasBeenSet
=
true
return
nil
}
for
_
,
s
:=
range
f
.
separator
.
flagSplitMultiValues
(
value
)
{
tmp
,
err
:=
strconv
.
ParseFloat
(
strings
.
TrimSpace
(
s
),
64
)
if
err
!=
nil
{
return
err
}
f
.
slice
=
append
(
f
.
slice
,
tmp
)
}
return
nil
}
// String returns a readable representation of this value (for usage defaults)
func
(
f
*
Float64Slice
)
String
()
string
{
v
:=
f
.
slice
if
v
==
nil
{
// treat nil the same as zero length non-nil
v
=
make
([]
float64
,
0
)
}
return
fmt
.
Sprintf
(
"%#v"
,
v
)
}
// Serialize allows Float64Slice to fulfill Serializer
func
(
f
*
Float64Slice
)
Serialize
()
string
{
jsonBytes
,
_
:=
json
.
Marshal
(
f
.
slice
)
return
fmt
.
Sprintf
(
"%s%s"
,
slPfx
,
string
(
jsonBytes
))
}
// Value returns the slice of float64s set by this flag
func
(
f
*
Float64Slice
)
Value
()
[]
float64
{
return
f
.
slice
}
// Get returns the slice of float64s set by this flag
func
(
f
*
Float64Slice
)
Get
()
interface
{}
{
return
*
f
}
// String returns a readable representation of this value
// (for usage defaults)
func
(
f
*
Float64SliceFlag
)
String
()
string
{
return
FlagStringer
(
f
)
}
// TakesValue returns true if the flag takes a value, otherwise false
func
(
f
*
Float64SliceFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
Float64SliceFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
Float64SliceFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
Float64SliceFlag
)
GetValue
()
string
{
var
defaultVals
[]
string
if
f
.
Value
!=
nil
&&
len
(
f
.
Value
.
Value
())
>
0
{
for
_
,
i
:=
range
f
.
Value
.
Value
()
{
defaultVals
=
append
(
defaultVals
,
strings
.
TrimRight
(
strings
.
TrimRight
(
fmt
.
Sprintf
(
"%f"
,
i
),
"0"
),
"."
))
}
}
return
strings
.
Join
(
defaultVals
,
", "
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
Float64SliceFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
return
f
.
GetValue
()
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
Float64SliceFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// IsSliceFlag implements DocGenerationSliceFlag.
func
(
f
*
Float64SliceFlag
)
IsSliceFlag
()
bool
{
return
true
}
// Apply populates the flag given the flag set and environment
func
(
f
*
Float64SliceFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// apply any default
if
f
.
Destination
!=
nil
&&
f
.
Value
!=
nil
{
f
.
Destination
.
slice
=
make
([]
float64
,
len
(
f
.
Value
.
slice
))
copy
(
f
.
Destination
.
slice
,
f
.
Value
.
slice
)
}
// resolve setValue (what we will assign to the set)
var
setValue
*
Float64Slice
switch
{
case
f
.
Destination
!=
nil
:
setValue
=
f
.
Destination
case
f
.
Value
!=
nil
:
setValue
=
f
.
Value
.
clone
()
default
:
setValue
=
new
(
Float64Slice
)
setValue
.
WithSeparatorSpec
(
f
.
separator
)
}
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
for
_
,
s
:=
range
f
.
separator
.
flagSplitMultiValues
(
val
)
{
if
err
:=
setValue
.
Set
(
strings
.
TrimSpace
(
s
));
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as float64 slice value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
}
// Set this to false so that we reset the slice if we then set values from
// flags that have already been set by the environment.
setValue
.
hasBeenSet
=
false
f
.
HasBeenSet
=
true
}
}
for
_
,
name
:=
range
f
.
Names
()
{
set
.
Var
(
setValue
,
name
,
f
.
Usage
)
}
return
nil
}
func
(
f
*
Float64SliceFlag
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
f
.
separator
=
spec
}
// Get returns the flag’s value in the given Context.
func
(
f
*
Float64SliceFlag
)
Get
(
ctx
*
Context
)
[]
float64
{
return
ctx
.
Float64Slice
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
Float64SliceFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Float64Slice
(
f
.
Name
))
}
return
nil
}
// Float64Slice looks up the value of a local Float64SliceFlag, returns
// nil if not found
func
(
cCtx
*
Context
)
Float64Slice
(
name
string
)
[]
float64
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupFloat64Slice
(
name
,
fs
)
}
return
nil
}
func
lookupFloat64Slice
(
name
string
,
set
*
flag
.
FlagSet
)
[]
float64
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
if
slice
,
ok
:=
unwrapFlagValue
(
f
.
Value
)
.
(
*
Float64Slice
);
ok
{
return
slice
.
Value
()
}
}
return
nil
}
vendor/github.com/urfave/cli/v2/flag_generic.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
)
// Generic is a generic parseable type identified by a specific flag
type
Generic
interface
{
Set
(
value
string
)
error
String
()
string
}
type
stringGeneric
struct
{
value
string
}
func
(
s
*
stringGeneric
)
Set
(
value
string
)
error
{
s
.
value
=
value
return
nil
}
func
(
s
*
stringGeneric
)
String
()
string
{
return
s
.
value
}
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
GenericFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
GenericFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
GenericFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
GenericFlag
)
GetValue
()
string
{
if
f
.
Value
!=
nil
{
return
f
.
Value
.
String
()
}
return
""
}
// GetDefaultText returns the default text for this flag
func
(
f
*
GenericFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
val
:=
f
.
Value
if
f
.
defaultValueSet
{
val
=
f
.
defaultValue
}
if
val
!=
nil
{
return
val
.
String
()
}
return
""
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
GenericFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply takes the flagset and calls Set on the generic flag with the value
// provided by the user for parsing by the flag
func
(
f
*
GenericFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
if
f
.
Value
!=
nil
{
f
.
defaultValue
=
&
stringGeneric
{
value
:
f
.
Value
.
String
()}
f
.
defaultValueSet
=
true
}
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
if
err
:=
f
.
Value
.
Set
(
val
);
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q from %s as value for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
HasBeenSet
=
true
}
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
Var
(
f
.
Destination
,
name
,
f
.
Usage
)
continue
}
set
.
Var
(
f
.
Value
,
name
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
GenericFlag
)
Get
(
ctx
*
Context
)
interface
{}
{
return
ctx
.
Generic
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
GenericFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Generic
(
f
.
Name
))
}
return
nil
}
// Generic looks up the value of a local GenericFlag, returns
// nil if not found
func
(
cCtx
*
Context
)
Generic
(
name
string
)
interface
{}
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupGeneric
(
name
,
fs
)
}
return
nil
}
func
lookupGeneric
(
name
string
,
set
*
flag
.
FlagSet
)
interface
{}
{
if
f
:=
set
.
Lookup
(
name
);
f
!=
nil
{
return
f
.
Value
}
return
nil
}
vendor/github.com/urfave/cli/v2/flag_int.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
"strconv"
)
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
IntFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
IntFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
IntFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
IntFlag
)
GetValue
()
string
{
return
fmt
.
Sprintf
(
"%d"
,
f
.
Value
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
IntFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
if
f
.
defaultValueSet
{
return
fmt
.
Sprintf
(
"%d"
,
f
.
defaultValue
)
}
return
fmt
.
Sprintf
(
"%d"
,
f
.
Value
)
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
IntFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
IntFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
valInt
,
err
:=
strconv
.
ParseInt
(
val
,
f
.
Base
,
64
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as int value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
Value
=
int
(
valInt
)
f
.
HasBeenSet
=
true
}
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
IntVar
(
f
.
Destination
,
name
,
f
.
Value
,
f
.
Usage
)
continue
}
set
.
Int
(
name
,
f
.
Value
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
IntFlag
)
Get
(
ctx
*
Context
)
int
{
return
ctx
.
Int
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
IntFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Int
(
f
.
Name
))
}
return
nil
}
// Int looks up the value of a local IntFlag, returns
// 0 if not found
func
(
cCtx
*
Context
)
Int
(
name
string
)
int
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupInt
(
name
,
fs
)
}
return
0
}
func
lookupInt
(
name
string
,
set
*
flag
.
FlagSet
)
int
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
parsed
,
err
:=
strconv
.
ParseInt
(
f
.
Value
.
String
(),
0
,
64
)
if
err
!=
nil
{
return
0
}
return
int
(
parsed
)
}
return
0
}
vendor/github.com/urfave/cli/v2/flag_int64.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
"strconv"
)
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
Int64Flag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
Int64Flag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
Int64Flag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
Int64Flag
)
GetValue
()
string
{
return
fmt
.
Sprintf
(
"%d"
,
f
.
Value
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
Int64Flag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
if
f
.
defaultValueSet
{
return
fmt
.
Sprintf
(
"%d"
,
f
.
defaultValue
)
}
return
fmt
.
Sprintf
(
"%d"
,
f
.
Value
)
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
Int64Flag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
Int64Flag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
val
!=
""
{
valInt
,
err
:=
strconv
.
ParseInt
(
val
,
f
.
Base
,
64
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as int value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
Value
=
valInt
f
.
HasBeenSet
=
true
}
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
Int64Var
(
f
.
Destination
,
name
,
f
.
Value
,
f
.
Usage
)
continue
}
set
.
Int64
(
name
,
f
.
Value
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
Int64Flag
)
Get
(
ctx
*
Context
)
int64
{
return
ctx
.
Int64
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
Int64Flag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Int64
(
f
.
Name
))
}
return
nil
}
// Int64 looks up the value of a local Int64Flag, returns
// 0 if not found
func
(
cCtx
*
Context
)
Int64
(
name
string
)
int64
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupInt64
(
name
,
fs
)
}
return
0
}
func
lookupInt64
(
name
string
,
set
*
flag
.
FlagSet
)
int64
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
parsed
,
err
:=
strconv
.
ParseInt
(
f
.
Value
.
String
(),
0
,
64
)
if
err
!=
nil
{
return
0
}
return
parsed
}
return
0
}
vendor/github.com/urfave/cli/v2/flag_int64_slice.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"encoding/json"
"flag"
"fmt"
"strconv"
"strings"
)
// Int64Slice wraps []int64 to satisfy flag.Value
type
Int64Slice
struct
{
slice
[]
int64
separator
separatorSpec
hasBeenSet
bool
}
// NewInt64Slice makes an *Int64Slice with default values
func
NewInt64Slice
(
defaults
...
int64
)
*
Int64Slice
{
return
&
Int64Slice
{
slice
:
append
([]
int64
{},
defaults
...
)}
}
// clone allocate a copy of self object
func
(
i
*
Int64Slice
)
clone
()
*
Int64Slice
{
n
:=
&
Int64Slice
{
slice
:
make
([]
int64
,
len
(
i
.
slice
)),
hasBeenSet
:
i
.
hasBeenSet
,
}
copy
(
n
.
slice
,
i
.
slice
)
return
n
}
func
(
i
*
Int64Slice
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
i
.
separator
=
spec
}
// Set parses the value into an integer and appends it to the list of values
func
(
i
*
Int64Slice
)
Set
(
value
string
)
error
{
if
!
i
.
hasBeenSet
{
i
.
slice
=
[]
int64
{}
i
.
hasBeenSet
=
true
}
if
strings
.
HasPrefix
(
value
,
slPfx
)
{
// Deserializing assumes overwrite
_
=
json
.
Unmarshal
([]
byte
(
strings
.
Replace
(
value
,
slPfx
,
""
,
1
)),
&
i
.
slice
)
i
.
hasBeenSet
=
true
return
nil
}
for
_
,
s
:=
range
i
.
separator
.
flagSplitMultiValues
(
value
)
{
tmp
,
err
:=
strconv
.
ParseInt
(
strings
.
TrimSpace
(
s
),
0
,
64
)
if
err
!=
nil
{
return
err
}
i
.
slice
=
append
(
i
.
slice
,
tmp
)
}
return
nil
}
// String returns a readable representation of this value (for usage defaults)
func
(
i
*
Int64Slice
)
String
()
string
{
v
:=
i
.
slice
if
v
==
nil
{
// treat nil the same as zero length non-nil
v
=
make
([]
int64
,
0
)
}
return
fmt
.
Sprintf
(
"%#v"
,
v
)
}
// Serialize allows Int64Slice to fulfill Serializer
func
(
i
*
Int64Slice
)
Serialize
()
string
{
jsonBytes
,
_
:=
json
.
Marshal
(
i
.
slice
)
return
fmt
.
Sprintf
(
"%s%s"
,
slPfx
,
string
(
jsonBytes
))
}
// Value returns the slice of ints set by this flag
func
(
i
*
Int64Slice
)
Value
()
[]
int64
{
return
i
.
slice
}
// Get returns the slice of ints set by this flag
func
(
i
*
Int64Slice
)
Get
()
interface
{}
{
return
*
i
}
// String returns a readable representation of this value
// (for usage defaults)
func
(
f
*
Int64SliceFlag
)
String
()
string
{
return
FlagStringer
(
f
)
}
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
Int64SliceFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
Int64SliceFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
Int64SliceFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
Int64SliceFlag
)
GetValue
()
string
{
var
defaultVals
[]
string
if
f
.
Value
!=
nil
&&
len
(
f
.
Value
.
Value
())
>
0
{
for
_
,
i
:=
range
f
.
Value
.
Value
()
{
defaultVals
=
append
(
defaultVals
,
strconv
.
FormatInt
(
i
,
10
))
}
}
return
strings
.
Join
(
defaultVals
,
", "
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
Int64SliceFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
return
f
.
GetValue
()
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
Int64SliceFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// IsSliceFlag implements DocGenerationSliceFlag.
func
(
f
*
Int64SliceFlag
)
IsSliceFlag
()
bool
{
return
true
}
// Apply populates the flag given the flag set and environment
func
(
f
*
Int64SliceFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// apply any default
if
f
.
Destination
!=
nil
&&
f
.
Value
!=
nil
{
f
.
Destination
.
slice
=
make
([]
int64
,
len
(
f
.
Value
.
slice
))
copy
(
f
.
Destination
.
slice
,
f
.
Value
.
slice
)
}
// resolve setValue (what we will assign to the set)
var
setValue
*
Int64Slice
switch
{
case
f
.
Destination
!=
nil
:
setValue
=
f
.
Destination
case
f
.
Value
!=
nil
:
setValue
=
f
.
Value
.
clone
()
default
:
setValue
=
new
(
Int64Slice
)
setValue
.
WithSeparatorSpec
(
f
.
separator
)
}
if
val
,
source
,
ok
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
ok
&&
val
!=
""
{
for
_
,
s
:=
range
f
.
separator
.
flagSplitMultiValues
(
val
)
{
if
err
:=
setValue
.
Set
(
strings
.
TrimSpace
(
s
));
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as int64 slice value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
}
// Set this to false so that we reset the slice if we then set values from
// flags that have already been set by the environment.
setValue
.
hasBeenSet
=
false
f
.
HasBeenSet
=
true
}
for
_
,
name
:=
range
f
.
Names
()
{
set
.
Var
(
setValue
,
name
,
f
.
Usage
)
}
return
nil
}
func
(
f
*
Int64SliceFlag
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
f
.
separator
=
spec
}
// Get returns the flag’s value in the given Context.
func
(
f
*
Int64SliceFlag
)
Get
(
ctx
*
Context
)
[]
int64
{
return
ctx
.
Int64Slice
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
Int64SliceFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Int64Slice
(
f
.
Name
))
}
return
nil
}
// Int64Slice looks up the value of a local Int64SliceFlag, returns
// nil if not found
func
(
cCtx
*
Context
)
Int64Slice
(
name
string
)
[]
int64
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupInt64Slice
(
name
,
fs
)
}
return
nil
}
func
lookupInt64Slice
(
name
string
,
set
*
flag
.
FlagSet
)
[]
int64
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
if
slice
,
ok
:=
unwrapFlagValue
(
f
.
Value
)
.
(
*
Int64Slice
);
ok
{
return
slice
.
Value
()
}
}
return
nil
}
vendor/github.com/urfave/cli/v2/flag_int_slice.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"encoding/json"
"flag"
"fmt"
"strconv"
"strings"
)
// IntSlice wraps []int to satisfy flag.Value
type
IntSlice
struct
{
slice
[]
int
separator
separatorSpec
hasBeenSet
bool
}
// NewIntSlice makes an *IntSlice with default values
func
NewIntSlice
(
defaults
...
int
)
*
IntSlice
{
return
&
IntSlice
{
slice
:
append
([]
int
{},
defaults
...
)}
}
// clone allocate a copy of self object
func
(
i
*
IntSlice
)
clone
()
*
IntSlice
{
n
:=
&
IntSlice
{
slice
:
make
([]
int
,
len
(
i
.
slice
)),
hasBeenSet
:
i
.
hasBeenSet
,
}
copy
(
n
.
slice
,
i
.
slice
)
return
n
}
// TODO: Consistently have specific Set function for Int64 and Float64 ?
// SetInt directly adds an integer to the list of values
func
(
i
*
IntSlice
)
SetInt
(
value
int
)
{
if
!
i
.
hasBeenSet
{
i
.
slice
=
[]
int
{}
i
.
hasBeenSet
=
true
}
i
.
slice
=
append
(
i
.
slice
,
value
)
}
func
(
i
*
IntSlice
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
i
.
separator
=
spec
}
// Set parses the value into an integer and appends it to the list of values
func
(
i
*
IntSlice
)
Set
(
value
string
)
error
{
if
!
i
.
hasBeenSet
{
i
.
slice
=
[]
int
{}
i
.
hasBeenSet
=
true
}
if
strings
.
HasPrefix
(
value
,
slPfx
)
{
// Deserializing assumes overwrite
_
=
json
.
Unmarshal
([]
byte
(
strings
.
Replace
(
value
,
slPfx
,
""
,
1
)),
&
i
.
slice
)
i
.
hasBeenSet
=
true
return
nil
}
for
_
,
s
:=
range
i
.
separator
.
flagSplitMultiValues
(
value
)
{
tmp
,
err
:=
strconv
.
ParseInt
(
strings
.
TrimSpace
(
s
),
0
,
64
)
if
err
!=
nil
{
return
err
}
i
.
slice
=
append
(
i
.
slice
,
int
(
tmp
))
}
return
nil
}
// String returns a readable representation of this value (for usage defaults)
func
(
i
*
IntSlice
)
String
()
string
{
v
:=
i
.
slice
if
v
==
nil
{
// treat nil the same as zero length non-nil
v
=
make
([]
int
,
0
)
}
return
fmt
.
Sprintf
(
"%#v"
,
v
)
}
// Serialize allows IntSlice to fulfill Serializer
func
(
i
*
IntSlice
)
Serialize
()
string
{
jsonBytes
,
_
:=
json
.
Marshal
(
i
.
slice
)
return
fmt
.
Sprintf
(
"%s%s"
,
slPfx
,
string
(
jsonBytes
))
}
// Value returns the slice of ints set by this flag
func
(
i
*
IntSlice
)
Value
()
[]
int
{
return
i
.
slice
}
// Get returns the slice of ints set by this flag
func
(
i
*
IntSlice
)
Get
()
interface
{}
{
return
*
i
}
// String returns a readable representation of this value
// (for usage defaults)
func
(
f
*
IntSliceFlag
)
String
()
string
{
return
FlagStringer
(
f
)
}
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
IntSliceFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
IntSliceFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
IntSliceFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
IntSliceFlag
)
GetValue
()
string
{
var
defaultVals
[]
string
if
f
.
Value
!=
nil
&&
len
(
f
.
Value
.
Value
())
>
0
{
for
_
,
i
:=
range
f
.
Value
.
Value
()
{
defaultVals
=
append
(
defaultVals
,
strconv
.
Itoa
(
i
))
}
}
return
strings
.
Join
(
defaultVals
,
", "
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
IntSliceFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
return
f
.
GetValue
()
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
IntSliceFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// IsSliceFlag implements DocGenerationSliceFlag.
func
(
f
*
IntSliceFlag
)
IsSliceFlag
()
bool
{
return
true
}
// Apply populates the flag given the flag set and environment
func
(
f
*
IntSliceFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// apply any default
if
f
.
Destination
!=
nil
&&
f
.
Value
!=
nil
{
f
.
Destination
.
slice
=
make
([]
int
,
len
(
f
.
Value
.
slice
))
copy
(
f
.
Destination
.
slice
,
f
.
Value
.
slice
)
}
// resolve setValue (what we will assign to the set)
var
setValue
*
IntSlice
switch
{
case
f
.
Destination
!=
nil
:
setValue
=
f
.
Destination
case
f
.
Value
!=
nil
:
setValue
=
f
.
Value
.
clone
()
default
:
setValue
=
new
(
IntSlice
)
setValue
.
WithSeparatorSpec
(
f
.
separator
)
}
if
val
,
source
,
ok
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
ok
&&
val
!=
""
{
for
_
,
s
:=
range
f
.
separator
.
flagSplitMultiValues
(
val
)
{
if
err
:=
setValue
.
Set
(
strings
.
TrimSpace
(
s
));
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as int slice value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
}
// Set this to false so that we reset the slice if we then set values from
// flags that have already been set by the environment.
setValue
.
hasBeenSet
=
false
f
.
HasBeenSet
=
true
}
for
_
,
name
:=
range
f
.
Names
()
{
set
.
Var
(
setValue
,
name
,
f
.
Usage
)
}
return
nil
}
func
(
f
*
IntSliceFlag
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
f
.
separator
=
spec
}
// Get returns the flag’s value in the given Context.
func
(
f
*
IntSliceFlag
)
Get
(
ctx
*
Context
)
[]
int
{
return
ctx
.
IntSlice
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
IntSliceFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
IntSlice
(
f
.
Name
))
}
return
nil
}
// IntSlice looks up the value of a local IntSliceFlag, returns
// nil if not found
func
(
cCtx
*
Context
)
IntSlice
(
name
string
)
[]
int
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupIntSlice
(
name
,
fs
)
}
return
nil
}
func
lookupIntSlice
(
name
string
,
set
*
flag
.
FlagSet
)
[]
int
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
if
slice
,
ok
:=
unwrapFlagValue
(
f
.
Value
)
.
(
*
IntSlice
);
ok
{
return
slice
.
Value
()
}
}
return
nil
}
vendor/github.com/urfave/cli/v2/flag_path.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
)
type
Path
=
string
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
PathFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
PathFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
PathFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
PathFlag
)
GetValue
()
string
{
return
f
.
Value
}
// GetDefaultText returns the default text for this flag
func
(
f
*
PathFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
val
:=
f
.
Value
if
f
.
defaultValueSet
{
val
=
f
.
defaultValue
}
if
val
==
""
{
return
val
}
return
fmt
.
Sprintf
(
"%q"
,
val
)
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
PathFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
PathFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
_
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
f
.
Value
=
val
f
.
HasBeenSet
=
true
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
StringVar
(
f
.
Destination
,
name
,
f
.
Value
,
f
.
Usage
)
continue
}
set
.
String
(
name
,
f
.
Value
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
PathFlag
)
Get
(
ctx
*
Context
)
string
{
return
ctx
.
Path
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
PathFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Path
(
f
.
Name
))
}
return
nil
}
// Path looks up the value of a local PathFlag, returns
// "" if not found
func
(
cCtx
*
Context
)
Path
(
name
string
)
string
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupPath
(
name
,
fs
)
}
return
""
}
func
lookupPath
(
name
string
,
set
*
flag
.
FlagSet
)
string
{
if
f
:=
set
.
Lookup
(
name
);
f
!=
nil
{
return
f
.
Value
.
String
()
}
return
""
}
vendor/github.com/urfave/cli/v2/flag_string.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
)
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
StringFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
StringFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
StringFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
StringFlag
)
GetValue
()
string
{
return
f
.
Value
}
// GetDefaultText returns the default text for this flag
func
(
f
*
StringFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
val
:=
f
.
Value
if
f
.
defaultValueSet
{
val
=
f
.
defaultValue
}
if
val
==
""
{
return
val
}
return
fmt
.
Sprintf
(
"%q"
,
val
)
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
StringFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
StringFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// set default value so that environment wont be able to overwrite it
f
.
defaultValue
=
f
.
Value
f
.
defaultValueSet
=
true
if
val
,
_
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
f
.
Value
=
val
f
.
HasBeenSet
=
true
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
StringVar
(
f
.
Destination
,
name
,
f
.
Value
,
f
.
Usage
)
continue
}
set
.
String
(
name
,
f
.
Value
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
StringFlag
)
Get
(
ctx
*
Context
)
string
{
return
ctx
.
String
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
StringFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
String
(
f
.
Name
))
}
return
nil
}
// String looks up the value of a local StringFlag, returns
// "" if not found
func
(
cCtx
*
Context
)
String
(
name
string
)
string
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupString
(
name
,
fs
)
}
return
""
}
func
lookupString
(
name
string
,
set
*
flag
.
FlagSet
)
string
{
if
f
:=
set
.
Lookup
(
name
);
f
!=
nil
{
return
f
.
Value
.
String
()
}
return
""
}
vendor/github.com/urfave/cli/v2/flag_string_slice.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"encoding/json"
"flag"
"fmt"
"strconv"
"strings"
)
// StringSlice wraps a []string to satisfy flag.Value
type
StringSlice
struct
{
slice
[]
string
separator
separatorSpec
hasBeenSet
bool
keepSpace
bool
}
// NewStringSlice creates a *StringSlice with default values
func
NewStringSlice
(
defaults
...
string
)
*
StringSlice
{
return
&
StringSlice
{
slice
:
append
([]
string
{},
defaults
...
)}
}
// clone allocate a copy of self object
func
(
s
*
StringSlice
)
clone
()
*
StringSlice
{
n
:=
&
StringSlice
{
slice
:
make
([]
string
,
len
(
s
.
slice
)),
hasBeenSet
:
s
.
hasBeenSet
,
}
copy
(
n
.
slice
,
s
.
slice
)
return
n
}
// Set appends the string value to the list of values
func
(
s
*
StringSlice
)
Set
(
value
string
)
error
{
if
!
s
.
hasBeenSet
{
s
.
slice
=
[]
string
{}
s
.
hasBeenSet
=
true
}
if
strings
.
HasPrefix
(
value
,
slPfx
)
{
// Deserializing assumes overwrite
_
=
json
.
Unmarshal
([]
byte
(
strings
.
Replace
(
value
,
slPfx
,
""
,
1
)),
&
s
.
slice
)
s
.
hasBeenSet
=
true
return
nil
}
for
_
,
t
:=
range
s
.
separator
.
flagSplitMultiValues
(
value
)
{
if
!
s
.
keepSpace
{
t
=
strings
.
TrimSpace
(
t
)
}
s
.
slice
=
append
(
s
.
slice
,
t
)
}
return
nil
}
func
(
s
*
StringSlice
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
s
.
separator
=
spec
}
// String returns a readable representation of this value (for usage defaults)
func
(
s
*
StringSlice
)
String
()
string
{
return
fmt
.
Sprintf
(
"%s"
,
s
.
slice
)
}
// Serialize allows StringSlice to fulfill Serializer
func
(
s
*
StringSlice
)
Serialize
()
string
{
jsonBytes
,
_
:=
json
.
Marshal
(
s
.
slice
)
return
fmt
.
Sprintf
(
"%s%s"
,
slPfx
,
string
(
jsonBytes
))
}
// Value returns the slice of strings set by this flag
func
(
s
*
StringSlice
)
Value
()
[]
string
{
return
s
.
slice
}
// Get returns the slice of strings set by this flag
func
(
s
*
StringSlice
)
Get
()
interface
{}
{
return
*
s
}
// String returns a readable representation of this value
// (for usage defaults)
func
(
f
*
StringSliceFlag
)
String
()
string
{
return
FlagStringer
(
f
)
}
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
StringSliceFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
StringSliceFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
StringSliceFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
StringSliceFlag
)
GetValue
()
string
{
var
defaultVals
[]
string
if
f
.
Value
!=
nil
&&
len
(
f
.
Value
.
Value
())
>
0
{
for
_
,
s
:=
range
f
.
Value
.
Value
()
{
if
len
(
s
)
>
0
{
defaultVals
=
append
(
defaultVals
,
strconv
.
Quote
(
s
))
}
}
}
return
strings
.
Join
(
defaultVals
,
", "
)
}
// GetDefaultText returns the default text for this flag
func
(
f
*
StringSliceFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
return
f
.
GetValue
()
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
StringSliceFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// IsSliceFlag implements DocGenerationSliceFlag.
func
(
f
*
StringSliceFlag
)
IsSliceFlag
()
bool
{
return
true
}
// Apply populates the flag given the flag set and environment
func
(
f
*
StringSliceFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
// apply any default
if
f
.
Destination
!=
nil
&&
f
.
Value
!=
nil
{
f
.
Destination
.
slice
=
make
([]
string
,
len
(
f
.
Value
.
slice
))
copy
(
f
.
Destination
.
slice
,
f
.
Value
.
slice
)
}
// resolve setValue (what we will assign to the set)
var
setValue
*
StringSlice
switch
{
case
f
.
Destination
!=
nil
:
setValue
=
f
.
Destination
case
f
.
Value
!=
nil
:
setValue
=
f
.
Value
.
clone
()
default
:
setValue
=
new
(
StringSlice
)
setValue
.
WithSeparatorSpec
(
f
.
separator
)
}
setValue
.
keepSpace
=
f
.
KeepSpace
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
for
_
,
s
:=
range
f
.
separator
.
flagSplitMultiValues
(
val
)
{
if
!
f
.
KeepSpace
{
s
=
strings
.
TrimSpace
(
s
)
}
if
err
:=
setValue
.
Set
(
s
);
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as string value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
}
// Set this to false so that we reset the slice if we then set values from
// flags that have already been set by the environment.
setValue
.
hasBeenSet
=
false
f
.
HasBeenSet
=
true
}
for
_
,
name
:=
range
f
.
Names
()
{
set
.
Var
(
setValue
,
name
,
f
.
Usage
)
}
return
nil
}
func
(
f
*
StringSliceFlag
)
WithSeparatorSpec
(
spec
separatorSpec
)
{
f
.
separator
=
spec
}
// Get returns the flag’s value in the given Context.
func
(
f
*
StringSliceFlag
)
Get
(
ctx
*
Context
)
[]
string
{
return
ctx
.
StringSlice
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
StringSliceFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
StringSlice
(
f
.
Name
))
}
return
nil
}
// StringSlice looks up the value of a local StringSliceFlag, returns
// nil if not found
func
(
cCtx
*
Context
)
StringSlice
(
name
string
)
[]
string
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupStringSlice
(
name
,
fs
)
}
return
nil
}
func
lookupStringSlice
(
name
string
,
set
*
flag
.
FlagSet
)
[]
string
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
if
slice
,
ok
:=
unwrapFlagValue
(
f
.
Value
)
.
(
*
StringSlice
);
ok
{
return
slice
.
Value
()
}
}
return
nil
}
vendor/github.com/urfave/cli/v2/flag_timestamp.go
0 → 100644
View file @
d7e13eb9
package
cli
import
(
"flag"
"fmt"
"time"
)
// Timestamp wrap to satisfy golang's flag interface.
type
Timestamp
struct
{
timestamp
*
time
.
Time
hasBeenSet
bool
layout
string
location
*
time
.
Location
}
// Timestamp constructor
func
NewTimestamp
(
timestamp
time
.
Time
)
*
Timestamp
{
return
&
Timestamp
{
timestamp
:
&
timestamp
}
}
// Set the timestamp value directly
func
(
t
*
Timestamp
)
SetTimestamp
(
value
time
.
Time
)
{
if
!
t
.
hasBeenSet
{
t
.
timestamp
=
&
value
t
.
hasBeenSet
=
true
}
}
// Set the timestamp string layout for future parsing
func
(
t
*
Timestamp
)
SetLayout
(
layout
string
)
{
t
.
layout
=
layout
}
// Set perceived timezone of the to-be parsed time string
func
(
t
*
Timestamp
)
SetLocation
(
loc
*
time
.
Location
)
{
t
.
location
=
loc
}
// Parses the string value to timestamp
func
(
t
*
Timestamp
)
Set
(
value
string
)
error
{
var
timestamp
time
.
Time
var
err
error
if
t
.
location
!=
nil
{
timestamp
,
err
=
time
.
ParseInLocation
(
t
.
layout
,
value
,
t
.
location
)
}
else
{
timestamp
,
err
=
time
.
Parse
(
t
.
layout
,
value
)
}
if
err
!=
nil
{
return
err
}
t
.
timestamp
=
&
timestamp
t
.
hasBeenSet
=
true
return
nil
}
// String returns a readable representation of this value (for usage defaults)
func
(
t
*
Timestamp
)
String
()
string
{
return
fmt
.
Sprintf
(
"%#v"
,
t
.
timestamp
)
}
// Value returns the timestamp value stored in the flag
func
(
t
*
Timestamp
)
Value
()
*
time
.
Time
{
return
t
.
timestamp
}
// Get returns the flag structure
func
(
t
*
Timestamp
)
Get
()
interface
{}
{
return
*
t
}
// clone timestamp
func
(
t
*
Timestamp
)
clone
()
*
Timestamp
{
tc
:=
&
Timestamp
{
timestamp
:
nil
,
hasBeenSet
:
t
.
hasBeenSet
,
layout
:
t
.
layout
,
location
:
nil
,
}
if
t
.
timestamp
!=
nil
{
tts
:=
*
t
.
timestamp
tc
.
timestamp
=
&
tts
}
if
t
.
location
!=
nil
{
loc
:=
*
t
.
location
tc
.
location
=
&
loc
}
return
tc
}
// TakesValue returns true of the flag takes a value, otherwise false
func
(
f
*
TimestampFlag
)
TakesValue
()
bool
{
return
true
}
// GetUsage returns the usage string for the flag
func
(
f
*
TimestampFlag
)
GetUsage
()
string
{
return
f
.
Usage
}
// GetCategory returns the category for the flag
func
(
f
*
TimestampFlag
)
GetCategory
()
string
{
return
f
.
Category
}
// GetValue returns the flags value as string representation and an empty
// string if the flag takes no value at all.
func
(
f
*
TimestampFlag
)
GetValue
()
string
{
if
f
.
Value
!=
nil
&&
f
.
Value
.
timestamp
!=
nil
{
return
f
.
Value
.
timestamp
.
String
()
}
return
""
}
// GetDefaultText returns the default text for this flag
func
(
f
*
TimestampFlag
)
GetDefaultText
()
string
{
if
f
.
DefaultText
!=
""
{
return
f
.
DefaultText
}
val
:=
f
.
Value
if
f
.
defaultValueSet
{
val
=
f
.
defaultValue
}
if
val
!=
nil
&&
val
.
timestamp
!=
nil
{
return
val
.
timestamp
.
String
()
}
return
""
}
// GetEnvVars returns the env vars for this flag
func
(
f
*
TimestampFlag
)
GetEnvVars
()
[]
string
{
return
f
.
EnvVars
}
// Apply populates the flag given the flag set and environment
func
(
f
*
TimestampFlag
)
Apply
(
set
*
flag
.
FlagSet
)
error
{
if
f
.
Layout
==
""
{
return
fmt
.
Errorf
(
"timestamp Layout is required"
)
}
if
f
.
Value
==
nil
{
f
.
Value
=
&
Timestamp
{}
}
f
.
Value
.
SetLayout
(
f
.
Layout
)
f
.
Value
.
SetLocation
(
f
.
Timezone
)
f
.
defaultValue
=
f
.
Value
.
clone
()
f
.
defaultValueSet
=
true
if
val
,
source
,
found
:=
flagFromEnvOrFile
(
f
.
EnvVars
,
f
.
FilePath
);
found
{
if
err
:=
f
.
Value
.
Set
(
val
);
err
!=
nil
{
return
fmt
.
Errorf
(
"could not parse %q as timestamp value from %s for flag %s: %s"
,
val
,
source
,
f
.
Name
,
err
)
}
f
.
HasBeenSet
=
true
}
if
f
.
Destination
!=
nil
{
*
f
.
Destination
=
*
f
.
Value
}
for
_
,
name
:=
range
f
.
Names
()
{
if
f
.
Destination
!=
nil
{
set
.
Var
(
f
.
Destination
,
name
,
f
.
Usage
)
continue
}
set
.
Var
(
f
.
Value
,
name
,
f
.
Usage
)
}
return
nil
}
// Get returns the flag’s value in the given Context.
func
(
f
*
TimestampFlag
)
Get
(
ctx
*
Context
)
*
time
.
Time
{
return
ctx
.
Timestamp
(
f
.
Name
)
}
// RunAction executes flag action if set
func
(
f
*
TimestampFlag
)
RunAction
(
c
*
Context
)
error
{
if
f
.
Action
!=
nil
{
return
f
.
Action
(
c
,
c
.
Timestamp
(
f
.
Name
))
}
return
nil
}
// Timestamp gets the timestamp from a flag name
func
(
cCtx
*
Context
)
Timestamp
(
name
string
)
*
time
.
Time
{
if
fs
:=
cCtx
.
lookupFlagSet
(
name
);
fs
!=
nil
{
return
lookupTimestamp
(
name
,
fs
)
}
return
nil
}
// Fetches the timestamp value from the local timestampWrap
func
lookupTimestamp
(
name
string
,
set
*
flag
.
FlagSet
)
*
time
.
Time
{
f
:=
set
.
Lookup
(
name
)
if
f
!=
nil
{
return
(
f
.
Value
.
(
*
Timestamp
))
.
Value
()
}
return
nil
}
Prev
1
…
13
14
15
16
17
18
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment