Skip to content

Commit 9e44d74

Browse files
authored
Merge branch 'main' into error-msg-unavaliable-ports-ssh
2 parents 587260e + 9feaed8 commit 9e44d74

File tree

187 files changed

+3739
-2089
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

187 files changed

+3739
-2089
lines changed

.github/classifier.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@
7878
"file-watcher": {"assign": ["bpasero"]},
7979
"font-rendering": {"assign": []},
8080
"formatting": {"assign": []},
81+
"getting-started": {"assign": ["bhavyaus"]},
8182
"ghost-text": {"assign": ["hediet"]},
8283
"git": {"assign": ["lszomoru"]},
8384
"gpu": {"assign": ["deepak1556"]},
8485
"grammar": {"assign": ["mjbvz"]},
8586
"grid-view": {"assign": ["joaomoreno"]},
8687
"html": {"assign": ["aeschli"]},
87-
"i18n": {"assign": []},
8888
"icon-brand": {"assign": []},
8989
"icons-product": {"assign": ["daviddossett"]},
9090
"inlay-hints": {"assign": ["jrieken", "hediet"]},

cli/src/util/prereqs.rs

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use super::errors::AnyError;
1717
lazy_static! {
1818
static ref LDCONFIG_STDC_RE: Regex = Regex::new(r"libstdc\+\+.* => (.+)").unwrap();
1919
static ref LDD_VERSION_RE: BinRegex = BinRegex::new(r"^ldd.*(.+)\.(.+)\s").unwrap();
20+
static ref GENERIC_VERSION_RE: Regex = Regex::new(r"^([0-9]+)\.([0-9]+)$").unwrap();
2021
static ref LIBSTD_CXX_VERSION_RE: BinRegex =
2122
BinRegex::new(r"GLIBCXX_([0-9]+)\.([0-9]+)(?:\.([0-9]+))?").unwrap();
2223
static ref MIN_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 18);
@@ -116,13 +117,23 @@ async fn check_musl_interpreter() -> Result<(), String> {
116117

117118
#[allow(dead_code)]
118119
async fn check_glibc_version() -> Result<(), String> {
119-
let ldd_version = capture_command("ldd", ["--version"])
120-
.await
121-
.ok()
122-
.and_then(|o| extract_ldd_version(&o.stdout));
120+
#[cfg(target_env = "gnu")]
121+
let version = {
122+
let v = unsafe { libc::gnu_get_libc_version() };
123+
let v = unsafe { std::ffi::CStr::from_ptr(v) };
124+
let v = v.to_str().unwrap();
125+
extract_generic_version(v)
126+
};
127+
#[cfg(not(target_env = "gnu"))]
128+
let version = {
129+
capture_command("ldd", ["--version"])
130+
.await
131+
.ok()
132+
.and_then(|o| extract_ldd_version(&o.stdout))
133+
};
123134

124-
if let Some(v) = ldd_version {
125-
return if v.gte(&MIN_LDD_VERSION) {
135+
if let Some(v) = version {
136+
return if v >= *MIN_LDD_VERSION {
126137
Ok(())
127138
} else {
128139
Err(format!(
@@ -181,7 +192,7 @@ fn check_for_sufficient_glibcxx_versions(contents: Vec<u8>) -> Result<(), String
181192
})
182193
.collect();
183194

184-
if !all_versions.iter().any(|v| MIN_CXX_VERSION.gte(v)) {
195+
if !all_versions.iter().any(|v| &*MIN_CXX_VERSION >= v) {
185196
return Err(format!(
186197
"find GLIBCXX >= 3.4.18 (but found {} instead) for GNU environments",
187198
all_versions
@@ -195,6 +206,7 @@ fn check_for_sufficient_glibcxx_versions(contents: Vec<u8>) -> Result<(), String
195206
Ok(())
196207
}
197208

209+
#[allow(dead_code)]
198210
fn extract_ldd_version(output: &[u8]) -> Option<SimpleSemver> {
199211
LDD_VERSION_RE.captures(output).map(|m| SimpleSemver {
200212
major: m.get(1).map_or(0, |s| u32_from_bytes(s.as_bytes())),
@@ -203,6 +215,15 @@ fn extract_ldd_version(output: &[u8]) -> Option<SimpleSemver> {
203215
})
204216
}
205217

218+
#[allow(dead_code)]
219+
fn extract_generic_version(output: &str) -> Option<SimpleSemver> {
220+
GENERIC_VERSION_RE.captures(output).map(|m| SimpleSemver {
221+
major: m.get(1).map_or(0, |s| s.as_str().parse().unwrap()),
222+
minor: m.get(2).map_or(0, |s| s.as_str().parse().unwrap()),
223+
patch: 0,
224+
})
225+
}
226+
206227
fn extract_libstd_from_ldconfig(output: &[u8]) -> Option<String> {
207228
String::from_utf8_lossy(output)
208229
.lines()
@@ -215,13 +236,35 @@ fn u32_from_bytes(b: &[u8]) -> u32 {
215236
String::from_utf8_lossy(b).parse::<u32>().unwrap_or(0)
216237
}
217238

218-
#[derive(Debug, PartialEq)]
239+
#[derive(Debug, Default, PartialEq, Eq)]
219240
struct SimpleSemver {
220241
major: u32,
221242
minor: u32,
222243
patch: u32,
223244
}
224245

246+
impl PartialOrd for SimpleSemver {
247+
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
248+
Some(self.cmp(other))
249+
}
250+
}
251+
252+
impl Ord for SimpleSemver {
253+
fn cmp(&self, other: &Self) -> Ordering {
254+
let major = self.major.cmp(&other.major);
255+
if major != Ordering::Equal {
256+
return major;
257+
}
258+
259+
let minor = self.minor.cmp(&other.minor);
260+
if minor != Ordering::Equal {
261+
return minor;
262+
}
263+
264+
self.patch.cmp(&other.patch)
265+
}
266+
}
267+
225268
impl From<&SimpleSemver> for String {
226269
fn from(s: &SimpleSemver) -> Self {
227270
format!("v{}.{}.{}", s.major, s.minor, s.patch)
@@ -243,18 +286,6 @@ impl SimpleSemver {
243286
patch,
244287
}
245288
}
246-
247-
fn gte(&self, other: &SimpleSemver) -> bool {
248-
match self.major.cmp(&other.major) {
249-
Ordering::Greater => true,
250-
Ordering::Less => false,
251-
Ordering::Equal => match self.minor.cmp(&other.minor) {
252-
Ordering::Greater => true,
253-
Ordering::Less => false,
254-
Ordering::Equal => self.patch >= other.patch,
255-
},
256-
}
257-
}
258289
}
259290

260291
#[cfg(test)]
@@ -284,13 +315,13 @@ mod tests {
284315

285316
#[test]
286317
fn test_gte() {
287-
assert!(SimpleSemver::new(1, 2, 3).gte(&SimpleSemver::new(1, 2, 3)));
288-
assert!(SimpleSemver::new(1, 2, 3).gte(&SimpleSemver::new(0, 10, 10)));
289-
assert!(SimpleSemver::new(1, 2, 3).gte(&SimpleSemver::new(1, 1, 10)));
318+
assert!(SimpleSemver::new(1, 2, 3) >= SimpleSemver::new(1, 2, 3));
319+
assert!(SimpleSemver::new(1, 2, 3) >= SimpleSemver::new(0, 10, 10));
320+
assert!(SimpleSemver::new(1, 2, 3) >= SimpleSemver::new(1, 1, 10));
290321

291-
assert!(!SimpleSemver::new(1, 2, 3).gte(&SimpleSemver::new(1, 2, 10)));
292-
assert!(!SimpleSemver::new(1, 2, 3).gte(&SimpleSemver::new(1, 3, 1)));
293-
assert!(!SimpleSemver::new(1, 2, 3).gte(&SimpleSemver::new(2, 2, 1)));
322+
assert!(SimpleSemver::new(1, 2, 3) < SimpleSemver::new(1, 2, 10));
323+
assert!(SimpleSemver::new(1, 2, 3) < SimpleSemver::new(1, 3, 1));
324+
assert!(SimpleSemver::new(1, 2, 3) < SimpleSemver::new(2, 2, 1));
294325
}
295326

296327
#[test]

extensions/debug-server-ready/package.json

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
"additionalProperties": false,
4141
"markdownDescription": "%debug.server.ready.serverReadyAction.description%",
4242
"default": {
43-
"action": "openExternally"
43+
"action": "openExternally",
44+
"killOnServerStop": false
4445
},
4546
"properties": {
4647
"action": {
@@ -63,6 +64,11 @@
6364
"type": "string",
6465
"markdownDescription": "%debug.server.ready.uriFormat.description%",
6566
"default": "http://localhost:%s"
67+
},
68+
"killOnServerStop": {
69+
"type": "boolean",
70+
"markdownDescription": "%debug.server.ready.killOnServerStop.description%",
71+
"default": false
6672
}
6773
}
6874
},
@@ -74,7 +80,8 @@
7480
"action": "debugWithEdge",
7581
"pattern": "listening on port ([0-9]+)",
7682
"uriFormat": "http://localhost:%s",
77-
"webRoot": "${workspaceFolder}"
83+
"webRoot": "${workspaceFolder}",
84+
"killOnServerStop": false
7885
},
7986
"properties": {
8087
"action": {
@@ -103,6 +110,11 @@
103110
"type": "string",
104111
"markdownDescription": "%debug.server.ready.webRoot.description%",
105112
"default": "${workspaceFolder}"
113+
},
114+
"killOnServerStop": {
115+
"type": "boolean",
116+
"markdownDescription": "%debug.server.ready.killOnServerStop.description%",
117+
"default": false
106118
}
107119
}
108120
},
@@ -112,7 +124,8 @@
112124
"markdownDescription": "%debug.server.ready.serverReadyAction.description%",
113125
"default": {
114126
"action": "startDebugging",
115-
"name": "<launch browser config name>"
127+
"name": "<launch browser config name>",
128+
"killOnServerStop": false
116129
},
117130
"required": [
118131
"name"
@@ -138,6 +151,11 @@
138151
"type": "string",
139152
"markdownDescription": "%debug.server.ready.debugConfigName.description%",
140153
"default": "Launch Browser"
154+
},
155+
"killOnServerStop": {
156+
"type": "boolean",
157+
"markdownDescription": "%debug.server.ready.killOnServerStop.description%",
158+
"default": false
141159
}
142160
}
143161
}

extensions/debug-server-ready/package.nls.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
"debug.server.ready.pattern.description": "Server is ready if this pattern appears on the debug console. The first capture group must include a URI or a port number.",
1111
"debug.server.ready.uriFormat.description": "A format string used when constructing the URI from a port number. The first '%s' is substituted with the port number.",
1212
"debug.server.ready.webRoot.description": "Value passed to the debug configuration for the 'Debugger for Chrome'.",
13+
"debug.server.ready.killOnServerStop.description": "Stop the child session when the parent session stopped.",
1314
"debug.server.ready.debugConfigName.description": "Name of the launch configuration to run."
1415
}

0 commit comments

Comments
 (0)