Metadata-Version: 2.4
Name: migtea
Version: 0.1.0
Summary: Batch-migrate repositories between GitHub and Gitea from a Textual TUI
Keywords: gitea,github,migration,tui,textual,gh,tea,repositories
Author: botmonster
Author-email: botmonster <btm@botmonster.com>
License-Expression: Apache-2.0
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Software Development :: Version Control :: Git
Classifier: Topic :: Utilities
Requires-Dist: textual>=5.0.0
Requires-Python: >=3.12
Project-URL: Homepage, https://botmonster.com/migtea/
Project-URL: Repository, https://github.com/botmonster/migtea
Project-URL: Issues, https://github.com/botmonster/migtea/issues
Description-Content-Type: text/markdown

# migtea

Batch-migrate repositories between GitHub and Gitea from a terminal UI. `migtea`
(migrate to Gitea) is a [Textual](https://textual.textualize.io/) TUI that drives
the official `gh` and `tea` CLIs: it preflights both tools, diffs your GitHub
account against a Gitea instance, lets you tick the repositories that are missing,
totals their sizes, and migrates each one (wiki, LFS, issues, and more) with
per-repo and overall progress.

Website: **[botmonster.com/migtea](https://botmonster.com/migtea/)**

Run it with no install:

```bash
uvx migtea
```

## Why

Gitea's web "New Migration" page moves exactly one repository per submission.
The engine behind it has no such limit, and neither does the `tea` CLI's
`tea repos migrate`. migtea orchestrates that CLI across every repository you
select, so moving a whole account is one pass instead of one form per repo.

## Requirements

migtea does not bundle or install these; it uses whatever is already on your
`PATH`, installed the official way:

- **[GitHub CLI (`gh`)](https://github.com/cli/cli#installation)**, logged in
  (`gh auth login`).
- **[Gitea CLI (`tea`)](https://gitea.com/gitea/tea#installation)**, with at
  least one login configured (`tea login add`).
- **[uv](https://docs.astral.sh/uv/)** to run `uvx migtea` (or `pip install migtea`).
- `git` is additionally required for the reverse (Gitea to GitHub) direction.

If a tool or login is missing, migtea's preflight screen prints the exact
official command to fix it and waits for you to re-check. It never pipes a script
into your shell and never installs anything itself.

## What it does

1. **Preflight** — confirms `gh` and `tea` are present and authenticated.
2. **Compare** — inventories both accounts and buckets every repository into
   *missing on the target* or *already there*.
3. **Select** — a checkbox list with a filter and fork/archived toggles; repos
   that already exist on the target are dimmed and unselectable.
4. **Confirm** — shows the count and total size you are about to move.
5. **Migrate** — runs the migration per repository with a per-repo bar and a
   size-weighted total bar, streaming results to a log pane.

## Directions

| Direction | How | Transfers | Does not transfer |
| --- | --- | --- | --- |
| **GitHub → Gitea** (default) | `tea repos migrate --service github` | Code, wiki, LFS, issues, labels, milestones, releases, pull requests | GitHub Actions history, Projects, Discussions, stars, webhooks, branch protection |
| **Gitea → GitHub** | `git clone --mirror` → `gh repo create` → `git push --mirror` | Code, all branches and tags, best-effort wiki | Issues and pull requests (GitHub has no import API) |

Pass `--direction gitea-to-github` to reverse, or press `d` in the UI to flip.

## Authentication

migtea never reads, prints, logs, or stores any token. GitHub auth is delegated
to `gh`; Gitea auth is delegated to `tea`. For private GitHub repositories,
migtea hands the output of `gh auth token` straight to `tea`'s `--auth-token`
flag in memory so Gitea can clone them; the value never touches disk or the log.

## Options

```
migtea [--direction {github-to-gitea,gitea-to-github}] [--dry-run] [--version]
```

`--dry-run` walks the entire flow but replaces the migration call with an
existence check, so you can rehearse safely before moving anything.

## License

Apache-2.0.
