Skip to content

Commit a8fc57c

Browse files
committed
fix: install git extension fs-copyfile dependency
1 parent 4f9c238 commit a8fc57c

3 files changed

Lines changed: 132 additions & 3 deletions

File tree

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
main() {
5+
if [[ $# -ne 2 ]]; then
6+
echo "Usage: $0 <extensions package.json> <VS Code extensions source dir>" >&2
7+
exit 1
8+
fi
9+
10+
local package_json="$1"
11+
local vscode_extensions_src_path="$2"
12+
13+
# VS Code's optimizer keeps a runtime require("@vscode/fs-copyfile") in the
14+
# built git extension but strips dependencies from the built extension
15+
# package.json. code-server's npm postinstall installs from lib/vscode/extensions,
16+
# so hoist this runtime dependency into the shared extension manifest.
17+
add_dependency_from_extension_package \
18+
"$package_json" \
19+
"$vscode_extensions_src_path/git/package.json" \
20+
"@vscode/fs-copyfile"
21+
}
22+
23+
add_dependency_from_extension_package() {
24+
local package_json="$1"
25+
local source_package_json="$2"
26+
local dependency="$3"
27+
28+
if [[ ! -f $package_json ]]; then
29+
echo "Missing package manifest: $package_json" >&2
30+
exit 1
31+
fi
32+
33+
if [[ ! -f $source_package_json ]]; then
34+
echo "Missing source extension manifest: $source_package_json" >&2
35+
exit 1
36+
fi
37+
38+
local version
39+
version="$(jq -r --arg dependency "$dependency" '.dependencies[$dependency] // empty' "$source_package_json")"
40+
if [[ -z $version ]]; then
41+
echo "Expected $dependency in $source_package_json dependencies" >&2
42+
exit 1
43+
fi
44+
45+
local package_json_tmp
46+
package_json_tmp="$(mktemp)"
47+
cp -p "$package_json" "$package_json_tmp"
48+
jq \
49+
--arg dependency "$dependency" \
50+
--arg version "$version" \
51+
'.dependencies = (.dependencies // {}) | .dependencies[$dependency] = $version' \
52+
"$package_json" > "$package_json_tmp"
53+
mv "$package_json_tmp" "$package_json"
54+
}
55+
56+
main "$@"

ci/build/build-release.sh

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ bundle_vscode() {
136136

137137
# Include global extension dependencies as well.
138138
rsync "$VSCODE_SRC_PATH/extensions/package.json" "$VSCODE_OUT_PATH/extensions/package.json"
139+
./ci/build/add-vscode-extension-dependencies.sh "$VSCODE_OUT_PATH/extensions/package.json" "$VSCODE_SRC_PATH/extensions"
139140
cp "$VSCODE_SRC_PATH/extensions/npm-shrinkwrap.json" "$VSCODE_OUT_PATH/extensions/npm-shrinkwrap.json"
140141
rsync "$VSCODE_SRC_PATH/extensions/postinstall.mjs" "$VSCODE_OUT_PATH/extensions/postinstall.mjs"
141142
}
@@ -165,11 +166,22 @@ create_shrinkwraps() {
165166
mv package-lock.json.temp package-lock.json
166167
popd
167168

168-
pushd "$VSCODE_SRC_PATH/extensions/"
169-
cp package-lock.json package-lock.json.temp
169+
# Generate the extension shrinkwrap from a temporary manifest so we can add
170+
# code-server-specific hoisted runtime dependencies without mutating the VS Code
171+
# submodule package.json or package-lock.json.
172+
local extensions_shrinkwrap_tmp
173+
extensions_shrinkwrap_tmp="$(mktemp -d)"
174+
cp "$VSCODE_SRC_PATH/extensions/package.json" "$extensions_shrinkwrap_tmp/package.json"
175+
cp "$VSCODE_SRC_PATH/extensions/package-lock.json" "$extensions_shrinkwrap_tmp/package-lock.json"
176+
./ci/build/add-vscode-extension-dependencies.sh "$extensions_shrinkwrap_tmp/package.json" "$VSCODE_SRC_PATH/extensions"
177+
178+
pushd "$extensions_shrinkwrap_tmp"
179+
npm install --package-lock-only --ignore-scripts
170180
npm shrinkwrap
171-
mv package-lock.json.temp package-lock.json
172181
popd
182+
183+
cp "$extensions_shrinkwrap_tmp/npm-shrinkwrap.json" "$VSCODE_SRC_PATH/extensions/npm-shrinkwrap.json"
184+
rm -rf "$extensions_shrinkwrap_tmp"
173185
}
174186

175187
main "$@"

test/scripts/build-release.bats

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env bats
2+
3+
SCRIPT="$BATS_TEST_DIRNAME/../../ci/build/add-vscode-extension-dependencies.sh"
4+
5+
@test "add-vscode-extension-dependencies.sh: hoists git fs-copyfile runtime dependency" {
6+
fixture="$BATS_TEST_TMPDIR/extensions"
7+
mkdir -p "$fixture/git"
8+
9+
cat > "$fixture/package.json" <<'JSON'
10+
{
11+
"name": "vscode-extensions",
12+
"version": "0.0.1",
13+
"dependencies": {
14+
"typescript": "^6.0.3"
15+
}
16+
}
17+
JSON
18+
19+
cat > "$fixture/git/package.json" <<'JSON'
20+
{
21+
"name": "git",
22+
"version": "10.0.0",
23+
"dependencies": {
24+
"@vscode/fs-copyfile": "2.0.0",
25+
"byline": "^5.0.0"
26+
}
27+
}
28+
JSON
29+
30+
run "$SCRIPT" "$fixture/package.json" "$fixture"
31+
32+
[ "$status" -eq 0 ]
33+
[ "$(jq -r '.dependencies["@vscode/fs-copyfile"]' "$fixture/package.json")" = "2.0.0" ]
34+
[ "$(jq -r '.dependencies.typescript' "$fixture/package.json")" = "^6.0.3" ]
35+
[ "$(jq -r '.dependencies.byline // empty' "$fixture/package.json")" = "" ]
36+
}
37+
38+
@test "add-vscode-extension-dependencies.sh: fails when VS Code git manifest drops fs-copyfile" {
39+
fixture="$BATS_TEST_TMPDIR/extensions"
40+
mkdir -p "$fixture/git"
41+
42+
cat > "$fixture/package.json" <<'JSON'
43+
{
44+
"name": "vscode-extensions",
45+
"version": "0.0.1"
46+
}
47+
JSON
48+
49+
cat > "$fixture/git/package.json" <<'JSON'
50+
{
51+
"name": "git",
52+
"version": "10.0.0",
53+
"dependencies": {}
54+
}
55+
JSON
56+
57+
run "$SCRIPT" "$fixture/package.json" "$fixture"
58+
59+
[ "$status" -eq 1 ]
60+
[[ "$output" = *"Expected @vscode/fs-copyfile"* ]]
61+
}

0 commit comments

Comments
 (0)