From b34650ea31c61ab02d093d85049e638fe17bfbf5 Mon Sep 17 00:00:00 2001 From: Huw Percival Date: Tue, 22 Feb 2022 16:36:35 +0000 Subject: [PATCH 1/3] fix presets --- src/_cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_cmake b/src/_cmake index a0b0a0e..cc5de89 100644 --- a/src/_cmake +++ b/src/_cmake @@ -147,7 +147,7 @@ _cmake_presets() { # TODO: Problems with quotes need eval # would need a way to exec the array - local list_presets; list_presets=(${(f)"$(eval "${invoke[@]} 2> /dev/null" | sed -n 's,^[[:space:]]*"\([^"]*\)"[[:space:]]*-[[:space:]]*\(.*\),\1:\2,p' )"}) + local list_presets; list_presets=(${(f)"$(eval "${invoke[@]} 2> /dev/null" | grep -Po '(?<=\").*(?=")' )"}) _describe 'presets' list_presets } From ff6031a8ea549ca8deff1f163a43388cce936160 Mon Sep 17 00:00:00 2001 From: Huw Percival Date: Wed, 23 Feb 2022 10:40:29 +0000 Subject: [PATCH 2/3] re-write to use python, hopefully this is portable enough, tested with python 3.6.5 anf 2.7.18 --- src/_cmake | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/_cmake b/src/_cmake index cc5de89..20b88ac 100644 --- a/src/_cmake +++ b/src/_cmake @@ -141,13 +141,21 @@ _cmake_generator_options() { # -------------- (( $+functions[_cmake_presets] )) || _cmake_presets() { - local invoke; invoke=(${words[@]}) - # TODO: remove all arguments -* except -S - invoke[$CURRENT]=--list-presets + + local parse_presets; parse_presets=' +import json +import os +try: + with open("CMakePresets.json") as preset_file: + print(os.linesep.join([ x["name"] + ":" + x.get("description", "") for x in json.load(preset_file)["configurePresets"]])) +except: + pass + +' # TODO: Problems with quotes need eval # would need a way to exec the array - local list_presets; list_presets=(${(f)"$(eval "${invoke[@]} 2> /dev/null" | grep -Po '(?<=\").*(?=")' )"}) + local list_presets; list_presets=(${(f)"$(eval python <<< $parse_presets)"}) _describe 'presets' list_presets } From d9e81e08f20cddb37377b8f8af0c4da706b7e829 Mon Sep 17 00:00:00 2001 From: Shohei YOSHIDA Date: Thu, 24 Feb 2022 15:04:47 +0900 Subject: [PATCH 3/3] Rewrite JSON parsing code in Perl for portability --- src/_cmake | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/_cmake b/src/_cmake index 20b88ac..6955bcf 100644 --- a/src/_cmake +++ b/src/_cmake @@ -141,21 +141,14 @@ _cmake_generator_options() { # -------------- (( $+functions[_cmake_presets] )) || _cmake_presets() { - - local parse_presets; parse_presets=' -import json -import os -try: - with open("CMakePresets.json") as preset_file: - print(os.linesep.join([ x["name"] + ":" + x.get("description", "") for x in json.load(preset_file)["configurePresets"]])) -except: - pass - -' - # TODO: Problems with quotes need eval # would need a way to exec the array - local list_presets; list_presets=(${(f)"$(eval python <<< $parse_presets)"}) + local -a list_presets; + + if [[ -e CMakePresets.json ]]; then + # some old projects uses BOM in json file. strip UTF-8 BOM and then parse JSON + list_presets=("${(@f)$(sed '1s/^\xEF\xBB\xBF//' < CMakePresets.json | perl -0777 -MJSON::PP -nE 'do{$k=$_;($e=$k)=~s/:/\\:/g; printf "$_->{name}:$_->{description}\n"} for @{decode_json($_)->{configurePresets}}' 2>/dev/null)}") + fi _describe 'presets' list_presets }