*: fix comparison of missing keywords
Adding another test validated from the FreeBSD workflow. Just because the keywords requested to be validated are not present in the manifest, it is not an error. Also, if the keywords from a new manifest are not present in a prior manifest, then only compare the common keywords. Fixes https://github.com/vbatts/go-mtree/issues/86 Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
parent
4eec68be4b
commit
21723a3974
4 changed files with 36 additions and 17 deletions
|
@ -69,7 +69,7 @@ func TestCheckKeywords(t *testing.T) {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if len(res) != 1 {
|
if len(res) != 1 {
|
||||||
t.Errorf("expected to get 1 delta on changed mtimes, but did not")
|
t.Fatal("expected to get 1 delta on changed mtimes, but did not")
|
||||||
}
|
}
|
||||||
if res[0].Type() != Modified {
|
if res[0].Type() != Modified {
|
||||||
t.Errorf("expected to get modified delta on changed mtimes, but did not")
|
t.Errorf("expected to get modified delta on changed mtimes, but did not")
|
||||||
|
|
|
@ -184,10 +184,6 @@ func app() error {
|
||||||
if (keyword == "time" && mtree.InKeywordSlice("tar_time", specKeywords)) || (keyword == "tar_time" && mtree.InKeywordSlice("time", specKeywords)) {
|
if (keyword == "time" && mtree.InKeywordSlice("tar_time", specKeywords)) || (keyword == "tar_time" && mtree.InKeywordSlice("time", specKeywords)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if !mtree.InKeywordSlice(keyword, specKeywords) {
|
|
||||||
return fmt.Errorf("cannot verify keywords not in mtree specification: %s\n", keyword)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,9 +259,9 @@ func app() error {
|
||||||
if isTarSpec(specDh) || *flTar != "" {
|
if isTarSpec(specDh) || *flTar != "" {
|
||||||
res = filterMissingKeywords(res)
|
res = filterMissingKeywords(res)
|
||||||
}
|
}
|
||||||
if len(res) > 0 {
|
//if len(res) > 0 {
|
||||||
return fmt.Errorf("unexpected missing keywords: %d", len(res))
|
//return fmt.Errorf("unexpected missing keywords: %d", len(res))
|
||||||
}
|
//}
|
||||||
|
|
||||||
out := formatFunc(res)
|
out := formatFunc(res)
|
||||||
if _, err := os.Stdout.Write([]byte(out)); err != nil {
|
if _, err := os.Stdout.Write([]byte(out)); err != nil {
|
||||||
|
|
22
compare.go
22
compare.go
|
@ -185,10 +185,16 @@ func compareEntry(oldEntry, newEntry Entry) ([]KeyDelta, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
diffs := map[Keyword]*stateT{}
|
diffs := map[Keyword]*stateT{}
|
||||||
|
oldKeys := oldEntry.AllKeys()
|
||||||
|
newKeys := newEntry.AllKeys()
|
||||||
|
|
||||||
// Fill the map with the old keys first.
|
// Fill the map with the old keys first.
|
||||||
for _, kv := range oldEntry.AllKeys() {
|
for _, kv := range oldKeys {
|
||||||
key := kv.Keyword()
|
key := kv.Keyword()
|
||||||
|
// only add this diff if the new keys has this keyword
|
||||||
|
if key != "tar_time" && key != "time" && HasKeyword(newKeys, key) == emptyKV {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Cannot take &kv because it's the iterator.
|
// Cannot take &kv because it's the iterator.
|
||||||
copy := new(KeyVal)
|
copy := new(KeyVal)
|
||||||
|
@ -202,8 +208,12 @@ func compareEntry(oldEntry, newEntry Entry) ([]KeyDelta, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Then fill the new keys.
|
// Then fill the new keys.
|
||||||
for _, kv := range newEntry.AllKeys() {
|
for _, kv := range newKeys {
|
||||||
key := kv.Keyword()
|
key := kv.Keyword()
|
||||||
|
// only add this diff if the old keys has this keyword
|
||||||
|
if key != "tar_time" && key != "time" && HasKeyword(oldKeys, key) == emptyKV {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Cannot take &kv because it's the iterator.
|
// Cannot take &kv because it's the iterator.
|
||||||
copy := new(KeyVal)
|
copy := new(KeyVal)
|
||||||
|
@ -319,12 +329,6 @@ func Compare(oldDh, newDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta, er
|
||||||
New *Entry
|
New *Entry
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make dealing with the keys mapping easier.
|
|
||||||
keySet := map[Keyword]struct{}{}
|
|
||||||
for _, key := range keys {
|
|
||||||
keySet[key] = struct{}{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// To deal with different orderings of the entries, use a path-keyed
|
// To deal with different orderings of the entries, use a path-keyed
|
||||||
// map to make sure we don't start comparing unrelated entries.
|
// map to make sure we don't start comparing unrelated entries.
|
||||||
diffs := map[string]*stateT{}
|
diffs := map[string]*stateT{}
|
||||||
|
@ -405,7 +409,7 @@ func Compare(oldDh, newDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta, er
|
||||||
if keys != nil {
|
if keys != nil {
|
||||||
var filterChanged []KeyDelta
|
var filterChanged []KeyDelta
|
||||||
for _, keyDiff := range changed {
|
for _, keyDiff := range changed {
|
||||||
if _, ok := keySet[keyDiff.name]; ok {
|
if InKeywordSlice(keyDiff.name, keys) {
|
||||||
filterChanged = append(filterChanged, keyDiff)
|
filterChanged = append(filterChanged, keyDiff)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
19
test/cli/0005.sh
Normal file
19
test/cli/0005.sh
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
name=$(basename $0)
|
||||||
|
root=$1
|
||||||
|
gomtree=$(readlink -f ${root}/gomtree)
|
||||||
|
t=$(mktemp -d /tmp/go-mtree.XXXXXX)
|
||||||
|
|
||||||
|
echo "[${name}] Running in ${t}"
|
||||||
|
|
||||||
|
pushd ${root}
|
||||||
|
mkdir -p ${t}/extract
|
||||||
|
git archive --format=tar HEAD^{tree} . | tar -C ${t}/extract/ -x
|
||||||
|
|
||||||
|
${gomtree} -k sha1digest -c -p ${t}/extract/ > ${t}/${name}.mtree
|
||||||
|
${gomtree} -f ${t}/${name}.mtree -k md5digest -p ${t}/extract/
|
||||||
|
|
||||||
|
popd
|
||||||
|
rm -rf ${t}
|
Loading…
Reference in a new issue