osamuaoki / imediff

2/3 file merge tool (Ncurses, CLI)
GNU General Public License v2.0
23 stars 1 forks source link

IMEDIFF - 2-way/3-way merge tool (CLI, Ncurses)

Released under the GNU General Public License, 2.0+. See LICENSE for details

The latest upstream source: https://github.com/osamuaoki/imediff

This package provides commands for use on unix-like systems.

The Debian package tracker: https://tracker.debian.org/pkg/imediff

Tutorial (deb)

Please install the imediff package from the APT repository if you are on Debian/Ubuntu.

For imediff, type at the console command line prompt:

For git ime:

See below "Tutorial (wheel)" for the non-system program installation.

What is imediff

The imediff command helps you to merge 2 slightly different files with an optional base file interactively or non-interactively.

For non-interactive 2-way diff operation, this can express diffs with ordinary diff-format

 $ imediff -n older.txt newer.txt -o diff.txt

For non-interactive 2-way diff operation, this can also express diffs with wdiff format

 $ imediff -n -f older.txt newer.txt -o wdiff.txt

For non-interactive 3-way merge operation, this can not only express conflicts with ordinary diff3-format but also 3-way wdiff format

 $ imediff -n yours.txt base.txt theirs.txt -o merged.txt
 $ imediff -n -f yours.txt base.txt theirs.txt -o wdiff-merged.txt

Here, this 3-way-merge logic is smarter than "diff3 -m".

For interactive operation, this uses the in-place alternating display of the changed content on a single-pane full screen terminal user interface. The source of line is clearly identified by the color of the line or the identifier character at the first column. The advantage of this user interface is the minimal movement of the line of sight for the user.

For interactive 2-way pick operation, this can select each section from one of the input files.

 $ imediff older.txt newer.txt -o picked.txt

For interactive 3-way merge operation, this can select sections from input files.

 $ imediff yours.txt base.txt theirs.txt -o merged.txt

The line matching logic of the imediff command has been improved to ignore whitespaces and use partial line matches to provide the best presentation with small chunk of lines.

The automatic 3 way merge logic of the imediff command operates not only on the difference by line but on the difference by character. This is another great feature of the imediff command. So for the non-overlapping changes, it always yields the clean merge.

You can also use the imediff command non-interactively from CLI with --macro option.

NOTE: There seems to be some limitation (16K?) of acceptable input lines for the imediff program running under full screen. This causes the imediff program to crash. The root cause seems to be the underlining ncurses binding which the imediff program uses. Now, the imediff automatically enables the --auto option to avoid this.

What is git-ime

The git ime command helps you to unsquash 2 consecutive commits from HEAD^ to HEAD in a git repository. The "git rebase -i <treeish>" and "gitk" can be used to organize unsquashed changes.

If any staged changes or local uncommitted changes are found in the git repository, git ime immediately exits without changes to be on the safe side.

If the latest commit involves multiple files, git ime splits this big commit into multiple smaller commits involving a single file for each commit. Unless -k option is used with git ime, the original commit message is discarded.

If the latest commit involves only a single file, the commit may be split into multiple smaller commits involving a set of minimal partial changes. If the target file is small, splitting process may be managed interactively by imediff. (You can force the non-interactive splitting by -a option.)

This git ime is not only useful at the checked out branch head but also at "edit" prompt during the interactive execution of "git rebase -i <treeish>". Execute git ime after committing the pending commit.

Tutorial (wheel)

You can install this program in the wheel package into a python virtual environment without contaminating your main system.

 $ mkdir -p path/to/
 $ cd path/to/
 $ python3 -m venv venv_imediff
 $ source venv_imediff/bin/activate
 $ pip install -U imediff
Collecting imediff
  Downloading imediff-2.9-py3-none-any.whl (62 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.9/62.9 kB 1.8 MB/s eta 0:00:00
Installing collected packages: imediff
Successfully installed imediff-2.9
(venv_imediff) $ imediff_install
I: successfully installed: /home/osamu/tmp/venv_imediff/bin/git-ime
I: manual page for imediff can be found at: /home/osamu/tmp/venv_imediff/lib/python3.11/site-packages/imediff/imediff.1
I: manual page for git-ime can be found at: /home/osamu/tmp/venv_imediff/lib/python3.11/site-packages/imediff/git-ime.1
I: script for git-mergetool(1) can be found at: /home/osamu/tmp/venv_imediff/lib/python3.11/site-packages/imediff/imediff
I: For more, see the upstream source site.
I:   * https://github.com/osamuaoki/imediff

Here, the imediff_install command installs the git-ime shell command to the pertinent python virtual environment etc.

Note to developer (myself)

build and test this program using the local wheel package

You must have a relatively new system with python 3.9 equivalent of Debian 12.0 (bookworm) released on June 10th, 2023 with:

 $ cd /path/to
 $ python3 -m venv venv_imediff
 $ source venv_imediff/bin/activate
 $ git clone https://github.com/osamuaoki/imediff.git
 $ cd imediff
  ... hack
 $ python3 -m build
 $ cd build
 $ pip install imediff-*.whl

This is a good way to build and test program without contaminating the whole system.

The building of rpm is not supported as out-of-box now (patch welcome).

Code is not written for Windows compatibility in mind, yet. Gettext support was intentionally dropped in favor of better compatibility across various systems.

The git-ime command requires you to have a POSIX shell and the git command access.

making Debian package

You can make your own Debian package as:

 $ git clone https://github.com/osamuaoki/imediff.git
 $ cd imediff
 $ git checkout main
  ... hack source
 $ git commit -a
 $ rm -rf debian
 $ git add -A .
 $ git commit
 $ git tag 2.5
 $ git reset --hard HEAD^
 $ git deborig # to make ../*.orig.tar.xz
 $ sbuild
 $ cd ..
 $ sudo dpkg -i imediff_2.5-1_all.deb

Here, we assume the upstream version to be 2.5, and the Debian revision to be 1.

If you have bug fixes or feature enhancement propose changes to me via "pull request"

updating source code

Please make sure to fit each code below 80-88 chars. (Run black on the python code and shfmt on the shell code) In case if reformat errors, check its syntax by:

 $ python3 -m py_compile program.py
 $ dash -n usr/bin/git-ime

updating manpages

Manpages need to be updated from XML files with make first in the doc/ directory when you edit it.

If you wish to update manpages from XML, docbook-xsl and xsltproc are needed for building manpages from xml sources then manually touch up details.

testing python source

Whenever you make changes, please test them.

To test the code in the module without installing it, invoke the test script as:

 $ cd /path/to/source-root
 $ export PYTHONPATH=$(pwd)/src/
 $ python3 test/test_unittest_all.py -v

To test the installed module, invoke the test script as:

 $ cd /path/to/source-root
 $ python3 test/test_unittest_all.py -v

History and features

This was originally written by Jarno Elonen in Python2. The latest original upstream version was 1.1.2 released on 2007-8-18.

The original author's website was https://elonen.iki.fi/code/imediff/ . Now it redirects to this site https://github.com/osamuaoki/imediff .

Osamu Aoki made a minor patched release for Debian buster in Oct 2018.

Osamu also wanted to add some features:

This was accomplished by practically a whole rewrite of the source code originally released as imediff2 by Jarno Elonen after consulting with him around November-December 2018. Now program name is imediff without 2, since it supports diff for not only 2 files but also 3 files. The version number is bumped to 2.0. In version 2.5, line matching rules of imediff are updated to produce better diff presentation. In version 2.10-2.11, git ime was rewitten to cope with commits involving rename and delete of files.

Note on Debian package links

This is written and updated by Osamu Aoki on February 2024.