mirror of
https://git.proxmox.com/git/proxmox
synced 2025-05-28 14:44:02 +00:00
add filename completions helper (moved from pbs-tools)
Depend on 'nix' now.
This commit is contained in:
parent
17adc570db
commit
417b7159d2
@ -12,6 +12,7 @@ exclude = [ "debian" ]
|
||||
anyhow = "1.0"
|
||||
http = "0.2"
|
||||
hyper = { version = "0.14", features = [ "full" ] }
|
||||
nix = "0.19.1"
|
||||
percent-encoding = "2.1"
|
||||
serde_json = "1.0"
|
||||
unicode-width ="0.1.8"
|
||||
|
57
proxmox-router/src/cli/completion_helpers.rs
Normal file
57
proxmox-router/src/cli/completion_helpers.rs
Normal file
@ -0,0 +1,57 @@
|
||||
use std::path::PathBuf;
|
||||
use std::collections::HashMap;
|
||||
|
||||
use nix::dir::Dir;
|
||||
use nix::fcntl::{AtFlags, OFlag};
|
||||
use nix::sys::stat::{fstatat, Mode};
|
||||
|
||||
pub fn complete_file_name(arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
|
||||
let mut result = vec![];
|
||||
|
||||
let mut dirname = PathBuf::from(if arg.is_empty() { "./" } else { arg });
|
||||
|
||||
let is_dir = match fstatat(libc::AT_FDCWD, &dirname, AtFlags::empty()) {
|
||||
Ok(stat) => (stat.st_mode & libc::S_IFMT) == libc::S_IFDIR,
|
||||
Err(_) => false,
|
||||
};
|
||||
|
||||
if !is_dir {
|
||||
if let Some(parent) = dirname.parent() {
|
||||
dirname = parent.to_owned();
|
||||
}
|
||||
}
|
||||
|
||||
let mut dir =
|
||||
match Dir::openat(libc::AT_FDCWD, &dirname, OFlag::O_DIRECTORY, Mode::empty()) {
|
||||
Ok(d) => d,
|
||||
Err(_) => return result,
|
||||
};
|
||||
|
||||
for item in dir.iter() {
|
||||
if let Ok(entry) = item {
|
||||
if let Ok(name) = entry.file_name().to_str() {
|
||||
if name == "." || name == ".." {
|
||||
continue;
|
||||
}
|
||||
let mut newpath = dirname.clone();
|
||||
newpath.push(name);
|
||||
|
||||
if let Ok(stat) = fstatat(libc::AT_FDCWD, &newpath, AtFlags::empty())
|
||||
{
|
||||
if (stat.st_mode & libc::S_IFMT) == libc::S_IFDIR {
|
||||
newpath.push("");
|
||||
if let Some(newpath) = newpath.to_str() {
|
||||
result.push(newpath.to_owned());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if let Some(newpath) = newpath.to_str() {
|
||||
result.push(newpath.to_owned());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
@ -31,6 +31,9 @@ pub use text_table::*;
|
||||
mod completion;
|
||||
pub use completion::*;
|
||||
|
||||
mod completion_helpers;
|
||||
pub use completion_helpers::*;
|
||||
|
||||
mod getopts;
|
||||
pub use getopts::*;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user