madx-ruacce 1.0.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/README ADDED
@@ -0,0 +1,68 @@
1
+
2
+ ruacce -- the repository updater and custom command executer
3
+
4
+ -------------------------------------------------------------------------------
5
+
6
+ ruacce (pronounced "lu-ah-tché") is a small command line tool that helps you
7
+ with managing the repositories
8
+ you're tracking. You can also define rules that performs some actions on your
9
+ repositories (like building gems, running (R|M)akefiles,...)
10
+
11
+ ruacce is scm-agnostic so you can mix Git, Mercurial or Subversion repositories
12
+ without any worry.
13
+
14
+ ** Install **
15
+
16
+ $ sudo gem install madx-ruacce --source=http://gems.github.com/
17
+ or
18
+ $ cd your/repos/folder/
19
+ $ git clone git://github.com/madx/ruacce.git
20
+ $ cd ruacce; rake
21
+ And a fresh gem will be placed in the pkg/ folder
22
+
23
+ ** Usage **
24
+
25
+ First, run ruacce --help.
26
+ Then, cd to the folder where you keep your repos and run ruacce -C to generate
27
+ a blank config file (.ruacce_rules, created in the current folder)
28
+
29
+ Ok let's say you've got those awesome repositories in your folder:
30
+
31
+ shoes, merb-core, merb-more, dm-core, dm-more, haml and mtest (managed by git)
32
+ trac, lighttpd (managed by svn)
33
+ audacious (tracked by mercurial)
34
+
35
+ That's a big bunch of repositories, and when you want to update them all you
36
+ have to manually cd in the folder an run the appropriate command.
37
+ But wait. No. You just installed ruacce !!!
38
+
39
+ The first thing you may want to do is defining a command to fetch the latest
40
+ changes on you repos.
41
+ It's "git/hg pull" for Git and Mercurial and "svn update" for Subversion.
42
+
43
+ So for defining the actions for git repositories you could do a :
44
+ $ ruacce -s shoes,merb-more,merb-core,dm-core,dm-more,haml,mtest -A pull
45
+
46
+ This will add a rule "pull" for those repos. The system will ask you for the
47
+ command to be run when executing this rule. Type "git pull" and push Enter.
48
+ Since you've grasped how it works, you already added rules for your Mercurial
49
+ and Subversion repositories.
50
+
51
+ The important thing is that -s selects repositories, and the action will be
52
+ executed upon each of them.
53
+
54
+ You can show the rules defined on some projects using -R and selecting them
55
+ with -s
56
+
57
+ The -X switch is used to hide some folders from ruacce so it doesn't count them
58
+ as repositories.
59
+
60
+ Well, I think this should be enough to start, the --help switch will tell you
61
+ the rest.
62
+
63
+ ** Bug reports/testimonials **
64
+
65
+ Feel free to send them on github (http://github.com/madx/ruacce) or drop me an
66
+ email. I also accept patches :)
67
+ If you're using ruacce and want to be in this README, write a funny testimonial
68
+ and email it to me.
@@ -0,0 +1,12 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/gempackagetask'
4
+
5
+ RUACCE_GEMSPEC = eval(File.read('ruacce.gemspec'))
6
+
7
+ Rake::GemPackageTask.new(RUACCE_GEMSPEC) do |pkg|
8
+ pkg.need_tar_bz2 = true
9
+ end
10
+ task :default => "pkg/#{RUACCE_GEMSPEC.name}-#{RUACCE_GEMSPEC.version}.gem" do
11
+ puts "generated latest version"
12
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) + '/../lib/ruacce'
4
+
5
+ Ruacce::ArgvParser.parse(ARGV)
@@ -0,0 +1,32 @@
1
+ require 'yaml'
2
+ require 'optparse'
3
+ require 'ostruct'
4
+ require 'fileutils'
5
+
6
+ dir = File.dirname(__FILE__)
7
+ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
8
+
9
+ require 'ruacce/argv_parser'
10
+ require 'ruacce/config'
11
+ require 'ruacce/repository'
12
+
13
+ module Ruacce
14
+ RULES_FILE = '.ruacce_rules'
15
+
16
+ module Formats
17
+ def self.included(parent)
18
+ { :o => "33", :p => "35", :g => "32", :r => "1;31", :w => "1;37"}.
19
+ each do |meth, color|
20
+ parent.class_eval { define_method(meth) { "\e[#{color}m#{self}\e[00m" } }
21
+ end
22
+ parent.class_eval do
23
+ define_method(:i) do
24
+ self.ljust(78).split("\n").collect{|l| " #{l}"}.join("\n")
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ String.send(:include, Formats)
31
+
32
+ end
@@ -0,0 +1,146 @@
1
+ module Ruacce
2
+ class ArgvParser
3
+
4
+ def self.parse(args)
5
+ options = OpenStruct.new
6
+ options.repositories = []
7
+ options.quiet = false
8
+
9
+ opts = OptionParser.new do |opts|
10
+ opts.banner = "Usage: ruacce [options] repos"
11
+
12
+ opts.separator ""
13
+ opts.separator "Specific options:"
14
+
15
+ opts.on('-s', '--select [REPO]', 'Select repository REPO') do |repo|
16
+ repo.split(',').each do |r|
17
+ options.repositories << Repository.new(r)
18
+ end
19
+ end
20
+
21
+ opts.on('-a', '--all', 'Select every repository') do
22
+ Repository.repos.each do |repo|
23
+ options.repositories << Repository.new(repo)
24
+ end
25
+ end
26
+
27
+ opts.on('-r', '--rule [RULE]', 'Execute RULE on each selected repo') do |rule|
28
+ rule = rule.to_sym
29
+ options.repositories.each do |repo|
30
+ puts "> #{repo.name}".w unless options.quiet
31
+ if repo.rules.is_a?(Hash) && repo.rules.key?(rule)
32
+ FileUtils.cd(repo.name) do
33
+ system repo.rules[rule]
34
+ end
35
+ else
36
+ puts " Warning: repository #{repo.name} has no rule #{rule}".p unless options.quiet
37
+ end
38
+ end
39
+ end
40
+
41
+ opts.on('-q', '--quiet', 'Disables output when executing rules, nice for using ruacce as a rule') do
42
+ options.quiet = true
43
+ end
44
+
45
+ opts.on('-R', '--rules', 'See available rules for the selected repos') do
46
+ unless options.repositories.empty?
47
+ options.repositories.each do |repo|
48
+ puts "> #{repo.name}".w
49
+ unless repo.rules.nil?
50
+ repo.rules.each do |name, command|
51
+ puts " #{name.to_s.o}: #{command}"
52
+ end
53
+ else
54
+ puts " no rules defined so far."
55
+ end
56
+ end
57
+ else
58
+ err "Error: No repository specified."
59
+ end
60
+ end
61
+
62
+ opts.on('-A', '--add-rule [NAME]', 'Add a rule NAME for the selected repo') do |name|
63
+ conf = Config.new
64
+ name = name.to_sym
65
+ unless options.repositories.empty?
66
+ print "Enter the command: ".o
67
+ rule = gets.chomp
68
+ options.repositories.each do |repo|
69
+ reposym = repo.name.to_sym
70
+ if conf.rules[reposym].is_a?(Hash) && conf.rules[reposym].key?(name)
71
+ print "#{reposym} already has a rule #{name}, overwrite ? (yes/no/all) ".o
72
+ ans = gets.chomp
73
+ if ! ans =~ /y(?:e(?:s))/i
74
+ abort "Aborting."
75
+ elsif ans == 'all'
76
+ break
77
+ end
78
+ end
79
+ (conf.rules[reposym] ||= {})[name] = rule
80
+ end
81
+ print "Added rule #{name} on: ".o
82
+ options.repositories.each {|repo| print repo.name+' ' }
83
+ conf.save
84
+ done "\nConfig file saved".g
85
+ else
86
+ err "Error: No repository specified.".r
87
+ end
88
+ end
89
+
90
+ opts.on('-X', '--exclude [DIR][,DIR]', 'Add DIR(s) to excluded folders') do |d|
91
+ conf = Config.new
92
+ conf.config[:exclude] ||= []
93
+ print "Add to exclude list: ".o
94
+ d.split(',').each do |dir|
95
+ print dir
96
+ conf.config[:exclude] << dir
97
+ end
98
+ conf.save
99
+ done "\nConfig file saved".g
100
+ end
101
+
102
+ opts.on('-C', '--config-stub', 'Generate a blank config file') do |p|
103
+ unless File.exist?(RULES_FILE)
104
+ File.open(RULES_FILE, 'w+') do |f|
105
+ f.write YAML.dump(Config.blank)
106
+ end
107
+ done "Blank config file generated (in .ruacce_rules)"
108
+ else
109
+ abord "A configuration file has been found, aborting"
110
+ end
111
+ end
112
+
113
+ opts.separator ""
114
+ opts.separator "Common options:"
115
+
116
+ opts.on_tail("-h", "--help", "Show this message") do
117
+ puts opts
118
+ puts "\nDescription:",
119
+ " ruacce -- This tool allows you to update your repositories",
120
+ " or automatically execute custom commands on them."
121
+ exit
122
+ end
123
+
124
+ end
125
+
126
+ opts.parse!(args)
127
+ options
128
+ end # self.parse()
129
+
130
+ def self.err(str)
131
+ puts str.r
132
+ exit
133
+ end
134
+
135
+ def self.abort(str)
136
+ puts str.p
137
+ exit
138
+ end
139
+
140
+ def self.done(str)
141
+ puts str.g
142
+ exit
143
+ end
144
+
145
+ end
146
+ end
@@ -0,0 +1,35 @@
1
+ module Ruacce
2
+ class Config
3
+
4
+ attr_reader :rules, :config
5
+
6
+ def initialize
7
+ if File.exist?(RULES_FILE)
8
+ yaml = YAML.load(File.read(RULES_FILE))
9
+ @rules = yaml[:rules]
10
+ @config = yaml[:config]
11
+ else
12
+ raise "configuration file not found"
13
+ end
14
+ end
15
+
16
+ def add_rule(repo, name, script, obj=nil)
17
+ @rules[repo] = {name => script}
18
+ end
19
+
20
+ def add_exclude(dir)
21
+ (@config[:excludes] ||= []) << dir
22
+ end
23
+
24
+ def save
25
+ File.open(RULES_FILE, 'w+') do |f|
26
+ f.write YAML.dump({}.merge(:rules => @rules).merge(:config => @config))
27
+ end
28
+ end
29
+
30
+ def self.blank
31
+ {:config => {}, :rules => {}}
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,16 @@
1
+ module Ruacce
2
+ class Repository
3
+
4
+ attr_accessor :rules, :name
5
+
6
+ def initialize(name)
7
+ @name = name
8
+ @rules = Config.new.rules[name.to_sym]
9
+ end
10
+
11
+ def self.repos
12
+ Dir['*'].select{|d| File.directory?(d) }.sort - Config.new.config[:exclude]
13
+ end
14
+
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: madx-ruacce
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - "Fran\xC3\xA7ois Vaux"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-06-25 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: ruacce is a small tool to automate repository update. It can work with any version control system and also provides custom scripts execution.
17
+ email: root+ruacce@yapok.org
18
+ executables:
19
+ - ruacce
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/ruacce.rb
26
+ - lib/ruacce/argv_parser.rb
27
+ - lib/ruacce/config.rb
28
+ - lib/ruacce/repository.rb
29
+ - bin/ruacce
30
+ - Rakefile
31
+ - README
32
+ - VERSION
33
+ has_rdoc: false
34
+ homepage: http://yapok.org/
35
+ post_install_message:
36
+ rdoc_options: []
37
+
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
+ version:
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ requirements: []
53
+
54
+ rubyforge_project:
55
+ rubygems_version: 1.2.0
56
+ signing_key:
57
+ specification_version: 2
58
+ summary: Repository Updater and Custom Command Executer
59
+ test_files: []
60
+