-
-
Notifications
You must be signed in to change notification settings - Fork 398
rename-tracking for gix-status #1306
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ac926a1 to
4e0feff
Compare
db23c78 to
24edf36
Compare
That way, the constructor becaomes more versatile as the user can chose to pass attribute stacks that have more functionality, and thus can be used in more places.
Previously, the source was entirely missing, now it's also made available. Further, all the cloning of these resources is now left to the user, which should safe time.
d5ec06b to
f01cf70
Compare
2e5c255 to
34db78d
Compare
We also move the `IndexPersistedOrInMemory` type to the `worktree` module as its more widely useful.
Previously, it would not allow to enter the repository, making a walk impossible.
That way it's possible to obtain submodule status information, with enough information to implement `git status`-like commands.
The simplest way to learn if the repository is dirty or not.
…x using `commit::describe::Resolution::format_with_dirty_suffix()`
That way a suffix will be added depending on the dirty-state of the repository.
This is a submodule-centric and greatly simplified way of obtaining describe information with dirty-suffix. Note that `status` information is also possible, but it seems hard to display nicely, which this command isn't great at in the first place.
It's a good way to compare the time it takes to run a full status compared to a quick is-dirty check.
Otherwise users might not have too much delay until an interrupt is possible, wasting a lot of time.
Submodule changes are now picked up as long as the submodule is in the index. Further, it's possible to enable rename-tracking between index and worktree separately.
This enables rename-tracking between worktree and index, something that Git also doesn't do or doesn't do by default. It is, however, available in `git2`.
This increases the compatibility when using a patched-in version of gix in other crates.
That way it's possible to more easily and straight-forwardly understand the status of an entry, comparing index to worktree.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Based on #1301
diff-correctness →
gix-status→ gix resetImprove
gix statusto the point where it's suitable for use inresetfunctinoality.Leads to a proper worktree reset implementation, eventually leading to a high-level reset similar to how git supports it.
Architecture
The reason this PR deals quite a bit with
gix statusis that for a safe implementation ofreset()we need to be sure that the files we would want to touch don't don't carry modifications or are untracked files. In order to know what would need to be done, we have to diff thecurrent-index with target-index. The set of files to touch can then be used to lookup information provided bygit-status, like worktree modifications, index modifications, and untracked files, to know if we can proceed or not. Here is also where the reset-modes would affect the outcome, i.e. what to change and how.This is a very modular approach which facilitates testing and understanding of what otherwise would be a very complex algorithm. Having a set of changes as output also allows to one day parallelize applying these changes.
This leaves us in a situation where the current
checkout()implementation wants to become a fastpath for situations where the reset involves an empty tree as source (i.e. create everything and overwrite local changes).On the way to
reset()it's a valid choice to warm up more with the matter by improving on the currentgix statusimplementation and assure correctness of what's there, which currently doesn't seem to be the case in comparison. Further, implementinggix statussimilarly togit statusshould be made possible.Tasks
gix-statuscrateSubmodule::status()that uses the new iterator and respectssubmodule::config::Ignoregix-statusintogixas is, without tree->index diffs, as iterator and with submodule modificationsis_dirty()functionality, also fordescribe(), making use of auto-interrupt on iter dropgix commit describewith is-dirty supportdirty-suffixsupport togix submodules, more expensive, but more detailed.gix is-clean- fail if it's dirtygix statusstatus.showUntrackedFilesgit status --porcelain=2, particularly for submodules (seems less important now, let's mention it with a 'not implemented error and format flag)main)Next PR
diff tree with index (with reverse-diff functionality to simulate diff of index with tree), for better performance as it
would avoid having to allocate a whole index even though we are only interested in a diff.
Status Enables
gitoxidebackend Byron/built#1Next PR: Reset
reset()that checks if it's allowed to perform a worktree modification is allowed, or if an entry should be skipped. That way we can postpone safety checks like --hardPostponed
What follows is important for resets, but won't be needed for
cargoworktree resets.gix index entriesto optionally expand sparse entriesgix statuswith actual submodule support - needsstatusingix(crate) effectivelygix statuswith actual conflict supportResearch
gix statuscan deal a little better with submodules. Even though in this case a lot of submodule-related information is needed for a complete reset, probably only doable by a higher-level caller which orchestrates it.mergeandkeep? How to controlrefresh? Maybe partial (only the files we touch), and full, to also update the files we don't touch as part of status? Maybe it's part of status if that is run before.git resetandgit checkoutin terms ofHEADmodifications. With the former changingHEADs referent, and the latter changingHEADitself.checkout()method as technically that's areset --hardwith optional overwrite check. Could it be rolled into one, with pathspec support added?reset()performs just as well, which is unlikely as there is more overhead. But maybe it's not worth to maintain two versions over it. But if so, one should probably rename it.git status: what about rename tracking? It's available for tree-diffs and quite complex on its own. Probably only needs HEAD-vs-index rename tracking. No, also can have worktree rename tracking, even though it's hard to imagine how this can be fast unless it's tightly integrated with untracked-files handling. This screams for a generalization of the tracking code though as the testing and implementation is complex, but should be generalisable.Re-learn
pathspecsnormalize themselves to turn from any kind of specification into repo-root relative patterns...and that root will be always be used to open files like../.gitignore, which is useful for display to the user)