extrawurst / gitui

Blazing 💥 fast terminal-ui for git written in rust 🦀
MIT License
18.2k stars 553 forks source link

Stashing tab shows not staged/ not tracked files in view #2263

Open ondrej-ivanko opened 3 months ago

ondrej-ivanko commented 3 months ago

Hi,

I'm not sure it's even a bug.

When I was doing stashing in Stash[4] tab, you can switch what to stash by toggling staged/untracked files with keys i/u respectively.

At first I thought it's noop, since there was no visual indication or cue that anything changed. It works as it should by omitting untracked or staged files when toggling with respective keys.

I figured out that it behaves correctly without any obvious clue only by accident. I had a single untracked directory with different user. The directory had root user and I couldn't stash it cause of permissions. Than the window popped up showing when I was attempting to stash with stashing configuration {StashUntracked: true, ...}. When pressing u, the config changed and I could stash only tracked files as expected.

To Reproduce Create staged or untracked files with elevated permission like root in project folder. Notice error, than press u or i and see it stashes as expected.

Expected behavior I expect to have visual cue for what will be stashed. It should be reflected in the file tree view upon pressing i/u keys.

Screenshots Screenshot from 2024-06-10 11-21-16 The below screenshot actually show correct behavious, as there's nothing to stash, but files are still listed in file tree view Screenshot from 2024-06-10 11-21-30

Context (please complete the following information):

extrawurst commented 2 months ago

i am confused. could you define an example case with some bash setting the files up in a way that the problem can be reproduced?

ondrej-ivanko commented 2 months ago

Hi, I am truly sorry. I only recently noticed that small box Options in the top right corner on tab 4 indicating which files I have selected for stashing. I just couldn't notice it :)) Therefore I thought there is no indication what is actually being stashed.

What I was hoping to see in the future is visual cue in form of filenames, that will be stashed. For example Screenshot from 2024-06-29 20-06-36

The file1.txt is being tracked, the other two files are not. I would think the screen would show only file1.txt, since the options is set to not stash untracked files.

Screenshot from 2024-06-29 20-06-45

In this case no files are currently staged. And the options is set to not stash staged files (keep index). Therefore I would expect not to see any filenames.

So it's actually not a bug as I found out, but maybe a possible feature! :))

kanielrkirby commented 2 months ago

So currently, as I understand it, it seems that these options aren't used yet for a visual representation, but are used for a functional purpose. e.g., if you toggle untracked off (u), and write a stash (w), untracked files aren't added to the stash.

https://github.com/extrawurst/gitui/blob/6ec7eea02b201fc39fbecdbb787d46cdca22624a/src/tabs/stashing.rs#L71-L80

https://github.com/extrawurst/gitui/blob/6ec7eea02b201fc39fbecdbb787d46cdca22624a/asyncgit/src/sync/stash.rs#L100-L125

A couple ideas from me would be 1, we could add an identifier (?) to files that aren't tracked, and 2, we implement options for the the visual side (which looks straightforward as far as I can tell). I think it'd look something like this:

///
pub fn update(&mut self) -> Result<()> {
if self.is_visible() {
    let status_type = if self.options.keep_index { StatusType::Both } else { StatusType::WorkingDir };
    let show_untracked = if self.options.stash_untracked { Some(ShowUntrackedFilesConfig::All) } else { Some(ShowUntrackedFilesConfig::No) };
    self.git_status
    //TODO: support options
        .fetch(&StatusParams::new(status_type, show_untracked))?;
    }

    Ok(())
}

I've made a PR with that second change at the least (without the identifier idea).