Files
GitLite/docs/api-contract.md
T
Christoph 9c93d5a978 feat(integrations): add Git hosting providers and Clone UI
Add integrations for GitHub, GitLab (cloud & self-hosted), Azure DevOps,
and Gitea, storing personal access tokens in the operating system
keychain. Azure DevOps supports multiple independently configurable
organizations, and the Clone → Integrations tab loads, filters, sorts,
and clones repositories using stored credentials. Update the API
contract, help overlay, README, changelog, and application version
metadata to document and ship the feature.

- Add list_integration_repositories API command and related types
- New Clone → Integrations UI with search, refresh, and direct clone
- Store tokens in OS keychain and support multiple Azure DevOps orgs
2026-08-30 00:05:01 +02:00

6.5 KiB

API Contract

The frontend calls Tauri commands with @tauri-apps/api/core.invoke.

Shared payloads

type FileStatusKind = "modified" | "added" | "deleted" | "renamed" | "untracked" | "conflicted" | "unknown";

interface GitStatus {
  repo_path: string;
  current_branch: string | null;
  upstream: string | null;
  ahead: number;
  behind: number;
  files: GitFileStatus[];
  clean: boolean;
  rebase_in_progress: boolean;
  cherry_pick_in_progress: boolean;
  merge_in_progress: boolean;
}

interface GitFileStatus {
  path: string;
  old_path: string | null;
  staged: FileStatusKind | null;
  unstaged: FileStatusKind | null;
}

interface GitBranch {
  name: string;
  current: boolean;
  remote: boolean;
}

interface GitWorktree {
  path: string;
  head: string | null;
  short_head: string | null;
  branch: string | null;
  bare: boolean;
  detached: boolean;
  locked: boolean;
  lock_reason: string | null;
  prunable: boolean;
  prune_reason: string | null;
  missing: boolean;
  is_main: boolean;
  is_current: boolean;
  clean: boolean;
  changed_files: number;
}

interface GitCommit {
  hash: string;
  short_hash: string;
  summary: string;
  author_name: string;
  author_email: string;
  date: string;
  refs: string[];
  files: GitCommitFile[];
}

interface GitCommitFile {
  path: string;
  old_path: string | null;
  status: FileStatusKind;
}

interface GitRepositoryFile {
  path: string;
  tracked: boolean;
  status: FileStatusKind | null;
}

interface GitLfsStatus {
  available: boolean;
  bundled: boolean;
  version: string | null;
  filters_configured: boolean;
  hook_installed: boolean;
  repository_uses_lfs: boolean;
  patterns: GitLfsPattern[];
  files: GitLfsFile[];
}

interface GitLfsPattern {
  pattern: string;
  source: string;
  lockable: boolean;
  tracked: boolean;
}

interface GitLfsFile {
  name: string;
  size: number;
  checkout: boolean;
  downloaded: boolean;
  oid_type: string;
  oid: string;
  version: string;
}

type GitIntegrationProvider = "github" | "gitlab" | "gitlab-self-hosted" | "azure-devops" | "gitea";

interface IntegrationRepository {
  id: string;
  name: string;
  fullName: string;
  description: string;
  cloneUrl: string;
  sshUrl: string;
  webUrl: string;
  updatedAt: string;
  private: boolean;
}

Commands

The command list below includes the repository-management and synchronization API. The TypeScript wrappers in src/lib/git.ts are the authoritative full list.

  • open_repository(path: string): Promise<GitStatus>
  • init_repository(path: string, initialBranch?: string): Promise<GitStatus>
  • clone_repository(...): Promise<RepositoryBundle>
  • list_integration_repositories(provider: GitIntegrationProvider, baseUrl: string, accountId?: string): Promise<IntegrationRepository[]>; loads credentials from the operating system keychain and returns every repository accessible through the configured Git hosting account.
  • get_status(path: string): Promise<GitStatus>
  • git_lfs_status(path: string): Promise<GitLfsStatus>
  • git_lfs_install(path: string): Promise<GitLfsStatus>
  • git_lfs_track(path: string, pattern: string, lockable?: boolean): Promise<GitLfsStatus>
  • git_lfs_untrack(path: string, pattern: string): Promise<GitLfsStatus>
  • git_lfs_pull(path: string, remote?: string, username?: string, password?: string): Promise<GitLfsStatus>
  • git_lfs_prune(path: string): Promise<GitLfsStatus>
  • pull(...) automatically runs git lfs pull after a successful Git pull when the repository contains LFS attributes or tracked LFS objects.
  • list_branches(path: string): Promise<GitBranch[]>
  • list_remotes(path: string): Promise<GitRemote[]>
  • add_remote(path: string, name: string, url: string): Promise<GitRemote[]>
  • update_remote(path: string, name: string, url: string): Promise<GitRemote[]>
  • remove_remote(path: string, name: string): Promise<GitRemote[]>
  • set_branch_upstream(path: string, branch: string, upstream?: string): Promise<GitStatus>
  • delete_remote_branch(path: string, remote: string, branch: string): Promise<GitStatus>
  • checkout_branch(path: string, branch: string): Promise<GitStatus>
  • list_worktrees(path: string): Promise<GitWorktree[]>
  • add_worktree(path: string, worktreePath: string, ...): Promise<GitWorktree[]>
  • remove_worktree(path: string, worktreePath: string, force?: boolean): Promise<GitWorktree[]>
  • move_worktree(path: string, worktreePath: string, destination: string): Promise<GitWorktree[]>
  • lock_worktree(path: string, worktreePath: string, reason?: string): Promise<GitWorktree[]>
  • unlock_worktree(path: string, worktreePath: string): Promise<GitWorktree[]>
  • prune_worktrees(path: string): Promise<GitWorktree[]>
  • repair_worktree(path: string, worktreePath: string): Promise<GitWorktree[]>
  • stage_files(path: string, files: string[]): Promise<GitStatus>
  • unstage_files(path: string, files: string[]): Promise<GitStatus>
  • add_to_gitignore(path: string, target: string, kind: "file" | "extension" | "folder"): Promise<GitStatus>; appends a repository-root .gitignore rule and unstages newly-added matching files.
  • untrack_paths(path: string, targets: string[]): Promise<GitStatus>; removes files or folders from the Git index while preserving their working-tree contents.
  • restore_files(path: string, files: string[], staged: boolean): Promise<GitStatus>
  • stash_push(path: string, message?: string, includeUntracked?: boolean, paths?: string[]): Promise<GitStatus>; when paths is provided, only matching files are stashed.
  • commit(path: string, message: string): Promise<GitStatus>
  • fetch(path: string, prune?: boolean, remote?: string): Promise<GitStatus>
  • pull(path: string, strategy?: "merge" | "rebase" | "ff-only", remote?: string, branch?: string): Promise<GitStatus>
  • push(path: string, forceWithLease?: boolean, remote?: string): Promise<GitStatus>
  • list_commits(path: string, limit?: number, skip?: number): Promise<GitCommit[]>
  • restore_to_commit(path: string, commit: string): Promise<GitStatus>
  • restore_file_from_commit(path: string, commit: string, file: string): Promise<GitStatus> (the file argument can also be a folder path)
  • merge_branch(path: string, branch: string, strategy?: "default" | "squash" | "ff-only" | "no-ff"): Promise<GitStatus>
  • merge_continue(path: string): Promise<GitStatus>
  • merge_abort(path: string): Promise<GitStatus>
  • revert_commit(path: string, commit: string): Promise<GitStatus>
  • list_repository_files(path: string): Promise<GitRepositoryFile[]>
  • list_file_history(path: string, file: string, limit?: number): Promise<GitCommit[]> (the file argument can also be a folder path)