From 4b25c6ac5142a38616d622254355db12e1ab0e83 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Tue, 24 Dec 2019 13:15:15 -0500 Subject: [PATCH 01/16] vscode-utils/vscodeEnv: add vscodeWithConfiguration, vscodeExts2nix and vscodeEnv move mktplcExtRefToFetchArgs to file in order to be shared with the new derivations(privately) --- .../mktplcExtRefToFetchArgs.nix | 8 ++++ pkgs/misc/vscode-extensions/vscode-utils.nix | 31 ++++++++----- pkgs/misc/vscode-extensions/vscodeEnv.nix | 40 +++++++++++++++++ .../misc/vscode-extensions/vscodeExts2nix.nix | 44 +++++++++++++++++++ .../vscodeWithConfiguration.nix | 39 ++++++++++++++++ 5 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix create mode 100644 pkgs/misc/vscode-extensions/vscodeEnv.nix create mode 100644 pkgs/misc/vscode-extensions/vscodeExts2nix.nix create mode 100644 pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix diff --git a/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix new file mode 100644 index 00000000000..21bdd0f6d7b --- /dev/null +++ b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix @@ -0,0 +1,8 @@ +ext: +{ + url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; + sha256 = ext.sha256; + # The `*.vsix` file is in the end a simple zip file. Change the extension + # so that existing `unzip` hooks takes care of the unpacking. + name = "${ext.publisher}-${ext.name}.zip"; +} diff --git a/pkgs/misc/vscode-extensions/vscode-utils.nix b/pkgs/misc/vscode-extensions/vscode-utils.nix index 2216e425897..3184cabb082 100644 --- a/pkgs/misc/vscode-extensions/vscode-utils.nix +++ b/pkgs/misc/vscode-extensions/vscode-utils.nix @@ -1,16 +1,9 @@ -{ stdenv, lib, fetchurl, vscode, unzip }: +{ stdenv, lib, writeShellScriptBin, fetchurl, vscode, unzip }: let extendedPkgVersion = lib.getVersion vscode; extendedPkgName = lib.removeSuffix "-${extendedPkgVersion}" vscode.name; - mktplcExtRefToFetchArgs = ext: { - url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; - sha256 = ext.sha256; - # The `*.vsix` file is in the end a simple zip file. Change the extension - # so that existing `unzip` hooks takes care of the unpacking. - name = "${ext.publisher}-${ext.name}.zip"; - }; buildVscodeExtension = a@{ name, @@ -38,6 +31,7 @@ let buildInputs = [ unzip ] ++ buildInputs; installPhase = '' + runHook preInstall mkdir -p "$out/$installPrefix" @@ -48,9 +42,8 @@ let }); - fetchVsixFromVscodeMarketplace = mktplcExtRef: - fetchurl((mktplcExtRefToFetchArgs mktplcExtRef)); + fetchurl((import ./mktplcExtRefToFetchArgs.nix mktplcExtRef)); buildVscodeMarketplaceExtension = a@{ name ? "", @@ -80,10 +73,24 @@ let extensionsFromVscodeMarketplace = mktplcExtRefList: builtins.map extensionFromVscodeMarketplace mktplcExtRefList; -in + vscodeWithConfiguration = (userParams : import ./vscodeWithConfiguration.nix { + inherit lib vscode extensionsFromVscodeMarketplace writeShellScriptBin; + } // userParams); + + + vscodeExts2nix = (userParams : import ./vscodeExts2nix.nix { + inherit lib vscode; + } // userParams); + + vscodeEnv = (userParams : import ./vscodeEnv.nix { + inherit lib writeShellScriptBin extensionsFromVscodeMarketplace vscode; + } // userParams ); + +in { inherit fetchVsixFromVscodeMarketplace buildVscodeExtension buildVscodeMarketplaceExtension extensionFromVscodeMarketplace - extensionsFromVscodeMarketplace; + extensionsFromVscodeMarketplace + vscodeWithConfiguration vscodeExts2nix vscodeEnv; } diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix new file mode 100644 index 00000000000..7c1bb255b85 --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -0,0 +1,40 @@ +#use vscodeWithConfiguration and vscodeExts2nix to create vscode exetuable that when exits(vscode) will update the mutable extension file, which is imported when getting evaluated by nix. +{ pkgs ? import {} +, lib ? pkgs.lib +, writeShellScriptBin ? pkgs.writeShellScriptBin +, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace + +##User input + +, nixExtensions ? [] +# if file exists will use it and import the extensions in it into this dervation else will use empty extensions list +# this file will be created/updated by vscodeExts2nix when vscode exists +, mutableExtensionsFile ? ./extensions.nix +, vscodeExtsFolderName ? ".vscode-exts" +, vscode ? pkgs.vscode +}: +let + mutableExtensionsFilePath = builtins.toPath mutableExtensionsFile; + mutableExtensions = if builtins.pathExists mutableExtensionsFile + then import mutableExtensionsFilePath else []; + vscodeWithConfiguration = import ./vscodeWithConfiguration.nix { + inherit lib writeShellScriptBin vscode extensionsFromVscodeMarketplace + nixExtensions mutableExtensions vscodeExtsFolderName; + }; + + vscodeExts2nix = import ./vscodeExts2nix.nix { + inherit lib writeShellScriptBin; + extensionsToIgnore = nixExtensions; + extensions = mutableExtensions; + vscode = vscodeWithConfiguration; + }; + code = writeShellScriptBin "code" '' + ${vscodeWithConfiguration}/bin/code --wait "$@" + echo 'running vscodeExts2nix to update ${mutableExtensionsFilePath}...' + ${vscodeExts2nix}/bin/vscodeExts2nix > ${mutableExtensionsFilePath} + ''; +in +pkgs.buildEnv { + name = "vscodeEnv"; + paths = [ code vscodeExts2nix ]; +} diff --git a/pkgs/misc/vscode-extensions/vscodeExts2nix.nix b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix new file mode 100644 index 00000000000..12fe09a2425 --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix @@ -0,0 +1,44 @@ +# based on the passed vscode will stdout a nix expression with the installed vscode extensions +{ pkgs ? import {} +, lib ? pkgs.lib +, vscode ? pkgs.vscode +, writeShellScriptBin ? pkgs.writeShellScriptBin + +##User input + +, extensionsToIgnore ? [] +# will use those extensions to get sha256 if still exists when executed. +, extensions ? [] +}: +let + mktplcExtRefToFetchArgs = import ./mktplcExtRefToFetchArgs.nix; +in +writeShellScriptBin "vscodeExts2nix" '' + echo '[' + + for line in $(${vscode}/bin/code --list-extensions --show-versions \ + ${lib.optionalString (extensionsToIgnore != []) '' + | grep -v -i '^\(${lib.concatMapStringsSep "\\|" (e : ''${e.publisher}.${e.name}'') extensionsToIgnore}\)' + ''} + ) ; do + [[ $line =~ ([^.]*)\.([^@]*)@(.*) ]] + name=''${BASH_REMATCH[2]} + publisher=''${BASH_REMATCH[1]} + version=''${BASH_REMATCH[3]} + + extensions="${lib.concatMapStringsSep "." (e : ''${e.publisher}${e.name}@${e.sha256}'') extensions}" + reCurrentExt=$publisher$name"@([^.]*)" + if [[ $extensions =~ $reCurrentExt ]]; then + sha256=''${BASH_REMATCH[1]} + else + sha256=$( + nix-prefetch-url "${(mktplcExtRefToFetchArgs {publisher = ''"$publisher"''; name = ''"$name"''; version = ''"$version"'';}).url}" 2> /dev/null + ) + fi + + echo "{ name = \"''${name}\"; publisher = \"''${publisher}\"; version = \"''${version}\"; sha256 = \"''${sha256}\"; }" + done + + + echo ']' +'' diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix new file mode 100644 index 00000000000..11282865c7c --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -0,0 +1,39 @@ +# wrapper over vscode to control extensions per project (extensions folder will be created in execution path) +{ pkgs ? import {} +, lib ? pkgs.lib +, writeShellScriptBin ? pkgs.writeShellScriptBin +, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace + +##User input + +, vscode ? pkgs.vscode +# extensions to be symlinked into the project's extensions folder +, nixExtensions ? [] +# extensions to be copied into the project's extensions folder +, mutableExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" +}: +let + nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions; + mutExtsDrvs = extensionsFromVscodeMarketplace mutableExtensions; + + #removed not defined extensions + rmExtensions = lib.optionalString (nixExtensions++mutableExtensions != []) '' + find ${vscodeExtsFolderName} -mindepth 1 -maxdepth 1 ${lib.concatMapStringsSep " " (e : ''! -iname ${e.publisher}.${e.name}'') (nixExtensions++mutableExtensions)} -exec sudo rm -rf {} \; + ''; + #copy mutable extension out of the nix store + cpExtensions = '' + ${lib.concatMapStringsSep "\n" (e : ''ln -sfn ${e}/share/vscode/extensions/* ${vscodeExtsFolderName}/'') nixExtsDrvs} + ${lib.concatMapStringsSep "\n" (e : '' + cp -a ${e}/share/vscode/extensions/${e.vscodeExtUniqueId} ${vscodeExtsFolderName}/${e.vscodeExtUniqueId}-${(lib.findSingle (ext: ''${ext.publisher}.${ext.name}'' == e.vscodeExtUniqueId) "" "m" mutableExtensions ).version} + '') mutExtsDrvs} + ''; +in + writeShellScriptBin "code" '' + if ! [[ "$@" =~ "--list-extension" ]]; then + mkdir -p ${vscodeExtsFolderName} + ${rmExtensions} + ${cpExtensions} + fi + ${vscode}/bin/code --extensions-dir ${vscodeExtsFolderName} "$@" + '' From 2d594255550afad5a41f50598e1d410db20013be Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sat, 28 Dec 2019 16:40:13 -0500 Subject: [PATCH 02/16] vsode-utils: extracting attributes to limit input range --- pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix index 21bdd0f6d7b..a781250fc18 100644 --- a/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix +++ b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix @@ -1,8 +1,8 @@ -ext: +{ publisher, name, version, sha256 ? "" }: { - url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; - sha256 = ext.sha256; + url = "https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${name}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; + sha256 = sha256; # The `*.vsix` file is in the end a simple zip file. Change the extension # so that existing `unzip` hooks takes care of the unpacking. - name = "${ext.publisher}-${ext.name}.zip"; + name = "${publisher}-${name}.zip"; } From 7fc2b2ad7e303fc92258e7521ee7da526b208a4b Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sat, 28 Dec 2019 16:43:41 -0500 Subject: [PATCH 03/16] vscode-utils/vscodeEnv: split to 2 functions vscodeWithConfiguration, vscodeExts2nix, vscodeEnv change usage of toPath with toString --- pkgs/misc/vscode-extensions/vscode-utils.nix | 25 ++++++------- pkgs/misc/vscode-extensions/vscodeEnv.nix | 35 +++++++++++-------- .../misc/vscode-extensions/vscodeExts2nix.nix | 14 ++++---- .../vscodeWithConfiguration.nix | 21 ++++++----- 4 files changed, 50 insertions(+), 45 deletions(-) diff --git a/pkgs/misc/vscode-extensions/vscode-utils.nix b/pkgs/misc/vscode-extensions/vscode-utils.nix index 3184cabb082..b4c1fda5e6e 100644 --- a/pkgs/misc/vscode-extensions/vscode-utils.nix +++ b/pkgs/misc/vscode-extensions/vscode-utils.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, writeShellScriptBin, fetchurl, vscode, unzip }: +{ stdenv, lib, buildEnv, writeShellScriptBin, fetchurl, vscode, unzip }: let extendedPkgVersion = lib.getVersion vscode; @@ -73,21 +73,22 @@ let extensionsFromVscodeMarketplace = mktplcExtRefList: builtins.map extensionFromVscodeMarketplace mktplcExtRefList; - vscodeWithConfiguration = (userParams : import ./vscodeWithConfiguration.nix { - inherit lib vscode extensionsFromVscodeMarketplace writeShellScriptBin; - } // userParams); + vscodeWithConfiguration = import ./vscodeWithConfiguration.nix { + inherit lib extensionsFromVscodeMarketplace writeShellScriptBin; + vscodeDefault = vscode; + }; - vscodeExts2nix = (userParams : import ./vscodeExts2nix.nix { - inherit lib vscode; - } // userParams); - - vscodeEnv = (userParams : import ./vscodeEnv.nix { - inherit lib writeShellScriptBin extensionsFromVscodeMarketplace vscode; - } // userParams ); + vscodeExts2nix = import ./vscodeExts2nix.nix { + inherit lib writeShellScriptBin; + vscodeDefault = vscode; + }; + vscodeEnv = import ./vscodeEnv.nix { + inherit lib buildEnv writeShellScriptBin extensionsFromVscodeMarketplace; + vscodeDefault = vscode; + }; in - { inherit fetchVsixFromVscodeMarketplace buildVscodeExtension buildVscodeMarketplaceExtension extensionFromVscodeMarketplace diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index 7c1bb255b85..395e5307bc1 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -1,32 +1,37 @@ #use vscodeWithConfiguration and vscodeExts2nix to create vscode exetuable that when exits(vscode) will update the mutable extension file, which is imported when getting evaluated by nix. -{ pkgs ? import {} -, lib ? pkgs.lib -, writeShellScriptBin ? pkgs.writeShellScriptBin -, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace - +{ lib +, buildEnv +, writeShellScriptBin +, extensionsFromVscodeMarketplace +, vscodeDefault +}: ##User input - -, nixExtensions ? [] +{ vscode ? vscodeDefault +, nixExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" # if file exists will use it and import the extensions in it into this dervation else will use empty extensions list # this file will be created/updated by vscodeExts2nix when vscode exists -, mutableExtensionsFile ? ./extensions.nix -, vscodeExtsFolderName ? ".vscode-exts" -, vscode ? pkgs.vscode +, mutableExtensionsFile }: let - mutableExtensionsFilePath = builtins.toPath mutableExtensionsFile; + mutableExtensionsFilePath = toString mutableExtensionsFile; mutableExtensions = if builtins.pathExists mutableExtensionsFile then import mutableExtensionsFilePath else []; vscodeWithConfiguration = import ./vscodeWithConfiguration.nix { - inherit lib writeShellScriptBin vscode extensionsFromVscodeMarketplace - nixExtensions mutableExtensions vscodeExtsFolderName; + inherit lib writeShellScriptBin extensionsFromVscodeMarketplace; + vscodeDefault = vscode; + } + { + inherit nixExtensions mutableExtensions vscodeExtsFolderName; }; vscodeExts2nix = import ./vscodeExts2nix.nix { inherit lib writeShellScriptBin; + vscodeDefault = vscodeWithConfiguration; + } + { extensionsToIgnore = nixExtensions; extensions = mutableExtensions; - vscode = vscodeWithConfiguration; }; code = writeShellScriptBin "code" '' ${vscodeWithConfiguration}/bin/code --wait "$@" @@ -34,7 +39,7 @@ let ${vscodeExts2nix}/bin/vscodeExts2nix > ${mutableExtensionsFilePath} ''; in -pkgs.buildEnv { +buildEnv { name = "vscodeEnv"; paths = [ code vscodeExts2nix ]; } diff --git a/pkgs/misc/vscode-extensions/vscodeExts2nix.nix b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix index 12fe09a2425..afd176b4c5e 100644 --- a/pkgs/misc/vscode-extensions/vscodeExts2nix.nix +++ b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix @@ -1,14 +1,14 @@ # based on the passed vscode will stdout a nix expression with the installed vscode extensions -{ pkgs ? import {} -, lib ? pkgs.lib -, vscode ? pkgs.vscode -, writeShellScriptBin ? pkgs.writeShellScriptBin +{ lib +, vscodeDefault +, writeShellScriptBin +}: ##User input - -, extensionsToIgnore ? [] +{ vscode ? vscodeDefault +, extensionsToIgnore ? [] # will use those extensions to get sha256 if still exists when executed. -, extensions ? [] +, extensions ? [] }: let mktplcExtRefToFetchArgs = import ./mktplcExtRefToFetchArgs.nix; diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix index 11282865c7c..0ad32392192 100644 --- a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -1,17 +1,16 @@ # wrapper over vscode to control extensions per project (extensions folder will be created in execution path) -{ pkgs ? import {} -, lib ? pkgs.lib -, writeShellScriptBin ? pkgs.writeShellScriptBin -, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace - -##User input - -, vscode ? pkgs.vscode +{ lib +, writeShellScriptBin +, extensionsFromVscodeMarketplace +, vscodeDefault +}: +## User input +{ vscode ? vscodeDefault # extensions to be symlinked into the project's extensions folder -, nixExtensions ? [] +, nixExtensions ? [] # extensions to be copied into the project's extensions folder -, mutableExtensions ? [] -, vscodeExtsFolderName ? ".vscode-exts" +, mutableExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" }: let nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions; From e708176d43f11823054d07a1ad8db79e8e5e291c Mon Sep 17 00:00:00 2001 From: oren Date: Fri, 10 Jan 2020 21:45:56 -0500 Subject: [PATCH 04/16] vscode-utils/vscodeEnv: fix typo and grammer in the description comment --- pkgs/misc/vscode-extensions/vscodeEnv.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index 395e5307bc1..b2f717ccc3e 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -1,4 +1,4 @@ -#use vscodeWithConfiguration and vscodeExts2nix to create vscode exetuable that when exits(vscode) will update the mutable extension file, which is imported when getting evaluated by nix. +#Use vscodeWithConfiguration and vscodeExts2nix to create a vscode executable. When the executable exits, it updates the mutable extension file, which is imported when evaluated by Nix later. { lib , buildEnv , writeShellScriptBin From 666d7082ca507f048fd3a0b0f0be93566f8557d2 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Tue, 24 Dec 2019 13:15:15 -0500 Subject: [PATCH 05/16] vscode-utils/vscodeEnv: add vscodeWithConfiguration, vscodeExts2nix and vscodeEnv move mktplcExtRefToFetchArgs to file in order to be shared with the new derivations(privately) --- .../mktplcExtRefToFetchArgs.nix | 8 ++++ pkgs/misc/vscode-extensions/vscode-utils.nix | 31 ++++++++----- pkgs/misc/vscode-extensions/vscodeEnv.nix | 40 +++++++++++++++++ .../misc/vscode-extensions/vscodeExts2nix.nix | 44 +++++++++++++++++++ .../vscodeWithConfiguration.nix | 39 ++++++++++++++++ 5 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix create mode 100644 pkgs/misc/vscode-extensions/vscodeEnv.nix create mode 100644 pkgs/misc/vscode-extensions/vscodeExts2nix.nix create mode 100644 pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix diff --git a/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix new file mode 100644 index 00000000000..21bdd0f6d7b --- /dev/null +++ b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix @@ -0,0 +1,8 @@ +ext: +{ + url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; + sha256 = ext.sha256; + # The `*.vsix` file is in the end a simple zip file. Change the extension + # so that existing `unzip` hooks takes care of the unpacking. + name = "${ext.publisher}-${ext.name}.zip"; +} diff --git a/pkgs/misc/vscode-extensions/vscode-utils.nix b/pkgs/misc/vscode-extensions/vscode-utils.nix index 5d446b025d7..448bc81c917 100644 --- a/pkgs/misc/vscode-extensions/vscode-utils.nix +++ b/pkgs/misc/vscode-extensions/vscode-utils.nix @@ -1,13 +1,6 @@ -{ stdenv, lib, fetchurl, unzip }: +{ stdenv, lib, writeShellScriptBin, fetchurl, vscode, unzip }: let - mktplcExtRefToFetchArgs = ext: { - url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; - sha256 = ext.sha256; - # The `*.vsix` file is in the end a simple zip file. Change the extension - # so that existing `unzip` hooks takes care of the unpacking. - name = "${ext.publisher}-${ext.name}.zip"; - }; buildVscodeExtension = a@{ name, @@ -34,6 +27,7 @@ let buildInputs = [ unzip ] ++ buildInputs; installPhase = '' + runHook preInstall mkdir -p "$out/$installPrefix" @@ -44,9 +38,8 @@ let }); - fetchVsixFromVscodeMarketplace = mktplcExtRef: - fetchurl((mktplcExtRefToFetchArgs mktplcExtRef)); + fetchurl((import ./mktplcExtRefToFetchArgs.nix mktplcExtRef)); buildVscodeMarketplaceExtension = a@{ name ? "", @@ -79,10 +72,24 @@ let extensionsFromVscodeMarketplace = mktplcExtRefList: builtins.map extensionFromVscodeMarketplace mktplcExtRefList; -in + vscodeWithConfiguration = (userParams : import ./vscodeWithConfiguration.nix { + inherit lib vscode extensionsFromVscodeMarketplace writeShellScriptBin; + } // userParams); + + + vscodeExts2nix = (userParams : import ./vscodeExts2nix.nix { + inherit lib vscode; + } // userParams); + + vscodeEnv = (userParams : import ./vscodeEnv.nix { + inherit lib writeShellScriptBin extensionsFromVscodeMarketplace vscode; + } // userParams ); + +in { inherit fetchVsixFromVscodeMarketplace buildVscodeExtension buildVscodeMarketplaceExtension extensionFromVscodeMarketplace - extensionsFromVscodeMarketplace; + extensionsFromVscodeMarketplace + vscodeWithConfiguration vscodeExts2nix vscodeEnv; } diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix new file mode 100644 index 00000000000..7c1bb255b85 --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -0,0 +1,40 @@ +#use vscodeWithConfiguration and vscodeExts2nix to create vscode exetuable that when exits(vscode) will update the mutable extension file, which is imported when getting evaluated by nix. +{ pkgs ? import {} +, lib ? pkgs.lib +, writeShellScriptBin ? pkgs.writeShellScriptBin +, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace + +##User input + +, nixExtensions ? [] +# if file exists will use it and import the extensions in it into this dervation else will use empty extensions list +# this file will be created/updated by vscodeExts2nix when vscode exists +, mutableExtensionsFile ? ./extensions.nix +, vscodeExtsFolderName ? ".vscode-exts" +, vscode ? pkgs.vscode +}: +let + mutableExtensionsFilePath = builtins.toPath mutableExtensionsFile; + mutableExtensions = if builtins.pathExists mutableExtensionsFile + then import mutableExtensionsFilePath else []; + vscodeWithConfiguration = import ./vscodeWithConfiguration.nix { + inherit lib writeShellScriptBin vscode extensionsFromVscodeMarketplace + nixExtensions mutableExtensions vscodeExtsFolderName; + }; + + vscodeExts2nix = import ./vscodeExts2nix.nix { + inherit lib writeShellScriptBin; + extensionsToIgnore = nixExtensions; + extensions = mutableExtensions; + vscode = vscodeWithConfiguration; + }; + code = writeShellScriptBin "code" '' + ${vscodeWithConfiguration}/bin/code --wait "$@" + echo 'running vscodeExts2nix to update ${mutableExtensionsFilePath}...' + ${vscodeExts2nix}/bin/vscodeExts2nix > ${mutableExtensionsFilePath} + ''; +in +pkgs.buildEnv { + name = "vscodeEnv"; + paths = [ code vscodeExts2nix ]; +} diff --git a/pkgs/misc/vscode-extensions/vscodeExts2nix.nix b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix new file mode 100644 index 00000000000..12fe09a2425 --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix @@ -0,0 +1,44 @@ +# based on the passed vscode will stdout a nix expression with the installed vscode extensions +{ pkgs ? import {} +, lib ? pkgs.lib +, vscode ? pkgs.vscode +, writeShellScriptBin ? pkgs.writeShellScriptBin + +##User input + +, extensionsToIgnore ? [] +# will use those extensions to get sha256 if still exists when executed. +, extensions ? [] +}: +let + mktplcExtRefToFetchArgs = import ./mktplcExtRefToFetchArgs.nix; +in +writeShellScriptBin "vscodeExts2nix" '' + echo '[' + + for line in $(${vscode}/bin/code --list-extensions --show-versions \ + ${lib.optionalString (extensionsToIgnore != []) '' + | grep -v -i '^\(${lib.concatMapStringsSep "\\|" (e : ''${e.publisher}.${e.name}'') extensionsToIgnore}\)' + ''} + ) ; do + [[ $line =~ ([^.]*)\.([^@]*)@(.*) ]] + name=''${BASH_REMATCH[2]} + publisher=''${BASH_REMATCH[1]} + version=''${BASH_REMATCH[3]} + + extensions="${lib.concatMapStringsSep "." (e : ''${e.publisher}${e.name}@${e.sha256}'') extensions}" + reCurrentExt=$publisher$name"@([^.]*)" + if [[ $extensions =~ $reCurrentExt ]]; then + sha256=''${BASH_REMATCH[1]} + else + sha256=$( + nix-prefetch-url "${(mktplcExtRefToFetchArgs {publisher = ''"$publisher"''; name = ''"$name"''; version = ''"$version"'';}).url}" 2> /dev/null + ) + fi + + echo "{ name = \"''${name}\"; publisher = \"''${publisher}\"; version = \"''${version}\"; sha256 = \"''${sha256}\"; }" + done + + + echo ']' +'' diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix new file mode 100644 index 00000000000..11282865c7c --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -0,0 +1,39 @@ +# wrapper over vscode to control extensions per project (extensions folder will be created in execution path) +{ pkgs ? import {} +, lib ? pkgs.lib +, writeShellScriptBin ? pkgs.writeShellScriptBin +, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace + +##User input + +, vscode ? pkgs.vscode +# extensions to be symlinked into the project's extensions folder +, nixExtensions ? [] +# extensions to be copied into the project's extensions folder +, mutableExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" +}: +let + nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions; + mutExtsDrvs = extensionsFromVscodeMarketplace mutableExtensions; + + #removed not defined extensions + rmExtensions = lib.optionalString (nixExtensions++mutableExtensions != []) '' + find ${vscodeExtsFolderName} -mindepth 1 -maxdepth 1 ${lib.concatMapStringsSep " " (e : ''! -iname ${e.publisher}.${e.name}'') (nixExtensions++mutableExtensions)} -exec sudo rm -rf {} \; + ''; + #copy mutable extension out of the nix store + cpExtensions = '' + ${lib.concatMapStringsSep "\n" (e : ''ln -sfn ${e}/share/vscode/extensions/* ${vscodeExtsFolderName}/'') nixExtsDrvs} + ${lib.concatMapStringsSep "\n" (e : '' + cp -a ${e}/share/vscode/extensions/${e.vscodeExtUniqueId} ${vscodeExtsFolderName}/${e.vscodeExtUniqueId}-${(lib.findSingle (ext: ''${ext.publisher}.${ext.name}'' == e.vscodeExtUniqueId) "" "m" mutableExtensions ).version} + '') mutExtsDrvs} + ''; +in + writeShellScriptBin "code" '' + if ! [[ "$@" =~ "--list-extension" ]]; then + mkdir -p ${vscodeExtsFolderName} + ${rmExtensions} + ${cpExtensions} + fi + ${vscode}/bin/code --extensions-dir ${vscodeExtsFolderName} "$@" + '' From e2c8033df4bbdfcb628690e5651e4dc368a7e5e5 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sat, 28 Dec 2019 16:40:13 -0500 Subject: [PATCH 06/16] vsode-utils: extracting attributes to limit input range --- pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix index 21bdd0f6d7b..a781250fc18 100644 --- a/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix +++ b/pkgs/misc/vscode-extensions/mktplcExtRefToFetchArgs.nix @@ -1,8 +1,8 @@ -ext: +{ publisher, name, version, sha256 ? "" }: { - url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; - sha256 = ext.sha256; + url = "https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publisher}/extension/${name}/${version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage"; + sha256 = sha256; # The `*.vsix` file is in the end a simple zip file. Change the extension # so that existing `unzip` hooks takes care of the unpacking. - name = "${ext.publisher}-${ext.name}.zip"; + name = "${publisher}-${name}.zip"; } From 6d31311eaa4181b7de82e8a28837c53346c48c86 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sat, 28 Dec 2019 16:43:41 -0500 Subject: [PATCH 07/16] vscode-utils/vscodeEnv: split to 2 functions vscodeWithConfiguration, vscodeExts2nix, vscodeEnv change usage of toPath with toString --- pkgs/misc/vscode-extensions/vscode-utils.nix | 25 ++++++------- pkgs/misc/vscode-extensions/vscodeEnv.nix | 35 +++++++++++-------- .../misc/vscode-extensions/vscodeExts2nix.nix | 14 ++++---- .../vscodeWithConfiguration.nix | 21 ++++++----- 4 files changed, 50 insertions(+), 45 deletions(-) diff --git a/pkgs/misc/vscode-extensions/vscode-utils.nix b/pkgs/misc/vscode-extensions/vscode-utils.nix index 448bc81c917..3e237825495 100644 --- a/pkgs/misc/vscode-extensions/vscode-utils.nix +++ b/pkgs/misc/vscode-extensions/vscode-utils.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, writeShellScriptBin, fetchurl, vscode, unzip }: +{ stdenv, lib, buildEnv, writeShellScriptBin, fetchurl, vscode, unzip }: let @@ -72,21 +72,22 @@ let extensionsFromVscodeMarketplace = mktplcExtRefList: builtins.map extensionFromVscodeMarketplace mktplcExtRefList; - vscodeWithConfiguration = (userParams : import ./vscodeWithConfiguration.nix { - inherit lib vscode extensionsFromVscodeMarketplace writeShellScriptBin; - } // userParams); + vscodeWithConfiguration = import ./vscodeWithConfiguration.nix { + inherit lib extensionsFromVscodeMarketplace writeShellScriptBin; + vscodeDefault = vscode; + }; - vscodeExts2nix = (userParams : import ./vscodeExts2nix.nix { - inherit lib vscode; - } // userParams); - - vscodeEnv = (userParams : import ./vscodeEnv.nix { - inherit lib writeShellScriptBin extensionsFromVscodeMarketplace vscode; - } // userParams ); + vscodeExts2nix = import ./vscodeExts2nix.nix { + inherit lib writeShellScriptBin; + vscodeDefault = vscode; + }; + vscodeEnv = import ./vscodeEnv.nix { + inherit lib buildEnv writeShellScriptBin extensionsFromVscodeMarketplace; + vscodeDefault = vscode; + }; in - { inherit fetchVsixFromVscodeMarketplace buildVscodeExtension buildVscodeMarketplaceExtension extensionFromVscodeMarketplace diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index 7c1bb255b85..395e5307bc1 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -1,32 +1,37 @@ #use vscodeWithConfiguration and vscodeExts2nix to create vscode exetuable that when exits(vscode) will update the mutable extension file, which is imported when getting evaluated by nix. -{ pkgs ? import {} -, lib ? pkgs.lib -, writeShellScriptBin ? pkgs.writeShellScriptBin -, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace - +{ lib +, buildEnv +, writeShellScriptBin +, extensionsFromVscodeMarketplace +, vscodeDefault +}: ##User input - -, nixExtensions ? [] +{ vscode ? vscodeDefault +, nixExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" # if file exists will use it and import the extensions in it into this dervation else will use empty extensions list # this file will be created/updated by vscodeExts2nix when vscode exists -, mutableExtensionsFile ? ./extensions.nix -, vscodeExtsFolderName ? ".vscode-exts" -, vscode ? pkgs.vscode +, mutableExtensionsFile }: let - mutableExtensionsFilePath = builtins.toPath mutableExtensionsFile; + mutableExtensionsFilePath = toString mutableExtensionsFile; mutableExtensions = if builtins.pathExists mutableExtensionsFile then import mutableExtensionsFilePath else []; vscodeWithConfiguration = import ./vscodeWithConfiguration.nix { - inherit lib writeShellScriptBin vscode extensionsFromVscodeMarketplace - nixExtensions mutableExtensions vscodeExtsFolderName; + inherit lib writeShellScriptBin extensionsFromVscodeMarketplace; + vscodeDefault = vscode; + } + { + inherit nixExtensions mutableExtensions vscodeExtsFolderName; }; vscodeExts2nix = import ./vscodeExts2nix.nix { inherit lib writeShellScriptBin; + vscodeDefault = vscodeWithConfiguration; + } + { extensionsToIgnore = nixExtensions; extensions = mutableExtensions; - vscode = vscodeWithConfiguration; }; code = writeShellScriptBin "code" '' ${vscodeWithConfiguration}/bin/code --wait "$@" @@ -34,7 +39,7 @@ let ${vscodeExts2nix}/bin/vscodeExts2nix > ${mutableExtensionsFilePath} ''; in -pkgs.buildEnv { +buildEnv { name = "vscodeEnv"; paths = [ code vscodeExts2nix ]; } diff --git a/pkgs/misc/vscode-extensions/vscodeExts2nix.nix b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix index 12fe09a2425..afd176b4c5e 100644 --- a/pkgs/misc/vscode-extensions/vscodeExts2nix.nix +++ b/pkgs/misc/vscode-extensions/vscodeExts2nix.nix @@ -1,14 +1,14 @@ # based on the passed vscode will stdout a nix expression with the installed vscode extensions -{ pkgs ? import {} -, lib ? pkgs.lib -, vscode ? pkgs.vscode -, writeShellScriptBin ? pkgs.writeShellScriptBin +{ lib +, vscodeDefault +, writeShellScriptBin +}: ##User input - -, extensionsToIgnore ? [] +{ vscode ? vscodeDefault +, extensionsToIgnore ? [] # will use those extensions to get sha256 if still exists when executed. -, extensions ? [] +, extensions ? [] }: let mktplcExtRefToFetchArgs = import ./mktplcExtRefToFetchArgs.nix; diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix index 11282865c7c..0ad32392192 100644 --- a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -1,17 +1,16 @@ # wrapper over vscode to control extensions per project (extensions folder will be created in execution path) -{ pkgs ? import {} -, lib ? pkgs.lib -, writeShellScriptBin ? pkgs.writeShellScriptBin -, extensionsFromVscodeMarketplace ? pkgs.vscode-utils.extensionsFromVscodeMarketplace - -##User input - -, vscode ? pkgs.vscode +{ lib +, writeShellScriptBin +, extensionsFromVscodeMarketplace +, vscodeDefault +}: +## User input +{ vscode ? vscodeDefault # extensions to be symlinked into the project's extensions folder -, nixExtensions ? [] +, nixExtensions ? [] # extensions to be copied into the project's extensions folder -, mutableExtensions ? [] -, vscodeExtsFolderName ? ".vscode-exts" +, mutableExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" }: let nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions; From 3d102d1c906b8fe5be8de3f3e606b182e243c37c Mon Sep 17 00:00:00 2001 From: oren Date: Fri, 10 Jan 2020 21:45:56 -0500 Subject: [PATCH 08/16] vscode-utils/vscodeEnv: fix typo and grammer in the description comment --- pkgs/misc/vscode-extensions/vscodeEnv.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index 395e5307bc1..b2f717ccc3e 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -1,4 +1,4 @@ -#use vscodeWithConfiguration and vscodeExts2nix to create vscode exetuable that when exits(vscode) will update the mutable extension file, which is imported when getting evaluated by nix. +#Use vscodeWithConfiguration and vscodeExts2nix to create a vscode executable. When the executable exits, it updates the mutable extension file, which is imported when evaluated by Nix later. { lib , buildEnv , writeShellScriptBin From a535e7a04ff11615f43a222ad496c6ffd39d176c Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Wed, 29 Jan 2020 23:21:53 -0500 Subject: [PATCH 09/16] add updateSettings drv which will union nix settings configurations into the a vscode settings file --- .../misc/vscode-extensions/updateSettings.nix | 33 +++++++++++++++++++ .../vscode-extensions/updateSettingsTest.nix | 6 ++++ 2 files changed, 39 insertions(+) create mode 100644 pkgs/misc/vscode-extensions/updateSettings.nix create mode 100644 pkgs/misc/vscode-extensions/updateSettingsTest.nix diff --git a/pkgs/misc/vscode-extensions/updateSettings.nix b/pkgs/misc/vscode-extensions/updateSettings.nix new file mode 100644 index 00000000000..e3b09582ffe --- /dev/null +++ b/pkgs/misc/vscode-extensions/updateSettings.nix @@ -0,0 +1,33 @@ +# Updates the vscode setting file base on a nix expression +# should run from the workspace root. +{ writeShellScriptBin +, lib +, jq +}: +##User Input +{ settings ? {} +# if marked as true will create an empty json file if does not exists +, createIfDoesNotExists ? true +, vscodeSettingsFile ? .vscode/settings.json +}: +let + #VSCode Settings file + vscodeSettingsFileStr = toString vscodeSettingsFile; + + updateVSCodeSettingsCmd = '' + ( + echo 'updateSettings.nix: Updating ${vscodeSettingsFileStr}...' + oldSettings=$(cat ${vscodeSettingsFileStr}) + echo $oldSettings' ${builtins.toJSON settings}' | ${jq}/bin/jq -s add > ${vscodeSettingsFileStr} + )''; + + createEmptySettingsCmd = ''mkdir -p .vscode && echo "{}" > ${vscodeSettingsFileStr}''; +in + writeShellScriptBin ''vscodeNixUpdate-${lib.removeSuffix ".json" (builtins.baseNameOf vscodeSettingsFileStr)}'' + (lib.optionalString (settings != {}) + (if createIfDoesNotExists then '' + [ ! -f "${vscodeSettingsFileStr}" ] && ${createEmptySettingsCmd} + ${updateVSCodeSettingsCmd} + '' + else ''[ -f "${vscodeSettingsFileStr}" ] && ${updateVSCodeSettingsCmd}'' + )) diff --git a/pkgs/misc/vscode-extensions/updateSettingsTest.nix b/pkgs/misc/vscode-extensions/updateSettingsTest.nix new file mode 100644 index 00000000000..097b9cad166 --- /dev/null +++ b/pkgs/misc/vscode-extensions/updateSettingsTest.nix @@ -0,0 +1,6 @@ +with import {}; +callPackage (import ./updateSettings.nix) {} { + settings = { + a = "fdsdf"; + }; +} From 0e4ac8bf834ca04b43481e3bbd34c4c8f4edc687 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Wed, 29 Jan 2020 23:28:44 -0500 Subject: [PATCH 10/16] use updateSettings in vscodeEnv in order to create and/or update settings.json, keybindings.json --- pkgs/misc/vscode-extensions/vscodeEnv.nix | 30 ++++++++++++++++--- pkgs/misc/vscode-extensions/vscodeEnvTest.nix | 12 ++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 pkgs/misc/vscode-extensions/vscodeEnvTest.nix diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index b2f717ccc3e..2370f6d4da4 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -4,11 +4,18 @@ , writeShellScriptBin , extensionsFromVscodeMarketplace , vscodeDefault +, jq }: ##User input -{ vscode ? vscodeDefault -, nixExtensions ? [] -, vscodeExtsFolderName ? ".vscode-exts" +{ vscode ? vscodeDefault +, nixExtensions ? [] +, vscodeExtsFolderName ? ".vscode-exts" +# will add to the command updateSettings (which will run on executing vscode) settings to override in settings.json file +, settings ? {} +, createSettingsIfDoesNotExists ? true +# will add to the command updateKeybindings(which will run on executing vscode) keybindings to override in keybinding.json file +, keybindings ? {} +, createKeybindingsIfDoesNotExists ? true # if file exists will use it and import the extensions in it into this dervation else will use empty extensions list # this file will be created/updated by vscodeExts2nix when vscode exists , mutableExtensionsFile @@ -25,6 +32,19 @@ let inherit nixExtensions mutableExtensions vscodeExtsFolderName; }; + updateSettings = import ./updateSettings.nix { inherit lib writeShellScriptBin jq; }; + + updateSettingsCmd = updateSettings { + inherit settings; + createIfDoesNotExists = createSettingsIfDoesNotExists; + }; + + updateKeybindingsCmd = updateSettings { + settings = keybindings; + createIfDoesNotExists = createKeybindingsIfDoesNotExists; + vscodeSettingsFile = .vscode/keybindings.json; + }; + vscodeExts2nix = import ./vscodeExts2nix.nix { inherit lib writeShellScriptBin; vscodeDefault = vscodeWithConfiguration; @@ -34,6 +54,8 @@ let extensions = mutableExtensions; }; code = writeShellScriptBin "code" '' + ${updateSettingsCmd}/bin/vscodeNixUpdate-settings + ${updateKeybindingsCmd}/bin/vscodeNixUpdate-keybindings ${vscodeWithConfiguration}/bin/code --wait "$@" echo 'running vscodeExts2nix to update ${mutableExtensionsFilePath}...' ${vscodeExts2nix}/bin/vscodeExts2nix > ${mutableExtensionsFilePath} @@ -41,5 +63,5 @@ let in buildEnv { name = "vscodeEnv"; - paths = [ code vscodeExts2nix ]; + paths = [ code vscodeExts2nix updateSettingsCmd updateKeybindingsCmd ]; } diff --git a/pkgs/misc/vscode-extensions/vscodeEnvTest.nix b/pkgs/misc/vscode-extensions/vscodeEnvTest.nix new file mode 100644 index 00000000000..d7e586cab6e --- /dev/null +++ b/pkgs/misc/vscode-extensions/vscodeEnvTest.nix @@ -0,0 +1,12 @@ +with import {}; +callPackage (import ./vscodeEnv.nix) { + extensionsFromVscodeMarketplace = vscode-utils.extensionsFromVscodeMarketplace; + vscodeDefault = vscode; +} { + mutableExtensionsFile = ./extensions.nix; + settings = { + a = "fdsdf"; + t = "test"; + }; +} + From 02105da596429b365419f61f1647d711065982eb Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sat, 1 Feb 2020 22:26:35 -0500 Subject: [PATCH 11/16] add missing jq to vscodeEnv --- pkgs/misc/vscode-extensions/vscode-utils.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/misc/vscode-extensions/vscode-utils.nix b/pkgs/misc/vscode-extensions/vscode-utils.nix index 3e237825495..5c49b226ebc 100644 --- a/pkgs/misc/vscode-extensions/vscode-utils.nix +++ b/pkgs/misc/vscode-extensions/vscode-utils.nix @@ -1,4 +1,4 @@ -{ stdenv, lib, buildEnv, writeShellScriptBin, fetchurl, vscode, unzip }: +{ stdenv, lib, buildEnv, writeShellScriptBin, fetchurl, vscode, unzip, jq }: let @@ -84,7 +84,7 @@ let }; vscodeEnv = import ./vscodeEnv.nix { - inherit lib buildEnv writeShellScriptBin extensionsFromVscodeMarketplace; + inherit lib buildEnv writeShellScriptBin extensionsFromVscodeMarketplace jq; vscodeDefault = vscode; }; in From 7e929f54378e68374a6962773fbbd3fc3c8d6e33 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sun, 2 Feb 2020 16:25:57 -0500 Subject: [PATCH 12/16] change vscodeSettingsFile parameter type from path to string --- .../misc/vscode-extensions/updateSettings.nix | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pkgs/misc/vscode-extensions/updateSettings.nix b/pkgs/misc/vscode-extensions/updateSettings.nix index e3b09582ffe..7f4a817e5e8 100644 --- a/pkgs/misc/vscode-extensions/updateSettings.nix +++ b/pkgs/misc/vscode-extensions/updateSettings.nix @@ -8,26 +8,25 @@ { settings ? {} # if marked as true will create an empty json file if does not exists , createIfDoesNotExists ? true -, vscodeSettingsFile ? .vscode/settings.json +, vscodeSettingsFile ? ".vscode/settings.json" }: let - #VSCode Settings file - vscodeSettingsFileStr = toString vscodeSettingsFile; updateVSCodeSettingsCmd = '' ( - echo 'updateSettings.nix: Updating ${vscodeSettingsFileStr}...' - oldSettings=$(cat ${vscodeSettingsFileStr}) - echo $oldSettings' ${builtins.toJSON settings}' | ${jq}/bin/jq -s add > ${vscodeSettingsFileStr} + echo 'updateSettings.nix: Updating ${vscodeSettingsFile}...' + oldSettings=$(cat ${vscodeSettingsFile}) + echo $oldSettings' ${builtins.toJSON settings}' | ${jq}/bin/jq -s add > ${vscodeSettingsFile} )''; - createEmptySettingsCmd = ''mkdir -p .vscode && echo "{}" > ${vscodeSettingsFileStr}''; + createEmptySettingsCmd = ''mkdir -p .vscode && echo "{}" > ${vscodeSettingsFile}''; in - writeShellScriptBin ''vscodeNixUpdate-${lib.removeSuffix ".json" (builtins.baseNameOf vscodeSettingsFileStr)}'' + + writeShellScriptBin ''vscodeNixUpdate-${lib.removeSuffix ".json" (builtins.baseNameOf vscodeSettingsFile)}'' (lib.optionalString (settings != {}) (if createIfDoesNotExists then '' - [ ! -f "${vscodeSettingsFileStr}" ] && ${createEmptySettingsCmd} + [ ! -f "${vscodeSettingsFile}" ] && ${createEmptySettingsCmd} ${updateVSCodeSettingsCmd} '' - else ''[ -f "${vscodeSettingsFileStr}" ] && ${updateVSCodeSettingsCmd}'' + else ''[ -f "${vscodeSettingsFile}" ] && ${updateVSCodeSettingsCmd}'' )) From 88b972168e3ff77ed9ad64fb5550a824521a306e Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Sun, 2 Feb 2020 22:35:02 -0500 Subject: [PATCH 13/16] vscodeEnv updateSettings for keybindings change keybindings file name parameter type from path to string --- pkgs/misc/vscode-extensions/vscodeEnv.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index 2370f6d4da4..42a46674b27 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -42,7 +42,7 @@ let updateKeybindingsCmd = updateSettings { settings = keybindings; createIfDoesNotExists = createKeybindingsIfDoesNotExists; - vscodeSettingsFile = .vscode/keybindings.json; + vscodeSettingsFile = ".vscode/keybindings.json"; }; vscodeExts2nix = import ./vscodeExts2nix.nix { From 3816b9d036be6cb6c56b402901cb394a90ebf534 Mon Sep 17 00:00:00 2001 From: Oren Rozen Date: Thu, 20 Feb 2020 09:52:06 -0500 Subject: [PATCH 14/16] fix permission problem of mutableExtensions --- .../vscode-extensions/vscodeWithConfiguration.nix | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix index 0ad32392192..b081157e653 100644 --- a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -15,6 +15,12 @@ let nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions; mutExtsDrvs = extensionsFromVscodeMarketplace mutableExtensions; + mutableExtsPaths = lib.forEach mutExtsDrvs ( e: + { + origin = ''${e}/share/vscode/extensions/${e.vscodeExtUniqueId}''; + target = ''${vscodeExtsFolderName}/${e.vscodeExtUniqueId}-${(lib.findSingle (ext: ''${ext.publisher}.${ext.name}'' == e.vscodeExtUniqueId) "" "m" mutableExtensions ).version}''; + } + ); #removed not defined extensions rmExtensions = lib.optionalString (nixExtensions++mutableExtensions != []) '' @@ -23,9 +29,12 @@ let #copy mutable extension out of the nix store cpExtensions = '' ${lib.concatMapStringsSep "\n" (e : ''ln -sfn ${e}/share/vscode/extensions/* ${vscodeExtsFolderName}/'') nixExtsDrvs} - ${lib.concatMapStringsSep "\n" (e : '' - cp -a ${e}/share/vscode/extensions/${e.vscodeExtUniqueId} ${vscodeExtsFolderName}/${e.vscodeExtUniqueId}-${(lib.findSingle (ext: ''${ext.publisher}.${ext.name}'' == e.vscodeExtUniqueId) "" "m" mutableExtensions ).version} - '') mutExtsDrvs} + ${lib.concatMapStringsSep "\n" (ePath : '' + if [ ! -d ${ePath.target} ]; then + cp -a ${ePath.origin} ${ePath.target} + chmod -R u+rwx ${ePath.target} + fi + '') mutableExtsPaths} ''; in writeShellScriptBin "code" '' From 673b122836136e58842b316bcb49158c8322132a Mon Sep 17 00:00:00 2001 From: Moises Nessim Date: Fri, 22 May 2020 15:23:01 -0500 Subject: [PATCH 15/16] Use a different vscode user-data-dir for every project. Treat workspace setting files as global for that user-data-dir with symlink. Add updateLaunchCmd to update .vscode/launch.json. --- .../misc/vscode-extensions/updateSettings.nix | 21 ++++++++++------ pkgs/misc/vscode-extensions/vscode-utils.nix | 8 ++++-- pkgs/misc/vscode-extensions/vscodeEnv.nix | 25 ++++++++++++++++--- .../vscodeWithConfiguration.nix | 7 ++++-- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/pkgs/misc/vscode-extensions/updateSettings.nix b/pkgs/misc/vscode-extensions/updateSettings.nix index 7f4a817e5e8..a033229c589 100644 --- a/pkgs/misc/vscode-extensions/updateSettings.nix +++ b/pkgs/misc/vscode-extensions/updateSettings.nix @@ -9,6 +9,8 @@ # if marked as true will create an empty json file if does not exists , createIfDoesNotExists ? true , vscodeSettingsFile ? ".vscode/settings.json" +, userSettingsFolder ? "" +, symlinkFromUserSetting ? false }: let @@ -20,13 +22,18 @@ let )''; createEmptySettingsCmd = ''mkdir -p .vscode && echo "{}" > ${vscodeSettingsFile}''; + fileName = builtins.baseNameOf vscodeSettingsFile; + symlinkFromUserSettingCmd = lib.optionalString symlinkFromUserSetting + '' && mkdir -p "${userSettingsFolder}" && ln -sfv "$(pwd)/${vscodeSettingsFile}" "${userSettingsFolder}/" ''; in - writeShellScriptBin ''vscodeNixUpdate-${lib.removeSuffix ".json" (builtins.baseNameOf vscodeSettingsFile)}'' + writeShellScriptBin ''vscodeNixUpdate-${lib.removeSuffix ".json" (fileName)}'' (lib.optionalString (settings != {}) - (if createIfDoesNotExists then '' - [ ! -f "${vscodeSettingsFile}" ] && ${createEmptySettingsCmd} - ${updateVSCodeSettingsCmd} - '' - else ''[ -f "${vscodeSettingsFile}" ] && ${updateVSCodeSettingsCmd}'' - )) + (if createIfDoesNotExists then '' + [ ! -f "${vscodeSettingsFile}" ] && ${createEmptySettingsCmd} + ${updateVSCodeSettingsCmd} ${symlinkFromUserSettingCmd} + '' + else ''[ -f "${vscodeSettingsFile}" ] && ${updateVSCodeSettingsCmd} ${symlinkFromUserSettingCmd} + '' + ) + ) diff --git a/pkgs/misc/vscode-extensions/vscode-utils.nix b/pkgs/misc/vscode-extensions/vscode-utils.nix index 5c49b226ebc..a5382c1c231 100644 --- a/pkgs/misc/vscode-extensions/vscode-utils.nix +++ b/pkgs/misc/vscode-extensions/vscode-utils.nix @@ -1,9 +1,13 @@ { stdenv, lib, buildEnv, writeShellScriptBin, fetchurl, vscode, unzip, jq }: let + extendedPkgVersion = lib.getVersion vscode; + extendedPkgName = lib.removeSuffix "-${extendedPkgVersion}" vscode.name; + buildVscodeExtension = a@{ name, + namePrefix ? "${extendedPkgName}-extension-", src, # Same as "Unique Identifier" on the extension's web page. # For the moment, only serve as unique extension dir. @@ -17,12 +21,12 @@ let }: stdenv.mkDerivation ((removeAttrs a [ "vscodeExtUniqueId" ]) // { - name = "vscode-extension-${name}"; + name = namePrefix + name; inherit vscodeExtUniqueId; inherit configurePhase buildPhase dontPatchELF dontStrip; - installPrefix = "${vscodeExtUniqueId}"; + installPrefix = "share/${extendedPkgName}/extensions/${vscodeExtUniqueId}"; buildInputs = [ unzip ] ++ buildInputs; diff --git a/pkgs/misc/vscode-extensions/vscodeEnv.nix b/pkgs/misc/vscode-extensions/vscodeEnv.nix index 42a46674b27..6e4bb7b3ea8 100644 --- a/pkgs/misc/vscode-extensions/vscodeEnv.nix +++ b/pkgs/misc/vscode-extensions/vscodeEnv.nix @@ -13,9 +13,12 @@ # will add to the command updateSettings (which will run on executing vscode) settings to override in settings.json file , settings ? {} , createSettingsIfDoesNotExists ? true +, launch ? {} +, createLaunchIfDoesNotExists ? true # will add to the command updateKeybindings(which will run on executing vscode) keybindings to override in keybinding.json file , keybindings ? {} , createKeybindingsIfDoesNotExists ? true +, user-data-dir ? ''"''${TMP}''${name}"/vscode-data-dir'' # if file exists will use it and import the extensions in it into this dervation else will use empty extensions list # this file will be created/updated by vscodeExts2nix when vscode exists , mutableExtensionsFile @@ -29,20 +32,35 @@ let vscodeDefault = vscode; } { - inherit nixExtensions mutableExtensions vscodeExtsFolderName; + inherit nixExtensions mutableExtensions vscodeExtsFolderName user-data-dir; }; updateSettings = import ./updateSettings.nix { inherit lib writeShellScriptBin jq; }; + userSettingsFolder = "${ user-data-dir }/User"; updateSettingsCmd = updateSettings { - inherit settings; + settings = { + "extensions.autoCheckUpdates" = false; + "extensions.autoUpdate" = false; + "update.mode" = "none"; + } // settings; + inherit userSettingsFolder; createIfDoesNotExists = createSettingsIfDoesNotExists; + symlinkFromUserSetting = (user-data-dir != ""); + }; + + updateLaunchCmd = updateSettings { + settings = launch; + createIfDoesNotExists = createLaunchIfDoesNotExists; + vscodeSettingsFile = ".vscode/launch.json"; }; updateKeybindingsCmd = updateSettings { settings = keybindings; createIfDoesNotExists = createKeybindingsIfDoesNotExists; vscodeSettingsFile = ".vscode/keybindings.json"; + inherit userSettingsFolder; + symlinkFromUserSetting = (user-data-dir != ""); }; vscodeExts2nix = import ./vscodeExts2nix.nix { @@ -55,6 +73,7 @@ let }; code = writeShellScriptBin "code" '' ${updateSettingsCmd}/bin/vscodeNixUpdate-settings + ${updateLaunchCmd}/bin/vscodeNixUpdate-launch ${updateKeybindingsCmd}/bin/vscodeNixUpdate-keybindings ${vscodeWithConfiguration}/bin/code --wait "$@" echo 'running vscodeExts2nix to update ${mutableExtensionsFilePath}...' @@ -63,5 +82,5 @@ let in buildEnv { name = "vscodeEnv"; - paths = [ code vscodeExts2nix updateSettingsCmd updateKeybindingsCmd ]; + paths = [ code vscodeExts2nix updateSettingsCmd updateLaunchCmd updateKeybindingsCmd ]; } diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix index b081157e653..83cf84586b8 100644 --- a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -11,6 +11,7 @@ # extensions to be copied into the project's extensions folder , mutableExtensions ? [] , vscodeExtsFolderName ? ".vscode-exts" +, user-data-dir ? ''"''${TMP}vscodeWithConfiguration/vscode-data-dir"'' }: let nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions; @@ -39,9 +40,11 @@ let in writeShellScriptBin "code" '' if ! [[ "$@" =~ "--list-extension" ]]; then - mkdir -p ${vscodeExtsFolderName} + mkdir -p "${vscodeExtsFolderName}" ${rmExtensions} ${cpExtensions} fi - ${vscode}/bin/code --extensions-dir ${vscodeExtsFolderName} "$@" + ${vscode}/bin/code --extensions-dir "${vscodeExtsFolderName}" ${ + lib.optionalString (user-data-dir != "") ''--user-data-dir ${user-data-dir }'' + } "$@" '' From 97df56158e8f788e118d1102814c625bc143f92f Mon Sep 17 00:00:00 2001 From: Moises Nessim Date: Tue, 26 May 2020 13:14:35 -0500 Subject: [PATCH 16/16] vscode-extensions: Find mutable extensions by version in order not to delete them Do not use sudo. --- pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix index 0ad32392192..db710ac85d0 100644 --- a/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix +++ b/pkgs/misc/vscode-extensions/vscodeWithConfiguration.nix @@ -18,7 +18,11 @@ let #removed not defined extensions rmExtensions = lib.optionalString (nixExtensions++mutableExtensions != []) '' - find ${vscodeExtsFolderName} -mindepth 1 -maxdepth 1 ${lib.concatMapStringsSep " " (e : ''! -iname ${e.publisher}.${e.name}'') (nixExtensions++mutableExtensions)} -exec sudo rm -rf {} \; + find ${vscodeExtsFolderName} -mindepth 1 -maxdepth 1 ${ + lib.concatMapStringsSep " " (e : ''! -iname ${e.publisher}.${e.name} '') nixExtensions + + + lib.concatMapStringsSep " " (e : ''! -iname ${e.publisher}.${e.name}-${e.version} '') mutableExtensions + } -exec rm -rf {} \; ''; #copy mutable extension out of the nix store cpExtensions = ''