This is an experimental module for libgit2 bindings to Emacs, intended to boost the performance of magit.
Other work in this direction:
- ksjogo/emacs-libgit2 in C, has been dormant for more than a year.
- ubolonton/magit-libgit2 in Rust.
This module is written in C, and aims to be a thin wrapper around libgit2. That means that all functions in the libgit2 reference should translate more-or-less directly to Emacs, in the following sense:
- Function names are the same, except with underscores replaced by hyphens. The prefix is changed
from
git-
tolibgit-
. - Predicate functions are given a
-p
suffix, and words like "is" are removed, e.g.git_repository_is_bare
becomeslibgit-repository-bare-p
. - Output parameters become return values.
- Error codes become error signals (type
giterr
). - Return types map to their natural Emacs counterparts, or opaque user pointers when not applicable
(e.g. for
git-???
structures). Exceptions:git-oid
andgit-buf
types are converted to Emacs strings. - Boolean parameters or pointers towards the end of argument lists whose natural default value is false or NULL will be made optional.
Quality-of-life convenience functionality is better implemented in Emacs Lisp than in C.
There is a loader file written in Emacs Lisp that will build the module for you, but the
git submodule
steps need to be run manually.
git submodule init
git submodule update
mkdir build
cd build
cmake ..
make
If you're on OSX and using Macports, you may need to set CMAKE_PREFIX_PATH
to avoid linking
against the wrong libiconv. For example,
cmake -DCMAKE_PREFIX_PATH=/opt/local ..
Ensure that you have Cask installed.
cask install
cd build
make test
To see more output for debugging new tests you can specify more verbose output.
make test ARGS=-V
Ensure that libgit.el
is somewhere in your load path. Then
(require 'libgit)
If the dynamic module was not already built, you should be asked to do it manually.
If you use Borg, then use the following .gitmodules
entry.
[submodule "libgit"]
path = lib/libgit
url = [email protected]:magit/libegit2.git
build-step = make
- Find the section that the function belongs to (i.e.
git_SECTION_xyz
). - Create, if necessary,
src/egit-SECTION.h
andsrc/egit-SECTION.c
. - In
src/egit-SECTION.h
, declare the function withEGIT_DEFUN
. See existing headers for examples. - In
src/egit-SECTION.c
, document the function withEGIT_DOC
. See existing files for examples. - In
src/egit-SECTION.c
, implement the function. See existing files for examples.- Always check argument types in the beginning. Use
EGIT_ASSERT
for this. These macros may return. - Then, extract the data needed from
emacs_value
. This may involve allocating buffers for strings. - Call the
libgit2
backend function. - Free any memory you might need to free that was allocated in step 2.
- Check the error code if applicable with
EGIT_CHECK_ERROR
. This macro may return. - Create return value and return.
- Always check argument types in the beginning. Use
- In
src/egit.c
, create aDEFUN
call inegit_init
. You may need to include a new header.
Sometimes a struct of type git_???
may need to be returned to Emacs as an opaque user pointer.
To do this, we use a wrapper structure with a type information tag.
Some objects expose data that belong to other objects. In many cases, libgit2 keeps reference-counts
on these internally, but that's not always true. In particular, git_repository
structs are not
reference-counted (although the data-owning sub-objects like git_odb
are). Neither are lightweight
public structs like git_index_entry
, git_diff_XYZ
, etc. In these cases, the parent types must
be reference-counted on our side, and the child types must keep a reference to the parent alive.
- In
src/egit.h
, add an entry to theegit_type
enum for the new type. - In
src/egit.h
add a newEGIT_ASSERT
macro for the new type. - In
src/egit.c
add a new entry to theegit_finalize
switch statement to free the structure. If the type is reference-counted, also add an entry to the decref switch statement. - In
src/egit.c
add a new entry to theegit_typeof
switch statement. - In
src/egit.c
add a new type predicate by calling theTYPECHECKER
macro. - In
src/egit.c
create aDEFUN
call inegit_init
for the type predicate. - In
src/interface.h
add two new symbols,libgit-TYPE-p
andTYPE
. - In
src/interface.c
initialize those symbols in theem_init
function.
To create a new user pointer, call egit_wrap
with arguments:
- The
emacs_env*
- The type tag
- The pointer to wrap
- The parent wrapper, if applicable (note: this is an
egit_object*
, not agit_XYZ*
)
To return an existing user pointer (usually by grabbing the parent field of an egit_object*
),
just increase the reference count and use the EM_USER_PTR
macro. Do not do this for types that are
not reference-counted!
This is a complete list of functions in libgit2. It therefore serves more or less as an upper bound on the amount of work needed.
Legend:
- ✔️ Function is implemented
- ❌ Function should probably not be implemented (reason given)
- ❔ Undecided
Some functions are defined in libgit2 headers in the sys
subdirectory, and are not reachable from
a standard include (i.e. #include "git2.h"
). For now, we will skip those on the assumption that
they are more specialized.
Estimates (updated periodically):
- Implemented: 325 (41.8%)
- Should not implement: 169 (21.7%)
- To do: 284 (36.5%)
- Total: 778
These are functions that do not have a libgit2
equivalent.
Type checkers and predicates:
- ✔️
git-typeof
- ✔️
git-blame-p
- ✔️
git-commit-p
- ✔️
git-cred-p
- ✔️
git-diff-p
- ✔️
git-diff-delta-p
- ✔️
git-diff-binary-p
- ✔️
git-diff-hunk-p
- ✔️
git-diff-line-p
- ✔️
git-index-p
- ✔️
git-index-entry-p
- ✔️
git-object-p
- ✔️
git-reference-p
- ✔️
git-repository-p
- ✔️
git-signature-p
- ✔️
git-reference-direct-p
- ✔️
git-reference-symbolic-p
- ✔️
git-transaction-p
- ✔️
git-tree-p
Getters for public structs:
- ✔️
git-blame-hunk-commit-id
- ✔️
git-blame-hunk-lines
- ✔️
git-blame-hunk-orig-path
- ✔️
git-blame-hunk-signature
- ✔️
git-blame-hunk-start-line-number
- ✔️
git-diff-delta-file-id
- ✔️
git-diff-delta-file-path
- ✔️
git-diff-delta-nfiles
- ✔️
git-diff-delta-similarity
- ✔️
git-diff-delta-status
- ✔️
git-diff-delta-file-exists-p
- ✔️
git-diff-hunk-header
- ✔️
git-diff-hunk-lines
- ✔️
git-diff-hunk-start
- ✔️
git-diff-line-origin
- ✔️
git-diff-line-lineno
- ✔️
git-diff-line-content
- ✔️
git-index-entry-path
- ✔️
git-signature-name
- ✔️
git-signature-email
- ✔️
git-signature-time
Iterators converted to map functions:
- ✔️
git-branch-foreach
- ✔️
git-index-conflict-foreach
- ❌
git-annotated-commit-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-annotated-commit-from-fetchhead
- ✔️
git-annotated-commit-from-ref
- ✔️
git-annotated-commit-from-revspec
- ✔️
git-annotated-commit-id
- ✔️
git-annotated-commit-lookup
- ❔
git-attr-add-macro
- ❔
git-attr-cache-flush
- ❔
git-attr-foreach
- ❔
git-attr-get
- ❔
git-attr-get-many
- ❔
git-attr-value
- ❔
git-blame-buffer
- ✔️
git-blame-file
- ❌
git-blame-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-blame-get-hunk-byindex
- ✔️
git-blame-get-hunk-byline
- ✔️
git-blame-get-hunk-count
- ❌
git-blame-init-options
(options are represented by analist
)
- ✔️
git-blob-create-frombuffer
- ✔️
git-blob-create-fromdisk
- ❔
git-blob-create-fromstream
- ❔
git-blob-create-fromstream-commit
- ✔️
git-blob-create-fromworkdir
- ❔
git-blob-dup
- ✔️
git-blob-filtered-content
- ❌
git-blob-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-blob-id
- ✔️
git-blob-is-binary
(aslibgit-blob-binary-p
) - ✔️
git-blob-lookup
- ✔️
git-blob-lookup-prefix
- ✔️
git-blob-owner
- ✔️
git-blob-rawcontent
- ✔️
git-blob-rawsize
- ✔️
git-branch-create
- ✔️
git-branch-create-from-annotated
- ✔️
git-branch-delete
- ✔️
git-branch-is-checked-out
- ✔️
git-branch-is-head
- ❌
git-branch-iterator-free
- ❌
git-branch-iterator-new
- ✔️
git-branch-lookup
- ✔️
git-branch-move
- ✔️
git-branch-name
- ❌
git-branch-next
- ✔️
git-branch-remote-name
- ✔️
git-branch-set-upstream
- ✔️
git-branch-upstream
- ✔️
git-branch-upstream-name
- ✔️
git-branch-upstream-remote
Probably none of these functions are necessary, since we can expose buffers to Emacs as strings.
- ❌
git-buf-contains-nul
- ❌
git-buf-free
(memory management shouldn't be exposed to Emacs) - ❌
git-buf-grow
- ❌
git-buf-is-binary
- ❌
git-buf-set
- ✔️
git-checkout-head
- ✔️
git-checkout-index
- ❌
git-checkout-init-options
- ✔️
git-checkout-tree
- ✔️
git-cherrypick
- ✔️
git-cherrypick-commit
- ❌
git-cherrypick-init-options
- ✔️
git-clone
- ❔
git-clone-init-options
- ❔
git-commit-amend
- ✔️
git-commit-author
- ✔️
git-commit-body
- ✔️
git-commit-committer
- ✔️
git-commit-create
- ❔
git-commit-create-buffer
- ❌
git-commit-create-from-callback
(insys
) - ❌
git-commit-create-from-ids
(insys
) - ❌
git-commit-create-v
(git-commit-create
does the same) - ❔
git-commit-create-with-signature
- ❔
git-commit-dup
- ❔
git-commit-extract-signature
- ❌
git-commit-free
(memory management shouldn't be exposed to Emacs) - ❔
git-commit-header-field
- ✔️
git-commit-id
- ✔️
git-commit-lookup
- ✔️
git-commit-lookup-prefix
- ✔️
git-commit-message
- ❔
git-commit-message-encoding
- ❔
git-commit-message-raw
- ✔️
git-commit-nth-gen-ancestor
- ✔️
git-commit-owner
- ✔️
git-commit-parent
- ✔️
git-commit-parent-id
- ✔️
git-commit-parentcount
- ❔
git-commit-raw-header
- ✔️
git-commit-summary
- ✔️
git-commit-time
- ❌
git-commit-time-offset
(included ingit-commit-time
) - ✔️
git-commit-tree
- ✔️
git-commit-tree-id
- ❌
git-config-add-backend
(insys
) - ✔️
git-config-add-file-ondisk
- ❔
git-config-backend-foreach-match
- ✔️
git-config-delete-entry
- ✔️
git-config-delete-multivar
- ❌
git-config-entry-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-config-find-global
- ✔️
git-config-find-programdata
- ✔️
git-config-find-system
- ✔️
git-config-find-xdg
- ❔
git-config-foreach
- ❔
git-config-foreach-match
- ❌
git-config-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-config-get-bool
- ❔
git-config-get-entry
- ❌
git-config-get-int32
(don't need different integer types) - ✔️
git-config-get-int64
(as-int
) - ❔
git-config-get-mapped
- ❔
git-config-get-multivar-foreach
- ✔️
git-config-get-path
- ✔️
git-config-get-string
- ❌
git-config-get-string-buf
(probably fine with just-get-string
) - ❌
git-config-init-backend
(insys
) - ❌
git-config-iterator-free
(memory management shouldn't be exposed to Emacs) - ❔
git-config-iterator-glob-new
- ❔
git-config-iterator-new
- ✔️
git-config-lock
- ❔
git-config-lookup-map-value
- ❔
git-config-multivar-iterator-new
- ✔️
git-config-new
- ❔
git-config-next
- ✔️
git-config-open-default
- ✔️
git-config-open-global
- ✔️
git-config-open-level
- ✔️
git-config-open-ondisk
- ❔
git-config-parse-bool
- ❔
git-config-parse-int32
- ❔
git-config-parse-int64
- ❔
git-config-parse-path
- ✔️
git-config-set-bool
- ❌
git-config-set-int32
(don't need different integer types) - ✔️
git-config-set-int64
(as-int
) - ❔
git-config-set-multivar
- ✔️
git-config-set-string
- ✔️
git-config-snapshot
- ✔️
git-cred-default-new
- ❌
git-cred-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-cred-has-username
(git-cred-username-p
) - ❔
git-cred-ssh-custom-new
- ❔
git-cred-ssh-interactive-new
- ✔️
git-cred-ssh-key-from-agent
- ✔️
git-cred-ssh-key-memory-new
- ✔️
git-cred-ssh-key-new
- ✔️
git-cred-username-new
- ❌
git-cred-userpass
(stock callback) - ✔️
git-cred-userpass-plaintext-new
- ✔️
git-describe-commit
- ❌
git-describe-format
(we return strings immediately) - ❌
git-describe-result-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-describe-workdir
- ❔
git-diff-blob-to-buffer
- ❔
git-diff-blobs
- ❔
git-diff-buffers
- ❔
git-diff-commit-as-email
- ❌
git-diff-find-init-options
- ✔️
git-diff-find-similar
- ✔️
git-diff-foreach
- ❔
git-diff-format-email
- ❔
git-diff-format-email-init-options
- ❌
git-diff-free
(memory management shouldn't be exposed to Emacs) - ❔
git-diff-from-buffer
- ✔️
git-diff-get-delta
- ❌
git-diff-get-perfdata
(insys
) - ❔
git-diff-get-stats
- ✔️
git-diff-index-to-index
- ✔️
git-diff-index-to-workdir
- ❔
git-diff-init-options
- ❔
git-diff-is-sorted-icase
- ❔
git-diff-merge
- ✔️
git-diff-num-deltas
- ✔️
git-diff-num-deltas-of-type
(usegit-diff-num-deltas
) - ❔
git-diff-patchid
- ❔
git-diff-patchid-init-options
- ✔️
git-diff-print
- ❌
git-diff-print-callback--to-buf
(insys
) - ❔
git-diff-print-callback--to-file-handle
- ❔
git-diff-stats-deletions
- ❔
git-diff-stats-files-changed
- ❌
git-diff-stats-free
(memory management shouldn't be exposed to Emacs) - ❔
git-diff-stats-insertions
- ❔
git-diff-stats-to-buf
- ❔
git-diff-status-char
- ❔
git-diff-to-buf
- ✔️
git-diff-tree-to-index
- ✔️
git-diff-tree-to-tree
- ✔️
git-diff-tree-to-workdir
- ✔️
git-diff-tree-to-workdir-with-index
- ❌
git-fetch-init-options
- ❌
git-filter-init
(insys
) - ❔
git-filter-list-apply-to-blob
- ❔
git-filter-list-apply-to-data
- ❔
git-filter-list-apply-to-file
- ❔
git-filter-list-contains
- ❌
git-filter-list-free
(memory management shouldn't be exposed to Emacs) - ❌
git-filter-list-length
(insys
) - ❔
git-filter-list-load
- ❌
git-filter-list-new
(insys
) - ❌
git-filter-list-push
(insys
) - ❔
git-filter-list-stream-blob
- ❔
git-filter-list-stream-data
- ❔
git-filter-list-stream-file
- ❌
git-filter-lookup
(insys
) - ❌
git-filter-register
(insys
) - ❌
git-filter-source-filemode
(insys
) - ❌
git-filter-source-flags
(insys
) - ❌
git-filter-source-id
(insys
) - ❌
git-filter-source-mode
(insys
) - ❌
git-filter-source-path
(insys
) - ❌
git-filter-source-repo
(insys
) - ❌
git-filter-unregister
(insys
)
Probably none of these functions will be necessary, since we expose errors to Emacs as signals.
- ❌
giterr-clear
- ❌
giterr-last
- ❌
giterr-set-oom
- ❌
giterr-set-str
- ✔️
git-graph-ahead-behind
- ✔️
git-graph-descendant-of
- ❌
git-hashsig-compare
(insys
) - ❌
git-hashsig-create
(insys
) - ❌
git-hashsig-create-fromfile
(insys
) - ❌
git-hashsig-free
(memory management shouldn't be exposed to Emacs)
- ✔️
git-ignore-add-rule
- ✔️
git-ignore-clear-internal-rules
- ✔️
git-ignore-path-is-ignored
- ❔
git-index-add
- ✔️
git-index-add-all
- ✔️
git-index-add-bypath
- ❔
git-index-add-frombuffer
- ✔️
git-index-caps
- ✔️
git-index-checksum
- ✔️
git-index-clear
- ❔
git-index-conflict-add
- ❔
git-index-conflict-cleanup
- ✔️
git-index-conflict-get
- ✔️
git-index-conflict-iterator-free
(usegit-index-conflict-foreach
) - ✔️
git-index-conflict-iterator-new
(usegit-index-conflict-foreach
) - ✔️
git-index-conflict-next
(usegit-index-conflict-foreach
) - ❔
git-index-conflict-remove
- ✔️
git-index-entry-is-conflict
(usegit-index-entry-stage
) - ✔️
git-index-entry-stage
- ✔️
git-index-entrycount
- ❔
git-index-find
- ❔
git-index-find-prefix
- ❌
git-index-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-index-get-byindex
- ✔️
git-index-get-bypath
- ✔️
git-index-has-conflicts
(asgit-index-conflicts-p
) - ❔
git-index-new
- ❔
git-index-open
- ✔️
git-index-owner
- ✔️
git-index-path
- ✔️
git-index-read
- ❔
git-index-read-tree
- ❔
git-index-remove
- ❔
git-index-remove-all
- ❔
git-index-remove-bypath
- ❔
git-index-remove-directory
- ❔
git-index-set-caps
- ❔
git-index-set-version
- ❔
git-index-update-all
- ✔️
git-index-version
- ✔️
git-index-write
- ✔️
git-index-write-tree
- ✔️
git-index-write-tree-to
(usegit-index-write-tree
)
- ❔
git-indexer-append
- ❔
git-indexer-commit
- ❌
git-indexer-free
(memory management shouldn't be exposed to Emacs) - ❔
git-indexer-hash
- ❔
git-indexer-new
- ✔️
git-libgit2-features
(aslibgit-feature-p
) - ❌
git-libgit2-init
(internal) - ❔
git-libgit2-opts
- ❌
git-libgit2-shutdown
(internal) - ✔️
git-libgit2-version
(aslibgit-version
)
- ❌
git-mempack-dump
(insys
) - ❌
git-mempack-new
(insys
) - ❌
git-mempack-reset
(insys
)
- ✔️
git-merge
- ✔️
git-merge-analysis
- ✔️
git-merge-base
- ✔️
git-merge-base-many
(usegit-merge-base
) - ✔️
git-merge-base-octopus
- ✔️
git-merge-bases
- ✔️
git-merge-bases-many
(usegit-merge-bases
) - ❔
git-merge-commits
- ❔
git-merge-file
- ❔
git-merge-file-from-index
- ❔
git-merge-file-init-input
- ❔
git-merge-file-init-options
- ❔
git-merge-file-result-free
- ❌
git-merge-init-options
- ❔
git-merge-trees
- ✔️
git-message-prettify
- ❌
git-message-trailer-array-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-message-trailers
- ❔
git-note-author
- ❔
git-note-commit-create
- ❔
git-note-commit-iterator-new
- ❔
git-note-commit-read
- ❔
git-note-commit-remove
- ❔
git-note-committer
- ❔
git-note-create
- ❔
git-note-foreach
- ❌
git-note-free
(memory management shouldn't be exposed to Emacs) - ❔
git-note-id
- ❔
git-note-iterator-free
- ❔
git-note-iterator-new
- ❔
git-note-message
- ❔
git-note-next
- ❔
git-note-read
- ❔
git-note-remove
- ❌
git-object--size
(memory management shouldn't be exposed to Emacs) - ❔
git-object-dup
- ❌
git-object-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-object-id
- ❔
git-object-lookup
- ✔️
git-object-lookup-bypath
- ✔️
git-object-lookup-prefix
- ✔️
git-object-owner
- ❔
git-object-peel
- ✔️
git-object-short-id
- ❌
git-object-string2type
(see below) - ❌
git-object-type
(can be covered by a more generalgit-typeof
for all opaque user pointers) - ❌
git-object-type2string
(see above) - ❔
git-object-typeisloose
- ❔
git-odb-add-alternate
- ❔
git-odb-add-backend
- ❔
git-odb-add-disk-alternate
- ❔
git-odb-backend-loose
- ❔
git-odb-backend-one-pack
- ❔
git-odb-backend-pack
- ❔
git-odb-exists
- ❔
git-odb-exists-prefix
- ❔
git-odb-expand-ids
- ❔
git-odb-foreach
- ❌
git-odb-free
(memory management shouldn't be exposed to Emacs) - ❔
git-odb-get-backend
- ❔
git-odb-hash
- ❔
git-odb-hashfile
- ❌
git-odb-init-backend
(insys
) - ❔
git-odb-new
- ❔
git-odb-num-backends
- ❔
git-odb-object-data
- ❔
git-odb-object-dup
- ❌
git-odb-object-free
(memory management shouldn't be exposed to Emacs) - ❔
git-odb-object-id
- ❔
git-odb-object-size
- ❔
git-odb-object-type
- ❔
git-odb-open
- ❔
git-odb-open-rstream
- ❔
git-odb-open-wstream
- ❔
git-odb-read
- ❔
git-odb-read-header
- ❔
git-odb-read-prefix
- ❔
git-odb-refresh
- ❔
git-odb-stream-finalize-write
- ❌
git-odb-stream-free
(memory management shouldn't be exposed to Emacs) - ❔
git-odb-stream-read
- ❔
git-odb-stream-write
- ❔
git-odb-write
- ❔
git-odb-write-pack
Probably none of these functions will be necessary, since we can expose OIDs to Emacs as strings.
- ❌
git-oid-cmp
- ❌
git-oid-cpy
- ❌
git-oid-equal
- ❌
git-oid-fmt
- ❌
git-oid-fromraw
- ❌
git-oid-fromstr
- ❌
git-oid-fromstrn
- ❌
git-oid-fromstrp
- ❌
git-oid-iszero
- ❌
git-oid-ncmp
- ❌
git-oid-nfmt
- ❌
git-oid-pathfmt
- ❌
git-oid-shorten-add
- ❌
git-oid-shorten-free
- ❌
git-oid-shorten-new
- ❌
git-oid-strcmp
- ❌
git-oid-streq
- ❌
git-oid-tostr
- ❌
git-oid-tostr-s
- ❌
git-oidarray-free
(memory management shouldn't be exposed to Emacs)
- ❌
git-openssl-set-locking
(insys
)
- ❔
git-packbuilder-foreach
- ❌
git-packbuilder-free
(memory management shouldn't be exposed to Emacs) - ❔
git-packbuilder-hash
- ❔
git-packbuilder-insert
- ❔
git-packbuilder-insert-commit
- ❔
git-packbuilder-insert-recur
- ❔
git-packbuilder-insert-tree
- ❔
git-packbuilder-insert-walk
- ❔
git-packbuilder-new
- ❔
git-packbuilder-object-count
- ❔
git-packbuilder-set-callbacks
- ❔
git-packbuilder-set-threads
- ❔
git-packbuilder-write
- ❔
git-packbuilder-written
- ❌
git-patch-free
(memory management shouldn't be exposed to Emacs) - ❔
git-patch-from-blob-and-buffer
- ❔
git-patch-from-blobs
- ❔
git-patch-from-buffers
- ❔
git-patch-from-diff
- ❔
git-patch-get-delta
- ❔
git-patch-get-hunk
- ❔
git-patch-get-line-in-hunk
- ❔
git-patch-line-stats
- ❔
git-patch-num-hunks
- ❔
git-patch-num-lines-in-hunk
- ❔
git-patch-print
- ❔
git-patch-size
- ❔
git-patch-to-buf
- ❌
git-pathspec-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-pathspec-match-diff
- ✔️
git-pathspec-match-index
- ✔️
git-pathspec-match-list-diff-entry
- ✔️
git-pathspec-match-list-entry
- ✔️
git-pathspec-match-list-entrycount
- ✔️
git-pathspec-match-list-failed-entry
- ✔️
git-pathspec-match-list-failed-entrycount
- ❌
git-pathspec-match-list-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-pathspec-match-tree
- ✔️
git-pathspec-match-workdir
- ✔️
git-pathspec-matches-path
- ✔️
git-pathspec-new
- ❌
git-proxy-init-options
- ❌
git-push-init-options
- ❔
git-rebase-abort
- ❔
git-rebase-commit
- ❔
git-rebase-finish
- ❌
git-rebase-free
(memory management shouldn't be exposed to Emacs) - ❔
git-rebase-init
- ❔
git-rebase-init-options
- ❔
git-rebase-inmemory-index
- ❔
git-rebase-next
- ❔
git-rebase-open
- ❔
git-rebase-operation-byindex
- ❔
git-rebase-operation-current
- ❔
git-rebase-operation-entrycount
- ❌
git-refdb-backend-fs
(insys
) - ❔
git-refdb-compress
- ❌
git-refdb-free
(memory management shouldn't be exposed to Emacs) - ❌
git-refdb-init-backend
(insys
) - ❔
git-refdb-new
- ❔
git-refdb-open
- ❌
git-refdb-set-backend
(insys
)
- ❌
git-reference--alloc
(insys
) - ❌
git-reference--alloc-symbolic
(insys
) - ❔
git-reference-cmp
- ✔️
git-reference-create
- ✔️
git-reference-create-matching
- ✔️
git-reference-delete
- ✔️
git-reference-dup
- ✔️
git-reference-dwim
- ✔️
git-reference-ensure-log
- ✔️
git-reference-foreach
- ✔️
git-reference-foreach-glob
- ✔️
git-reference-foreach-name
- ❌
git-reference-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-reference-has-log
- ✔️
git-reference-is-branch
- ✔️
git-reference-is-note
- ✔️
git-reference-is-remote
- ✔️
git-reference-is-tag
- ✔️
git-reference-is-valid-name
- ❌
git-reference-iterator-free
(use the foreach functions) - ❌
git-reference-iterator-glob-new
(use the foreach functions) - ❌
git-reference-iterator-new
(use the foreach functions) - ✔️
git-reference-list
- ✔️
git-reference-lookup
- ✔️
git-reference-name
- ✔️
git-reference-name-to-id
- ❌
git-reference-next
(use the foreach functions) - ❌
git-reference-next-name
(use the foreach functions) - ❔
git-reference-normalize-name
- ✔️
git-reference-owner
- ✔️
git-reference-peel
- ✔️
git-reference-remove
- ❔
git-reference-rename
- ✔️
git-reference-resolve
- ❔
git-reference-set-target
- ✔️
git-reference-shorthand
- ❔
git-reference-symbolic-create
- ❔
git-reference-symbolic-create-matching
- ❔
git-reference-symbolic-set-target
- ✔️
git-reference-symbolic-target
- ✔️
git-reference-target
- ✔️
git-reference-target-peel
- ✔️
git-reference-type
- ✔️
git-reflog-append
- ✔️
git-reflog-delete
- ✔️
git-reflog-drop
- ✔️
git-reflog-entry-byindex
- ✔️
git-reflog-entry-committer
- ✔️
git-reflog-entry-id-new
(usegit-reflog-entry-id
) - ✔️
git-reflog-entry-id-old
(usegit-reflog-entry-id
) - ✔️
git-reflog-entry-message
- ✔️
git-reflog-entrycount
- ❌
git-reflog-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-reflog-read
- ✔️
git-reflog-rename
- ✔️
git-reflog-write
- ✔️
git-refspec-direction
- ✔️
git-refspec-dst
- ✔️
git-refspec-dst-matches
- ✔️
git-refspec-force
- ❔
git-refspec-rtransform
- ✔️
git-refspec-src
- ✔️
git-refspec-src-matches
- ✔️
git-refspec-string
- ❔
git-refspec-transform
- ✔️
git-remote-add-fetch
(usegit-remote-add-refspec
) - ✔️
git-remote-add-push
(usegit-remote-add-refspec
) - ✔️
git-remote-autotag
- ❔
git-remote-connect
- ❔
git-remote-connected
- ✔️
git-remote-create
- ❔
git-remote-create-anonymous
- ❔
git-remote-create-detached
- ❔
git-remote-create-with-fetchspec
- ❔
git-remote-default-branch
- ❔
git-remote-delete
- ❔
git-remote-disconnect
- ❔
git-remote-download
- ❔
git-remote-dup
- ✔️
git-remote-fetch
- ❌
git-remote-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-remote-get-fetch-refspecs
(usegit-remote-get-refspecs
) - ✔️
git-remote-get-push-refspecs
(usegit-remote-get-refspecs
) - ✔️
git-remote-get-refspec
- ❌
git-remote-init-callbacks
- ✔️
git-remote-is-valid-name
- ✔️
git-remote-list
- ✔️
git-remote-lookup
- ❔
git-remote-ls
- ✔️
git-remote-name
- ✔️
git-remote-owner
- ❔
git-remote-prune
- ❔
git-remote-prune-refs
- ✔️
git-remote-push
- ✔️
git-remote-pushurl
- ✔️
git-remote-refspec-count
- ❔
git-remote-rename
- ❔
git-remote-set-autotag
- ❔
git-remote-set-pushurl
- ❔
git-remote-set-url
- ❔
git-remote-stats
- ❔
git-remote-stop
- ❔
git-remote-update-tips
- ❔
git-remote-upload
- ✔️
git-remote-url
- ❌
git-repository--cleanup
(insys
) - ✔️
git-repository-commondir
- ✔️
git-repository-config
- ❔
git-repository-config-snapshot
- ✔️
git-repository-detach-head
- ✔️
git-repository-discover
- ❔
git-repository-fetchhead-foreach
- ❌
git-repository-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-repository-get-namespace
- ❔
git-repository-hashfile
- ✔️
git-repository-head
- ✔️
git-repository-head-detached
- ✔️
git-repository-head-for-worktree
- ✔️
git-repository-head-unborn
- ✔️
git-repository-ident
- ✔️
git-repository-index
- ✔️
git-repository-init
- ❔
git-repository-init-ext
- ❔
git-repository-init-init-options
- ✔️
git-repository-is-bare
- ✔️
git-repository-is-empty
- ✔️
git-repository-is-shallow
- ✔️
git-repository-is-worktree
- ❔
git-repository-item-path
- ❔
git-repository-mergehead-foreach
- ✔️
git-repository-message
- ✔️
git-repository-message-remove
- ❌
git-repository-new
(insys
) - ❔
git-repository-odb
- ✔️
git-repository-open
- ✔️
git-repository-open-bare
- ❔
git-repository-open-ext
- ❔
git-repository-open-from-worktree
- ✔️
git-repository-path
- ❔
git-repository-refdb
- ❌
git-repository-reinit-filesystem
(insys
) - ❌
git-repository-set-bare
(insys
) - ❌
git-repository-set-config
(insys
) - ✔️
git-repository-set-head
- ✔️
git-repository-set-head-detached
- ❔
git-repository-set-head-detached-from-annotated
- ✔️
git-repository-set-ident
- ❌
git-repository-set-index
(insys
) - ✔️
git-repository-set-namespace
- ❌
git-repository-set-odb
(insys
) - ❌
git-repository-set-refdb
(insys
) - ✔️
git-repository-set-workdir
- ✔️
git-repository-state
- ✔️
git-repository-state-cleanup
- ❌
git-repository-submodule-cache-all
(insys
) - ❌
git-repository-submodule-cache-clear
(insys
) - ✔️
git-repository-workdir
- ❔
git-repository-wrap-odb
- ✔️
git-reset
- ✔️
git-reset-default
- ✔️
git-reset-from-annotated
- ✔️
git-revert
- ✔️
git-revert-commit
- ❌
git-revert-init-options
- ✔️
git-revparse
- ✔️
git-revparse-ext
- ✔️
git-revparse-single
- ❌
git-revwalk-add-hide-cb
(usegit-revwalk-foreach
) - ❌
git-revwalk-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-revwalk-hide
- ✔️
git-revwalk-hide-glob
- ✔️
git-revwalk-hide-head
- ✔️
git-revwalk-hide-ref
- ✔️
git-revwalk-new
- ❌
git-revwalk-next
(usegit-revwalk-foreach
) - ✔️
git-revwalk-push
- ✔️
git-revwalk-push-glob
- ✔️
git-revwalk-push-head
- ✔️
git-revwalk-push-range
- ✔️
git-revwalk-push-ref
- ✔️
git-revwalk-repository
- ✔️
git-revwalk-reset
- ✔️
git-revwalk-simplify-first-parent
- ✔️
git-revwalk-sorting
- ✔️
git-signature-default
- ❔
git-signature-dup
- ❌
git-signature-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-signature-from-buffer
(usegit-signature-from-string
) - ✔️
git-signature-new
- ✔️
git-signature-now
- ❔
git-smart-subtransport-git
- ❔
git-smart-subtransport-http
- ❔
git-smart-subtransport-ssh
- ❔
git-stash-apply
- ❔
git-stash-apply-init-options
- ❔
git-stash-drop
- ❔
git-stash-foreach
- ❔
git-stash-pop
- ❔
git-status-byindex
- ✔️
git-status-file
- ✔️
git-status-foreach
- ✔️
git-status-foreach-ext
- ❌
git-status-init-options
- ❔
git-status-list-entrycount
- ❔
git-status-list-free
- ❌
git-status-list-get-perfdata
(insys
) - ❔
git-status-list-new
- ✔️
git-status-should-ignore
- ❌
git-strarray-copy
- ❌
git-strarray-free
(memory management shouldn't be exposed to Emacs)
- ❌
git-stream-register-tls
(insys
)
- ✔️
git-submodule-add-finalize
- ✔️
git-submodule-add-setup
- ✔️
git-submodule-add-to-index
- ✔️
git-submodule-branch
- ✔️
git-submodule-fetch-recurse-submodules
- ✔️
git-submodule-foreach
- ❌
git-submodule-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-submodule-head-id
- ✔️
git-submodule-ignore
- ✔️
git-submodule-index-id
- ✔️
git-submodule-init
- ✔️
git-submodule-location
- ✔️
git-submodule-lookup
- ✔️
git-submodule-name
- ✔️
git-submodule-open
- ✔️
git-submodule-owner
- ✔️
git-submodule-path
- ✔️
git-submodule-reload
- ✔️
git-submodule-repo-init
- ❔
git-submodule-resolve-url
- ✔️
git-submodule-set-branch
- ✔️
git-submodule-set-fetch-recurse-submodules
- ✔️
git-submodule-set-ignore
- ✔️
git-submodule-set-update
- ✔️
git-submodule-set-url
- ✔️
git-submodule-status
- ✔️
git-submodule-sync
- ✔️
git-submodule-update
- ❌
git-submodule-update-init-options
- ✔️
git-submodule-update-strategy
- ✔️
git-submodule-url
- ✔️
git-submodule-wd-id
- ❔
git-tag-annotation-create
- ❔
git-tag-create
- ❔
git-tag-create-frombuffer
- ❔
git-tag-create-lightweight
- ❔
git-tag-delete
- ❔
git-tag-dup
- ✔️
git-tag-foreach
- ❌
git-tag-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-tag-id
- ✔️
git-tag-list
- ✔️
git-tag-list-match
- ✔️
git-tag-lookup
- ✔️
git-tag-lookup-prefix
- ✔️
git-tag-message
- ✔️
git-tag-name
- ✔️
git-tag-owner
- ✔️
git-tag-peel
- ✔️
git-tag-tagger
- ✔️
git-tag-target
- ✔️
git-tag-target-id
- ✔️
git-tag-target-type
- ❌
git-time-monotonic
(insys
)
- ❔
git-trace-set
- ✔️
git_transaction_commit
- ❌
git_transaction_free
(memory management shouldn't be exposed to Emacs) - ❔
git_transaction_lock_ref
- ❔
git_transaction_new
- ❔
git_transaction_remove
- ❔
git_transaction_set_reflog
- ❔
git_transaction_set_symbolic_target
- ❔
git_transaction_set_target
- ❌
git-transport-dummy
(insys
) - ❌
git-transport-init
(insys
) - ❌
git-transport-local
(insys
) - ❌
git-transport-new
(insys
) - ❌
git-transport-register
(insys
) - ❌
git-transport-smart
(insys
) - ❌
git-transport-smart-certificate-check
(insys
) - ❌
git-transport-smart-credentials
(insys
) - ❌
git-transport-smart-proxy-options
(insys
) - ❌
git-transport-ssh-with-paths
(insys
) - ❌
git-transport-unregister
(insys
)
- ❔
git-tree-create-updated
- ❔
git-tree-dup
- ✔️
git-tree-entry-byid
- ✔️
git-tree-entry-byindex
- ✔️
git-tree-entry-byname
- ✔️
git-tree-entry-bypath
- ❌
git-tree-entry-cmp
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-dup
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-filemode
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-filemode-raw
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-free
(memory management shouldn't be exposed to Emacs) - ❌
git-tree-entry-id
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-name
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-to-object
(tree entries are exposed to emacs as lists) - ❌
git-tree-entry-type
(tree entries are exposed to emacs as lists) - ✔️
git-tree-entrycount
- ❌
git-tree-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-tree-id
- ✔️
git-tree-lookup
- ✔️
git-tree-lookup-prefix
- ✔️
git-tree-owner
- ✔️
git-tree-walk
- ✔️
git-treebuilder-clear
- ✔️
git-treebuilder-entrycount
- ✔️
git-treebuilder-filter
- ❌
git-treebuilder-free
(memory management shouldn't be exposed to Emacs) - ✔️
git-treebuilder-get
- ✔️
git-treebuilder-insert
- ✔️
git-treebuilder-new
- ✔️
git-treebuilder-remove
- ✔️
git-treebuilder-write
- ❔
git-treebuilder-write-with-buffer
- ❔
git-worktree-add
- ❔
git-worktree-add-init-options
- ❌
git-worktree-free
(memory management shouldn't be exposed to Emacs) - ❔
git-worktree-is-locked
- ❔
git-worktree-is-prunable
- ❔
git-worktree-list
- ❔
git-worktree-lock
- ❔
git-worktree-lookup
- ❔
git-worktree-open-from-repository
- ❔
git-worktree-prune
- ❔
git-worktree-prune-init-options
- ❔
git-worktree-unlock
- ❔
git-worktree-validate