Skip to content

Commit e53501f

Browse files
authored
Merge pull request #67 from webosbrew/fix/ls-compatible-option
Fix/ls compatible option
2 parents 1262deb + 916ef7b commit e53501f

File tree

6 files changed

+67
-20
lines changed

6 files changed

+67
-20
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dev-manager-desktop",
3-
"version": "1.9.7",
3+
"version": "1.9.8",
44
"description": "Device Manager for webOS",
55
"homepage": "https://github.com/webosbrew/dev-manager-desktop",
66
"author": {

src-tauri/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod device_manager;
1212
mod plugins;
1313
mod session_manager;
1414
mod error;
15+
mod ssh_files;
1516

1617
fn main() {
1718
env_logger::init();

src-tauri/src/plugins/file.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::device_manager::Device;
1313
use crate::error::Error;
1414
use crate::plugins::cmd::escape_path;
1515
use crate::session_manager::SessionManager;
16+
use crate::ssh_files::ls::for_entries;
1617

1718
#[tauri::command]
1819
async fn ls(
@@ -41,24 +42,19 @@ async fn ls(
4142
entries.pop();
4243
entries.sort();
4344
let mut items = Vec::<FileItem>::new();
45+
let mut ls_legacy = false;
4446
for chunk in entries.chunks(100) {
45-
let ls_input = chunk.join("\0").into_bytes();
46-
let mut details: Vec<String> = String::from_utf8(
47-
manager
48-
.exec(
49-
device.clone(),
50-
"xargs -0 ls -ld --full-time",
51-
Some(ls_input),
52-
)
53-
.await?,
54-
)
55-
.unwrap()
56-
.split('\n')
57-
.map(|l| String::from(l))
58-
.collect();
59-
// Last line is empty, remove it
60-
details.pop();
61-
assert_eq!(chunk.len(), details.len());
47+
let details = match for_entries(&manager, device.clone(), chunk, ls_legacy).await {
48+
Ok(details) => details,
49+
Err(Error::Unsupported) => {
50+
if ls_legacy {
51+
return Err(Error::Unsupported);
52+
}
53+
ls_legacy = true;
54+
for_entries(&manager, device.clone(), chunk, true).await?
55+
}
56+
Err(e) => return Err(e),
57+
};
6258
let mut group: Vec<FileItem> = zip(chunk, details)
6359
.skip(1)
6460
.map(|(entry, line)| {

src-tauri/src/ssh_files/ls.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use crate::device_manager::Device;
2+
use crate::error::Error;
3+
use crate::session_manager::SessionManager;
4+
5+
pub(crate) async fn for_entries(
6+
manager: &SessionManager,
7+
device: Device,
8+
entries: &[String],
9+
use_legacy: bool,
10+
) -> Result<Vec<String>, Error> {
11+
let ls_input = entries.join("\0").into_bytes();
12+
let ls_output = match manager
13+
.exec(
14+
device.clone(),
15+
&format!(
16+
"xargs -0 ls -ld {}",
17+
if use_legacy { "-e" } else { "--full-time" }
18+
),
19+
Some(ls_input.clone()),
20+
)
21+
.await
22+
{
23+
Ok(v) => v,
24+
Err(Error::ExitStatus {
25+
message,
26+
exit_code,
27+
stderr,
28+
}) => {
29+
if exit_code == 123 {
30+
return Err(Error::Unsupported);
31+
}
32+
return Err(Error::ExitStatus {
33+
message,
34+
exit_code,
35+
stderr,
36+
});
37+
}
38+
Err(e) => return Err(e),
39+
};
40+
let mut details: Vec<String> = String::from_utf8(ls_output)
41+
.unwrap()
42+
.split('\n')
43+
.map(|l| String::from(l))
44+
.collect();
45+
// Last line is empty, remove it
46+
details.pop();
47+
assert_eq!(entries.len(), details.len());
48+
return Ok(details);
49+
}

src-tauri/src/ssh_files/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub(crate) mod ls;

0 commit comments

Comments
 (0)