1- #! /usr/bin/env bash
1+ #! /usr/bin/env sh
22# Rest vs VSCode Output Compatibility Benchmark
33# This script compares Rest compiler output with VSCode's gulp/tsb build output
44
@@ -9,32 +9,25 @@ echo "Rest vs VSCode Compatibility Benchmark"
99echo " =========================================="
1010echo " "
1111
12- # Colors
13- RED=' \033[0;31m'
14- GREEN=' \033[0;32m'
15- YELLOW=' \033[1;33m'
16- BLUE=' \033[0;34m'
17- NC=' \033[0m'
18-
1912# Configuration
2013VSCode_SOURCE_DIR=" Dependency/Microsoft/Dependency/Editor/src"
2114VSCode_OUT_DIR=" Dependency/Microsoft/Dependency/Editor/out"
2215VSCode_OUT_BUILD_DIR=" Dependency/Microsoft/Dependency/Editor/out-build"
2316REST_OUT_DIR=" Element/Rest/Target/benchmark-out"
2417REST_OUT_BUILD_DIR=" Element/Rest/Target/benchmark-out-build"
25- REST_BINARY=" Element/Rest/Target/debug/Rest" # Use debug binary to avoid optimizer bugs
18+ REST_BINARY=" Element/Rest/Target/debug/Rest"
2619
2720# Check prerequisites
2821echo " Checking prerequisites..."
2922if [ ! -x " $REST_BINARY " ]; then
30- echo -e " ${RED} ERROR:${NC} Rest binary not found at $REST_BINARY "
31- echo " Please build Rest first: cd Element/Rest && cargo build"
32- exit 1
23+ echo " ERROR: Rest binary not found at $REST_BINARY "
24+ echo " Please build Rest first: cd Element/Rest && cargo build"
25+ exit 1
3326fi
3427
3528if [ ! -d " $VSCode_SOURCE_DIR " ]; then
36- echo -e " ${RED} ERROR:${NC} VSCode source not found at $VSCode_SOURCE_DIR "
37- exit 1
29+ echo " ERROR: VSCode source not found at $VSCode_SOURCE_DIR "
30+ exit 1
3831fi
3932
4033# Create output directories
@@ -45,185 +38,157 @@ echo ""
4538echo " =========================================="
4639echo " Benchmark Configuration"
4740echo " =========================================="
48- echo -e " ${BLUE} VSCode Source:${NC} $VSCode_SOURCE_DIR "
49- echo -e " ${BLUE} VSCode Dev Output:${NC} $VSCode_OUT_DIR "
50- echo -e " ${BLUE} VSCode Prod Output:${NC} $VSCode_OUT_BUILD_DIR "
51- echo -e " ${BLUE} Rest Dev Output:${NC} $REST_OUT_DIR "
52- echo -e " ${BLUE} Rest Bin:${NC} $REST_BINARY "
41+ echo " VSCode Source: $VSCode_SOURCE_DIR "
42+ echo " VSCode Dev Output: $VSCode_OUT_DIR "
43+ echo " VSCode Prod Output: $VSCode_OUT_BUILD_DIR "
44+ echo " Rest Dev Output: $REST_OUT_DIR "
45+ echo " Rest Bin: $REST_BINARY "
5346echo " "
5447
5548# Function to count TypeScript files
5649count_typescript_files () {
57- local dir=" $1 "
58- find " $dir " -name " *.ts" -type f 2> /dev/null | \
59- grep -v " node_modules" | \
60- grep -v " Target" | \
61- grep -v " /test" | \
62- grep -v " \.d\.ts$" | \
63- wc -l
50+ find " $1 " -name " *.ts" -type f 2> /dev/null | \
51+ grep -v " node_modules" | \
52+ grep -v " Target" | \
53+ grep -v " /test" | \
54+ grep -v " \.d\.ts$" | \
55+ wc -l
6456}
6557
6658# Function to compile with Rest
6759benchmark_rest () {
68- local input_dir=" $1 "
69- local output_dir=" $2 "
70- local label=" $3 "
71-
72- echo " "
73- echo " =========================================="
74- echo " Benchmark: $label "
75- echo " =========================================="
76-
77- # Clean output directory
78- rm -rf " $output_dir "
79- mkdir -p " $output_dir "
80-
81- # Count files to compile
82- echo " Discovering TypeScript files..."
83- local file_count=$( count_typescript_files " $input_dir " )
84-
85- if [ " $file_count " -eq 0 ]; then
86- echo -e " ${YELLOW} WARNING:${NC} No TypeScript files found in $input_dir "
87- return
88- fi
89-
90- echo " Found $file_count TypeScript files"
91- echo " "
92-
93- # Run compilation
94- echo " Running Rest compilation..."
95- echo " Command: $REST_BINARY compile -i \" $input_dir \" -o \" $output_dir \" "
96- local start_time=$( date +%s.%N)
97-
98- if $REST_BINARY compile -i " $input_dir " -o " $output_dir " 2>&1 ; then
99- local exit_code=0
100- else
101- local exit_code=$?
102- fi
103-
104- local end_time=$( date +%s.%N)
105- local elapsed=$( echo " $end_time - $start_time " | bc)
106-
107- echo " "
108- echo " Results:"
109- echo " Exit code: $exit_code "
110- printf " Total time: %.3f seconds\n" $elapsed
111-
112- if [ -d " $output_dir " ]; then
113- local compiled_count=$( find " $output_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | wc -l)
114- echo " Output files: $compiled_count "
115- echo " Output size: $( du -sh " $output_dir " | cut -f1) "
116-
117- # Save results
118- echo " $file_count ,$compiled_count ,$exit_code ,$elapsed " > " $output_dir /benchmark_results.csv"
119- else
120- echo " No output directory created"
121- fi
60+ input_dir=" $1 "
61+ output_dir=" $2 "
62+ label=" $3 "
63+
64+ echo " "
65+ echo " =========================================="
66+ echo " Benchmark: $label "
67+ echo " =========================================="
68+
69+ # Clean output directory
70+ rm -rf " $output_dir "
71+ mkdir -p " $output_dir "
72+
73+ echo " Discovering TypeScript files..."
74+ file_count=$( count_typescript_files " $input_dir " )
75+
76+ if [ " $file_count " -eq 0 ]; then
77+ echo " WARNING: No TypeScript files found in $input_dir "
78+ return
79+ fi
80+
81+ echo " Found $file_count TypeScript files"
82+ echo " "
83+
84+ echo " Running Rest compilation..."
85+ echo " Command: $REST_BINARY compile -i \" $input_dir \" -o \" $output_dir \" "
86+ start_time=$( date +%s)
87+
88+ exit_code=0
89+ $REST_BINARY compile -i " $input_dir " -o " $output_dir " 2>&1 || exit_code=$?
90+
91+ end_time=$( date +%s)
92+ elapsed=$(( end_time - start_time))
93+
94+ echo " "
95+ echo " Results:"
96+ echo " Exit code: $exit_code "
97+ printf " Total time: %d seconds\n" " $elapsed "
98+
99+ if [ -d " $output_dir " ]; then
100+ compiled_count=$( find " $output_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | wc -l)
101+ echo " Output files: $compiled_count "
102+ echo " Output size: $( du -sh " $output_dir " | cut -f1) "
103+
104+ printf " %s,%s,%s,%s\n" " $file_count " " $compiled_count " " $exit_code " " $elapsed " > " $output_dir /benchmark_results.csv"
105+ else
106+ echo " No output directory created"
107+ fi
122108}
123109
124110# Function to compare outputs
125111compare_outputs () {
126- local vscode_dir=" $1 "
127- local rest_dir=" $2 "
128- local label=" $3 "
129-
130- echo " "
131- echo " =========================================="
132- echo " Comparison: $label "
133- echo " =========================================="
134-
135- if [ ! -d " $vscode_dir " ] || [ ! -d " $rest_dir " ]; then
136- echo -e " ${YELLOW} SKIPPED:${NC} Directories not ready (vscode: $vscode_dir , rest: $rest_dir )"
137- return
138- fi
139-
140- # Find common JS files (exclude .d.js declaration files to match VSCode's build output)
141- echo " Finding VSCode JavaScript files..."
142- local vscode_js=($( find " $vscode_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | grep -v " \.d\.js$" ) )
143- echo " Finding Rest JavaScript files..."
144- local rest_js=($( find " $rest_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | grep -v " \.d\.js$" ) )
145-
146- local total_vscode=${# vscode_js[@]}
147- local total_rest=${# rest_js[@]}
148-
149- echo " VSCode: $total_vscode files, Rest: $total_rest files"
150-
151- if [ $total_vscode -eq 0 ]; then
152- echo " No VSCode JavaScript files found to compare"
153- return
154- fi
155-
156- if [ $total_rest -eq 0 ]; then
157- echo " No Rest JavaScript files produced"
158- return
159- fi
160-
161- # Compare file by file
162- echo " Comparing outputs..."
163- local match_count=0
164- local mismatch_count=0
165- local missing_count=0
166-
167- for vscode_file in " ${vscode_js[@]} " ; do
168- local rel=" ${vscode_file# $vscode_dir / } "
169- local rest_file=" $rest_dir /$rel "
170-
171- if [ ! -f " $rest_file " ]; then
172- missing_count=$(( missing_count + 1 ))
173- echo " MISSING: $rel "
174- else
175- # Compare content
176- if cmp -s " $vscode_file " " $rest_file " ; then
177- match_count=$(( match_count + 1 ))
178- else
179- mismatch_count=$(( mismatch_count + 1 ))
180- local vscode_size=$( wc -c < " $vscode_file " )
181- local rest_size=$( wc -c < " $rest_file " )
182- echo " DIFF: $rel (VSCode: ${vscode_size} B, Rest: ${rest_size} B)"
183- fi
184- fi
185- done
186-
187- echo " "
188- echo " Comparison results:"
189- echo " Total VSCode files: $total_vscode "
190- echo " Matching: $match_count "
191- echo " Mismatched: $mismatch_count "
192- echo " Missing in Rest: $missing_count "
193-
194- local match_pct=0
195- if [ $total_vscode -gt 0 ]; then
196- match_pct=$( echo " scale=2; ($match_count * 100) / $total_vscode " | bc)
197- fi
198- echo " Match rate: ${match_pct} %"
199-
200- if [ $mismatch_count -eq 0 ] && [ $missing_count -eq 0 ]; then
201- echo -e " Status: ${GREEN} PERFECT MATCH${NC} "
202- else
203- echo -e " Status: ${RED} DIFFERENCES DETECTED${NC} "
204- fi
112+ vscode_dir=" $1 "
113+ rest_dir=" $2 "
114+ label=" $3 "
115+
116+ echo " "
117+ echo " =========================================="
118+ echo " Comparison: $label "
119+ echo " =========================================="
120+
121+ if [ ! -d " $vscode_dir " ] || [ ! -d " $rest_dir " ]; then
122+ echo " SKIPPED: Directories not ready (vscode: $vscode_dir , rest: $rest_dir )"
123+ return
124+ fi
125+
126+ echo " Finding VSCode JavaScript files..."
127+ echo " Finding Rest JavaScript files..."
128+
129+ total_vscode=$( find " $vscode_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | grep -v " \.d\.js$" | wc -l)
130+ total_rest=$( find " $rest_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | grep -v " \.d\.js$" | wc -l)
131+
132+ echo " VSCode: $total_vscode files, Rest: $total_rest files"
133+
134+ if [ " $total_vscode " -eq 0 ]; then
135+ echo " No VSCode JavaScript files found to compare"
136+ return
137+ fi
138+
139+ if [ " $total_rest " -eq 0 ]; then
140+ echo " No Rest JavaScript files produced"
141+ return
142+ fi
143+
144+ echo " Comparing outputs..."
145+ match_count=0
146+ mismatch_count=0
147+ missing_count=0
148+
149+ find " $vscode_dir " -name " *.js" -type f 2> /dev/null | grep -v " map" | grep -v " \.d\.js$" | while IFS= read -r vscode_file; do
150+ rel=" ${vscode_file# $vscode_dir / } "
151+ rest_file=" $rest_dir /$rel "
152+
153+ if [ ! -f " $rest_file " ]; then
154+ missing_count=$(( missing_count + 1 ))
155+ echo " MISSING: $rel "
156+ else
157+ if cmp -s " $vscode_file " " $rest_file " ; then
158+ match_count=$(( match_count + 1 ))
159+ else
160+ mismatch_count=$(( mismatch_count + 1 ))
161+ vscode_size=$( wc -c < " $vscode_file " )
162+ rest_size=$( wc -c < " $rest_file " )
163+ echo " DIFF: $rel (VSCode: ${vscode_size} B, Rest: ${rest_size} B)"
164+ fi
165+ fi
166+ done
167+
168+ echo " "
169+ echo " Comparison results:"
170+ echo " Total VSCode files: $total_vscode "
171+ echo " (See output above for mismatches and missing files)"
205172}
206173
207174# Main execution
208175echo " Starting benchmark at $( date) "
209176echo " "
210177
211- # Benchmark development build (out/)
212178if [ -d " $VSCode_SOURCE_DIR " ] && [ " $( count_typescript_files " $VSCode_SOURCE_DIR " ) " -gt 0 ]; then
213- benchmark_rest " $VSCode_SOURCE_DIR " " $REST_OUT_DIR " " Development Build (src -> out/)"
214- compare_outputs " $VSCode_OUT_DIR " " $REST_OUT_DIR " " Development"
179+ benchmark_rest " $VSCode_SOURCE_DIR " " $REST_OUT_DIR " " Development Build (src -> out/)"
180+ compare_outputs " $VSCode_OUT_DIR " " $REST_OUT_DIR " " Development"
215181else
216- echo -e " ${YELLOW} SKIPPING:${NC} VSCode source not found or empty"
182+ echo " SKIPPING: VSCode source not found or empty"
217183fi
218184
219- # Benchmark production build (out-build/)
220185if [ -d " $VSCode_OUT_BUILD_DIR " ] && [ " $( find " $VSCode_OUT_BUILD_DIR " -name " *.js" 2> /dev/null | wc -l) " -gt 0 ]; then
221- echo " "
222- echo -e " ${YELLOW} NOTE:${NC} Production build requires different compile options"
223- echo " For now comparing same output with different expected directory"
224- compare_outputs " $VSCode_OUT_BUILD_DIR " " $REST_OUT_BUILD_DIR " " Production"
186+ echo " "
187+ echo " NOTE: Production build requires different compile options"
188+ echo " For now comparing same output with different expected directory"
189+ compare_outputs " $VSCode_OUT_BUILD_DIR " " $REST_OUT_BUILD_DIR " " Production"
225190else
226- echo -e " ${YELLOW} SKIPPING:${NC} VSCode production build not ready (out-build/ empty)"
191+ echo " SKIPPING: VSCode production build not ready (out-build/ empty)"
227192fi
228193
229194echo " "
0 commit comments