Files
WorldTeacher/README.md
2025-11-04 15:28:26 +01:00

6.0 KiB

GitRepoSetup

A multi-language tool to initialize and configure git repositories with licenses, .gitignore files, and Gitea CI/CD workflows.

Features

  • Multi-language implementations: Python, Rust, and Go with identical functionality
  • License management: Embed MIT, GPLv3, AGPLv3, or Unlicense with automatic year and author substitution
  • Git repository setup: Initialize repos, set remotes, create branches (main + dev)
  • Gitea workflow scaffolding: Automatically set up CI/CD workflows for Docker, PyPI, Cargo, or Go deployments
  • Cross-platform config: Stores defaults in ~/.config/GMS/.config.yaml (Windows: %USERPROFILE%\.config\GMS\.config.yaml)
  • Force remote reset: Removes all existing remotes and sets new origin
  • Network-aware: Warns when remote push fails and configures locally

Installation

Python

cd python
uv sync
uv pip install -e .

Or build a standalone binary:

cd python
python embed_assets.py  # Embeds licenses and .gitignore
uv build
# Or use PyInstaller for single executable

Rust

cd rust
cargo build --release
# Binary at: target/release/gitreposetup

Go

cd go
go build -o gitreposetup .
# Or for cross-platform builds:
# CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gitreposetup-linux-amd64

Usage

Basic Setup

gitreposetup --owner YourOrg --name YourRepo

This will:

  1. Initialize a git repository (if not already one)
  2. Set default branch to main
  3. Remove all existing remotes and set origin to configured URL
  4. Add LICENSE (MIT by default) with current year and git user.name
  5. Add/overwrite .gitignore from embedded template
  6. Commit changes
  7. Create and switch to dev branch
  8. Push to remote (or warn if network unavailable)

Configuration File

Default config created at ~/.config/GMS/.config.yaml:

owner: ""
name: ""
license: MIT
develop_branch: dev
default_gitignore: true
default_git_url: "https://git.theprivateserver.de/{owner}/{repo}.git"

CLI arguments override config values.

Advanced Options

# Use different license
gitreposetup --owner MyOrg --name MyProject --license GPLv3

# Custom dev branch name
gitreposetup --owner MyOrg --name MyProject --develop-branch-name develop

# Force overwrite existing LICENSE
gitreposetup --owner MyOrg --name MyProject --force

# Set up Gitea workflows for Python package deployment
gitreposetup --owner MyOrg --name MyProject --deploy-type pypi

# Custom git URL template
gitreposetup --owner MyOrg --name MyProject --default-git-url "https://github.com/{owner}/{repo}.git"

Deploy Types

Docker (--deploy-type docker)

Creates workflows for:

  • test-python-docker-build.yml / test-rust-docker-build.yml / test-go-docker-build.yml
  • docker-release.yml

Requires: Root Dockerfile
Secrets: REGISTRY, DOCKER_USERNAME, TOKEN, GITEA_TOKEN

PyPI (--deploy-type pypi)

Creates workflows for:

  • test-python.yml (pytest, mypy, ruff)
  • python_package-release.yml

Secrets: TOKEN, GITEA_TOKEN

Cargo (--deploy-type cargo)

Creates workflows for:

  • test-rust.yml (cargo test, clippy, fmt)
  • cargo-release.yml

Secrets: TOKEN, GITEA_TOKEN

Go (--deploy-type go)

Creates workflows for:

  • test-go.yml (go test, vet, fmt)
  • go-release.yml

Secrets: TOKEN, GITEA_TOKEN

Gitea Workflows

All workflows are created under .gitea/workflows/ with:

  • Proper name: fields for workflow_run triggers
  • Reference to .gitea/changelog_config.json
  • Hardcoded Gitea baseURL (http://192.168.178.20:3000 or http://192.168.178.110:3000)
  • workflow_dispatch triggers for release workflows

Required Secrets

Set these in your Gitea user or organization settings:

  • GITEA_TOKEN: Gitea API token for changelog and releases
  • TOKEN: Generic token for publishing and releases
  • REGISTRY: Docker registry URL (for Docker deployments)
  • DOCKER_USERNAME: Docker registry username (for Docker deployments)
  • GITHUB_TOKEN: Auto-provided by Gitea Actions

License Templates

Embedded licenses with automatic substitutions:

  • MIT: {year} → current year, {fullname} → git user.name or --owner
  • GPLv3: Full GPL 3.0 text with HTML entity decoding
  • AGPLv3: Full AGPL 3.0 text with HTML entity decoding
  • Unlicense: Public domain dedication

Architecture

All three implementations (Python, Rust, Go) share:

  • Identical CLI interface via argparse/clap/cobra
  • Embedded license files and .gitignore (via include_str!/go:embed)
  • Same git flow: init → main → remote → commit → dev → push
  • Consistent config file format (YAML)
  • Cross-platform path handling

Python Implementation

  • Dependencies: PyYAML
  • Git: subprocess calls
  • Packaging: PyInstaller for standalone binaries

Rust Implementation

  • Dependencies: clap, serde_yaml, git2, html-escape, chrono
  • Git: libgit2 via git2 crate
  • Packaging: Native Cargo release builds

Go Implementation

  • Dependencies: cobra, yaml.v3, go-git (optional, uses CLI)
  • Git: subprocess calls to git CLI
  • Packaging: Native Go build with CGO_ENABLED=0 for static binaries

Development

Testing Python

cd python
uv sync
uv run pytest

Testing Rust

cd rust
cargo test
cargo clippy
cargo fmt --check

Testing Go

cd go
go test ./...
go vet ./...
gofmt -l .

Contributing

  1. Ensure all three implementations stay behaviorally identical
  2. Add workflow templates as needed for new deploy types
  3. Update README when adding features
  4. Test on Windows, Linux, and macOS

License

MIT License - See LICENSE file for details.

Warnings

  • Dockerfile: Docker workflows require a Dockerfile in the repo root
  • Network: Tool warns if remote push fails; configure locally and push manually later
  • Remotes: All existing git remotes are removed and origin is reset
  • Secrets: Must be configured in Gitea before workflows can run successfully
  • BaseURL: Hardcoded Gitea URLs may need adjustment for your environment