Pipe and diff files: execute shell pipelines against multiple inputs, diff/compare/join results.
Project description
dffs
Pipe and diff files: execute shell pipelines, diff/compare/join results.
Install
pip install dffs
CLIs
diff-x
Usage
diff-x
# Usage: diff-x [OPTIONS] [exec_cmd...] <path1> <path2>
#
# Diff two files after running them through a pipeline of other commands.
#
# Options:
# -c, --color / --no-color Colorize the output (default: auto, based on
# TTY)
# -P, --pipefail Check all pipeline commands for errors (like
# bash's `set -o pipefail`); default only checks
# last command
# -s, --shell-executable TEXT Shell to use for executing commands; defaults
# to $SHELL
# -S, --no-shell Don't pass `shell=True` to Python
# `subprocess`es
# -U, --unified INTEGER Number of lines of context to show (passes
# through to `diff`)
# -v, --verbose Log intermediate commands to stderr
# -w, --ignore-whitespace Ignore whitespace differences (pass `-w` to
# `diff`)
# -x, --exec-cmd TEXT Command(s) to execute before invoking `comm`;
# alternate syntax to passing commands as
# positional arguments
# --help Show this message and exit.
Examples
Given two similar JSON objects, where one is compact and the other is pretty-printed:
echo '{"a":1,"b":2}' > 1.json
echo '{"a":1,"b":3}' | jq > 2.json
diff {1,2}.json outputs the entirety of both objects:
1c1,4
< {"a":1,"b":2}
---
> {
> "a": 1,
> "b": 3
> }
diff-x 'jq .' {1,2}.json pretty-prints each side before diffing:
3c3
< "b": 2
---
> "b": 3
comm-x
comm essentially performs set intersection/difference; comm-x allows you to run a pipeline of commands on each input, before comparing them.
Usage
comm-x
# Usage: comm-x [OPTIONS] [exec_cmd...] <path1> <path2>
#
# Select or reject lines common to two input streams, after running each
# through a pipeline of other commands.
#
# Options:
# -1, --exclude-1 Exclude lines only found in the first pipeline
# -2, --exclude-2 Exclude lines only found in the second pipeline
# -3, --exclude-3 Exclude lines found in both pipelines
# -i, --case-insensitive Case insensitive comparison
# -s, --shell-executable TEXT Shell to use for executing commands; defaults
# to $SHELL
# -S, --no-shell Don't pass `shell=True` to Python
# `subprocess`es
# -v, --verbose Log intermediate commands to stderr
# -x, --exec-cmd TEXT Command(s) to execute before invoking `comm`;
# alternate syntax to passing commands as
# positional arguments
# --help Show this message and exit.
Examples
Given two similar lists of numbers, but in different orders:
seq 10 > 1.txt
seq 10 -2 0 > 2.txt
comm outputs gibberish, because the files aren't in sorted order:
comm 1.txt 2.txt
# 1
# 10
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# comm: file 2 is not in sorted order
# 6
# 4
# 2
# 0
# 9
# comm: file 1 is not in sorted order
# 10
# comm: input is not in sorted order
comm-x sort sorts each file first:
comm-x sort 1.txt 2.txt
# 0
# 1
# 10
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
git-diff-x
Usage
git-diff-x
# Usage: git-diff-x [OPTIONS] [exec_cmd...] [<path> | - [paths...]]
#
# Diff files at two commits, or one commit and the current worktree, after
# applying an optional command pipeline.
#
# Examples:
#
# # Compare the number of lines (`wc -l`) in file `foo` at the previous vs.
# current commit (`-r HEAD^..HEAD`):
#
# git diff-x -r HEAD^..HEAD wc -l foo
#
# # Colorized (`-c`) diff of `md5sum`s of `foo`, at HEAD (last committed
# value) vs. the current worktree content:
#
# git diff-x -c md5sum foo
#
# # Use `-` to separate pipeline commands from paths (when more than one path
# is to be diffed), e.g. this compares the largest 10 numbers in `file{1,2}`
# (HEAD vs. worktree):
#
# git diff-x 'sort -rn' head - file1 file2
#
# Options:
# -c, --color / --no-color Colorize the output (default: auto, based on
# TTY)
# -r, --refspec TEXT <commit 1>..<commit 2> (compare two commits) or
# <commit> (compare <commit> to the worktree)
# -R, --ref TEXT Diff a specific commit; alias for `-r
# <ref>^..<ref>`
# -t, --staged Compare HEAD vs. staged changes (index)
# -P, --pipefail Check all pipeline commands for errors (like
# bash's `set -o pipefail`); default only checks
# last command
# -s, --shell-executable TEXT Shell to use for executing commands; defaults
# to $SHELL
# -S, --no-shell Don't pass `shell=True` to Python
# `subprocess`es
# -U, --unified INTEGER Number of lines of context to show (passes
# through to `diff`)
# -v, --verbose Log intermediate commands to stderr
# -w, --ignore-whitespace Ignore whitespace differences (pass `-w` to
# `diff`)
# -x, --exec-cmd TEXT Command(s) to execute before invoking `comm`;
# alternate syntax to passing commands as
# positional arguments
# --help Show this message and exit.
Examples
Compare line-count (wc -l) of this README, before and after commit 8b7a761:
git-diff-x -R 8b7a761 'wc -l' README.md
# 1c1
# < 16
# ---
# > 206
Examples from --help above:
# Compare the number of lines (`wc -l`) in file `foo` at the previous vs. current commit
# (`-R HEAD` is equivalent to `-r HEAD^..HEAD`).
git diff-x -R HEAD wc -l foo
# Colorized (`-c`) diff of `md5sum`s of `foo`, at HEAD (last committed value) vs. the current
# worktree content.
git diff-x -c md5sum foo
# Use `-` to separate pipeline commands from paths (when more than one path is to be diffed),
# e.g. this compares the largest 10 numbers in `file{1,2}` (HEAD vs. worktree):
git diff-x 'sort -rn' head - file1 file2
Shell Integration
Add convenient aliases to your shell by adding this to your ~/.bashrc or ~/.zshrc:
eval "$(dffs-shell-integration bash)"
This provides aliases with the following suffix conventions:
c= color,n= no-color,w= ignore-whitespacer= ref (-R, compare commit to parent),s= refspec (-r),t= staged (--staged)
Examples
| Alias | Expands to |
|---|---|
dx |
diff-x |
dxc |
diff-x --color |
cx |
comm-x |
gdx |
git diff-x |
gdxc |
git diff-x --color |
gdxr |
git diff-x -R (compare commit to parent) |
gdxs |
git diff-x -r (explicit refspec) |
gdxt |
git diff-x --staged |
gdxrc |
git diff-x -R --color |
gdxtw |
git diff-x --staged -w |
To see all available aliases:
dffs-shell-integration bash
To load only aliases for a specific command:
eval "$(dffs-shell-integration bash git-diff-x)"
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dffs-0.1.3.tar.gz.
File metadata
- Download URL: dffs-0.1.3.tar.gz
- Upload date:
- Size: 23.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
208a3524cf69006b722a3a6e10441f4b6dfd38f49bb652762ea2c3adfa2eaf3e
|
|
| MD5 |
bb1d1ab879954b92b0543f3663a53356
|
|
| BLAKE2b-256 |
cef5ba39ac7907f80791c69da8ab36a9822a8f2267e15cfcf8db59163c5c9a26
|
Provenance
The following attestation bundles were made for dffs-0.1.3.tar.gz:
Publisher:
ci.yml on runsascoded/dffs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dffs-0.1.3.tar.gz -
Subject digest:
208a3524cf69006b722a3a6e10441f4b6dfd38f49bb652762ea2c3adfa2eaf3e - Sigstore transparency entry: 789764950
- Sigstore integration time:
-
Permalink:
runsascoded/dffs@31b51dd72218d72f2a1f5ceaaaed39e0dcb8785e -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/runsascoded
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@31b51dd72218d72f2a1f5ceaaaed39e0dcb8785e -
Trigger Event:
push
-
Statement type:
File details
Details for the file dffs-0.1.3-py3-none-any.whl.
File metadata
- Download URL: dffs-0.1.3-py3-none-any.whl
- Upload date:
- Size: 14.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f65b52bed7e5ff2d1c7a931a14f8d42bfcc0265fd95e95dc3f4c4ffd2a66fb2a
|
|
| MD5 |
6a752a5df98bfb77a788e582b0a1ef4c
|
|
| BLAKE2b-256 |
8fd033579a2bacb42f16975e5cd55f21f16e53cad9e7c9c788da70abb92d8a40
|
Provenance
The following attestation bundles were made for dffs-0.1.3-py3-none-any.whl:
Publisher:
ci.yml on runsascoded/dffs
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dffs-0.1.3-py3-none-any.whl -
Subject digest:
f65b52bed7e5ff2d1c7a931a14f8d42bfcc0265fd95e95dc3f4c4ffd2a66fb2a - Sigstore transparency entry: 789764951
- Sigstore integration time:
-
Permalink:
runsascoded/dffs@31b51dd72218d72f2a1f5ceaaaed39e0dcb8785e -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/runsascoded
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@31b51dd72218d72f2a1f5ceaaaed39e0dcb8785e -
Trigger Event:
push
-
Statement type: