@@ -3,28 +3,28 @@ set -Eeuo pipefail
3
3
4
4
workdir=" $( readlink -f " $BASH_SOURCE " ) "
5
5
workdir=" $( dirname " $workdir " ) "
6
- # cd "$workdir"
6
+ cd " $workdir "
7
7
8
8
jsonFile=' metadata.json'
9
- canonicalMetadataFile=" $workdir /$jsonFile "
10
- maxCategories=3
9
+ canonicalMetadataFile=" . /$jsonFile "
10
+ export maxCategories=3
11
11
12
12
self=" $( basename " $0 " ) "
13
13
14
14
usage () {
15
15
cat << EOUSAGE
16
16
17
- usage: $self [--categories] [--diff] [--fmt ] repo [...]
17
+ usage: $self [--categories] [--diff] [--write ] repo [...]
18
18
ie: $self debian
19
19
$self -d */
20
20
$self -dc python
21
21
22
22
This script checks a repo's metadata.json and checks categories, diffs, or formats it.
23
23
24
- -c, --categories Check that the categories are from the valid set of categories and that there are no more than $maxCategories . Exits non-zero if there are too many categories or they are unkown.
25
- -d, --diff Check formatting of the '[repo]/metadata.json' and print a diff. Default action if no flags are supplied. Exits non-zero if there is a difference.
26
- -f , --fmt, --format Apply the formatting that the '-d' flag would output.
27
- -h , --help Print this help output and exit .
24
+ -c, --categories Check that the categories are from the valid set of categories and that there are no more than $maxCategories . Exits non-zero if there are too many categories or they are unkown.
25
+ -d, --diff Check formatting of the '[repo]/metadata.json' and print a diff. Default action if no flags are supplied. Exits non-zero if there is a difference.
26
+ -h , --help Print this help output and exit .
27
+ -w , --write Apply the formatting that the '-d' flag would output .
28
28
29
29
Arguments are the list of repos with a 'metadata.json' in them. 'metadata.json' is expected in every repo
30
30
'.' can also be passed to check the format of the canonical './metadata.json' at
@@ -33,21 +33,21 @@ EOUSAGE
33
33
}
34
34
35
35
# arg handling
36
- opts=" $( getopt -o ' cdfh ' --long ' categories,diff,fmt,format, help' -- " $@ " || { usage >&2 && false ; }) "
36
+ opts=" $( getopt -o ' cdhw ' --long ' categories,diff,help,write ' -- " $@ " || { usage >&2 && false ; }) "
37
37
eval set -- " $opts "
38
38
39
39
categories=
40
40
diff=
41
- fmt =
41
+ write =
42
42
43
43
while true ; do
44
44
flag=" $1 "
45
45
shift
46
46
case " $flag " in
47
- --categories| -c) categories=1 ;;
48
- --diff| -d) diff=1 ;;
49
- --fmt|--format|-f) fmt=1 ;;
50
- --help|-h) usage && exit 0 ;;
47
+ --categories | -c) categories=1 ;;
48
+ --diff | -d) diff=1 ;;
49
+ --help | -h) usage && exit 0 ;;
50
+ --write | -w) write=1 ;;
51
51
--) break ;;
52
52
* )
53
53
{
@@ -60,7 +60,7 @@ while true; do
60
60
done
61
61
62
62
# default to print diff
63
- if [ -z " $diff " ] && [ -z " $categories " ] && [ -z " $fmt " ]; then
63
+ if [ -z " $diff " ] && [ -z " $categories " ] && [ -z " $write " ]; then
64
64
diff=1
65
65
fi
66
66
@@ -70,37 +70,30 @@ if [ "${#repos[@]}" -eq 0 ]; then
70
70
fi
71
71
repos=( " ${repos[@]%/ } " )
72
72
73
- canonicalMetadataFileJson=" $( cat " $canonicalMetadataFile " ) "
74
- export canonicalMetadataFileJson
75
-
76
- failure=
73
+ failures=0
77
74
for repo in " ${repos[@]} " ; do
78
- repoFile=" $workdir / $ repo /$jsonFile "
79
- if [ ! -f " $repoFile " ]; then
80
- failure=1
81
- echo " error file does not exist: $repo / $jsonFile "
75
+ repoFile=" $repo /$jsonFile "
76
+ if [ ! -e " $repoFile " ]; then
77
+ echo >&2 " error: $repoFile does not exist "
78
+ (( failures ++ )) || :
82
79
continue
83
80
fi
84
- repoFile=" $( readlink -f " $repoFile " ) "
85
81
86
- if [ -n " $diff " ] || [ -n " $fmt " ]; then
82
+ if [ -n " $diff " ] || [ -n " $write " ]; then
87
83
# sort object keys and pretty print with jq as our "cannonical json"
88
- # sort categories array
89
- if ! repoFilejson =" $( jq --sort-keys ' .hub.categories |= sort ' " $repoFile " ) " ; then
90
- echo " error $repo / $jsonFile improper json "
91
- failure=1
84
+ # sort categories array, no duplicates
85
+ if ! repoFileJson =" $( jq --sort-keys ' .hub.categories |= unique ' " $repoFile " ) " ; then
86
+ echo >&2 " error parsing ' $repoFile '; invalid JSON? "
87
+ (( failures ++ )) || :
92
88
continue
93
89
fi
94
- if ! filediff=" $( diff -u " $repoFile " <( echo " $repoFilejson " ) ) " ; then
90
+ if ! filediff=" $( diff -u " $repoFile " <( cat <<< " $repoFileJson " ) ) " ; then
95
91
if [ -n " $diff " ]; then
96
- echo >&2 " $repoFile "
97
- # skip diff headers
98
- echo " $filediff " | tail -n +3
99
- failure=1
92
+ cat <<< " $filediff"
93
+ [ -n " write" ] || (( failures++ )) || :
100
94
fi
101
- if [ -n " $fmt " ]; then
102
- # TODO should fmt + categories remove invalid or categories over max?
103
- echo " $repoFilejson " > " $repoFile "
95
+ if [ -n " $write " ]; then
96
+ cat <<< " $repoFileJson" > " $repoFile "
104
97
fi
105
98
fi
106
99
fi
@@ -109,32 +102,39 @@ for repo in "${repos[@]}"; do
109
102
if [ -n " $categories " ]; then
110
103
# the canonicalMetadataFile doesn't have too many categories since it is the source of categories
111
104
# all other metadata.json files must not be more than maxCategories
112
- if [ " $canonicalMetadataFile " != " $repoFile " ]; then
113
- tooManyCategories=" $( jq --raw-output '
105
+ if [ " $repoFile " != " $canonicalMetadataFile " ]; then
106
+ if tooManyCategories=" $( jq --raw-output '
114
107
.hub.categories
115
- | if length > ' " $maxCategories " ' then
116
- length
108
+ | length
109
+ | if . > (env.maxCategories | tonumber) then
110
+ .
117
111
else empty end
118
- ' " $repoFile " ) "
119
- if [ -n " $tooManyCategories " ]; then
120
- echo >&2 " $repo , error too many Docker Hub categories: $tooManyCategories , max $maxCategories "
121
- failure=1
112
+ ' " $repoFile " ) " ; then
113
+ if [ -n " $tooManyCategories " ]; then
114
+ echo >&2 " error: $repoFile : too many categories: $tooManyCategories (max $maxCategories )"
115
+ (( failures++ )) || :
116
+ fi
117
+ else
118
+ echo >&2 " error parsing '$repoFile '; invalid JSON?"
119
+ (( failures++ )) || :
120
+ continue
122
121
fi
122
+
123
123
fi
124
124
# check for categories that aren't in the canonical set
125
- extraCategories=" $( jq -c '
126
- (env.canonicalMetadataFileJson | fromjson | .hub.categories) as $canonicalCategories
127
- | .hub.categories
128
- | map(. as $cat | select($canonicalCategories | index($cat) < 0))
129
- | if length > 0 then . else empty end
130
- ' " $repoFile " ) "
131
- if [ -n " $extraCategories " ]; then
132
- echo >&2 " $repo , error unkown categories: $extraCategories "
133
- failure=1
125
+ if extraCategories=" $( jq -c --slurpfile canonical " $canonicalMetadataFile " '
126
+ .hub.categories - $canonical[0].hub.categories
127
+ ' " $repoFile " ) " ; then
128
+ if [ " $extraCategories " != ' []' ]; then
129
+ echo >&2 " error: $repoFile : unkown categories: $extraCategories "
130
+ (( failures++ )) || :
131
+ fi
132
+ else
133
+ echo >&2 " error parsing '$repoFile '; invalid JSON?"
134
+ (( failures++ )) || :
135
+ continue
134
136
fi
135
137
fi
136
138
done
137
139
138
- if [ " $failure " ]; then
139
- exit 1
140
- fi
140
+ exit " $failures "
0 commit comments