build-tool 0.4.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/History.txt CHANGED
@@ -1,11 +1,3 @@
1
- == 0.4.6
2
- - Bugfix
3
- - Recent rexical version seem to work differently. Fix generated lexer.
4
-
5
- == 0.4.5
6
- - Bugfix
7
- - Readd the missing lexer.rb and parser.rb files.
8
-
9
1
  == 0.4.4
10
2
  - Enhancements
11
3
  - More ways to specify a module on the command line.
data/Manifest.txt CHANGED
@@ -24,8 +24,6 @@ lib/build-tool/cfg/lexer_base.rb
24
24
  lib/build-tool/cfg/node.rb
25
25
  lib/build-tool/cfg/parser.y
26
26
  lib/build-tool/cfg/visitor.rb
27
- lib/build-tool/cfg/parser.rb
28
- lib/build-tool/cfg/lexer.rb
29
27
  lib/build-tool/command_actions.rb
30
28
  lib/build-tool/commands.rb
31
29
  lib/build-tool/commands/build.rb
data/lib/build-tool.rb CHANGED
@@ -2,6 +2,6 @@
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
4
  module BuildTool
5
- VERSION = '0.4.6'
5
+ VERSION = '0.5.0'
6
6
  end
7
7
 
@@ -154,12 +154,34 @@ rule
154
154
  :ENVIRONMENT {STRINGERROR} { [:GARBAGE, text]; }
155
155
  :ENVIRONMENT . { [:GARBAGE, text]; }
156
156
 
157
+ #
158
+ ### GIT_SVN
159
+ #
160
+ :GIT_SVN external\b { [:EXTERNAL, text]; }
161
+ :GIT_SVN use\b { @states.push @state; @state = :USE; [:USE, text]; }
162
+ :GIT_SVN track\b { [:TRACK, text]; }
163
+ :GIT_SVN ssh-key\b { @states.push @state; @state = :SSH_KEY; [:SSH_KEY, text]; }
164
+ :GIT_SVN repository\b { @states.push @state; @state = :REPOSITORY; [:REPOSITORY, text]; }
165
+ :GIT_SVN remote-path\b { [:REMOTE_PATH, text]; }
166
+ :GIT_SVN remote\b { @states.push @state; @state = :GIT_REMOTE; [:REMOTE, text]; }
167
+ :GIT_SVN end\b { @state = @states.pop; [ :END, text ]; }
168
+ # COMMON
169
+ :GIT_SVN {STRING} { [:STRING, @ss[1]]; }
170
+ :GIT_SVN {TOKEN} { [:TOKEN, text]; }
171
+ :GIT_SVN {COMMENT} { [:COMMENT, text]; }
172
+ :GIT_SVN {BLANK} { [:IGNORE, text]; }
173
+ :GIT_SVN {LF} { [:IGNORE, text]; }
174
+ :GIT_SVN {STRINGERROR} { [:GARBAGE, text]; }
175
+ :GIT_SVN . { [:GARBAGE, text]; }
176
+
157
177
  #
158
178
  ### GIT
159
179
  #
160
- :GIT external\b { [:EXTERNAL, text]; }
161
- :GIT track-branch\b { [:TRACK_BRANCH, text]; }
162
- :GIT remote\b { @states.push @state; @state = :REPOSITORY; [:REMOTE, text]; }
180
+ :GIT url\b { [:URL, text]; }
181
+ :GIT track\b { [:TRACK, text]; }
182
+ :GIT push\b { [:PUSH, text]; }
183
+ :GIT ssh-key\b { @states.push @state; @state = :SSH_KEY; [:SSH_KEY, text]; }
184
+ :GIT remote\b { @states.push @state; @state = :GIT_REMOTE; [:REMOTE, text]; }
163
185
  :GIT end\b { @state = @states.pop; [ :END, text ]; }
164
186
  # COMMON
165
187
  :GIT {STRING} { [:STRING, @ss[1]]; }
@@ -170,6 +192,22 @@ rule
170
192
  :GIT {STRINGERROR} { [:GARBAGE, text]; }
171
193
  :GIT . { [:GARBAGE, text]; }
172
194
 
195
+ #
196
+ ### GIT REMOTE
197
+ #
198
+ :GIT_REMOTE url\b { [:URL, text]; }
199
+ :GIT_REMOTE push\b { [:PUSH, text]; }
200
+ :GIT_REMOTE ssh-key\b { @states.push @state; @state = :SSH_KEY; [:SSH_KEY, text]; }
201
+ :GIT_REMOTE end\b { @state = @states.pop; [ :END, text ]; }
202
+ # COMMON
203
+ :GIT_REMOTE {STRING} { [:STRING, @ss[1]]; }
204
+ :GIT_REMOTE {TOKEN} { [:TOKEN, text]; }
205
+ :GIT_REMOTE {COMMENT} { [:COMMENT, text]; }
206
+ :GIT_REMOTE {BLANK} { [:IGNORE, text]; }
207
+ :GIT_REMOTE {LF} { [:IGNORE, text]; }
208
+ :GIT_REMOTE {STRINGERROR} { [:GARBAGE, text]; }
209
+ :GIT_REMOTE . { [:GARBAGE, text]; }
210
+
173
211
  #
174
212
  ### MODULE
175
213
  #
@@ -181,12 +219,10 @@ rule
181
219
  :MODULE description\b { [:DESCRIPTION, text ]; }
182
220
  :MODULE install-prefix\b { [:INSTALL_PREFIX, text]; }
183
221
  :MODULE local-path\b { [:LOCAL_PATH, text]; }
184
- :MODULE remote-path\b { [:REMOTE_PATH, text]; }
185
222
  :MODULE TEMPLATE\b { [:TEMPLATE, text]; }
186
223
 
187
224
  :MODULE build-system\b { @states.push @state; @state = :BUILD_SYSTEM; [:BUILD_SYSTEM, text]; }
188
225
  :MODULE environment\b { @states.push @state; @state = :ENVIRONMENT; [:ENVIRONMENT, text]; }
189
- :MODULE repository\b { @states.push @state; @state = :REPOSITORY; [:REPOSITORY, text]; }
190
226
  :MODULE use\b { @states.push @state; @state = :USE; [:USE, text]; }
191
227
  :MODULE vcs\b { @states.push @state; @state = :VCS; [:VCS, text]; }
192
228
 
@@ -253,8 +289,11 @@ rule
253
289
  #
254
290
  ### SVN
255
291
  #
256
- :SVN only\b { [:ONLY, text]; }
257
- :SVN end\b { @state = @states.pop; [ :END, text ]; }
292
+ :SVN only\b { [:ONLY, text]; }
293
+ :SVN end\b { @state = @states.pop; [ :END, text ]; }
294
+ :SVN repository\b { @states.push @state; @state = :REPOSITORY; [:REPOSITORY, text]; }
295
+ :SVN use\b { @states.push @state; @state = :USE; [:USE, text]; }
296
+ :SVN remote-path\b { [:REMOTE_PATH, text]; }
258
297
  # COMMON
259
298
  :SVN {STRING} { [:STRING, @ss[1]]; }
260
299
  :SVN {TOKEN} { [:TOKEN, text]; }
@@ -285,7 +324,7 @@ rule
285
324
  #
286
325
  ### VCS
287
326
  #
288
- :VCS git-svn\b { @state = :GIT; [:GIT_SVN, text]; }
327
+ :VCS git-svn\b { @state = :GIT_SVN; [:GIT_SVN, text]; }
289
328
  :VCS git\b { @state = :GIT; [:GIT, text]; }
290
329
  :VCS svn\b { @state = :SVN; [:SVN, text]; }
291
330
  :VCS archive\b { @state = :ARCHIVE; [:ARCHIVE, text]; }
@@ -44,6 +44,10 @@ def initialize(values = nil)
44
44
 
45
45
  GitDeclaration
46
46
  GitRemotePath
47
+ GitRemoteUrl
48
+ GitRemoteDeclaration
49
+ GitRemotePush
50
+ GitTrack
47
51
  GitServer
48
52
 
49
53
  GitSvnExternal
@@ -56,10 +60,8 @@ def initialize(values = nil)
56
60
  ModuleDeclaration
57
61
  ModuleInstallPrefix
58
62
  ModuleLocalPath
59
- ModuleRemotePath
60
63
  ModuleTemplate
61
64
 
62
- RemoteDeclaration
63
65
  RepositoryDeclaration
64
66
  RepositoryPath
65
67
  RepositoryUser
@@ -74,6 +76,7 @@ def initialize(values = nil)
74
76
 
75
77
  SvnDeclaration
76
78
  SvnCheckoutOnly
79
+ SvnRemotePath
77
80
 
78
81
  UseBuildSystem
79
82
  UseEnvironment
@@ -30,6 +30,7 @@ class BuildTool::Cfg::Parser < BuildTool::Cfg::Lexer
30
30
  token PATH
31
31
  token PREPEND
32
32
  token PROTOCOL
33
+ token PUSH
33
34
  token REMOTE
34
35
  token REMOTE_PATH
35
36
  token REPOSITORY
@@ -41,7 +42,8 @@ class BuildTool::Cfg::Parser < BuildTool::Cfg::Lexer
41
42
  token SVN
42
43
  token TEMPLATE
43
44
  token TOKEN
44
- token TRACK_BRANCH
45
+ token TRACK
46
+ token URL
45
47
  token USE
46
48
  token USER
47
49
  token VAR
@@ -185,13 +187,27 @@ rule
185
187
  : VCS GIT git_statements END { result = GitDeclarationNode.new( val[2] ); }
186
188
  ;
187
189
 
190
+ git_remote_statements
191
+ : /* empty */
192
+ | git_remote_statement git_remote_statements { result = val.flatten(); }
193
+ ;
194
+
195
+ git_remote_statement
196
+ : URL STRING STRING { result = GitRemoteUrlNode.new( val[1..-1] ); }
197
+ | URL STRING { result = GitRemoteUrlNode.new( val[1..-1] ); }
198
+ | PUSH STRING STRING { result = GitRemotePushNode.new( val[1..-1] ); }
199
+ | PUSH STRING { result = GitRemotePushNode.new( val[1..-1] ); }
200
+ ;
201
+
188
202
  git_statements
189
203
  : /* empty */
190
- | git_statement git_statements { result = val.flatten; }
204
+ | git_statement git_statements { result = val.flatten; }
191
205
  ;
192
206
 
193
207
  git_statement
194
- : REMOTE STRING repository_statements END { result = RemoteDeclarationNode.new( val[1..-1]); }
208
+ : REMOTE STRING git_remote_statements END { result = GitRemoteDeclarationNode.new( val[1..-1]); }
209
+ | TRACK STRING { result = GitTrackNode.new( val[1] ); }
210
+ | git_remote_statement { result = val[0]; }
195
211
  ;
196
212
 
197
213
  #
@@ -207,8 +223,11 @@ rule
207
223
  ;
208
224
 
209
225
  git_svn_statement
210
- : git_statement { result = val[0]; }
211
- | EXTERNAL STRING { result = GitSvnExternalNode.new( val[1] ); }
226
+ : git_statement { result = val[0]; }
227
+ | USE REPOSITORY identifier { result = UseRepositoryNode.new( val[2] ); }
228
+ | EXTERNAL STRING { result = GitSvnExternalNode.new( val[1] ); }
229
+ | REMOTE_PATH STRING { result = SvnRemotePathNode.new( val[1] ); }
230
+ | repository_declaration { result = val[0]; }
212
231
  ;
213
232
 
214
233
  #
@@ -234,17 +253,14 @@ rule
234
253
  module_statement
235
254
  : USE BUILD_SYSTEM identifier { result = UseBuildSystemNode.new( val[2] ); }
236
255
  | USE ENVIRONMENT identifier { result = UseEnvironmentNode.new( val[2] ); }
237
- | USE REPOSITORY identifier { result = UseRepositoryNode.new( val[2] ); }
238
256
  | USE VCS identifier { result = UseVcsNode.new( val[2] ); }
239
257
  | LONG DESCRIPTION multiline_string { result = LongDescriptionNode.new( val[2] ); }
240
258
  | DESCRIPTION STRING { result = ShortDescriptionNode.new( val[1] ); }
241
259
  | build_system_declaration { result = val[0]; }
242
260
  | vcs_declaration { result = val[0]; }
243
- | repository_declaration { result = val[0]; }
244
261
  | environment_declaration { result = val[0]; }
245
262
  | INSTALL_PREFIX STRING { result = ModuleInstallPrefixNode.new( val[1] ); }
246
263
  | BUILD_PREFIX STRING { result = ModuleBuildPrefixNode.new( val[1] ); }
247
- | REMOTE_PATH STRING { result = ModuleRemotePathNode.new( val[1] ); }
248
264
  | LOCAL_PATH STRING { result = ModuleLocalPathNode.new( val[1] ); }
249
265
  | TEMPLATE { result = ModuleTemplateNode.new(); }
250
266
  | APPLY PATCH STRING { result = ApplyPatchesNode.new(val[2]); }
@@ -321,6 +337,9 @@ rule
321
337
 
322
338
  svn_statement
323
339
  : ONLY STRING { result = SvnCheckoutOnlyNode.new(val[1]); }
340
+ | USE REPOSITORY identifier { result = UseRepositoryNode.new( val[2] ); }
341
+ | REMOTE_PATH STRING { result = SvnRemotePathNode.new( val[1] ); }
342
+ | repository_declaration { result = val[0]; }
324
343
  ;
325
344
 
326
345
  #
@@ -21,6 +21,10 @@ def initialize( configuration )
21
21
  @configuration = configuration
22
22
  end
23
23
 
24
+ def visit_Object( object )
25
+ raise "#{self.class}: Not a visitor for #{object.class}!"
26
+ end
27
+
24
28
  end # class VisitorBase
25
29
 
26
30
 
@@ -297,22 +301,67 @@ def visit_ShortDescriptionNode( node )
297
301
  end # class FeatureNodeVisitor
298
302
 
299
303
 
300
- class GitDeclarationNodeVisitor < ListVisitor
304
+
305
+ class GitRemoteDeclarationNodeVisitor < ListVisitor
306
+
307
+ def visit_GitRemoteDeclarationNode( node )
308
+ name = node.values[0]
309
+ @remote = BuildTool::VCS::GitRemote.new( name )
310
+ stmts = node.values[1]
311
+ visit_nodes( stmts )
312
+ return @remote
313
+ end
314
+
315
+ def visit_GitRemoteUrlNode( node )
316
+ if node.values.length == 2
317
+ @remote.server = configuration.server( node.values[0] )
318
+ if @remote.server.nil?
319
+ raise ConfigurationError, "Unknown server #{node.values[0]} configured."
320
+ end
321
+ @remote.path = node.values[1]
322
+ else
323
+ @remote.server = BuildTool::Server.new( "unnamed" )
324
+ @remote.server.host = node.values[0]
325
+ end
326
+ end
327
+
328
+ def visit_GitRemotePushNode( node )
329
+ @remote.push_server = configuration.server( node.values[0] )
330
+ if @remote.push_server.nil?
331
+ raise ConfigurationError, "Unknown server #{node.values[0]} configured."
332
+ end
333
+ @remote.push_path = node.values[1]
334
+ end
335
+
336
+ end # class GitRemoteDeclarationNodeVisitor
337
+
338
+
339
+
340
+ class GitDeclarationNodeVisitor < GitRemoteDeclarationNodeVisitor
301
341
 
302
342
  def initialize( configuration, vcs = BuildTool::VCS::GitConfiguration.new )
303
343
  super( configuration )
344
+ @remote = BuildTool::VCS::GitRemote.new( "origin" )
304
345
  @vcs = vcs
346
+ @vcs.remote[@remote.name] = @remote
305
347
  end
306
348
 
307
349
  def visit_GitDeclarationNode( node )
308
350
  visit_nodes( node.values )
351
+ if @remote.server.nil? and @remote.path.nil?
352
+ @vcs.remote.delete( "origin" )
353
+ end
309
354
  return @vcs
310
355
  end
311
356
 
312
- def visit_RemoteDeclarationNode( node )
313
- visitor = RepositoryDeclarationNodeVisitor.new( configuration )
314
- repo = node.accept(visitor)
315
- @vcs.remote[repo.name] = repo
357
+ def visit_GitRemoteDeclarationNode( node )
358
+ visitor = GitRemoteDeclarationNodeVisitor.new( configuration )
359
+ remote = node.accept(visitor)
360
+ @vcs.remote[remote.name] = remote
361
+ end
362
+
363
+ def visit_GitTrackNode( node )
364
+ @vcs.track = node.values
316
365
  end
317
366
 
318
367
  end # class GitDeclarationNodeVisitor
@@ -326,6 +375,9 @@ def initialize( configuration, vcs )
326
375
 
327
376
  def visit_GitSvnDeclarationNode( node )
328
377
  visit_nodes( node.values )
378
+ if @remote.server.nil? and @remote.path.nil?
379
+ @vcs.remote.delete( "origin" )
380
+ end
329
381
  return @vcs
330
382
  end
331
383
 
@@ -334,6 +386,23 @@ def visit_GitSvnExternalNode( node )
334
386
  @vcs.add_external( name, value )
335
387
  end
336
388
 
389
+ def visit_RepositoryDeclarationNode( node )
390
+ visitor = RepositoryDeclarationNodeVisitor.new( configuration )
391
+ @vcs.repository = node.accept( visitor )
392
+ end
393
+
394
+ def visit_UseRepositoryNode( node )
395
+ repo = configuration.repository( node.value )
396
+ if repo.nil?
397
+ raise ConfigurationError, "Unknown repository #{node.value}!"
398
+ end
399
+ @vcs.repository = repo
400
+ end
401
+
402
+ def visit_SvnRemotePathNode( node )
403
+ @vcs.remote_path = node.value
404
+ end
405
+
337
406
  end # class GitSvnDeclarationNodeVisitor
338
407
 
339
408
 
@@ -410,12 +479,8 @@ def visit_GitDeclarationNode( node )
410
479
  # vcs.copy_configuration( @module.vcs_configuration )
411
480
  # end
412
481
  @module.vcs_configuration = vcs
413
- begin
414
- visitor = GitDeclarationNodeVisitor.new( configuration, vcs )
415
- node.accept( visitor )
416
- rescue ConfigurationError => e
417
- raise ConfigurationError, "Module #{@module.name}: #{e.to_s}"
418
- end
482
+ visitor = GitDeclarationNodeVisitor.new( configuration, vcs )
483
+ node.accept( visitor )
419
484
  end
420
485
 
421
486
  def visit_GitSvnDeclarationNode( node )
@@ -465,7 +530,11 @@ def visit_ModuleDeclarationNode( node )
465
530
  configuration.active_feature.modules << @module
466
531
  end
467
532
  end
468
- self.visit_nodes( stmts )
533
+ begin
534
+ self.visit_nodes( stmts )
535
+ rescue ConfigurationError => e
536
+ raise ConfigurationError, "Module #{@module.name}: #{e.to_s}"
537
+ end
469
538
  end
470
539
 
471
540
  def visit_ModuleInstallPrefixNode( node )
@@ -476,19 +545,10 @@ def visit_ModuleLocalPathNode( node )
476
545
  @module.local_path = node.value
477
546
  end
478
547
 
479
- def visit_ModuleRemotePathNode( node )
480
- @module.remote_path = node.value
481
- end
482
-
483
548
  def visit_ModuleTemplateNode( node )
484
549
  @module.is_template = true
485
550
  end
486
551
 
487
- def visit_RepositoryDeclarationNode( node )
488
- visitor = RepositoryDeclarationNodeVisitor.new( configuration )
489
- @module.repository = node.accept( visitor )
490
- end
491
-
492
552
  def visit_ShortDescriptionNode( node )
493
553
  if !@module.description.nil?
494
554
  logger.warn "Overwriting short description for module #{@module.name}"
@@ -521,13 +581,6 @@ def visit_UseEnvironmentNode( node )
521
581
  end
522
582
  end
523
583
 
524
- def visit_UseRepositoryNode( node )
525
- @module.repository = configuration.repository( node.value )
526
- if @module.repository.nil?
527
- raise ConfigurationError, "Unknown repository #{node.value} configured for module #{@module.name}!"
528
- end
529
- end
530
-
531
584
  def visit_UseVcsNode( node )
532
585
  @module.vcs_configuration = configuration.vcs(node.value)
533
586
  end
@@ -549,14 +602,6 @@ def visit_RepositoryDeclarationNode( node )
549
602
  return @repository
550
603
  end
551
604
 
552
- def visit_RemoteDeclarationNode( node )
553
- name = node.values[0]
554
- @repository = BuildTool::Repository.new( name )
555
- stmts = node.values[1]
556
- visit_nodes( stmts )
557
- return @repository
558
- end
559
-
560
605
  def visit_RepositoryPathNode( node )
561
606
  @repository.path = node.value
562
607
  end
@@ -663,7 +708,8 @@ def visit_SshKeyFileNode( node )
663
708
  class SvnDeclarationNodeVisitor < ListVisitor
664
709
 
665
710
  def initialize( configuration, vcs )
666
- super( configuration, vcs )
711
+ super( configuration )
712
+ @vcs = vcs
667
713
  end
668
714
 
669
715
  def visit_SvnDeclarationNode( node )
@@ -675,6 +721,24 @@ def visit_SvnCheckoutOnlyNode( node )
675
721
  @vcs.only = node.value.split( / +/ )
676
722
  end
677
723
 
724
+ def visit_RepositoryDeclarationNode( node )
725
+ visitor = RepositoryDeclarationNodeVisitor.new( configuration )
726
+ @vcs.repository = node.accept( visitor )
727
+ end
728
+
729
+ def visit_UseRepositoryNode( node )
730
+ repo = configuration.repository( node.value )
731
+ if repo.nil?
732
+ raise ConfigurationError, "Unknown repository #{node.value}!"
733
+ end
734
+ @vcs.repository = repo
735
+ end
736
+
737
+ def visit_SvnRemotePathNode( node )
738
+ @vcs.remote_path = node.value
739
+ end
740
+
741
+
678
742
  end # class SvnDeclarationNodeVisitor
679
743
 
680
744
  end; end
@@ -521,7 +521,13 @@ def do_execute( args )
521
521
  # 2. Check prerequisites
522
522
  isready = true
523
523
  modules.each do |mod|
524
- isready &= is_module_ready?( mod )
524
+ begin
525
+ isready &= is_module_ready?( mod )
526
+ rescue Exception => e
527
+ logger.error "#{mod.name}: #{e.message}"
528
+ logger.verbose e.backtrace.join("\n")
529
+ isready = false
530
+ end
525
531
  end
526
532
 
527
533
  if !isready
@@ -22,15 +22,15 @@ def do_execute_module( mod )
22
22
 
23
23
  say "Active: #{mod.active?}"
24
24
 
25
- if mod.repository
26
- say "Repository: #{mod.repository.url}/#{mod.remote_path}"
27
- if mod.repository.sshkey
28
- say " SSH Key: '#{mod.repository.sshkey.name}' (#{mod.repository.sshkey.file})"
29
- end
30
- say "Apply Patches: #{mod.patches.join(", ")}"
31
- else
32
- say "Repository: not configured"
33
- end
25
+ # if mod.repository
26
+ # say "Repository: #{mod.repository.url}/#{mod.remote_path}"
27
+ # if mod.repository.sshkey
28
+ # say " SSH Key: '#{mod.repository.sshkey.name}' (#{mod.repository.sshkey.file})"
29
+ # end
30
+ # say "Apply Patches: #{mod.patches.join(", ")}"
31
+ # else
32
+ # say "Repository: not configured"
33
+ # end
34
34
 
35
35
  if mod.build_prefix
36
36
  say "Local Checkout: #{mod.vcs.local_path} #{mod.checkedout? ? '(EXISTS)' : '(TODO)' }"
@@ -53,15 +53,19 @@ def do_execute_module( mod )
53
53
  if mod.vcs_configuration
54
54
  case mod.vcs_configuration.name
55
55
  when 'svn'
56
+ say " Repository: %s/%s" % [ mod.vcs_configuration.repository.url, mod.vcs_configuration.remote_path ]
56
57
  when 'archive'
57
58
  when 'git'
58
- say " Remote: %s -> %s" % [ "origin", mod.vcs_configuration.repository.url ]
59
59
  mod.vcs_configuration.remote.each do |key, val|
60
- say " Remote: %s -> %s" % [ key, val.url ]
60
+ if val.push_url
61
+ say " Remote: %s -> %s (push to %s)" % [ key, val.url, val.push_url ]
62
+ else
63
+ say " Remote: %s -> %s" % [ key, val.url ]
64
+ end
61
65
  end
62
66
  say " Track branch: #{mod.vcs_configuration.track_remote}/#{mod.vcs_configuration.track_branch}"
63
67
  when 'git-svn'
64
- say " Remote: %s -> %s" % [ "git-svn", mod.vcs_configuration.repository.url ]
68
+ say " Repository: %s/%s" % [ mod.vcs_configuration.repository.url, mod.vcs_configuration.remote_path ]
65
69
  mod.vcs_configuration.remote.each do |key, val|
66
70
  say " Remote: %s -> %s" % [ key, val.url ]
67
71
  end
@@ -23,7 +23,6 @@ def initialize( name, parent = nil )
23
23
  @remote_path = nil
24
24
  @environment = nil
25
25
  @build_system = nil
26
- @repository = nil
27
26
  @install_prefix = nil
28
27
  @is_template = false
29
28
  @vcs_configuration = nil
@@ -205,22 +204,6 @@ def remote_path
205
204
  @remote_path || @name
206
205
  end
207
206
 
208
- # Repository
209
- def repository=( repository )
210
- @repository = repository
211
- end
212
-
213
- def repository
214
- return @repository if @repository
215
- return @parent.repository if @parent && @parent.repository
216
- end
217
-
218
- def repository_required
219
- repo = self.repository
220
- return repo if repo
221
- raise ConfigurationError, "No repository configured for #{name}!"
222
- end
223
-
224
207
  def source_directory
225
208
  build_prefix_required.join("src", local_path)
226
209
  end
@@ -253,12 +236,6 @@ def vcs_configuration_required
253
236
  end
254
237
 
255
238
  def vcs_required
256
- if repository.nil?
257
- raise ConfigurationError, "No repository specified for module #{name}."
258
- end
259
- if remote_path.nil?
260
- raise ConfigurationError, "No remote path specified for module #{name}."
261
- end
262
239
  if source_directory.nil?
263
240
  raise ConfigurationError, "No source directory specified for module #{name}."
264
241
  end
@@ -340,14 +317,9 @@ def cleanup_after_vcs_access
340
317
 
341
318
  # Check if an ssh-key is required and active it if necessary
342
319
  def prepare_for_vcs_access
343
- if key = repository_required.sshkey
344
- if !MJ::Tools::SSH::has_key? key.file
345
- logger.info ""
346
- logger.info "#### Adding required ssh-key #{key.file} to ssh-agent."
347
- MJ::Tools::SSH::add_key key.file
348
- end
320
+ if vcs
321
+ return vcs.prepare_for_access
349
322
  end
350
- return true
351
323
  end
352
324
 
353
325
  def prepare_for_installation
@@ -36,7 +36,7 @@ def sshkey
36
36
  return @sshkey if @sshkey
37
37
 
38
38
  if !server
39
- raise ConfigurationError, "No server specified for repository #{name}"
39
+ return nil
40
40
  end
41
41
 
42
42
  return server.sshkey
@@ -40,6 +40,10 @@ def url
40
40
  url
41
41
  end
42
42
 
43
+ def to_s
44
+ "Server: #{url}"
45
+ end
46
+
43
47
  end # class Server
44
48
 
45
49
 
@@ -12,14 +12,6 @@ def initialize
12
12
  @module = nil
13
13
  end
14
14
 
15
- def remote_path
16
- @module.remote_path
17
- end
18
-
19
- def repository
20
- @module.repository
21
- end
22
-
23
15
  def local_path
24
16
  @module.source_directory
25
17
  end
@@ -69,18 +61,6 @@ def local_path
69
61
  local_path
70
62
  end
71
63
 
72
- def remote_path
73
- remote_path = @config.remote_path
74
- raise ConfigurationError, "#{self.class}.remote_path not set" if remote_path.nil?
75
- remote_path
76
- end
77
-
78
- def repository
79
- repository = @config.repository
80
- raise ConfigurationError, "#{self.class}.repository not set" if repository.nil?
81
- repository
82
- end
83
-
84
64
  #
85
65
  ### METHODS
86
66
  #
@@ -94,6 +74,15 @@ def configure
94
74
  logger.debug "VCS #{name} did not implement configure!"
95
75
  end
96
76
 
77
+ def prepare_for_vcs_access
78
+ if key = repository.ssh_key and !MJ::Tools::SSH::has_key? key.file
79
+ logger.info ""
80
+ logger.info "#### Adding required ssh-key #{key.file} to ssh-agent."
81
+ MJ::Tools::SSH::add_key key.file
82
+ end
83
+ return true
84
+ end
85
+
97
86
  def recipe
98
87
  Application::instance.recipe
99
88
  end
@@ -32,6 +32,25 @@ def copy_configuration( other )
32
32
  @externals = {} # Do not copy the externals
33
33
  end
34
34
 
35
+ attr_writer :repository
36
+ def repository
37
+ if @repository.nil?
38
+ raise ConfigurationError, "No repository configured for module #{self.module.name}."
39
+ end
40
+ @repository
41
+ end
42
+
43
+ attr_writer :remote_path
44
+ def remote_path
45
+ if @remote_path.nil?
46
+ return @module.name
47
+ end
48
+ @remote_path
49
+ end
50
+
51
+ def track_branch
52
+ "git-svn"
53
+ end
35
54
  end
36
55
 
37
56
  #
@@ -75,8 +94,8 @@ def clone
75
94
  # Create the directory
76
95
  FileUtils.mkdir_p( local_path ) if !$noop
77
96
  # Init the repository
78
- if 0 != ( git_svn "init #{repository.url}/#{remote_path}" )
79
- raise GitSvnError, "Error while initializing the repo `git svn init '#{repository}/#{remote_path}'`: #{$?}"
97
+ if 0 != ( git_svn "init #{config.repository.url}/#{remote_path}" )
98
+ raise GitSvnError, "Error while initializing the repo `git svn init '#{config.repository}/#{remote_path}'`: #{$?}"
80
99
  end
81
100
  fetch( "HEAD" )
82
101
  end
@@ -123,8 +142,25 @@ def git_svn( command, wd = local_path, &block )
123
142
  rc
124
143
  end
125
144
 
145
+ def prepare_for_access
146
+ # If our server has an associated ssh-key, add it to the ssh-agent.
147
+ if config.repository.sshkey
148
+ key = config.repository.sshkey
149
+ logger.info ""
150
+ logger.info "#### Adding required ssh-key #{key.file} to ssh-agent."
151
+ MJ::Tools::SSH::add_key key.file
152
+ end
153
+ true
154
+ end
155
+
126
156
  def rebase
127
- git.git( "rebase git-svn" )
157
+ if 0 != ( git.git "rebase #{config.track_branch}" )
158
+ raise GitSvnError, "Error while rebasing the repo with `#{config.track_branch}': #{$?}"
159
+ end
160
+ end
161
+
162
+ def remote_path
163
+ @config.remote_path
128
164
  end
129
165
 
130
166
  def update_externals
@@ -1,10 +1,88 @@
1
1
  require 'build-tool/vcs/base'
2
2
  require 'build-tool/errors'
3
+ require 'grit'
3
4
 
4
5
  module BuildTool; module VCS
5
6
 
6
7
  class GitError < BuildTool::Error; end
7
8
 
9
+ class GitRemote
10
+
11
+ # The name for the remote
12
+ attr_accessor :name
13
+
14
+ # The hostname for the remote
15
+ attr_accessor :server
16
+
17
+ # The path for the remote
18
+ attr_accessor :path
19
+
20
+ # The hostname to push to for the remote
21
+ attr_accessor :push_server
22
+
23
+ # The path to push to for the remote
24
+ attr_accessor :push_path
25
+
26
+ attr_reader :user
27
+
28
+ def initialize( name )
29
+ self.name = name
30
+ @user = nil
31
+ end
32
+
33
+ def url
34
+ if !server
35
+ raise ConfigurationError, "No server specified for remote #{name}"
36
+ end
37
+ if !server.host
38
+ raise ConfigurationError, "No host specified for server #{server.name}"
39
+ end
40
+
41
+ url = server.host
42
+ if server.path
43
+ url = "#{url}/#{server.path}"
44
+ end
45
+ if user
46
+ url = "#{user}@#{url}"
47
+ end
48
+ if server.protocol
49
+ url = "#{server.protocol}://#{url}"
50
+ end
51
+ if path
52
+ url = "#{url}/#{path}"
53
+ end
54
+ url
55
+ end
56
+
57
+ # Returns the pushUrl configured or nil if not configured.
58
+ def push_url
59
+ if !push_server
60
+ return nil
61
+ end
62
+ if !push_server.host
63
+ raise ConfigurationError, "No host specified for server #{push_server.name}"
64
+ end
65
+
66
+ url = push_server.host
67
+ if push_server.path
68
+ url = "#{url}/#{push_server.path}"
69
+ end
70
+ if user
71
+ url = "#{user}@#{url}"
72
+ end
73
+ if push_server.protocol
74
+ url = "#{push_server.protocol}://#{url}"
75
+ end
76
+ if path
77
+ url = "#{url}/#{path}"
78
+ end
79
+ url
80
+ end
81
+
82
+ end
83
+
84
+
85
+
8
86
  class GitConfiguration < BaseConfiguration
9
87
 
10
88
  def name
@@ -16,6 +94,7 @@ def name
16
94
  def initialize
17
95
  super
18
96
  @remote = {}
97
+ @track = "origin/master"
19
98
  end
20
99
 
21
100
  def vcs( mod )
@@ -24,8 +103,11 @@ def vcs( mod )
24
103
  Git.new( self )
25
104
  end
26
105
 
106
+ # The branch to track
107
+ attr_accessor :track
108
+
27
109
  def track_remote
28
- rc = self.module.remote_path.split('/')
110
+ rc = track.split('/')
29
111
  # If there is only one string we assume it is the branch name from
30
112
  # origin
31
113
  return "origin" if rc.length == 1
@@ -33,7 +115,7 @@ def track_remote
33
115
  end
34
116
 
35
117
  def track_branch
36
- rc = self.module.remote_path.split('/')
118
+ rc = track.split('/')
37
119
  # If there is only one string we assume it is the branch name from
38
120
  # origin
39
121
  return rc[0] if rc.length == 1
@@ -69,6 +151,11 @@ def fetching_supported?
69
151
  true
70
152
  end
71
153
 
154
+ def repo
155
+ return @repo if @repo
156
+ @repo = Grit::Repo.new( local_path )
157
+ @repo
158
+ end
72
159
  #
73
160
  ### METHODS
74
161
  #
@@ -100,11 +187,9 @@ def clone
100
187
  if git( "remote add #{name} #{val.url}" ) != 0
101
188
  raise GitError, "Error while initializing the repo `git remote add #{name} #{val.url}`: #{$?}"
102
189
  end
103
- end
104
-
105
- cmd = "remote add origin #{repository.url}"
106
- if git( cmd, local_path ) != 0
107
- raise GitError, "Error while initializing the repo `#{cmd}`: #{$?}"
190
+ if val.push_url and git( "remote set-url --push #{name} #{val.push_url}" ) != 0
191
+ raise GitError, "Error while initializing the repo `git remote add #{name} #{val.url}`: #{$?}"
192
+ end
108
193
  end
109
194
 
110
195
  logger.info <<-EOS
@@ -127,14 +212,6 @@ def gc
127
212
  git( "gc" )
128
213
  end
129
214
 
130
- def remote?( name )
131
- found = false
132
- git( "remote" ) do |line|
133
- found = true if line == name
134
- end
135
- return found
136
- end
137
-
138
215
  # Fetch from +repository+
139
216
  #
140
217
  # Initializes the local clone if it does not exist.
@@ -156,9 +233,34 @@ def git( command, wd = local_path, &block )
156
233
  rc
157
234
  end
158
235
 
236
+ def prepare_for_access
237
+ # If our server has an associated ssh-key, add it to the ssh-agent.
238
+ if config.remote[ config.track_remote ].server.sshkey
239
+ logger.info ""
240
+ logger.info "#### Adding required ssh-key #{key.file} to ssh-agent."
241
+ MJ::Tools::SSH::add_key key.file
242
+ end
243
+
244
+ # Check that the remotes are the same as configured.
245
+ if checkedout?
246
+ gitconfig = repo.config
247
+ config.remote.each do |name, val|
248
+ if val.url and val.url != gitconfig["remote.#{name}.url"]
249
+ logger.info "#{config.module.name}: Setting remote.origin.url to #{val.url}"
250
+ gitconfig["remote.#{name}.url"] = val.url
251
+ end
252
+ if val.push_server and val.push_url != gitconfig["remote.#{name}.pushurl"]
253
+ logger.info "#{config.module.name}: Setting remote.origin.pushurl to #{val.push_url}"
254
+ gitconfig["remote.#{name}.pushurl"] = val.push_url
255
+ end
256
+ end
257
+ end
258
+ return true
259
+ end
260
+
159
261
  def rebase
160
262
  if 0 != ( git "rebase #{config.track_remote}/#{config.track_branch}" )
161
- raise GitSvnError, "Error while rebasing the repo with `git rebase git-svn: #{$?}"
263
+ raise GitSvnError, "Error while rebasing the repo with `#{config.track_remote}/#{config.track_branch}': #{$?}"
162
264
  end
163
265
  end
164
266
 
@@ -4,9 +4,14 @@ module BuildTool; module VCS
4
4
 
5
5
  class SvnConfiguration < BaseConfiguration
6
6
 
7
+ # The repository
8
+ attr_accessor :repository
9
+
7
10
  def initialize
8
11
  super
9
12
  @only = nil
13
+ @repository = nil
14
+ @remote_path = nil
10
15
  end
11
16
 
12
17
  def name
@@ -29,6 +34,23 @@ def copy_configuration( other )
29
34
  super
30
35
  @only = nil # Do not copy nil
31
36
  end
37
+
38
+ attr_writer :repository
39
+ def repository
40
+ if @repository.nil?
41
+ raise ConfigurationError, "No repository configured for module #{mod.name}."
42
+ end
43
+ @repository
44
+ end
45
+
46
+ attr_writer :remote_path
47
+ def remote_path
48
+ if @remote_path.nil?
49
+ return @module.name
50
+ end
51
+ @remote_path
52
+ end
53
+
32
54
  end
33
55
 
34
56
  #
@@ -112,6 +134,26 @@ def last_changed_rev
112
134
  return version
113
135
  end
114
136
 
137
+ def prepare_for_access
138
+ # If our server has an associated ssh-key, add it to the ssh-agent.
139
+ if config.repository.sshkey
140
+ key = config.repository.sshkey
141
+ logger.info ""
142
+ logger.info "#### Adding required ssh-key #{key.file} to ssh-agent."
143
+ MJ::Tools::SSH::add_key key.file
144
+ end
145
+ true
146
+ end
147
+
148
+ def remote_path
149
+ @config.remote_path
150
+ end
151
+
152
+ def repository
153
+ config.repository
154
+ end
155
+
156
+
115
157
  # Call svn with command
116
158
  def svn( command, wd = local_path, &block )
117
159
  self.class.svn( command, wd, &block )
data/lib/mj/visitor.rb CHANGED
@@ -12,7 +12,7 @@ def accept( visitor )
12
12
  if klass
13
13
  return visitor.send( method_name, self )
14
14
  else
15
- raise "#{visitor.class}: Not a visitor for #{self.class}!"
15
+ raise "#{visitor.class}: Should not happen!"
16
16
  end
17
17
  end
18
18
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: build-tool
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.4.6
5
+ version: 0.5.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Michael Jansen
@@ -31,7 +31,7 @@ cert_chain:
31
31
  M3zOaQdtTmiQPBqNIsE=
32
32
  -----END CERTIFICATE-----
33
33
 
34
- date: 2011-02-08 00:00:00 +01:00
34
+ date: 2011-02-07 00:00:00 +01:00
35
35
  default_executable:
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
@@ -197,8 +197,6 @@ files:
197
197
  - lib/build-tool/cfg/node.rb
198
198
  - lib/build-tool/cfg/parser.y
199
199
  - lib/build-tool/cfg/visitor.rb
200
- - lib/build-tool/cfg/parser.rb
201
- - lib/build-tool/cfg/lexer.rb
202
200
  - lib/build-tool/command_actions.rb
203
201
  - lib/build-tool/commands.rb
204
202
  - lib/build-tool/commands/build.rb
metadata.gz.sig CHANGED
Binary file