This crate provides the [Repository] abstraction which serves as a hub into all the functionality of git.
It's powerful and won't sacrifice performance while still increasing convenience compared to using the sub-crates individually. Sometimes it may hide complexity under the assumption that the performance difference doesn't matter for all but the fewest tools out there, which would be using the underlying crates directly or file an issue.
The prelude and extensions
With use git_repository::prelude::* you should be ready to go as it pulls in various extension traits to make functionality
available on objects that may use it.
The method signatures are still complex and may require various arguments for configuration and cache control.
Easy-Mode
Most extensions to existing objects provide an obj_with_extension.easy(&repo).an_easier_version_of_a_method() or easy(&repo)
method to hide all complex arguments and sacrifice some performance for a lot of convenience.
When starting out, use easy(…) and migrate to the more detailed method signatures to squeeze out more performance.
Design Sketch
Goal is to make the lower-level plumbing available without having to deal with any caches or buffers, and avoid any allocation beyond sizing the buffer to fit the biggest object seen so far.
- no implicit object lookups, thus
Oidneeds to get anObjectfirst to start out with data viaobject() - Objects with
Refsuffix can only exist one at a time unless they are transformed into an owned version of it OR multipleEasyhandles are present, each providing another 'slot' for an object as long as its retrieved through the respectiveEasyobject. ObjectRefblocks the current buffer, hence many of its operations that use the buffer are consuming- All methods that access a any field from
Easy's mutableStateare fallible, and returneasy::Result<_>at least, to avoid panics if the field can't be referenced due to borrow rules ofRefCell. - Anything attached to
Accesscan be detached to lift the object limit or make themSend-able. They can beattachedto anotherAccessif needed. - git-repository functions related to
Accessextensions will always return attached versions of return values, likeOidinstead ofObjectId,ObjectRefinstead ofgit_odb::data::Object, orReferenceinstead ofgit_ref::file::Reference. - Obtaining mutable is currently a weak spot as these only work with Arc right now and can't work with
Rc<RefCell>due to missing GATs, presumably. AllEasy*!Exclusivetypes are unable to provide a mutable reference to the underlying repository. However, other ways to adjust theRepositoryof long-running applications are possible. For instance, there could be a flag that indicates a newRepositoryshould be created (for instance, after it was changed) which causes the next server connection to create a new one. This instance is the one to use when spawning newEasyArcinstances.
Limitations
- types containing
&impl Accesscan't access extension traits directly but have to use a workaround. This is due to the way extension traits can't apply internally if if it is implemented, but must be part of the external interface. This is only relevant for code withingit-repository
Cargo-features
With the optional "unstable" cargo feature
To make using sub-crates easier these are re-exported into the root of this crate. Note that these may change their major version even if this crate doesn't, hence breaking downstream.
git_repository::
- [
hash] - [
url] - [
actor] - [
objs] - [
bstr][objs::bstr] - [
odb] - [
pack][odb::pack] - [
refs] - [
interrupt] - [
tempfile] - [
lock] - [
traverse] - [
diff] - [
parallel] - [
Progress] - [
progress] - [
interrupt] - [
protocol] - [
transport][protocol::transport]