@@ -91,7 +91,6 @@ if [ "$#" -eq 0 ]; then
91
91
set -- $images
92
92
fi
93
93
94
- export BASHBREW_CACHE=" ${BASHBREW_CACHE:- ${XDG_CACHE_HOME:- $HOME / .cache} / bashbrew} "
95
94
export BASHBREW_LIBRARY=" $PWD /oi/library"
96
95
97
96
: " ${BASHBREW_ARCH:= amd64} " # TODO something smarter with arches
@@ -103,9 +102,8 @@ template='
103
102
{{- "\n" -}}
104
103
{{- range $.Entries -}}
105
104
{{- $arch := .HasArchitecture arch | ternary arch (.Architectures | first) -}}
106
- {{- $froms := $.ArchDockerFroms $arch . -}}
107
105
{{- $outDir := join "_" $.RepoName (.Tags | last) -}}
108
- git -C "$BASHBREW_CACHE/git " archive --format=tar
106
+ git -C "{{ gitCache }} " archive --format=tar
109
107
{{- " " -}}
110
108
{{- "--prefix=" -}}
111
109
{{- $outDir -}}
@@ -116,12 +114,28 @@ template='
116
114
{{- $dir := .ArchDirectory $arch -}}
117
115
{{- (eq $dir ".") | ternary "" $dir -}}
118
116
{{- "\n" -}}
119
- mkdir -p "$tempDir/{{- $outDir -}}" && echo "{{- .ArchFile $arch -}}" > "$tempDir/{{- $outDir -}}/.bashbrew-dockerfile-name "
117
+ mkdir -p "$tempDir/{{- $outDir -}}" && echo "{{- .ArchBuilder $arch -}}" > "$tempDir/{{- $outDir -}}/.bashbrew-builder" && echo "{{- .ArchFile $arch -}}" > "$tempDir/{{- $outDir -}}/.bashbrew-file "
120
118
{{- "\n" -}}
121
119
{{- end -}}
122
120
tar -cC "$tempDir" . && rm -rf "$tempDir"
123
121
'
124
122
123
+ _tar-t () {
124
+ tar -t " $@ " \
125
+ | grep -vE " $uninterestingTarballGrep " \
126
+ | sed -e ' s!^[.]/!!' \
127
+ -r \
128
+ -e ' s!([/.-]|^)((lib)?(c?python|py)-?)[0-9]+([.][0-9]+)?([/.-]|$)!\1\2XXX\6!g' \
129
+ | sort
130
+ }
131
+
132
+ _jq () {
133
+ if [ " $# " -eq 0 ]; then
134
+ set -- ' .'
135
+ fi
136
+ jq --tab -S " $@ "
137
+ }
138
+
125
139
copy-tar () {
126
140
local src=" $1 " ; shift
127
141
local dst=" $1 " ; shift
@@ -132,19 +146,73 @@ copy-tar() {
132
146
return
133
147
fi
134
148
135
- local d dockerfiles=()
136
- for d in " $src " /* /.bashbrew-dockerfile-name ; do
149
+ local d indexes=() dockerfiles=()
150
+ for d in " $src " /* /.bashbrew-file ; do
137
151
[ -f " $d " ] || continue
138
152
local bf; bf=" $( < " $d " ) "
139
153
local dDir; dDir=" $( dirname " $d " ) "
140
- dockerfiles+=( " $dDir /$bf " )
141
- if [ " $bf " = ' Dockerfile' ]; then
142
- # if "Dockerfile.builder" exists, let's check that too (busybox, hello-world)
143
- if [ -f " $dDir /$bf .builder" ]; then
144
- dockerfiles+=( " $dDir /$bf .builder" )
154
+ local builder; builder=" $( < " $dDir /.bashbrew-builder" ) "
155
+ if [ " $builder " = ' oci-import' ]; then
156
+ indexes+=( " $dDir /$bf " )
157
+ else
158
+ dockerfiles+=( " $dDir /$bf " )
159
+ if [ " $bf " = ' Dockerfile' ]; then
160
+ # if "Dockerfile.builder" exists, let's check that too (busybox, hello-world)
161
+ if [ -f " $dDir /$bf .builder" ]; then
162
+ dockerfiles+=( " $dDir /$bf .builder" )
163
+ fi
145
164
fi
146
165
fi
147
- rm " $d " # remove the ".bashbrew-dockerfile-name" file we created
166
+ rm " $d " " $dDir /.bashbrew-builder" # remove the ".bashbrew-*" files we created
167
+ done
168
+
169
+ # now that we're done with our globbing needs, let's disable globbing so it doesn't give us wrong answers
170
+ local -
171
+ set -o noglob
172
+
173
+ for i in " ${indexes[@]} " ; do
174
+ local iName; iName=" $( basename " $i " ) "
175
+ local iDir; iDir=" $( dirname " $i " ) "
176
+ local iDirName; iDirName=" $( basename " $iDir " ) "
177
+ local iDst=" $dst /$iDirName "
178
+
179
+ mkdir -p " $iDst "
180
+
181
+ _jq . " $i " > " $iDst /$iName "
182
+
183
+ local digest
184
+ digest=" $( jq -r --arg name " $iName " '
185
+ if $name == "index.json" then
186
+ .manifests[0].digest
187
+ else
188
+ .digest
189
+ end
190
+ ' " $i " ) "
191
+
192
+ local blob=" blobs/${digest//:// } "
193
+ local blobDir; blobDir=" $( dirname " $blob " ) "
194
+ local manifest=" $iDir /$blob "
195
+ mkdir -p " $iDst /$blobDir "
196
+ _jq . " $manifest " > " $iDst /$blob "
197
+
198
+ local configDigest; configDigest=" $( jq -r ' .config.digest' " $manifest " ) "
199
+ local blob=" blobs/${configDigest//:// } "
200
+ local blobDir; blobDir=" $( dirname " $blob " ) "
201
+ local config=" $iDir /$blob "
202
+ mkdir -p " $iDst /$blobDir "
203
+ _jq . " $config " > " $iDst /$blob "
204
+
205
+ local layers
206
+ layers=" $( jq -r ' [ .layers[].digest | @sh ] | join(" ")' " $manifest " ) "
207
+ eval " layers=( $layers )"
208
+ local layerDigest
209
+ for layerDigest in " ${layers[@]} " ; do
210
+ local blob=" blobs/${layerDigest//:// } "
211
+ local blobDir; blobDir=" $( dirname " $blob " ) "
212
+ local layer=" $iDir /$blob "
213
+ mkdir -p " $iDst /$blobDir "
214
+ _tar-t -f " $layer " > " $iDst /$blob 'tar -t'"
215
+ done
148
216
done
149
217
150
218
for d in " ${dockerfiles[@]} " ; do
@@ -238,13 +306,7 @@ copy-tar() {
238
306
case " $g " in
239
307
* .tar.* | * .tgz)
240
308
if [ -s " $dstG " ]; then
241
- tar -tf " $dstG " \
242
- | grep -vE " $uninterestingTarballGrep " \
243
- | sed -e ' s!^[.]/!!' \
244
- -r \
245
- -e ' s!([/.-]|^)((lib)?(c?python|py)-?)[0-9]+([.][0-9]+)?([/.-]|$)!\1\2XXX\6!g' \
246
- | sort \
247
- > " $dstG 'tar -t'"
309
+ _tar-t -f " $dstG " > " $dstG 'tar -t'"
248
310
fi
249
311
;;
250
312
esac
@@ -269,6 +331,8 @@ _metadata-files() {
269
331
if [ " $# " -gt 0 ]; then
270
332
bashbrew list " $@ " 2>> temp/_bashbrew.err | sort -uV > temp/_bashbrew-list || :
271
333
334
+ bashbrew cat --format ' {{ range .Entries }}{{ range .Architectures }}{{ . }}{{ "\n" }}{{ end }}{{ end }}' " $@ " 2>> temp/_bashbrew.err | sort -u > temp/_bashbrew-arches || :
335
+
272
336
" $diffDir /_bashbrew-cat-sorted.sh" " $@ " 2>> temp/_bashbrew.err > temp/_bashbrew-cat || :
273
337
274
338
bashbrew list --uniq " $@ " \
@@ -277,14 +341,15 @@ _metadata-files() {
277
341
| xargs -r bashbrew cat --format " $templateLastTags " 2>> temp/_bashbrew.err \
278
342
> temp/_bashbrew-list-build-order || :
279
343
344
+ bashbrew fetch --arch-filter " $@ "
280
345
script=" $( bashbrew cat --format " $template " " $@ " ) "
281
346
mkdir tar
282
347
( eval " $script " | tar -xiC tar )
283
348
copy-tar tar temp
284
349
rm -rf tar
285
350
fi
286
351
287
- if [ -n " $externalPins " ] && command -v crane & > /dev/null && command -v jq & > /dev/null ; then
352
+ if [ -n " $externalPins " ] && command -v crane & > /dev/null; then
288
353
local file
289
354
for file in $externalPins ; do
290
355
[ -e " oi/$file " ] || continue
@@ -293,7 +358,7 @@ _metadata-files() {
293
358
digest=" $( < " oi/$file " ) "
294
359
dir=" temp/$file "
295
360
mkdir -p " $dir "
296
- bashbrew remote arches --json " $pin @$digest " | jq -S . > " $dir /bashbrew.json"
361
+ bashbrew remote arches --json " $pin @$digest " | _jq > " $dir /bashbrew.json"
297
362
local manifests manifest
298
363
manifests=" $( jq -r '
299
364
[ (
@@ -308,10 +373,10 @@ _metadata-files() {
308
373
' " $dir /bashbrew.json" ) "
309
374
eval " manifests=( $manifests )"
310
375
for manifest in " ${manifests[@]} " ; do
311
- crane manifest " $pin @$manifest " | jq -S . > " $dir /manifest-${manifest//:/ _} .json"
376
+ crane manifest " $pin @$manifest " | _jq > " $dir /manifest-${manifest//:/ _} .json"
312
377
local config
313
378
config=" $( jq -r ' .config.digest' " $dir /manifest-${manifest//:/ _} .json" ) "
314
- crane blob " $pin @$config " | jq -S . > " $dir /manifest-${manifest//:/ _} -config.json"
379
+ crane blob " $pin @$config " | _jq > " $dir /manifest-${manifest//:/ _} -config.json"
315
380
done
316
381
done
317
382
fi
0 commit comments