)]}'
{"web/panettone/src/model.lisp":[{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"438b4e326dc47d1c9acf0b564cd648eb479fb7d3","unresolved":true,"context_lines":[{"line_number":2,"context_line":"(declaim (optimize (safety 3)))"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"(defun connect-postgres (\u0026key"},{"line_number":5,"context_line":"                           (host (or (uiop:getenvp \"PGHOST\") \"localhost\"))"},{"line_number":6,"context_line":"                           (user (or (uiop:getenvp \"PGUSER\") \"panettone\"))"},{"line_number":7,"context_line":"                           (password (or (uiop:getenvp \"PGPASSWORD\") \"password\"))"},{"line_number":8,"context_line":"                           (database (or (uiop:getenvp \"PGDATABASE\") \"panettone\"))"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"de511b91_f72acfae","line":5,"updated":"2020-07-26 21:59:45.000000000","message":"This sounds like something that could be very easily macro\u0027d, i.e. so you could just write (env-or \"PGHOST\" \"localhost\")","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"c37e6dace58b9bee93060118dade2b761a185274","unresolved":false,"context_lines":[{"line_number":2,"context_line":"(declaim (optimize (safety 3)))"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"(defun connect-postgres (\u0026key"},{"line_number":5,"context_line":"                           (host (or (uiop:getenvp \"PGHOST\") \"localhost\"))"},{"line_number":6,"context_line":"                           (user (or (uiop:getenvp \"PGUSER\") \"panettone\"))"},{"line_number":7,"context_line":"                           (password (or (uiop:getenvp \"PGPASSWORD\") \"password\"))"},{"line_number":8,"context_line":"                           (database (or (uiop:getenvp \"PGDATABASE\") \"panettone\"))"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"23bb2f4d_4ecc69f7","line":5,"in_reply_to":"de511b91_f72acfae","updated":"2020-07-26 22:14:28.000000000","message":"eh, fairbairn threshold","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"438b4e326dc47d1c9acf0b564cd648eb479fb7d3","unresolved":true,"context_lines":[{"line_number":14,"context_line":";;; Schema"},{"line_number":15,"context_line":";;;"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"(define-constant +issue-statuses+ (list :open :closed)"},{"line_number":18,"context_line":"  :test #\u0027equal)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"(deftype issue-status ()"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"c0340f68_4ef29886","line":17,"updated":"2020-07-26 21:59:45.000000000","message":"Why use LIST when you can use \u0027 (i.e. QUOTE)","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":14,"context_line":";;; Schema"},{"line_number":15,"context_line":";;;"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"(define-constant +issue-statuses+ (list :open :closed)"},{"line_number":18,"context_line":"  :test #\u0027equal)"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"(deftype issue-status ()"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"092757be_89fd4a2d","line":17,"in_reply_to":"c0340f68_4ef29886","updated":"2020-07-26 23:39:48.000000000","message":"Done","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"438b4e326dc47d1c9acf0b564cd648eb479fb7d3","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"(defun ddl/create-issue-status ()"},{"line_number":25,"context_line":"  \"Issue DDL to create the `issue-status\u0027 type, if it doesn\u0027t exist\""},{"line_number":26,"context_line":"  (unless (query (:select (:exists (:select 1"},{"line_number":27,"context_line":"                                    :from \u0027pg_type"},{"line_number":28,"context_line":"                                    :where (:\u003d \u0027typname \"issue_status\"))))"},{"line_number":29,"context_line":"                 :single)"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"cb457088_9daf85bd","line":26,"updated":"2020-07-26 21:59:45.000000000","message":"can you not just, uh, CREATE TABLE IF NOT EXISTS or something","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"c37e6dace58b9bee93060118dade2b761a185274","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"(defun ddl/create-issue-status ()"},{"line_number":25,"context_line":"  \"Issue DDL to create the `issue-status\u0027 type, if it doesn\u0027t exist\""},{"line_number":26,"context_line":"  (unless (query (:select (:exists (:select 1"},{"line_number":27,"context_line":"                                    :from \u0027pg_type"},{"line_number":28,"context_line":"                                    :where (:\u003d \u0027typname \"issue_status\"))))"},{"line_number":29,"context_line":"                 :single)"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"7236ee2b_9e04d73e","line":26,"in_reply_to":"cb457088_9daf85bd","updated":"2020-07-26 22:14:28.000000000","message":"this is a type, so no - no CREATE TYPE IF NOT EXISTS in pg: https://www.postgresql.org/docs/11/sql-createtype.html","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"438b4e326dc47d1c9acf0b564cd648eb479fb7d3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"   reported by a user, has a subject and an optional body, and can be either"},{"line_number":54,"context_line":"   open or closed\"))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"(defmethod cl-postgres:to-sql-string ((kw (eql :open)))"},{"line_number":57,"context_line":"  (cl-postgres:to-sql-string \"open\"))"},{"line_number":58,"context_line":"(defmethod cl-postgres:to-sql-string ((kw (eql :closed)))"},{"line_number":59,"context_line":"  (cl-postgres:to-sql-string \"closed\"))"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"b4471e8e_e334b0f9","line":56,"updated":"2020-07-26 21:59:45.000000000","message":"Nice!","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"438b4e326dc47d1c9acf0b564cd648eb479fb7d3","unresolved":false,"context_lines":[{"line_number":111,"context_line":"(defun get-issue (id)"},{"line_number":112,"context_line":"  \"Look up the \u0027issue with the given ID and return it, or signal a condition of"},{"line_number":113,"context_line":"type `ISSUE-NOT-FOUND\u0027.\""},{"line_number":114,"context_line":"  (restart-case"},{"line_number":115,"context_line":"      (or (get-dao \u0027issue id)"},{"line_number":116,"context_line":"          (error \u0027issue-not-found :id id))"},{"line_number":117,"context_line":"    (different-id (new-id)"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"73dfed16_6f98509d","line":114,"updated":"2020-07-26 21:59:45.000000000","message":"ooh, an actual restart!!","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"c37e6dace58b9bee93060118dade2b761a185274","unresolved":false,"context_lines":[{"line_number":111,"context_line":"(defun get-issue (id)"},{"line_number":112,"context_line":"  \"Look up the \u0027issue with the given ID and return it, or signal a condition of"},{"line_number":113,"context_line":"type `ISSUE-NOT-FOUND\u0027.\""},{"line_number":114,"context_line":"  (restart-case"},{"line_number":115,"context_line":"      (or (get-dao \u0027issue id)"},{"line_number":116,"context_line":"          (error \u0027issue-not-found :id id))"},{"line_number":117,"context_line":"    (different-id (new-id)"}],"source_content_type":"text/x-common-lisp","patch_set":6,"id":"d1f6c6f2_8377417c","line":114,"in_reply_to":"73dfed16_6f98509d","updated":"2020-07-26 22:14:28.000000000","message":"...mostly because I wanted an excuse to make one, haha\n\nI\u0027ve used it in SLY a few times though!","commit_id":"901d271ada749dc811be549c837e8b4efab313bf"},{"author":{"_account_id":1000001,"name":"tazjin","email":"tazjin@tvl.su","username":"tazjin"},"change_message_id":"19c1172801f13ec8a9f256fa2321a9293294776a","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    (query (sql-compile"},{"line_number":31,"context_line":"            `(:create-enum issue-status ,+issue-statuses+)))))"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"(defclass issue ()"},{"line_number":34,"context_line":"  ((id :col-type serial :initarg :id :accessor id)"},{"line_number":35,"context_line":"   (subject :col-type string :initarg :subject :accessor subject)"},{"line_number":36,"context_line":"   (body :col-type string :initarg :body :accessor body :col-default \"\")"}],"source_content_type":"text/x-common-lisp","patch_set":8,"id":"857f5dd1_4073955a","line":33,"range":{"start_line":33,"start_character":1,"end_line":33,"end_character":9},"updated":"2020-07-27 01:11:28.000000000","message":"curious - why is this not using the fancy defclass macro? is the other one not extensible with MOP classes?","commit_id":"b6402e8d0c7f5757396eac55a9dfd5a828485f03"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"7c366b420be0ff0c60ecaf65d47ded4fc1d30376","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    (query (sql-compile"},{"line_number":31,"context_line":"            `(:create-enum issue-status ,+issue-statuses+)))))"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"(defclass issue ()"},{"line_number":34,"context_line":"  ((id :col-type serial :initarg :id :accessor id)"},{"line_number":35,"context_line":"   (subject :col-type string :initarg :subject :accessor subject)"},{"line_number":36,"context_line":"   (body :col-type string :initarg :body :accessor body :col-default \"\")"}],"source_content_type":"text/x-common-lisp","patch_set":8,"id":"862df118_8b3e0c13","line":33,"range":{"start_line":33,"start_character":1,"end_line":33,"end_character":9},"in_reply_to":"857f5dd1_4073955a","updated":"2020-07-27 01:20:31.000000000","message":"yeah, doesn\u0027t seem like it :/","commit_id":"b6402e8d0c7f5757396eac55a9dfd5a828485f03"}],"web/panettone/src/packages.lisp":[{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"7e983cd8dd2725ea5536af2d0e858490b78e510b","unresolved":true,"context_lines":[{"line_number":11,"context_line":"  (:use :cl :klatre :postmodern)"},{"line_number":12,"context_line":"  (:import-from :alexandria :if-let)"},{"line_number":13,"context_line":"  (:export"},{"line_number":14,"context_line":"   :connect-postgres :ddl/init"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"   :issue"},{"line_number":17,"context_line":"   :issue-comment"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"ccd58d0f_ef2b8470","line":14,"updated":"2020-07-26 21:34:23.000000000","message":"was it just me, or were you using #: in some places elsewhere\n(#: is supposed to be \"better\" because it doesn\u0027t intern a symbol, but I think it looks ugly :p)","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"  (:use :cl :klatre :postmodern)"},{"line_number":12,"context_line":"  (:import-from :alexandria :if-let)"},{"line_number":13,"context_line":"  (:export"},{"line_number":14,"context_line":"   :connect-postgres :ddl/init"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"   :issue"},{"line_number":17,"context_line":"   :issue-comment"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"39b33211_f3f5575e","line":14,"in_reply_to":"212e09f5_ee624290","updated":"2020-07-26 23:39:48.000000000","message":"I\u0027m gonna leave this, as I don\u0027t care about perf / memory usage and I think this is more readable.","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"ed9986310723ea4aa0451da8af00dde436177df5","unresolved":true,"context_lines":[{"line_number":11,"context_line":"  (:use :cl :klatre :postmodern)"},{"line_number":12,"context_line":"  (:import-from :alexandria :if-let)"},{"line_number":13,"context_line":"  (:export"},{"line_number":14,"context_line":"   :connect-postgres :ddl/init"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"   :issue"},{"line_number":17,"context_line":"   :issue-comment"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"212e09f5_ee624290","line":14,"in_reply_to":"ccd58d0f_ef2b8470","updated":"2020-07-26 21:38:50.000000000","message":"yeah I wasn\u0027t quite sure what the difference is.","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"}],"web/panettone/src/panettone.lisp":[{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"7e983cd8dd2725ea5536af2d0e858490b78e510b","unresolved":true,"context_lines":[{"line_number":13,"context_line":"   (created-at :type local-time:timestamp"},{"line_number":14,"context_line":"               :std (local-time:now)))"},{"line_number":15,"context_line":"  (:documentation"},{"line_number":16,"context_line":"   \"DEPRECATED: use `PANETTONE.MODEL::ISSUE-COMMENT\u0027 insteaad\"))"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"(defclass/std issue (cl-prevalence:object-with-id)"},{"line_number":19,"context_line":"  ((subject body :type string :std \"\")"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"3f05994b_96582a5a","line":16,"updated":"2020-07-26 21:34:23.000000000","message":"nit: \"insteaad\"","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"   (created-at :type local-time:timestamp"},{"line_number":14,"context_line":"               :std (local-time:now)))"},{"line_number":15,"context_line":"  (:documentation"},{"line_number":16,"context_line":"   \"DEPRECATED: use `PANETTONE.MODEL::ISSUE-COMMENT\u0027 insteaad\"))"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"(defclass/std issue (cl-prevalence:object-with-id)"},{"line_number":19,"context_line":"  ((subject body :type string :std \"\")"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"8269ebea_d554c497","line":16,"in_reply_to":"3f05994b_96582a5a","updated":"2020-07-26 23:39:48.000000000","message":"Done","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"7e983cd8dd2725ea5536af2d0e858490b78e510b","unresolved":true,"context_lines":[{"line_number":87,"context_line":"  (when-let ((user (if (typep user-or-username \u0027user) user-or-username"},{"line_number":88,"context_line":"                       (find-user user-or-username))))"},{"line_number":89,"context_line":"    (let ((dn (dn user)))"},{"line_number":90,"context_line":"      (multiple-value-bind (_r code-sym _msg)"},{"line_number":91,"context_line":"          (ldap:bind"},{"line_number":92,"context_line":"           (ldap:new-ldap :host (ldap:host *ldap*)"},{"line_number":93,"context_line":"                          :port (ldap:port *ldap*)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"61226c2f_90bff3aa","line":90,"updated":"2020-07-26 21:34:23.000000000","message":"If you only want one value, use NTH-VALUE: http://www.lispworks.com/documentation/HyperSpec/Body/m_nth_va.htm","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"  (when-let ((user (if (typep user-or-username \u0027user) user-or-username"},{"line_number":88,"context_line":"                       (find-user user-or-username))))"},{"line_number":89,"context_line":"    (let ((dn (dn user)))"},{"line_number":90,"context_line":"      (multiple-value-bind (_r code-sym _msg)"},{"line_number":91,"context_line":"          (ldap:bind"},{"line_number":92,"context_line":"           (ldap:new-ldap :host (ldap:host *ldap*)"},{"line_number":93,"context_line":"                          :port (ldap:port *ldap*)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"2c8112cd_7259eacb","line":90,"in_reply_to":"51c92ae6_a45df570","updated":"2020-07-26 23:39:48.000000000","message":"Done","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"  (when-let ((user (if (typep user-or-username \u0027user) user-or-username"},{"line_number":88,"context_line":"                       (find-user user-or-username))))"},{"line_number":89,"context_line":"    (let ((dn (dn user)))"},{"line_number":90,"context_line":"      (multiple-value-bind (_r code-sym _msg)"},{"line_number":91,"context_line":"          (ldap:bind"},{"line_number":92,"context_line":"           (ldap:new-ldap :host (ldap:host *ldap*)"},{"line_number":93,"context_line":"                          :port (ldap:port *ldap*)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"4d222f01_86630c32","line":90,"in_reply_to":"51c92ae6_a45df570","updated":"2020-07-26 23:39:48.000000000","message":"Done","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"ed9986310723ea4aa0451da8af00dde436177df5","unresolved":true,"context_lines":[{"line_number":87,"context_line":"  (when-let ((user (if (typep user-or-username \u0027user) user-or-username"},{"line_number":88,"context_line":"                       (find-user user-or-username))))"},{"line_number":89,"context_line":"    (let ((dn (dn user)))"},{"line_number":90,"context_line":"      (multiple-value-bind (_r code-sym _msg)"},{"line_number":91,"context_line":"          (ldap:bind"},{"line_number":92,"context_line":"           (ldap:new-ldap :host (ldap:host *ldap*)"},{"line_number":93,"context_line":"                          :port (ldap:port *ldap*)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"51c92ae6_a45df570","line":90,"in_reply_to":"61226c2f_90bff3aa","updated":"2020-07-26 21:38:50.000000000","message":"cool!","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"7e983cd8dd2725ea5536af2d0e858490b78e510b","unresolved":true,"context_lines":[{"line_number":124,"context_line":"  \"Idempotently migrate all data from the cl-prevalence system SYSTEM into the"},{"line_number":125,"context_line":"global postgresql connection (eg as initialized by"},{"line_number":126,"context_line":"`panettone.model:connect-postgres\u0027). With FORCE\u003dt, will clear the database first\""},{"line_number":127,"context_line":"  (postmodern:with-transaction (prevalence-\u003epostgresql)"},{"line_number":128,"context_line":"    (when force"},{"line_number":129,"context_line":"      (postmodern:query (:delete-from \u0027issues)))"},{"line_number":130,"context_line":"    (iter"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"034154f6_261c165d","line":127,"updated":"2020-07-26 21:34:23.000000000","message":"protip: you can s/postmodern:/pomo:/ to avoid typing (because it has a package nickname)","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"ed9986310723ea4aa0451da8af00dde436177df5","unresolved":true,"context_lines":[{"line_number":124,"context_line":"  \"Idempotently migrate all data from the cl-prevalence system SYSTEM into the"},{"line_number":125,"context_line":"global postgresql connection (eg as initialized by"},{"line_number":126,"context_line":"`panettone.model:connect-postgres\u0027). With FORCE\u003dt, will clear the database first\""},{"line_number":127,"context_line":"  (postmodern:with-transaction (prevalence-\u003epostgresql)"},{"line_number":128,"context_line":"    (when force"},{"line_number":129,"context_line":"      (postmodern:query (:delete-from \u0027issues)))"},{"line_number":130,"context_line":"    (iter"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"a8836463_1e448ea7","line":127,"in_reply_to":"034154f6_261c165d","updated":"2020-07-26 21:38:50.000000000","message":"cool","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"  \"Idempotently migrate all data from the cl-prevalence system SYSTEM into the"},{"line_number":125,"context_line":"global postgresql connection (eg as initialized by"},{"line_number":126,"context_line":"`panettone.model:connect-postgres\u0027). With FORCE\u003dt, will clear the database first\""},{"line_number":127,"context_line":"  (postmodern:with-transaction (prevalence-\u003epostgresql)"},{"line_number":128,"context_line":"    (when force"},{"line_number":129,"context_line":"      (postmodern:query (:delete-from \u0027issues)))"},{"line_number":130,"context_line":"    (iter"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"07ff0978_01349814","line":127,"in_reply_to":"a8836463_1e448ea7","updated":"2020-07-26 23:39:48.000000000","message":"Done","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"a0f1758a99c53a6b65b8f84f360d78e9a0a7848a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"  \"Idempotently migrate all data from the cl-prevalence system SYSTEM into the"},{"line_number":125,"context_line":"global postgresql connection (eg as initialized by"},{"line_number":126,"context_line":"`panettone.model:connect-postgres\u0027). With FORCE\u003dt, will clear the database first\""},{"line_number":127,"context_line":"  (postmodern:with-transaction (prevalence-\u003epostgresql)"},{"line_number":128,"context_line":"    (when force"},{"line_number":129,"context_line":"      (postmodern:query (:delete-from \u0027issues)))"},{"line_number":130,"context_line":"    (iter"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"5af58f5a_c9f26a01","line":127,"in_reply_to":"a8836463_1e448ea7","updated":"2020-07-26 23:39:48.000000000","message":"Done","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"7e983cd8dd2725ea5536af2d0e858490b78e510b","unresolved":true,"context_lines":[{"line_number":565,"context_line":"  (let ((port (integer-env \"PANETTONE_PORT\" :default 6161))"},{"line_number":566,"context_line":"        (ldap-port (integer-env \"LDAP_PORT\" :default 389))"},{"line_number":567,"context_line":"        (data-dir (or (uiop:getenvp \"PANETTONE_DATA_DIR\") \"/var/lib/panettone\")))"},{"line_number":568,"context_line":"    (setq hunchentoot:*show-lisp-backtraces-p* nil)"},{"line_number":569,"context_line":"    (start-panettone :port port"},{"line_number":570,"context_line":"                     :data-dir data-dir"},{"line_number":571,"context_line":"                     :ldap-port ldap-port)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"984a74b1_c6b66db3","line":568,"updated":"2020-07-26 21:34:23.000000000","message":"(why?)","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"c37e6dace58b9bee93060118dade2b761a185274","unresolved":false,"context_lines":[{"line_number":565,"context_line":"  (let ((port (integer-env \"PANETTONE_PORT\" :default 6161))"},{"line_number":566,"context_line":"        (ldap-port (integer-env \"LDAP_PORT\" :default 389))"},{"line_number":567,"context_line":"        (data-dir (or (uiop:getenvp \"PANETTONE_DATA_DIR\") \"/var/lib/panettone\")))"},{"line_number":568,"context_line":"    (setq hunchentoot:*show-lisp-backtraces-p* nil)"},{"line_number":569,"context_line":"    (start-panettone :port port"},{"line_number":570,"context_line":"                     :data-dir data-dir"},{"line_number":571,"context_line":"                     :ldap-port ldap-port)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"c4740cba_fc2299ba","line":568,"in_reply_to":"4481f670_fe97c2f7","updated":"2020-07-26 22:14:28.000000000","message":"explained in IRC:\n\n\u003c+grfn\u003e eta: I\u0027m not sure that\u0027d work\n\u003c+grfn\u003e because before it gets wrapped in a class it\u0027s still a local variable\n\u003c+grfn\u003e like you can just go higher up the stacktrace\n\u003c+grfn\u003e to when it\u0027s a string\n\u003ceta\u003e grfn: well where do you call the function though \n\u003c+grfn\u003e eta: `make-instance`? I\u0027d assume in the hunchentoot handler\n\u003c+grfn\u003e it\u0027s still a local variable at some point in the stack, is the problem\n\u003c+grfn\u003e because it\u0027s passed to us as a parameter\n\u003c+grfn\u003e from the route handler\n\u003c+grfn\u003e and in general I\u0027d like to forbid accidentally logging secret stuff\n        holistically\n\u003c+grfn\u003e rather than having to opt-in to scrubbing\n\u003c+grfn\u003e eg I would *not* like to have to be like \"everyone in tvl has to\n        rotate their ldap password now\"\n\u003c+grfn\u003e that would be... embarrassing","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000008,"name":"eta","email":"tvl@eta.st","username":"eta"},"change_message_id":"438b4e326dc47d1c9acf0b564cd648eb479fb7d3","unresolved":true,"context_lines":[{"line_number":565,"context_line":"  (let ((port (integer-env \"PANETTONE_PORT\" :default 6161))"},{"line_number":566,"context_line":"        (ldap-port (integer-env \"LDAP_PORT\" :default 389))"},{"line_number":567,"context_line":"        (data-dir (or (uiop:getenvp \"PANETTONE_DATA_DIR\") \"/var/lib/panettone\")))"},{"line_number":568,"context_line":"    (setq hunchentoot:*show-lisp-backtraces-p* nil)"},{"line_number":569,"context_line":"    (start-panettone :port port"},{"line_number":570,"context_line":"                     :data-dir data-dir"},{"line_number":571,"context_line":"                     :ldap-port ldap-port)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"4481f670_fe97c2f7","line":568,"in_reply_to":"810b4209_3bcd1e04","updated":"2020-07-26 21:59:45.000000000","message":"What you could do is wrap the password in a CLOS class (because they aren\u0027t printed with their slots shown)?","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"c69aace3cb1e3589315660b2432c20be1c85cb55","unresolved":false,"context_lines":[{"line_number":565,"context_line":"  (let ((port (integer-env \"PANETTONE_PORT\" :default 6161))"},{"line_number":566,"context_line":"        (ldap-port (integer-env \"LDAP_PORT\" :default 389))"},{"line_number":567,"context_line":"        (data-dir (or (uiop:getenvp \"PANETTONE_DATA_DIR\") \"/var/lib/panettone\")))"},{"line_number":568,"context_line":"    (setq hunchentoot:*show-lisp-backtraces-p* nil)"},{"line_number":569,"context_line":"    (start-panettone :port port"},{"line_number":570,"context_line":"                     :data-dir data-dir"},{"line_number":571,"context_line":"                     :ldap-port ldap-port)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"ef53d5b2_5a86b417","line":568,"in_reply_to":"810b4209_3bcd1e04","updated":"2020-07-26 21:58:48.000000000","message":"submitted and applied on its own as CL/1471","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"},{"author":{"_account_id":1000010,"name":"aspen","email":"root@gws.fyi","username":"aspen"},"change_message_id":"ed9986310723ea4aa0451da8af00dde436177df5","unresolved":true,"context_lines":[{"line_number":565,"context_line":"  (let ((port (integer-env \"PANETTONE_PORT\" :default 6161))"},{"line_number":566,"context_line":"        (ldap-port (integer-env \"LDAP_PORT\" :default 389))"},{"line_number":567,"context_line":"        (data-dir (or (uiop:getenvp \"PANETTONE_DATA_DIR\") \"/var/lib/panettone\")))"},{"line_number":568,"context_line":"    (setq hunchentoot:*show-lisp-backtraces-p* nil)"},{"line_number":569,"context_line":"    (start-panettone :port port"},{"line_number":570,"context_line":"                     :data-dir data-dir"},{"line_number":571,"context_line":"                     :ldap-port ldap-port)"}],"source_content_type":"text/x-common-lisp","patch_set":1,"id":"810b4209_3bcd1e04","line":568,"in_reply_to":"984a74b1_c6b66db3","updated":"2020-07-26 21:38:50.000000000","message":"oh I should comment this - I noticed that if there\u0027s an error when checking auth with the ldap server the backtrace includes the password (!!). I checked and this hasn\u0027t happened on whitby yet, but yikes.","commit_id":"e05bcf38631765351679751cc5c1552ddab0306d"}]}
