Last active
June 14, 2020 09:02
-
-
Save phryneas/9f2a4f7f10907f02bc36d44c9254ce50 to your computer and use it in GitHub Desktop.
vscode-liveshare-home-manager-nixos
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{pkgs, lib, config, ...}: | |
with lib; | |
let | |
liveshareGist = builtins.fetchTarball { | |
url = "https://gist.github.com/phryneas/698996d24748d3ce7f61ef818949a28e/archive/3dbf12cd282ebcb6cacf40d466e4a519d4ce1dfe.tar.gz"; | |
sha256 = "0mas9rnr6hn7yiivjs5xvnprhrqwac47nqfxh3vgmm67v982v83l"; | |
}; | |
livesharePkg = pkgs.callPackage liveshareGist {}; | |
cfg = config.services.vsliveshare; | |
pkg = livesharePkg.override { enableDiagnosticsWorkaround = cfg.enableDiagnosticsWorkaround; }; | |
writableWorkaroundScript = pkgs.writeScript "vsliveshare-writable-workaround.sh" '' | |
#!${pkgs.bash}/bin/bash | |
out=${pkg} | |
src=$out/share/vscode/extensions/ms-vsliveshare.vsliveshare | |
# We do not want to pass any invalid path to `rm`. | |
if [[ ! -d "${cfg.extensionsDir}" ]]; then | |
echo "The VS Code extensions directory '${cfg.extensionsDir}' does not exist" >&2 | |
exit 1 | |
fi | |
dst="${cfg.extensionsDir}"/ms-vsliveshare.vsliveshare-$(basename $out | sed 's/.*vsliveshare-//') | |
# Only run the script when the build has actually changed. | |
if [[ $(dirname "$(dirname "$(readlink "''${dst}/dotnet_modules/vsls-agent-wrapped")")") == $src ]]; then | |
exit 0 | |
fi | |
# Remove all previous versions of VS Code Live Share. | |
rm -r "${cfg.extensionsDir}"/ms-vsliveshare.vsliveshare* | |
# Create the extension directory. | |
mkdir -p "$dst" | |
# Symlink files which should remain unchanged. | |
find $src -type f \( -name \*.a -o -name \*.dll -o -name \*.pdb \) | while read -r src_file; do | |
dst_file="''${dst}''${src_file#''${src}}" | |
mkdir -p $(dirname "$dst_file") | |
ln -s "$src_file" "$dst_file" | |
done | |
# Symlink ELF executables and copy over executable files. | |
find $src -type f -executable | while read -r src_file; do | |
dst_file="''${dst}''${src_file#''${src}}" | |
mkdir -p $(dirname "$dst_file") | |
if file "$src_file" | grep -wq ELF; then | |
ln -s "$src_file" "$dst_file" | |
else | |
cp --no-preserve=mode,ownership,timestamps "$src_file" "$dst_file" | |
chmod +x "$dst_file" | |
fi | |
done | |
# Copy over the remaining files and directories. | |
# FIXME: Use a different command that does not warn about files being the same. | |
cp -r --no-clobber --no-preserve=mode,ownership,timestamps "$src/." "$dst" 2> >(grep -Ev "^cp: '.*' and '.*' are the same file$") | |
exit 0 | |
''; | |
in { | |
options.services.vsliveshare = with types; { | |
enable = mkEnableOption "VS Code Live Share extension"; | |
enableWritableWorkaround = mkEnableOption "copying the build to the VS Code extension directory to ensure write access"; | |
enableDiagnosticsWorkaround = mkEnableOption "an UNIX socket that filters out the diagnostic logging done by VSLS Agent"; | |
extensionsDir = mkOption { | |
type = str; | |
default = "$HOME/.vscode/extensions"; | |
description = '' | |
The VS Code extensions directory. | |
CAUTION: The workaround will remove ms-vsliveshare.vsliveshare* inside this directory! | |
''; | |
}; | |
}; | |
config = mkIf cfg.enable { | |
home.packages = with pkgs; [ bash desktop-file-utils xlibs.xprop ] | |
++ optional (!cfg.enableWritableWorkaround) pkg; | |
services.gnome-keyring.enable = true; | |
systemd.user.services.vsliveshare-writable-workaround = /*mkIf cfg.enableWritableWorkaround*/ { | |
Unit = { | |
Description = "VS Code Live Share extension writable workaround"; | |
PartOf = [ "graphical-session-pre.target" ]; | |
}; | |
Service = { | |
Environment = makeBinPath (with pkgs; [ file ]); | |
ExecStart = writableWorkaroundScript; | |
}; | |
Install = { | |
WantedBy = [ "graphical-session-pre.target" ]; | |
}; | |
}; | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment