keyword: unify keyword synonyms
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
Vincent Batts
7 years ago
395 | 395 | } |
396 | 396 | |
397 | 397 | 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 | |
399 | 403 | } |
400 | 404 | |
401 | 405 | func inSlice(a string, list []string) bool { |
37 | 37 | for _, kv := range kvs { |
38 | 38 | kw := KeyVal(kv).Keyword() |
39 | 39 | if !inSlice(kw, usedkeywords) { |
40 | usedkeywords = append(usedkeywords, kw) | |
40 | usedkeywords = append(usedkeywords, KeywordSynonym(kw)) | |
41 | 41 | } |
42 | 42 | } |
43 | 43 | } |
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 | } |
250 | 250 | } |
251 | 251 | ) |
252 | 252 | |
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 | ||
253 | 278 | var ( |
254 | 279 | modeKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) { |
255 | 280 | permissions := info.Mode().Perm() |
291 | 316 | if _, err := io.Copy(h, r); err != nil { |
292 | 317 | return "", err |
293 | 318 | } |
294 | return fmt.Sprintf("%s=%x", name, h.Sum(nil)), nil | |
319 | return fmt.Sprintf("%s=%x", KeywordSynonym(name), h.Sum(nil)), nil | |
295 | 320 | } |
296 | 321 | } |
297 | 322 | tartimeKeywordFunc = func(path string, info os.FileInfo, r io.Reader) (string, error) { |
92 | 92 | } |
93 | 93 | } |
94 | 94 | } |
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} |