ydiff (1.4.2)
Installation
pip install --index-url ydiffAbout this package
View colored, incremental diff in a workspace or from stdin, in side-by-side or unified moded, and auto paged
Ydiff
.. image:: https://github.com/ymattw/ydiff/actions/workflows/test.yml/badge.svg :alt: Tests status :target: https://github.com/ymattw/ydiff/actions
Ydiff is a terminal-based tool to view colored, incremental diffs in
a version-controlled workspace or from stdin, in side-by-side (similar to
diff -y) or unified mode, and auto-paged. It only requires Python >= 3.3
without external dependencies and less as a pager.
The diffs in side-by-side mode appear below. See also the screenshots_ of the
unified mode.
.. _screenshots: https://github.com/ymattw/ydiff/tree/26857b8/img
Theme "default" on a dark terminal background:
.. image:: https://raw.githubusercontent.com/ymattw/ydiff/26857b8/img/darkbg-side-by-side-default.png :alt: side by side, theme 'default' on a dark background :align: center :height: 300 px
Theme "default" on a light terminal background:
.. image:: https://raw.githubusercontent.com/ymattw/ydiff/26857b8/img/lightbg-side-by-side-default.png :alt: side by side, theme 'default' on a light background :align: center :height: 300 px
Theme "dark" on a dark terminal background:
.. image:: https://raw.githubusercontent.com/ymattw/ydiff/26857b8/img/darkbg-side-by-side-dark.png :alt: side by side, theme 'dark' on a dark background :align: center :height: 300 px
Theme "light" on a light terminal background:
.. image:: https://raw.githubusercontent.com/ymattw/ydiff/26857b8/img/lightbg-side-by-side-light.png :alt: side by side, theme 'light' on a light background :align: center :height: 300 px
Installation
Ydiff only depends on Python built-in libraries, so you can just download the
source and run without worrying about any installation. Git tagged_ revisions
will be packaged and uploaded to PyPI_ timely, however, packages hosted
elsewhere are not (please note they are not managed by the author @ymattw_).
.. _tagged: https://github.com/ymattw/ydiff/tags
.. _PyPI: http://pypi.python.org/pypi/ydiff
.. _@ymattw: https://github.com/ymattw
To run from source directly, just save ydiff.py_ as ydiff to whatever
directory which is in your $PATH, for example, $HOME/bin:
.. _ydiff.py: https://raw.github.com/ymattw/ydiff/master/ydiff.py
.. code-block:: bash
curl -L https://raw.github.com/ymattw/ydiff/master/ydiff.py > ~/bin/ydiff
chmod +x ~/bin/ydiff
To install from PyPI_:
.. code-block:: bash
pip install --upgrade ydiff
To install with Homebrew (Formula_) on macOS:
.. _Formula: https://github.com/Homebrew/homebrew-core/blob/master/Formula/y/ydiff.rb
.. code-block:: bash
brew install ydiff
To install on Fedora:
.. code-block:: bash
dnf install ydiff
To install on FreeBSD:
.. code-block:: bash
pkg install ydiff
Usage
Type ydiff -h to show usage::
$ ydiff -h
Usage: ydiff [options] [file|dir ...]
View colored, incremental diff in a workspace or from stdin, with side by side
and auto pager support
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-s, --side-by-side enable side-by-side mode (default True; DEPRECATED)
-u, --unified show diff in unified mode (disables side-by-side mode)
-w N, --width=N set text width for side-by-side mode, 0 (default) for
auto detection and fallback to 80 when not possible
-l, --log show log with changes from revision control
-c WHEN, --color=WHEN
colorize mode 'auto' (default), 'always', or 'never'
-t N, --tab-width=N convert tab chars to this many spaces (default: 8)
--wrap wrap long lines in side-by-side mode (default True;
DEPRECATED)
--nowrap, --no-wrap do not wrap long lines in side-by-side mode
-p PAGER, --pager=PAGER
pager application to feed output to, default is 'less'
-o OPT, --pager-options=OPT
options to supply to pager application
--theme=THEME option to pick a color theme (one of default, dark,
light)
Note:
Option parser will stop on first unknown option and pass them down to
underneath revision control. Environment variable YDIFF_OPTIONS may be
used to specify default options that will be placed at the beginning
of the argument list.
Read diff from local modification in a Git/Mercurial/Perforce/Svn workspace
(output from e.g. git diff, svn diff):
.. code-block:: bash
cd proj-workspace
ydiff # view colored side by side diff, auto set text
# width based on terminal size
ydiff -u # view colored incremental diff in unified mode
ydiff -w 90 # use text width 90, wrap long lines
ydiff --no-wrap # auto set text width but do not wrap long lines
ydiff file1 dir2 # view modification of given files/dirs only
ydiff -w90 -- -U10 # pass '-U10' to underneath revision diff tool
ydiff -w90 -U10 # '--' is optional as it's unknown to ydiff
ydiff --cached # show git staged diff (git diff --cached)
ydiff -r1234 # show svn diff to revision 1234
Read log with changes in a Git/Mercurial/Svn workspace (output from e.g.
git log -p, svn log --diff), note --diff option is new in svn 1.7.0:
.. code-block:: bash
cd proj-workspace
ydiff -l # read log along with changes, side by side
ydiff -lu # equivalent to ydiff -l -u, unified mode
ydiff -l -w90 --no-wrap # set text width 90 and disable wrapping
ydiff -l file1 dir2 # see log with changes of given files/dirs only
Utilize a specific pager application:
.. code-block:: bash
ydiff -p more # use "more" as a pager
ydiff -p cat # when neither less nor more is avilable
ydiff -o "-FRSX --shift 2" # custmized option (pager defaults to less)
Pipe in a diff:
.. code-block:: bash
git log -p -2 | ydiff # view git log with changes of last 2 commits
git show 15bfa | ydiff # view a given git commit, side by side
svn diff -r1234 | ydiff # view svn diff comparing to given revision
diff -u file1 file2 | ydiff # view diff between two files (note the '-u')
diff -ur dir1 dir2 | ydiff # view diff between two dirs
# View diff in a GitHub pull request, side by side
curl https://github.com/ymattw/ydiff/pull/11.diff | ydiff
# View a patch file in colored unified format.
ydiff -u < foo.patch
Redirect output to another patch file is safe even without -u:
.. code-block:: bash
svn diff -r PREV | ydiff > my.patch
Notes
-
Ydiff only supports diffs in
Unified Format_. Diffs in other format may be converted to Unified Format via toolfilterdiff(usually offered by packagepatchutils.).. _
Unified Format: https://en.wikipedia.org/wiki/Diff#Unified_format -
Environment variable
YDIFF_OPTIONSmay be used to specify default options that will be placed at the beginning of the argument list, for example:.. code-block:: bash
export YDIFF_OPTIONS='-w100' ydiff foo # equivalent to "ydiff -w100 foo"
-
If you feel more comfortable with a command such as
git dto trigger the ydiff command, you may symlink the executable to one namedgit-d, or configure an alias:.. code-block:: bash
Create a symlink git-d -> ydiff
D=$(dirname $(which ydiff)); ln -s ydiff $D/git-d
Or configure an alias
git config --global alias.d '!ydiff'
Known issues
- Wide characters may cause alignment problem in side-by-side mode.
- Terminal might be in a mess on exception (type
resetcan fix it).
.. vim:set ft=rst et sw=4 sts=4 tw=79:
Change log
Version 1.4.2 (2024-11-18)
- Compatibility Fix: Ensure ydiff works properly with Python 3.3 and later.
Version 1.4.1 (2024-11-13)
- Fix setup() dependency: MANIFEST.in is still required for Python < 3.8 to pack data files
Version 1.4 (2024-11-13) Revoked due to #123
- Fine-grained, word-level diff for change blocks
- New
--themeoption for selecting different themes - Options
--side-by-side,--width 0, and--wrapbecome default (use--unified/--nowrapfor legacy behavior) - Python 2, 3.1, 3.2 support is officially dropped
Version 1.3 (2024-04-02)
- Dropped context diff support
- Handle East Asian wide characters (thanks to @roy2220)
- Fix SIGPIPE issue on Windows (unofficial support, thanks to @kingsamchen)
- Bump Python requirement to >=2.6 (Python 2 support is no longer tested)
Version 1.2 (2020-08-08)
- Support perforce workspaces
- Support pager customization via --pager and --pager_options
- Support running on Windows (requires
lesswhich is offered by git-bash) - Fix a bug where reading stdin does not work outside a CVS workspace
- Fix tab expansion, expands to the next stop modulo tab width
- Performance improvement
Version 1.1 (2018-06-05)
- Rename from
cdifftoydiffto avoid binary name conflict on major distributions,CDIFF_OPTIONSstill works but will be deprepated soon - New option
--wrapto wrap long lines in side-by-side view
Version 1.0 (2016-12-31)
- Use environment variable
CDIFF_OPTIONSto hold default options
Version 0.9.8 (2016-01-16)
- More robust parser to tolerate evil unified diff
Version 0.9.7 (2015-04-24)
- Fix unexpected side-by-side output for diff of diff
- Better color to work with solarized color scheme
Version 0.9.6 (2014-06-20)
- Fix TypeError exception in auto width logic
Version 0.9.5 (2014-06-19)
- Option
--width 0now fits terminal size automatically - Enable smooth horizontal scrolling with less option
--shift 1
Version 0.9.4 (2014-06-04)
- Respect the
LESSenvironment variable - Support python 3.4
- Fix curl options in document
Version 0.9.3 (2013-09-28)
- Moved screenshots to 'gh-pages' branch
- Handle all keyboard interrupts more completely
- Explicitly set default encoding to utf-8
- Fixed broken output diff when I/O with filterdiff in nonblocking mode
Version 0.9.2 (2013-06-21)
- Enahanced option parser now pass unknown option to underneath revision
control, user can use
cdiff --cached,cdiff -U5directly
Version 0.9.1 (2013-05-20)
- Use
--no-ext-diffto disable GIT_EXTERNAL_DIFF and diff.external which might break cdiff output
Version 0.9 (2013-03-23)
- Supports reading context diff via
filterdiff(patchutils) - Fixed a diff parser bug which misread git commit message as common line
- Lots of code refactor
Version 0.8 (2013-03-13)
- Parser is now robust enough to handle dangling headers and short patch
- PEP8 (with minor own flavors) and other code lint
- Change 'Development Status' to stable
Version 0.7.1 (2013-02-25)
- Handle 'Binary files ... differ'
- Document update for known issues
Version 0.7 (2013-02-23)
- Support reading diff or log for given files/dirs in workspace
- Support diff generated from
diff -ru dir1 dir2 - Usage change: reading a patch and comparing two files need stdin redirect
Version 0.6 (2013-02-20)
- A few performance tuning and code clean up
- Add unit test cases with coverage 70%
- Show merge history in svn log
Version 0.5.1 (2013-02-19)
- Fixed incorrect yield on diff missing eof
- Fixed a bug in diff format probe
- Handle keyboard interrupt and large diffs in non-color mode
- Code clean up
Version 0.5 (2013-02-18)
- Support read output from
svn diff --logandhg log -p - Streamline reading large patch set
- New
--log (-l)option to read revision control diff log (thanks toSteven Myint_)
Version 0.4 (2013-02-16)
- New option -c WHEN (--color WHEN) to support auto test
- Auto regression test now on Travis
Version 0.3 (2013-02-07)
- Support compare two files (wrapper of diff)
Version 0.2 (2013-02-06)
- Move cdiff.py to top dir for better meta info management
Version 0.1 (2013-02-05)
- New --version option
- setup.py now read version from source code
Version 0.0.4 (2013-02-04)
- Add CHANGES for history track and better versioning
Version 0.0.3 (2013-02-04)
- Publish on PyPI, supports read patch from file, pipe and diff output from
revision tools (thanks to
Steven Myint_)
.. _Steven Myint: https://github.com/myint
.. vim:set ft=rst et sw=4 sts=4 tw=79: