ExDaytona.Git (ex_daytona v0.2.0)

Copy Markdown View Source

Git operations inside a sandbox.

Every function takes the sandbox and the repository path inside it, and returns {:ok, value} / :ok or {:error, %ExDaytona.Error{}}:

:ok = ExDaytona.Git.clone(sandbox, "https://github.com/org/repo.git", "/tmp/repo")

{:ok, status} = ExDaytona.Git.status(sandbox, "/tmp/repo")
{:ok, %{branches: branches, current: "main"}} = ExDaytona.Git.branches(sandbox, "/tmp/repo")

:ok = ExDaytona.Git.create_branch(sandbox, "/tmp/repo", "feature/x")
:ok = ExDaytona.Git.checkout(sandbox, "/tmp/repo", "feature/x")
:ok = ExDaytona.Git.add(sandbox, "/tmp/repo", ["README.md"])

{:ok, %{hash: hash}} =
  ExDaytona.Git.commit(sandbox, "/tmp/repo", "docs: update readme",
    author: "Dev",
    email: "dev@example.com"
  )

Authenticated operations (clone/4, push/3, pull/3) accept :username/:password — pass a token as the password for HTTPS remotes.

Summary

Functions

Stage files (a list of paths relative to the repository). Returns :ok.

The repository's branches: {:ok, %{branches: [...], current: branch}}.

Check out branch. Returns :ok.

Clone url into path inside the sandbox.

Commit staged changes. Returns {:ok, %{hash: sha}}.

Create branch name. Returns :ok.

The repository's commit history as ExDaytona.Model.GitCommitInfo structs (newest first).

Pull from the remote. Returns :ok.

Push commits to the remote. Returns :ok.

The repository's status as an ExDaytona.Model.GitStatus (current branch, ahead/behind, per-file status).

Functions

add(sandbox, path, files)

@spec add(ExDaytona.Sandbox.t(), String.t(), [String.t()]) ::
  :ok | {:error, ExDaytona.Error.t()}

Stage files (a list of paths relative to the repository). Returns :ok.

branches(sandbox, path)

@spec branches(ExDaytona.Sandbox.t(), String.t()) ::
  {:ok, %{branches: [String.t()], current: String.t() | nil}}
  | {:error, ExDaytona.Error.t()}

The repository's branches: {:ok, %{branches: [...], current: branch}}.

checkout(sandbox, path, branch)

@spec checkout(ExDaytona.Sandbox.t(), String.t(), String.t()) ::
  :ok | {:error, ExDaytona.Error.t()}

Check out branch. Returns :ok.

clone(sandbox, url, path, opts \\ [])

@spec clone(ExDaytona.Sandbox.t(), String.t(), String.t(), keyword()) ::
  :ok | {:error, ExDaytona.Error.t()}

Clone url into path inside the sandbox.

Options: :branch, :commit_id, :depth, :username, :password.

commit(sandbox, path, message, opts)

@spec commit(ExDaytona.Sandbox.t(), String.t(), String.t(), keyword()) ::
  {:ok, %{hash: String.t() | nil}} | {:error, ExDaytona.Error.t()}

Commit staged changes. Returns {:ok, %{hash: sha}}.

Required options: :author, :email. Optional: :allow_empty.

create_branch(sandbox, path, name)

@spec create_branch(ExDaytona.Sandbox.t(), String.t(), String.t()) ::
  :ok | {:error, ExDaytona.Error.t()}

Create branch name. Returns :ok.

history(sandbox, path)

@spec history(ExDaytona.Sandbox.t(), String.t()) ::
  {:ok, [ExDaytona.Model.GitCommitInfo.t()]} | {:error, ExDaytona.Error.t()}

The repository's commit history as ExDaytona.Model.GitCommitInfo structs (newest first).

pull(sandbox, path, opts \\ [])

@spec pull(ExDaytona.Sandbox.t(), String.t(), keyword()) ::
  :ok | {:error, ExDaytona.Error.t()}

Pull from the remote. Returns :ok.

Options: :remote, :branch, :username, :password.

push(sandbox, path, opts \\ [])

@spec push(ExDaytona.Sandbox.t(), String.t(), keyword()) ::
  :ok | {:error, ExDaytona.Error.t()}

Push commits to the remote. Returns :ok.

Options: :remote, :branch, :set_upstream, :username, :password.

status(sandbox, path)

@spec status(ExDaytona.Sandbox.t(), String.t()) ::
  {:ok, ExDaytona.Model.GitStatus.t()} | {:error, ExDaytona.Error.t()}

The repository's status as an ExDaytona.Model.GitStatus (current branch, ahead/behind, per-file status).