gitserver API

As of February 1, 2023

gitserver is Sourcegraph's interface to Git repositories. It clones repositories and exposes an API for interacting with that clone.

gitserver used to expose a simple "run any Git command" interface, but that was removed. and in its place the gitserver client exposes an API supporting specific Git operations.

Method Description Notes Git Command or GitServer Endpoint
AddrForRepo resolves repo names to gitserver instances
Addrs returns addresses for gitserver instances
ArchiveReader download archived repository
BatchLog allows for monitoring and aborting the applying of batch changes git log -n 1 --name-only
BlameFile returns git blame information about a file git blame
StreamBlameFile Same as BlameFile, but streaming git blame
BranchesContaining Returns all of the branches containing the given commit git branch --contains <commit> --format %(refname)
CommitDate returns the time the given commit was committed Does not error if commit DNE, but returns a false value flag git show -s --format=%H:%cI
CommitExists determines if the given commit exists in the given repository Does not error if commit DNE, but returns a false value flag git log --format=format:%H%x00%aN%x00%aE%x00%at%x00%cN%x00%cE%x00%ct%x00%B%x00%P%x00 -n 1 <commit hash>
CommitGraph returns the commit graph for the given repository as a mapping from a commit to its parents runs git log --pretty="%H %P" --topo-order with either --all --since, or -### with a numeric limit
Commits returns all commits matching the options runs git log --pretty="%H %P" --topo-order with either --all --since, or -### with a numeric limit, and filters them based on supplied options, such as author, message, before, after, etc...
CommitsExist determines if the given commits exist in the given repositories Uses GetCommits
CommitsUniqueToBranch returns a map from commits that exist on a given branch in the given repository to their commit date runs git log --pretty=format:%H:%cI with other options depending on parameters
ContributorCount returns the number of commits grouped by contributor runs git shortlog -s -n -e --no-merges with other options depending on parameters
CreateCommitFromPatch Creates a commit from a patch file (optionally pushing it to origin?) clones the repo to a temp dir, then runs git apply on the patch.
Diff returns an iterator that can be used to access the diff between two commits on a per-file basis comment on the method mentions go-diff which might be useful to look into git diff --find-renames --full-index --inter-hunk-context=3 --no-prefix <range> --
DiffPath returns the changes to a given path between the given source and target commits returns one diff even if there are multiple commits in between the two given commits git diff <from commit> <to commit> -- <path>
DiffSymbols performs a diff command which is expected to be parsed by our symbols package git diff -z --name-status --no-renames <from commit> <to commit>
FirstEverCommit returns the first commit ever made to the repository runs git rev-list --reverse --date-order --max-parents=0 HEAD to get the commit hash, then calls GetCommit with the hash
BehindAhead returns the behind/ahead commit counts information for right vs. left (both Git revspecs) git rev-list --count --left-right <left commit>...<right commit>
GetCommit returns the commit with the given commit ID errors if no such commit exists git log -n 1 <commit>
GetCommits returns a git commit object describing each of the given repository and commit pairs Uses the batch log interface git log -n 1 --name-only
GetDefaultBranch Returns the default branch name and current commit "default" means "current" in the implementation, probably because all of the indexing work in a repository is done in the default branch? git symbolic-ref HEAD
GetObject Returns a Git Object, which is one of "commit", "tag", "tree" or "blob" I'm not clear on the use cases for this method uses git rev-parse and git cat-file
HasCommitAfter returns a boolean indicating if a repo contains a commit after a given date. Used to assess how "stale" a repository is Does it look at the origin? Just locally? git rev-list -n 1 --after=<date> --count HEAD
Head determines the tip commit of the default branch for the given repository runs git rev-parse HEAD to get the commit hash, then uses GetCommit
IsRepoCloneable returns an error if a repo is not cloneable
ListBranches Returns a list of all of the branches in the repository Includes information about the HEAD commit, and how many commits the branch is beind and ahead of another given branch. git branch
ListDirectoryChildren fetches the list of children under the given directory names Seems to be NOT recursive? Returns strings, not Git Objects. git ls-tree --name-only <commit id> -- <dirname> ...
ListFiles returns a list of root-relative file paths matching the given pattern in a particular commit of a repository This one is recursive - uses the -r option. git ls-tree --name-only -r <commit id> -- and then filtering returned paths by a given regular expression
ListRefs Returns a list of references in a repository references are human-friendly names for commit hashes. For example, git checkout -b mybranch creates a reference named "mybranch" pointed to the current HEAD hash. References are files stored in .git/refs. What's the use case for this? Is it mainly/only for display so an end user can click on a particular reference and will be taken to that target? git show-ref
ListTags returns a list of all tags in the repository. If commitObjs is non-empty, only all tags pointing at those commits are returned. git tag --list --sort --creatordate --format %(if)%(\*objectname)%(then)%(\*objectname)%(else)%(objectname)%(end)%00%(refname:short)%00%(if)%(creatordate:unix)%(then)%(creatordate:unix)%(else)%(\*creatordate:unix)%(end)
LsFiles returns the output of git ls-files, null-separated, with optional path specifications git ls-files -z --with-tree <commit id> -- <path> ...
MergeBase returns the common ancestor for a merge of two given commits git merge-base
NewFileReader reads from the given file at the given commit git show <commit>:<path>
P4Exec sends a p4 command and reads the output Accesses the /p4-exec endpoint of gitserver, which according to the comments, "is currently only used for fetching user based permissions information so, we don't have a repo name" Doesn't do any Git commands; runs p4 with the given command
ReadDir reads the given directory at the given commit the comment on --long is, "show size" git ls-tree --long --full-name -z <commit> (-r -t)? (-- <path>)?
ReadFile Like NewFileReader, but returns a byte slize instead of a reader uses NewFileReader internally git show <commit>:<path>
RefDescriptions returns a map from commits to descriptions of the tip of each branch and tag of the given repository returns the struct:
\- the name of the branch/tag
\- the type (unknown, branch, or tag)
\- true/false for default (current) branch
\- date branch/tag created
git for-each-ref --format="%(if)%(\*objectname)%(then)%(\*objectname)%(else)%(objectname)%(end)%(refname)%(HEAD)%(if)%(\*creatordate:iso8601-strict)%(then)%(\*creatordate:iso8601-strict)%(else)%(creatordate:iso8601-strict)%(end)%00" refs/heads/ refs/tags/ --points-at=<commit>
Remove removes the repository clone from gitserver looks up the instance and calls RemoveFrom with that instance
RemoveFrom removes the repository clone from the given gitserver
RepoCloneProgress calls gitserver's /repo-clone-progress endpoint Returns the output of the clone command checks on the existance of GIT_DIR and if it's still locked by a clone process
RequestRepoClone an asynchronous request to clone a repository calls gitserver's /repo-clone endpoint git clone
RequestRepoUpdate calls gitserver's /repo-update endpoint
ResolveRevision returns the absolute commit for a commit-ish spec git rev-parse <commit-ish spec>
ResolveRevisions expands a set of RevisionSpecifiers (which may include hashes, globs, refs, or glob exclusions) into an equivalent set of commit hashes git rev-parse <commit-ish spec> ...
Stat returns a FileInfo describing the named file at commit maps output from git ls-tree into FileInfo structs, with the object hash in the Sys_ member
IsPerforcePathCloneable check if a given depot/depot path is cloneable with the given credentials calls gitserver's /is-perforce-path-cloneable endpoint
CheckPerforceCredentials check if a given Perforce credential is valid calls gitserver's /check-perforce-credentials endpoint
PerforceUsers list all perforce users calls gitserver's /perforce-users endpoint
PerforceProtectsForUser list all protections that apply to a user calls gitserver's /perforce-protects-for-user endpoint
PerforceProtectsForDepot list all protections that apply to a depot calls gitserver's /perforce-protects-for-depot endpoint
PerforceGroupMembers list all members of a Perforce group calls gitserver's /perforce-group-members endpoint
IsPerforceSuperUser check if a given ticket is for a super level user calls gitserver's /is-perforce-super-user endpoint
PerforceGetChangelist get details about a perforce changelist calls gitserver's /perforce-get-changelist endpoint