From d2a59ba9a1815e7ef48b4ec39c43b902e2dd2028 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 13:22:23 -0500 Subject: [PATCH 01/64] wip --- .gitignore | 1 + deps.edn | 19 +++++++++++++++++++ project.clj | 11 ++--------- src/ctim/schemas/common.cljc | 10 ++++++++-- 4 files changed, 30 insertions(+), 11 deletions(-) create mode 100644 deps.edn diff --git a/.gitignore b/.gitignore index 3d75c442..8056779a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ pom.xml.asc .lsp/ .dir-locals-2.el .clj-kondo/ +.cpcache diff --git a/deps.edn b/deps.edn new file mode 100644 index 00000000..deb9e930 --- /dev/null +++ b/deps.edn @@ -0,0 +1,19 @@ +{:paths ["src" "doc"] + :deps {org.clojure/clojure {:mvn/version "1.11.3"} + prismatic/schema {:mvn/version "1.2.0"} + com.google.protobuf/protobuf-java {:mvn/version "3.7.1"} ;clj-momo > org.clojure/clojurescript + threatgrid/clj-momo {:mvn/version "0.3.5" + :exclusions [;flanders > threatgrid/clj-momo + metosin/schema-tools]} + org.mozilla/rhino {:mvn/version "1.7.7.1"} ;threatgrid/flanders > kovacnica/clojure.network.ip + threatgrid/flanders {:mvn/version "1.0.2"} + metosin/ring-swagger {:mvn/version "1.0.0"} + org.clojure/test.check {:mvn/version "1.1.1"} + com.gfredericks/test.chuck {:mvn/version "0.2.13"} + prismatic/schema-generators {:mvn/version "0.1.3"} + kovacnica/clojure.network.ip {:mvn/version "0.1.3"}} + :aliases {:dev {:deps {;https://clojure.atlassian.net/browse/CLJS-3047 + com.google.errorprone/error_prone_annotations {:mvn/version "2.1.3"} + ;;https://clojure.atlassian.net/browse/CLJS-3047 + com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} + org.clojure/clojurescript {:mvn/version "1.10.597"}}}}} diff --git a/project.clj b/project.clj index e7644df9..a48266e0 100644 --- a/project.clj +++ b/project.clj @@ -23,14 +23,7 @@ :plugins [[lein-cljsbuild "1.1.7"] [com.google.guava/guava "20.0"] ;resolve internal conflict in `lein-doo` - [lein-doo "0.1.11" :exclusions [org.clojure/clojure]] - ;;uncomment for lein-git-down - #_[reifyhealth/lein-git-down "0.3.5"]] - - ;;uncomment for lein-git-down - ;:middleware [lein-git-down.plugin/inject-properties] - ;:repositories [["public-github" {:url "git://github.com"}] - ; ["private-github" {:url "git://github.com" :protocol :ssh}]] + [lein-doo "0.1.11" :exclusions [org.clojure/clojure]]] :release-tasks [["clean"] ["doc"] @@ -70,7 +63,7 @@ :pretty-print true}}}} :test-selectors {:no-gen #(not (:gen %))} :global-vars {*warn-on-reflection* true} - :profiles {:provided + :profiles {:dev {:dependencies [;https://clojure.atlassian.net/browse/CLJS-3047 [com.google.errorprone/error_prone_annotations "2.1.3"] ;;https://clojure.atlassian.net/browse/CLJS-3047 diff --git a/src/ctim/schemas/common.cljc b/src/ctim/schemas/common.cljc index 54880e34..ab3ee9be 100644 --- a/src/ctim/schemas/common.cljc +++ b/src/ctim/schemas/common.cljc @@ -20,12 +20,18 @@ [flanders.predicates :as fp] [clojure.string :as str])) -(def ctim-schema-version "1.3.27") +(def ctim-schema-version + (let [properties (when-some [f (io/resource "META-INF/maven/threatgrid/ctim/pom.properties")] + (with-open [pom-properties-reader (io/reader f)] + (doto (java.util.Properties.) + (.load pom-properties-reader))))] + (or (get properties "version") + (throw (ex-info "Unable to resolve ctim version" {}))))) (def-eq CTIMSchemaVersion ctim-schema-version) (cs/def ::ctim-schema-version - #(re-matches #"\w+.\w+\.\w+" %)) + #(re-matches #"\d+\.\d+\.\d+(-SNAPSHOT)?" %)) (def SchemaVersion (f/str From bf79d138ab5d45980ba0b1e43a004b4af14a8322 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 15:01:13 -0500 Subject: [PATCH 02/64] wip --- VERSION_TEMPLATE | 1 + build.clj | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ deps.edn | 14 ++++--- project.clj | 5 +-- 4 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 VERSION_TEMPLATE create mode 100644 build.clj diff --git a/VERSION_TEMPLATE b/VERSION_TEMPLATE new file mode 100644 index 00000000..4c5bd636 --- /dev/null +++ b/VERSION_TEMPLATE @@ -0,0 +1 @@ +1.3.GENERATED_VERSION diff --git a/build.clj b/build.clj new file mode 100644 index 00000000..44ceb118 --- /dev/null +++ b/build.clj @@ -0,0 +1,98 @@ +(ns build + (:require [clojure.string :as str] + [clojure.tools.build.api :as b]) + (:import (java.util.regex Pattern))) + +(def lib 'threatgrid/ctim) +;(def version (format "1.2.%s" (b/git-count-revs nil))) +(def class-dir "target/classes") +(def basis (delay (b/create-basis {:project "deps.edn"}))) + +(defn clean [params] + (b/delete {:path "target"})) + +(defn jar [{:keys [version] :as params}] + {:pre [version]} + (clean nil) + (b/write-pom {:class-dir class-dir + :lib lib + :version version + :basis basis + :src-dirs ["src"]}) + (b/copy-dir {:src-dirs ["src" "resources"] + :target-dir class-dir}) + (b/jar {:class-dir class-dir + :jar-file (format "target/%s-%s.jar" (name lib) version)}) + params) + +(defn tag-release [{:keys [version] :as params}] + {:pre [version]} + (b/git-process {:git-args (format "tag %s" version)}) + (b/git-process {:git-args (format "push origin tag %s" version)}) + params) + +(defn deploy-branch? [params] + (= "master" (b/git-process {:git-args (format "branch --show-current")}))) + +(defn version-template [] + (str/trim (slurp "VERSION_TEMPLATE"))) + +(defn split-version-template [] + (let [before+after (str/split (version-template) #"GENERATED_VERSION" -1)] + (assert (= 2 (count before+after))) + before+after)) + +(defn instantiate-version-template [instantiate] + (let [[before after] (split-version-template)] + (str before instantiate after))) + +(defn generated-version [tag] + (let [[before after] (split-version-template) + re (re-pattern (str (Pattern/quote before) + "(.*)" + (Pattern/quote after)))] + (Long/parseLong (peek (re-matches re tag))))) + +(comment + (= 24 (generated-version "1.3.24")) + ) + +(defn prev-release-in-series [] + ;; fails silently + (b/git-process {:git-args (format "fetch --tags")}) + (not-empty + ;; https://stackoverflow.com/questions/3867619/how-to-get-last-git-tag-matching-regex-criteria + (b/git-process {:git-args (format "describe --tags %s --abbrev=0 --match=%s" + "master" + ;; TODO quote + (instantiate-version-template "*"))}))) + +(defn next-version [] + (b/git-process {:git-args (format "fetch tags")}) + (str (instantiate-version-template (or (some-> (prev-release-in-series) + generated-version + inc') + 0)) + (when-not release "-SNAPSHOT"))) + +(comment + (next-version) + ) + +; (b/git-count-revs nil) +(defn infer-version [{:keys [release] :as params}] + (-> params + (update :version #(or % (str (next-version params) (when-not release "-SNAPSHOT")))))) + +(defn build-snapshot [params] + (-> params + (assoc :release false) + infer-version + jar)) + +(defn build-release [params] + (-> params + (assoc :release true) + infer-version + jar) + (tag-release params)) diff --git a/deps.edn b/deps.edn index deb9e930..6a943808 100644 --- a/deps.edn +++ b/deps.edn @@ -12,8 +12,12 @@ com.gfredericks/test.chuck {:mvn/version "0.2.13"} prismatic/schema-generators {:mvn/version "0.1.3"} kovacnica/clojure.network.ip {:mvn/version "0.1.3"}} - :aliases {:dev {:deps {;https://clojure.atlassian.net/browse/CLJS-3047 - com.google.errorprone/error_prone_annotations {:mvn/version "2.1.3"} - ;;https://clojure.atlassian.net/browse/CLJS-3047 - com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} - org.clojure/clojurescript {:mvn/version "1.10.597"}}}}} + :aliases {:dev {:extra-deps {;https://clojure.atlassian.net/browse/CLJS-3047 + com.google.errorprone/error_prone_annotations {:mvn/version "2.1.3"} + ;;https://clojure.atlassian.net/browse/CLJS-3047 + com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} + org.clojure/clojurescript {:mvn/version "1.10.597"}}} + :build {:deps {io.github.clojure/tools.build {:mvn/version "0.9.5"}} + :ns-default build} + :deploy {:replace-deps {slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" + :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}}}} diff --git a/project.clj b/project.clj index a48266e0..75c5c73f 100644 --- a/project.clj +++ b/project.clj @@ -1,8 +1,8 @@ (defproject threatgrid/ctim "1.3.27-SNAPSHOT" :description "Cisco Threat Intelligence Model" - :url "http://github.com/threatgrid/ctim" + :url "https://github.com/threatgrid/ctim" :license {:name "Eclipse Public License" - :url "http://www.eclipse.org/legal/epl-v10.html"} + :url "https://www.eclipse.org/legal/epl-v10.html"} :pedantic? :abort :dependencies [[org.clojure/clojure "1.11.3"] [prismatic/schema "1.2.0"] @@ -18,7 +18,6 @@ [prismatic/schema-generators "0.1.3"] [kovacnica/clojure.network.ip "0.1.3"]] - :uberjar-name "ctim.jar" :resource-paths ["doc"] :plugins [[lein-cljsbuild "1.1.7"] From aab6a2f5f68e3d6568fd0f1bd2dd453efc884d76 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 15:14:15 -0500 Subject: [PATCH 03/64] wip --- build.clj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/build.clj b/build.clj index 44ceb118..fa58f6c6 100644 --- a/build.clj +++ b/build.clj @@ -18,6 +18,14 @@ :lib lib :version version :basis basis + :scm {:connection "scm:git:git://github.com/threatgrid/ctim.git" + :developerConnection "scm:git:git@github.com:threatgrid/ctim.git" + :tag (if (str/ends-with? version "-SNAPSHOT") + (b/git-process {:git-args "rev-parse HEAD"}) + ;; we commit the checksum of the jar to the repo ahead of time to ensure it is reproducible. + ;; so it cannot contain the release SHA. + ;; TODO include command to reproduce jar + version)} :src-dirs ["src"]}) (b/copy-dir {:src-dirs ["src" "resources"] :target-dir class-dir}) From 09f0639bc4ced3bdbc303610d5b3b544ce071e74 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 16:27:52 -0500 Subject: [PATCH 04/64] wip --- build.clj | 81 +++++++++++++++++++++++++++++++++++-------- deps.edn | 6 +++- release-checksums.edn | 1 + 3 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 release-checksums.edn diff --git a/build.clj b/build.clj index fa58f6c6..378e2530 100644 --- a/build.clj +++ b/build.clj @@ -1,6 +1,11 @@ (ns build - (:require [clojure.string :as str] - [clojure.tools.build.api :as b]) + (:require [clojure.edn :as edn] + [clojure.string :as str] + [clojure.tools.build.api :as b] + [clojure.pprint :as pp] + [clojure.java.io :as io] + [clojure.walk :as walk] + [clj-commons.digest :as digest]) (:import (java.util.regex Pattern))) (def lib 'threatgrid/ctim) @@ -18,25 +23,29 @@ :lib lib :version version :basis basis - :scm {:connection "scm:git:git://github.com/threatgrid/ctim.git" + :scm {:url "https://github.com/threatgrid/ctim" + :connection "scm:git:git://github.com/threatgrid/ctim.git" :developerConnection "scm:git:git@github.com:threatgrid/ctim.git" :tag (if (str/ends-with? version "-SNAPSHOT") (b/git-process {:git-args "rev-parse HEAD"}) ;; we commit the checksum of the jar to the repo ahead of time to ensure it is reproducible. ;; so it cannot contain the release SHA. ;; TODO include command to reproduce jar + ;; TODO push sha to maven-metadata.xml version)} + ;;TODO copy from basis :src-dirs ["src"]}) - (b/copy-dir {:src-dirs ["src" "resources"] + (b/copy-dir {;;TODO copy from basis + :src-dirs ["src" "doc"] :target-dir class-dir}) - (b/jar {:class-dir class-dir - :jar-file (format "target/%s-%s.jar" (name lib) version)}) - params) + (let [jar-file (format "target/%s-%s.jar" (name lib) version)] + (b/jar {:class-dir class-dir + :jar-file (format "target/%s-%s.jar" (name lib) version)}) + (assoc params :jar-file jar-file))) (defn tag-release [{:keys [version] :as params}] {:pre [version]} (b/git-process {:git-args (format "tag %s" version)}) - (b/git-process {:git-args (format "push origin tag %s" version)}) params) (defn deploy-branch? [params] @@ -77,11 +86,11 @@ (defn next-version [] (b/git-process {:git-args (format "fetch tags")}) - (str (instantiate-version-template (or (some-> (prev-release-in-series) - generated-version - inc') - 0)) - (when-not release "-SNAPSHOT"))) + (let [next-generated-version (or (some-> (prev-release-in-series) + generated-version + inc') + 0)] + (instantiate-version-template next-generated-version))) (comment (next-version) @@ -99,8 +108,52 @@ jar)) (defn build-release [params] + ;;TODO build docs (-> params (assoc :release true) infer-version - jar) + jar)) + +(defn- serialize [m] + (binding [*print-namespace-maps* false + *print-level* nil + *print-length* nil] + (with-out-str + (pp/pprint + (walk/postwalk + (fn [m] + (cond + (map? m) (into (sorted-map) m) + (set? m) (into (sorted-set) m) + :else m)) + m))))) + +(defn checksums [file] + {;; clojars uses these + :md5 (digest/md5 file) + :sha-1 (digest/sha-1 file) + ;; something stronger + :sha3-512 (digest/sha3-512 file)}) + +(defn update-reproducible-releases [{:keys [version jar-file] :as params}] + (let [cs (checksums (io/file jar-file)) + prev-releases (-> "reproducible-releases.edn" + io/file + slurp + edn/read-string) + new-releases (assoc prev-releases version {:git-tag version + :parent-commit (b/git-process {:git-args "rev-parse master"}) + :reproduction {:command (format "clojure -T:build build-release :version %s" version) + :artifact->checksums {jar-file cs}}})] + (spit "reproducible-releases.edn" (serialize new-releases)))) + +(defn schedule-release [params] + (let [{:keys [version] :as params} (-> params + build-release + update-reproducible-releases)] + ;; TODO gen docs + (b/git-process {:git-args "add ."}) + (b/git-process {:git-args (format "commit -m '[:ctim-release %s]'" version)}))) + +(defn perform-release [params] (tag-release params)) diff --git a/deps.edn b/deps.edn index 6a943808..3a2628d6 100644 --- a/deps.edn +++ b/deps.edn @@ -17,7 +17,11 @@ ;;https://clojure.atlassian.net/browse/CLJS-3047 com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} org.clojure/clojurescript {:mvn/version "1.10.597"}}} - :build {:deps {io.github.clojure/tools.build {:mvn/version "0.9.5"}} + :build {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" + :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} + org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" + :git/tag "Release-1.4.100" + :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} :ns-default build} :deploy {:replace-deps {slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}}}} diff --git a/release-checksums.edn b/release-checksums.edn new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/release-checksums.edn @@ -0,0 +1 @@ +{} From 73af8ba85b712f046251ab2d59c41ec04d17734b Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 16:56:53 -0500 Subject: [PATCH 05/64] wip --- build.clj | 6 ++++-- deps.edn | 3 ++- script/doc | 3 +++ src/ctim/schemas/common.cljc | 11 ++++------- src/ctim/version.clj | 13 +++++++++++++ 5 files changed, 26 insertions(+), 10 deletions(-) create mode 100755 script/doc create mode 100644 src/ctim/version.clj diff --git a/build.clj b/build.clj index 378e2530..d9248d49 100644 --- a/build.clj +++ b/build.clj @@ -102,6 +102,7 @@ (update :version #(or % (str (next-version params) (when-not release "-SNAPSHOT")))))) (defn build-snapshot [params] + ;;TODO regenerate docs (-> params (assoc :release false) infer-version @@ -142,6 +143,7 @@ slurp edn/read-string) new-releases (assoc prev-releases version {:git-tag version + ;; release should be reproducible from parent commit also :parent-commit (b/git-process {:git-args "rev-parse master"}) :reproduction {:command (format "clojure -T:build build-release :version %s" version) :artifact->checksums {jar-file cs}}})] @@ -151,9 +153,9 @@ (let [{:keys [version] :as params} (-> params build-release update-reproducible-releases)] - ;; TODO gen docs + ;; TODO gen docs to next stable version. keep them until the next stable version (b/git-process {:git-args "add ."}) - (b/git-process {:git-args (format "commit -m '[:ctim-release %s]'" version)}))) + (b/git-process {:git-args (format "commit -m '[:ctim-release \"%s\"]'" version)}))) (defn perform-release [params] (tag-release params)) diff --git a/deps.edn b/deps.edn index 3a2628d6..00413788 100644 --- a/deps.edn +++ b/deps.edn @@ -24,4 +24,5 @@ :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} :ns-default build} :deploy {:replace-deps {slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" - :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}}}} + :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}} + :doc {:main-opts ["-m" "ctim.document"]}}} diff --git a/script/doc b/script/doc new file mode 100755 index 00000000..7b514f89 --- /dev/null +++ b/script/doc @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +clojure -M:doc diff --git a/src/ctim/schemas/common.cljc b/src/ctim/schemas/common.cljc index ab3ee9be..d3aaaea7 100644 --- a/src/ctim/schemas/common.cljc +++ b/src/ctim/schemas/common.cljc @@ -1,5 +1,7 @@ (ns ctim.schemas.common (:refer-clojure :exclude [ref uri?]) + #?(:cljs + (:require-macros [ctim.version :refer [ctim-version]])) (:require [clj-momo.lib.clj-time.coerce :refer [to-long]] [clojure.set :refer [map-invert]] #?(:clj [clojure.spec.alpha :as cs] @@ -16,17 +18,12 @@ :cljs [flanders.core :as f :refer-macros [def-map-type def-enum-type def-eq]]) + #?(:clj [ctim.version :refer [ctim-version]]) [flanders.navigation :as fn] [flanders.predicates :as fp] [clojure.string :as str])) -(def ctim-schema-version - (let [properties (when-some [f (io/resource "META-INF/maven/threatgrid/ctim/pom.properties")] - (with-open [pom-properties-reader (io/reader f)] - (doto (java.util.Properties.) - (.load pom-properties-reader))))] - (or (get properties "version") - (throw (ex-info "Unable to resolve ctim version" {}))))) +(def ctim-schema-version (ctim-version)) (def-eq CTIMSchemaVersion ctim-schema-version) diff --git a/src/ctim/version.clj b/src/ctim/version.clj new file mode 100644 index 00000000..8f5cce6f --- /dev/null +++ b/src/ctim/version.clj @@ -0,0 +1,13 @@ +(ns ctim.version + (:require [clojure.java.io :as io])) + +(defmacro ctim-version + "This is a macro to support cljs compile-time inlining of the version string + from the JVM resource." + [] + (let [properties (when-some [f (io/resource "META-INF/maven/threatgrid/ctim/pom.properties")] + (with-open [pom-properties-reader (io/reader f)] + (doto (java.util.Properties.) + (.load pom-properties-reader))))] + (or (get properties "version") + (throw (ex-info "Unable to resolve ctim version" {}))))) From 54bac2eb9e56689b3fc670db85bdb504bee3e928 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 17:06:12 -0500 Subject: [PATCH 06/64] wip --- deps.edn | 6 ++++-- script/doc | 7 ++++++- src/ctim/version.clj | 10 +++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/deps.edn b/deps.edn index 00413788..8daf72e5 100644 --- a/deps.edn +++ b/deps.edn @@ -16,7 +16,8 @@ com.google.errorprone/error_prone_annotations {:mvn/version "2.1.3"} ;;https://clojure.atlassian.net/browse/CLJS-3047 com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} - org.clojure/clojurescript {:mvn/version "1.10.597"}}} + org.clojure/clojurescript {:mvn/version "1.10.597"}} + :jvm-opts ["-Dctim.dev=true"]} :build {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" @@ -25,4 +26,5 @@ :ns-default build} :deploy {:replace-deps {slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}} - :doc {:main-opts ["-m" "ctim.document"]}}} + :doc {:jvm-opts ["-Dctim.dev=true"] + :main-opts ["-m" "ctim.document"]}}} diff --git a/script/doc b/script/doc index 7b514f89..bcf9202d 100755 --- a/script/doc +++ b/script/doc @@ -1,3 +1,8 @@ #!/usr/bin/env bash -clojure -M:doc +if [[ -z "$1" ]]; then + echo "Please supply new version" + exit 1 +fi + +clojure "-J-Dctim.version-override=$1" -M:doc diff --git a/src/ctim/version.clj b/src/ctim/version.clj index 8f5cce6f..60bb11c2 100644 --- a/src/ctim/version.clj +++ b/src/ctim/version.clj @@ -1,5 +1,6 @@ (ns ctim.version - (:require [clojure.java.io :as io])) + (:require [clojure.java.io :as io] + [clojure.string :as str])) (defmacro ctim-version "This is a macro to support cljs compile-time inlining of the version string @@ -10,4 +11,11 @@ (doto (java.util.Properties.) (.load pom-properties-reader))))] (or (get properties "version") + (System/getProperty "ctim.version-override") + (when (= "true" (System/getProperty "ctim.dev")) + (-> "VERSION_TEMPLATE" + slurp + str/trim + (str/replace "GENERATED_VERSION" "999999") + (str "-SNAPSHOT"))) (throw (ex-info "Unable to resolve ctim version" {}))))) From 4b97b4072365c513bdaa4f6bca5aab15f197f0da Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 17:10:42 -0500 Subject: [PATCH 07/64] wip --- script/doc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/doc b/script/doc index bcf9202d..859d2b6e 100755 --- a/script/doc +++ b/script/doc @@ -1,7 +1,7 @@ #!/usr/bin/env bash if [[ -z "$1" ]]; then - echo "Please supply new version" + echo "Please supply new version: ./script/doc 1.2.3" exit 1 fi From cfe5b3359fd08587cbf455908031643845ce548c Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 17:55:21 -0500 Subject: [PATCH 08/64] wip --- build.clj | 3 ++- deps.edn | 10 +++++----- dev/ctim/update_version.clj | 11 +++++++++++ resources/ctim/version.edn | 8 ++++++++ src/ctim/schemas/common.cljc | 2 +- src/ctim/version.clj | 28 +++++++++++++--------------- 6 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 dev/ctim/update_version.clj create mode 100644 resources/ctim/version.edn diff --git a/build.clj b/build.clj index d9248d49..377a5e96 100644 --- a/build.clj +++ b/build.clj @@ -5,6 +5,7 @@ [clojure.pprint :as pp] [clojure.java.io :as io] [clojure.walk :as walk] + [clojure.java.shell :as sh] [clj-commons.digest :as digest]) (:import (java.util.regex Pattern))) @@ -102,7 +103,7 @@ (update :version #(or % (str (next-version params) (when-not release "-SNAPSHOT")))))) (defn build-snapshot [params] - ;;TODO regenerate docs + ;; don't regenerate docs for snapshot (-> params (assoc :release false) infer-version diff --git a/deps.edn b/deps.edn index 8daf72e5..a87fd036 100644 --- a/deps.edn +++ b/deps.edn @@ -12,12 +12,12 @@ com.gfredericks/test.chuck {:mvn/version "0.2.13"} prismatic/schema-generators {:mvn/version "0.1.3"} kovacnica/clojure.network.ip {:mvn/version "0.1.3"}} - :aliases {:dev {:extra-deps {;https://clojure.atlassian.net/browse/CLJS-3047 + :aliases {:dev {:extra-paths ["dev"] + :extra-deps {;https://clojure.atlassian.net/browse/CLJS-3047 com.google.errorprone/error_prone_annotations {:mvn/version "2.1.3"} ;;https://clojure.atlassian.net/browse/CLJS-3047 com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} - org.clojure/clojurescript {:mvn/version "1.10.597"}} - :jvm-opts ["-Dctim.dev=true"]} + org.clojure/clojurescript {:mvn/version "1.10.597"}}} :build {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" @@ -26,5 +26,5 @@ :ns-default build} :deploy {:replace-deps {slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}} - :doc {:jvm-opts ["-Dctim.dev=true"] - :main-opts ["-m" "ctim.document"]}}} + :update-version {:main-opts ["-m" "ctim.update-version"]} + :doc {:main-opts ["-m" "ctim.document"]}}} diff --git a/dev/ctim/update_version.clj b/dev/ctim/update_version.clj new file mode 100644 index 00000000..803e545a --- /dev/null +++ b/dev/ctim/update_version.clj @@ -0,0 +1,11 @@ +(ns ctim.update-version + (:require [ctim.version :refer [ctim-version]])) + +(defn -main [] + (let [{:keys [release-version dev-version]} (parse-ctim-version) + _ (println (format "Next release version: [%s]" next-version)) + release-version (or (not-empty (read-line)) + ) + _ (assert (re-matches))] + + )) diff --git a/resources/ctim/version.edn b/resources/ctim/version.edn new file mode 100644 index 00000000..dbdabea8 --- /dev/null +++ b/resources/ctim/version.edn @@ -0,0 +1,8 @@ +{;; the release version to deploy. only set this in the commit that will trigger the deploy. + :release-version "1.3.26" + ;; set to :release-version or :dev-version to inherit those values, + ;; otherwise, set to string. + ;; should be set to :release-version for releases. + :ctim-schema-version :release-version + ;; the SNAPSHOT version to use for future deploys. + :dev-version "1.3.27"} diff --git a/src/ctim/schemas/common.cljc b/src/ctim/schemas/common.cljc index d3aaaea7..9bb402bc 100644 --- a/src/ctim/schemas/common.cljc +++ b/src/ctim/schemas/common.cljc @@ -28,7 +28,7 @@ (def-eq CTIMSchemaVersion ctim-schema-version) (cs/def ::ctim-schema-version - #(re-matches #"\d+\.\d+\.\d+(-SNAPSHOT)?" %)) + #(re-matches #"\d+\.\d+\.\d+" %)) (def SchemaVersion (f/str diff --git a/src/ctim/version.clj b/src/ctim/version.clj index 60bb11c2..2859ea9c 100644 --- a/src/ctim/version.clj +++ b/src/ctim/version.clj @@ -1,21 +1,19 @@ (ns ctim.version - (:require [clojure.java.io :as io] - [clojure.string :as str])) + (:require [clojure.edn :as edn] + [clojure.java.io :as io])) + +(defn parse-ctim-version [] + (let [m (-> (io/resource "ctim/version.edn") + slurp + edn/read-string)] + (update m :ctim-schema-version #(if (keyword? %) + (get m %) + %)))) (defmacro ctim-version "This is a macro to support cljs compile-time inlining of the version string from the JVM resource." [] - (let [properties (when-some [f (io/resource "META-INF/maven/threatgrid/ctim/pom.properties")] - (with-open [pom-properties-reader (io/reader f)] - (doto (java.util.Properties.) - (.load pom-properties-reader))))] - (or (get properties "version") - (System/getProperty "ctim.version-override") - (when (= "true" (System/getProperty "ctim.dev")) - (-> "VERSION_TEMPLATE" - slurp - str/trim - (str/replace "GENERATED_VERSION" "999999") - (str "-SNAPSHOT"))) - (throw (ex-info "Unable to resolve ctim version" {}))))) + (-> (parse-ctim-version) + :ctim-schema-version + (throw (ex-info "Unable to resolve ctim version" {})))) From d8e2560b56ce3f75c3d8e25830bcfd40f5646ab8 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 17:58:29 -0500 Subject: [PATCH 09/64] wip --- resources/ctim/version.edn | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/ctim/version.edn b/resources/ctim/version.edn index dbdabea8..96ffc500 100644 --- a/resources/ctim/version.edn +++ b/resources/ctim/version.edn @@ -1,8 +1,8 @@ -{;; the release version to deploy. only set this in the commit that will trigger the deploy. +{;; the next release version to deploy. ideally deployed immediately after setting. :release-version "1.3.26" ;; set to :release-version or :dev-version to inherit those values, - ;; otherwise, set to string. - ;; should be set to :release-version for releases. + ;; otherwise, set to arbitrary string. + ;; should not be set to :dev-version for releases. :ctim-schema-version :release-version - ;; the SNAPSHOT version to use for future deploys. + ;; the SNAPSHOT version to use :dev-version "1.3.27"} From 99ba80b7d282827ad237c6eb10f027812fe78907 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 18:01:45 -0500 Subject: [PATCH 10/64] wip --- deps.edn | 2 +- script/doc | 8 ++------ src/ctim/version.clj | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/deps.edn b/deps.edn index a87fd036..56209c2e 100644 --- a/deps.edn +++ b/deps.edn @@ -1,4 +1,4 @@ -{:paths ["src" "doc"] +{:paths ["src" "doc" "resources"] :deps {org.clojure/clojure {:mvn/version "1.11.3"} prismatic/schema {:mvn/version "1.2.0"} com.google.protobuf/protobuf-java {:mvn/version "3.7.1"} ;clj-momo > org.clojure/clojurescript diff --git a/script/doc b/script/doc index 859d2b6e..4d3034a0 100755 --- a/script/doc +++ b/script/doc @@ -1,8 +1,4 @@ #!/usr/bin/env bash +# Generate docs for the current ctim-schema-version. -if [[ -z "$1" ]]; then - echo "Please supply new version: ./script/doc 1.2.3" - exit 1 -fi - -clojure "-J-Dctim.version-override=$1" -M:doc +clojure -M:doc diff --git a/src/ctim/version.clj b/src/ctim/version.clj index 2859ea9c..2af1b389 100644 --- a/src/ctim/version.clj +++ b/src/ctim/version.clj @@ -16,4 +16,4 @@ [] (-> (parse-ctim-version) :ctim-schema-version - (throw (ex-info "Unable to resolve ctim version" {})))) + (or (throw (ex-info "Unable to resolve ctim version" {}))))) From 2a81d8162c8a1a63652f227206c9b57078bcd634 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 18:02:14 -0500 Subject: [PATCH 11/64] wip --- script/doc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/doc b/script/doc index 4d3034a0..93f8989f 100755 --- a/script/doc +++ b/script/doc @@ -1,4 +1,4 @@ #!/usr/bin/env bash -# Generate docs for the current ctim-schema-version. +# Generate docs for the latest stable ctim-schema-version. clojure -M:doc From 073dff7261a0bf6717a0063f224628fc9027d721 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Tue, 10 Jun 2025 18:05:28 -0500 Subject: [PATCH 12/64] wip --- resources/ctim/version.edn | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/ctim/version.edn b/resources/ctim/version.edn index 96ffc500..12b95092 100644 --- a/resources/ctim/version.edn +++ b/resources/ctim/version.edn @@ -1,8 +1,8 @@ -{;; the next release version to deploy. ideally deployed immediately after setting. +{;; the next release version to deploy and document. ideally deployed immediately after setting. :release-version "1.3.26" + ;; the SNAPSHOT version to use. assume :release-version has already been released. + :dev-version "1.3.27" ;; set to :release-version or :dev-version to inherit those values, - ;; otherwise, set to arbitrary string. + ;; otherwise, set to arbitrary string if out-of-sync with both. ;; should not be set to :dev-version for releases. - :ctim-schema-version :release-version - ;; the SNAPSHOT version to use - :dev-version "1.3.27"} + :ctim-schema-version :release-version} From 3399a184da4195f88d3a6f25a579a44e2558e11c Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:00:11 -0500 Subject: [PATCH 13/64] wip --- deploy.clj | 40 +++++++++++++++++++++++++++++++++++++ deps.edn | 10 +++++++--- dev/ctim/prep_release.clj | 15 ++++++++++++++ dev/ctim/print_version.clj | 5 +++++ dev/ctim/update_version.clj | 11 ---------- project.clj | 2 +- resources/ctim/version.edn | 9 +-------- script/prep-release | 3 +++ src/ctim/version.clj | 20 +++++++++---------- 9 files changed, 81 insertions(+), 34 deletions(-) create mode 100644 deploy.clj create mode 100644 dev/ctim/prep_release.clj create mode 100644 dev/ctim/print_version.clj delete mode 100644 dev/ctim/update_version.clj create mode 100755 script/prep-release diff --git a/deploy.clj b/deploy.clj new file mode 100644 index 00000000..aecfcf29 --- /dev/null +++ b/deploy.clj @@ -0,0 +1,40 @@ +(ns deploy + (:require [clojure.tools.build.api :as b] + [clojure.java.io :as io] + [deps-deploy.deps-deploy :as deploy]) + (:import (java.util.jar JarFile))) + +(defn- tag-release [{:keys [version] :as params}] + {:pre [version]} + (b/git-process {:git-args (format "tag %s" version)}) + (b/git-process {:git-args (format "push tag %s" version)}) + params) + +(defn- deploy* [{:keys [jar-file pom-file] :as params}] + (deploy/deploy + {:installer :remote + :sign-releases? false + :artifact (str jar-file) + :pom-file pom-file}) + params) + +(defn extract-pom [{:keys [jar-file] :as params}] + (assert jar-file "Must supply :jar-file") + (let [pom-file "pom.xml" + jf (JarFile. (io/file (str jar-file)))] + (spit pom-file + (slurp (.getInputStream jf (.getEntry jf "META-INF/maven/threatgrid/ctim/pom.xml")))) + (assoc params :pom-file pom-file))) + +(defn- infer-version [{:keys []}]) + +(defn deploy-snapshot [params] + (-> params + extract-pom + deploy*)) + +(defn deploy-release [params] + (-> params + extract-pom + tag-release + deploy*)) diff --git a/deps.edn b/deps.edn index 56209c2e..7cd6fd9a 100644 --- a/deps.edn +++ b/deps.edn @@ -24,7 +24,11 @@ :git/tag "Release-1.4.100" :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} :ns-default build} - :deploy {:replace-deps {slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" - :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}}} - :update-version {:main-opts ["-m" "ctim.update-version"]} + :deploy {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" + :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} + slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" + :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}} + :ns-default deploy} + :print-version {:main-opts ["-m" "ctim.print-version"]} + :prep-release {:main-opts ["-m" "ctim.prep-release"]} :doc {:main-opts ["-m" "ctim.document"]}}} diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj new file mode 100644 index 00000000..fc2e8561 --- /dev/null +++ b/dev/ctim/prep_release.clj @@ -0,0 +1,15 @@ +(ns ctim.prep-release + (:require [ctim.version :refer [-ctim-version]] + [clojure.java.shell :as sh])) + +(defn -main [] + (loop [prev-version nil + version (-ctim-version)] + (if (= prev-version version) + (do (sh/sh ["git" "add" "resources/ctim/version.edn"]) + (sh/sh ["git" "commit" "-m" (format "[release ctim] " version)])) + (do (println (str "Preparing to release " (-ctim-version))) + (println (str "If this is ok, press enter. Otherwise please update `resources/ctim/version.edn` before pressing enter.")) + (read-line) + (recur version + (-ctim-version)))))) diff --git a/dev/ctim/print_version.clj b/dev/ctim/print_version.clj new file mode 100644 index 00000000..ec23bfaa --- /dev/null +++ b/dev/ctim/print_version.clj @@ -0,0 +1,5 @@ +(ns ctim.print-version + (:require [ctim.version :refer [-ctim-version]])) + +(defn -main [] + (print (-ctim-version))) diff --git a/dev/ctim/update_version.clj b/dev/ctim/update_version.clj deleted file mode 100644 index 803e545a..00000000 --- a/dev/ctim/update_version.clj +++ /dev/null @@ -1,11 +0,0 @@ -(ns ctim.update-version - (:require [ctim.version :refer [ctim-version]])) - -(defn -main [] - (let [{:keys [release-version dev-version]} (parse-ctim-version) - _ (println (format "Next release version: [%s]" next-version)) - release-version (or (not-empty (read-line)) - ) - _ (assert (re-matches))] - - )) diff --git a/project.clj b/project.clj index 75c5c73f..866610f6 100644 --- a/project.clj +++ b/project.clj @@ -18,7 +18,7 @@ [prismatic/schema-generators "0.1.3"] [kovacnica/clojure.network.ip "0.1.3"]] - :resource-paths ["doc"] + :resource-paths ["resources" "doc"] :plugins [[lein-cljsbuild "1.1.7"] [com.google.guava/guava "20.0"] ;resolve internal conflict in `lein-doo` diff --git a/resources/ctim/version.edn b/resources/ctim/version.edn index 12b95092..9b0e580e 100644 --- a/resources/ctim/version.edn +++ b/resources/ctim/version.edn @@ -1,8 +1 @@ -{;; the next release version to deploy and document. ideally deployed immediately after setting. - :release-version "1.3.26" - ;; the SNAPSHOT version to use. assume :release-version has already been released. - :dev-version "1.3.27" - ;; set to :release-version or :dev-version to inherit those values, - ;; otherwise, set to arbitrary string if out-of-sync with both. - ;; should not be set to :dev-version for releases. - :ctim-schema-version :release-version} +{:template "1.3.PATCH", :patch 26} diff --git a/script/prep-release b/script/prep-release new file mode 100755 index 00000000..d4edf8d2 --- /dev/null +++ b/script/prep-release @@ -0,0 +1,3 @@ +#!/bin/bash + +clojure -M -m ctim.version/-ctim-version diff --git a/src/ctim/version.clj b/src/ctim/version.clj index 2af1b389..8ea0c6cf 100644 --- a/src/ctim/version.clj +++ b/src/ctim/version.clj @@ -1,19 +1,17 @@ (ns ctim.version (:require [clojure.edn :as edn] - [clojure.java.io :as io])) + [clojure.java.io :as io] + [clojure.string :as str])) -(defn parse-ctim-version [] - (let [m (-> (io/resource "ctim/version.edn") - slurp - edn/read-string)] - (update m :ctim-schema-version #(if (keyword? %) - (get m %) - %)))) +(defn -ctim-version [] + (let [{:keys [template patch] :as m} + (-> (io/resource "ctim/version.edn") + slurp + edn/read-string)] + (str/replace template "PATCH" (str patch)))) (defmacro ctim-version "This is a macro to support cljs compile-time inlining of the version string from the JVM resource." [] - (-> (parse-ctim-version) - :ctim-schema-version - (or (throw (ex-info "Unable to resolve ctim version" {}))))) + (-ctim-version)) From 85fefa79d9d02c20765730258e12e123d15cb7cf Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:07:24 -0500 Subject: [PATCH 14/64] wip --- dev/ctim/prep_release.clj | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index fc2e8561..9cb35d8f 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -2,12 +2,28 @@ (:require [ctim.version :refer [-ctim-version]] [clojure.java.shell :as sh])) +(defn- sh [& args] + (let [{:keys [exit out err]} (apply sh/sh args)] + (println out) + (println err) + (assert (zero? exit)))) + +(defn assert-clean [] + (let [{:keys [out exit]} (sh/sh "git" "status" "--short")] + (assert (zero? exit)) + (println out) + (when (seq out) + (println "Working directory is not clean, exiting") + (System/exit 1)))) + (defn -main [] + (assert-clean) (loop [prev-version nil version (-ctim-version)] (if (= prev-version version) - (do (sh/sh ["git" "add" "resources/ctim/version.edn"]) - (sh/sh ["git" "commit" "-m" (format "[release ctim] " version)])) + (do (sh ["git" "add" "resources/ctim/version.edn"]) + (sh ["git" "commit" "-m" (format "[release ctim] " version)]) + (System/exit 0)) (do (println (str "Preparing to release " (-ctim-version))) (println (str "If this is ok, press enter. Otherwise please update `resources/ctim/version.edn` before pressing enter.")) (read-line) From 5555b5ff78e1e9ca5fb84cb7553985d002746261 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:08:05 -0500 Subject: [PATCH 15/64] wip --- dev/ctim/prep_release.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 9cb35d8f..1c2c8795 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -4,8 +4,8 @@ (defn- sh [& args] (let [{:keys [exit out err]} (apply sh/sh args)] - (println out) - (println err) + (some-> (not-empty out) print) + (some-> (not-empty err) not-empty print) (assert (zero? exit)))) (defn assert-clean [] From 3923382ca593ad1a22299322f4267615eda44b12 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:08:37 -0500 Subject: [PATCH 16/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 1c2c8795..9b99e283 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -11,8 +11,8 @@ (defn assert-clean [] (let [{:keys [out exit]} (sh/sh "git" "status" "--short")] (assert (zero? exit)) - (println out) (when (seq out) + (println out) (println "Working directory is not clean, exiting") (System/exit 1)))) From 2a82afc51e8a8d388eb1940e3c70d8f8e2ced2cd Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:08:57 -0500 Subject: [PATCH 17/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 9b99e283..5a241f24 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -13,7 +13,7 @@ (assert (zero? exit)) (when (seq out) (println out) - (println "Working directory is not clean, exiting") + (println "Working directory is not clean, please commit changes first.") (System/exit 1)))) (defn -main [] From dad8a91103ae8801149002e960800910aab4c444 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:10:01 -0500 Subject: [PATCH 18/64] wip --- dev/ctim/prep_release.clj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 5a241f24..41c1ce14 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -24,8 +24,7 @@ (do (sh ["git" "add" "resources/ctim/version.edn"]) (sh ["git" "commit" "-m" (format "[release ctim] " version)]) (System/exit 0)) - (do (println (str "Preparing to release " (-ctim-version))) - (println (str "If this is ok, press enter. Otherwise please update `resources/ctim/version.edn` before pressing enter.")) + (do (println (str "To release " (-ctim-version) " press enter. To customize, first update `resources/ctim/version.edn`.")) (read-line) (recur version (-ctim-version)))))) From 4c2693f6653818b9a1ce33b30f6c9bc013c467f2 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:11:19 -0500 Subject: [PATCH 19/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 41c1ce14..4f9825fa 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -24,7 +24,7 @@ (do (sh ["git" "add" "resources/ctim/version.edn"]) (sh ["git" "commit" "-m" (format "[release ctim] " version)]) (System/exit 0)) - (do (println (str "To release " (-ctim-version) " press enter. To customize, first update `resources/ctim/version.edn`.")) + (do (println (str "Press enter to prepare release " (-ctim-version) ". To customize, update `resources/ctim/version.edn`, then press enter for another confirmation prompt.")) (read-line) (recur version (-ctim-version)))))) From 5e27eca8356428dc963ea3a0af067730dfc399ae Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:11:39 -0500 Subject: [PATCH 20/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 4f9825fa..3cfa44f3 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -24,7 +24,7 @@ (do (sh ["git" "add" "resources/ctim/version.edn"]) (sh ["git" "commit" "-m" (format "[release ctim] " version)]) (System/exit 0)) - (do (println (str "Press enter to prepare release " (-ctim-version) ". To customize, update `resources/ctim/version.edn`, then press enter for another confirmation prompt.")) + (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter for another confirmation prompt.")) (read-line) (recur version (-ctim-version)))))) From c60f985c7ec69359e3170f826d91ceb6ce6703e3 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:13:36 -0500 Subject: [PATCH 21/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 3cfa44f3..c45d067e 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -24,7 +24,7 @@ (do (sh ["git" "add" "resources/ctim/version.edn"]) (sh ["git" "commit" "-m" (format "[release ctim] " version)]) (System/exit 0)) - (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter for another confirmation prompt.")) + (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) (read-line) (recur version (-ctim-version)))))) From 232f124997d071eb7e5ca956806f67afef3fac9f Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:14:36 -0500 Subject: [PATCH 22/64] wip --- dev/ctim/prep_release.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index c45d067e..d9484548 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -21,8 +21,8 @@ (loop [prev-version nil version (-ctim-version)] (if (= prev-version version) - (do (sh ["git" "add" "resources/ctim/version.edn"]) - (sh ["git" "commit" "-m" (format "[release ctim] " version)]) + (do (sh "git" "add" "resources/ctim/version.edn") + (sh "git" "commit" "-m" (format "[release ctim] " version)) (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) (read-line) From 528d6eacef547e81fb65264daf0e6333316050d4 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:14:51 -0500 Subject: [PATCH 23/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index d9484548..9ddc3cb7 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -22,7 +22,7 @@ version (-ctim-version)] (if (= prev-version version) (do (sh "git" "add" "resources/ctim/version.edn") - (sh "git" "commit" "-m" (format "[release ctim] " version)) + (sh "git" "commit" "--allow-empty" "-m" (format "[release ctim] " version)) (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) (read-line) From 561fffbf6d721c724f32bb2980ae50b95edcb18e Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:14:56 -0500 Subject: [PATCH 24/64] [release ctim] From 5725be8e934011ccccb098694dfb2e9bca0c6a4a Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:16:13 -0500 Subject: [PATCH 25/64] wip --- dev/ctim/prep_release.clj | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 9ddc3cb7..4459cb62 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -1,11 +1,12 @@ (ns ctim.prep-release (:require [ctim.version :refer [-ctim-version]] - [clojure.java.shell :as sh])) + [clojure.java.shell :as sh] + [clojure.string :as str])) (defn- sh [& args] (let [{:keys [exit out err]} (apply sh/sh args)] - (some-> (not-empty out) print) - (some-> (not-empty err) not-empty print) + (some-> out str/trim not-empty println) + (some-> err str/trim not-empty println) (assert (zero? exit)))) (defn assert-clean [] @@ -23,6 +24,7 @@ (if (= prev-version version) (do (sh "git" "add" "resources/ctim/version.edn") (sh "git" "commit" "--allow-empty" "-m" (format "[release ctim] " version)) + (println "New commit") (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) (read-line) From 3d4a57af6d2d35c5c84f2870e5b695d9df3ee719 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:16:16 -0500 Subject: [PATCH 26/64] [release ctim] From d2a1474febb482c2945b72e3a3fcdd78a1196ebb Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:16:50 -0500 Subject: [PATCH 27/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 4459cb62..27d32868 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -23,7 +23,7 @@ version (-ctim-version)] (if (= prev-version version) (do (sh "git" "add" "resources/ctim/version.edn") - (sh "git" "commit" "--allow-empty" "-m" (format "[release ctim] " version)) + (sh "git" "commit" "--allow-empty" "-m" (format "[release ctim] %s" version)) (println "New commit") (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) From 6d36a6431168c2d8de9eea91ba946eb55179d15e Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:16:57 -0500 Subject: [PATCH 28/64] [release ctim] 1.3.26 From 2c1877a4c6110c6b07e6423c9bb9f124f35bf7e2 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:17:04 -0500 Subject: [PATCH 29/64] wip --- dev/ctim/prep_release.clj | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 27d32868..f65be78f 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -24,7 +24,6 @@ (if (= prev-version version) (do (sh "git" "add" "resources/ctim/version.edn") (sh "git" "commit" "--allow-empty" "-m" (format "[release ctim] %s" version)) - (println "New commit") (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) (read-line) From c19d54d07df13bcdbc6b8fdc9fa68179dde87b8d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:17:12 -0500 Subject: [PATCH 30/64] [release ctim] 1.3.26 From 60b8b35418ee39a6da3a56cbe0e362a785779165 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:17:45 -0500 Subject: [PATCH 31/64] wip --- dev/ctim/prep_release.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index f65be78f..251ef3a5 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -23,7 +23,7 @@ version (-ctim-version)] (if (= prev-version version) (do (sh "git" "add" "resources/ctim/version.edn") - (sh "git" "commit" "--allow-empty" "-m" (format "[release ctim] %s" version)) + (sh "git" "commit" "--allow-empty" "-m" (format "[ctim-release] %s" version)) (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) (read-line) From 002baf01af91cae8fed6e2004e1786c9d4b36730 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:17:50 -0500 Subject: [PATCH 32/64] [ctim-release] 1.3.26 From f659fdc61d73cddd93249030bc349346c2db0892 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:18:06 -0500 Subject: [PATCH 33/64] wip --- resources/ctim/version.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/ctim/version.edn b/resources/ctim/version.edn index 9b0e580e..3c9d2e0d 100644 --- a/resources/ctim/version.edn +++ b/resources/ctim/version.edn @@ -1 +1 @@ -{:template "1.3.PATCH", :patch 26} +{:template "1.3.PATCH", :patch 27} From 9731676de59511f1c08cc88daaa7fab32ff893b5 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:20:29 -0500 Subject: [PATCH 34/64] wip --- dev/ctim/prep_release.clj | 3 ++- script/prep-release | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dev/ctim/prep_release.clj b/dev/ctim/prep_release.clj index 251ef3a5..b3be22a3 100644 --- a/dev/ctim/prep_release.clj +++ b/dev/ctim/prep_release.clj @@ -22,7 +22,8 @@ (loop [prev-version nil version (-ctim-version)] (if (= prev-version version) - (do (sh "git" "add" "resources/ctim/version.edn") + (do (sh "./script/doc") + (sh "git" "add" ".") (sh "git" "commit" "--allow-empty" "-m" (format "[ctim-release] %s" version)) (System/exit 0)) (do (println (str "Press enter to prepare release `" (-ctim-version) "`. To customize, update `resources/ctim/version.edn`, then press enter.")) diff --git a/script/prep-release b/script/prep-release index d4edf8d2..e962e535 100755 --- a/script/prep-release +++ b/script/prep-release @@ -1,3 +1,3 @@ #!/bin/bash -clojure -M -m ctim.version/-ctim-version +clojure -M:dev:prep-release From 5cefaf05a95f418fa07a98b3114d238cb96db55d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:20:39 -0500 Subject: [PATCH 35/64] [ctim-release] 1.3.27 From 3958cf8d1abef908d9fe5f86c6f6266dda873d82 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:23:30 -0500 Subject: [PATCH 36/64] wip --- README.md | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 4e2eaa21..526d8fff 100644 --- a/README.md +++ b/README.md @@ -29,24 +29,12 @@ lein doc ## Releases -```clojure -# snapshot release -lein deploy - -# for releases, set project.clj version to x.y.z-SNAPSHOT -# this command then releases as x.y.z and bumps to x.y.(z+1)-SNAPSHOT -# aliased as ./script/release.sh -lein release :patch - -# if release fails partway through, use these commands to recover -git tag --delete x.y.z -# you might have a redundant commit "Version x.y.z", undo with: -git reset --hard SHA_BEFORE_FAILED_RELEASE -``` +To create a new release, call `./script/prep-release`. Push the result to a feature branch +and merge the release to master. The commit message must include `[ctim-release]`. ## License -Copyright © 2016-2024 Cisco Systems +Copyright © 2016-2025 Cisco Systems Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version. From 32422ead42b1f4058e73904bfb5a93ee3b18b98d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 14:23:30 -0500 Subject: [PATCH 37/64] wip asdf --- README.md | 18 +++--------------- VERSION_TEMPLATE | 1 - 2 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 VERSION_TEMPLATE diff --git a/README.md b/README.md index 4e2eaa21..526d8fff 100644 --- a/README.md +++ b/README.md @@ -29,24 +29,12 @@ lein doc ## Releases -```clojure -# snapshot release -lein deploy - -# for releases, set project.clj version to x.y.z-SNAPSHOT -# this command then releases as x.y.z and bumps to x.y.(z+1)-SNAPSHOT -# aliased as ./script/release.sh -lein release :patch - -# if release fails partway through, use these commands to recover -git tag --delete x.y.z -# you might have a redundant commit "Version x.y.z", undo with: -git reset --hard SHA_BEFORE_FAILED_RELEASE -``` +To create a new release, call `./script/prep-release`. Push the result to a feature branch +and merge the release to master. The commit message must include `[ctim-release]`. ## License -Copyright © 2016-2024 Cisco Systems +Copyright © 2016-2025 Cisco Systems Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version. diff --git a/VERSION_TEMPLATE b/VERSION_TEMPLATE deleted file mode 100644 index 4c5bd636..00000000 --- a/VERSION_TEMPLATE +++ /dev/null @@ -1 +0,0 @@ -1.3.GENERATED_VERSION From 6c7c12a6d7b78ed40f624116366d7732131dfc94 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 16:40:21 -0500 Subject: [PATCH 38/64] wip --- build.clj | 91 +++++++++++------------------------- deps.edn | 2 + reproducible-releases.edn | 11 +++++ resources/ctim/version.edn | 5 +- src/ctim/schemas/common.cljc | 3 +- src/ctim/version.clj | 5 +- 6 files changed, 50 insertions(+), 67 deletions(-) create mode 100644 reproducible-releases.edn diff --git a/build.clj b/build.clj index 377a5e96..3c22c7d3 100644 --- a/build.clj +++ b/build.clj @@ -9,8 +9,19 @@ [clj-commons.digest :as digest]) (:import (java.util.regex Pattern))) +;; copied to from ctim.version + +(defn artifact-version [params] + (let [{:keys [major minor schema release dev] :as m} + (-> (io/file "resources/ctim/version.edn") + slurp + edn/read-string)] + (str major "." + minor "." + schema "." + (if (:release params) release (str dev "-SNAPSHOT"))))) + (def lib 'threatgrid/ctim) -;(def version (format "1.2.%s" (b/git-count-revs nil))) (def class-dir "target/classes") (def basis (delay (b/create-basis {:project "deps.edn"}))) @@ -49,70 +60,23 @@ (b/git-process {:git-args (format "tag %s" version)}) params) -(defn deploy-branch? [params] - (= "master" (b/git-process {:git-args (format "branch --show-current")}))) - -(defn version-template [] - (str/trim (slurp "VERSION_TEMPLATE"))) - -(defn split-version-template [] - (let [before+after (str/split (version-template) #"GENERATED_VERSION" -1)] - (assert (= 2 (count before+after))) - before+after)) - -(defn instantiate-version-template [instantiate] - (let [[before after] (split-version-template)] - (str before instantiate after))) - -(defn generated-version [tag] - (let [[before after] (split-version-template) - re (re-pattern (str (Pattern/quote before) - "(.*)" - (Pattern/quote after)))] - (Long/parseLong (peek (re-matches re tag))))) - -(comment - (= 24 (generated-version "1.3.24")) - ) - -(defn prev-release-in-series [] - ;; fails silently - (b/git-process {:git-args (format "fetch --tags")}) - (not-empty - ;; https://stackoverflow.com/questions/3867619/how-to-get-last-git-tag-matching-regex-criteria - (b/git-process {:git-args (format "describe --tags %s --abbrev=0 --match=%s" - "master" - ;; TODO quote - (instantiate-version-template "*"))}))) - -(defn next-version [] - (b/git-process {:git-args (format "fetch tags")}) - (let [next-generated-version (or (some-> (prev-release-in-series) - generated-version - inc') - 0)] - (instantiate-version-template next-generated-version))) - -(comment - (next-version) - ) - -; (b/git-count-revs nil) (defn infer-version [{:keys [release] :as params}] (-> params - (update :version #(or % (str (next-version params) (when-not release "-SNAPSHOT")))))) + (update :version #(or % (artifact-version params))))) -(defn build-snapshot [params] - ;; don't regenerate docs for snapshot - (-> params - (assoc :release false) - infer-version - jar)) +(defn build + "If current commit starts with [ctim-release], installs release version. + Otherwise snapshot version. -(defn build-release [params] - ;;TODO build docs + :release true/false to force release/snapshot + :version to override artifact version" + [params] (-> params - (assoc :release true) + (update :release #(if (boolean? %) + % + (if-some [msg (not-empty (b/git-process {:git-args "show-branch --no-name HEAD"}))] + (str/starts-with? msg "[ctim-release]") + (throw (ex-info "Could not determine current commit. Use clojure -T:build build :release true/false." {}))))) infer-version jar)) @@ -146,17 +110,18 @@ new-releases (assoc prev-releases version {:git-tag version ;; release should be reproducible from parent commit also :parent-commit (b/git-process {:git-args "rev-parse master"}) - :reproduction {:command (format "clojure -T:build build-release :version %s" version) + :reproduction {:command (format "clojure -T:build build :release true :version %s" version) :artifact->checksums {jar-file cs}}})] (spit "reproducible-releases.edn" (serialize new-releases)))) (defn schedule-release [params] (let [{:keys [version] :as params} (-> params - build-release + (assoc :release true) + build update-reproducible-releases)] ;; TODO gen docs to next stable version. keep them until the next stable version (b/git-process {:git-args "add ."}) - (b/git-process {:git-args (format "commit -m '[:ctim-release \"%s\"]'" version)}))) + (b/git-process {:git-args (format "commit -m '[ctim-release] %s'" version)}))) (defn perform-release [params] (tag-release params)) diff --git a/deps.edn b/deps.edn index 7cd6fd9a..821e7688 100644 --- a/deps.edn +++ b/deps.edn @@ -24,6 +24,8 @@ :git/tag "Release-1.4.100" :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} :ns-default build} + ;; Generate an example: clojure -M:gen actor + :gen {:main-opts ["run" "-m" "ctim.generate"]} :deploy {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" diff --git a/reproducible-releases.edn b/reproducible-releases.edn new file mode 100644 index 00000000..a05ef223 --- /dev/null +++ b/reproducible-releases.edn @@ -0,0 +1,11 @@ +{"1.3.27.1" + {:git-tag "1.3.27.1", + :parent-commit "bf49b9b865ef4b6d1f326af12f081c084db38504", + :reproduction + {:artifact->checksums + {"target/ctim-1.3.27.1.jar" + {:md5 "b4d2612a956c0ab9d80873c76229517d", + :sha-1 "39abeefd756d4bf43722b05e5d48bc03ae60b80f", + :sha3-512 + "25d063ce25fe45af46f510ae67a5f3192725d809876730e9fab72f1da2f6ddbd2c018c1d7cab17babef472704c6b4adae6d436db15e2dd0162c4e92942c642b7"}}, + :command "clojure -T:build build :release true :version 1.3.27.1"}}} diff --git a/resources/ctim/version.edn b/resources/ctim/version.edn index 3c9d2e0d..adfdf27e 100644 --- a/resources/ctim/version.edn +++ b/resources/ctim/version.edn @@ -1 +1,4 @@ -{:template "1.3.PATCH", :patch 27} +;; ctim-schema-version: => major.minor.schema +;; maven release version => major.minor.schema.release +;; maven snapshot version => major.minor.schema.dev-SNAPSHOT +{:major 1 :minor 3 :schema 27 :release 1 :dev 2} diff --git a/src/ctim/schemas/common.cljc b/src/ctim/schemas/common.cljc index 9bb402bc..829e7b88 100644 --- a/src/ctim/schemas/common.cljc +++ b/src/ctim/schemas/common.cljc @@ -23,7 +23,8 @@ [flanders.predicates :as fp] [clojure.string :as str])) -(def ctim-schema-version (ctim-version)) +;; do not edit -- use ./script/update-version +(def ctim-schema-version "1.3.26") (def-eq CTIMSchemaVersion ctim-schema-version) diff --git a/src/ctim/version.clj b/src/ctim/version.clj index 8ea0c6cf..3eff732a 100644 --- a/src/ctim/version.clj +++ b/src/ctim/version.clj @@ -3,12 +3,13 @@ [clojure.java.io :as io] [clojure.string :as str])) +;; copied to build.clj (defn -ctim-version [] - (let [{:keys [template patch] :as m} + (let [{:keys [major minor schema]} (-> (io/resource "ctim/version.edn") slurp edn/read-string)] - (str/replace template "PATCH" (str patch)))) + (str major "." minor "." schema))) (defmacro ctim-version "This is a macro to support cljs compile-time inlining of the version string From eb89f8a81d7d17159bdb2a07c1c2521d363b8112 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:36:29 -0500 Subject: [PATCH 39/64] wip --- build.clj | 62 ++++++++++++++++++++++++--------------- reproducible-releases.edn | 8 ++--- src/ctim/version.clj | 10 ++----- 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/build.clj b/build.clj index 3c22c7d3..080f2849 100644 --- a/build.clj +++ b/build.clj @@ -1,5 +1,6 @@ (ns build (:require [clojure.edn :as edn] + [clojure.set :as set] [clojure.string :as str] [clojure.tools.build.api :as b] [clojure.pprint :as pp] @@ -9,13 +10,8 @@ [clj-commons.digest :as digest]) (:import (java.util.regex Pattern))) -;; copied to from ctim.version - (defn artifact-version [params] - (let [{:keys [major minor schema release dev] :as m} - (-> (io/file "resources/ctim/version.edn") - slurp - edn/read-string)] + (let [{:keys [major minor schema release dev] :as m} (-> (io/file "resources/ctim/version.edn") slurp edn/read-string)] (str major "." minor "." schema "." @@ -69,16 +65,31 @@ Otherwise snapshot version. :release true/false to force release/snapshot - :version to override artifact version" - [params] - (-> params - (update :release #(if (boolean? %) - % - (if-some [msg (not-empty (b/git-process {:git-args "show-branch --no-name HEAD"}))] - (str/starts-with? msg "[ctim-release]") - (throw (ex-info "Could not determine current commit. Use clojure -T:build build :release true/false." {}))))) - infer-version - jar)) + :version to override artifact version + :source-date-epoch to set SOURCE_DATE_EPOCH" + [{:keys [source-date-epoch] :as params}] + (if (or (not source-date-epoch) + (= (some-> (System/getenv "SOURCE_DATE_EPOCH") parse-long) + source-date-epoch)) + (-> params + (update :release #(if (boolean? %) + % + (if-some [msg (not-empty (b/git-process {:git-args "show-branch --no-name HEAD"}))] + (str/starts-with? msg "[ctim-release]") + (throw (ex-info "Could not determine current commit. Use clojure -T:build build :release true/false." {}))))) + infer-version + jar) + (do (assert (set/subset? (-> params keys set) #{:release :version :source-date-epoch}) + (set/difference #{:release :version :source-date-epoch} (-> params keys set))) + (println "Launching subprocess to set SOURCE_DATE_EPOCH...") + (let [{:keys [out exit err]} (apply sh/sh + (cond-> ["clojure" "-T:build" "build" ":source-date-epoch" (str source-date-epoch)] + (boolean? (:release params)) (conj ":release" (str (:release params))) + (:version params) (conj ":version" (pr-str (:version params))) + true (conj :env (assoc (into {} (System/getenv)) "SOURCE_DATE_EPOCH" (str source-date-epoch)))))] + (some-> out str/trim not-empty print) + (binding [*out* *err*] (some-> err str/trim not-empty print)) + (assert (zero? exit) exit))))) (defn- serialize [m] (binding [*print-namespace-maps* false @@ -101,27 +112,30 @@ ;; something stronger :sha3-512 (digest/sha3-512 file)}) -(defn update-reproducible-releases [{:keys [version jar-file] :as params}] +(defn update-reproducible-releases [{:keys [version jar-file source-date-epoch] :as params}] (let [cs (checksums (io/file jar-file)) prev-releases (-> "reproducible-releases.edn" io/file slurp edn/read-string) new-releases (assoc prev-releases version {:git-tag version - ;; release should be reproducible from parent commit also - :parent-commit (b/git-process {:git-args "rev-parse master"}) - :reproduction {:command (format "clojure -T:build build :release true :version %s" version) + :source-date-epoch source-date-epoch + :reproduction {:commands (str "clojure -T:build build :release true :source-date-epoch %s" source-date-epoch) :artifact->checksums {jar-file cs}}})] (spit "reproducible-releases.edn" (serialize new-releases)))) (defn schedule-release [params] - (let [{:keys [version] :as params} (-> params - (assoc :release true) + (let [source-date-epoch (or (:source-date-epoch params) + (some-> (System/getenv "SOURCE_DATE_EPOCH") parse-long) + (.getEpochSecond (java.time.Instant/now))) + {:keys [version] :as params} (-> params + (assoc :release true + :source-date-epoch source-date-epoch) build update-reproducible-releases)] ;; TODO gen docs to next stable version. keep them until the next stable version - (b/git-process {:git-args "add ."}) - (b/git-process {:git-args (format "commit -m '[ctim-release] %s'" version)}))) + (println (b/git-process {:git-args "add ."})) + (println (b/git-process {:git-args (format "commit -m '[ctim-release] %s'" version)})))) (defn perform-release [params] (tag-release params)) diff --git a/reproducible-releases.edn b/reproducible-releases.edn index a05ef223..af3f4ad4 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -4,8 +4,8 @@ :reproduction {:artifact->checksums {"target/ctim-1.3.27.1.jar" - {:md5 "b4d2612a956c0ab9d80873c76229517d", - :sha-1 "39abeefd756d4bf43722b05e5d48bc03ae60b80f", + {:md5 "1a6f5cb4e8210a5361abdc6094232e3e", + :sha-1 "1b7a40b2d8c574c849a92d48a9726a81da865ed5", :sha3-512 - "25d063ce25fe45af46f510ae67a5f3192725d809876730e9fab72f1da2f6ddbd2c018c1d7cab17babef472704c6b4adae6d436db15e2dd0162c4e92942c642b7"}}, - :command "clojure -T:build build :release true :version 1.3.27.1"}}} + "54b31eedcd1f1c544150b03866e3dc6caa72f1996032ada1a92d53da4b94bfa2ebf5ab6521a37e24653c34e0d204f28a02d17d3b048df5d6fb9ef1ea696658df"}}, + :command "clojure -T:build build :release true"}}} diff --git a/src/ctim/version.clj b/src/ctim/version.clj index 3eff732a..a7963f3b 100644 --- a/src/ctim/version.clj +++ b/src/ctim/version.clj @@ -3,16 +3,12 @@ [clojure.java.io :as io] [clojure.string :as str])) -;; copied to build.clj -(defn -ctim-version [] - (let [{:keys [major minor schema]} - (-> (io/resource "ctim/version.edn") - slurp - edn/read-string)] +(defn -ctim-schema-version [] + (let [{:keys [major minor schema]} (-> (io/resource "ctim/version.edn") slurp edn/read-string)] (str major "." minor "." schema))) (defmacro ctim-version "This is a macro to support cljs compile-time inlining of the version string from the JVM resource." [] - (-ctim-version)) + (-ctim-schema-version)) From 39a73da67b66d9e57d6022a92c64ceadf32135a4 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:37:03 -0500 Subject: [PATCH 40/64] wip --- build.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/build.clj b/build.clj index 080f2849..bc3d1cee 100644 --- a/build.clj +++ b/build.clj @@ -134,6 +134,7 @@ build update-reproducible-releases)] ;; TODO gen docs to next stable version. keep them until the next stable version + #_#_ (println (b/git-process {:git-args "add ."})) (println (b/git-process {:git-args (format "commit -m '[ctim-release] %s'" version)})))) From 50964ee0139663f42f9adef9226e074526d66f0d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:41:21 -0500 Subject: [PATCH 41/64] wip --- build.clj | 8 ++++++-- reproducible-releases.edn | 9 ++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/build.clj b/build.clj index bc3d1cee..8678471a 100644 --- a/build.clj +++ b/build.clj @@ -78,7 +78,8 @@ (str/starts-with? msg "[ctim-release]") (throw (ex-info "Could not determine current commit. Use clojure -T:build build :release true/false." {}))))) infer-version - jar) + jar + (doto prn)) (do (assert (set/subset? (-> params keys set) #{:release :version :source-date-epoch}) (set/difference #{:release :version :source-date-epoch} (-> params keys set))) (println "Launching subprocess to set SOURCE_DATE_EPOCH...") @@ -89,7 +90,8 @@ true (conj :env (assoc (into {} (System/getenv)) "SOURCE_DATE_EPOCH" (str source-date-epoch)))))] (some-> out str/trim not-empty print) (binding [*out* *err*] (some-> err str/trim not-empty print)) - (assert (zero? exit) exit))))) + (assert (zero? exit) exit) + (into params (-> out slurp edn/read-string)))))) (defn- serialize [m] (binding [*print-namespace-maps* false @@ -113,7 +115,9 @@ :sha3-512 (digest/sha3-512 file)}) (defn update-reproducible-releases [{:keys [version jar-file source-date-epoch] :as params}] + (prn "update-reproducible-releases" params) (let [cs (checksums (io/file jar-file)) + _ (prn "cs" cs) prev-releases (-> "reproducible-releases.edn" io/file slurp diff --git a/reproducible-releases.edn b/reproducible-releases.edn index af3f4ad4..43e7e459 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -1,4 +1,11 @@ -{"1.3.27.1" +{nil + {:git-tag nil, + :reproduction + {:artifact->checksums {nil {:md5 nil, :sha-1 nil, :sha3-512 nil}}, + :commands + "clojure -T:build build :release true :source-date-epoch %s"}, + :source-date-epoch nil}, + "1.3.27.1" {:git-tag "1.3.27.1", :parent-commit "bf49b9b865ef4b6d1f326af12f081c084db38504", :reproduction From 7ebd23c4b8d353bd93fd068bd637643e4c12bd2c Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:44:30 -0500 Subject: [PATCH 42/64] wip --- build.clj | 14 +++++++------- reproducible-releases.edn | 11 ++++++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/build.clj b/build.clj index 8678471a..a9527c92 100644 --- a/build.clj +++ b/build.clj @@ -67,7 +67,7 @@ :release true/false to force release/snapshot :version to override artifact version :source-date-epoch to set SOURCE_DATE_EPOCH" - [{:keys [source-date-epoch] :as params}] + [{:keys [source-date-epoch print-params] :as params}] (if (or (not source-date-epoch) (= (some-> (System/getenv "SOURCE_DATE_EPOCH") parse-long) source-date-epoch)) @@ -79,19 +79,20 @@ (throw (ex-info "Could not determine current commit. Use clojure -T:build build :release true/false." {}))))) infer-version jar - (doto prn)) + (cond-> + print-params (doto prn))) (do (assert (set/subset? (-> params keys set) #{:release :version :source-date-epoch}) (set/difference #{:release :version :source-date-epoch} (-> params keys set))) (println "Launching subprocess to set SOURCE_DATE_EPOCH...") (let [{:keys [out exit err]} (apply sh/sh - (cond-> ["clojure" "-T:build" "build" ":source-date-epoch" (str source-date-epoch)] + (cond-> ["clojure" "-T:build" "build" ":print-params" "true" ":source-date-epoch" (str source-date-epoch)] (boolean? (:release params)) (conj ":release" (str (:release params))) (:version params) (conj ":version" (pr-str (:version params))) true (conj :env (assoc (into {} (System/getenv)) "SOURCE_DATE_EPOCH" (str source-date-epoch)))))] (some-> out str/trim not-empty print) (binding [*out* *err*] (some-> err str/trim not-empty print)) (assert (zero? exit) exit) - (into params (-> out slurp edn/read-string)))))) + (into params (edn/read-string out)))))) (defn- serialize [m] (binding [*print-namespace-maps* false @@ -115,9 +116,7 @@ :sha3-512 (digest/sha3-512 file)}) (defn update-reproducible-releases [{:keys [version jar-file source-date-epoch] :as params}] - (prn "update-reproducible-releases" params) (let [cs (checksums (io/file jar-file)) - _ (prn "cs" cs) prev-releases (-> "reproducible-releases.edn" io/file slurp @@ -140,7 +139,8 @@ ;; TODO gen docs to next stable version. keep them until the next stable version #_#_ (println (b/git-process {:git-args "add ."})) - (println (b/git-process {:git-args (format "commit -m '[ctim-release] %s'" version)})))) + (println (b/git-process {:git-args (format "commit -m '[ctim-release] %s'" version)})) + params)) (defn perform-release [params] (tag-release params)) diff --git a/reproducible-releases.edn b/reproducible-releases.edn index 43e7e459..7d0bac21 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -7,12 +7,13 @@ :source-date-epoch nil}, "1.3.27.1" {:git-tag "1.3.27.1", - :parent-commit "bf49b9b865ef4b6d1f326af12f081c084db38504", :reproduction {:artifact->checksums {"target/ctim-1.3.27.1.jar" - {:md5 "1a6f5cb4e8210a5361abdc6094232e3e", - :sha-1 "1b7a40b2d8c574c849a92d48a9726a81da865ed5", + {:md5 "e3a75cf84d0b3646bf9f13e6b4974d77", + :sha-1 "1e285d8bfdbb40084a04b9b5e2bc2765107623c6", :sha3-512 - "54b31eedcd1f1c544150b03866e3dc6caa72f1996032ada1a92d53da4b94bfa2ebf5ab6521a37e24653c34e0d204f28a02d17d3b048df5d6fb9ef1ea696658df"}}, - :command "clojure -T:build build :release true"}}} + "b76465a500058ccd238a94e32a076899e0078c26099470bcc29a861a80cc23913151f002dd1b14666acfbf7601c8407dc98a50ba63761e8e74a91e1687aa7ea3"}}, + :commands + "clojure -T:build build :release true :source-date-epoch %s1749681864"}, + :source-date-epoch 1749681864}} From 82adcf51b5ec8bd067f91d73068ea38bd5e05466 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:45:06 -0500 Subject: [PATCH 43/64] wip --- build.clj | 2 +- reproducible-releases.edn | 20 +------------------- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/build.clj b/build.clj index a9527c92..ef9fb31b 100644 --- a/build.clj +++ b/build.clj @@ -123,7 +123,7 @@ edn/read-string) new-releases (assoc prev-releases version {:git-tag version :source-date-epoch source-date-epoch - :reproduction {:commands (str "clojure -T:build build :release true :source-date-epoch %s" source-date-epoch) + :reproduction {:commands (str "clojure -T:build build :release true :source-date-epoch " source-date-epoch) :artifact->checksums {jar-file cs}}})] (spit "reproducible-releases.edn" (serialize new-releases)))) diff --git a/reproducible-releases.edn b/reproducible-releases.edn index 7d0bac21..0967ef42 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -1,19 +1 @@ -{nil - {:git-tag nil, - :reproduction - {:artifact->checksums {nil {:md5 nil, :sha-1 nil, :sha3-512 nil}}, - :commands - "clojure -T:build build :release true :source-date-epoch %s"}, - :source-date-epoch nil}, - "1.3.27.1" - {:git-tag "1.3.27.1", - :reproduction - {:artifact->checksums - {"target/ctim-1.3.27.1.jar" - {:md5 "e3a75cf84d0b3646bf9f13e6b4974d77", - :sha-1 "1e285d8bfdbb40084a04b9b5e2bc2765107623c6", - :sha3-512 - "b76465a500058ccd238a94e32a076899e0078c26099470bcc29a861a80cc23913151f002dd1b14666acfbf7601c8407dc98a50ba63761e8e74a91e1687aa7ea3"}}, - :commands - "clojure -T:build build :release true :source-date-epoch %s1749681864"}, - :source-date-epoch 1749681864}} +{} From 8a717c6f931708d8924cba771252b14d2d0f96a2 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:45:20 -0500 Subject: [PATCH 44/64] wip --- reproducible-releases.edn | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/reproducible-releases.edn b/reproducible-releases.edn index 0967ef42..3d34b73a 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -1 +1,12 @@ -{} +{"1.3.27.1" + {:git-tag "1.3.27.1", + :reproduction + {:artifact->checksums + {"target/ctim-1.3.27.1.jar" + {:md5 "6d9af2ffd0e952a302e52b9d70c6f419", + :sha-1 "bc87fdcea14eac212dfb51f5d52d5a27abf51873", + :sha3-512 + "e3858cfd8f614f4de938b019e2b2ed9f37f53f9dcda8166c08f34a67c0c32369967f36026a16317130b1c19db66bc9954b8eef5d2e33a0809bc1774d5fc1443f"}}, + :commands + "clojure -T:build build :release true :source-date-epoch 1749681910"}, + :source-date-epoch 1749681910}} From a17cafa9d12b18e3f2ce62197135d8bce76d4f36 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 11 Jun 2025 17:47:09 -0500 Subject: [PATCH 45/64] wip --- build.clj | 1 + 1 file changed, 1 insertion(+) diff --git a/build.clj b/build.clj index ef9fb31b..4d9caeb8 100644 --- a/build.clj +++ b/build.clj @@ -127,6 +127,7 @@ :artifact->checksums {jar-file cs}}})] (spit "reproducible-releases.edn" (serialize new-releases)))) +;;FIXME still not reproducible, even with SOURCE_DATE_EPOCH (defn schedule-release [params] (let [source-date-epoch (or (:source-date-epoch params) (some-> (System/getenv "SOURCE_DATE_EPOCH") parse-long) From 53be155226e82f2fcfc50bcc62a478fc691dec20 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 12 Jun 2025 16:00:06 -0500 Subject: [PATCH 46/64] wip --- build.clj | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/build.clj b/build.clj index 4d9caeb8..7127ba16 100644 --- a/build.clj +++ b/build.clj @@ -8,7 +8,8 @@ [clojure.walk :as walk] [clojure.java.shell :as sh] [clj-commons.digest :as digest]) - (:import (java.util.regex Pattern))) + (:import (java.util.regex Pattern) + (java.io File))) (defn artifact-version [params] (let [{:keys [major minor schema release dev] :as m} (-> (io/file "resources/ctim/version.edn") slurp edn/read-string)] @@ -24,9 +25,16 @@ (defn clean [params] (b/delete {:path "target"})) +(defn- set-modification-times [{:keys [target-dir source-date-epoch] :as params}] + (when source-date-epoch + (let [ms-epoch (* 1000 source-date-epoch)] + (run! #(File/.setLastModificationTime % ms-epoch) + (file-seq target-dir)))) + params) + (defn jar [{:keys [version] :as params}] {:pre [version]} - (clean nil) + (clean params) (b/write-pom {:class-dir class-dir :lib lib :version version @@ -46,10 +54,12 @@ (b/copy-dir {;;TODO copy from basis :src-dirs ["src" "doc"] :target-dir class-dir}) + (set-modification-times (assoc params :target-dir class-dir)) (let [jar-file (format "target/%s-%s.jar" (name lib) version)] (b/jar {:class-dir class-dir - :jar-file (format "target/%s-%s.jar" (name lib) version)}) - (assoc params :jar-file jar-file))) + :jar-file jar-file}) + (-> params + (assoc :jar-file jar-file)))) (defn tag-release [{:keys [version] :as params}] {:pre [version]} @@ -81,6 +91,7 @@ jar (cond-> print-params (doto prn))) + ;;FIXME support passing SOURCE_DATE_EPOCH to tools.build via parameter (do (assert (set/subset? (-> params keys set) #{:release :version :source-date-epoch}) (set/difference #{:release :version :source-date-epoch} (-> params keys set))) (println "Launching subprocess to set SOURCE_DATE_EPOCH...") From bff34b9ea68a14e5a137cc561dcc50595090dfe7 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 12 Jun 2025 16:01:11 -0500 Subject: [PATCH 47/64] wip --- build.clj | 4 ++-- reproducible-releases.edn | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build.clj b/build.clj index 7127ba16..7041f405 100644 --- a/build.clj +++ b/build.clj @@ -28,8 +28,8 @@ (defn- set-modification-times [{:keys [target-dir source-date-epoch] :as params}] (when source-date-epoch (let [ms-epoch (* 1000 source-date-epoch)] - (run! #(File/.setLastModificationTime % ms-epoch) - (file-seq target-dir)))) + (run! #(File/.setLastModified % ms-epoch) + (file-seq (io/file target-dir))))) params) (defn jar [{:keys [version] :as params}] diff --git a/reproducible-releases.edn b/reproducible-releases.edn index 3d34b73a..41f48fa8 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -3,10 +3,10 @@ :reproduction {:artifact->checksums {"target/ctim-1.3.27.1.jar" - {:md5 "6d9af2ffd0e952a302e52b9d70c6f419", - :sha-1 "bc87fdcea14eac212dfb51f5d52d5a27abf51873", + {:md5 "9cd7dfafe597d157cb6ca8b73e4bcfc4", + :sha-1 "00b3fd567bb2fcc780e0605fbb76fb97d1f7a9ad", :sha3-512 - "e3858cfd8f614f4de938b019e2b2ed9f37f53f9dcda8166c08f34a67c0c32369967f36026a16317130b1c19db66bc9954b8eef5d2e33a0809bc1774d5fc1443f"}}, + "80543176bd4b237a89d298e4dbafcb2a6b6f9e95b359a041c42a4229e73f07843d341fa9aefb85bbf20c66b0d07887632ff8186a0740046c9167c08de183ca98"}}, :commands - "clojure -T:build build :release true :source-date-epoch 1749681910"}, - :source-date-epoch 1749681910}} + "clojure -T:build build :release true :source-date-epoch 1749762066"}, + :source-date-epoch 1749762066}} From 70ef73dce42abd584cfb137625fa3e8ee14aa31d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 12 Jun 2025 16:01:37 -0500 Subject: [PATCH 48/64] wip --- reproducible-releases.edn | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reproducible-releases.edn b/reproducible-releases.edn index 41f48fa8..91e11e7c 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -3,10 +3,10 @@ :reproduction {:artifact->checksums {"target/ctim-1.3.27.1.jar" - {:md5 "9cd7dfafe597d157cb6ca8b73e4bcfc4", - :sha-1 "00b3fd567bb2fcc780e0605fbb76fb97d1f7a9ad", + {:md5 "f2e67612a3281fcc108a0aff2e6cf5bc", + :sha-1 "a6ff39c961c76a239b1351afcb3bf00ccae65ddb", :sha3-512 - "80543176bd4b237a89d298e4dbafcb2a6b6f9e95b359a041c42a4229e73f07843d341fa9aefb85bbf20c66b0d07887632ff8186a0740046c9167c08de183ca98"}}, + "c14b4c902db10e56ca15c9db54a019ed6c183bfe635f62a176467304bc60c51f7912bb245412b653c7b039c6c8e48cdae634545b2b0a345e572c4f93d542760a"}}, :commands - "clojure -T:build build :release true :source-date-epoch 1749762066"}, - :source-date-epoch 1749762066}} + "clojure -T:build build :release true :source-date-epoch 1749762075"}, + :source-date-epoch 1749762075}} From c6e787c069a68fd74d3eda48ea9098a7c8e12bb3 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 12 Jun 2025 16:06:01 -0500 Subject: [PATCH 49/64] wip --- build.clj | 9 +++++---- reproducible-releases.edn | 10 +++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/build.clj b/build.clj index 7041f405..f5ec496a 100644 --- a/build.clj +++ b/build.clj @@ -25,12 +25,12 @@ (defn clean [params] (b/delete {:path "target"})) -(defn- set-modification-times [{:keys [target-dir source-date-epoch] :as params}] +(defn- set-modification-times [{:keys [target source-date-epoch] :as params}] (when source-date-epoch (let [ms-epoch (* 1000 source-date-epoch)] (run! #(File/.setLastModified % ms-epoch) - (file-seq (io/file target-dir))))) - params) + (file-seq (io/file target))))) + nil) (defn jar [{:keys [version] :as params}] {:pre [version]} @@ -54,10 +54,11 @@ (b/copy-dir {;;TODO copy from basis :src-dirs ["src" "doc"] :target-dir class-dir}) - (set-modification-times (assoc params :target-dir class-dir)) + (set-modification-times (assoc params :target class-dir)) (let [jar-file (format "target/%s-%s.jar" (name lib) version)] (b/jar {:class-dir class-dir :jar-file jar-file}) + (set-modification-times (assoc params :target jar-file)) (-> params (assoc :jar-file jar-file)))) diff --git a/reproducible-releases.edn b/reproducible-releases.edn index 91e11e7c..a7a7c328 100644 --- a/reproducible-releases.edn +++ b/reproducible-releases.edn @@ -3,10 +3,10 @@ :reproduction {:artifact->checksums {"target/ctim-1.3.27.1.jar" - {:md5 "f2e67612a3281fcc108a0aff2e6cf5bc", - :sha-1 "a6ff39c961c76a239b1351afcb3bf00ccae65ddb", + {:md5 "09f9c55ce09cd4a96aadd9e190aee3f2", + :sha-1 "f1fe7619ec4f75575f6125322881f026519d2a96", :sha3-512 - "c14b4c902db10e56ca15c9db54a019ed6c183bfe635f62a176467304bc60c51f7912bb245412b653c7b039c6c8e48cdae634545b2b0a345e572c4f93d542760a"}}, + "932b095acf82d488721e69efeb63bbdd4bb7637edc5a3fe3856707d33d7b15bbf8b09735106593e534d495934c46b7b705361f305be61c16a9463328033f539b"}}, :commands - "clojure -T:build build :release true :source-date-epoch 1749762075"}, - :source-date-epoch 1749762075}} + "clojure -T:build build :release true :source-date-epoch 1749762342"}, + :source-date-epoch 1749762342}} From 3037430b487054061297c027c1d2e9d3f2bd2a21 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 00:51:36 -0500 Subject: [PATCH 50/64] wip --- build.clj | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/build.clj b/build.clj index f5ec496a..d01544d9 100644 --- a/build.clj +++ b/build.clj @@ -7,9 +7,43 @@ [clojure.java.io :as io] [clojure.walk :as walk] [clojure.java.shell :as sh] + clojure.tools.build.util.zip [clj-commons.digest :as digest]) - (:import (java.util.regex Pattern) - (java.io File))) + (:import + [java.io File InputStream OutputStream] + [java.nio.file Files LinkOption] + [java.nio.file.attribute BasicFileAttributes FileTime] + [java.util.zip ZipFile ZipInputStream ZipOutputStream ZipEntry] + [java.util.jar Manifest Attributes$Name] + [java.util.regex Pattern])) + +;; modified from tools.build with reproducible last modified time +(defn- add-zip-entry + [^ZipOutputStream output-stream ^String path ^File file] + (let [dir (.isDirectory file) + attrs (Files/readAttributes (.toPath file) BasicFileAttributes ^"[Ljava.nio.file.LinkOption;" (into-array LinkOption [])) + path (if (and dir (not (.endsWith path "/"))) (str path "/") path) + path (str/replace path \\ \/) ;; only use unix-style paths in jars + entry (doto (ZipEntry. path) + ;(.setSize (.size attrs)) + ;(.setLastAccessTime (.lastAccessTime attrs)) + (.setLastModifiedTime (or (some-> "SOURCE_DATE_EPOCH" + System/getenv + parse-long + (* 1000) + FileTime/fromMillis) + (.lastModifiedTime attrs))))] + (.putNextEntry output-stream entry) + (when-not dir + (with-open [fis (io/input-stream file)] + (io/copy fis output-stream))) + + (.closeEntry output-stream))) + +(let [orig clojure.tools.build.util.zip/fill-manifest!] + (defn- fill-manifest! + [manifest props] + (orig manifest (into (sorted-map) props)))) (defn artifact-version [params] (let [{:keys [major minor schema release dev] :as m} (-> (io/file "resources/ctim/version.edn") slurp edn/read-string)] @@ -54,10 +88,15 @@ (b/copy-dir {;;TODO copy from basis :src-dirs ["src" "doc"] :target-dir class-dir}) - (set-modification-times (assoc params :target class-dir)) (let [jar-file (format "target/%s-%s.jar" (name lib) version)] - (b/jar {:class-dir class-dir - :jar-file jar-file}) + (with-redefs [;;TODO pin last modified time (push upstream) + clojure.tools.build.util.zip/add-zip-entry add-zip-entry + ;;TODO sort manifest entries (push upstream) + clojure.tools.build.util.zip/fill-manifest! fill-manifest!] + ;;TODO sort files in jar, but leave META-INF/MANFEST.MF first + ;; port the rest of https://github.com/Zlika/reproducible-build-maven-plugin/blob/d4f29db868ff0d39fabbef06c1fc3bf8179be089/src/main/java/io/github/zlika/reproducible/ZipStripper.java#L126 + (b/jar {:class-dir class-dir + :jar-file jar-file})) (set-modification-times (assoc params :target jar-file)) (-> params (assoc :jar-file jar-file)))) From 40d012f274984b70b3f36c546440a98178fe4ac8 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 17:21:29 -0500 Subject: [PATCH 51/64] wip --- build.clj | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/build.clj b/build.clj index d01544d9..f119adfe 100644 --- a/build.clj +++ b/build.clj @@ -66,6 +66,16 @@ (file-seq (io/file target))))) nil) +(defn strip-nondeterminism [{:keys [jar-file] :as params}] + (set-modification-times (assoc params :target jar-file)) + ;; sets last modification time of MANIFEST.MF + (let [{:keys [exit out err]} (sh/sh "strip-nondeterminism" jar-file)] + (when-not (zero? exit) + (println out) + (println err) + (throw (ex-info "strip-nondeterminism failed" {}))) + params)) + (defn jar [{:keys [version] :as params}] {:pre [version]} (clean params) @@ -97,9 +107,9 @@ ;; port the rest of https://github.com/Zlika/reproducible-build-maven-plugin/blob/d4f29db868ff0d39fabbef06c1fc3bf8179be089/src/main/java/io/github/zlika/reproducible/ZipStripper.java#L126 (b/jar {:class-dir class-dir :jar-file jar-file})) - (set-modification-times (assoc params :target jar-file)) (-> params - (assoc :jar-file jar-file)))) + (assoc :jar-file jar-file) + strip-nondeterminism))) (defn tag-release [{:keys [version] :as params}] {:pre [version]} From 62cd482e4216f01e70a32b4b65c6fe5430151f17 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 17:44:34 -0500 Subject: [PATCH 52/64] wip --- .github/workflows/build.yml | 2 +- .github/workflows/deploy.yml | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9308b7f2..7917d2e3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build +name: Test on: push: diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..60884be2 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,20 @@ +on: + workflow_run: + workflows: Test + branches: + - ctim-one-commit-release + #- master + types: completed + +jobs: + on-success: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - run: eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" >> "$GITHUB_PATH" + - run: brew install clojure strip-nondeterminism + on-failure: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'failure' }} + steps: + - run: exit 1 From 2d2a50aef6d7949fd09a0f19a4cb907ddfe66733 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 17:49:51 -0500 Subject: [PATCH 53/64] wip --- .github/workflows/deploy.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 60884be2..40cbfcab 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,8 +11,9 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: + - uses: actions/checkout@v4 - run: eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" >> "$GITHUB_PATH" - - run: brew install clojure strip-nondeterminism + - run: brew install clojure strip-nondeterminism diffoscope on-failure: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'failure' }} From d97e0a1b2170748387fb12fbf0a2789d35eda363 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 17:59:08 -0500 Subject: [PATCH 54/64] wip --- .github/workflows/build.yml | 10 +++++++++- .github/workflows/deploy.yml | 21 --------------------- 2 files changed, 9 insertions(+), 22 deletions(-) delete mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7917d2e3..1e3b3ca9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Test +name: Build on: push: @@ -64,3 +64,11 @@ jobs: needs: test steps: - run: echo "All tests pass!" + deploy: + runs-on: ubuntu-22.04 + timeout-minutes: 10 + needs: all-pr-checks + steps: + - uses: actions/checkout@v4 + - run: eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" >> "$GITHUB_PATH" + - run: brew install clojure strip-nondeterminism diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 40cbfcab..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,21 +0,0 @@ -on: - workflow_run: - workflows: Test - branches: - - ctim-one-commit-release - #- master - types: completed - -jobs: - on-success: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' }} - steps: - - uses: actions/checkout@v4 - - run: eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" >> "$GITHUB_PATH" - - run: brew install clojure strip-nondeterminism diffoscope - on-failure: - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'failure' }} - steps: - - run: exit 1 From 6c8fe4afd3892a15d1638ba2352fd171f4245caf Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 18:05:29 -0500 Subject: [PATCH 55/64] wip --- .github/workflows/build.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e3b3ca9..0d77ace5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,5 +70,9 @@ jobs: needs: all-pr-checks steps: - uses: actions/checkout@v4 - - run: eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" >> "$GITHUB_PATH" + - run: /home/linuxbrew/.linuxbrew/bin/brew shellenv >> "$GITHUB_PATH" - run: brew install clojure strip-nondeterminism + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v2 + with: + subject-path: 'PATH/TO/ARTIFACT' From 1711ba3d9f09f455e172ba4daa476c8a60f175f7 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 18:13:25 -0500 Subject: [PATCH 56/64] wip --- .github/workflows/build.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d77ace5..b017c476 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,9 +70,10 @@ jobs: needs: all-pr-checks steps: - uses: actions/checkout@v4 - - run: /home/linuxbrew/.linuxbrew/bin/brew shellenv >> "$GITHUB_PATH" - - run: brew install clojure strip-nondeterminism - - name: Generate artifact attestation - uses: actions/attest-build-provenance@v2 - with: - subject-path: 'PATH/TO/ARTIFACT' + - run: | + eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) + /home/linuxbrew/.linuxbrew/bin/brew install clojure strip-nondeterminism + #- name: Generate artifact attestation + # uses: actions/attest-build-provenance@v2 + # with: + # subject-path: 'PATH/TO/ARTIFACT' From 56a859fbcd524daa393c03006e22c5a799df1a5c Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 18:45:54 -0500 Subject: [PATCH 57/64] wip --- .github/workflows/build.yml | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b017c476..81fd2c63 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,7 +73,28 @@ jobs: - run: | eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) /home/linuxbrew/.linuxbrew/bin/brew install clojure strip-nondeterminism - #- name: Generate artifact attestation - # uses: actions/attest-build-provenance@v2 - # with: - # subject-path: 'PATH/TO/ARTIFACT' + - uses: actions/upload-artifact@v4 + with: + name: ctim-jar + path: target/*.jar + if-no-files-found: error + compression-level: 0 + attest: + runs-on: ubuntu-22.04 + timeout-minutes: 10 + needs: deploy + permissions: + #id-token: write + contents: read + #attestations: write + steps: + - uses: actions/checkout@v4 + - name: Download jar + uses: actions/download-artifact@v4 + with: + name: ctim-jar + path: ./target + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v2 + with: + subject-path: 'PATH/TO/ARTIFACT' From 688e2bdaa2d4347e4d13210d99ea8973c6940871 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 18:50:13 -0500 Subject: [PATCH 58/64] wip --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 81fd2c63..ac235c51 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,8 @@ jobs: - uses: actions/checkout@v4 - run: | eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) - /home/linuxbrew/.linuxbrew/bin/brew install clojure strip-nondeterminism + brew install clojure strip-nondeterminism + clojure -T:build build :release true :source-date-epoch 1749762342 - uses: actions/upload-artifact@v4 with: name: ctim-jar From 35c0cdf86dc5cf0a502859cc5ed941e1f807626d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 19:50:01 -0500 Subject: [PATCH 59/64] wip --- build.clj | 5 +++-- deps.edn | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.clj b/build.clj index f119adfe..fdd1d120 100644 --- a/build.clj +++ b/build.clj @@ -43,7 +43,7 @@ (let [orig clojure.tools.build.util.zip/fill-manifest!] (defn- fill-manifest! [manifest props] - (orig manifest (into (sorted-map) props)))) + (orig manifest (into (sorted-map) (dissoc props "Build-Jdk-Spec"))))) (defn artifact-version [params] (let [{:keys [major minor schema release dev] :as m} (-> (io/file "resources/ctim/version.edn") slurp edn/read-string)] @@ -106,7 +106,8 @@ ;;TODO sort files in jar, but leave META-INF/MANFEST.MF first ;; port the rest of https://github.com/Zlika/reproducible-build-maven-plugin/blob/d4f29db868ff0d39fabbef06c1fc3bf8179be089/src/main/java/io/github/zlika/reproducible/ZipStripper.java#L126 (b/jar {:class-dir class-dir - :jar-file jar-file})) + :jar-file jar-file + :manifest {"Build-Jdk-Spec" "8"}})) (-> params (assoc :jar-file jar-file) strip-nondeterminism))) diff --git a/deps.edn b/deps.edn index 821e7688..c6f9cfaa 100644 --- a/deps.edn +++ b/deps.edn @@ -18,16 +18,16 @@ ;;https://clojure.atlassian.net/browse/CLJS-3047 com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} org.clojure/clojurescript {:mvn/version "1.10.597"}}} - :build {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" - :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} + :build {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" + :git/sha "01797415ed4717b4e61a832c45b560d10ad88487"} org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" :git/tag "Release-1.4.100" :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} :ns-default build} ;; Generate an example: clojure -M:gen actor :gen {:main-opts ["run" "-m" "ctim.generate"]} - :deploy {:replace-deps {io.github.clojure/tools.build {:git/tag "v0.10.9" - :git/sha "e405aac49c67310f88ceeca7839881692abdde95"} + :deploy {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" + :git/sha "01797415ed4717b4e61a832c45b560d10ad88487"} slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}} :ns-default deploy} From 0d116f06eb5ccc416dae0342a46405459906c16a Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 19:50:51 -0500 Subject: [PATCH 60/64] wip --- deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index c6f9cfaa..764dc311 100644 --- a/deps.edn +++ b/deps.edn @@ -19,7 +19,7 @@ com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} org.clojure/clojurescript {:mvn/version "1.10.597"}}} :build {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" - :git/sha "01797415ed4717b4e61a832c45b560d10ad88487"} + :git/sha "feda89b625aae03dfe7212fd423b71409c41ba76"} org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" :git/tag "Release-1.4.100" :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} @@ -27,7 +27,7 @@ ;; Generate an example: clojure -M:gen actor :gen {:main-opts ["run" "-m" "ctim.generate"]} :deploy {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" - :git/sha "01797415ed4717b4e61a832c45b560d10ad88487"} + :git/sha "feda89b625aae03dfe7212fd423b71409c41ba76"} slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}} :ns-default deploy} From b7f2925c15b6740f9ee5c68511691407e44d5112 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 19:51:28 -0500 Subject: [PATCH 61/64] wip --- deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 764dc311..edc6cf06 100644 --- a/deps.edn +++ b/deps.edn @@ -19,7 +19,7 @@ com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} org.clojure/clojurescript {:mvn/version "1.10.597"}}} :build {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" - :git/sha "feda89b625aae03dfe7212fd423b71409c41ba76"} + :git/sha "59906d004950031726e0130703fc7be39c44d05c"} org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" :git/tag "Release-1.4.100" :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} @@ -27,7 +27,7 @@ ;; Generate an example: clojure -M:gen actor :gen {:main-opts ["run" "-m" "ctim.generate"]} :deploy {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" - :git/sha "feda89b625aae03dfe7212fd423b71409c41ba76"} + :git/sha "59906d004950031726e0130703fc7be39c44d05c"} slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}} :ns-default deploy} From b6c146da2e9a1648529afacdc5f74558f68db964 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 19:52:01 -0500 Subject: [PATCH 62/64] wip --- deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index edc6cf06..1331d4ad 100644 --- a/deps.edn +++ b/deps.edn @@ -19,7 +19,7 @@ com.google.code.findbugs/jsr305 {:mvn/version "3.0.2"} org.clojure/clojurescript {:mvn/version "1.10.597"}}} :build {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" - :git/sha "59906d004950031726e0130703fc7be39c44d05c"} + :git/sha "d71a9140cff5a1efecf8793fac29b2b7d3f77b45"} org.clj-commons/digest {:git/url "https://github.com/clj-commons/digest.git" :git/tag "Release-1.4.100" :git/sha "bec1e0e6b887bdb408674f0025357cc49b02b434"}} @@ -27,7 +27,7 @@ ;; Generate an example: clojure -M:gen actor :gen {:main-opts ["run" "-m" "ctim.generate"]} :deploy {:replace-deps {io.github.clojure/tools.build {:git/url "https://github.com/frenchy64/tools.build.git" - :git/sha "59906d004950031726e0130703fc7be39c44d05c"} + :git/sha "d71a9140cff5a1efecf8793fac29b2b7d3f77b45"} slipset/deps-deploy {:git/url "https://github.com/slipset/deps-deploy.git" :git/sha "07022b92d768590ab25b9ceb619ef17d2922da9a"}} :ns-default deploy} From c8b252f1a43cdfa78dd0bb27254a683b07c9311d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 19:56:00 -0500 Subject: [PATCH 63/64] wip --- build.clj | 43 ++++++------------------------------------- 1 file changed, 6 insertions(+), 37 deletions(-) diff --git a/build.clj b/build.clj index fdd1d120..72bdc9a9 100644 --- a/build.clj +++ b/build.clj @@ -17,34 +17,6 @@ [java.util.jar Manifest Attributes$Name] [java.util.regex Pattern])) -;; modified from tools.build with reproducible last modified time -(defn- add-zip-entry - [^ZipOutputStream output-stream ^String path ^File file] - (let [dir (.isDirectory file) - attrs (Files/readAttributes (.toPath file) BasicFileAttributes ^"[Ljava.nio.file.LinkOption;" (into-array LinkOption [])) - path (if (and dir (not (.endsWith path "/"))) (str path "/") path) - path (str/replace path \\ \/) ;; only use unix-style paths in jars - entry (doto (ZipEntry. path) - ;(.setSize (.size attrs)) - ;(.setLastAccessTime (.lastAccessTime attrs)) - (.setLastModifiedTime (or (some-> "SOURCE_DATE_EPOCH" - System/getenv - parse-long - (* 1000) - FileTime/fromMillis) - (.lastModifiedTime attrs))))] - (.putNextEntry output-stream entry) - (when-not dir - (with-open [fis (io/input-stream file)] - (io/copy fis output-stream))) - - (.closeEntry output-stream))) - -(let [orig clojure.tools.build.util.zip/fill-manifest!] - (defn- fill-manifest! - [manifest props] - (orig manifest (into (sorted-map) (dissoc props "Build-Jdk-Spec"))))) - (defn artifact-version [params] (let [{:keys [major minor schema release dev] :as m} (-> (io/file "resources/ctim/version.edn") slurp edn/read-string)] (str major "." @@ -59,6 +31,7 @@ (defn clean [params] (b/delete {:path "target"})) +#_ (defn- set-modification-times [{:keys [target source-date-epoch] :as params}] (when source-date-epoch (let [ms-epoch (* 1000 source-date-epoch)] @@ -66,6 +39,7 @@ (file-seq (io/file target))))) nil) +#_ (defn strip-nondeterminism [{:keys [jar-file] :as params}] (set-modification-times (assoc params :target jar-file)) ;; sets last modification time of MANIFEST.MF @@ -99,17 +73,12 @@ :src-dirs ["src" "doc"] :target-dir class-dir}) (let [jar-file (format "target/%s-%s.jar" (name lib) version)] - (with-redefs [;;TODO pin last modified time (push upstream) - clojure.tools.build.util.zip/add-zip-entry add-zip-entry - ;;TODO sort manifest entries (push upstream) - clojure.tools.build.util.zip/fill-manifest! fill-manifest!] - ;;TODO sort files in jar, but leave META-INF/MANFEST.MF first - ;; port the rest of https://github.com/Zlika/reproducible-build-maven-plugin/blob/d4f29db868ff0d39fabbef06c1fc3bf8179be089/src/main/java/io/github/zlika/reproducible/ZipStripper.java#L126 - (b/jar {:class-dir class-dir - :jar-file jar-file - :manifest {"Build-Jdk-Spec" "8"}})) + (b/jar {:class-dir class-dir + :jar-file jar-file + :manifest {"Build-Jdk-Spec" "8"}}) (-> params (assoc :jar-file jar-file) + #_ strip-nondeterminism))) (defn tag-release [{:keys [version] :as params}] From 67881919cea6766fc58be4a0fa2c3e40d7729020 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 13 Jun 2025 20:00:43 -0500 Subject: [PATCH 64/64] wip --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac235c51..d25b44f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: - uses: actions/checkout@v4 - run: | eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv) - brew install clojure strip-nondeterminism + brew install clojure clojure -T:build build :release true :source-date-epoch 1749762342 - uses: actions/upload-artifact@v4 with: