ghorg/sample-conf.yaml
Blair Hamilton 70f9fb45b8
Add sync feature with comprehensive testing and documentation
- 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
2025-12-08 11:14:28 -05:00

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"