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

Overview

Rust Crates.io

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.

asciicast

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.
  • 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.
      • commit
        • describe - identify a commit by its closest tag in its past
      • 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

Stabilization Candidates

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

Initial Development

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 default installation, 'max'
cargo install gitoxide

# For smaller binaries and even faster build times that are traded for a less fancy CLI implementation, use `lean`
# or `lean-termion` respectively.
cargo install gitoxide --no-default-features --features lean

The following installs the latest unpublished release directly from git:

cargo install --git https://github.com/Byron/gitoxide  gitoxide

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

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

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!
Comments
  • [performance] beating git in `git verify-pack` ✅ 🚀

    [performance] beating git in `git verify-pack` ✅ 🚀

    When trying to beat git verify-pack

    Attempt 1

    I remembered timings on a cold cache that indicated something around 5:50min for git to run a verify pack on the linux kernel pack. However, turns out that if the environment is a little more controlled, git is still considerably faster than us despite using an LRU cache and despite using multiple cores quite efficiently.

    hard-to-beat-the-king
    Observation

    Git uses a streaming pack approach which is optimized to apply objects inversely. It works by

    • decompressing all deltas
    • applying all deltas that depend on a base, recursively (and thus avoiding to have to decompress deltas multiple times)

    We work using a memory mapped file which is optimized for random access, but won't be very fast for this kind of workload.

    How to fix

    Wait until we have implemented a streaming pack as well and try again, having the same algorithmical benefits possibly faired with more efficient memory handling. Git for some reason limits the application to 3 threads, even though we do benefit from having more threads so could be faster just because of this. The streaming (indexing) phase of reading a pack can be parallelised in case we have a pack on disk, and it should be easy to implement if the index datastructure itself is threadsafe (but might not be worth the complexity or memory overhead, let's see).

    opened by Byron 31
  • [repository] Sketch design of 'Easy' mode

    [repository] Sketch design of 'Easy' mode

    Motivation

    git2 is actually quite easy to use, with a relatively high-level API that hides a lot of the plumbing that actually has to happen under the hood. Currently gitoxide has no such interface which requires a lot of knowledge to use and can be cumbersome at times.

    This PR aims to provide a draft of a new Easy mode that provides a similarly simple API while hiding all the details. A major goal is to keep the lower level accessible for those who need it to eek out a few more percent of performance while offering a higher level that doesn't sacrifice too much performance for convenience, striking just the right balance.

    We will use cargo smart-release as a driver and validator for the new API as it touches references, objects and trees right now.

    Note that this PR was created 'late' in the development process as it's the first to try out a new workflow to help receiving comments on major features or changes.

    Tasks

    • [x] be cargo-release compatible when tagging versions
    • experiment with ways of handling threaded and non-threaded high-level APIs
      • [x] convenient sharing of mutable state in threaded and unthreaded contexts
      • [x] a way to detach extra state to create transfer objects to pass thread boundaries, and to reattach it
      • [x] See if non-panicking could be an option for this API. Soon both make no difference in terms of backtraces
      • [x] Write down and possibly practice how caches are supposed to be handled. What happens with new packs being created by a gc, or with changing config files?
    • [x] streamline ergonomics of finding and peeling refs
    • [x] make cargo smart-release use the git_easy API exclusively
    • [x] proof of concept that GATs are working - YES, see 7f56dbd82db2abc18b8e6d228c8a5f54b3dbf32a
    • [x] make clear what can and can't be stored in the cache - it looks like packed::Buffer doesn't really belong there as it may contain a system resource in the form of a memory map. This means it should rather be shared. Finish the packed-refs needs update story, essentially.
      • To assure consistency, it's now behind an Arc<RwLock> even within the State structure that aims to be more like thread-local.
    • ~~finally pull in git-config to see where it should live.~~
    • [x] light documentation to get the main ideas across

    Note that it should be reasonable stable, so probably dogfood it for a while, see #164 .

    Out of Scope - separate PR

    • finally find a good solution for immutable vs mutable naming (which doesn't always work nicely. Ref suffix is a not candidate for those with borrows inside. Candidates for massive changes are git-object and git-ref and git-actor. borrow() would then rather be to_ref()
    • rename oid to id like in git2
    • rename find_existing() to find() and provide the optional version under try_find(), both for objects and refs in plumbing crates
    opened by Byron 20
  • Support static pages

    Support static pages

    It'd be nice if static pages were supported because we want to rewrite our thing in Rust and for security reasons we recommend not running complex scripts and programs on the HTTP server, which means we recommend configuring all git repos with the so-called "dumb" protocol.

    Our current thing currently just uses git directly and clones/fetches everything into a single cache repo, which means we can't parallelize it, so we're looking into alternatives for that, whether by using something like gitoxide or having multiple temporary caches and joining them together after fetching. However, having static pages support is a must.

    opened by SoniEx2 20
  • `EDITOR=sed` related error when running `make_rebase_i_repo.sh`

    `EDITOR=sed` related error when running `make_rebase_i_repo.sh`

    These seem to be different errors though, maybe the shell on MacOS has trouble?

    MacOS
    2022-04-14T09:48:59.9196440Z stderr: /Users/runner/work/gitoxide/gitoxide/git-repository/tests/fixtures/make_rebase_i_repo.sh: line 33: [: 2 35 1: integer expression expected
    2022-04-14T09:48:59.9196950Z fatal: --preserve-merges was replaced by --rebase-merges
    2022-04-14T09:48:59.9197450Z ', tests/tools/src/lib.rs:115:9
    2022-04-14T09:48:59.9197760Z note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    2022-04-14T09:48:59.9197950Z 
    2022-04-14T09:48:59.9197960Z 
    2022-04-14T09:48:59.9198020Z failures:
    
    Windows
    2022-04-14T09:40:43.0699609Z stderr: which: no gsed in (/mingw64/bin:/usr/bin:/c/Users/runneradmin/bin:/d/a/gitoxide/gitoxide/target/debug/build/curl-sys-7e85c957548a17f0/out/build:/d/a/gitoxide/gitoxide/target/debug/build/libgit2-sys-a405fc67d8aee456/out/build:/d/a/gitoxide/gitoxide/target/debug/build/libssh2-sys-0acf82cde4d4f0d1/out/build:/d/a/gitoxide/gitoxide/target/debug/build/libz-sys-a02af73321b6f02b/out/lib:/d/a/gitoxide/gitoxide/target/debug/build/wepoll-ffi-169df33785c3c0f8/out:/d/a/gitoxide/gitoxide/target/debug/deps:/d/a/gitoxide/gitoxide/target/debug:/c/Users/runneradmin/.rustup/toolchains/stable-x86_64-pc-windows-msvc/lib/rustlib/x86_64-pc-windows-msvc/lib:/c/Users/runneradmin/.cargo/bin:/c/Users/runneradmin/.rustup/toolchains/stable-x86_64-pc-windows-msvc/bin:/c/Program Files/MongoDB/Server/5.0/bin:/c/aliyun-cli:/c/vcpkg:/c/cf-cli:/c/Program Files (x86)/NSIS:/c/tools/zstd:/c/Program Files/Mercurial:/c/hostedtoolcache/windows/stack/2.7.5/x64:/c/cabal/bin:/c/ghcup/bin:/c/tools/ghc-9.2.2/bin:/c/Program Files/dotnet:/c/mysql/bin:/c/Program Files/R/R-4.1.3/bin/x64:/c/SeleniumWebDrivers/GeckoDriver:/c/Program Files (x86)/sbt/bin:/c/Program Files (x86)/GitHub CLI:/bin:/c/Program Files (x86)/pipx_bin:/c/hostedtoolcache/windows/go/1.17.8/x64/bin:/c/hostedtoolcache/windows/Python/3.7.9/x64/Scripts:/c/hostedtoolcache/windows/Python/3.7.9/x64:/c/hostedtoolcache/windows/Ruby/2.5.9/x64/bin:/c/tools/kotlinc/bin:/c/hostedtoolcache/windows/Java_Temurin-Hotspot_jdk/8.0.322-6/x64/bin:/c/npm/prefix:/c/Program Files (x86)/Microsoft SDKs/Azure/CLI2/wbin:/c/ProgramData/kind:/c/Program Files/Eclipse Foundation/jdk-8.0.302.8-hotspot/bin:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0:/c/Windows/System32/OpenSSH:/c/ProgramData/Chocolatey/bin:/c/Program Files/Docker:/c/Program Files/PowerShell/7:/c/Program Files/Microsoft/Web Platform Installer:/c/Program Files/dotnet:/c/Program Files/Microsoft SQL Server/130/Tools/Binn:/c/Program Files/Microsoft SQL Server/Client SDK/ODBC/170/Tools/Binn:/c/Program Files (x86)/Windows Kits/10/Windows Performance Toolkit:/c/Program Files (x86)/Microsoft SQL Server/110/DTS/Binn:/c/Program Files (x86)/Microsoft SQL Server/120/DTS/Binn:/c/Program Files (x86)/Microsoft SQL Server/130/DTS/Binn:/c/Program Files (x86)/Microsoft SQL Server/140/DTS/Binn:/c/Program Files (x86)/Microsoft SQL Server/150/DTS/Binn:/c/Program Files/nodejs:/c/Program Files/OpenSSL/bin:/c/Strawberry/c/bin:/c/Strawberry/perl/site/bin:/c/Strawberry/perl/bin:/c/ProgramData/chocolatey/lib/pulumi/tools/Pulumi/bin:/c/Program Files/TortoiseSVN/bin:/c/Program Files/CMake/bin:/c/ProgramData/chocolatey/lib/maven/apache-maven-3.8.5/bin:/c/Program Files/Microsoft Service Fabric/bin/Fabric/Fabric.Code:/c/Program Files/Microsoft SDKs/Service Fabric/Tools/ServiceFabricLocalClusterManager:/cmd:/mingw64/bin:/usr/bin:/c/Program Files/GitHub CLI:/c/tools/php:/c/Program Files (x86)/sbt/bin:/c/SeleniumWebDrivers/ChromeDriver:/c/SeleniumWebDrivers/EdgeDriver:/c/Program Files/Amazon/AWSCLIV2:/c/Program Files/Amazon/SessionManagerPlugin/bin:/c/Program Files/Amazon/AWSSAMCLI/bin:/c/Program Files (x86)/Google/Cloud SDK/google-cloud-sdk/bin:/c/Program Files (x86)/Microsoft BizTalk Server:/c/Program Files/LLVM/bin:/c/Users/runneradmin/.dotnet/tools:/c/Users/runneradmin/.cargo/bin:/c/Users/runneradmin/AppData/Local/Microsoft/WindowsApps)
    2022-04-14T09:40:43.0705473Z D:\a\gitoxide\gitoxide\git-repository\tests\fixtures\make_rebase_i_repo.sh: line 33: bc: command not found
    2022-04-14T09:40:43.0706030Z fatal: --preserve-merges was replaced by --rebase-merges
    2022-04-14T09:40:43.0706440Z ', tests\tools\src\lib.rs:115:9
    2022-04-14T09:40:43.0706836Z note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    

    Originally posted by @Byron in https://github.com/Byron/gitoxide/issues/382#issuecomment-1099008000

    opened by calam1 18
  • edge-case: symref targets in namespaced repos

    edge-case: symref targets in namespaced repos

    This is more of a heads-up:

    git-protocol enables the symrefs capability for ls-refs by default. If the remote repo is actually a namespace, and contains refs which point to targets outside that namespace, upload-pack advertises symref-target:(null). For example:

    Given:

    refs/namespaces/A/refs/heads/main      # deafbeef
    refs/namespaces/B/refs/heads/main-of-a # ref: refs/namespaces/A/refs/heads/main
    

    ls-refs in the context of B gives:

    upload-pack> deafbeef refs/heads/main-of-a symref-target:(null)
    

    That makes sense, because namespaces are supposed to be opaque to clients, and so what refs exist outside the namespace should not be revealed.

    However, when parsing into the Ref type, git-protocol takes the value of symref-target verbatim, so we get:

    Ref::Symbolic {
        path: "refs/heads/main-of-a",
        target: "(null)",
        object: Sha1(deafbeef),
    }
    

    Within gitoxide, this is safe, because the target is validated when constructing a RefEdit (if we were to mirror the remote refs tree after a fetch). It may still be more saferer if target was of type Option<BString>, and "(null)" parsed as None, for example when a library user is handing that value out to other tools without validating it first.

    opened by kim 18
  • git-config: includeIf support

    git-config: includeIf support

    git includeIf

    TODO

    • [ ] Both the symlink & realpath versions of paths will be matched outside of $GIT_DIR. E.g. if ~/git is a symlink to /mnt/storage/git, both gitdir:~/git and gitdir:/mnt/storage/git will match.
    opened by svetli-n 16
  • Write sparse index

    Write sparse index

    Tracked in #562

    Tasks

    • [x] roundtrip tests raw byte comparison is failing because of an order mismatch in the tree extension and that should be investigated / fixed for now though this can be can be worked around by
      • [x] comparing the in memory states
      • ~comparing only the relevant portions of bytes instead of all~ all bytes are relevant
      • ~creating the baseline index without tree extension~ not sure that is a possibility with git
    • [x] check git-config docs for options that influence sparse index writing
      • [x] update gix progress to reflect those findings
    • [x] ~sparse index can be written by providing the corresponding extension flag in the write::Options~
    • [x] ~index decides automatically if it needs to be sparse or not based on what kind of options are being passed in~
    • [x] writes sparse / regular index depending on if DIR entries exist in State or not
      • is_sparse flag tracks / caches this for us do we trust other functions to modify this flag correctly or do we need a way of verifying this, a.k.a. checking the DIR entries our selves

    Notes Just for myself to remember and to hammer the point home: write_to just looks at the current State and writes whatever it finds to out. There are some optional extensions that can be configured directly, but everything else (like git-config stuff) it does not care about. This is handled entirely by different functions that mutate the State to the desired state before writing it out.

    opened by SidneyDouw 15
  • is there a way to retrieve a subsection name

    is there a way to retrieve a subsection name

    given a gitconfig with the [url xxxx] sections as below.

    I need to iterate over all url sections and be able to retrieve the insteadOf config key (which works already) and the xxxx that is the subsection name (see the todo note)

    example

        use git_config::file::GitConfig;
        use git_config::parser::{Key, Parser};
        use git_config::values::Value;
        use std::fs::read_to_string;
    
        let input = r#"
    [url "ssh://[email protected]/"]
        insteadOf = https://github.com/
    [url "ssh://[email protected]"]
        insteadOf = https://bitbucket.org/
    "#;
        let config = GitConfig::try_from(input).unwrap();
        let url = config.se.sections_by_name("url");
        assert_eq!(url.len(), 2);
    
        for (i, u) in url.iter().enumerate() {
            let instead_of = u.value(&Key::from("insteadOf"));
    
            // todo(sub-section-name)
            // let xxxxx = u.retrieve_parent_sub_section_name();
            // assert_eq!(xxxxx, "ssh://[email protected]/")
    
            if i == 1 {
                assert_eq!(
                    instead_of.unwrap().deref(),
                    "https://github.com/".as_bytes()
                )
            } else {
                assert_eq!(
                    instead_of.unwrap().as_ref(),
                    "https://bitbucket.org/".as_bytes()
                )
            }
        }
    

    Maybe there is also a better way of doing this, then I would be very pleased if you can give me a hint.

    enhancement 
    opened by sassman 12
  • collaboration guide

    collaboration guide

    @avoidscorn @edward-shen What do you think about it? Is anything missing, should something be changed?

    Please feel free to comment here or use the 'suggestion' feature of github reviews.

    Apologies if the guide sounds a bit robotic or unfriendly but I feel pressed for time and rushed it a bit. However, I am happy to spend some time to make collaborating on the project more straightforward and would love changes to the guide that make it feel more approachable/polished :D.

    Thanks

    opened by Byron 12
  • Config Parse/Read/Write Discussion

    Config Parse/Read/Write Discussion

    Hi! I'm a developer that's been tasked to implement GitOxide into a WASM stack in an effort to clone a project as fast as possible in the browser.

    As part of that work, I'm looking to introduce a lot of new functionality into the project to get clone working. As an initial task, I'm hoping to get the git-config package able to read and write config files. I've got a (very) WIP port of config parsing logic from isomorphic-git over on my fork.

    I won't bother asking for a code review right now, I'm brand new to Rust and have a colleague taking a look at the code right now to give me some pointers on how I can improve my work

    That said, I am unsure of what direction we want to go in with regards to data organization. The current output is a pretty unmanageable tangled vector of Sections and Entries alike in a single struct

    I've noticed that the current git-config file has both Section and Entry types that look to contain all of the relevant properties, so I'll be refactoring my current code to use that data structure.

    Outside of that, I was hoping you could give me some kind of direction when it comes to the different mods in the git-config/lib.rs file:

    https://github.com/Byron/gitoxide/blob/main/git-config/src/lib.rs#L57-L72

    https://github.com/Byron/gitoxide/blob/main/git-config/src/lib.rs#L131-L217

    I'm not entirely sure what borrowed or spawned is referring to (which I admit as a point-of-noobiness), and I'm not sure I track what Span is doing here.

    I also would love some insight as to what a Token is referring to here:

    https://github.com/Byron/gitoxide/blob/main/git-config/src/file.rs#L4-L23

    As I'm not sure an instance that would have a Section and only a single Entry

    Looking forward to learning more and being able to meaningfully contribute upstream!

    opened by crutchcorn 12
  • Format `git-date::Time` with `time::format_description`.

    Format `git-date::Time` with `time::format_description`.


    Can Byron review the PR on video?

    Please choose one - no choice means no recordings are made.

    • [x] Record review and upload on YouTube publicly
    • [ ] Record review and upload on YouTube, but keep video unlisted

    If you ticked any of the above boxes, I will always share a link to the video in the PR.

    opened by svetli-n 11
  • Lack of consistent error type

    Lack of consistent error type

    Summary 💡

    I'm trying to use various methods in git_repository. I usually use thiserror to build an Error type for my crate using #[from] to be able to losslessly wrap every error my crate encounters, this is a pretty common idiom so I'm confident you've encountered it. When another crate I use uses the same pattern, this is pretty easy, I just extend my Error enum with the 1 new case for that crate:

    #[derive(thiserror::Error, Debug)]
    enum Error {
        // ... existing variants
        NewCrateError(#[from] NewCrate::Error)
    }
    

    And then I can just stick ? on any fallible operation and the conversion into my crate's Error type magically happens. I'm running into 2 problems trying to use git-repository this way:

    1. There is not 1 error type for the crate with N variants (1 variant per error), but instead N totally separate error types. This means I have to add a ton of variants to my enum.
    2. Some of the error types in git-repository are generic, e.g. git_repository::git_odb::find::existing::Error<git_repository::git_odb::store::find::Error> so there's not even a finite number of them, further exploding the number of variants I need to add.

    I wouldn't say git-repository is doing anything "wrong", which is why this is a feature request. I don't know if there's a good motivation for doing errors this way, it just makes it more difficult to apply the idiom that I've learned for lossless error propagation.

    If I could write one impl that would let me box any error coming from git-repository that would also work nicely, but as is now I think the only trait they have in common is the std::error::Error trait, so AFAIK there is no good way to only do this for git-repository errors automatically.

    Motivation 🔦

    Lossless error handling, generally avoiding boxing where I can. I could switch to something like anyhow, but I'm writing a library crate so I prefer to keep user's options open.

    enhancement 
    opened by jgarvin 6
  • oxidize gex

    oxidize gex

    Required features

    What follows is the result of a real quick analysis

    • [x] init repo
    • [ ] git status
    • [x] git fetch
    • [ ] git add .
    • [ ] manipulate the staging are (i.e. unstage)
    • [ ] reset (soft) - needs higher level functionality
    • [ ] git commit
    • [x] git commit --amend (by hand)
    • [ ] git checkout
    • [x] list branches
    • [x] get HEAD and name of unborn branch
    C-integrate-gitoxide 
    opened by Byron 1
  • Read split index

    Read split index

    Currently, only the split index with the link extension is read, but the shared index is not, which means the in-memory representation is different when comparing a split index with a regular index.

    Where to best place the resolve_link_extension function?

    • should this only happen when we try to write a link extension or just happen by default everytime we load an index?
    • does this always require a git_index::File?

    Tasks

    • [x] test comparing a split index with an identical "regular" index (in memory)
    • [x] read and merge the shared index into the in-memory representation and discard the link extension
    • [ ] ~~I am removing entries but not the corresponding path names in the path_backing~~
    • [ ] improve error handling - make sure to have distinct paths for the possible outcomes and dedicated errors with helpful messages (double check with git)
      • [x] bound check for split & shared index entries
      • [ ] entry marked for both replace & remove - not sure this applies to us at the moment
      • [x] split entry path is not empty
    • [ ] test fixture with overlap between shared and base index (currently we only have a test thas has no overlap between the two files)

    Notes

    • git does not seem to delete / update the entries immediately, but rather uses the CE_REMOVE and CE_UPDATE_IN_BASE flags
    opened by SidneyDouw 1
  • Oxidize NoseyParker

    Oxidize NoseyParker

    Required Features

    (among others that are already implemented)

    • [x] a fast way to get the size and kind of an object by ID, by reading only headers, similar to read_header().
    • [x] Something like NO_DOT_GIT option to prevent trying two directories if one is given. (#667)
    • ~~a filter to only traverse packed objects if they match a given filter to allow blob-only traversal. (for max performance)~~
    • [ ] Generalize git_odb::Store::verify_integrity() so that users can be called on each decoded object to perform their own computation.

    The first integration PR in the repository and the follow-up.

    C-integrate-gitoxide 
    opened by Byron 3
  • split index support

    split index support

    What is a split index?

    When using a split index the index is split up into two separate files:

    • the split index at $GIT_DIR/index
    • the shared index at $GIT_DIR/sharedindex.<SHA-1>

    The shared index contains all entries while the split index contains and accumulates changes. These changes in the split index are occasionally written into the shared index, either "automatically" based on config settings, or by the git-update-index command. "Automatically" here means that this runs every time the index is being read or updated.

    Link Extension

    The link extension stores 2 bitmaps that record how the stored changes in the split index should be merged with the shared index.

    The replace bitmap stores which entries in the shared index should be replaced by entries stored in the split index, i.e. [0, 1, 1, 0, 1] -> replace shared index entries at index 1, 2, 4 with split index entries at 0, 1, 2 Any additional entries in the split index should be added to the shared index.

    The delete bitmap stores which entries in the shared index should be deleted, i.e. [1, 0, 0, 1] -> delete entries at index 0 and 3

    Tasks

    • [x] check git source code to learn more about how split index works and update this issue
    • [ ] #655
    • [ ] writing
      • [ ] write only the split index without ever merging / updating the shared index
        • [ ] if this turns out to be too much work just write a regular index and discard the split / shared index files
      • [ ] merge split and shared indexes (based on maxPercentChange) - source code reference
    • [ ] update active shared index modification time every time the split index is being read / updated to prevent automatic deletion

    Config Settings

    • core.splitIndex enables the use of a split index
    • splitIndex.maxPercentChange The percentage threshold of entries in the split index (compared to the shared index) that triggers a write to the shared index. It defaults to 20.
    • splitIndex.sharedIndexExpire If the modification time of a shared index is older than this value it will be deleted. Takes values like "now", "never", "2.weeks.ago" (default). This needs to be parsed.

    Notes

    • split index and sparse index are incompatible in git
    • git | date.c is used to parse dates

    Questions

    • Does the split index get emptied / recreated from scratch when writing its changes to the shared index?
    • I assume the actively used shared index can and should never be deleted, but based only on the sharedIndexExpire setting it could be

    References

    C-tracking-issue 
    opened by SidneyDouw 1
Releases(git-index-v0.12.1)
  • git-index-v0.12.1(Jan 8, 2023)

    New Features

    • add impl Debug for State to print all entries in a digestible form.
    • add State::sort_entries_by(...) to allow comparing by additional criteria. This allows to orgranize entries based on flags, for example, which may help in special occasions.

    Commit Statistics

    • 4 commits contributed to the release.
    • 1 day passed between releases.
    • 2 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • Merge branch 'various-improvements' (f191c1a)
      • add impl Debug for State to print all entries in a digestible form. (6d8eb9f)
      • add State::sort_entries_by(...) to allow comparing by additional criteria. (7c8ba2c)
      • update documentation to make users of State::dangerously_push_entry() more aware. (b56de39)
    Source code(tar.gz)
    Source code(zip)
  • git-traverse-v0.22.0(Jan 6, 2023)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 7 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (d679f5b)
    Source code(tar.gz)
    Source code(zip)
  • git-object-v0.26.0(Jan 6, 2023)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 7 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (d679f5b)
    Source code(tar.gz)
    Source code(zip)
  • git-index-v0.12.0(Jan 6, 2023)

    New Features

    • entry::Time can convert from and to system time.
    • add State::sort_entries() and State::dangerously_push_entry(). Both methods work in tandem as one breaks invariants, but allows to quickly add entries, while the other restores them.
    • add State::entry_mut_by_path_and_stage()
    • State::write_to() respects the REMOVED flag. That way, one can mark entries for removal and these will be pruned at write time. This is preferable over performing removals expensively in memory.
    • expose git_hash as hash in the root of the crate. This makes it easier to use the crate standalone as plumbing as instantiation requires access to git_hash.
    • add File::at_or_default(...) to easily open or create an empty in-memory index. This is a common operation in new repositories.
    • add State::new() to create a new empty in-memory index.
    • add File::set_path() to allow setting the location of an index file on disk. This is useful to change the location of an index after reading it (from another location, similar to copy-on-write).

    Changed (BREAKING)

    • remove File::into_state() in favor of From<File> for State. That way it's less discoverable, but more idiomatic, and we don't want to get into the habit of providing multiple names of the exact same functionality.

    Commit Statistics

    • 11 commits contributed to the release.
    • 7 days passed between releases.
    • 9 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (d679f5b)
      • Merge branch 'various-improvements' (9eee8fe)
      • entry::Time can convert from and to system time. (1e3341a)
      • add State::sort_entries() and State::dangerously_push_entry(). (654bd8f)
      • add State::entry_mut_by_path_and_stage() (aa1b6ee)
      • State::write_to() respects the REMOVED flag. (3ebe2d4)
      • expose git_hash as hash in the root of the crate. (ec36586)
      • add File::at_or_default(...) to easily open or create an empty in-memory index. (5cc3a15)
      • add State::new() to create a new empty in-memory index. (0b40951)
      • remove File::into_state() in favor of From<File> for State. (3753ad5)
      • add File::set_path() to allow setting the location of an index file on disk. (a7183e2)
    Source code(tar.gz)
    Source code(zip)
  • git-date-v0.4.0(Jan 6, 2023)

    New Features

    • Support git default date format This is the format output by default by git log or when using --pretty=%ad.

      The new git_date::time::format::GIT_DEFAULT format description may be used to output date strings in this format. It is also now used by git_date::parse() to accept date strings that may be in this format.

    • Format git-style RFC 2822 date strings Git outputs the day-of-month field as a non-padded number whereas strict RFC 2822 date strings are supposed to use a zero-padded two-digit number.

      The new git_date::time::format::GIT_RFC2822 format description allows Time to be formatted in git's RFC 2822 style. (Whereas the existing RFC2822 format description produces a strict RFC 2822 date string).

    Bug Fixes

    • Stricter raw date parsing The raw date parser (git_date::parse::function::parse_raw()) accepted some inputs that it should not have. Specifically, it would accept:

      • Any character for the timezone offset's sign
    • Trailing, non-whitespace characters after the timezone offset

    Other (BREAKING)

    • time::format::GIT_DEFAULT -> *::DEFAULT and *::DEFAULT -> *::GITOXIDE. That way we properly indicate what we are doing and don't try to somewhat sneakily suggest that the default for git dates is something else due to personal preference.

    Commit Statistics

    • 9 commits contributed to the release over the course of 6 calendar days.
    • 18 days passed between releases.
    • 5 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (d679f5b)
      • time::format::GIT_DEFAULT -> *::DEFAULT and *::DEFAULT -> *::GITOXIDE. (41fc2bb)
      • Merge branch 'strict-raw-dates' (c65ce7e)
      • Stricter raw date parsing (046af94)
      • Merge branch 'issue-679' (a910d9e)
      • refactor (26597b9)
      • Support git default date format (4066ac7)
      • Format git-style RFC 2822 date strings (8094351)
      • Parse git-styled RFC 2822 date strings (dff0aa0)
    Source code(tar.gz)
    Source code(zip)
  • git-actor-v0.17.0(Jan 6, 2023)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 7 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (d679f5b)
    Source code(tar.gz)
    Source code(zip)
  • git-transport-v0.25.1(Dec 31, 2022)

    Bug Fixes

    • file:// command invocation won't spill stderr output. This usually doesn't add any benefit to the user as we might see events like the git process' failure to flush to a closed channel even though this is entirely handled by the Rust side of things.

      I can imagine that one day this might become a configurable to help with debugging to help making better-behaved clients, but maybe it won't ever matter once the default file:// transport is built-in and native.

    Commit Statistics

    • 1 commit contributed to the release.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • file:// command invocation won't spill stderr output. (ec2f2e3)
    Source code(tar.gz)
    Source code(zip)
  • git-worktree-v0.11.0(Dec 30, 2022)

    Changed (BREAKING)

    • Simplify Cache by removing its lifetime. The lifetime was more of a premature optimization that makes actually using the cache much harder than it needs to be.

    Commit Statistics

    • 2 commits contributed to the release.
    • 11 days passed between releases.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • Simplify Cache by removing its lifetime. (d7ee622)
    Source code(tar.gz)
    Source code(zip)
  • git-url-v0.13.0(Dec 30, 2022)

    New Features

    • collect ssh-specific options to control how the ssh program is invoked. These are passed through when creating the ssh transport.

    Commit Statistics

    • 4 commits contributed to the release over the course of 1 calendar day.
    • 4 days passed between releases.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • make fmt (511ed00)
      • Merge branch 'adjustments-for-cargo' (f8c562a)
      • collect ssh-specific options to control how the ssh program is invoked. (61d89f5)
    Source code(tar.gz)
    Source code(zip)
  • git-traverse-v0.21.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-transport-v0.25.0(Dec 30, 2022)

    Bug Fixes

    • improve error message for when an invoked transport program can't be found.
    • assure processing thread is up before continuing. That way one may hope that we never leave stderr output unprocessed.
    • port selections for SSH urls are now respected for protocol V1 as well.
    • propery adjust host argument for ssh program to include a user name. Otherwise it would not use a user at all which then defaults to the currently logged in user, something that typically won't work with servers that demand git.

    New Features (BREAKING)

    • ptions for client::connect() and support for more than one ssh variant, including permission-denied detection. Options can be passed down to client::ssh::connect() to further configure it similar to what git itself offers. That way, it's possible to use different ssh commands and support all of gits configuration options.

      Support for multiple ssh variants was added to use them (and their flags) correctly.

      Detection of permission-denied errors due to invalid credentials was added so re-authentication in upper layers can be implemented.

    Commit Statistics

    • 9 commits contributed to the release over the course of 4 calendar days.
    • 4 days passed between releases.
    • 5 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • improve error message for when an invoked transport program can't be found. (fed38c9)
      • assure processing thread is up before continuing. (f0997bf)
      • parse additional ssh messaegs into io-errors. (c60c89d)
      • make fmt (511ed00)
      • Merge branch 'adjustments-for-cargo' (f8c562a)
      • ptions for client::connect() and support for more than one ssh variant, including permission-denied detection. (6fa2764)
      • port selections for SSH urls are now respected for protocol V1 as well. (923278b)
      • propery adjust host argument for ssh program to include a user name. (0ff127c)
    Source code(tar.gz)
    Source code(zip)
  • git-revision-v0.9.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-repository-v0.31.0(Dec 30, 2022)

    New Features

    • fetching ssh urls can ask for a different username. If authentication fails, the user will be queried for a different username to try authentication via ssh mechanisms again.
    • collect ssh-specific options to control how the ssh program is invoked. These are passed through when creating the ssh transport.

    Other

    • explain how it's possible to deal with the first commit when comparing trees The reason the other tree isn't an option is that it's a special case that can more easily be handled with an .unwrap_or_else(|| repo.empty_tree()) (or similar) for those who need it.

      Making the empty tree explicit also helps to deal with diffs from the empty tree (which can't be Option<Tree>) to the first tree of the first commit.

    Chore (BREAKING)

    • upgrade to prodash v23

    Commit Statistics

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

    Commit Details

    view details
    • #676
      • explain how it's possible to deal with the first commit when comparing trees (9fabfc5)
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • adapt to changes in git-worktree (5a97bb5)
      • make fmt (511ed00)
      • Merge branch 'adjustments-for-cargo' (f8c562a)
      • fetching ssh urls can ask for a different username. (d48b9a7)
      • upgrade to prodash v23 (9172079)
      • adapt to changes in git-repository and git-transport (d336368)
      • collect ssh-specific options to control how the ssh program is invoked. (61d89f5)
    Source code(tar.gz)
    Source code(zip)
  • git-refspec-v0.6.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-ref-v0.22.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-protocol-v0.26.0(Dec 30, 2022)

    New Features

    • display the underlying permission denied error as source when failng handshake due to authentication.

    Commit Statistics

    • 2 commits contributed to the release over the course of 1 calendar day.
    • 8 days passed between releases.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • display the underlying permission denied error as source when failng handshake due to authentication. (4b8abb0)
    Source code(tar.gz)
    Source code(zip)
  • git-pack-v0.29.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 2 commits contributed to the release over the course of 1 calendar day.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • make fmt (511ed00)
    Source code(tar.gz)
    Source code(zip)
  • git-odb-v0.39.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 2 commits contributed to the release over the course of 1 calendar day.
    • 4 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • make fmt (511ed00)
    Source code(tar.gz)
    Source code(zip)
  • git-object-v0.25.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-mailmap-v0.8.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-index-v0.11.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-features-v0.26.0(Dec 30, 2022)

    Chore (BREAKING)

    • upgrade to prodash v23

    Commit Statistics

    • 4 commits contributed to the release over the course of 1 calendar day.
    • 4 days passed between releases.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • make fmt (511ed00)
      • Merge branch 'adjustments-for-cargo' (f8c562a)
      • upgrade to prodash v23 (5bf0034)
    Source code(tar.gz)
    Source code(zip)
  • git-discover-v0.11.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-diff-v0.25.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-credentials-v0.9.0(Dec 30, 2022)

    New Features

    • helper::Cascade::query_user_only() can avoid to ask for the password if the transport wouldn't use it. That way, ssh while using ssh programs can query the user to try next.

    Commit Statistics

    • 3 commits contributed to the release over the course of 1 calendar day.
    • 11 days passed between releases.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • Merge branch 'adjustments-for-cargo' (f8c562a)
      • helper::Cascade::query_user_only() can avoid to ask for the password if the transport wouldn't use it. (6b375d3)
    Source code(tar.gz)
    Source code(zip)
  • git-config-v0.14.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-command-v0.2.1(Dec 30, 2022)

    New Features

    • allow setting more information when preparing commands. This includes

      • disallowing the usage of a shell
    • adding mutiple args at once

    • adding environment variables

    • make all fields public to allow non-build manipualation of the Prepare type

    Commit Statistics

    • 5 commits contributed to the release over the course of 38 calendar days.
    • 38 days passed between releases.
    • 1 commit was understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
      • make fmt (511ed00)
      • Merge branch 'adjustments-for-cargo' (f8c562a)
      • allow setting more information when preparing commands. (8a67c13)
      • Merge branch 'main' into http-config (bcd9654)
    Source code(tar.gz)
    Source code(zip)
  • git-attributes-v0.8.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-actor-v0.16.0(Dec 30, 2022)

    A maintenance release without user-facing changes.

    Commit Statistics

    • 1 commit contributed to the release.
    • 11 days passed between releases.
    • 0 commits were understood as conventional.
    • 0 issues like '(#ID)' were seen in commit messages

    Commit Details

    view details
    • Uncategorized
      • prepare changelogs prior to release (30d8ca1)
    Source code(tar.gz)
    Source code(zip)
  • git-testtools-v0.10.0(Dec 28, 2022)

    New Features

    • allow execution of scripts without 'bash'. This works by trying to execute the file directly, and on failure, use 'bash' as interpreter.

      That way we are finally able to support a wider variety of fixture generators and make the crate more useful to a wieder audience.

    • spawn_git_daemon() to spawn a git daemon hosting a working directoy… …with support for multiple at a time thanks to port selection (allowing tests to run in parallel) as well as auto-kill on drop.

    • increase the waiting time on MacOS for file base locks It appears that these workers run into timeouts more and more, they got slower or maybe there are just more tests.

    • add Env::unset() for convenience

    Bug Fixes

    • don't overwrite unexpanded git-lfs pointer files. It's possible for those with incomplete git-lfs installations (and many more situations) to end up in a spot where pointer files aren't expanded. If we overwrite the with archives, files look changed which can be confusing and lead to even bigger messes to happen.

      Now we don't overwrite those files anyomre.

    • Disable tag.gpgSign in test scripts This is done for the same reason that commit.gpgsign is disabled for test scripts. It prevents test failures if the user has tag.gpgsign enabled in their global git config when invoking tests.

    Changed (BREAKING)

    • rename scripted_fixture_* to not contain 'repo' in the name. Further make clear in the documentation that bash is used to execute the fixture scripts, previously it wasn't even implied and got lost in history.

    New Features (BREAKING)

    • upgrade edition to 2021 in most crates. MSRV for this is 1.56, and we are now at 1.60 so should be compatible. This isn't more than a patch release as it should break nobody who is adhering to the MSRV, but let's be careful and mark it breaking.

      Note that git-features and git-pack are still on edition 2018 as they make use of a workaround to support (safe) mutable access to non-overlapping entries in a slice which doesn't work anymore in edition 2021.

    Commit Statistics

    • 35 commits contributed to the release over the course of 98 calendar days.
    • 98 days passed between releases.
    • 8 commits were understood as conventional.
    • 3 unique issues were worked on: #450, #607, #650

    Thanks Clippy

    Clippy helped 2 times to make code idiomatic.

    Commit Details

    view details
    • #450
      • add Env::unset() for convenience (09da4c5)
    • #607
      • don't overwrite unexpanded git-lfs pointer files. (761b7d7)
      • improve documentation to inform about the need for git-lfs. (519db50)
    • #650
      • allow execution of scripts without 'bash'. (15ecd84)
      • rename scripted_fixture_* to not contain 'repo' in the name. (dbf6c8c)
    • Uncategorized
      • Release git-date v0.3.1, git-features v0.25.0, git-actor v0.15.0, git-glob v0.5.1, git-path v0.7.0, git-attributes v0.7.0, git-config-value v0.10.0, git-lock v3.0.1, git-validate v0.7.1, git-object v0.24.0, git-ref v0.21.0, git-sec v0.6.0, git-config v0.13.0, git-prompt v0.3.0, git-url v0.12.0, git-credentials v0.8.0, git-diff v0.24.0, git-discover v0.10.0, git-traverse v0.20.0, git-index v0.10.0, git-mailmap v0.7.0, git-pack v0.28.0, git-odb v0.38.0, git-packetline v0.14.1, git-transport v0.24.0, git-protocol v0.25.0, git-revision v0.8.0, git-refspec v0.5.0, git-worktree v0.10.0, git-repository v0.30.0, safety bump 26 crates (e6b9906)
      • Merge branch 'adjustments-for-cargo' (083909b)
      • thanks clippy (f1160fb)
      • Release git-hash v0.10.1, git-hashtable v0.1.0 (7717170)
      • Merge branch 'main' into http-config (bcd9654)
      • Release git-hash v0.10.0, git-features v0.24.0, git-date v0.3.0, git-actor v0.14.0, git-glob v0.5.0, git-path v0.6.0, git-quote v0.4.0, git-attributes v0.6.0, git-config-value v0.9.0, git-tempfile v3.0.0, git-lock v3.0.0, git-validate v0.7.0, git-object v0.23.0, git-ref v0.20.0, git-sec v0.5.0, git-config v0.12.0, git-command v0.2.0, git-prompt v0.2.0, git-url v0.11.0, git-credentials v0.7.0, git-diff v0.23.0, git-discover v0.9.0, git-bitmap v0.2.0, git-traverse v0.19.0, git-index v0.9.0, git-mailmap v0.6.0, git-chunk v0.4.0, git-pack v0.27.0, git-odb v0.37.0, git-packetline v0.14.0, git-transport v0.23.0, git-protocol v0.24.0, git-revision v0.7.0, git-refspec v0.4.0, git-worktree v0.9.0, git-repository v0.29.0, git-commitgraph v0.11.0, gitoxide-core v0.21.0, gitoxide v0.19.0, safety bump 28 crates (b2c301e)
      • Merge branch 'git-lfs-improvements' (4c1685b)
      • Merge branch 'jpgrayson/main' (b242853)
      • Disable tag.gpgSign in test scripts (1ce3190)
      • Merge branch 'version2021' (0e4462d)
      • upgrade edition to 2021 in most crates. (3d8fa8f)
      • Release git-glob v0.4.2, git-config-value v0.8.2, git-lock v2.2.0, git-ref v0.19.0, git-config v0.11.0, git-discover v0.8.0, git-index v0.8.0, git-transport v0.22.0, git-protocol v0.23.0, git-worktree v0.8.0, git-repository v0.28.0, gitoxide-core v0.20.0, gitoxide v0.18.0, safety bump 9 crates (0c253b1)
      • Merge branch 'main' into http-config (f4ff821)
      • Merge branch 'async-fetch' (0c9c48b)
      • let's be very conservative regarding maximum lock times (ba83945)
      • This should work on windows (when launching the git-daemon) (52f4095)
      • Make sure we can shut-down the daemon by starting it directly (4924b33)
      • spawn_git_daemon() to spawn a git daemon hosting a working directoy… (221f137)
      • Release git-features v0.23.1, git-glob v0.4.1, git-config-value v0.8.1, git-tempfile v2.0.6, git-object v0.22.1, git-ref v0.18.0, git-sec v0.4.2, git-config v0.10.0, git-prompt v0.1.1, git-url v0.10.1, git-credentials v0.6.1, git-diff v0.21.0, git-discover v0.7.0, git-index v0.7.0, git-pack v0.25.0, git-odb v0.35.0, git-transport v0.21.1, git-protocol v0.22.0, git-refspec v0.3.1, git-worktree v0.7.0, git-repository v0.26.0, git-commitgraph v0.10.0, gitoxide-core v0.19.0, gitoxide v0.17.0, safety bump 9 crates (d071583)
      • Merge branch 'main' into write-sparse-index (upgrade to Rust 1.65) (5406630)
      • thanks clippy (04cfa63)
      • Merge branch 'main' into write-sparse-index (c4e6849)
      • Merge branch 'gix-clone' (def53b3)
      • Assure the 'file' protocol is always allowed (7086101)
      • Release git-hash v0.9.11, git-features v0.23.0, git-actor v0.13.0, git-attributes v0.5.0, git-object v0.22.0, git-ref v0.17.0, git-sec v0.4.1, git-config v0.9.0, git-url v0.10.0, git-credentials v0.6.0, git-diff v0.20.0, git-discover v0.6.0, git-traverse v0.18.0, git-index v0.6.0, git-mailmap v0.5.0, git-pack v0.24.0, git-odb v0.34.0, git-packetline v0.13.1, git-transport v0.21.0, git-protocol v0.21.0, git-revision v0.6.0, git-refspec v0.3.0, git-worktree v0.6.0, git-repository v0.25.0, safety bump 24 crates (104d922)
      • Merge branch 'main' into new-http-impl (702a161)
      • Merge branch 'fetch-pack' (3c49400)
      • Merge branch 'main' into fetch-pack (93917cb)
      • increase the waiting time on MacOS for file base locks (67777a8)
      • Merge branch 'diff' (25a7726)
    Source code(tar.gz)
    Source code(zip)
Owner
Sebastian Thiel
Sebastian Thiel
gfold is a CLI-driven application that helps you keep track of multiple Git repositories.

gfold is a CLI-driven application that helps you keep track of multiple Git repositories.

Nick Gerace 215 Jan 4, 2023
A tool to dump exposed .git repositories

git-dumper This repository houses a tool to dump exposed .git repositories. This is a rewrite from the original GitTools's Dumper project, but in a re

HoLLy 10 Dec 13, 2022
A tool to dump exposed .git repositories

git-dumper This repository houses a tool to dump exposed .git repositories. This is a rewrite from the original GitTools's Dumper project, but in a re

HoLLy 8 Nov 1, 2022
Check a folder for dirty git repositories, forgotten branches and commits

dg - find dirty git repos Ever forgot to push a commit or lost your work because you assumed it was pushed to Github but it wasn't? dg finds local git

Dotan J. Nahum 11 Mar 19, 2023
A git sub-command to view your git repository in the web browser

git-view A git sub-command to view your git repository in the web browser! About Are you also frustrated from moving your hands away from the keyboard

Hamothy 5 Sep 26, 2022
A Rust CLI tool that helps you enforce Git policies through Git hooks both server and client side

GitPolicyEnforcer This is a command line utility written in Rust, that helps you utilize Git hooks, to enforce various policies. It currently supports

Vagelis Prokopiou 4 Aug 14, 2022
Crunch is a command-line interface (CLI) to claim staking rewards every X hours for Substrate-based chains

crunch · crunch is a command-line interface (CLI) to claim staking rewards every X hours for Substrate-based chains. Why use crunch To automate payout

null 39 Dec 8, 2022
Railway CLI - This is the command line interface for Railway.

Railway CLI This is the command line interface for Railway. Use it to connect your code to Railways infrastructure without needing to worry about envi

Nebula 4 Mar 20, 2022
Scouty is a command-line interface (CLI) to keep an eye on substrate-based chains and hook things up

scouty is a command-line interface (CLI) to keep an eye on substrate-based chains and hook things up

TurboFlakes 15 Aug 6, 2022
SKYULL is a command-line interface (CLI) in development that creates REST API project structure templates with the aim of making it easy and fast to start a new project.

SKYULL is a command-line interface (CLI) in development that creates REST API project structure templates with the aim of making it easy and fast to start a new project. With just a few primary configurations, such as project name, you can get started quickly.

Gabriel Michaliszen 4 May 9, 2023
tpp (Tera Pre-Processor) is a versatile CLI (Command Line Interface) tool crafted for preprocessing files using the Tera templating engine.

tpp (Tera Pre-Processor) is a versatile CLI (Command Line Interface) tool crafted for preprocessing files using the Tera templating engine. Drawing inspiration from pre-processors like cpp and gpp, tpp is the next evolution with its powerful expressive toolset.

null 3 Nov 23, 2023
git-cliff can generate changelog files from the Git history by utilizing conventional commits as well as regex-powered custom parsers.⛰️

git-cliff can generate changelog files from the Git history by utilizing conventional commits as well as regex-powered custom parsers. The changelog template can be customized with a configuration file to match the desired format.

Orhun Parmaksız 5k Jan 9, 2023
Git Explorer: cross-platform git workflow improvement tool inspired by Magit

Gex Git workflow improvement CLI tool inspired by Magit. This project is still under initial development, but I am actively dogfooding it and features

Peter Hebden 204 Jan 6, 2023
🧠 A command-line utility for switching git branches more easily. Switch branches interactively or use a fuzzy search to find that long-forgotten branch name.

git-smart-checkout A git command extension for switching git branches more efficiently. About Interactively switch branches or fuzzy search for that f

Cezar Craciun 51 Dec 29, 2022
A command line tool for people of transgender experience to replace their deadname within a Git repo.

chowndn (Change Owner from Dead Name) A command line tool for people of transgender experience to replace their dead name within a Git repo. See chown

Christi Miller 23 Dec 6, 2022
a command-line tool that transforms a Git repository into a minimal format for ChatGPT queries

gprepo /dʒiːpiːˈɹi:pi:oʊ/ a command-line tool that transforms a Git repository into a minimal format for ChatGPT queries. Features Excludes LICENSE an

null 6 Apr 20, 2023
Small command-line tool to switch monitor inputs from command line

swmon Small command-line tool to switch monitor inputs from command line Installation git clone https://github.com/cr1901/swmon cargo install --path .

William D. Jones 5 Aug 20, 2022
Low-level Rust library for implementing terminal command line interface, like in embedded systems.

Terminal CLI Need to build an interactive command prompt, with commands, properties and with full autocomplete? This is for you. Example, output only

HashMismatch 47 Nov 25, 2022