Codebase list golang-github-vbatts-go-mtree / 5d26726
keyword: unify keyword synonyms Signed-off-by: Vincent Batts <vbatts@hashbangbash.com> Vincent Batts 7 years ago
6 changed file(s) with 124 addition(s) and 3 deletion(s). Raw diff Collapse all Expand all
395395 }
396396
397397 func splitKeywordsArg(str string) []string {
398 return strings.Fields(strings.Replace(str, ",", " ", -1))
398 keywords := []string{}
399 for _, kw := range strings.Fields(strings.Replace(str, ",", " ", -1)) {
400 keywords = append(keywords, mtree.KeywordSynonym(kw))
401 }
402 return keywords
399403 }
400404
401405 func inSlice(a string, list []string) bool {
3737 for _, kv := range kvs {
3838 kw := KeyVal(kv).Keyword()
3939 if !inSlice(kw, usedkeywords) {
40 usedkeywords = append(usedkeywords, kw)
40 usedkeywords = append(usedkeywords, KeywordSynonym(kw))
4141 }
4242 }
4343 }
0 package mtree
1
2 import (
3 "strings"
4 "testing"
5 )
6
7 var checklist = []struct {
8 blob string
9 set []string
10 }{
11 {blob: `
12 # machine: bananaboat
13 # tree: .git
14 # date: Wed Nov 16 14:54:17 2016
15
16 # .
17 /set type=file nlink=1 mode=0664 uid=1000 gid=100
18 . size=4096 type=dir mode=0755 nlink=8 time=1479326055.423853146
19 .COMMIT_EDITMSG.un~ size=1006 mode=0644 time=1479325423.450468662 sha1digest=dead0face
20 .TAG_EDITMSG.un~ size=1069 mode=0600 time=1471362316.801317529 sha256digest=dead0face
21 `, set: []string{"size", "mode", "time", "sha256digest"}},
22 }
23
24 func TestUsedKeywords(t *testing.T) {
25 for i, item := range checklist {
26 dh, err := ParseSpec(strings.NewReader(item.blob))
27 if err != nil {
28 t.Error(err)
29 }
30 used := dh.UsedKeywords()
31 for _, k := range item.set {
32 if !inSlice(k, used) {
33 t.Errorf("%d: expected to find %q in %q", i, k, used)
34 }
35 }
36 }
37 }
250250 }
251251 )
252252
253 // KeywordSynonym returns the canonical name for keywords that have synonyms,
254 // and just returns the name provided if there is no synonym. In this way it
255 // ought to be safe to wrap any keyword name.
256 func KeywordSynonym(name string) string {
257 switch name {
258 case "md5":
259 return "md5digest"
260 case "rmd160":
261 return "ripemd160digest"
262 case "rmd160digest":
263 return "ripemd160digest"
264 case "sha1":
265 return "sha1digest"
266 case "sha256":
267 return "sha256digest"
268 case "sha384":
269 return "sha384digest"
270 case "sha512":
271 return "sha512digest"
272 case "xattrs":
273 return "xattr"
274 }
275 return name
276 }
277
253278 var (
254279 modeKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) {
255280 permissions := info.Mode().Perm()
291316 if _, err := io.Copy(h, r); err != nil {
292317 return "", err
293318 }
294 return fmt.Sprintf("%s=%x", name, h.Sum(nil)), nil
319 return fmt.Sprintf("%s=%x", KeywordSynonym(name), h.Sum(nil)), nil
295320 }
296321 }
297322 tartimeKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) {
9292 }
9393 }
9494 }
95
96 func TestKeywordSynonym(t *testing.T) {
97 checklist := []struct {
98 give, expect string
99 }{
100 {give: "time", expect: "time"},
101 {give: "md5", expect: "md5digest"},
102 {give: "md5digest", expect: "md5digest"},
103 {give: "rmd160", expect: "ripemd160digest"},
104 {give: "rmd160digest", expect: "ripemd160digest"},
105 {give: "ripemd160digest", expect: "ripemd160digest"},
106 {give: "sha1", expect: "sha1digest"},
107 {give: "sha1digest", expect: "sha1digest"},
108 {give: "sha256", expect: "sha256digest"},
109 {give: "sha256digest", expect: "sha256digest"},
110 {give: "sha384", expect: "sha384digest"},
111 {give: "sha384digest", expect: "sha384digest"},
112 {give: "sha512", expect: "sha512digest"},
113 {give: "sha512digest", expect: "sha512digest"},
114 {give: "xattr", expect: "xattr"},
115 {give: "xattrs", expect: "xattr"},
116 }
117
118 for i, check := range checklist {
119 got := KeywordSynonym(check.give)
120 if got != check.expect {
121 t.Errorf("%d: expected %q; got %q", i, check.expect, got)
122 }
123 }
124 }
0 #!/bin/bash
1 set -e
2 #set -x
3
4 name=$(basename $0)
5 root=$1
6 gomtree=$(readlink -f ${root}/gomtree)
7 t=$(mktemp -d /tmp/go-mtree.XXXXXX)
8
9 echo "[${name}] Running in ${t}"
10
11 pushd ${root}
12 git archive --format=tar HEAD^{tree} . > ${t}/${name}.tar
13 mkdir -p ${t}/extract
14 tar -C ${t}/extract/ -xf ${t}/${name}.tar
15
16 ## This is a checking that keyword synonyms are respected
17 ${gomtree} -k sha1digest -c -p ${t}/extract/ > ${t}/${name}.mtree
18 ${gomtree} -k sha1 -f ${t}/${name}.mtree -p ${t}/extract/
19 ${gomtree} -k sha1 -c -p ${t}/extract/ > ${t}/${name}.mtree
20 ${gomtree} -k sha1digest -f ${t}/${name}.mtree -p ${t}/extract/
21
22 popd
23 rm -rf ${t}