DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/Binary/Extension/
ScanPathConfigure.rs1use std::path::PathBuf;
6
7use crate::{
8 ApplicationState::State::ApplicationState::{ApplicationState, MapLockError},
9 dev_log,
10};
11
12pub fn ScanPathConfigure(AppState:&std::sync::Arc<ApplicationState>) -> Result<Vec<PathBuf>, String> {
33 dev_log!("extensions", "[Extensions] [ScanPaths] Locking ExtensionScanPaths...");
34
35 let mut ScanPathsGuard = AppState
36 .Extension
37 .Registry
38 .ExtensionScanPaths
39 .lock()
40 .map_err(MapLockError)
41 .map_err(|e| format!("Failed to lock ExtensionScanPaths: {}", e))?;
42
43 let SkipBuiltins = matches!(std::env::var("Skip").as_deref(), Ok("1") | Ok("true"))
49 || matches!(std::env::var("Skip").as_deref(), Ok("1") | Ok("true"));
50
51 if SkipBuiltins {
52 dev_log!(
53 "extensions",
54 "[Extensions] [ScanPaths] Skip=true - skipping all built-in paths, keeping user path"
55 );
56 } else {
57 dev_log!("extensions", "[Extensions] [ScanPaths] Adding default scan paths...");
58 }
59
60 if !SkipBuiltins {
64 if let Ok(Override) = std::env::var("Ship") {
65 let OverridePath = ExpandUserPath(&Override);
66
67 if OverridePath.exists() {
68 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Ship)", OverridePath.display());
69
70 ScanPathsGuard.push(OverridePath);
71 } else {
72 dev_log!(
73 "extensions",
74 "warn: [Extensions] [ScanPaths] Ship={} does not exist; ignoring",
75 Override
76 );
77 }
78 }
79 }
80
81 if !SkipBuiltins {
83 if let Ok(ExecutableDirectory) = std::env::current_exe() {
84 if let Some(Parent) = ExecutableDirectory.parent() {
85 let Normalize = |P:std::path::PathBuf| -> std::path::PathBuf {
90 if P.exists() {
91 return P.canonicalize().unwrap_or(P);
92 }
93
94 let mut Out:Vec<std::path::Component> = Vec::new();
95
96 for C in P.components() {
97 match C {
98 std::path::Component::ParentDir => {
99 Out.pop();
100 },
101
102 _ => Out.push(C),
103 }
104 }
105
106 Out.iter().collect()
107 };
108
109 let StaticAppExtPath = Parent.join("../Resources/Static/Application/extensions");
113
114 if StaticAppExtPath.exists() {
115 let StaticAppExtPath = Normalize(StaticAppExtPath);
116
117 dev_log!(
118 "extensions",
119 "[Extensions] [ScanPaths] + {} (Static/Application canonical)",
120 StaticAppExtPath.display()
121 );
122
123 ScanPathsGuard.push(StaticAppExtPath);
124 }
125
126 let ResourcesPath = Normalize(Parent.join("../Resources/extensions"));
129
130 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesPath.display());
131
132 ScanPathsGuard.push(ResourcesPath);
133
134 let ResourcesAppPath = Normalize(Parent.join("../Resources/app/extensions"));
136
137 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesAppPath.display());
138
139 ScanPathsGuard.push(ResourcesAppPath);
140
141 let LocalPath = Parent.join("extensions");
143
144 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", LocalPath.display());
145
146 ScanPathsGuard.push(LocalPath);
147
148 let SkyTargetPath = Parent.join("../../../Sky/Target/Static/Application/extensions");
160
161 if SkyTargetPath.exists() {
162 let SkyTargetPath = Normalize(SkyTargetPath);
163
164 dev_log!(
165 "extensions",
166 "[Extensions] [ScanPaths] + {} (Sky Target, repo-layout)",
167 SkyTargetPath.display()
168 );
169
170 ScanPathsGuard.push(SkyTargetPath);
171 }
172
173 let DependencyPath = Parent.join("../../../../Dependency/Microsoft/Dependency/Editor/extensions");
176
177 if DependencyPath.exists() {
178 dev_log!(
179 "extensions",
180 "[Extensions] [ScanPaths] + {} (VS Code Dependency, repo-layout)",
181 DependencyPath.display()
182 );
183
184 ScanPathsGuard.push(DependencyPath);
185 }
186 }
187 }
188 } if let Ok(UserOverride) = std::env::var("Lodge") {
201 let OverridePath = ExpandUserPath(&UserOverride);
202
203 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Lodge)", OverridePath.display());
204
205 ScanPathsGuard.push(OverridePath);
206 } else {
207 let UserExtensionPath = crate::IPC::WindServiceHandlers::Utilities::FiddeeRoot::Fn().join("extensions");
208
209 dev_log!(
210 "extensions",
211 "[Extensions] [ScanPaths] + {} (User)",
212 UserExtensionPath.display()
213 );
214
215 ScanPathsGuard.push(UserExtensionPath);
216
217 if let Some(Home) = dirs::home_dir() {
228 let LandLegacy = Home.join(".land").join("extensions");
229
230 if LandLegacy.is_dir() {
231 dev_log!(
232 "extensions",
233 "[Extensions] [ScanPaths] + {} (User legacy ~/.land)",
234 LandLegacy.display()
235 );
236
237 ScanPathsGuard.push(LandLegacy);
238 }
239 }
240 }
241
242 if let Ok(Extras) = std::env::var("Extend") {
246 let Separator = if cfg!(target_os = "windows") { ';' } else { ':' };
247
248 for Candidate in Extras.split(Separator) {
249 let Trimmed = Candidate.trim();
250
251 if Trimmed.is_empty() {
252 continue;
253 }
254
255 let ExtraPath = ExpandUserPath(Trimmed);
256
257 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Extend)", ExtraPath.display());
258
259 ScanPathsGuard.push(ExtraPath);
260 }
261 }
262
263 if let Ok(DevExtensions) = std::env::var("Probe") {
268 let DevPath = ExpandUserPath(&DevExtensions);
269
270 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Probe)", DevPath.display());
271
272 ScanPathsGuard.push(DevPath);
273 }
274
275 let ScanPaths = ScanPathsGuard.clone();
276
277 dev_log!("extensions", "[Extensions] [ScanPaths] Configured: {:?}", ScanPaths);
278
279 Ok(ScanPaths)
280}
281
282fn ExpandUserPath(Raw:&str) -> PathBuf {
287 if let Some(Stripped) = Raw.strip_prefix("~/") {
288 if let Some(Home) = dirs::home_dir() {
289 return Home.join(Stripped);
290 }
291 }
292
293 PathBuf::from(Raw)
294}