Guest User

Untitled

a guest
May 21st, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.53 KB | None | 0 0
  1. #! /usr/bin/env ruby
  2. require "fileutils"
  3. require "getopts"
  4. ENV['LANG']="C"
  5.  
  6. USAGE = <<USAGE
  7. usage: #$0 [options] dir1 dir2\n
  8. options:
  9. -f Force diffing. If not given, try to use cache under ~/.diffrb.
  10. -b Ignore changes in amount of white space.
  11. -B Ignore changes that just insert or delete blank lines.
  12. -N treat only file as present but empty in the other directory.
  13. -p Print diff(1) and exit.
  14. --change | --add | --delete
  15. Reports only change/add/delete. No two of these can't be given.
  16. --diff
  17. Reports as diff command to leads "| sh". Implies --change.
  18. --noprefix
  19. Do not print one-letter prefix A, C, nor D.
  20. USAGE
  21.  
  22. opterr = getopts("fpbNB0", "change", "add", "delete", "help", "noprefix", "diff")
  23.  
  24. if $OPT_diff
  25. $OPT_change = true
  26. $OPT_add, $OPT_delete = nil
  27. end
  28.  
  29. if $OPT_change && $OPT_add or
  30. $OPT_change && $OPT_delete or
  31. $OPT_delete && $OPT_add
  32. abort USAGE
  33. end
  34.  
  35. if ARGV.size != 2 or $OPT_help or !opterr
  36. abort USAGE
  37. end
  38.  
  39. non_directory = ARGV.find_all{|d| !File.directory?(d)}
  40. if !non_directory.empty?
  41. non_directory.each{|d|
  42. STDERR.puts "#$0: #{d}: not a directory"
  43. }
  44. abort USAGE
  45. end
  46.  
  47. $OPT_all = !$OPT_add && !$OPT_change && !$OPT_delete
  48.  
  49. dir1, dir2 = ARGV.map{|i| i.dup}
  50. dir1.sub!(%r#/+$#, '')
  51. dir2.sub!(%r#/+$#, '')
  52. opts = "-q"
  53. opts << "b" if $OPT_b
  54. opts << "B" if $OPT_B
  55. opts << "N" if $OPT_N
  56. uopts = "-u"
  57. uopts << "b" if $OPT_b
  58. uopts << "B" if $OPT_B
  59. uopts << "N" if $OPT_N
  60. uopts << "0" if $OPT_0
  61.  
  62. rcdir = ENV["HOME"]+"/.diffrb"
  63. fn = ARGV.map{|d| File.expand_path(d).gsub("/", "___")}.join("---")
  64. difffile = File.join(rcdir, fn+".txt")
  65.  
  66. if !File.exist?(difffile) or $OPT_f
  67. FileUtils.mkdir_p(rcdir)
  68. STDERR.puts("# #$0: executing diff -qr #{dir1} #{dir2}")
  69. system("diff -qr #{dir1} #{dir2} > #{difffile}")
  70. end
  71.  
  72. diff = File.read(difffile)
  73.  
  74. if $OPT_p
  75. print diff
  76. exit
  77. end
  78.  
  79. change = diff.scan(/Files #{Regexp::quote(dir1)}\/(.*?) and #{Regexp.quote(dir2)}\/\1 differ/u).flatten.sort
  80. deleted = diff.scan(/Only in #{Regexp.quote(dir1)}\/(\S+): (.+)$/u).map{|i| i.join("/")}.sort
  81. added = diff.scan(/Only in #{Regexp.quote(dir2)}\/(\S+): (.+)$/u).map{|i| i.join("/")}.sort
  82.  
  83. if !$OPT_add and !$OPT_delete
  84. if $OPT_diff
  85. change.each{|i| puts %<diff #{uopts} "#{dir1}/#{i}" "#{dir2}/#{i}">}
  86. else
  87. change.each{|i| puts $OPT_noprefix ? i : "C #{i}"}
  88. end
  89. end
  90. if !$OPT_change and !$OPT_delete
  91. added.each{|i| puts $OPT_noprefix ? i : "A #{i}"}
  92. end
  93. if !$OPT_add and !$OPT_change
  94. deleted.each{|i| puts $OPT_noprefix ? i : "D #{i}"}
  95. end
Add Comment
Please, Sign In to add comment