Skip to main content

xsyncfar

Project description

xsyncfar

Tool for one-directional sync across pre-mapped directory paths with find-and-replace rules applied to file content.

The sync direction is determined automatically by the directory you run the tool from — no flags needed.


Features

  • Bidirectional mapping: run from either side of a mapping to sync in that direction
  • Case-insensitive literal find-and-replace applied to file content during sync
  • Only writes files whose content has actually changed (diff before write)
  • Recursively processes all subdirectories
  • Pre-flight summary with confirmation prompt before any changes are made
  • Automatically creates missing destination directories and files
  • Configurable file extension filter (with sensible defaults)
  • Git-style config discovery (walks up the directory tree)
  • Works on Windows and Linux/macOS
  • Python 3.6+, no dependencies beyond PyYAML

Installation

pip install xsyncfar

Or install from source:

git clone <repo-url>
cd xsyncfar
pip install -e .

Configuration

Create a .xsyncfar.yml file in your project root (or any parent directory). The tool will walk up the directory tree to find it.

syncmap:
  # Path prefix prepended to all lab/prod paths in mappings
  prefix: "/home/user/projects/"

  # Optional: override the default file extensions to sync
  # Defaults: .py .yml .yaml .json .txt .md
  # extensions:
  #   - .yml
  #   - .tf
  #   - .py

  # Optional: copy files with non-matching extensions as-is (binary copy, no replacements)
  # Useful for images, binaries, shell scripts, etc.
  # copy_other_files: true

  # Optional: glob patterns for files/directories to exclude from sync entirely.
  # Matched against both the item name and its path relative to the source root.
  # .git is always ignored by default.
  # ignore:
  #   - "*.pyc"
  #   - "__pycache__"
  #   - ".terraform"
  #   - "**/node_modules"

  # Literal find-and-replace rules applied to file content (case-insensitive)
  replacements:
    - lab: "mylab"       # string to find in source
      prod: "mycompany"  # string to replace with in destination
    - lab: "dev-cluster"
      prod: "prod-cluster"

  # Directory path pairs (relative to prefix)
  mappings:
    - lab: "my-lab-project/helm-charts/my-chart"
      prod: "my-prod-project/helm-charts/my-chart"
    - lab: "my-lab-project/configs"
      prod: "my-prod-project/configs"

How direction is determined

The tool compares your current working directory against all lab and prod paths in the config:

  • If your CWD is inside a lab path → syncs lab → prod (applying lab patterns, replacing with prod values)
  • If your CWD is inside a prod path → syncs prod → lab (reversing all replacements)

Usage

Navigate into any directory that matches a mapping (or a subdirectory of one), then run:

xsyncfar
# or
python -m xsyncfar

The tool will:

  1. Find the nearest .xsyncfar.yml walking up from your CWD
  2. Detect the sync direction from your CWD
  3. Show a pre-flight summary of what it will do
  4. Ask you to confirm before making any changes
  5. Sync all eligible files, applying find/replace rules
  6. Report all files that were written

Example session

============================================================
  xsyncfar — pre-flight summary
============================================================
  Direction : lab → prod
  Source    : /home/user/projects/my-lab-project/helm-charts/my-chart
  Dest      : /home/user/projects/my-prod-project/helm-charts/my-chart
  Files     : 8 eligible file(s) found

  Replacements to apply:
    'mylab'       →  'mycompany'
    'dev-cluster' →  'prod-cluster'
============================================================

Proceed with sync? [y/N]: y

Sync complete — 3 file(s) written:
  values.yaml
  templates/deployment.yaml
  templates/configmap.yaml

Supported file extensions (default)

.py, .yml, .yaml, .json, .txt, .md

Override by adding an extensions list to your .xsyncfar.yml.

To also copy files with other extensions unchanged (binary copy, no replacements — useful for images, scripts, binaries), set copy_other_files: true in your syncmap.

Ignoring files and directories

Add an ignore list to your syncmap to exclude files or directories using glob patterns:

syncmap:
  ignore:
    - "*.pyc"
    - "__pycache__"
    - ".terraform"
    - "**/node_modules"
    - "dist"

Patterns are matched against both the item name (e.g. *.pyc matches any .pyc file) and the relative path from the source root (e.g. build/** excludes everything under build/). The .git directory is always ignored by default.


Running tests

python -m unittest discover -s tests -v

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

xsyncfar-0.4.0.tar.gz (21.3 kB view details)

Uploaded Source

Built Distribution

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

xsyncfar-0.4.0-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file xsyncfar-0.4.0.tar.gz.

File metadata

  • Download URL: xsyncfar-0.4.0.tar.gz
  • Upload date:
  • Size: 21.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xsyncfar-0.4.0.tar.gz
Algorithm Hash digest
SHA256 1ecd915eb118a498e3d04e53890f07c6ebb5810211b7a2a555939aa41cb60433
MD5 d30be6dc7bbd69c63ff0d3c1c6fdc442
BLAKE2b-256 d1d724a54ceafe65b64acf20d3b669e6f228e8474c46bd76469fb331bd1ca4eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for xsyncfar-0.4.0.tar.gz:

Publisher: publish.yml on tkdpython/xsyncfar

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xsyncfar-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: xsyncfar-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xsyncfar-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c2f4dc2dad8d7169187f52f2f8086eba5fc9ddd6915ea5f5046980b5a6fce50d
MD5 dd5440a19e663b2386dfb1337372ef5c
BLAKE2b-256 6f65fa470ae9b0d92609e0383c7aa73e5b6658bf3cb87b0bed4875a341e6f64d

See more details on using hashes here.

Provenance

The following attestation bundles were made for xsyncfar-0.4.0-py3-none-any.whl:

Publisher: publish.yml on tkdpython/xsyncfar

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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