cdexec 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gemspec ADDED
@@ -0,0 +1,152 @@
1
+ # encoding: utf-8
2
+
3
+ require 'yaml'
4
+
5
+ Gem::Specification.new do |gemspec|
6
+
7
+ manifest = Dir.glob('manifest{,.txt)', File::FNM_CASEFOLD).first
8
+
9
+ scm = case
10
+ when File.directory?('.git')
11
+ :git
12
+ end
13
+
14
+ files = case
15
+ when manifest
16
+ File.readlines(manifest).
17
+ map{ |line| line.srtip }.
18
+ reject{ |line| line.empty? || line[0,1] == '#' }
19
+ when scm == :git
20
+ `git ls-files -z`.split("\0")
21
+ else
22
+ Dir.glob('{**/}{.*,*}') # TODO: be more specific using standard locations ?
23
+ end.select{ |path| File.file?(path) }
24
+
25
+ patterns = {
26
+ :bin_files => 'bin/*',
27
+ :lib_files => 'lib/{**/}*.rb',
28
+ :ext_files => 'ext/{**/}extconf.rb',
29
+ :doc_files => '*.{txt,rdoc,md,markdown,tt,textile}',
30
+ :test_files => '{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'
31
+ }
32
+
33
+ glob_files = lambda { |pattern|
34
+ Dir.glob(pattern).select { |path|
35
+ File.file?(path) && files.include?(path)
36
+ }
37
+ }
38
+
39
+ #files = glob_files[patterns[:files]]
40
+
41
+ executables = glob_files[patterns[:bin_files]].map do |path|
42
+ File.basename(path)
43
+ end
44
+
45
+ extensions = glob_files[patterns[:ext_files]].map do |path|
46
+ File.basename(path)
47
+ end
48
+
49
+ metadata = YAML.load_file('.ruby')
50
+
51
+ # build-out the gemspec
52
+
53
+ case metadata['revision']
54
+ when 0
55
+ gemspec.name = metadata['name']
56
+ gemspec.version = metadata['version']
57
+ gemspec.summary = metadata['summary']
58
+ gemspec.description = metadata['description']
59
+
60
+ metadata['authors'].each do |author|
61
+ gemspec.authors << author['name']
62
+
63
+ if author.has_key?('email')
64
+ if gemspec.email
65
+ gemspec.email << author['email']
66
+ else
67
+ gemspec.email = [author['email']]
68
+ end
69
+ end
70
+ end
71
+
72
+ gemspec.licenses = metadata['licenses']
73
+
74
+ metadata['requirements'].each do |req|
75
+ name = req['name']
76
+ version = req['version']
77
+ groups = req['groups'] || []
78
+
79
+ if md = /^(.*?)([+-~])$/.match(version)
80
+ version = case md[2]
81
+ when '+' then ">= #{$1}"
82
+ when '-' then "< #{$1}"
83
+ when '~' then "~> #{$1}"
84
+ else version
85
+ end
86
+ end
87
+
88
+ #development = req['development']
89
+ #if development
90
+ # # populate development dependencies
91
+ # if gemspec.respond_to?(:add_development_dependency)
92
+ # gemspec.add_development_dependency(name,*version)
93
+ # else
94
+ # gemspec.add_dependency(name,*version)
95
+ # end
96
+ #else
97
+ # # populate runtime dependencies
98
+ # if gemspec.respond_to?(:add_runtime_dependency)
99
+ # gemspec.add_runtime_dependency(name,*version)
100
+ # else
101
+ # gemspec.add_dependency(name,*version)
102
+ # end
103
+ #end
104
+
105
+ if groups.empty? or groups.include?('runtime')
106
+ # populate runtime dependencies
107
+ if gemspec.respond_to?(:add_runtime_dependency)
108
+ gemspec.add_runtime_dependency(name,*version)
109
+ else
110
+ gemspec.add_dependency(name,*version)
111
+ end
112
+ else
113
+ # populate development dependencies
114
+ if gemspec.respond_to?(:add_development_dependency)
115
+ gemspec.add_development_dependency(name,*version)
116
+ else
117
+ gemspec.add_dependency(name,*version)
118
+ end
119
+ end
120
+ end
121
+
122
+ # convert external dependencies into a requirements
123
+ if metadata['external_dependencies']
124
+ ##gemspec.requirements = [] unless metadata['external_dependencies'].empty?
125
+ metadata['external_dependencies'].each do |req|
126
+ gemspec.requirements << req.to_s
127
+ end
128
+ end
129
+
130
+ # determine homepage from resources
131
+ homepage = metadata['resources'].find{ |key, url| key =~ /^home/ }
132
+ gemspec.homepage = homepage.last if homepage
133
+
134
+ gemspec.require_paths = metadata['load_path'] || ['lib']
135
+ gemspec.post_install_message = metadata['install_message']
136
+
137
+ # RubyGems specific metadata
138
+ gemspec.files = files
139
+ gemspec.extensions = extensions
140
+ gemspec.executables = executables
141
+
142
+ if Gem::VERSION < '1.7.'
143
+ gemspec.default_executable = gemspec.executables.first
144
+ end
145
+
146
+ gemspec.test_files = glob_files[patterns[:test_files]]
147
+
148
+ unless gemspec.files.include?('.document')
149
+ gemspec.extra_rdoc_files = glob_files[patterns[:doc_files]]
150
+ end
151
+ end
152
+ end
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ .reap/digest
2
+ .yardoc
3
+ .rdoc
4
+ doc
5
+ log
6
+ pkg
7
+ tmp
8
+ site/docs
9
+ work/sandbox
10
+ man/*.html
11
+ man/*.1
12
+ man/*.5
13
+ man/*.7
14
+
data/.ruby ADDED
@@ -0,0 +1,26 @@
1
+ ---
2
+ authors:
3
+ - name: Thomas Sawyer
4
+ email: transfire@gmail.com
5
+ copyrights: []
6
+ replacements: []
7
+ conflicts: []
8
+ requirements: []
9
+ dependencies: []
10
+ repositories: []
11
+ resources:
12
+ home: http://rubyworks.github.com/cdexec
13
+ code: http://github.com/rubyworks/cdexec
14
+ load_path:
15
+ - lib
16
+ extra: {}
17
+ name: cdexec
18
+ title: cdexec
19
+ version: 0.2.0
20
+ summary: Multi-execute over directories
21
+ description: Execute shell commands in multiple-subdirectories.
22
+ source:
23
+ - ruby.yaml
24
+ revision: 0
25
+ alternatives: []
26
+ date: '2011-10-20'
data/.yardopts ADDED
@@ -0,0 +1,5 @@
1
+ --title "CdExec"
2
+ --readme README.rdoc
3
+ --private
4
+ lib/**/*.rb -
5
+ [A-Z]*.*
data/Assembly ADDED
@@ -0,0 +1,40 @@
1
+ ---
2
+ email:
3
+ file : ~
4
+ subject : ~
5
+ mailto :
6
+ - ruby-talk@ruby-lang.org
7
+ - rubyworks-mailinglist@googlegroups.com
8
+
9
+ gem:
10
+ active: true
11
+
12
+ github:
13
+ active: true
14
+
15
+ yard:
16
+ yardopts: true
17
+ priority: 2
18
+
19
+ #minitest:
20
+ # tests : spec/*_spec.rb
21
+ # loadpath : lib
22
+ # requires : ~
23
+ # active : false
24
+
25
+ dnote:
26
+ service : DNote
27
+ labels : ~
28
+ output : log/DNOTE.rdoc
29
+
30
+ #locat:
31
+ # title : ~
32
+ # loadpath : ~
33
+ # exclude : ~
34
+ # output : log/LOCat.html
35
+ # active : true
36
+
37
+ vclog:
38
+ output : log/ChangeLog.rdoc
39
+ active : false
40
+
data/COPYING.rdoc ADDED
@@ -0,0 +1,33 @@
1
+ = COPYRIGHT NOTICES
2
+
3
+ == CdExec
4
+
5
+ Copyright:: (c)2009 Thomas Sawyer
6
+ License:: BSD-2-Clause
7
+ Website:: http://rubyworks.github.com/cdexec
8
+
9
+ Copyright 2009 Thomas Sawyer. All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without modification, are
12
+ permitted provided that the following conditions are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright notice, this list of
15
+ conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list
18
+ of conditions and the following disclaimer in the documentation and/or other materials
19
+ provided with the distribution.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY Thomas Sawyer ``AS IS'' AND ANY EXPRESS OR IMPLIED
22
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
23
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Thomas Sawyer OR
24
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ The views and conclusions contained in the software and documentation are those of the
32
+ authors and should not be interpreted as representing official policies, either expressed
33
+ or implied, of Thomas Sawyer.
data/HISTORY.rdoc ADDED
@@ -0,0 +1,22 @@
1
+ = RELEASE HISTORY
2
+
3
+
4
+ == 0.2.0 / 2011-10-19
5
+
6
+ The release fixes glob exapansion in the command portion
7
+ of a cdexec call.
8
+
9
+ Changes:
10
+
11
+ * Fix glob expansion of command.
12
+ * Better handling of arguments that contain spaces.
13
+
14
+
15
+ == 0.1.0 / 2011-08-27
16
+
17
+ Initial release of CdExec. Have fun!
18
+
19
+ Changes:
20
+
21
+ * It's your Birthday!
22
+
data/MANIFEST ADDED
@@ -0,0 +1,11 @@
1
+ #!mast .yardopts .ruby bin lib man [A-Z]*.*
2
+ .yardopts
3
+ .ruby
4
+ bin/cdexec
5
+ lib/cdexec.rb
6
+ man/cdexe.1
7
+ man/cdexe.1.html
8
+ man/cdexe.1.ronn
9
+ HISTORY.rdoc
10
+ README.rdoc
11
+ COPYING.rdoc
data/README.rdoc ADDED
@@ -0,0 +1,36 @@
1
+ = CdExec
2
+
3
+ {Homepage}[http://rubyworks.github.com/cdexec] |
4
+ {Development}[http://github.com/rubyworks/cdexec] |
5
+ {Support}[http://github.com/rubyworks/cdexec/issues]
6
+
7
+
8
+ == Description
9
+
10
+ Execute command from within a selection of directories.
11
+
12
+
13
+ == Usage
14
+
15
+ A dash (`-`) is used to separate the directory selection
16
+ from the command to be executed.
17
+
18
+ For example, to list all files in all subdirectories:
19
+
20
+ $ cdexec * - ls -1
21
+
22
+ The `*` selects all the subdirectories. The `ls -1` command following the `-`
23
+ is run within each directory, resulting in a complete list of files.
24
+
25
+ More interesting result when used with source control systems, e.g.
26
+
27
+ $ cdexec * - reap
28
+
29
+
30
+ == Copying
31
+
32
+ (BSD-2-Clause)
33
+
34
+ Copyright (c) 2011 Thomas Sawyer, Rubyworks
35
+
36
+ See COPYING.rdoc for details.
data/bin/cdexec ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'cdexec'
3
+ CdExec.cli(*ARGV)
4
+
data/lib/cdexec.rb ADDED
@@ -0,0 +1,58 @@
1
+ require 'shellwords'
2
+
3
+ module CdExec
4
+
5
+ # Command line interface.
6
+ def self.cli(*argv)
7
+ case i = argv.index('-')
8
+ when nil
9
+ dirs, args = argv, Dir['*']
10
+ else
11
+ dirs, args = argv[0...i], argv[i+1..-1]
12
+ end
13
+
14
+ help = dirs.delete('-h') || dirs.delete('--help')
15
+ trace = dirs.delete('-t') || dirs.delete('--trace')
16
+
17
+ display_help if help
18
+
19
+ dirs = dirs.select{ |dir| File.directory?(dir) }
20
+
21
+ dirs.each_with_index do |dir, idx|
22
+ puts "\n#{idx+1}. #{dir}" if trace
23
+ Dir.chdir dir do
24
+ system command_line(*args)
25
+ end
26
+ end
27
+ end
28
+
29
+ # Glue the command line together, adding double quotes if argument
30
+ # contains spaces.
31
+ def self.command_line(*args)
32
+ args.map do |a|
33
+ case a
34
+ when /\s/
35
+ %{"#{a}"}
36
+ else
37
+ a
38
+ end
39
+ end.join(' ')
40
+ end
41
+
42
+ # Display help message and exit.
43
+ def self.display_help
44
+ system "man #{man_file}" || puts(File.read(ronn_file))
45
+ exit 0
46
+ end
47
+
48
+ # Path to roff man-page file.
49
+ def self.man_file
50
+ File.dirname(__FILE__) + '/../man/cdexe.1'
51
+ end
52
+
53
+ # Path to ronn man-page file.
54
+ def self.ronn_file
55
+ File.dirname(__FILE__) + '/../man/cdexe.1.ronn'
56
+ end
57
+
58
+ end
data/main.reap ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # TODO: Do things in ruby instead of shelling out!
4
+
5
+ ignore 'pkg', 'site'
6
+
7
+ desc "Release package."
8
+ task 'release' do
9
+ exit -1 if !system('detroit release') # `detroit release`
10
+ system "pom news | git tag -a -F - #{version}"
11
+ end
12
+
13
+ file 'ruby.yml' do
14
+ system "dotruby"
15
+ end
16
+
17
+ file 'MANIFEST' do
18
+ update_manifest
19
+ end
20
+
21
+ file 'lib/**/*' do
22
+ exit -1 if !system('detroit test')
23
+ update_manifest
24
+ end
25
+
26
+ # Could we incorporate detroit phases?
27
+ # detroit :post_release do
28
+ # ...
29
+ # end
30
+
31
+ def update_manifest
32
+ @manifest_updated ||= system "mast -u"
33
+ end
34
+
data/man/cdexe.1.ronn ADDED
@@ -0,0 +1,47 @@
1
+ cdexec(1) - Iterate command execution over multiple directories
2
+ ===============================================================
3
+
4
+ ## DESCRIPTION
5
+
6
+ The `cdexec` command allows shell commands to be executed over a selection
7
+ of file directories. This is convenient for working with mutliple projects
8
+ in bulk.
9
+
10
+ ## OPTIONS
11
+
12
+ The `cdexec` command is quite simple to use and there are only a few options:
13
+
14
+ * `-t`/`--trace`
15
+ Display the name of each directory as it is changed into.
16
+
17
+ * `-h`/`--help`
18
+ Show this help message.
19
+
20
+ ## EXAMPLES
21
+
22
+ There are plenty of uses for gitexec. Here are examples of a few that
23
+ have proven handy to the developers of cdexec.
24
+
25
+ Check the git status of a set of projects.
26
+
27
+ $ cdexec */ - git status
28
+
29
+ Running spellcheck on multiple project READMEs.
30
+
31
+ $ cdexec */ - aspell check README.rdoc
32
+ $ cdexec */ - rm README.rdoc.bak
33
+
34
+ Running tests on multiple projects.
35
+
36
+ $ cdexec */ - rake test
37
+
38
+ All of these example relate to software development. No doubt there
39
+ are many other application.
40
+
41
+ ## COPYING
42
+
43
+ Copyright (c) 2011 Thomas Sawyer, Rubyworks
44
+
45
+ This program is distributable in accordance to the terms of the
46
+ *FreeBSD* license.
47
+
data/ruby.yaml ADDED
@@ -0,0 +1,17 @@
1
+ ---
2
+ version : 0.2.0
3
+ name : cdexec
4
+ title : cdexec
5
+ summary : Multi-execute over directories
6
+
7
+ description:
8
+ Execute shell commands in multiple-subdirectories.
9
+
10
+ authors:
11
+ - Thomas Sawyer <transfire@gmail.com>
12
+
13
+ resources:
14
+ home: http://rubyworks.github.com/cdexec
15
+ code: http://github.com/rubyworks/cdexec
16
+
17
+ source: ruby.yaml
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cdexec
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Thomas Sawyer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-20 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Execute shell commands in multiple-subdirectories.
15
+ email:
16
+ - transfire@gmail.com
17
+ executables:
18
+ - cdexec
19
+ extensions: []
20
+ extra_rdoc_files:
21
+ - HISTORY.rdoc
22
+ - README.rdoc
23
+ - COPYING.rdoc
24
+ files:
25
+ - .gemspec
26
+ - .gitignore
27
+ - .ruby
28
+ - .yardopts
29
+ - Assembly
30
+ - COPYING.rdoc
31
+ - HISTORY.rdoc
32
+ - MANIFEST
33
+ - README.rdoc
34
+ - bin/cdexec
35
+ - lib/cdexec.rb
36
+ - main.reap
37
+ - man/cdexe.1.ronn
38
+ - ruby.yaml
39
+ homepage: http://rubyworks.github.com/cdexec
40
+ licenses: []
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project:
59
+ rubygems_version: 1.8.10
60
+ signing_key:
61
+ specification_version: 3
62
+ summary: Multi-execute over directories
63
+ test_files: []