mirror of
https://github.com/awfixers-stuff/src.git
synced 2026-03-23 11:05:59 +00:00
Delete crate-status.md
Signed-off-by: awfixer <103541351+awfixer@users.noreply.github.com>
This commit is contained in:
920
crate-status.md
920
crate-status.md
@@ -1,920 +0,0 @@
|
||||
### gitoxide
|
||||
|
||||
**src** is a command-line interface (*CLI*) to access git repositories in various ways best described as low-level
|
||||
for use by experts or those validating functionality in real-world scenarios. Performance and efficiency are staples
|
||||
of the implementation.
|
||||
|
||||
**ein** is reserved for one-off tools that are useful to many, and will one day implement a truly unique workflow
|
||||
with the potential to become the preferred way to interact with git repositories.
|
||||
|
||||
Please note that all functionality comes from the `gitoxide-core` library, which mirrors these capabilities
|
||||
and itself relies on all `src-*` crates. It's not meant for consumption, for application development, please use `src`.
|
||||
|
||||
* **the `ein` program** - convenient and for humans
|
||||
* [x] **init** - initialize a new non-bare repository with a `main` branch
|
||||
* [ ] **clone** - initialize a local copy of a remote repository
|
||||
* **tools**
|
||||
* [x] **organize** - find all git repositories and place them in directories according to their remote paths
|
||||
* [x] **find** - find all git repositories in a given directory - useful for tools like [skim][skim]
|
||||
* [x] **estimate-hours** - estimate the time invested into a repository by evaluating commit dates.
|
||||
* Based on the [git-hours] algorithm.
|
||||
* See the [discussion][git-hours-discussion] for some performance data.
|
||||
* **the `src` program** _(plumbing)_ - lower level commands for use during development
|
||||
- As its main purpose is to help running the latest improvements in the real world, it's self-documenting without
|
||||
duplicating its features here. Use `src --help` to start discovery.
|
||||
|
||||
[skim]: https://github.com/lotabout/skim
|
||||
[git-hours]: https://github.com/kimmobrunfeldt/git-hours/blob/8aaeee237cb9d9028e7a2592a25ad8468b1f45e4/index.js#L114-L143
|
||||
[git-hours-discussion]: https://github.com/GitoxideLabs/gitoxide/discussions/78
|
||||
|
||||
### src
|
||||
|
||||
The top-level crate that acts as hub to all functionality provided by the `src-*` plumbing crates.
|
||||
|
||||
* [x] utilities for applications to make long running operations interruptible gracefully and to support timeouts in servers.
|
||||
* [x] handle `core.repositoryFormatVersion` and extensions
|
||||
* [x] support for unicode-precomposition of command-line arguments (needs explicit use in parent application)
|
||||
* [ ] strict object creation (validate objects referenced by newly created objects exist)
|
||||
* [ ] strict hash verification (validate that objects actually have the hashes they claim to have)
|
||||
* **Repository**
|
||||
* [x] discovery
|
||||
* [x] option to not cross file systems (default)
|
||||
* [x] handle git-common-dir
|
||||
* [x] support for `GIT_CEILING_DIRECTORIES` environment variable
|
||||
* [ ] handle other non-discovery modes and provide control over environment variable usage required in applications
|
||||
* [x] rev-parse
|
||||
- [ ] handle relative paths as relative to working directory
|
||||
- [x] handle `upstream` and `push` resolution.
|
||||
* [x] rev-walk
|
||||
* [x] include tips
|
||||
* [ ] exclude commits
|
||||
* [x] instantiation
|
||||
* [x] access to refs and objects
|
||||
* [x] create a pathspec-search from a set of strings
|
||||
- [ ] allow to construct Pathspecs using data structure instead of enforcing them to be passed as strings.
|
||||
* **credentials**
|
||||
* [x] run `git credential` directly
|
||||
* [x] use credential helper configuration and to obtain credentials with `src_credentials::helper::Cascade`
|
||||
* **traverse**
|
||||
* [x] commit graphs
|
||||
* [ ] make [git-notes](https://git-scm.com/docs/git-notes) accessible
|
||||
* [x] tree entries
|
||||
* **diffs/changes**
|
||||
* [x] tree with other tree
|
||||
* [x] respect case-sensitivity of host filesystem.
|
||||
* [x] a way to access various diff related settings or use them
|
||||
* [x] respect `diff.*.textconv`, `diff.*.cachetextconv` and external diff viewers with `diff.*.command`,
|
||||
[along with support for reading `diff` gitattributes](https://github.com/git/git/blob/73876f4861cd3d187a4682290ab75c9dccadbc56/Documentation/gitattributes.txt#L699:L699).
|
||||
* **rewrite tracking**
|
||||
* **deviation** - git keeps up to four candidates whereas we use the first-found candidate that matches the similarity percentage.
|
||||
This can lead to different sources being found. As such, we also don't consider the filename at all.
|
||||
* [x] handle binary files correctly, and apply filters for that matter
|
||||
* [x] computation limit with observable reduction of precision when it is hit, for copies and renames separately
|
||||
* **by identity**
|
||||
* [x] renames (sym-links are only ever compared by identity)
|
||||
* [x] copies
|
||||
* **by similarity** - similarity factor controllable separately from renames
|
||||
* [x] renames
|
||||
* [x] copies
|
||||
* [x] 'find-copies-harder' - find copies with the source being the entire tree.
|
||||
* [x] tree or index with working tree
|
||||
- [x] rename tracking
|
||||
- [x] submodule status (recursive)
|
||||
* [x] diffs between modified blobs with various algorithms
|
||||
* [ ] tree with index (via index-from-tree and index)
|
||||
- [ ] rename tracking
|
||||
- [ ] submodule status (recursive)
|
||||
* [x] initialize
|
||||
* [x] Proper configuration depending on platform (e.g. ignorecase, filemode, …)
|
||||
* **Id**
|
||||
* [x] short hashes with detection of ambiguity.
|
||||
* **Commit**
|
||||
* [x] `git describe` like functionality, with optional commit-graph acceleration
|
||||
* [x] create new commit from tree
|
||||
* **Objects**
|
||||
* [x] lookup
|
||||
* [x] peel to object kind
|
||||
* [ ] create [signed commits and tags](https://github.com/GitoxideLabs/gitoxide/issues/12)
|
||||
* **trees**
|
||||
* [x] lookup path
|
||||
* [x] edit
|
||||
* **references**
|
||||
* [x] peel to end
|
||||
* [x] ref-log access
|
||||
* [x] remote name
|
||||
* [x] find remote itself
|
||||
- [ ] respect `branch.<name>.merge` in the returned remote.
|
||||
* **remotes**
|
||||
* [x] clone
|
||||
* [x] shallow
|
||||
* [ ] include-tags when shallow is used (needs separate fetch)
|
||||
* [ ] prune non-existing shallow commits
|
||||
* [ ] [bundles](https://git-scm.com/docs/git-bundle)
|
||||
* [x] fetch
|
||||
* [x] shallow (remains shallow, options to adjust shallow boundary)
|
||||
* [ ] a way to auto-explode small packs to avoid them to pile up
|
||||
* [x] 'ref-in-want'
|
||||
* [ ] 'wanted-ref'
|
||||
* [x] standard negotiation algorithms `consecutive`, `skipping` and `noop`.
|
||||
* [ ] push
|
||||
* [x] ls-refs
|
||||
* [x] ls-refs with ref-spec filter
|
||||
* [x] list, find by name
|
||||
* [x] create in memory
|
||||
* [ ] groups
|
||||
* [ ] [remote and branch files](https://github.com/git/git/blob/master/remote.c#L300)
|
||||
* [ ] execute hooks
|
||||
* **refs**
|
||||
* [ ] run transaction hooks and handle special repository states like quarantine
|
||||
* [ ] support for different backends like `files` and `reftable`
|
||||
* **main or linked worktree**
|
||||
* [ ] add files with `.gitignore` handling
|
||||
* [ ] checkout with conversions like clean + smudge as in `.gitattributes`
|
||||
* [ ] _diff_ index with working tree
|
||||
* [ ] sparse checkout support
|
||||
* [x] read per-worktree config if `extensions.worktreeConfig` is enabled.
|
||||
* **index**
|
||||
* [ ] tree from index
|
||||
* [x] index from tree
|
||||
* **worktrees**
|
||||
* [x] open a repository with worktrees
|
||||
* [x] read locked state
|
||||
* [ ] obtain 'prunable' information
|
||||
* [x] proper handling of worktree related refs
|
||||
* [x] create a byte stream and create archives for such a stream, including worktree filters and conversions
|
||||
* [ ] create, move, remove, and repair
|
||||
* [x] access exclude information
|
||||
* [x] access attribute information
|
||||
* [x] respect `core.worktree` configuration
|
||||
- **deviation**
|
||||
* The delicate interplay between `GIT_COMMON_DIR` and `GIT_WORK_TREE` isn't implemented.
|
||||
* **config**
|
||||
* [x] read the primitive types `boolean`, `integer`, `string`
|
||||
* [x] read and interpolate trusted paths
|
||||
* [x] low-level API for more elaborate access to all details of `git-config` files
|
||||
* [ ] a way to make changes to individual configuration files in memory
|
||||
* [ ] write configuration back
|
||||
* [ ] auto-refresh configuration values after they changed on disk
|
||||
* [ ] facilities to apply the [url-match](https://git-scm.com/docs/git-config#Documentation/git-config.txt-httplturlgt) algorithm and to [normalize urls](https://github.com/git/git/blob/be1a02a17ede4082a86dfbfee0f54f345e8b43ac/urlmatch.c#L109:L109) before comparison.
|
||||
* [x] mailmap
|
||||
* [x] object replacements (`git replace`)
|
||||
* [x] read git configuration
|
||||
* [ ] merging
|
||||
* [ ] stashing
|
||||
* [ ] Use _Commit Graph_ to speed up certain queries
|
||||
* [ ] subtree
|
||||
* [ ] interactive rebase status/manipulation
|
||||
* **submodules**
|
||||
* [x] handle 'old' form for reading and detect old form
|
||||
* [x] list
|
||||
* [ ] edit
|
||||
* [ ] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-actor
|
||||
* [x] read and write a signature that uniquely identifies an actor within a git repository
|
||||
* [x] a way to parse `name <email>` tuples (instead of full signatures) to facilitate parsing
|
||||
commit trailers.
|
||||
* [x] a way to write only actors, useful for commit trailers.
|
||||
|
||||
### src-hash
|
||||
* types to represent hash digests to identify git objects.
|
||||
* used to abstract over different kinds of hashes, like SHA1 and the upcoming SHA256
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-chunk
|
||||
* [x] decode the chunk file table of contents and provide convenient API
|
||||
* [x] write the table of contents
|
||||
|
||||
### src-hashtable
|
||||
* [x] hashmap
|
||||
* [x] hashset
|
||||
|
||||
### src-utils
|
||||
* **filesystem**
|
||||
* [x] probe capabilities
|
||||
* [x] symlink creation and removal
|
||||
* [x] file snapshots
|
||||
* [ ] **BString Interner with Arena-Backing and arbitrary value association**
|
||||
- probably based on [`internment`](https://docs.rs/internment/latest/internment/struct.Arena.html#),
|
||||
but needs `bumpalo` support to avoid item allocations/boxing, and avoid internal `Mutex`. (key type is pointer based).
|
||||
|
||||
### src-fs
|
||||
* [x] probe capabilities
|
||||
* [x] symlink creation and removal
|
||||
* [x] file snapshots
|
||||
* [x] stack abstraction
|
||||
|
||||
### src-object
|
||||
* *decode (zero-copy)* borrowed objects
|
||||
* [x] commit
|
||||
* [ ] parse [trailers](https://git-scm.com/docs/git-interpret-trailers#_description)
|
||||
* [x] tree
|
||||
* encode owned objects
|
||||
* [x] commit
|
||||
* [x] tree
|
||||
* [x] tag
|
||||
* [x] [name validation][tagname-validation]
|
||||
* [x] transform borrowed to owned objects
|
||||
* [x] edit trees efficiently and write changes back
|
||||
- [ ] See if `src-fs::InternedMap` improves performance.
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-pack
|
||||
* **packs**
|
||||
* [x] traverse pack index
|
||||
* [x] 'object' abstraction
|
||||
* [x] decode (zero copy)
|
||||
* [x] verify checksum
|
||||
* [x] simple and fast pack traversal
|
||||
* [x] decode
|
||||
* [x] full objects
|
||||
* [x] deltified objects
|
||||
* **decode**
|
||||
* _decode a pack from `Read` input_
|
||||
* [x] Add support for zlib-ng for 20% faster _decompression_ performance
|
||||
* [x] `Read` to `Iterator` of entries
|
||||
* _read as is, verify hash, and restore partial packs_
|
||||
* [x] create index from pack alone (_much faster than git_)
|
||||
* [x] resolve 'thin' packs
|
||||
* **encode**
|
||||
* [x] Add support for zlib-ng for 2.5x _compression_ performance
|
||||
* [x] objects to entries iterator
|
||||
* [x] input objects as-is
|
||||
* [x] pack only changed objects as derived from input
|
||||
* [x] base object compression
|
||||
* [ ] delta compression
|
||||
* [ ] respect the `delta=false` attribute
|
||||
* [x] create 'thin' pack, i.e. deltas that are based on objects the other side has.
|
||||
* [x] parallel implementation that scales perfectly
|
||||
* [x] entries to pack data iterator
|
||||
* [ ] write index along with the new pack
|
||||
* [x] **verify** pack with statistics
|
||||
* [x] brute force - less memory
|
||||
* [x] indexed - optimal speed, but more memory
|
||||
* **advanced**
|
||||
* [x] Multi-Pack index file (MIDX)
|
||||
* [x] read
|
||||
* [x] write
|
||||
* [x] verify
|
||||
* [ ] 'bitmap' file
|
||||
* [ ] [special handling for networked packs](https://github.com/git/git/blob/89b43f80a514aee58b662ad606e6352e03eaeee4/packfile.c#L949:L949)
|
||||
* [ ] [detect and retry packed object reading](https://github.com/git/git/blob/89b43f80a514aee58b662ad606e6352e03eaeee4/packfile.c#L1268:L1268)
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-odb
|
||||
* **loose object store**
|
||||
* [x] traverse
|
||||
* [x] read
|
||||
* [x] into memory
|
||||
* [x] streaming
|
||||
* [x] verify checksum
|
||||
* [x] streaming write for blobs
|
||||
* [x] buffer write for small in-memory objects/non-blobs to bring IO down to open-read-close == 3 syscalls
|
||||
* [ ] read object header (size + kind) without full decompression
|
||||
* **dynamic store**
|
||||
* [x] auto-refresh of on-disk state
|
||||
* [x] handles alternates
|
||||
* [x] multi-pack indices
|
||||
* [x] perfect scaling with cores
|
||||
* [x] support for pack caches, object caches and MRU for best per-thread performance.
|
||||
* [x] prefix/short-id lookup, with optional listing of ambiguous objects.
|
||||
* [x] object replacements (`git replace`)
|
||||
* [x] high-speed packed object traversal without wasted CPU time
|
||||
- [ ] user defined filters
|
||||
* [ ] read object header (size + kind) without full decompression
|
||||
* **sink**
|
||||
* [x] write objects and obtain id
|
||||
* **alternates**
|
||||
* _resolve links between object databases_
|
||||
* [x] safe with cycles and recursive configurations
|
||||
* [x] multi-line with comments and quotes
|
||||
* **promisor**
|
||||
* It's vague, but these seem to be like index files allowing to fetch objects from a server on demand.
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-diff
|
||||
|
||||
Check out the [performance discussion][src-diff-performance] as well.
|
||||
|
||||
* **tree**
|
||||
* [x] changes needed to obtain _other tree_
|
||||
* **blobs**
|
||||
* **patches**
|
||||
* There are various ways to generate a patch from two blobs.
|
||||
* [ ] text
|
||||
* [ ] binary
|
||||
* [ ] `git-apply` compatibility
|
||||
* [ ] merge hunks that are close enough based on line-setting (`interhunk-lines`)
|
||||
* [ ] white-space related settings
|
||||
* **lines**
|
||||
* [x] Simple line-by-line diffs powered by the `imara-diff` crate.
|
||||
* **generic rename tracker to find renames and copies**
|
||||
* [x] find blobs by exact match
|
||||
* [x] find blobs by similarity check
|
||||
* [ ] heuristics to find best candidate
|
||||
* [ ] find by basename to support similarity check
|
||||
- Not having it can lead to issues when files with the same or similar content are part of a move
|
||||
as files can be lost that way.
|
||||
* [x] directory tracking
|
||||
- [x] by identity
|
||||
- [ ] by similarity
|
||||
* **blob**
|
||||
* [x] a choice of to-worktree, to-git and to-worktree-if-needed conversions
|
||||
* [x] `textconv` filters
|
||||
* [x] special handling of files beyond the big-file threshold.
|
||||
* [x] detection of binary files by looking at header (first 8k bytes)
|
||||
* [x] caching of diff-able data
|
||||
* [x] prepare invocation of external diff program
|
||||
- [ ] pass meta-info
|
||||
* [ ] working with hunks of data
|
||||
* [ ] diff-heuristics match Git perfectly
|
||||
* [x] API documentation
|
||||
* [ ] Examples
|
||||
|
||||
[src-diff-performance]: https://github.com/GitoxideLabs/gitoxide/discussions/74
|
||||
|
||||
### src-merge
|
||||
|
||||
* [x] three-way content-merge analysis of **blobs** with choice of how to resolve conflicts
|
||||
- [x] respect git attributes and drivers.
|
||||
- [ ] choose how to resolve conflicts on the data-structure
|
||||
- [ ] more efficient handling of paths with `merge=binary` attributes (do not load them into memory)
|
||||
- [x] produce a new blob based on data-structure containing possible resolutions
|
||||
- [x] `merge` style
|
||||
- [x] `diff3` style
|
||||
- [x] `zdiff` style
|
||||
- [ ] various newlines-related options during the merge (see https://git-scm.com/docs/git-merge#Documentation/git-merge.txt-ignore-space-change).
|
||||
- [ ] a way to control inter-hunk merging based on proximity (maybe via `src-diff` feature which could use the same)
|
||||
* [x] **tree**-diff-heuristics match Git for its test-cases
|
||||
- [x] a way to generate an index with stages, mostly conforming with Git.
|
||||
- [ ] resolve to be *ours* or the *ancestors* version of the tree.
|
||||
- [ ] submodule merges (*right now they count as conflicts if they differ*)
|
||||
- [ ] assure sparse indices are handled correctly during application - right now we refuse.
|
||||
- [ ] rewrite so that the whole logic can be proven to be correct - it's too insane now and probably has way
|
||||
more possible states than are tested, despite best attempts.
|
||||
* [x] **commits** - with handling of multiple merge bases by recursive merge-base merge
|
||||
* [x] API documentation
|
||||
* [ ] Examples
|
||||
|
||||
### src-blame
|
||||
|
||||
* [x] commit-annotations for a single file
|
||||
- [ ] progress
|
||||
- [ ] interruptibility
|
||||
- [ ] streaming
|
||||
- [ ] support for worktree changes (creates virtual commit on top of `HEAD`)
|
||||
- [ ] shallow-history support
|
||||
- [ ] rename tracking (track different paths through history)
|
||||
- [ ] commits to ignore
|
||||
- [ ] pass all blame-cornercases (from Git)
|
||||
* **Performance-Improvements**
|
||||
* Without the following the performance isn't competitive with Git.
|
||||
1. Implement custom graph walk which won't run down parents that don't have the path in question.
|
||||
2. Implement access of trees from commit-graph and fill that information into the traversal info by default.
|
||||
3. commit-graph with bloom filter, used to quickly check if a commit has a path.
|
||||
* [x] API documentation
|
||||
* [ ] Examples
|
||||
|
||||
### src-traverse
|
||||
|
||||
Check out the [performance discussion][src-traverse-performance] as well.
|
||||
|
||||
* **trees**
|
||||
* [x] nested traversal
|
||||
* **commits**
|
||||
* [x] ancestor graph traversal similar to `git revlog`
|
||||
* [ ] `commitgraph` support
|
||||
* [x] API documentation
|
||||
* [ ] Examples
|
||||
|
||||
[src-traverse-performance]: https://github.com/GitoxideLabs/gitoxide/discussions/76
|
||||
|
||||
### src-shallow
|
||||
|
||||
A utility crate with types and functionality related to shallow-file handling.
|
||||
|
||||
### src-url
|
||||
* As documented here: https://www.git-scm.com/docs/git-clone#_git_urls
|
||||
* **parse**
|
||||
* [x] ssh URLs and SCP like syntax
|
||||
* [x] file, git, and SSH
|
||||
* [x] paths (OS paths, without need for UTF-8)
|
||||
* [x] username expansion for ssh and git urls
|
||||
* [x] convert URL to string
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-packetline
|
||||
* [PKT-Line](https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt#L52:L52)
|
||||
* [x] encode
|
||||
* [x] decode (zero-copy)
|
||||
* [x] [error line](https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L28:L28)
|
||||
* [x] [V2 additions](https://github.com/git/git/blob/master/Documentation/technical/protocol-v2.txt#L35:L36)
|
||||
* [x] [sideband mode](https://github.com/git/git/blob/master/Documentation/technical/pack-protocol.txt#L467:L467)
|
||||
* [x] `Read` from packet line with (optional) progress support via sidebands
|
||||
* [x] `Write` with built-in packet line encoding
|
||||
* [x] `async` support
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-transport
|
||||
* No matter what we do here, timeouts must be supported to prevent hanging forever and to make interrupts destructor-safe.
|
||||
* **client**
|
||||
* [x] general purpose `connect(…)` for clients
|
||||
* [x] _file://_ launches service application
|
||||
* [x] _ssh://_ launches service application in a remote shell using _ssh_
|
||||
* [x] _git://_ establishes a tcp connection to a git daemon
|
||||
* [x] _http(s)://_ establishes connections to web server
|
||||
* [x] via `curl` (blocking only)
|
||||
* [x] via `reqwest` (blocking only)
|
||||
* [ ] pass context for scheme specific configuration, like timeouts
|
||||
* [x] git://<service>
|
||||
* [x] V1 handshake
|
||||
* [x] send values + receive data with sidebands
|
||||
* [ ] ~~support for receiving 'shallow' refs in case the remote repository is shallow itself (I presume)~~
|
||||
* Since V2 doesn't seem to support that, let's skip this until there is an actual need. No completionist :D
|
||||
* [x] V2 handshake
|
||||
* [x] send command request, receive response with sideband support
|
||||
* [x] http(s)://<service>
|
||||
* [x] set identity for basic authentication
|
||||
* [x] V1 handshake
|
||||
* [x] send values + receive data with sidebands
|
||||
* [x] V2 handshake
|
||||
* [x] send command request, receive response with sideband support
|
||||
* [ ] ~~'dumb'~~ - _we opt out using this protocol seems too slow to be useful, unless it downloads entire packs for clones?_
|
||||
* [x] authentication failures are communicated by io::ErrorKind::PermissionDenied, allowing other layers to retry with authentication
|
||||
* [x] `async` support
|
||||
* **server**
|
||||
* [ ] general purpose `accept(…)` for servers
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
#### Advanced HTTP transport features
|
||||
|
||||
| **feature** | **curl** | **reqwest** |
|
||||
|-------------|----------|-------------|
|
||||
| 01 | | |
|
||||
| 02 | X | |
|
||||
| 03 | | X |
|
||||
| 04 | X | |
|
||||
| 05 | | |
|
||||
|
||||
* **01** -> async
|
||||
* **02** -> proxy support
|
||||
* **03** -> custom request configuration via fn(request)
|
||||
* **04** -> proxy authentication
|
||||
* **05** -> [reauthentication after redirect](https://github.com/git/git/blob/eea7033409a0ed713c78437fc76486983d211e25/http.c#L1931)
|
||||
|
||||
### src-protocol
|
||||
* _abstract over protocol versions to allow delegates to deal only with a single way of doing things_
|
||||
* [x] **credentials**
|
||||
* [x] via src-credentials
|
||||
* [ ] via pure Rust implementation if no git is installed
|
||||
* [x] handshake
|
||||
* parse initial response of V1 and V2 servers
|
||||
* [x] ls-refs
|
||||
* [x] parse V1 refs as provided during handshake
|
||||
* [x] parse V2 refs
|
||||
* [ ] handle empty refs, AKA PKT-LINE(zero-id SP "capabilities^{}" NUL capability-list)
|
||||
* [x] fetch
|
||||
* [x] detailed progress
|
||||
* [x] control credentials provider to fill, approve and reject
|
||||
* [x] initialize and validate command arguments and features sanely
|
||||
* [x] abort early for ls-remote capabilities
|
||||
* [x] packfile negotiation
|
||||
* [x] delegate can support for all fetch features, including shallow, deepen, etc.
|
||||
* [x] receive parsed shallow refs
|
||||
* [ ] push
|
||||
* [ ] remote helper protocol and integration
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-attributes
|
||||
* [x] parse `.gitattribute` files
|
||||
* [ ] an attributes stack for matching paths to their attributes, with support for built-in `binary` macro for `-text -diff -merge`
|
||||
|
||||
### src-ignore
|
||||
* [x] parse `.gitignore` files
|
||||
* [x] an attributes stack for checking if paths are excluded
|
||||
|
||||
### src-quote
|
||||
* **ansi-c**
|
||||
* [x] quote
|
||||
* [ ] unquote
|
||||
|
||||
### src-mailmap
|
||||
* [x] parsing
|
||||
* [x] lookup and mapping of author names
|
||||
|
||||
### src-path
|
||||
* [x] transformations to and from bytes
|
||||
* [x] conversions between different platforms
|
||||
* [x] virtual canonicalization for more concise paths via `absolutize()`
|
||||
* [x] more flexible canonicalization with symlink resolution for paths which are partially virtual via `realpath()`
|
||||
* **spec**
|
||||
* [ ] parse
|
||||
* [ ] check for match
|
||||
|
||||
### src-pathspec
|
||||
* [x] parse single
|
||||
* [ ] parse file line by line (with or without quoting, NUL and LF/CRLF line separation) (see `--pathspec-from-file` and `--pathspec-file-nul`)
|
||||
* [x] matching of paths with git-attributes support
|
||||
* [ ] programmatic creation of pathspecs
|
||||
* [ ] `TryIntoPathspec` trait to parse strings or accept ready-made pathspecs as well, for use in APIs
|
||||
|
||||
### src-refspec
|
||||
* [x] parse
|
||||
* [x] matching of references and object names
|
||||
* [x] for fetch
|
||||
* [ ] for push
|
||||
|
||||
### src-command
|
||||
* [x] execute commands directly
|
||||
* [x] execute commands with `sh`
|
||||
* [ ] support for `GIT_EXEC_PATH` environment variable with `src-sec` filter
|
||||
|
||||
### src-prompt
|
||||
* [x] open prompts for usernames for example
|
||||
* [x] secure prompts for password
|
||||
* [x] use `askpass` program if available
|
||||
* [ ] signal handling (resetting and restoring terminal settings)
|
||||
* [ ] windows prompts for `cmd.exe` and mingw terminals
|
||||
|
||||
### src-note
|
||||
|
||||
A mechanism to associate metadata with any object, and keep revisions of it using git itself.
|
||||
|
||||
* [ ] CRUD for git notes
|
||||
|
||||
### src-negotiate
|
||||
* **algorithms**
|
||||
- [x] `noop`
|
||||
- [x] `consecutive`
|
||||
- [x] `skipping`
|
||||
|
||||
### src-fetchhead
|
||||
* [ ] parse `FETCH_HEAD` information back entirely
|
||||
* [ ] write typical fetch-head lines
|
||||
|
||||
### src-discover
|
||||
|
||||
* [x] check if a git directory is a git repository
|
||||
* [x] find a git repository by searching upward
|
||||
* [x] define ceilings that should not be surpassed
|
||||
* [x] prevent crossing file-systems (non-windows only)
|
||||
* [x] handle linked worktrees
|
||||
* [ ] a way to handle `safe.directory`
|
||||
- note that it's less critical to support it as `gitoxide` allows access but prevents untrusted configuration to become effective.
|
||||
|
||||
### src-date
|
||||
* [x] parse git dates
|
||||
* [x] serialize `Time`
|
||||
|
||||
### src-error
|
||||
|
||||
A basic crate for comon error types and utilities, changed as needed to replace `thiserror`.
|
||||
|
||||
### src-credentials
|
||||
* [x] launch git credentials helpers with a given action
|
||||
- [x] built-in `git credential` program
|
||||
- [x] as scripts
|
||||
- [x] as absolute paths to programs with optional arguments
|
||||
- [x] program name with optional arguments, transformed into `git credential-<name>`
|
||||
* [x] `helper::main()` for easy custom credential helper programs written in Rust
|
||||
|
||||
### src-filter
|
||||
|
||||
Provide base-implementations for dealing with smudge and clean filters as well as filter processes, facilitating their development.
|
||||
|
||||
* [ ] clean filter base
|
||||
* [ ] smudge filter base
|
||||
* [ ] filter process base
|
||||
|
||||
### src-sec
|
||||
|
||||
Provides a trust model to share across gitoxide crates. It helps configuring how to interact with external processes, among other things.
|
||||
|
||||
* **integrations**
|
||||
* [x] src-config
|
||||
* [x] src
|
||||
|
||||
### src-rebase
|
||||
* [ ] obtain rebase status
|
||||
* [ ] drive a rebase operation
|
||||
|
||||
### src-sequencer
|
||||
|
||||
Handle human-aided operations which cannot be completed in one command invocation.
|
||||
|
||||
### src-lfs
|
||||
|
||||
Implement git large file support using the process protocol and make it flexible enough to handle a variety of cases.
|
||||
Make it the best-performing implementation and the most convenient one.
|
||||
|
||||
### src-glob
|
||||
* [x] parse pattern
|
||||
* [x] a type for pattern matching of paths and non-paths, optionally case-insensitively.
|
||||
|
||||
### src-status
|
||||
* [x] differences between index and worktree to turn index into worktree
|
||||
- [x] rename tracking
|
||||
- [x] untracked files
|
||||
- [ ] support for fs-monitor for modification checks
|
||||
* [ ] differences between index and index to learn what changed
|
||||
- [ ] rename tracking
|
||||
|
||||
### src-worktree-state
|
||||
* handle the working **tree/checkout**
|
||||
- [x] checkout an index of files, executables and symlinks just as fast as git
|
||||
- [x] forbid symlinks in directories
|
||||
- [ ] handle submodules
|
||||
- [ ] handle sparse directories
|
||||
- [ ] handle sparse index
|
||||
- [x] linear scaling with multi-threading up to IO saturation
|
||||
- supported attributes to affect working tree and index contents
|
||||
- [x] eol
|
||||
- [x] working-tree-encoding
|
||||
- …more
|
||||
- **filtering**
|
||||
- [x] `text`
|
||||
- [x] `ident`
|
||||
- [x] filter processes
|
||||
- [x] single-invocation clean/smudge filters
|
||||
* access to per-path information, like `.gitignore` and `.gitattributes` in a manner well suited for efficient lookups
|
||||
* [x] _exclude_ information
|
||||
* [x] attributes
|
||||
|
||||
### src-worktree
|
||||
* [x] A stack to to efficiently generate attribute lists for matching paths against.
|
||||
|
||||
### src-revision
|
||||
* [x] `describe()` (similar to `git name-rev`)
|
||||
* [x] merge-base
|
||||
* [x] merge-base octopus
|
||||
* parse specifications
|
||||
* [x] parsing and navigation
|
||||
* [x] revision ranges
|
||||
* [ ] full date parsing support (depends on `src-date`)
|
||||
|
||||
### src-revision
|
||||
* [x] primitives to help with graph traversal, along with commit-graph acceleration.
|
||||
|
||||
### src-submodule
|
||||
* [x] read `.gitmodule` files, access all their fields, and apply overrides
|
||||
* [x] check if a submodule is 'active'
|
||||
* [ ] CRUD for submodules
|
||||
* [ ] try to handle with all the nifty interactions and be a little more comfortable than what git offers, lay a foundation for smarter git submodules.
|
||||
|
||||
### src-bitmap
|
||||
|
||||
A plumbing crate with shared functionality regarding EWAH compressed bitmaps, as well as other kinds of bitmap implementations.
|
||||
|
||||
* **EWAH**
|
||||
* `Array` type to read and write bits
|
||||
* [x] execute closure for each `true` bit
|
||||
* [x] decode on-disk representation
|
||||
* [ ] encode on-disk representation
|
||||
|
||||
### src-dir
|
||||
|
||||
A git directory walk.
|
||||
|
||||
* [x] list untracked files
|
||||
* [x] list ignored files
|
||||
* [x] collapsing of untracked and ignored directories
|
||||
* [x] pathspec based filtering
|
||||
* [ ] multi-threaded initialization of icase hash table is always used to accelerate index lookups, even if ignoreCase = false for performance
|
||||
* [ ] special handling of submodules (for now, submodules or nested repositories are detected, but they can't be walked into naturally)
|
||||
* [ ] accelerated walk with `untracked`-cache (as provided by `UNTR` extension of `src_index::File`)
|
||||
|
||||
### src-index
|
||||
|
||||
The git staging area.
|
||||
|
||||
* read
|
||||
* [x] V2 - the default, including long-paths support
|
||||
* [x] V3 - extended flags
|
||||
* [x] V4 - delta-compression for paths
|
||||
* [ ] TODO(perf): multi-threaded implementation should boost performance, spends most time in storing paths, has barely any benefit right now.
|
||||
* optional threading
|
||||
* [x] concurrent loading of index extensions
|
||||
* [x] threaded entry reading
|
||||
* extensions
|
||||
* [x] TREE for speeding up tree generation
|
||||
* [x] REUC resolving undo
|
||||
* [x] UNTR untracked cache
|
||||
* [x] FSMN file system monitor cache V1 and V2
|
||||
* [x] EOIE end of index entry
|
||||
* [x] IEOT index entry offset table
|
||||
* [x] 'link' base indices to take information from, split index
|
||||
* [x] 'sdir' [sparse directory entries](https://github.blog/2021-08-16-highlights-from-git-2-33/) - marker
|
||||
* [x] verification of entries and extensions as well as checksum
|
||||
* [ ] expand sparse directory entries using information of the tree itself
|
||||
* write
|
||||
* [x] V2
|
||||
* [x] V3 - extension bits
|
||||
* [ ] V4
|
||||
* extensions
|
||||
* [x] TREE
|
||||
* [ ] REUC
|
||||
* [ ] UNTR
|
||||
* [ ] FSMN
|
||||
* [x] EOIE
|
||||
* [x] 'sdir'
|
||||
* [ ] 'link'
|
||||
- **note** that we currently **dissolve** any shared index we read so when writing this extension is removed.
|
||||
* `stat` update
|
||||
* [ ] optional threaded `stat` based on thread_cost (aka preload)
|
||||
* [x] handling of `.gitignore` and system file exclude configuration
|
||||
* [x] lookups that ignore the case
|
||||
* [ ] multi-threaded lookup table generation with the same algorithm as the one used by Git
|
||||
* [ ] expand sparse folders (don't know how this relates to traversals right now)
|
||||
* maintain extensions when altering the cache
|
||||
* [ ] TREE for speeding up tree generation
|
||||
* [ ] REUC resolving undo
|
||||
* [ ] UNTR untracked cache
|
||||
* [ ] FSMN file system monitor cache V1 and V2
|
||||
* [ ] EOIE end of index entry
|
||||
* [ ] IEOT index entry offset table
|
||||
* [ ] 'link' base indices to take information from, split index
|
||||
* [ ] 'sdir' sparse directory entries
|
||||
* [ ] add and remove entries
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-commitgraph
|
||||
|
||||
* [x] read-only access
|
||||
* [x] Graph lookup of commit information to obtain timestamps, generation and parents, and extra edges
|
||||
* [ ] [Corrected generation dates](https://github.com/git/git/commit/e8b63005c48696a26f976f5f9b0ccaf1983e439d)
|
||||
* [ ] Bloom filter index
|
||||
* [ ] Bloom filter data
|
||||
* [ ] create and update graphs and graph files
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-tempfile
|
||||
|
||||
See its [README.md](https://github.com/GitoxideLabs/gitoxide/blob/main/src-tempfile/README.md).
|
||||
|
||||
### src-lock
|
||||
|
||||
See its [README.md](https://github.com/GitoxideLabs/gitoxide/blob/main/src-lock/README.md).
|
||||
|
||||
### src-config-value
|
||||
* **parse**
|
||||
* [x] boolean
|
||||
* [x] integer
|
||||
* [x] color
|
||||
* [ ] ANSI code output for terminal colors
|
||||
* [x] path (incl. resolution)
|
||||
* [ ] date
|
||||
* [ ] [permission][https://github.com/git/git/blob/71a8fab31b70c417e8f5b5f716581f89955a7082/setup.c#L1526:L1526]
|
||||
|
||||
### src-config
|
||||
* [x] read
|
||||
* zero-copy parsing with event emission
|
||||
* all config values as per the `src-config-value` crate
|
||||
* **includeIf**
|
||||
* [x] `gitdir`, `gitdir/i`, and `onbranch`
|
||||
* [x] `hasconfig:remote.*.url`
|
||||
* [x] access values and sections by name and sub-section
|
||||
* [x] edit configuration in memory, non-destructively
|
||||
* cross-platform newline handling
|
||||
* [x] write files back for lossless round-trips.
|
||||
* keep comments and whitespace, and only change lines that are affected by actual changes, to allow truly non-destructive editing
|
||||
* [x] cascaded loading of various configuration files into one
|
||||
* [x] load from environment variables
|
||||
* [x] load from well-known sources for global configuration
|
||||
* [x] load repository configuration with all known sources
|
||||
* [x] API documentation
|
||||
* [x] Some examples
|
||||
|
||||
### src-worktree-stream
|
||||
|
||||
* [x] encode git-tree as stream of bytes (with large file support and actual streaming)
|
||||
* [x] produce a stream of entries
|
||||
* [x] add custom entries to the stream
|
||||
* [x] respect `export-ignore` git attribute
|
||||
* [x] apply standard worktree conversion to simulate an actual checkout
|
||||
* [ ] support for submodule inclusion
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-archive
|
||||
|
||||
* [x] `write_to()` for creating an archive with various container formats
|
||||
* [x] `tar` and `tar.gz`
|
||||
* [x] `zip`
|
||||
* [x] add prefix and modification date
|
||||
* [ ] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-bundle
|
||||
* [ ] create a bundle from an archive
|
||||
* [ ] respect `export-ignore` and `export-subst`
|
||||
* [ ] extract a branch from a bundle into a repository
|
||||
* [ ] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
### src-validate
|
||||
* [x] validate ref names
|
||||
* [x] validate submodule names
|
||||
* [x] [validate][tagname-validation] tag names
|
||||
|
||||
### src-fsck
|
||||
* [x] validate connectivity and find missing objects starting from…
|
||||
- [x] commits
|
||||
- [ ] tags
|
||||
- [ ] tree-cache in the `index` or any entry within
|
||||
* [ ] validate object hashes during connectivity traversal
|
||||
* [ ] progress reporting and interruptability
|
||||
* [ ] skipList to exclude objects which are known to be broken
|
||||
* [ ] validate blob hashes (connectivity check
|
||||
* [ ] identify objects that exist but are not reachable (i.e. what remains after a full graph traversal from all valid starting points)
|
||||
* [ ] write dangling objects to the `.git/log-found` directory structure
|
||||
* [ ] `strict` mode, to check for tree objects with `g+w` permissions
|
||||
* [ ] consider reflog entries from `ref` starting points
|
||||
* [ ] when reporting reachable objects, provide the path through which they are reachable, i.e. ref-log@{3} -> commit -> tree -> path-in-tree
|
||||
* [ ] limit search to ODB without alternates (default is equivalent to `git fsck --full` due to ODB implementation)
|
||||
* [ ] all individual [checks available in `git fsck`](https://git-scm.com/docs/git-fsck#_fsck_messages) (*too many to print here*)
|
||||
|
||||
### src-ref
|
||||
* [ ] Prepare code for arrival of longer hashes like Sha256. It's part of the [V2 proposal][reftable-v2] but should work for loose refs as well.
|
||||
* **Stores**
|
||||
* [ ] disable transactions during [quarantine]
|
||||
* [x] namespaces
|
||||
* a server-side feature to transparently isolate refs in a single shared repository, allowing all forks to live in the same condensed repository.
|
||||
* **loose file**
|
||||
* [x] ref validation
|
||||
* [x] find single ref by name
|
||||
* [ ] special handling of `FETCH_HEAD` and `MERGE_HEAD`
|
||||
* [x] iterate refs with optional prefix
|
||||
* **worktree support**
|
||||
* [x] support multiple bases and classify refs
|
||||
* [x] support for ref iteration merging common and private refs seamlessly.
|
||||
* [x] avoid packing refs which are worktree private
|
||||
* ~~symbolic ref support, using symbolic links~~
|
||||
* This is a legacy feature which is not in use anymore.
|
||||
* **transactions**
|
||||
* [x] delete, create or update single ref or multiple refs while handling the _reflog_
|
||||
* [x] set any valid ref value (not just object ids)
|
||||
* [x] reflog changes can be entirely disabled (i.e. for bare repos)
|
||||
* [ ] rename or copy references
|
||||
* [x] transparent handling of packed-refs during deletion
|
||||
* [x] writing loose refs into packed-refs and optionally delete them
|
||||
* [ ] initial transaction optimization (a faster way to create clones with a lot of refs)
|
||||
* **log**
|
||||
* [x] forward iteration
|
||||
* [x] backward iteration
|
||||
* [ ] expire
|
||||
* **ref**
|
||||
* [x] peel to id
|
||||
* **packed**
|
||||
* [x] find single ref by name
|
||||
* [x] iterate refs with optional prefix
|
||||
* [x] handle unsorted packed refs and those without a header
|
||||
* [ ] **[reftable][reftable-spec]**,
|
||||
* see [here for a Go/C implementation][reftable-impl]
|
||||
* [x] API documentation
|
||||
* [ ] Some examples
|
||||
|
||||
[reftable-spec]: https://github.com/eclipse/jgit/blob/master/Documentation/technical/reftable.md
|
||||
[reftable-impl]: https://github.com/google/reftable
|
||||
[reftable-v2]: https://github.com/google/reftable/blob/master/reftable-v2-proposal.md
|
||||
[quarantine]: https://github.com/git/git/blob/master/Documentation/git-receive-pack.txt#L223:L223
|
||||
|
||||
|
||||
### src-features
|
||||
* **io-pipe** feature toggle
|
||||
* a unix like pipeline for bytes
|
||||
* **parallel** feature toggle
|
||||
* _When on…_
|
||||
* `in_parallel`
|
||||
* `join`
|
||||
* _When off all functions execute serially_
|
||||
* [x] API documentation
|
||||
|
||||
### src-tui
|
||||
* _a terminal user interface seeking to replace and improve on `tig`_
|
||||
* Can display complex history in novel ways to make them graspable. Maybe [this post] can be an inspiration.
|
||||
|
||||
### src-tix
|
||||
|
||||
A re-implementation of a minimal `tig` like UI that aims to be fast and to the point.
|
||||
|
||||
### src-lfs
|
||||
|
||||
Definitely optimize for performance and see how we fare compared to [oxen](https://github.com/Oxen-AI/oxen-release/blob/main/Performance.md).
|
||||
Right now, `git lfs` is 40x slower, due to sequential uploads and lack of fast compression. It seems this can be greatly improved to get
|
||||
close to 6min for 200k images (1.4GB). GitHub seems to cap upload speeds to 100kb/s, one major reason it's so slow, and it can only do
|
||||
it sequentially as `git-lfs` doesn't use the new `filter-process` protocol which would allow parallelization.
|
||||
Oxen uses the XXH3 (30gb/s) which greatly outperforms SHA1 - however, it doesn't look like the hash is necessarily the bottleneck in typical benchmarks.
|
||||
|
||||
[tagname-validation]: https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt#L23:L23
|
||||
[this post]: http://blog.danieljanus.pl/2021/07/01/commit-groups/
|
||||
Reference in New Issue
Block a user