diff options
author | Silvan Mosberger <infinisil@icloud.com> | 2018-08-07 03:22:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-07 03:22:56 +0200 |
commit | 308d7809d36abd8d61c3d61ed260c3df771979f2 (patch) | |
tree | edc5161fdae0834b42385bca1699ead9540e0a35 | |
parent | 893b080e5628af07199b2510ead18c0cf17cbb5a (diff) | |
parent | 9321785bab486cf5ad8635a964674b6485f6626e (diff) |
Merge pull request #44292 from mankyKitty/vscode-exts-update-script
vscode-extensions: Script to generate Nix for "latest" version of all installed vscode extensions
-rwxr-xr-x | pkgs/misc/vscode-extensions/update_installed_exts.sh | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/pkgs/misc/vscode-extensions/update_installed_exts.sh b/pkgs/misc/vscode-extensions/update_installed_exts.sh new file mode 100755 index 0000000000000..fdbc14fb2642c --- /dev/null +++ b/pkgs/misc/vscode-extensions/update_installed_exts.sh @@ -0,0 +1,74 @@ +#! /usr/bin/env nix-shell +#! nix-shell -i bash -p curl jq unzip +set -eu -o pipefail + +# Helper to just fail with a message and non-zero exit code. +function fail() { + echo "$1" >&2 + exit 1 +} + +# Helper to clean up after ourself if we're killed by SIGINT +function clean_up() { + TDIR="${TMPDIR:-/tmp}" + echo "Script killed, cleaning up tmpdirs: $TDIR/vscode_exts_*" >&2 + rm -Rf "$TDIR/vscode_exts_*" +} + +function get_vsixpkg() { + N="$1.$2" + + # Create a tempdir for the extension download + EXTTMP=$(mktemp -d -t vscode_exts_XXXXXXXX) + + URL="https://$1.gallery.vsassets.io/_apis/public/gallery/publisher/$1/extension/$2/latest/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage" + + # Quietly but delicately curl down the file, blowing up at the first sign of trouble. + curl --silent --show-error --fail -X GET -o "$EXTTMP/$N.zip" "$URL" + # Unpack the file we need to stdout then pull out the version + VER=$(jq -r '.version' <(unzip -qc "$EXTTMP/$N.zip" "extension/package.json")) + # Calculate the SHA + SHA=$(nix-hash --flat --base32 --type sha256 "$EXTTMP/$N.zip") + + # Clean up. + rm -Rf "$EXTTMP" + # I don't like 'rm -Rf' lurking in my scripts but this seems appropriate + + cat <<-EOF + { + name = "$2"; + publisher = "$1"; + version = "$VER"; + sha256 = "$SHA"; + } +EOF +} + +# See if can find our code binary somewhere. +if [ $# -ne 0 ]; then + CODE=$1 +else + CODE=$(command -v code) +fi + +if [ -z "$CODE" ]; then + # Not much point continuing. + fail "VSCode executable not found" +fi + +# Try to be a good citizen and clean up after ourselves if we're killed. +trap clean_up SIGINT + +# Begin the printing of the nix expression that will house the list of extensions. +printf '{ extensions = [\n' + +# Note that we are only looking to update extensions that are already installed. +for i in $($CODE --list-extensions) +do + OWNER=$(echo "$i" | cut -d. -f1) + EXT=$(echo "$i" | cut -d. -f2) + + get_vsixpkg "$OWNER" "$EXT" +done +# Close off the nix expression. +printf '];\n}' |