Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
2d28e0d6
Unverified
Commit
2d28e0d6
authored
May 25, 2018
by
Jordan Liggitt
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
bump(github.com/evanphx/json-patch): 94e38aa1586e8a6c8a75770bddf5ff84c48a106b
parent
8306b0b1
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
370 additions
and
35 deletions
+370
-35
Godeps.json
Godeps/Godeps.json
+1
-1
Godeps.json
...ing/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json
+1
-1
Godeps.json
staging/src/k8s.io/apimachinery/Godeps/Godeps.json
+1
-1
Godeps.json
staging/src/k8s.io/apiserver/Godeps/Godeps.json
+1
-1
Godeps.json
staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json
+1
-1
Godeps.json
staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json
+1
-1
README.md
vendor/github.com/evanphx/json-patch/README.md
+271
-16
merge.go
vendor/github.com/evanphx/json-patch/merge.go
+90
-12
patch.go
vendor/github.com/evanphx/json-patch/patch.go
+3
-1
No files found.
Godeps/Godeps.json
View file @
2d28e0d6
...
...
@@ -1240,7 +1240,7 @@
},
{
"ImportPath"
:
"github.com/evanphx/json-patch"
,
"Rev"
:
"
ed7cfbae1fffc071f71e068df27bf4f0521402d8
"
"Rev"
:
"
94e38aa1586e8a6c8a75770bddf5ff84c48a106b
"
},
{
"ImportPath"
:
"github.com/exponent-io/jsonpath"
,
...
...
staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json
View file @
2d28e0d6
...
...
@@ -372,7 +372,7 @@
},
{
"ImportPath"
:
"github.com/evanphx/json-patch"
,
"Rev"
:
"
ed7cfbae1fffc071f71e068df27bf4f0521402d8
"
"Rev"
:
"
94e38aa1586e8a6c8a75770bddf5ff84c48a106b
"
},
{
"ImportPath"
:
"github.com/ghodss/yaml"
,
...
...
staging/src/k8s.io/apimachinery/Godeps/Godeps.json
View file @
2d28e0d6
...
...
@@ -24,7 +24,7 @@
},
{
"ImportPath"
:
"github.com/evanphx/json-patch"
,
"Rev"
:
"
ed7cfbae1fffc071f71e068df27bf4f0521402d8
"
"Rev"
:
"
94e38aa1586e8a6c8a75770bddf5ff84c48a106b
"
},
{
"ImportPath"
:
"github.com/ghodss/yaml"
,
...
...
staging/src/k8s.io/apiserver/Godeps/Godeps.json
View file @
2d28e0d6
...
...
@@ -372,7 +372,7 @@
},
{
"ImportPath"
:
"github.com/evanphx/json-patch"
,
"Rev"
:
"
ed7cfbae1fffc071f71e068df27bf4f0521402d8
"
"Rev"
:
"
94e38aa1586e8a6c8a75770bddf5ff84c48a106b
"
},
{
"ImportPath"
:
"github.com/ghodss/yaml"
,
...
...
staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json
View file @
2d28e0d6
...
...
@@ -112,7 +112,7 @@
},
{
"ImportPath"
:
"github.com/evanphx/json-patch"
,
"Rev"
:
"
ed7cfbae1fffc071f71e068df27bf4f0521402d8
"
"Rev"
:
"
94e38aa1586e8a6c8a75770bddf5ff84c48a106b
"
},
{
"ImportPath"
:
"github.com/ghodss/yaml"
,
...
...
staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json
View file @
2d28e0d6
...
...
@@ -104,7 +104,7 @@
},
{
"ImportPath"
:
"github.com/evanphx/json-patch"
,
"Rev"
:
"
ed7cfbae1fffc071f71e068df27bf4f0521402d8
"
"Rev"
:
"
94e38aa1586e8a6c8a75770bddf5ff84c48a106b
"
},
{
"ImportPath"
:
"github.com/ghodss/yaml"
,
...
...
vendor/github.com/evanphx/json-patch/README.md
View file @
2d28e0d6
## JSON-Patch
# JSON-Patch
`jsonpatch`
is a library which provides functionallity for both applying
[
RFC6902 JSON patches
](
http://tools.ietf.org/html/rfc6902
)
against documents, as
well as for calculating & applying
[
RFC7396 JSON merge patches
](
https://tools.ietf.org/html/rfc7396
)
.
Provides the ability to modify and test a JSON according to a
[
RFC6902 JSON patch
](
http://tools.ietf.org/html/rfc6902
)
and
[
RFC7396 JSON Merge Patch
](
https://tools.ietf.org/html/rfc7396
)
.
[

](http://godoc.org/github.com/evanphx/json-patch)
[

](https://travis-ci.org/evanphx/json-patch)
[

](https://goreportcard.com/report/github.com/evanphx/json-patch)
*Version*
:
**1.0**
# Get It!
[

](http://godoc.org/github.com/evanphx/json-patch)
**Latest and greatest**
:
```
bash
go get
-u
github.com/evanphx/json-patch
```
[

](https://travis-ci.org/evanphx/json-patch)
**Stable Versions**
:
*
Version 3:
`go get -u gopkg.in/evanphx/json-patch.v3`
(previous versions below
`v3`
are unavailable)
# Use It!
*
[
Create and apply a merge patch
](
#create-and-apply-a-merge-patch
)
*
[
Create and apply a JSON Patch
](
#create-and-apply-a-json-patch
)
*
[
Comparing JSON documents
](
#comparing-json-documents
)
*
[
Combine merge patches
](
#combine-merge-patches
)
## Create and apply a merge patch
Given both an original JSON document and a modified JSON document, you can create
a
[
Merge Patch
](
https://tools.ietf.org/html/rfc7396
)
document.
It can describe the changes needed to convert from the original to the
modified JSON document.
Once you have a merge patch, you can apply it to other JSON documents using the
`jsonpatch.MergePatch(document, patch)`
function.
```
go
package
main
import
(
"fmt"
jsonpatch
"github.com/evanphx/json-patch"
)
func
main
()
{
// Let's create a merge patch from these two documents...
original
:=
[]
byte
(
`{"name": "John", "age": 24, "height": 3.21}`
)
target
:=
[]
byte
(
`{"name": "Jane", "age": 24}`
)
patch
,
err
:=
jsonpatch
.
CreateMergePatch
(
original
,
target
)
if
err
!=
nil
{
panic
(
err
)
}
// Now lets apply the patch against a different JSON document...
alternative
:=
[]
byte
(
`{"name": "Tina", "age": 28, "height": 3.75}`
)
modifiedAlternative
,
err
:=
jsonpatch
.
MergePatch
(
alternative
,
patch
)
fmt
.
Printf
(
"patch document: %s
\n
"
,
patch
)
fmt
.
Printf
(
"updated alternative doc: %s
\n
"
,
modifiedAlternative
)
}
```
When ran, you get the following output:
```
bash
$
go run main.go
patch document:
{
"height"
:null,
"name"
:
"Jane"
}
updated tina doc:
{
"age"
:28,
"name"
:
"Jane"
}
```
## Create and apply a JSON Patch
You can create patch objects using
`DecodePatch([]byte)`
, which can then
be applied against JSON documents.
The following is an example of creating a patch from two operations, and
applying it against a JSON document.
```
go
package
main
import
(
"fmt"
jsonpatch
"github.com/evanphx/json-patch"
)
func
main
()
{
original
:=
[]
byte
(
`{"name": "John", "age": 24, "height": 3.21}`
)
patchJSON
:=
[]
byte
(
`[
{"op": "replace", "path": "/name", "value": "Jane"},
{"op": "remove", "path": "/height"}
]`
)
patch
,
err
:=
jsonpatch
.
DecodePatch
(
patchJSON
)
if
err
!=
nil
{
panic
(
err
)
}
modified
,
err
:=
patch
.
Apply
(
original
)
if
err
!=
nil
{
panic
(
err
)
}
fmt
.
Printf
(
"Original document: %s
\n
"
,
original
)
fmt
.
Printf
(
"Modified document: %s
\n
"
,
modified
)
}
```
When ran, you get the following output:
```
bash
$
go run main.go
Original document:
{
"name"
:
"John"
,
"age"
: 24,
"height"
: 3.21
}
Modified document:
{
"age"
:24,
"name"
:
"Jane"
}
```
## Comparing JSON documents
Due to potential whitespace and ordering differences, one cannot simply compare
JSON strings or byte-arrays directly.
As such, you can instead use
`jsonpatch.Equal(document1, document2)`
to
determine if two JSON documents are _structurally_ equal. This ignores
whitespace differences, and key-value ordering.
```
go
package
main
import
(
"fmt"
jsonpatch
"github.com/evanphx/json-patch"
)
func
main
()
{
original
:=
[]
byte
(
`{"name": "John", "age": 24, "height": 3.21}`
)
similar
:=
[]
byte
(
`
{
"age": 24,
"height": 3.21,
"name": "John"
}
`
)
different
:=
[]
byte
(
`{"name": "Jane", "age": 20, "height": 3.37}`
)
if
jsonpatch
.
Equal
(
original
,
similar
)
{
fmt
.
Println
(
`"original" is structurally equal to "similar"`
)
}
if
!
jsonpatch
.
Equal
(
original
,
different
)
{
fmt
.
Println
(
`"original" is _not_ structurally equal to "similar"`
)
}
}
```
When ran, you get the following output:
```
bash
$
go run main.go
"original"
is structurally equal to
"similar"
"original"
is _not_ structurally equal to
"similar"
```
## Combine merge patches
Given two JSON merge patch documents, it is possible to combine them into a
single merge patch which can describe both set of changes.
The resulting merge patch can be used such that applying it results in a
document structurally similar as merging each merge patch to the document
in succession.
```
go
package
main
import
(
"fmt"
jsonpatch
"github.com/evanphx/json-patch"
)
func
main
()
{
original
:=
[]
byte
(
`{"name": "John", "age": 24, "height": 3.21}`
)
nameAndHeight
:=
[]
byte
(
`{"height":null,"name":"Jane"}`
)
ageAndEyes
:=
[]
byte
(
`{"age":4.23,"eyes":"blue"}`
)
// Let's combine these merge patch documents...
combinedPatch
,
err
:=
jsonpatch
.
MergeMergePatches
(
nameAndHeight
,
ageAndEyes
)
if
err
!=
nil
{
panic
(
err
)
}
// Apply each patch individual against the original document
withoutCombinedPatch
,
err
:=
jsonpatch
.
MergePatch
(
original
,
nameAndHeight
)
if
err
!=
nil
{
panic
(
err
)
}
withoutCombinedPatch
,
err
=
jsonpatch
.
MergePatch
(
withoutCombinedPatch
,
ageAndEyes
)
if
err
!=
nil
{
panic
(
err
)
}
// Apply the combined patch against the original document
withCombinedPatch
,
err
:=
jsonpatch
.
MergePatch
(
original
,
combinedPatch
)
if
err
!=
nil
{
panic
(
err
)
}
// Do both result in the same thing? They should!
if
jsonpatch
.
Equal
(
withCombinedPatch
,
withoutCombinedPatch
)
{
fmt
.
Println
(
"Both JSON documents are structurally the same!"
)
}
fmt
.
Printf
(
"combined merge patch: %s"
,
combinedPatch
)
}
```
When ran, you get the following output:
```
bash
$
go run main.go
Both JSON documents are structurally the same!
combined merge patch:
{
"age"
:4.23,
"eyes"
:
"blue"
,
"height"
:null,
"name"
:
"Jane"
}
```
# CLI for comparing JSON documents
You can install the commandline program
`json-patch`
.
This program can take multiple JSON patch documents as arguments,
and fed a JSON document from
`stdin`
. It will apply the patch(es) against
the document and output the modified doc.
**patch.1.json**
```
json
[
{
"op"
:
"replace"
,
"path"
:
"/name"
,
"value"
:
"Jane"
},
{
"op"
:
"remove"
,
"path"
:
"/height"
}
]
```
**patch.2.json**
```
json
[
{
"op"
:
"add"
,
"path"
:
"/address"
,
"value"
:
"123 Main St"
},
{
"op"
:
"replace"
,
"path"
:
"/age"
,
"value"
:
"21"
}
]
```
### API Usage
**document.json**
```
json
{
"name"
:
"John"
,
"age"
:
24
,
"height"
:
3.21
}
```
*
Given a
`[]byte`
, obtain a Patch object
You can then run:
`obj, err := jsonpatch.DecodePatch(patch)`
```
bash
$
go
install
github.com/evanphx/json-patch/cmd/json-patch
$
cat
document.json | json-patch
-p
patch.1.json
-p
patch.2.json
{
"address"
:
"123 Main St"
,
"age"
:
"21"
,
"name"
:
"Jane"
}
```
*
Apply the patch and get a new document back
# Help It!
Contributions are welcomed! Leave
[
an issue
](
https://github.com/evanphx/json-patch/issues
)
or
[
create a PR
](
https://github.com/evanphx/json-patch/compare
)
.
`out, err := obj.Apply(doc)`
*
Create a JSON Merge Patch document based on two json documents (a to b):
Before creating a pull request, we'd ask that you make sure tests are passing
and that you have added new tests when applicable.
`mergeDoc, err := jsonpatch.CreateMergePatch(a, b)`
*
Bonus API: compare documents for structural equality
Contributors can run tests using:
`jsonpatch.Equal(doca, docb)`
```
bash
go
test
-cover
./...
```
Builds for pull requests are tested automatically
using
[
TravisCI
](
https://travis-ci.org/evanphx/json-patch
)
.
vendor/github.com/evanphx/json-patch/merge.go
View file @
2d28e0d6
package
jsonpatch
import
(
"bytes"
"encoding/json"
"fmt"
"reflect"
...
...
@@ -89,6 +90,7 @@ func pruneAryNulls(ary *partialArray) *partialArray {
var
errBadJSONDoc
=
fmt
.
Errorf
(
"Invalid JSON Document"
)
var
errBadJSONPatch
=
fmt
.
Errorf
(
"Invalid JSON Patch"
)
var
errBadMergeTypes
=
fmt
.
Errorf
(
"Mismatched JSON Documents"
)
// MergeMergePatches merges two merge patches together, such that
// applying this resulting merged merge patch to a document yields the same
...
...
@@ -160,30 +162,106 @@ func doMergePatch(docData, patchData []byte, mergeMerge bool) ([]byte, error) {
return
json
.
Marshal
(
doc
)
}
// CreateMergePatch creates a merge patch as specified in http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07
//
// 'a' is original, 'b' is the modified document. Both are to be given as json encoded content.
// The function will return a mergeable json document with differences from a to b.
//
// An error will be returned if any of the two documents are invalid.
func
CreateMergePatch
(
a
,
b
[]
byte
)
([]
byte
,
error
)
{
aI
:=
map
[
string
]
interface
{}{}
bI
:=
map
[
string
]
interface
{}{}
err
:=
json
.
Unmarshal
(
a
,
&
aI
)
// resemblesJSONArray indicates whether the byte-slice "appears" to be
// a JSON array or not.
// False-positives are possible, as this function does not check the internal
// structure of the array. It only checks that the outer syntax is present and
// correct.
func
resemblesJSONArray
(
input
[]
byte
)
bool
{
input
=
bytes
.
TrimSpace
(
input
)
hasPrefix
:=
bytes
.
HasPrefix
(
input
,
[]
byte
(
"["
))
hasSuffix
:=
bytes
.
HasSuffix
(
input
,
[]
byte
(
"]"
))
return
hasPrefix
&&
hasSuffix
}
// CreateMergePatch will return a merge patch document capable of converting
// the original document(s) to the modified document(s).
// The parameters can be bytes of either two JSON Documents, or two arrays of
// JSON documents.
// The merge patch returned follows the specification defined at http://tools.ietf.org/html/draft-ietf-appsawg-json-merge-patch-07
func
CreateMergePatch
(
originalJSON
,
modifiedJSON
[]
byte
)
([]
byte
,
error
)
{
originalResemblesArray
:=
resemblesJSONArray
(
originalJSON
)
modifiedResemblesArray
:=
resemblesJSONArray
(
modifiedJSON
)
// Do both byte-slices seem like JSON arrays?
if
originalResemblesArray
&&
modifiedResemblesArray
{
return
createArrayMergePatch
(
originalJSON
,
modifiedJSON
)
}
// Are both byte-slices are not arrays? Then they are likely JSON objects...
if
!
originalResemblesArray
&&
!
modifiedResemblesArray
{
return
createObjectMergePatch
(
originalJSON
,
modifiedJSON
)
}
// None of the above? Then return an error because of mismatched types.
return
nil
,
errBadMergeTypes
}
// createObjectMergePatch will return a merge-patch document capable of
// converting the original document to the modified document.
func
createObjectMergePatch
(
originalJSON
,
modifiedJSON
[]
byte
)
([]
byte
,
error
)
{
originalDoc
:=
map
[
string
]
interface
{}{}
modifiedDoc
:=
map
[
string
]
interface
{}{}
err
:=
json
.
Unmarshal
(
originalJSON
,
&
originalDoc
)
if
err
!=
nil
{
return
nil
,
errBadJSONDoc
}
err
=
json
.
Unmarshal
(
b
,
&
bI
)
err
=
json
.
Unmarshal
(
modifiedJSON
,
&
modifiedDoc
)
if
err
!=
nil
{
return
nil
,
errBadJSONDoc
}
dest
,
err
:=
getDiff
(
aI
,
bI
)
dest
,
err
:=
getDiff
(
originalDoc
,
modifiedDoc
)
if
err
!=
nil
{
return
nil
,
err
}
return
json
.
Marshal
(
dest
)
}
// createArrayMergePatch will return an array of merge-patch documents capable
// of converting the original document to the modified document for each
// pair of JSON documents provided in the arrays.
// Arrays of mismatched sizes will result in an error.
func
createArrayMergePatch
(
originalJSON
,
modifiedJSON
[]
byte
)
([]
byte
,
error
)
{
originalDocs
:=
[]
json
.
RawMessage
{}
modifiedDocs
:=
[]
json
.
RawMessage
{}
err
:=
json
.
Unmarshal
(
originalJSON
,
&
originalDocs
)
if
err
!=
nil
{
return
nil
,
errBadJSONDoc
}
err
=
json
.
Unmarshal
(
modifiedJSON
,
&
modifiedDocs
)
if
err
!=
nil
{
return
nil
,
errBadJSONDoc
}
total
:=
len
(
originalDocs
)
if
len
(
modifiedDocs
)
!=
total
{
return
nil
,
errBadJSONDoc
}
result
:=
[]
json
.
RawMessage
{}
for
i
:=
0
;
i
<
len
(
originalDocs
);
i
++
{
original
:=
originalDocs
[
i
]
modified
:=
modifiedDocs
[
i
]
patch
,
err
:=
createObjectMergePatch
(
original
,
modified
)
if
err
!=
nil
{
return
nil
,
err
}
result
=
append
(
result
,
json
.
RawMessage
(
patch
))
}
return
json
.
Marshal
(
result
)
}
// Returns true if the array matches (must be json types).
// As is idiomatic for go, an empty array is not the same as a nil array.
func
matchesArray
(
a
,
b
[]
interface
{})
bool
{
...
...
vendor/github.com/evanphx/json-patch/patch.go
View file @
2d28e0d6
...
...
@@ -397,7 +397,9 @@ func (d *partialArray) add(key string, val *lazyNode) error {
}
idx
=
len
(
ary
)
-
idx
}
if
idx
<
0
||
idx
>=
len
(
ary
)
||
idx
>
len
(
cur
)
{
return
fmt
.
Errorf
(
"Unable to access invalid index: %d"
,
idx
)
}
copy
(
ary
[
0
:
idx
],
cur
[
0
:
idx
])
ary
[
idx
]
=
val
copy
(
ary
[
idx
+
1
:
],
cur
[
idx
:
])
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment