Skip to content
Generate difference sets between Ruby sequences.
Find file
Latest commit ff796c2 @halostatue Merge pull request #31 from apuratepp/udpate-url-in-gemspec
Update Homepage URL in gemspec file
Failed to load latest commit information.
autotest Adding autotestability.
bin Final push for Diff::LCS 1.1.3.
docs Final preparation for the 1.2 release.
lib Bumping version in preparation for next release.
.autotest Adding autotestability.
.gemtest A bit of cleanup for the next release.
.gitignore Enabling code coverage.
.hoerc Switching to hoe-gemspec2.
.rspec Adding autotestability.
.travis.yml Fix travis builds.
Contributing.rdoc Finalizing encoding-aware diff fixes.
Gemfile Final changes for release 1.25.
History.rdoc Bumping version in preparation for next release.
License.rdoc A bit of cleanup for the next release.
Manifest.txt Switching to hoe-gemspec2.
README.rdoc Point to the GitHub repo as home.
Rakefile Fixing travis execution.
diff-lcs.gemspec Update Homepage URL in gemspec file








Diff::LCS computes the difference between two Enumerable sequences using the McIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities to create a simple HTML diff output format and a standard diff-like tool.

This is release 1.2.4, fixing a bug introduced after diff-lcs 1.1.3 that did not properly prune common sequences at the beginning of a comparison set. Thanks to Paul Kunysch for fixing this issue.

Coincident with the release of diff-lcs 1.2.3, we reported an issue with Rubinius in 1.9 mode (rubinius/rubinius#2268). We are happy to report that this issue has been resolved.


Using this module is quite simple. By default, Diff::LCS does not extend objects with the Diff::LCS interface, but will be called as if it were a function:

require 'diff/lcs'

seq1 = %w(a b c e h j l m n p)
seq2 = %w(b c d e f j k l m r s t)

lcs = Diff::LCS.LCS(seq1, seq2)
diffs = Diff::LCS.diff(seq1, seq2)
sdiff = Diff::LCS.sdiff(seq1, seq2)
seq = Diff::LCS.traverse_sequences(seq1, seq2, callback_obj)
bal = Diff::LCS.traverse_balanced(seq1, seq2, callback_obj)
seq2 == Diff::LCS.patch!(seq1, diffs)
seq1 == Diff::LCS.unpatch!(seq2, diffs)
seq2 == Diff::LCS.patch!(seq1, sdiff)
seq1 == Diff::LCS.unpatch!(seq2, sdiff)

Objects can be extended with Diff::LCS:

lcs = seq1.lcs(seq2)
diffs = seq1.diff(seq2)
sdiff = seq1.sdiff(seq2)
seq = seq1.traverse_sequences(seq2, callback_obj)
bal = seq1.traverse_balanced(seq2, callback_obj)
seq2 == seq1.patch!(diffs)
seq1 == seq2.unpatch!(diffs)
seq2 == seq1.patch!(sdiff)
seq1 == seq2.unpatch!(sdiff)

By requiring 'diff/lcs/array' or 'diff/lcs/string', Array or String will be extended for use this way.

Note that Diff::LCS requires a sequenced enumerable container, which means that the order of enumeration is both predictable and consistent for the same set of data. While it is theoretically possible to generate a diff for an unordered hash, it will only be meaningful if the enumeration of the hashes is consistent. In general, this will mean that containers that behave like String or Array will perform best.


Diff::LCS is a port of Perl's Algorithm::Diff that uses the McIlroy-Hunt longest common subsequence (LCS) algorithm to compute intelligent differences between two sequenced enumerable containers. The implementation is based on Mario I. Wolczko's Smalltalk version 1.2 (1993) and Ned Konz's Perl version Algorithm::Diff 1.15.

This library is called Diff::LCS because of an early version of Algorithm::Diff which was restrictively licensed.

Continuous Integration Status

:include: Contributing.rdoc

:include: License.rdoc

Something went wrong with that request. Please try again.