diff --git a/.gitignore b/.gitignore index 7520b7c..77ae426 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ data/ prism-* tmp .VSCodeCounter/ +.image-digests diff --git a/Makefile b/Makefile index 6c51f06..f6fda73 100644 --- a/Makefile +++ b/Makefile @@ -53,17 +53,23 @@ check-updates: @echo "=== Dockerfile base image updates ===" @for image in $$(grep -E '^FROM ' Dockerfile | awk '{print $$2}' | grep -v 'AS'); do \ echo "Checking $$image..."; \ - current_digest=$$(docker inspect --format='{{index .RepoDigests 0}}' $$image 2>/dev/null | cut -d@ -f2); \ - docker pull -q $$image > /dev/null 2>&1; \ - latest_digest=$$(docker inspect --format='{{index .RepoDigests 0}}' $$image 2>/dev/null | cut -d@ -f2); \ - if [ -z "$$current_digest" ]; then \ - echo " $$image: pulled (no prior local image to compare)"; \ - elif [ "$$current_digest" = "$$latest_digest" ]; then \ + name=$$(echo $$image | cut -d: -f1); \ + tag=$$(echo $$image | cut -d: -f2); \ + digest=$$(curl -sf "https://hub.docker.com/v2/repositories/library/$$name/tags/$$tag" | jq -r '.digest // empty'); \ + if [ -z "$$digest" ]; then \ + echo " $$image: could not fetch digest (offline or image not found)"; \ + continue; \ + fi; \ + cache_key=$$(echo $$image | tr ':/' '--'); \ + stored=$$(grep "^$$cache_key=" .image-digests 2>/dev/null | cut -d= -f2); \ + if [ -z "$$stored" ]; then \ + echo "$$cache_key=$$digest" >> .image-digests; \ + echo " $$image: digest saved for future comparisons"; \ + elif [ "$$stored" = "$$digest" ]; then \ echo " $$image: up to date"; \ else \ - echo " $$image: UPDATE AVAILABLE"; \ - echo " local: $$current_digest"; \ - echo " latest: $$latest_digest"; \ + sed -i "s|^$$cache_key=.*|$$cache_key=$$digest|" .image-digests; \ + echo " $$image: UPDATE AVAILABLE (image content has changed, consider rebuilding)"; \ fi; \ done diff --git a/go.mod b/go.mod index afcc9a5..982ffb9 100644 --- a/go.mod +++ b/go.mod @@ -8,9 +8,9 @@ require ( github.com/go-chi/chi/v5 v5.2.5 github.com/go-chi/httprate v0.15.0 github.com/joho/godotenv v1.5.1 - github.com/mymmrac/telego v1.7.0 + github.com/mymmrac/telego v1.8.0 golang.org/x/crypto v0.49.0 - modernc.org/sqlite v1.48.0 + modernc.org/sqlite v1.48.1 ) require ( diff --git a/go.sum b/go.sum index 72d6dab..48e544c 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,8 @@ github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzh github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mymmrac/telego v1.7.0 h1:yRO/l00tFGG4nY66ufUKb4ARqv7qx9+LsjQv/b0NEyo= -github.com/mymmrac/telego v1.7.0/go.mod h1:pdLV346EgVuq7Xrh3kMggeBiazeHhsdEoK0RTEOPXRM= +github.com/mymmrac/telego v1.8.0 h1:EvIprWo9Cn0MHgumvvqNXPAXO1yJj3pu2cdCCeDxbow= +github.com/mymmrac/telego v1.8.0/go.mod h1:pdLV346EgVuq7Xrh3kMggeBiazeHhsdEoK0RTEOPXRM= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -183,8 +183,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.48.0 h1:ElZyLop3Q2mHYk5IFPPXADejZrlHu7APbpB0sF78bq4= -modernc.org/sqlite v1.48.0/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= +modernc.org/sqlite v1.48.1 h1:S85iToyU6cgeojybE2XJlSbcsvcWkQ6qqNXJHtW5hWA= +modernc.org/sqlite v1.48.1/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=