forked from trogdoro/xiki
-
Notifications
You must be signed in to change notification settings - Fork 0
/
diff_log.rb
161 lines (127 loc) · 3.72 KB
/
diff_log.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
require 'hide'
# Will store a diff each time a file is saved.
class DiffLog
extend ElMixin
@@log = File.expand_path("~/.emacs.d/difflog.notes")
@@temp_path = elvar.temporary_file_directory + "latest-diff.txt"
# Open file having difflog
def self.open
View.to_after_bar if View.in_bar?
# If open, just switch to it and revert
if View.buffer_open?("difflog.notes")
View.to_buffer("difflog.notes")
revert_buffer true, true, true
else # Otherwise, open it
View.open(@@log)
end
View.to_bottom
Line.previous
Line.to_words
recenter -4
end
def self.diffs path=nil
if path == nil
match_tree = "^- "
else
path = Bookmarks[path]
match_tree = File.directory?(path) ? # If it's a dir
"^- #{path}" :
"^- #{File.dirname path}/\n - #{File.basename path}\n"
end
txt = File.read @@log
txt = txt.sub(/\A- /, '').split(/^- /).reverse.uniq
if File.file? path # File
regex = /^#{Regexp.escape File.dirname path}\/\n - #{Regexp.escape File.basename path}/
else # Dir
regex = /^#{Regexp.escape path}/
path = "#{path}/" if path !~ /\/$/
end
txt = txt.select{|o| o =~ regex}
"- @#{txt.join("- @")}"
end
# Insert old text deleted during last save
def self.last_diff
with(:save_window_excursion) do
DiffLog.open
Search.backward "^-"
txt = View.txt View.cursor, View.bottom
end
end
def self.enter_old
diff = DiffLog.last_diff
diff.gsub! /^ *[+:-].*\n/, "" # Only leave red and green lines
diff.gsub! /^ +\|\+.*\n/, ""
diff.gsub! /^ +\|\-/, ""
View.insert diff
end
# Insert new text added during last save
def self.enter_new
diff = DiffLog.last_diff
diff.gsub! /^ *[+:-].*\n/, "" # Only leave red and green lines
diff.gsub! /^ +\|\-.*\n/, ""
diff.gsub! /^ +\|\+/, ""
View.insert diff
end
# Appends diff to difflog, then saves. Mapped to as_file.
def self.save
return if View.file_name == "difflog.notes"
self.save_diffs
$el.save_buffer
prefix = Keys.prefix
if prefix == :u
sleep(0.3)
Firefox.reload
elsif prefix == 9
Launcher.do_last_launch
end
end
def self.format raw
path, file = raw.match(/--- (.+\/)(.+?)\t/)[1..2]
# Delete paths at top
raw.sub!(/.+\n.+\n/, '')
# Make @@... lines into lines having numbers
raw.gsub!(/^@@ -(\d+).* \+(\d+).+@@$/) {
a, b = $1.to_i, $2.to_i
highest = a > b ? a : b
" :#{highest}"
}
# Make - and + lines into -| and +| lines
raw.gsub!(/^\+(.*)/, " |+\\1")
raw.gsub!(/^-(.*)/, " |-\\1")
# Return with path
"- #{path}\n" +
" - #{file}\n" +
raw
end
def self.compare_with_saved
diff = self.save_diffs :dont_save=>1
diff = "" if diff.nil?
View.to_buffer("*diff with saved*")
View.clear
$el.notes_mode
View.insert diff.count("\n") > 2 ?
diff :
"> Note\n- No Differences!\n"
end
def self.enter_from_difflog
Location.as_spot
View.to_after_bar if View.in_bar?
DiffLog.open
isearch_backward
end
# Util function used by public functions
def self.save_diffs options={}
if options[:patha] && options[:textb]
patha = options[:patha]
File.open(@@temp_path, "w") { |f| f << options[:textb] }
else
patha = View.file
$el.write_region nil, nil, @@temp_path
end
diff = Console.sync "diff -w -U 0 \"#{patha}\" \"#{@@temp_path}\""
return if diff.empty? || diff =~ /: No such file or directory\n/ # Fail quietly if file didn't exist
diff = self.format diff
return diff if options[:dont_save]
File.open(@@log, "a") { |f| f << diff } unless diff.count("\n") <= 2
end
end