build-tool 0.5.7 → 0.6.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.gitignore +1 -0
  2. data/.rvmrc +1 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +5 -0
  5. data/Gemfile.lock +56 -0
  6. data/History.txt +64 -0
  7. data/README.txt +0 -7
  8. data/Rakefile +8 -56
  9. data/bin/build-tool +4 -1
  10. data/build-tool.gemspec +62 -0
  11. data/db/migrations/20110703074000_add_command_logs.rb +17 -0
  12. data/db/migrations/20110703075000_add_module_logs.rb +20 -0
  13. data/db/migrations/20110815170000_add_features.rb +17 -0
  14. data/db/migrations/20120103204700_add_modules.rb +17 -0
  15. data/db/migrations/20120106181200_add_settings.rb +18 -0
  16. data/lib/build-tool.rb +3 -4
  17. data/lib/build-tool/application.rb +127 -37
  18. data/lib/build-tool/build-system/autoconf.rb +2 -8
  19. data/lib/build-tool/build-system/base.rb +12 -4
  20. data/lib/build-tool/build-system/cmake.rb +2 -0
  21. data/lib/build-tool/build-system/custom.rb +2 -0
  22. data/lib/build-tool/build-system/kdel10n.rb +2 -0
  23. data/lib/build-tool/build-system/make.rb +2 -0
  24. data/lib/build-tool/build-system/none.rb +2 -0
  25. data/lib/build-tool/build-system/qmake.rb +2 -0
  26. data/lib/build-tool/build-system/qt.rb +4 -0
  27. data/lib/build-tool/cfg/lexer.rex +40 -8
  28. data/lib/build-tool/cfg/lexer_base.rb +3 -1
  29. data/lib/build-tool/cfg/node.rb +17 -1
  30. data/lib/build-tool/cfg/parser.y +92 -10
  31. data/lib/build-tool/cfg/visitor.rb +202 -78
  32. data/lib/build-tool/command_actions.rb +26 -10
  33. data/lib/build-tool/commands.rb +289 -197
  34. data/lib/build-tool/commands/build.rb +13 -9
  35. data/lib/build-tool/commands/configuration.rb +25 -0
  36. data/lib/build-tool/commands/configuration/edit.rb +42 -0
  37. data/lib/build-tool/commands/configuration/list.rb +48 -0
  38. data/lib/build-tool/commands/configure.rb +9 -5
  39. data/lib/build-tool/commands/ctags.rb +8 -3
  40. data/lib/build-tool/commands/environments.rb +2 -4
  41. data/lib/build-tool/commands/environments/list.rb +13 -10
  42. data/lib/build-tool/commands/environments/set.rb +5 -1
  43. data/lib/build-tool/commands/features.rb +24 -0
  44. data/lib/build-tool/commands/features/disable.rb +70 -0
  45. data/lib/build-tool/commands/features/enable.rb +66 -0
  46. data/lib/build-tool/commands/features/list.rb +92 -0
  47. data/lib/build-tool/commands/fetch.rb +9 -3
  48. data/lib/build-tool/commands/files.rb +9 -5
  49. data/lib/build-tool/commands/gc.rb +48 -15
  50. data/lib/build-tool/commands/history.rb +21 -16
  51. data/lib/build-tool/commands/info.rb +16 -13
  52. data/lib/build-tool/commands/install.rb +8 -4
  53. data/lib/build-tool/commands/modules.rb +2 -4
  54. data/lib/build-tool/commands/modules/cleanup.rb +52 -0
  55. data/lib/build-tool/commands/modules/disable.rb +95 -0
  56. data/lib/build-tool/commands/modules/enable.rb +52 -0
  57. data/lib/build-tool/commands/modules/info.rb +44 -35
  58. data/lib/build-tool/commands/modules/list.rb +67 -15
  59. data/lib/build-tool/commands/modules/shell.rb +8 -2
  60. data/lib/build-tool/commands/rebase.rb +15 -7
  61. data/lib/build-tool/commands/recipes.rb +2 -4
  62. data/lib/build-tool/commands/recipes/add.rb +16 -2
  63. data/lib/build-tool/commands/recipes/edit.rb +72 -0
  64. data/lib/build-tool/commands/recipes/incoming.rb +11 -7
  65. data/lib/build-tool/commands/recipes/info.rb +12 -8
  66. data/lib/build-tool/commands/recipes/install.rb +37 -42
  67. data/lib/build-tool/commands/recipes/list.rb +6 -2
  68. data/lib/build-tool/configuration.rb +88 -3
  69. data/lib/build-tool/environment.rb +2 -0
  70. data/lib/build-tool/errors.rb +5 -0
  71. data/lib/build-tool/history.rb +3 -181
  72. data/lib/build-tool/model/command_log.rb +93 -0
  73. data/lib/build-tool/model/feature.rb +80 -0
  74. data/lib/build-tool/{module.rb → model/module.rb} +110 -29
  75. data/lib/build-tool/model/module_log.rb +64 -0
  76. data/lib/build-tool/model/setting.rb +84 -0
  77. data/lib/build-tool/recipe.rb +40 -18
  78. data/lib/build-tool/repository.rb +39 -33
  79. data/lib/build-tool/server.rb +27 -3
  80. data/lib/build-tool/singleton.rb +2 -0
  81. data/lib/build-tool/sshkey.rb +2 -0
  82. data/lib/build-tool/state_helper.rb +64 -0
  83. data/lib/build-tool/vcs/archive.rb +3 -1
  84. data/lib/build-tool/vcs/base.rb +13 -0
  85. data/lib/build-tool/vcs/git-svn.rb +36 -14
  86. data/lib/build-tool/vcs/git.rb +180 -44
  87. data/lib/build-tool/vcs/mercurial.rb +25 -13
  88. data/lib/build-tool/vcs/svn.rb +20 -15
  89. data/lib/build-tool/version.rb +30 -0
  90. data/lib/mj/error.rb +2 -0
  91. data/lib/mj/logging.rb +2 -0
  92. data/lib/mj/mixins/inherited_attributes.rb +73 -0
  93. data/lib/mj/tools/editor.rb +34 -0
  94. data/lib/mj/tools/ssh.rb +2 -0
  95. data/lib/mj/tools/subprocess.rb +2 -1
  96. data/lib/mj/vcs/git.rb +14 -2
  97. data/lib/mj/visitor.rb +22 -0
  98. data/tasks/db.rake +36 -0
  99. data/tasks/racc.rake +14 -0
  100. data/tasks/rdoc.rake +8 -0
  101. data/tasks/rexical.rake +14 -0
  102. data/tasks/test.rake +21 -0
  103. data/test/integration/history_test.rb +88 -0
  104. data/test/integration/parser_configuration.rb +36 -0
  105. data/test/integration/parser_environment_parser.rb +156 -0
  106. data/test/integration/parser_feature_test.rb +75 -0
  107. data/test/integration/parser_git-svn_test.rb +92 -0
  108. data/test/integration/parser_git_test.rb +97 -0
  109. data/test/integration/parser_mercurial_test.rb +77 -0
  110. data/test/integration/parser_module_test.rb +103 -0
  111. data/test/integration/parser_svn_test.rb +92 -0
  112. data/test/integration/parser_test.rb +73 -0
  113. data/test/test_helper.rb +61 -0
  114. data/test/unit/configuration_test.rb +36 -0
  115. data/test/unit/git_configuration_test.rb +163 -0
  116. data/test/unit/git_svn_configuration_test.rb +240 -0
  117. data/test/unit/mercurial_configuration_test.rb +64 -0
  118. data/test/unit/model/command_log_test.rb +103 -0
  119. data/test/unit/model/feature_test.rb +29 -0
  120. data/test/unit/model/module_log_test.rb +70 -0
  121. data/test/unit/model/module_test.rb +32 -0
  122. data/test/unit/repository_test.rb +110 -0
  123. data/test/unit/server_test.rb +66 -0
  124. data/test/unit/svn_configuration_test.rb +90 -0
  125. metadata +134 -93
  126. data/Manifest.txt +0 -80
  127. data/db/migrations/001_command_histories.rb +0 -20
  128. data/db/migrations/002_module_events.rb +0 -24
  129. data/db/migrations/003_command_histories_add_logfile.rb +0 -19
  130. data/lib/build-tool/GUI.rb +0 -360
  131. data/lib/build-tool/commands/help.rb +0 -22
  132. data/lib/build-tool/commands/lsfeatures.rb +0 -76
  133. data/lib/build-tool/feature.rb +0 -47
@@ -1,7 +1,36 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require 'mj/mixins/inherited_attributes'
1
4
  require 'build-tool/vcs/base'
2
5
  require 'build-tool/errors'
3
6
  require 'grit'
4
7
 
8
+ # :TODO: Push these changes to grit.
9
+ module Grit
10
+ class RepoConfig < Config
11
+ def delete(key)
12
+ @repo.git.config({:file => "#{@repo.path}/config", :unset => true }, key) if @repo
13
+ end
14
+ protected
15
+ def config_lines
16
+ @repo.git.config({:file => "#{@repo.path}/config", :list => true}).split( /\n/ ) if @repo
17
+ end
18
+ end
19
+
20
+ class UserConfig < Config
21
+ def []=(key, value)
22
+ @repo.git.config({:global => true}, key, value)
23
+ end
24
+ def delete(key)
25
+ @repo.git.config({:global => true, :unset => true }, key)
26
+ end
27
+ protected
28
+ def config_lines
29
+ @repo.git.config({:list => true, :global => true}).split( /\n/ ) if @repo
30
+ end
31
+ end
32
+ end
33
+
5
34
  module BuildTool; module VCS
6
35
 
7
36
  class GitError < BuildTool::Error; end
@@ -82,19 +111,58 @@ def push_url
82
111
  end
83
112
 
84
113
 
85
-
114
+ # Configuration options for the git vcs.
115
+ #
116
+ # @attr_reader [String] name returns the name of the vcs.
86
117
  class GitConfiguration < BaseConfiguration
87
118
 
119
+ include MJ::Mixins::InheritedAttributes
120
+
88
121
  def name
89
122
  "git"
90
123
  end
91
124
 
125
+ class << self
126
+
127
+ # The global configuration object
128
+ attr_accessor :global_config
129
+
130
+ # Was the global configuration ($HOME/.gitconfig) already checked?
131
+ attr_accessor :global_config_checked
132
+ end
133
+
92
134
  attr_accessor :remote
135
+ def merged_remote
136
+ return parent.merged_remote.merge( @remote ) if @parent
137
+ return @remote
138
+ end
139
+
140
+
141
+ attr_accessor :options
142
+ def merged_options
143
+ return @options if self == GitConfiguration.global_config # This is the global configuration.
144
+ return parent.merged_options.merge( @options ) if @parent # We have a parent. Merge with it
145
+ return GitConfiguration.global_config.options.merge( @options ) if GitConfiguration.global_config # No parent. Merge with global
146
+ return @options # No parent, no global. Just us
147
+ end
148
+
149
+ # @return [Hash<String,String>] the configured global options.
150
+ attr_accessor :global_options
151
+
152
+ def merged_global_options
153
+ return @global_options if self == GitConfiguration.global_config
154
+ return @global_options.merge( GitConfiguration.global_config.instance_variable_get( "@global_options" ) ) if GitConfiguration.global_config
155
+ return @global_options
156
+ end
93
157
 
94
158
  def initialize
95
159
  super
96
160
  @remote = {}
97
- @track = "origin/master"
161
+ @track = nil
162
+ @options = {}
163
+ @global_options = {}
164
+ @already_checked_config = false
165
+ @already_checked_user_config = false
98
166
  end
99
167
 
100
168
  def vcs( mod )
@@ -103,9 +171,18 @@ def vcs( mod )
103
171
  Git.new( self )
104
172
  end
105
173
 
106
- # The branch to track
107
- attr_accessor :track
174
+ # The remote branch to track.
175
+ # @return [String] the remote branch.
176
+ attr_writer :track
177
+ def track
178
+ return @track if @track # Our track
179
+ return parent.track if @parent # Out parents track
180
+ "origin/master" # The default
181
+ end
108
182
 
183
+ # The remote part of #remote.
184
+ # @see GitConfiguration#remote
185
+ # @return [String] the remote.
109
186
  def track_remote
110
187
  rc = track.split('/')
111
188
  # If there is only one string we assume it is the branch name from
@@ -114,6 +191,9 @@ def track_remote
114
191
  return rc[0]
115
192
  end
116
193
 
194
+ # The branch part of #remote
195
+ # @see #remote
196
+ # @return [String] the branch.
117
197
  def track_branch
118
198
  rc = track.split('/')
119
199
  # If there is only one string we assume it is the branch name from
@@ -127,6 +207,13 @@ def copy_configuration( other )
127
207
  @remote = {} # Do not copy the remotes
128
208
  end
129
209
 
210
+ #######
211
+ private
212
+ #######
213
+
214
+ @global_config = nil
215
+ @global_config_checked = false
216
+
130
217
  end
131
218
 
132
219
  #
@@ -142,15 +229,6 @@ def initialize( config )
142
229
 
143
230
  class << self
144
231
 
145
- git_available = nil
146
-
147
- # Is the git executable available?
148
- def git_available
149
- return @git_available unless @git_available.nil?
150
- %x( git --version 2>&1 )
151
- @git_available = $?.success?
152
- return @git_available
153
- end
154
232
 
155
233
  end
156
234
 
@@ -197,14 +275,7 @@ def clone
197
275
  raise GitError, "Error while initializing the repo `git init #{local_path}'`: #{$?}"
198
276
  end
199
277
 
200
- config.remote.each do |name, val|
201
- if git( "remote add #{name} #{val.url}" ) != 0
202
- raise GitError, "Error while initializing the repo `git remote add #{name} #{val.url}`: #{$?}"
203
- end
204
- if val.push_url and git( "remote set-url --push #{name} #{val.push_url}" ) != 0
205
- raise GitError, "Error while initializing the repo `git remote add #{name} #{val.url}`: #{$?}"
206
- end
207
- end
278
+ check_config
208
279
 
209
280
  logger.info <<-EOS
210
281
  The following command sometimes fails when issued from this script. Reason unknown. The
@@ -232,6 +303,9 @@ def gc
232
303
  def fetch()
233
304
  if !checkedout? and !$noop
234
305
  clone
306
+ else
307
+ # clone() calls those methods.
308
+ check_config
235
309
  end
236
310
  cmd = "fetch -q --prune #{config.track_remote}"
237
311
  if ( rc = git( cmd ) ) != 0
@@ -245,48 +319,101 @@ def git( command, wd = local_path, &block )
245
319
 
246
320
  def prepare_for_fetch
247
321
  # If our server has an associated ssh-key, add it to the ssh-agent.
248
- return check_for_sshkey( config.remote[ config.track_remote ].server.sshkey )
322
+ return check_for_sshkey( config.merged_remote[ config.track_remote ].server.sshkey )
249
323
  end
250
324
 
251
- # Check if the module is ready for vcs action
252
- def ready_for_access
253
-
325
+ def check_user_config
326
+ return if @already_checked_user_config
327
+ # :FIXME: It would make sense to do this even if the repo is not existing but grit cannot
328
+ # handle that
254
329
  if checkedout?
330
+ # Check that the options are the same as configured.
331
+ if ! GitConfiguration.global_config_checked
332
+ gitconfig = Grit::UserConfig.new(repo)
333
+ config.merged_global_options.each do |name, val|
334
+ if val != gitconfig[name]
335
+ if val.empty?
336
+ next if gitconfig[name].nil?
337
+ logger.info "repo: git-config: Removing #{name}"
338
+ gitconfig.delete name if !$noop
339
+ else
340
+ logger.info "repo: git-config: Setting #{name} to #{val}"
341
+ gitconfig[name] = val if !$noop
342
+ end
343
+ end
344
+ end
345
+ GitConfiguration.global_config_checked = true
346
+ end
347
+ end
348
+ @already_checked_user_config = true
349
+ end
255
350
 
351
+ def check_config
352
+ return if @already_checked_config
353
+ if checkedout?
256
354
  # Check that the remotes are the same as configured.
257
- gitconfig = repo.config
258
- config.remote.each do |name, val|
259
- if val.url and val.url != gitconfig["remote.#{name}.url"]
260
- logger.info "#{config.module.name}: Setting remote.origin.url to #{val.url}"
261
- gitconfig["remote.#{name}.url"] = val.url
355
+ gitconfig = Grit::RepoConfig.new(repo)
356
+ config.merged_remote.each do |name, val|
357
+ if val.url
358
+ if gitconfig["remote.#{name}.url"].nil?
359
+ if git( "remote add #{name} #{val.url}" ) != 0
360
+ raise GitError, "Error while initializing the repo `git remote add #{name} #{val.url}`: #{$?}"
361
+ end
362
+ elsif val.url != gitconfig["remote.#{name}.url"]
363
+ logger.info "repo: Setting remote.origin.url to #{val.url}"
364
+ gitconfig["remote.#{name}.url"] = val.url
365
+ end
366
+ end
367
+
368
+ if val.push_server and val.push_url
369
+ if val.push_url != gitconfig["remote.#{name}.pushurl"].nil?
370
+ if git( "remote set-url --push #{name} #{val.push_url}" ) != 0
371
+ raise GitError, "Error while initializing the repo `git remote add #{name} #{val.url}`: #{$?}"
372
+ end
373
+ elsif val.push_url != gitconfig["remote.#{name}.pushurl"]
374
+ logger.info "repo: Setting remote.origin.pushurl to #{val.push_url}"
375
+ gitconfig["remote.#{name}.pushurl"] = val.push_url
376
+ end
262
377
  end
263
- if val.push_server and val.push_url != gitconfig["remote.#{name}.pushurl"]
264
- logger.info "#{config.module.name}: Setting remote.origin.pushurl to #{val.push_url}"
265
- gitconfig["remote.#{name}.pushurl"] = val.push_url
378
+ end
379
+
380
+ # Check that the options are the same as configured.
381
+ config.merged_options.each do |name, val|
382
+ if val != gitconfig[name]
383
+ if val.empty?
384
+ next if gitconfig[name].nil?
385
+ logger.info "repo: git-config: Removing #{name}"
386
+ gitconfig.delete name if !$noop
387
+ else
388
+ logger.info "repo: git-config: Setting #{name} to #{val}"
389
+ gitconfig[name] = val if !$noop
390
+ end
266
391
  end
267
392
  end
268
393
 
269
394
  # Check if there is a commit template. If yes add it.
270
- if ( not gitconfig["commit.template"] ) && Pathname.new( local_path ).join( '.commit-template' ).exist?
395
+ if ( not gitconfig["commit.template"] and not config.merged_options["commit.template"] ) and Pathname.new( local_path ).join( '.commit-template' ).exist?
271
396
  logger.info "#{config.module.name}: git-config: Setting commit.template to .commit-template"
272
- gitconfig["commit.template"] = ".commit-template"
273
- end
397
+ gitconfig["commit.template"] = ".commit-template" if !$noop
274
398
 
399
+ end
400
+ @already_checked_config = true
275
401
  end
276
402
  end
277
403
 
278
404
  def ready_for_fetch
279
- if not Git.git_available
280
- logger.info( "#{config.module.name}: Calling `git` failed!" )
405
+ if not MJ::VCS::Git.git_available?
406
+ logger.error( "#{config.module.name}: Calling `git` failed!" )
407
+ return false
281
408
  end
282
- return Git.git_available
409
+
410
+ return true
283
411
  end
284
412
 
285
413
  # Check if the module is ready for a rebase.
286
414
  def ready_for_rebase
287
-
415
+ check_user_config
288
416
  if checkedout?
289
-
290
417
  # Check if the index is dirty.
291
418
  if git( "diff --exit-code" ) != 0
292
419
  logger.info( "#{config.module.name}: A dirty index will prevent the rebase." )
@@ -307,9 +434,18 @@ def ready_for_rebase
307
434
  true
308
435
  end
309
436
 
310
- def rebase
311
- if 0 != ( git "rebase #{config.track_remote}/#{config.track_branch}" )
312
- raise GitError, "Error while rebasing the repo with `#{config.track_remote}/#{config.track_branch}': #{$?}"
437
+ def rebase( verbose = false )
438
+ check_config
439
+ remote_branch = "#{config.track_remote}/#{config.track_branch}"
440
+
441
+ if verbose
442
+ git('log --first-parent HEAD..%s' % remote_branch ) do |line|
443
+ logger.info( line )
444
+ end
445
+ end
446
+
447
+ if 0 != ( git "rebase #{remote_branch}" )
448
+ raise GitError, "Error while rebasing the repo with `#{remote_branch}': #{$?}"
313
449
  end
314
450
  end
315
451
 
@@ -1,3 +1,6 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require 'mj/mixins/inherited_attributes'
1
4
  require 'build-tool/vcs/base'
2
5
  require 'build-tool/errors'
3
6
 
@@ -7,15 +10,16 @@ class MercurialError < BuildTool::Error; end
7
10
 
8
11
  class MercurialConfiguration < BaseConfiguration
9
12
 
13
+ include MJ::Mixins::InheritedAttributes
14
+
10
15
  def name
11
16
  "mercurial"
12
17
  end
13
18
 
14
- attr_accessor :remote
15
-
16
- def initialize( mod = nil )
17
- super( mod )
18
- @remote = {}
19
+ def initialize
20
+ super
21
+ @url = nil
22
+ @track = nil
19
23
  end
20
24
 
21
25
  def vcs( mod )
@@ -24,13 +28,17 @@ def vcs( mod )
24
28
  Mercurial.new( self )
25
29
  end
26
30
 
27
- def branch
28
- self.module.remote_path
31
+ attr_writer :track
32
+ def track
33
+ return @track if @track
34
+ return parent.track if @parent
35
+ return 'default'
29
36
  end
30
37
 
38
+ inherited_attr_accessor :url
39
+
31
40
  def copy_configuration( other )
32
41
  super
33
- @remote = {} # Do not copy the remote
34
42
  end
35
43
  end
36
44
 
@@ -41,7 +49,6 @@ class Mercurial < Base
41
49
 
42
50
  def initialize( config )
43
51
  super( config )
44
- @remote = {}
45
52
  @vcs = nil
46
53
  end
47
54
 
@@ -77,7 +84,7 @@ def clone
77
84
  FileUtils.mkdir_p Pathname.new( local_path ).dirname if ! $noop
78
85
 
79
86
  # Initialize the repository
80
- if hg( "clone #{repository.url} #{local_path}", Pathname.new( local_path ).dirname) != 0
87
+ if hg( "clone #{config.url} #{local_path}", Pathname.new( local_path ).dirname) != 0
81
88
  raise MercurialError, "Error while initializing the repo `hg init #{local_path}'`: #{$?}"
82
89
  end
83
90
 
@@ -92,7 +99,7 @@ def fetch()
92
99
  if !checkedout? and !$noop
93
100
  clone
94
101
  end
95
- cmd = "pull #{repository.url}"
102
+ cmd = "pull #{config.url}"
96
103
  if ( rc = hg( cmd ) ) != 0
97
104
  raise MercurialError, "Error while fetching: #{rc}"
98
105
  end
@@ -106,8 +113,13 @@ def hg( command, wd = local_path, &block )
106
113
  rc
107
114
  end
108
115
 
109
- def rebase
110
- if 0 != ( hg "update #{config.branch}" )
116
+ def rebase( verbose = false )
117
+
118
+ if verbose
119
+ logger.info( 'Verbose rebase not yet implemented for mercurial.' )
120
+ end
121
+
122
+ if 0 != ( hg "update #{config.track}" )
111
123
  raise MercurialSvnError, "Error while rebasing the repo with `hg update: #{$?}"
112
124
  end
113
125
  end
@@ -1,9 +1,15 @@
1
+ # -*- coding: UTF-8 -*-
2
+
1
3
  require 'build-tool/vcs/base'
2
4
 
5
+ require 'mj/mixins/inherited_attributes'
6
+
3
7
  module BuildTool; module VCS
4
8
 
5
9
  class SvnConfiguration < BaseConfiguration
6
10
 
11
+ include MJ::Mixins::InheritedAttributes
12
+
7
13
  def initialize
8
14
  super
9
15
  @only = nil
@@ -18,14 +24,10 @@ def name
18
24
  def vcs( mod )
19
25
  raise StandardError if @module and ! mod.equal?( @module )
20
26
  @module = mod
21
- Svn.new( self )
27
+ Svn.new( self )
22
28
  end
23
29
 
24
- attr_reader :only
25
- def only=( list )
26
- @only = list
27
- puts @only.inspect
28
- end
30
+ inherited_attr_accessor :only
29
31
 
30
32
  def copy_configuration( other )
31
33
  super
@@ -34,18 +36,16 @@ def copy_configuration( other )
34
36
 
35
37
  attr_writer :repository
36
38
  def repository
37
- if @repository.nil?
38
- raise ConfigurationError, "No repository configured for module #{@module.name}."
39
- end
40
- @repository
39
+ return @repository if @repository # Our repository
40
+ return parent.repository if @parent # Our parents repository
41
+ raise ConfigurationError, "No repository configured for module #{self.module ? self.module.name : 'unknown' }."
41
42
  end
42
43
 
43
44
  attr_writer :remote_path
44
45
  def remote_path
45
- if @remote_path.nil?
46
- return @module.name
47
- end
48
- @remote_path
46
+ return @remote_path if @remote_path
47
+ return parent.remote_path if @parent
48
+ return @module.name
49
49
  end
50
50
 
51
51
  end
@@ -180,7 +180,12 @@ def self.svn( command, wd, &block )
180
180
  rc
181
181
  end
182
182
 
183
- def rebase
183
+ def rebase( verbose = false )
184
+
185
+ if verbose
186
+ logger.info( 'Verbose rebase not yet implemented for subversion.' )
187
+ end
188
+
184
189
  # Rebasing is not supported
185
190
  0
186
191
  end