Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
pubx
delve
提交
460f0c91
D
delve
项目概览
pubx
/
delve
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
delve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
460f0c91
编写于
2月 19, 2016
作者:
D
Derek Parker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
vendor: Update cobra and vendor cobra/doc
上级
8d4d0871
变更
20
展开全部
隐藏空白更改
内联
并排
Showing
20 changed file
with
3106 addition
and
388 deletion
+3106
-388
Godeps/Godeps.json
Godeps/Godeps.json
+29
-2
vendor/github.com/spf13/cobra/.mailmap
vendor/github.com/spf13/cobra/.mailmap
+3
-0
vendor/github.com/spf13/cobra/.travis.yml
vendor/github.com/spf13/cobra/.travis.yml
+1
-1
vendor/github.com/spf13/cobra/README.md
vendor/github.com/spf13/cobra/README.md
+561
-214
vendor/github.com/spf13/cobra/bash_completions.go
vendor/github.com/spf13/cobra/bash_completions.go
+203
-69
vendor/github.com/spf13/cobra/cobra.go
vendor/github.com/spf13/cobra/cobra.go
+0
-8
vendor/github.com/spf13/cobra/cobra/cmd/add.go
vendor/github.com/spf13/cobra/cobra/cmd/add.go
+128
-0
vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
+347
-0
vendor/github.com/spf13/cobra/cobra/cmd/init.go
vendor/github.com/spf13/cobra/cobra/cmd/init.go
+226
-0
vendor/github.com/spf13/cobra/cobra/cmd/licenses.go
vendor/github.com/spf13/cobra/cobra/cmd/licenses.go
+1133
-0
vendor/github.com/spf13/cobra/cobra/cmd/root.go
vendor/github.com/spf13/cobra/cobra/cmd/root.go
+84
-0
vendor/github.com/spf13/cobra/cobra/main.go
vendor/github.com/spf13/cobra/cobra/main.go
+20
-0
vendor/github.com/spf13/cobra/command.go
vendor/github.com/spf13/cobra/command.go
+62
-24
vendor/github.com/spf13/cobra/command_notwin.go
vendor/github.com/spf13/cobra/command_notwin.go
+5
-0
vendor/github.com/spf13/cobra/command_win.go
vendor/github.com/spf13/cobra/command_win.go
+26
-0
vendor/github.com/spf13/cobra/doc/man_docs.go
vendor/github.com/spf13/cobra/doc/man_docs.go
+55
-50
vendor/github.com/spf13/cobra/doc/man_docs.md
vendor/github.com/spf13/cobra/doc/man_docs.md
+3
-2
vendor/github.com/spf13/cobra/doc/md_docs.go
vendor/github.com/spf13/cobra/doc/md_docs.go
+175
-0
vendor/github.com/spf13/cobra/doc/md_docs.md
vendor/github.com/spf13/cobra/doc/md_docs.md
+33
-10
vendor/github.com/spf13/cobra/doc/util.go
vendor/github.com/spf13/cobra/doc/util.go
+12
-8
未找到文件。
Godeps/Godeps.json
浏览文件 @
460f0c91
...
...
@@ -2,7 +2,34 @@
"ImportPath"
:
"github.com/derekparker/delve"
,
"GoVersion"
:
"go1.5"
,
"Packages"
:
[
"./..."
"github.com/derekparker/delve/cmd/dlv"
,
"github.com/derekparker/delve/cmd/dlv/cmds"
,
"github.com/derekparker/delve/config"
,
"github.com/derekparker/delve/dwarf/frame"
,
"github.com/derekparker/delve/dwarf/line"
,
"github.com/derekparker/delve/dwarf/op"
,
"github.com/derekparker/delve/dwarf/reader"
,
"github.com/derekparker/delve/dwarf/util"
,
"github.com/derekparker/delve/localtests/bf"
,
"github.com/derekparker/delve/localtests/changeme"
,
"github.com/derekparker/delve/localtests/defer"
,
"github.com/derekparker/delve/localtests/fc"
,
"github.com/derekparker/delve/localtests/fosdem/debug"
,
"github.com/derekparker/delve/localtests/fosdem/exec"
,
"github.com/derekparker/delve/localtests/fosdem/trace"
,
"github.com/derekparker/delve/localtests/step"
,
"github.com/derekparker/delve/localtests/stepbug"
,
"github.com/derekparker/delve/localtests/test-on"
,
"github.com/derekparker/delve/proc"
,
"github.com/derekparker/delve/proc/test"
,
"github.com/derekparker/delve/scripts"
,
"github.com/derekparker/delve/service"
,
"github.com/derekparker/delve/service/api"
,
"github.com/derekparker/delve/service/debugger"
,
"github.com/derekparker/delve/service/rpc"
,
"github.com/derekparker/delve/service/test"
,
"github.com/derekparker/delve/terminal"
,
"github.com/derekparker/delve/version"
],
"Deps"
:
[
{
...
...
@@ -33,7 +60,7 @@
},
{
"ImportPath"
:
"github.com/spf13/cobra"
,
"Rev"
:
"
d732ab3a34e6e9e6b5bdac80707c2b6bad852936
"
"Rev"
:
"
65a708cee0a4424f4e353d031ce440643e312f92
"
},
{
"ImportPath"
:
"github.com/spf13/pflag"
,
...
...
vendor/github.com/spf13/cobra/.mailmap
0 → 100644
浏览文件 @
460f0c91
Steve Francia <steve.francia@gmail.com>
Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fabiano Franz <ffranz@redhat.com> <contact@fabianofranz.com>
vendor/github.com/spf13/cobra/.travis.yml
浏览文件 @
460f0c91
...
...
@@ -5,5 +5,5 @@ go:
-
1.5.1
-
tip
script
:
-
go test ./...
-
go test
-v
./...
-
go build
vendor/github.com/spf13/cobra/README.md
浏览文件 @
460f0c91
此差异已折叠。
点击以展开。
vendor/github.com/spf13/cobra/bash_completions.go
浏览文件 @
460f0c91
package
cobra
import
(
"bytes"
"fmt"
"io"
"os"
"sort"
"strings"
...
...
@@ -16,9 +16,12 @@ const (
BashCompSubdirsInDir
=
"cobra_annotation_bash_completion_subdirs_in_dir"
)
func
preamble
(
out
*
bytes
.
Buffer
)
{
fmt
.
Fprintf
(
out
,
`#!/bin/bash
func
preamble
(
out
io
.
Writer
,
name
string
)
error
{
_
,
err
:=
fmt
.
Fprintf
(
out
,
"# bash completion for %-36s -*- shell-script -*-
\n
"
,
name
)
if
err
!=
nil
{
return
err
}
_
,
err
=
fmt
.
Fprintf
(
out
,
`
__debug()
{
if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then
...
...
@@ -60,7 +63,9 @@ __handle_reply()
__debug "${FUNCNAME}"
case $cur in
-*)
compopt -o nospace
if [[ $(type -t compopt) = "builtin" ]]; then
compopt -o nospace
fi
local allflags
if [ ${#must_have_one_flag[@]} -ne 0 ]; then
allflags=("${must_have_one_flag[@]}")
...
...
@@ -68,7 +73,9 @@ __handle_reply()
allflags=("${flags[*]} ${two_word_flags[*]}")
fi
COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") )
[[ $COMPREPLY == *= ]] || compopt +o nospace
if [[ $(type -t compopt) = "builtin" ]]; then
[[ $COMPREPLY == *= ]] || compopt +o nospace
fi
return 0;
;;
esac
...
...
@@ -99,6 +106,8 @@ __handle_reply()
if [[ ${#COMPREPLY[@]} -eq 0 ]]; then
declare -F __custom_func >/dev/null && __custom_func
fi
__ltrim_colon_completions "$cur"
}
# The arguments should be in the form "ext1|ext2|extn"
...
...
@@ -120,8 +129,10 @@ __handle_flag()
# if a command required a flag, and we found it, unset must_have_one_flag()
local flagname=${words[c]}
local flagvalue
# if the word contained an =
if [[ ${words[c]} == *"="* ]]; then
flagvalue=${flagname#*=} # take in as flagvalue after the =
flagname=${flagname%%=*} # strip everything after the =
flagname="${flagname}=" # but put the = back
fi
...
...
@@ -130,6 +141,15 @@ __handle_flag()
must_have_one_flag=()
fi
# keep flag value with flagname as flaghash
if [ ${flagvalue} ] ; then
flaghash[${flagname}]=${flagvalue}
elif [ ${words[ $((c+1)) ]} ] ; then
flaghash[${flagname}]=${words[ $((c+1)) ]}
else
flaghash[${flagname}]="true" # pad "true" for bool flag
fi
# skip the argument to a two word flag
if __contains_word "${words[c]}" "${two_word_flags[@]}"; then
c=$((c+1))
...
...
@@ -139,7 +159,6 @@ __handle_flag()
fi
fi
# skip the flag itself
c=$((c+1))
}
...
...
@@ -162,9 +181,13 @@ __handle_command()
local next_command
if [[ -n ${last_command} ]]; then
next_command="_${last_command}_${words[c]}"
next_command="_${last_command}_${words[c]
//:/__
}"
else
next_command="_${words[c]}"
if [[ $c -eq 0 ]]; then
next_command="_$(basename ${words[c]//:/__})"
else
next_command="_${words[c]//:/__}"
fi
fi
c=$((c+1))
__debug "${FUNCNAME}: looking for ${next_command}"
...
...
@@ -175,13 +198,15 @@ __handle_word()
{
if [[ $c -ge $cword ]]; then
__handle_reply
return
return
fi
__debug "${FUNCNAME}: c is $c words[c] is ${words[c]}"
if [[ "${words[c]}" == -* ]]; then
__handle_flag
__handle_flag
elif __contains_word "${words[c]}" "${commands[@]}"; then
__handle_command
elif [[ $c -eq 0 ]] && __contains_word "$(basename ${words[c]})" "${commands[@]}"; then
__handle_command
else
__handle_noun
fi
...
...
@@ -189,13 +214,19 @@ __handle_word()
}
`
)
return
err
}
func
postscript
(
out
*
bytes
.
Buffer
,
name
string
)
{
fmt
.
Fprintf
(
out
,
"__start_%s()
\n
"
,
name
)
fmt
.
Fprintf
(
out
,
`{
func
postscript
(
w
io
.
Writer
,
name
string
)
error
{
name
=
strings
.
Replace
(
name
,
":"
,
"__"
,
-
1
)
_
,
err
:=
fmt
.
Fprintf
(
w
,
"__start_%s()
\n
"
,
name
)
if
err
!=
nil
{
return
err
}
_
,
err
=
fmt
.
Fprintf
(
w
,
`{
local cur prev words cword
if declare -F _init_completions >/dev/null 2>&1; then
declare -A flaghash 2>/dev/null || :
if declare -F _init_completion >/dev/null 2>&1; then
_init_completion -s || return
else
__my_init_completion || return
...
...
@@ -216,49 +247,77 @@ func postscript(out *bytes.Buffer, name string) {
}
`
,
name
)
fmt
.
Fprintf
(
out
,
"complete -F __start_%s %s
\n
"
,
name
,
name
)
fmt
.
Fprintf
(
out
,
"# ex: ts=4 sw=4 et filetype=sh
\n
"
)
if
err
!=
nil
{
return
err
}
_
,
err
=
fmt
.
Fprintf
(
w
,
`if [[ $(type -t compopt) = "builtin" ]]; then
complete -o default -F __start_%s %s
else
complete -o default -o nospace -F __start_%s %s
fi
`
,
name
,
name
,
name
,
name
)
if
err
!=
nil
{
return
err
}
_
,
err
=
fmt
.
Fprintf
(
w
,
"# ex: ts=4 sw=4 et filetype=sh
\n
"
)
return
err
}
func
writeCommands
(
cmd
*
Command
,
out
*
bytes
.
Buffer
)
{
fmt
.
Fprintf
(
out
,
" commands=()
\n
"
)
func
writeCommands
(
cmd
*
Command
,
w
io
.
Writer
)
error
{
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" commands=()
\n
"
);
err
!=
nil
{
return
err
}
for
_
,
c
:=
range
cmd
.
Commands
()
{
if
!
c
.
IsAvailableCommand
()
||
c
==
cmd
.
helpCommand
{
continue
}
fmt
.
Fprintf
(
out
,
" commands+=(%q)
\n
"
,
c
.
Name
())
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" commands+=(%q)
\n
"
,
c
.
Name
());
err
!=
nil
{
return
err
}
}
fmt
.
Fprintf
(
out
,
"
\n
"
)
_
,
err
:=
fmt
.
Fprintf
(
w
,
"
\n
"
)
return
err
}
func
writeFlagHandler
(
name
string
,
annotations
map
[
string
][]
string
,
out
*
bytes
.
Buffer
)
{
func
writeFlagHandler
(
name
string
,
annotations
map
[
string
][]
string
,
w
io
.
Writer
)
error
{
for
key
,
value
:=
range
annotations
{
switch
key
{
case
BashCompFilenameExt
:
fmt
.
Fprintf
(
out
,
" flags_with_completion+=(%q)
\n
"
,
name
)
_
,
err
:=
fmt
.
Fprintf
(
w
,
" flags_with_completion+=(%q)
\n
"
,
name
)
if
err
!=
nil
{
return
err
}
if
len
(
value
)
>
0
{
ext
:=
"__handle_filename_extension_flag "
+
strings
.
Join
(
value
,
"|"
)
fmt
.
Fprintf
(
out
,
" flags_completion+=(%q)
\n
"
,
ext
)
_
,
err
=
fmt
.
Fprintf
(
w
,
" flags_completion+=(%q)
\n
"
,
ext
)
}
else
{
ext
:=
"_filedir"
fmt
.
Fprintf
(
out
,
" flags_completion+=(%q)
\n
"
,
ext
)
_
,
err
=
fmt
.
Fprintf
(
w
,
" flags_completion+=(%q)
\n
"
,
ext
)
}
if
err
!=
nil
{
return
err
}
case
BashCompSubdirsInDir
:
fmt
.
Fprintf
(
out
,
" flags_with_completion+=(%q)
\n
"
,
name
)
_
,
err
:=
fmt
.
Fprintf
(
w
,
" flags_with_completion+=(%q)
\n
"
,
name
)
if
len
(
value
)
==
1
{
ext
:=
"__handle_subdirs_in_dir_flag "
+
value
[
0
]
fmt
.
Fprintf
(
out
,
" flags_completion+=(%q)
\n
"
,
ext
)
_
,
err
=
fmt
.
Fprintf
(
w
,
" flags_completion+=(%q)
\n
"
,
ext
)
}
else
{
ext
:=
"_filedir -d"
fmt
.
Fprintf
(
out
,
" flags_completion+=(%q)
\n
"
,
ext
)
_
,
err
=
fmt
.
Fprintf
(
w
,
" flags_completion+=(%q)
\n
"
,
ext
)
}
if
err
!=
nil
{
return
err
}
}
}
return
nil
}
func
writeShortFlag
(
flag
*
pflag
.
Flag
,
out
*
bytes
.
Buffer
)
{
func
writeShortFlag
(
flag
*
pflag
.
Flag
,
w
io
.
Writer
)
error
{
b
:=
(
flag
.
Value
.
Type
()
==
"bool"
)
name
:=
flag
.
Shorthand
format
:=
" "
...
...
@@ -266,11 +325,13 @@ func writeShortFlag(flag *pflag.Flag, out *bytes.Buffer) {
format
+=
"two_word_"
}
format
+=
"flags+=(
\"
-%s
\"
)
\n
"
fmt
.
Fprintf
(
out
,
format
,
name
)
writeFlagHandler
(
"-"
+
name
,
flag
.
Annotations
,
out
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
format
,
name
);
err
!=
nil
{
return
err
}
return
writeFlagHandler
(
"-"
+
name
,
flag
.
Annotations
,
w
)
}
func
writeFlag
(
flag
*
pflag
.
Flag
,
out
*
bytes
.
Buffer
)
{
func
writeFlag
(
flag
*
pflag
.
Flag
,
w
io
.
Writer
)
error
{
b
:=
(
flag
.
Value
.
Type
()
==
"bool"
)
name
:=
flag
.
Name
format
:=
" flags+=(
\"
--%s"
...
...
@@ -278,30 +339,64 @@ func writeFlag(flag *pflag.Flag, out *bytes.Buffer) {
format
+=
"="
}
format
+=
"
\"
)
\n
"
fmt
.
Fprintf
(
out
,
format
,
name
)
writeFlagHandler
(
"--"
+
name
,
flag
.
Annotations
,
out
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
format
,
name
);
err
!=
nil
{
return
err
}
return
writeFlagHandler
(
"--"
+
name
,
flag
.
Annotations
,
w
)
}
func
writeFlags
(
cmd
*
Command
,
out
*
bytes
.
Buffer
)
{
fmt
.
Fprintf
(
out
,
` flags=()
func
writeFlags
(
cmd
*
Command
,
w
io
.
Writer
)
error
{
_
,
err
:=
fmt
.
Fprintf
(
w
,
` flags=()
two_word_flags=()
flags_with_completion=()
flags_completion=()
`
)
if
err
!=
nil
{
return
err
}
var
visitErr
error
cmd
.
NonInheritedFlags
()
.
VisitAll
(
func
(
flag
*
pflag
.
Flag
)
{
writeFlag
(
flag
,
out
)
if
err
:=
writeFlag
(
flag
,
w
);
err
!=
nil
{
visitErr
=
err
return
}
if
len
(
flag
.
Shorthand
)
>
0
{
writeShortFlag
(
flag
,
out
)
if
err
:=
writeShortFlag
(
flag
,
w
);
err
!=
nil
{
visitErr
=
err
return
}
}
})
if
visitErr
!=
nil
{
return
visitErr
}
cmd
.
InheritedFlags
()
.
VisitAll
(
func
(
flag
*
pflag
.
Flag
)
{
if
err
:=
writeFlag
(
flag
,
w
);
err
!=
nil
{
visitErr
=
err
return
}
if
len
(
flag
.
Shorthand
)
>
0
{
if
err
:=
writeShortFlag
(
flag
,
w
);
err
!=
nil
{
visitErr
=
err
return
}
}
})
if
visitErr
!=
nil
{
return
visitErr
}
fmt
.
Fprintf
(
out
,
"
\n
"
)
_
,
err
=
fmt
.
Fprintf
(
w
,
"
\n
"
)
return
err
}
func
writeRequiredFlag
(
cmd
*
Command
,
out
*
bytes
.
Buffer
)
{
fmt
.
Fprintf
(
out
,
" must_have_one_flag=()
\n
"
)
func
writeRequiredFlag
(
cmd
*
Command
,
w
io
.
Writer
)
error
{
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" must_have_one_flag=()
\n
"
);
err
!=
nil
{
return
err
}
flags
:=
cmd
.
NonInheritedFlags
()
var
visitErr
error
flags
.
VisitAll
(
func
(
flag
*
pflag
.
Flag
)
{
for
key
:=
range
flag
.
Annotations
{
switch
key
{
...
...
@@ -312,67 +407,95 @@ func writeRequiredFlag(cmd *Command, out *bytes.Buffer) {
format
+=
"="
}
format
+=
"
\"
)
\n
"
fmt
.
Fprintf
(
out
,
format
,
flag
.
Name
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
format
,
flag
.
Name
);
err
!=
nil
{
visitErr
=
err
return
}
if
len
(
flag
.
Shorthand
)
>
0
{
fmt
.
Fprintf
(
out
,
" must_have_one_flag+=(
\"
-%s
\"
)
\n
"
,
flag
.
Shorthand
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" must_have_one_flag+=(
\"
-%s
\"
)
\n
"
,
flag
.
Shorthand
);
err
!=
nil
{
visitErr
=
err
return
}
}
}
}
})
return
visitErr
}
func
writeRequiredNoun
(
cmd
*
Command
,
out
*
bytes
.
Buffer
)
{
fmt
.
Fprintf
(
out
,
" must_have_one_noun=()
\n
"
)
func
writeRequiredNoun
(
cmd
*
Command
,
w
io
.
Writer
)
error
{
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" must_have_one_noun=()
\n
"
);
err
!=
nil
{
return
err
}
sort
.
Sort
(
sort
.
StringSlice
(
cmd
.
ValidArgs
))
for
_
,
value
:=
range
cmd
.
ValidArgs
{
fmt
.
Fprintf
(
out
,
" must_have_one_noun+=(%q)
\n
"
,
value
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" must_have_one_noun+=(%q)
\n
"
,
value
);
err
!=
nil
{
return
err
}
}
return
nil
}
func
gen
(
cmd
*
Command
,
out
*
bytes
.
Buffer
)
{
func
gen
(
cmd
*
Command
,
w
io
.
Writer
)
error
{
for
_
,
c
:=
range
cmd
.
Commands
()
{
if
!
c
.
IsAvailableCommand
()
||
c
==
cmd
.
helpCommand
{
continue
}
gen
(
c
,
out
)
if
err
:=
gen
(
c
,
w
);
err
!=
nil
{
return
err
}
}
commandName
:=
cmd
.
CommandPath
()
commandName
=
strings
.
Replace
(
commandName
,
" "
,
"_"
,
-
1
)
fmt
.
Fprintf
(
out
,
"_%s()
\n
{
\n
"
,
commandName
)
fmt
.
Fprintf
(
out
,
" last_command=%q
\n
"
,
commandName
)
writeCommands
(
cmd
,
out
)
writeFlags
(
cmd
,
out
)
writeRequiredFlag
(
cmd
,
out
)
writeRequiredNoun
(
cmd
,
out
)
fmt
.
Fprintf
(
out
,
"}
\n\n
"
)
commandName
=
strings
.
Replace
(
commandName
,
":"
,
"__"
,
-
1
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"_%s()
\n
{
\n
"
,
commandName
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
" last_command=%q
\n
"
,
commandName
);
err
!=
nil
{
return
err
}
if
err
:=
writeCommands
(
cmd
,
w
);
err
!=
nil
{
return
err
}
if
err
:=
writeFlags
(
cmd
,
w
);
err
!=
nil
{
return
err
}
if
err
:=
writeRequiredFlag
(
cmd
,
w
);
err
!=
nil
{
return
err
}
if
err
:=
writeRequiredNoun
(
cmd
,
w
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"}
\n\n
"
);
err
!=
nil
{
return
err
}
return
nil
}
func
(
cmd
*
Command
)
GenBashCompletion
(
out
*
bytes
.
Buffer
)
{
preamble
(
out
)
func
(
cmd
*
Command
)
GenBashCompletion
(
w
io
.
Writer
)
error
{
if
err
:=
preamble
(
w
,
cmd
.
Name
());
err
!=
nil
{
return
err
}
if
len
(
cmd
.
BashCompletionFunction
)
>
0
{
fmt
.
Fprintf
(
out
,
"%s
\n
"
,
cmd
.
BashCompletionFunction
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"%s
\n
"
,
cmd
.
BashCompletionFunction
);
err
!=
nil
{
return
err
}
}
gen
(
cmd
,
out
)
postscript
(
out
,
cmd
.
Name
())
if
err
:=
gen
(
cmd
,
w
);
err
!=
nil
{
return
err
}
return
postscript
(
w
,
cmd
.
Name
())
}
func
(
cmd
*
Command
)
GenBashCompletionFile
(
filename
string
)
error
{
out
:=
new
(
bytes
.
Buffer
)
cmd
.
GenBashCompletion
(
out
)
outFile
,
err
:=
os
.
Create
(
filename
)
if
err
!=
nil
{
return
err
}
defer
outFile
.
Close
()
_
,
err
=
outFile
.
Write
(
out
.
Bytes
())
if
err
!=
nil
{
return
err
}
return
nil
return
cmd
.
GenBashCompletion
(
outFile
)
}
// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag, if it exists.
...
...
@@ -380,6 +503,11 @@ func (cmd *Command) MarkFlagRequired(name string) error {
return
MarkFlagRequired
(
cmd
.
Flags
(),
name
)
}
// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag, if it exists.
func
(
cmd
*
Command
)
MarkPersistentFlagRequired
(
name
string
)
error
{
return
MarkFlagRequired
(
cmd
.
PersistentFlags
(),
name
)
}
// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag in the flag set, if it exists.
func
MarkFlagRequired
(
flags
*
pflag
.
FlagSet
,
name
string
)
error
{
return
flags
.
SetAnnotation
(
name
,
BashCompOneRequiredFlag
,
[]
string
{
"true"
})
...
...
@@ -391,6 +519,12 @@ func (cmd *Command) MarkFlagFilename(name string, extensions ...string) error {
return
MarkFlagFilename
(
cmd
.
Flags
(),
name
,
extensions
...
)
}
// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists.
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
func
(
cmd
*
Command
)
MarkPersistentFlagFilename
(
name
string
,
extensions
...
string
)
error
{
return
MarkFlagFilename
(
cmd
.
PersistentFlags
(),
name
,
extensions
...
)
}
// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists.
// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
func
MarkFlagFilename
(
flags
*
pflag
.
FlagSet
,
name
string
,
extensions
...
string
)
error
{
...
...
vendor/github.com/spf13/cobra/cobra.go
浏览文件 @
460f0c91
...
...
@@ -40,14 +40,6 @@ var initializers []func()
// Set this to true to enable it
var
EnablePrefixMatching
bool
=
false
// enables an information splash screen on Windows if the CLI is started from explorer.exe.
var
EnableWindowsMouseTrap
bool
=
true
var
MousetrapHelpText
string
=
`This is a command line tool
You need to open cmd.exe and run it from there.
`
//AddTemplateFunc adds a template function that's available to Usage and Help
//template generation.
func
AddTemplateFunc
(
name
string
,
tmplFunc
interface
{})
{
...
...
vendor/github.com/spf13/cobra/cobra/cmd/add.go
0 → 100644
浏览文件 @
460f0c91
// Copyright © 2015 Steve Francia <spf@spf13.com>.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
cmd
import
(
"fmt"
"path/filepath"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
func
init
()
{
RootCmd
.
AddCommand
(
addCmd
)
}
var
pName
string
// initialize Command
var
addCmd
=
&
cobra
.
Command
{
Use
:
"add [command name]"
,
Aliases
:
[]
string
{
"command"
},
Short
:
"Add a command to a Cobra Application"
,
Long
:
`Add (cobra add) will create a new command, with a license and
the appropriate structure for a Cobra-based CLI application,
and register it to its parent (default RootCmd).
If you want your command to be public, pass in the command name
with an initial uppercase letter.
Example: cobra add server -> resulting in a new cmd/server.go
`
,
Run
:
func
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
if
len
(
args
)
!=
1
{
er
(
"add needs a name for the command"
)
}
guessProjectPath
()
createCmdFile
(
args
[
0
])
},
}
func
init
()
{
addCmd
.
Flags
()
.
StringVarP
(
&
pName
,
"parent"
,
"p"
,
"RootCmd"
,
"name of parent command for this command"
)
}
func
parentName
()
string
{
if
!
strings
.
HasSuffix
(
strings
.
ToLower
(
pName
),
"cmd"
)
{
return
pName
+
"Cmd"
}
return
pName
}
func
createCmdFile
(
cmdName
string
)
{
lic
:=
getLicense
()
template
:=
`{{ comment .copyright }}
{{ comment .license }}
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// {{.cmdName}}Cmd represents the {{.cmdName}} command
var {{ .cmdName }}Cmd = &cobra.Command{
Use: "{{ .cmdName }}",
Short: "A brief description of your command",
Long: `
+
"`"
+
`A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`
+
"`"
+
`,
Run: func(cmd *cobra.Command, args []string) {
// TODO: Work your own magic here
fmt.Println("{{ .cmdName }} called")
},
}
func init() {
{{ .parentName }}.AddCommand({{ .cmdName }}Cmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// {{.cmdName}}Cmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// {{.cmdName}}Cmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
`
var
data
map
[
string
]
interface
{}
data
=
make
(
map
[
string
]
interface
{})
data
[
"copyright"
]
=
copyrightLine
()
data
[
"license"
]
=
lic
.
Header
data
[
"appName"
]
=
projectName
()
data
[
"viper"
]
=
viper
.
GetBool
(
"useViper"
)
data
[
"parentName"
]
=
parentName
()
data
[
"cmdName"
]
=
cmdName
err
:=
writeTemplateToFile
(
filepath
.
Join
(
ProjectPath
(),
guessCmdDir
()),
cmdName
+
".go"
,
template
,
data
)
if
err
!=
nil
{
er
(
err
)
}
fmt
.
Println
(
cmdName
,
"created at"
,
filepath
.
Join
(
ProjectPath
(),
guessCmdDir
(),
cmdName
+
".go"
))
}
vendor/github.com/spf13/cobra/cobra/cmd/helpers.go
0 → 100644
浏览文件 @
460f0c91
// Copyright © 2015 Steve Francia <spf@spf13.com>.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
cmd
import
(
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"strings"
"text/template"
"time"
"github.com/spf13/viper"
)
// var BaseDir = ""
// var AppName = ""
// var CommandDir = ""
var
funcMap
template
.
FuncMap
var
projectPath
=
""
var
inputPath
=
""
var
projectBase
=
""
// for testing only
var
testWd
=
""
var
cmdDirs
=
[]
string
{
"cmd"
,
"cmds"
,
"command"
,
"commands"
}
func
init
()
{
funcMap
=
template
.
FuncMap
{
"comment"
:
commentifyString
,
}
}
func
er
(
msg
interface
{})
{
fmt
.
Println
(
"Error:"
,
msg
)
os
.
Exit
(
-
1
)
}
// Check if a file or directory exists.
func
exists
(
path
string
)
(
bool
,
error
)
{
_
,
err
:=
os
.
Stat
(
path
)
if
err
==
nil
{
return
true
,
nil
}
if
os
.
IsNotExist
(
err
)
{
return
false
,
nil
}
return
false
,
err
}
func
ProjectPath
()
string
{
if
projectPath
==
""
{
guessProjectPath
()
}
return
projectPath
}
// wrapper of the os package so we can test better
func
getWd
()
(
string
,
error
)
{
if
testWd
==
""
{
return
os
.
Getwd
()
}
return
testWd
,
nil
}
func
guessCmdDir
()
string
{
guessProjectPath
()
if
b
,
_
:=
isEmpty
(
projectPath
);
b
{
return
"cmd"
}
files
,
_
:=
filepath
.
Glob
(
projectPath
+
string
(
os
.
PathSeparator
)
+
"c*"
)
for
_
,
f
:=
range
files
{
for
_
,
c
:=
range
cmdDirs
{
if
f
==
c
{
return
c
}
}
}
return
"cmd"
}
func
guessImportPath
()
string
{
guessProjectPath
()
if
!
strings
.
HasPrefix
(
projectPath
,
getSrcPath
())
{
er
(
"Cobra only supports project within $GOPATH"
)
}
return
filepath
.
ToSlash
(
filepath
.
Clean
(
strings
.
TrimPrefix
(
projectPath
,
getSrcPath
())))
}
func
getSrcPath
()
string
{
return
filepath
.
Join
(
os
.
Getenv
(
"GOPATH"
),
"src"
)
+
string
(
os
.
PathSeparator
)
}
func
projectName
()
string
{
return
filepath
.
Base
(
ProjectPath
())
}
func
guessProjectPath
()
{
// if no path is provided... assume CWD.
if
inputPath
==
""
{
x
,
err
:=
getWd
()
if
err
!=
nil
{
er
(
err
)
}
// inspect CWD
base
:=
filepath
.
Base
(
x
)
// if we are in the cmd directory.. back up
for
_
,
c
:=
range
cmdDirs
{
if
base
==
c
{
projectPath
=
filepath
.
Dir
(
x
)
return
}
}
if
projectPath
==
""
{
projectPath
=
filepath
.
Clean
(
x
)
return
}
}
srcPath
:=
getSrcPath
()
// if provided, inspect for logical locations
if
strings
.
ContainsRune
(
inputPath
,
os
.
PathSeparator
)
{
if
filepath
.
IsAbs
(
inputPath
)
||
filepath
.
HasPrefix
(
inputPath
,
string
(
os
.
PathSeparator
))
{
// if Absolute, use it
projectPath
=
filepath
.
Clean
(
inputPath
)
return
}
// If not absolute but contains slashes,
// assuming it means create it from $GOPATH
count
:=
strings
.
Count
(
inputPath
,
string
(
os
.
PathSeparator
))
switch
count
{
// If only one directory deep, assume "github.com"
case
1
:
projectPath
=
filepath
.
Join
(
srcPath
,
"github.com"
,
inputPath
)
return
case
2
:
projectPath
=
filepath
.
Join
(
srcPath
,
inputPath
)
return
default
:
er
(
"Unknown directory"
)
}
}
else
{
// hardest case.. just a word.
if
projectBase
==
""
{
x
,
err
:=
getWd
()
if
err
==
nil
{
projectPath
=
filepath
.
Join
(
x
,
inputPath
)
return
}
er
(
err
)
}
else
{
projectPath
=
filepath
.
Join
(
srcPath
,
projectBase
,
inputPath
)
return
}
}
}
// isEmpty checks if a given path is empty.
func
isEmpty
(
path
string
)
(
bool
,
error
)
{
if
b
,
_
:=
exists
(
path
);
!
b
{
return
false
,
fmt
.
Errorf
(
"%q path does not exist"
,
path
)
}
fi
,
err
:=
os
.
Stat
(
path
)
if
err
!=
nil
{
return
false
,
err
}
if
fi
.
IsDir
()
{
f
,
err
:=
os
.
Open
(
path
)
// FIX: Resource leak - f.close() should be called here by defer or is missed
// if the err != nil branch is taken.
defer
f
.
Close
()
if
err
!=
nil
{
return
false
,
err
}
list
,
err
:=
f
.
Readdir
(
-
1
)
// f.Close() - see bug fix above
return
len
(
list
)
==
0
,
nil
}
return
fi
.
Size
()
==
0
,
nil
}
// isDir checks if a given path is a directory.
func
isDir
(
path
string
)
(
bool
,
error
)
{
fi
,
err
:=
os
.
Stat
(
path
)
if
err
!=
nil
{
return
false
,
err
}
return
fi
.
IsDir
(),
nil
}
// dirExists checks if a path exists and is a directory.
func
dirExists
(
path
string
)
(
bool
,
error
)
{
fi
,
err
:=
os
.
Stat
(
path
)
if
err
==
nil
&&
fi
.
IsDir
()
{
return
true
,
nil
}
if
os
.
IsNotExist
(
err
)
{
return
false
,
nil
}
return
false
,
err
}
func
writeTemplateToFile
(
path
string
,
file
string
,
template
string
,
data
interface
{})
error
{
filename
:=
filepath
.
Join
(
path
,
file
)
r
,
err
:=
templateToReader
(
template
,
data
)
if
err
!=
nil
{
return
err
}
err
=
safeWriteToDisk
(
filename
,
r
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
writeStringToFile
(
path
,
file
,
text
string
)
error
{
filename
:=
filepath
.
Join
(
path
,
file
)
r
:=
strings
.
NewReader
(
text
)
err
:=
safeWriteToDisk
(
filename
,
r
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
templateToReader
(
tpl
string
,
data
interface
{})
(
io
.
Reader
,
error
)
{
tmpl
:=
template
.
New
(
""
)
tmpl
.
Funcs
(
funcMap
)
tmpl
,
err
:=
tmpl
.
Parse
(
tpl
)
if
err
!=
nil
{
return
nil
,
err
}
buf
:=
new
(
bytes
.
Buffer
)
err
=
tmpl
.
Execute
(
buf
,
data
)
return
buf
,
err
}
// Same as WriteToDisk but checks to see if file/directory already exists.
func
safeWriteToDisk
(
inpath
string
,
r
io
.
Reader
)
(
err
error
)
{
dir
,
_
:=
filepath
.
Split
(
inpath
)
ospath
:=
filepath
.
FromSlash
(
dir
)
if
ospath
!=
""
{
err
=
os
.
MkdirAll
(
ospath
,
0777
)
// rwx, rw, r
if
err
!=
nil
{
return
}
}
ex
,
err
:=
exists
(
inpath
)
if
err
!=
nil
{
return
}
if
ex
{
return
fmt
.
Errorf
(
"%v already exists"
,
inpath
)
}
file
,
err
:=
os
.
Create
(
inpath
)
if
err
!=
nil
{
return
}
defer
file
.
Close
()
_
,
err
=
io
.
Copy
(
file
,
r
)
return
}
func
getLicense
()
License
{
l
:=
whichLicense
()
if
l
!=
""
{
if
x
,
ok
:=
Licenses
[
l
];
ok
{
return
x
}
}
return
Licenses
[
"apache"
]
}
func
whichLicense
()
string
{
// if explicitly flagged, use that
if
userLicense
!=
""
{
return
matchLicense
(
userLicense
)
}
// if already present in the project, use that
// TODO: Inspect project for existing license
// default to viper's setting
return
matchLicense
(
viper
.
GetString
(
"license"
))
}
func
copyrightLine
()
string
{
author
:=
viper
.
GetString
(
"author"
)
year
:=
time
.
Now
()
.
Format
(
"2006"
)
return
"Copyright © "
+
year
+
" "
+
author
}
func
commentifyString
(
in
string
)
string
{
var
newlines
[]
string
lines
:=
strings
.
Split
(
in
,
"
\n
"
)
for
_
,
x
:=
range
lines
{
if
!
strings
.
HasPrefix
(
x
,
"//"
)
{
if
x
!=
""
{
newlines
=
append
(
newlines
,
"// "
+
x
)
}
else
{
newlines
=
append
(
newlines
,
"//"
)
}
}
else
{
newlines
=
append
(
newlines
,
x
)
}
}
return
strings
.
Join
(
newlines
,
"
\n
"
)
}
vendor/github.com/spf13/cobra/cobra/cmd/init.go
0 → 100644
浏览文件 @
460f0c91
// Copyright © 2015 Steve Francia <spf@spf13.com>.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
cmd
import
(
"fmt"
"os"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
func
init
()
{
RootCmd
.
AddCommand
(
initCmd
)
}
// initialize Command
var
initCmd
=
&
cobra
.
Command
{
Use
:
"init [name]"
,
Aliases
:
[]
string
{
"initialize"
,
"initialise"
,
"create"
},
Short
:
"Initialize a Cobra Application"
,
Long
:
`Initialize (cobra init) will create a new application, with a license
and the appropriate structure for a Cobra-based CLI application.
* If a name is provided, it will be created in the current directory;
* If no name is provided, the current directory will be assumed;
* If a relative path is provided, it will be created inside $GOPATH
(e.g. github.com/spf13/hugo);
* If an absolute path is provided, it will be created;
* If the directory already exists but is empty, it will be used.
Init will not use an existing directory with contents.`
,
Run
:
func
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
switch
len
(
args
)
{
case
0
:
inputPath
=
""
case
1
:
inputPath
=
args
[
0
]
default
:
er
(
"init doesn't support more than 1 parameter"
)
}
guessProjectPath
()
initializePath
(
projectPath
)
},
}
func
initializePath
(
path
string
)
{
b
,
err
:=
exists
(
path
)
if
err
!=
nil
{
er
(
err
)
}
if
!
b
{
// If path doesn't yet exist, create it
err
:=
os
.
MkdirAll
(
path
,
os
.
ModePerm
)
if
err
!=
nil
{
er
(
err
)
}
}
else
{
// If path exists and is not empty don't use it
empty
,
err
:=
exists
(
path
)
if
err
!=
nil
{
er
(
err
)
}
if
!
empty
{
er
(
"Cobra will not create a new project in a non empty directory"
)
}
}
// We have a directory and it's empty.. Time to initialize it.
createLicenseFile
()
createMainFile
()
createRootCmdFile
()
}
func
createLicenseFile
()
{
lic
:=
getLicense
()
template
:=
lic
.
Text
var
data
map
[
string
]
interface
{}
data
=
make
(
map
[
string
]
interface
{})
// Try to remove the email address, if any
data
[
"copyright"
]
=
strings
.
Split
(
copyrightLine
(),
" <"
)[
0
]
err
:=
writeTemplateToFile
(
ProjectPath
(),
"LICENSE"
,
template
,
data
)
_
=
err
// if err != nil {
// er(err)
// }
}
func
createMainFile
()
{
lic
:=
getLicense
()
template
:=
`{{ comment .copyright }}
{{ comment .license }}
package main
import "{{ .importpath }}"
func main() {
cmd.Execute()
}
`
var
data
map
[
string
]
interface
{}
data
=
make
(
map
[
string
]
interface
{})
data
[
"copyright"
]
=
copyrightLine
()
data
[
"license"
]
=
lic
.
Header
data
[
"importpath"
]
=
guessImportPath
()
+
"/"
+
guessCmdDir
()
err
:=
writeTemplateToFile
(
ProjectPath
(),
"main.go"
,
template
,
data
)
_
=
err
// if err != nil {
// er(err)
// }
}
func
createRootCmdFile
()
{
lic
:=
getLicense
()
template
:=
`{{ comment .copyright }}
{{ comment .license }}
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
{{ if .viper }} "github.com/spf13/viper"
{{ end }})
{{if .viper}}
var cfgFile string
{{ end }}
// This represents the base command when called without any subcommands
var RootCmd = &cobra.Command{
Use: "{{ .appName }}",
Short: "A brief description of your application",
Long: `
+
"`"
+
`A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`
+
"`"
+
`,
// Uncomment the following line if your bare application
// has an action associated with it:
// Run: func(cmd *cobra.Command, args []string) { },
}
// Execute adds all child commands to the root command sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
if err := RootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(-1)
}
}
func init() {
{{ if .viper }} cobra.OnInitialize(initConfig)
{{ end }} // Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags, which, if defined here,
// will be global for your application.
{{ if .viper }}
RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)")
{{ else }}
// RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.{{ .appName }}.yaml)")
{{ end }} // Cobra also supports local flags, which will only run
// when this action is called directly.
RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
{{ if .viper }}
// initConfig reads in config file and ENV variables if set.
func initConfig() {
if cfgFile != "" { // enable ability to specify config file via flag
viper.SetConfigFile(cfgFile)
}
viper.SetConfigName(".{{ .appName }}") // name of config file (without extension)
viper.AddConfigPath("$HOME") // adding home directory as first search path
viper.AutomaticEnv() // read in environment variables that match
// If a config file is found, read it in.
if err := viper.ReadInConfig(); err == nil {
fmt.Println("Using config file:", viper.ConfigFileUsed())
}
}
{{ end }}`
var
data
map
[
string
]
interface
{}
data
=
make
(
map
[
string
]
interface
{})
data
[
"copyright"
]
=
copyrightLine
()
data
[
"license"
]
=
lic
.
Header
data
[
"appName"
]
=
projectName
()
data
[
"viper"
]
=
viper
.
GetBool
(
"useViper"
)
err
:=
writeTemplateToFile
(
ProjectPath
()
+
string
(
os
.
PathSeparator
)
+
guessCmdDir
(),
"root.go"
,
template
,
data
)
if
err
!=
nil
{
er
(
err
)
}
fmt
.
Println
(
"Your Cobra application is ready at"
)
fmt
.
Println
(
ProjectPath
())
fmt
.
Println
(
"Give it a try by going there and running `go run main.go`"
)
fmt
.
Println
(
"Add commands to it by running `cobra add [cmdname]`"
)
}
vendor/github.com/spf13/cobra/cobra/cmd/licenses.go
0 → 100644
浏览文件 @
460f0c91
此差异已折叠。
点击以展开。
vendor/github.com/spf13/cobra/cobra/cmd/root.go
0 → 100644
浏览文件 @
460f0c91
// Copyright © 2015 Steve Francia <spf@spf13.com>.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
cmd
import
(
"fmt"
"os"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
var
cfgFile
string
var
userLicense
string
// This represents the base command when called without any subcommands
var
RootCmd
=
&
cobra
.
Command
{
Use
:
"cobra"
,
Short
:
"A generator for Cobra based Applications"
,
Long
:
`Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`
,
}
//Execute adds all child commands to the root command sets flags appropriately.
func
Execute
()
{
if
err
:=
RootCmd
.
Execute
();
err
!=
nil
{
fmt
.
Println
(
err
)
os
.
Exit
(
-
1
)
}
}
func
init
()
{
cobra
.
OnInitialize
(
initConfig
)
RootCmd
.
PersistentFlags
()
.
StringVar
(
&
cfgFile
,
"config"
,
""
,
"config file (default is $HOME/.cobra.yaml)"
)
RootCmd
.
PersistentFlags
()
.
StringVarP
(
&
projectBase
,
"projectbase"
,
"b"
,
""
,
"base project directory, e.g. github.com/spf13/"
)
RootCmd
.
PersistentFlags
()
.
StringP
(
"author"
,
"a"
,
"YOUR NAME"
,
"Author name for copyright attribution"
)
RootCmd
.
PersistentFlags
()
.
StringVarP
(
&
userLicense
,
"license"
,
"l"
,
""
,
"Name of license for the project (can provide `licensetext` in config)"
)
RootCmd
.
PersistentFlags
()
.
Bool
(
"viper"
,
true
,
"Use Viper for configuration"
)
viper
.
BindPFlag
(
"author"
,
RootCmd
.
PersistentFlags
()
.
Lookup
(
"author"
))
viper
.
BindPFlag
(
"projectbase"
,
RootCmd
.
PersistentFlags
()
.
Lookup
(
"projectbase"
))
viper
.
BindPFlag
(
"useViper"
,
RootCmd
.
PersistentFlags
()
.
Lookup
(
"viper"
))
viper
.
SetDefault
(
"author"
,
"NAME HERE <EMAIL ADDRESS>"
)
viper
.
SetDefault
(
"license"
,
"apache"
)
viper
.
SetDefault
(
"licenseText"
,
`
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
`
)
}
// Read in config file and ENV variables if set.
func
initConfig
()
{
if
cfgFile
!=
""
{
// enable ability to specify config file via flag
viper
.
SetConfigFile
(
cfgFile
)
}
viper
.
SetConfigName
(
".cobra"
)
// name of config file (without extension)
viper
.
AddConfigPath
(
"$HOME"
)
// adding home directory as first search path
viper
.
AutomaticEnv
()
// read in environment variables that match
// If a config file is found, read it in.
if
err
:=
viper
.
ReadInConfig
();
err
==
nil
{
fmt
.
Println
(
"Using config file:"
,
viper
.
ConfigFileUsed
())
}
}
vendor/github.com/spf13/cobra/cobra/main.go
0 → 100644
浏览文件 @
460f0c91
// Copyright © 2015 Steve Francia <spf@spf13.com>.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package
main
import
"github.com/spf13/cobra/cobra/cmd"
func
main
()
{
cmd
.
Execute
()
}
vendor/github.com/spf13/cobra/command.go
浏览文件 @
460f0c91
...
...
@@ -20,11 +20,9 @@ import (
"fmt"
"io"
"os"
"
runtime
"
"
path/filepath
"
"strings"
"time"
"github.com/inconshreveable/mousetrap"
flag
"github.com/spf13/pflag"
)
...
...
@@ -61,6 +59,10 @@ type Command struct {
pflags
*
flag
.
FlagSet
// Flags that are declared specifically by this command (not inherited).
lflags
*
flag
.
FlagSet
// SilenceErrors is an option to quiet errors down stream
SilenceErrors
bool
// Silence Usage is an option to silence usage when an error occurs.
SilenceUsage
bool
// The *Run functions are executed in the following order:
// * PersistentPreRun()
// * PreRun()
...
...
@@ -88,6 +90,8 @@ type Command struct {
PersistentPostRun
func
(
cmd
*
Command
,
args
[]
string
)
// PersistentPostRunE: PersistentPostRun but returns an error
PersistentPostRunE
func
(
cmd
*
Command
,
args
[]
string
)
error
// DisableAutoGenTag remove
DisableAutoGenTag
bool
// Commands is the list of commands supported by this program.
commands
[]
*
Command
// Parent Command for this command
...
...
@@ -469,20 +473,38 @@ func (c *Command) SuggestionsFor(typedName string) []string {
return
suggestions
}
func
(
c
*
Command
)
VisitParents
(
fn
func
(
*
Command
))
{
var
traverse
func
(
*
Command
)
*
Command
traverse
=
func
(
x
*
Command
)
*
Command
{
if
x
!=
c
{
fn
(
x
)
}
if
x
.
HasParent
()
{
return
traverse
(
x
.
parent
)
}
return
x
}
traverse
(
c
)
}
func
(
c
*
Command
)
Root
()
*
Command
{
var
findRoot
func
(
*
Command
)
*
Command
findRoot
=
func
(
x
*
Command
)
*
Command
{
if
x
.
HasParent
()
{
return
findRoot
(
x
.
parent
)
}
else
{
return
x
}
return
x
}
return
findRoot
(
c
)
}
// ArgsLenAtDash will return the length of f.Args at the moment when a -- was
// found during arg parsing. This allows your program to know which args were
// before the -- and which came after. (Description from
// https://godoc.org/github.com/spf13/pflag#FlagSet.ArgsLenAtDash).
func
(
c
*
Command
)
ArgsLenAtDash
()
int
{
return
c
.
Flags
()
.
ArgsLenAtDash
()
}
...
...
@@ -589,19 +611,21 @@ func (c *Command) errorMsgFromParse() string {
// Call execute to use the args (os.Args[1:] by default)
// and run through the command tree finding appropriate matches
// for commands and then corresponding flags.
func
(
c
*
Command
)
Execute
()
(
err
error
)
{
func
(
c
*
Command
)
Execute
()
error
{
_
,
err
:=
c
.
ExecuteC
()
return
err
}
func
(
c
*
Command
)
ExecuteC
()
(
cmd
*
Command
,
err
error
)
{
// Regardless of what command execute is called on, run on Root only
if
c
.
HasParent
()
{
return
c
.
Root
()
.
Execute
()
return
c
.
Root
()
.
Execute
C
()
}
if
EnableWindowsMouseTrap
&&
runtime
.
GOOS
==
"windows"
{
if
mousetrap
.
StartedByExplorer
()
{
c
.
Print
(
MousetrapHelpText
)
time
.
Sleep
(
5
*
time
.
Second
)
os
.
Exit
(
1
)
}
// windows hook
if
preExecHookFn
!=
nil
{
preExecHookFn
(
c
)
}
// initialize help as the last point possible to allow for user
...
...
@@ -610,7 +634,8 @@ func (c *Command) Execute() (err error) {
var
args
[]
string
if
len
(
c
.
args
)
==
0
{
// Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155
if
c
.
args
==
nil
&&
filepath
.
Base
(
os
.
Args
[
0
])
!=
"cobra.test"
{
args
=
os
.
Args
[
1
:
]
}
else
{
args
=
c
.
args
...
...
@@ -622,22 +647,35 @@ func (c *Command) Execute() (err error) {
if
cmd
!=
nil
{
c
=
cmd
}
c
.
Println
(
"Error:"
,
err
.
Error
())
c
.
Printf
(
"Run '%v --help' for usage.
\n
"
,
c
.
CommandPath
())
return
err
if
!
c
.
SilenceErrors
{
c
.
Println
(
"Error:"
,
err
.
Error
())
c
.
Printf
(
"Run '%v --help' for usage.
\n
"
,
c
.
CommandPath
())
}
return
c
,
err
}
err
=
cmd
.
execute
(
flags
)
if
err
!=
nil
{
// Always show help if requested, even if SilenceErrors is in
// effect
if
err
==
flag
.
ErrHelp
{
cmd
.
HelpFunc
()(
cmd
,
args
)
return
nil
return
cmd
,
nil
}
c
.
Println
(
cmd
.
UsageString
())
c
.
Println
(
"Error:"
,
err
.
Error
())
}
return
// If root command has SilentErrors flagged,
// all subcommands should respect it
if
!
cmd
.
SilenceErrors
&&
!
c
.
SilenceErrors
{
c
.
Println
(
"Error:"
,
err
.
Error
())
}
// If root command has SilentUsage flagged,
// all subcommands should respect it
if
!
cmd
.
SilenceUsage
&&
!
c
.
SilenceUsage
{
c
.
Println
(
cmd
.
UsageString
())
}
return
cmd
,
err
}
return
cmd
,
nil
}
func
(
c
*
Command
)
initHelpFlag
()
{
...
...
@@ -706,7 +744,7 @@ func (c *Command) AddCommand(cmds ...*Command) {
if
nameLen
>
c
.
commandsMaxNameLen
{
c
.
commandsMaxNameLen
=
nameLen
}
// If gl
a
bal normalization function exists, update all children
// If gl
o
bal normalization function exists, update all children
if
c
.
globNormFunc
!=
nil
{
x
.
SetGlobalNormalizationFunc
(
c
.
globNormFunc
)
}
...
...
vendor/github.com/spf13/cobra/command_notwin.go
0 → 100644
浏览文件 @
460f0c91
// +build !windows
package
cobra
var
preExecHookFn
func
(
*
Command
)
=
nil
vendor/github.com/spf13/cobra/command_win.go
0 → 100644
浏览文件 @
460f0c91
// +build windows
package
cobra
import
(
"os"
"time"
"github.com/inconshreveable/mousetrap"
)
var
preExecHookFn
=
preExecHook
// enables an information splash screen on Windows if the CLI is started from explorer.exe.
var
MousetrapHelpText
string
=
`This is a command line tool
You need to open cmd.exe and run it from there.
`
func
preExecHook
(
c
*
Command
)
{
if
mousetrap
.
StartedByExplorer
()
{
c
.
Print
(
MousetrapHelpText
)
time
.
Sleep
(
5
*
time
.
Second
)
os
.
Exit
(
1
)
}
}
vendor/github.com/spf13/cobra/man_docs.go
→
vendor/github.com/spf13/cobra/
doc/
man_docs.go
浏览文件 @
460f0c91
...
...
@@ -11,57 +11,58 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package
cobra
package
doc
import
(
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"sort"
"strings"
"time"
mangen
"github.com/cpuguy83/go-md2man/md2man"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
// GenManTree will call cmd.GenManTree(header, dir)
func
GenManTree
(
cmd
*
Command
,
header
*
GenManHeader
,
dir
string
)
{
cmd
.
GenManTree
(
header
,
dir
)
}
// GenManTree will generate a man page for this command and all decendants
// in the directory given. The header may be nil. This function may not work
// correctly if your command names have - in them. If you have `cmd` with two
// subcmds, `sub` and `sub-third`. And `sub` has a subcommand called `third`
// it is undefined which help output will be in the file `cmd-sub-third.1`.
func
(
cmd
*
Command
)
GenManTree
(
header
*
GenManHeader
,
dir
string
)
{
func
GenManTree
(
cmd
*
cobra
.
Command
,
header
*
GenManHeader
,
dir
string
)
error
{
if
header
==
nil
{
header
=
&
GenManHeader
{}
}
for
_
,
c
:=
range
cmd
.
Commands
()
{
if
!
c
.
IsAvailableCommand
()
||
c
==
cmd
.
helpCommand
{
if
!
c
.
IsAvailableCommand
()
||
c
.
IsHelpCommand
()
{
continue
}
GenManTree
(
c
,
header
,
dir
)
if
err
:=
GenManTree
(
c
,
header
,
dir
);
err
!=
nil
{
return
err
}
}
out
:=
new
(
bytes
.
Buffer
)
needToResetTitle
:=
header
.
Title
==
""
cmd
.
GenMan
(
header
,
out
)
filename
:=
cmd
.
CommandPath
()
filename
=
dir
+
strings
.
Replace
(
filename
,
" "
,
"-"
,
-
1
)
+
".1"
outFile
,
err
:=
os
.
Create
(
filename
)
basename
:=
strings
.
Replace
(
cmd
.
CommandPath
(),
" "
,
"_"
,
-
1
)
+
".1"
filename
:=
filepath
.
Join
(
dir
,
basename
)
f
,
err
:=
os
.
Create
(
filename
)
if
err
!=
nil
{
fmt
.
Println
(
err
)
os
.
Exit
(
1
)
return
err
}
defer
outFile
.
Close
()
_
,
err
=
outFile
.
Write
(
out
.
Bytes
())
if
err
!=
nil
{
fmt
.
Println
(
err
)
os
.
Exit
(
1
)
defer
f
.
Close
()
if
err
:=
GenMan
(
cmd
,
header
,
f
);
err
!=
nil
{
return
err
}
if
needToResetTitle
{
header
.
Title
=
""
}
return
nil
}
// GenManHeader is a lot like the .TH header at the start of man pages. These
...
...
@@ -77,25 +78,21 @@ type GenManHeader struct {
Manual
string
}
// GenMan will call cmd.GenMan(header, out)
func
GenMan
(
cmd
*
Command
,
header
*
GenManHeader
,
out
*
bytes
.
Buffer
)
{
cmd
.
GenMan
(
header
,
out
)
}
// GenMan will generate a man page for the given command in the out buffer.
// The header argument may be nil, however obviously out may not.
func
(
cmd
*
Command
)
GenMan
(
header
*
GenManHeader
,
out
*
bytes
.
Buffer
)
{
// GenMan will generate a man page for the given command and write it to
// w. The header argument may be nil, however obviously w may not.
func
GenMan
(
cmd
*
cobra
.
Command
,
header
*
GenManHeader
,
w
io
.
Writer
)
error
{
if
header
==
nil
{
header
=
&
GenManHeader
{}
}
buf
:=
genMarkdown
(
cmd
,
header
)
final
:=
mangen
.
Render
(
buf
)
out
.
Write
(
final
)
b
:=
genMan
(
cmd
,
header
)
final
:=
mangen
.
Render
(
b
)
_
,
err
:=
w
.
Write
(
final
)
return
err
}
func
fillHeader
(
header
*
GenManHeader
,
name
string
)
{
if
header
.
Title
==
""
{
header
.
Title
=
name
header
.
Title
=
strings
.
ToUpper
(
strings
.
Replace
(
name
,
" "
,
"
\\
-"
,
-
1
))
}
if
header
.
Section
==
""
{
header
.
Section
=
"1"
...
...
@@ -110,20 +107,21 @@ func fillHeader(header *GenManHeader, name string) {
}
}
func
manPreamble
(
out
*
bytes
.
Buffer
,
header
*
GenManHeader
,
name
,
short
,
long
string
)
{
func
manPreamble
(
out
io
.
Writer
,
header
*
GenManHeader
,
name
,
short
,
long
string
)
{
dashName
:=
strings
.
Replace
(
name
,
" "
,
"-"
,
-
1
)
fmt
.
Fprintf
(
out
,
`%% %s(%s)%s
%% %s
%% %s
# NAME
`
,
header
.
Title
,
header
.
Section
,
header
.
date
,
header
.
Source
,
header
.
Manual
)
fmt
.
Fprintf
(
out
,
"%s
\\
- %s
\n\n
"
,
n
ame
,
short
)
fmt
.
Fprintf
(
out
,
"%s
\\
- %s
\n\n
"
,
dashN
ame
,
short
)
fmt
.
Fprintf
(
out
,
"# SYNOPSIS
\n
"
)
fmt
.
Fprintf
(
out
,
"**%s** [OPTIONS]
\n\n
"
,
name
)
fmt
.
Fprintf
(
out
,
"# DESCRIPTION
\n
"
)
fmt
.
Fprintf
(
out
,
"%s
\n\n
"
,
long
)
}
func
manPrintFlags
(
out
*
bytes
.
Buff
er
,
flags
*
pflag
.
FlagSet
)
{
func
manPrintFlags
(
out
io
.
Writ
er
,
flags
*
pflag
.
FlagSet
)
{
flags
.
VisitAll
(
func
(
flag
*
pflag
.
Flag
)
{
if
len
(
flag
.
Deprecated
)
>
0
||
flag
.
Hidden
{
return
...
...
@@ -151,7 +149,7 @@ func manPrintFlags(out *bytes.Buffer, flags *pflag.FlagSet) {
})
}
func
manPrintOptions
(
out
*
bytes
.
Buffer
,
command
*
Command
)
{
func
manPrintOptions
(
out
io
.
Writer
,
command
*
cobra
.
Command
)
{
flags
:=
command
.
NonInheritedFlags
()
if
flags
.
HasFlags
()
{
fmt
.
Fprintf
(
out
,
"# OPTIONS
\n
"
)
...
...
@@ -166,13 +164,14 @@ func manPrintOptions(out *bytes.Buffer, command *Command) {
}
}
func
genMarkdown
(
cmd
*
Command
,
header
*
GenManHeader
)
[]
byte
{
fillHeader
(
header
,
cmd
.
Name
())
func
genMan
(
cmd
*
cobra
.
Command
,
header
*
GenManHeader
)
[]
byte
{
// something like `rootcmd subcmd1 subcmd2`
commandName
:=
cmd
.
CommandPath
()
// something like `rootcmd-subcmd1-subcmd2`
dashCommandName
:=
strings
.
Replace
(
commandName
,
" "
,
"-"
,
-
1
)
fillHeader
(
header
,
commandName
)
buf
:=
new
(
bytes
.
Buffer
)
short
:=
cmd
.
Short
...
...
@@ -183,31 +182,37 @@ func genMarkdown(cmd *Command, header *GenManHeader) []byte {
manPreamble
(
buf
,
header
,
commandName
,
short
,
long
)
manPrintOptions
(
buf
,
cmd
)
if
len
(
cmd
.
Example
)
>
0
{
fmt
.
Fprintf
(
buf
,
"# EXAMPLE
\n
"
)
fmt
.
Fprintf
(
buf
,
"```
\n
%s
\n
```
\n
"
,
cmd
.
Example
)
}
if
cmd
.
hasSeeAlso
()
{
if
hasSeeAlso
(
cmd
)
{
fmt
.
Fprintf
(
buf
,
"# SEE ALSO
\n
"
)
if
cmd
.
HasParent
()
{
parentPath
:=
cmd
.
Parent
()
.
CommandPath
()
dashParentPath
:=
strings
.
Replace
(
parentPath
,
" "
,
"-"
,
-
1
)
fmt
.
Fprintf
(
buf
,
"**%s(%s)**, "
,
dashParentPath
,
header
.
Section
)
fmt
.
Fprintf
(
buf
,
"**%s(%s)**"
,
dashParentPath
,
header
.
Section
)
cmd
.
VisitParents
(
func
(
c
*
cobra
.
Command
)
{
if
c
.
DisableAutoGenTag
{
cmd
.
DisableAutoGenTag
=
c
.
DisableAutoGenTag
}
})
}
children
:=
cmd
.
Commands
()
sort
.
Sort
(
byName
(
children
))
for
_
,
c
:=
range
children
{
if
!
c
.
IsAvailableCommand
()
||
c
==
cmd
.
helpCommand
{
for
i
,
c
:=
range
children
{
if
!
c
.
IsAvailableCommand
()
||
c
.
IsHelpCommand
()
{
continue
}
fmt
.
Fprintf
(
buf
,
"**%s-%s(%s)**, "
,
dashCommandName
,
c
.
Name
(),
header
.
Section
)
if
cmd
.
HasParent
()
||
i
>
0
{
fmt
.
Fprintf
(
buf
,
", "
)
}
fmt
.
Fprintf
(
buf
,
"**%s-%s(%s)**"
,
dashCommandName
,
c
.
Name
(),
header
.
Section
)
}
fmt
.
Fprintf
(
buf
,
"
\n
"
)
}
fmt
.
Fprintf
(
buf
,
"# HISTORY
\n
%s Auto generated by spf13/cobra
\n
"
,
header
.
Date
.
Format
(
"2-Jan-2006"
))
if
!
cmd
.
DisableAutoGenTag
{
fmt
.
Fprintf
(
buf
,
"# HISTORY
\n
%s Auto generated by spf13/cobra
\n
"
,
header
.
Date
.
Format
(
"2-Jan-2006"
))
}
return
buf
.
Bytes
()
}
vendor/github.com/spf13/cobra/man_docs.md
→
vendor/github.com/spf13/cobra/
doc/
man_docs.md
浏览文件 @
460f0c91
# Generating Man Pages For Your Own cobra.Command
Generating
bash completion
s from a cobra command is incredibly easy. An example is as follows:
Generating
man page
s from a cobra command is incredibly easy. An example is as follows:
```
go
package
main
import
(
"github.com/spf13/cobra"
"github.com/spf13/cobra/doc"
)
func
main
()
{
...
...
@@ -18,7 +19,7 @@ func main() {
Title
:
"MINE"
,
Section
:
"3"
,
}
cmd
.
GenManTree
(
header
,
"/tmp"
)
doc
.
GenManTree
(
cmd
,
header
,
"/tmp"
)
}
```
...
...
vendor/github.com/spf13/cobra/md_docs.go
→
vendor/github.com/spf13/cobra/
doc/
md_docs.go
浏览文件 @
460f0c91
...
...
@@ -11,54 +11,52 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package
cobra
package
doc
import
(
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"sort"
"strings"
"time"
"github.com/spf13/cobra"
)
func
printOptions
(
out
*
bytes
.
Buffer
,
cmd
*
Command
,
name
string
)
{
func
printOptions
(
w
io
.
Writer
,
cmd
*
cobra
.
Command
,
name
string
)
error
{
flags
:=
cmd
.
NonInheritedFlags
()
flags
.
SetOutput
(
out
)
flags
.
SetOutput
(
w
)
if
flags
.
HasFlags
()
{
fmt
.
Fprintf
(
out
,
"### Options
\n\n
```
\n
"
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"### Options
\n\n
```
\n
"
);
err
!=
nil
{
return
err
}
flags
.
PrintDefaults
()
fmt
.
Fprintf
(
out
,
"```
\n\n
"
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"```
\n\n
"
);
err
!=
nil
{
return
err
}
}
parentFlags
:=
cmd
.
InheritedFlags
()
parentFlags
.
SetOutput
(
out
)
parentFlags
.
SetOutput
(
w
)
if
parentFlags
.
HasFlags
()
{
fmt
.
Fprintf
(
out
,
"### Options inherited from parent commands
\n\n
```
\n
"
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"### Options inherited from parent commands
\n\n
```
\n
"
);
err
!=
nil
{
return
err
}
parentFlags
.
PrintDefaults
()
fmt
.
Fprintf
(
out
,
"```
\n\n
"
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"```
\n\n
"
);
err
!=
nil
{
return
err
}
}
return
nil
}
type
byName
[]
*
Command
func
(
s
byName
)
Len
()
int
{
return
len
(
s
)
}
func
(
s
byName
)
Swap
(
i
,
j
int
)
{
s
[
i
],
s
[
j
]
=
s
[
j
],
s
[
i
]
}
func
(
s
byName
)
Less
(
i
,
j
int
)
bool
{
return
s
[
i
]
.
Name
()
<
s
[
j
]
.
Name
()
}
func
GenMarkdown
(
cmd
*
Command
,
out
*
bytes
.
Buffer
)
{
cmd
.
GenMarkdown
(
out
)
}
func
(
cmd
*
Command
)
GenMarkdown
(
out
*
bytes
.
Buffer
)
{
cmd
.
GenMarkdownCustom
(
out
,
func
(
s
string
)
string
{
return
s
})
func
GenMarkdown
(
cmd
*
cobra
.
Command
,
w
io
.
Writer
)
error
{
return
GenMarkdownCustom
(
cmd
,
w
,
func
(
s
string
)
string
{
return
s
})
}
func
GenMarkdownCustom
(
cmd
*
Command
,
out
*
bytes
.
Buffer
,
linkHandler
func
(
string
)
string
)
{
cmd
.
GenMarkdownCustom
(
out
,
linkHandler
)
}
func
(
cmd
*
Command
)
GenMarkdownCustom
(
out
*
bytes
.
Buffer
,
linkHandler
func
(
string
)
string
)
{
func
GenMarkdownCustom
(
cmd
*
cobra
.
Command
,
w
io
.
Writer
,
linkHandler
func
(
string
)
string
)
error
{
name
:=
cmd
.
CommandPath
()
short
:=
cmd
.
Short
...
...
@@ -67,91 +65,111 @@ func (cmd *Command) GenMarkdownCustom(out *bytes.Buffer, linkHandler func(string
long
=
short
}
fmt
.
Fprintf
(
out
,
"## %s
\n\n
"
,
name
)
fmt
.
Fprintf
(
out
,
"%s
\n\n
"
,
short
)
fmt
.
Fprintf
(
out
,
"### Synopsis
\n\n
"
)
fmt
.
Fprintf
(
out
,
"
\n
%s
\n\n
"
,
long
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"## %s
\n\n
"
,
name
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"%s
\n\n
"
,
short
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"### Synopsis
\n\n
"
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"
\n
%s
\n\n
"
,
long
);
err
!=
nil
{
return
err
}
if
cmd
.
Runnable
()
{
fmt
.
Fprintf
(
out
,
"```
\n
%s
\n
```
\n\n
"
,
cmd
.
UseLine
())
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"```
\n
%s
\n
```
\n\n
"
,
cmd
.
UseLine
());
err
!=
nil
{
return
err
}
}
if
len
(
cmd
.
Example
)
>
0
{
fmt
.
Fprintf
(
out
,
"### Examples
\n\n
"
)
fmt
.
Fprintf
(
out
,
"```
\n
%s
\n
```
\n\n
"
,
cmd
.
Example
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"### Examples
\n\n
"
);
err
!=
nil
{
return
err
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"```
\n
%s
\n
```
\n\n
"
,
cmd
.
Example
);
err
!=
nil
{
return
err
}
}
printOptions
(
out
,
cmd
,
name
)
if
cmd
.
hasSeeAlso
()
{
fmt
.
Fprintf
(
out
,
"### SEE ALSO
\n
"
)
if
err
:=
printOptions
(
w
,
cmd
,
name
);
err
!=
nil
{
return
err
}
if
hasSeeAlso
(
cmd
)
{
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"### SEE ALSO
\n
"
);
err
!=
nil
{
return
err
}
if
cmd
.
HasParent
()
{
parent
:=
cmd
.
Parent
()
pname
:=
parent
.
CommandPath
()
link
:=
pname
+
".md"
link
=
strings
.
Replace
(
link
,
" "
,
"_"
,
-
1
)
fmt
.
Fprintf
(
out
,
"* [%s](%s)
\t
- %s
\n
"
,
pname
,
linkHandler
(
link
),
parent
.
Short
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"* [%s](%s)
\t
- %s
\n
"
,
pname
,
linkHandler
(
link
),
parent
.
Short
);
err
!=
nil
{
return
err
}
cmd
.
VisitParents
(
func
(
c
*
cobra
.
Command
)
{
if
c
.
DisableAutoGenTag
{
cmd
.
DisableAutoGenTag
=
c
.
DisableAutoGenTag
}
})
}
children
:=
cmd
.
Commands
()
sort
.
Sort
(
byName
(
children
))
for
_
,
child
:=
range
children
{
if
!
child
.
IsAvailableCommand
()
||
child
==
cmd
.
helpCommand
{
if
!
child
.
IsAvailableCommand
()
||
child
.
IsHelpCommand
()
{
continue
}
cname
:=
name
+
" "
+
child
.
Name
()
link
:=
cname
+
".md"
link
=
strings
.
Replace
(
link
,
" "
,
"_"
,
-
1
)
fmt
.
Fprintf
(
out
,
"* [%s](%s)
\t
- %s
\n
"
,
cname
,
linkHandler
(
link
),
child
.
Short
)
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"* [%s](%s)
\t
- %s
\n
"
,
cname
,
linkHandler
(
link
),
child
.
Short
);
err
!=
nil
{
return
err
}
}
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"
\n
"
);
err
!=
nil
{
return
err
}
fmt
.
Fprintf
(
out
,
"
\n
"
)
}
fmt
.
Fprintf
(
out
,
"###### Auto generated by spf13/cobra on %s
\n
"
,
time
.
Now
()
.
Format
(
"2-Jan-2006"
))
}
func
GenMarkdownTree
(
cmd
*
Command
,
dir
string
)
{
cmd
.
GenMarkdownTree
(
dir
)
if
!
cmd
.
DisableAutoGenTag
{
if
_
,
err
:=
fmt
.
Fprintf
(
w
,
"###### Auto generated by spf13/cobra on %s
\n
"
,
time
.
Now
()
.
Format
(
"2-Jan-2006"
));
err
!=
nil
{
return
err
}
}
return
nil
}
func
(
cmd
*
Command
)
GenMarkdownTree
(
dir
string
)
{
func
GenMarkdownTree
(
cmd
*
cobra
.
Command
,
dir
string
)
error
{
identity
:=
func
(
s
string
)
string
{
return
s
}
emptyStr
:=
func
(
s
string
)
string
{
return
""
}
cmd
.
GenMarkdownTreeCustom
(
dir
,
emptyStr
,
identity
)
return
GenMarkdownTreeCustom
(
cmd
,
dir
,
emptyStr
,
identity
)
}
func
GenMarkdownTreeCustom
(
cmd
*
Command
,
dir
string
,
filePrepender
func
(
string
)
string
,
linkHandler
func
(
string
)
string
)
{
cmd
.
GenMarkdownTreeCustom
(
dir
,
filePrepender
,
linkHandler
)
}
func
(
cmd
*
Command
)
GenMarkdownTreeCustom
(
dir
string
,
filePrepender
func
(
string
)
string
,
linkHandler
func
(
string
)
string
)
{
func
GenMarkdownTreeCustom
(
cmd
*
cobra
.
Command
,
dir
string
,
filePrepender
,
linkHandler
func
(
string
)
string
)
error
{
for
_
,
c
:=
range
cmd
.
Commands
()
{
if
!
c
.
IsAvailableCommand
()
||
c
==
cmd
.
helpCommand
{
if
!
c
.
IsAvailableCommand
()
||
c
.
IsHelpCommand
()
{
continue
}
c
.
GenMarkdownTreeCustom
(
dir
,
filePrepender
,
linkHandler
)
if
err
:=
GenMarkdownTreeCustom
(
c
,
dir
,
filePrepender
,
linkHandler
);
err
!=
nil
{
return
err
}
}
out
:=
new
(
bytes
.
Buffer
)
cmd
.
GenMarkdownCustom
(
out
,
linkHandler
)
filename
:=
cmd
.
CommandPath
()
filename
=
dir
+
strings
.
Replace
(
filename
,
" "
,
"_"
,
-
1
)
+
".md"
outFile
,
err
:=
os
.
Create
(
filename
)
basename
:=
strings
.
Replace
(
cmd
.
CommandPath
(),
" "
,
"_"
,
-
1
)
+
".md"
filename
:=
filepath
.
Join
(
dir
,
basename
)
f
,
err
:=
os
.
Create
(
filename
)
if
err
!=
nil
{
fmt
.
Println
(
err
)
os
.
Exit
(
1
)
return
err
}
defer
outFile
.
Close
()
_
,
err
=
outFile
.
WriteString
(
filePrepender
(
filename
))
if
err
!=
nil
{
fmt
.
Println
(
err
)
os
.
Exit
(
1
)
defer
f
.
Close
()
if
_
,
err
:=
io
.
WriteString
(
f
,
filePrepender
(
filename
));
err
!=
nil
{
return
err
}
_
,
err
=
outFile
.
Write
(
out
.
Bytes
())
if
err
!=
nil
{
fmt
.
Println
(
err
)
os
.
Exit
(
1
)
if
err
:=
GenMarkdownCustom
(
cmd
,
f
,
linkHandler
);
err
!=
nil
{
return
err
}
return
nil
}
vendor/github.com/spf13/cobra/md_docs.md
→
vendor/github.com/spf13/cobra/
doc/
md_docs.md
浏览文件 @
460f0c91
# Generating Markdown Docs For Your Own cobra.Command
Generating man pages from a cobra command is incredibly easy. An example is as follows:
```
go
package
main
import
(
"github.com/spf13/cobra"
"github.com/spf13/cobra/doc"
)
func
main
()
{
cmd
:=
&
cobra
.
Command
{
Use
:
"test"
,
Short
:
"my test program"
,
}
doc
.
GenMarkdownTree
(
cmd
,
"/tmp"
)
}
```
That will get you a Markdown document
`/tmp/test.md`
## Generate markdown docs for the entire command tree
This program can actually generate docs for the kubectl command in the kubernetes project
...
...
@@ -11,13 +32,15 @@ import (
"io/ioutil"
"os"
"github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd"
"github.com/spf13/cobra"
kubectlcmd
"k8s.io/kubernetes/pkg/kubectl/cmd"
cmdutil
"k8s.io/kubernetes/pkg/kubectl/cmd/util"
"github.com/spf13/cobra/doc"
)
func
main
()
{
kubectl
:=
cmd
.
NewFactory
(
nil
)
.
NewKubectlCommand
(
os
.
Stdin
,
ioutil
.
Discard
,
ioutil
.
Discard
)
cobra
.
GenMarkdownTree
(
kubectl
,
"./"
)
cmd
:=
kubectlcmd
.
NewKubectlCommand
(
cmdutil
.
NewFactory
(
nil
),
os
.
Stdin
,
ioutil
.
Discard
,
ioutil
.
Discard
)
doc
.
GenMarkdownTree
(
cmd
,
"./"
)
}
```
...
...
@@ -29,7 +52,7 @@ You may wish to have more control over the output, or only generate for a single
```
go
out
:=
new
(
bytes
.
Buffer
)
cobra
.
GenMarkdown
(
cmd
,
out
)
doc
.
GenMarkdown
(
cmd
,
out
)
```
This will write the markdown doc for ONLY "cmd" into the out, buffer.
...
...
@@ -39,14 +62,14 @@ This will write the markdown doc for ONLY "cmd" into the out, buffer.
Both
`GenMarkdown`
and
`GenMarkdownTree`
have alternate versions with callbacks to get some control of the output:
```
go
func
GenMarkdownTreeCustom
(
cmd
*
Command
,
dir
string
,
filePrepender
func
(
string
)
string
,
linkHandler
func
(
string
)
string
)
{
//...
func
GenMarkdownTreeCustom
(
cmd
*
Command
,
dir
string
,
filePrepender
,
linkHandler
func
(
string
)
string
)
error
{
//...
}
```
```
go
func
GenMarkdownCustom
(
cmd
*
Command
,
out
*
bytes
.
Buffer
,
linkHandler
func
(
string
)
string
)
{
//...
func
GenMarkdownCustom
(
cmd
*
Command
,
out
*
bytes
.
Buffer
,
linkHandler
func
(
string
)
string
)
error
{
//...
}
```
...
...
@@ -78,4 +101,4 @@ linkHandler := func(name string) string {
return
"/commands/"
+
strings
.
ToLower
(
base
)
+
"/"
}
```
vendor/github.com/spf13/cobra/doc
_
util.go
→
vendor/github.com/spf13/cobra/doc
/
util.go
浏览文件 @
460f0c91
...
...
@@ -11,24 +11,28 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package
cobra
package
doc
import
"github.com/spf13/cobra"
// Test to see if we have a reason to print See Also information in docs
// Basically this is a test for a parent commend or a subcommand which is
// both not deprecated and not the autogenerated help command.
func
(
cmd
*
Command
)
hasSeeAlso
(
)
bool
{
func
hasSeeAlso
(
cmd
*
cobra
.
Command
)
bool
{
if
cmd
.
HasParent
()
{
return
true
}
children
:=
cmd
.
Commands
()
if
len
(
children
)
==
0
{
return
false
}
for
_
,
c
:=
range
children
{
if
!
c
.
IsAvailableCommand
()
||
c
==
cmd
.
helpCommand
{
for
_
,
c
:=
range
cmd
.
Commands
()
{
if
!
c
.
IsAvailableCommand
()
||
c
.
IsHelpCommand
()
{
continue
}
return
true
}
return
false
}
type
byName
[]
*
cobra
.
Command
func
(
s
byName
)
Len
()
int
{
return
len
(
s
)
}
func
(
s
byName
)
Swap
(
i
,
j
int
)
{
s
[
i
],
s
[
j
]
=
s
[
j
],
s
[
i
]
}
func
(
s
byName
)
Less
(
i
,
j
int
)
bool
{
return
s
[
i
]
.
Name
()
<
s
[
j
]
.
Name
()
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录