Skip to main content

Script-driven code changes with automated merge requests

Project description

repoactive - Script-driven code changes with automated merge requests

Warning: This project is in an early stage of development. Use at your own risk.

repoactive runs your scripts against a git repository and keeps the corresponding merge requests up to date. You write the scripts that produce the code changes; repoactive handles the rest - branches, commits, and the full MR lifecycle.

How it works

You configure one or more jobs, each with a script (any shell command or executable) that modifies the repository's working tree. repoactive runs each script, captures the resulting diff, and then:

  • opens a new merge request if one does not already exist for that job, or
  • updates the existing merge request branch if the diff has changed.

Branches and MR descriptions are managed automatically - the only code you need to write is the script that produces the change.

[your script] → diff → repoactive → branch → git push → merge request
                                                              ↑
                                                      (create or update)
  1. repoactive creates a new commit on top of the base branch or on top of other repoactive managed branches.
  2. It runs the job's script against the working tree.
  3. If the script produced a diff, it pushes the branch and creates or updates the merge request.
  4. If the script produced no diff, the branch is reset to the base and pushed without opening or updating an MR.

Use cases

  • Keeping generated files (API clients, protobuf bindings, lock files) in sync with their sources
  • Applying organisation-wide refactors or policy changes across many repositories
  • Automating any periodic code transformation that should go through a review process

Configuration

repoactive is configured via .repoactive.toml in the repository root (or passed via --config).

[platform]
# "gitlab" or "github"
type = "gitlab"
# Base URL for self-hosted instances; omit for gitlab.com / github.com
url = "https://gitlab.example.com"
# Name of the env var holding the API token
token_env = "GITLAB_TOKEN"

[defaults]
# Prefix prepended to job.name to form the branch name
branch_prefix = "repoactive/"
# Prefix prepended to every MR/PR title (set to "" to disable)
mr_title_prefix = "[repoactive] "
# Prefix prepended to every commit title (set to "" to disable)
commit_title_prefix = "[repoactive] "
# Labels applied to every MR/PR unless overridden per job
labels = ["automated"]

[[job]]
# Unique identifier - branch name is always <branch_prefix><name>
name = "regenerate-api-client"
# Script run in the repo working directory; non-zero exit = failure
command = "python scripts/regen_api.py"
# MR/PR title
title = "api: regenerate API client"
# Optional: MR description
description = "Automated regeneration of the API client from the OpenAPI spec."
# Optional: override labels (merged with defaults.labels)
labels = ["automated", "api"]
# Optional: target branch (default: repo default branch)
base_branch = "main"
# Optional: open the MR/PR as a draft (default: false)
draft = false
# Optional: create an MR/PR for this job (default: true). Set to false to
# push the branch without opening an MR/PR.
create_mr = true
# Optional: append the job's command and its output to the commit message
# (default: true). Set to false to keep the commit message clean.
output_in_commit = true

[[job]]
name = "sync-licence-headers"
command = "./scripts/add_licence_headers.sh"
title = "sync license headers"

[[job]]
name = "integration-tests-update"
command = "./scripts/update_integration_tests.py"
title = "tests: update integration tests"
# Optional: run this job on top of the merged output of the listed jobs
depends_on = ["regenerate-api-client", "sync-licence-headers"]

The branch for each job is always defaults.branch_prefix + job.name. Secrets are kept out of the config file by referencing environment variable names rather than inline values.

When depends_on is set, repoactive starts the job's script from a working tree that has all listed dependency branches merged together, rather than from the plain base branch. The resulting MR branch will therefore include both the dependency jobs and the new job on top. Links to the parent MRs are automatically added to the MR description.

Usage

repoactive run [OPTIONS] [JOBS]...

Run all configured jobs (or a named subset - dependencies are auto-included):

# Run all jobs
repoactive run

# Run specific jobs
repoactive run regenerate-api-client sync-licence-headers

# Push branches without opening MRs
repoactive run --local

# Enable debug logging
repoactive run --debug
Option Short Description
--config PATH -c Config file (default: .repoactive.toml)
--repo PATH -r jj repository path (default: .)
--local Push branches only, skip MR creation
--debug -d Enable debug logging

Requirements

  • Python 3.11 or later
  • jj (Jujutsu) - repoactive uses jj to manage branches and commits in the target repository
  • A GitLab or GitHub API token exposed via the environment variable named in platform.token_env

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

repoactive-0.0.1.dev0.tar.gz (21.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

repoactive-0.0.1.dev0-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

File details

Details for the file repoactive-0.0.1.dev0.tar.gz.

File metadata

  • Download URL: repoactive-0.0.1.dev0.tar.gz
  • Upload date:
  • Size: 21.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for repoactive-0.0.1.dev0.tar.gz
Algorithm Hash digest
SHA256 e11385d43d3310e6da0a24200d045f49b9c34ebfb7817c270a6a67ac2d31b653
MD5 7fefc60ef9fce90efcfec1fab3b3a85c
BLAKE2b-256 d727312bcb7fc1240d5f12ec6451bac608be28db62d82cdf8d5aa53cca86f521

See more details on using hashes here.

File details

Details for the file repoactive-0.0.1.dev0-py3-none-any.whl.

File metadata

  • Download URL: repoactive-0.0.1.dev0-py3-none-any.whl
  • Upload date:
  • Size: 25.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for repoactive-0.0.1.dev0-py3-none-any.whl
Algorithm Hash digest
SHA256 55cd293d4e4147f8840889346364841e2e3979c125d544a9ad75fecc4917c569
MD5 63dd2082b616148643167803ad10a546
BLAKE2b-256 5b391c63f5211027280bfc3b11e0cf9076c0361c89e7b8aa676b7c50c6b66fb2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page