vcs 0.3.0 → 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.
- data/NEWS +112 -0
- data/NEWS.FR +90 -0
- data/SPEC.dyn.yml +5 -5
- data/SPEC.gemspec +4 -4
- data/SPEC.yml +5 -1
- data/bin/vcs +6 -161
- data/bin/vcs-cvs +6 -7
- data/bin/vcs-prcs +6 -7
- data/bin/vcs-svn +6 -7
- data/lib/vcs/add.rb +21 -0
- data/lib/vcs/app.rb +129 -0
- data/lib/vcs/back.rb +36 -0
- data/lib/vcs/changelog.rb +68 -123
- data/lib/vcs/common_commit.rb +110 -0
- data/lib/vcs/conflict.rb +9 -3
- data/lib/vcs/cvs.rb +4 -7
- data/lib/vcs/delete.rb +21 -0
- data/lib/vcs/diff.rb +29 -9
- data/lib/vcs/diffstat.rb +3 -3
- data/lib/vcs/edit.rb +4 -5
- data/lib/vcs/environment.rb +59 -0
- data/lib/vcs/form.rb +97 -0
- data/lib/vcs/ignore.rb +26 -0
- data/lib/vcs/junk.rb +26 -0
- data/lib/vcs/last_changed_date.rb +7 -9
- data/lib/vcs/list.rb +71 -0
- data/lib/vcs/mail.rb +25 -20
- data/lib/vcs/message.rb +32 -62
- data/lib/vcs/news.rb +9 -10
- data/lib/vcs/opt_parse.rb +82 -0
- data/lib/vcs/revision.rb +1 -1
- data/lib/vcs/script.rb +12 -6
- data/lib/vcs/status.rb +77 -5
- data/lib/vcs/svn.rb +53 -13
- data/lib/vcs/url.rb +4 -8
- data/lib/vcs/vcs.rb +443 -58
- metadata +16 -7
- data/lib/vcs/mycommit.rb +0 -90
data/lib/vcs/junk.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
|
2
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
3
|
+
# License:: Gnu General Public License.
|
4
|
+
# Revision:: $Id: junk.rb 257 2005-09-30 16:43:57Z pouill_n $
|
5
|
+
|
6
|
+
|
7
|
+
class Vcs
|
8
|
+
|
9
|
+
# This command removes all junk files (by default all files begining with `,').
|
10
|
+
# Warning: this command removes some files that may contains some important
|
11
|
+
# information. For example during a commit the information that you type is
|
12
|
+
# stored in one of these `,files'. So be careful using this command.
|
13
|
+
# See the user configuration to customize what is considered a junk file.
|
14
|
+
def junk! ( files=[], options={} )
|
15
|
+
list!(files, options.merge(:junk => true)) do |path_list|
|
16
|
+
path_list.each { |path| logger.info { "Remove #{path}" } }
|
17
|
+
if @h.agree('Are you sure? (y/n)', true)
|
18
|
+
path_list.each do |path|
|
19
|
+
logger.info { "Removing #{path}..." }
|
20
|
+
path.rm_f
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end # class Vcs
|
@@ -1,16 +1,14 @@
|
|
1
|
-
# Author::
|
2
|
-
# Copyright:: Copyright (c) 2004 LRDE. All rights reserved.
|
3
|
-
# License::
|
4
|
-
# $Id$
|
1
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
|
+
# Copyright:: Copyright (c) 2004, 2005 LRDE. All rights reserved.
|
3
|
+
# License:: GNU General Public License (GPL).
|
4
|
+
# Revision:: $Id$
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
class Svn
|
6
|
+
class Vcs
|
9
7
|
|
10
8
|
def last_changed_date! ( *args )
|
11
|
-
puts info.read[/^Last Changed Date:.*?\(([^)]*)\).*$/, 1]
|
9
|
+
puts info(*args).read[/^Last Changed Date:.*?\(([^)]*)\).*$/, 1]
|
12
10
|
end
|
13
11
|
|
14
12
|
alias_command :date, :last_changed_date
|
15
13
|
|
16
|
-
end # class
|
14
|
+
end # class Vcs
|
data/lib/vcs/list.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
|
+
# Copyright:: Copyright (c) 2005 LRDE. All rights reserved.
|
3
|
+
# License:: Gnu General Public License.
|
4
|
+
# Revision:: $Id: list.rb 264 2005-10-03 12:32:51Z pouill_n $
|
5
|
+
|
6
|
+
require 'vcs/svn'
|
7
|
+
|
8
|
+
class Svn
|
9
|
+
|
10
|
+
specific_options << '--do ACTION'
|
11
|
+
Vcs.categories.each do |name|
|
12
|
+
specific_options << "--#{name}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def list! ( files=[], options={}, &block )
|
16
|
+
if options.has_key?(:do) or block \
|
17
|
+
or Vcs.categories.any? { |cat| options.has_key?(cat) }
|
18
|
+
|
19
|
+
action = options[:do]
|
20
|
+
options.delete(:do)
|
21
|
+
categories = []
|
22
|
+
Vcs.categories.each do |cat|
|
23
|
+
if options.has_key? cat
|
24
|
+
categories << cat
|
25
|
+
options.delete(cat)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
inside_versioned = []
|
29
|
+
outside_versioned = []
|
30
|
+
if categories.empty?
|
31
|
+
list_(files, options).output.read.each do |line|
|
32
|
+
inside_versioned << line.chomp
|
33
|
+
end
|
34
|
+
else
|
35
|
+
files << '.' if files.empty?
|
36
|
+
files.each do |file|
|
37
|
+
file.to_path.find do |path|
|
38
|
+
Find.prune if path.to_s =~ /(\/|^)\.svn$/
|
39
|
+
if path.directory?
|
40
|
+
if (path/'.svn').exist?
|
41
|
+
inside_versioned << path
|
42
|
+
else
|
43
|
+
outside_versioned << path
|
44
|
+
Find.prune
|
45
|
+
end
|
46
|
+
else
|
47
|
+
outside_versioned << path
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
path_list = PathList.new
|
53
|
+
status(inside_versioned) do |se|
|
54
|
+
path_list << se.file if categories.include? se.category
|
55
|
+
end
|
56
|
+
outside_versioned.each do |path|
|
57
|
+
path_list << path if categories.include? Vcs.classify(path)
|
58
|
+
end
|
59
|
+
if action
|
60
|
+
system "#{action} #{path_list}"
|
61
|
+
elsif block
|
62
|
+
block[path_list]
|
63
|
+
else
|
64
|
+
puts path_list
|
65
|
+
end
|
66
|
+
else
|
67
|
+
list_!(files, options)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end # class Svn
|
data/lib/vcs/mail.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
|
-
# Copyright:: Copyright (c) 2004 LRDE. All rights reserved.
|
2
|
+
# Copyright:: Copyright (c) 2004, 2005 LRDE. All rights reserved.
|
3
3
|
# License:: GNU General Public License (GPL).
|
4
4
|
# Revision:: $Id: header 98 2004-09-29 12:07:43Z ertai $
|
5
5
|
|
@@ -8,41 +8,46 @@ require 'sendmail'
|
|
8
8
|
|
9
9
|
class Vcs
|
10
10
|
|
11
|
-
MAIL = Sendmail::MAIL_FILE
|
12
|
-
|
13
|
-
|
11
|
+
MAIL = Sendmail::MAIL_FILE unless defined? MAIL
|
12
|
+
@@mailer ||= Sendmail.new
|
13
|
+
@@default_options ||= { :confirm => true, :mime => true,
|
14
|
+
:header => "X-Mailer: Vcs.mail (#{Vcs.version})" }
|
14
15
|
|
15
16
|
#
|
16
17
|
# Mail.
|
17
18
|
#
|
18
|
-
|
19
|
+
# FIXME handle options properly.
|
20
|
+
# Delegate the option parsing to Sendmail.
|
21
|
+
def mail! ( files=[], options={} )
|
22
|
+
|
23
|
+
# Backward compatiblity
|
24
|
+
files, options = [], files if files.is_a? Hash
|
25
|
+
|
19
26
|
error_handling :mail_failed
|
20
27
|
unless MAIL.exist?
|
21
|
-
|
28
|
+
options = @@default_options.merge(options)
|
29
|
+
options[:signed] = Vcs.user_conf.sign
|
30
|
+
print_body(MAIL, @@mailer.parse_mail_options(options), files)
|
22
31
|
end
|
23
|
-
|
24
|
-
MAIL.delete
|
32
|
+
@@mailer.sendmail
|
25
33
|
puts 'Mail: Sent.'
|
26
34
|
end
|
27
35
|
|
28
36
|
def mail_failed
|
29
|
-
if defined?
|
30
|
-
|
31
|
-
|
37
|
+
if defined? @@mail and @@mail.exist?
|
38
|
+
logger.info { "#{MAIL}: Contains the generated mail" }
|
39
|
+
logger.info { " AND information to send it (smtpserver, port...)" }
|
32
40
|
end
|
33
41
|
end
|
34
42
|
|
35
43
|
def mail_conf_checker
|
36
|
-
|
37
|
-
|
38
|
-
|
44
|
+
if Vcs.user_conf.sign
|
45
|
+
unless `gpg --version` =~ /^gpg \(GnuPG\)/
|
46
|
+
logger.error 'mail: gunpg is required'
|
47
|
+
end
|
48
|
+
unless File.exist?("#{ENV['HOME']}/.gnupg/secring.gpg")
|
49
|
+
logger.error 'no private key: in your ~/.gnupg'
|
39
50
|
end
|
40
|
-
end
|
41
|
-
unless `gpg --version` =~ /^gpg \(GnuPG\)/
|
42
|
-
LOG.error 'command not found: gpg'
|
43
|
-
end
|
44
|
-
unless File.exist?("#{ENV['HOME']}/.gnupg/secring.gpg")
|
45
|
-
LOG.error 'no private key: in your ~/.gnupg'
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
data/lib/vcs/message.rb
CHANGED
@@ -1,79 +1,49 @@
|
|
1
|
-
# Author::
|
2
|
-
# Copyright:: Copyright (c) 2004 LRDE. All rights reserved.
|
3
|
-
# License::
|
4
|
-
|
5
|
-
# $LastChangedBy: ertai $
|
6
|
-
# $Id: header 98 2004-09-29 12:07:43Z ertai $
|
7
|
-
|
8
|
-
require 'vcs/vcs'
|
9
|
-
require 'vcs/changelog'
|
10
|
-
|
11
|
-
class Vcs
|
12
|
-
def diffw! ( *args )
|
13
|
-
diff!(*args)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Svn
|
18
|
-
def diffw! ( *args )
|
19
|
-
diff! '--diff-cmd', 'diff', '-x', '-NPbuw', *args
|
20
|
-
end
|
21
|
-
end
|
1
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
|
+
# Copyright:: Copyright (c) 2004, 2005 LRDE. All rights reserved.
|
3
|
+
# License:: GNU General Public License (GPL).
|
4
|
+
# Revision:: $Id: header 98 2004-09-29 12:07:43Z ertai $
|
22
5
|
|
23
6
|
class Vcs
|
24
7
|
|
25
|
-
|
26
|
-
|
27
|
-
def print_body ( file, options )
|
28
|
-
LOG.info "Creating a new `#{file}' file"
|
8
|
+
def print_body ( file, options, files=[] )
|
9
|
+
logger.info "Creating a new `#{file}' file"
|
29
10
|
file.open('w') do |f|
|
30
|
-
f.puts
|
11
|
+
f.puts '---'
|
12
|
+
f.puts options.to_yaml.gsub(/---\s*/, '')
|
31
13
|
f.puts '---'
|
32
14
|
f.puts
|
33
|
-
f.
|
15
|
+
with(f).mk_message!(files)
|
34
16
|
end
|
35
17
|
end
|
36
18
|
private :print_body
|
37
19
|
|
38
|
-
def message ( *args )
|
39
|
-
error_handling :message_failed
|
40
20
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
64
|
-
tmp.mv(@@message)
|
21
|
+
def mk_message! ( files=[], options={} )
|
22
|
+
with_cache! Message, 'generated message (ChangeLog, diffstat, diff)' do
|
23
|
+
url!
|
24
|
+
if defined? COLLABOA
|
25
|
+
puts
|
26
|
+
puts 'You can also view this changeset here:'
|
27
|
+
puts
|
28
|
+
next_rev = rev.output.read.to_i
|
29
|
+
next_rev += 1 unless commited?
|
30
|
+
puts "http://#{COLLABOA}/repository/changesets/#{next_rev}"
|
31
|
+
end
|
32
|
+
puts
|
33
|
+
flush
|
34
|
+
mk_message_entry!(files)
|
35
|
+
puts
|
36
|
+
flush
|
37
|
+
diffstat!(files)
|
38
|
+
puts
|
39
|
+
flush
|
40
|
+
diffw(files).each_line do |line|
|
41
|
+
print line if line !~ /^=+$/
|
65
42
|
end
|
66
43
|
end
|
67
|
-
@@message.open('r')
|
68
44
|
end
|
45
|
+
alias_command :msg, :mk_message
|
46
|
+
Message = ',message'.to_path unless defined? Message
|
69
47
|
|
70
|
-
alias_command :msg, :message
|
71
|
-
|
72
|
-
def message_failed
|
73
|
-
if @@message.exist?
|
74
|
-
LOG.info "#{@@message}: Contains the generated message"
|
75
|
-
LOG.info ' (the ChangeLog entry, the diffstat, the diff)'
|
76
|
-
end
|
77
|
-
end
|
78
48
|
|
79
49
|
end # class Vcs
|
data/lib/vcs/news.rb
CHANGED
@@ -5,20 +5,19 @@
|
|
5
5
|
# $LastChangedBy: ertai $
|
6
6
|
# $Id: header 98 2004-09-29 12:07:43Z ertai $
|
7
7
|
|
8
|
-
require 'vcs/tools'
|
9
8
|
require 'vcs/message'
|
10
9
|
|
11
10
|
class Vcs
|
12
11
|
|
13
|
-
NEWS =
|
12
|
+
NEWS = ',news'.to_path unless defined? NEWS
|
14
13
|
|
15
14
|
def parse_news_options ( *args )
|
16
15
|
require 'optparse'
|
17
16
|
result =
|
18
17
|
{
|
19
|
-
:from =>
|
18
|
+
:from => Vcs.full_email,
|
20
19
|
:groups => [],
|
21
|
-
:server =>
|
20
|
+
:server => Vcs.nntpserver,
|
22
21
|
}
|
23
22
|
if !args.nil? and !args.empty? and args[0].is_a?(Hash)
|
24
23
|
return result.merge!(args[0])
|
@@ -48,9 +47,9 @@ class Vcs
|
|
48
47
|
|
49
48
|
def check_line ( anIO, aRegex )
|
50
49
|
line = anIO.readline.chomp!
|
51
|
-
|
50
|
+
logger.debug('news') { "Server: #{line}" }
|
52
51
|
unless line =~ aRegex
|
53
|
-
|
52
|
+
logger.error('news') { "Bad answer: #{line}" }
|
54
53
|
@news_status = 'Error.'
|
55
54
|
end
|
56
55
|
end
|
@@ -69,11 +68,11 @@ class Vcs
|
|
69
68
|
opt = YAML::chop_header(file)
|
70
69
|
server, port = opt[:server].split(/:/)
|
71
70
|
port ||= 119
|
72
|
-
|
71
|
+
logger.info('news') { "Nntp Server: #{server}:#{port}" }
|
73
72
|
unless @h.agree("Post a news, with this subject: #{opt[:subject]}\n" +
|
74
73
|
" to #{opt[:groups].join(', ')}\n from #{opt[:from]}\n" +
|
75
74
|
'Are you sure? (y/n)', true)
|
76
|
-
|
75
|
+
logger.error('news') { 'Aborting' }
|
77
76
|
exit
|
78
77
|
end
|
79
78
|
require 'socket'
|
@@ -100,7 +99,7 @@ class Vcs
|
|
100
99
|
|
101
100
|
def news_failed
|
102
101
|
if defined? NEWS and NEWS.exist?
|
103
|
-
|
102
|
+
logger.info "#{NEWS}: Contains the generated news" +
|
104
103
|
"(generated from #{@@message})"
|
105
104
|
end
|
106
105
|
end
|
@@ -108,7 +107,7 @@ class Vcs
|
|
108
107
|
def news_conf_checker
|
109
108
|
%w[ NNTPSERVER ].each do |var|
|
110
109
|
if ENV[var].nil? or ENV[var].empty?
|
111
|
-
|
110
|
+
logger.error "environment variable `#{var}' not set"
|
112
111
|
end
|
113
112
|
end
|
114
113
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
2
|
+
# Copyright:: Copyright (c) 2005 LRDE. All rights reserved.
|
3
|
+
# License:: GNU General Public License (GPL).
|
4
|
+
# Revision:: $Id: opt_parse.rb 242 2005-09-28 14:19:47Z pouill_n $
|
5
|
+
|
6
|
+
|
7
|
+
class Vcs
|
8
|
+
|
9
|
+
class OptParse
|
10
|
+
|
11
|
+
attr_reader :option_parser
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@option_parser = @@option_parser.dup
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse! ( argv )
|
18
|
+
@option_parser.parse! argv
|
19
|
+
end
|
20
|
+
|
21
|
+
def parse ( argv )
|
22
|
+
@option_parser.parse argv
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
@option_parser.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
@@option_parser = OptionParser.new do |o|
|
30
|
+
|
31
|
+
o.banner = "Usage: vcs [options] <file>*"
|
32
|
+
o.separator ''
|
33
|
+
|
34
|
+
o.on('-c', '--vcs TYPE', VcsApp.all_vcs, 'Set your vcs') do |aVcs|
|
35
|
+
Vcs.default = aVcs
|
36
|
+
end
|
37
|
+
|
38
|
+
o.on('-l', '--vcs-list', 'List all vcs') do |aVcs|
|
39
|
+
STDERR.puts 'Vcs list:'
|
40
|
+
VcsApp.all_vcs.each { |n| STDERR.puts " - #{n}" }
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
|
44
|
+
o.on('--mk-alias', 'Put the result of this command in your .zshrc or .bashrc') do
|
45
|
+
VcsApp.all_vcs.each do |n|
|
46
|
+
n = n.to_s.downcase
|
47
|
+
if VcsApp.path.executable?
|
48
|
+
puts "alias #{n}=#{VcsApp.path}-#{n} ;"
|
49
|
+
else
|
50
|
+
puts "alias #{n}=vcs-#{n} ;"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
|
56
|
+
o.on('-C', '--[no-]check', 'Check your vcs configuration') do |check|
|
57
|
+
if check
|
58
|
+
Vcs.new('vcs').call_conf_checkers
|
59
|
+
exit
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
o.on('-d', '--debug LEVEL', 'Set debug level') do |severity|
|
64
|
+
logger.level = Logger.const_get(severity.upcase)
|
65
|
+
end
|
66
|
+
|
67
|
+
o.on_tail('-h', '--help', 'Show this message') do |test|
|
68
|
+
STDERR.puts o
|
69
|
+
STDERR.puts "\n\nReport bugs to <ertai@lrde.epita.fr>."
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
|
73
|
+
o.on_tail('--version', 'Show version') do
|
74
|
+
STDOUT.puts "Vcs version: #{Vcs.version}"
|
75
|
+
exit
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end # class OptParse
|
81
|
+
|
82
|
+
end # class Vcs
|