Skip to main content

Git to Sapling CLI shim

Project description

gitsl

CI PyPI Python

Git to Sapling CLI shim - translates git commands to their Sapling (sl) equivalents.

Installation

pip install gitsl

Requires Python 3.8 or later. Requires Sapling to be installed and available as sl.

Quick Start

Use familiar git commands in any Sapling repository:

# Check status (outputs git-compatible format)
gitsl status --porcelain

# View recent commits
gitsl log --oneline -5

# Stage and commit changes
gitsl add -A
gitsl commit -m "Your message"

gitsl translates these to equivalent Sapling commands automatically.

Supported Commands

Command Status Translation
init Full sl init
status Full sl status with output transformation
log Full sl log with flag translation
diff Full sl diff
add Full sl add / sl addremove
commit Full sl commit
rev-parse Partial Only --short HEAD via sl whereami
show Full sl show
blame Full sl annotate
rm Full sl remove
mv Full sl rename
clone Full sl clone
grep Full sl grep
clean Full sl purge (requires -f or -n)
config Full sl config
switch Full sl goto / sl bookmark
branch Full sl bookmark
restore Full sl revert
stash Full sl shelve / sl unshelve
checkout Full sl goto / sl revert / sl bookmark

Commands not listed are unsupported.

Command Reference

git status

Flag Supported Behavior
(none) Yes Passthrough to sl status
--porcelain Yes Output transformed to git XY format
--short / -s Yes Output transformed to git XY format
other flags Partial Passed through to sl

Status code translation:

Sapling Git Meaning
M M Modified in working tree
A A Added (staged)
R D Removed (staged deletion)
? ?? Untracked
! D Missing (deleted from disk)

git log

Flag Supported Translation
(none) Yes sl log
--oneline Yes sl log -T "{node|short} {desc|firstline}\n"
-N (e.g., -5) Yes sl log -l N
-n N Yes sl log -l N
-nN Yes sl log -l N
--max-count=N Yes sl log -l N
--format No Not implemented
--graph No Not implemented

git add

Flag Supported Translation
<files> Yes sl add <files>
-A / --all Yes sl addremove
-u / --update Yes Marks deleted files with sl remove --mark
-p / --patch No Not implemented

git diff, git init, git commit

All flags passed through to sl equivalents unchanged.

git show, git clone, git grep

All flags passed through to sl equivalents unchanged.

git blame

Translates to sl annotate. All flags passed through.

git rm

Translates to sl remove. The -r flag is filtered (sl remove is recursive by default).

git mv

Translates to sl rename. All flags passed through.

git clean

Translates to sl purge. Requires -f or -n flag (safety validation).

Flag Supported Translation
-f Yes sl purge
-n / --dry-run Yes sl purge --print
-d Yes Included by default in sl purge
-fd Yes sl purge

git config

Translates to sl config.

Flag Supported Translation
<key> Yes sl config <key>
<key> <value> Yes sl config --local <key> <value>
--list Yes sl config
--global Yes sl config --user
--local Yes sl config --local

git switch

Flag Supported Translation
<branch> Yes sl goto <branch>
-c <name> Yes sl bookmark <name>

git branch

Translates to sl bookmark.

Flag Supported Translation
(none) Yes sl bookmark (list)
<name> Yes sl bookmark <name> (create)
-d <name> Yes sl bookmark -d <name>
-D <name> Yes sl bookmark -d <name> (safety: -D is translated to -d)

git restore

Translates to sl revert.

Flag Supported Translation
<file> Yes sl revert <file>
. Yes sl revert --all

git stash

Translates to sl shelve / sl unshelve.

Subcommand Supported Translation
(none) Yes sl shelve
push Yes sl shelve
-m <msg> Yes sl shelve -m <msg>
pop Yes sl unshelve
apply Yes sl unshelve --keep
list Yes sl shelve --list
drop Yes sl shelve --delete <name>

git checkout

Disambiguates between branches, files, and commits.

Usage Supported Translation
<branch> Yes sl goto <branch>
<commit> Yes sl goto <commit>
<file> Yes sl revert <file>
-- <file> Yes sl revert <file>
-b <name> Yes sl bookmark <name> + sl goto <name>
-B <name> Yes sl bookmark -f <name> + sl goto <name>

git rev-parse

Flag Supported Translation
--short HEAD Yes sl whereami (truncated to 7 chars)
other variants No Returns error

Unsupported Commands

Commands not listed above will print a message to stderr and exit with code 0:

gitsl: unsupported command: git checkout main

This exit behavior prevents gitsl from breaking tools that expect git commands to succeed.

For unsupported operations, use Sapling commands directly. See the Sapling Git Cheat Sheet for translations.

Why Some Commands Are Unsupported

Command Reason
merge Sapling prefers rebase workflow
rebase Complex flag translation, use sl rebase directly
push / pull / fetch Remote operations differ significantly
revert Maps to sl backout, not sl revert - semantic confusion

Debug Mode

Set GITSL_DEBUG=1 to see what command would be executed without running it:

$ GITSL_DEBUG=1 gitsl status --porcelain
[DEBUG] Command: status
[DEBUG] Args: ['--porcelain']
[DEBUG] Would execute: sl status

How It Works

gitsl intercepts git commands and translates them to Sapling equivalents:

  1. Parses the git command and flags
  2. Translates to corresponding sl command
  3. Transforms output to git-compatible format where needed (status, log)
  4. Returns sl's exit code

For commands without translation, gitsl prints a message to stderr and exits 0.

License

MIT

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

gitsl-1.2.0.tar.gz (302.1 kB view details)

Uploaded Source

Built Distribution

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

gitsl-1.2.0-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

Details for the file gitsl-1.2.0.tar.gz.

File metadata

  • Download URL: gitsl-1.2.0.tar.gz
  • Upload date:
  • Size: 302.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gitsl-1.2.0.tar.gz
Algorithm Hash digest
SHA256 db34100e9df3e56141bb7d5a892913e5255aee47b5e6867e47127dc2c668237b
MD5 eb621f34419b970c9d43ec1421dd6abe
BLAKE2b-256 0ea4fb4845e4b672642d8ed23ae82c6ebd0be2ab9381e5320f2ef695d9f06fc0

See more details on using hashes here.

Provenance

The following attestation bundles were made for gitsl-1.2.0.tar.gz:

Publisher: release.yml on VladimirMakaev/gitsl

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

File details

Details for the file gitsl-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: gitsl-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 11.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for gitsl-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 79acc8c1aee6a014af05a923c7e222e7389204529e1ca1f241c033725636cfef
MD5 a3624fd7b01e32f2f820ad4be4bb1630
BLAKE2b-256 bec6b0bd7fd94ca849e0a1ca441ccbe4cdb6fb82d7cff8420c1af5452c833dc4

See more details on using hashes here.

Provenance

The following attestation bundles were made for gitsl-1.2.0-py3-none-any.whl:

Publisher: release.yml on VladimirMakaev/gitsl

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