Update the yaml for go lib to latest 19/19419/2
authorHuabingZhao <zhao.huabing@zte.com.cn>
Wed, 18 Oct 2017 03:25:50 +0000 (03:25 +0000)
committerHuabingZhao <zhao.huabing@zte.com.cn>
Wed, 18 Oct 2017 14:41:11 +0000 (22:41 +0800)
Update yaml for go lib to latest and it's license has been changed
to Apache 2.
According to the upstream project, the license of go-yaml has been
updated to Apache 2:https://github.com/go-yaml/yaml/blob/v2/LICENSE,
change the reference code license within oom-registrator repo accordingly.

Issue-Id: OOM-365
Change-Id: Idce4bfda96456031a296682b0fb6e663170ec099
Signed-off-by: HuabingZhao <zhao.huabing@zte.com.cn>
14 files changed:
src/kube2msb/vendor/gopkg.in/yaml.v2/.travis.yml [new file with mode: 0644]
src/kube2msb/vendor/gopkg.in/yaml.v2/LICENSE
src/kube2msb/vendor/gopkg.in/yaml.v2/README.md
src/kube2msb/vendor/gopkg.in/yaml.v2/decode.go
src/kube2msb/vendor/gopkg.in/yaml.v2/decode_test.go [new file with mode: 0644]
src/kube2msb/vendor/gopkg.in/yaml.v2/emitterc.go
src/kube2msb/vendor/gopkg.in/yaml.v2/encode_test.go [new file with mode: 0644]
src/kube2msb/vendor/gopkg.in/yaml.v2/example_embedded_test.go [new file with mode: 0644]
src/kube2msb/vendor/gopkg.in/yaml.v2/parserc.go
src/kube2msb/vendor/gopkg.in/yaml.v2/resolve.go
src/kube2msb/vendor/gopkg.in/yaml.v2/scannerc.go
src/kube2msb/vendor/gopkg.in/yaml.v2/suite_test.go [new file with mode: 0644]
src/kube2msb/vendor/gopkg.in/yaml.v2/yaml.go
src/kube2msb/vendor/gopkg.in/yaml.v2/yamlh.go

diff --git a/src/kube2msb/vendor/gopkg.in/yaml.v2/.travis.yml b/src/kube2msb/vendor/gopkg.in/yaml.v2/.travis.yml
new file mode 100644 (file)
index 0000000..004172a
--- /dev/null
@@ -0,0 +1,9 @@
+language: go
+
+go:
+    - 1.4
+    - 1.5
+    - 1.6
+    - tip
+
+go_import_path: gopkg.in/yaml.v2
index a68e67f..8dada3e 100644 (file)
-
-Copyright (c) 2011-2014 - Canonical Inc.
-
-This software is licensed under the LGPLv3, included below.
-
-As a special exception to the GNU Lesser General Public License version 3
-("LGPL3"), the copyright holders of this Library give you permission to
-convey to a third party a Combined Work that links statically or dynamically
-to this Library without providing any Minimal Corresponding Source or
-Minimal Application Code as set out in 4d or providing the installation
-information set out in section 4e, provided that you comply with the other
-provisions of LGPL3 and provided that you meet, for the Application the
-terms and conditions of the license(s) which apply to the Application.
-
-Except as stated in this special exception, the provisions of LGPL3 will
-continue to comply in full to this Library. If you modify this Library, you
-may apply this exception to your version of this Library, but you are not
-obliged to do so. If you do not wish to do so, delete this exception
-statement from your version. This exception does not (and cannot) modify any
-license terms which apply to the Application, with which you must still
-comply.
-
-
-                   GNU LESSER GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-  This version of the GNU Lesser General Public License incorporates
-the terms and conditions of version 3 of the GNU General Public
-License, supplemented by the additional permissions listed below.
-
-  0. Additional Definitions.
-
-  As used herein, "this License" refers to version 3 of the GNU Lesser
-General Public License, and the "GNU GPL" refers to version 3 of the GNU
-General Public License.
-
-  "The Library" refers to a covered work governed by this License,
-other than an Application or a Combined Work as defined below.
-
-  An "Application" is any work that makes use of an interface provided
-by the Library, but which is not otherwise based on the Library.
-Defining a subclass of a class defined by the Library is deemed a mode
-of using an interface provided by the Library.
-
-  A "Combined Work" is a work produced by combining or linking an
-Application with the Library.  The particular version of the Library
-with which the Combined Work was made is also called the "Linked
-Version".
-
-  The "Minimal Corresponding Source" for a Combined Work means the
-Corresponding Source for the Combined Work, excluding any source code
-for portions of the Combined Work that, considered in isolation, are
-based on the Application, and not on the Linked Version.
-
-  The "Corresponding Application Code" for a Combined Work means the
-object code and/or source code for the Application, including any data
-and utility programs needed for reproducing the Combined Work from the
-Application, but excluding the System Libraries of the Combined Work.
-
-  1. Exception to Section 3 of the GNU GPL.
-
-  You may convey a covered work under sections 3 and 4 of this License
-without being bound by section 3 of the GNU GPL.
-
-  2. Conveying Modified Versions.
-
-  If you modify a copy of the Library, and, in your modifications, a
-facility refers to a function or data to be supplied by an Application
-that uses the facility (other than as an argument passed when the
-facility is invoked), then you may convey a copy of the modified
-version:
-
-   a) under this License, provided that you make a good faith effort to
-   ensure that, in the event an Application does not supply the
-   function or data, the facility still operates, and performs
-   whatever part of its purpose remains meaningful, or
-
-   b) under the GNU GPL, with none of the additional permissions of
-   this License applicable to that copy.
-
-  3. Object Code Incorporating Material from Library Header Files.
-
-  The object code form of an Application may incorporate material from
-a header file that is part of the Library.  You may convey such object
-code under terms of your choice, provided that, if the incorporated
-material is not limited to numerical parameters, data structure
-layouts and accessors, or small macros, inline functions and templates
-(ten or fewer lines in length), you do both of the following:
-
-   a) Give prominent notice with each copy of the object code that the
-   Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the object code with a copy of the GNU GPL and this license
-   document.
-
-  4. Combined Works.
-
-  You may convey a Combined Work under terms of your choice that,
-taken together, effectively do not restrict modification of the
-portions of the Library contained in the Combined Work and reverse
-engineering for debugging such modifications, if you also do each of
-the following:
-
-   a) Give prominent notice with each copy of the Combined Work that
-   the Library is used in it and that the Library and its use are
-   covered by this License.
-
-   b) Accompany the Combined Work with a copy of the GNU GPL and this license
-   document.
-
-   c) For a Combined Work that displays copyright notices during
-   execution, include the copyright notice for the Library among
-   these notices, as well as a reference directing the user to the
-   copies of the GNU GPL and this license document.
-
-   d) Do one of the following:
-
-       0) Convey the Minimal Corresponding Source under the terms of this
-       License, and the Corresponding Application Code in a form
-       suitable for, and under terms that permit, the user to
-       recombine or relink the Application with a modified version of
-       the Linked Version to produce a modified Combined Work, in the
-       manner specified by section 6 of the GNU GPL for conveying
-       Corresponding Source.
-
-       1) Use a suitable shared library mechanism for linking with the
-       Library.  A suitable mechanism is one that (a) uses at run time
-       a copy of the Library already present on the user's computer
-       system, and (b) will operate properly with a modified version
-       of the Library that is interface-compatible with the Linked
-       Version.
-
-   e) Provide Installation Information, but only if you would otherwise
-   be required to provide such information under section 6 of the
-   GNU GPL, and only to the extent that such information is
-   necessary to install and execute a modified version of the
-   Combined Work produced by recombining or relinking the
-   Application with a modified version of the Linked Version. (If
-   you use option 4d0, the Installation Information must accompany
-   the Minimal Corresponding Source and Corresponding Application
-   Code. If you use option 4d1, you must provide the Installation
-   Information in the manner specified by section 6 of the GNU GPL
-   for conveying Corresponding Source.)
-
-  5. Combined Libraries.
-
-  You may place library facilities that are a work based on the
-Library side by side in a single library together with other library
-facilities that are not Applications and are not covered by this
-License, and convey such a combined library under terms of your
-choice, if you do both of the following:
-
-   a) Accompany the combined library with a copy of the same work based
-   on the Library, uncombined with any other library facilities,
-   conveyed under the terms of this License.
-
-   b) Give prominent notice with the combined library that part of it
-   is a work based on the Library, and explaining where to find the
-   accompanying uncombined form of the same work.
-
-  6. Revised Versions of the GNU Lesser General Public License.
-
-  The Free Software Foundation may publish revised and/or new versions
-of the GNU Lesser General Public License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.
-
-  Each version is given a distinguishing version number. If the
-Library as you received it specifies that a certain numbered version
-of the GNU Lesser General Public License "or any later version"
-applies to it, you have the option of following the terms and
-conditions either of that published version or of any later version
-published by the Free Software Foundation. If the Library as you
-received it does not specify a version number of the GNU Lesser
-General Public License, you may choose any version of the GNU Lesser
-General Public License ever published by the Free Software Foundation.
-
-  If the Library as you received it specifies that a proxy can decide
-whether future versions of the GNU Lesser General Public License shall
-apply, that proxy's public statement of acceptance of any version is
-permanent authorization for you to choose that version for the
-Library.
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   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.
index 7b8bd86..7a512d6 100644 (file)
@@ -42,12 +42,14 @@ The package API for yaml v2 will remain stable as described in [gopkg.in](https:
 License
 -------
 
-The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details.
+The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details.
 
 
 Example
 -------
 
+Some more examples can be found in the "examples" folder.
+
 ```Go
 package main
 
index 085cddc..db1f5f2 100644 (file)
@@ -120,7 +120,6 @@ func (p *parser) parse() *node {
        default:
                panic("attempted to parse unknown event: " + strconv.Itoa(int(p.event.typ)))
        }
-       panic("unreachable")
 }
 
 func (p *parser) node(kind int) *node {
@@ -191,6 +190,7 @@ type decoder struct {
        aliases map[string]bool
        mapType reflect.Type
        terrors []string
+       strict  bool
 }
 
 var (
@@ -200,8 +200,8 @@ var (
        ifaceType      = defaultMapType.Elem()
 )
 
-func newDecoder() *decoder {
-       d := &decoder{mapType: defaultMapType}
+func newDecoder(strict bool) *decoder {
+       d := &decoder{mapType: defaultMapType, strict: strict}
        d.aliases = make(map[string]bool)
        return d
 }
@@ -251,7 +251,7 @@ func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) {
 //
 // If n holds a null value, prepare returns before doing anything.
 func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) {
-       if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "") {
+       if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "" && n.implicit) {
                return out, false, false
        }
        again := true
@@ -640,6 +640,8 @@ func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) {
                        value := reflect.New(elemType).Elem()
                        d.unmarshal(n.children[i+1], value)
                        inlineMap.SetMapIndex(name, value)
+               } else if d.strict {
+                       d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in struct %s", n.line+1, name.String(), out.Type()))
                }
        }
        return true
diff --git a/src/kube2msb/vendor/gopkg.in/yaml.v2/decode_test.go b/src/kube2msb/vendor/gopkg.in/yaml.v2/decode_test.go
new file mode 100644 (file)
index 0000000..713b1ee
--- /dev/null
@@ -0,0 +1,1017 @@
+package yaml_test
+
+import (
+       "errors"
+       . "gopkg.in/check.v1"
+       "gopkg.in/yaml.v2"
+       "math"
+       "net"
+       "reflect"
+       "strings"
+       "time"
+)
+
+var unmarshalIntTest = 123
+
+var unmarshalTests = []struct {
+       data  string
+       value interface{}
+}{
+       {
+               "",
+               &struct{}{},
+       }, {
+               "{}", &struct{}{},
+       }, {
+               "v: hi",
+               map[string]string{"v": "hi"},
+       }, {
+               "v: hi", map[string]interface{}{"v": "hi"},
+       }, {
+               "v: true",
+               map[string]string{"v": "true"},
+       }, {
+               "v: true",
+               map[string]interface{}{"v": true},
+       }, {
+               "v: 10",
+               map[string]interface{}{"v": 10},
+       }, {
+               "v: 0b10",
+               map[string]interface{}{"v": 2},
+       }, {
+               "v: 0xA",
+               map[string]interface{}{"v": 10},
+       }, {
+               "v: 4294967296",
+               map[string]int64{"v": 4294967296},
+       }, {
+               "v: 0.1",
+               map[string]interface{}{"v": 0.1},
+       }, {
+               "v: .1",
+               map[string]interface{}{"v": 0.1},
+       }, {
+               "v: .Inf",
+               map[string]interface{}{"v": math.Inf(+1)},
+       }, {
+               "v: -.Inf",
+               map[string]interface{}{"v": math.Inf(-1)},
+       }, {
+               "v: -10",
+               map[string]interface{}{"v": -10},
+       }, {
+               "v: -.1",
+               map[string]interface{}{"v": -0.1},
+       },
+
+       // Simple values.
+       {
+               "123",
+               &unmarshalIntTest,
+       },
+
+       // Floats from spec
+       {
+               "canonical: 6.8523e+5",
+               map[string]interface{}{"canonical": 6.8523e+5},
+       }, {
+               "expo: 685.230_15e+03",
+               map[string]interface{}{"expo": 685.23015e+03},
+       }, {
+               "fixed: 685_230.15",
+               map[string]interface{}{"fixed": 685230.15},
+       }, {
+               "neginf: -.inf",
+               map[string]interface{}{"neginf": math.Inf(-1)},
+       }, {
+               "fixed: 685_230.15",
+               map[string]float64{"fixed": 685230.15},
+       },
+       //{"sexa: 190:20:30.15", map[string]interface{}{"sexa": 0}}, // Unsupported
+       //{"notanum: .NaN", map[string]interface{}{"notanum": math.NaN()}}, // Equality of NaN fails.
+
+       // Bools from spec
+       {
+               "canonical: y",
+               map[string]interface{}{"canonical": true},
+       }, {
+               "answer: NO",
+               map[string]interface{}{"answer": false},
+       }, {
+               "logical: True",
+               map[string]interface{}{"logical": true},
+       }, {
+               "option: on",
+               map[string]interface{}{"option": true},
+       }, {
+               "option: on",
+               map[string]bool{"option": true},
+       },
+       // Ints from spec
+       {
+               "canonical: 685230",
+               map[string]interface{}{"canonical": 685230},
+       }, {
+               "decimal: +685_230",
+               map[string]interface{}{"decimal": 685230},
+       }, {
+               "octal: 02472256",
+               map[string]interface{}{"octal": 685230},
+       }, {
+               "hexa: 0x_0A_74_AE",
+               map[string]interface{}{"hexa": 685230},
+       }, {
+               "bin: 0b1010_0111_0100_1010_1110",
+               map[string]interface{}{"bin": 685230},
+       }, {
+               "bin: -0b101010",
+               map[string]interface{}{"bin": -42},
+       }, {
+               "decimal: +685_230",
+               map[string]int{"decimal": 685230},
+       },
+
+       //{"sexa: 190:20:30", map[string]interface{}{"sexa": 0}}, // Unsupported
+
+       // Nulls from spec
+       {
+               "empty:",
+               map[string]interface{}{"empty": nil},
+       }, {
+               "canonical: ~",
+               map[string]interface{}{"canonical": nil},
+       }, {
+               "english: null",
+               map[string]interface{}{"english": nil},
+       }, {
+               "~: null key",
+               map[interface{}]string{nil: "null key"},
+       }, {
+               "empty:",
+               map[string]*bool{"empty": nil},
+       },
+
+       // Flow sequence
+       {
+               "seq: [A,B]",
+               map[string]interface{}{"seq": []interface{}{"A", "B"}},
+       }, {
+               "seq: [A,B,C,]",
+               map[string][]string{"seq": []string{"A", "B", "C"}},
+       }, {
+               "seq: [A,1,C]",
+               map[string][]string{"seq": []string{"A", "1", "C"}},
+       }, {
+               "seq: [A,1,C]",
+               map[string][]int{"seq": []int{1}},
+       }, {
+               "seq: [A,1,C]",
+               map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
+       },
+       // Block sequence
+       {
+               "seq:\n - A\n - B",
+               map[string]interface{}{"seq": []interface{}{"A", "B"}},
+       }, {
+               "seq:\n - A\n - B\n - C",
+               map[string][]string{"seq": []string{"A", "B", "C"}},
+       }, {
+               "seq:\n - A\n - 1\n - C",
+               map[string][]string{"seq": []string{"A", "1", "C"}},
+       }, {
+               "seq:\n - A\n - 1\n - C",
+               map[string][]int{"seq": []int{1}},
+       }, {
+               "seq:\n - A\n - 1\n - C",
+               map[string]interface{}{"seq": []interface{}{"A", 1, "C"}},
+       },
+
+       // Literal block scalar
+       {
+               "scalar: | # Comment\n\n literal\n\n \ttext\n\n",
+               map[string]string{"scalar": "\nliteral\n\n\ttext\n"},
+       },
+
+       // Folded block scalar
+       {
+               "scalar: > # Comment\n\n folded\n line\n \n next\n line\n  * one\n  * two\n\n last\n line\n\n",
+               map[string]string{"scalar": "\nfolded line\nnext line\n * one\n * two\n\nlast line\n"},
+       },
+
+       // Map inside interface with no type hints.
+       {
+               "a: {b: c}",
+               map[interface{}]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
+       },
+
+       // Structs and type conversions.
+       {
+               "hello: world",
+               &struct{ Hello string }{"world"},
+       }, {
+               "a: {b: c}",
+               &struct{ A struct{ B string } }{struct{ B string }{"c"}},
+       }, {
+               "a: {b: c}",
+               &struct{ A *struct{ B string } }{&struct{ B string }{"c"}},
+       }, {
+               "a: {b: c}",
+               &struct{ A map[string]string }{map[string]string{"b": "c"}},
+       }, {
+               "a: {b: c}",
+               &struct{ A *map[string]string }{&map[string]string{"b": "c"}},
+       }, {
+               "a:",
+               &struct{ A map[string]string }{},
+       }, {
+               "a: 1",
+               &struct{ A int }{1},
+       }, {
+               "a: 1",
+               &struct{ A float64 }{1},
+       }, {
+               "a: 1.0",
+               &struct{ A int }{1},
+       }, {
+               "a: 1.0",
+               &struct{ A uint }{1},
+       }, {
+               "a: [1, 2]",
+               &struct{ A []int }{[]int{1, 2}},
+       }, {
+               "a: 1",
+               &struct{ B int }{0},
+       }, {
+               "a: 1",
+               &struct {
+                       B int "a"
+               }{1},
+       }, {
+               "a: y",
+               &struct{ A bool }{true},
+       },
+
+       // Some cross type conversions
+       {
+               "v: 42",
+               map[string]uint{"v": 42},
+       }, {
+               "v: -42",
+               map[string]uint{},
+       }, {
+               "v: 4294967296",
+               map[string]uint64{"v": 4294967296},
+       }, {
+               "v: -4294967296",
+               map[string]uint64{},
+       },
+
+       // int
+       {
+               "int_max: 2147483647",
+               map[string]int{"int_max": math.MaxInt32},
+       },
+       {
+               "int_min: -2147483648",
+               map[string]int{"int_min": math.MinInt32},
+       },
+       {
+               "int_overflow: 9223372036854775808", // math.MaxInt64 + 1
+               map[string]int{},
+       },
+
+       // int64
+       {
+               "int64_max: 9223372036854775807",
+               map[string]int64{"int64_max": math.MaxInt64},
+       },
+       {
+               "int64_max_base2: 0b111111111111111111111111111111111111111111111111111111111111111",
+               map[string]int64{"int64_max_base2": math.MaxInt64},
+       },
+       {
+               "int64_min: -9223372036854775808",
+               map[string]int64{"int64_min": math.MinInt64},
+       },
+       {
+               "int64_neg_base2: -0b111111111111111111111111111111111111111111111111111111111111111",
+               map[string]int64{"int64_neg_base2": -math.MaxInt64},
+       },
+       {
+               "int64_overflow: 9223372036854775808", // math.MaxInt64 + 1
+               map[string]int64{},
+       },
+
+       // uint
+       {
+               "uint_min: 0",
+               map[string]uint{"uint_min": 0},
+       },
+       {
+               "uint_max: 4294967295",
+               map[string]uint{"uint_max": math.MaxUint32},
+       },
+       {
+               "uint_underflow: -1",
+               map[string]uint{},
+       },
+
+       // uint64
+       {
+               "uint64_min: 0",
+               map[string]uint{"uint64_min": 0},
+       },
+       {
+               "uint64_max: 18446744073709551615",
+               map[string]uint64{"uint64_max": math.MaxUint64},
+       },
+       {
+               "uint64_max_base2: 0b1111111111111111111111111111111111111111111111111111111111111111",
+               map[string]uint64{"uint64_max_base2": math.MaxUint64},
+       },
+       {
+               "uint64_maxint64: 9223372036854775807",
+               map[string]uint64{"uint64_maxint64": math.MaxInt64},
+       },
+       {
+               "uint64_underflow: -1",
+               map[string]uint64{},
+       },
+
+       // float32
+       {
+               "float32_max: 3.40282346638528859811704183484516925440e+38",
+               map[string]float32{"float32_max": math.MaxFloat32},
+       },
+       {
+               "float32_nonzero: 1.401298464324817070923729583289916131280e-45",
+               map[string]float32{"float32_nonzero": math.SmallestNonzeroFloat32},
+       },
+       {
+               "float32_maxuint64: 18446744073709551615",
+               map[string]float32{"float32_maxuint64": float32(math.MaxUint64)},
+       },
+       {
+               "float32_maxuint64+1: 18446744073709551616",
+               map[string]float32{"float32_maxuint64+1": float32(math.MaxUint64 + 1)},
+       },
+
+       // float64
+       {
+               "float64_max: 1.797693134862315708145274237317043567981e+308",
+               map[string]float64{"float64_max": math.MaxFloat64},
+       },
+       {
+               "float64_nonzero: 4.940656458412465441765687928682213723651e-324",
+               map[string]float64{"float64_nonzero": math.SmallestNonzeroFloat64},
+       },
+       {
+               "float64_maxuint64: 18446744073709551615",
+               map[string]float64{"float64_maxuint64": float64(math.MaxUint64)},
+       },
+       {
+               "float64_maxuint64+1: 18446744073709551616",
+               map[string]float64{"float64_maxuint64+1": float64(math.MaxUint64 + 1)},
+       },
+
+       // Overflow cases.
+       {
+               "v: 4294967297",
+               map[string]int32{},
+       }, {
+               "v: 128",
+               map[string]int8{},
+       },
+
+       // Quoted values.
+       {
+               "'1': '\"2\"'",
+               map[interface{}]interface{}{"1": "\"2\""},
+       }, {
+               "v:\n- A\n- 'B\n\n  C'\n",
+               map[string][]string{"v": []string{"A", "B\nC"}},
+       },
+
+       // Explicit tags.
+       {
+               "v: !!float '1.1'",
+               map[string]interface{}{"v": 1.1},
+       }, {
+               "v: !!null ''",
+               map[string]interface{}{"v": nil},
+       }, {
+               "%TAG !y! tag:yaml.org,2002:\n---\nv: !y!int '1'",
+               map[string]interface{}{"v": 1},
+       },
+
+       // Non-specific tag (Issue #75)
+       {
+               "v: ! test",
+               map[string]interface{}{"v": "test"},
+       },
+
+       // Anchors and aliases.
+       {
+               "a: &x 1\nb: &y 2\nc: *x\nd: *y\n",
+               &struct{ A, B, C, D int }{1, 2, 1, 2},
+       }, {
+               "a: &a {c: 1}\nb: *a",
+               &struct {
+                       A, B struct {
+                               C int
+                       }
+               }{struct{ C int }{1}, struct{ C int }{1}},
+       }, {
+               "a: &a [1, 2]\nb: *a",
+               &struct{ B []int }{[]int{1, 2}},
+       }, {
+               "b: *a\na: &a {c: 1}",
+               &struct {
+                       A, B struct {
+                               C int
+                       }
+               }{struct{ C int }{1}, struct{ C int }{1}},
+       },
+
+       // Bug #1133337
+       {
+               "foo: ''",
+               map[string]*string{"foo": new(string)},
+       }, {
+               "foo: null",
+               map[string]string{"foo": ""},
+       }, {
+               "foo: null",
+               map[string]interface{}{"foo": nil},
+       },
+
+       // Ignored field
+       {
+               "a: 1\nb: 2\n",
+               &struct {
+                       A int
+                       B int "-"
+               }{1, 0},
+       },
+
+       // Bug #1191981
+       {
+               "" +
+                       "%YAML 1.1\n" +
+                       "--- !!str\n" +
+                       `"Generic line break (no glyph)\n\` + "\n" +
+                       ` Generic line break (glyphed)\n\` + "\n" +
+                       ` Line separator\u2028\` + "\n" +
+                       ` Paragraph separator\u2029"` + "\n",
+               "" +
+                       "Generic line break (no glyph)\n" +
+                       "Generic line break (glyphed)\n" +
+                       "Line separator\u2028Paragraph separator\u2029",
+       },
+
+       // Struct inlining
+       {
+               "a: 1\nb: 2\nc: 3\n",
+               &struct {
+                       A int
+                       C inlineB `yaml:",inline"`
+               }{1, inlineB{2, inlineC{3}}},
+       },
+
+       // Map inlining
+       {
+               "a: 1\nb: 2\nc: 3\n",
+               &struct {
+                       A int
+                       C map[string]int `yaml:",inline"`
+               }{1, map[string]int{"b": 2, "c": 3}},
+       },
+
+       // bug 1243827
+       {
+               "a: -b_c",
+               map[string]interface{}{"a": "-b_c"},
+       },
+       {
+               "a: +b_c",
+               map[string]interface{}{"a": "+b_c"},
+       },
+       {
+               "a: 50cent_of_dollar",
+               map[string]interface{}{"a": "50cent_of_dollar"},
+       },
+
+       // Duration
+       {
+               "a: 3s",
+               map[string]time.Duration{"a": 3 * time.Second},
+       },
+
+       // 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)},
+       },
+
+       // Ordered maps.
+       {
+               "{b: 2, a: 1, d: 4, c: 3, sub: {e: 5}}",
+               &yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}},
+       },
+
+       // Issue #39.
+       {
+               "a:\n b:\n  c: d\n",
+               map[string]struct{ B interface{} }{"a": {map[interface{}]interface{}{"c": "d"}}},
+       },
+
+       // Custom map type.
+       {
+               "a: {b: c}",
+               M{"a": M{"b": "c"}},
+       },
+
+       // Support encoding.TextUnmarshaler.
+       {
+               "a: 1.2.3.4\n",
+               map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)},
+       },
+       {
+               "a: 2015-02-24T18:19:39Z\n",
+               map[string]time.Time{"a": time.Unix(1424801979, 0).In(time.UTC)},
+       },
+
+       // Encode empty lists as zero-length slices.
+       {
+               "a: []",
+               &struct{ A []int }{[]int{}},
+       },
+
+       // UTF-16-LE
+       {
+               "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n\x00",
+               M{"ñoño": "very yes"},
+       },
+       // UTF-16-LE with surrogate.
+       {
+               "\xff\xfe\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \x00=\xd8\xd4\xdf\n\x00",
+               M{"ñoño": "very yes 🟔"},
+       },
+
+       // UTF-16-BE
+       {
+               "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00\n",
+               M{"ñoño": "very yes"},
+       },
+       // UTF-16-BE with surrogate.
+       {
+               "\xfe\xff\x00\xf1\x00o\x00\xf1\x00o\x00:\x00 \x00v\x00e\x00r\x00y\x00 \x00y\x00e\x00s\x00 \xd8=\xdf\xd4\x00\n",
+               M{"ñoño": "very yes 🟔"},
+       },
+
+       // YAML Float regex shouldn't match this
+       {
+               "a: 123456e1\n",
+               M{"a": "123456e1"},
+       }, {
+               "a: 123456E1\n",
+               M{"a": "123456E1"},
+       },
+}
+
+type M map[interface{}]interface{}
+
+type inlineB struct {
+       B       int
+       inlineC `yaml:",inline"`
+}
+
+type inlineC struct {
+       C int
+}
+
+func (s *S) TestUnmarshal(c *C) {
+       for i, item := range unmarshalTests {
+               c.Logf("test %d: %q", i, item.data)
+               t := reflect.ValueOf(item.value).Type()
+               var value interface{}
+               switch t.Kind() {
+               case reflect.Map:
+                       value = reflect.MakeMap(t).Interface()
+               case reflect.String:
+                       value = reflect.New(t).Interface()
+               case reflect.Ptr:
+                       value = reflect.New(t.Elem()).Interface()
+               default:
+                       c.Fatalf("missing case for %s", t)
+               }
+               err := yaml.Unmarshal([]byte(item.data), value)
+               if _, ok := err.(*yaml.TypeError); !ok {
+                       c.Assert(err, IsNil)
+               }
+               if t.Kind() == reflect.String {
+                       c.Assert(*value.(*string), Equals, item.value)
+               } else {
+                       c.Assert(value, DeepEquals, item.value)
+               }
+       }
+}
+
+func (s *S) TestUnmarshalNaN(c *C) {
+       value := map[string]interface{}{}
+       err := yaml.Unmarshal([]byte("notanum: .NaN"), &value)
+       c.Assert(err, IsNil)
+       c.Assert(math.IsNaN(value["notanum"].(float64)), Equals, true)
+}
+
+var unmarshalErrorTests = []struct {
+       data, error string
+}{
+       {"v: !!float 'error'", "yaml: cannot decode !!str `error` as a !!float"},
+       {"v: [A,", "yaml: line 1: did not find expected node content"},
+       {"v:\n- [A,", "yaml: line 2: did not find expected node content"},
+       {"a: *b\n", "yaml: unknown anchor 'b' referenced"},
+       {"a: &a\n  b: *a\n", "yaml: anchor 'a' value contains itself"},
+       {"value: -", "yaml: block sequence entries are not allowed in this context"},
+       {"a: !!binary ==", "yaml: !!binary value contains invalid base64 data"},
+       {"{[.]}", `yaml: invalid map key: \[\]interface \{\}\{"\."\}`},
+       {"{{.}}", `yaml: invalid map key: map\[interface\ \{\}\]interface \{\}\{".":interface \{\}\(nil\)\}`},
+       {"%TAG !%79! tag:yaml.org,2002:\n---\nv: !%79!int '1'", "yaml: did not find expected whitespace"},
+}
+
+func (s *S) TestUnmarshalErrors(c *C) {
+       for _, item := range unmarshalErrorTests {
+               var value interface{}
+               err := yaml.Unmarshal([]byte(item.data), &value)
+               c.Assert(err, ErrorMatches, item.error, Commentf("Partial unmarshal: %#v", value))
+       }
+}
+
+var unmarshalerTests = []struct {
+       data, tag string
+       value     interface{}
+}{
+       {"_: {hi: there}", "!!map", map[interface{}]interface{}{"hi": "there"}},
+       {"_: [1,A]", "!!seq", []interface{}{1, "A"}},
+       {"_: 10", "!!int", 10},
+       {"_: null", "!!null", nil},
+       {`_: BAR!`, "!!str", "BAR!"},
+       {`_: "BAR!"`, "!!str", "BAR!"},
+       {"_: !!foo 'BAR!'", "!!foo", "BAR!"},
+       {`_: ""`, "!!str", ""},
+}
+
+var unmarshalerResult = map[int]error{}
+
+type unmarshalerType struct {
+       value interface{}
+}
+
+func (o *unmarshalerType) UnmarshalYAML(unmarshal func(v interface{}) error) error {
+       if err := unmarshal(&o.value); err != nil {
+               return err
+       }
+       if i, ok := o.value.(int); ok {
+               if result, ok := unmarshalerResult[i]; ok {
+                       return result
+               }
+       }
+       return nil
+}
+
+type unmarshalerPointer struct {
+       Field *unmarshalerType "_"
+}
+
+type unmarshalerValue struct {
+       Field unmarshalerType "_"
+}
+
+func (s *S) TestUnmarshalerPointerField(c *C) {
+       for _, item := range unmarshalerTests {
+               obj := &unmarshalerPointer{}
+               err := yaml.Unmarshal([]byte(item.data), obj)
+               c.Assert(err, IsNil)
+               if item.value == nil {
+                       c.Assert(obj.Field, IsNil)
+               } else {
+                       c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value))
+                       c.Assert(obj.Field.value, DeepEquals, item.value)
+               }
+       }
+}
+
+func (s *S) TestUnmarshalerValueField(c *C) {
+       for _, item := range unmarshalerTests {
+               obj := &unmarshalerValue{}
+               err := yaml.Unmarshal([]byte(item.data), obj)
+               c.Assert(err, IsNil)
+               c.Assert(obj.Field, NotNil, Commentf("Pointer not initialized (%#v)", item.value))
+               c.Assert(obj.Field.value, DeepEquals, item.value)
+       }
+}
+
+func (s *S) TestUnmarshalerWholeDocument(c *C) {
+       obj := &unmarshalerType{}
+       err := yaml.Unmarshal([]byte(unmarshalerTests[0].data), obj)
+       c.Assert(err, IsNil)
+       value, ok := obj.value.(map[interface{}]interface{})
+       c.Assert(ok, Equals, true, Commentf("value: %#v", obj.value))
+       c.Assert(value["_"], DeepEquals, unmarshalerTests[0].value)
+}
+
+func (s *S) TestUnmarshalerTypeError(c *C) {
+       unmarshalerResult[2] = &yaml.TypeError{[]string{"foo"}}
+       unmarshalerResult[4] = &yaml.TypeError{[]string{"bar"}}
+       defer func() {
+               delete(unmarshalerResult, 2)
+               delete(unmarshalerResult, 4)
+       }()
+
+       type T struct {
+               Before int
+               After  int
+               M      map[string]*unmarshalerType
+       }
+       var v T
+       data := `{before: A, m: {abc: 1, def: 2, ghi: 3, jkl: 4}, after: B}`
+       err := yaml.Unmarshal([]byte(data), &v)
+       c.Assert(err, ErrorMatches, ""+
+               "yaml: unmarshal errors:\n"+
+               "  line 1: cannot unmarshal !!str `A` into int\n"+
+               "  foo\n"+
+               "  bar\n"+
+               "  line 1: cannot unmarshal !!str `B` into int")
+       c.Assert(v.M["abc"], NotNil)
+       c.Assert(v.M["def"], IsNil)
+       c.Assert(v.M["ghi"], NotNil)
+       c.Assert(v.M["jkl"], IsNil)
+
+       c.Assert(v.M["abc"].value, Equals, 1)
+       c.Assert(v.M["ghi"].value, Equals, 3)
+}
+
+type proxyTypeError struct{}
+
+func (v *proxyTypeError) UnmarshalYAML(unmarshal func(interface{}) error) error {
+       var s string
+       var a int32
+       var b int64
+       if err := unmarshal(&s); err != nil {
+               panic(err)
+       }
+       if s == "a" {
+               if err := unmarshal(&b); err == nil {
+                       panic("should have failed")
+               }
+               return unmarshal(&a)
+       }
+       if err := unmarshal(&a); err == nil {
+               panic("should have failed")
+       }
+       return unmarshal(&b)
+}
+
+func (s *S) TestUnmarshalerTypeErrorProxying(c *C) {
+       type T struct {
+               Before int
+               After  int
+               M      map[string]*proxyTypeError
+       }
+       var v T
+       data := `{before: A, m: {abc: a, def: b}, after: B}`
+       err := yaml.Unmarshal([]byte(data), &v)
+       c.Assert(err, ErrorMatches, ""+
+               "yaml: unmarshal errors:\n"+
+               "  line 1: cannot unmarshal !!str `A` into int\n"+
+               "  line 1: cannot unmarshal !!str `a` into int32\n"+
+               "  line 1: cannot unmarshal !!str `b` into int64\n"+
+               "  line 1: cannot unmarshal !!str `B` into int")
+}
+
+type failingUnmarshaler struct{}
+
+var failingErr = errors.New("failingErr")
+
+func (ft *failingUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error {
+       return failingErr
+}
+
+func (s *S) TestUnmarshalerError(c *C) {
+       err := yaml.Unmarshal([]byte("a: b"), &failingUnmarshaler{})
+       c.Assert(err, Equals, failingErr)
+}
+
+type sliceUnmarshaler []int
+
+func (su *sliceUnmarshaler) UnmarshalYAML(unmarshal func(interface{}) error) error {
+       var slice []int
+       err := unmarshal(&slice)
+       if err == nil {
+               *su = slice
+               return nil
+       }
+
+       var intVal int
+       err = unmarshal(&intVal)
+       if err == nil {
+               *su = []int{intVal}
+               return nil
+       }
+
+       return err
+}
+
+func (s *S) TestUnmarshalerRetry(c *C) {
+       var su sliceUnmarshaler
+       err := yaml.Unmarshal([]byte("[1, 2, 3]"), &su)
+       c.Assert(err, IsNil)
+       c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1, 2, 3}))
+
+       err = yaml.Unmarshal([]byte("1"), &su)
+       c.Assert(err, IsNil)
+       c.Assert(su, DeepEquals, sliceUnmarshaler([]int{1}))
+}
+
+// From http://yaml.org/type/merge.html
+var mergeTests = `
+anchors:
+  list:
+    - &CENTER { "x": 1, "y": 2 }
+    - &LEFT   { "x": 0, "y": 2 }
+    - &BIG    { "r": 10 }
+    - &SMALL  { "r": 1 }
+
+# All the following maps are equal:
+
+plain:
+  # Explicit keys
+  "x": 1
+  "y": 2
+  "r": 10
+  label: center/big
+
+mergeOne:
+  # Merge one map
+  << : *CENTER
+  "r": 10
+  label: center/big
+
+mergeMultiple:
+  # Merge multiple maps
+  << : [ *CENTER, *BIG ]
+  label: center/big
+
+override:
+  # Override
+  << : [ *BIG, *LEFT, *SMALL ]
+  "x": 1
+  label: center/big
+
+shortTag:
+  # Explicit short merge tag
+  !!merge "<<" : [ *CENTER, *BIG ]
+  label: center/big
+
+longTag:
+  # Explicit merge long tag
+  !<tag:yaml.org,2002:merge> "<<" : [ *CENTER, *BIG ]
+  label: center/big
+
+inlineMap:
+  # Inlined map 
+  << : {"x": 1, "y": 2, "r": 10}
+  label: center/big
+
+inlineSequenceMap:
+  # Inlined map in sequence
+  << : [ *CENTER, {"r": 10} ]
+  label: center/big
+`
+
+func (s *S) TestMerge(c *C) {
+       var want = map[interface{}]interface{}{
+               "x":     1,
+               "y":     2,
+               "r":     10,
+               "label": "center/big",
+       }
+
+       var m map[interface{}]interface{}
+       err := yaml.Unmarshal([]byte(mergeTests), &m)
+       c.Assert(err, IsNil)
+       for name, test := range m {
+               if name == "anchors" {
+                       continue
+               }
+               c.Assert(test, DeepEquals, want, Commentf("test %q failed", name))
+       }
+}
+
+func (s *S) TestMergeStruct(c *C) {
+       type Data struct {
+               X, Y, R int
+               Label   string
+       }
+       want := Data{1, 2, 10, "center/big"}
+
+       var m map[string]Data
+       err := yaml.Unmarshal([]byte(mergeTests), &m)
+       c.Assert(err, IsNil)
+       for name, test := range m {
+               if name == "anchors" {
+                       continue
+               }
+               c.Assert(test, Equals, want, Commentf("test %q failed", name))
+       }
+}
+
+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)
+               }
+       }
+}
+
+func (s *S) TestUnmarshalSliceOnPreset(c *C) {
+       // Issue #48.
+       v := struct{ A []int }{[]int{1}}
+       yaml.Unmarshal([]byte("a: [2]"), &v)
+       c.Assert(v.A, DeepEquals, []int{2})
+}
+
+func (s *S) TestUnmarshalStrict(c *C) {
+       v := struct{ A, B int }{}
+
+       err := yaml.UnmarshalStrict([]byte("a: 1\nb: 2"), &v)
+       c.Check(err, IsNil)
+       err = yaml.Unmarshal([]byte("a: 1\nb: 2\nc: 3"), &v)
+       c.Check(err, IsNil)
+       err = yaml.UnmarshalStrict([]byte("a: 1\nb: 2\nc: 3"), &v)
+       c.Check(err, ErrorMatches, "yaml: unmarshal errors:\n  line 1: field c not found in struct struct { A int; B int }")
+}
+
+//var data []byte
+//func init() {
+//     var err error
+//     data, err = ioutil.ReadFile("/tmp/file.yaml")
+//     if err != nil {
+//             panic(err)
+//     }
+//}
+//
+//func (s *S) BenchmarkUnmarshal(c *C) {
+//     var err error
+//     for i := 0; i < c.N; i++ {
+//             var v map[string]interface{}
+//             err = yaml.Unmarshal(data, &v)
+//     }
+//     if err != nil {
+//             panic(err)
+//     }
+//}
+//
+//func (s *S) BenchmarkMarshal(c *C) {
+//     var v map[string]interface{}
+//     yaml.Unmarshal(data, &v)
+//     c.ResetTimer()
+//     for i := 0; i < c.N; i++ {
+//             yaml.Marshal(&v)
+//     }
+//}
index 2befd55..41de8b8 100644 (file)
@@ -666,7 +666,6 @@ func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t,
                return yaml_emitter_set_emitter_error(emitter,
                        "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS")
        }
-       return false
 }
 
 // Expect ALIAS.
@@ -995,7 +994,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
                break_space    = false
                space_break    = false
 
-               preceeded_by_whitespace = false
+               preceded_by_whitespace = false
                followed_by_whitespace  = false
                previous_space          = false
                previous_break          = false
@@ -1017,7 +1016,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
                flow_indicators = true
        }
 
-       preceeded_by_whitespace = true
+       preceded_by_whitespace = true
        for i, w := 0, 0; i < len(value); i += w {
                w = width(value[i])
                followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w)
@@ -1048,7 +1047,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
                                        block_indicators = true
                                }
                        case '#':
-                               if preceeded_by_whitespace {
+                               if preceded_by_whitespace {
                                        flow_indicators = true
                                        block_indicators = true
                                }
@@ -1089,7 +1088,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool {
                }
 
                // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition.
-               preceeded_by_whitespace = is_blankz(value, i)
+               preceded_by_whitespace = is_blankz(value, i)
        }
 
        emitter.scalar_data.multiline = line_breaks
diff --git a/src/kube2msb/vendor/gopkg.in/yaml.v2/encode_test.go b/src/kube2msb/vendor/gopkg.in/yaml.v2/encode_test.go
new file mode 100644 (file)
index 0000000..84099bd
--- /dev/null
@@ -0,0 +1,501 @@
+package yaml_test
+
+import (
+       "fmt"
+       "math"
+       "strconv"
+       "strings"
+       "time"
+
+       . "gopkg.in/check.v1"
+       "gopkg.in/yaml.v2"
+       "net"
+       "os"
+)
+
+var marshalIntTest = 123
+
+var marshalTests = []struct {
+       value interface{}
+       data  string
+}{
+       {
+               nil,
+               "null\n",
+       }, {
+               &struct{}{},
+               "{}\n",
+       }, {
+               map[string]string{"v": "hi"},
+               "v: hi\n",
+       }, {
+               map[string]interface{}{"v": "hi"},
+               "v: hi\n",
+       }, {
+               map[string]string{"v": "true"},
+               "v: \"true\"\n",
+       }, {
+               map[string]string{"v": "false"},
+               "v: \"false\"\n",
+       }, {
+               map[string]interface{}{"v": true},
+               "v: true\n",
+       }, {
+               map[string]interface{}{"v": false},
+               "v: false\n",
+       }, {
+               map[string]interface{}{"v": 10},
+               "v: 10\n",
+       }, {
+               map[string]interface{}{"v": -10},
+               "v: -10\n",
+       }, {
+               map[string]uint{"v": 42},
+               "v: 42\n",
+       }, {
+               map[string]interface{}{"v": int64(4294967296)},
+               "v: 4294967296\n",
+       }, {
+               map[string]int64{"v": int64(4294967296)},
+               "v: 4294967296\n",
+       }, {
+               map[string]uint64{"v": 4294967296},
+               "v: 4294967296\n",
+       }, {
+               map[string]interface{}{"v": "10"},
+               "v: \"10\"\n",
+       }, {
+               map[string]interface{}{"v": 0.1},
+               "v: 0.1\n",
+       }, {
+               map[string]interface{}{"v": float64(0.1)},
+               "v: 0.1\n",
+       }, {
+               map[string]interface{}{"v": -0.1},
+               "v: -0.1\n",
+       }, {
+               map[string]interface{}{"v": math.Inf(+1)},
+               "v: .inf\n",
+       }, {
+               map[string]interface{}{"v": math.Inf(-1)},
+               "v: -.inf\n",
+       }, {
+               map[string]interface{}{"v": math.NaN()},
+               "v: .nan\n",
+       }, {
+               map[string]interface{}{"v": nil},
+               "v: null\n",
+       }, {
+               map[string]interface{}{"v": ""},
+               "v: \"\"\n",
+       }, {
+               map[string][]string{"v": []string{"A", "B"}},
+               "v:\n- A\n- B\n",
+       }, {
+               map[string][]string{"v": []string{"A", "B\nC"}},
+               "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",
+       }, {
+               map[string]interface{}{"a": map[interface{}]interface{}{"b": "c"}},
+               "a:\n  b: c\n",
+       }, {
+               map[string]interface{}{"a": "-"},
+               "a: '-'\n",
+       },
+
+       // Simple values.
+       {
+               &marshalIntTest,
+               "123\n",
+       },
+
+       // Structures
+       {
+               &struct{ Hello string }{"world"},
+               "hello: world\n",
+       }, {
+               &struct {
+                       A struct {
+                               B string
+                       }
+               }{struct{ B string }{"c"}},
+               "a:\n  b: c\n",
+       }, {
+               &struct {
+                       A *struct {
+                               B string
+                       }
+               }{&struct{ B string }{"c"}},
+               "a:\n  b: c\n",
+       }, {
+               &struct {
+                       A *struct {
+                               B string
+                       }
+               }{},
+               "a: null\n",
+       }, {
+               &struct{ A int }{1},
+               "a: 1\n",
+       }, {
+               &struct{ A []int }{[]int{1, 2}},
+               "a:\n- 1\n- 2\n",
+       }, {
+               &struct {
+                       B int "a"
+               }{1},
+               "a: 1\n",
+       }, {
+               &struct{ A bool }{true},
+               "a: true\n",
+       },
+
+       // Conditional flag
+       {
+               &struct {
+                       A int "a,omitempty"
+                       B int "b,omitempty"
+               }{1, 0},
+               "a: 1\n",
+       }, {
+               &struct {
+                       A int "a,omitempty"
+                       B int "b,omitempty"
+               }{0, 0},
+               "{}\n",
+       }, {
+               &struct {
+                       A *struct{ X, y int } "a,omitempty,flow"
+               }{&struct{ X, y int }{1, 2}},
+               "a: {x: 1}\n",
+       }, {
+               &struct {
+                       A *struct{ X, y int } "a,omitempty,flow"
+               }{nil},
+               "{}\n",
+       }, {
+               &struct {
+                       A *struct{ X, y int } "a,omitempty,flow"
+               }{&struct{ X, y int }{}},
+               "a: {x: 0}\n",
+       }, {
+               &struct {
+                       A struct{ X, y int } "a,omitempty,flow"
+               }{struct{ X, y int }{1, 2}},
+               "a: {x: 1}\n",
+       }, {
+               &struct {
+                       A struct{ X, y int } "a,omitempty,flow"
+               }{struct{ X, y int }{0, 1}},
+               "{}\n",
+       }, {
+               &struct {
+                       A float64 "a,omitempty"
+                       B float64 "b,omitempty"
+               }{1, 0},
+               "a: 1\n",
+       },
+
+       // Flow flag
+       {
+               &struct {
+                       A []int "a,flow"
+               }{[]int{1, 2}},
+               "a: [1, 2]\n",
+       }, {
+               &struct {
+                       A map[string]string "a,flow"
+               }{map[string]string{"b": "c", "d": "e"}},
+               "a: {b: c, d: e}\n",
+       }, {
+               &struct {
+                       A struct {
+                               B, D string
+                       } "a,flow"
+               }{struct{ B, D string }{"c", "e"}},
+               "a: {b: c, d: e}\n",
+       },
+
+       // Unexported field
+       {
+               &struct {
+                       u int
+                       A int
+               }{0, 1},
+               "a: 1\n",
+       },
+
+       // Ignored field
+       {
+               &struct {
+                       A int
+                       B int "-"
+               }{1, 2},
+               "a: 1\n",
+       },
+
+       // Struct inlining
+       {
+               &struct {
+                       A int
+                       C inlineB `yaml:",inline"`
+               }{1, inlineB{2, inlineC{3}}},
+               "a: 1\nb: 2\nc: 3\n",
+       },
+
+       // Map inlining
+       {
+               &struct {
+                       A int
+                       C map[string]int `yaml:",inline"`
+               }{1, map[string]int{"b": 2, "c": 3}},
+               "a: 1\nb: 2\nc: 3\n",
+       },
+
+       // Duration
+       {
+               map[string]time.Duration{"a": 3 * time.Second},
+               "a: 3s\n",
+       },
+
+       // 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",
+       },
+
+       // Ordered maps.
+       {
+               &yaml.MapSlice{{"b", 2}, {"a", 1}, {"d", 4}, {"c", 3}, {"sub", yaml.MapSlice{{"e", 5}}}},
+               "b: 2\na: 1\nd: 4\nc: 3\nsub:\n  e: 5\n",
+       },
+
+       // Encode unicode as utf-8 rather than in escaped form.
+       {
+               map[string]string{"a": "你好"},
+               "a: 你好\n",
+       },
+
+       // Support encoding.TextMarshaler.
+       {
+               map[string]net.IP{"a": net.IPv4(1, 2, 3, 4)},
+               "a: 1.2.3.4\n",
+       },
+       {
+               map[string]time.Time{"a": time.Unix(1424801979, 0)},
+               "a: 2015-02-24T18:19:39Z\n",
+       },
+
+       // Ensure strings containing ": " are quoted (reported as PR #43, but not reproducible).
+       {
+               map[string]string{"a": "b: c"},
+               "a: 'b: c'\n",
+       },
+
+       // Containing hash mark ('#') in string should be quoted
+       {
+               map[string]string{"a": "Hello #comment"},
+               "a: 'Hello #comment'\n",
+       },
+       {
+               map[string]string{"a": "你好 #comment"},
+               "a: '你好 #comment'\n",
+       },
+}
+
+func (s *S) TestMarshal(c *C) {
+       defer os.Setenv("TZ", os.Getenv("TZ"))
+       os.Setenv("TZ", "UTC")
+       for _, item := range marshalTests {
+               data, err := yaml.Marshal(item.value)
+               c.Assert(err, IsNil)
+               c.Assert(string(data), Equals, item.data)
+       }
+}
+
+var marshalErrorTests = []struct {
+       value interface{}
+       error string
+       panic string
+}{{
+       value: &struct {
+               B       int
+               inlineB ",inline"
+       }{1, inlineB{2, inlineC{3}}},
+       panic: `Duplicated key 'b' in struct struct \{ B int; .*`,
+}, {
+       value: &struct {
+               A int
+               B map[string]int ",inline"
+       }{1, map[string]int{"a": 2}},
+       panic: `Can't have key "a" in inlined map; conflicts with struct field`,
+}}
+
+func (s *S) TestMarshalErrors(c *C) {
+       for _, item := range marshalErrorTests {
+               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)
+               }
+       }
+}
+
+func (s *S) TestMarshalTypeCache(c *C) {
+       var data []byte
+       var err error
+       func() {
+               type T struct{ A int }
+               data, err = yaml.Marshal(&T{})
+               c.Assert(err, IsNil)
+       }()
+       func() {
+               type T struct{ B int }
+               data, err = yaml.Marshal(&T{})
+               c.Assert(err, IsNil)
+       }()
+       c.Assert(string(data), Equals, "b: 0\n")
+}
+
+var marshalerTests = []struct {
+       data  string
+       value interface{}
+}{
+       {"_:\n  hi: there\n", map[interface{}]interface{}{"hi": "there"}},
+       {"_:\n- 1\n- A\n", []interface{}{1, "A"}},
+       {"_: 10\n", 10},
+       {"_: null\n", nil},
+       {"_: BAR!\n", "BAR!"},
+}
+
+type marshalerType struct {
+       value interface{}
+}
+
+func (o marshalerType) MarshalText() ([]byte, error) {
+       panic("MarshalText called on type with MarshalYAML")
+}
+
+func (o marshalerType) MarshalYAML() (interface{}, error) {
+       return o.value, nil
+}
+
+type marshalerValue struct {
+       Field marshalerType "_"
+}
+
+func (s *S) TestMarshaler(c *C) {
+       for _, item := range marshalerTests {
+               obj := &marshalerValue{}
+               obj.Field.value = item.value
+               data, err := yaml.Marshal(obj)
+               c.Assert(err, IsNil)
+               c.Assert(string(data), Equals, string(item.data))
+       }
+}
+
+func (s *S) TestMarshalerWholeDocument(c *C) {
+       obj := &marshalerType{}
+       obj.value = map[string]string{"hello": "world!"}
+       data, err := yaml.Marshal(obj)
+       c.Assert(err, IsNil)
+       c.Assert(string(data), Equals, "hello: world!\n")
+}
+
+type failingMarshaler struct{}
+
+func (ft *failingMarshaler) MarshalYAML() (interface{}, error) {
+       return nil, failingErr
+}
+
+func (s *S) TestMarshalerError(c *C) {
+       _, err := yaml.Marshal(&failingMarshaler{})
+       c.Assert(err, Equals, failingErr)
+}
+
+func (s *S) TestSortedOutput(c *C) {
+       order := []interface{}{
+               false,
+               true,
+               1,
+               uint(1),
+               1.0,
+               1.1,
+               1.2,
+               2,
+               uint(2),
+               2.0,
+               2.1,
+               "",
+               ".1",
+               ".2",
+               ".a",
+               "1",
+               "2",
+               "a!10",
+               "a/2",
+               "a/10",
+               "a~10",
+               "ab/1",
+               "b/1",
+               "b/01",
+               "b/2",
+               "b/02",
+               "b/3",
+               "b/03",
+               "b1",
+               "b01",
+               "b3",
+               "c2.10",
+               "c10.2",
+               "d1",
+               "d12",
+               "d12a",
+       }
+       m := make(map[interface{}]int)
+       for _, k := range order {
+               m[k] = 1
+       }
+       data, err := yaml.Marshal(m)
+       c.Assert(err, IsNil)
+       out := "\n" + string(data)
+       last := 0
+       for i, k := range order {
+               repr := fmt.Sprint(k)
+               if s, ok := k.(string); ok {
+                       if _, err = strconv.ParseFloat(repr, 32); s == "" || err == nil {
+                               repr = `"` + repr + `"`
+                       }
+               }
+               index := strings.Index(out, "\n"+repr+":")
+               if index == -1 {
+                       c.Fatalf("%#v is not in the output: %#v", k, out)
+               }
+               if index < last {
+                       c.Fatalf("%#v was generated before %#v: %q", k, order[i-1], out)
+               }
+               last = index
+       }
+}
diff --git a/src/kube2msb/vendor/gopkg.in/yaml.v2/example_embedded_test.go b/src/kube2msb/vendor/gopkg.in/yaml.v2/example_embedded_test.go
new file mode 100644 (file)
index 0000000..c8b241d
--- /dev/null
@@ -0,0 +1,41 @@
+package yaml_test
+
+import (
+       "fmt"
+       "log"
+
+        "gopkg.in/yaml.v2"
+)
+
+// An example showing how to unmarshal embedded
+// structs from YAML.
+
+type StructA struct {
+       A string `yaml:"a"`
+}
+
+type StructB struct {
+       // Embedded structs are not treated as embedded in YAML by default. To do that,
+       // add the ",inline" annotation below
+       StructA   `yaml:",inline"`
+       B string `yaml:"b"`
+}
+
+var data = `
+a: a string from struct A
+b: a string from struct B
+`
+
+func ExampleUnmarshal_embedded() {
+       var b StructB
+
+       err := yaml.Unmarshal([]byte(data), &b)
+       if err != nil {
+               log.Fatal("cannot unmarshal data: %v", err)
+       }
+        fmt.Println(b.A)
+        fmt.Println(b.B)
+        // Output:
+        // a string from struct A
+        // a string from struct B
+}
index 0a7037a..81d05df 100644 (file)
@@ -166,7 +166,6 @@ func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool
        default:
                panic("invalid parser state")
        }
-       return false
 }
 
 // Parse the production:
index 93a8632..232313c 100644 (file)
@@ -3,6 +3,7 @@ package yaml
 import (
        "encoding/base64"
        "math"
+       "regexp"
        "strconv"
        "strings"
        "unicode/utf8"
@@ -80,6 +81,8 @@ func resolvableTag(tag string) bool {
        return false
 }
 
+var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`)
+
 func resolve(tag string, in string) (rtag string, out interface{}) {
        if !resolvableTag(tag) {
                return tag, in
@@ -135,9 +138,11 @@ func resolve(tag string, in string) (rtag string, out interface{}) {
                        if err == nil {
                                return yaml_INT_TAG, uintv
                        }
-                       floatv, err := strconv.ParseFloat(plain, 64)
-                       if err == nil {
-                               return yaml_FLOAT_TAG, floatv
+                       if yamlStyleFloat.MatchString(plain) {
+                               floatv, err := strconv.ParseFloat(plain, 64)
+                               if err == nil {
+                                       return yaml_FLOAT_TAG, floatv
+                               }
                        }
                        if strings.HasPrefix(plain, "0b") {
                                intv, err := strconv.ParseInt(plain[2:], 2, 64)
index 2580800..0744844 100644 (file)
@@ -9,7 +9,7 @@ import (
 // ************
 //
 // The following notes assume that you are familiar with the YAML specification
-// (http://yaml.org/spec/cvs/current.html).  We mostly follow it, although in
+// (http://yaml.org/spec/1.2/spec.html).  We mostly follow it, although in
 // some cases we are less restrictive that it requires.
 //
 // The process of transforming a YAML stream into a sequence of events is
@@ -611,7 +611,7 @@ func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, co
        if directive {
                context = "while parsing a %TAG directive"
        }
-       return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet")
+       return yaml_parser_set_scanner_error(parser, context, context_mark, problem)
 }
 
 func trace(args ...interface{}) func() {
@@ -1944,7 +1944,7 @@ func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_ma
        } else {
                // It's either the '!' tag or not really a tag handle.  If it's a %TAG
                // directive, it's an error.  If it's a tag token, it must be a part of URI.
-               if directive && !(s[0] == '!' && s[1] == 0) {
+               if directive && string(s) != "!" {
                        yaml_parser_set_scanner_tag_error(parser, directive,
                                start_mark, "did not find expected '!'")
                        return false
@@ -1959,6 +1959,7 @@ func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_ma
 func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool {
        //size_t length = head ? strlen((char *)head) : 0
        var s []byte
+       hasTag := len(head) > 0
 
        // Copy the head if needed.
        //
@@ -2000,10 +2001,10 @@ func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte
                if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) {
                        return false
                }
+               hasTag = true
        }
 
-       // Check if the tag is non-empty.
-       if len(s) == 0 {
+       if !hasTag {
                yaml_parser_set_scanner_tag_error(parser, directive,
                        start_mark, "did not find expected tag URI")
                return false
diff --git a/src/kube2msb/vendor/gopkg.in/yaml.v2/suite_test.go b/src/kube2msb/vendor/gopkg.in/yaml.v2/suite_test.go
new file mode 100644 (file)
index 0000000..c5cf1ed
--- /dev/null
@@ -0,0 +1,12 @@
+package yaml_test
+
+import (
+       . "gopkg.in/check.v1"
+       "testing"
+)
+
+func Test(t *testing.T) { TestingT(t) }
+
+type S struct{}
+
+var _ = Suite(&S{})
index 36d6b88..bf18884 100644 (file)
@@ -77,8 +77,19 @@ type Marshaler interface {
 // supported tag options.
 //
 func Unmarshal(in []byte, out interface{}) (err error) {
+       return unmarshal(in, out, false)
+}
+
+// UnmarshalStrict is like Unmarshal except that any fields that are found
+// in the data that do not have corresponding struct members will result in
+// an error.
+func UnmarshalStrict(in []byte, out interface{}) (err error) {
+       return unmarshal(in, out, true)
+}
+
+func unmarshal(in []byte, out interface{}, strict bool) (err error) {
        defer handleErr(&err)
-       d := newDecoder()
+       d := newDecoder(strict)
        p := newParser(in)
        defer p.destroy()
        node := p.parse()
index d60a6b6..3caeca0 100644 (file)
@@ -508,7 +508,7 @@ type yaml_parser_t struct {
 
        problem string // Error description.
 
-       // The byte about which the problem occured.
+       // The byte about which the problem occurred.
        problem_offset int
        problem_value  int
        problem_mark   yaml_mark_t