summary refs log tree commit diff
path: root/pkgs
diff options
context:
space:
mode:
authorSilvan Mosberger <infinisil@icloud.com>2018-08-07 03:22:56 +0200
committerGitHub <noreply@github.com>2018-08-07 03:22:56 +0200
commit308d7809d36abd8d61c3d61ed260c3df771979f2 (patch)
treeedc5161fdae0834b42385bca1699ead9540e0a35 /pkgs
parent893b080e5628af07199b2510ead18c0cf17cbb5a (diff)
parent9321785bab486cf5ad8635a964674b6485f6626e (diff)
downloadnixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.tar
nixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.tar.gz
nixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.tar.bz2
nixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.tar.lz
nixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.tar.xz
nixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.tar.zst
nixlib-308d7809d36abd8d61c3d61ed260c3df771979f2.zip
Merge pull request #44292 from mankyKitty/vscode-exts-update-script
vscode-extensions: Script to generate Nix for "latest" version of all installed vscode extensions
Diffstat (limited to 'pkgs')
-rwxr-xr-xpkgs/misc/vscode-extensions/update_installed_exts.sh74
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 000000000000..fdbc14fb2642
--- /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}'