Teach file picker how to find the project root (.git).

imgbot
Blaž Hrastnik 4 years ago
parent 8098e9bdcd
commit e833d65b77

@ -14,7 +14,7 @@ use crate::{
ui::{self, Completion, Picker, Popup, Prompt, PromptEvent}, ui::{self, Completion, Picker, Popup, Prompt, PromptEvent},
}; };
use std::path::PathBuf; use std::path::{Path, PathBuf};
use helix_view::{ use helix_view::{
document::Mode, document::Mode,
@ -840,8 +840,34 @@ pub fn command_mode(cx: &mut Context) {
); );
cx.push_layer(Box::new(prompt)); cx.push_layer(Box::new(prompt));
} }
fn find_root(root: Option<&str>) -> Option<PathBuf> {
let current_dir = std::env::current_dir().expect("unable to determine current directory");
let root = match root {
Some(root) => {
let root = Path::new(root);
if root.is_absolute() {
root.to_path_buf()
} else {
current_dir.join(root)
}
}
None => current_dir,
};
for ancestor in root.ancestors() {
// TODO: also use defined roots if git isn't found
if ancestor.join(".git").is_dir() {
return Some(ancestor.to_path_buf());
}
}
None
}
pub fn file_picker(cx: &mut Context) { pub fn file_picker(cx: &mut Context) {
let picker = ui::file_picker("./"); let root = find_root(None).unwrap_or_else(|| PathBuf::from("./"));
let picker = ui::file_picker(root);
cx.push_layer(Box::new(picker)); cx.push_layer(Box::new(picker));
} }

@ -79,10 +79,9 @@ pub fn regex_prompt(
) )
} }
pub fn file_picker(root: &str) -> Picker<PathBuf> { pub fn file_picker(root: PathBuf) -> Picker<PathBuf> {
use ignore::Walk; use ignore::Walk;
// TODO: determine root based on git root let files = Walk::new(root.clone()).filter_map(|entry| match entry {
let files = Walk::new(root).filter_map(|entry| match entry {
Ok(entry) => { Ok(entry) => {
// filter dirs, but we might need special handling for symlinks! // filter dirs, but we might need special handling for symlinks!
if !entry.file_type().unwrap().is_dir() { if !entry.file_type().unwrap().is_dir() {
@ -96,12 +95,11 @@ pub fn file_picker(root: &str) -> Picker<PathBuf> {
const MAX: usize = 1024; const MAX: usize = 1024;
use helix_view::Editor;
Picker::new( Picker::new(
files.take(MAX).collect(), files.take(MAX).collect(),
|path: &PathBuf| { move |path: &PathBuf| {
// format_fn // format_fn
path.strip_prefix("./").unwrap().to_str().unwrap().into() path.strip_prefix(&root).unwrap().to_str().unwrap().into()
}, },
move |editor: &mut Editor, path: &PathBuf, action| { move |editor: &mut Editor, path: &PathBuf, action| {
let document_id = editor let document_id = editor

Loading…
Cancel
Save