vcs 0.4.1 → 0.5.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/NEWS +29 -1
- data/SPEC.gemspec +5 -5
- data/SPEC.yml +9 -7
- data/contrib/emacs-support/vcs.el +11 -0
- data/lib/vcs/add.rb +1 -1
- data/lib/vcs/app.rb +4 -3
- data/lib/vcs/back.rb +1 -1
- data/lib/vcs/changelog.rb +18 -2
- data/lib/vcs/common_commit.rb +94 -49
- data/lib/vcs/conflict.rb +12 -8
- data/lib/vcs/cvs.rb +22 -2
- data/lib/vcs/delete.rb +1 -1
- data/lib/vcs/diff.rb +23 -7
- data/lib/vcs/edit.rb +6 -1
- data/lib/vcs/environment.rb +2 -2
- data/lib/vcs/form.rb +87 -47
- data/lib/vcs/ignore.rb +1 -1
- data/lib/vcs/junk.rb +1 -1
- data/lib/vcs/list.rb +5 -5
- data/lib/vcs/mail.rb +30 -17
- data/lib/vcs/message.rb +10 -9
- data/lib/vcs/opt_parse.rb +3 -2
- data/lib/vcs/script.rb +1 -1
- data/lib/vcs/status.rb +40 -16
- data/lib/vcs/svn.rb +8 -0
- data/lib/vcs/url.rb +1 -1
- data/lib/vcs/vcs.rb +130 -58
- data/lib/vcs/version.rb +10 -0
- metadata +69 -68
- data/SPEC.dyn.yml +0 -10
data/lib/vcs/script.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
2
|
# Copyright:: Copyright (c) 2005 LRDE. All rights reserved.
|
3
3
|
# License:: GNU General Public License (GPL).
|
4
|
-
# Revision:: $Id: script.rb
|
4
|
+
# Revision:: $Id: /lrde/tools/trunk/vcs/lib/vcs/script.rb 9102 2005-10-03T00:45:53.019651Z pouill_n $
|
5
5
|
|
6
6
|
require 'vcs/vcs'
|
7
7
|
|
data/lib/vcs/status.rb
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
require 'vcs/svn'
|
7
7
|
|
8
|
-
class
|
8
|
+
class Vcs
|
9
9
|
|
10
10
|
class StatusEntry
|
11
11
|
attr_accessor :line, :file_st, :prop_st, :cpy, :file, :category, :comment
|
@@ -51,24 +51,11 @@ class Svn
|
|
51
51
|
?R => [:MAGENTA],
|
52
52
|
?~ => [:RED],
|
53
53
|
?! => [:RED],
|
54
|
-
?? => [:
|
55
|
-
?C => [:
|
54
|
+
?? => [:BOLD, :RED],
|
55
|
+
?C => [:BOLD, :RED],
|
56
56
|
}
|
57
57
|
end # class StatusEntry
|
58
58
|
|
59
|
-
def status ( *args, &block )
|
60
|
-
return status_(*args) if block.nil?
|
61
|
-
result = PathList.new
|
62
|
-
status_(*args).each_line do |line|
|
63
|
-
next unless line =~ /^.{5} /
|
64
|
-
status_entry = StatusEntry.new(@h, line)
|
65
|
-
next if status_entry.category == :exclude
|
66
|
-
result << status_entry
|
67
|
-
end
|
68
|
-
result.sort_with_regex_list! Vcs.regex_list
|
69
|
-
result.each(&block)
|
70
|
-
end
|
71
|
-
|
72
59
|
def color_status! ( *args )
|
73
60
|
status(*args) do |status_entry|
|
74
61
|
status_entry.colorize!
|
@@ -86,4 +73,41 @@ class Svn
|
|
86
73
|
end
|
87
74
|
end
|
88
75
|
|
76
|
+
def spawn_status_entries ( status_data, &block )
|
77
|
+
result = PathList.new
|
78
|
+
status_data.each_line do |line|
|
79
|
+
next unless line =~ /^.{5} /
|
80
|
+
status_entry = StatusEntry.new(@h, line)
|
81
|
+
next if status_entry.category == :exclude
|
82
|
+
result << status_entry
|
83
|
+
end
|
84
|
+
result.sort_with_regex_list! Vcs.regex_list
|
85
|
+
result.each(&block)
|
86
|
+
end
|
87
|
+
|
88
|
+
end # class Vcs
|
89
|
+
|
90
|
+
|
91
|
+
class Svn
|
92
|
+
|
93
|
+
def status ( *args, &block )
|
94
|
+
return status_(*args) if block.nil?
|
95
|
+
spawn_status_entries(status_(*args), &block)
|
96
|
+
end
|
97
|
+
|
89
98
|
end # class Svn
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
class Cvs
|
103
|
+
|
104
|
+
def status ( files=[], options={}, &block )
|
105
|
+
return status_(*args) if block.nil?
|
106
|
+
opts = options.merge :q => true, :n => true
|
107
|
+
output = update_(files, opts).output.read
|
108
|
+
output.gsub!(/^(\w) (\w)/, '\1 \2')
|
109
|
+
spawn_status_entries(output, &block)
|
110
|
+
end
|
111
|
+
|
112
|
+
end # class Cvs
|
113
|
+
|
data/lib/vcs/svn.rb
CHANGED
@@ -66,4 +66,12 @@ class Svn < Vcs
|
|
66
66
|
--xml
|
67
67
|
"
|
68
68
|
|
69
|
+
@@standard_options ||=
|
70
|
+
%w[ non_recursive username password no_auth_cache
|
71
|
+
non_interactive config_dir ].map { |x| x.to_sym }
|
72
|
+
|
73
|
+
def standard_option? ( option_name )
|
74
|
+
@@standard_options.include? option_name.to_sym
|
75
|
+
end
|
76
|
+
|
69
77
|
end # class Svn
|
data/lib/vcs/url.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
2
|
# Copyright:: Copyright (c) 2004 LRDE. All rights reserved.
|
3
3
|
# License:: GNU General Public License (GPL).
|
4
|
-
# Revision:: $Id: url.rb
|
4
|
+
# Revision:: $Id: /lrde/tools/trunk/vcs/lib/vcs/url.rb 9077 2005-09-26T13:08:22.140977Z pouill_n $
|
5
5
|
|
6
6
|
class Vcs
|
7
7
|
|
data/lib/vcs/vcs.rb
CHANGED
@@ -27,7 +27,7 @@ require 'logger'
|
|
27
27
|
require 'optparse'
|
28
28
|
require 'etc'
|
29
29
|
require 'ostruct'
|
30
|
-
ENV['LC_ALL'] = '
|
30
|
+
ENV['LC_ALL'] = 'en_US'
|
31
31
|
|
32
32
|
unless defined? Vcs
|
33
33
|
|
@@ -44,7 +44,7 @@ unless defined? Vcs
|
|
44
44
|
# checkout_!
|
45
45
|
#
|
46
46
|
class Vcs
|
47
|
-
|
47
|
+
require 'vcs/version'
|
48
48
|
@@user_conf ||= OpenStruct.new(
|
49
49
|
:exclude => [/^-/],
|
50
50
|
:unmask => [/^\\/],
|
@@ -52,7 +52,10 @@ class Vcs
|
|
52
52
|
:precious => [/^(\+|\.vcs)/],
|
53
53
|
:color => :auto,
|
54
54
|
:sorting => [],
|
55
|
-
:sign => true
|
55
|
+
:sign => true,
|
56
|
+
:log_mode => :change_log,
|
57
|
+
:interactive => true,
|
58
|
+
:new_user => true
|
56
59
|
)
|
57
60
|
@@output_io_methods ||= %w[ print puts putc ] # FIXME and so ...
|
58
61
|
@@specific_options ||= Set.new
|
@@ -76,7 +79,6 @@ class Vcs
|
|
76
79
|
@@categories ||= @@user_defined_categories + @@symbol_category.values
|
77
80
|
|
78
81
|
|
79
|
-
cattr_accessor :version
|
80
82
|
cattr_accessor :default
|
81
83
|
cattr_accessor :user_conf
|
82
84
|
cattr_accessor :output_io_methods
|
@@ -85,12 +87,13 @@ class Vcs
|
|
85
87
|
cattr_accessor :user_defined_categories
|
86
88
|
cattr_accessor :symbol_category
|
87
89
|
cattr_accessor :categories
|
90
|
+
cattr_accessor :log_mode
|
88
91
|
class_inheritable_accessor :option_controller
|
89
92
|
|
90
93
|
|
91
94
|
class Logger < ::Logger
|
92
95
|
|
93
|
-
|
96
|
+
attr_reader :color
|
94
97
|
|
95
98
|
def initialize ( *a, &b )
|
96
99
|
super
|
@@ -98,9 +101,14 @@ class Vcs
|
|
98
101
|
@color = false
|
99
102
|
end
|
100
103
|
|
104
|
+
def color= ( aColor )
|
105
|
+
@color = aColor
|
106
|
+
@@headers.clear
|
107
|
+
end
|
108
|
+
|
101
109
|
def header ( progname, severity )
|
102
110
|
@@headers[[progname, severity]] ||= [
|
103
|
-
'
|
111
|
+
'vcs', ': ', progname, severity, ': '
|
104
112
|
].compact.map { |x| stylize x }.join
|
105
113
|
end
|
106
114
|
|
@@ -122,20 +130,20 @@ class Vcs
|
|
122
130
|
end
|
123
131
|
|
124
132
|
@@headers ||= {}
|
125
|
-
|
126
|
-
@@style =
|
133
|
+
@@style ||=
|
127
134
|
{
|
128
|
-
:vcs => [:cyan],
|
129
|
-
:debug => [:magenta],
|
130
|
-
:info => [:green],
|
131
135
|
:warn => [:yellow],
|
132
|
-
:error => [:red],
|
133
|
-
:fatal => [:red, :
|
134
|
-
:'[' => [:blue],
|
135
|
-
:']' => [:blue],
|
136
|
-
:':' => [:red],
|
136
|
+
:error => [:red, :bold],
|
137
|
+
:fatal => [:red, :underline, :bold],
|
137
138
|
}
|
138
139
|
|
140
|
+
def self.enable_xmas_tree_colors
|
141
|
+
@@style.merge! :vcs => [:cyan],
|
142
|
+
:debug => [:magenta],
|
143
|
+
:info => [:green],
|
144
|
+
:': ' => [:blue]
|
145
|
+
end
|
146
|
+
|
139
147
|
def stylize ( aString )
|
140
148
|
aString = aString.downcase
|
141
149
|
if @color
|
@@ -192,44 +200,56 @@ class Vcs
|
|
192
200
|
|
193
201
|
|
194
202
|
class Switch
|
195
|
-
cattr_reader :
|
196
|
-
attr_reader :
|
203
|
+
cattr_reader :aliases
|
204
|
+
attr_reader :main, :aliases, :argument, :comment
|
197
205
|
|
206
|
+
switch = '[\w?-]+'
|
198
207
|
@@re ||=
|
199
208
|
/^
|
200
209
|
\s*
|
201
|
-
|
210
|
+
((?:\*PRE\*)?) # Is the switch must be before
|
211
|
+
# the sub command
|
212
|
+
\s*
|
213
|
+
(#{switch}) # The option (--foo)
|
202
214
|
\s*
|
203
215
|
(?: \(
|
204
|
-
(
|
205
|
-
(?:\sor\s(
|
216
|
+
(#{switch}) # An alias (-f)
|
217
|
+
(?:\sor\s(#{switch}))? # Another one (-f or -o)
|
206
218
|
\)
|
207
219
|
)?
|
208
220
|
\s*
|
209
221
|
(.*?) # An argument (--foo NUM)
|
210
222
|
\s*
|
211
223
|
(?:\{(.*)\})? # A type (--foo NUM {Integer})
|
224
|
+
\s*
|
225
|
+
(?:\(\(.*\)\))? # A comment (--foo ((Usage...)))
|
212
226
|
$/x
|
213
227
|
|
214
228
|
def initialize ( aString )
|
215
229
|
match = @@re.match(aString)
|
216
230
|
raise "Cannot parse switch: `#{aString}'" if match.nil?
|
217
|
-
@
|
231
|
+
@pre = match[1] == '*PRE*'
|
232
|
+
@main = match[2]
|
233
|
+
@argument, @type, @comment = match[5..7]
|
218
234
|
@type = eval(@type) unless @type.nil?
|
219
|
-
@
|
235
|
+
@aliases = match[3..4].compact
|
220
236
|
end
|
221
237
|
|
222
238
|
def to_s
|
223
|
-
|
239
|
+
@main
|
224
240
|
end
|
225
241
|
|
226
242
|
def to_a_for_option_parser
|
227
243
|
argument = (@argument.nil? || @argument.empty?)? '' : ' ' + @argument
|
228
|
-
@
|
244
|
+
@aliases + ["#@main#{argument}", @type].compact
|
229
245
|
end
|
230
246
|
|
231
247
|
def to_sym
|
232
|
-
@
|
248
|
+
@main.gsub(/^-+/, '').gsub('-', '_').sub(/^no_/, '').to_sym
|
249
|
+
end
|
250
|
+
|
251
|
+
def pre?
|
252
|
+
@pre
|
233
253
|
end
|
234
254
|
|
235
255
|
end # class Switch
|
@@ -238,19 +258,22 @@ class Vcs
|
|
238
258
|
|
239
259
|
class OptionController
|
240
260
|
|
241
|
-
attr_reader :switches, :
|
261
|
+
attr_reader :switches, :vcs_name, :option_parser, :options
|
242
262
|
protected :options
|
263
|
+
cattr_accessor :logger
|
264
|
+
self.logger = Vcs.logger
|
243
265
|
|
244
266
|
def initialize ( aVcsClass, aString )
|
245
267
|
Vcs.logger.debug { "Creating an option_controller for #{aVcsClass}..." }
|
246
268
|
@switches = []
|
247
|
-
@
|
269
|
+
@switches_finder = {}
|
248
270
|
aString.each_line do |line|
|
249
271
|
next if line.blank?
|
250
272
|
switch = Switch.new(line)
|
251
273
|
@switches << switch
|
252
|
-
switch.
|
253
|
-
|
274
|
+
@switches_finder[switch.main] = switch
|
275
|
+
switch.aliases.each do |al|
|
276
|
+
@switches_finder[al] = switch
|
254
277
|
end
|
255
278
|
end
|
256
279
|
@option_parser = OptionParser.new do |o|
|
@@ -271,18 +294,22 @@ class Vcs
|
|
271
294
|
[@options, @option_parser.parse(argv)]
|
272
295
|
end
|
273
296
|
|
274
|
-
def
|
275
|
-
@
|
297
|
+
def find ( anObject )
|
298
|
+
@switches_finder[anObject.to_s]
|
276
299
|
end
|
277
300
|
|
278
301
|
def to_strings ( options )
|
279
|
-
|
302
|
+
pre, post = [], []
|
280
303
|
options.each do |k, v|
|
281
|
-
|
282
|
-
|
283
|
-
|
304
|
+
sw = (k.to_s.size == 1)? "-#{k}" : ('--' + k.to_s.gsub('_', '-'))
|
305
|
+
sw.gsub!(/^--/, '--no-') if v == false
|
306
|
+
switch = find sw
|
307
|
+
logger.warn { "Unknown switch: #{sw}" } if switch.nil?
|
308
|
+
result = (switch and switch.pre?)? pre : post
|
309
|
+
result << (switch || sw).to_s
|
310
|
+
result << v.to_s if (v != true) and (v != false)
|
284
311
|
end
|
285
|
-
|
312
|
+
[pre, post]
|
286
313
|
end
|
287
314
|
|
288
315
|
end # class OptionController
|
@@ -294,12 +321,25 @@ class Vcs
|
|
294
321
|
@h = HighLine.new
|
295
322
|
self.cmd_data_factory = VcsCmdDataFactory.new(:output => STDOUT, :error => STDERR)
|
296
323
|
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
324
|
+
unless is_a? Cvs
|
325
|
+
@runner.subscribe_hook(:failure) do |command, data|
|
326
|
+
data = command if data.nil? # Backward compatiblity
|
327
|
+
logger.error { 'command: ' + command.to_s.gsub('"', '') }
|
328
|
+
logger.error { "exit: #{data.status.exitstatus}" }
|
329
|
+
suppress(IOError) do
|
330
|
+
o = data.output.read
|
331
|
+
logger.error { o.gsub!(/^/, 'stdout: ') ; o } unless o.empty?
|
332
|
+
end
|
333
|
+
suppress(IOError) do
|
334
|
+
o = data.error.read
|
335
|
+
logger.error { o.gsub!(/^/, 'stderr: ') ; o } unless o.empty?
|
336
|
+
end
|
337
|
+
# logger.error { 'data: ' + data.to_yaml }
|
338
|
+
if data.output == STDOUT
|
339
|
+
exit((data.status)? data.status.exitstatus : 1)
|
340
|
+
else
|
341
|
+
raise 'command failed'
|
342
|
+
end
|
303
343
|
end
|
304
344
|
end
|
305
345
|
@runner.subscribe_hook(:display_command) do |cmd|
|
@@ -378,12 +418,12 @@ class Vcs
|
|
378
418
|
|
379
419
|
def run! ( command, files=[], options={} )
|
380
420
|
flush
|
381
|
-
cmd_options = option_controller.to_strings(options)
|
382
|
-
(@cmd + command + cmd_options + '--' + files).run(@runner)
|
421
|
+
pre_cmd_options, cmd_options = option_controller.to_strings(options)
|
422
|
+
(@cmd + pre_cmd_options + command + cmd_options + '--' + files).run(@runner)
|
383
423
|
end
|
384
424
|
|
385
|
-
def sub_vcs ( out, err, &block )
|
386
|
-
copy = self.class.new(@cmd)
|
425
|
+
def sub_vcs ( out, err, vcs_class=nil, &block )
|
426
|
+
copy = (vcs_class || self.class).new(@cmd)
|
387
427
|
copy.cmd_data_factory = VcsCmdDataFactory.new(:output => out, :error => err)
|
388
428
|
if block.nil?
|
389
429
|
copy
|
@@ -392,13 +432,14 @@ class Vcs
|
|
392
432
|
end
|
393
433
|
end
|
394
434
|
|
395
|
-
def sub_vcs_with_name ( name, &block )
|
396
|
-
sub_vcs(TempPath.new("#{name}-out"), TempPath.new("#{name}-err"),
|
435
|
+
def sub_vcs_with_name ( name, vcs_class=nil, &block )
|
436
|
+
sub_vcs(TempPath.new("#{name}-out"), TempPath.new("#{name}-err"),
|
437
|
+
vcs_class, &block)
|
397
438
|
end
|
398
439
|
|
399
|
-
def with ( io, &block )
|
440
|
+
def with ( io, vcs_class=nil, &block )
|
400
441
|
io.flush if io.respond_to? :flush
|
401
|
-
sub_vcs(io, io, &block)
|
442
|
+
sub_vcs(io, io, vcs_class, &block)
|
402
443
|
end
|
403
444
|
|
404
445
|
def output
|
@@ -416,8 +457,10 @@ class Vcs
|
|
416
457
|
def run_missing! ( name, orig, *args )
|
417
458
|
if name =~ /^(.*)_$/
|
418
459
|
run!($1, *args)
|
460
|
+
elsif name =~ /^--/
|
461
|
+
run!(name, *args)
|
419
462
|
else
|
420
|
-
logger.warn { "
|
463
|
+
logger.warn { "Unknown command: '#{orig.gsub('!', '')}'" }
|
421
464
|
run!(name, *args)
|
422
465
|
end
|
423
466
|
end
|
@@ -425,9 +468,17 @@ class Vcs
|
|
425
468
|
|
426
469
|
def run_argv ( argv )
|
427
470
|
options, files = option_controller.parse(argv)
|
428
|
-
if
|
429
|
-
options.delete(:help)
|
471
|
+
if options[:help]
|
430
472
|
meth = :help!
|
473
|
+
options.delete(:help)
|
474
|
+
elsif files.empty?
|
475
|
+
if options[:version]
|
476
|
+
meth = '--version'
|
477
|
+
options.delete(:version)
|
478
|
+
else
|
479
|
+
options.delete(:help)
|
480
|
+
meth = :help!
|
481
|
+
end
|
431
482
|
else
|
432
483
|
meth = files.shift.dup
|
433
484
|
meth.sub!(/([^!])$/, '\1!') if meth != 'script'
|
@@ -478,10 +529,10 @@ class Vcs
|
|
478
529
|
return path.read
|
479
530
|
end
|
480
531
|
begin
|
481
|
-
logger.info "Creating a new `#{path}' file
|
532
|
+
logger.info "Creating a new `#{path}' file..."
|
482
533
|
path.open('w') { |f| result = with(f, &block) }
|
483
534
|
rescue Exception => ex
|
484
|
-
logger.error "Removing `#{path}'
|
535
|
+
logger.error "Removing `#{path}'..."
|
485
536
|
path.unlink
|
486
537
|
raise ex
|
487
538
|
end
|
@@ -536,6 +587,18 @@ class Vcs
|
|
536
587
|
end
|
537
588
|
end
|
538
589
|
|
590
|
+
def standard_option? ( option_name )
|
591
|
+
false
|
592
|
+
end
|
593
|
+
|
594
|
+
def just_standard_options ( options )
|
595
|
+
result = {}
|
596
|
+
options.each do |k, v|
|
597
|
+
result[k] = v if standard_option? k
|
598
|
+
end
|
599
|
+
result
|
600
|
+
end
|
601
|
+
|
539
602
|
CL = Pathname.new('ChangeLog') unless defined? CL
|
540
603
|
TMP_CL = Pathname.new(',,ChangeLog') unless defined? TMP_CL
|
541
604
|
|
@@ -598,7 +661,7 @@ class Vcs
|
|
598
661
|
class << self
|
599
662
|
|
600
663
|
def add_conf_checker ( meth=nil, &block )
|
601
|
-
@@checkers << (block.nil?)? meth : block
|
664
|
+
@@checkers << ((block.nil?)? meth : block)
|
602
665
|
end
|
603
666
|
|
604
667
|
def user_conf_match ( sym, file )
|
@@ -624,12 +687,21 @@ class Vcs
|
|
624
687
|
def color? ( &auto_block )
|
625
688
|
case color = Vcs.user_conf.color
|
626
689
|
when :never then return false
|
627
|
-
when :auto
|
690
|
+
when :auto, :xmas_tree
|
691
|
+
return (auto_block.nil?)? false : auto_block[]
|
628
692
|
when :always then return true
|
629
693
|
else raise ArgumentError, "Bad value for `color' (#{color})"
|
630
694
|
end
|
631
695
|
end
|
632
696
|
|
697
|
+
def interactive?
|
698
|
+
user_conf.interactive
|
699
|
+
end
|
700
|
+
|
701
|
+
def xmas_tree_colors?
|
702
|
+
Vcs.user_conf.color == :xmas_tree
|
703
|
+
end
|
704
|
+
|
633
705
|
def regex_list
|
634
706
|
@@regex_list ||= RegexList.new(user_conf.sorting)
|
635
707
|
end
|