add git log parsing

add git log parsing

error: pathspec 'src/clj/gitomic/log_import.clj' did not match any file(s) known to git

--- src/clj/gitomic/log_import.clj
+++ src/clj/gitomic/log_import.clj
@@ -0,0 +1,60 @@
+(ns gitomic.log-import
+  (:require [clojure.java.io :as io]
+            [clojure.string :as string]
+            [clojure.edn :as edn]
+            [clojure.pprint :refer [pprint]]))
+
+; git log --pretty=format:'GITOMIC%n["%H" "%P" "%an" "%ae" #inst "%ad"]%n%s%n--%n%b%n--' --date=iso-strict --numstat --reverse
+
+(defn remove-empty-vals [m]
+  (reduce (fn [x [k v]]
+            (if (or (nil? v)
+                    (and (or (string? v) (coll? v)) (empty? v)))
+              (dissoc x k)
+              x))
+          m m))
+
+(defn parse-numstat [s]
+  (when-not (empty? s)
+    (let [[added deleted path] (string/split s #"\t")
+          as-num #(when-not (= "-" %) (edn/read-string %))]
+      (remove-empty-vals
+        {:change/path {:file/path path}
+         :change/added (edn/read-string added)
+         :change/deleted (edn/read-string deleted)}))))
+
+(defn parse-commit [raw-commit]
+  (try
+    (let [[sha parents author-name author-email committed-at] (edn/read-string (first raw-commit))
+          parents (string/split parents #"\s")
+          subject (second raw-commit)
+          [_ b _ changes] (partition-by (partial = "--")
+                                        (drop 2 raw-commit))
+          body (string/trim (string/join "\n" b))]
+      (remove-empty-vals
+        {:commit/sha sha
+         :commit/parents (if-not (= [""] parents) parents)
+         :commit/author {:person/name author-name
+                         :person/email author-email}
+         :commit/committed-at committed-at
+         :commit/merge? (> 1 (count parents))
+         :commit/subject subject
+         :commit/body (if-not (empty? body) body)
+         :commit/changes (into [] (remove nil? (map parse-numstat changes)))}))
+    (catch Exception e
+      (pprint raw-commit)
+      (throw e))))
+
+(defn split-commits [lines]
+  (->> lines
+       (partition-by #(.startsWith % "GITOMIC") )
+       (partition 2)
+       (map (comp (partial drop 1) vec flatten))))
+
+(defn read-log [f]
+  (with-open [r (io/reader f)]
+    (->> r
+         line-seq
+         split-commits
+         (map parse-commit)
+         doall)))


Kehaar 0.7.0 with bounded thread pools

Kehaar 0.7.0 with bounded thread pools

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/partner-http-api.git/'


Version 163

Version 163

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tobias/clojars-web.git/'


Version 1.12.1-SNAPSHOT

Version 1.12.1-SNAPSHOT

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starcity-properties/odin.git/'


Bump restQL-core version

Bump restQL-core version

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/B2W-BIT/restQL-server.git/'


Update deps & clojure

Update deps & clojure

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/voter-registration-works.git/'


Don't need the botchy geos anymore.

Don't need the botchy geos anymore.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mtravers/incidents.git/'


Eliminate dead code

Eliminate dead code

--- Clojure/src/ambly/repl/jsc.clj
+++ Clojure/src/ambly/repl/jsc.clj
@@ -1,6 +1,5 @@
 (ns ambly.repl.jsc
-  (:require [clojure.string :as string]
-            [clojure.java.io :as io]
+  (:require [clojure.java.io :as io]
             [cljs.analyzer :as ana]
             [cljs.compiler :as comp]
             [cljs.repl :as repl]
@@ -8,8 +7,7 @@
             [clojure.data.json :as json])
   (:import java.net.Socket
            java.lang.StringBuilder
-           [java.io File BufferedReader BufferedWriter]
-           [java.lang ProcessBuilder ProcessBuilder$Redirect]))
+           [java.io File BufferedReader BufferedWriter]))

 (defn socket [host port]
   (let [socket (Socket. host port)
@@ -74,8 +72,7 @@
           _    (.mkdirs output-dir)
           env  (ana/empty-env)
           core (io/resource "cljs/core.cljs")
-          root-path (.getCanonicalFile output-dir)
-          rewrite-path (str (.getPath root-path) File/separator "goog")]
+          root-path (.getCanonicalFile output-dir)]
       ;; TODO: temporary hack, should wait till we can read the start string
       ;; from the process - David
       (Thread/sleep 300)


scheduling fixes

scheduling fixes

--- src-clj/acha/db.clj
+++ src-clj/acha/db.clj
@@ -100,13 +100,13 @@
              where repoid= ?" id]))

 (defn- get-next-repo []
-  (query db ["select * from repo
+  (first (query db ["select * from repo
     where strftime('%s','now') - strftime('%s', timestamp) > 4*60*60 or timestamp is null
-    order by timestamp asc limit 1"]))
+    order by timestamp asc limit 1"])))

 (defn- try-to-update [repo]
-  (query db ["update repo set timestamp = now()
-    where id = ? and timestamp = ?" (:id repo) (:timestamp repo)]))
+  (update! db :repo {:timestamp "datetime('now')"}
+    ["id = ? and timestamp = ?" (:id repo) (:timestamp repo)]))

 (defn get-next-repo-to-process []
   (let [repo (get-next-repo)]


Add index page placeholder.

Add index page placeholder.

--- src/clojars/web.clj
+++ src/clojars/web.clj
@@ -194,6 +194,27 @@
         (tag "  <version>") (:version jar) (tag "</version>\n")
         (tag "</dependency>")]]]
      )))
+
+(defn index-page [account]
+  (html-doc account nil
+    "
Coming soon!

+
Clojars.org will be a dead easy jar repository for open source
+          Clojure libraries.

+
But what about Maven?

+
+
Maven is not exactly simple and it's a hassle
+        to get things into the central repository.  Maven central also
+        isn't suited for forking or personal projects.  Clojars is
+        intended to make distributing code as easy as possibe for
+        everyone.

+
But don't worry, the plan is to expose things as a Maven and Ivy compatible repository so you can use them if you want to.

+
But I hate Maven!

+
+
I hope to support other tools, such as Leiningen"" as well.

+
Isn't this just a Clojure clone of gemcutter.org?

+
Why mess with a good idea? :-)
"))

 (defn not-found-doc []
   (html [:h1 "Page not found"]
@@ -233,7 +254,8 @@
     [(session-assoc :account nil)
      (redirect-to "/")])
   (GET "/"
-    (html-doc (session :account) nil [:h1 "Hello World!"]))
+    (try-account
+     (index-page account)))
   (ANY "/*"
        (if-let [f (serve-file (params :*))]
          [{:headers {"Cache-Control" "max-age=3600"}} f]


remove custom bcrypt calls

remove custom bcrypt calls

--- src/clojars/db.clj
+++ src/clojars/db.clj
@@ -5,11 +5,11 @@
             [korma.db :refer [defdb transaction rollback]]
             [korma.core :refer [defentity select group fields order join
                                 modifier exec-raw where limit values with
-                                has-many raw insert update set-fields offset]])
+                                has-many raw insert update set-fields offset]]
+            [cemerick.friend.credentials :as creds])
   (:import java.security.MessageDigest
            java.util.Date
-           java.io.File
-           org.mindrot.jbcrypt.BCrypt))
+           java.io.File))

 (def ^{:private true} ssh-options
   "no-agent-forwarding,no-port-forwarding,no-pty,no-X11-forwarding")
@@ -41,7 +41,7 @@
   (Date.))

 (defn bcrypt [s]
-  (BCrypt/hashpw s (BCrypt/gensalt (:bcrypt-work-factor config))))
+  (creds/hash-bcrypt s :work-factor (:bcrypt-work-factor config)))

 (defdb mydb (:db config))
 (defentity users)


Generate initial state map

Generate initial state map

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kkroening/jackal.git/'


Custom SQL query to find both latest version and latest release

--- src/clojars/routes/api.clj
+++ src/clojars/routes/api.clj
@@ -1,5 +1,6 @@
 (ns clojars.routes.api
-  (:require [compojure.core :refer [GET ANY defroutes context]]
+  (:require [clojure.set :refer [rename-keys]]
+            [compojure.core :refer [GET ANY defroutes context]]
             [compojure.route :refer [not-found]]
             [clojars.db :as db]
             [clojars.web.common :as common]
@@ -19,13 +20,42 @@
                                                  versions)))
             json/generate-string)))

+(defn jars-by-groupname [groupname]
+    (exec-raw [(str
+              "select j.*, j2.version as latest_release "
+              "from jars j "
+              ;; Find the latest version
+              "join "
+              "(select jar_name, max(created) as created "
+              "from jars "
+              "group by group_name, jar_name) l "
+              "on j.jar_name = l.jar_name "
+              "and j.created = l.created "
+              ;; Find the latest release
+              "join "
+              "(select jar_name, max(created) as created "
+              "from jars "
+              "where version not like '%-SNAPSHOT' "
+              "group by group_name, jar_name) r "
+              "on j.jar_name = r.jar_name "
+              ;; Join with latest release
+              "join "
+              "(select jar_name, created, version from jars) as j2 "
+              "on j2.jar_name = j.jar_name "
+              "and j2.created = r.created "
+              "where j.group_name = ? "
+              "order by j.group_name asc, j.jar_name asc")
+             [groupname]]
+              :results))
+
 (defroutes routes
   (context "/api" []
     (GET ["/groups/:group-id", :group-id #"[^/]+"] [group-id]
       (let [stats (stats/all)]
-        (-> (db/jars-by-groupname group-id)
+        (-> (jars-by-groupname group-id)
             (->> (map (fn [jar]
                         (-> jar
+                            (rename-keys {:version :latest_version})
                             (dissoc :id :created :promoted_at)
                             (assoc :downloads (stats/download-count stats group-id (:jar_name jar)))))))
             json/generate-string)))


[#86] Allow run-server being called without any opts (@djui)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ptaoussanis/http-kit.git/'


Create jjolley.clj

Create jjolley.clj

error: pathspec 'src/clojure_club/x106_number_maze/jjolley.clj' did not match any file(s) known to git

--- src/clojure_club/x106_number_maze/jjolley.clj
+++ src/clojure_club/x106_number_maze/jjolley.clj
@@ -0,0 +1,12 @@
+(defn number-maze
+  [start finish]
+  (letfn [(a [x] (if (not= nil x) (+ 2 x)))
+          (d [x] (if (not= nil x) (* 2 x)))
+          (h [x] (if (and (not= nil x) (even? x)) (/ x 2)))
+          (append-ops [coll] (vector (conj coll a) (conj coll d) (conj coll h)))]
+    (loop [tree [[identity]]]
+      (if-let [path (some #(and (= finish ((apply comp %) start)) %) tree)]
+        (do
+          (println path)
+          (count path))
+        (recur (reduce #(into %1 (append-ops %2)) [] tree))))))


udp-server should only default to a nil atom if it is not passed a core

--- src/riemann/transport/udp.clj
+++ src/riemann/transport/udp.clj
@@ -108,7 +108,7 @@
   :pipeline-factory A ChannelPipelineFactory"
   ([] (udp-server {}))
   ([opts]
-   (let [core (atom nil)
+   (let [core (get opts :core (atom nil))
          host (get opts :host "127.0.0.1")
          port (get opts :port 5555)
          max-size (get opts :max-size 16384)


Add new example-based tests for parsing queries with s/conform

error: pathspec 'src/test/workflo/macros/specs/query_test.cljc' did not match any file(s) known to git

--- src/test/workflo/macros/specs/query_test.cljc
+++ src/test/workflo/macros/specs/query_test.cljc
@@ -0,0 +1,340 @@
+(ns workflo.macros.specs.query-test
+  (:require [clojure.test :refer [are deftest is]]
+            [clojure.spec :as s]
+            [workflo.macros.query :as q]
+            [workflo.macros.query.om-next :as om]
+            [workflo.macros.specs.query]))
+
+(deftest conforming-regular-properties
+  (are [out in] (= out (q/conform in))
+    '[[:property [:simple a]]]
+    '[a]
+
+    '[[:property [:simple a]]
+      [:property [:simple b]]]
+    '[a b]
+
+    '[[:property [:simple a]]
+      [:property [:simple b]]
+      [:property [:simple c]]]
+    '[a b c]))
+
+(deftest parsing-regular-properties
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :property}]
+    '[a]
+
+    '[{:name a :type :property}
+      {:name b :type :property}]
+    '[a b]
+
+    '[{:name a :type :property}
+      {:name b :type :property}
+      {:name c :type :property}]
+    '[a b c]))
+
+(deftest conforming-link-properties
+  (are [out in] (= out (q/conform in))
+    '[[:property [:link [a _]]]]
+    '[[a _]]
+
+    '[[:property [:link [a _]]]
+      [:property [:link [b 1]]]]
+    '[[a _] [b 1]]
+
+    '[[:property [:link [a _]]]
+      [:property [:link [b 1]]]
+      [:property [:link [c :x]]]]
+    '[[a _] [b 1] [c :x]]))
+
+(deftest parsing-link-properties
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :link :link-id _}]
+    '[[a _]]
+
+    '[{:name a :type :link :link-id _}
+      {:name b :type :link :link-id 1}]
+    '[[a _] [b 1]]
+
+    '[{:name a :type :link :link-id _}
+      {:name b :type :link :link-id 1}
+      {:name c :type :link :link-id :x}]
+    '[[a _] [b 1] [c :x]]))
+
+(deftest conforming-joins-with-a-simple-property-source
+  (are [out in] (= out (q/conform in))
+    '[[:property [:join [:properties {[:simple a]
+                                      [[:property [:simple b]]]}]]]]
+    '[{a [b]}]
+
+    '[[:property [:join [:properties {[:simple a]
+                                      [[:property [:simple b]]
+                                       [:property [:simple c]]]}]]]]
+    '[{a [b c]}]
+
+    '[[:property [:join [:properties {[:simple a]
+                                      [[:property [:simple b]]
+                                       [:property [:simple c]]]}]]]
+      [:property [:simple d]]]
+    '[{a [b c]} d]
+
+    '[[:property [:join [:properties {[:simple a]
+                                      [[:property [:simple b]]
+                                       [:property [:simple c]]]}]]]
+      [:property [:join [:properties {[:simple d]
+                                      [[:property [:simple e]]
+                                       [:property [:simple f]]]}]]]]
+    '[{a [b c]} {d [e f]}]
+
+    '[[:property [:join [:recursive {[:simple a]
+                                     [:unlimited ...]}]]]]
+    '[{a ...}]
+
+    '[[:property [:join [:recursive {[:simple a]
+                                     [:limited 5]}]]]]
+    '[{a 5}]
+
+    '[[:property [:join [:model {[:simple a]
+                                 [:model User]}]]]]
+    '[{a User}]))
+
+(deftest parsing-joins-with-a-simple-property-source
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target [{:name b :type :property}]}]
+    '[{a [b]}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target [{:name b :type :property}
+                     {:name c :type :property}]}]
+    '[{a [b c]}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target [{:name b :type :property}
+                     {:name c :type :property}]}
+      {:name d :type :property}]
+    '[{a [b c]} d]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target [{:name b :type :property}
+                     {:name c :type :property}]}
+      {:name d :type :join
+       :join-source {:name d :type :property}
+       :join-target [{:name e :type :property}
+                     {:name f :type :property}]}]
+    '[{a [b c]} {d [e f]}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target ...}]
+    '[{a ...}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target 5}]
+    '[{a 5}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target User}]
+    '[{a User}]))
+
+(deftest conforming-joins-with-a-link-source
+  (are [out in] (= out (q/conform in))
+    '[[:property [:join [:properties {[:link [a _]]
+                                      [[:property [:simple b]]]}]]]]
+    '[{[a _] [b]}]
+
+    '[[:property [:join [:properties {[:link [a 1]]
+                                      [[:property [:simple b]]
+                                       [:property [:simple c]]]}]]]]
+    '[{[a 1] [b c]}]
+
+    '[[:property [:join [:properties {[:link [a :x]]
+                                      [[:property [:simple b]]
+                                       [:property [:simple c]]
+                                       [:property [:simple d]]]}]]]]
+    '[{[a :x] [b c d]}]))
+
+(deftest parsing-joins-with-a-link-source
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :join
+       :join-source {:name a :type :link :link-id _}
+       :join-target [{:name b :type :property}]}]
+    '[{[a _] [b]}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :link :link-id 1}
+       :join-target [{:name b :type :property}
+                     {:name c :type :property}]}]
+    '[{[a 1] [b c]}]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :link :link-id :x}
+       :join-target [{:name b :type :property}
+                     {:name c :type :property}
+                     {:name d :type :property}]}]
+    '[{[a :x] [b c d]}]))
+
+(deftest conforming-prefixed-properties
+  (are [out in] (= out (q/conform in))
+    '[[:prefixed-properties {:base a
+                             :children [[:property [:simple b]]]}]]
+    '[a [b]]
+
+    '[[:prefixed-properties {:base a
+                             :children [[:property [:simple b]]
+                                        [:property [:simple c]]]}]]
+    '[a [b c]]
+
+    '[[:prefixed-properties {:base a
+                             :children [[:property [:simple b]]
+                                        [:property [:simple c]]]}]
+      [:property [:simple d]]]
+    '[a [b c] d]
+
+    '[[:prefixed-properties {:base a
+                             :children [[:property [:simple b]]
+                                        [:property [:simple c]]]}]
+      [[:prefixed-properties {:base d
+                              :children [[:property [:simple e]]
+                                         [:property [:simple f]]]}]]]
+    '[a [b c] d [e f]]))
+
+(deftest parsing-prefixed-properties
+ (are [out in] (= out (q/conform-and-parse in))
+   '[{:name a/b :type :property}]
+   '[a [b]]
+
+   '[{:name a/b :type :property}
+     {:name a/c :type :property}]
+   '[a [b c]]
+
+   '[{:name a/b :type :property}
+     {:name a/c :type :property}
+     {:name d :type :property}]
+   '[a [b c] d]
+
+   '[{:name a/b :type :property}
+     {:name a/c :type :property}
+     {:name d/e :type :property}
+     {:name d/f :type :property}]
+   '[a [b c] d [e f]]))
+
+(deftest conforming-aliased-regular-properties
+  (are [out in] (= out (q/conform in))
+    '[[:aliased-property {:property [:simple a] :as :as :alias b}]]
+    '[a :as b]
+
+    '[[:aliased-property {:property [:simple a] :as :as :alias b}]
+      [:aliased-property {:property [:simple c] :as :as :alias d}]]
+    '[a :as b c :as d]))
+
+(deftest parsing-aliased-regular-properties
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :property :alias b}]
+    '[a :as b]
+
+    '[{:name a :type :property :alias b}
+      {:name c :type :property :alias d}]
+    '[a :as b c :as d]))
+
+(deftest conforming-aliased-links
+  (are [out in] (= out (q/conform in))
+    '[[:aliased-property {:property [:link [a _]] :as :as :alias b}]]
+    '[[a _] :as b]
+
+    '[[:aliased-property {:property [:link [a 1]] :as :as :alias b}]]
+    '[[a 1] :as b]
+
+    '[[:aliased-property {:property [:link [a :x]] :as :as :alias b}]]
+    '[[a :x] :as b]
+
+    '[[:aliased-property {:property [:link [a _]] :as :as :alias b}]
+      [:aliased-property {:property [:link [c _]] :as :as :alias d}]]
+    '[[a _] :as b [c _] :as d]))
+
+(deftest parsing-aliased-links
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :link :link-id _ :alias b}]
+    '[[a _] :as b]
+
+    '[{:name a :type :link :link-id 1 :alias b}]
+    '[[a 1] :as b]
+
+    '[{:name a :type :link :link-id :x :alias b}]
+    '[[a :x] :as b]
+
+    '[{:name a :type :link :link-id _ :alias b}
+      {:name c :type :link :link-id _ :alias d}]
+    '[[a _] :as b [c _] :as d]))
+
+(deftest conforming-aliased-joins
+  (are [out in] (= out (q/conform in))
+    '[[:aliased-property
+       {:property [:join [:properties {[:simple a]
+                                       [[:property [:simple b]]]}]]
+        :as :as :alias c}]]
+    '[{a [b]} :as c]
+
+    '[[:aliased-property
+       {:property [:join [:properties {[:simple a]
+                                       [[:property [:simple b]]
+                                        [:property [:simple c]]]}]]
+        :as :as :alias d}]
+      [:aliased-property
+       {:property [:join [:properties {[:simple e]
+                                       [[:property [:simple f]]
+                                        [:property [:simple g]]]}]]
+        :as :as :alias h}]]
+    '[{a [b c]} :as d {e [f g]} :as h]))
+
+(deftest parsing-aliased-joins
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target [{:name b :type :property}]
+       :alias c}]
+    '[{a [b]} :as c]
+
+    '[{:name a :type :join
+       :join-source {:name a :type :property}
+       :join-target [{:name b :type :property}
+                     {:name c :type :property}]
+       :alias d}
+      {:name e :type :join
+       :join-source {:name e :type :property}
+       :join-target [{:name f :type :property}
+                     {:name g :type :property}]
+       :alias h}]
+    '[{a [b c]} :as d {e [f g]} :as h]))
+
+(deftest conforming-aliased-prefixed-properties
+  (are [out in] (= out (q/conform in))
+    '[[:prefixed-properties {:base a
+                             :children [[:aliased-property
+                                         {:property [:simple b]
+                                          :as :as :alias c}]]}]]
+    '[a [b :as c]]
+
+    '[[:prefixed-properties {:base a
+                             :children [[:aliased-property
+                                         {:property [:simple b]
+                                          :as :as :alias c}]
+                                        [:aliased-property
+                                         {:property [:simple d]
+                                          :as :as :alias e}]]}]]
+    '[a [b :as c d :as e]]))
+
+(deftest parsing-aliased-prefixed-properties
+  (are [out in] (= out (q/conform-and-parse in))
+    '[{:name a/b :type :property :alias c}]
+    '[a [b :as c]]
+
+    '[{:name a/b :type :property :alias c}
+      {:name a/d :type :property :alias e}]
+    '[a [b :as c d :as e]]))


Loading the world and the biome

Loading the world and the biome

error: pathspec 'src/amindblowingworld/world.clj' did not match any file(s) known to git

--- src/amindblowingworld/world.clj
+++ src/amindblowingworld/world.clj
@@ -0,0 +1,18 @@
+(ns amindblowingworld.views
+  )
+
+(import '(com.github.lands.World))
+
+(defn load-world [filename]
+  (let [f (java.io.File. filename)]
+    (. com.github.lands.PickleSerialization loadWorld f)))
+
+(def world (load-world "worlds/seed_13038.world"))
+
+(defn biome-matrix [world]
+  (let [w (-> world .getDimension .getWidth)
+        h (-> world .getDimension .getHeight)
+        b (-> world .getBiome)]
+    (for [y (range h)]
+      (for [x (range w)]
+        (.get b x y)))))


fix lein profiles.clj, add missing [] for :repl profile

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/pervezfunctor/lean-dotfiles.git/'


remove logging statement

remove logging statement

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clojurecup/cc2014-frontend.git/'


fix a test now that sendable-messages is gone

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/scheduled-message-works.git/'


Testing different bases, RFC 6979 deterministic signatures, public key recovery from signatures

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xcthulhu/clj-bitauth.git/'


fix grammar of comment

fix grammar of comment

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/runoshun/syncat.git/'


Add support for election day voter reg to imports

Refactor ovr-iframe function to be more generic

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/election-authority-works.git/'


Clojure Collector: added support for /:vendor/:version to HEAD (closes #1166)

--- 2-collectors/clojure-collector/java-servlet/src/snowplow/clojure_collector/core.clj
+++ 2-collectors/clojure-collector/java-servlet/src/snowplow/clojure_collector/core.clj
@@ -15,7 +15,7 @@

 (ns snowplow.clojure-collector.core
   "Core app handler"
-  (:use [compojure.core              :only [defroutes GET POST]]
+  (:use [compojure.core              :only [defroutes GET POST HEAD]]
         [ring.middleware.cookies     :only [wrap-cookies]]
         [ring.middleware.reload      :only [wrap-reload]]
         [ring.middleware.stacktrace  :only [wrap-stacktrace]]
@@ -43,6 +43,7 @@
   (GET  "/ice.png"            {c :cookies} (send-cookie-pixel-or-200' c true))  ; legacy name for i
   (GET  "/:vendor/:version"   {c :cookies} (send-cookie-pixel-or-200' c true))  ; for tracker GET support
   (POST "/:vendor/:version"   {c :cookies} (send-cookie-pixel-or-200' c false)) ; for tracker POST support, no pixel
+  (HEAD "/:vendor/:version"   request responses/send-200)                       ; for webhooks' own checks e.g. Mandrill
   (GET  "/healthcheck"        request responses/send-200)
   ;GET "/status"              available from expose-metrics-as-json, only in development env
   ;HEAD "/"                   available from beanstalk.clj


indnet

indnet

error: pathspec 'src/bluebell/specs/indent.clj' did not match any file(s) known to git

--- src/bluebell/specs/indent.clj
+++ src/bluebell/specs/indent.clj
@@ -0,0 +1,7 @@
+(ns bluebell.specs.indent
+  (:require [clojure.spec.alpha :as spec]))
+
+(spec/def ::step number?)
+(spec/def ::prefix string?)
+(spec/def ::settings (spec/keys :req-un [::step ::prefix]))
+


A little demo of tables nested within tables. Erk.

error: pathspec 'test/user/fus_tabular.clj' did not match any file(s) known to git

--- test/user/fus_tabular.clj
+++ test/user/fus_tabular.clj
@@ -0,0 +1,12 @@
+(ns user.fus-tabular
+  (:use midje.sweet
+        midje.test-util))
+
+(tabular "Crazy nesting"
+  (fact
+    (tabular (fact (+ ?a ?b) => ?c)
+      ?a ?b
+      1  2
+      2  1))
+  ?c
+  3)


Add stub for space-age

Add stub for space-age

error: pathspec 'exercises/space-age/src/space_age.clj' did not match any file(s) known to git

--- exercises/space-age/src/space_age.clj
+++ exercises/space-age/src/space_age.clj
@@ -0,0 +1,33 @@
+(ns space-age)
+
+(defn on-mercury [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn on-venus [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn on-earth [] ;; <- Arglist goes here
+      ;; your code goes here
+      )
+
+(defn on-mars [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn on-jupiter [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn on-saturn [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn on-neptune [] ;; <- Arglist goes here
+  ;; your code goes here
+  )
+
+(defn on-uranus [] ;; <- Arglist goes here
+  ;; your code goes here
+  )


added missing tests

added missing tests

error: pathspec 'test/ctia/lib/es/query_test.clj' did not match any file(s) known to git

--- test/ctia/lib/es/query_test.clj
+++ test/ctia/lib/es/query_test.clj
@@ -0,0 +1,24 @@
+(ns ctia.lib.es.query-test
+  (:require [ctia.lib.es.query :as q]
+            [clojure.test :refer [deftest is]]))
+
+(deftest nested-terms-test
+  (is (= (q/nested-terms [[[:observable :type] "ip"]
+                          [[:observable :value] "42.42.42.1"]])
+
+         [{:terms {"observable.type" ["ip"]}}
+          {:terms {"observable.value" ["42.42.42.1"]}}])))
+
+(deftest filter-map->terms-query-test
+  (is (= {:filtered
+          {:query {:match_all {}},
+           :filter
+           {:bool
+            {:must
+             [{:terms {"observable.type" ["ip"]}}
+              {:terms {"observable.value" ["10.0.0.1"]}}
+              {:terms {"test" ["ok"]}}]}}}}
+
+         (q/filter-map->terms-query {[:observable :type] "ip"
+                                     [:observable :value] "10.0.0.1"
+                                     :test "ok"}))))


Added pahrmgkb gene-disease relation rule

Removed original pharmgkb relations rules file. Added variables for use
with ccp ext ontology and formatted file

error: pathspec 'resources/rules/post_identifier_merge/temp/pharmgkb/pharmgkb_gene_disease_relations.clj' did not match any file(s) known to git

--- resources/rules/post_identifier_merge/temp/pharmgkb/pharmgkb_gene_disease_relations.clj
+++ resources/rules/post_identifier_merge/temp/pharmgkb/pharmgkb_gene_disease_relations.clj
@@ -0,0 +1,87 @@
+;; --------------------------------------------------
+;; --------- PharmGKB Gene Disease Relation ---------
+;; --------------------------------------------------
+`{:name "pharmgkb-gene-disease-relation"
+  :description "This rule assigns relations between genes and diseases"
+  ;; this need to be hashed and have proper classes
+  :head (
+         ;; create a subclass of the drug that will participate in the interaction
+         (?/disease_sc rdfs/subClassOf ?/disease)
+
+         ;; create a subclass of the gene_or_gene_product that will participate in the interaction
+         (?/gene_or_gene_product_sc rdfs/subClassOf ?/gene_or_gene_product)
+
+         ;; create interaction subclass
+         (?/interaction rdfs/subClassOf obo/MI_0000) ; MI:interaction
+
+         ;; link the interaction to the disease participant
+         (?/disease_participant_restriction rdf/type owl/Restriction)
+         (?/disease_participant_restriction owl/onProperty obo/RO_0000057) ; RO:has_participant
+         (?/disease_participant_restriction owl/someValuesFrom ?/disease_sc)
+
+         ;; link the interaction to the gene or gene product participant
+         (?/gene_or_gene_product_participant_restriction rdf/type owl/Restriction)
+         (?/gene_or_gene_product_participant_restriction owl/onProperty obo/RO_0000057) ; RO:has_participant
+         (?/gene_or_gene_product_participant_restriction owl/someValuesFrom ?/gene_or_gene_product_sc)
+
+         ;; this interaction realizes the disease_role that inheres_in the disease
+         (?/realizes_disease_role_restriction rdf/type owl/Restriction)
+         (?/realizes_disease_role_restriction owl/onProperty obo/BFO_0000055) ; BFO:realizes
+         (?/realizes_disease_role_restriction owl/someValuesFrom ?/inheres)
+
+         ;; create a new anonymous class that inheres_in in this specific disease so that it can be realized by the restriction above
+         (?/inheres_restriction rdf/type owl/Restriction)
+         (?/inheres_restriction owl/onProperty obo/RO_0000052) ; RO:inheres_in
+         (?/inheres_restriction owl/someValuesFrom ?/disease_sc)
+         (?/inheres rdfs/subClassOf obo/CHEBI_23888) ; CHEBI:drug - NEEDS TO BE FIXED
+         (?/inheres rdfs/subClassOf ?/inheres_restriction)
+
+         ;;make the interaction be necessarily part of these 3 restrictions
+         ;;still need to add a sufficient definition
+         (?/interaction rdfs/subClassOf ?/disease_participant_restriction)
+         (?/interaction rdfs/subClassOf ?/gene_or_gene_product_participant_restriction)
+         (?/interaction rdfs/subClassOf ?/realizes_disease_role_restriction))
+
+  :body ((?/record rdf/type ccp/IAO_EXT_0000823) ; ccp:PharmGKB_relation_record
+
+         ;; retrieve entity type data field 1 - gene
+         (?/record obo/BFO_0000051 ?/type_1_field_value) ; BFO:has_part
+         (?/type_1_field_value rdf/type ccp/IAO_EXT_0001038) ; ccp:PharmGKB_relation_record__entity_1_type_field_value
+         (?/type_1_field_value rdf/type ?/type_1_type_id)
+         (?/type_1_id obo/IAO_0000219 ?/gene_or_gene_product_sc) ; IAO:denotes
+
+         ;; retrieve entity data identifier field 1 - gene
+         (?/record obo/BFO_0000051 ?/identifier_1_field_value) ; BFO:has_part
+         (?/identifier_1_field_value rdf/type ccp/IAO_EXT_0001036) ; ccp:PharmGKB_relation_record__entity_1_identifier_field_value
+         (?/identifier_1_field_value rdf/type ?/identifier_1_ice_id)
+         (?/identifier_1_ice_id obo/IAO_0000219 ?/gene_or_gene_product_sc) ; IAO:denotes
+
+         ;; retrieve entity type data field 2 - disease
+         (?/record obo/BFO_0000051 ?/type_2_field_value) ; BFO:has_part
+         (?/type_2_field_value rdf/type ccp/IAO_EXT_0001040) ; ccp:PharmGKB_relation_record__entity_2_type_field_value
+         (?/type_2_field_value rdf/type ?/type_2_id)
+         (?/type_2_id obo/IAO_0000219 ?/disease_sc) ; IAO:denotes
+
+         ;; retrieve entity data identifier field 2 - disease
+         (?/record obo/BFO_0000051 ?/identifier_2_field_value) ; BFO:has_part
+         (?/identifier_2_field_value rdf/type ccp/IAO_EXT_0001041) ; ccp:PharmGKB_relation_record__entity_2_identifier_field_value
+         (?/identifier_2_field_value rdf/type ?/identifier_2_ice_id)
+         (?/identifier_2_ice_id obo/IAO_0000219 ?/disease_sc)) ; IAO:denotes
+
+  :reify ([?/interaction {:ln (:sha-1 "interaction" ?/gene_or_gene_product ?/disease)
+                          :ns "ccp" :prefix "I_"}]
+          [?/gene_or_gene_product_sc {:ln (:sha-1 ?/gene_or_gene_product ?/disease)
+                       :ns "ccp" :prefix "B_"}]
+          [?/disease_sc {:ln (:sha-1 ?/gene_or_gene_product ?/disease)
+                       :ns "ccp" :prefix "D_"}]
+          [?/gene_or_gene_product_participant_restriction {:ln (:restriction)
+                 :ns "ccp" :prefix "R_"}]
+          [?/disease_participant_restriction {:ln (:restriction)
+                 :ns "ccp" :prefix "R_"}]
+          [?/realizes_disease_role_restriction {:ln (:restriction)
+                 :ns "ccp" :prefix "R_"}]
+          [?/inheres_restriction {:ln (:restriction)
+                 :ns "ccp" :prefix "R_"}]
+          [?/inheres {:ln (:sha-1 "drugrole" ?/disease)
+                          :ns "ccp" :prefix "D_"}])
+  }


Try and make travis happier with updated midje deps, less sonatype

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/terrancesnyder/engulf.git/'


Use true single-segment versions.

Use true single-segment versions.

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject clojars-web "24.0.0-SNAPSHOT"
+(defproject clojars-web "24-SNAPSHOT"
   :min-lein-version "2.0.0"
   :dependencies [[org.clojure/clojure "1.7.0"]
                  [org.clojure/tools.cli "0.2.1"]
@@ -39,13 +39,14 @@
                  [duct "0.4.4"]
                  [meta-merge "0.1.1"]
                  [ring-jetty-component "0.3.0"]]
+  :plugins [[supersport "1"]]
   :main ^:skip-aot clojars.main
   :target-path "target/%s/"
   :release-tasks [["vcs" "assert-committed"]
-                  ["change" "version" "leiningen.release/bump-version" "release"]
+                  ["change" "version" "super.sport/bump-version" "release"]
                   ["vcs" "commit"]
                   ["vcs" "tag"]
-                  ["change" "version" "leiningen.release/bump-version" "major"]
+                  ["change" "version" "super.sport/bump-version"]
                   ["vcs" "commit"]
                   ["vcs" "push"]]
   :aliases {"migrate" ["run" "-m" "clojars.db.migrate"]}


Remove (nonexistent) handler

Remove (nonexistent) handler

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/physion/ovation-webapi.git/'


Version 1.4.0-SNAPSHOT

Version 1.4.0-SNAPSHOT

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/starcity-properties/odin.git/'


:arrow_up: Update dependencies

:arrow_up: Update dependencies

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/maoo/bot-unfurl.git/'


Version 0.3.2-SNAPSHOT

Version 0.3.2-SNAPSHOT

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nathanielksmith/trapperkeeper-status.git/'


use latest teller

use latest teller


added leiningen build

added leiningen build

error: pathspec 'project.clj' did not match any file(s) known to git

--- project.clj
+++ project.clj
@@ -0,0 +1,5 @@
+(defproject com.contentjon/hardware "0.0.5"
+  :dependencies [[org.clojure/clojure  "1.3.0"]
+                 [net.java.dev.jna/jna "3.2.4"]]
+  :source-paths ["src/main/clojure"]
+  :test-paths   ["src/test/clojure"])


Version 41

Version 41

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject clojars-web "41-SNAPSHOT"
+(defproject clojars-web "41"
   :min-lein-version "2.0.0"
   :dependencies [[org.clojure/clojure "1.8.0"]
                  [org.clojure/tools.cli "0.2.1"]


Upgrade aleph and logback-classic to latest versions.

--- project.clj
+++ project.clj
@@ -17,7 +17,7 @@
                  [amalloy/ring-gzip-middleware "0.1.2"]

                  [clj-json "0.5.0"]
-                 [aleph "0.2.2-rc1"]
+                 [aleph "0.2.2"]

                  ;; logging
                  [org.clojure/tools.logging "0.2.4"
@@ -26,7 +26,7 @@
                    commons-logging/commons-logging
                    org.slf4j/slf4j-api
                    org.slf4j/slf4j-log4j12]]
-                 [ch.qos.logback/logback-classic "1.0.6"]
+                 [ch.qos.logback/logback-classic "1.0.7"]
                  [org.slf4j/log4j-over-slf4j "1.6.6"]

                  ;; database


Add rc files.

Add rc files.

error: pathspec 'rc/profiles.clj' did not match any file(s) known to git

--- rc/profiles.clj
+++ rc/profiles.clj
@@ -0,0 +1,7 @@
+;; ln -s ${JV_ENV_HOME}/rc/profiles.clj ~/.lein/profiles.clj
+
+
+{:repl {:plugins [[cider/cider-nrepl "0.13.0"]]
+        :dependencies [[org.clojure/tools.nrepl "0.2.12"]]}
+
+ :user {:plugins [[jonase/eastwood "0.2.3"]] }}


some cleanup

some cleanup

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ducky427/movies-cljs-rn.git/'


bump version

bump version

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jtbeckha/alda.git/'


Generalize an onChange handler.

Generalize an onChange handler.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/cstorey/nrod.git/'


Deliver path before deleting dir

Deliver path before deleting dir

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bsmr-clojure/Nightcode.git/'


uploading utilities namespace

uploading utilities namespace

error: pathspec 'src/sms_client/utilities.cljs' did not match any file(s) known to git

--- src/sms_client/utilities.cljs
+++ src/sms_client/utilities.cljs
@@ -0,0 +1,17 @@
+(ns sms-client.utilities)
+
+(set! js/window.React (js/require "react-native"))
+
+(def platform-os (.-OS (.-Platform js/React)))
+(def ios? (= platform-os "ios"))
+(def android? (= platform-os "android"))
+
+(def irish-mobile-num
+  #"(0|\+353|353)(83|85|86|87|88|89)\d{7}")
+(defn valid-num? [phone-number]
+  (not (re-matches irish-mobile-num
+                   phone-number)))
+
+(def comp-time
+  (fn [x y]
+    (> (:timestamp x) (:timestamp y))))


Switching over to using hashes

Switching over to using hashes

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xcthulhu/clj-bitauth.git/'


The overrides will eventually be generated from this cljs file.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/shaunstanislaus/cljs2go.git/'


Add crude scales.

Add crude scales.


fun programming ex

fun programming ex

error: pathspec 'examples/funprogramming.clj' did not match any file(s) known to git

--- examples/funprogramming.clj
+++ examples/funprogramming.clj
@@ -0,0 +1,246 @@
+;; https://www.funprogramming.org/
+
+(ns examples.funprogramming
+  (:require [clojure2d.core :refer :all]
+            [clojure2d.math.random :as r]
+            [clojure2d.math :as m]))
+
+;; Below setup is not necessary. I use it to be sure everything is as fast as possible
+(set! *warn-on-reflection* true)
+(set! *unchecked-math* :warn-on-boxed)
+(m/use-primitive-operators)
+
+;; https://www.funprogramming.org/2-Download-Processing-Use-point-and-line.html
+
+;; Comments:
+;;
+;; * Default canvas and window is 200x200
+;; * Window and canvas are separate concepts, you draw on canvas, window just displays it
+;; * Canvas has different qualities (`:low`, `:mid` and `:high`). Default is `:high`. `point` looks blurred due to antialiasing.
+;; * Default background is black, color is white
+;; * To draw on canvas you have to create context with `with-canvas->` or `with-canvas` macros
+;; * Default window creates canvas for you, to access it use `get-canvas` function
+
+(let [window (show-window)]
+  (with-canvas-> (get-canvas window)
+    (point 50 50)
+    (point 51 50)
+    (point 52 50)
+    (point 53 50)
+    (point 54 50)
+    (point 55 50)
+    (line 0 0 199 199)))
+
+;; https://www.funprogramming.org/3-Create-an-animation-use-random.html
+
+;; Comments:
+;;
+;; * Draw function accepts 4 parameters
+;;   * canvas in context (created for you before call, so you don't need to use `with-canvas...` macro)
+;;   * window where canvas is drawn
+;;   * current frame number (like `frameCount` in Processing)
+;;   * state as value returned from previous call or initial state (set during creating window) or nil
+;; * `drand` returns `double` type random number. To get `int` call `irand`
+;; * To bound `draw` to window pass it as parameter when creating one
+;; * Some colors have their names (based on 140 HTML color names). You can use name (as keyword not string) instead of RGB values.
+
+(let [draw (fn [canvas window frame state]
+             (-> canvas
+                 (set-background 255 204 0)
+                 (set-color :black)
+                 (line (r/drand 200)
+                       (r/drand 200)
+                       (r/drand 200)
+                       (r/drand 200))))]
+  (show-window {:draw-fn draw}))
+
+;; https://www.funprogramming.org/4-Shades-of-gray-and-colors-frameRate.html
+
+(let [draw (fn [canvas window frame state]
+             (set-background canvas (r/irand 255) (r/irand 255) (r/irand 255)))]
+  (show-window {:draw-fn draw
+                :fps 4}))
+
+;; https://www.funprogramming.org/5-Light-speed-effect-change-line-colors.html
+
+;; Difference:
+;;
+;; Remember, default window is 200x200
+
+(let [draw (fn [canvas window frame state]
+             (-> canvas
+                 (set-color 0 (r/irand 255) 0)
+                 (line 100 100 (r/drand 200) (r/drand 200))))]
+  (show-window {:draw-fn draw}))
+
+;; https://www.funprogramming.org/6-Animate-white-lines-across-the-display.html
+
+(let [draw (fn [canvas window frame state]
+             (-> canvas
+                 (set-background :black)
+                 (set-color :white)
+                 (line 0 (r/drand 200) 200 (r/drand 200))))]
+  (show-window {:draw-fn draw}))
+
+;; https://www.funprogramming.org/7-Animate-horizontal-lines-use-a-variable.html
+
+(let [draw (fn [canvas window frame state]
+             (let [distance-top (r/drand 200)]
+               (-> canvas
+                   (set-background :black)
+                   (set-color :white)
+                   (line 0 distance-top 199 distance-top))))]
+  (show-window {:draw-fn draw}))
+
+;; https://www.funprogramming.org/8-Animate-vertical-lines.html
+
+(let [draw (fn [canvas window frame state]
+             (let [distance-left (r/drand 200)]
+               (-> canvas
+                   (set-background :black)
+                   (set-color :white)
+                   (line distance-left 0 distance-left 199))))]
+  (show-window {:draw-fn draw}))
+
+;; https://www.funprogramming.org/9-Change-screen-size-animate-colorful-lines.html
+
+;; Comments:
+;;
+;; Here I explicitely create canvas and set its size. Please note: canvas size and window size can be different.
+;; In such case result will be shrinked or stretched. To set window size use `:width` and `:height` parameters.
+
+(let [draw (fn [canvas window frame state]
+             (let [distance-left (r/drand 200)]
+               (-> canvas
+                   ;; (set-background :black)
+                   (set-color (r/irand 200 256)
+                              (r/irand 200 256)
+                              (r/irand 50 100))
+                   (line distance-left 0 distance-left 199))))]
+  (show-window {:canvas (make-canvas 200 200)
+                :draw-fn draw
+                :setup (fn [canvas _]
+                         (set-background canvas :gray))}))
+
+;; https://www.funprogramming.org/10-Draw-circles-and-rectangles-change-fill-color.html
+
+;; Comments
+;;
+;; * Color can be represented as hex int instead of # form
+;; * There is no stroke/fill here. You have to draw twice setting `stroke?` parameter to true/false.
+;; * `crect` is centered version of `rect`
+;; * `ellipse` is centered already
+;; * `:mid` is used for quality similar to default in Processing
+
+(let [canvas (make-canvas 400 400 :mid)
+      window (show-window {:canvas canvas})]
+  (with-canvas-> canvas
+    (set-background 0xC0E1EA)
+
+    (set-color 0xB6FF00)
+    (crect 200 200 150 150)
+    (set-color 0xFFBC03)
+    (crect 200 200 150 150 true)
+
+    (set-color 0xB6FF00)
+    (ellipse 200 200 150 150)
+    (set-color 0xFFBC03)
+    (ellipse 200 200 150 150 true)))
+
+;; https://www.funprogramming.org/11-Non-random-animation-of-a-circle-crossing-the-screen.html
+
+;; Comments:
+;;
+;; * I use state to keep current circle position, state initialization is done by using `:draw-state` parameter for window.
+
+(let [draw (fn [canvas window frame ^double circle-x]
+             (-> canvas
+                 (set-background 0x1BB1F5)
+                 (set-color 0xC1FF3E)
+                 (ellipse circle-x 50 50 50))
+             (inc circle-x))]
+  (show-window {:canvas (make-canvas 400 400)
+                :draw-fn draw
+                :draw-state 0.0}))
+
+;; https://www.funprogramming.org/12-Do-a-loop-animation-using-an-if-statement.html
+
+(let [draw (fn [canvas window frame [^double slow-circle-x ^double fast-circle-x]]
+             (-> canvas
+                 (set-background 0x1BB1F5)
+                 (set-color 0xC1FF3E)
+                 (ellipse slow-circle-x 50 50 50)
+                 (set-color 0xFF4800)
+                 (ellipse fast-circle-x 50 50 50))
+             [(if (> slow-circle-x 400.0) 0.0 (inc slow-circle-x))
+              (if (> fast-circle-x 400.0) 0.0 (+ fast-circle-x 5.0))])]
+  (show-window {:canvas (make-canvas 400 400)
+                :draw-fn draw
+                :draw-state [0.0 0.0]}))
+
+;; https://www.funprogramming.org/13-Event-happening-only-sometimes.html
+
+;; Comments:
+;;
+;; To get some value with random probability use `randval`
+
+(let [draw (fn [canvas window frame [^double slow-circle-x ^double fast-circle-x]]
+             (let [slow-circle-size (r/randval 0.1 60 50)]
+               (-> canvas
+                   (set-background 0x1BB1F5)
+                   (set-color 0xC1FF3E)
+                   (ellipse slow-circle-x 50 slow-circle-size slow-circle-size)
+                   (set-color 0xFF4800)
+                   (ellipse fast-circle-x 50 50 50)))
+             [(if (> slow-circle-x 400.0) 0.0 (inc slow-circle-x))
+              (if (> fast-circle-x 400.0) 0.0 (+ fast-circle-x 5.0))])]
+  (show-window {:canvas (make-canvas 400 400)
+                :draw-fn draw
+                :draw-state [0.0 0.0]}))
+
+;; https://www.funprogramming.org/14-New-directions-for-our-moving-circle.html
+
+(let [draw (fn [canvas window frame [^double circle-x ^double circle-y]]
+             (let [slow-circle-size (r/randval 0.1 60 50)]
+               (-> canvas
+                   (set-background 0x21EA73)
+                   (set-color :white)
+                   (ellipse circle-x circle-y 40 40)
+                   (set-stroke 7.0)
+                   (set-color 0xD60DFF)
+                   (ellipse circle-x circle-y 40 40 true)))
+             [(- circle-x 2.0)
+              (+ circle-y 2.0)])]
+  (show-window {:canvas (make-canvas 400 200)
+                :draw-fn draw
+                :draw-state [300.0 20.0]}))
+
+;; https://www.funprogramming.org/15-Ball-bouncing-at-the-window-borders.html
+
+(let [draw (fn [canvas window frame [^double circle-x ^double circle-y ^double move-x ^double move-y]]
+             (let [slow-circle-size (r/randval 0.1 60 50)
+                   circle-x (+ circle-x move-x)
+                   circle-y (+ circle-y move-y)
+                   [ncircle-x nmove-x] (cond
+                                         (> circle-x ^int (width canvas)) (do (println "too far right")
+                                                                              [(width canvas) (- move-x)])
+                                         (< circle-x 0.0) (do (println "too far left")
+                                                              [0.0 (- move-x)])
+                                         :else [circle-x move-x])
+                   [ncircle-y nmove-y] (cond
+                                         (> circle-y ^int (height canvas)) (do (println "too far bottom")
+                                                                               [(height canvas) (- move-y)])
+                                         (< circle-y 0.0) (do (println "too far top")
+                                                              [0.0 (- move-y)])
+                                         :else [circle-y move-y])]
+               (-> canvas
+                   (set-background 0x21EA73)
+                   (set-color :white)
+                   (ellipse ncircle-x ncircle-y 40 40)
+                   (set-stroke 7.0)
+                   (set-color 0xD60DFF)
+                   (ellipse ncircle-x ncircle-y 40 40 true))
+               [ncircle-x ncircle-y nmove-x nmove-y]))]
+  (show-window {:canvas (make-canvas 400 200)
+                :draw-fn draw
+                :draw-state [300.0 20.0 2.0 -2.0]}))


Smoke test for Team

Smoke test for Team


support cljc

support cljc

--- sidecar/src/figwheel_sidecar/core.clj
+++ sidecar/src/figwheel_sidecar/core.clj
@@ -201,7 +201,8 @@
                  ;; need to test this
                  (filter #(= ".cljs" (second (split-ext %)))
                          (keys new-mtimes))
-                 (:cljs changed-source-file-paths))))))
+                 (concat (:cljs changed-source-file-paths)
+                         (:cljc changed-source-file-paths)))))))

 (let [root (norm-path (.getCanonicalPath (io/file ".")))]
   (defn remove-root-path
@@ -363,10 +364,13 @@
   ;; are made explicitely
   ([state old-mtimes new-mtimes additional-ns]
    (binding [*memo-get-deps* (memoize get-deps)]
-     (notify-cljs-ns-changes state
-       (set (concat additional-ns
-                    (keep get-ns-from-source-file-path
-                          (:cljs (get-changed-source-file-paths old-mtimes new-mtimes)))))))))
+     (let [change-source-file-paths (get-changed-source-file-paths old-mtimes new-mtimes)]
+       (notify-cljs-ns-changes state
+                               (set (concat additional-ns
+                                            (keep get-ns-from-source-file-path
+                                                  (concat
+                                                   (:cljs change-source-file-paths)
+                                                   (:cljc change-source-file-paths))))))))))

 ;; css changes
 ;; this can be moved out of here I think


Brutality.

Brutality.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mtravers/incidents.git/'


Extreme deduplication of parser spec

Extreme deduplication of parser spec

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/couragelabs/coachbot.git/'


ClojureScript compiler watching source.

ClojureScript compiler watching source.

To speed up the process of compiling ClojureScript files, the compiler provides a method, `watch`, that watches a directory for changes. If changes occur to that directory (adding ClojureScript source files, changing existing source files, or, I suspect, deleting source files), the compiler will rebuild the necessary files.

error: pathspec 'mywebapp/watch.clj' did not match any file(s) known to git

--- mywebapp/watch.clj
+++ mywebapp/watch.clj
@@ -0,0 +1,9 @@
+(require '[cljs.build.api :as b])
+
+(b/watch "src"
+         {:output-to "main.js"
+          :output-dir "out/"
+          :source-map "main.js.map"
+          :main 'mywebapp.core
+          ;; Do not need verbose because watching **already** provides verbose output (I think).
+          :optimizations :none})


graph stuff ahoy

graph stuff ahoy

error: pathspec 'src/com/athuey/cambo/graph.cljc' did not match any file(s) known to git

--- src/com/athuey/cambo/graph.cljc
+++ src/com/athuey/cambo/graph.cljc
@@ -0,0 +1,117 @@
+(ns com.athuey.cambo.graph
+  (:refer-clojure :exclude [get set atom ref keys])
+  (:require [com.athuey.cambo.core :refer [boxed? atom atom? ref? keys] :as core]))
+
+;; TODO: handle path-value(s)
+
+(defn get
+  ([graph pathsets]
+   (get graph pathsets {:normalize false}))
+  ([graph pathsets {:keys [normalize]}]
+   (letfn [(get-pathset [node path opt result [ks & pathset :as ps]]
+             ;; TODO: might be able to flatten this kinda like set
+             (cond
+               (nil? node)
+               (update result :missing conj (into opt ps))
+
+               (boxed? node)
+               result
+
+               (seq pathset)
+               (reduce (fn [result k]
+                         (let [node' (clojure.core/get node k)]
+                           (if (ref? node')
+                             (let [result (if normalize
+                                            (assoc-in result (into [:graph] (conj opt k)) node')
+                                            result)
+                                   path' (:path node')]
+                               (get-pathset (get-in graph path')
+                                            (conj path k)
+                                            path'
+                                            result
+                                            pathset))
+                             (get-pathset node'
+                                          (conj path k)
+                                          (conj opt k)
+                                          result
+                                          pathset))))
+                       result
+                       (keys ks))
+
+               :else
+               (reduce (fn [result k]
+                         (let [value (clojure.core/get node k)]
+                           ;; TODO: do we want to require boxed graph?
+                           (if (atom? value)
+                             (assoc-in result
+                                       (into [:graph] (if normalize
+                                                        (conj opt k)
+                                                        (conj path k)))
+                                       value)
+                             (update result :missing conj (conj opt k)))))
+                       result
+                       (keys ks))))]
+
+     (reduce (partial get-pathset graph [] [])
+             {:graph {}
+              :missing []}
+             pathsets))))
+
+(defn set
+  ([graph pathmaps]
+   (set graph pathmaps {}))
+  ;; TODO: maybe boxed vs unboxed option?
+  ([graph pathmaps _]
+   (letfn [(set-pathmap [graph path opt pathmap]
+             (let [node (get-in graph (into [:graph] opt))
+                   graph (cond-> graph
+                                 (or (atom? node)
+                                     (not (map? node)))
+                                 (assoc-in (into [:graph] path) {}))
+                   opt (if (ref? node)
+                         (:value node)
+                         opt)]
+               (reduce (fn [graph k]
+                         (let [value (clojure.core/get pathmap k)
+                               path' (conj path k)
+                               opt' (conj opt k)]
+                           (cond
+                             (ref? value)
+                             (assoc-in graph (into [:graph] opt') value)
+
+                             (atom? value)
+                             (-> graph
+                                 (update :paths conj path')
+                                 (assoc-in (into [:graph] opt') value))
+
+                             (map? value)
+                             (set-pathmap graph path' opt' value)
+
+                             :else
+                             (-> graph
+                                 (update :paths conj path')
+                                 (assoc-in (into [:graph] opt') (atom value))))))
+                       graph
+                       (clojure.core/keys pathmap))))]
+     (reduce #(set-pathmap %1 [] [] %2)
+             {:graph graph :paths []}
+             pathmaps))))
+
+(defrecord GraphDataSource [graph])
+
+;; have to extend type due to get / set names clashing with core ... oops!
+(extend-type GraphDataSource
+  core/IDataSource
+  (get [{:keys [graph]} pathsets]
+    (let [g @graph]
+      (get @graph pathsets)))
+  (set [{:keys [graph]} pathmaps]
+    (with-local-vars [ps nil]
+      (let [g (swap! graph (fn [graph]
+                             (let [{:keys [graph paths] :as r} (set graph pathmaps)]
+                               (var-set ps paths)
+                               graph)))]
+        (get g @ps)))))
+
+(defn as-datasource [graph]
+  (GraphDataSource. (clojure.core/atom (:graph (set {} [graph])))))


Added uniprot swissprot protein assign taxon rule

Removed rule from taxon rules file. Updated variables for ccp ext
ontology and updated file formatting

error: pathspec 'resources/rules/post_identifier_merge/temp/taxon/uniprot_swissprot_protein_assign_taxon.clj' did not match any file(s) known to git

--- resources/rules/post_identifier_merge/temp/taxon/uniprot_swissprot_protein_assign_taxon.clj
+++ resources/rules/post_identifier_merge/temp/taxon/uniprot_swissprot_protein_assign_taxon.clj
@@ -0,0 +1,28 @@
+;; --------------------------------------------------------------
+;; --------- Uniprot SwissProt Protein Taxon Assignment ---------
+;; --------------------------------------------------------------
+`{:name "uniprot-swissprot-protein-assign-taxon"
+  :description "This rule assigns a taxon to proteins represented by uniprot swissprot protein identifiers"
+  :head (
+         ;; create a taxon restriction
+         (?/protein obo/RO_0002162 ?/taxon) ; RO:in_taxon
+         (?/restriction rdf/type owl/Restriction)
+         (?/restriction owl/onProperty obo/RO_0002162) ; RO:in_taxon
+         (?/restriction owl/someValuesFrom ?/taxon)
+         (?/protein rdfs/subClassOf ?/restriction))
+
+   :body ((?/record rdf/type ccp/IAO_EXT_0000234) ; ccp:UniProt_protein_record
+          (?/record obo/BFO_0000051 ?/protein_field_value) ; BFO:has_part
+          (?/protein_field_value rdf/type ccp/IAO_EXT_0000931) ; ccp:UniProt_protein_record__accession_field_value
+          (?/protein_field_value rdf/type ?/protein_ice_id)
+          (?/protein_ice_id obo/IAO_0000219 ?/protein) ; IAO:denotes
+
+          ;; retrieve the taxon
+          (?/record obo/BFO_0000051 ?/taxon_field_value) ; BFO:has_part
+          (?/taxon_field_value rdf/type ccp/IAO_EXT_0000935) ; ccp:UniProt_protein_record__organism_field_value
+          (?/taxon_field_value rdf/type ?/taxon_ice_id)
+          (?/taxon_ice_id obo/IAO_0000219 ?/taxon)) ; IAO:denotes
+
+   :reify ([?/restriction {:ln (:restriction)
+                 :ns "ccp" :prefix "R_"}])
+   }


Figured out how liberator works :)

Figured out how liberator works :)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/expez/jada.git/'


more concise way to write our query.

more concise way to write our query.

--- src/metabase/api/meta/db.clj
+++ src/metabase/api/meta/db.clj
@@ -26,12 +26,9 @@
   {org Required}
   (let-404 [{:keys [id inherits] :as org} (sel :one Org :id org)]
     (read-check org)
-    (-> (if inherits
-          ;; orgs which `inherit` get access to ALL databases
-          (sel :many Database (order :name))
-          ;; otherwise we filter to just databases attached to the org
-          (sel :many Database :organization_id id (order :name)))
-      (hydrate :organization))))
+    (-> (sel :many Database (order :name) (where (if inherits {}
+                                                              {:organization_id id})))
+        (hydrate :organization))))

 (defendpoint POST "/"
   "Add a new `Database` for `Org`."


Removed test cases that cause reader errors. Can't handle this.

--- test/sablono/compiler_test.clj
+++ test/sablono/compiler_test.clj
@@ -125,10 +125,7 @@
     (are-html-expanded
      '[:div {:min "1", :max "2"}] '(js/React.DOM.div #js {:min "1", :max "2"})
      '[:img {"id" "foo"}] '(js/React.DOM.img #js {"id" "foo"})
-     '[:img {:id "foo"}] '(js/React.DOM.img #js {:id "foo"})
-     ;; [:img {'id "foo"}] '(js/React.DOM.img #js {id "foo"})
-     ;; [:div {:a "1", 'b "2", "c" "3"}] '(js/React.DOM.div #js {b "2", :a "1", "c" "3"})
-     ))
+     '[:img {:id "foo"}] '(js/React.DOM.img #js {:id "foo"})))
   (testing "attribute values are escaped"
     (are-html-expanded
      '[:div {:id "\""}] '(js/React.DOM.div #js {:id "\""})))
@@ -163,7 +160,6 @@
     (let [id "id"]
       (are-html-expanded
        '[:div {:id id}] '(js/React.DOM.div #js {:id id})
-       ;; '[:div {id "id"}] '(js/React.DOM.div #js {id "id"})
        '[:div {:id id} "bar"] '(js/React.DOM.div #js {:id id} "bar"))))
   (testing "attributes are evaluated"
     (are-html-expanded


Move activity sort function to a common namespace.

error: pathspec 'src/oc/storage/util/sort.clj' did not match any file(s) known to git

--- src/oc/storage/util/sort.clj
+++ src/oc/storage/util/sort.clj
@@ -0,0 +1,16 @@
+(ns oc.storage.util.sort)
+
+(defn- activity-sort
+  "
+  Compare function to sort 2 entries and/or activity by their `created-at` or `published-at` order respectively,
+  in the order (:asc or :desc) provided.
+  "
+  [order x y]
+  (let [order-flip (if (= order :desc) -1 1)]
+    (* order-flip (compare (or (:published-at x) (:created-at x))
+                           (or (:published-at y) (:created-at y))))))
+
+(defn sort-activity
+  "Given a set of entries, return up to the default limit of them, intermixed and sorted."
+  [entries order limit]
+  (take limit (sort (partial activity-sort order) entries)))


Add initial patch ns.

Add initial patch ns.

error: pathspec 'src/merkle_db/patch.clj' did not match any file(s) known to git

--- src/merkle_db/patch.clj
+++ src/merkle_db/patch.clj
@@ -0,0 +1,42 @@
+(ns merkle-db.patch
+  "Patches are applied on top of tables in order to efficiently store changes
+  while re-using old indexed data."
+  (:require
+    [clojure.future :refer [pos-int?]]
+    [clojure.spec :as s]
+    (merkle-db
+      [key :as key])))
+
+
+(def data-type
+  "Value of `:data/type` that indicates a tablet node."
+  :merkle-db/patch)
+
+(def tombstone
+  "Value which marks the deletion of a record."
+  ::tombstone)
+
+
+(defn tombstone?
+  "Returns true if the value x is a tombstone."
+  [x]
+  (identical? ::tombstone x))
+
+
+
+;; ## Specs
+
+;; Maximum number of changes to allow in a patch tablet.
+(s/def ::limit pos-int?)
+
+;; Records are stored as a key/data-or-tombstone pair.
+(s/def ::change-entry
+  (s/tuple key/bytes? (s/or :record map? :tombstone tombstone?)))
+
+;; Sorted vector of record entries.
+(s/def ::changes
+  (s/coll-of ::change-entry :kind vector?))
+
+;; Tablet node.
+(s/def :merkle-db/patch
+  (s/keys :req [::changes]))


Spruce up a bit

Spruce up a bit

--- integration-tests/apps/tx/src/tx/core.clj
+++ integration-tests/apps/tx/src/tx/core.clj
@@ -1,65 +1,60 @@
 (ns tx.core
   (:use clojure.test)
-  (:require [immutant.xa :as xa]
-            [immutant.cache :as c]
-            [immutant.messaging :as msg]
+  (:require [immutant.xa :as ixa]
+            [immutant.cache :as ic]
+            [immutant.messaging :as imsg]
             [clojure.java.jdbc :as sql]))

-;;; Messages sent to 'in' will be reversed and sent to 'out'
-(msg/start "/queue/in")
-(msg/start "/queue/out")
-(msg/listen "/queue/in" #(msg/publish "/queue/out" (apply str (reverse %))))
+;;; Create a JMS queue
+(imsg/start "/queue/test")

-;;; Infinispan cache
-(def cache (c/cache "stuff"))
+;;; And an Infinispan cache
+(def cache (ic/cache "test"))

-;;; In-memory, transactional database
-(defonce ds (xa/datasource "foo" {:adapter "h2" :database "mem:foo"}))
+;;; And an in-memory, transactional database
+(defonce ds (ixa/datasource "foo" {:adapter "h2" :database "mem:foo"}))
 (def spec {:datasource ds})

-;;; Ensure each test starts with an empty table
+;;; Helper methods to verify database activity
+(defn write-thing-to-db [name]
+  (sql/with-connection spec
+    (sql/insert-records :things {:name name})))
+(defn read-thing-from-db [name]
+  (sql/with-connection spec
+    (sql/with-query-results rows ["select name from things where name = ?" name]
+      (first rows))))
+(defn count-things-in-db []
+  (sql/with-connection spec
+    (sql/with-query-results rows ["select count(*) c from things"]
+      ((first rows) :c))))
+
+;;; Ensure each test starts with an empty table called THINGS
 (use-fixtures :each (fn [f]
-                      (c/delete-all cache)
+                      (ic/delete-all cache)
                       (sql/with-connection spec
                         (try (sql/drop-table :things) (catch Exception _))
                         (sql/create-table :things [:id :serial] [:name :varchar]))
                       (f)))

-;;; Helper methods to verify database activity
-(defn write-thing [name]
-  (sql/with-connection spec
-    (sql/insert-records :things {:name name})))
-(defn read-thing [name]
-  (sql/with-connection spec
-    (sql/with-query-results rows ["select name from things where name = ?" name]
-      (first rows))))
-(defn count-things []
-  (sql/with-connection spec
-    (sql/with-query-results rows ["select count(*) c from things"]
-      ((first rows) :c))))
+(deftest db+msg+cache-should-commit "Test happy-path XA transaction involving three resources"
+  (ixa/transaction
+   (write-thing-to-db "kiwi")
+   (imsg/publish "/queue/test" "kiwi")
+   (ic/put cache :a 1))
+  (is (= "kiwi" (:name (read-thing-from-db "kiwi"))))
+  (is (= 1 (count-things-in-db)))
+  (is (= 1 (:a cache)))
+  (is (= "kiwi" (imsg/receive "/queue/test"))))

-
-;;; Test definitions
-
-(deftest db+msg+cache-should-commit
-  (xa/transaction
-   (write-thing "kiwi")
-   (msg/publish "/queue/in" "kiwi")
-   (c/put cache :a 1))
-  (is (= "kiwi" (:name (read-thing "kiwi"))))
-  (is (= 1 (count-things)))
-  (is (= 1 (:a cache)))
-  (is (= "iwik" (msg/receive "/queue/out"))))
-
-(deftest db+msg+cache-should-rollback
+(deftest db+msg+cache-should-rollback "Test that all three resources rollback when exception is tossed"
   (try
-    (xa/transaction
-     (write-thing "kiwi")
-     (msg/publish "/queue/in" "kiwi")
-     (c/put cache :a 1)
-     (throw (Exception.)))
+    (ixa/transaction
+     (write-thing-to-db "kiwi")
+     (imsg/publish "/queue/test" "kiwi")
+     (ic/put cache :a 1)
+     (throw (Exception. "Rollback everything")))
     (catch Exception _))
-  (is (nil? (read-thing "kiwi")))
-  (is (= 0 (count-things)))
+  (is (nil? (read-thing-from-db "kiwi")))
+  (is (= 0 (count-things-in-db)))
   (is (nil? (:a cache)))
-  (is (nil? (msg/receive "/queue/out" :timeout 2000))))
+  (is (nil? (imsg/receive "/queue/test" :timeout 2000))))


Fix incorrect example counts on autocomplete results

--- src/clj/clojuredocs/pages.clj
+++ src/clj/clojuredocs/pages.clj
@@ -77,12 +77,15 @@

 (defn add-examples-count [results]
   (let [examples-lookup (->> results
-                             (map #(select-keys % [:ns :name]))
-                             (map (fn [l]
-                                    [l (mon/fetch-count :examples :where l)]))
+                             (map #(select-keys % [:ns :name :library-url]))
+                             (map (fn [{:keys [ns name library-url] :as l}]
+                                    [l (mon/fetch-count :examples :where {:var.ns ns
+                                                                          :var.name name
+                                                                          :var.library-url library-url})]))
                              (into {}))]
     (->> results
-         (map #(assoc % :examples-count (get examples-lookup (select-keys % [:ns :name])))))))
+         (map #(assoc % :examples-count (get examples-lookup (select-keys % [:ns :name :library-url])))))))
+

 (defn var-search-handler [{:keys [params]}]
   {:headers {"Content-Type" "application/edn"}


dna.clj skeleton

dna.clj skeleton

error: pathspec 'clojure/nucleotide-count/dna.clj' did not match any file(s) known to git

--- clojure/nucleotide-count/dna.clj
+++ clojure/nucleotide-count/dna.clj
@@ -0,0 +1,7 @@
+(ns dna)
+
+(defn count [strand dna-string]
+  0)
+
+(defn nucleotide-counts [dna-string]
+  {})


Add POST support to /api

Add POST support to /api

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lobodin/slack-translate.git/'


markov shit

markov shit

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/m1dnight/a-slack-and-irc-bot.git/'


Remove (flush) call in :print message handler

In CIDER, extra (flush) calls produced extraneous newlines.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/modnakasta/weasel.git/'


Started work to move PaaS config into new ns.

error: pathspec 'src/notes/paas.clj' did not match any file(s) known to git

--- src/notes/paas.clj
+++ src/notes/paas.clj
@@ -0,0 +1,18 @@
+(ns notes.paas
+  (:require
+   [clojure.java.io :as io]))
+
+(defn is-open-shift? []
+  (System/getenv "OPEN_SHIFT"))
+
+(defn is-dotcloud? []
+  (-> (io/file "/home/dotcloud/environment.json") .exists))
+
+;(str "mongodb://test:test@" mongo-host ":" mongo-port "/notes")
+
+(is-dotcloud?)
+
+(defn mongo-connection-uri []
+
+
+  (str "mongodb://test:test@" mongo-host ":" mongo-port "/notes"))


Handle routes for or in post-resources* [#136273291]

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/physion/ovation-webapi.git/'


Experimenting with Async storage

Experimenting with Async storage

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/dillius/peak-tolerable-stupidity.git/'


Force async-context onto the thread pool

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leif47/immutabledb-experimental.git/'


Derp, left out metrics file.

Derp, left out metrics file.

error: pathspec 'src/kiries/jvm.clj' did not match any file(s) known to git

--- src/kiries/jvm.clj
+++ src/kiries/jvm.clj
@@ -0,0 +1,36 @@
+(ns kiries.jvm
+  (:import [com.yammer.metrics.core MetricPredicate]))
+
+;; ----------------------------------------
+
+(def vm-stats (com.yammer.metrics.core.VirtualMachineMetrics/getInstance))
+
+(defn vm-metrics []
+  (let [epoch
+        (long (/ (.time clock) 1000))
+
+        metrics
+        (concat
+         [{:service "jvm.memory.heap-usage" :metric (.heapUsage vm-stats)}
+          {:service "jvm.memory.non-heap-usage" :metric (.nonHeapUsage vm-stats)}
+          {:service "jvm.thread.daemon-count" :metric (.daemonThreadCount vm-stats)}
+          {:service "jvm.thread.count" :metric (.threadCount vm-stats)}
+          {:service "jvm.uptime" :metric (.uptime vm-stats)}
+          {:service "jvm.fd-usage" :metric (.fileDescriptorUsage vm-stats)}]
+         (for [[k v] (.memoryPoolUsage vm-stats)]
+           {:service (str "jvm.memory.pool-usage." k) :metric v})
+         (for [[k v] (.threadStatePercentages vm-stats)]
+           {:service (str "jvm.thread.state." (.toLowerCase (str k))) :metric v})
+         (for [[k v] (.garbageCollectors vm-stats)]
+           {:service (str "jvm.gc." k ".time") :metric (.getTime v java.util.concurrent.TimeUnit/MILLISECONDS)})
+         (for [[k v] (.garbageCollectors vm-stats)]
+           {:service (str "jvm.gc." k ".runs") :metric (.getRuns v)}))]
+    (map #(assoc % :time epoch) metrics)))
+
+(defn jvm-metrics-thread [every-n-sec]
+  (while true
+    (try
+      (send-events (vm-metrics))
+      (catch java.io.IOException e
+        (warn "I'm a deaf mute talking to myself apparently.")))
+    (Thread/sleep (* 1000 every-n-sec))))


Fix WS api to automatically reconnect on connection failure


Remove cruft from main.cljs

Remove cruft from main.cljs

--- src/cljs/clojuredocs/main.cljs
+++ src/cljs/clojuredocs/main.cljs
@@ -446,10 +446,3 @@

 (.attach js/FastClick js/document.body)
-
-(def strings ["foo" "bar" "baz"])
-
-
-#_(->> strings
-     (map #(fuzzy/levensthein % "f"))
-     prn)


No longer needing ring-core

No longer needing ring-core

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xcthulhu/clj-bitauth.git/'


Version 0.6.2-SNAPSHOT

Version 0.6.2-SNAPSHOT

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject sablono "0.6.1"
+(defproject sablono "0.6.2-SNAPSHOT"
   :description "Lisp style templating for Facebook's React."
   :url "http://github.com/r0man/sablono"
   :author "r0man"


Upgrade clojure deps.

Upgrade clojure deps.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/cstorey/nrod.git/'


cider kendu

cider kendu

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lnmnd/magnet.zer.git/'


A typo, damn

A typo, damn

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/batasrki/blog-post-app.git/'


lein-release plugin: preparing 0.2.11 release

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject sablono "0.2.11-SNAPSHOT"
+(defproject sablono "0.2.11"
   :description "Lisp style templating for Facebook's React."
   :url "http://github.com/r0man/sablono"
   :author "Roman Scherer"


Remove pedantic warnings from dev classpath

`lein deps` now results in no pedantic warnings.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tobias/clojars-web.git/'


Version 160-SNAPSHOT

Version 160-SNAPSHOT


Version 79-SNAPSHOT

Version 79-SNAPSHOT


Version 0.3.1

Version 0.3.1

--- project.clj
+++ project.clj
@@ -1,4 +1,4 @@
-(defproject sablono "0.3.1-SNAPSHOT"
+(defproject sablono "0.3.1"
   :description "Lisp style templating for Facebook's React."
   :url "http://github.com/r0man/sablono"
   :author "r0man"


Re-introducing Leiningen.

Re-introducing Leiningen.

error: pathspec 'project.clj' did not match any file(s) known to git

--- project.clj
+++ project.clj
@@ -0,0 +1,20 @@
+(defproject blutwurst "0.2.0-SNAPSHOT"
+  :description "A command-line utility to populate database tables with test data."
+  :url "https://www.github.com/michaeljmcd/blutwurst"
+  :license {:name "MIT"
+            :url "https://opensource.org/licenses/MIT"}
+  :dependencies [[org.clojure/clojure "1.8.0"]
+                 [org.clojure/data.csv "0.1.4"]
+                 [org.clojure/tools.cli "0.3.5"]
+                 [org.clojure/tools.trace "0.7.9"]
+                 [com.taoensso/timbre "4.10.0"]
+                 [org.clojure/core.incubator "0.1.4"]
+                 [cheshire "5.7.1"]
+
+                 ;TODO: handle drivers sanely
+                 [org.xerial/sqlite-jdbc "3.19.3"]
+                 [com.h2database/h2 "1.4.195"]]
+  :plugins [[quickie "0.4.1"]]
+  :main ^:skip-aot blutwurst.core
+  :target-path "target/%s"
+  :profiles {:uberjar {:aot :all}})


Version 0.1.2-SNAPSHOT

Version 0.1.2-SNAPSHOT

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tobiasbayer/lambdacd.git/'


Bump all the dependencies

Bump all the dependencies

--- project.clj
+++ project.clj
@@ -7,24 +7,24 @@
   :global-vars {*warn-on-reflection* true}
   :min-lein-version "2.0.0"
   :exclusions [org.clojure/clojure]
-  :dependencies [[org.apache.httpcomponents/httpcore "4.3.3"]
-                 [org.apache.httpcomponents/httpclient "4.3.5"]
-                 [org.apache.httpcomponents/httpmime "4.3.5"]
-                 [commons-codec "1.9"]
+  :dependencies [[org.apache.httpcomponents/httpcore "4.4"]
+                 [org.apache.httpcomponents/httpclient "4.3.6"]
+                 [org.apache.httpcomponents/httpmime "4.3.6"]
+                 [commons-codec "1.10"]
                  [commons-io "2.4"]
                  [com.cognitect/transit-clj "0.8.259"]
-                 [slingshot "0.10.3"]
-                 [cheshire "5.3.1"]
+                 [slingshot "0.12.1"]
+                 [cheshire "5.4.0"]
                  [crouton "0.1.2"]
-                 [org.clojure/tools.reader "0.8.10"]
-                 [potemkin "0.3.8"]]
+                 [org.clojure/tools.reader "0.8.13"]
+                 [potemkin "0.3.11"]]
   :profiles {:dev {:dependencies [[org.clojure/clojure "1.6.0"]
                                   [org.clojure/tools.logging "0.3.1"]
                                   [log4j "1.2.17"]
-                                  [ring/ring-jetty-adapter "1.3.1"]
-                                  [ring/ring-devel "1.3.1"]]}
+                                  [ring/ring-jetty-adapter "1.3.2"]
+                                  [ring/ring-devel "1.3.2"]]}
              :1.5 {:dependencies [[org.clojure/clojure "1.5.1"]]}
-             :1.7 {:dependencies [[org.clojure/clojure "1.7.0-alpha2"]]}}
+             :1.7 {:dependencies [[org.clojure/clojure "1.7.0-alpha5"]]}}
   :aliases {"all" ["with-profile" "dev,1.5:dev:dev,1.7"]}
   :plugins [[codox "0.6.4"]]
   :test-selectors {:default  #(not (:integration %))


Add passes for checking ops and vars

Add passes for checking ops and vars

error: pathspec 'src/oxcart/passes/warnings.clj' did not match any file(s) known to git

--- src/oxcart/passes/warnings.clj
+++ src/oxcart/passes/warnings.clj
@@ -0,0 +1,192 @@
+;;   Copyright (c) Reid McKenzie, Rich Hickey & contributors. The use
+;;   and distribution terms for this software are covered by the
+;;   Eclipse Public License 1.0
+;;   (http://opensource.org/licenses/eclipse-1.0.php) which can be
+;;   found in the file epl-v10.html at the root of this distribution.
+;;   By using this software in any fashion, you are agreeing to be
+;;   bound by the terms of this license.  You must not remove this
+;;   notice, or any other, from this software.
+
+(ns oxcart.passes.warnings
+  {:doc "Implements static error detection passes for Oxcart."
+   :author "Reid McKenzie"
+   :added "0.0.7"}
+  (:require [clojure.set :as set]
+            [clojure.set :refer [intersection]]
+            [clojure.tools.analyzer.ast :as ast]
+            [oxcart
+             [passes :refer :all]
+             [util :as util]
+             [pattern :as pattern]]
+            [oxcart.passes.tree-shake :refer [analyze-var-dependencies]]
+            [taoensso.timbre :refer [warn error]]))
+
+
+(def banned-vars
+  "Vars which Oxcart does not support at all.
+
+  The use of these vars is a compile time failure, however all
+  failures should be reported before compilation is aborted."
+
+  #{#'clojure.core/eval
+    #'clojure.core/read-string
+    #'clojure.core/alter-var-root})
+
+
+(def dangerous-vars
+  "Vars which Oxcart does not currently support.
+
+  The use of these vars is a compile time failure, however all
+  failures should be reported before compilation is aborted."
+
+  ;; FIXME:
+  ;;   Anything that I can compile I which don't want to support yet?
+  ;;   I think the answer is no, most things which I can't compile are
+  ;;   just banned but this is here in case I think of something
+  ;;   later.
+  #{;; dynamic bindings stuff is evil
+    #'clojure.core/push-thread-bindings
+    #'clojure.core/pop-thread-bindings
+    #'clojure.core/get-thread-bindings
+
+    ;; namespace introspection stuff is pretty sketch too
+    #'clojure.core/ns-resolve
+    #'clojure.core/find-var})
+
+
+(defn check-vars
+  "λ Whole-AST → options → Whole-AST
+
+  Emits the appropriate error messages when banned or unsupported vars
+  are used by input program.
+
+  options:
+    :suppress-errors
+    if true the compiler will emit warnings and errors normally but will
+    continue compilation despite having encountered errors. Using this
+    flag is a warning source, as resulting bytecode is untrustworthy at
+    best.
+
+    :warnings-as-errors
+    if true rather than emitting a warning and continuing a pass
+    emitting warnings will collect and emit all warnings and then abort
+    compilation. Note that this flag _ignores_ :suppress-errors.
+
+    :banned-set
+    #{} by default, a set of vars which the user may blacklist
+    arbitrarily. These vars are considered when checking for banned vars
+    along with compiler banned vars. Note that the user may not
+    whitelist vars which the compiler has blacklisted. This is a
+    correctness feature.
+
+    :warn-unsupported
+    true by default, if true a check is made to see if the program
+    accesses vars which are stated to be unsupported."
+  [whole-ast
+   {:keys [warnings-as-errors
+           suppress-errors
+           banned-set
+           warn-unsupported]
+    :or {warnings-as-errors false
+         suppress-errors    false
+         banned-set         #{}
+         warn-unsupported   true}
+    :as options}]
+   (let [whole-ast (-> whole-ast
+                       (require-pass analyze-var-dependencies
+                                     options))
+         reach-map (:reach-map whole-ast)
+         dep-map   (:dependency-map whole-ast)
+         forms     (whole-ast->forms whole-ast)
+         error?    (atom false)]
+
+     ;; do a single pass over the forms
+     (doseq [ast forms]
+       (if-let [var (pattern/def->var ast)]
+         (cond (contains? banned-vars var)
+               ;; outright banned vars
+               (do (when-not suppress-errors
+                     (reset! error? true))
+                   (error (str (util/format-line-info ast)
+                               ", Program makes use of banned var:"
+                               var)))
+
+              (contains? banned-set var)
+              ;; user banned vars
+              (do (when-not suppress-errors
+                    (reset! error? true))
+                  (error (str (util/format-line-info ast)
+                              ", Program makes use of user banned var:"
+                              var)))
+
+              (and (contains? dangerous-vars var)
+                   warn-unsupported)
+              ;; unsupported vars
+              (do (when warnings-as-errors
+                    (reset! error? true))
+                  (warn (str (util/format-line-info ast)
+                             ", Program makes use of flagged var:"
+                             var))))))
+
+     (assert (not @error?)
+             "Errors were generated in checking.")
+     (-> whole-ast
+         (record-pass check-vars))))
+
+
+(def banned-ops
+  "AST operations which are banned due to their violation of Oxcart's
+  static assumptions."
+  #{})
+
+
+(def dangerous-ops
+  "Supported AST operations which are dangerous, but not always illegal."
+  #{:set!})
+
+
+(defn check-ops
+  "λ Whole-AST → options → Whole-AST
+
+  Traverses the argument AST on a form by form basis to make sure that
+  no blacklisted operations are used.
+
+  options:
+    :suppress-errors
+    if true the compiler will emit warnings and errors normally but will
+    continue compilation despite having encountered errors. Using this
+    flag is a warning source, as resulting bytecode is untrustworthy at
+    best.
+
+    :warnings-as-errors
+    if true rather than emitting a warning and continuing a pass
+    emitting warnings will collect and emit all warnings and then abort
+    compilation. Note that this flag _ignores_ :suppress-errors."
+  [whole-ast
+   {:keys [suppress-errors
+           warnings-as-errors]
+    :or   {suppress-errors    false
+           warnings-as-errors false}
+    :as options}]
+  (let [error?   (atom false)]
+    (doseq [ast (whole-ast->forms whole-ast)]
+      (let [ops (->> ast
+                     ast/children
+                     (map :op)
+                     (into #{}))]
+        (cond (not (empty? (intersection banned-ops ops)))
+              (do (when-not suppress-errors
+                    (reset! error? true))
+                  (error (util/format-line-info ast)
+                         ", Program makes use of unsupported op!"))
+
+              (not (empty? (intersection dangerous-ops ops)))
+              (do (when-not suppress-errors
+                    (reset! error? true))
+                  (warn (util/format-line-info ast)
+                        ", Program makes use of dangerous op!")))))
+
+    (assert (not @error?)
+            "Errors were generated in checking."))
+  (-> ast
+      (record-pass check-ops)))


Check expression arity.

Check expression arity.

error: pathspec 'src/smallex/grammar_checks.clj' did not match any file(s) known to git

--- src/smallex/grammar_checks.clj
+++ src/smallex/grammar_checks.clj
@@ -0,0 +1,48 @@
+(ns smallex.grammar-checks)
+
+(def ^:private single-arg-op?
+  "Returns true if the op is a single-argument op, false otherwise."
+  #{:star :plus :opt :not})
+
+(defn- op-arity-exn
+  "Returns a list with either zero or one ExceptionInfos, depending on whether
+  the expression uses wrong arity or not."
+  [expr-name op]
+  (cond (and (single-arg-op? (:value op))
+             (not= 1 (count (:args op))))
+        (list (ex-info "Wrong number of arguments given."
+                       {:type :op-arity, :expr op,
+                        :expected "one", :in expr-name}))
+        ;; otherwise is a vararg, so is only error if it has zero args
+        (zero? (count (:args op)))
+        (list (ex-info "Wrong number of arguments given."
+                       {:type :op-arity, :expr op,
+                        :expected "at least one", :in expr-name}))
+        :else ()))
+
+(defn- check-expr-arity
+  "Recursively checks that an expression uses correct arity, and returns a
+  lazy seq of the erroneous calls as maps."
+  [expr-name expr]
+  (cond (not= :op (:type expr)) ()
+        (-> expr meta :alias-expansion) () ;; Should be handled in resp. aliases
+        :else
+        (let [some-exn (op-arity-exn expr-name expr)]
+          (->> (:args expr)
+               (map #(check-expr-arity expr-name %))
+               (apply concat)
+               (concat some-exn)))))
+
+(defn check-arity
+  "Checks that all operations have the correct arity. Returns a sequence of
+  erroneous calls as ExceptionInfos."
+  [grammar]
+  (concat
+   (mapcat (fn [[a-name a-expr]]
+             (->> (vary-meta a-expr dissoc
+                             :alias-expansion :alias-name)
+                  (check-expr-arity a-name)))
+           (:aliases grammar))
+   (mapcat (fn [[r-name r-expr]]
+             (check-expr-arity r-name r-expr))
+           (:rules grammar))))


Chipped in CLJSJS

Chipped in CLJSJS

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/code-shoily/tornado-cljs.git/'


Take gordon's suggestion: replacing partial with #()

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/democracyworks/mail-works.git/'


Probetan zerbitzaria hasi eta geratu.

Probetan zerbitzaria hasi eta geratu.


if ro field is not nil, it should be used instead of hmap

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/michaelsbradleyjr/transwarp.git/'