From 250d31166c8ea07f1db1eee91a628beed6871c67 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 14 Dec 2022 17:31:49 +0000 Subject: [PATCH 01/13] Bring on version 2.0.323! --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e8d75ce8..27ee023b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "calva", - "version": "2.0.322", + "version": "2.0.323", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "calva", - "version": "2.0.322", + "version": "2.0.323", "license": "MIT", "dependencies": { "acorn": "^6.4.1", diff --git a/package.json b/package.json index 2a8bf1f71..3499c74bc 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Calva: Clojure & ClojureScript Interactive Programming", "description": "Integrated REPL, formatter, Paredit, and more. Powered by cider-nrepl and clojure-lsp.", "icon": "assets/calva.png", - "version": "2.0.322", + "version": "2.0.323", "publisher": "betterthantomorrow", "author": { "name": "Better Than Tomorrow", From 4daf7d3492ea3fb1753b9c697d0d924e0ec243a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Tue, 20 Dec 2022 22:04:57 +0100 Subject: [PATCH 02/13] Add lsp cursorInfo function --- src/lsp/main.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lsp/main.ts b/src/lsp/main.ts index eb472a904..56c499ecd 100644 --- a/src/lsp/main.ts +++ b/src/lsp/main.ts @@ -788,6 +788,17 @@ export async function getClojuredocs(symName: string, symNs: string): Promise { + const client: LanguageClient = getStateValue(LSP_CLIENT_KEY); + return client.sendRequest('clojure/cursorInfo/raw', { + textDocument: { uri: textDocument.uri.toString() }, + position: { line: position.line, character: position.character }, + }); +} + // TODO: This feels a bit brute, what are other ways to wait for the client to initialize? export function getClient(timeout: number): Promise { const start = Date.now(); From f97bebaf6213cdf7799954faa1fc073c078d420f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Fri, 23 Dec 2022 16:26:39 +0100 Subject: [PATCH 03/13] Add example jack-in sequence [skip ci] --- test-data/.vscode/settings.json | 13 ++++++++++++- test-data/projects/pirate-lang/deps.edn | 1 + test-data/projects/pirate-lang/env/dev/repl.clj | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 test-data/projects/pirate-lang/env/dev/repl.clj diff --git a/test-data/.vscode/settings.json b/test-data/.vscode/settings.json index 5cf53cb3b..76cd8e319 100644 --- a/test-data/.vscode/settings.json +++ b/test-data/.vscode/settings.json @@ -42,5 +42,16 @@ "titleBar.inactiveBackground": "#90B4FEd5", "titleBar.inactiveForeground": "#13172299" }, - "calva.fmt.configPath": "cljfmt.edn" + "calva.fmt.configPath": "cljfmt.edn", + "calva.replConnectSequences": [ + { + "name": "pirate-lang", + "projectType": "deps.edn", + "afterCLJReplJackInCode": "(require 'repl)", + "cljsType": "none", + "menuSelections": { + "cljAliases": ["dev", "test"] + } + } + ] } diff --git a/test-data/projects/pirate-lang/deps.edn b/test-data/projects/pirate-lang/deps.edn index 18f66e61d..95e470a91 100644 --- a/test-data/projects/pirate-lang/deps.edn +++ b/test-data/projects/pirate-lang/deps.edn @@ -4,6 +4,7 @@ {:socket {:jvm-opts ["-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}"]} :test {:extra-paths ["test"] :extra-deps {org.clojure/test.check {:mvn/version "0.10.0"}}} + :dev {:extra-paths ["env/dev"]} :runner {:extra-deps {com.cognitect/test-runner {:git/url "https://github.com/cognitect-labs/test-runner" diff --git a/test-data/projects/pirate-lang/env/dev/repl.clj b/test-data/projects/pirate-lang/env/dev/repl.clj new file mode 100644 index 000000000..24decd64d --- /dev/null +++ b/test-data/projects/pirate-lang/env/dev/repl.clj @@ -0,0 +1,2 @@ +(ns repl + (:require [pez.pirate-lang-test])) \ No newline at end of file From 5360b230584bc7a8bce7343353b608cf7cacb09a Mon Sep 17 00:00:00 2001 From: sillycoon Date: Thu, 29 Dec 2022 14:45:23 +0900 Subject: [PATCH 04/13] add unit test for deftype indentation --- src/extension-test/unit/cursor-doc/indent-test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/extension-test/unit/cursor-doc/indent-test.ts b/src/extension-test/unit/cursor-doc/indent-test.ts index 1b75a0580..1d5c4d683 100644 --- a/src/extension-test/unit/cursor-doc/indent-test.ts +++ b/src/extension-test/unit/cursor-doc/indent-test.ts @@ -142,6 +142,18 @@ describe('indent', () => { ).toEqual(2); }); }); + + describe('deftype', () => { + it('calculates indents for cursor on the new line of a method implementation', () => { + const doc = docFromTextNotation(` +(deftype MyType [arg1 arg2] + IMyProto + (method1 [this] +|(print "hello")))`); + + expect(indent.getIndent(doc.model, textAndSelection(doc)[1][0])).toEqual(4); + }); + }); }); describe('collectIndents', () => { From 396ef3217164fcd89074e4e66a8502dfa9c5e495 Mon Sep 17 00:00:00 2001 From: Julien Vincent Date: Fri, 6 Jan 2023 17:16:46 +0000 Subject: [PATCH 05/13] Handle completion response failures gracefully The provider completions subsystem requests results from the lsp and nrepl providers sequentially and then merges the results together. If either of these providers fail to report completion items and throws an error then the entire flow fails. Ideally if one of the providers is working and is able to report results then the completions should continue to work. This commit fixes this issue by catching errors from the completions provider and quietly logging them to console instead of bubbling the error upstream. Fixes #2006 --- CHANGELOG.md | 2 ++ src/providers/completion.ts | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4975b0915..a78e20713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Changes to Calva. ## [Unreleased] +- Fix: [Provider completions not handling errors gracefully](https://github.com/BetterThanTomorrow/calva/issues/2006) + ## [2.0.322] - 2022-12-14 - Fix: [Clojure notebooks don't seem to work on MS-Windows](https://github.com/BetterThanTomorrow/calva/issues/1994) diff --git a/src/providers/completion.ts b/src/providers/completion.ts index b80c4f496..eb6fff7df 100644 --- a/src/providers/completion.ts +++ b/src/providers/completion.ts @@ -51,7 +51,15 @@ async function provideCompletionItems( if (results.length && !completionProviderOptions.merge) { break; } - const completions = await completionFunctions[provider](document, position, token, context); + + const completions = await completionFunctions[provider]( + document, + position, + token, + context + ).catch((err) => { + console.log('Failed to get results from remote', err); + }); if (completions) { results = [ From f7fc48fefbfcb10f6a47749a2e9a453df098a175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 7 Jan 2023 00:54:28 +0100 Subject: [PATCH 06/13] Add `bugs` entry to manifest --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 3499c74bc..96bc1382d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,9 @@ "url": "https://github.com/BetterThanTomorrow/calva.git" }, "license": "MIT", + "bugs": { + "url": "https://github.com/BetterThanTomorrow/calva/issues" + }, "engines": { "node": ">=16", "vscode": "^1.67.0" From 53b389c97f0a56a2166ccc73aa5f5556f2d20ca4 Mon Sep 17 00:00:00 2001 From: sillycoon Date: Wed, 4 Jan 2023 10:13:24 +0900 Subject: [PATCH 07/13] refactoring of calculateIndent --- src/cursor-doc/indent.ts | 106 +++++++++++++++++++++++++-------------- 1 file changed, 68 insertions(+), 38 deletions(-) diff --git a/src/cursor-doc/indent.ts b/src/cursor-doc/indent.ts index 6d71827c8..5e5490e8c 100644 --- a/src/cursor-doc/indent.ts +++ b/src/cursor-doc/indent.ts @@ -143,54 +143,84 @@ const testCljRe = (re, str) => { return matches && RegExp(matches[1]).test(str.replace(/^.*\//, '')); }; +const calculateDefaultIndent = (indentInfo: IndentInformation) => + indentInfo.exprsOnLine > 0 ? indentInfo.firstItemIdent : indentInfo.startIndent; + +const calculateInnerIndent = ( + currentIndent: number, + rule: IndentRule, + indentInfo: IndentInformation +) => { + if (rule.length !== 3 || rule[2] > indentInfo.argPos) { + return indentInfo.startIndent + 1; + } + + return currentIndent; +}; + +const calculateBlockIndent = ( + currentIndent: number, + rule: IndentRule, + indentInfo: IndentInformation +) => { + if (indentInfo.exprsOnLine > rule[1]) { + return indentInfo.firstItemIdent; + } + + if (indentInfo.argPos >= rule[1]) { + return indentInfo.startIndent + 1; + } + + return currentIndent; +}; + +const calculateIndent = ( + currentIndent: number, + rule: IndentRule, + indentInfo: IndentInformation, + stateSize: number, + pos: number +) => { + if (rule[0] === 'inner' && pos + rule[1] === stateSize) { + return calculateInnerIndent(currentIndent, rule, indentInfo); + } + + if (rule[0] === 'block' && pos === stateSize) { + return calculateBlockIndent(currentIndent, rule, indentInfo); + } + + return currentIndent; +}; + /** Returns the expected newline indent for the given position, in characters. */ -export function getIndent(document: EditableModel, offset: number, config?: any): number { - if (!config) { - config = { - 'cljfmt-options': { - indents: indentRules, - }, - }; +export function getIndent( + document: EditableModel, + offset: number, + config: any = { + 'cljfmt-options': { + indents: indentRules, + }, } +): number { const state = collectIndents(document, offset, config); - // now find applicable indent rules - let indent = -1; - const thisBlock = state[state.length - 1]; if (!state.length) { return 0; } - for (let pos = state.length - 1; pos >= 0; pos--) { - for (const rule of state[pos].rules) { - if (rule[0] == 'inner') { - if (pos + rule[1] == state.length - 1) { - if (rule.length == 3) { - if (rule[2] > thisBlock.argPos) { - indent = thisBlock.startIndent + 1; - } - } else { - indent = thisBlock.startIndent + 1; - } - } - } else if (rule[0] == 'block' && pos == state.length - 1) { - if (thisBlock.exprsOnLine <= rule[1]) { - if (thisBlock.argPos >= rule[1]) { - indent = thisBlock.startIndent + 1; - } - } else { - indent = thisBlock.firstItemIdent; - } - } - } + // now find applicable indent rules + let indent = -1; + const stateSize = state.length - 1; + const thisBlock = state.at(-1); + for (let pos = stateSize; pos >= 0; pos--) { + indent = state[pos].rules.reduce( + (currentIndent, rule) => calculateIndent(currentIndent, rule, thisBlock, stateSize, pos), + indent + ); } if (indent == -1) { - // no indentation styles applied, so use default style. - if (thisBlock.exprsOnLine > 0) { - indent = thisBlock.firstItemIdent; - } else { - indent = thisBlock.startIndent; - } + return calculateDefaultIndent(thisBlock); } + return indent; } From ff849f01e9ab6b53efc9d3c78d8fb3d4c5e51ed8 Mon Sep 17 00:00:00 2001 From: sillycoon Date: Wed, 4 Jan 2023 10:15:01 +0900 Subject: [PATCH 08/13] fix deftype indent test --- src/extension-test/unit/cursor-doc/indent-test.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/extension-test/unit/cursor-doc/indent-test.ts b/src/extension-test/unit/cursor-doc/indent-test.ts index 1d5c4d683..53b5e1a15 100644 --- a/src/extension-test/unit/cursor-doc/indent-test.ts +++ b/src/extension-test/unit/cursor-doc/indent-test.ts @@ -151,7 +151,19 @@ describe('indent', () => { (method1 [this] |(print "hello")))`); - expect(indent.getIndent(doc.model, textAndSelection(doc)[1][0])).toEqual(4); + expect( + indent.getIndent( + doc.model, + textAndSelection(doc)[1][0], + mkConfig({ + deftype: [ + ['block', 2], + ['inner', 1], + ], + '#"^def(?!ault)(?!late)(?!er)"': [['inner', 0]], + }) + ) + ).toEqual(4); }); }); }); From eb61021871494483a2a6527d462488ee2936dbdb Mon Sep 17 00:00:00 2001 From: sillycoon Date: Wed, 4 Jan 2023 12:28:48 +0900 Subject: [PATCH 09/13] fix order of applying rules for indents #1957 --- src/calva-fmt/src/config.ts | 12 +++++++++- src/cljs-lib/src/calva/fmt/formatter.cljs | 10 ++++++++- .../test/calva/fmt/formatter_test.cljs | 22 +++++++++++-------- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/calva-fmt/src/config.ts b/src/calva-fmt/src/config.ts index fbd3a6436..a1eda5da2 100644 --- a/src/calva-fmt/src/config.ts +++ b/src/calva-fmt/src/config.ts @@ -13,6 +13,16 @@ const defaultCljfmtContent = const LSP_CONFIG_KEY = 'CLOJURE-LSP'; let lspFormatConfig: string | undefined; +function cljfmtOptionsFromString(cljfmt: string) { + const options = cljsLib.cljfmtOptionsFromString(cljfmt); + return { + ...options, + // because we can't correctly pass ordered map from cljs + // but we need it to determine the order of applying indent rules + indents: Object.fromEntries(options['indents']), + }; +} + function configuration(workspaceConfig: vscode.WorkspaceConfiguration, cljfmt: string) { return { 'format-as-you-type': !!formatOnTypeEnabled(), @@ -20,7 +30,7 @@ function configuration(workspaceConfig: vscode.WorkspaceConfiguration, cljfmt: s 'keepCommentTrailParenOnOwnLine' ), 'cljfmt-options-string': cljfmt, - 'cljfmt-options': cljsLib.cljfmtOptionsFromString(cljfmt), + 'cljfmt-options': cljfmtOptionsFromString(cljfmt), }; } diff --git a/src/cljs-lib/src/calva/fmt/formatter.cljs b/src/cljs-lib/src/calva/fmt/formatter.cljs index ed31a7494..60646b5c1 100644 --- a/src/cljs-lib/src/calva/fmt/formatter.cljs +++ b/src/cljs-lib/src/calva/fmt/formatter.cljs @@ -16,6 +16,13 @@ indents (merge cljfmt/default-indents indents))) +(defn- sort-indents + "Sorts rules in order to prevent default rule application + before specific one" + [indents] + #_{:clj-kondo/ignore [:private-call]} + (sort-by cljfmt/indent-order indents)) + (def ^:private default-fmt {:remove-surrounding-whitespace? true :remove-trailing-whitespace? true @@ -27,6 +34,7 @@ [fmt] (as-> fmt $ (update $ :indents merge-default-indents) + (update $ :indents sort-indents) (merge default-fmt $))) (defn- read-cljfmt @@ -259,7 +267,7 @@ (remove-indent-token-if-empty-current-line) (remove-trail-symbol-if-comment range))) (comment - + :rcf) (defn format-text-at-idx-on-type "Relax formating some when used as an on-type handler" diff --git a/src/cljs-lib/test/calva/fmt/formatter_test.cljs b/src/cljs-lib/test/calva/fmt/formatter_test.cljs index a43860c35..586460b0c 100644 --- a/src/cljs-lib/test/calva/fmt/formatter_test.cljs +++ b/src/cljs-lib/test/calva/fmt/formatter_test.cljs @@ -1,7 +1,7 @@ (ns calva.fmt.formatter-test - (:require [cljs.test :include-macros true :refer [deftest is testing]] - [cljfmt.core :as cljfmt] - [calva.fmt.formatter :as sut])) + (:require [calva.fmt.formatter :as sut] + [cljfmt.core :as cljfmt :refer [includes?]] + [cljs.test :include-macros true :refer [deftest is testing]])) (deftest format-text-at-range (is (= "(foo)\n(defn bar\n [x]\n baz)" @@ -51,7 +51,7 @@ ccc {:a b :aa bb :ccc ccc}] :config {:align-associative? true} :range [0 56] :idx 0}))))) - + (testing "Does not align associative structures when `:align-associative` is not `true`" (is (= "(def foo (let [a b @@ -73,7 +73,7 @@ ccc {:a b :aa bb :ccc ccc}] :config {:remove-multiple-non-indenting-spaces? true} :range [0 56] :idx 0}))))) - + (testing "Does not trim space between forms when `:remove-multiple-non-indenting-spaces?` is missing" (is (= "(def foo (let [a b @@ -314,7 +314,7 @@ bar))" :range [22 25]}))) (is (= (+ 2 (count cljfmt/default-indents)) (count (:indents (sut/read-cljfmt "{:indents {foo [[:inner 0]] bar [[:block 1]]}}")))) "merges indents on top of cljfmt indent rules") - (is (= {'a [[:inner 0]]} + (is (= '([a [[:inner 0]]]) (:indents (sut/read-cljfmt "{:indents ^:replace {a [[:inner 0]]}}"))) "with :replace metadata hint overrides default indents") (is (= false @@ -330,7 +330,11 @@ bar))" :range [22 25]}))) (:remove-surrounding-whitespace? (sut/read-cljfmt "{:remove-surrounding-whitespace? false}"))) "including keys in cljfmt such as :remove-surrounding-whitespace? will override defaults.") (is (nil? (:foo (sut/read-cljfmt "{:bar false}"))) - "most keys don't have any defaults.")) + "most keys don't have any defaults.") + (is (empty? (let [indents (map (comp str first) (:indents (sut/read-cljfmt "{}"))) + indents-after-default (drop-while #(not= (str #"^def(?!ault)(?!late)(?!er)") %) indents)] + (filter (partial re-find #"^def") indents-after-default))) + "places default rule '^def(?!ault)(?!late)(?!er)' after all specific def rules")) (deftest cljfmt-options (is (= (count cljfmt/default-indents) @@ -339,12 +343,12 @@ bar))" :range [22 25]}))) (is (= (+ 2 (count cljfmt/default-indents)) (count (:indents (sut/merge-cljfmt '{:indents {foo [[:inner 0]] bar [[:block 1]]}})))) "merges indents on top of cljfmt indent rules") - (is (= {'a [[:inner 0]]} + (is (= '([a [[:inner 0]]]) (:indents (sut/merge-cljfmt '{:indents ^:replace {a [[:inner 0]]}}))) "with :replace metadata hint overrides default indents") (is (= true (:align-associative? (sut/merge-cljfmt {:align-associative? true - :cljfmt-string "{:align-associative? false}"}))) + :cljfmt-string "{:align-associative? false}"}))) "cljfmt :align-associative? has lower priority than config's option") (is (= false (:align-associative? (sut/merge-cljfmt {:cljfmt-string "{}"}))) From 63c3ff1f370fcfdedf7f671e42186ead4ba9d3e8 Mon Sep 17 00:00:00 2001 From: sillycoon Date: Sat, 7 Jan 2023 22:53:15 +0900 Subject: [PATCH 10/13] update changelog for #1957 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a78e20713..f53ad43bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Changes to Calva. ## [Unreleased] - Fix: [Provider completions not handling errors gracefully](https://github.com/BetterThanTomorrow/calva/issues/2006) +- Partly fix (indenter): [Indenter and formatter fails while typing out body of deftype method](https://github.com/BetterThanTomorrow/calva/issues/1957) ## [2.0.322] - 2022-12-14 From 1bfeb4e2773e7f06dc59d48f259672071b348dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 7 Jan 2023 16:22:57 +0100 Subject: [PATCH 11/13] Update publish script to check git status Fixes #1976 --- publish.clj | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/publish.clj b/publish.clj index 3d79105ca..3666654c1 100755 --- a/publish.clj +++ b/publish.clj @@ -60,6 +60,18 @@ (println "Pushing") (throw-if-error (shell/sh "git" "push" "--follow-tags"))) +(defn git-status [] + (println "Checking git status") + (let [result (throw-if-error (shell/sh "git" "status")) + out (:out result) + [_ branch] (re-find #"^On branch (\S+)\n" out) + up-to-date (re-find #"Your branch is up to date" out) + clean (re-find #"nothing to commit, working tree clean" out)] + (cond-> #{} + (not= "dev" branch) (conj :not-on-dev) + (not up-to-date) (conj :not-up-to-date) + (not clean) (conj :branch-not-clean)))) + (defn publish [] (tag calva-version) (push) @@ -69,15 +81,22 @@ (when (= *file* (System/getProperty "babashka.file")) (let [unreleased-changelog-text (get-unreleased-changelog-text changelog-text - unreleased-header-re)] + unreleased-header-re) + status (git-status)] + (when (or (seq status) + (empty? unreleased-changelog-text)) + (when (seq status) + (println "Git status issues: " status)) + (when (empty? unreleased-changelog-text) + (print "There are no unreleased changes in the changelog.")) + (println "Release anyway? YES/NO: ") + (flush) + (let [answer (read)] + (when-not (= "YES" answer) + (println "Aborting publish.") + (System/exit 0)))) (if (empty? unreleased-changelog-text) - (do - (print "There are no unreleased changes in the changelog. Release anyway? y/n: ") - (flush) - (let [answer (read)] - (if (= (str answer) "y") - (publish) - (println "Aborting publish.")))) + (publish) (let [updated-changelog-text (new-changelog-text changelog-text unreleased-header-re calva-version)] From 5f6dd2a3f7d7b07eaf4182fbe9f7c9646e2323a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 7 Jan 2023 16:46:02 +0100 Subject: [PATCH 12/13] Return result from throw-if-error [skip ci] --- publish.clj | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/publish.clj b/publish.clj index 3666654c1..a7ec62f9a 100755 --- a/publish.clj +++ b/publish.clj @@ -3,9 +3,10 @@ ;; Note: The shell commands may need to be modified if you're using Windows. ;; At the time of this writing, both people who push use Unix-based machines. -(require '[clojure.string :as str] - '[cheshire.core :as json] - '[clojure.java.shell :as shell]) +(ns publish + (:require [clojure.string :as str] + [cheshire.core :as json] + [clojure.java.shell :as shell])) (def changelog-filename "CHANGELOG.md") (def changelog-text (slurp changelog-filename)) @@ -37,11 +38,12 @@ (format "[Unreleased]\n\n%s\n\n" new-header))] new-text)) -(defn throw-if-error [{:keys [exit out err]}] - (when-not (= exit 0) +(defn throw-if-error [{:keys [exit out err] :as result}] + (if-not (= exit 0) (throw (Exception. (if (empty? out) err - out))))) + out))) + result)) (defn commit-changelog [file-name message] (println "Committing") From ed2736a8de25b8ea40647b89177a6edb623e2ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 7 Jan 2023 16:46:56 +0100 Subject: [PATCH 13/13] Add changelog section for v2.0.323 [skip ci] --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f53ad43bf..b496252d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ Changes to Calva. ## [Unreleased] +## [2.0.323] - 2023-01-07 + - Fix: [Provider completions not handling errors gracefully](https://github.com/BetterThanTomorrow/calva/issues/2006) - Partly fix (indenter): [Indenter and formatter fails while typing out body of deftype method](https://github.com/BetterThanTomorrow/calva/issues/1957)