swvscode-porter.py: init
This commit is contained in:
144
swvscode-porter.py
Normal file
144
swvscode-porter.py
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
import subprocess
|
||||||
|
import urllib.request
|
||||||
|
from functools import partial
|
||||||
|
from pathlib import Path
|
||||||
|
from tarfile import TarFile
|
||||||
|
|
||||||
|
NODE_MODULES = "node_modules"
|
||||||
|
|
||||||
|
|
||||||
|
def replace(target_path, link_target):
|
||||||
|
# Ensure the parent directory of target_path exists
|
||||||
|
target_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
if target_path.is_symlink():
|
||||||
|
if target_path.resolve() == link_target.resolve():
|
||||||
|
print(f"Symlink already correct: {target_path} -> {link_target}")
|
||||||
|
else:
|
||||||
|
print(f"Symlink points to the wrong target. Updating: {target_path}")
|
||||||
|
target_path.unlink()
|
||||||
|
os.symlink(link_target, target_path)
|
||||||
|
elif target_path.exists():
|
||||||
|
print(
|
||||||
|
f"Path exists but is not a symlink. Removing and replacing: {target_path}"
|
||||||
|
)
|
||||||
|
if target_path.is_dir():
|
||||||
|
shutil.rmtree(target_path)
|
||||||
|
else:
|
||||||
|
target_path.unlink()
|
||||||
|
os.symlink(link_target, target_path)
|
||||||
|
else:
|
||||||
|
print(f"Creating new symlink: {target_path} -> {link_target}")
|
||||||
|
os.symlink(link_target, target_path)
|
||||||
|
|
||||||
|
def replace_node_modules(vscode_path, native_path, name):
|
||||||
|
replace(target_path=vscode_path / NODE_MODULES / name, link_target=native_path / NODE_MODULES / name)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
native_modules = [
|
||||||
|
"node-pty",
|
||||||
|
"native-watchdog",
|
||||||
|
"@vscode/spdlog",
|
||||||
|
"@parcel/watcher",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def replace_natives(vscode_path, native_path):
|
||||||
|
replace = partial(replace_node_modules, vscode_path, native_path)
|
||||||
|
for name in native_modules:
|
||||||
|
replace(name)
|
||||||
|
|
||||||
|
def mk_native_modules(vscode_path: Path, native_path: Path):
|
||||||
|
"""
|
||||||
|
For each native module:
|
||||||
|
1. Read VSCode's node_modules package/package.json to retrieve version info
|
||||||
|
2. Use npm to install specific versions of the native modules
|
||||||
|
"""
|
||||||
|
native_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Create package.json if it doesn't exist
|
||||||
|
package_json_path = native_path / "package.json"
|
||||||
|
if not package_json_path.exists():
|
||||||
|
with open(package_json_path, "w") as f:
|
||||||
|
json.dump({
|
||||||
|
"name": "vscode-native-modules",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"private": True,
|
||||||
|
"dependencies": {}
|
||||||
|
}, f, indent=2)
|
||||||
|
|
||||||
|
# Read the existing package.json
|
||||||
|
with open(package_json_path, "r") as f:
|
||||||
|
package_json = json.load(f)
|
||||||
|
|
||||||
|
# Ensure dependencies object exists
|
||||||
|
if "dependencies" not in package_json:
|
||||||
|
package_json["dependencies"] = {}
|
||||||
|
|
||||||
|
# For each native module, get its version and add to dependencies
|
||||||
|
modules_to_install = []
|
||||||
|
for module_name in native_modules:
|
||||||
|
module_package_json = vscode_path / NODE_MODULES / module_name / "package.json"
|
||||||
|
if module_package_json.exists():
|
||||||
|
with open(module_package_json, "r") as f:
|
||||||
|
module_info = json.load(f)
|
||||||
|
version = module_info.get("version", "latest")
|
||||||
|
package_json["dependencies"][module_name] = version
|
||||||
|
modules_to_install.append(f"{module_name}@{version}")
|
||||||
|
|
||||||
|
# Write updated package.json
|
||||||
|
with open(package_json_path, "w") as f:
|
||||||
|
json.dump(package_json, f, indent=2)
|
||||||
|
|
||||||
|
# Install the native modules
|
||||||
|
if modules_to_install:
|
||||||
|
print(f"Installing native modules: {', '.join(modules_to_install)}")
|
||||||
|
subprocess.run(["npm", "install"], cwd=str(native_path), check=True)
|
||||||
|
|
||||||
|
def replace_node(vscode_path, node_path):
|
||||||
|
"""
|
||||||
|
Replace the node binary in vscode_path with the one from node_path.
|
||||||
|
"""
|
||||||
|
vscode_node_path = vscode_path / "node"
|
||||||
|
|
||||||
|
# Ensure the parent directory of vscode_node_path exists
|
||||||
|
vscode_node_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
replace(
|
||||||
|
target_path=vscode_node_path,
|
||||||
|
link_target=node_path,
|
||||||
|
)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Download vscode server
|
||||||
|
|
||||||
|
url = "https://github.com/VSCodium/vscodium/releases/download/1.99.32562/vscodium-reh-web-linux-x64-1.99.32562.tar.gz" # Replace with the actual URL
|
||||||
|
tar_path = "vscode-server.tar.gz" # Replace with your tar.gz file path
|
||||||
|
|
||||||
|
with urllib.request.urlopen(url) as response:
|
||||||
|
with open(tar_path, "wb") as file:
|
||||||
|
file.write(response.read())
|
||||||
|
|
||||||
|
vscode_path = (Path(".") / "vscode-server-linux-x64-web").absolute()
|
||||||
|
# Extract it (tar.gz)
|
||||||
|
with TarFile.open(tar_path, "r:gz") as tar:
|
||||||
|
tar.extractall(path=vscode_path)
|
||||||
|
|
||||||
|
|
||||||
|
native_path = (Path(".") / "native_modules").absolute()
|
||||||
|
mk_native_modules(
|
||||||
|
vscode_path=vscode_path,
|
||||||
|
native_path=native_path,
|
||||||
|
)
|
||||||
|
|
||||||
|
replace_natives(vscode_path, native_path)
|
||||||
|
replace_node(vscode_path, Path(shutil.which("node")))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
Reference in New Issue
Block a user