gix is a command-line interface (CLI) to access git repositories

It's written to optimize the

gix is a command-line interface (CLI) to access git repositories. It's written to optimize the user-experience, and perform as good or better than the canonical implementation.

Furthermore it provides an easy and safe to use API in the form of various small crates for implementing your own tools in a breeze. Please see 'Development Status' for a listing of all crates and their capabilities.

Development Status

gitoxide (CLI)

  • please note that all functionality comes from the gitoxide-core library, which mirrors these capabilities and itself relies on all git-* crates.
  • limit amount of threads used in operations that support it.
  • choose between 'human' and 'json' output formats
  • the ein program - convenient and for humans
    • init - initialize a new non-bare repository with a main branch
    • clone - initialize a local copy of a remote repository
    • tools
      • organize - find all git repositories and place them in directories according to their remote paths
      • find - find all git repositories in a given directory - useful for tools like skim
      • estimate-hours - estimate the time invested into a repository by evaluating commit dates.
        • Based on the git-hours algorithm.
        • See the discussion for some performance data.
  • the gix program (plumbing) - lower level commands for use in automation
    • pack
      • verify
      • index verify including each object sha1 and statistics
      • explode, useful for transforming packs into loose objects for inspection or restoration
        • verify written objects (by reading them back from disk)
      • receive - receive a whole pack produced by pack-send or git-upload-pack, useful for clone like operations.
      • create - create a pack from given objects or tips of the commit graph.
      • send - create a pack and send it using the pack protocol to stdout, similar to 'git-upload-pack', for consumption by pack-receive or git-receive-pack
      • multi-index
        • info - print information about the file
        • create - create a multi-index from pack indices
        • verify - check the file for consistency
        • entries - list all entries of the file
      • index
        • create - create an index file by streaming a pack file as done during clone
          • support for thin packs (as needed for fetch/pull)
    • commit-graph
      • verify - assure that a commit-graph is consistent
    • mailmap
      • verify - check entries of a mailmap file for parse errors and display them
    • repository
      • verify - validate a whole repository, for now only the object database.
      • tree
        • entries - list tree entries for a single tree or recursively
        • info - display tree statistics
      • odb
        • info - display odb statistics
        • entries - display all object ids in the object database
      • mailmap
        • entries - display all entries of the aggregated mailmap git would use for substitution
    • index
      • entries - show detailed entry information for human or machine consumption (via JSON)
      • verify - check the index for consistency
      • info - display general information about the index itself, with detailed extension information by default
        • detailed information about the TREE extension
        • …other extensions details aren't implemented yet
      • checkout-exclusive - a predecessor of git worktree, providing flexible options to evaluate checkout performance from an index and/or an object database.
    • remote
      • ref-list - list all (or given) references from a remote at the given URL

Crates

Follow linked crate name for detailed status. Please note that all crates follow [semver] as well as the stability guide.

Production Grade

  • Stability Tier 1

    • git-lock
  • Stability Tier 2

    • git-tempfile

Stabilization Candidates

Crates that seem feature complete and need to see some more use before they can be released as 1.0.

  • git-mailmap

Initial Development

  • usable
    • git-actor
    • git-hash
    • git-chunk
    • git-object
    • git-validate
    • git-url
    • git-packetline
    • git-transport
    • git-protocol
    • git-pack
    • git-odb
    • git-commitgraph
    • git-diff
    • git-traverse
    • git-config
    • git-features
    • git-ref
    • git-repository
    • gitoxide-core
  • very early
    • git-index
    • git-worktree
    • git-bitmap
    • git-revision
    • git-attributes
    • git-quote
  • idea
    • git-note
    • git-pathspec
    • git-subomdule
    • git-tui
    • git-bundle

Stress Testing

  • Verify huge packs
  • Explode a pack to disk
  • Generate and verify large commit graphs
  • Generate huge pack from a lot of loose objects

Cargo features

Many crates use feature flags to allow tuning the compiled result based on your needs. Have a look at the guide for more information.

Stability and MSRV

Our stability guide helps to judge how much churn can be expected when depending on crates in this workspace.

Installation

Download a Binary Release

Using cargo quickinstall, one is able to fetch binary releases. You can install it via cargo install cargo-quickinstall, assuming the rust toolchain is present.

Then install gitoxide with cargo quickinstall gitoxide.

See the releases section for manual installation and various alternative builds that are slimmer or smaller, depending on your needs, for Linux, MacOS and Windows.

From Source via Cargo

cargo is the Rust package manager which can easily be obtained through rustup. With it, you can build your own binary effortlessly and for your particular CPU for additional performance gains.

The minimum supported Rust version is documented in the CI configuration, the latest stable one will work as well.

The following installs the latest unpublished release directly from git:

Usage

Once installed, there are two binaries:

  • ein
    • high level commands, porcelain, for every-day use, optimized for a pleasant user experience
  • gix
    • low level commands, plumbing, for use in more specialized cases

Project Goals

Project goals can change over time as we learn more, and they can be challenged.

  • a pure-rust implementation of git
    • including transport, object database, references, cli and tui
    • a simple command-line interface is provided for the most common git operations, optimized for user experience. A simple-git if you so will.
    • be the go-to implementation for anyone who wants to solve problems around git, and become the alternative to GitPython in the process.
    • become the foundation for a free distributed alternative to GitHub, and maybe even GitHub itself
  • learn from the best to write the best possible idiomatic Rust
    • libgit2 is a fantastic resource to see what abstractions work, we will use them
    • use Rust's type system to make misuse impossible
  • be the best performing implementation
    • use Rust's type system to optimize for work not done without being hard to use
    • make use of parallelism from the get go
  • assure on-disk consistency
    • assure reads never interfere with concurrent writes
    • assure multiple concurrent writes don't cause trouble
  • take shortcuts, but not in quality
    • binaries may use anyhow::Error exhaustively, knowing these errors are solely user-facing.
    • libraries use light-weight custom errors implemented using quick-error or thiserror.
    • internationalization is nothing we are concerned with right now.
    • IO errors due to insufficient amount of open file handles don't always lead to operation failure
  • Cross platform support, including Windows
    • With the tools and experience available here there is no reason not to support Windows.
    • Windows is tested on CI and failures do prevent releases.

Non-Goals

Project non-goals can change over time as we learn more, and they can be challenged.

  • replicate git command functionality perfectly
    • git is git, and there is no reason to not use it. Our path is the one of simplicity to make getting started with git easy.
  • be incompatible to git
    • the on-disk format must remain compatible, and we will never contend with it.
  • use async IO everywhere
    • for the most part, git operations are heavily relying on memory mapped IO as well as CPU to decompress data, which doesn't lend itself well to async IO out of the box.
    • Use blocking as well as git-features::interrupt to bring operations into the async world and to control long running operations.
    • When connecting or streaming over TCP connections, especially when receiving on the server, async seems like a must though, but behind a feature flag.

Contributions

If what you have seen so far sparked your interest to contribute, then let us say: We are happy to have you and help you to get started.

We recommend running make tests check-size during the development process to assure CI is green before pushing.

A backlog for work ready to be picked up is available in the Project's Kanban board, which contains instructions on how to pick a task. If it's empty or you have other questions, feel free to start a discussion or reach out to @Byron privately.

For additional details, also take a look at the collaboration guide.

Getting started with Video Tutorials

  • Learning Rust with Gitoxide
    • In 17 episodes you can learn all you need to meaningfully contirbute to gitoxide.
  • Getting into Gitoxide
    • Get an introduction to gitoxide itself which should be a good foundation for any contribution, but isn't a requirement for contributions either.

Other Media

  • Rustacean Station Podcast

Roadmap

Features for 1.0

Provide a CLI to for the most basic user journey:

  • initialize a repository
  • clone a repository
    • bare
    • with working tree
  • create a commit
  • add a remote
  • push
    • create (thin) pack

Ideas for Examples

  • gix tool open-remote open the URL of the remote, possibly after applying known transformations to go from ssh to https.
  • tix as example implementation of tig, displaying a version of the commit graph, useful for practicing how highly responsive GUIs can be made.
  • Open up SQL for git using sqlite virtual tables. Check out gitqlite as well. What would an MVP look like? Maybe even something that could ship with gitoxide. See this go implementation as example.
  • A truly awesome history rewriter which makes it easy to understand what happened while avoiding all pitfalls. Think BFG, but more awesome, if that's possible.
  • git-tui should learn a lot from fossil-scm regarding the presentation of data. Maybe this can be used for prompts. Probably magit has a lot to offer, too.

Ideas for Spin-Offs

  • A system to integrate tightly with git-lfs to allow a multi-tier architecture so that assets can be stored in git and are accessible quickly from an intranet location (for example by accessing the storage read-only over the network) while changes are pushed immediately by the server to other edge locations, like the cloud or backups. Sparse checkouts along with explorer/finder integrations make it convenient to only work on a small subset of files locally. Clones can contain all configuration somebody would need to work efficiently from their location, and authentication for the git history as well as LFS resources make the system secure. One could imagine encryption support for untrusted locations in the cloud even though more research would have to be done to make it truly secure.
  • A syncthing like client/server application. This is to demonstrate how lower-level crates can be combined into custom applications that use only part of git's technology to achieve their very own thing. Watch out for big file support, multi-device cross-syncing, the possibility for untrusted destinations using full-encryption, case-insensitive and sensitive filesystems, and extended file attributes as well as ignore files.
  • An event-based database that uses commit messages to store deltas, while occasionally aggregating the actual state in a tree. Of course it's distributed by nature, allowing people to work offline.
    • It's abstracted to completely hide the actual data model behind it, allowing for all kinds of things to be implemented on top.
    • Commits probably need a nanosecond component for the timestamp, which can be added via custom header field.
    • having recording all changes allows for perfect merging, both on the client or on the server, while keeping a natural audit log which makes it useful for mission critical databases in business.
    • Applications
      • Can markdown be used as database so issue-trackers along with meta-data could just be markdown files which are mostly human-editable? Could user interfaces be meta-data aware and just hide the meta-data chunks which are now editable in the GUI itself? Doing this would make conflicts easier to resolve than an sqlite database.
      • A time tracker - simple data, very likely naturally conflict free, and interesting to see it in terms of teams or companies using it with maybe GitHub as Backing for authentication.
        • How about supporting multiple different trackers, as in different remotes?

Shortcomings & Limitations

  • fetches using protocol V1 and stateful connections, i.e. ssh, git, file, may hang
    • This can be fixed by making response parsing.
    • Note that this does not affect cloning, which works fine.
  • lean and light and small builds don't support non-UTF-8 paths in the CLI
    • This is because they depend on argh, which does not yet support parsing OsStrings. We however believe it eventually will do so and thus don't move on to pico-args.
    • Only one level of sub-commands are supported due to a limitation of argh, which forces porcelain to limit itself as well despite using clap. We deem this acceptable for plumbing commands and think that porcelain will be high-level and smart enough to not ever require deeply nested sub-commands.
  • Packfiles use memory maps
    • Even though they are comfortable to use and fast, they squelch IO errors.
    • potential remedy: We could generalize the Pack to make it possible to work on in-memory buffers directly. That way, one would initialize a Pack by reading the whole file into memory, thus not squelching IO errors at the expense of latency as well as memory efficiency.
  • Packfiles cannot load files bigger than 2^31 or 2^32 on 32 bit systems
    • As these systems cannot address more memory than that.
    • potential remedy: implement a sliding window to map and unmap portions of the file as needed.
      • However, those who need to access big packs on these systems would rather resort to git itself, allowing our implementation to be simpler and potentially more performant.
  • Objects larger than 32 bits cannot be loaded on 32 bit systems
    • in-memory representations objects cannot handle objects greater than the amount of addressable memory.
    • This should not affect git LFS though.
  • git-url might be more restrictive than what git allows as for the most part, it uses a browser grade URL parser.
    • Thus far there is no proof for this, and as potential remedy we could certainly re-implement exactly what git does to handle its URLs.
  • local time is currently impeded by this issue but it's planned to resolve it eventually.

Credits

  • itertools (MIT Licensed)
    • We use the izip! macro in code
  • deflate2 (MIT Licensed)
    • We use various abstractions to implement decompression and compression directly on top of the rather low-level miniz_oxide crate

License

This project is licensed under either of

  • Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
  • MIT license (LICENSE-MIT or #404)

at your option.

Fun facts

  • Originally @Byron was really fascinated by this problem and believes that with gitoxide it will be possible to provide the fastest solution for it.
  • @Byron has been absolutely blown away by git from the first time he experienced git more than 13 years ago, and tried to implement it in various shapes and forms multiple times. Now with Rust @Byron finally feels to have found the right tool for the job!
Issues

Collection of the latest Issues

Byron

Byron

C-tracking-issue
0

Basic Parsing

It would be great to be part of the development in case you want to open a draft PR sooner than later. Parsing would go into the git-revision crate and have the following requirements.

  • parse plain bytes (or &BStr), not &str
  • call functions to signal which item was parsed, that is it doesn't parse into a data structure

Also see this discussion for more insights.

  • a callback based parser

Revision Ranges

Prerequisistes

  • Git Revision Parsing - See #408
  • Git Merge Base - See #409
  • .. (two-dot) Range Notation
  • ... (three-dot) Symmetric Difference Notation
kalkin

kalkin

0

Should provide:

  • Given two commits a & b check if b is ancestor of a
  • Given n commits, find the first common ancestor
  • Given n commits, find their LCA

Future Work:

  • Git Commit Graph Read support for better performance
  • Git Commit Graph Write support for better performance

I would love to implement this, but not sure how my current time frame looks

Open Questions:

  • How should the api look? Something like this?

Further reading:

Byron

Byron

C-replace-git2
0
  • traverse commits
  • #366
  • index for size computation
  • traverse tags, references
  • a flag to turn support for shallow history support off - by default we just stop iteration if a commit can't be found, but people can turn it on to see errors (like now) if a commit can't be found.
  • git-odb support for git-replace with override in handle
  • git-repository support for git-replace
  • config 'user.name', remote information
  • split index support
  • peel tag
  • git status/pending changes

https://github.com/o2sh/onefetch

Byron

Byron

0

#336 was a reminder on how good intentions can end up having undesirable impact which is why it should be put into question if the bundling with signal-hook is the right choice for a plumbing crate.

Despite the ecosystem being centered around signal-hook, it seems clear that other options are possible that shouldn't have to deal with an unnecessary dependency.

It also appears that more complex applications will want their own signal handlers and free reign on how to integrate the cleanup, for reference, git-repository also integrates the cleanup handler directly instead of calling setup().

Revisit the way the cleanup handler is promoted to users of the library to make it reasonably easy to use while avoiding accidental behaviour to emerge.

Tasks

  • provide low-level and high-level cleanup handlers, one that leaks and is not blocking, the other one that needs to be called from code within the process.
  • create examples to show high-level and low-level handlers in action with signal-hook
  • remove the existing ties to signal-hook
  • take a look at git-repository and make sure it's clear how handlers are supposed to be used there, maybe have a central setup() function applications should call with some options to get started quickly, without locking them out of integrating with their own interrupt handlers. Assure the latter can happen.
Byron

Byron

C-tracking-issue
5

An issue to see what's missing to make git-config comfortably usable by git-repository.

Tasks

  • cascading config files (review/validate)
  • correct parsing of Colors (e.g. hex input, attributes, inverted attributes, order independence) - validate
  • use bstr internally instead of [u8]
  • know which config files to cascade
  • advanced features
    • #327
    • parse quantities when dealing with integer as described here
    • include (might require real-path support in path interpolation) (#345)
    • includeIf (don't forget from_env() should pick it up too).
    • use git-sec to allow configuring what to do if configuration files aren't owned by the current user.
    • parse expiry date
    • assure our multi-value implementation allows for last-one wins semantics. They seem to change the order of values.
    • skip BOM, unicode-bom will do the job well.
  • ❗️a way to know about the source of a value, i.e. it's possible to know which config file is providing an obtained value.
    • this is important for reading values with security implications, so one would avoid accepting values from configuration files not owned by the current user.
    • a way to restrict queries to a sub-set of the available sources
    • a way to query a path safely using settings from git-sec, it should probably know about the Trust associated with a config file.
  • comfortable API for accessing values
  • validate sub-sections are case-sensitive when reading (and writing)
  • remove ResolvedConfig entirely - GitConfig can do it all

Related Discussions

Towards 2.0

  • resolved config (optimized for reading, no round-tripping) is created directly from parse events (like git does)
  • assure GitConfig can be edited and write itself back losslessly (it can with Display, but that needs UTF8)
  • 100% correct date parsing with git-date

Other Ramblings

A list of ideas for features that come up when using git-config::file::GitConfig

  • Boolean can act as bool or be converted to one, maybe using deref
  • Integer derefs to integer
  • Something like try_value() -> Result<Option<T>, E> as currently I am ignoring all errors as it's too cumbersome to check if the conversion failed which probably should be an actual
  • could there be a more convenient API than this.
  • Could git-config use self-referential structures like in ignore to avoid copying everything into Cow<'static, [u8]> effectively.
Byron

Byron

7

A minimal replacement for how I use tig, with an architecture that…

  • never block the main thread
  • is testable
  • allows for replacement of the actual UI, allowing application logic to be reused in the browser or with Tauri, for example

Scope

  • display a single branch only, as a flat list
  • display refs
  • an easy way to copy the hash of the selected commit
  • display the total amount of commits
  • jump to the beginning of history and the latest commit
  • cancel long-running processes
  • display progress of long-running processes

Performance

  • display history instantly on the linux kernel
  • use way less than 1.5GB of memory after jumping to the beginning of history
  • see how close it gets to /usr/bin/time -lp zsh -i -c 'glo > /dev/null' (about 8s, 280MB heap size, 1GB incl. virtual)

Implementation

  • The git-tix crate is a library for a binary
  • gitoxide provides the tix binary using the git-tix crate as implementation
simonsan

simonsan

1

[TRACE] Skipping unknown git-conventional kind "chore" and all 2 message(s) in it.

Maybe I'm doing something wrong, but I can't get cargo-smart-release to "find" conventional commit types like chore or feat(x). Is there something I've overlooked or doing wrong?

After a bit of research it seems that the conventional commit type is being parsed from the message, but cargo changelog doesn't want them to be written to the changelog.

I see that in the changelog generation it's not being matched for e.g. chore: https://github.com/Byron/gitoxide/blob/fbe2c93b13fc05414dc5c7d80f4197d279b6b81b/cargo-smart-release/src/changelog/section/segment.rs#L26 while in https://github.com/Byron/gitoxide/blob/fbe2c93b13fc05414dc5c7d80f4197d279b6b81b/cargo-smart-release/src/commit/message.rs#L122 these clearly exist.

I'm asking myself if it would be sensible to do the mapping 1:1 in regards to conventional commits and pass a filter to cargo changelog where someone could state that they might not want to have chores printed to the changelog file or have their own mapping parsed from a toml configuration file.

As said above, if I'm overlooking something, please correct me. :)

Thanks for the nice tooling!

Byron

Byron

C-replace-git2
1

A more specialized tool to deal with rebasing branches and running automations of it, help handling PRs.

  • access standard git-config
  • access workspace local .gitconfig (single file)
  • write changes to git-config
  • everything listed here, which includes finding refs, is-dirty(), cherry-picking
Byron

Byron

C-tracking-issue
0

What would be needed to allow a server to send a pack?

Tasks

Server fetch/pull (server to client)

  • git-odb

The below is a very early draft - it would be better to study existing implementations first to get a better overview on what (not) to do. This one starts with the fun part to allow writing tests early and experiment with different diff algorithms and potentially their performance.

  • generate a pack from objects received by an iterator producing (see issue)
    • base objects only
    • re-use existing delta objects
    • A mechanism to declare some bases to be 'out of pack' for thin pack support
  • Iterator to feed pack generation efficiently
  • pack creation
  • git-transport

Certainly needs more research, but roughly…

  • Server side accept()

    • http(s)
    • ssh
    • daemon probaby only used in testing, and we might implement it if it's useful for us as well
  • git-protocol

    • Server side chatter to negotiate a pack for
      • protocol V2
      • protocol V1 (probably not worth it, let's see)
  • gix-serve

Probably more like a toy at first merely for testing operation against various git clients.

  • A server able to answer via
    • http(s)
    • file protocol (or remote invocation via SSH)
Byron

Byron

C-tracking-issue
0

As in git push.

Tasks

  • git-odb

    • basic pack generation based on tree-diff or tree-traversal
  • Traversal (as building blocks to feed pack generation)

    • Traverse a commit graph (look around to see what's common, if in doubt walk back the commit graph and see how to deal with branching)
    • Traverse trees
    • best-fit delta objects creation using the [similar][sim-crate]
  • git-protocol

    • ReceivePack logic for V1 and V2
    • async & blocking negotiation of commits
Byron

Byron

C-tracking-issue
0

Run something like a git status and git show, implementing differences between tree - tree - index - worktree.

Assorted Tasks

  • diff trees with trees
  • a complete enough index implementation (see #293 )
  • an understanding on how worktrees work (also consider git worktree) in conjunction git-index (see #301)
  • diffing of worktree -> index -> tree
Byron

Byron

C-tracking-issue
0

Check the integrity of an entire repository using gix repository verify

Tasks

  • multi-db (incorporate object lookup for loose objects and packs)
    • multi-threaded
    • delta-tree cache for speedups
    • fs-check - verify all object content of a git repository
      • probably this should be based on indexed pack traversal for maximum decoding speed and not on individual object lookup
  • find ill-formed names in… (see #333)
    • index entries
    • trees
  • ref-validity check by traversing everything, including reflog, checking reachability of objects accordingly
  • index verification
  • what about multiple work-trees and submodules?
Byron

Byron

C-tracking-issue
0

Clone an entire repository via gix repository clone and checkout a working tree along with a valid index.

Tasks

  • git-odb
    • all docs, sans examples
    • Rename pack data/pack index Kind to Version or similar, because that's what it really is.
  • git-object refactor
    • split Id and everything hash related into git-hash
    • use git-hash inside of git-features, remove cycle
  • git-config
    • Thanks to a generous contribution it's mostly done and well on the way
    • Push it towards 1.0
    • Config type which integrates multiple files into one interface, much like a multi version of File
    • Make gix organize use git-config on single files (the repository configuration)
    • #191
  • git-ref
    • transactional creation of refs
    • iteration of refs
  • git-index
    • Read an index (complete with all extensions)
    • Create an index from tree (see #293 for more)
    • Write index, after it was checked out and contains the latest stat information
  • git-bitmap
    • pieces needed for git-index to work.
  • git-worktree
    • checkout an index (See #301 for more)
  • git-repository
    • instance for a valid looking repository
      • support shallow repos/references
    • create-update refs as received from clone/git-receive-pack safely (i.e. with required locking)
    • clone from https remote
  • gix repository clone
    • try initializing repo on output path - if so, use that to learn about pack location and place new pack there, allow Repo to create refs somehow.
      • probably this is done using the repository itself, which steers the whole process and injects it's own delegates.
    • otherwise create the scaffolding needed for a new repository, probably based on init implementation.
  • gix pack receive
    • resolve thin pack with
  • Having impact
    • A GitHub Action to accelerate checkouts on CI.
      • Note that this assumption should be validated first - after all we need to download a binary first and then get that time back at the very least. For small repositories this might not be worth it, but then again, folks who think they benefit from gitoxide won't have small repositories.
      • consider having a docker action as fallback in case some platforms don't have a binary pre-built yet.
Byron

Byron

C-tracking-issue
0

Tasks for checkout

  • checkout entire index OR checkout from tree (in case the index doesn't exist yet).
    • This would allow the index to be created while we are checking out, maybe there is a benefit.
  • probing of the file system - needed to set configuration options accordingly
  • correctness
    • #341
    • #343
    • filemode
    • symlinks (use symlink crate instead (or factor out symlink related code at least)).
    • explicit fclose() without performance loss due to silent and implicit close on drop.
  • #344
  • #346 (see performance article)
  • #352
    • when we get into the sub-second area the parallelization costs get higher than doing the actual work - but we couldn't make it faster with different parallelization, tried non-blockwise
  • git-ignore and git-attributes access
    • #359
    • #360
    • glob/wildcard support
    • #397
    • #400
  • internal format conversion, like line feeds, etc.
  • support for smudge and clean filters (which would certainly require access to git-attributes)
  • support for delayed filters
  • how to handle special filesystem support?
  • What about precomposeUnicode on MacOS? Some path conversion for more compatibility, we should probably do that too. Out-scope if it belongs elsewhere. This means that all paths going into gitoxide need to be turned into precomposed forms.
    • See if clap can be initialized from precomposed unicode OsStrings instead, a feature ultimately to be provided to git-repository users.

Tasks for add

Add files to the index.

Tasks for status

The difference between an index and the work tree. Analysis TBD.

Checkout Research

Performance

git can checkout about ~12.5k files/second on a single thread with 3.22m sys calls and 10s user time and 585MB of memory, whereas gix can do 26k/s empty files with 2.70m syscalls and 71MB of memory, or 12.1k 12.5k files/s and 4.8m syscalls and 8.7s user time and 320MB of memory (without pack cache) and 970MB of memory with 700MB pack cache (yes, seems too high, 3/4 hits/misses).

Profiling clearly shows that file writing is fast as well, it's the ODB access that slows everything down and where git handles itself with far less unix system calls, maybe due to mapping only smaller ranges. An ODB pack cache is needed to reach equivalent performance as git.

Directory creation takes 8% of the time, so speeding this up by avoiding unnecessary attempts should help, besides the fact that we need to handle symlinks like git does to avoid symlink based exploits. I think we manage to have a more obvious implementation of it as well.

It really looks like our cache implementation takes more memory , as 256MB easily blow up to being much more, despite free list. Maybe the latter is the problem, all vectors resize themselves beyond the initial count, using more memory effectively.

Follow Ups

  • symlink wait for 1.0 release with additional fixes (see thread on MR)
    • need to use remove_symlink() from this crate, but can't use it for relative paths due to the filename check.
Byron

Byron

C-replace-git2
0

Needed from gitoxide

  • information about branch and commit
  • git describe - NOT git name-rev ;).
    • implementation
    • use it in vergen
    • dirty-working-tree tracking with suffix
  • unambiguous short-id

Integration progress

https://lib.rs/crates/vergen https://github.com/byron/vergen

Byron

Byron

0

Implementation

  • reading
  • access, needs its own implementation that will probably be a lot of work

Research

  • implementation notes
  • how github used them
  • bitvec can't be used as standin because it's not compressed in memory, which is the point of using EWAH. However, one could consider having transformations from one to another if it would be a benefit in speed.
Byron

Byron

C-tracking-issue
0

Only interpret and make accessible all values and figure out how to bridge different formats in a single implementation ideally.

Reading

  • V3 reading + V4 reading with multi-threading
  • read extensions
    • needed for multi-threading
    • TREE
    • mandatory link and sdir
    • remaining optional extensions
  • use bitflags instead of u32 for type safety
  • test for long paths and extended flags
  • publish v 0.1 of index and bitmap crates
  • improve performance - there seems to be a bottleneck when reading large indices, reading a 53MB file takes 2s!

Instantiation

  • verification/warm up
    • visualize/print index content
    • implement verification first (to double check what we produce from a tree)
    • handle verification on linked indices
  • index from tree
    • it looks like a basic tree traversal to create entries, maybe it's smart by creating them sorted right way.
    • git can actually traverse multiple trees at the same time, maybe taking advantage of them being sorted. It seems to unpack the same entry on each level for comparison.
    • it inserts without special knowledge of tree traversal, and typically does a binary search unless it naturally inserts past the end
      • It will invalidate the cache tree and update the untracked cache.
      • It checks every path and rejects .git (on macos with case-insensitivity, should be a configuration flag). Handles backslashes in paths, too, on windows, rejecting them.
      • '.git' is always 'outlawed' without case checking, everywhere.
    • The tree cache (extension) is created after inserting all entries, and thus not created on the fly
  • create cache tree
    • see here - interesting is to see promisor objects and 'quick-fetches' without negotiation.

Writing

Definitely round-trip tests with what we are reading.

  • write entire tree after clone
    • parallelization support
    • … see if other extensions should also get write support, even though there isn't much use in them after clone in particular.

Plumbing

  • entries
  • info, with details for extensions…
    • TREE
    • …others

For stabilization

  • journey tests for index entries
  • journey tests for index info
  • journey tests for index checkout

Research

  • There is an fs-monitor implementation in Rust, it might be a basis for a pure-Rust notify based implementation, avoiding the watchman tool.
  • the ignore crate is probably interesting for .gitignore/exclude files. And it's a big dependency but most definitely worth it.
Byron

Byron

C-tracking-issue
0

Even though the foundation is set, it needs another push to actually make it work with different kinds of hashes.

Tasks

  • remove hash-type specific methods from git-hash and replace them with parametric usage of git_hash::Kind
  • all code assuming hashes of len 20 should receive this value as parameter instead. This is what git does for the old index and pack file formats.
  • a way to pass --object-hash information to the gix CLI
  • remove SHA1 mention from git-features feature toggles
  • parameterize hash len when decoding non-blob objects (see this for an example)
  • understand and implement pack idx V3. - see if git actually implements this, and maybe decide that gitoxide won't handle the transition period, is either one has or another.
  • add new Sha256 enum variant, consider putting it behind a feature flag, and add a hasher for it as well.
  • general tests for reading refs and objects of different len
  • tests for writing and reading objects of different len, maybe even write a conversion program which transforms an entire repo and double-checks with git-fsck

Implementation ideas

  • make sure once Sha256 is added as ObjectId variant, that it's behind a feature toggle to allow builds that opt-out of SHA256 support to not unnecessarily use more memory than needed. Maybe there are alternatives to this, too.
  • One way to do that with approximately zero overhead would be to such functions generic on the object ID, using a trait that has a method to get the type. Then object IDs with a known type return a constant from that method, and object IDs with a runtime dispatched type return the value of that enum.

    • @joshtriplett - taken verbatim as I'd barely be able to improve on it when paraphrasing. In short, have a trait for oid or allow efficient conversions to oid (it's just a slice, so that should work for specifically sized types as well especially if these were provided by git-hash.

Notes

  • find ways to use the existing highly-parallel pack traversal (along with integration of loose-objects) to build an inverse-ref table to quickly traverse objects bottom-up to change the hash used along with all references, while being fast. This ties into being able to build new packs quickly, ideally even with delta-compression (the latter then has to be re-created as most objects actually change) - re-using deltas for blobs is the only way.
    • The existing traversal can mutate data in the tree, which is enough to decode the object and keep direct references for later.
FintanH

FintanH

enhancement
6

Hey :wave:

I've been perusing the git-ref family of names, i.e. FullName, FullNameRef, and PartialNameRef. I want to see if I'm using it right and also suggest a couple of additions that might be helpful for consumers of the API.

My use case is the following. I want to end up using try_find_reference, which takes one parameter that is impl TryInto<PartialNameRef>. I have a structural representation of the reference which looks like:

Now, I can't directly write a TryFrom for PartialNameRef as far as I can tell because of the associated lifetimes. But I can write a TryFrom for FullName and use to_partial. I'm wondering if that's the correct and intended way of using the API?

Regarding my suggestions, when I wrote a TryFrom for Remote, I wasn't able to reuse this when writing TryFrom for Reference, since there's no way to join two FullNames. I ended up having to use format! and use the TryFrom instance on &String. It would be useful to be able to join two names to get another valid name.

The other (possibly) useful suggestion would be to have a macro for writing static names, that are known to be valid at compile time. We used this technique in radicle-link[0] and it was extremely nice compare to using try_from everywhere :)

Let me know what you think, and perhaps I could help contribute with these additions :v:

Versions

Find the latest versions by id

git-discover-v0.0.0 - May 06, 2022

The first release, an empty crate.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #301

Commit Details

view details

  • #301
    • Add empty git-discover crate (6565f16)

git-path-v0.1.0 - Apr 28, 2022

Refactor (BREAKING)

  • various name changes for more convenient API

Commit Statistics

  • 8 commits contributed to the release over the course of 1 calendar day.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #301

Commit Details

view details

  • #301
    • frame for gix repo exclude query (a331314)
    • refactor (21d4076)
    • The first indication that directory-based excludes work (e868acc)
    • various name changes for more convenient API (5480159)
    • Use bstr intead of [u8] (9380e99)
    • Use git-path crate instead of git_features::path (47e607d)
    • Copy all existing functions from git-features::path to git-path:: (725e198)
    • add empty git-path crate (8d13f81)

git-sequencer-v0.0.0 - Apr 21, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #396

Commit Details

view details

  • #396
    • Add git-sequencer crate (f8160d0)

git-filter-v0.0.0 - Apr 19, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #301

Commit Details

view details

  • #301
    • add git-filter crate for name generation (5a3c628)

git-rebase-v0.0.0 - Apr 17, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #382

Commit Details

view details

  • #382
    • add dummy crates for git-rebase and git-lfs (94c8122)

git-lfs-v0.0.0 - Apr 17, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #382

Commit Details

view details

  • #382
    • add dummy crates for git-rebase and git-lfs (94c8122)

git-sec-v0.0.0 - Apr 15, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #386

Commit Details

view details

  • #386
    • An empty crate for git-sec (96a922c)

git-credentials-v0.0.0 - Apr 15, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #386

Commit Details

view details

  • #386
    • add frame for git-credentials crate (be7a9cf)

git-date-v0.0.0 - Apr 14, 2022

An empty crate without any content to reserve the name for the gitoxide project.

Commit Statistics

  • 1 commit contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #331

Commit Details

view details

  • #331
    • frame for git-date (37e8ef8)

git-glob-v0.2.0 - Apr 13, 2022

Changed (BREAKING)

  • parse() returns a Pattern. This is much more ergonomic as this is the only things we are ever interested in for matching. If necessary, from there one can also use the parts individually or alter them.

Commit Statistics

  • 50 commits contributed to the release over the course of 6 calendar days.
  • 6 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #301

Thanks Clippy

Clippy helped 3 times to make code idiomatic.

Commit Details

view details

  • #301
    • parse() returns a Pattern. (6ce3611)
    • docs for git-glob (8f4969f)
    • all wildmatch tests succeed (d3a7349)
    • add all character classes sans some of the more obscure ones (538d41d)
    • frame for character classes (6b8d0d2)
    • fix all remaining bracket tests… (3afe2d2)
    • more bracket-range tests succeed (c64f71c)
    • make bracket matching work better (97aa9ed)
    • refactor (fa0440f)
    • first steps towards bracket matching (54fe029)
    • adjust wildmatch corpus expectations as it won't match our preprocessor (48990af)
    • fix another issue around double-star (d15c2fb)
    • fix another special case (09095df)
    • fix double-star matches (43371b6)
    • fix single-level double-star (e5a7995)
    • fix backslash handling; improve star handling (7907cb4)
    • new wildcard tests to help fix star matching (d21c654)
    • All our simple wildmatches are working, a good start (321c4d2)
    • maybe even working double-star handling (48c57ff)
    • slowly move towards star/double-star (4efd215)
    • question mark support (e83c8df)
    • very basic beginnings of wildmatch (334c624)
    • fix logic in wildmatch tests; validate feasibility of all test cases (1336bc9)
    • test corpus for wildcard matches (bd8f95f)
    • frame for wildmatch function and its tests (04ca834)
    • more tests for early exit in case no-wildcard prefix doesn't match (1ff348c)
    • more non-basename shortcuts, and only wildcard matches left (45c6259)
    • make much clearer how base-path works and put in safe-guards (5bf503a)
    • test that bases are ignored for basenames (1b26848)
    • refactor (056b368)
    • a way to set a globs base path (3d58db8)
    • get to the point where globs probably should have a base (2632988)
    • refactor (f2f3f53)
    • prepare for handling absolute patterns (df9778b)
    • Keep track of absolute patterns, those that have to start with it (3956480)
    • basename parsing with simple pattern skips (d18ef14)
    • git-baseline now acts like a massive regression test (fe3d0a7)
    • adjust signatures to know enough to implement git-like matching (b947ff9)
    • refactor; roughly sort regex by simplicity (a7c3a63)
    • Also parse the position of the first wildcard (4178a63)
    • prepare for upcoming wildcard-length field in glob pattern (a11f5d4)
    • refactor (f285ca0)
    • basic infrastructure for running git-baseline against our implementation (027869d)
    • baseline tests for matches and no-matches (621c2ca)
    • bring in all ~140 tests for git pattern matching, git-ignore styile (f9ab830)
    • refactor (dbe7305)
    • refactor (8a54341)
  • Uncategorized
    • thanks clippy (b1a6100)
    • thanks clippy (1393403)
    • thanks clippy (683233e)

git-glob-v0.1.0 - Apr 07, 2022

Initial release with pattern parsing functionality.

Commit Statistics

  • 2 commits contributed to the release.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #301

Commit Details

view details

  • #301
    • prepare changelog prior to release (2794bb2)
    • Add git-glob crate with pattern matching parsing from git-attributes::ignore (b3efc94)

v0.12.0 - Apr 05, 2022

New Features

  • Add gix repo commit describe It supports typical but basic flags mostly similar to the ones in git.

Commit Statistics

  • 5 commits contributed to the release over the course of 1 calendar day.
  • 2 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #298

Commit Details

view details

  • #298
    • Use all tags by default, instead of requiring annotated tags (00c42ca)
    • support for the --max-candidates flag (b9e6754)
    • Reduce amount of max candidates, add --debug flag (c8c13e3)
    • Add gix repo commit describe (7e99e6a)
    • a first sketch of the gix repo describe plumbing command (2d6ccef)

gitoxide-core-v0.14.0 - Apr 05, 2022

New Features

  • Add gix repo commit describe It supports typical but basic flags mostly similar to the ones in git.

  • Commit::describe() A way to fluidly configure a git describe operation and run it.

    Along that, a new Tag top-level object was added as well to provide convenient access to otherwise lower-level objects. It's not strictly required for our implementation here but it's needed for a symmetric API.

Commit Statistics

  • 7 commits contributed to the release.
  • 2 days passed between releases.
  • 2 commits where understood as conventional.
  • 1 unique issue was worked on: #298

Commit Details

view details

  • #298
    • restrict signature changes to 'Ancestores::sorting()` (d71bd9d)
    • Adjust to changes in git-traverse (8240622)
    • support for the --max-candidates flag (b9e6754)
    • Reduce amount of max candidates, add --debug flag (c8c13e3)
    • Add gix repo commit describe (7e99e6a)
    • Commit::describe() (654f4af)
  • Uncategorized
    • Release git-config v0.2.1, git-diff v0.15.0, git-traverse v0.14.0, git-pack v0.18.0, git-odb v0.28.0, git-ref v0.12.1, git-revision v0.1.0, git-repository v0.16.0, gitoxide-core v0.14.0, gitoxide v0.12.0, safety bump 6 crates (b612021)

git-traverse-v0.14.0 - Apr 05, 2022

Bug Fixes (BREAKING)

  • commit traversal now sorts by commit-time more thoroughly Previously the sorting was only partial as it was only among parents. Now it is full and among all currently visible commits.

    That way it is similar to what git log would produce.

Commit Statistics

  • 3 commits contributed to the release.
  • 2 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #298

Commit Details

view details

  • #298
    • restrict signature changes to 'Ancestores::sorting()` (d71bd9d)
    • commit traversal now sorts by commit-time more thoroughly (dcdf657)
    • higher-performance 'seen' tracking for commit traversal (8c530d1)

git-revision-v0.1.0 - Apr 05, 2022

Refactor (BREAKING)

  • Make describe::Format more consistent with other builder APIs Configuration methods now take an argument which makes it more straightforward to use for most.

Commit Statistics

  • 41 commits contributed to the release over the course of 56 calendar days.
  • 59 days passed between releases.
  • 1 commit where understood as conventional.
  • 3 unique issues were worked on: #298, #301, #364

Thanks Clippy

Clippy helped 5 times to make code idiomatic.

Commit Details

view details

  • #298
    • fix git-revision dependencies (c336b03)
    • fix ordering of commits to actually be by commit-time, then topo-time (8286eac)
    • support for the --max-candidates flag (b9e6754)
    • Reduce amount of max candidates, add --debug flag (c8c13e3)
    • Use hashed-hasher for an eek of performance (324a839)
    • early-abort if all work is done during traversal (5b2aa70)
    • Make describe::Format more consistent with other builder APIs (0a7776b)
    • All documentation for the git-revision crate (8e0fb0a)
    • support for 'first-parent' traversal (52eae32)
    • support for fallbacks if no candidate available (39708a7)
    • describe-format with support for 'always' display style (79f386d)
    • finish depth computation works! (2e80e36)
    • prepare for finish-computation impl (9e10c7a)
    • Prepare test for 'gave_up_on' to motivate implementing finish_computation() (966ec3f)
    • use thiserror instead of quickerror (7dcd2a5)
    • Use quickerror to handle all error branches (1243417)
    • Some TODOs to not forget where to continue (84c0f15)
    • git-describe complete formatting (eefa6c5)
    • frame for testing describe(), first sketch of signature with return value (5841f47)
    • first failing test for describe() (23b1973)
  • #301
    • sort parents by most recent to find recent tags first (d240740)
    • refactor; first green tests (92a37ed)
    • no need for ordering by date, keep it simple (02909ea)
    • a step closer to the first successful test (710d46b)
    • a step towards traversing the graph (48cba41)
    • refactor (e22e2dd)
    • the trivial part of the actual implementation (92a67a6)
  • #364
    • More speedy access to author/committer (6129607)
  • Uncategorized
    • Release git-config v0.2.1, git-diff v0.15.0, git-traverse v0.14.0, git-pack v0.18.0, git-odb v0.28.0, git-ref v0.12.1, git-revision v0.1.0, git-repository v0.16.0, gitoxide-core v0.14.0, gitoxide v0.12.0, safety bump 6 crates (b612021)
    • thanks clippy (4d4fda6)
    • thanks clippy (f2faa00)
    • thanks clippy (9f18dca)
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • Merge branch 'svetli-n-refactor_git_config_tests' (babaa9f)
    • make fmt (7cf3545)
    • Remove serde support for describe types due to warning (2ba33c8)
    • thanks clippy (2c8a504)
    • INTERMEDIATE RESET ME (a4de008)
    • thanks clippy (f1ef59d)
    • Merge branch 'AP2008-implement-worktree' (f32c669)

git-repository-v0.16.0 - Apr 05, 2022

New Features

  • auto-calculation of a good hex-len, like what git does If the core.abbrev value isn't set or is set to auto.

  • Commit::describe() A way to fluidly configure a git describe operation and run it.

    Along that, a new Tag top-level object was added as well to provide convenient access to otherwise lower-level objects. It's not strictly required for our implementation here but it's needed for a symmetric API.

Commit Statistics

  • 19 commits contributed to the release.
  • 2 days passed between releases.
  • 2 commits where understood as conventional.
  • 1 unique issue was worked on: #298

Thanks Clippy

Clippy helped 5 times to make code idiomatic.

Commit Details

view details

  • #298
    • Use all tags by default, instead of requiring annotated tags (00c42ca)
    • Fix off-by-one error (d5b8fd5)
    • auto-calculation of a good hex-len, like what git does (47556f6)
    • Parse the hex-len from config on repo-initialization (aee55c0)
    • Support for simple BString powered string values (2381c5d)
    • refactor configuration handling to allow pre-parsing of common values (e3d280f)
    • restrict signature changes to 'Ancestores::sorting()` (d71bd9d)
    • Adjust to changes in git-traverse (8240622)
    • set MSRV to 1.54 as we really need VecDeque::binary_search (514e468)
    • support for the --max-candidates flag (b9e6754)
    • Reduce amount of max candidates, add --debug flag (c8c13e3)
    • Use hashed-hasher for an eek of performance (324a839)
    • Commit::describe() (654f4af)
  • Uncategorized
    • Release git-config v0.2.1, git-diff v0.15.0, git-traverse v0.14.0, git-pack v0.18.0, git-odb v0.28.0, git-ref v0.12.1, git-revision v0.1.0, git-repository v0.16.0, gitoxide-core v0.14.0, gitoxide v0.12.0, safety bump 6 crates (b612021)
    • thanks clippy (7887d8b)
    • thanks clippy (0f5a943)
    • thanks clippy (9407532)
    • thanks clippy (60cb858)
    • thanks clippy (f2faa00)

git-ref-v0.12.1 - Apr 05, 2022

New Features

  • add FullName(Ref)::category_and_shortname() It's a combination of shorten() and category() for convenience.

Commit Statistics

  • 2 commits contributed to the release over the course of 2 calendar days.
  • 2 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #364

Commit Details

view details

  • #364
    • add FullName(Ref)::category_and_shortname() (ecd60d7)
  • Uncategorized
    • refactor (2abedb8)

git-pack-v0.18.0 - Apr 05, 2022

Changed (BREAKING)

  • Remove deprecated compound and linked object databases The dynamic/general store is the only maintained can-do-it-all DB now.

Commit Statistics

  • 3 commits contributed to the release over the course of 1 calendar day.
  • 2 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #298

Commit Details

view details

  • #298
    • restrict signature changes to 'Ancestores::sorting()` (d71bd9d)
    • Adjust to changes in git-traverse (8240622)
  • Uncategorized
    • Remove deprecated compound and linked object databases (8c5ae77)

git-odb-v0.28.0 - Apr 05, 2022

New Features

  • Handle::packed_object_count() Provide packed objects numbers and cache the value for fast access later on.

Changed (BREAKING)

  • Remove deprecated compound and linked object databases The dynamic/general store is the only maintained can-do-it-all DB now.

Commit Statistics

  • 2 commits contributed to the release over the course of 1 calendar day.
  • 2 days passed between releases.
  • 2 commits where understood as conventional.
  • 1 unique issue was worked on: #298

Commit Details

view details

  • #298
    • Handle::packed_object_count() (84ec54e)
  • Uncategorized
    • Remove deprecated compound and linked object databases (8c5ae77)

git-diff-v0.15.0 - Apr 05, 2022

Changed (BREAKING)

  • Remove deprecated compound and linked object databases The dynamic/general store is the only maintained can-do-it-all DB now.

Commit Statistics

  • 4 commits contributed to the release over the course of 1 calendar day.
  • 2 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #298

Commit Details

view details

  • #298
    • restrict signature changes to 'Ancestores::sorting()` (d71bd9d)
    • Adjust to changes in git-traverse (8240622)
  • Uncategorized
    • remove left-over attribute (27df580)
    • Remove deprecated compound and linked object databases (8c5ae77)

git-config-v0.2.1 - Apr 05, 2022

Features

  • New values::String data type which makes it easier to obtain string values to work with as binary string.

Commit Statistics

  • 4 commits contributed to the release over the course of 2 calendar days.
  • 3 days passed between releases.
  • 0 commits where understood as conventional.
  • 1 unique issue was worked on: #298

Thanks Clippy

Clippy helped 1 time to make code idiomatic.

Commit Details

view details

  • #298
    • prepare changelog prior to release (fc8f52d)
    • Support for simple BString powered string values (2381c5d)
  • Uncategorized
    • thanks clippy (7887d8b)
    • Merge branch 'for-onefetch' (8e5cb65)

git-testtools-v0.6.0 - Apr 04, 2022

Test

  • ensure tests use 'merge.ff false' and recreate fixtures on each run

Commit Statistics

  • 25 commits contributed to the release over the course of 210 calendar days.
  • 223 days passed between releases.
  • 1 commit where understood as conventional.
  • 7 unique issues were worked on: #198, #266, #293, #298, #301, #364, #366

Thanks Clippy

Clippy helped 1 time to make code idiomatic.

Commit Details

view details

  • #198
    • fix windows tests by transforming line endings (e276d77)
  • #266
    • a failing test to show the handle-stability doesn't quite work yet (5562e88)
    • refactor (c499843)
  • #293
    • REUC reading works (29c1af9)
    • use parking_lot mutex to avoid poison errors (d8ca74f)
    • base setup for index testing (aa60fdf)
  • #298
    • upgrade parking_lot and cargo_toml (f95c1a0)
  • #301
    • refactor (9ea1e44)
  • #364
    • add test-tools changelog prior to release (1ebc16a)
  • #366
    • quickfix for unintentionally using 'unicode' feature of bytecode (fb5593a)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • Merge branch 'main' into mailmap (b2df941)
    • thanks clippy (1038dab)
    • add fixture_bytes to test tools (85e3820)
    • Commit to using 'unicode' feature of bstr as git-object wants it too (471fa62)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • Release git-bitmap v0.0.1, git-hash v0.9.0, git-features v0.19.0, git-index v0.1.0, safety bump 9 crates (4624725)
    • Release git-hash v0.9.2, git-object v0.17.1, git-pack v0.16.1 (0db19b8)
    • Merge branch 'index-information' (025f157)
    • Release git-hash v0.9.1, git-features v0.19.1, git-actor v0.8.0, git-config v0.1.10, git-object v0.17.0, git-diff v0.13.0, git-tempfile v1.0.4, git-chunk v0.3.0, git-traverse v0.12.0, git-pack v0.16.0, git-odb v0.26.0, git-packetline v0.12.3, git-url v0.3.5, git-transport v0.15.0, git-protocol v0.14.0, git-ref v0.11.0, git-repository v0.14.0, cargo-smart-release v0.8.0, safety bump 4 crates (373cbc8)
    • ensure tests use 'merge.ff false' and recreate fixtures on each run (1d5ab44)
    • Release git-hash v0.8.0, git-features v0.17.0, git-actor v0.6.0, git-object v0.15.0, git-diff v0.11.0, git-traverse v0.10.0, git-pack v0.13.0, git-odb v0.23.0, git-packetline v0.12.0, git-transport v0.13.0, git-protocol v0.12.0, git-ref v0.9.0, git-repository v0.11.0, git-commitgraph v0.6.0, gitoxide-core v0.12.0, gitoxide v0.10.0, cargo-smart-release v0.5.0, safety bump 16 crates (0e02953)
    • Adjusting changelogs prior to release of git-hash v0.7.0, git-features v0.16.5, git-actor v0.5.3, git-validate v0.5.3, git-object v0.14.1, git-diff v0.10.0, git-tempfile v1.0.3, git-lock v1.0.1, git-traverse v0.9.0, git-pack v0.12.0, git-odb v0.22.0, git-packetline v0.11.0, git-url v0.3.4, git-transport v0.12.0, git-protocol v0.11.0, git-ref v0.8.0, git-repository v0.10.0, cargo-smart-release v0.4.0, safety bump 3 crates (a474395)
    • Bump git-hash v0.6.0 (6efd90d)

v0.11.0 - Apr 03, 2022

Adapt to changes in git-features which change Send + Sync to Send + Clone. This happens to allow non-sync implementations (i.e. thread-local), along with Sync ones which usually are Clone too as they are passed by immutable reference (which is Clone + Copy).

Refactor (BREAKING)

  • Remove light* features, add 'lean-async' in its place; remove termion support

Changed (BREAKING)

  • remove Option<impl Progress> in favor of impl Progress
  • remove unnecessary Arc around should_interrupt flag
  • remove Sha1 mentions in index::verify::Mode::* variants The hash is repository defined and not hard-coded
  • Remove lean plumbing CLI

Bug Fixes

  • Collect all stdout messages in line renderer as well Otherwise the threaded line renderer will interfere with genuine program output.

New Features

  • gix mailmap verify command
  • ein find --debug to learn why it is slow
  • --counting-threads flag to configure amount of threads when counting The efficiency of multi-threaded counting is low per core, and despite some speedups might be desirable, one might not want to commit all cores to this amount of waste.
  • in-manifest and in-bin documentation of feature toggles Unfortunately, these don't show up on docs.rs due to it being a abinary only crate. One could consider throwing in a lib just for good measure.

Commit Statistics

  • 61 commits contributed to the release over the course of 126 calendar days.
  • 165 days passed between releases.
  • 10 commits where understood as conventional.
  • 12 unique issues were worked on: #215, #263, #266, #279, #287, #289, #293, #298, #301, #329, #366, #67

Commit Details

view details

  • #215
    • Collect all stdout messages in line renderer as well (57ca045)
    • Fix compile warning (e4514a8)
    • Remove reference of pretty-cli in code tree (4bd2f29)
    • Remove lean plumbing CLI (51bf03f)
    • Remove light* features, add 'lean-async' in its place; remove termion support (4d2d433)
  • #263
    • fmt (fbeddeb)
    • A mad attempt to use thread-local everywhere and avoid Sync… (0af5077)
  • #266
    • Provide handle with a snapshot of the store's state (6e0cd6d)
  • #279
    • Fast-path multi-pack index verification in the CLI (bcde935)
    • Basic multi-pack index creation (89428b2)
    • 'index' with its own sub-commands (c4c5678)
    • even nicer printing (d2bea27)
    • remove Option<impl Progress> in favor of impl Progress (bf04644)
    • remove unnecessary Arc around should_interrupt flag (d851bed)
    • remove Sha1 mentions in index::verify::Mode::* variants (c2679a0)
  • #287
    • share and pass cli arguments for pack verification (db43e47)
    • Very rough version of repository verification (80a4a7a)
    • Adjustments to deal with changes to git-pack/git-odb (fcf8fde)
  • #289
    • 'pack' with its own sub-commands (fb64af4)
    • 'remote' with its own sub-commands (8677f7e)
    • 'commitgraph' with its own sub-commands (db0251e)
  • #293
    • faster writing to stdout/stderr for plumbing commands (d04dc01)
    • Add 'index verify' subcommand to 'gix' (1ac2c21)
    • Flag to hide extension details (34ea001)
    • Print basic index information, including the tree extension (9277cf8)
    • Basic entry information (239e7b2)
    • refactor (8bf585d)
    • JSON output for index entries (3fc1622)
  • #298
    • Simplify command-line options declaration (f790a55)
    • frame for printing index information (9ea98fd)
  • #301
    • greatly simplify render-line logic (a8fa53a)
    • pass thread-limit along to checkout (07e9081)
    • add thread-count and chunk-size computation; interrupt capability (8cbe85d)
    • a first sketch of access odb information using a sub-command (89b628a)
    • sub-command to print multi-index entries (6c10e09)
    • pack multi-index info subcommand (21c2dd5)
    • refactor (e6a3d43)
    • detailed report about issues after checkout (613483b)
    • keep-going support on the command-line (73a7393)
    • add tree-info subcommand to more easily test actual tree-traversal performance (29fb0c8)
    • frame for traversing tree entries (0e55fbb)
    • Properly use 'max-performance' feature toggle to get pack caches :D (a39d476)
    • allow writing empty files during checkout but also query the odb (5388d80)
    • support for repo to write actual objects (5494fb3)
    • basic version of index checkout via command-line (f23b8d2)
    • support for unicode-precomposition for gix apps (e90c123)
  • #329
    • in-manifest and in-bin documentation of feature toggles (25da30f)
  • #366
    • frame for printing mailmap entries using git-repository (2a01f47)
    • gix mailmap verify can now detect collisions (f89fe2f)
    • gix mailmap verify command (384ed66)
  • #67
    • --counting-threads flag to configure amount of threads when counting (0090961)
  • Uncategorized
    • make fmt (7cf3545)
    • small build now uses the line renderer as well (652a0ac)
    • Upgrade to prodash 19 (90c6c5a)
    • ein find --debug to learn why it is slow (70109be)
    • Merge branch 'short-id' (5849d5b)
    • fix clap warnings (aa51e05)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • improve CLI docs (866530a)
    • rename 'gix commitgraph' back to 'gix commit-graph' (d6a72e7)
    • thanks clippy (b0f7328)

gitoxide-core-v0.13.0 - Apr 03, 2022

Refactor (BREAKING)

  • clarify different repository types much better
  • Remove light* features, add 'lean-async' in its place; remove termion support
  • remove pack-cache from Find::try_find(…) With the new architecture this can be an implementation detail without forcing it to be Sync.
  • move git_pack::data::Object to git_object::Data, massively alter git_odb::Find trait This will break a lot, but has to happen to prepare these traits for the next generation of object databases.

Other

  • Try to make Handle usable for pack creation It's nearly there, but for some reason the boxed dyn traits don't get to be Send even though it's specified.

Bug Fixes

  • Allow resolution of in-pack ref-deltas This finally allows delta tree caches to be used on typical small packs returned by GitHub.

  • keep non "git" repository name extensions When converting a remote URL to a destination directory name, keep extension strings if they are not equal to "git". For example,

  • Avoid the dashmap being cloned for each thread Intead, share it by reference, it's sync after all.

    This issue was introduced when switching to a Send + Clone model, instead of Send + Sync, to allow thread-local caches in database handles of all kinds.

New Features

  • ein tool estimate-hours with shallow clone support
  • ein tool estimate-hours now supports mailmaps
  • gix repository mailmap entries
  • gix mailmap verify command
  • unstable mailmap module
  • ein find with support for worktree checkouts
  • ein find --debug to learn why it is slow
  • --counting-threads flag to configure amount of threads when counting The efficiency of multi-threaded counting is low per core, and despite some speedups might be desirable, one might not want to commit all cores to this amount of waste.
  • in-manifest and in-lib documentation of feature toggles

Changed (BREAKING)

  • file::Store::(try_)find(…, packed) was removed The packed buffer is now handled internally while loading it on demand. When compiled with git-features/parallel the file::Store remains send and sync.

    The packed refs buffer is shared across clones and it's recommended to clone one file::Store instance per thread, each of which can use its own namespace.

  • parallel utilities now use Send + Clone insted of Send + Sync This helps to assure that thread-local computations always work with the kind of types we provide. The ones that are carrying out actions are notably not Sync anymore.

    We cater to that by defining our bounds accordingly, but for those who want to use other utilities that need Sync, using types like Repository and thread_local!() is the only way to make this work.

  • Rename gix->ein and gixp->gix

  • remove Option<impl Progress> in favor of impl Progress

  • multi-index integrity check; use integrity::Outcome for various integrity checks

  • remove unnecessary Arc around should_interrupt flag

  • remove Sha1 mentions in index::verify::Mode::* variants The hash is repository defined and not hard-coded

  • introduce index::File::verify_integrity(…, pack: Option<PackContext>, …), replacing tuple This allows for more documentation on what input is required there and generally makes for an easier to use API.

  • consistently use object_hash instead of hash_kind

Commit Statistics

  • 143 commits contributed to the release over the course of 156 calendar days.
  • 165 days passed between releases.
  • 26 commits where understood as conventional.
  • 14 unique issues were worked on: #215, #247, #263, #266, #279, #287, #293, #298, #301, #329, #333, #364, #366, #67

Commit Details

view details

  • #215
    • Remove light* features, add 'lean-async' in its place; remove termion support (4d2d433)
  • #247
    • Rename gix->ein and gixp->gix (e8b0919)
  • #263
    • Adjust to chagne signature of peel_to_id_in_place (again?) (dd5341f)
    • file::Store::(try_)find(…, packed) was removed (15d429b)
    • parallel utilities now use Send + Clone insted of Send + Sync (e7526b2)
    • A mad attempt to use thread-local everywhere and avoid Sync… (0af5077)
  • #266
    • upgrade dependencies (c301abe)
    • Make single-threaded programs possible to use with git-repository (dde5c6b)
    • Use new store in git-repository (2f9e342)
    • Use handle with default cache configuration in 'ein hours' (f71806f)
    • adapt to changes in git-repository (fae309b)
    • Adjust object-acess to test new contains method (8488b41)
    • Adjustments to match changes in git-repository (117d5f8)
    • Adapt to changes in git-repository (3ab9b03)
    • Adapt to changes in git-repository (3266c47)
    • Adjust pack-create to changes in git-pack (12db899)
    • Cache-creators are indeed shared across threads, must be sync (c326cb3)
    • Try to make Handle usable for pack creation (424c9b3)
    • Inform when multi-threaded counting is rejected (cc3b070)
    • remove pack-cache from Find::try_find(…) (ebc7f47)
    • move git_pack::data::Object to git_object::Data, massively alter git_odb::Find trait (2290d00)
  • #279
    • Fast-path multi-pack index verification in the CLI (bcde935)
    • Add a less thorough and faster way of verifying multi-indices (7517482)
    • Handle large multi-pack indices correctly (4f6b030)
    • Fix progress and handling of large of multi-pack index offsets (5dc1f81)
    • Basic multi-pack index creation (89428b2)
    • Add frame for writing a multi-pack index (9ce1e7f)
    • adjust to changes in git_pack (7907ca8)
    • even nicer printing (d2bea27)
    • nicer printing of index verification results (e3dfa12)
    • very first experimental support for multi-pack index verification (bb35c69)
    • remove Option<impl Progress> in favor of impl Progress (bf04644)
    • multi-index integrity check; use integrity::Outcome for various integrity checks (6829e5e)
    • remove unnecessary Arc around should_interrupt flag (d851bed)
    • remove Sha1 mentions in index::verify::Mode::* variants (c2679a0)
    • introduce index::File::verify_integrity(…, pack: Option<PackContext>, …), replacing tuple (80b120d)
    • refactor (005fba7)
    • consistently use object_hash instead of hash_kind (de4fa64)
    • Adjust to changes in git-odb (710780c)
    • adapt to changes in git-pack (28dba20)
    • Deal with changes to git-odb Write trait (4d67122)
    • adapt to changes to git-odb (5b0e2b9)
    • adapt to changes in git-hash (82fec95)
  • #287
    • lower-case json fields for consistency (f6c0e6d)
    • basic output for 'repo verify' json only (9f8d61f)
    • share and pass cli arguments for pack verification (db43e47)
    • Allow resolution of in-pack ref-deltas (84ade1d)
    • Very rough version of repository verification (80a4a7a)
    • frame for loose-db validation (a24307d)
    • Adjustments to deal with changes to git-pack/git-odb (fcf8fde)
  • #293
    • Assert store tree cache matches actual source objects (b062bec)
    • Sketch a surprisingly difficult way of loading objects in verify_extension() (3baeab4)
    • Also verify the index of the default workspace (15b8372)
    • First stab at tree verification (f928350)
    • Add 'index verify' subcommand to 'gix' (1ac2c21)
    • Now we are able to load indices correctly (762efa3)
    • refactor (3541e33)
    • Print extension names instead of count (1cc07e0)
    • Flag to hide extension details (34ea001)
    • refactor (d0725bd)
    • Fix tree-extension loading for empty trees (2e13989)
    • Print basic index information, including the tree extension (9277cf8)
    • Basic entry information (239e7b2)
    • refactor (8bf585d)
    • JSON output for index entries (3fc1622)
    • fix build (e3977fe)
    • refactor (9b28b18)
  • #298
    • adapt to changes in `git-repository' (16a1c36)
    • clarify different repository types much better (bbc6efe)
    • Also print stage of entries (003515f)
    • simple printing of basic entry information (329538b)
    • frame for printing index information (9ea98fd)
  • #301
    • pass thread-limit along to checkout (07e9081)
    • conversions from Rc to arc for Handle (c19331e)
    • proper handling of interruptions during checkout (7575a58)
    • add thread-count and chunk-size computation; interrupt capability (8cbe85d)
    • refactor (542f49b)
    • return proper errors during checkout object lookup (f9beac0)
    • more safety around recursion and invariants when resolving ref-deltas (dddb4a5)
    • elaborate odb info and simple entries printing (0f65282)
    • a first sketch of access odb information using a sub-command (89b628a)
    • sub-command to print multi-index entries (6c10e09)
    • pack multi-index info subcommand (21c2dd5)
    • bring back more detailed errors in case of keep-going (8198817)
    • use progress to print errors right when they happen (af03686)
    • detailed report about issues after checkout (613483b)
    • keep-going support on the command-line (73a7393)
    • add tree-info subcommand to more easily test actual tree-traversal performance (29fb0c8)
    • fix 'tree entries' performance by not decoding every object (53e79c8)
    • first basic tree visualization with --recursive and flat display (111400f)
    • frame for traversing tree entries (0e55fbb)
    • fix progress - there is no max value for bytes written (537e5aa)
    • allow writing empty files during checkout but also query the odb (5388d80)
    • support for repo to write actual objects (5494fb3)
    • basic version of index checkout via command-line (f23b8d2)
  • #329
    • in-manifest and in-lib documentation of feature toggles (aa3795d)
    • Document all features related to serde1 (72b97f2)
  • #333
    • Use git_features::path everywhere where there is a path conversion (2e1437c)
    • remove os-str-bytes everywhere (71a086a)
    • gitoxide-core without os-str-bytes (909aa14)
  • #364
    • add some precaution to avoid strange interactions with packs (b052a9a)
    • ein tool estimate-hours with shallow clone support (30b22a8)
    • simplify estimate-hours by just looking at the author signature (beb478f)
    • Adjust to breaking changes in git-traverse (d79b506)
    • Full error handling for CommitRefIter (b94471a)
  • #366
    • ein tool estimate-hours now supports mailmaps (def80df)
    • gix repository mailmap entries (d2388d8)
    • frame for printing mailmap entries using git-repository (2a01f47)
    • gix mailmap verify can now detect collisions (f89fe2f)
    • gix mailmap verify command (384ed66)
    • unstable mailmap module (e3bc1b4)
  • #67
    • --counting-threads flag to configure amount of threads when counting (0090961)
    • Avoid the dashmap being cloned for each thread (6d3f52d)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • Merge branch 'svetli-n-refactor_git_config_tests' (babaa9f)
    • make fmt (7cf3545)
    • adapt to breaking changes in git-actor (40c48c3)
    • ein find with support for worktree checkouts (3f28e20)
    • ein find --debug to learn why it is slow (70109be)
    • thanks clippy (804d5f1)
    • thanks clippy (5db3993)
    • Release git-tempfile v2.0.0, safety bump 6 crates (90b1c42)
    • upgrade document-features (c35e62e)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • Release git-hash v0.9.2, git-object v0.17.1, git-pack v0.16.1 (0db19b8)
    • Merge branch 'index-verification' (ad3c803)
    • Release git-config v0.1.11 (a605b67)
    • Merge branch 'index-information' (025f157)
    • thanks clippy (3aba4b4)
    • Release git-hash v0.9.1, git-features v0.19.1, git-actor v0.8.0, git-config v0.1.10, git-object v0.17.0, git-diff v0.13.0, git-tempfile v1.0.4, git-chunk v0.3.0, git-traverse v0.12.0, git-pack v0.16.0, git-odb v0.26.0, git-packetline v0.12.3, git-url v0.3.5, git-transport v0.15.0, git-protocol v0.14.0, git-ref v0.11.0, git-repository v0.14.0, cargo-smart-release v0.8.0, safety bump 4 crates (373cbc8)
    • thanks clippy (5a68d2f)
    • Merge branch 'use-midx-in-store' (338521b)
    • keep non "git" repository name extensions (d33795f)
    • thanks clippy (533a532)
    • Release git-chunk v0.2.0, safety bump 4 crates (b792fab)
    • Merge branch 'oknozor-feat/traversal-sort-by-committer-date' (6add377)
    • Fix pack/create (4d8de93)
    • Release git-features v0.18.0, git-actor v0.7.0, git-config v0.1.9, git-object v0.16.0, git-diff v0.12.0, git-traverse v0.11.0, git-pack v0.15.0, git-odb v0.25.0, git-packetline v0.12.2, git-transport v0.14.0, git-protocol v0.13.0, git-ref v0.10.0, git-repository v0.13.0, cargo-smart-release v0.7.0, safety bump 12 crates (acd3737)
    • Adjust changelogs prior to release (ec38950)
    • Merge branch 'git-loose-objects' of https://github.com/xmo-odoo/gitoxide into xmo-odoo-git-loose-objects (ee737cd)
    • Adjusting changelogs prior to release of git-config v0.1.8, git-object v0.15.1, git-diff v0.11.1, git-traverse v0.10.1, git-pack v0.14.0, git-odb v0.24.0, git-packetline v0.12.1, git-transport v0.13.1, git-protocol v0.12.1, git-ref v0.9.1, git-repository v0.12.0, cargo-smart-release v0.6.0, safety bump 5 crates (39b40c8)
    • Merge branch 'header-field-multi-improve' of https://github.com/xmo-odoo/gitoxide into xmo-odoo-header-field-multi-improve (d88e377)

git-worktree-v0.1.0 - Apr 03, 2022

An initial release with the ability to checkout indices with simple files only.

Commit Statistics

  • 95 commits contributed to the release over the course of 59 calendar days.
  • 84 days passed between releases.
  • 0 commits where understood as conventional.
  • 6 unique issues were worked on: #298, #301, #331, #333, #364, #366

Thanks Clippy

Clippy helped 5 times to make code idiomatic.

Commit Details

view details

  • #298
    • Use hash_hasher based hash state for better keys/less collisions (814de07)
  • #301
    • refactor (f86eacc)
    • use io-close instead of close-file - works (279461b)
    • better error handling on close (a28c9b3)
    • try close_file crate and see tests fail for some reason (c7e1400)
    • more multi-threaded test stability (be5a19e)
    • avoid racyness in worktree tests (c8a1319)
    • stabilize assertions in parallel mode (21d6f88)
    • a reducer which produces progress reporting each time it feeds (e83079d)
    • call chunk processing in threaded processor (6bfd865)
    • conversions from Rc to arc for Handle (c19331e)
    • basic parallelization, without proper reducer, just so it compiles (5f29c0f)
    • decouple amount of bytes written from progress (9ecdade)
    • parallel and non-parallel tests (1cd7eb3)
    • switch index checkout to chunk-based operation (e5f6943)
    • proper handling of interruptions during checkout (7575a58)
    • add thread-count and chunk-size computation; interrupt capability (8cbe85d)
    • refactor (542f49b)
    • refactor (c3c31af)
    • fix windows test expecations for good (81bcb8d)
    • try to fix windows once again (ff95265)
    • some more debugging on windows (0c18443)
    • debug mode for windows (8f3bc5a)
    • See if we can remove symlinks this way on windows (0bc9489)
    • delete directories recursively on overwrite-existing (ea561e6)
    • better symlink checking on ubuntu (facad25)
    • overwrite-existing support with tests (49d1d34)
    • Fix dir-cache to properly handle its valiity which fixes test (52c0058)
    • delayed symlink creation for everyone, but… (ab5cd3d)
    • delayed symlink creation for windows, but… (77b053d)
    • prepare for first overwrite test… (cd6e086)
    • fix case-insensitive tests (ccd25cb)
    • Allow symlinks to dirs to be returned, too (d3d7a7c)
    • try to fix tests on linux (9f9d36d)
    • a stab at making file writes safer… (805c0da)
    • mior refactor and notes towards parallelization (99de1ef)
    • return proper errors during checkout object lookup (f9beac0)
    • switch worktree to thiserror (bacc654)
    • sub-command to print multi-index entries (6c10e09)
    • bring back more detailed errors in case of keep-going (8198817)
    • use progress to print errors right when they happen (af03686)
    • implement 'keep-going' for index checkout (ecebc55)
    • Support for forceful removal of symlinks or files during dir creation (749c310)
    • forbid symlinks and files in the path (de58f50)
    • avoid popping the entire cached path (a3501df)
    • basic impl of the dir cache which already avoids unnecessary allocations (cb36d56)
    • sketch out dir cache and realize that git uses chdir (f4621cc)
    • allow writing empty files during checkout but also query the odb (5388d80)
    • basic version of index checkout via command-line (f23b8d2)
    • basic progress reporting for checkout (039e822)
    • support for unicode-precomposition for gix apps (e90c123)
    • fix symlink creation on windows, hopefully (4b1650b)
    • gather more information about test failure on windows (be5e3fb)
    • hopefully fix symlink creation on windows (acb8acd)
    • refactor (48dc401)
    • also validate symlink collisions (322c316)
    • fix compile warnings (58145bc)
    • try to fix windows (5c1e727)
    • finally an understanding on collision checking (0454e4a)
    • Add check_stat and trust_ctime options to index checkout (1a502c7)
    • validate that colliding files are checked out (09fecd9)
    • support for executable bit check (267e3a7)
    • probe precompose unicode (0c1c006)
    • refactor (fc816bd)
    • determine filesystem case (f8e1de0)
    • basic test for filesystem probing (adbed12)
    • symlink probing (1bfbf1d)
    • make clear that we are currently only dealing with checkout during clone (178beb4)
    • refactor for checkout to use fs::Context (8914fcc)
    • document-features support for git-index and git-worktree (1367cf5)
    • Support for 'serde1' feature in git-worktree (f11929c)
    • sketch filesystem context, without probing for now (de3749e)
    • refactor (004394a)
    • restructure tests (831c429)
    • make fmt (636fa8a)
    • strucural refactor (cdca1df)
    • Allow mutation of entries during iteration, while obtaining their path (d0c4563)
    • refactor (72af261)
  • #331
    • Fix build (f6d9693)
  • #333
    • Use git_features::path everywhere where there is a path conversion (2e1437c)
  • #364
    • update changelogs prior to release (746a676)
  • #366
    • the first possibly working version of loading a mailmap with multiple sources (98d745e)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • make fmt (7cf3545)
    • thanks clippy (07a4094)
    • thanks clippy (0e2a243)
    • thanks clippy (3229240)
    • thanks clippy (a8e9497)
    • thanks clippy (e04cba8)
    • Refactored code and tests (a4b880c)
    • Refactored tests (25a9dc1)
    • Reduce io calls (e838eaa)
    • Refactor errors and remove unwraps (eaee855)
    • Implemented git-worktree (4177d72)

git-url-v0.4.0 - Apr 03, 2022

A maintenance release without surfacing changes.

Commit Statistics

  • 8 commits contributed to the release over the course of 68 calendar days.
  • 69 days passed between releases.
  • 0 commits where understood as conventional.
  • 4 unique issues were worked on: #329, #331, #333, #364

Commit Details

view details

  • #329
    • Document all features related to serde1 (72b97f2)
  • #331
    • Adapt to changes in git_features::path to deal with Result (bba4c68)
  • #333
    • Use git_features::path everywhere where there is a path conversion (2e1437c)
  • #364
    • update changelogs prior to release (746a676)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • Merge branch 'index-information' (025f157)

git-traverse-v0.13.0 - Apr 03, 2022

Changed (BREAKING)

  • require Ancestors traversal find() to return Result Previously it would return an Option and squelch legitimate errors which already let to quite a bug hunt.

    Now find() should always return the original error when finding an existing object, and keep it around in a Box. That way we don't add yet another type parameter.

    Performance implications are measurable, but marginable. The error type might be too big which is something we can indeed look at.

Commit Statistics

  • 11 commits contributed to the release over the course of 68 calendar days.
  • 69 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #364

Commit Details

view details

  • #364
    • fix docs (0a1caeb)
    • require Ancestors traversal find() to return Result (83746f6)
    • Full error handling for CommitRefIter (b94471a)
    • More speedy access to author/committer (6129607)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • Merge branch 'svetli-n-refactor_git_config_tests' (babaa9f)
    • adapt to breaking changes in git-actor (40c48c3)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • Release git-bitmap v0.0.1, git-hash v0.9.0, git-features v0.19.0, git-index v0.1.0, safety bump 9 crates (4624725)
    • Merge branch 'index-information' (025f157)

git-transport-v0.16.0 - Apr 03, 2022

New Features

  • in-manifest and in-lib documentation of feature toggles

Commit Statistics

  • 8 commits contributed to the release over the course of 68 calendar days.
  • 69 days passed between releases.
  • 1 commit where understood as conventional.
  • 1 unique issue was worked on: #329

Commit Details

view details

  • #329
    • in-manifest and in-lib documentation of feature toggles (39778fd)
    • Document all features related to serde1 (72b97f2)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • upgrade document-features (c35e62e)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • Release git-bitmap v0.0.1, git-hash v0.9.0, git-features v0.19.0, git-index v0.1.0, safety bump 9 crates (4624725)
    • Merge branch 'index-information' (025f157)

git-tempfile-v2.0.1 - Apr 03, 2022

A maintenance release without any changes on the surface.

Commit Statistics

  • 4 commits contributed to the release over the course of 42 calendar days.
  • 44 days passed between releases.
  • 0 commits where understood as conventional.
  • 3 unique issues were worked on: #298, #328, #364

Commit Details

view details

  • #298
    • refactor (591b533)
  • #328
    • a stress test to try conjure deadlocks in handlers (3bdecb5)
  • #364
    • update changelogs prior to release (746a676)
  • Uncategorized
    • make fmt (7cf3545)

git-repository-v0.15.0 - Apr 03, 2022

New Features

  • support for object replacement The Repository now respects replacement refs created by git replace and picks up environment variables for its configuration as well.

    Which environment variables are used is fully configurable.

  • support for trimming of whitespace around name and email It's separated from parsing to assure we can round-trip, but it's made easy to obtain trimmed results using new methods.

    This high-level git-repository will also trim by default now.

  • Repository::head_commit() A shortcut to get to the commit much faster.

  • ein tool estimate-hours now supports mailmaps

  • Repository::head_id() A long-needed shortcut.

  • gix repository mailmap entries

  • unstable mailmap module

  • Commit::short_id()

  • in-manifest and in-lib documentation of feature toggles

  • easy::Commit::time() to access the committers time conveniently.

  • easy::Head::name() to learn about the name of the HEAD ref It's mainly for completeness to provide people with with a FullNameRef of HEAD.

  • easy::Head::peel_to_commit_in_place() It allows to quickly get a commit from the head, something most people want when getting started with any kind of tool.

  • Repsitory::load_index() This method makes the index of the default workspace available.

Bug Fixes

  • Properly classify worktrees as non-bare, helps with ein t find They use git-files which point to the actual repository data.

Changed (BREAKING)

  • Easier access to local and remote branches

New Features (BREAKING)

  • interrupt::Iter, rename interrupt::Iter -> interrupt::IterWithError
  • Let 'easy::Object::try_into_…()returntry_into::Error. That way, the typical usage of try_into_commit()?will not result in a strange error aboutObject` not being convertible into some error. We think having a real error there is the least surprising.

Bug Fixes (BREAKING)

  • do not install signal handlers by default The previous behaviour is meant to be convenient for the casual user even though it ends up being surprising when used in applications that install their own signal handlers and need more control over how the program shuts down.

    This is now fixed by requiring an explicit setup() call before the first tempfile is created, which makes it a breaking change.

Other (BREAKING)

  • Id::prefix -> Id::shorten() It's definitely more intuitive that way.

Refactor (BREAKING)

  • disoolve 'easy' module by moving everything one level up
  • clarify different repository types much better

Commit Statistics

  • 85 commits contributed to the release over the course of 68 calendar days.
  • 69 days passed between releases.
  • 21 commits where understood as conventional.
  • 7 unique issues were worked on: #293, #298, #301, #329, #336, #364, #366

Thanks Clippy

Clippy helped 5 times to make code idiomatic.

Commit Details

view details

  • #293
    • easy::Commit::time() to access the committers time conveniently. (9f5663e)
    • easy::Head::name() to learn about the name of the HEAD ref (7c88b62)
    • fix build (d89a587)
    • Repsitory::load_index() (1c22d76)
  • #298
    • actual default hex-len for short-ids is 7, but… (36e004b)
    • quick sketch of how the retrieval of ints from config could look like (af6326f)
    • frame for simplified config access via Repository (eba2b9a)
    • fix docs; consistent naming of 'repo' (1f79bc3)
    • rename sync::Handle into ThreadSafeRepository (1cc4faa)
    • disoolve 'easy' module by moving everything one level up (c10f07c)
    • prepare for moving `git-repository::easy:: one level up (ccecb9a)
    • make config available in easy::Repository (fbdb1a2)
    • refactor (591b533)
    • refactor (a1a846a)
    • clarify different repository types much better (bbc6efe)
    • docs (a45f378)
    • First stab at Oid::prefix() (35e77c1)
    • easy::Head::peel_to_commit_in_place() (3b0913a)
    • Let 'easy::Object::try_into_…()returntry_into::Error`. (813a3be)
  • #301
    • interrupt::Iter, rename interrupt::Iter -> interrupt::IterWithError (8945d95)
    • refactor (9ea1e44)
    • unset the pack cache if GITOXIDE_DISABLE_PACK_CACHE is set (6d8bc49)
    • frame for traversing tree entries (0e55fbb)
    • basic version of index checkout via command-line (f23b8d2)
    • support for unicode-precomposition for gix apps (e90c123)
    • Commit::short_id() (1be00cf)
    • verify that Id::prefix() makes use of the git configuration (76e9110)
  • #329
    • in-manifest and in-lib documentation of feature toggles (c7dff9e)
    • Document all features related to serde1 (72b97f2)
  • #336
    • do not install signal handlers by default (c863ea5)
  • #364
    • support for object replacement (1322dbf)
    • initialize replacements in a configurable way (6a27985)
    • add some precaution to avoid strange interactions with packs (b052a9a)
    • commit traversals on shallow clones are non-fatal by default (1a75357)
    • adapt to changes in git-ref (f606f88)
    • support for trimming of whitespace around name and email (a39bf71)
    • Add and improve Debug implementation on major types (d23c3d4)
    • also inform about average and max commit sizes (5052a4e)
    • Adjust to breaking changes in git-traverse (d79b506)
    • fix install_dir(); refactor (11644bd)
    • Repository::head_commit() (0057804)
    • Repository::head_id() (f0d8a49)
    • fix docs (29822c6)
    • Id::prefix -> Id::shorten() (5f75953)
    • refactor (b1b9871)
    • Easier access to local and remote branches (a8b6589)
    • Fix lifetime declarations to allow ancestors().all() chaining (df24f16)
    • consolidate naming of directories, use same convention as git2 (a7dbed1)
    • Full error handling for CommitRefIter (b94471a)
    • More speedy access to author/committer (6129607)
    • adjust to changes in git-actor (e5c0200)
    • cleaner API for detaching objects, now for commits as well (59d75fc)
  • #366
    • ein tool estimate-hours now supports mailmaps (def80df)
    • gix repository mailmap entries (d2388d8)
    • frame for printing mailmap entries using git-repository (2a01f47)
    • the first possibly working version of loading a mailmap with multiple sources (98d745e)
    • frame for Repository::load_mailmap_into() (c8c87ec)
    • unstable mailmap module (e3bc1b4)
  • Uncategorized
    • Merge branch 'for-onefetch' (8e5cb65)
    • Release git-hash v0.9.3, git-features v0.20.0, git-config v0.2.0, safety bump 12 crates (f0cbb24)
    • Merge branch 'svetli-n-refactor_git_config_tests' (babaa9f)
    • make fmt (7cf3545)
    • Properly classify worktrees as non-bare, helps with ein t find (c329dd7)
    • fix MSRV (1bf5d11)
    • thanks clippy (8e2e4e3)
    • Merge branch 'short-id' (5849d5b)
    • Set the MSRV version explicitly in git-repository (bbf6799)
    • thanks clippy (4618f8a)
    • thanks clippy (5db3993)
    • remove unused dependency (2fbc93c)
    • thanks clippy (d5911b5)
    • Release git-tempfile v2.0.0, safety bump 6 crates (90b1c42)
    • upgrade document-features (c35e62e)
    • Merge branch 'AP2008-implement-worktree' (f32c669)
    • Release git-actor v0.8.1 (08fe550)
    • Release git-bitmap v0.0.1, git-hash v0.9.0, git-features v0.19.0, git-index v0.1.0, safety bump 9 crates (4624725)
    • fix lint (b339b41)
    • remove debug-helper (c243215)
    • Release git-hash v0.9.2, git-object v0.17.1, git-pack v0.16.1 (0db19b8)
    • Don't use bleeding edge features (3de0ab1)
    • reference statistics for stats example (83b99ce)
    • Merge branch 'index-verification' (ad3c803)
    • Release git-config v0.1.11 (a605b67)
    • thanks clippy (2f25bf1)
    • Merge branch 'index-information' (025f157)

Information - Updated May 13, 2022

Stars: 3.6K
Forks: 85
Issues: 46

Repositories & Extras

Misc

248

A CLI tool to easily get a new project up and running by using pre-made...

A rust cross platform rust boilerplate template to get up and running quickly

A CLI tool to easily get a new project up and running by using pre-made...

CLI tool to generate C++ / SPIR-V enumerations and tables for SpvGenTwo

CLI tool to generate C++ / SPIR-V enumerations and tables for spirv

CLI tool to generate C++ / SPIR-V enumerations and tables for SpvGenTwo

CLI QR code generator and reader written in rust

QRrs is a simple, cross-platform, command-line utility written in rust for working with qr codes (what actually follows from the name)

CLI QR code generator and reader written in rust

CLI manager of time-based one-time password generators

Grab an appropriate binary from the MIT License

CLI manager of time-based one-time password generators

labels is a CLI utility to synchornize your labels in a specific GitHub repo

At this time labels is only available from GitHub

labels is a CLI utility to synchornize your labels in a specific GitHub repo

Renote is a CLI to extend GitHub operation experience, which is a complementary tool to...

Renote is a CLI to extend GitHub operation experience, which is a complementary tool to use with gh advanced search options

Renote is a CLI to extend GitHub operation experience, which is a complementary tool to...

Godot Rust CLI is an easy to incorporate Rust modules into your Godot project

Also keep in mind that the main branch will usually be ahead of the version on GitHub repo

Godot Rust CLI is an easy to incorporate Rust modules into your Godot project
Facebook Instagram Twitter GitHub Dribbble
Privacy