diff --git a/demos/dev-getting-started.rec b/demos/dev-getting-started.rec
index 3f7bc970..e63657f6 100644
--- a/demos/dev-getting-started.rec
+++ b/demos/dev-getting-started.rec
@@ -325,7 +325,7 @@
[19.817463, "o", "nimal.json "]
[20.348247, "i", "\r"]
[20.348954, "o", "\r\n"]
-[20.35088, "o", "{\b\n \"distSpecVersion\": \"1.0.1\",\r\n \"storage\": {\r\n \"rootDirectory\": \"/tmp/zot\"\r\n },\r\n \"http\": {\r\n \"address\": \"127.0.0.1\",\r\n \"port\": \"8080\",\r\n \"ReadOnly\": false\r\n },\r\n \"log\": {\r\n \"level\": \"debug\"\r\n }\r\n}\b\n"]
+[20.35088, "o", "{\b\n \"distSpecVersion\": \"1.1.1\",\r\n \"storage\": {\r\n \"rootDirectory\": \"/tmp/zot\"\r\n },\r\n \"http\": {\r\n \"address\": \"127.0.0.1\",\r\n \"port\": \"8080\",\r\n \"ReadOnly\": false\r\n },\r\n \"log\": {\r\n \"level\": \"debug\"\r\n }\r\n}\b\n"]
[20.351335, "o", "\u001b[32m$ \u001b[39m"]
[21.920853, "i", "b"]
[21.921614, "o", "b"]
@@ -375,7 +375,7 @@
[27.208734, "o", "nimal.json "]
[27.906725, "i", "\r"]
[27.907479, "o", "\r\n"]
-[28.004213, "o", "{\"level\":\"info\",\"params\":{\"distSpecVersion\":\"1.0.1\",\"GoVersion\":\"go1.17.7\",\"Commit\":\"v1.4.0-rc3-1-ge583c2f\",\"BinaryType\":\"extended\",\"AccessControl\":null,\"Storage\":{\"Dedupe\":true,\"GC\":true,\"Commit\":false,\"GCDelay\":3600000000000,\"RootDirectory\":\"/tmp/zot\",\"StorageDriver\":null,\"SubPaths\":null},\"HTTP\":{\"Address\":\"127.0.0.1\",\"Port\":\"8080\",\"AllowOrigin\":\"\",\"TLS\":null,\"Auth\":null,\"RawAccessControl\":null,\"Realm\":\"\",\"AllowReadAccess\":false,\"ReadOnly\":false,\"Ratelimit\":null},\"Log\":{\"Level\":\"debug\",\"Output\":\"\",\"Audit\":\"\"},\"Extensions\":null},\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:113\",\"time\":\"2022-04-10T23:08:15.926559322-07:00\",\"message\":\"configuration settings\"}\r\n{\"level\":\"info\",\"cpus\":8,\"max. open files\":1024,\"listen backlog\":\"4096\",\"max. inotify watches\":\"60023\",\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:101\",\"time\":\"2022-04-10T23:08:15.926650495-07:00\",\"message\":\"runtime params\"}\r\n"]
+[28.004213, "o", "{\"level\":\"info\",\"params\":{\"distSpecVersion\":\"1.1.1\",\"GoVersion\":\"go1.17.7\",\"Commit\":\"v1.4.0-rc3-1-ge583c2f\",\"BinaryType\":\"extended\",\"AccessControl\":null,\"Storage\":{\"Dedupe\":true,\"GC\":true,\"Commit\":false,\"GCDelay\":3600000000000,\"RootDirectory\":\"/tmp/zot\",\"StorageDriver\":null,\"SubPaths\":null},\"HTTP\":{\"Address\":\"127.0.0.1\",\"Port\":\"8080\",\"AllowOrigin\":\"\",\"TLS\":null,\"Auth\":null,\"RawAccessControl\":null,\"Realm\":\"\",\"AllowReadAccess\":false,\"ReadOnly\":false,\"Ratelimit\":null},\"Log\":{\"Level\":\"debug\",\"Output\":\"\",\"Audit\":\"\"},\"Extensions\":null},\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:113\",\"time\":\"2022-04-10T23:08:15.926559322-07:00\",\"message\":\"configuration settings\"}\r\n{\"level\":\"info\",\"cpus\":8,\"max. open files\":1024,\"listen backlog\":\"4096\",\"max. inotify watches\":\"60023\",\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:101\",\"time\":\"2022-04-10T23:08:15.926650495-07:00\",\"message\":\"runtime params\"}\r\n"]
[28.934316, "i", "\r"]
[28.934806, "o", "\n"]
[29.128211, "i", "\r"]
diff --git a/demos/dev-getting-started.svg b/demos/dev-getting-started.svg
index d5ecd625..d7e2cea4 100644
--- a/demos/dev-getting-started.svg
+++ b/demos/dev-getting-started.svg
@@ -1 +1 @@
-
\ No newline at end of file
+$$gitclonehttps://github.com/project-zot/zot.gitCloninginto'zot'...remote:Enumeratingobjects:3419,done.remote:Countingobjects:100%(3419/3419),done.remote:Compressingobjects:100%(1167/1167),done.remote:Total3419(delta2243),reused3220(delta2159),pack-reused0Receivingobjects:100%(3419/3419),1.79MiB|7.27MiB/s,done.Resolvingdeltas:100%(2243/2243),done.$c$cd$cdzot$make$makebinarygomodtidyenvCGO_ENABLED=0GOOS=linuxGOARCH=amd64gobuild-obin/zot-linux-amd64-buildmode=pie-tagsextended,containers_image_openpgp-v-trimpath-ldflags"-Xzotregistry.dev/zot/pkg/api/config.Commit=v1.4.0-rc3-1-ge583c2f-Xzotregistry.dev/zot/pkg/api/config.BinaryType=extended-Xzotregistry.dev/zot/pkg/api/config.GoVersion=go1.17.7-s-w"./cmd/zot$ls$lsbin/zot-linux-amd64$cat$catexamples/config-minimal.json{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},"http":{"address":"127.0.0.1","port":"8080","ReadOnly":false"log":{"level":"debug"}}$bin/zot-linux-amd64serve$bin/zot-linux-amd64serveexamples/config-minimal.json{"level":"info","params":{"distSpecVersion":"1.1.1","GoVersion":"go1.17.7","Commit":"v1.4.0-rc3-1-ge583c2f","BinaryType":"extended","AccessControl":null,"Storage":{"Dedupe":true,"GC":true,"Commit":false,"GCDelay":3600000000000,"RootDirectory":"/tmp/zot","StorageDriver":null,"SubPaths":null},"HTTP":{"Address":"127.0.0.1","Port":"8080","AllowOrigin":"","TLS":null,"Auth":null,"RawAccessControl":null,"Realm":"","AllowReadAccess":false,"ReadOnly":false,"Ratelimit":null},"Log":{"Level":"debug","Output":"","Audit":""},"Extensions":null},"goroutine":1,"caller":"zotregistry.dev/zot/pkg/api/controller.go:113","time":"2022-04-10T23:08:15.926559322-07:00","message":"configurationsettings"}{"level":"info","cpus":8,"max.openfiles":1024,"listenbacklog":"4096","max.inotifywatches":"60023","goroutine":1,"caller":"zotregistry.dev/zot/pkg/api/controller.go:101","time":"2022-04-10T23:08:15.926650495-07:00","message":"runtimeparams"}remote:Countingobjects:4%(137/3419)remote:Countingobjects:27%(929/3419)remote:Countingobjects:45%(1539/3419)remote:Countingobjects:56%(1915/3419)remote:Countingobjects:78%(2667/3419)remote:Countingobjects:98%(3351/3419)remote:Compressingobjects:3%(36/1167)remote:Compressingobjects:9%(106/1167)remote:Compressingobjects:10%(117/1167)remote:Compressingobjects:13%(152/1167)remote:Compressingobjects:14%(164/1167)remote:Compressingobjects:15%(176/1167)remote:Compressingobjects:16%(187/1167)remote:Compressingobjects:17%(199/1167)remote:Compressingobjects:18%(211/1167)remote:Compressingobjects:19%(222/1167)remote:Compressingobjects:35%(409/1167)remote:Compressingobjects:49%(572/1167)remote:Compressingobjects:70%(817/1167)remote:Compressingobjects:81%(946/1167)Receivingobjects:0%(1/3419)Receivingobjects:1%(35/3419)Receivingobjects:2%(69/3419)Receivingobjects:3%(103/3419)Receivingobjects:4%(137/3419)Receivingobjects:5%(171/3419)Receivingobjects:6%(206/3419)Receivingobjects:7%(240/3419)Receivingobjects:8%(274/3419)Receivingobjects:9%(308/3419)Receivingobjects:10%(342/3419)Receivingobjects:11%(377/3419)Receivingobjects:12%(411/3419)Receivingobjects:13%(445/3419)Receivingobjects:14%(479/3419)Receivingobjects:15%(513/3419)Receivingobjects:16%(548/3419)Receivingobjects:17%(582/3419)Receivingobjects:18%(616/3419)Receivingobjects:19%(650/3419)Receivingobjects:20%(684/3419)Receivingobjects:21%(718/3419)Receivingobjects:22%(753/3419)Receivingobjects:23%(787/3419)Receivingobjects:24%(821/3419)Receivingobjects:25%(855/3419)Receivingobjects:26%(889/3419)Receivingobjects:27%(924/3419)Receivingobjects:28%(958/3419)Receivingobjects:29%(992/3419)Receivingobjects:30%(1026/3419)Receivingobjects:32%(1095/3419)Receivingobjects:33%(1129/3419)Receivingobjects:35%(1197/3419)Receivingobjects:36%(1231/3419)Receivingobjects:37%(1266/3419)Receivingobjects:39%(1334/3419)Receivingobjects:41%(1402/3419)Receivingobjects:42%(1436/3419)Receivingobjects:43%(1471/3419)Receivingobjects:44%(1505/3419)Receivingobjects:45%(1539/3419)Receivingobjects:46%(1573/3419)Receivingobjects:47%(1607/3419)Receivingobjects:48%(1642/3419)Receivingobjects:49%(1676/3419)Receivingobjects:50%(1710/3419)Receivingobjects:51%(1744/3419)Receivingobjects:52%(1778/3419)Receivingobjects:53%(1813/3419)Receivingobjects:54%(1847/3419)Receivingobjects:55%(1881/3419)Receivingobjects:56%(1915/3419)Receivingobjects:57%(1949/3419)Receivingobjects:58%(1984/3419)Receivingobjects:59%(2018/3419)Receivingobjects:60%(2052/3419)Receivingobjects:61%(2086/3419)Receivingobjects:62%(2120/3419)Receivingobjects:63%(2154/3419)Receivingobjects:64%(2189/3419)Receivingobjects:65%(2223/3419)Receivingobjects:66%(2257/3419)Receivingobjects:67%(2291/3419)Receivingobjects:68%(2325/3419)Receivingobjects:69%(2360/3419)Receivingobjects:71%(2428/3419)Receivingobjects:72%(2462/3419)Receivingobjects:73%(2496/3419)Receivingobjects:74%(2531/3419)Receivingobjects:75%(2565/3419)Receivingobjects:76%(2599/3419)Receivingobjects:77%(2633/3419)Receivingobjects:78%(2667/3419)Receivingobjects:79%(2702/3419)Receivingobjects:80%(2736/3419)Receivingobjects:81%(2770/3419)Receivingobjects:82%(2804/3419)Receivingobjects:83%(2838/3419)Receivingobjects:84%(2872/3419)Receivingobjects:85%(2907/3419)Receivingobjects:86%(2941/3419)Receivingobjects:87%(2975/3419)Receivingobjects:88%(3009/3419)Receivingobjects:89%(3043/3419)Receivingobjects:90%(3078/3419)Receivingobjects:91%(3112/3419)Receivingobjects:92%(3146/3419)Receivingobjects:93%(3180/3419)Receivingobjects:94%(3214/3419)Receivingobjects:95%(3249/3419)Receivingobjects:96%(3283/3419)Receivingobjects:97%(3317/3419)Receivingobjects:98%(3351/3419)Receivingobjects:99%(3385/3419)Resolvingdeltas:0%(0/2243)Resolvingdeltas:1%(23/2243)Resolvingdeltas:2%(45/2243)Resolvingdeltas:3%(68/2243)Resolvingdeltas:4%(90/2243)Resolvingdeltas:5%(113/2243)Resolvingdeltas:6%(135/2243)Resolvingdeltas:7%(158/2243)Resolvingdeltas:8%(180/2243)Resolvingdeltas:9%(202/2243)Resolvingdeltas:10%(225/2243)Resolvingdeltas:11%(248/2243)Resolvingdeltas:12%(270/2243)Resolvingdeltas:13%(292/2243)Resolvingdeltas:14%(315/2243)Resolvingdeltas:15%(337/2243)Resolvingdeltas:16%(359/2243)Resolvingdeltas:17%(382/2243)Resolvingdeltas:18%(404/2243)Resolvingdeltas:19%(427/2243)Resolvingdeltas:20%(449/2243)Resolvingdeltas:21%(472/2243)Resolvingdeltas:22%(494/2243)Resolvingdeltas:23%(516/2243)Resolvingdeltas:24%(539/2243)Resolvingdeltas:25%(561/2243)Resolvingdeltas:26%(584/2243)Resolvingdeltas:27%(606/2243)Resolvingdeltas:28%(629/2243)Resolvingdeltas:29%(651/2243)Resolvingdeltas:30%(673/2243)Resolvingdeltas:31%(696/2243)Resolvingdeltas:32%(718/2243)Resolvingdeltas:33%(741/2243)Resolvingdeltas:34%(763/2243)Resolvingdeltas:35%(786/2243)Resolvingdeltas:36%(808/2243)Resolvingdeltas:37%(830/2243)Resolvingdeltas:38%(853/2243)Resolvingdeltas:39%(875/2243)Resolvingdeltas:40%(898/2243)Resolvingdeltas:41%(920/2243)Resolvingdeltas:42%(943/2243)Resolvingdeltas:43%(965/2243)Resolvingdeltas:44%(987/2243)Resolvingdeltas:45%(1010/2243)Resolvingdeltas:46%(1032/2243)Resolvingdeltas:47%(1055/2243)Resolvingdeltas:48%(1077/2243)Resolvingdeltas:49%(1100/2243)Resolvingdeltas:50%(1122/2243)Resolvingdeltas:51%(1144/2243)Resolvingdeltas:52%(1167/2243)Resolvingdeltas:53%(1189/2243)Resolvingdeltas:54%(1212/2243)Resolvingdeltas:55%(1234/2243)Resolvingdeltas:56%(1257/2243)Resolvingdeltas:57%(1279/2243)Resolvingdeltas:58%(1301/2243)Resolvingdeltas:59%(1324/2243)Resolvingdeltas:60%(1346/2243)Resolvingdeltas:61%(1369/2243)Resolvingdeltas:62%(1391/2243)Resolvingdeltas:63%(1414/2243)Resolvingdeltas:64%(1436/2243)Resolvingdeltas:65%(1458/2243)Resolvingdeltas:66%(1481/2243)Resolvingdeltas:67%(1503/2243)Resolvingdeltas:68%(1526/2243)Resolvingdeltas:69%(1548/2243)Resolvingdeltas:71%(1593/2243)Resolvingdeltas:72%(1615/2243)Resolvingdeltas:73%(1638/2243)Resolvingdeltas:74%(1660/2243)Resolvingdeltas:75%(1683/2243)Resolvingdeltas:76%(1705/2243)Resolvingdeltas:77%(1728/2243)Resolvingdeltas:78%(1750/2243)Resolvingdeltas:79%(1772/2243)Resolvingdeltas:80%(1795/2243)Resolvingdeltas:81%(1817/2243)Resolvingdeltas:82%(1840/2243)Resolvingdeltas:83%(1862/2243)Resolvingdeltas:84%(1885/2243)Resolvingdeltas:85%(1907/2243)Resolvingdeltas:86%(1929/2243)Resolvingdeltas:87%(1952/2243)Resolvingdeltas:88%(1974/2243)Resolvingdeltas:89%(1997/2243)Resolvingdeltas:90%(2019/2243)Resolvingdeltas:91%(2042/2243)Resolvingdeltas:92%(2064/2243)Resolvingdeltas:93%(2086/2243)Resolvingdeltas:94%(2109/2243)Resolvingdeltas:95%(2131/2243)Resolvingdeltas:96%(2154/2243)Resolvingdeltas:97%(2176/2243)Resolvingdeltas:98%(2199/2243)Resolvingdeltas:99%(2221/2243)$cdz$cdzo$m$ma$mak$makeb$makebi$makebin$makebina$makebinar$l$lsb$lsb$lsbi$lsbin$ca$cate$catex$catexa$catexam$catexamp$catexamples/$catexamples/c$catexamples/co$catexamples/con$catexamples/config-$catexamples/config-m$catexamples/config-mi$b$bi$bin$bin/$bin/z$bin/zo$bin/zot-linux-amd64$bin/zot-linux-amd64s$bin/zot-linux-amd64se$bin/zot-linux-amd64ser$bin/zot-linux-amd64serv$bin/zot-linux-amd64servee$bin/zot-linux-amd64serveex$bin/zot-linux-amd64serveexa$bin/zot-linux-amd64serveexamples/$bin/zot-linux-amd64serveexamples/c$bin/zot-linux-amd64serveexamples/co$bin/zot-linux-amd64serveexamples/config-$bin/zot-linux-amd64serveexamples/config-m$bin/zot-linux-amd64serveexamples/config-mi[detachedfrom16230.devto]
\ No newline at end of file
diff --git a/demos/docker-getting-started.rec b/demos/docker-getting-started.rec
index d2c3041d..b84cf07a 100644
--- a/demos/docker-getting-started.rec
+++ b/demos/docker-getting-started.rec
@@ -7,7 +7,7 @@
[1.100585, "o", "docker run -p 5000:5000 ghcr.io/project-zot/zot-linux-amd64:latest"]
[1.442512, "i", "\r"]
[1.44321, "o", "\r\n"]
-[1.863111, "o", "{\"level\":\"info\",\"params\":{\"distSpecVersion\":\"1.0.1\",\"GoVersion\":\"go1.17.5\",\"Commit\":\"v1.4.0-rc2-554e99a967b0e1fcc99eee2ec325e0aeda63d551\",\"BinaryType\":\"extended\",\"AccessControl\":null,\"Storage\":{\"Dedupe\":true,\"GC\":true,\"Commit\":false,\"GCDelay\":3600000000000,\"RootDirectory\":\"/var/lib/registry\",\"StorageDriver\":null,\"SubPaths\":null},\"HTTP\":{\"Address\":\"0.0.0.0\",\"Port\":\"5000\",\"AllowOrigin\":\"\",\"TLS\":null,\"Auth\":null,\"RawAccessControl\":null,\"Realm\":\"\",\"AllowReadAccess\":false,\"ReadOnly\":false,\"Ratelimit\":null},\"Log\":{\"Level\":\"debug\",\"Output\":\"\",\"Audit\":\"\"},\"Extensions\":null},\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:113\",\"time\":\"2022-04-11T06:24:52.513723934Z\",\"message\":\"configuration settings\"}\r\n{\"level\":\"info\",\"cpus\":8,\"max. open files\":1048576,\"listen backlog\":\"4096\",\"max. inotify watches\":\"60023\",\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:101\",\"time\":\"2022-04-11T06:24:52.513883845Z\",\"message\":\"runtime params\"}\r\n"]
+[1.863111, "o", "{\"level\":\"info\",\"params\":{\"distSpecVersion\":\"1.1.1\",\"GoVersion\":\"go1.17.5\",\"Commit\":\"v1.4.0-rc2-554e99a967b0e1fcc99eee2ec325e0aeda63d551\",\"BinaryType\":\"extended\",\"AccessControl\":null,\"Storage\":{\"Dedupe\":true,\"GC\":true,\"Commit\":false,\"GCDelay\":3600000000000,\"RootDirectory\":\"/var/lib/registry\",\"StorageDriver\":null,\"SubPaths\":null},\"HTTP\":{\"Address\":\"0.0.0.0\",\"Port\":\"5000\",\"AllowOrigin\":\"\",\"TLS\":null,\"Auth\":null,\"RawAccessControl\":null,\"Realm\":\"\",\"AllowReadAccess\":false,\"ReadOnly\":false,\"Ratelimit\":null},\"Log\":{\"Level\":\"debug\",\"Output\":\"\",\"Audit\":\"\"},\"Extensions\":null},\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:113\",\"time\":\"2022-04-11T06:24:52.513723934Z\",\"message\":\"configuration settings\"}\r\n{\"level\":\"info\",\"cpus\":8,\"max. open files\":1048576,\"listen backlog\":\"4096\",\"max. inotify watches\":\"60023\",\"goroutine\":1,\"caller\":\"zotregistry.dev/zot/pkg/api/controller.go:101\",\"time\":\"2022-04-11T06:24:52.513883845Z\",\"message\":\"runtime params\"}\r\n"]
[3.289008, "i", "\u0001"]
[3.679271, "i", "d"]
[3.679735, "o", "\u001b[?1l\u001b>\u001b[38;1H\r\n\u001b[?1049l\u001b[23;0;0t"]
diff --git a/demos/docker-getting-started.svg b/demos/docker-getting-started.svg
index 0bd92d3a..ed175803 100644
--- a/demos/docker-getting-started.svg
+++ b/demos/docker-getting-started.svg
@@ -1 +1 @@
-$$dockerrun-p5000:5000ghcr.io/project-zot/zot-linux-amd64:latest{"level":"info","params":{"distSpecVersion":"1.0.1","GoVersion":"go1.17.5","Commit":"v1.4.0-rc2-554e99a967b0e1fcc99eee2ec325e0aeda63d551","BinaryType":"extended","AccessControl":null,"Storage":{"Dedupe":true,"GC":true,"Commit":false,"GCDelay":3600000000000,"RootDirectory":"/var/lib/registry","StorageDriver":null,"SubPaths":null},"HTTP":{"Address":"0.0.0.0","Port":"5000","AllowOrigin":"","TLS":null,"Auth":null,"RawAccessControl":null,"Realm":"","AllowReadAccess":false,"ReadOnly":false,"Ratelimit":null},"Log":{"Level":"debug","Output":"","Audit":""},"Extensions":null},"goroutine":1,"caller":"zotregistry.dev/zot/pkg/api/controller.go:113","time":"2022-04-11T06:24:52.513723934Z","message":"configurationsettings"}{"level":"info","cpus":8,"max.openfiles":1048576,"listenbacklog":"4096","max.inotifywatches":"60023","goroutine":1,"caller":"zotregistry.dev/zot/pkg/api/controller.go:101","time":"2022-04-11T06:24:52.513883845Z","message":"runtimeparams"}[detachedfrom17941.devto]
\ No newline at end of file
+$$dockerrun-p5000:5000ghcr.io/project-zot/zot-linux-amd64:latest{"level":"info","params":{"distSpecVersion":"1.1.1","GoVersion":"go1.17.5","Commit":"v1.4.0-rc2-554e99a967b0e1fcc99eee2ec325e0aeda63d551","BinaryType":"extended","AccessControl":null,"Storage":{"Dedupe":true,"GC":true,"Commit":false,"GCDelay":3600000000000,"RootDirectory":"/var/lib/registry","StorageDriver":null,"SubPaths":null},"HTTP":{"Address":"0.0.0.0","Port":"5000","AllowOrigin":"","TLS":null,"Auth":null,"RawAccessControl":null,"Realm":"","AllowReadAccess":false,"ReadOnly":false,"Ratelimit":null},"Log":{"Level":"debug","Output":"","Audit":""},"Extensions":null},"goroutine":1,"caller":"zotregistry.dev/zot/pkg/api/controller.go:113","time":"2022-04-11T06:24:52.513723934Z","message":"configurationsettings"}{"level":"info","cpus":8,"max.openfiles":1048576,"listenbacklog":"4096","max.inotifywatches":"60023","goroutine":1,"caller":"zotregistry.dev/zot/pkg/api/controller.go:101","time":"2022-04-11T06:24:52.513883845Z","message":"runtimeparams"}[detachedfrom17941.devto]
\ No newline at end of file
diff --git a/examples/config-all-remote.json b/examples/config-all-remote.json
index 0668db85..6fc2afa7 100644
--- a/examples/config-all-remote.json
+++ b/examples/config-all-remote.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"dedupe": true,
"remoteCache": true,
diff --git a/examples/config-allextensions.json b/examples/config-allextensions.json
index 95f1752d..92b77e73 100644
--- a/examples/config-allextensions.json
+++ b/examples/config-allextensions.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-anonymous-authz.json b/examples/config-anonymous-authz.json
index 119d9931..4da4c0de 100644
--- a/examples/config-anonymous-authz.json
+++ b/examples/config-anonymous-authz.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-bearer-auth.json b/examples/config-bearer-auth.json
index 6704ea5f..287c354c 100644
--- a/examples/config-bearer-auth.json
+++ b/examples/config-bearer-auth.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-bench.json b/examples/config-bench.json
index 987e9098..d26ba428 100644
--- a/examples/config-bench.json
+++ b/examples/config-bench.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-boltdb.json b/examples/config-boltdb.json
index 164ab99e..1c0e7ab7 100644
--- a/examples/config-boltdb.json
+++ b/examples/config-boltdb.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true,
diff --git a/examples/config-commit.json b/examples/config-commit.json
index 33134ea2..9918142a 100644
--- a/examples/config-commit.json
+++ b/examples/config-commit.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"commit": true
diff --git a/examples/config-conformance.json b/examples/config-conformance.json
index e7ea90c6..8baaddc7 100644
--- a/examples/config-conformance.json
+++ b/examples/config-conformance.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"gc": true,
diff --git a/examples/config-cve.json b/examples/config-cve.json
index 3b0d728d..1da33692 100644
--- a/examples/config-cve.json
+++ b/examples/config-cve.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-docker-compat.json b/examples/config-docker-compat.json
index ff9a19d6..5ce813c7 100644
--- a/examples/config-docker-compat.json
+++ b/examples/config-docker-compat.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-dynamodb.json b/examples/config-dynamodb.json
index 50499162..7ee7435a 100644
--- a/examples/config-dynamodb.json
+++ b/examples/config-dynamodb.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true,
diff --git a/examples/config-example.json b/examples/config-example.json
index 729c8a38..9a8d22cc 100644
--- a/examples/config-example.json
+++ b/examples/config-example.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-example.yaml b/examples/config-example.yaml
index be0180f1..ff357de5 100644
--- a/examples/config-example.yaml
+++ b/examples/config-example.yaml
@@ -1,4 +1,4 @@
-distspecversion: 1.1.0
+distspecversion: 1.1.1
http:
address: 127.0.0.1
auth:
diff --git a/examples/config-gc-periodic.json b/examples/config-gc-periodic.json
index aaa811f0..06bfe696 100644
--- a/examples/config-gc-periodic.json
+++ b/examples/config-gc-periodic.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"gc": true,
diff --git a/examples/config-gc.json b/examples/config-gc.json
index 7d0a38af..b328b048 100644
--- a/examples/config-gc.json
+++ b/examples/config-gc.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"gc": true,
diff --git a/examples/config-ldap.json b/examples/config-ldap.json
index f649073f..39cea952 100644
--- a/examples/config-ldap.json
+++ b/examples/config-ldap.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-lint.json b/examples/config-lint.json
index f97194de..6ae7a1f1 100644
--- a/examples/config-lint.json
+++ b/examples/config-lint.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-metrics-authz.json b/examples/config-metrics-authz.json
index 96360315..0421de02 100644
--- a/examples/config-metrics-authz.json
+++ b/examples/config-metrics-authz.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-metrics.json b/examples/config-metrics.json
index 5b49b681..27d133d8 100644
--- a/examples/config-metrics.json
+++ b/examples/config-metrics.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-minimal.json b/examples/config-minimal.json
index 6b058798..74231fc0 100644
--- a/examples/config-minimal.json
+++ b/examples/config-minimal.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-multiple-cve.json b/examples/config-multiple-cve.json
index 633c5836..72539f20 100644
--- a/examples/config-multiple-cve.json
+++ b/examples/config-multiple-cve.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true,
diff --git a/examples/config-multiple.json b/examples/config-multiple.json
index 4c2f58fb..5b4e8375 100644
--- a/examples/config-multiple.json
+++ b/examples/config-multiple.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true,
diff --git a/examples/config-openid.json b/examples/config-openid.json
index 9fc70320..8f6ec1a5 100644
--- a/examples/config-openid.json
+++ b/examples/config-openid.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true
diff --git a/examples/config-policy.json b/examples/config-policy.json
index 3a8ce061..bd44d394 100644
--- a/examples/config-policy.json
+++ b/examples/config-policy.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-popular-registries.json b/examples/config-popular-registries.json
index 27498d76..006ebf10 100644
--- a/examples/config-popular-registries.json
+++ b/examples/config-popular-registries.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/data"
},
diff --git a/examples/config-ratelimit.json b/examples/config-ratelimit.json
index 2c78e16f..237a9976 100644
--- a/examples/config-ratelimit.json
+++ b/examples/config-ratelimit.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-redis-all-options.json b/examples/config-redis-all-options.json
index 403cc6ec..a0743b25 100644
--- a/examples/config-redis-all-options.json
+++ b/examples/config-redis-all-options.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"dedupe": true,
"gc": true,
diff --git a/examples/config-redis-cluster.json b/examples/config-redis-cluster.json
index 27349565..6cc2c21f 100644
--- a/examples/config-redis-cluster.json
+++ b/examples/config-redis-cluster.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"dedupe": true,
"gc": true,
diff --git a/examples/config-redis.json b/examples/config-redis.json
index 0e0e5e87..7bd735dd 100644
--- a/examples/config-redis.json
+++ b/examples/config-redis.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"dedupe": true,
"gc": true,
diff --git a/examples/config-retention.json b/examples/config-retention.json
index a195cc87..7d3b8041 100644
--- a/examples/config-retention.json
+++ b/examples/config-retention.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"gc": true,
diff --git a/examples/config-s3.json b/examples/config-s3.json
index dd0168dd..f5bd614a 100644
--- a/examples/config-s3.json
+++ b/examples/config-s3.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true,
diff --git a/examples/config-scheduler.json b/examples/config-scheduler.json
index 8b1abbd4..8cb8bacd 100644
--- a/examples/config-scheduler.json
+++ b/examples/config-scheduler.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-scrub.json b/examples/config-scrub.json
index 8d7e7dd6..fcaa58d8 100644
--- a/examples/config-scrub.json
+++ b/examples/config-scrub.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-search.json b/examples/config-search.json
index 9cfca691..d80faad4 100644
--- a/examples/config-search.json
+++ b/examples/config-search.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-sync-cloud-storage.json b/examples/config-sync-cloud-storage.json
index 3db6d88f..fd7956d1 100644
--- a/examples/config-sync-cloud-storage.json
+++ b/examples/config-sync-cloud-storage.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": true,
diff --git a/examples/config-sync-ecr-credential-helper.json b/examples/config-sync-ecr-credential-helper.json
index aa606bb3..52889426 100644
--- a/examples/config-sync-ecr-credential-helper.json
+++ b/examples/config-sync-ecr-credential-helper.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/examples/config-sync.json b/examples/config-sync.json
index 2ce673df..fbb3e3a6 100644
--- a/examples/config-sync.json
+++ b/examples/config-sync.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-test.json b/examples/config-test.json
index 0e207db7..dab17b12 100644
--- a/examples/config-test.json
+++ b/examples/config-test.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-tls.json b/examples/config-tls.json
index 2d62c864..abd977e9 100644
--- a/examples/config-tls.json
+++ b/examples/config-tls.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/config-ui.json b/examples/config-ui.json
index 5fd1bec2..3f8d486d 100644
--- a/examples/config-ui.json
+++ b/examples/config-ui.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot"
},
diff --git a/examples/metrics/kubernetes/zot-extended/deployment.yaml b/examples/metrics/kubernetes/zot-extended/deployment.yaml
index 0667f2fa..15115a09 100644
--- a/examples/metrics/kubernetes/zot-extended/deployment.yaml
+++ b/examples/metrics/kubernetes/zot-extended/deployment.yaml
@@ -45,7 +45,7 @@ metadata:
data:
zot_config.json: |
{
- "distSpecVersion":"1.0.1",
+ "distSpecVersion":"1.1.1",
"storage": {
"rootDirectory": "/var/lib/registry"
},
@@ -85,7 +85,7 @@ data:
}
zot_minimal.json: |
{
- "distSpecVersion":"1.0.1",
+ "distSpecVersion":"1.1.1",
"storage": {
"rootDirectory": "/var/lib/registry"
},
diff --git a/examples/scale-out-cluster-cloud/config-cluster-member0.json b/examples/scale-out-cluster-cloud/config-cluster-member0.json
index 720549b0..56c609ac 100644
--- a/examples/scale-out-cluster-cloud/config-cluster-member0.json
+++ b/examples/scale-out-cluster-cloud/config-cluster-member0.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/examples/scale-out-cluster-cloud/config-cluster-member1.json b/examples/scale-out-cluster-cloud/config-cluster-member1.json
index 0b4c533d..e6ccabe3 100644
--- a/examples/scale-out-cluster-cloud/config-cluster-member1.json
+++ b/examples/scale-out-cluster-cloud/config-cluster-member1.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/examples/scale-out-cluster-cloud/config-cluster-member2.json b/examples/scale-out-cluster-cloud/config-cluster-member2.json
index 4e1155f3..3d311966 100644
--- a/examples/scale-out-cluster-cloud/config-cluster-member2.json
+++ b/examples/scale-out-cluster-cloud/config-cluster-member2.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/examples/scale-out-cluster-cloud/tls/config-cluster-member0.json b/examples/scale-out-cluster-cloud/tls/config-cluster-member0.json
index 1830ca3d..dbe77668 100644
--- a/examples/scale-out-cluster-cloud/tls/config-cluster-member0.json
+++ b/examples/scale-out-cluster-cloud/tls/config-cluster-member0.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/examples/scale-out-cluster-cloud/tls/config-cluster-member1.json b/examples/scale-out-cluster-cloud/tls/config-cluster-member1.json
index 1b056ed2..f4b3053d 100644
--- a/examples/scale-out-cluster-cloud/tls/config-cluster-member1.json
+++ b/examples/scale-out-cluster-cloud/tls/config-cluster-member1.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/examples/scale-out-cluster-cloud/tls/config-cluster-member2.json b/examples/scale-out-cluster-cloud/tls/config-cluster-member2.json
index 1877bcdc..1738dd74 100644
--- a/examples/scale-out-cluster-cloud/tls/config-cluster-member2.json
+++ b/examples/scale-out-cluster-cloud/tls/config-cluster-member2.json
@@ -1,5 +1,5 @@
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"dedupe": false,
diff --git a/go.mod b/go.mod
index 4f67ed3f..1003f8a0 100644
--- a/go.mod
+++ b/go.mod
@@ -48,15 +48,16 @@ require (
github.com/notaryproject/notation-core-go v1.2.0
github.com/notaryproject/notation-go v1.3.1
github.com/olekukonko/tablewriter v0.0.5
- github.com/opencontainers/distribution-spec/specs-go v0.0.0-20240201174943-0f98d91a0afe
+ github.com/opencontainers/distribution-spec/specs-go v0.0.0-20250123160558-a139cc423184
github.com/opencontainers/go-digest v1.0.0
- github.com/opencontainers/image-spec v1.1.0
+ github.com/opencontainers/image-spec v1.1.1
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5
github.com/project-zot/mockoidc v0.0.0-20240610203808-d69d9e02020a
github.com/prometheus/client_golang v1.20.5
github.com/prometheus/client_model v0.6.1
github.com/redis/go-redis/v9 v9.7.1
github.com/rs/zerolog v1.33.0
+ github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
github.com/sigstore/cosign/v2 v2.4.2
github.com/sigstore/sigstore v1.8.15
github.com/smartystreets/goconvey v1.8.1
@@ -410,7 +411,6 @@ require (
github.com/sagikazarmark/locafero v0.6.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/samber/lo v1.49.0 // indirect
- github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
github.com/sassoftware/go-rpmutils v0.4.0 // indirect
github.com/sassoftware/relic v7.2.1+incompatible // indirect
github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect
diff --git a/go.sum b/go.sum
index 39c01826..828dcd33 100644
--- a/go.sum
+++ b/go.sum
@@ -1777,12 +1777,12 @@ github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
github.com/open-policy-agent/opa v1.1.0 h1:HMz2evdEMTyNqtdLjmu3Vyx06BmhNYAx67Yz3Ll9q2s=
github.com/open-policy-agent/opa v1.1.0/go.mod h1:T1pASQ1/vwfTa+e2fYcfpLCvWgYtqtiUv+IuA/dLPQs=
-github.com/opencontainers/distribution-spec/specs-go v0.0.0-20240201174943-0f98d91a0afe h1:Gu7JiAGBfMlKG7WsuAqqRBJjDGwEg0RU2NvX1za2Pk4=
-github.com/opencontainers/distribution-spec/specs-go v0.0.0-20240201174943-0f98d91a0afe/go.mod h1:Va0IMqkjv62YSEytL4sgxrkiD9IzU0T0bX/ZZEtMnSQ=
+github.com/opencontainers/distribution-spec/specs-go v0.0.0-20250123160558-a139cc423184 h1:4fMydcL7sQjWQPMmzTLpRtsKl5KQdZVNcvPoYwpr4G4=
+github.com/opencontainers/distribution-spec/specs-go v0.0.0-20250123160558-a139cc423184/go.mod h1:Va0IMqkjv62YSEytL4sgxrkiD9IzU0T0bX/ZZEtMnSQ=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
-github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
-github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM=
+github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
+github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk=
github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-tools v0.9.1-0.20241108202711-f7e3563b0271 h1:TPj0pMLCTy1CKwmrat3hqTxoZfqOuTy0asG0ccpGk8Q=
diff --git a/pkg/api/config/redis/redis_test.go b/pkg/api/config/redis/redis_test.go
index 87c0ac04..1d94be02 100644
--- a/pkg/api/config/redis/redis_test.go
+++ b/pkg/api/config/redis/redis_test.go
@@ -301,7 +301,7 @@ func TestRedisOptions(t *testing.T) {
Convey("Test redis options from json", func(c C) {
fileContent := []byte(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"remoteCache": true,
"cacheDriver": {
diff --git a/pkg/api/routes.go b/pkg/api/routes.go
index b92c42d5..ce50b849 100644
--- a/pkg/api/routes.go
+++ b/pkg/api/routes.go
@@ -1,5 +1,5 @@
// @title Open Container Initiative Distribution Specification
-// @version v1.1.0
+// @version v1.1.1
// @description APIs for Open Container Initiative Distribution Specification
// @license.name Apache 2.0
diff --git a/pkg/cli/server/config_reloader_test.go b/pkg/cli/server/config_reloader_test.go
index 167abe46..ec49cea0 100644
--- a/pkg/cli/server/config_reloader_test.go
+++ b/pkg/cli/server/config_reloader_test.go
@@ -37,7 +37,7 @@ func TestConfigReloader(t *testing.T) {
defer os.Remove(logFile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -96,7 +96,7 @@ func TestConfigReloader(t *testing.T) {
test.WaitTillServerReady(baseURL)
content = fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -169,7 +169,7 @@ func TestConfigReloader(t *testing.T) {
defer os.Remove(logFile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"gc": false,
@@ -213,7 +213,7 @@ func TestConfigReloader(t *testing.T) {
test.WaitTillServerReady(baseURL)
content = fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"gc": true,
@@ -276,7 +276,7 @@ func TestConfigReloader(t *testing.T) {
defer os.Remove(logFile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -332,7 +332,7 @@ func TestConfigReloader(t *testing.T) {
test.WaitTillServerReady(baseURL)
content = fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -409,7 +409,7 @@ func TestConfigReloader(t *testing.T) {
defer os.Remove(logFile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -455,7 +455,7 @@ func TestConfigReloader(t *testing.T) {
test.WaitTillServerReady(baseURL)
content = fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -525,7 +525,7 @@ func TestConfigReloader(t *testing.T) {
defer os.Remove(logFile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
diff --git a/pkg/cli/server/extensions_test.go b/pkg/cli/server/extensions_test.go
index 9ffca558..0d27cd18 100644
--- a/pkg/cli/server/extensions_test.go
+++ b/pkg/cli/server/extensions_test.go
@@ -1468,7 +1468,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := `{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"gc": true,
@@ -1537,7 +1537,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := `{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"gc": true,
@@ -1604,7 +1604,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := `{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"gc": true,
@@ -1669,7 +1669,7 @@ func TestOverlappingSyncRetentionConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := `{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"gc": true,
@@ -1743,7 +1743,7 @@ func TestSyncWithRemoteStorageConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := `{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"dedupe": false,
@@ -1812,7 +1812,7 @@ func TestSyncWithRemoteStorageConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"dedupe": false,
@@ -1884,7 +1884,7 @@ func TestSyncWithRemoteStorageConfig(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s",
"subPaths":{
diff --git a/pkg/cli/server/root_test.go b/pkg/cli/server/root_test.go
index 25519c18..d9743b13 100644
--- a/pkg/cli/server/root_test.go
+++ b/pkg/cli/server/root_test.go
@@ -90,7 +90,7 @@ func TestServe(t *testing.T) {
// missing storage config should result in an error in Controller.Init()
content := []byte(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"http": {
"address":"127.0.0.1",
"port":"8080"
@@ -142,7 +142,7 @@ func TestVerify(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot"},
"log":{"level":"debug"}}`)
_, err = tmpfile.Write(content)
@@ -162,7 +162,7 @@ func TestVerify(t *testing.T) {
defer os.Remove(tmpfile.Name()) // clean up
content := []byte(`
-distspecversion: 1.1.0
+distspecversion: 1.1.1
http:
address: 127.0.0.1
port: 8080
@@ -579,7 +579,7 @@ storage:
defer os.Remove(tmpfile.Name()) // clean up
content := []byte(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"gc": true,
@@ -631,7 +631,7 @@ storage:
defer os.Remove(tmpfile.Name()) // clean up
content := []byte(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "/tmp/zot",
"gc": true,
@@ -1196,7 +1196,7 @@ storage:
defer os.Remove(tmpfile.Name()) // clean up
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
"auth":{"openid":{"providers":{"oidc":{"issuer":"http://127.0.0.1:5556/dex"}}}}},
"log":{"level":"debug"}}`)
@@ -1216,7 +1216,7 @@ storage:
defer os.Remove(tmpfile.Name()) // clean up
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
"auth":{"openid":{"providers":{"github":{"clientid":"client_id"}}}}},
"log":{"level":"debug"}}`)
@@ -1236,7 +1236,7 @@ storage:
defer os.Remove(tmpfile.Name()) // clean up
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
"auth":{"openid":{"providers":{"unsupported":{"issuer":"http://127.0.0.1:5556/dex"}}}}},
"log":{"level":"debug"}}`)
@@ -1256,7 +1256,7 @@ storage:
defer os.Remove(tmpfile.Name()) // clean up
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
"auth":{"openid":{"providers":{"oidc":{"issuer":"http://127.0.0.1:5556/dex",
"clientid":"client_id","scopes":["openid"]}}}}},
@@ -1369,7 +1369,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth":{"htpasswd":{"path":"test/data/htpasswd"}, "sessionKeysFile": "%s",
"failDelay": 5 } }, "log": { "level": "debug" } }`,
@@ -1404,7 +1404,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth":{"htpasswd":{"path":"test/data/htpasswd"}, "sessionKeysFile": "%s",
"failDelay": 5 } }, "log": { "level": "debug" } }`,
@@ -1440,7 +1440,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
@@ -1478,7 +1478,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
@@ -1518,7 +1518,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
@@ -1555,7 +1555,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
@@ -1592,7 +1592,7 @@ storage:
err = tmpCredsFile.Close()
So(err, ShouldBeNil)
- content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.0-dev",
+ content = []byte(fmt.Sprintf(`{ "distSpecVersion": "1.1.1",
"storage": { "rootDirectory": "/tmp/zot" }, "http": { "address": "127.0.0.1", "port": "8080",
"auth": { "ldap": { "credentialsFile": "%v", "address": "ldap.example.org", "port": 389,
"startTLS": false, "baseDN": "ou=Users,dc=example,dc=org",
@@ -1621,7 +1621,7 @@ func TestApiKeyConfig(t *testing.T) {
defer os.Remove(tmpfile.Name())
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
"auth":{"openid":{"providers":{"oidc":{"issuer":"http://127.0.0.1:5556/dex",
"clientid":"client_id","scopes":["openid"]}}}}},
@@ -1642,7 +1642,7 @@ func TestApiKeyConfig(t *testing.T) {
defer os.Remove(tmpfile.Name())
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot"},
"log":{"level":"debug"}}`)
@@ -1661,7 +1661,7 @@ func TestApiKeyConfig(t *testing.T) {
defer os.Remove(tmpfile.Name())
- content := []byte(`{"distSpecVersion":"1.1.0","storage":{"rootDirectory":"/tmp/zot"},
+ content := []byte(`{"distSpecVersion":"1.1.1","storage":{"rootDirectory":"/tmp/zot"},
"http":{"address":"127.0.0.1","port":"8080","realm":"zot",
"auth":{"htpasswd":{"path":"test/data/htpasswd"}}},
"log":{"level":"debug"}}`)
diff --git a/pkg/extensions/README_mgmt.md b/pkg/extensions/README_mgmt.md
index 66b460d9..b7f80fb0 100644
--- a/pkg/extensions/README_mgmt.md
+++ b/pkg/extensions/README_mgmt.md
@@ -23,7 +23,7 @@ curl http://localhost:8080/v2/_zot/ext/mgmt | jq
```json
{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"binaryType": "-sync-search-scrub-metrics-lint-ui-mgmt",
"http": {
"auth": {
diff --git a/pkg/extensions/sync/sync_test.go b/pkg/extensions/sync/sync_test.go
index c7f2b423..b6cc0a19 100644
--- a/pkg/extensions/sync/sync_test.go
+++ b/pkg/extensions/sync/sync_test.go
@@ -2058,7 +2058,7 @@ func TestConfigReloader(t *testing.T) {
//nolint: dupl
Convey("Reload config without sync", func() {
- content := fmt.Sprintf(`{"distSpecVersion": "1.1.0", "storage": {"rootDirectory": "%s"},
+ content := fmt.Sprintf(`{"distSpecVersion": "1.1.1", "storage": {"rootDirectory": "%s"},
"http": {"address": "127.0.0.1", "port": "%s"},
"log": {"level": "debug", "output": "%s"}}`, destDir, destPort, logFile.Name())
@@ -2116,7 +2116,7 @@ func TestConfigReloader(t *testing.T) {
// reload config from extensions nil to sync
content = fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
@@ -2176,7 +2176,7 @@ func TestConfigReloader(t *testing.T) {
//nolint: dupl
Convey("Reload bad sync config", func() {
content := fmt.Sprintf(`{
- "distSpecVersion": "1.1.0",
+ "distSpecVersion": "1.1.1",
"storage": {
"rootDirectory": "%s"
},
diff --git a/pkg/storage/common/common.go b/pkg/storage/common/common.go
index 7992ffed..92d4a7bb 100644
--- a/pkg/storage/common/common.go
+++ b/pkg/storage/common/common.go
@@ -18,6 +18,7 @@ import (
"github.com/opencontainers/image-spec/schema"
imeta "github.com/opencontainers/image-spec/specs-go"
ispec "github.com/opencontainers/image-spec/specs-go/v1"
+ "github.com/santhosh-tekuri/jsonschema/v5"
zerr "zotregistry.dev/zot/errors"
zcommon "zotregistry.dev/zot/pkg/common"
@@ -30,7 +31,7 @@ import (
)
const (
- manifestWithEmptyLayersErrMsg = "layers: Array must have at least 1 items"
+ manifestWithEmptyLayersErrMsg = "layers/minItems: minimum 1 items required, but found 0 items"
cosignSignatureTagSuffix = "sig"
)
@@ -848,9 +849,9 @@ func ValidateImageIndexSchema(buf []byte) error {
}
func IsEmptyLayersError(err error) bool {
- var validationErr schema.ValidationError
+ var validationErr *jsonschema.ValidationError
if errors.As(err, &validationErr) {
- if len(validationErr.Errs) == 1 && strings.Contains(err.Error(), manifestWithEmptyLayersErrMsg) {
+ if len(validationErr.Causes) == 1 && strings.Contains(err.Error(), manifestWithEmptyLayersErrMsg) {
return true
} else {
return false
diff --git a/pkg/storage/common/common_test.go b/pkg/storage/common/common_test.go
index b6a57514..f7ec668b 100644
--- a/pkg/storage/common/common_test.go
+++ b/pkg/storage/common/common_test.go
@@ -103,7 +103,7 @@ func TestValidateManifest(t *testing.T) {
So(errors.As(err, &internalErr), ShouldBeTrue)
So(internalErr.GetDetails(), ShouldContainKey, "jsonSchemaValidation")
- So(internalErr.GetDetails()["jsonSchemaValidation"], ShouldEqual, "[schemaVersion: Must be less than or equal to 2]")
+ So(internalErr.GetDetails()["jsonSchemaValidation"], ShouldContainSubstring, "must be <= 2 but found 999")
})
Convey("bad config blob", func() {
@@ -165,6 +165,25 @@ func TestValidateManifest(t *testing.T) {
_, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
So(err, ShouldBeNil)
})
+
+ Convey("manifest with empty layers should not error", func() {
+ manifest := ispec.Manifest{
+ Config: ispec.Descriptor{
+ MediaType: ispec.MediaTypeImageConfig,
+ Digest: cdigest,
+ Size: int64(len(cblob)),
+ },
+ Layers: []ispec.Descriptor{},
+ }
+
+ manifest.SchemaVersion = 2
+
+ body, err := json.Marshal(manifest)
+ So(err, ShouldBeNil)
+
+ _, _, err = imgStore.PutImageManifest("test", "1.0", ispec.MediaTypeImageManifest, body)
+ So(err, ShouldBeNil)
+ })
})
}
diff --git a/swagger/docs.go b/swagger/docs.go
index 95e6089c..72cb6db2 100644
--- a/swagger/docs.go
+++ b/swagger/docs.go
@@ -1440,7 +1440,7 @@ const docTemplate = `{
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
- Version: "v1.1.0",
+ Version: "v1.1.1",
Host: "",
BasePath: "",
Schemes: []string{},
diff --git a/swagger/swagger.json b/swagger/swagger.json
index dee00015..eacb1457 100644
--- a/swagger/swagger.json
+++ b/swagger/swagger.json
@@ -8,7 +8,7 @@
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
- "version": "v1.1.0"
+ "version": "v1.1.1"
},
"paths": {
"/v2/": {
diff --git a/swagger/swagger.yaml b/swagger/swagger.yaml
index 15e46c19..a60d42ff 100644
--- a/swagger/swagger.yaml
+++ b/swagger/swagger.yaml
@@ -245,7 +245,7 @@ info:
name: Apache 2.0
url: http://www.apache.org/licenses/LICENSE-2.0.html
title: Open Container Initiative Distribution Specification
- version: v1.1.0
+ version: v1.1.1
paths:
/v2/:
get:
diff --git a/test/blackbox/annotations.bats b/test/blackbox/annotations.bats
index 55754c07..0cbcf2d5 100644
--- a/test/blackbox/annotations.bats
+++ b/test/blackbox/annotations.bats
@@ -39,7 +39,7 @@ function setup_file() {
echo ${zot_port} > ${BATS_FILE_TMPDIR}/zot.port
cat > ${zot_config_file}<> ${zot_htpasswd_file}
cat > ${zot_config_file}< ${zot_config_file}< ${BATS_FILE_TMPDIR}/zot.port
cat >${zot_config_file} < ${BATS_FILE_TMPDIR}/zot.port
cat >${zot_config_file} <> ${zot_htpasswd_file}
cat > ${zot_config_file}< ${BATS_FILE_TMPDIR}/zot.port
cat > ${zot_config_file}< ${zot_config_file}<> ${zot_htpasswd_file}
cat > ${zot_config_file}<${zot_config_file} <${zot_config_file} < ${BATS_FILE_TMPDIR}/zot.port
cat > ${zot_config_file}< ${BATS_FILE_TMPDIR}/zot.port
cat > ${zot_config_file}< ${zot_config_file}< ${zot_config_file}<${zot_sync_ondemand_config_file} <${zot_sync_ondemand_config_file} < ${BATS_FILE_TMPDIR}/zot.port
cat >${ZOT_CONFIG_FILE} < ${zot_config_file_dedupe}< ${zot_config_file_nodedupe}<${ZOT_CONFIG_FILE} <${zot_sync_per_config_file} <${zot_sync_ondemand_config_file} <${zot_minimal_config_file} <${zot_sync_per_config_file} <${zot_sync_ondemand_config_file} <${zot_minimal_config_file} <${zot_sync_ondemand_config_file} <${zot_sync_per_config_file} <${zot_minimal_config_file} <${zot_sync_one_config_file} <${zot_sync_two_config_file} < ${zot_config_file}<