History

feat: add `gix status --untracked` flag

This allows to control how untracked files are folded, but also can completely turn dirwalking off.

GPT 5.5 committed 4 months ago

Commit 9316ff81 parent d8aeaac3 files · +30 −2Browse files

Unified · Split

3 files
  1. gitoxide-core/src/repository/status.rs +8 −2
  2. src/plumbing/main.rs +8 −0
  3. src/plumbing/options/mod.rs +14 −0
gitoxide-core/src/repository/status.rs+8−2
@@ -41,6 +41,7 @@ pub struct Options { · 40 unmodified lines
4141 pub statistics: bool,
4242 pub allow_write: bool,
4343 pub index_worktree_renames: Option<f32>,
44+ pub untracked: Option<gix::status::UntrackedFiles>,
4445 }
4546
4647 pub fn show(
@@ -58,6 +59,7 @@ pub fn show( · 11 unmodified lines
5859 allow_write,
5960 statistics,
6061 index_worktree_renames,
62+ untracked,
6163 }: Options,
6264 ) -> anyhow::Result<()> {
6365 if output_format != OutputFormat::Human {
@@ -70,9 +72,13 @@ pub fn show( · 6 unmodified lines
7072 let start = std::time::Instant::now();
7173 let prefix = repo.prefix()?.unwrap_or(Path::new(""));
7274 let index_progress = progress.add_child("traverse index");
73− let mut iter = repo
75+ let mut status = repo
7476 .status(index_progress)?
75− .should_interrupt_shared(&gix::interrupt::IS_INTERRUPTED)
77+ .should_interrupt_shared(&gix::interrupt::IS_INTERRUPTED);
78+ if let Some(untracked) = untracked {
79+ status = status.untracked_files(untracked);
80+ }
81+ let mut iter = status
7682 .index_worktree_options_mut(|opts| {
7783 if let Some((opts, ignored)) = opts.dirwalk_options.as_mut().zip(ignored) {
7884 opts.set_emit_ignored(Some(match ignored {
src/plumbing/main.rs+8−0
@@ -390,6 +390,7 @@ pub fn main() -> Result<()> { · 389 unmodified lines
390390 ),
391391 Subcommands::Status(crate::plumbing::options::status::Platform {
392392 ignored,
393+ untracked,
393394 format: status_format,
394395 statistics,
395396 submodules,
@@ -428,6 +429,13 @@ pub fn main() -> Result<()> { · 32 unmodified lines
428429 core::repository::status::Ignored::Collapsed
429430 }
430431 }),
432+ untracked: untracked.map(|mode| match mode.unwrap_or_default() {
433+ crate::plumbing::options::status::Untracked::No => gix::status::UntrackedFiles::None,
434+ crate::plumbing::options::status::Untracked::Normal => {
435+ gix::status::UntrackedFiles::Collapsed
436+ }
437+ crate::plumbing::options::status::Untracked::All => gix::status::UntrackedFiles::Files,
438+ }),
431439 output_format: format,
432440 statistics,
433441 thread_limit: thread_limit.or(cfg!(target_os = "macos").then_some(3)), // TODO: make this a configurable when in `gix`, this seems to be optimal on MacOS, linux scales though! MacOS also scales if reading a lot of files for refresh index
src/plumbing/options/mod.rs+14−0
@@ -290,6 +290,17 @@ pub mod status { · 289 unmodified lines
290290 // allowing to ignore directories, naturally traversing the entire content.
291291 }
292292
293+ #[derive(Default, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
294+ pub enum Untracked {
295+ /// Do not show untracked files.
296+ No,
297+ /// Collapse untracked directories when possible.
298+ Normal,
299+ /// Show individual untracked files.
300+ #[default]
301+ All,
302+ }
303+
293304 #[derive(Default, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
294305 pub enum Format {
295306 /// A basic format that is easy to read, and useful for a first glimpse as flat list.
@@ -308,6 +319,9 @@ pub mod status { · 12 unmodified lines
308319 /// If enabled, show ignored files and directories.
309320 #[clap(long)]
310321 pub ignored: Option<Option<Ignored>>,
322+ /// Define how to show untracked files. If set without a value, show all individual untracked files.
323+ #[clap(long, short = 'u', require_equals = true)]
324+ pub untracked: Option<Option<Untracked>>,
311325 /// Define how to display the submodule status. Defaults to git configuration if unset.
312326 #[clap(long)]
313327 pub submodules: Option<Submodules>,