# `Git.Commands.CherryPick`
[🔗](https://github.com/joshrotenberg/git_wrapper_ex/blob/main/lib/git/commands/cherry_pick.ex#L1)

Implements the `Git.Command` behaviour for `git cherry-pick`.

Supports cherry-picking one or more commits, as well as aborting,
continuing, and skipping in-progress cherry-pick operations.

## Unsupported options

The `--edit` (`-e`) flag is intentionally not supported because it
requires an interactive editor session, which cannot be driven by a
non-interactive CLI wrapper.

# `t`

```elixir
@type t() :: %Git.Commands.CherryPick{
  abort: boolean(),
  allow_empty: boolean(),
  allow_empty_message: boolean(),
  commits: [String.t()],
  continue_pick: boolean(),
  keep_redundant_commits: boolean(),
  mainline: non_neg_integer() | nil,
  no_commit: boolean(),
  signoff: boolean(),
  skip: boolean(),
  strategy: String.t() | nil,
  strategy_option: String.t() | nil
}
```

# `args`

```elixir
@spec args(t()) :: [String.t()]
```

Returns the argument list for `git cherry-pick`.

When `:abort`, `:continue_pick`, or `:skip` is `true`, builds the
corresponding control command. Otherwise builds the full cherry-pick command
with all applicable flags and commit refs.

## Examples

    iex> Git.Commands.CherryPick.args(%Git.Commands.CherryPick{abort: true})
    ["cherry-pick", "--abort"]

    iex> Git.Commands.CherryPick.args(%Git.Commands.CherryPick{continue_pick: true})
    ["cherry-pick", "--continue"]

    iex> Git.Commands.CherryPick.args(%Git.Commands.CherryPick{skip: true})
    ["cherry-pick", "--skip"]

    iex> Git.Commands.CherryPick.args(%Git.Commands.CherryPick{commits: ["abc123"]})
    ["cherry-pick", "abc123"]

    iex> Git.Commands.CherryPick.args(%Git.Commands.CherryPick{commits: ["abc123"], no_commit: true})
    ["cherry-pick", "--no-commit", "abc123"]

# `parse_output`

```elixir
@spec parse_output(String.t(), non_neg_integer()) ::
  {:ok, Git.CherryPickResult.t()}
  | {:ok, :done}
  | {:error, {String.t(), non_neg_integer()}}
```

Parses the output of `git cherry-pick`.

For mutation operations (abort, continue, skip) with exit code 0, returns
`{:ok, :done}`. For normal pick operations, parses into a
`Git.CherryPickResult` struct. On failure, returns
`{:error, {stdout, exit_code}}`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
