di 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/di.gemspec +1 -0
- data/lib/di.rb +233 -80
- metadata +24 -14
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 85e6d0dda9d8ab2f37c5781743238023291f5d3a
|
4
|
+
data.tar.gz: d08a5f0ea260bdd94ff720f73670490acdebf649
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 672d1f491243ad2ede807e4176ced0c0fa216965a223e2ea8e8bf44b853cb93ea8d792fb6fa5031708c31b84603d65f2b4a8a79ce03de371bda958983ede1e17
|
7
|
+
data.tar.gz: b5fd0a90f9bace17a97e72b3df21259d96f768b14042b0e1bd5623175b547f16ab2c44d9835905de9402f4c4c03bdf469c9741c221631a7c3943dbadd9c7dbde
|
data/di.gemspec
CHANGED
data/lib/di.rb
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
29
29
|
# SUCH DAMAGE.
|
30
30
|
|
31
|
-
MYVERSION = "0.
|
31
|
+
MYVERSION = "0.4.0"
|
32
32
|
MYNAME = File.basename($0)
|
33
33
|
MYCOPYRIGHT = "Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Akinori MUSHA"
|
34
34
|
|
@@ -59,6 +59,10 @@ FIGNORE_GLOBS = ENV.fetch('FIGNORE', '').split(':').map { |pat|
|
|
59
59
|
|
60
60
|
IO::NULL = '/dev/null' unless defined? IO::NULL
|
61
61
|
|
62
|
+
PLUS_SIGN = '+'
|
63
|
+
MINUS_SIGN = '-'
|
64
|
+
EQUAL_SIGN = '='
|
65
|
+
|
62
66
|
def main(args)
|
63
67
|
setup
|
64
68
|
|
@@ -77,28 +81,32 @@ end
|
|
77
81
|
|
78
82
|
def setup
|
79
83
|
require 'ostruct'
|
80
|
-
$diff = OpenStruct.new
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
84
|
+
$diff = OpenStruct.new({
|
85
|
+
:exclude => [],
|
86
|
+
:include => [],
|
87
|
+
:flags => [],
|
88
|
+
:format_flags => [],
|
89
|
+
:format => :normal,
|
90
|
+
:colors => OpenStruct.new({
|
91
|
+
:comment => "\e[1m",
|
92
|
+
:file1 => "\e[1m",
|
93
|
+
:file2 => "\e[1m",
|
94
|
+
:header => "\e[36m",
|
95
|
+
:function => "\e[m",
|
96
|
+
:new => "\e[32m",
|
97
|
+
:old => "\e[31m",
|
98
|
+
:new_word => "\e[7;32m",
|
99
|
+
:old_word => "\e[7;31m",
|
100
|
+
:changed => "\e[33m",
|
101
|
+
:unchanged => "",
|
102
|
+
:whitespace => "\e[40m",
|
103
|
+
:off => "\e[m",
|
104
|
+
:open_inv => "\e[7m",
|
105
|
+
:close_inv => "\e[27m",
|
106
|
+
}),
|
107
|
+
:reversed => false,
|
108
|
+
:word_regex => /([@$%]*[[:alnum:]_]+|[^\n])/,
|
109
|
+
})
|
102
110
|
end
|
103
111
|
|
104
112
|
def parse_args!(args)
|
@@ -127,7 +135,7 @@ usage: #{MYNAME} [flags] [files]
|
|
127
135
|
$diff.colorize = val if $stdout.tty?
|
128
136
|
}
|
129
137
|
opts.on('--[no-]highlight-whitespace',
|
130
|
-
'Highlight
|
138
|
+
'Highlight whitespace differences in colorized output. [+][*]') { |val|
|
131
139
|
$diff.highlight_whitespace = val
|
132
140
|
}
|
133
141
|
opts.on('--[no-]rsync-exclude', '--[no-]cvs-exclude',
|
@@ -702,91 +710,229 @@ def diff_exclude?(dir, basename)
|
|
702
710
|
end
|
703
711
|
|
704
712
|
def colorize_unified_diff(io)
|
713
|
+
begin
|
714
|
+
require 'diff/lcs'
|
715
|
+
colorize_unified_diff_hunk = method(:colorize_hunk_in_unified_diff_inline)
|
716
|
+
rescue LoadError
|
717
|
+
colorize_unified_diff_hunk = method(:colorize_hunk_in_unified_diff_normal)
|
718
|
+
end
|
719
|
+
|
705
720
|
colors = $diff.colors
|
721
|
+
colors.to_function ||= colors.off + colors.function
|
706
722
|
|
707
723
|
state = :comment
|
708
724
|
hunk_left = nil
|
725
|
+
hunk = []
|
709
726
|
io.each_line { |line|
|
727
|
+
line.chomp!
|
710
728
|
replace_invalid_bytes!(line)
|
711
729
|
case state
|
712
730
|
when :comment
|
713
731
|
case line
|
714
732
|
when /^\+{3} /
|
715
|
-
color = colors
|
733
|
+
color = colors.file1
|
716
734
|
when /^-{3} /
|
717
|
-
color = colors
|
735
|
+
color = colors.file2
|
718
736
|
when /^@@ -[0-9]+(,([0-9]+))? \+[0-9]+(,([0-9]+))?/
|
719
737
|
state = :hunk
|
720
738
|
hunk_left = ($1 ? $2.to_i : 1) + ($3 ? $4.to_i : 1)
|
721
|
-
line.sub!(/^(@@ .*? @@
|
722
|
-
$1 +
|
739
|
+
line.sub!(/^(@@ .*? @@ )/) {
|
740
|
+
$1 + colors.to_function
|
723
741
|
}
|
724
|
-
color = colors
|
742
|
+
color = colors.header
|
725
743
|
else
|
726
|
-
color = colors
|
744
|
+
color = colors.comment
|
727
745
|
end
|
728
746
|
when :hunk
|
729
|
-
|
747
|
+
hunk << line
|
730
748
|
case line
|
731
|
-
when
|
732
|
-
color = colors[:new]
|
733
|
-
hunk_left -= 1
|
734
|
-
check = $diff.highlight_whitespace
|
735
|
-
when /^-/
|
736
|
-
color = colors[:old]
|
749
|
+
when /^[-+]/
|
737
750
|
hunk_left -= 1
|
738
|
-
check = $diff.highlight_whitespace
|
739
751
|
when /^ /
|
740
|
-
color = colors[:unchanged]
|
741
752
|
hunk_left -= 2
|
742
|
-
else
|
743
|
-
# error
|
744
|
-
color = colors[:comment]
|
745
|
-
end
|
746
|
-
if check
|
747
|
-
line.sub!(/([ \t]+)$/) {
|
748
|
-
colors[:off] + colors[:whitespace] + $1
|
749
|
-
}
|
750
|
-
true while line.sub!(/^(.[ \t]*)( +)(\t)/) {
|
751
|
-
$1 + colors[:off] + colors[:whitespace] + $2 + colors[:off] + color + $3
|
752
|
-
}
|
753
753
|
end
|
754
754
|
if hunk_left <= 0
|
755
|
-
|
755
|
+
colorize_unified_diff_hunk.call(hunk)
|
756
756
|
hunk_left = nil
|
757
|
+
hunk.clear
|
758
|
+
state = :comment
|
757
759
|
end
|
760
|
+
next
|
758
761
|
end
|
759
762
|
|
760
|
-
line.
|
761
|
-
line.sub!(/$/, colors[:off])
|
762
|
-
|
763
|
-
print line
|
763
|
+
print color, line, colors.off, "\n"
|
764
764
|
}
|
765
765
|
|
766
766
|
io.close
|
767
767
|
end
|
768
768
|
|
769
|
+
def colorize_hunk_in_unified_diff_normal(hunk)
|
770
|
+
colors = $diff.colors
|
771
|
+
|
772
|
+
hunk.each { |line|
|
773
|
+
case line
|
774
|
+
when /^\+/
|
775
|
+
color = colors.new
|
776
|
+
ws = $diff.highlight_whitespace
|
777
|
+
when /^-/
|
778
|
+
color = colors.old
|
779
|
+
ws = $diff.highlight_whitespace
|
780
|
+
when /^ /
|
781
|
+
color = colors.unchanged
|
782
|
+
ws = false
|
783
|
+
end
|
784
|
+
if ws
|
785
|
+
highlight_whitespace_in_unified_diff!(line, color)
|
786
|
+
end
|
787
|
+
print color, line, colors.off, "\n"
|
788
|
+
}
|
789
|
+
end
|
790
|
+
|
791
|
+
def colorize_hunk_in_unified_diff_inline(hunk)
|
792
|
+
colors = $diff.colors
|
793
|
+
|
794
|
+
skip_next = false
|
795
|
+
|
796
|
+
Enumerator.new { |y|
|
797
|
+
y << nil
|
798
|
+
hunk.each { |line|
|
799
|
+
y << line
|
800
|
+
}
|
801
|
+
y << nil << nil
|
802
|
+
}.each_cons(4) { |line0, line1, line2, line3|
|
803
|
+
case
|
804
|
+
when skip_next
|
805
|
+
skip_next = false
|
806
|
+
next
|
807
|
+
when line1.nil?
|
808
|
+
break
|
809
|
+
when /^[-+]/ !~ line0 && /^-/ =~ line1 && /^\+/ =~ line2 && /^[-+]/ !~ line3
|
810
|
+
colorize_inline_diff(line1, line2)
|
811
|
+
skip_next = true
|
812
|
+
next
|
813
|
+
when /^\+/ =~ line1
|
814
|
+
color = colors.new
|
815
|
+
ws = $diff.highlight_whitespace
|
816
|
+
when /^-/ =~ line1
|
817
|
+
color = colors.old
|
818
|
+
ws = $diff.highlight_whitespace
|
819
|
+
when /^ / =~ line1
|
820
|
+
color = colors.unchanged
|
821
|
+
ws = false
|
822
|
+
end
|
823
|
+
if ws
|
824
|
+
line1 = line1.dup
|
825
|
+
highlight_whitespace_in_unified_diff!(line1, color)
|
826
|
+
end
|
827
|
+
print color, line1, colors.off, "\n"
|
828
|
+
}
|
829
|
+
end
|
830
|
+
|
831
|
+
def colorize_inline_diff(line1, line2)
|
832
|
+
words1, words2 = [line1, line2].map { |line|
|
833
|
+
line[1..-1].split($diff.word_regex)
|
834
|
+
}
|
835
|
+
xwords1, xwords2 = [words1, words2].map { |words|
|
836
|
+
words.each_with_index.map { |word, i| i.even? ? nil : word }
|
837
|
+
}
|
838
|
+
swords1, swords2, signs1, signs2 = [], [], [], []
|
839
|
+
|
840
|
+
Diff::LCS.sdiff(xwords1, xwords2).each { |tuple|
|
841
|
+
sign, (pos1, word1), (pos2, word2) = *tuple
|
842
|
+
case sign
|
843
|
+
when PLUS_SIGN
|
844
|
+
if signs2.last == sign
|
845
|
+
swords2.last << word2 if word2
|
846
|
+
else
|
847
|
+
swords2 << (word2 || '')
|
848
|
+
signs2 << sign
|
849
|
+
end
|
850
|
+
when MINUS_SIGN
|
851
|
+
if signs1.last == sign
|
852
|
+
swords1.last << word1 if word1
|
853
|
+
else
|
854
|
+
swords1 << (word1 || '')
|
855
|
+
signs1 << sign
|
856
|
+
end
|
857
|
+
else
|
858
|
+
if signs1.last == sign
|
859
|
+
swords1.last << words1[pos1]
|
860
|
+
else
|
861
|
+
swords1 << words1[pos1]
|
862
|
+
signs1 << sign
|
863
|
+
end
|
864
|
+
if signs2.last == sign
|
865
|
+
swords2.last << words2[pos2]
|
866
|
+
else
|
867
|
+
swords2 << words2[pos2]
|
868
|
+
signs2 << sign
|
869
|
+
end
|
870
|
+
end
|
871
|
+
}
|
872
|
+
|
873
|
+
colors = $diff.colors
|
874
|
+
|
875
|
+
aline1 = ''.tap { |line|
|
876
|
+
signs1.zip(swords1) { |sign, word|
|
877
|
+
case sign
|
878
|
+
when EQUAL_SIGN
|
879
|
+
line << colors.off << colors.old << word
|
880
|
+
else
|
881
|
+
line << colors.off << colors.old_word << word
|
882
|
+
end
|
883
|
+
}
|
884
|
+
}
|
885
|
+
aline2 = ''.tap { |line|
|
886
|
+
signs2.zip(swords2) { |sign, word|
|
887
|
+
case sign
|
888
|
+
when EQUAL_SIGN
|
889
|
+
line << colors.off << colors.new << word
|
890
|
+
else
|
891
|
+
line << colors.off << colors.new_word << word
|
892
|
+
end
|
893
|
+
}
|
894
|
+
}
|
895
|
+
|
896
|
+
print colors.old, '-', aline1, "\n",
|
897
|
+
colors.new, '+', aline2, "\n"
|
898
|
+
end
|
899
|
+
|
900
|
+
def highlight_whitespace_in_unified_diff!(line, color)
|
901
|
+
colors = $diff.colors
|
902
|
+
colors.to_whitespace ||= colors.off + colors.whitespace
|
903
|
+
|
904
|
+
line.gsub!(/([ \t]+)$|( +)(?=\t)/) {
|
905
|
+
if $1
|
906
|
+
colors.to_whitespace + $1
|
907
|
+
else
|
908
|
+
colors.to_whitespace + $2 << colors.off << color
|
909
|
+
end
|
910
|
+
}
|
911
|
+
end
|
912
|
+
|
769
913
|
def colorize_context_diff(io)
|
770
914
|
colors = $diff.colors
|
915
|
+
colors.to_function ||= colors.off + colors.function
|
771
916
|
|
772
917
|
state = :comment
|
773
918
|
hunk_part = nil
|
774
919
|
io.each_line { |line|
|
920
|
+
line.chomp!
|
775
921
|
replace_invalid_bytes!(line)
|
776
922
|
case state
|
777
923
|
when :comment
|
778
924
|
case line
|
779
925
|
when /^\*{3} /
|
780
|
-
color = colors
|
926
|
+
color = colors.file1
|
781
927
|
when /^-{3} /
|
782
|
-
color = colors
|
928
|
+
color = colors.file2
|
783
929
|
when /^\*{15}/
|
784
930
|
state = :hunk
|
785
931
|
hunk_part = 0
|
786
|
-
line.sub!(/^(\*{15}
|
787
|
-
$1 +
|
932
|
+
line.sub!(/^(\*{15} )/) {
|
933
|
+
$1 + colors.to_function
|
788
934
|
}
|
789
|
-
color = colors
|
935
|
+
color = colors.header
|
790
936
|
end
|
791
937
|
when :hunk
|
792
938
|
case hunk_part
|
@@ -794,10 +940,10 @@ def colorize_context_diff(io)
|
|
794
940
|
case line
|
795
941
|
when /^\*{3} /
|
796
942
|
hunk_part = 1
|
797
|
-
color = colors
|
943
|
+
color = colors.header
|
798
944
|
else
|
799
945
|
# error
|
800
|
-
color = colors
|
946
|
+
color = colors.comment
|
801
947
|
end
|
802
948
|
when 1, 2
|
803
949
|
check = false
|
@@ -805,53 +951,60 @@ def colorize_context_diff(io)
|
|
805
951
|
when /^\-{3} /
|
806
952
|
if hunk_part == 1
|
807
953
|
hunk_part = 2
|
808
|
-
color = colors
|
954
|
+
color = colors.header
|
809
955
|
else
|
810
956
|
#error
|
811
|
-
color = colors
|
957
|
+
color = colors.comment
|
812
958
|
end
|
813
959
|
when /^\*{3} /, /^\*{15} /
|
814
960
|
state = :comment
|
815
961
|
redo
|
816
962
|
when /^\+ /
|
817
|
-
color = colors
|
963
|
+
color = colors.new
|
818
964
|
check = $diff.highlight_whitespace
|
819
965
|
when /^- /
|
820
|
-
color = colors
|
966
|
+
color = colors.old
|
821
967
|
check = $diff.highlight_whitespace
|
822
968
|
when /^! /
|
823
|
-
color = colors
|
969
|
+
color = colors.changed
|
824
970
|
check = $diff.highlight_whitespace
|
825
971
|
when /^ /
|
826
|
-
color = colors
|
972
|
+
color = colors.unchanged
|
827
973
|
else
|
828
974
|
# error
|
829
|
-
color = colors
|
975
|
+
color = colors.comment
|
830
976
|
end
|
831
977
|
if check
|
832
|
-
|
833
|
-
$1 + colors[:off] + colors[:whitespace] + $2
|
834
|
-
}
|
835
|
-
true while line.sub!(/^(. [ \t]*)( +)(\t)/) {
|
836
|
-
$1 + colors[:off] + colors[:whitespace] + $2 + colors[:off] + color + $3
|
837
|
-
}
|
978
|
+
highlight_whitespace_in_context_diff!(line, color)
|
838
979
|
end
|
839
980
|
end
|
840
981
|
end
|
841
982
|
|
842
|
-
line.
|
843
|
-
line.sub!(/$/, colors[:off])
|
844
|
-
|
845
|
-
print line
|
983
|
+
print color, line, colors.off, "\n"
|
846
984
|
}
|
847
985
|
|
848
986
|
io.close
|
849
987
|
end
|
850
988
|
|
989
|
+
def highlight_whitespace_in_context_diff!(line, color)
|
990
|
+
colors = $diff.colors
|
991
|
+
colors.to_whitespace ||= colors.off + colors.whitespace
|
992
|
+
|
993
|
+
line.gsub!(/^(..)|([ \t]+)$|( +)(?=\t)/) {
|
994
|
+
if $1
|
995
|
+
$1
|
996
|
+
elsif $2
|
997
|
+
colors.to_whitespace + $2
|
998
|
+
else
|
999
|
+
colors.to_whitespace + $3 << colors.off << color
|
1000
|
+
end
|
1001
|
+
}
|
1002
|
+
end
|
1003
|
+
|
851
1004
|
def replace_invalid_bytes!(text)
|
852
1005
|
colors = $diff.colors
|
853
1006
|
text.replace(text.replace_invalid_bytes { |byte|
|
854
|
-
'%s<%02X>%s' % [colors
|
1007
|
+
'%s<%02X>%s' % [colors.open_inv, byte, colors.close_inv]
|
855
1008
|
})
|
856
1009
|
end
|
857
1010
|
|
metadata
CHANGED
@@ -1,21 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: di
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Akinori MUSHA
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
|
11
|
+
date: 2013-04-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: diff-lcs
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.2.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.2.2
|
27
|
+
description: |
|
28
|
+
The di(1) command wraps around GNU diff(1) to provide reasonable
|
16
29
|
default settings and some original features.
|
17
|
-
|
18
|
-
'
|
19
30
|
email:
|
20
31
|
- knu@idaemons.org
|
21
32
|
executables:
|
@@ -38,27 +49,26 @@ files:
|
|
38
49
|
- test/test_di.rb
|
39
50
|
homepage: https://github.com/knu/di
|
40
51
|
licenses: []
|
52
|
+
metadata: {}
|
41
53
|
post_install_message:
|
42
54
|
rdoc_options: []
|
43
55
|
require_paths:
|
44
56
|
- lib
|
45
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
-
none: false
|
47
58
|
requirements:
|
48
|
-
- -
|
59
|
+
- - '>='
|
49
60
|
- !ruby/object:Gem::Version
|
50
61
|
version: 1.8.7
|
51
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
63
|
requirements:
|
54
|
-
- -
|
64
|
+
- - '>='
|
55
65
|
- !ruby/object:Gem::Version
|
56
66
|
version: '0'
|
57
67
|
requirements: []
|
58
68
|
rubyforge_project:
|
59
|
-
rubygems_version:
|
69
|
+
rubygems_version: 2.0.3
|
60
70
|
signing_key:
|
61
|
-
specification_version:
|
71
|
+
specification_version: 4
|
62
72
|
summary: A wrapper around GNU diff(1)
|
63
73
|
test_files:
|
64
74
|
- test/helper.rb
|