Hello community,

here is the log from the commit of package rubygem-diff-lcs for 
openSUSE:Factory checked in at 2020-07-16 12:10:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-diff-lcs (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-diff-lcs.new.3592 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-diff-lcs"

Thu Jul 16 12:10:45 2020 rev:8 rq:820739 version:1.4.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-diff-lcs/rubygem-diff-lcs.changes        
2020-06-29 21:15:56.117332854 +0200
+++ 
/work/SRC/openSUSE:Factory/.rubygem-diff-lcs.new.3592/rubygem-diff-lcs.changes  
    2020-07-16 12:11:36.922549941 +0200
@@ -1,0 +2,56 @@
+Mon Jul 13 17:24:56 UTC 2020 - Manuel Schnitzer <mschnit...@suse.com>
+
+- updated to version 1.4.4
+
+  ## 1.4.4 / 2020-07-01
+
+  - Fixed an issue reported by Jun Aruga in the Diff::LCS::Ldiff binary text
+    detection. [#44][]
+  - Fixed a theoretical issue reported by Jun Aruga in Diff::LCS::Hunk to raise
+    a more useful exception. [#43][]
+  - Added documentation that should address custom object issues as reported in
+    [#35][].
+
+  - Fixed more diff errors, in part reported in [#65][].
+
+    - The use of `Numeric#abs` is incorrect in `Diff::LCS::Block#diff_size`.
+      The diff size _must_ be accurate for correct change placement.
+    - When selecting @max_diff_size in Diff::LCS::Hunk, choose it based on
+      `block.diff_size.abs`.
+    - Made a number of changes that will, unfortunately, increase allocations
+      at the cost of being safe with frozen strings.
+    - Add some knowledge that when `Diff::LCS::Hunk#diff` is called, that we
+      are processing the _last_ hunk, so some changes will be made to how the
+      output is generated.
+
+      - `old`, `ed`, and `reverse_ed` formats have no differences.
+      - `unified` format will report `\ No newline at end of file` given the
+        correct conditions, at most once. Unified range reporting also
+        differs for the last hunk such that the `length` of the range is
+        reduced by one.
+      - `context` format will report `\No newline at end of file` given the
+        correct conditions, up to once per "file". Context range reporting also
+        differs for the last hunk such that the `end` part of the range is
+        reduced by one to a minimum of one.
+
+  - Added a bunch more tests for the cases above, and fixed `hunk_spec.rb` so
+    that the phrase being compared isn't nonsense French.
+
+  - Updated formatting.
+  - Added a Rake task to assist with manual testing on Ruby 1.8.
+
+  ## 1.4.3 / 2020-06-29
+
+  - Fixed several issues with the 1.4 on Rubies older than 2.0. Some of this 
was
+    providing useful shim functions to Hoe 3.x (which dropped these older
+    Rubies a while ago). Specifically:
+
+    - Removed Array#lazy from a method in Diff::LCS::Hunk.
+    - Changed some unit tests to use old-style Symbol-keyed hashes.
+    - Changed some unit test helper functions to no longer use keyword
+      parameters, but only a trailing options hash.
+    - Made the use of `psych` dependent on `RUBY_VERSION >= 1.9`.
+
+    Resolves [#63][].
+
+-------------------------------------------------------------------

Old:
----
  diff-lcs-1.4.2.gem

New:
----
  diff-lcs-1.4.4.gem

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rubygem-diff-lcs.spec ++++++
--- /var/tmp/diff_new_pack.7iqAl6/_old  2020-07-16 12:11:39.210552254 +0200
+++ /var/tmp/diff_new_pack.7iqAl6/_new  2020-07-16 12:11:39.214552259 +0200
@@ -24,7 +24,7 @@
 #
 
 Name:           rubygem-diff-lcs
-Version:        1.4.2
+Version:        1.4.4
 Release:        0
 %define mod_name diff-lcs
 %define mod_full_name %{mod_name}-%{version}
@@ -49,14 +49,14 @@
 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.4, providing a simple extension that allows for
-Diff::LCS::Change objects to be treated implicitly as arrays. Ruby versions
-below 2.5 are soft-deprecated.
-This means that older versions are no longer part of the CI test suite. If any
-changes have been introduced that break those versions, bug reports and
-patches
-will be accepted, but it will be up to the reporter to verify any fixes prior
-to release. A future release will completely break compatibility.
+This is release 1.4.3, providing a simple extension that allows for
+Diff::LCS::Change objects to be treated implicitly as arrays and fixes a
+number of formatting issues.
+Ruby versions below 2.5 are soft-deprecated, which means that older versions
+are no longer part of the CI test suite. If any changes have been introduced
+that break those versions, bug reports and patches will be accepted, but it
+will be up to the reporter to verify any fixes prior to release. The next
+major release will completely break compatibility.
 
 %prep
 %gem_unpack

++++++ diff-lcs-1.4.2.gem -> diff-lcs-1.4.4.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Contributing.md new/Contributing.md
--- old/Contributing.md 2020-06-24 05:19:27.000000000 +0200
+++ new/Contributing.md 2020-07-01 20:29:57.000000000 +0200
@@ -1,32 +1,35 @@
 ## Contributing
 
-I value any contribution to Diff::LCS you can provide: a bug report, a feature
-request, or code contributions. Code contributions to Diff::LCS are especially
-<del>welcome</del>encouraged. Because Diff::LCS is a complex codebase, there
-are a few guidelines:
-
-*   Code changes *will not* be accepted without tests. The test suite is
-    written with [RSpec][].
-*   Match my coding style.
-*   Use a thoughtfully-named topic branch that contains your change. Rebase
-    your commits into logical chunks as necessary.
-*   Use [quality commit messages][].
-*   Do not change the version number; when your patch is accepted and a release
-    is made, the version will be updated at that point.
-*   Submit a GitHub pull request with your changes.
-*   New or changed behaviours require appropriate documentation.
+I value any contribution to Diff::LCS you can provide: a bug report, a
+feature request, or code contributions. Code contributions to Diff::LCS are
+especially <del>welcome</del>encouraged. Because Diff::LCS is a complex
+codebase, there are a few guidelines:
+
+- Code changes _will not_ be accepted without tests. The test suite is
+  written with [RSpec][].
+- Match my coding style.
+- Use a thoughtfully-named topic branch that contains your change. Rebase
+  your commits into logical chunks as necessary.
+- Use [quality commit messages][].
+- Do not change the version number; when your patch is accepted and a release
+  is made, the version will be updated at that point.
+- Submit a GitHub pull request with your changes.
+- New or changed behaviours require appropriate documentation.
 
 ### Test Dependencies
 
-Diff::LCS uses Ryan Davis’s [Hoe][] to manage the release process, and it adds
-a number of rake tasks. You will mostly be interested in:
+Diff::LCS uses Ryan Davis’s [Hoe][] to manage the release process, and it
+adds a number of rake tasks. You will mostly be interested in:
 
-    $ rake
+```sh
+$ rake
+```
 
 which runs the tests the same way that:
 
-    $ rake spec
-    $ rake travis
+```sh
+$ rake spec
+```
 
 will do.
 
@@ -34,51 +37,82 @@
 provided a Gemfile pointing to the (generated) `diff-lcs.gemspec` file. This
 will permit you to do:
 
-    $ bundle install
+```sh
+$ bundle install
+```
 
 to get the development dependencies. If you aleady have `hoe` installed, you
 can accomplish the same thing with:
 
-    $ rake newb
+```sh
+$ rake newb
+```
 
 This task will install any missing dependencies, run the tests/specs, and
 generate the RDoc.
 
 You can run tests with code coverage analysis by running:
 
-    $ rake spec:coverage
+```sh
+$ rake spec:coverage
+```
 
 ### Workflow
 
 Here's the most direct way to get your work merged into the project:
 
-*   Fork the project.
-*   Clone down your fork (`git clone 
git://github.com/<username>/diff-lcs.git`).
-*   Create a topic branch to contain your change (`git checkout -b
-    my_awesome_feature`).
-*   Hack away, add tests. Not necessarily in that order.
-*   Make sure everything still passes by running `rake`.
-*   If necessary, rebase your commits into logical chunks, without errors.
-*   Push the branch up (`git push origin my_awesome_feature`).
-*   Create a pull request against halostatue/diff-lcs and describe what your
-    change does and the why you think it should be merged.
+- Fork the project.
+- Clone down your fork (`git clone git://github.com/<username>/diff-lcs.git`).
+- Create a topic branch to contain your change (`git checkout -b 
my_awesome_feature`).
+- Hack away, add tests. Not necessarily in that order.
+- Make sure everything still passes by running `rake`.
+- If necessary, rebase your commits into logical chunks, without errors.
+- Push the branch up (`git push origin my_awesome_feature`).
+- Create a pull request against halostatue/diff-lcs and describe what your
+  change does and the why you think it should be merged.
 
 ### Contributors
 
-*   Austin Ziegler created Diff::LCS.
+- Austin Ziegler created Diff::LCS.
 
-Thanks to everyone else who has contributed to Diff::LCS:
+Thanks to everyone else who has contributed code or bug reports to Diff::LCS:
 
-*   Kenichi Kamiya
-*   Michael Granger
-*   Vít Ondruch
-*   Jon Rowe
-*   Koichi Ito
-*   Josef Strzibny
-*   Josh Bronson
-*   Mark Friedgan
-*   Akinori MUSHA
+- @ginriki
+- @joshbronson
+- @kevinmook
+- @mckaz
+- Akinori Musha
+- Artem Ignatyev
+- Brandon Fish
+- Camille Drapier
+- Cédric Boutillier
+- Gregg Kellogg
+- Jagdeep Singh
+- Jason Gladish
+- Jon Rowe
+- Josef Strzibny
+- Josep (@apuratepp)
+- Josh Bronson
+- Jun Aruga
+- Kenichi Kamiya
+- Kensuke Nagae
+- Kevin Ansfield
+- Koichi Ito
+- Mark Friedgan
+- Michael Granger
+- Myron Marston
+- Nicolas Leger
+- Oleg Orlov
+- Paul Kunysch
+- Pete Higgins
+- Peter Wagenet
+- Philippe Lafoucrière
+- Ryan Lovelett
+- Scott Steele
+- Simon Courtois
+- Tomas Jura
+- Vít Ondruch
 
-[Rspec]: http://rspec.info/documentation/
+[rspec]: http://rspec.info/documentation/
 [quality commit messages]: 
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
-[Hoe]: https://github.com/seattlerb/hoe
+[hoe]: https://github.com/seattlerb/hoe
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/History.md new/History.md
--- old/History.md      2020-06-24 05:19:27.000000000 +0200
+++ new/History.md      2020-07-01 20:29:57.000000000 +0200
@@ -1,5 +1,56 @@
 # History
 
+## 1.4.4 / 2020-07-01
+
+- Fixed an issue reported by Jun Aruga in the Diff::LCS::Ldiff binary text
+  detection. [#44][]
+- Fixed a theoretical issue reported by Jun Aruga in Diff::LCS::Hunk to raise
+  a more useful exception. [#43][]
+- Added documentation that should address custom object issues as reported in
+  [#35][].
+
+- Fixed more diff errors, in part reported in [#65][].
+
+  - The use of `Numeric#abs` is incorrect in `Diff::LCS::Block#diff_size`.
+    The diff size _must_ be accurate for correct change placement.
+  - When selecting @max_diff_size in Diff::LCS::Hunk, choose it based on
+    `block.diff_size.abs`.
+  - Made a number of changes that will, unfortunately, increase allocations
+    at the cost of being safe with frozen strings.
+  - Add some knowledge that when `Diff::LCS::Hunk#diff` is called, that we
+    are processing the _last_ hunk, so some changes will be made to how the
+    output is generated.
+
+    - `old`, `ed`, and `reverse_ed` formats have no differences.
+    - `unified` format will report `\ No newline at end of file` given the
+      correct conditions, at most once. Unified range reporting also
+      differs for the last hunk such that the `length` of the range is
+      reduced by one.
+    - `context` format will report `\No newline at end of file` given the
+      correct conditions, up to once per "file". Context range reporting also
+      differs for the last hunk such that the `end` part of the range is
+      reduced by one to a minimum of one.
+
+- Added a bunch more tests for the cases above, and fixed `hunk_spec.rb` so
+  that the phrase being compared isn't nonsense French.
+
+- Updated formatting.
+- Added a Rake task to assist with manual testing on Ruby 1.8.
+
+## 1.4.3 / 2020-06-29
+
+- Fixed several issues with the 1.4 on Rubies older than 2.0. Some of this was
+  providing useful shim functions to Hoe 3.x (which dropped these older
+  Rubies a while ago). Specifically:
+
+  - Removed Array#lazy from a method in Diff::LCS::Hunk.
+  - Changed some unit tests to use old-style Symbol-keyed hashes.
+  - Changed some unit test helper functions to no longer use keyword
+    parameters, but only a trailing options hash.
+  - Made the use of `psych` dependent on `RUBY_VERSION >= 1.9`.
+
+  Resolves [#63][].
+
 ## 1.4.2 / 2020-06-23
 
 - Camille Drapier fixed a small issue with RuboCop configuration. [#59][]
@@ -249,8 +300,11 @@
 [#29]: https://github.com/halostatue/diff-lcs/pull/29
 [#33]: https://github.com/halostatue/diff-lcs/issues/33
 [#34]: https://github.com/halostatue/diff-lcs/pull/34
+[#35]: https://github.com/halostatue/diff-lcs/issues/35
 [#36]: https://github.com/halostatue/diff-lcs/pull/36
 [#38]: https://github.com/halostatue/diff-lcs/issues/38
+[#43]: https://github.com/halostatue/diff-lcs/issues/43
+[#44]: https://github.com/halostatue/diff-lcs/issues/44
 [#47]: https://github.com/halostatue/diff-lcs/pull/47
 [#48]: https://github.com/halostatue/diff-lcs/issues/48
 [#49]: https://github.com/halostatue/diff-lcs/pull/49
@@ -261,3 +315,5 @@
 [#59]: https://github.com/halostatue/diff-lcs/pull/59
 [#60]: https://github.com/halostatue/diff-lcs/issues/60
 [#61]: https://github.com/halostatue/diff-lcs/pull/61
+[#63]: https://github.com/halostatue/diff-lcs/issues/63
+[#65]: https://github.com/halostatue/diff-lcs/issues/65
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README.rdoc new/README.rdoc
--- old/README.rdoc     2020-06-24 05:19:27.000000000 +0200
+++ new/README.rdoc     2020-07-01 20:29:57.000000000 +0200
@@ -12,14 +12,15 @@
 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.4, providing a simple extension that allows for
-Diff::LCS::Change objects to be treated implicitly as arrays. Ruby versions
-below 2.5 are soft-deprecated.
+This is release 1.4.3, providing a simple extension that allows for
+Diff::LCS::Change objects to be treated implicitly as arrays and fixes a
+number of formatting issues.
 
-This means that older versions are no longer part of the CI test suite. If any
-changes have been introduced that break those versions, bug reports and patches
-will be accepted, but it will be up to the reporter to verify any fixes prior
-to release. A future release will completely break compatibility.
+Ruby versions below 2.5 are soft-deprecated, which means that older versions
+are no longer part of the CI test suite. If any changes have been introduced
+that break those versions, bug reports and patches will be accepted, but it
+will be up to the reporter to verify any fixes prior to release. The next
+major release will completely break compatibility.
 
 == Synopsis
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Rakefile new/Rakefile
--- old/Rakefile        2020-06-24 05:19:27.000000000 +0200
+++ new/Rakefile        2020-07-01 20:29:57.000000000 +0200
@@ -6,10 +6,28 @@
 
 Hoe.plugin :bundler
 Hoe.plugin :doofus
-Hoe.plugin :email unless ENV['CI'] or ENV['TRAVIS']
 Hoe.plugin :gemspec2
 Hoe.plugin :git
-Hoe.plugin :travis
+
+if RUBY_VERSION < '1.9'
+  class Array #:nodoc:
+    def to_h
+      Hash[*flatten(1)]
+    end
+  end
+
+  class Gem::Specification #:nodoc:
+    def metadata=(*); end
+
+    def default_value(*); end
+  end
+
+  class Object #:nodoc:
+    def caller_locations(*)
+      []
+    end
+  end
+end
 
 _spec = Hoe.spec 'diff-lcs' do
   developer('Austin Ziegler', 'halosta...@gmail.com')
@@ -38,3 +56,19 @@
     end
   end
 end
+
+task :ruby18 do
+  puts <<-MESSAGE
+You are starting a barebones Ruby 1.8 docker environment. You will need to
+do the following:
+
+- mv Gemfile.lock{,.v2}
+- gem install bundler --version 1.17.2 --no-ri --no-rdoc
+- ruby -S bundle
+- rake
+
+Don't forget to restore your Gemfile.lock after testing.
+
+  MESSAGE
+  sh "docker run -it --rm -v #{Dir.pwd}:/root/diff-lcs 
bellbind/docker-ruby18-rails2 bash -l"
+end
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/diff/lcs/block.rb new/lib/diff/lcs/block.rb
--- old/lib/diff/lcs/block.rb   2020-06-24 05:19:27.000000000 +0200
+++ new/lib/diff/lcs/block.rb   2020-07-01 20:29:57.000000000 +0200
@@ -19,7 +19,7 @@
   end
 
   def diff_size
-    (@insert.size - @remove.size).abs
+    @insert.size - @remove.size
   end
 
   def op
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/diff/lcs/hunk.rb new/lib/diff/lcs/hunk.rb
--- old/lib/diff/lcs/hunk.rb    2020-06-24 05:19:27.000000000 +0200
+++ new/lib/diff/lcs/hunk.rb    2020-07-01 20:29:57.000000000 +0200
@@ -6,26 +6,38 @@
 # each block. (So if we're not using context, every hunk will contain one
 # block.) Used in the diff program (bin/ldiff).
 class Diff::LCS::Hunk
+  OLD_DIFF_OP_ACTION = { '+' => 'a', '-' => 'd', '!' => 'c' }.freeze #:nodoc:
+  ED_DIFF_OP_ACTION = { '+' => 'a', '-' => 'd', '!' => 'c' }.freeze #:nodoc:
+
+  private_constant :OLD_DIFF_OP_ACTION, :ED_DIFF_OP_ACTION if 
respond_to?(:private_constant)
+
   # Create a hunk using references to both the old and new data, as well as the
   # piece of data.
   def initialize(data_old, data_new, piece, flag_context, 
file_length_difference)
     # At first, a hunk will have just one Block in it
     @blocks = [Diff::LCS::Block.new(piece)]
+
+    if @blocks[0].remove.empty? && @blocks[0].insert.empty?
+      fail "Cannot build a hunk from #{piece.inspect}; has no add or remove 
actions"
+    end
+
     if String.method_defined?(:encoding)
       @preferred_data_encoding = data_old.fetch(0, data_new.fetch(0, 
'')).encoding
     end
+
     @data_old = data_old
     @data_new = data_new
 
     before = after = file_length_difference
     after += @blocks[0].diff_size
     @file_length_difference = after # The caller must get this manually
-    @max_diff_size = @blocks.lazy.map { |e| e.diff_size }.max
+    @max_diff_size = @blocks.map { |e| e.diff_size.abs }.max
+
 
     # Save the start & end of each array. If the array doesn't exist (e.g.,
-    # we're only adding items in this block), then figure out the line
-    # number based on the line number of the other file and the current
-    # difference in file lengths.
+    # we're only adding items in this block), then figure out the line number
+    # based on the line number of the other file and the current difference in
+    # file lengths.
     if @blocks[0].remove.empty?
       a1 = a2 = nil
     else
@@ -55,7 +67,7 @@
 
   # Change the "start" and "end" fields to note that context should be added
   # to this hunk.
-  attr_accessor :flag_context
+  attr_accessor :flag_context # rubocop:disable 
Layout/EmptyLinesAroundAttributeAccessor
   undef :flag_context=
   def flag_context=(context) #:nodoc: # rubocop:disable Lint/DuplicateMethods
     return if context.nil? or context.zero?
@@ -101,18 +113,18 @@
   end
 
   # Returns a diff string based on a format.
-  def diff(format)
+  def diff(format, last = false)
     case format
     when :old
-      old_diff
+      old_diff(last)
     when :unified
-      unified_diff
+      unified_diff(last)
     when :context
-      context_diff
+      context_diff(last)
     when :ed
       self
     when :reverse_ed, :ed_finish
-      ed_diff(format)
+      ed_diff(format, last)
     else
       fail "Unknown diff format #{format}."
     end
@@ -120,35 +132,34 @@
 
   # Note that an old diff can't have any context. Therefore, we know that
   # there's only one block in the hunk.
-  def old_diff
+  def old_diff(_last = false)
     warn 'Expecting only one block in an old diff hunk!' if @blocks.size > 1
-    op_act = { '+' => 'a', '-' => 'd', '!' => 'c' }
 
     block = @blocks[0]
 
     # Calculate item number range. Old diff range is just like a context
     # diff range, except the ranges are on one line with the action between
     # them.
-    s = 
encode("#{context_range(:old)}#{op_act[block.op]}#{context_range(:new)}\n")
+    s = encode("#{context_range(:old, 
',')}#{OLD_DIFF_OP_ACTION[block.op]}#{context_range(:new, ',')}\n")
     # If removing anything, just print out all the remove lines in the hunk
     # which is just all the remove lines in the block.
     unless block.remove.empty?
-      @data_old[@start_old..@end_old].each { |e| s << encode('< ') + e + 
encode("\n") }
+      @data_old[@start_old..@end_old].each { |e| s << encode('< ') + e.chomp + 
encode("\n") }
     end
 
     s << encode("---\n") if block.op == '!'
 
     unless block.insert.empty?
-      @data_new[@start_new..@end_new].each { |e| s << encode('> ') + e + 
encode("\n") }
+      @data_new[@start_new..@end_new].each { |e| s << encode('> ') + e.chomp + 
encode("\n") }
     end
 
     s
   end
   private :old_diff
 
-  def unified_diff
+  def unified_diff(last = false)
     # Calculate item number range.
-    s = encode("@@ -#{unified_range(:old)} +#{unified_range(:new)} @@\n")
+    s = encode("@@ -#{unified_range(:old, last)} +#{unified_range(:new, last)} 
@@\n")
 
     # Outlist starts containing the hunk of the old file. Removing an item
     # just means putting a '-' in front of it. Inserting an item requires
@@ -161,7 +172,14 @@
     # file -- don't take removed items into account.
     lo, hi, num_added, num_removed = @start_old, @end_old, 0, 0
 
-    outlist = @data_old[lo..hi].map { |e| e.insert(0, encode(' ')) }
+    outlist = @data_old[lo..hi].map { |e| String.new("#{encode(' 
')}#{e.chomp}") }
+
+    last_block = blocks[-1]
+
+    if last
+      old_missing_newline = missing_last_newline?(@data_old)
+      new_missing_newline = missing_last_newline?(@data_new)
+    end
 
     @blocks.each do |block|
       block.remove.each do |item|
@@ -170,67 +188,100 @@
         outlist[offset][0, 1] = encode(op)
         num_removed += 1
       end
+
+      if last && block == last_block && old_missing_newline && 
!new_missing_newline
+        outlist << encode('\\ No newline at end of file')
+        num_removed += 1
+      end
+
       block.insert.each do |item|
         op     = item.action.to_s # +
         offset = item.position - @start_new + num_removed
-        outlist[offset, 0] = encode(op) + @data_new[item.position]
+        outlist[offset, 0] = encode(op) + @data_new[item.position].chomp
         num_added += 1
       end
     end
 
+    outlist << encode('\\ No newline at end of file') if last && 
new_missing_newline
+
     s << outlist.join(encode("\n"))
+
+    s
   end
   private :unified_diff
 
-  def context_diff
+  def context_diff(last = false)
     s = encode("***************\n")
-    s << encode("*** #{context_range(:old)} ****\n")
-    r = context_range(:new)
+    s << encode("*** #{context_range(:old, ',', last)} ****\n")
+    r = context_range(:new, ',', last)
+
+    if last
+      old_missing_newline = missing_last_newline?(@data_old)
+      new_missing_newline = missing_last_newline?(@data_new)
+    end
 
     # Print out file 1 part for each block in context diff format if there
     # are any blocks that remove items
     lo, hi = @start_old, @end_old
     removes = @blocks.reject { |e| e.remove.empty? }
-    if removes
-      outlist = @data_old[lo..hi].map { |e| e.insert(0, encode(' ')) }
+
+    unless removes.empty?
+      outlist = @data_old[lo..hi].map { |e| String.new("#{encode('  
')}#{e.chomp}") }
+
+      last_block = removes[-1]
 
       removes.each do |block|
         block.remove.each do |item|
-          outlist[item.position - lo].insert(0, encode(block.op)) # - or !
+          outlist[item.position - lo][0, 1] = encode(block.op) # - or !
+        end
+
+        if last && block == last_block && old_missing_newline
+          outlist << encode('\\ No newline at end of file')
         end
       end
-      s << outlist.join("\n")
+
+      s << outlist.join(encode("\n")) << encode("\n")
     end
 
-    s << encode("\n--- #{r} ----\n")
+    s << encode("--- #{r} ----\n")
     lo, hi = @start_new, @end_new
     inserts = @blocks.reject { |e| e.insert.empty? }
-    if inserts
-      outlist = @data_new[lo..hi].collect { |e| e.insert(0, encode(' ')) }
+
+    unless inserts.empty?
+      outlist = @data_new[lo..hi].map { |e| String.new("#{encode('  
')}#{e.chomp}") }
+
+      last_block = inserts[-1]
+
       inserts.each do |block|
         block.insert.each do |item|
-          outlist[item.position - lo].insert(0, encode(block.op)) # - or !
+          outlist[item.position - lo][0, 1] = encode(block.op) # + or !
+        end
+
+        if last && block == last_block && new_missing_newline
+          outlist << encode('\\ No newline at end of file')
         end
       end
-      s << outlist.join("\n")
+      s << outlist.join(encode("\n"))
     end
+
     s
   end
   private :context_diff
 
-  def ed_diff(format)
-    op_act = { '+' => 'a', '-' => 'd', '!' => 'c' }
+  def ed_diff(format, _last = false)
     warn 'Expecting only one block in an old diff hunk!' if @blocks.size > 1
 
     s =
       if format == :reverse_ed
-        encode("#{op_act[@blocks[0].op]}#{context_range(:old)}\n")
+        encode("#{ED_DIFF_OP_ACTION[@blocks[0].op]}#{context_range(:old, 
',')}\n")
       else
-        encode("#{context_range(:old, ' ')}#{op_act[@blocks[0].op]}\n")
+        encode("#{context_range(:old, ' 
')}#{ED_DIFF_OP_ACTION[@blocks[0].op]}\n")
       end
 
     unless @blocks[0].insert.empty?
-      @data_new[@start_new..@end_new].each do |e| s << e + encode("\n") end
+      @data_new[@start_new..@end_new].each do |e|
+        s << e.chomp + encode("\n")
+      end
       s << encode(".\n")
     end
     s
@@ -239,7 +290,7 @@
 
   # Generate a range of item numbers to print. Only print 1 number if the
   # range has only one item in it. Otherwise, it's 'start,end'
-  def context_range(mode, op = ',') # rubocop:disable 
Naming/UncommunicativeMethodParamName
+  def context_range(mode, op, last = false)
     case mode
     when :old
       s, e = (@start_old + 1), (@end_old + 1)
@@ -247,6 +298,9 @@
       s, e = (@start_new + 1), (@end_new + 1)
     end
 
+    e -= 1 if last
+    e = 1 if e.zero?
+
     s < e ? "#{s}#{op}#{e}" : e.to_s
   end
   private :context_range
@@ -254,7 +308,7 @@
   # Generate a range of item numbers to print for unified diff. Print number
   # where block starts, followed by number of lines in the block
   # (don't print number of lines if it's 1)
-  def unified_range(mode)
+  def unified_range(mode, last)
     case mode
     when :old
       s, e = (@start_old + 1), (@end_old + 1)
@@ -262,12 +316,25 @@
       s, e = (@start_new + 1), (@end_new + 1)
     end
 
-    length = e - s + 1
+    length = e - s + (last ? 0 : 1)
+
     first = length < 2 ? e : s # "strange, but correct"
-    length == 1 ? first.to_s : "#{first},#{length}"
+    length <= 1 ? first.to_s : "#{first},#{length}"
   end
   private :unified_range
 
+  def missing_last_newline?(data)
+    newline = encode("\n")
+
+    if data[-2]
+      data[-2].end_with?(newline) && !data[-1].end_with?(newline)
+    elsif data[-1]
+      !data[-1].end_with?(newline)
+    else
+      true
+    end
+  end
+
   if String.method_defined?(:encoding)
     def encode(literal, target_encoding = @preferred_data_encoding)
       literal.encode target_encoding
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/diff/lcs/ldiff.rb new/lib/diff/lcs/ldiff.rb
--- old/lib/diff/lcs/ldiff.rb   2020-06-24 05:19:27.000000000 +0200
+++ new/lib/diff/lcs/ldiff.rb   2020-07-01 20:29:57.000000000 +0200
@@ -98,24 +98,19 @@
     # items we've read from each file will differ by FLD (could be 0).
     file_length_difference = 0
 
-    if @binary.nil? or @binary
-      data_old = IO.read(file_old)
-      data_new = IO.read(file_new)
-
-      # Test binary status
-      if @binary.nil?
-        old_txt = data_old[0, 4096].scan(/\0/).empty?
-        new_txt = data_new[0, 4096].scan(/\0/).empty?
-        @binary = !old_txt or !new_txt
-      end
+    data_old = IO.read(file_old)
+    data_new = IO.read(file_new)
 
-      unless @binary
-        data_old = data_old.split($/).map { |e| e.chomp }
-        data_new = data_new.split($/).map { |e| e.chomp }
-      end
-    else
-      data_old = IO.readlines(file_old).map { |e| e.chomp }
-      data_new = IO.readlines(file_new).map { |e| e.chomp }
+    # Test binary status
+    if @binary.nil?
+      old_txt = data_old[0, 4096].scan(/\0/).empty?
+      new_txt = data_new[0, 4096].scan(/\0/).empty?
+      @binary = !old_txt || !new_txt
+    end
+
+    unless @binary
+      data_old = data_old.lines.to_a
+      data_new = data_new.lines.to_a
     end
 
     # diff yields lots of pieces, each of which is basically a Block object
@@ -150,20 +145,21 @@
     end
 
     diffs.each do |piece|
-      begin
+      begin # rubocop:disable Style/RedundantBegin
         hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, @lines, 
file_length_difference)
         file_length_difference = hunk.file_length_difference
 
         next unless oldhunk
         next if @lines.positive? and hunk.merge(oldhunk)
 
-        output << oldhunk.diff(@format) << "\n"
+        output << oldhunk.diff(@format)
+        output << "\n" if @format == :unified
       ensure
         oldhunk = hunk
       end
     end
 
-    last = oldhunk.diff(@format)
+    last = oldhunk.diff(@format, true)
     last << "\n" if last.respond_to?(:end_with?) && !last.end_with?("\n")
 
     output << last
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/diff/lcs.rb new/lib/diff/lcs.rb
--- old/lib/diff/lcs.rb 2020-06-24 05:19:27.000000000 +0200
+++ new/lib/diff/lcs.rb 2020-07-01 20:29:57.000000000 +0200
@@ -49,7 +49,7 @@
 #          a x b y c z p d q
 #    a b c a x b y c z
 module Diff::LCS
-  VERSION = '1.4.2'
+  VERSION = '1.4.4'
 end
 
 require 'diff/lcs/callbacks'
@@ -60,6 +60,13 @@
   # +self+ and +other+. See Diff::LCS#lcs.
   #
   #   lcs = seq1.lcs(seq2)
+  #
+  # A note when using objects: Diff::LCS only works properly when each object
+  # can be used as a key in a Hash, which typically means that the objects must
+  # implement Object#eql? in a way that two identical values compare
+  # identically for key purposes. That is:
+  #
+  #   O.new('a').eql?(O.new('a')) == true
   def lcs(other, &block) #:yields self[i] if there are matched subsequences:
     Diff::LCS.lcs(self, other, &block)
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        2020-06-24 05:19:27.000000000 +0200
+++ new/metadata        2020-07-01 20:29:57.000000000 +0200
@@ -1,14 +1,14 @@
 --- !ruby/object:Gem::Specification
 name: diff-lcs
 version: !ruby/object:Gem::Version
-  version: 1.4.2
+  version: 1.4.4
 platform: ruby
 authors:
 - Austin Ziegler
 autorequire:
 bindir: bin
 cert_chain: []
-date: 2020-06-24 00:00:00.000000000 Z
+date: 2020-07-01 00:00:00.000000000 Z
 dependencies:
 - !ruby/object:Gem::Dependency
   name: hoe-doofus
@@ -139,14 +139,15 @@
   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.4, providing a simple extension that allows for
-  Diff::LCS::Change objects to be treated implicitly as arrays. Ruby versions
-  below 2.5 are soft-deprecated.
+  This is release 1.4.3, providing a simple extension that allows for
+  Diff::LCS::Change objects to be treated implicitly as arrays and fixes a
+  number of formatting issues.
 
-  This means that older versions are no longer part of the CI test suite. If 
any
-  changes have been introduced that break those versions, bug reports and 
patches
-  will be accepted, but it will be up to the reporter to verify any fixes prior
-  to release. A future release will completely break compatibility.
+  Ruby versions below 2.5 are soft-deprecated, which means that older versions
+  are no longer part of the CI test suite. If any changes have been introduced
+  that break those versions, bug reports and patches will be accepted, but it
+  will be up to the reporter to verify any fixes prior to release. The next
+  major release will completely break compatibility.
 email:
 - halosta...@gmail.com
 executables:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/spec/fixtures/ldiff/output.diff-c 
new/spec/fixtures/ldiff/output.diff-c
--- old/spec/fixtures/ldiff/output.diff-c       2020-06-24 05:19:27.000000000 
+0200
+++ new/spec/fixtures/ldiff/output.diff-c       2020-07-01 20:29:57.000000000 
+0200
@@ -1,5 +1,5 @@
-*** spec/fixtures/aX   2019-02-01 22:29:34.000000000 -0500
---- spec/fixtures/bXaX 2019-02-01 22:29:43.000000000 -0500
+*** spec/fixtures/aX   2020-06-23 11:15:32.000000000 -0400
+--- spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400
 ***************
 *** 1 ****
 ! aX
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/spec/fixtures/ldiff/output.diff-u 
new/spec/fixtures/ldiff/output.diff-u
--- old/spec/fixtures/ldiff/output.diff-u       2020-06-24 05:19:27.000000000 
+0200
+++ new/spec/fixtures/ldiff/output.diff-u       2020-07-01 20:29:57.000000000 
+0200
@@ -1,5 +1,5 @@
---- spec/fixtures/aX   2019-02-01 22:29:34.000000000 -0500
-+++ spec/fixtures/bXaX 2019-02-01 22:29:43.000000000 -0500
+--- spec/fixtures/aX   2020-06-23 11:15:32.000000000 -0400
++++ spec/fixtures/bXaX 2020-06-23 11:15:32.000000000 -0400
 @@ -1 +1 @@
 -aX
 +bXaX
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/spec/hunk_spec.rb new/spec/hunk_spec.rb
--- old/spec/hunk_spec.rb       2020-06-24 05:19:27.000000000 +0200
+++ new/spec/hunk_spec.rb       2020-07-01 20:29:57.000000000 +0200
@@ -6,28 +6,39 @@
   require 'diff/lcs/hunk'
 
   describe Diff::LCS::Hunk do
-    let(:old_data) { ['Tu avec carté {count} itém has'.encode('UTF-16LE')] }
-    let(:new_data) { ['Tu avec carte {count} item has'.encode('UTF-16LE')] }
+    let(:old_data) { ['Tu a un carté avec {count} itéms'.encode('UTF-16LE')] }
+    let(:new_data) { ['Tu a un carte avec {count} items'.encode('UTF-16LE')] }
     let(:pieces)   { Diff::LCS.diff old_data, new_data }
     let(:hunk)     { Diff::LCS::Hunk.new(old_data, new_data, pieces[0], 3, 0) }
 
     it 'produces a unified diff from the two pieces' do
       expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
         @@ -1 +1 @@
-        -Tu avec carté {count} itém has
-        +Tu avec carte {count} item has
+        -Tu a un carté avec {count} itéms
+        +Tu a un carte avec {count} items
       EXPECTED
 
       expect(hunk.diff(:unified)).to eq(expected)
     end
 
+    it 'produces a unified diff from the two pieces (last entry)' do
+      expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
+        @@ -1 +1 @@
+        -Tu a un carté avec {count} itéms
+        +Tu a un carte avec {count} items
+        \\ No newline at end of file
+      EXPECTED
+
+      expect(hunk.diff(:unified, true)).to eq(expected)
+    end
+
     it 'produces a context diff from the two pieces' do
       expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
         ***************
         *** 1 ****
-        ! Tu avec carté {count} itém has
+        ! Tu a un carté avec {count} itéms
         --- 1 ----
-        ! Tu avec carte {count} item has
+        ! Tu a un carte avec {count} items
       EXPECTED
 
       expect(hunk.diff(:context)).to eq(expected)
@@ -36,9 +47,9 @@
     it 'produces an old diff from the two pieces' do
       expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp
         1c1
-        < Tu avec carté {count} itém has
+        < Tu a un carté avec {count} itéms
         ---
-        > Tu avec carte {count} item has
+        > Tu a un carte avec {count} items
 
       EXPECTED
 
@@ -48,7 +59,7 @@
     it 'produces a reverse ed diff from the two pieces' do
       expected = <<-EXPECTED.gsub(/^ +/, '').encode('UTF-16LE').chomp
         c1
-        Tu avec carte {count} item has
+        Tu a un carte avec {count} items
         .
 
       EXPECTED
@@ -62,7 +73,7 @@
       it 'produces a unified diff' do
         expected = <<-EXPECTED.gsub(/^\s+/, '').encode('UTF-16LE').chomp
           @@ -1 +1,2 @@
-          +Tu avec carte {count} item has
+          +Tu a un carte avec {count} items
         EXPECTED
 
         expect(hunk.diff(:unified)).to eq(expected)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/spec/issues_spec.rb new/spec/issues_spec.rb
--- old/spec/issues_spec.rb     2020-06-24 05:19:27.000000000 +0200
+++ new/spec/issues_spec.rb     2020-07-01 20:29:57.000000000 +0200
@@ -56,17 +56,17 @@
     end
   end
 
-  describe "issue #57" do
+  describe 'issue #57' do
     it 'should fail with a correct error' do
       expect {
-        actual = {:category=>"app.rack.request"}
-        expected = {:category=>"rack.middleware", :title=>"Anonymous 
Middleware"}
+        actual = { :category => 'app.rack.request' }
+        expected = { :category => 'rack.middleware', :title => 'Anonymous 
Middleware' }
         expect(actual).to eq(expected)
       }.to raise_error(RSpec::Expectations::ExpectationNotMetError)
     end
   end
 
-  describe "issue #60" do
+  describe 'issue #60' do
     it 'should produce unified output with correct context' do
       old_data = <<-DATA_OLD.strip.split("\n").map(&:chomp)
 {
@@ -95,4 +95,60 @@
       EXPECTED
     end
   end
+
+  describe 'issue #65' do
+    def diff_lines(old_lines, new_lines)
+      file_length_difference = 0
+      previous_hunk = nil
+      output = []
+
+      Diff::LCS.diff(old_lines, new_lines).each do |piece|
+        hunk = Diff::LCS::Hunk.new(old_lines, new_lines, piece, 3, 
file_length_difference)
+        file_length_difference = hunk.file_length_difference
+        maybe_contiguous_hunks = (previous_hunk.nil? || 
hunk.merge(previous_hunk))
+
+        output << "#{previous_hunk.diff(:unified)}\n" unless 
maybe_contiguous_hunks
+
+        previous_hunk = hunk
+      end
+      output << "#{previous_hunk.diff(:unified, true)}\n" unless 
previous_hunk.nil?
+      output.join
+    end
+
+    it 'should not misplace the new chunk' do
+      old_data = [
+        'recipe[a::default]', 'recipe[b::default]', 'recipe[c::default]',
+        'recipe[d::default]', 'recipe[e::default]', 'recipe[f::default]',
+        'recipe[g::default]', 'recipe[h::default]', 'recipe[i::default]',
+        'recipe[j::default]', 'recipe[k::default]', 'recipe[l::default]',
+        'recipe[m::default]', 'recipe[n::default]'
+      ]
+
+      new_data = [
+        'recipe[a::default]', 'recipe[c::default]', 'recipe[d::default]',
+        'recipe[e::default]', 'recipe[f::default]', 'recipe[g::default]',
+        'recipe[h::default]', 'recipe[i::default]', 'recipe[j::default]',
+        'recipe[k::default]', 'recipe[l::default]', 'recipe[m::default]',
+        'recipe[n::default]', 'recipe[o::new]', 'recipe[p::new]',
+        'recipe[q::new]', 'recipe[r::new]'
+      ]
+
+      expect(diff_lines(old_data, new_data)).to eq(<<-EODIFF)
+@@ -1,5 +1,4 @@
+ recipe[a::default]
+-recipe[b::default]
+ recipe[c::default]
+ recipe[d::default]
+ recipe[e::default]
+@@ -12,3 +11,7 @@
+ recipe[l::default]
+ recipe[m::default]
+ recipe[n::default]
++recipe[o::new]
++recipe[p::new]
++recipe[q::new]
++recipe[r::new]
+      EODIFF
+    end
+  end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/spec/ldiff_spec.rb new/spec/ldiff_spec.rb
--- old/spec/ldiff_spec.rb      2020-06-24 05:19:27.000000000 +0200
+++ new/spec/ldiff_spec.rb      2020-07-01 20:29:57.000000000 +0200
@@ -5,39 +5,41 @@
 RSpec.describe 'bin/ldiff' do
   include CaptureSubprocessIO
 
-  let(:output_diff) { read_fixture }
-  let(:output_diff_c) { read_fixture('-c') }
-  let(:output_diff_e) { read_fixture('-e') }
-  let(:output_diff_f) { read_fixture('-f') }
-  let(:output_diff_u) { read_fixture('-u') }
-  let(:output_diff_chef) { read_fixture('-u', base: 'output.diff.chef') }
+  fixtures = [
+    { :name => 'output.diff', :left => 'aX', :right => 'bXaX' },
+    { :name => 'output.diff.chef', :left => 'old-chef', :right => 'new-chef' },
+    { :name => 'output.diff.chef2', :left => 'old-chef2', :right => 
'new-chef2' }
+  ].product([nil, '-e', '-f', '-c', '-u']).map { |(fixture, flag)|
+    fixture = fixture.dup
+    fixture[:flag] = flag
+    fixture
+  }
+
+  def self.test_ldiff(fixture)
+    desc = [
+      fixture[:flag],
+      "spec/fixtures/#{fixture[:left]}",
+      "spec/fixtures/#{fixture[:right]}",
+      '#',
+      '=>',
+      "spec/fixtures/ldiff/#{fixture[:name]}#{fixture[:flag]}"
+    ].join(' ')
 
-  specify do
-    expect(run_ldiff('-u', left: 'old-chef', right: 'new-chef')).to 
eq(output_diff_chef)
-  end
-
-  specify do
-    expect(run_ldiff).to eq(output_diff)
-  end
-
-  specify do
-    expect(run_ldiff('-c')).to eq(output_diff_c)
-  end
-
-  specify do
-    expect(run_ldiff('-e')).to eq(output_diff_e)
-  end
-
-  specify do
-    expect(run_ldiff('-f')).to eq(output_diff_f)
+    it desc do
+      expect(run_ldiff(fixture)).to eq(read_fixture(fixture))
+    end
   end
 
-  specify do
-    expect(run_ldiff('-u')).to eq(output_diff_u)
+  fixtures.each do |fixture|
+    test_ldiff(fixture)
   end
 
-  def read_fixture(flag = nil, base: 'output.diff')
-    clean_data(IO.binread("spec/fixtures/ldiff/#{base}#{flag}"), flag)
+  def read_fixture(options)
+    fixture = options.fetch(:name)
+    flag = options.fetch(:flag)
+    name = "spec/fixtures/ldiff/#{fixture}#{flag}"
+    data = IO.__send__(IO.respond_to?(:binread) ? :binread : :read, name)
+    clean_data(data, flag)
   end
 
   def clean_data(data, flag)
@@ -65,15 +67,20 @@
         \s*
         (?:[-+]\d{4}|Z)
       }x,
-      '*** spec/fixtures/\1    0000-00-00 00:00:00.000000000 -0000'
+      '*** spec/fixtures/\1    0000-00-00 :00 =>:00 =>00.000000000 -0000'
     )
   end
 
-  def run_ldiff(flag = nil, left: 'aX', right: 'bXaX')
+  def run_ldiff(options)
+    flag = options.fetch(:flag)
+    left = options.fetch(:left)
+    right = options.fetch(:right)
+
     stdout, stderr = capture_subprocess_io do
       system("ruby -Ilib bin/ldiff #{flag} spec/fixtures/#{left} 
spec/fixtures/#{right}")
     end
-    expect(stderr).to be_empty
+
+    expect(stderr).to be_empty if RUBY_VERSION >= '1.9'
     expect(stdout).not_to be_empty
     clean_data(stdout, flag)
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/spec/spec_helper.rb new/spec/spec_helper.rb
--- old/spec/spec_helper.rb     2020-06-24 05:19:27.000000000 +0200
+++ new/spec/spec_helper.rb     2020-07-01 20:29:57.000000000 +0200
@@ -2,7 +2,8 @@
 
 require 'rubygems'
 require 'pathname'
-require 'psych'
+
+require 'psych' if RUBY_VERSION >= '1.9'
 
 if ENV['COVERAGE']
   require 'simplecov'
@@ -43,30 +44,31 @@
   end
 
   def capture_subprocess_io
-    _synchronize do
-      begin
-        require 'tempfile'
-
-        captured_stdout, captured_stderr = Tempfile.new('out'), 
Tempfile.new('err')
-
-        orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
-        $stdout.reopen captured_stdout
-        $stderr.reopen captured_stderr
-
-        yield
-
-        $stdout.rewind
-        $stderr.rewind
-
-        return captured_stdout.read, captured_stderr.read
-      ensure
-        captured_stdout.unlink
-        captured_stderr.unlink
-        $stdout.reopen orig_stdout
-        $stderr.reopen orig_stderr
-      end
-    end
+    _synchronize { _capture_subprocess_io { yield } }
+  end
+
+  def _capture_subprocess_io
+    require 'tempfile'
+
+    captured_stdout, captured_stderr = Tempfile.new('out'), Tempfile.new('err')
+
+    orig_stdout, orig_stderr = $stdout.dup, $stderr.dup
+    $stdout.reopen captured_stdout
+    $stderr.reopen captured_stderr
+
+    yield
+
+    $stdout.rewind
+    $stderr.rewind
+
+    [captured_stdout.read, captured_stderr.read]
+  ensure
+    captured_stdout.unlink
+    captured_stderr.unlink
+    $stdout.reopen orig_stdout
+    $stderr.reopen orig_stderr
   end
+  private :_capture_subprocess_io
 end
 
 require 'diff-lcs'


Reply via email to