mirror of
https://github.com/gabrie30/ghorg.git
synced 2026-01-21 16:21:43 +01:00
- Implement SyncDefaultBranch function with 4 safety checks - Add 8 git helper functions (GetRemoteURL, HasLocalChanges, etc.) - Add 640 lines of unit tests for git helpers (git_test.go) - Add 2074 lines of sync tests with 45+ scenarios (sync_test.go) - Integrate GHORG_SYNC_DEFAULT_BRANCH environment variable - Add 8 testing targets to Makefile - Update README.md with comprehensive sync feature documentation - Update sample-conf.yaml with detailed configuration comments - Add test coverage verification document Safety checks implemented: - Skips sync if uncommitted local changes - Skips sync if unpushed commits - Skips sync if commits not on default branch - Skips sync if default branch diverged from HEAD Test coverage: 51.6% overall, 76-100% on new functions
349 lines
14 KiB
YAML
349 lines
14 KiB
YAML
---
|
|
# +-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
# |G|E|N|E|R|A|L| |C|O|N|F|I|G|U|R|A|T|I|O|N|
|
|
# +-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
# Which provider to clone from (github, gitlab, gitea or bitbucket)
|
|
# default: github
|
|
# flag (--scm, -s) eg: --scm=gitlab
|
|
GHORG_SCM_TYPE: github
|
|
|
|
# How you'd like to clone the repos (https or ssh)
|
|
# default: https
|
|
# flag (--protocol) eg: --protocol=https
|
|
GHORG_CLONE_PROTOCOL: https
|
|
|
|
# This is where your ghorg directory will be created, use absolute pathing, shell expansions will not work.
|
|
# The ghorg directory is the home for all ghorg clones
|
|
# See https://github.com/gabrie30/ghorg#changing-clone-directories for example
|
|
# default: YOUR_HOME_DIR/ghorg
|
|
# flag (--path, -p) eg: --path=/tmp/ghorg
|
|
GHORG_ABSOLUTE_PATH_TO_CLONE_TO:
|
|
|
|
# Folder ghorg will clone all repos into. Cloning will result in: GHORG_ABSOLUTE_PATH_TO_CLONE_TO/GHORG_OUTPUT_DIR/repo
|
|
# See https://github.com/gabrie30/ghorg#changing-clone-directories for example
|
|
# default: org/user you are cloning, e.g. 'ghorg clone kubernetes' would create a kubernetes directory inside your ghorg directory
|
|
# flag (--output-dir) eg: --output-dir=testing
|
|
GHORG_OUTPUT_DIR:
|
|
|
|
# Type of entity to clone (user or org)
|
|
# flag (--clone-type, -c) eg: --clone-type=user
|
|
GHORG_CLONE_TYPE: org
|
|
|
|
# Change SCM api base url, this is for on self hosted scm instances only
|
|
# For http gitlab instances see GHORG_INSECURE_GITLAB_CLIENT
|
|
# default: github/gitlab/bitbucket public apis
|
|
# flag (--base-url) eg: --base-url=https://my.self.hosted.scm.instance.com
|
|
GHORG_SCM_BASE_URL:
|
|
|
|
# Include submodules in all clone and pull operations.
|
|
# flag (--include-submodules)
|
|
GHORG_INCLUDE_SUBMODULES: false
|
|
|
|
# Appends the scm cloud hostname to the GHORG_ABSOLUTE_PATH_TO_CLONE_TO
|
|
# This will organize your clones into specific folders by the scm provider.
|
|
# e.g. GHORG_ABSOLUTE_PATH_TO_CLONE_TO/github.com/kuberentes")
|
|
# flag (--preserve-scm-hostname)
|
|
GHORG_PRESERVE_SCM_HOSTNAME: false
|
|
|
|
# Allows you to pass arguments to git's filter flag e.g. git clone --filter=<args> this requires git version 2.19 or greater.
|
|
# Useful for filtering out binary objects from repos
|
|
# Few caveats, only works on inital clones, however if done on inital clone all subsequent clones will also honor the settings.
|
|
# More info at https://stackoverflow.com/questions/49917616/what-is-the-git-clone-filter-options-syntax
|
|
# flag (--git-filter) eg: --git-filter=blob:none
|
|
GHORG_GIT_FILTER:
|
|
|
|
# Deletes all files/directories found in your local clone directory that are not found on the remote (e.g., after remote deletion). With GHORG_SKIP_ARCHIVED set, archived repositories will also be pruned from your local clone.
|
|
# Will prompt before deleting any files unless used in combination with --prune-no-confirm
|
|
# flag (--prune)
|
|
GHORG_PRUNE: false
|
|
|
|
# Skip interactive y/n prompt when pruning clones (can only be used in combination with --prune).
|
|
# flag (--prune-no-confirm)
|
|
GHORG_PRUNE_NO_CONFIRM: false
|
|
|
|
# Prune repositories that are considered untouched. A repository is considered untouched if there are:
|
|
# 1. No new branches or zero branches
|
|
# 2. No new commits
|
|
# 3. No modified changes
|
|
# flag (--prune-untouched)
|
|
GHORG_PRUNE_UNTOUCHED: false
|
|
|
|
# Automatically delete repos without showing an interactive confirmation prompt.
|
|
# flag (--prune-untouched-no-confirm)
|
|
GHORG_PRUNE_UNTOUCHED_NO_CONFIRM: false
|
|
|
|
# Color output (enabled, disabled)
|
|
# flag( --color) eg: --color=enabled eg: --color=disabled
|
|
GHORG_COLOR: disabled
|
|
|
|
# Skip archived repos, currently github/gitlab/gitea only
|
|
# flag (--skip-archived)
|
|
GHORG_SKIP_ARCHIVED: false
|
|
|
|
# Skip repos that are forks, currently github/gitlab/gitea only
|
|
# flag (--skip-forks)
|
|
GHORG_SKIP_FORKS: false
|
|
|
|
# Backup mode, clone as mirror, no working copy (ignores branch parameter)
|
|
# flag (--backup)
|
|
GHORG_BACKUP: false
|
|
|
|
# Max goroutines created while cloning
|
|
# flag (--concurrency) eg: --concurrency=1
|
|
GHORG_CONCURRENCY: 25
|
|
|
|
# Delay in seconds between cloning repos. Useful for rate limiting
|
|
# flag (--clone-delay-seconds) eg: --clone-delay-seconds=5
|
|
# NOTE: When set to > 0, GHORG_CONCURRENCY is automatically set to 1
|
|
GHORG_CLONE_DELAY_SECONDS: 0
|
|
|
|
# Create a shallow clone with a history truncated to the specified number of commits
|
|
# https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---depthltdepthgt
|
|
# flag (--clone-depth) eg: --clone-depth=1
|
|
GHORG_CLONE_DEPTH:
|
|
|
|
# Path to file with list of repo names to clone, file should contain one repo name per line
|
|
# This allows you to only clone a specific list of repos
|
|
# flag (--target-repos-path)
|
|
GHORG_TARGET_REPOS_PATH:
|
|
|
|
# A comma separated list of topics to filter by, currently github/gitlab/gitea only
|
|
# flag (--topics) eg: --topics=frontend
|
|
# If any topics exist here, ghorg will only clone repos that match at least one of these topics
|
|
GHORG_TOPICS:
|
|
|
|
# Only clone repos with matching prefix, can be a comma separated list
|
|
# flag (--match-prefix) eg: --match-prefix=backend
|
|
GHORG_MATCH_PREFIX:
|
|
|
|
# Exclude cloning repos with matching prefix, can be a comma separated list
|
|
# flag (--exclude-match-prefix) eg: --exclude-match-prefix=backend
|
|
GHORG_EXCLUDE_MATCH_PREFIX:
|
|
|
|
# Only clone repos that match name to regex provided
|
|
# flag (--match-regex) eg: --match-regex=^foo
|
|
GHORG_MATCH_REGEX:
|
|
|
|
# Exclude cloning repos that match name to regex provided
|
|
# flag (--exclude-match-regex) eg: --exclude-match-regex=^foo
|
|
GHORG_EXCLUDE_MATCH_REGEX:
|
|
|
|
# Only clones new repos and does not perform a git clean on existing repos. Useful if you don't want to lose changes made to repos in the org/user directory.
|
|
# flag (--no-clean)
|
|
GHORG_NO_CLEAN: false
|
|
|
|
# Sync the default branch with upstream changes on existing repos.
|
|
# When enabled, ghorg will intelligently merge upstream changes into your local default branch,
|
|
# even when you're working on a different branch. This feature includes safety checks:
|
|
# - Skips sync if there are uncommitted local changes
|
|
# - Skips sync if there are unpushed commits
|
|
# - Skips sync if commits exist that are not on the default branch
|
|
# - Skips sync if the default branch has diverged from HEAD
|
|
# This is particularly useful for keeping multiple repos synchronized while working on feature branches.
|
|
# flag (--sync-default-branch)
|
|
GHORG_SYNC_DEFAULT_BRANCH: false
|
|
|
|
# Additionally clone the wiki page for repo
|
|
# flag (--clone-wiki)
|
|
GHORG_CLONE_WIKI: false
|
|
|
|
# Fetches all remote branches for each repo by running a git fetch --all
|
|
# flag (--fetch-all)
|
|
GHORG_FETCH_ALL: false
|
|
|
|
# If you want to set a path other than $HOME/.config/ghorg/ghorgignore for your ghorgignore
|
|
# flag (--ghorgignore-path)
|
|
GHORG_IGNORE_PATH:
|
|
|
|
# If you want to set a path other than $HOME/.config/ghorg/ghorgonly for your ghorgonly
|
|
# flag (--ghorgonly-path)
|
|
GHORG_ONLY_PATH:
|
|
|
|
# Only emit critical output.
|
|
# flag (--quiet)
|
|
GHORG_QUIET: false
|
|
|
|
# Perform a dry run of the clone; fetches repos but does not clone them.
|
|
# flag (--dry-run)
|
|
GHORG_DRY_RUN: false
|
|
|
|
# Branch ghorg resets and leaves checked out
|
|
# default: default branch
|
|
# NOTE: if no default branch is found on the repo, will fallback to using master
|
|
# flag (--branch, -b) eg: --branch=develop
|
|
GHORG_BRANCH:
|
|
|
|
# Allows you to control the exit code when ghorg runs into a problem (info level message) cloning a repo from the remote.
|
|
# Info messages will appear after a clone is complete, similar to success messages
|
|
# flag (--exit-code-on-clone-infos)
|
|
GHORG_EXIT_CODE_ON_CLONE_INFOS: 0
|
|
|
|
# Allows you to control the exit code when ghorg runs into a problem (issue level message) cloning a repo from the remote.
|
|
# Issue messages will appear after a clone is complete, similar to success messages.
|
|
# flag (--exit-code-on-clone-issues)
|
|
GHORG_EXIT_CODE_ON_CLONE_ISSUES: 1
|
|
|
|
# Allows you to run ghorg with no token (GHORG_<SCM>_TOKEN), SCM server needs to specify no auth required for api calls
|
|
# flag (--no-token)
|
|
GHORG_NO_TOKEN: false
|
|
|
|
# Skips the calculation of the output directory size at the end of a clone operation.
|
|
# This can save time, especially when cloning a large number of repositories.
|
|
# This is enabled by default
|
|
# flag (--no-dir-size)
|
|
GHORG_NO_DIR_SIZE: false
|
|
|
|
# Creates a CSV in the GHORG_ABSOLUTE_PATH_TO_CLONE_TO called _ghorg_stats.csv with info about each clone
|
|
# This allows you to track clone data over time such as number of commits and size in megabytes of the clone directory.
|
|
# If the header of the CSV changes, it will create a new file of _ghorg_stats_new_header_${sha256HashOfHeader}.csv this is how we will handle breaking changes to the CSV over time
|
|
# More information at https://github.com/gabrie30/ghorg?tab=readme-ov-file#tracking-clone-data-over-time
|
|
# flag (--stats-enabled)
|
|
GHORG_STATS_ENABLED: false
|
|
|
|
# Specifies the location of your ghorg conf.yaml, allowing you to have many configuration files, or none at all
|
|
# default: ghorg looks in $HOME/.config/ghorg/conf.yaml, if not set in that location nor as a commandline flag, ghorg will use all default values
|
|
# NOTE: this cannot be set in the configuration file. Its supported through CLI flag and ENV var only.
|
|
# flag (--config)
|
|
# GHORG_CONFIG:
|
|
|
|
# Get verbose debugging output
|
|
# NOTE: This setting cannot be configured through the configuration file or the CLI. It can only be set as an environment variable.
|
|
# For example: GHORG_DEBUG=true ghorg clone kubernetes
|
|
# When using this env concurrency is set to a value of 1, this behavior can be overwritten for debugging concurrency issues by setting GHORG_CONCURRENCY_DEBUG=true in addition to setting GHORG_DEBUG=true
|
|
# Note when this is enabled the api key used will be printed to stdout
|
|
# GHORG_DEBUG:
|
|
|
|
# +-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
# |G|I|T|H|U|B| |S|P|E|C|I|F|I|C|
|
|
# +-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
|
|
# Add your GitHub token
|
|
# flag (--token, -t) eg: --token=bGVhdmUgYSBjb21tZW50IG9uIGlzc3VlIDY2 or --token=~/path/to/file/containing/token
|
|
GHORG_GITHUB_TOKEN:
|
|
|
|
# Indicate that the Github token should be treated as an app token. Needed if you already obtained a github app token outside the context of ghorg.
|
|
# flag (--github-token-from-github-app)
|
|
GHORG_GITHUB_TOKEN_FROM_GITHUB_APP: false
|
|
|
|
# Path to your GitHub App PEM file, for authenticating with GitHub App
|
|
# e.g. /home/user/foo/ghorg-app.pem
|
|
# flag (--github-app-pem-path)
|
|
GHORG_GITHUB_APP_PEM_PATH:
|
|
|
|
# GitHub App Installation ID, for authenticating with GitHub App
|
|
# flag (--github-app-installation-id)
|
|
GHORG_GITHUB_APP_INSTALLATION_ID:
|
|
|
|
# GitHub App ID, for authenticating with GitHub App
|
|
# flag (--github-app-id)
|
|
GHORG_GITHUB_APP_ID:
|
|
|
|
# Only available when also using GHORG_CLONE_TYPE: user e.g. --clone-type=user
|
|
# Can be one of: all, owner, member (default: owner)
|
|
GHORG_GITHUB_USER_OPTION:
|
|
|
|
# Filter repos by a language
|
|
# Can be a comma separated value with no spaces
|
|
# falg (--github-filter-language) e.g.: --github-filter-language=go,ruby,elixir
|
|
GHORG_GITHUB_FILTER_LANGUAGE:
|
|
|
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
# |G|I|T|L|A|B| |S|P|E|C|I|F|I|C|
|
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
# Add your GitLab token
|
|
# flag (--token, -t) eg: --token=bGVhdmUgYSBjb21tZW50IG9uIGlzc3VlIDY2 or --token=~/path/to/file/containing/token
|
|
GHORG_GITLAB_TOKEN:
|
|
|
|
# clones repos in a directory structure that matches gitlab namespaces eg company/unit/subunit/app would clone into ghorg/org/unit/subunit/app
|
|
# flag (--preserve-dir)
|
|
GHORG_PRESERVE_DIRECTORY_STRUCTURE: false
|
|
|
|
# Skip TLS certificate verification for hosted gitlab instances
|
|
# flag (--insecure-gitlab-client)
|
|
GHORG_INSECURE_GITLAB_CLIENT: false
|
|
|
|
# Exclude gitlab groups by regex
|
|
# flag (--gitlab-group-exclude-match-regex)
|
|
GHORG_GITLAB_GROUP_EXCLUDE_MATCH_REGEX:
|
|
|
|
# Additionally clone all snippets
|
|
# flag (--clone-snippets)
|
|
GHORG_CLONE_SNIPPETS: false
|
|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
# |G|I|T|E|A| |S|P|E|C|I|F|I|C|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
|
|
# Add your Gitea token
|
|
# Settings -> Applications -> Generate Token
|
|
# flag (--token, -t) eg: --token=bGVhdmUgYSBjb21tZW50IG9uIGlzc3VlIDY2 or --token=~/path/to/file/containing/token
|
|
GHORG_GITEA_TOKEN:
|
|
|
|
# Must be present if your gitea instance uses http
|
|
# flag (--insecure-gitea-client)
|
|
GHORG_INSECURE_GITEA_CLIENT: false
|
|
|
|
# +-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
# |B|I|T|B|U|C|K|E|T| |S|P|E|C|I|F|I|C|
|
|
# +-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
|
|
# When using this OAuth/PAT token, do not set the bitbucket username flag. Do not set both this value and the GHORG_BITBUCKET_APP_PASSWORD
|
|
# https://confluence.atlassian.com/bitbucketserver/personal-access-tokens-939515499.html
|
|
# flag (--token, -t) eg: --token=bGVhdmUgYSBjb21tZW50IG9uIGlzc3VlIDY2
|
|
GHORG_BITBUCKET_OAUTH_TOKEN:
|
|
|
|
# Add your Bitbucket app password. Do not set both this value and the GHORG_BITBUCKET_OAUTH_TOKEN
|
|
# https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html
|
|
# flag (--token, -t) eg: --token=bGVhdmUgYSBjb21tZW50IG9uIGlzc3VlIDY2
|
|
GHORG_BITBUCKET_APP_PASSWORD:
|
|
|
|
# Used with GHORG_BITBUCKET_APP_PASSWORD. Should not be set when using GHORG_BITBUCKET_OAUTH_TOKEN
|
|
# flag (--bitbucket-username) eg: --bitbucket-username=user123
|
|
GHORG_BITBUCKET_USERNAME:
|
|
|
|
# +-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
# |S|O|U|R|C|E|H|U|T| |S|P|E|C|I|F|I|C|
|
|
# +-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|
|
|
|
# Add your Sourcehut personal access token token (https://meta.sr.ht/oauth2). This token requires the REPOSITORIES and OBJECT permissions.
|
|
# flag (--token, -t) eg: --token=bGVhdmUgYSBjb21tZW50IG9uIGlzc3VlIDY2 or --token=~/path/to/file/containing/token
|
|
GHORG_SOURCEHUT_TOKEN:
|
|
|
|
# Must be present if your sourcehut instance uses http
|
|
# flag (--insecure-sourcehut-client)
|
|
GHORG_INSECURE_SOURCEHUT_CLIENT: false
|
|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+
|
|
# |G|H|O|R|G| |R|E|C|L|O|N|E|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+
|
|
|
|
# Configuration for ghorg reclone command
|
|
# See https://github.com/gabrie30/ghorg#reclone-command for more information on how to setup and use
|
|
|
|
# If set allows you to specify the location of your reclone.yaml
|
|
# Defaults to $HOME/.config/ghorg/reclone.yaml
|
|
# flag (--reclone-path)
|
|
GHORG_RECLONE_PATH:
|
|
|
|
# Quiet logging output with reclone command
|
|
# flag (--quiet)
|
|
GHORG_RECLONE_QUIET: false
|
|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+-+-+
|
|
# |G|H|O|R|G| |R|E|C|L|O|N|E| |S|E|R|V|E|R|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+-+-+
|
|
|
|
# Port to run the relcone server on
|
|
# flag (--port) e.g. --port=3000
|
|
GHORG_RECLONE_SERVER_PORT: ":8080"
|
|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+
|
|
# |G|H|O|R|G| |R|E|C|L|O|N|E| |C|R|O|N|
|
|
# +-+-+-+-+-+ +-+-+-+-+-+-+-+ +-+-+-+-+
|
|
|
|
# Number of minutes to run the cron on
|
|
# flag (--minutes) e.g. --minutes=1440
|
|
GHORG_CRON_TIMER_MINUTES: "60"
|