- read and write a signature that uniquely identifies an actor within a git repository
- types to represent hash digests to identify git objects.
- used to abstract over different kinds of hashes, like SHA1 and the upcoming SHA256
- API documentation
- Some examples
- decode (zero-copy) borrowed objects
- commit
- tree
- encode owned objects
- commit
- tree
- tag
- transform borrowed to owned objects
- API documentation
- Some examples
- packs
- traverse pack index
- 'object' abstraction
- decode (zero copy)
- verify checksum
- simple and fast pack traversal
- decode
- full objects
- deltified objects
- decode
- decode a pack from
Read
input- Add support for zlib-ng for 20% faster decompression performance
-
Read
toIterator
of entries- read as is, verify hash, and restore partial packs
- create index from pack alone (much faster than git)
- resolve 'thin' packs
- decode a pack from
- encode
- Add support for zlib-ng for 2.5x compression performance
- objects to entries iterator
- input objects as-is
- pack only changed objects as derived from input
- base object compression
- delta compression
- create 'thin' pack, i.e. deltas that are based on objects the other side has.
- parallel implementation that scales perfectly
- entries to pack data iterator
- verify pack with statistics
- brute force - less memory
- indexed - faster, but more memory
- advanced
- Multi-Pack index file (MIDX)
- 'bitmap' file
- special handling for networked packs
- detect and retry packed object reading
- API documentation
- Some examples
- loose object store
- traverse
- read
- into memory
- streaming
- verify checksum
- streaming write for blobs
- buffer write for small in-memory objects/non-blobs to bring IO down to open-read-close == 3 syscalls
- compound store
- everything loose object stores can do
- lookup objects in packs
- linked store
- everything the first loose object store can do
- lookup objects in multiple linked object stores
- sink
- write objects and obtain id
- alternates
- resolve links between object databases
- safe with cycles and recursive configurations
- multi-line with comments and quotes
- promisor
- It's vague, but these seems to be like index files allowing to fetch objects from a server on demand.
- API documentation
- Some examples
Check out the performance discussion as well.
- tree
- changes needed to obtain other tree
- case-insensitive comparisons
- rename and copy tracking
- readily available caching for 4x+ speedups
- patches
- There are various ways to generate a patch from two blobs.
- any
- diffing, merging, working with hunks of data
- find differences between various states, i.e. index, working tree, commit-tree
- Parallel stat calls to check/update objects in index
- API documentation
- Examples
Check out the performance discussion as well.
- trees
- nested traversal
- commits
- ancestor graph traversal similar to
git revlog
- ancestor graph traversal similar to
- API documentation
- Examples
- tree
- As documented here: https://www.git-scm.com/docs/git-clone#_git_urls
- parse
- ssh URLs and SCP like syntax
- file, git, and SSH
- paths (OS paths, without need for UTF-8)
- username expansion for ssh and git urls
- convert URL to string
- API documentation
- Some examples
- abstract over protocol versions to allow delegates to deal only with a single way of doing things
- credentials
- via git-credentials
- via pure Rust implementation if no git is installed
- fetch & clone
- detailed progress
- control credentials provider to fill, approve and reject
- command: ls-ref
- parse V1 refs as provided during handshake
- parse V2 refs
- handle empty refs, AKA PKT-LINE(zero-id SP "capabilities^{}" NUL capability-list)
- initialize and validate command arguments and features sanely
- abort early for ls-remote capabilities
- packfile negotiation
- delegate can support for all fetch features, including shallow, deepen, etc.
- receive parsed shallow refs
- push
- API documentation
- Some examples
- PKT-Line
- encode
- decode (zero-copy)
- error line
- V2 additions
- side-band mode
-
Read
from packet line with (optional) progress support via sidebands -
Write
with built-in packet line encoding - API documentation
- Some examples
- No matter what we do here, timeouts must be supported to prevent hanging forever and to make interrupts destructor-safe.
- client
- general purpose
connect(…)
for clients- file:// launches service application
- ssh:// launches service application in a remote shell using ssh
- git:// establishes a tcp connection to a git daemon
- http(s):// establishes connections to web server
- pass context for scheme specific configuration, like timeouts
- git://
- V1 handshake
- send values + receive data with sidebands
-
support for receiving 'shallow' refs in case the remote repository is shallow itself (I presume)- Since V2 doesn't seem to support that, let's skip this until there is an actual need. No completionist :D
- V2 handshake
- send command request, receive response with sideband support
- V1 handshake
- http(s)://
- set identity for basic authentication
- V1 handshake
- send values + receive data with sidebands
- V2 handshake
- send command request, receive response with sideband support
-
'dumb'- we opt out using this protocol seems too slow to be useful, unless it downloads entire packs for clones?
- authentication failures are communicated by io::ErrorKind::PermissionDenied, allowing other layers to retry with authentication
- general purpose
- server
- general purpose
accept(…)
for servers
- general purpose
- API documentation
- Some examples
- read and write a git-index file
- add and remove entries
- API documentation
- Some examples
- read-only access
- Graph lookup of commit information to obtain timestamps, generation and parents, and extra edges
- Bloom filter index
- Bloom filter data
- create and update graphs and graph files
- API documentation
- Some examples
Use tempfiles to minimize the risk of resource leakage when preparing to overwrite or create a file with new content in a signal-safe way, making the change atomic.
Tempfiles can also be used as locks as only one tempfile can exist at a given path at a time.
- registered temporary files which are deleted automatically as the process terminates or on drop
- write to temorary file and persist it under new name
- close temporary files to convert them into a marker while saving system resources
- mark paths with a closed temporary file
- persist temporary files to prevent them from perishing.
- signal-handler integration with
git-repository
to clean lockfiles before the process is aborted.
Use lock-files in the way git does with auto-cleanup being the most notable feature.
- writable lock files that can be committed to atomically replace the resource they lock
- read-only markers that lock a resource without the intend to overwrite it
- auto-removal of the lockfiles and intermediate directories on drop or on signal
- read
- line-wise parsing with decent error messages
- decode value
- boolean
- integer
- color
- path (incl. resolution)
- include
- includeIf
- write
- keep comments and whitespace, and only change lines that are affected by actual changes, to allow truly non-destructive editing
-
Config
type which integrates multiple files into one interface to support system, user and repository levels for config files - API documentation
- Some examples
- utilities for applications to make long running operations interruptiple gracefully and to support timeouts in servers.
- discovery
- option to not cross file systems
- handle git-common-dir
- Repository
- discovery
- handle other non-discovery modes and provide control over environment variable usage required in applications
- instantiation
- a way to handle
.git
files withgitdir: <path>
in it - handle
gitdir
andcommondir
files
- a way to handle
- discovery
- access to refs and objects
- traverse
- commit graphs
- tree entries
- diffs/changes
- tree with tree
- tree with index
- index with working tree
- initialize
- Proper configuration depending on platform (e.g. ignorecase, filemode, …)
- All mutations are multi-process safe and this is tested and configurable (i.e. abort or wait if lock is encountered)
- Signed commits and tags
- clone
- shallow
- namespaces support
- sparse checkout support
- execute hooks
- .gitignore handling
- checkout/stage conversions clean + smudge as in .gitattributes
- rev-parsing and ref history
- refs
- run transaction hooks and handle special repository states like quarantine
- support for different backends like
files
andreftable
- worktrees
- remotes with push and pull
- mailmap
- configuration
- merging
- stashing
- Use Commit Graph to speed up certain queries
- API documentation
- Some examples
- create a bundle from an archive
- extract a branch from a bundle into a repository
- API documentation
- Some examples
- validate ref names
- validate tag names
- Prepare code for arrival of longer hashes like Sha256. It's part of the V2 proposal but should work for loose refs as well.
- Stores
- disable transactions during quarantine
- loose file
- ref validation
- find single ref by name
- special handling of
FETCH_HEAD
andMERGE_HEAD
- iterate refs with optional prefix
- worktree support
symbolic ref support, using symbolic links- This is a legacy feature which is not in use anymore.
- transactions
- delete, create or update single ref or multiple refs while handling the reflog
- set any valid ref value (not just object ids)
- reflog changes can be entirely disabled (i.e. for bare repos)
- rename or copy references
- transparent handling of packed-refs
- initial transaction optimization (a faster way to create clones with a lot of refs)
- log
- forward iteration
- backward iteration
- expire
- ref
- peel to id
- packed
- find single ref by name
- iterate
- reftable,
- API documentation
- Some examples
- io-pipe feature toggle
- a unix like pipeline for bytes
- parallel feature toggle
- When on…
in_parallel
join
- When off all functions execute serially
- When on…
- fast-sha1
- provides a faster SHA1 implementation using CPU intrinsics
- API documentation
- a terminal user interface seeking to replace and improve on
tig
- Can display complex history in novel ways to make them graspable. Maybe this post can be an inspiration.