Metadata-Version: 2.1
Name: ydiff
Version: 1.2
Summary: View colored, incremental diff in a workspace or from stdin, with side by side and auto pager support
Home-page: https://github.com/ymattw/ydiff
Author: Matt Wang
Author-email: mattwyl@gmail.com
License: BSD-3
Keywords: colored incremental side-by-side diff
Classifier: Development Status :: 5 - Production/Stable
Classifier: Topic :: Utilities
Classifier: License :: OSI Approved :: BSD License
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: POSIX
Classifier: Operating System :: Unix
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
License-File: LICENSE

Ydiff
=====

.. image:: https://travis-ci.org/ymattw/ydiff.png?branch=master
   :target: https://travis-ci.org/ymattw/ydiff
   :alt: Build status

Term based tool to view *colored*, *incremental* diff in a version controlled
workspace (supports Git, Mercurial, Perforce and Svn so far) or from stdin,
with *side by side* (similar to ``diff -y``) and *auto pager* support. Requires
python (>= 2.5.0) and ``less``.

.. image:: https://raw.github.com/ymattw/ydiff/gh-pages/img/default.png
   :alt: default
   :align: center

.. image:: https://raw.github.com/ymattw/ydiff/gh-pages/img/side-by-side.png
   :alt: side by side
   :align: center
   :width: 900 px

Installation
------------

Install with pip
~~~~~~~~~~~~~~~~

Ydiff is already listed on `PyPI`_, you can install with ``pip`` if you have
the tool.

.. _PyPI: http://pypi.python.org/pypi/ydiff

.. code-block:: bash

    pip install --upgrade ydiff

Install with setup.py
~~~~~~~~~~~~~~~~~~~~~

You can also run the setup.py from the source if you don't have ``pip``.

.. code-block:: bash

    git clone https://github.com/ymattw/ydiff.git
    cd ydiff
    ./setup.py install

Install with Homebrew
~~~~~~~~~~~~~~~~~~~~~

You can also install with Homebrew on Mac. (Thanks to `@josa42`_,
`@bfontaine`_, `@hivehand`_ and `@nijikon`_ for contributing to the Homebrew
`Formula`_).

.. _`@josa42`: https://github.com/josa42
.. _`@bfontaine`: https://github.com/bfontaine
.. _`@hivehand`: https://github.com/hivehand
.. _`@nijikon`: https://github.com/nijikon
.. _`Formula`: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ydiff.rb

.. code-block:: bash

    brew install ydiff


Install on Fedora
~~~~~~~~~~~~~~~~~

On Fedora, you can install ydiff with dnf.

.. code-block:: bash

    dnf install ydiff

Install on FreeBSD
~~~~~~~~~~~~~~~~~~

On FreeBSD, you can install ydiff with pkg.

.. code-block:: bash

    pkg install ydiff

Download directly
~~~~~~~~~~~~~~~~~

Just save `ydiff.py`_ to whatever directory which is in your ``$PATH``, for
example, ``$HOME/bin`` is in my ``$PATH``, so I save the script there and name
as ``ydiff``.

.. _`ydiff.py`: https://raw.github.com/ymattw/ydiff/master/ydiff.py

.. code-block:: bash

    curl -ksSL https://raw.github.com/ymattw/ydiff/master/ydiff.py > ~/bin/ydiff
    chmod +x ~/bin/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
      -w N, --width=N      set text width for side-by-side mode, 0 for auto
                           detection, default is 80
      -l, --log            show log with changes from revision control
      -c M, --color=M      colorize mode 'auto' (default), 'always', or 'never'
      -t N, --tab-width=N  convert tab characters to this many spaces (default: 8)
      --wrap               wrap long lines in side-by-side view
      -p M, --pager=M      pager application, suggested values are 'less' or 'cat'
      -o M, --pager-options=M
                           options to supply to pager application

      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 incremental diff
    ydiff -s                      # view side by side, use default text width 80
    ydiff -s -w 90                # use text width 90 other than default 80
    ydiff -s -w 0                 # auto set text width based on terminal size
    ydiff -s -w 0 --wrap          # same as before, but also wrap long lines
    ydiff -s file1 dir2           # view modification of given files/dirs only
    ydiff -s -w90 --wrap -- -U10  # pass '-U10' to underneath revision diff tool
    ydiff -s -w90 --wrap -U10     # '--' is optional as it's unknown to ydiff
    ydiff -s --cached             # show git staged diff (git diff --cached)
    ydiff -s -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
    ydiff -ls                   # equivalent to ydiff -l -s, view side by side
    ydiff -ls -w90 --wrap       # set text width 90 and enable wrapping as well
    ydiff -ls file1 dir2        # see log with changes of given files/dirs only

Utilize a specific pager application:

.. code-block:: bash

    ydiff                           # default pager - less
    LESS_OPTS='-FRSX --shift 1'
    ydiff -p less -o "${LESS_OPTS}" # emulate default pager
    ydiff -p /usr/bin/less          # custom pager
    ydiff -p cat                    # non-paging ANSI processor for colorizing

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 -s   # view a given git commit, side by side
    svn diff -r1234 | ydiff -s  # 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 -s

    # View a patch file in unified or context format, the latter depends on
    # command `filterdiff` from package `patchutils` which is available in
    # major Linux distros and MacPorts.
    #
    ydiff -s < foo.patch

Redirect output to another patch file is safe:

.. code-block:: bash

    svn diff -r PREV | ydiff -s > my.patch

Environment variable
--------------------

Environment variable ``YDIFF_OPTIONS`` may 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='-s -w0 --wrap'
    ydiff foo                   # equivalent to "ydiff -s -w0 --wrap foo"

Note the default pager ``less`` takes options from the environment variable
``LESS``.

Notes
-----

If you feel more comfortable with a command such as ``git ydiff`` to trigger
the ydiff command, you may symlink the executable to one named ``git-ydiff``
as follows:

.. code-block:: bash

    ydiff_dir=$(dirname $(which ydiff))
    ln -s "${ydiff_dir}/ydiff" "${ydiff_dir}/git-ydiff"

Known issues
------------

Ydiff has following known issues:

- Does not recognize `normal` diff, and depends on ``filterdiff`` (patchutils)
  to read `context` diff
- Side by side mode has alignment problem for wide chars
- Terminal might be in a mess on exception (type ``reset`` can fix it)

Pull requests are very welcome, please make sure your changes can pass unit
tests and regression tests by run ``make test`` (required tool *coverage* can
be installed with ``pip install coverage``).  Also watch out `travis build`_
after push, make sure it passes as well.

.. _`travis build`: https://travis-ci.org/ymattw/ydiff/pull_requests

See also
--------

I have another tool `coderev`_ which generates side-by-side diff pages for code
review from two given files or directories, I found it's not easy to extend to
support git so invented `ydiff`.  Idea of ansi color markup is also from
project `colordiff`_.

.. _coderev: https://github.com/ymattw/coderev
.. _colordiff: https://github.com/daveewart/colordiff

.. vim:set ft=rst et sw=4 sts=4 tw=79:

Change log
==========

Version 1.2 (2020-08-08)

  - Support perforce workspaces
  - Support pager customization via --pager and --pager_options
  - Support running on Windows (requires ``less`` which 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 ``cdiff`` to ``ydiff`` to avoid binary name conflict on major
    distributions, ``CDIFF_OPTIONS`` still works but will be deprepated soon
  - New option ``--wrap`` to wrap long lines in side-by-side view

Version 1.0 (2016-12-31)

  - Use environment variable ``CDIFF_OPTIONS`` to 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 0`` now fits terminal size automatically
  - Enable smooth horizontal scrolling with less option ``--shift 1``

Version 0.9.4 (2014-06-04)

  - Respect the ``LESS`` environment 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 -U5`` directly

Version 0.9.1 (2013-05-20)

  - Use ``--no-ext-diff`` to 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 --log`` and ``hg log -p``
  - Streamline reading large patch set
  - New ``--log (-l)`` option to read revision control diff log (thanks to
    `Steven 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:
