Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
github
hub
提交
992b2621
H
hub
项目概览
github
/
hub
12 个月 前同步成功
通知
3
Star
22523
Fork
2406
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hub
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
992b2621
编写于
11月 30, 2014
作者:
J
Jingwen Owen Ou
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Bump dependencies
上级
722bf938
变更
33
隐藏空白更改
内联
并排
Showing
33 changed file
with
1291 addition
and
276 deletion
+1291
-276
Godeps/Godeps.json
Godeps/Godeps.json
+14
-14
Godeps/_workspace/src/bitbucket.org/kardianos/osext/LICENSE
Godeps/_workspace/src/bitbucket.org/kardianos/osext/LICENSE
+24
-17
Godeps/_workspace/src/bitbucket.org/kardianos/osext/osext_plan9.go
...orkspace/src/bitbucket.org/kardianos/osext/osext_plan9.go
+9
-9
Godeps/_workspace/src/bitbucket.org/kardianos/osext/osext_procfs.go
...rkspace/src/bitbucket.org/kardianos/osext/osext_procfs.go
+4
-1
Godeps/_workspace/src/github.com/BurntSushi/toml/README.md
Godeps/_workspace/src/github.com/BurntSushi/toml/README.md
+1
-1
Godeps/_workspace/src/github.com/BurntSushi/toml/decode.go
Godeps/_workspace/src/github.com/BurntSushi/toml/decode.go
+20
-0
Godeps/_workspace/src/github.com/BurntSushi/toml/decode_test.go
.../_workspace/src/github.com/BurntSushi/toml/decode_test.go
+411
-2
Godeps/_workspace/src/github.com/BurntSushi/toml/lex.go
Godeps/_workspace/src/github.com/BurntSushi/toml/lex.go
+134
-5
Godeps/_workspace/src/github.com/BurntSushi/toml/parse.go
Godeps/_workspace/src/github.com/BurntSushi/toml/parse.go
+27
-0
Godeps/_workspace/src/github.com/BurntSushi/toml/type_check.go
...s/_workspace/src/github.com/BurntSushi/toml/type_check.go
+6
-0
Godeps/_workspace/src/github.com/howeyc/gopass/nix.go
Godeps/_workspace/src/github.com/howeyc/gopass/nix.go
+1
-1
Godeps/_workspace/src/github.com/howeyc/gopass/pass.go
Godeps/_workspace/src/github.com/howeyc/gopass/pass.go
+25
-35
Godeps/_workspace/src/github.com/inconshreveable/go-update/README.md
...kspace/src/github.com/inconshreveable/go-update/README.md
+1
-1
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/git_trees.go
...ce/src/github.com/octokit/go-octokit/octokit/git_trees.go
+39
-0
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/git_trees_test.go
...c/github.com/octokit/go-octokit/octokit/git_trees_test.go
+59
-0
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/octokit.go
...pace/src/github.com/octokit/go-octokit/octokit/octokit.go
+1
-0
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/pull_requests.go
...rc/github.com/octokit/go-octokit/octokit/pull_requests.go
+4
-0
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/pull_requests_test.go
...thub.com/octokit/go-octokit/octokit/pull_requests_test.go
+22
-1
Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/terminal.go
...orkspace/src/golang.org/x/crypto/ssh/terminal/terminal.go
+118
-41
Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/terminal_test.go
...ace/src/golang.org/x/crypto/ssh/terminal/terminal_test.go
+18
-0
Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util.go
...s/_workspace/src/golang.org/x/crypto/ssh/terminal/util.go
+0
-0
Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_bsd.go
...orkspace/src/golang.org/x/crypto/ssh/terminal/util_bsd.go
+0
-0
Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_linux.go
...kspace/src/golang.org/x/crypto/ssh/terminal/util_linux.go
+0
-0
Godeps/_workspace/src/golang.org/x/crypto/ssh/terminal/util_windows.go
...pace/src/golang.org/x/crypto/ssh/terminal/util_windows.go
+3
-0
Godeps/_workspace/src/gopkg.in/yaml.v1/README.md
Godeps/_workspace/src/gopkg.in/yaml.v1/README.md
+4
-4
Godeps/_workspace/src/gopkg.in/yaml.v1/decode.go
Godeps/_workspace/src/gopkg.in/yaml.v1/decode.go
+60
-32
Godeps/_workspace/src/gopkg.in/yaml.v1/decode_test.go
Godeps/_workspace/src/gopkg.in/yaml.v1/decode_test.go
+52
-3
Godeps/_workspace/src/gopkg.in/yaml.v1/emitterc.go
Godeps/_workspace/src/gopkg.in/yaml.v1/emitterc.go
+4
-1
Godeps/_workspace/src/gopkg.in/yaml.v1/encode.go
Godeps/_workspace/src/gopkg.in/yaml.v1/encode.go
+45
-6
Godeps/_workspace/src/gopkg.in/yaml.v1/encode_test.go
Godeps/_workspace/src/gopkg.in/yaml.v1/encode_test.go
+56
-15
Godeps/_workspace/src/gopkg.in/yaml.v1/resolve.go
Godeps/_workspace/src/gopkg.in/yaml.v1/resolve.go
+107
-64
Godeps/_workspace/src/gopkg.in/yaml.v1/yaml.go
Godeps/_workspace/src/gopkg.in/yaml.v1/yaml.go
+18
-23
Godeps/_workspace/src/gopkg.in/yaml.v1/yamlh.go
Godeps/_workspace/src/gopkg.in/yaml.v1/yamlh.go
+4
-0
未找到文件。
Godeps/Godeps.json
浏览文件 @
992b2621
...
...
@@ -7,18 +7,13 @@
"Deps"
:
[
{
"ImportPath"
:
"bitbucket.org/kardianos/osext"
,
"Comment"
:
"null-13"
,
"Rev"
:
"5d3ddcf53a508cc2f7404eaebf546ef2cb5cdb6e"
},
{
"ImportPath"
:
"code.google.com/p/go.crypto/ssh/terminal"
,
"Comment"
:
"null-221"
,
"Rev"
:
"6e881b5273dfffbadb6a76a61d3c39a71e3588d1"
"Comment"
:
"null-15"
,
"Rev"
:
"44140c5fc69ecf1102c5ef451d73cd98ef59b178"
},
{
"ImportPath"
:
"github.com/BurntSushi/toml"
,
"Comment"
:
"v0.1.0"
,
"Rev"
:
"
2ceedfee35ad3848e49308ab0c9a4f640cfb5fb2
"
"Comment"
:
"v0.1.0
-9-g3883ac1
"
,
"Rev"
:
"
3883ac1ce943878302255f538fce319d23226223
"
},
{
"ImportPath"
:
"github.com/bmizerany/assert"
,
...
...
@@ -31,11 +26,11 @@
},
{
"ImportPath"
:
"github.com/howeyc/gopass"
,
"Rev"
:
"
e8c0d21f59eb7f01086a39e47e05568acc9bb736
"
"Rev"
:
"
62ab5a80502a82291f265e6980d72310b8f480d5
"
},
{
"ImportPath"
:
"github.com/inconshreveable/go-update"
,
"Rev"
:
"2
76093003334bfddde2b1759b864b7c59f38b55e
"
"Rev"
:
"2
21d034a558b4c21b0624b2a450c076913854a57
"
},
{
"ImportPath"
:
"github.com/jingweno/go-sawyer"
,
...
...
@@ -69,16 +64,21 @@
},
{
"ImportPath"
:
"github.com/octokit/go-octokit/octokit"
,
"Comment"
:
"v0.4.0-9
3-g76c898e
"
,
"Rev"
:
"
76c898e13c8ad8059b070dd2ee1d27cb9a753120
"
"Comment"
:
"v0.4.0-9
7-g6909930
"
,
"Rev"
:
"
69099306b45af55301f9328f52d48338274f8d7d
"
},
{
"ImportPath"
:
"github.com/ogier/pflag"
,
"Rev"
:
"e4f7d00f344b0954fa3791a8527d10ba7334eceb"
},
{
"ImportPath"
:
"golang.org/x/crypto/ssh/terminal"
,
"Comment"
:
"null-236"
,
"Rev"
:
"69e2a90ed92d03812364aeb947b7068dc42e561e"
},
{
"ImportPath"
:
"gopkg.in/yaml.v1"
,
"Rev"
:
"
fc7f19eff1782a0beae3065097c776183e7d01d0
"
"Rev"
:
"
9f9df34309c04878acc86042b16630b0f696e1de
"
}
]
}
Godeps/_workspace/src/bitbucket.org/kardianos/osext/LICENSE
浏览文件 @
992b2621
Copyright (c) 2012
Daniel Theophanes
Copyright (c) 2012
The Go Authors. All rights reserved.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Godeps/_workspace/src/bitbucket.org/kardianos/osext/osext_plan9.go
浏览文件 @
992b2621
...
...
@@ -5,16 +5,16 @@
package
osext
import
(
"syscall
"
"os
"
"strconv
"
"os
"
"strconv
"
"syscall
"
)
func
executable
()
(
string
,
error
)
{
f
,
err
:=
os
.
Open
(
"/proc/"
+
strconv
.
Itoa
(
os
.
Getpid
())
+
"/text"
)
if
err
!=
nil
{
return
""
,
err
}
defer
f
.
Close
()
return
syscall
.
Fd2path
(
int
(
f
.
Fd
()))
f
,
err
:=
os
.
Open
(
"/proc/"
+
strconv
.
Itoa
(
os
.
Getpid
())
+
"/text"
)
if
err
!=
nil
{
return
""
,
err
}
defer
f
.
Close
()
return
syscall
.
Fd2path
(
int
(
f
.
Fd
()))
}
Godeps/_workspace/src/bitbucket.org/kardianos/osext/osext_procfs.go
浏览文件 @
992b2621
...
...
@@ -2,12 +2,13 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build linux netbsd openbsd
// +build linux netbsd openbsd
solaris
package
osext
import
(
"errors"
"fmt"
"os"
"runtime"
)
...
...
@@ -20,6 +21,8 @@ func executable() (string, error) {
return
os
.
Readlink
(
"/proc/curproc/exe"
)
case
"openbsd"
:
return
os
.
Readlink
(
"/proc/curproc/file"
)
case
"solaris"
:
return
os
.
Readlink
(
fmt
.
Sprintf
(
"/proc/%d/path/a.out"
,
os
.
Getpid
()))
}
return
""
,
errors
.
New
(
"ExecPath not implemented for "
+
runtime
.
GOOS
)
}
Godeps/_workspace/src/github.com/BurntSushi/toml/README.md
浏览文件 @
992b2621
...
...
@@ -111,7 +111,7 @@ type songs struct {
Song
[]
song
}
var
favorites
songs
if
_
,
err
:=
Decode
(
blob
,
&
favorites
);
err
!=
nil
{
if
_
,
err
:=
toml
.
Decode
(
blob
,
&
favorites
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
...
...
Godeps/_workspace/src/github.com/BurntSushi/toml/decode.go
浏览文件 @
992b2621
...
...
@@ -12,6 +12,18 @@ import (
var
e
=
fmt
.
Errorf
// Unmarshaler is the interface implemented by objects that can unmarshal a
// TOML description of themselves.
type
Unmarshaler
interface
{
UnmarshalTOML
(
interface
{})
error
}
// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`.
func
Unmarshal
(
p
[]
byte
,
v
interface
{})
error
{
_
,
err
:=
Decode
(
string
(
p
),
v
)
return
err
}
// Primitive is a TOML value that hasn't been decoded into a Go value.
// When using the various `Decode*` functions, the type `Primitive` may
// be given to any value, and its decoding will be delayed.
...
...
@@ -128,6 +140,7 @@ func DecodeReader(r io.Reader, v interface{}) (MetaData, error) {
// Any type mismatch produces an error. Finding a type that we don't know
// how to handle produces an unsupported type error.
func
(
md
*
MetaData
)
unify
(
data
interface
{},
rv
reflect
.
Value
)
error
{
// Special case. Look for a `Primitive` value.
if
rv
.
Type
()
==
reflect
.
TypeOf
((
*
Primitive
)(
nil
))
.
Elem
()
{
// Save the undecoded data and the key context into the primitive
...
...
@@ -141,6 +154,13 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
return
nil
}
// Special case. Unmarshaler Interface support.
if
rv
.
CanAddr
()
{
if
v
,
ok
:=
rv
.
Addr
()
.
Interface
()
.
(
Unmarshaler
);
ok
{
return
v
.
UnmarshalTOML
(
data
)
}
}
// Special case. Handle time.Time values specifically.
// TODO: Remove this code when we decide to drop support for Go 1.1.
// This isn't necessary in Go 1.2 because time.Time satisfies the encoding
...
...
Godeps/_workspace/src/github.com/BurntSushi/toml/decode_test.go
浏览文件 @
992b2621
...
...
@@ -17,7 +17,7 @@ func TestDecodeSimple(t *testing.T) {
age = 250
andrew = "gallant"
kait = "brady"
now = 1987-07-05T05:45:00Z
now = 1987-07-05T05:45:00Z
yesOrNo = true
pi = 3.14
colors = [
...
...
@@ -132,7 +132,7 @@ name = "Born to Run"
[[albums]]
name = "Born in the USA"
[[albums.songs]]
name = "Glory Days"
...
...
@@ -349,6 +349,125 @@ func TestDecodeSizedInts(t *testing.T) {
}
}
func
TestUnmarshaler
(
t
*
testing
.
T
)
{
var
tomlBlob
=
`
[dishes.hamboogie]
name = "Hamboogie with fries"
price = 10.99
[[dishes.hamboogie.ingredients]]
name = "Bread Bun"
[[dishes.hamboogie.ingredients]]
name = "Lettuce"
[[dishes.hamboogie.ingredients]]
name = "Real Beef Patty"
[[dishes.hamboogie.ingredients]]
name = "Tomato"
[dishes.eggsalad]
name = "Egg Salad with rice"
price = 3.99
[[dishes.eggsalad.ingredients]]
name = "Egg"
[[dishes.eggsalad.ingredients]]
name = "Mayo"
[[dishes.eggsalad.ingredients]]
name = "Rice"
`
m
:=
&
menu
{}
if
_
,
err
:=
Decode
(
tomlBlob
,
m
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
if
len
(
m
.
Dishes
)
!=
2
{
t
.
Log
(
"two dishes should be loaded with UnmarshalTOML()"
)
t
.
Errorf
(
"expected %d but got %d"
,
2
,
len
(
m
.
Dishes
))
}
eggSalad
:=
m
.
Dishes
[
"eggsalad"
]
if
_
,
ok
:=
interface
{}(
eggSalad
)
.
(
dish
);
!
ok
{
t
.
Errorf
(
"expected a dish"
)
}
if
eggSalad
.
Name
!=
"Egg Salad with rice"
{
t
.
Errorf
(
"expected the dish to be named 'Egg Salad with rice'"
)
}
if
len
(
eggSalad
.
Ingredients
)
!=
3
{
t
.
Log
(
"dish should be loaded with UnmarshalTOML()"
)
t
.
Errorf
(
"expected %d but got %d"
,
3
,
len
(
eggSalad
.
Ingredients
))
}
found
:=
false
for
_
,
i
:=
range
eggSalad
.
Ingredients
{
if
i
.
Name
==
"Rice"
{
found
=
true
break
}
}
if
!
found
{
t
.
Error
(
"Rice was not loaded in UnmarshalTOML()"
)
}
// test on a value - must be passed as *
o
:=
menu
{}
if
_
,
err
:=
Decode
(
tomlBlob
,
&
o
);
err
!=
nil
{
log
.
Fatal
(
err
)
}
}
type
menu
struct
{
Dishes
map
[
string
]
dish
}
func
(
m
*
menu
)
UnmarshalTOML
(
p
interface
{})
error
{
m
.
Dishes
=
make
(
map
[
string
]
dish
)
data
,
_
:=
p
.
(
map
[
string
]
interface
{})
dishes
:=
data
[
"dishes"
]
.
(
map
[
string
]
interface
{})
for
n
,
v
:=
range
dishes
{
if
d
,
ok
:=
v
.
(
map
[
string
]
interface
{});
ok
{
nd
:=
dish
{}
nd
.
UnmarshalTOML
(
d
)
m
.
Dishes
[
n
]
=
nd
}
else
{
return
fmt
.
Errorf
(
"not a dish"
)
}
}
return
nil
}
type
dish
struct
{
Name
string
Price
float32
Ingredients
[]
ingredient
}
func
(
d
*
dish
)
UnmarshalTOML
(
p
interface
{})
error
{
data
,
_
:=
p
.
(
map
[
string
]
interface
{})
d
.
Name
,
_
=
data
[
"name"
]
.
(
string
)
d
.
Price
,
_
=
data
[
"price"
]
.
(
float32
)
ingredients
,
_
:=
data
[
"ingredients"
]
.
([]
map
[
string
]
interface
{})
for
_
,
e
:=
range
ingredients
{
n
,
_
:=
interface
{}(
e
)
.
(
map
[
string
]
interface
{})
name
,
_
:=
n
[
"name"
]
.
(
string
)
i
:=
ingredient
{
name
}
d
.
Ingredients
=
append
(
d
.
Ingredients
,
i
)
}
return
nil
}
type
ingredient
struct
{
Name
string
}
func
ExampleMetaData_PrimitiveDecode
()
{
var
md
MetaData
var
err
error
...
...
@@ -538,3 +657,293 @@ key3 = "value3"
// Output:
// Undecoded keys: ["key2"]
}
// Example UnmarshalTOML shows how to implement a struct type that knows how to
// unmarshal itself. The struct must take full responsibility for mapping the
// values passed into the struct. The method may be used with interfaces in a
// struct in cases where the actual type is not known until the data is examined.
func
Example_unmarshalTOML
()
{
var
blob
=
`
[[parts]]
type = "valve"
id = "valve-1"
size = 1.2
rating = 4
[[parts]]
type = "valve"
id = "valve-2"
size = 2.1
rating = 5
[[parts]]
type = "pipe"
id = "pipe-1"
length = 2.1
diameter = 12
[[parts]]
type = "cable"
id = "cable-1"
length = 12
rating = 3.1
`
o
:=
&
order
{}
err
:=
Unmarshal
([]
byte
(
blob
),
o
)
if
err
!=
nil
{
log
.
Fatal
(
err
)
}
fmt
.
Println
(
len
(
o
.
parts
))
for
_
,
part
:=
range
o
.
parts
{
fmt
.
Println
(
part
.
Name
())
}
// Code to implement UmarshalJSON.
// type order struct {
// // NOTE `order.parts` is a private slice of type `part` which is an
// // interface and may only be loaded from toml using the UnmarshalTOML()
// // method of the Umarshaler interface.
// parts parts
// }
// func (o *order) UnmarshalTOML(data interface{}) error {
// // NOTE the example below contains detailed type casting to show how
// // the 'data' is retrieved. In operational use, a type cast wrapper
// // may be prefered e.g.
// //
// // func AsMap(v interface{}) (map[string]interface{}, error) {
// // return v.(map[string]interface{})
// // }
// //
// // resulting in:
// // d, _ := AsMap(data)
// //
// d, _ := data.(map[string]interface{})
// parts, _ := d["parts"].([]map[string]interface{})
// for _, p := range parts {
// typ, _ := p["type"].(string)
// id, _ := p["id"].(string)
// // detect the type of part and handle each case
// switch p["type"] {
// case "valve":
// size := float32(p["size"].(float64))
// rating := int(p["rating"].(int64))
// valve := &valve{
// Type: typ,
// ID: id,
// Size: size,
// Rating: rating,
// }
// o.parts = append(o.parts, valve)
// case "pipe":
// length := float32(p["length"].(float64))
// diameter := int(p["diameter"].(int64))
// pipe := &pipe{
// Type: typ,
// ID: id,
// Length: length,
// Diameter: diameter,
// }
// o.parts = append(o.parts, pipe)
// case "cable":
// length := int(p["length"].(int64))
// rating := float32(p["rating"].(float64))
// cable := &cable{
// Type: typ,
// ID: id,
// Length: length,
// Rating: rating,
// }
// o.parts = append(o.parts, cable)
// }
// }
// return nil
// }
// type parts []part
// type part interface {
// Name() string
// }
// type valve struct {
// Type string
// ID string
// Size float32
// Rating int
// }
// func (v *valve) Name() string {
// return fmt.Sprintf("VALVE: %s", v.ID)
// }
// type pipe struct {
// Type string
// ID string
// Length float32
// Diameter int
// }
// func (p *pipe) Name() string {
// return fmt.Sprintf("PIPE: %s", p.ID)
// }
// type cable struct {
// Type string
// ID string
// Length int
// Rating float32
// }
// func (c *cable) Name() string {
// return fmt.Sprintf("CABLE: %s", c.ID)
// }
// Output:
// 4
// VALVE: valve-1
// VALVE: valve-2
// PIPE: pipe-1
// CABLE: cable-1
}
type
order
struct
{
// NOTE `order.parts` is a private slice of type `part` which is an
// interface and may only be loaded from toml using the UnmarshalTOML()
// method of the Umarshaler interface.
parts
parts
}
func
(
o
*
order
)
UnmarshalTOML
(
data
interface
{})
error
{
// NOTE the example below contains detailed type casting to show how
// the 'data' is retrieved. In operational use, a type cast wrapper
// may be prefered e.g.
//
// func AsMap(v interface{}) (map[string]interface{}, error) {
// return v.(map[string]interface{})
// }
//
// resulting in:
// d, _ := AsMap(data)
//
d
,
_
:=
data
.
(
map
[
string
]
interface
{})
parts
,
_
:=
d
[
"parts"
]
.
([]
map
[
string
]
interface
{})
for
_
,
p
:=
range
parts
{
typ
,
_
:=
p
[
"type"
]
.
(
string
)
id
,
_
:=
p
[
"id"
]
.
(
string
)
// detect the type of part and handle each case
switch
p
[
"type"
]
{
case
"valve"
:
size
:=
float32
(
p
[
"size"
]
.
(
float64
))
rating
:=
int
(
p
[
"rating"
]
.
(
int64
))
valve
:=
&
valve
{
Type
:
typ
,
ID
:
id
,
Size
:
size
,
Rating
:
rating
,
}
o
.
parts
=
append
(
o
.
parts
,
valve
)
case
"pipe"
:
length
:=
float32
(
p
[
"length"
]
.
(
float64
))
diameter
:=
int
(
p
[
"diameter"
]
.
(
int64
))
pipe
:=
&
pipe
{
Type
:
typ
,
ID
:
id
,
Length
:
length
,
Diameter
:
diameter
,
}
o
.
parts
=
append
(
o
.
parts
,
pipe
)
case
"cable"
:
length
:=
int
(
p
[
"length"
]
.
(
int64
))
rating
:=
float32
(
p
[
"rating"
]
.
(
float64
))
cable
:=
&
cable
{
Type
:
typ
,
ID
:
id
,
Length
:
length
,
Rating
:
rating
,
}
o
.
parts
=
append
(
o
.
parts
,
cable
)
}
}
return
nil
}
type
parts
[]
part
type
part
interface
{
Name
()
string
}
type
valve
struct
{
Type
string
ID
string
Size
float32
Rating
int
}
func
(
v
*
valve
)
Name
()
string
{
return
fmt
.
Sprintf
(
"VALVE: %s"
,
v
.
ID
)
}
type
pipe
struct
{
Type
string
ID
string
Length
float32
Diameter
int
}
func
(
p
*
pipe
)
Name
()
string
{
return
fmt
.
Sprintf
(
"PIPE: %s"
,
p
.
ID
)
}
type
cable
struct
{
Type
string
ID
string
Length
int
Rating
float32
}
func
(
c
*
cable
)
Name
()
string
{
return
fmt
.
Sprintf
(
"CABLE: %s"
,
c
.
ID
)
}
Godeps/_workspace/src/github.com/BurntSushi/toml/lex.go
浏览文件 @
992b2621
...
...
@@ -14,6 +14,9 @@ const (
itemEOF
itemText
itemString
itemRawString
itemMultilineString
itemRawMultilineString
itemBool
itemInteger
itemFloat
...
...
@@ -42,6 +45,8 @@ const (
commentStart
=
'#'
stringStart
=
'"'
stringEnd
=
'"'
rawStringStart
=
'\'
'
rawStringEnd
=
'\'
'
)
type
stateFn
func
(
lx
*
lexer
)
stateFn
...
...
@@ -366,8 +371,29 @@ func lexValue(lx *lexer) stateFn {
lx
.
emit
(
itemArray
)
return
lexArrayValue
case
r
==
stringStart
:
if
lx
.
accept
(
stringStart
)
{
if
lx
.
accept
(
stringStart
)
{
lx
.
ignore
()
// Ignore """
return
lexMultilineString
}
lx
.
backup
()
}
lx
.
ignore
()
// ignore the '"'
return
lexString
case
r
==
rawStringStart
:
if
lx
.
accept
(
rawStringStart
)
{
if
lx
.
accept
(
rawStringStart
)
{
lx
.
ignore
()
// Ignore """
return
lexMultilineRawString
}
lx
.
backup
()
}
lx
.
ignore
()
// ignore the "'"
return
lexRawString
case
r
==
't'
:
return
lexTrue
case
r
==
'f'
:
...
...
@@ -455,6 +481,23 @@ func lexString(lx *lexer) stateFn {
// lexStringEscape consumes an escaped character. It assumes that the preceding
// '\\' has already been consumed.
func
lexStringEscape
(
lx
*
lexer
)
stateFn
{
return
lexStringEscapeHandler
(
lx
,
lexString
,
lexStringUnicode
)
}
// lexMultilineStringEscape consumes an escaped character. It assumes that the
// preceding '\\' has already been consumed.
func
lexMultilineStringEscape
(
lx
*
lexer
)
stateFn
{
// Handle the special case first:
if
isNL
(
lx
.
next
())
{
lx
.
next
()
return
lexMultilineString
}
else
{
lx
.
backup
()
return
lexStringEscapeHandler
(
lx
,
lexMultilineString
,
lexMultilineStringUnicode
)
}
}
func
lexStringEscapeHandler
(
lx
*
lexer
,
stringFn
stateFn
,
unicodeFn
stateFn
)
stateFn
{
r
:=
lx
.
next
()
switch
r
{
case
'b'
:
...
...
@@ -472,18 +515,28 @@ func lexStringEscape(lx *lexer) stateFn {
case
'/'
:
fallthrough
case
'\\'
:
return
lexString
return
stringFn
case
'u'
:
return
lexStringUnicode
return
unicodeFn
}
return
lx
.
errorf
(
"Invalid escape character %q. Only the following "
+
"escape characters are allowed: "
+
"
\\
b,
\\
t,
\\
n,
\\
f,
\\
r,
\\\"
,
\\
/,
\\\\
, and
\\
uXXXX."
,
r
)
}
// lexString
Binary consumes two hexadecimal digits following '\x
'. It assumes
// that the '\
x
' has already been consumed.
// lexString
Unicode consumes four hexadecimal digits following '\u
'. It assumes
// that the '\
u
' has already been consumed.
func
lexStringUnicode
(
lx
*
lexer
)
stateFn
{
return
lexStringUnicodeHandler
(
lx
,
lexString
)
}
// lexMultilineStringUnicode consumes four hexadecimal digits following '\u'.
// It assumes that the '\u' has already been consumed.
func
lexMultilineStringUnicode
(
lx
*
lexer
)
stateFn
{
return
lexStringUnicodeHandler
(
lx
,
lexMultilineString
)
}
func
lexStringUnicodeHandler
(
lx
*
lexer
,
nextFunc
stateFn
)
stateFn
{
var
r
rune
for
i
:=
0
;
i
<
4
;
i
++
{
...
...
@@ -493,7 +546,77 @@ func lexStringUnicode(lx *lexer) stateFn {
"but got '%s' instead."
,
lx
.
current
())
}
}
return
lexString
return
nextFunc
}
// lexMultilineString consumes the inner contents of a string. It assumes that
// the beginning '"""' has already been consumed and ignored.
func
lexMultilineString
(
lx
*
lexer
)
stateFn
{
r
:=
lx
.
next
()
switch
{
case
r
==
'\\'
:
return
lexMultilineStringEscape
case
r
==
stringEnd
:
if
lx
.
accept
(
stringEnd
)
{
if
lx
.
accept
(
stringEnd
)
{
lx
.
backup
()
lx
.
backup
()
lx
.
backup
()
lx
.
emit
(
itemMultilineString
)
lx
.
next
()
lx
.
next
()
lx
.
next
()
lx
.
ignore
()
return
lx
.
pop
()
}
lx
.
backup
()
}
}
return
lexMultilineString
}
// lexRawString consumes a raw string. Nothing can be escaped in such a string.
// It assumes that the beginning "'" has already been consumed and ignored.
func
lexRawString
(
lx
*
lexer
)
stateFn
{
r
:=
lx
.
next
()
switch
{
case
isNL
(
r
)
:
return
lx
.
errorf
(
"Strings cannot contain new lines."
)
case
r
==
rawStringEnd
:
lx
.
backup
()
lx
.
emit
(
itemRawString
)
lx
.
next
()
lx
.
ignore
()
return
lx
.
pop
()
}
return
lexRawString
}
// lexMultilineRawString consumes a raw string. Nothing can be escaped in such
// a string. It assumes that the beginning "'" has already been consumed and
// ignored.
func
lexMultilineRawString
(
lx
*
lexer
)
stateFn
{
r
:=
lx
.
next
()
switch
{
case
r
==
rawStringEnd
:
if
lx
.
accept
(
rawStringEnd
)
{
if
lx
.
accept
(
rawStringEnd
)
{
lx
.
backup
()
lx
.
backup
()
lx
.
backup
()
lx
.
emit
(
itemRawMultilineString
)
lx
.
next
()
lx
.
next
()
lx
.
next
()
lx
.
ignore
()
return
lx
.
pop
()
}
lx
.
backup
()
}
}
return
lexMultilineRawString
}
// lexNumberOrDateStart consumes either a (positive) integer, float or datetime.
...
...
@@ -705,6 +828,12 @@ func (itype itemType) String() string {
return
"Text"
case
itemString
:
return
"String"
case
itemRawString
:
return
"String"
case
itemMultilineString
:
return
"String"
case
itemRawMultilineString
:
return
"String"
case
itemBool
:
return
"Bool"
case
itemInteger
:
...
...
Godeps/_workspace/src/github.com/BurntSushi/toml/parse.go
浏览文件 @
992b2621
...
...
@@ -6,6 +6,7 @@ import (
"strconv"
"strings"
"time"
"unicode"
"unicode/utf8"
)
...
...
@@ -148,6 +149,12 @@ func (p *parser) value(it item) (interface{}, tomlType) {
switch
it
.
typ
{
case
itemString
:
return
p
.
replaceUnicode
(
replaceEscapes
(
it
.
val
)),
p
.
typeOfPrimitive
(
it
)
case
itemMultilineString
:
return
p
.
replaceUnicode
(
replaceEscapes
(
stripFirstNewline
(
stripEscapedWhitespace
(
it
.
val
)))),
p
.
typeOfPrimitive
(
it
)
case
itemRawString
:
return
it
.
val
,
p
.
typeOfPrimitive
(
it
)
case
itemRawMultilineString
:
return
stripFirstNewline
(
it
.
val
),
p
.
typeOfPrimitive
(
it
)
case
itemBool
:
switch
it
.
val
{
case
"true"
:
...
...
@@ -387,6 +394,26 @@ func replaceEscapes(s string) string {
)
.
Replace
(
s
)
}
func
stripFirstNewline
(
s
string
)
string
{
if
len
(
s
)
==
0
||
s
[
0
]
!=
'\n'
{
return
s
}
return
s
[
1
:
len
(
s
)]
}
func
stripEscapedWhitespace
(
s
string
)
string
{
esc
:=
strings
.
Split
(
s
,
"
\\\n
"
)
if
len
(
esc
)
>
1
{
for
i
:=
1
;
i
<
len
(
esc
);
i
++
{
esc
[
i
]
=
strings
.
TrimLeftFunc
(
esc
[
i
],
unicode
.
IsSpace
)
}
}
return
strings
.
Join
(
esc
,
""
)
}
func
(
p
*
parser
)
replaceUnicode
(
s
string
)
string
{
indexEsc
:=
func
()
int
{
return
strings
.
Index
(
s
,
"
\\
u"
)
...
...
Godeps/_workspace/src/github.com/BurntSushi/toml/type_check.go
浏览文件 @
992b2621
...
...
@@ -56,6 +56,12 @@ func (p *parser) typeOfPrimitive(lexItem item) tomlType {
return
tomlDatetime
case
itemString
:
return
tomlString
case
itemMultilineString
:
return
tomlString
case
itemRawString
:
return
tomlString
case
itemRawMultilineString
:
return
tomlString
case
itemBool
:
return
tomlBool
}
...
...
Godeps/_workspace/src/github.com/howeyc/gopass/nix.go
浏览文件 @
992b2621
...
...
@@ -5,7 +5,7 @@ package gopass
import
(
"syscall"
"
code.google.com/p/go.
crypto/ssh/terminal"
"
golang.org/x/
crypto/ssh/terminal"
)
func
getch
()
byte
{
...
...
Godeps/_workspace/src/github.com/howeyc/gopass/pass.go
浏览文件 @
992b2621
// Reads password from terminal.
package
gopass
import
(
"fmt"
"os"
)
// Returns password byte array read from terminal without input being echoed.
// Array of bytes does not include end-of-line characters.
func
GetPasswd
()
[]
byte
{
pass
:=
make
([]
byte
,
0
)
for
v
:=
getch
();
;
v
=
getch
()
{
if
v
==
127
||
v
==
8
{
if
len
(
pass
)
>
0
{
pass
=
pass
[
:
len
(
pass
)
-
1
]
// getPasswd returns the input read from terminal.
// If masked is true, typing will be matched by asterisks on the screen.
// Otherwise, typing will echo nothing.
func
getPasswd
(
masked
bool
)
[]
byte
{
var
pass
,
bs
,
mask
[]
byte
if
masked
{
bs
=
[]
byte
(
"
\b
\b
"
)
mask
=
[]
byte
(
"*"
)
}
for
{
if
v
:=
getch
();
v
==
127
||
v
==
8
{
if
l
:=
len
(
pass
);
l
>
0
{
pass
=
pass
[
:
l
-
1
]
os
.
Stdout
.
Write
(
bs
)
}
}
else
if
v
==
13
||
v
==
10
{
break
}
else
{
pass
=
append
(
pass
,
v
)
os
.
Stdout
.
Write
(
mask
)
}
}
println
()
return
pass
}
//
Masking password functionality
//
Removed character restrictions
func
GetPasswd
Masked
()
[]
byte
{
secret
:=
make
([]
byte
,
0
)
mask
:=
byte
(
'*'
)
//
GetPasswd returns the password read from the terminal without echoing input.
//
The returned byte array does not include end-of-line characters.
func
GetPasswd
()
[]
byte
{
return
getPasswd
(
false
)
}
pass
:=
make
([]
byte
,
0
)
for
v
:=
getch
();
;
v
=
getch
()
{
if
v
==
127
||
v
==
8
{
if
len
(
pass
)
>
0
{
pass
=
pass
[
:
len
(
pass
)
-
1
]
}
if
len
(
secret
)
>
0
{
secret
=
secret
[
:
len
(
secret
)
-
1
]
os
.
Stdout
.
Write
([]
byte
(
"
\b
\b
"
))
}
}
else
if
v
==
13
||
v
==
10
{
break
}
else
{
secret
=
append
(
secret
,
mask
)
fmt
.
Print
(
string
(
mask
))
pass
=
append
(
pass
,
v
)
}
}
println
()
return
pass
// GetPasswdMasked returns the password read from the terminal, echoing asterisks.
// The returned byte array does not include end-of-line characters.
func
GetPasswdMasked
()
[]
byte
{
return
getPasswd
(
true
)
}
Godeps/_workspace/src/github.com/inconshreveable/go-update/README.md
浏览文件 @
992b2621
...
...
@@ -16,7 +16,7 @@ Updating your program to a new version is as easy as:
Comprehensive API documentation and code examples are available in the code documentation available on godoc.org:
### [https://godoc.org/github.com/inconshreveable/go-update
](https://godoc.org/github.com/inconshreveable/go-update)
[
![GoDoc
](
https://godoc.org/github.com/inconshreveable/go-update?status.svg
)
](https://godoc.org/github.com/inconshreveable/go-update)
## Features
...
...
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/git_trees.go
0 → 100644
浏览文件 @
992b2621
package
octokit
import
(
"net/url"
)
var
GitTreesURL
=
Hyperlink
(
"repos/{owner}/{repo}/git/trees/{/sha}{?recursive}"
)
func
(
c
*
Client
)
GitTrees
(
url
*
url
.
URL
)
(
trees
*
GitTreesService
)
{
trees
=
&
GitTreesService
{
client
:
c
,
URL
:
url
}
return
}
type
GitTreesService
struct
{
client
*
Client
URL
*
url
.
URL
}
// Get a Git Tree
func
(
c
*
GitTreesService
)
One
()
(
tree
*
GitTree
,
result
*
Result
)
{
result
=
c
.
client
.
get
(
c
.
URL
,
&
tree
)
return
}
type
GitTree
struct
{
Sha
string
`json:"sha,omitempty"`
Tree
[]
GitTreeEntry
`json:"tree,omitempty"`
Truncated
bool
`json:"truncated,omitempty"`
URL
string
`json:"url,omitempty"`
}
type
GitTreeEntry
struct
{
Mode
string
`json:"mode,omitempty"`
Path
string
`json:"path,omitempty"`
Sha
string
`json:"sha,omitempty"`
Size
int
`json:"size,omitempty"`
Type
string
`json:"type,omitempty"`
URL
string
`json:"url,omitempty"`
}
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/git_trees_test.go
0 → 100644
浏览文件 @
992b2621
package
octokit
import
(
"net/http"
"testing"
"github.com/bmizerany/assert"
)
func
TestGitTreesService_One
(
t
*
testing
.
T
)
{
setup
()
defer
tearDown
()
mux
.
HandleFunc
(
"/repos/pengwynn/flint/git/trees/master"
,
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
testMethod
(
t
,
r
,
"GET"
)
respondWithJSON
(
w
,
loadFixture
(
"tree.json"
))
})
url
,
err
:=
GitTreesURL
.
Expand
(
M
{
"owner"
:
"pengwynn"
,
"repo"
:
"flint"
,
"sha"
:
"master"
,
})
assert
.
Equal
(
t
,
nil
,
err
)
tree
,
result
:=
client
.
GitTrees
(
url
)
.
One
()
assert
.
T
(
t
,
!
result
.
HasError
())
assert
.
Equal
(
t
,
"9c1337e761bbd517f3cc1b5acb9373b17f4810e8"
,
tree
.
Sha
)
assert
.
Equal
(
t
,
"https://api.github.com/repos/pengwynn/flint/git/trees/9c1337e761bbd517f3cc1b5acb9373b17f4810e8"
,
tree
.
URL
)
entries
:=
tree
.
Tree
assert
.
Equal
(
t
,
9
,
len
(
entries
))
}
func
TestGitTreesService_One_Recursive
(
t
*
testing
.
T
)
{
setup
()
defer
tearDown
()
mux
.
HandleFunc
(
"/repos/pengwynn/flint/git/trees/master"
,
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
testMethod
(
t
,
r
,
"GET"
)
respondWithJSON
(
w
,
loadFixture
(
"tree_recursive.json"
))
})
url
,
err
:=
GitTreesURL
.
Expand
(
M
{
"owner"
:
"pengwynn"
,
"repo"
:
"flint"
,
"sha"
:
"master"
,
"recursive"
:
"1"
,
})
assert
.
Equal
(
t
,
nil
,
err
)
tree
,
result
:=
client
.
GitTrees
(
url
)
.
One
()
assert
.
T
(
t
,
!
result
.
HasError
())
assert
.
Equal
(
t
,
"9c1337e761bbd517f3cc1b5acb9373b17f4810e8"
,
tree
.
Sha
)
assert
.
Equal
(
t
,
"https://api.github.com/repos/pengwynn/flint/git/trees/9c1337e761bbd517f3cc1b5acb9373b17f4810e8"
,
tree
.
URL
)
entries
:=
tree
.
Tree
assert
.
Equal
(
t
,
15
,
len
(
entries
))
}
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/octokit.go
浏览文件 @
992b2621
...
...
@@ -5,6 +5,7 @@ const (
userAgent
=
"Octokit Go "
+
version
version
=
"0.3.0"
defaultMediaType
=
"application/vnd.github.v3+json;charset=utf-8"
diffMediaType
=
"application/vnd.github.v3.diff;charset=utf-8"
patchMediaType
=
"application/vnd.github.v3.patch;charset=utf-8"
textMediaType
=
"text/plain;charset=utf-8"
)
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/pull_requests.go
浏览文件 @
992b2621
...
...
@@ -38,6 +38,10 @@ func (p *PullRequestsService) All() (pulls []PullRequest, result *Result) {
return
}
func
(
p
*
PullRequestsService
)
Diff
()
(
diff
io
.
ReadCloser
,
result
*
Result
)
{
return
p
.
client
.
getBody
(
p
.
URL
,
diffMediaType
)
}
func
(
p
*
PullRequestsService
)
Patch
()
(
patch
io
.
ReadCloser
,
result
*
Result
)
{
return
p
.
client
.
getBody
(
p
.
URL
,
patchMediaType
)
}
...
...
Godeps/_workspace/src/github.com/octokit/go-octokit/octokit/pull_requests_test.go
浏览文件 @
992b2621
package
octokit
import
(
"io/ioutil"
"fmt"
"io/ioutil"
"net/http"
"testing"
...
...
@@ -119,6 +119,27 @@ func TestPullRequestService_All(t *testing.T) {
assert
.
Equal
(
t
,
testURLStringOf
(
"repositories/8514/pulls?page=14"
),
string
(
*
result
.
LastPage
))
}
func
TestPullRequestService_Diff
(
t
*
testing
.
T
)
{
setup
()
defer
tearDown
()
mux
.
HandleFunc
(
"/repos/octokit/go-octokit/pulls/1"
,
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
testMethod
(
t
,
r
,
"GET"
)
testHeader
(
t
,
r
,
"Accept"
,
diffMediaType
)
respondWith
(
w
,
"diff --git"
)
})
url
,
err
:=
PullRequestsURL
.
Expand
(
M
{
"owner"
:
"octokit"
,
"repo"
:
"go-octokit"
,
"number"
:
1
})
assert
.
Equal
(
t
,
nil
,
err
)
diff
,
result
:=
client
.
PullRequests
(
url
)
.
Diff
()
assert
.
T
(
t
,
!
result
.
HasError
())
content
,
err
:=
ioutil
.
ReadAll
(
diff
)
assert
.
Equal
(
t
,
nil
,
err
)
assert
.
Equal
(
t
,
"diff --git"
,
string
(
content
))
}
func
TestPullRequestService_Patch
(
t
*
testing
.
T
)
{
setup
()
defer
tearDown
()
...
...
Godeps/_workspace/src/
code.google.com/p/go.
crypto/ssh/terminal/terminal.go
→
Godeps/_workspace/src/
golang.org/x/
crypto/ssh/terminal/terminal.go
浏览文件 @
992b2621
...
...
@@ -5,6 +5,7 @@
package
terminal
import
(
"bytes"
"io"
"sync"
"unicode/utf8"
...
...
@@ -61,6 +62,9 @@ type Terminal struct {
pos
int
// echo is true if local echo is enabled
echo
bool
// pasteActive is true iff there is a bracketed paste operation in
// progress.
pasteActive
bool
// cursorX contains the current X value of the cursor where the left
// edge is 0. cursorY contains the row number where the first row of
...
...
@@ -124,28 +128,35 @@ const (
keyDeleteWord
keyDeleteLine
keyClearScreen
keyPasteStart
keyPasteEnd
)
var
pasteStart
=
[]
byte
{
keyEscape
,
'['
,
'2'
,
'0'
,
'0'
,
'~'
}
var
pasteEnd
=
[]
byte
{
keyEscape
,
'['
,
'2'
,
'0'
,
'1'
,
'~'
}
// bytesToKey tries to parse a key sequence from b. If successful, it returns
// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
func
bytesToKey
(
b
[]
byte
)
(
rune
,
[]
byte
)
{
func
bytesToKey
(
b
[]
byte
,
pasteActive
bool
)
(
rune
,
[]
byte
)
{
if
len
(
b
)
==
0
{
return
utf8
.
RuneError
,
nil
}
switch
b
[
0
]
{
case
1
:
// ^A
return
keyHome
,
b
[
1
:
]
case
5
:
// ^E
return
keyEnd
,
b
[
1
:
]
case
8
:
// ^H
return
keyBackspace
,
b
[
1
:
]
case
11
:
// ^K
return
keyDeleteLine
,
b
[
1
:
]
case
12
:
// ^L
return
keyClearScreen
,
b
[
1
:
]
case
23
:
// ^W
return
keyDeleteWord
,
b
[
1
:
]
if
!
pasteActive
{
switch
b
[
0
]
{
case
1
:
// ^A
return
keyHome
,
b
[
1
:
]
case
5
:
// ^E
return
keyEnd
,
b
[
1
:
]
case
8
:
// ^H
return
keyBackspace
,
b
[
1
:
]
case
11
:
// ^K
return
keyDeleteLine
,
b
[
1
:
]
case
12
:
// ^L
return
keyClearScreen
,
b
[
1
:
]
case
23
:
// ^W
return
keyDeleteWord
,
b
[
1
:
]
}
}
if
b
[
0
]
!=
keyEscape
{
...
...
@@ -156,7 +167,7 @@ func bytesToKey(b []byte) (rune, []byte) {
return
r
,
b
[
l
:
]
}
if
len
(
b
)
>=
3
&&
b
[
0
]
==
keyEscape
&&
b
[
1
]
==
'['
{
if
!
pasteActive
&&
len
(
b
)
>=
3
&&
b
[
0
]
==
keyEscape
&&
b
[
1
]
==
'['
{
switch
b
[
2
]
{
case
'A'
:
return
keyUp
,
b
[
3
:
]
...
...
@@ -166,11 +177,6 @@ func bytesToKey(b []byte) (rune, []byte) {
return
keyRight
,
b
[
3
:
]
case
'D'
:
return
keyLeft
,
b
[
3
:
]
}
}
if
len
(
b
)
>=
3
&&
b
[
0
]
==
keyEscape
&&
b
[
1
]
==
'O'
{
switch
b
[
2
]
{
case
'H'
:
return
keyHome
,
b
[
3
:
]
case
'F'
:
...
...
@@ -178,7 +184,7 @@ func bytesToKey(b []byte) (rune, []byte) {
}
}
if
len
(
b
)
>=
6
&&
b
[
0
]
==
keyEscape
&&
b
[
1
]
==
'['
&&
b
[
2
]
==
'1'
&&
b
[
3
]
==
';'
&&
b
[
4
]
==
'3'
{
if
!
pasteActive
&&
len
(
b
)
>=
6
&&
b
[
0
]
==
keyEscape
&&
b
[
1
]
==
'['
&&
b
[
2
]
==
'1'
&&
b
[
3
]
==
';'
&&
b
[
4
]
==
'3'
{
switch
b
[
5
]
{
case
'C'
:
return
keyAltRight
,
b
[
6
:
]
...
...
@@ -187,12 +193,20 @@ func bytesToKey(b []byte) (rune, []byte) {
}
}
if
!
pasteActive
&&
len
(
b
)
>=
6
&&
bytes
.
Equal
(
b
[
:
6
],
pasteStart
)
{
return
keyPasteStart
,
b
[
6
:
]
}
if
pasteActive
&&
len
(
b
)
>=
6
&&
bytes
.
Equal
(
b
[
:
6
],
pasteEnd
)
{
return
keyPasteEnd
,
b
[
6
:
]
}
// If we get here then we have a key that we don't recognise, or a
// partial sequence. It's not clear how one should find the end of a
// sequence without knowing them all, but it seems that [a-zA-Z] only
// sequence without knowing them all, but it seems that [a-zA-Z
~
] only
// appears at the end of a sequence.
for
i
,
c
:=
range
b
[
0
:
]
{
if
c
>=
'a'
&&
c
<=
'z'
||
c
>=
'A'
&&
c
<=
'Z'
{
if
c
>=
'a'
&&
c
<=
'z'
||
c
>=
'A'
&&
c
<=
'Z'
||
c
==
'~'
{
return
keyUnknown
,
b
[
i
+
1
:
]
}
}
...
...
@@ -414,6 +428,11 @@ func visualLength(runes []rune) int {
// handleKey processes the given key and, optionally, returns a line of text
// that the user has entered.
func
(
t
*
Terminal
)
handleKey
(
key
rune
)
(
line
string
,
ok
bool
)
{
if
t
.
pasteActive
&&
key
!=
keyEnter
{
t
.
addKeyToLine
(
key
)
return
}
switch
key
{
case
keyBackspace
:
if
t
.
pos
==
0
{
...
...
@@ -538,23 +557,29 @@ func (t *Terminal) handleKey(key rune) (line string, ok bool) {
if
len
(
t
.
line
)
==
maxLineLength
{
return
}
if
len
(
t
.
line
)
==
cap
(
t
.
line
)
{
newLine
:=
make
([]
rune
,
len
(
t
.
line
),
2
*
(
1
+
len
(
t
.
line
)))
copy
(
newLine
,
t
.
line
)
t
.
line
=
newLine
}
t
.
line
=
t
.
line
[
:
len
(
t
.
line
)
+
1
]
copy
(
t
.
line
[
t
.
pos
+
1
:
],
t
.
line
[
t
.
pos
:
])
t
.
line
[
t
.
pos
]
=
key
if
t
.
echo
{
t
.
writeLine
(
t
.
line
[
t
.
pos
:
])
}
t
.
pos
++
t
.
moveCursorToPos
(
t
.
pos
)
t
.
addKeyToLine
(
key
)
}
return
}
// addKeyToLine inserts the given key at the current position in the current
// line.
func
(
t
*
Terminal
)
addKeyToLine
(
key
rune
)
{
if
len
(
t
.
line
)
==
cap
(
t
.
line
)
{
newLine
:=
make
([]
rune
,
len
(
t
.
line
),
2
*
(
1
+
len
(
t
.
line
)))
copy
(
newLine
,
t
.
line
)
t
.
line
=
newLine
}
t
.
line
=
t
.
line
[
:
len
(
t
.
line
)
+
1
]
copy
(
t
.
line
[
t
.
pos
+
1
:
],
t
.
line
[
t
.
pos
:
])
t
.
line
[
t
.
pos
]
=
key
if
t
.
echo
{
t
.
writeLine
(
t
.
line
[
t
.
pos
:
])
}
t
.
pos
++
t
.
moveCursorToPos
(
t
.
pos
)
}
func
(
t
*
Terminal
)
writeLine
(
line
[]
rune
)
{
for
len
(
line
)
!=
0
{
remainingOnLine
:=
t
.
termWidth
-
t
.
cursorX
...
...
@@ -648,19 +673,36 @@ func (t *Terminal) readLine() (line string, err error) {
t
.
outBuf
=
t
.
outBuf
[
:
0
]
}
lineIsPasted
:=
t
.
pasteActive
for
{
rest
:=
t
.
remainder
lineOk
:=
false
for
!
lineOk
{
var
key
rune
key
,
rest
=
bytesToKey
(
rest
)
key
,
rest
=
bytesToKey
(
rest
,
t
.
pasteActive
)
if
key
==
utf8
.
RuneError
{
break
}
if
key
==
keyCtrlD
{
if
len
(
t
.
line
)
==
0
{
return
""
,
io
.
EOF
if
!
t
.
pasteActive
{
if
key
==
keyCtrlD
{
if
len
(
t
.
line
)
==
0
{
return
""
,
io
.
EOF
}
}
if
key
==
keyPasteStart
{
t
.
pasteActive
=
true
if
len
(
t
.
line
)
==
0
{
lineIsPasted
=
true
}
continue
}
}
else
if
key
==
keyPasteEnd
{
t
.
pasteActive
=
false
continue
}
if
!
t
.
pasteActive
{
lineIsPasted
=
false
}
line
,
lineOk
=
t
.
handleKey
(
key
)
}
...
...
@@ -677,6 +719,9 @@ func (t *Terminal) readLine() (line string, err error) {
t
.
historyIndex
=
-
1
t
.
history
.
Add
(
line
)
}
if
lineIsPasted
{
err
=
ErrPasteIndicator
}
return
}
...
...
@@ -732,11 +777,15 @@ func (t *Terminal) SetSize(width, height int) error {
t
.
lock
.
Lock
()
defer
t
.
lock
.
Unlock
()
if
width
==
0
{
width
=
1
}
oldWidth
:=
t
.
termWidth
t
.
termWidth
,
t
.
termHeight
=
width
,
height
switch
{
case
width
==
oldWidth
||
len
(
t
.
line
)
==
0
:
case
width
==
oldWidth
:
// If the width didn't change then nothing else needs to be
// done.
return
nil
...
...
@@ -752,6 +801,9 @@ func (t *Terminal) SetSize(width, height int) error {
// wrapping and turning into two. This causes the prompt on
// xterms to move upwards, which isn't great, but it avoids a
// huge mess with gnome-terminal.
if
t
.
cursorX
>=
t
.
termWidth
{
t
.
cursorX
=
t
.
termWidth
-
1
}
t
.
cursorY
*=
2
t
.
clearAndRepaintLinePlusNPrevious
(
t
.
maxLine
*
2
)
case
width
>
oldWidth
:
...
...
@@ -770,6 +822,31 @@ func (t *Terminal) SetSize(width, height int) error {
return
err
}
type
pasteIndicatorError
struct
{}
func
(
pasteIndicatorError
)
Error
()
string
{
return
"terminal: ErrPasteIndicator not correctly handled"
}
// ErrPasteIndicator may be returned from ReadLine as the error, in addition
// to valid line data. It indicates that bracketed paste mode is enabled and
// that the returned line consists only of pasted data. Programs may wish to
// interpret pasted data more literally than typed data.
var
ErrPasteIndicator
=
pasteIndicatorError
{}
// SetBracketedPasteMode requests that the terminal bracket paste operations
// with markers. Not all terminals support this but, if it is supported, then
// enabling this mode will stop any autocomplete callback from running due to
// pastes. Additionally, any lines that are completely pasted will be returned
// from ReadLine with the error set to ErrPasteIndicator.
func
(
t
*
Terminal
)
SetBracketedPasteMode
(
on
bool
)
{
if
on
{
io
.
WriteString
(
t
.
c
,
"
\x1b
[?2004h"
)
}
else
{
io
.
WriteString
(
t
.
c
,
"
\x1b
[?2004l"
)
}
}
// stRingBuffer is a ring buffer of strings.
type
stRingBuffer
struct
{
// entries contains max elements.
...
...
Godeps/_workspace/src/
code.google.com/p/go.
crypto/ssh/terminal/terminal_test.go
→
Godeps/_workspace/src/
golang.org/x/
crypto/ssh/terminal/terminal_test.go
浏览文件 @
992b2621
...
...
@@ -179,6 +179,24 @@ var keyPressTests = []struct {
in
:
"abcd
\x1b
[D
\x1b
[D
\0
25
\r
"
,
line
:
"cd"
,
},
{
// Bracketed paste mode: control sequences should be returned
// verbatim in paste mode.
in
:
"abc
\x1b
[200~de
\1
77f
\x1b
[201~
\1
77
\r
"
,
line
:
"abcde
\1
77"
,
},
{
// Enter in bracketed paste mode should still work.
in
:
"abc
\x1b
[200~d
\r
efg
\x1b
[201~h
\r
"
,
line
:
"efgh"
,
throwAwayLines
:
1
,
},
{
// Lines consisting entirely of pasted data should be indicated as such.
in
:
"
\x1b
[200~a
\r
"
,
line
:
"a"
,
err
:
ErrPasteIndicator
,
},
}
func
TestKeyPresses
(
t
*
testing
.
T
)
{
...
...
Godeps/_workspace/src/
code.google.com/p/go.
crypto/ssh/terminal/util.go
→
Godeps/_workspace/src/
golang.org/x/
crypto/ssh/terminal/util.go
浏览文件 @
992b2621
文件已移动
Godeps/_workspace/src/
code.google.com/p/go.
crypto/ssh/terminal/util_bsd.go
→
Godeps/_workspace/src/
golang.org/x/
crypto/ssh/terminal/util_bsd.go
浏览文件 @
992b2621
文件已移动
Godeps/_workspace/src/
code.google.com/p/go.
crypto/ssh/terminal/util_linux.go
→
Godeps/_workspace/src/
golang.org/x/
crypto/ssh/terminal/util_linux.go
浏览文件 @
992b2621
文件已移动
Godeps/_workspace/src/
code.google.com/p/go.
crypto/ssh/terminal/util_windows.go
→
Godeps/_workspace/src/
golang.org/x/
crypto/ssh/terminal/util_windows.go
浏览文件 @
992b2621
...
...
@@ -161,6 +161,9 @@ func ReadPassword(fd int) ([]byte, error) {
if
buf
[
n
-
1
]
==
'\n'
{
n
--
}
if
n
>
0
&&
buf
[
n
-
1
]
==
'\r'
{
n
--
}
ret
=
append
(
ret
,
buf
[
:
n
]
...
)
if
n
<
len
(
buf
)
{
break
...
...
Godeps/_workspace/src/gopkg.in/yaml.v1/README.md
浏览文件 @
992b2621
...
...
@@ -12,10 +12,10 @@ C library to parse and generate YAML data quickly and reliably.
Compatibility
-------------
The yaml package
is almost compatible with YAML 1.1
, including support for
anchors, tags,
etc. There are still a few missing bits, such as documen
t
merging, base-60 floats (huh?), and multi-document unmarshalling. These
features are not hard to add, and will be introduced as necessary
.
The yaml package
supports most of YAML 1.1 and 1.2
, including support for
anchors, tags,
map merging, etc. Multi-document unmarshalling is not ye
t
implemented, and base-60 floats from YAML 1.1 are purposefully not
supported since they're a poor design and are gone in YAML 1.2
.
Installation and usage
----------------------
...
...
Godeps/_workspace/src/gopkg.in/yaml.v1/decode.go
浏览文件 @
992b2621
package
yaml
import
(
"encoding/base64"
"fmt"
"reflect"
"strconv"
"time"
...
...
@@ -63,7 +65,7 @@ func (p *parser) destroy() {
func
(
p
*
parser
)
skip
()
{
if
p
.
event
.
typ
!=
yaml_NO_EVENT
{
if
p
.
event
.
typ
==
yaml_STREAM_END_EVENT
{
panic
(
"Attempted to go past the end of stream. Corrupted value?"
)
fail
(
"Attempted to go past the end of stream. Corrupted value?"
)
}
yaml_event_delete
(
&
p
.
event
)
}
...
...
@@ -89,7 +91,7 @@ func (p *parser) fail() {
}
else
{
msg
=
"Unknown problem parsing YAML content"
}
panic
(
where
+
msg
)
fail
(
where
+
msg
)
}
func
(
p
*
parser
)
anchor
(
n
*
node
,
anchor
[]
byte
)
{
...
...
@@ -114,10 +116,9 @@ func (p *parser) parse() *node {
// Happens when attempting to decode an empty buffer.
return
nil
default
:
panic
(
"Attempted to parse unknown event: "
+
strconv
.
Itoa
(
int
(
p
.
event
.
typ
)))
panic
(
"Attempted to parse unknown event: "
+
strconv
.
Itoa
(
int
(
p
.
event
.
typ
)))
}
panic
(
"
U
nreachable"
)
panic
(
"
u
nreachable"
)
}
func
(
p
*
parser
)
node
(
kind
int
)
*
node
{
...
...
@@ -135,8 +136,7 @@ func (p *parser) document() *node {
p
.
skip
()
n
.
children
=
append
(
n
.
children
,
p
.
parse
())
if
p
.
event
.
typ
!=
yaml_DOCUMENT_END_EVENT
{
panic
(
"Expected end of document event but got "
+
strconv
.
Itoa
(
int
(
p
.
event
.
typ
)))
panic
(
"Expected end of document event but got "
+
strconv
.
Itoa
(
int
(
p
.
event
.
typ
)))
}
p
.
skip
()
return
n
...
...
@@ -218,7 +218,7 @@ func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()
var
arg
interface
{}
*
out
=
reflect
.
ValueOf
(
&
arg
)
.
Elem
()
return
func
()
{
*
good
=
setter
.
SetYAML
(
tag
,
arg
)
*
good
=
setter
.
SetYAML
(
shortTag
(
tag
)
,
arg
)
}
}
}
...
...
@@ -226,7 +226,7 @@ func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()
for
again
{
again
=
false
setter
,
_
:=
(
*
out
)
.
Interface
()
.
(
Setter
)
if
tag
!=
"!!null"
||
setter
!=
nil
{
if
tag
!=
yaml_NULL_TAG
||
setter
!=
nil
{
if
pv
:=
(
*
out
);
pv
.
Kind
()
==
reflect
.
Ptr
{
if
pv
.
IsNil
()
{
*
out
=
reflect
.
New
(
pv
.
Type
()
.
Elem
())
.
Elem
()
...
...
@@ -242,7 +242,7 @@ func (d *decoder) setter(tag string, out *reflect.Value, good *bool) (set func()
var
arg
interface
{}
*
out
=
reflect
.
ValueOf
(
&
arg
)
.
Elem
()
return
func
()
{
*
good
=
setter
.
SetYAML
(
tag
,
arg
)
*
good
=
setter
.
SetYAML
(
shortTag
(
tag
)
,
arg
)
}
}
}
...
...
@@ -279,10 +279,10 @@ func (d *decoder) document(n *node, out reflect.Value) (good bool) {
func
(
d
*
decoder
)
alias
(
n
*
node
,
out
reflect
.
Value
)
(
good
bool
)
{
an
,
ok
:=
d
.
doc
.
anchors
[
n
.
value
]
if
!
ok
{
panic
(
"Unknown anchor '"
+
n
.
value
+
"' referenced"
)
fail
(
"Unknown anchor '"
+
n
.
value
+
"' referenced"
)
}
if
d
.
aliases
[
n
.
value
]
{
panic
(
"Anchor '"
+
n
.
value
+
"' value contains itself"
)
fail
(
"Anchor '"
+
n
.
value
+
"' value contains itself"
)
}
d
.
aliases
[
n
.
value
]
=
true
good
=
d
.
unmarshal
(
an
,
out
)
...
...
@@ -290,23 +290,50 @@ func (d *decoder) alias(n *node, out reflect.Value) (good bool) {
return
good
}
var
zeroValue
reflect
.
Value
func
resetMap
(
out
reflect
.
Value
)
{
for
_
,
k
:=
range
out
.
MapKeys
()
{
out
.
SetMapIndex
(
k
,
zeroValue
)
}
}
var
durationType
=
reflect
.
TypeOf
(
time
.
Duration
(
0
))
func
(
d
*
decoder
)
scalar
(
n
*
node
,
out
reflect
.
Value
)
(
good
bool
)
{
var
tag
string
var
resolved
interface
{}
if
n
.
tag
==
""
&&
!
n
.
implicit
{
tag
=
"!!str"
tag
=
yaml_STR_TAG
resolved
=
n
.
value
}
else
{
tag
,
resolved
=
resolve
(
n
.
tag
,
n
.
value
)
if
tag
==
yaml_BINARY_TAG
{
data
,
err
:=
base64
.
StdEncoding
.
DecodeString
(
resolved
.
(
string
))
if
err
!=
nil
{
fail
(
"!!binary value contains invalid base64 data"
)
}
resolved
=
string
(
data
)
}
}
if
set
:=
d
.
setter
(
tag
,
&
out
,
&
good
);
set
!=
nil
{
defer
set
()
}
if
resolved
==
nil
{
if
out
.
Kind
()
==
reflect
.
Map
&&
!
out
.
CanAddr
()
{
resetMap
(
out
)
}
else
{
out
.
Set
(
reflect
.
Zero
(
out
.
Type
()))
}
good
=
true
return
}
switch
out
.
Kind
()
{
case
reflect
.
String
:
if
resolved
!=
nil
{
if
tag
==
yaml_BINARY_TAG
{
out
.
SetString
(
resolved
.
(
string
))
good
=
true
}
else
if
resolved
!=
nil
{
out
.
SetString
(
n
.
value
)
good
=
true
}
...
...
@@ -380,17 +407,11 @@ func (d *decoder) scalar(n *node, out reflect.Value) (good bool) {
good
=
true
}
case
reflect
.
Ptr
:
switch
resolved
.
(
type
)
{
case
nil
:
out
.
Set
(
reflect
.
Zero
(
out
.
Type
()))
if
out
.
Type
()
.
Elem
()
==
reflect
.
TypeOf
(
resolved
)
{
elem
:=
reflect
.
New
(
out
.
Type
()
.
Elem
())
elem
.
Elem
()
.
Set
(
reflect
.
ValueOf
(
resolved
))
out
.
Set
(
elem
)
good
=
true
default
:
if
out
.
Type
()
.
Elem
()
==
reflect
.
TypeOf
(
resolved
)
{
elem
:=
reflect
.
New
(
out
.
Type
()
.
Elem
())
elem
.
Elem
()
.
Set
(
reflect
.
ValueOf
(
resolved
))
out
.
Set
(
elem
)
good
=
true
}
}
}
return
good
...
...
@@ -404,7 +425,7 @@ func settableValueOf(i interface{}) reflect.Value {
}
func
(
d
*
decoder
)
sequence
(
n
*
node
,
out
reflect
.
Value
)
(
good
bool
)
{
if
set
:=
d
.
setter
(
"!!seq"
,
&
out
,
&
good
);
set
!=
nil
{
if
set
:=
d
.
setter
(
yaml_SEQ_TAG
,
&
out
,
&
good
);
set
!=
nil
{
defer
set
()
}
var
iface
reflect
.
Value
...
...
@@ -433,7 +454,7 @@ func (d *decoder) sequence(n *node, out reflect.Value) (good bool) {
}
func
(
d
*
decoder
)
mapping
(
n
*
node
,
out
reflect
.
Value
)
(
good
bool
)
{
if
set
:=
d
.
setter
(
"!!map"
,
&
out
,
&
good
);
set
!=
nil
{
if
set
:=
d
.
setter
(
yaml_MAP_TAG
,
&
out
,
&
good
);
set
!=
nil
{
defer
set
()
}
if
out
.
Kind
()
==
reflect
.
Struct
{
...
...
@@ -465,6 +486,13 @@ func (d *decoder) mapping(n *node, out reflect.Value) (good bool) {
}
k
:=
reflect
.
New
(
kt
)
.
Elem
()
if
d
.
unmarshal
(
n
.
children
[
i
],
k
)
{
kkind
:=
k
.
Kind
()
if
kkind
==
reflect
.
Interface
{
kkind
=
k
.
Elem
()
.
Kind
()
}
if
kkind
==
reflect
.
Map
||
kkind
==
reflect
.
Slice
{
fail
(
fmt
.
Sprintf
(
"invalid map key: %#v"
,
k
.
Interface
()))
}
e
:=
reflect
.
New
(
et
)
.
Elem
()
if
d
.
unmarshal
(
n
.
children
[
i
+
1
],
e
)
{
out
.
SetMapIndex
(
k
,
e
)
...
...
@@ -511,28 +539,28 @@ func (d *decoder) merge(n *node, out reflect.Value) {
case
aliasNode
:
an
,
ok
:=
d
.
doc
.
anchors
[
n
.
value
]
if
ok
&&
an
.
kind
!=
mappingNode
{
panic
(
wantMap
)
fail
(
wantMap
)
}
d
.
unmarshal
(
n
,
out
)
case
sequenceNode
:
// Step backwards as earlier nodes take precedence.
for
i
:=
len
(
n
.
children
)
-
1
;
i
>=
0
;
i
--
{
for
i
:=
len
(
n
.
children
)
-
1
;
i
>=
0
;
i
--
{
ni
:=
n
.
children
[
i
]
if
ni
.
kind
==
aliasNode
{
an
,
ok
:=
d
.
doc
.
anchors
[
ni
.
value
]
if
ok
&&
an
.
kind
!=
mappingNode
{
panic
(
wantMap
)
fail
(
wantMap
)
}
}
else
if
ni
.
kind
!=
mappingNode
{
panic
(
wantMap
)
fail
(
wantMap
)
}
d
.
unmarshal
(
ni
,
out
)
}
default
:
panic
(
wantMap
)
fail
(
wantMap
)
}
}
func
isMerge
(
n
*
node
)
bool
{
return
n
.
kind
==
scalarNode
&&
n
.
value
==
"<<"
&&
(
n
.
implicit
==
true
||
n
.
tag
==
"!!merge"
||
n
.
tag
==
"tag:yaml.org,2002:merge"
)
return
n
.
kind
==
scalarNode
&&
n
.
value
==
"<<"
&&
(
n
.
implicit
==
true
||
n
.
tag
==
yaml_MERGE_TAG
)
}
Godeps/_workspace/src/gopkg.in/yaml.v1/decode_test.go
浏览文件 @
992b2621
...
...
@@ -5,6 +5,7 @@ import (
"gopkg.in/yaml.v1"
"math"
"reflect"
"strings"
"time"
)
...
...
@@ -316,7 +317,10 @@ var unmarshalTests = []struct {
map
[
string
]
*
string
{
"foo"
:
new
(
string
)},
},
{
"foo: null"
,
map
[
string
]
string
{},
map
[
string
]
string
{
"foo"
:
""
},
},
{
"foo: null"
,
map
[
string
]
interface
{}{
"foo"
:
nil
},
},
// Ignored field
...
...
@@ -372,11 +376,29 @@ var unmarshalTests = []struct {
map
[
string
]
time
.
Duration
{
"a"
:
3
*
time
.
Second
},
},
// Issue #24.
// Issue #24.
{
"a: <foo>"
,
map
[
string
]
string
{
"a"
:
"<foo>"
},
},
// Base 60 floats are obsolete and unsupported.
{
"a: 1:1
\n
"
,
map
[
string
]
string
{
"a"
:
"1:1"
},
},
// Binary data.
{
"a: !!binary gIGC
\n
"
,
map
[
string
]
string
{
"a"
:
"
\x80\x81\x82
"
},
},
{
"a: !!binary |
\n
"
+
strings
.
Repeat
(
"kJCQ"
,
17
)
+
"kJ
\n
CQ
\n
"
,
map
[
string
]
string
{
"a"
:
strings
.
Repeat
(
"
\x90
"
,
54
)},
},
{
"a: !!binary |
\n
"
+
strings
.
Repeat
(
"A"
,
70
)
+
"
\n
==
\n
"
,
map
[
string
]
string
{
"a"
:
strings
.
Repeat
(
"
\x00
"
,
52
)},
},
}
type
inlineB
struct
{
...
...
@@ -424,12 +446,15 @@ func (s *S) TestUnmarshalNaN(c *C) {
var
unmarshalErrorTests
=
[]
struct
{
data
,
error
string
}{
{
"v: !!float 'error'"
,
"YAML error:
Can't decode !!str 'error'
as a !!float"
},
{
"v: !!float 'error'"
,
"YAML error:
cannot decode !!str `error`
as a !!float"
},
{
"v: [A,"
,
"YAML error: line 1: did not find expected node content"
},
{
"v:
\n
- [A,"
,
"YAML error: line 2: did not find expected node content"
},
{
"a: *b
\n
"
,
"YAML error: Unknown anchor 'b' referenced"
},
{
"a: &a
\n
b: *a
\n
"
,
"YAML error: Anchor 'a' value contains itself"
},
{
"value: -"
,
"YAML error: block sequence entries are not allowed in this context"
},
{
"a: !!binary =="
,
"YAML error: !!binary value contains invalid base64 data"
},
{
"{[.]}"
,
`YAML error: invalid map key: \[\]interface \{\}\{"\."\}`
},
{
"{{.}}"
,
`YAML error: invalid map key: map\[interface\ \{\}\]interface \{\}\{".":interface \{\}\(nil\)\}`
},
}
func
(
s
*
S
)
TestUnmarshalErrors
(
c
*
C
)
{
...
...
@@ -624,6 +649,30 @@ func (s *S) TestMergeStruct(c *C) {
}
}
var
unmarshalNullTests
=
[]
func
()
interface
{}{
func
()
interface
{}
{
var
v
interface
{};
v
=
"v"
;
return
&
v
},
func
()
interface
{}
{
var
s
=
"s"
;
return
&
s
},
func
()
interface
{}
{
var
s
=
"s"
;
sptr
:=
&
s
;
return
&
sptr
},
func
()
interface
{}
{
var
i
=
1
;
return
&
i
},
func
()
interface
{}
{
var
i
=
1
;
iptr
:=
&
i
;
return
&
iptr
},
func
()
interface
{}
{
m
:=
map
[
string
]
int
{
"s"
:
1
};
return
&
m
},
func
()
interface
{}
{
m
:=
map
[
string
]
int
{
"s"
:
1
};
return
m
},
}
func
(
s
*
S
)
TestUnmarshalNull
(
c
*
C
)
{
for
_
,
test
:=
range
unmarshalNullTests
{
item
:=
test
()
zero
:=
reflect
.
Zero
(
reflect
.
TypeOf
(
item
)
.
Elem
())
.
Interface
()
err
:=
yaml
.
Unmarshal
([]
byte
(
"null"
),
item
)
c
.
Assert
(
err
,
IsNil
)
if
reflect
.
TypeOf
(
item
)
.
Kind
()
==
reflect
.
Map
{
c
.
Assert
(
reflect
.
ValueOf
(
item
)
.
Interface
(),
DeepEquals
,
reflect
.
MakeMap
(
reflect
.
TypeOf
(
item
))
.
Interface
())
}
else
{
c
.
Assert
(
reflect
.
ValueOf
(
item
)
.
Elem
()
.
Interface
(),
DeepEquals
,
zero
)
}
}
}
//var data []byte
//func init() {
// var err error
...
...
Godeps/_workspace/src/gopkg.in/yaml.v1/emitterc.go
浏览文件 @
992b2621
...
...
@@ -973,8 +973,8 @@ func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool {
if
bytes
.
HasPrefix
(
tag
,
tag_directive
.
prefix
)
{
emitter
.
tag_data
.
handle
=
tag_directive
.
handle
emitter
.
tag_data
.
suffix
=
tag
[
len
(
tag_directive
.
prefix
)
:
]
return
true
}
return
true
}
emitter
.
tag_data
.
suffix
=
tag
return
true
...
...
@@ -1279,6 +1279,9 @@ func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_
for
k
:=
0
;
k
<
w
;
k
++
{
octet
:=
value
[
i
]
i
++
if
!
put
(
emitter
,
'%'
)
{
return
false
}
c
:=
octet
>>
4
if
c
<
10
{
...
...
Godeps/_workspace/src/gopkg.in/yaml.v1/encode.go
浏览文件 @
992b2621
...
...
@@ -2,8 +2,10 @@ package yaml
import
(
"reflect"
"regexp"
"sort"
"strconv"
"strings"
"time"
)
...
...
@@ -50,14 +52,19 @@ func (e *encoder) must(ok bool) {
if
msg
==
""
{
msg
=
"Unknown problem generating YAML content"
}
panic
(
msg
)
fail
(
msg
)
}
}
func
(
e
*
encoder
)
marshal
(
tag
string
,
in
reflect
.
Value
)
{
if
!
in
.
IsValid
()
{
e
.
nilv
()
return
}
var
value
interface
{}
if
getter
,
ok
:=
in
.
Interface
()
.
(
Getter
);
ok
{
tag
,
value
=
getter
.
GetYAML
()
tag
=
longTag
(
tag
)
if
value
==
nil
{
e
.
nilv
()
return
...
...
@@ -98,7 +105,7 @@ func (e *encoder) marshal(tag string, in reflect.Value) {
case
reflect
.
Bool
:
e
.
boolv
(
tag
,
in
)
default
:
panic
(
"Can't marshal type
yet
: "
+
in
.
Type
()
.
String
())
panic
(
"Can't marshal type: "
+
in
.
Type
()
.
String
())
}
}
...
...
@@ -167,11 +174,46 @@ func (e *encoder) slicev(tag string, in reflect.Value) {
e
.
emit
()
}
// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1.
//
// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported
// in YAML 1.2 and by this package, but these should be marshalled quoted for
// the time being for compatibility with other parsers.
func
isBase60Float
(
s
string
)
(
result
bool
)
{
// Fast path.
if
s
==
""
{
return
false
}
c
:=
s
[
0
]
if
!
(
c
==
'+'
||
c
==
'-'
||
c
>=
'0'
&&
c
<=
'9'
)
||
strings
.
IndexByte
(
s
,
':'
)
<
0
{
return
false
}
// Do the full match.
return
base60float
.
MatchString
(
s
)
}
// From http://yaml.org/type/float.html, except the regular expression there
// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix.
var
base60float
=
regexp
.
MustCompile
(
`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`
)
func
(
e
*
encoder
)
stringv
(
tag
string
,
in
reflect
.
Value
)
{
var
style
yaml_scalar_style_t
s
:=
in
.
String
()
if
rtag
,
_
:=
resolve
(
""
,
s
);
rtag
!=
"!!str"
{
rtag
,
rs
:=
resolve
(
""
,
s
)
if
rtag
==
yaml_BINARY_TAG
{
if
tag
==
""
||
tag
==
yaml_STR_TAG
{
tag
=
rtag
s
=
rs
.
(
string
)
}
else
if
tag
==
yaml_BINARY_TAG
{
fail
(
"explicitly tagged !!binary data must be base64-encoded"
)
}
else
{
fail
(
"cannot marshal invalid UTF-8 data as "
+
shortTag
(
tag
))
}
}
if
tag
==
""
&&
(
rtag
!=
yaml_STR_TAG
||
isBase60Float
(
s
))
{
style
=
yaml_DOUBLE_QUOTED_SCALAR_STYLE
}
else
if
strings
.
Contains
(
s
,
"
\n
"
)
{
style
=
yaml_LITERAL_SCALAR_STYLE
}
else
{
style
=
yaml_PLAIN_SCALAR_STYLE
}
...
...
@@ -218,9 +260,6 @@ func (e *encoder) nilv() {
func
(
e
*
encoder
)
emitScalar
(
value
,
anchor
,
tag
string
,
style
yaml_scalar_style_t
)
{
implicit
:=
tag
==
""
if
!
implicit
{
style
=
yaml_PLAIN_SCALAR_STYLE
}
e
.
must
(
yaml_scalar_event_initialize
(
&
e
.
event
,
[]
byte
(
anchor
),
[]
byte
(
tag
),
[]
byte
(
value
),
implicit
,
implicit
,
style
))
e
.
emit
()
}
Godeps/_workspace/src/gopkg.in/yaml.v1/encode_test.go
浏览文件 @
992b2621
...
...
@@ -2,12 +2,13 @@ package yaml_test
import
(
"fmt"
"gopkg.in/yaml.v1"
.
"gopkg.in/check.v1"
"math"
"strconv"
"strings"
"time"
.
"gopkg.in/check.v1"
"gopkg.in/yaml.v1"
)
var
marshalIntTest
=
123
...
...
@@ -17,6 +18,9 @@ var marshalTests = []struct {
data
string
}{
{
nil
,
"null
\n
"
,
},
{
&
struct
{}{},
"{}
\n
"
,
},
{
...
...
@@ -87,7 +91,7 @@ var marshalTests = []struct {
"v:
\n
- A
\n
- B
\n
"
,
},
{
map
[
string
][]
string
{
"v"
:
[]
string
{
"A"
,
"B
\n
C"
}},
"v:
\n
- A
\n
-
'B
\n\n
C'
\n
"
,
"v:
\n
- A
\n
-
|-
\n
B
\n
C
\n
"
,
},
{
map
[
string
][]
interface
{}{
"v"
:
[]
interface
{}{
"A"
,
1
,
map
[
string
][]
int
{
"B"
:
[]
int
{
2
,
3
}}}},
"v:
\n
- A
\n
- 1
\n
- B:
\n
- 2
\n
- 3
\n
"
,
...
...
@@ -220,11 +224,39 @@ var marshalTests = []struct {
"a: 3s
\n
"
,
},
// Issue #24
.
// Issue #24
: bug in map merging logic.
{
map
[
string
]
string
{
"a"
:
"<foo>"
},
"a: <foo>
\n
"
,
},
// Issue #34: marshal unsupported base 60 floats quoted for compatibility
// with old YAML 1.1 parsers.
{
map
[
string
]
string
{
"a"
:
"1:1"
},
"a:
\"
1:1
\"\n
"
,
},
// Binary data.
{
map
[
string
]
string
{
"a"
:
"
\x00
"
},
"a:
\"\\
0
\"\n
"
,
},
{
map
[
string
]
string
{
"a"
:
"
\x80\x81\x82
"
},
"a: !!binary gIGC
\n
"
,
},
{
map
[
string
]
string
{
"a"
:
strings
.
Repeat
(
"
\x90
"
,
54
)},
"a: !!binary |
\n
"
+
strings
.
Repeat
(
"kJCQ"
,
17
)
+
"kJ
\n
CQ
\n
"
,
},
{
map
[
string
]
interface
{}{
"a"
:
typeWithGetter
{
"!!str"
,
"
\x80\x81\x82
"
}},
"a: !!binary gIGC
\n
"
,
},
// Escaping of tags.
{
map
[
string
]
interface
{}{
"a"
:
typeWithGetter
{
"foo!bar"
,
1
}},
"a: !<foo%21bar> 1
\n
"
,
},
}
func
(
s
*
S
)
TestMarshal
(
c
*
C
)
{
...
...
@@ -238,20 +270,29 @@ func (s *S) TestMarshal(c *C) {
var
marshalErrorTests
=
[]
struct
{
value
interface
{}
error
string
}{
{
&
struct
{
B
int
inlineB
",inline"
}{
1
,
inlineB
{
2
,
inlineC
{
3
}}},
`Duplicated key 'b' in struct struct \{ B int; .*`
,
},
}
panic
string
}{{
value
:
&
struct
{
B
int
inlineB
",inline"
}{
1
,
inlineB
{
2
,
inlineC
{
3
}}},
panic
:
`Duplicated key 'b' in struct struct \{ B int; .*`
,
},
{
value
:
typeWithGetter
{
"!!binary"
,
"
\x80
"
},
error
:
"YAML error: explicitly tagged !!binary data must be base64-encoded"
,
},
{
value
:
typeWithGetter
{
"!!float"
,
"
\x80
"
},
error
:
`YAML error: cannot marshal invalid UTF-8 data as !!float`
,
}}
func
(
s
*
S
)
TestMarshalErrors
(
c
*
C
)
{
for
_
,
item
:=
range
marshalErrorTests
{
_
,
err
:=
yaml
.
Marshal
(
item
.
value
)
c
.
Assert
(
err
,
ErrorMatches
,
item
.
error
)
if
item
.
panic
!=
""
{
c
.
Assert
(
func
()
{
yaml
.
Marshal
(
item
.
value
)
},
PanicMatches
,
item
.
panic
)
}
else
{
_
,
err
:=
yaml
.
Marshal
(
item
.
value
)
c
.
Assert
(
err
,
ErrorMatches
,
item
.
error
)
}
}
}
...
...
Godeps/_workspace/src/gopkg.in/yaml.v1/resolve.go
浏览文件 @
992b2621
package
yaml
import
(
"encoding/base64"
"fmt"
"math"
"strconv"
"strings"
"unicode/utf8"
)
// TODO: merge, timestamps, base 60 floats, omap.
...
...
@@ -33,18 +36,18 @@ func init() {
tag
string
l
[]
string
}{
{
true
,
"!!bool"
,
[]
string
{
"y"
,
"Y"
,
"yes"
,
"Yes"
,
"YES"
}},
{
true
,
"!!bool"
,
[]
string
{
"true"
,
"True"
,
"TRUE"
}},
{
true
,
"!!bool"
,
[]
string
{
"on"
,
"On"
,
"ON"
}},
{
false
,
"!!bool"
,
[]
string
{
"n"
,
"N"
,
"no"
,
"No"
,
"NO"
}},
{
false
,
"!!bool"
,
[]
string
{
"false"
,
"False"
,
"FALSE"
}},
{
false
,
"!!bool"
,
[]
string
{
"off"
,
"Off"
,
"OFF"
}},
{
nil
,
"!!null"
,
[]
string
{
"~"
,
"null"
,
"Null"
,
"NULL"
}},
{
math
.
NaN
(),
"!!float"
,
[]
string
{
".nan"
,
".NaN"
,
".NAN"
}},
{
math
.
Inf
(
+
1
),
"!!float"
,
[]
string
{
".inf"
,
".Inf"
,
".INF"
}},
{
math
.
Inf
(
+
1
),
"!!float"
,
[]
string
{
"+.inf"
,
"+.Inf"
,
"+.INF"
}},
{
math
.
Inf
(
-
1
),
"!!float"
,
[]
string
{
"-.inf"
,
"-.Inf"
,
"-.INF"
}},
{
"<<"
,
"!!merge"
,
[]
string
{
"<<"
}},
{
true
,
yaml_BOOL_TAG
,
[]
string
{
"y"
,
"Y"
,
"yes"
,
"Yes"
,
"YES"
}},
{
true
,
yaml_BOOL_TAG
,
[]
string
{
"true"
,
"True"
,
"TRUE"
}},
{
true
,
yaml_BOOL_TAG
,
[]
string
{
"on"
,
"On"
,
"ON"
}},
{
false
,
yaml_BOOL_TAG
,
[]
string
{
"n"
,
"N"
,
"no"
,
"No"
,
"NO"
}},
{
false
,
yaml_BOOL_TAG
,
[]
string
{
"false"
,
"False"
,
"FALSE"
}},
{
false
,
yaml_BOOL_TAG
,
[]
string
{
"off"
,
"Off"
,
"OFF"
}},
{
nil
,
yaml_NULL_TAG
,
[]
string
{
""
,
"~"
,
"null"
,
"Null"
,
"NULL"
}},
{
math
.
NaN
(),
yaml_FLOAT_TAG
,
[]
string
{
".nan"
,
".NaN"
,
".NAN"
}},
{
math
.
Inf
(
+
1
),
yaml_FLOAT_TAG
,
[]
string
{
".inf"
,
".Inf"
,
".INF"
}},
{
math
.
Inf
(
+
1
),
yaml_FLOAT_TAG
,
[]
string
{
"+.inf"
,
"+.Inf"
,
"+.INF"
}},
{
math
.
Inf
(
-
1
),
yaml_FLOAT_TAG
,
[]
string
{
"-.inf"
,
"-.Inf"
,
"-.INF"
}},
{
"<<"
,
yaml_MERGE_TAG
,
[]
string
{
"<<"
}},
}
m
:=
resolveMap
...
...
@@ -58,90 +61,130 @@ func init() {
const
longTagPrefix
=
"tag:yaml.org,2002:"
func
shortTag
(
tag
string
)
string
{
// TODO This can easily be made faster and produce less garbage.
if
strings
.
HasPrefix
(
tag
,
longTagPrefix
)
{
return
"!!"
+
tag
[
len
(
longTagPrefix
)
:
]
}
return
tag
}
func
longTag
(
tag
string
)
string
{
if
strings
.
HasPrefix
(
tag
,
"!!"
)
{
return
longTagPrefix
+
tag
[
2
:
]
}
return
tag
}
func
resolvableTag
(
tag
string
)
bool
{
switch
tag
{
case
""
,
"!!str"
,
"!!bool"
,
"!!int"
,
"!!float"
,
"!!null"
:
case
""
,
yaml_STR_TAG
,
yaml_BOOL_TAG
,
yaml_INT_TAG
,
yaml_FLOAT_TAG
,
yaml_NULL_TAG
:
return
true
}
return
false
}
func
resolve
(
tag
string
,
in
string
)
(
rtag
string
,
out
interface
{})
{
tag
=
shortTag
(
tag
)
if
!
resolvableTag
(
tag
)
{
return
tag
,
in
}
defer
func
()
{
if
tag
!=
""
&&
tag
!=
rtag
{
panic
(
"Can't decode "
+
rtag
+
" '"
+
in
+
"' as a "
+
tag
)
switch
tag
{
case
""
,
rtag
,
yaml_STR_TAG
,
yaml_BINARY_TAG
:
return
}
fail
(
fmt
.
Sprintf
(
"cannot decode %s `%s` as a %s"
,
shortTag
(
rtag
),
in
,
shortTag
(
tag
)))
}()
if
in
==
""
{
return
"!!null"
,
nil
}
c
:=
resolveTable
[
in
[
0
]]
if
c
==
0
{
// It's a string for sure. Nothing to do.
return
"!!str"
,
in
// Any data is accepted as a !!str or !!binary.
// Otherwise, the prefix is enough of a hint about what it might be.
hint
:=
byte
(
'N'
)
if
in
!=
""
{
hint
=
resolveTable
[
in
[
0
]]
}
if
hint
!=
0
&&
tag
!=
yaml_STR_TAG
&&
tag
!=
yaml_BINARY_TAG
{
// Handle things we can lookup in a map.
if
item
,
ok
:=
resolveMap
[
in
];
ok
{
return
item
.
tag
,
item
.
value
}
// Handle things we can lookup in a map.
if
item
,
ok
:=
resolveMap
[
in
];
ok
{
return
item
.
tag
,
item
.
value
}
// Base 60 floats are a bad idea, were dropped in YAML 1.2, and
// are purposefully unsupported here. They're still quoted on
// the way out for compatibility with other parser, though.
switch
c
{
case
'M'
:
// We've already checked the map above.
switch
hint
{
case
'M'
:
// We've already checked the map above.
case
'.'
:
// Not in the map, so maybe a normal float.
floatv
,
err
:=
strconv
.
ParseFloat
(
in
,
64
)
if
err
==
nil
{
return
"!!float"
,
floatv
}
// XXX Handle base 60 floats here (WTF!)
case
'D'
,
'S'
:
// Int, float, or timestamp.
plain
:=
strings
.
Replace
(
in
,
"_"
,
""
,
-
1
)
intv
,
err
:=
strconv
.
ParseInt
(
plain
,
0
,
64
)
if
err
==
nil
{
if
intv
==
int64
(
int
(
intv
))
{
return
"!!int"
,
int
(
intv
)
}
else
{
return
"!!int"
,
intv
case
'.'
:
// Not in the map, so maybe a normal float.
floatv
,
err
:=
strconv
.
ParseFloat
(
in
,
64
)
if
err
==
nil
{
return
yaml_FLOAT_TAG
,
floatv
}
}
floatv
,
err
:=
strconv
.
ParseFloat
(
plain
,
64
)
if
err
==
nil
{
return
"!!float"
,
floatv
}
if
strings
.
HasPrefix
(
plain
,
"0b"
)
{
intv
,
err
:=
strconv
.
ParseInt
(
plain
[
2
:
],
2
,
64
)
case
'D'
,
'S'
:
// Int, float, or timestamp.
plain
:=
strings
.
Replace
(
in
,
"_"
,
""
,
-
1
)
intv
,
err
:=
strconv
.
ParseInt
(
plain
,
0
,
64
)
if
err
==
nil
{
return
"!!int"
,
int
(
intv
)
if
intv
==
int64
(
int
(
intv
))
{
return
yaml_INT_TAG
,
int
(
intv
)
}
else
{
return
yaml_INT_TAG
,
intv
}
}
}
else
if
strings
.
HasPrefix
(
plain
,
"-0b"
)
{
intv
,
err
:=
strconv
.
ParseInt
(
plain
[
3
:
],
2
,
64
)
floatv
,
err
:=
strconv
.
ParseFloat
(
plain
,
64
)
if
err
==
nil
{
return
"!!int"
,
-
int
(
intv
)
return
yaml_FLOAT_TAG
,
floatv
}
if
strings
.
HasPrefix
(
plain
,
"0b"
)
{
intv
,
err
:=
strconv
.
ParseInt
(
plain
[
2
:
],
2
,
64
)
if
err
==
nil
{
return
yaml_INT_TAG
,
int
(
intv
)
}
}
else
if
strings
.
HasPrefix
(
plain
,
"-0b"
)
{
intv
,
err
:=
strconv
.
ParseInt
(
plain
[
3
:
],
2
,
64
)
if
err
==
nil
{
return
yaml_INT_TAG
,
-
int
(
intv
)
}
}
// XXX Handle timestamps here.
default
:
panic
(
"resolveTable item not yet handled: "
+
string
(
rune
(
hint
))
+
" (with "
+
in
+
")"
)
}
// XXX Handle timestamps here.
}
if
tag
==
yaml_BINARY_TAG
{
return
yaml_BINARY_TAG
,
in
}
if
utf8
.
ValidString
(
in
)
{
return
yaml_STR_TAG
,
in
}
return
yaml_BINARY_TAG
,
encodeBase64
(
in
)
}
default
:
panic
(
"resolveTable item not yet handled: "
+
string
([]
byte
{
c
})
+
" (with "
+
in
+
")"
)
// encodeBase64 encodes s as base64 that is broken up into multiple lines
// as appropriate for the resulting length.
func
encodeBase64
(
s
string
)
string
{
const
lineLen
=
70
encLen
:=
base64
.
StdEncoding
.
EncodedLen
(
len
(
s
))
lines
:=
encLen
/
lineLen
+
1
buf
:=
make
([]
byte
,
encLen
*
2
+
lines
)
in
:=
buf
[
0
:
encLen
]
out
:=
buf
[
encLen
:
]
base64
.
StdEncoding
.
Encode
(
in
,
[]
byte
(
s
))
k
:=
0
for
i
:=
0
;
i
<
len
(
in
);
i
+=
lineLen
{
j
:=
i
+
lineLen
if
j
>
len
(
in
)
{
j
=
len
(
in
)
}
k
+=
copy
(
out
[
k
:
],
in
[
i
:
j
])
if
lines
>
1
{
out
[
k
]
=
'\n'
k
++
}
}
return
"!!str"
,
in
return
string
(
out
[
:
k
])
}
Godeps/_workspace/src/gopkg.in/yaml.v1/yaml.go
浏览文件 @
992b2621
...
...
@@ -10,23 +10,20 @@ import (
"errors"
"fmt"
"reflect"
"runtime"
"strings"
"sync"
)
type
yamlError
string
func
fail
(
msg
string
)
{
panic
(
yamlError
(
msg
))
}
func
handleErr
(
err
*
error
)
{
if
r
:=
recover
();
r
!=
nil
{
if
_
,
ok
:=
r
.
(
runtime
.
Error
);
ok
{
panic
(
r
)
}
else
if
_
,
ok
:=
r
.
(
*
reflect
.
ValueError
);
ok
{
panic
(
r
)
}
else
if
_
,
ok
:=
r
.
(
externalPanic
);
ok
{
panic
(
r
)
}
else
if
s
,
ok
:=
r
.
(
string
);
ok
{
*
err
=
errors
.
New
(
"YAML error: "
+
s
)
}
else
if
e
,
ok
:=
r
.
(
error
);
ok
{
*
err
=
e
if
e
,
ok
:=
r
.
(
yamlError
);
ok
{
*
err
=
errors
.
New
(
"YAML error: "
+
string
(
e
))
}
else
{
panic
(
r
)
}
...
...
@@ -78,7 +75,7 @@ type Getter interface {
// F int `yaml:"a,omitempty"`
// B int
// }
// var
T t
// var
t T
// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t)
//
// See the documentation of Marshal for the format of tags and a list of
...
...
@@ -91,7 +88,11 @@ func Unmarshal(in []byte, out interface{}) (err error) {
defer
p
.
destroy
()
node
:=
p
.
parse
()
if
node
!=
nil
{
d
.
unmarshal
(
node
,
reflect
.
ValueOf
(
out
))
v
:=
reflect
.
ValueOf
(
out
)
if
v
.
Kind
()
==
reflect
.
Ptr
&&
!
v
.
IsNil
()
{
v
=
v
.
Elem
()
}
d
.
unmarshal
(
node
,
v
)
}
return
nil
}
...
...
@@ -174,12 +175,6 @@ type fieldInfo struct {
var
structMap
=
make
(
map
[
reflect
.
Type
]
*
structInfo
)
var
fieldMapMutex
sync
.
RWMutex
type
externalPanic
string
func
(
e
externalPanic
)
String
()
string
{
return
string
(
e
)
}
func
getStructInfo
(
st
reflect
.
Type
)
(
*
structInfo
,
error
)
{
fieldMapMutex
.
RLock
()
sinfo
,
found
:=
structMap
[
st
]
...
...
@@ -220,8 +215,7 @@ func getStructInfo(st reflect.Type) (*structInfo, error) {
case
"inline"
:
inline
=
true
default
:
msg
:=
fmt
.
Sprintf
(
"Unsupported flag %q in tag %q of type %s"
,
flag
,
tag
,
st
)
panic
(
externalPanic
(
msg
))
return
nil
,
errors
.
New
(
fmt
.
Sprintf
(
"Unsupported flag %q in tag %q of type %s"
,
flag
,
tag
,
st
))
}
}
tag
=
fields
[
0
]
...
...
@@ -229,6 +223,7 @@ func getStructInfo(st reflect.Type) (*structInfo, error) {
if
inline
{
switch
field
.
Type
.
Kind
()
{
// TODO: Implement support for inline maps.
//case reflect.Map:
// if inlineMap >= 0 {
// return nil, errors.New("Multiple ,inline maps in struct " + st.String())
...
...
@@ -256,8 +251,8 @@ func getStructInfo(st reflect.Type) (*structInfo, error) {
fieldsList
=
append
(
fieldsList
,
finfo
)
}
default
:
//
panic
("Option ,inline needs a struct value or map field")
panic
(
"Option ,inline needs a struct value field"
)
//
return nil, errors.New
("Option ,inline needs a struct value or map field")
return
nil
,
errors
.
New
(
"Option ,inline needs a struct value field"
)
}
continue
}
...
...
Godeps/_workspace/src/gopkg.in/yaml.v1/yamlh.go
浏览文件 @
992b2621
...
...
@@ -294,6 +294,10 @@ const (
yaml_SEQ_TAG
=
"tag:yaml.org,2002:seq"
// The tag !!seq is used to denote sequences.
yaml_MAP_TAG
=
"tag:yaml.org,2002:map"
// The tag !!map is used to denote mapping.
// Not in original libyaml.
yaml_BINARY_TAG
=
"tag:yaml.org,2002:binary"
yaml_MERGE_TAG
=
"tag:yaml.org,2002:merge"
yaml_DEFAULT_SCALAR_TAG
=
yaml_STR_TAG
// The default scalar tag is !!str.
yaml_DEFAULT_SEQUENCE_TAG
=
yaml_SEQ_TAG
// The default sequence tag is !!seq.
yaml_DEFAULT_MAPPING_TAG
=
yaml_MAP_TAG
// The default mapping tag is !!map.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录