filament 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,11 @@
1
+ 0.2.1:
2
+ Filament:
3
+ - Added ability to create workspace, package
4
+ - Added ability to checkout (and create) a package
5
+ - Can now execute the filament command outside a workspace
6
+ - Moved svn parts to PackageScm
7
+ - Supports in place to work with other forms of version control
8
+
1
9
  0.2.0:
2
10
  Filament:
3
11
  - removed old tests
@@ -2,6 +2,7 @@ require 'fileutils'
2
2
  require 'pathname'
3
3
  require 'yaml'
4
4
  require 'open-uri'
5
+ require 'memoize'
5
6
 
6
7
  require 'filament/util/fileutils'
7
8
  require 'filament/util/lazy_list'
@@ -16,15 +17,42 @@ module Filament
16
17
  end
17
18
  end
18
19
 
20
+ class PackageScm
21
+ def self.applies?(package)
22
+ return false
23
+ end
24
+
25
+ def initialize(package)
26
+ @package = package
27
+ end
28
+
29
+ def revision; return nil; end
30
+
31
+ def update; end
32
+
33
+ def status; end
34
+
35
+ def commit(msg); end
36
+ end
37
+
19
38
  class Package
39
+ include Memoize
40
+
41
+ @@package_scms = []
42
+ def self.scm(klass)
43
+ @@package_scms << klass
44
+ end
45
+
20
46
  def target(name, klass, &block)
21
47
  klass.new(name, &block)
22
48
  end
23
49
 
24
- attr_reader :parent, :name, :realpath, :workspace, :package_resolver, :target_resolver, :build_context, :scm
50
+ attr_reader :parent, :name, :realpath, :workspace, :package_resolver, :target_resolver, :build_context
25
51
  alias :pathname :realpath
26
52
 
27
53
  def initialize(h)
54
+ memoize :scm
55
+
28
56
  @parent = h[:parent]
29
57
  @workspace = h[:workspace]
30
58
 
@@ -129,7 +157,7 @@ module Filament
129
157
  # 1. this package refers to a directory that exists
130
158
  # 2. this package has a valid parent
131
159
  def valid?
132
- return false unless exist? and @pathname.directory?
160
+ return false unless exist? and @realpath.directory?
133
161
  return has_valid_parent?
134
162
  end
135
163
 
@@ -169,6 +197,11 @@ module Filament
169
197
  return nil
170
198
  end
171
199
 
200
+ def create
201
+ raise "directory #{@realpath} does not exist" unless exist?
202
+ make_valid!
203
+ end
204
+
172
205
  # returns the full name of the package
173
206
  def uri
174
207
  return '//' + path
@@ -252,6 +285,13 @@ module Filament
252
285
  end
253
286
  end
254
287
 
288
+ def scm
289
+ @@package_scms.each do |scm|
290
+ return scm.new(self) if scm.applies?(self)
291
+ end
292
+ return nil
293
+ end
294
+
255
295
  # executes cmd with this packages as the wd, and with $this_package set to self
256
296
  def execute(&block)
257
297
  @execution_context.execute(&block)
@@ -301,7 +341,6 @@ module Filament
301
341
  pn += "#{subdir}/#{$build_dir_prefix}"
302
342
  end
303
343
 
304
- # mkdir_p(pn) unless pn.exist?
305
344
  return pn.to_s
306
345
  end
307
346
 
@@ -46,6 +46,6 @@ module Filament
46
46
  p = p.parent
47
47
  end
48
48
 
49
- raise "Root directory not found for '#{package_dir}'"
49
+ return nil
50
50
  end
51
51
  end
@@ -1,10 +1,20 @@
1
1
  require 'pathname'
2
+ require 'fileutils'
2
3
 
3
4
  require 'filament/package'
4
5
  require 'filament/resolver'
5
6
 
6
7
  module Filament
7
8
  class Workspace
9
+ class << self
10
+ def create(path)
11
+ FileUtils.mkdir_p(path)
12
+ FileUtils.cd path do
13
+ FileUtils.touch('.workspace')
14
+ end
15
+ end
16
+ end
17
+
8
18
  attr_reader :package_resolver, :realpath
9
19
 
10
20
  def initialize(path)
@@ -39,6 +49,20 @@ module Filament
39
49
  return package
40
50
  end
41
51
 
52
+ def create_package_for_path(path)
53
+ return nil if path.nil?
54
+
55
+ FileUtils.mkdir_p(path)
56
+ realpath_p = Pathname.new(path).realpath
57
+
58
+ puts realpath_p
59
+ package = package_for_realpath(realpath_p)
60
+
61
+ package.create
62
+
63
+ return package
64
+ end
65
+
42
66
  def resolve_package(uri)
43
67
  @package_resolver.resolve_package(uri)
44
68
  end
data/lib/filament.rb CHANGED
@@ -64,7 +64,7 @@ module Filament
64
64
  def initialize
65
65
  @cmd = CmdParse::CommandParser.new(true)
66
66
  @cmd.program_name = "filament"
67
- @cmd.program_version = [0, 2, 0]
67
+ @cmd.program_version = [0, 2, 1]
68
68
  @cmd.add_command(CmdParse::HelpCommand.new)
69
69
  @cmd.add_command(CmdParse::VersionCommand.new)
70
70
  @cmd.options = CmdParse::OptionParserWrapper.new do |opt|
@@ -78,40 +78,58 @@ module Filament
78
78
  end
79
79
  end
80
80
 
81
- def subcommand(name, short_desc, &block)
82
- subcommand = CmdParse::Command.new(name, false)
81
+ def workspace_path
82
+ return ENV['WORKSPACE_PATH'] || Filament::find_dir(Pathname.pwd, '.workspace')
83
+ end
84
+
85
+ def subcommand(name, short_desc, has_subcommands=false, &block)
86
+ subcommand = CmdParse::Command.new(name, has_subcommands)
83
87
  subcommand.short_desc = short_desc
84
88
  subcommand.set_execution_block(&block)
85
89
  @cmd.add_command(subcommand)
90
+ return subcommand
91
+ end
92
+
93
+ def parse(args)
94
+ @cmd.parse(args)
86
95
  end
87
96
 
97
+
88
98
  def run(args)
89
99
  verbose(false)
90
100
 
91
- this_package = $workspace.package_for_realpath(Pathname.pwd.realpath)
92
- this_package.execute do
93
- log "ROOT PACKAGES: #{$context[:package_resolver].root_package_names.join(', ')}"
94
- # do it.
95
- @cmd.parse(args)
101
+ if workspace_path.nil?
102
+ parse(args)
103
+ else
104
+ $workspace = Workspace.new(workspace_path)
105
+ $workspace.load_tasks
106
+ this_package = $workspace.package_for_realpath(Pathname.pwd.realpath)
107
+ if this_package.nil?
108
+ parse(args)
109
+ else
110
+ this_package.execute do
111
+ log "ROOT PACKAGES: #{$context[:package_resolver].root_package_names.join(', ')}"
112
+ # do it.
113
+ @cmd.parse(args)
114
+ end
115
+ end
96
116
  end
97
117
  end
98
118
  end
99
119
 
100
120
  class << self
121
+ def versioned_subdir(path)
122
+ base_dir = Pathname.new(path).parent
123
+ version = (base_dir + 'VERSION').read.chomp
124
+ return base_dir + version
125
+ end
126
+
101
127
  def get_plugin_dirs(path)
102
128
  pn = Pathname.new(path)
103
129
  return pn.children.sort
104
130
  end
105
131
 
106
- def update_env(plugin_base_dir)
107
- plugin_dirs = get_plugin_dirs(plugin_base_dir)
108
- script_dirs = plugin_dirs.collect {|dir| dir + 'script' }
109
- ENV['PATH'] = script_dirs.join(':') + ':' + ENV['PATH']
110
- end
111
-
112
132
  def load_plugins(plugin_base_dir)
113
- update_env(plugin_base_dir)
114
-
115
133
  plugins = []
116
134
  dirs = get_plugin_dirs(plugin_base_dir)
117
135
  dirs.each do |child|
@@ -152,8 +170,6 @@ module Filament
152
170
  ENV[key] = val
153
171
  end
154
172
 
155
- workspace_path = ENV['WORKSPACE_PATH'] || Filament::find_dir(Pathname.pwd, '.workspace')
156
-
157
173
  $target_platform = (ENV['TARGET_PLATFORM'] || :mpp_sdk || :i860 || :wt2_2).to_sym
158
174
  $build_type = (ENV['BUILD_TYPE'] || :DBG || :OPT || :TEST).to_sym
159
175
  raise "unknown build type: '#{$build_type}'" unless [:DBG, :OPT, :TEST].member?($build_type)
@@ -165,9 +181,6 @@ module Filament
165
181
  pn = Pathname.new(__FILE__).parent.parent + 'plugins'
166
182
  Filament::load_plugins(pn.realpath)
167
183
 
168
- $workspace = Workspace.new(workspace_path)
169
- $workspace.load_tasks
170
-
171
184
  Filament::Application.new.run(args)
172
185
  end
173
186
  end
@@ -1,3 +1,4 @@
1
+ require 'cmdparse'
1
2
  require 'filament/plugin'
2
3
 
3
4
  module Filament::Plugins
@@ -50,10 +51,30 @@ module Filament::Plugins
50
51
  end
51
52
  end
52
53
 
53
- app.subcommand('workspace', "Creates a filament workspace at the provided path (or the working directory)") do |args|
54
+ generate = app.subcommand('generate', "Generates directory or file templates", true)
54
55
 
56
+ generate_workspace = CmdParse::Command.new('workspace', false)
57
+ generate_workspace.short_desc = "Creates a workspace at the given path"
58
+ generate_workspace.set_execution_block do |args|
59
+ args.each do |path|
60
+ Workspace.create(path)
61
+ puts "Workspace created."
62
+ end
63
+ end
64
+
65
+ generate.add_command(generate_workspace)
66
+
67
+ generate_package = CmdParse::Command.new('package', false)
68
+ generate_package.short_desc = "Creates a package with the given name"
69
+ generate_package.set_execution_block do |args|
70
+ args.each do |path|
71
+ raise "Workspace not defined." if $workspace.nil?
72
+ $workspace.create_package_for_path(path)
73
+ puts "Package created."
74
+ end
55
75
  end
56
76
 
77
+ generate.add_command(generate_package)
57
78
  end
58
79
  end
59
80
  end
@@ -18,10 +18,15 @@ module Filament::Plugins
18
18
  end
19
19
  end
20
20
 
21
- app.subcommand('checkout', "Checks out a package into the workspace") do |args|
22
- url, package_uri = *args
21
+ app.subcommand('checkout', "Checks out a package to a path in the workspace, creating a package if necessary") do |args|
22
+ url, path = *args
23
23
 
24
+ raise "Workspace not defined." if $workspace.nil?
24
25
 
26
+ package = $workspace.create_package_for_path(path)
27
+
28
+ svn = SVN.new(url)
29
+ svn.checkout(package.realpath)
25
30
  end
26
31
  end
27
32
  end
@@ -0,0 +1,69 @@
1
+ require 'filament/package'
2
+
3
+ module Filament::Scm
4
+ class SvnPackageScm < PackageScm
5
+ # returns true if this package is under svn control
6
+ def self.applies?(package)
7
+ p = package.realpath + '.svn'
8
+ return p.exist?
9
+ end
10
+
11
+ def self.build_uri(h)
12
+ uri = h[:uri]
13
+
14
+ return uri unless @uri.nil?
15
+
16
+ package_path = h[:package_path]
17
+ base_uri = h[:repos_uri] || ENV['FILAMENT_SVN_REPOS_URL']
18
+
19
+ tag = h[:tag]
20
+ branch = h[:branch]
21
+
22
+ return "#{base_uri}/tags/#{package_path}/#{tag}" unless tag.nil?
23
+ return "#{base_uri}/branches/#{package_path}/#{branch}" unless branch.nil?
24
+ return "#{base_uri}/trunk/#{package_path}"
25
+ end
26
+
27
+ def revision
28
+ return svn_info['Last Changed Rev'].to_i
29
+ end
30
+
31
+ # if this package is under version control, it will update it
32
+ # if this package has subpackages, it will update them
33
+ def update
34
+ puts @package.full_name
35
+ system("svn update #{@package.realpath}")
36
+ subpackages.each { |s| s.scm.update }
37
+ end
38
+
39
+ # if this package is under version control, it will print its status
40
+ # if this package has subpackages it will print their status
41
+ def status
42
+ puts @package.full_name
43
+ system("svn status #{@package.realpath}")
44
+ subpackages.each { |s| s.scm.status }
45
+ end
46
+
47
+ # if this package is under version control, it will commit it with the
48
+ # given msg
49
+ # if this package has subpackages it will commit them
50
+ def commit(msg)
51
+ puts @package.full_name
52
+ system("svn ci -m '#{msg.gsub(/"/,"\\\"")}'")
53
+ subpackages.each { |s| s.scm.commit(msg) }
54
+ end
55
+
56
+ def svn_url
57
+ return svn_info['URL']
58
+ end
59
+
60
+ def svn_base_url
61
+ return url.gsub(/\/(trunk|branches\/[.^\/]*|tags\/[.^\/]*)$/, '')
62
+ end
63
+
64
+ def svn_info
65
+ stream = IO.popen("svn info #{@package.realpath}")
66
+ return YAML.load(stream)
67
+ end
68
+ end
69
+ end
@@ -1,3 +1,5 @@
1
1
  require 'filament/plugins/svn'
2
+ require 'filament/scm/svn'
2
3
 
3
- Filament::Application::plugin(Filament::Plugins::SvnPlugin)
4
+ Filament::Application::plugin(Filament::Plugins::SvnPlugin)
5
+ Filament::Package::scm(Filament::Scm::SvnPackageScm)
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: filament
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.0
7
- date: 2006-03-17 00:00:00 -05:00
6
+ version: 0.2.1
7
+ date: 2006-03-18 00:00:00 -05:00
8
8
  summary: A flexible dependency-based build platform based on Rake
9
9
  require_paths:
10
10
  - lib
@@ -108,10 +108,10 @@ files:
108
108
  - plugins/10svn/lib/filament
109
109
  - plugins/10svn/lib/init.rb
110
110
  - plugins/10svn/lib/svn.rb
111
- - plugins/10svn/lib/filament/package
112
111
  - plugins/10svn/lib/filament/plugins
113
- - plugins/10svn/lib/filament/package/svn.rb
112
+ - plugins/10svn/lib/filament/scm
114
113
  - plugins/10svn/lib/filament/plugins/svn.rb
114
+ - plugins/10svn/lib/filament/scm/svn.rb
115
115
  - README
116
116
  - CHANGELOG
117
117
  test_files: []
@@ -1,121 +0,0 @@
1
- require 'filament/package'
2
-
3
- module Filament
4
- class Package
5
- # returns true if this package is under svn control
6
- def svn?
7
- p = @realpath + '.svn'
8
- return p.exist?
9
- end
10
-
11
- def revision
12
- return svn_revision
13
- end
14
-
15
- def update
16
- return svn_update
17
- end
18
-
19
- def status
20
- return svn_status
21
- end
22
-
23
- def commit(msg)
24
- return svn_commit(msg)
25
- end
26
-
27
- def svn_info
28
- stream = IO.popen("svn info #{@pathname.realpath}")
29
- return YAML.load(stream)
30
- end
31
-
32
- def svn_revision
33
- return 0 unless svn?
34
- return svn_info['Last Changed Rev'].to_i
35
- end
36
-
37
- def svn_url
38
- return nil unless svn?
39
- return svn_info['URL']
40
- end
41
-
42
- def svn_base_url
43
- return url.gsub(/\/(trunk|branches\/[.^\/]*|tags\/[.^\/]*)$/, '')
44
- end
45
-
46
- # if this package is under version control, it will update it
47
- # if this package has subpackages, it will update them
48
- def svn_update
49
- if svn?
50
- puts full_name
51
- system('svn update')
52
- end
53
- subpackages.each { |s| s.update }
54
- end
55
-
56
- # if this package is under version control, it will print its status
57
- # if this package has subpackages it will print their status
58
- def svn_status
59
- if svn?
60
- puts full_name
61
- system('svn status')
62
- end
63
- subpackages.each { |s| s.status }
64
- end
65
-
66
- # if this package is under version control, it will commit it with the
67
- # given msg
68
- # if this package has subpackages it will commit them
69
- def svn_commit(msg)
70
- if svn?
71
- puts full_name
72
- system("svn ci -m \"#{msg}\"")
73
- end
74
- subpackages.each { |s| s.commit(msg) }
75
- end
76
-
77
- def self.build_uri(h)
78
- uri = h[:uri]
79
-
80
- return uri unless @uri.nil?
81
-
82
- package_path = h[:package_path]
83
- base_uri = h[:root_uri] || ENV['BASE_SVN_URL']
84
-
85
- tag = h[:tag]
86
- branch = h[:branch]
87
-
88
- return "#{base_uri}/tags/#{package_path}/#{tag}" unless tag.nil?
89
- return "#{base_uri}/branches/#{package_path}/#{branch}" unless branch.nil?
90
- return "#{base_uri}/trunk/#{package_path}"
91
- end
92
-
93
- # checks out the package into the current wd (preserving its path)
94
- def self.checkout(h)
95
- uri = Package.build_uri(h)
96
- pkg = Package.create(h)
97
- pkg.system("svn co #{uri} .")
98
- return pkg
99
- end
100
-
101
- # exports a url to a given dir
102
- def self.export(h)
103
- uri = Package.build_uri(h)
104
- pkg = Package.create(h)
105
- pkg.system("svn export #{uri} .")
106
- return pkg
107
- end
108
- end
109
- end
110
-
111
-
112
- #class URI::Generic
113
- # def to_package
114
- # s = SVN.new(uri)
115
- # raise "not an svn uri" unless s.valid?
116
- # pkg = export(:package_path => s.path,
117
- # :uri => s.uri,
118
- # :root_dir => Filament::Package.CACHE_DIR)
119
- # return pkg
120
- # end
121
- #end