From a24d161d00e7eff6fb15fec029a7e5173e112880 Mon Sep 17 00:00:00 2001 From: Stefano Natangelo Date: Wed, 4 Nov 2026 14:19:50 +0100 Subject: [PATCH 1/2] packaging: add reproducible Snapcraft build and release workflow --- .github/workflows/snap.yml | 53 ++++++++++++++++++++++++++ packaging/prepare_snap_release.py | 56 ++++++++++++++++++++++++++++ snap/gui/callimachus.desktop | 10 +++++ snap/gui/callimachus.png | Bin 0 -> 55694 bytes snap/snapcraft.yaml | 60 ++++++++++++++++++++++++++++++ 5 files changed, 179 insertions(+) create mode 100644 .github/workflows/snap.yml create mode 100644 packaging/prepare_snap_release.py create mode 100644 snap/gui/callimachus.desktop create mode 100644 snap/gui/callimachus.png create mode 100644 snap/snapcraft.yaml diff --git a/.github/workflows/snap.yml b/.github/workflows/snap.yml new file mode 100644 index 00000000..e4cd37cf --- /dev/null +++ b/.github/workflows/snap.yml @@ -0,0 +1,53 @@ +# Build Callimachus from its checksum-verified, prebuilt Linux release archive. +name: Snap package + +on: + workflow_dispatch: + inputs: + release_tag: + description: Published Callimachus release (e.g. v2.0.2) + type: string + required: true + default: v2.0.2 + release: + types: [published] + +permissions: + contents: read + +jobs: + snap: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - name: Pin the exact GitHub release and Linux asset checksum + env: + CALLIMACHUS_RELEASE_TAG: ${{ github.event.release.tag_name || inputs.release_tag }} + run: python packaging/prepare_snap_release.py "$CALLIMACHUS_RELEASE_TAG" + - name: Build Snap package + id: build + uses: canonical/action-build@3bdaa03e1ba6bf59a65f84a751d943d549a54e79 # v1.3.0 + - name: Retain built package for testing + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: callimachus-snap + path: ${{ steps.build.outputs.snap }} + if-no-files-found: error + - name: Check whether store publishing is configured + id: creds + env: + STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }} + run: | + if [ -n "$STORE_CREDENTIALS" ]; then + echo 'available=true' >> "$GITHUB_OUTPUT" + else + echo 'available=false' >> "$GITHUB_OUTPUT" + fi + - name: Upload to Snap Store edge channel + if: steps.creds.outputs.available == 'true' + uses: canonical/action-publish@214b86e5ca036ead1668c79afb81e550e6c54d40 # v1.2.0 + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }} + with: + snap: ${{ steps.build.outputs.snap }} + release: edge diff --git a/packaging/prepare_snap_release.py b/packaging/prepare_snap_release.py new file mode 100644 index 00000000..a2b74161 --- /dev/null +++ b/packaging/prepare_snap_release.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Pin a Snapcraft build to an immutable, checksummed GitHub release asset.""" +from __future__ import annotations + +import json +import re +import sys +from pathlib import Path +from urllib.parse import quote +from urllib.request import Request, urlopen + + +REPOSITORY = "SNatangelo/Callimachus" +ASSET_NAME = "Callimachus-linux-x64.tar.gz" +SNAPCRAFT_YAML = Path(__file__).resolve().parents[1] / "snap" / "snapcraft.yaml" + + +def replace_once(text: str, pattern: str, replacement: str) -> str: + updated, count = re.subn(pattern, lambda _: replacement, text, flags=re.MULTILINE) + if count != 1: + raise RuntimeError(f"expected exactly one Snapcraft field matching {pattern!r}; got {count}") + return updated + + +def main(tag: str) -> None: + if not re.fullmatch(r"v\d+\.\d+\.\d+", tag): + raise ValueError(f"expected a stable release tag (vMAJOR.MINOR.PATCH), got {tag!r}") + + url = f"https://api.github.com/repos/{REPOSITORY}/releases/tags/{quote(tag)}" + request = Request(url, headers={"Accept": "application/vnd.github+json", "User-Agent": "Callimachus-Snapcraft"}) + with urlopen(request, timeout=30) as response: + release = json.load(response) + if release.get("draft") or release.get("prerelease") or release.get("tag_name") != tag: + raise RuntimeError("the requested tag is not a published stable release") + assets = [asset for asset in release.get("assets", []) if asset.get("name") == ASSET_NAME] + if len(assets) != 1: + raise RuntimeError(f"expected one asset named {ASSET_NAME}; found {len(assets)}") + asset = assets[0] + digest = asset.get("digest", "") + download_url = asset.get("browser_download_url", "") + expected_url = f"https://github.com/{REPOSITORY}/releases/download/{tag}/{ASSET_NAME}" + if not re.fullmatch(r"sha256:[0-9a-f]{64}", digest) or download_url != expected_url: + raise RuntimeError("release asset digest or download URL is missing or inconsistent") + + recipe = SNAPCRAFT_YAML.read_text(encoding="utf-8") + recipe = replace_once(recipe, r"^version: .*$", f"version: '{tag[1:]}'") + recipe = replace_once(recipe, r"^ source: https://github\.com/SNatangelo/Callimachus/releases/download/.*$", f" source: {download_url}") + recipe = replace_once(recipe, r"^ source-checksum: sha256/[0-9a-f]{64}$", f" source-checksum: sha256/{digest[7:]}") + SNAPCRAFT_YAML.write_text(recipe, encoding="utf-8") + print(f"Pinned Snapcraft to {tag}: {digest}") + + +if __name__ == "__main__": + if len(sys.argv) != 2: + raise SystemExit("usage: python packaging/prepare_snap_release.py vX.Y.Z") + main(sys.argv[1]) diff --git a/snap/gui/callimachus.desktop b/snap/gui/callimachus.desktop new file mode 100644 index 00000000..4aef1b07 --- /dev/null +++ b/snap/gui/callimachus.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Type=Application +Name=Callimachus +GenericName=Citation Verifier +Comment=Verify citations and trace source evidence +Exec=callimachus +Icon=${SNAP}/meta/gui/callimachus.png +Terminal=false +Categories=Science;Education;Office; +StartupNotify=true diff --git a/snap/gui/callimachus.png b/snap/gui/callimachus.png new file mode 100644 index 0000000000000000000000000000000000000000..7028b7693658e0ada7fa276a484616930baf8f83 GIT binary patch literal 55694 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�wMHbszNi0zx-jm#fK}f<}?ZYnw`mL%NtiK$dJkK#j zT2Oz?QS1w!`sY4V7Fe;A5tT(ttm^MKIog4iLK12-dEXSu{@$o}-Chy^f@}6w_E8Q7 zl7l(FkpTl|yv-`%X%XKptQLRZ8uYD{%UBZnL>0+;q+L(In;W8aRtXFTW`2WnA+aG! z!iGmoh9B>eH!gn@q^t$34- ziSy?NcIXQTF1$kVCR(1)IUff_CUqMvjfA-{ycfFv5c>5@u`L7WL0n)lc_Ece$hm(QALH6YukdjKwQ_&}mm5nPfGkLPtzT&sQ1B)%{(ch$%Cx4!;aKqUw)Uw9?-1a;KMIln6Qh#i|3ZrbNs5b0L| z9D2r0(UrBN=owB=u0zxeF#35yPAjp0TZKw#b|r$)xBm5Y!zUMB5uqDOEUIN+?M^^% zS~}}sqp0x^3vzs-w9%lb$Dl5-8ti*JAGvG}cD&F6AW9yIp-j%cGT<&hqkS>v7R6QG z_G}OPtC)+ePEP=cm!`XVgm^o+sVXNV7o%9{8T25I$Tr2j07`#jzxVyF61y9^ND(Q$xTHY-ZH!3N_BvG}LDn>o(D^5I&x`NL z&cCIBuFDy{`}=hZRg?>_aMM5p@2!Bg)1Lr+kz;xAsBQlB#5;y)`BPd_nexU1Ql#HH(M zfT7%4IE4V&6kLfiQV~94NEExr<5~{%=J^lh6aC%goL{G+%0q~etSwO$w(9}=+KjvN*LUMksbhCK=0AMhBQ!rH)A`?e^^2BjS#O@N&_WSmg}(< zg^&GhzV5d(egiT*jKr}Z`$$zmETl89z24lx3 ziVF%~jXg6GhW+FHQbzcJjm(1>znHv94Z!%p4|4B0wL-6wDrx_j6WB%~qEw?R_6B?c zyB8pwQZe{Nh6dxdrowPKFvFr#`*eOi4QKP^D>w?l#C@5Jr-w&@8GBsH*RtIJ746wQ zaCh7E%QENem%$S5j&or1B%TKCKU@C|8tNFtsGECJTZ~}8rfi`PX(&Rio)Wj7D$Sp2 z@RbnR!&uO5kO0P3)Q|m+21JGD=Dz5dZatf?m-Q?``8bWf;oGS`3F51tr zb3OjeaY4<(h zFr&L*B|E?Mc@*BTQmNe#q=Q%vS5`h`RC-A|oT=wfyZt;<(Qv<7{^DxL zS5m?SspfO-qGydQsvHLF;0Iig3K_mfDwYd+HF%ALw$Igz6yH-xN?@6RnrT>8Scxdu zX4&z|lEe;Ajuxh&(hF06R+G>Sw` zGv+F|vgfC_rs(gr?h3=$NpjNvWKmvG=j&0q#h1kL5%qFe@Ve`c2C$GM3rVAOM-}9} z>_-rT?w{m0Ql&P$u)xZe=Mid#Fh!aGjRx&nVx=mIuRaqw9uQ(AzVoO`5*5AZa*7>2 zft>RrH4tNBRiqkj`YM zE+&q|p2DdZHA57-flLz;H(NP-+8~!W!gSIGK*%WPK7(RC`s0)SBHX+h0YupnnTx)7 z9mlNO>rGVZ#nqA)JPUcM31F+|s?36)I}W)K?W%qb=D)aOc`$@O@58%Omajn4(#6?t_liSE^~ z#vW3SUI}EY(x~oLk5Yre=C+`q+iFek? zXRcUdvyyeh%8`lU&Yg`HB+vQ0!RPZgZhiCb9|~3+0y8Qija?YNeU#$lra?>ox|30( zXUqh?(7(tttmNaRwC;|8bQ(0UcRp|nXy1W_I*x9Nx0WrW{A>`h%kFsAuu7Vq<-WW% zwMBc?dqzRSREpJn&$C~Li|9v2cu8>cqWy91PDNBhK}P?}*163vh{Vu?Kva|-46V>i z_=-f-p6lA@4->t#qW)TeN5|iJe@%(2;9|?NePY&B=vgJd#2@GaD!SNf1KHuu=6KSh zU-CS=_rF{4@MEHb-5-WbZD^R@$Prv;LLw&DkUp{_vBBf2PhP#5^*@ zzQZSrB^>5J-n>HWjY}%QUrrZ#_TqL?RN~$NVSF&3slBzsKP`+`QC-x26%2=jbHJzf z7}dM_d{FBKM)ns-K~h@%D(e=5Tn;8!UzjPTXS5w$a(n~p`=-xTR@ck)mVV9ydd!?+JRye8LhaL^;w?`P+SJsTJw*)edlcm@Lpk4k#k@8@eK&= zAm*$WdlmQA=j=AHzuz}eQVTpfhYXAIZ#GyO%6kLXyVXbz>6B#Ycj8|tg+8Z9G)2v2 zybV3Q2r2g30-;+oSDvxTgeMWoL;iQ$Tic2h8l)@pZvZ_nK=_(Se?$mZ-%GyzTax>2 zwvH7R!+b-lsWm&V?8wDszC7fGsCBtc?ANg>OsCf`ok(8jf2k|+=_q!wAoSdMBC)d& z`0OkMYTV??yR!U7`4E;aRsRHnt>5!SZ#oBFgqUEs{DI{6snu7bMYR7urvQMjF;b|R znZ2&d%??7OXwnfw%(k8qn@)Qh%XWa6x!Yupds)F|X`}W)%(Nano z`dkqR6{RFn(wdjxAvXZU;VhXt14`M?e3*AFKzcF5RWJ^$FTX1Y)Z(=!{!h^3LeWqy z+jH$=8*&*dY_s(PkH1Y6SJy~oHQ#zffI7?JY)2Z#@raPtP3{35wOf(2zJz370opVQ z@(HsJ>mB#Rp#Q}BD_C{H@-PVlv>U-KUz9d;VzF1+?vF?nkQ`TFZC7iK6pBpO!@ejyW&P65Ajp^8F6#u|JEtQ=Ee&>gQ})yhwIcauN)87_mP=*p>pg^{K=)K?yzQ(^`$OVAFnPNXow zA1_Ep2i49X@Il_PpRHdLe#^ab!0D>}yMezC`L1`-S{@{Zn@7#Zl4mW+TNSIm7eM1o zYXLmveV>#3a2zC%qrYtbn?`baYs-Sc)~h{V4f=LDCq1eb0GI}-4|GqZkXWMcKMC&5H_-89S$<&8~J3FB2op9`vG%L{@*?#I?ZGtX0&H?ZRR$T zt6gHHRKM(4@~v0aq2r8SfpvjyMXz(+(?9%s3vntftekK_p-Z;kx>lkrHS({LhZaepF%Qf2n^w#HW+*IcItd?AsiQkF8}~ zecLpCx)}p*|{1;FvC@Jah^{?61rkZzwUJ1MfZi_|$AW&r1IgSKMv&2PH_w zVvKLS;7SJXcDzCRO7fet7>9FL24H;TNs7sdnk2)J=4XYIXT6gihbJ{`g`d=*SGiWg zhd(3K3Odt=O(1!Bp`r}^66N80-7#UxOgSGaMp3a$u@FX zB21qkmc|U~PLPsK7Huq2au@Hqk?!WG6?nn~?3IQeim`qoT(={R2Xjnl2^6{K z{?~iINQtA~zcu#%>}xr&Ysj!GcEZ-%dQ+KyY(5rqZ9njYf`I2p?hzA z6^2awtUD0@VBP(arN4px{IoTeuR-odnMmcOHW^?e=d^2b-nV?k1N>7AUT%DSJ&@%^ z;fqegjJXxb{)w}l{<1UJ?M^%?`n@c1$s#>qOnN!In&kbeTRpC_j=6Vx#@cxH*2=f- z%v1X0WkQr4_Oi7ena$$ZJ%x?w{Jkid6%4@h8;kyIT=n&B&CGqksTE7`Duk~o*Y$I@ zho%f+7kc4d`( zF8msP_1M>=Qom{(bQ!D`dR@&5*u{6{RlruO&pnM1&Y$=Lox`P$0$1u}rUP%1oBZ8j z{*Fbz=jLyH-JW;ELH=lc@a`IhfUIQREYFbO>p8cqo>q&#nBKjLWxoZ9W#-AMrHogyK03E-jjFlk;Jfs_$d{b!_A2YYNgf5Rk2(Ci{73m;o|C|4 z+_$5vH|>tyf6a=m`ffwlqx}~qzMLPHydqID>+Ae}m#y#DMt|D4TatIh3V)zam|fE6 zmR^0aO*wnHf5IbR5)o(GTFh8m5i?uTeJR6=AAOF0b}=?cO$oXXa5i5es@`QmKl1a*4fE`tib<^cemhQ23t(7bv@7Spe4ZVg?|VNBn;e|4GL^yJ{KxSc-FbfV zm+a5&w24^#LTd5<6>k(Du6Fxu)_?fnl+Q=Pou1s~R4bTp-ypO6_R1NPG`p+SFCI6u zJ+c6$~4 zE~fnR)72@nw6ugnIS)*@^fCX>c4vXB{rv`Yd)#UT8(1&QSiazSmJ564m1h~EzAH0J z8!madn)a;lIIrN`X6QbvoG)m19iNA$!Y38>6K{fyA7#3EGhO_*;?gde1M~g(ggPfI z5>os7e|!0NEnXK#iMHo!uD{z`$)1#|z9cY+gYjarqE_~?KMPua*!u6DonoQ+%r|Js z{oC@+a{bG``P@GL{P?+SxtL$TtLE3=WIg%Y;;s(6`2XwLuV>r)r_Eis_iO&i-#-J? z=Vbrqd)s^SuJx?!=X(F==iLpS_v6md_|V12-o4%ZXV&Id8&}PnCUrY<>)KWAk&o+i z9_QJezdcLb{B+IEdoi(jb(t0a1Q;0@8u$G!mtuGzFASVh1kNQnD1gL(D`Z)K{c1W2 bEC??;svoHsyW Date: Wed, 4 Nov 2026 14:20:52 +0100 Subject: [PATCH 2/2] ci: validate Snap packaging on pull requests --- .github/workflows/snap.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/snap.yml b/.github/workflows/snap.yml index e4cd37cf..7ebdd000 100644 --- a/.github/workflows/snap.yml +++ b/.github/workflows/snap.yml @@ -2,6 +2,11 @@ name: Snap package on: + pull_request: + paths: + - 'snap/**' + - 'packaging/prepare_snap_release.py' + - '.github/workflows/snap.yml' workflow_dispatch: inputs: release_tag: @@ -22,7 +27,7 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Pin the exact GitHub release and Linux asset checksum env: - CALLIMACHUS_RELEASE_TAG: ${{ github.event.release.tag_name || inputs.release_tag }} + CALLIMACHUS_RELEASE_TAG: ${{ github.event.release.tag_name || inputs.release_tag || 'v2.0.2' }} run: python packaging/prepare_snap_release.py "$CALLIMACHUS_RELEASE_TAG" - name: Build Snap package id: build @@ -44,7 +49,7 @@ jobs: echo 'available=false' >> "$GITHUB_OUTPUT" fi - name: Upload to Snap Store edge channel - if: steps.creds.outputs.available == 'true' + if: github.event_name != 'pull_request' && steps.creds.outputs.available == 'true' uses: canonical/action-publish@214b86e5ca036ead1668c79afb81e550e6c54d40 # v1.2.0 env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}