build-tool 0.6.0.rc2 → 0.6.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/{History.txt → History.rdoc} +1 -0
- data/{README.txt → README.rdoc} +6 -6
- data/build-tool.gemspec +1 -1
- data/lib/build-tool/application.rb +2 -1
- data/lib/build-tool/cfg/lexer.rex +18 -0
- data/lib/build-tool/cfg/node.rb +3 -0
- data/lib/build-tool/cfg/parser.y +19 -0
- data/lib/build-tool/cfg/visitor.rb +38 -0
- data/lib/build-tool/command_actions.rb +3 -2
- data/lib/build-tool/commands.rb +2 -2
- data/lib/build-tool/commands/build.rb +4 -4
- data/lib/build-tool/commands/modules/info.rb +2 -0
- data/lib/build-tool/configuration.rb +19 -11
- data/lib/build-tool/model/module.rb +2 -2
- data/lib/build-tool/vcs/archive.rb +1 -1
- data/lib/build-tool/vcs/bazar.rb +150 -0
- data/lib/build-tool/vcs/git-svn.rb +8 -3
- data/lib/build-tool/vcs/git.rb +2 -2
- data/lib/build-tool/vcs/mercurial.rb +1 -1
- data/lib/build-tool/vcs/svn.rb +17 -12
- data/lib/build-tool/version.rb +1 -1
- data/test/integration/configuration_test.rb +32 -13
- data/test/integration/parser_bazar_test.rb +73 -0
- data/test/integration/parser_mercurial_test.rb +1 -1
- data/test/test_helper.rb +1 -1
- data/test/unit/configuration_test.rb +6 -2
- data/test/unit/mercurial_configuration_test.rb +3 -3
- data/test/unit/model/bazar_configuration_test.rb +44 -0
- metadata +33 -28
data/{README.txt → README.rdoc}
RENAMED
@@ -6,16 +6,16 @@
|
|
6
6
|
|
7
7
|
This project is inspired by kdesrc-build[http://kdesrc-build.kde.org/].
|
8
8
|
|
9
|
-
It
|
9
|
+
It helps in building and maintaining a development environment. It downloads
|
10
10
|
and configures sources and updates them later.
|
11
11
|
|
12
12
|
== FEATURES/PROBLEMS:
|
13
13
|
|
14
14
|
The tool uses recipes to build software from scratch. It does
|
15
|
-
- Check out the sources from the repository (git, git-svn, svn).
|
15
|
+
- Check out the sources from the repository (git, git-svn, svn, mercurial, bazar, archive).
|
16
16
|
- Update the sources.
|
17
17
|
- Set the build environment.
|
18
|
-
- Configure (qt, cmake, custom)
|
18
|
+
- Configure (qt, cmake, autoconf, custom)
|
19
19
|
- Build
|
20
20
|
- Install
|
21
21
|
|
@@ -37,10 +37,10 @@ Currently the following recipes are provided:
|
|
37
37
|
> build-tool recipe install kde
|
38
38
|
...
|
39
39
|
# Adapt the configuration
|
40
|
-
>
|
40
|
+
> kde-build configuration edit
|
41
41
|
|
42
42
|
# Build kdesupport/ modules and the base kde workspace
|
43
|
-
kde-build build kdesupport/ KDE/
|
43
|
+
> kde-build build -u kdesupport/ KDE/
|
44
44
|
|
45
45
|
== Documentation
|
46
46
|
|
@@ -54,5 +54,5 @@ http://michael-jansen.biz/build-tool
|
|
54
54
|
|
55
55
|
(The GPL LICENSE)
|
56
56
|
|
57
|
-
Copyright (c) 2009-
|
57
|
+
Copyright (c) 2009-2012 Michael Jansen
|
58
58
|
|
data/build-tool.gemspec
CHANGED
@@ -144,7 +144,8 @@ def open_database( name )
|
|
144
144
|
logger.debug "Opening the database #{path}."
|
145
145
|
ActiveRecord::Base.establish_connection(
|
146
146
|
:adapter => 'sqlite3',
|
147
|
-
:database => path.to_s
|
147
|
+
:database => path.to_s,
|
148
|
+
:timeout => 5000 )
|
148
149
|
ActiveRecord::Migrator.migrate(
|
149
150
|
[ application_root.join( 'db/migrations' ) ] )
|
150
151
|
end
|
@@ -92,6 +92,23 @@ rule
|
|
92
92
|
:ARCHIVE {STRINGERROR} { [:GARBAGE, text]; }
|
93
93
|
:ARCHIVE . { [:GARBAGE, text]; }
|
94
94
|
|
95
|
+
#
|
96
|
+
### BAZAR
|
97
|
+
#
|
98
|
+
:BAZAR {INHERITANCE} { [:INHERITANCE, text] }
|
99
|
+
:BAZAR url\b { [:URL, text]; }
|
100
|
+
:BAZAR push\b { [:PUSH, text]; }
|
101
|
+
:BAZAR ssh-key\b { @states.push @state; @state = :SSH_KEY; [:SSH_KEY, text]; }
|
102
|
+
:BAZAR end\b { @state = @states.pop; [ :END, text ]; }
|
103
|
+
# COMMON
|
104
|
+
:BAZAR {STRING} { [:STRING, @ss[1]]; }
|
105
|
+
:BAZAR {TOKEN} { [:TOKEN, text]; }
|
106
|
+
:BAZAR {COMMENT} { [:COMMENT, text]; }
|
107
|
+
:BAZAR {BLANK} { [:IGNORE, text]; }
|
108
|
+
:BAZAR {LF} { [:IGNORE, text]; }
|
109
|
+
:BAZAR {STRINGERROR} { [:GARBAGE, text]; }
|
110
|
+
:BAZAR . { [:GARBAGE, text]; }
|
111
|
+
|
95
112
|
#
|
96
113
|
### BUILD SYSTEM
|
97
114
|
#
|
@@ -358,6 +375,7 @@ rule
|
|
358
375
|
#
|
359
376
|
### VCS
|
360
377
|
#
|
378
|
+
:VCS bazar\b { @state = :BAZAR; [:BAZAR, text]; }
|
361
379
|
:VCS git-svn\b { @state = :GIT_SVN; [:GIT_SVN, text]; }
|
362
380
|
:VCS git\b { @state = :GIT; [:GIT, text]; }
|
363
381
|
:VCS svn\b { @state = :SVN; [:SVN, text]; }
|
data/lib/build-tool/cfg/node.rb
CHANGED
data/lib/build-tool/cfg/parser.y
CHANGED
@@ -3,6 +3,7 @@ class BuildTool::Cfg::Parser < BuildTool::Cfg::Lexer
|
|
3
3
|
token APPEND
|
4
4
|
token APPLY
|
5
5
|
token ARCHIVE
|
6
|
+
token BAZAR
|
6
7
|
token BUILD_PREFIX
|
7
8
|
token BUILD_SYSTEM
|
8
9
|
token DESCRIPTION
|
@@ -119,6 +120,7 @@ rule
|
|
119
120
|
|
120
121
|
vcs_declaration
|
121
122
|
: git_declaration { result = val[0]; }
|
123
|
+
| bazar_declaration { result = val[0]; }
|
122
124
|
| svn_declaration { result = val[0]; }
|
123
125
|
| git_svn_declaration { result = val[0]; }
|
124
126
|
| archive_declaration { result = val[0]; }
|
@@ -205,6 +207,23 @@ rule
|
|
205
207
|
| SHORT DESCRIPTION STRING { result = ShortDescriptionNode.new( val[2] ); }
|
206
208
|
;
|
207
209
|
|
210
|
+
#
|
211
|
+
### BAZAR CONFIGURATION
|
212
|
+
#
|
213
|
+
bazar_declaration
|
214
|
+
: VCS BAZAR bazar_statements END { result = BazarDeclarationNode.new( val[2] ); }
|
215
|
+
| VCS BAZAR inheritance bazar_statements END { result = BazarDeclarationNode.new( val[3] ); result.options[:inheritance] = true; }
|
216
|
+
;
|
217
|
+
|
218
|
+
bazar_statements
|
219
|
+
: /* empty */
|
220
|
+
| bazar_statement bazar_statements { result = val.flatten; }
|
221
|
+
;
|
222
|
+
|
223
|
+
bazar_statement
|
224
|
+
: URL STRING { result = BazarUrlNode.new( val[1..-1] ); }
|
225
|
+
;
|
226
|
+
|
208
227
|
#
|
209
228
|
### GIT OPTION DECLARATION
|
210
229
|
#
|
@@ -486,6 +486,26 @@ def visit_IncludeNode( node )
|
|
486
486
|
end
|
487
487
|
end
|
488
488
|
|
489
|
+
class BazarDeclarationNodeVisitor < ListVisitor
|
490
|
+
|
491
|
+
def initialize( configuration, vcs )
|
492
|
+
super( configuration )
|
493
|
+
@vcs = vcs
|
494
|
+
end
|
495
|
+
|
496
|
+
def visit_BazarDeclarationNode( node )
|
497
|
+
visit_nodes( node.values )
|
498
|
+
@vcs
|
499
|
+
end
|
500
|
+
|
501
|
+
def visit_BazarUrlNode( node )
|
502
|
+
@vcs.url = node.values[0]
|
503
|
+
end
|
504
|
+
|
505
|
+
end
|
506
|
+
|
507
|
+
|
508
|
+
|
489
509
|
class MercurialDeclarationNodeVisitor < ListVisitor
|
490
510
|
|
491
511
|
def initialize( configuration, vcs )
|
@@ -585,6 +605,24 @@ def visit_GitDeclarationNode( node )
|
|
585
605
|
node.accept( visitor )
|
586
606
|
end
|
587
607
|
|
608
|
+
def visit_BazarDeclarationNode( node )
|
609
|
+
vcs = BuildTool::VCS::BazarConfiguration.new
|
610
|
+
if node.options[:inheritance]
|
611
|
+
if not @module.vcs_configuration
|
612
|
+
raise ConfigurationError,
|
613
|
+
"#{@module.name} has no previous bazar configuration!"
|
614
|
+
end
|
615
|
+
if @module.vcs_configuration.name != "bazar"
|
616
|
+
raise ConfigurationError,
|
617
|
+
"#{@module.name} has a #{@module.vcs_configuration.name} configuration!"
|
618
|
+
end
|
619
|
+
vcs.parent = @module.vcs_configuration
|
620
|
+
end
|
621
|
+
@module.vcs_configuration = vcs
|
622
|
+
visitor = BazarDeclarationNodeVisitor.new( configuration, vcs )
|
623
|
+
node.accept( visitor )
|
624
|
+
end
|
625
|
+
|
588
626
|
def visit_GitSvnDeclarationNode( node )
|
589
627
|
vcs = BuildTool::VCS::GitSvnConfiguration.new
|
590
628
|
if node.options[:inheritance]
|
@@ -117,8 +117,9 @@ def execute()
|
|
117
117
|
|
118
118
|
class Fetch < Base
|
119
119
|
|
120
|
-
def initialize( command, mod )
|
120
|
+
def initialize( command, mod, verbose )
|
121
121
|
super( command, 20, :fetch, mod )
|
122
|
+
@verbose = verbose
|
122
123
|
if !mod.vcs_required.fetching_supported?
|
123
124
|
logger.info "Fetching/Rebase not supported by vcs #{mod.vcs.name}. Doing it in one step."
|
124
125
|
end
|
@@ -126,7 +127,7 @@ def initialize( command, mod )
|
|
126
127
|
|
127
128
|
def execute()
|
128
129
|
logger.info "Fetching remote changes."
|
129
|
-
@module.fetch
|
130
|
+
@module.fetch( @verbose )
|
130
131
|
end
|
131
132
|
|
132
133
|
end
|
data/lib/build-tool/commands.rb
CHANGED
@@ -669,8 +669,8 @@ def configure( mod )
|
|
669
669
|
# Call the #fetch method of the module.
|
670
670
|
#
|
671
671
|
# @param [Object] mod The module to use
|
672
|
-
def fetch( mod )
|
673
|
-
ModuleActions::Fetch.new( self, mod ).do
|
672
|
+
def fetch( mod, verbose = false )
|
673
|
+
ModuleActions::Fetch.new( self, mod, verbose ).do
|
674
674
|
end
|
675
675
|
|
676
676
|
# Call the #install method of the module.
|
@@ -56,9 +56,9 @@ def initialize_options
|
|
56
56
|
@from_scratch = true
|
57
57
|
}
|
58
58
|
|
59
|
-
@verbose_rebase =
|
60
|
-
options.on( nil, "--[no]
|
61
|
-
@verbose_rebase =
|
59
|
+
@verbose_rebase = false
|
60
|
+
options.on( nil, "--[no-]verbose-rebase", "Show the changes applied by rebase." ) { |t|
|
61
|
+
@verbose_rebase = t
|
62
62
|
}
|
63
63
|
|
64
64
|
super
|
@@ -100,7 +100,7 @@ def do_execute_module( mod )
|
|
100
100
|
# fetch/rebase
|
101
101
|
if @update
|
102
102
|
if mod.checkedout?
|
103
|
-
fetch( mod )
|
103
|
+
fetch( mod, @verbose_rebase )
|
104
104
|
rebase( mod, @verbose_rebase )
|
105
105
|
else
|
106
106
|
clone( mod )
|
@@ -60,6 +60,8 @@ def do_execute_module( mod )
|
|
60
60
|
case mod.vcs_configuration.name
|
61
61
|
when 'svn'
|
62
62
|
info( " Repository: %s/%s" % [ mod.vcs_configuration.repository.url, mod.vcs_configuration.remote_path ] )
|
63
|
+
when 'bazar'
|
64
|
+
info( " Branch: %s" % [ mod.vcs_configuration.url ] )
|
63
65
|
when 'archive'
|
64
66
|
info( " URL: %s" % [ mod.vcs.archive_url ] )
|
65
67
|
when 'git'
|
@@ -7,6 +7,7 @@
|
|
7
7
|
require 'build-tool/vcs/svn'
|
8
8
|
require 'build-tool/vcs/archive'
|
9
9
|
require 'build-tool/vcs/mercurial'
|
10
|
+
require 'build-tool/vcs/bazar'
|
10
11
|
|
11
12
|
require 'build-tool/model/module'
|
12
13
|
require 'build-tool/model/feature'
|
@@ -146,6 +147,8 @@ def vcs( name )
|
|
146
147
|
return BuildTool::VCS::ArchiveConfiguration.new
|
147
148
|
when "mercurial"
|
148
149
|
return BuildTool::VCS::MercurialConfiguration.new
|
150
|
+
when "bazar"
|
151
|
+
return BuildTool::VCS::BazarConfiguration.new
|
149
152
|
else
|
150
153
|
raise StandardError, "Unknown Version Control System #{name}"
|
151
154
|
end
|
@@ -302,15 +305,9 @@ def complete_modules( name, include_templates = false, all = false, resume_from
|
|
302
305
|
next if !( mod.active? || all )
|
303
306
|
take_module = true
|
304
307
|
elsif mod.name == name or mod.name.end_with?( "/#{name}" )
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
found = true
|
309
|
-
should_be_unique = true
|
310
|
-
take_module = true
|
311
|
-
else
|
312
|
-
raise BuildTool::ConfigurationError, "Can't select module %s from inactive feature %s" % [ mod.name, mod.feature.name ]
|
313
|
-
end
|
308
|
+
found = true
|
309
|
+
should_be_unique = true
|
310
|
+
take_module = true
|
314
311
|
elsif name == '*'
|
315
312
|
found = true
|
316
313
|
# Now check if it is active.
|
@@ -336,8 +333,19 @@ def complete_modules( name, include_templates = false, all = false, resume_from
|
|
336
333
|
end
|
337
334
|
|
338
335
|
# Raise an error if the result should be unique but is not.
|
339
|
-
if should_be_unique
|
340
|
-
|
336
|
+
if should_be_unique
|
337
|
+
|
338
|
+
if res.size > 1
|
339
|
+
raise BuildTool::ConfigurationError, "#{name} is ambiguous (#{res.map { |m| m.name }.join( ', ' ) })."
|
340
|
+
end
|
341
|
+
|
342
|
+
mod = res[0]
|
343
|
+
|
344
|
+
# If the module is inactive make sure the feature is active
|
345
|
+
if not ( mod.active? || mod.feature.nil? || mod.feature.active? )
|
346
|
+
raise BuildTool::ConfigurationError, "Can't select module %s from inactive feature %s" % [ mod.name, mod.feature.name ]
|
347
|
+
end
|
348
|
+
|
341
349
|
end
|
342
350
|
|
343
351
|
# Give a warning if all modules where
|
@@ -355,8 +355,8 @@ def clone
|
|
355
355
|
|
356
356
|
# Fetch changes from the remote repository. Do not change the local
|
357
357
|
# checkout.
|
358
|
-
def fetch
|
359
|
-
vcs_required.fetch
|
358
|
+
def fetch( verbose = false )
|
359
|
+
vcs_required.fetch( verbose = verbose )
|
360
360
|
end
|
361
361
|
|
362
362
|
# Update the local changes with remote changes. Do not fetch changes
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
|
3
|
+
require 'mj/mixins/inherited_attributes'
|
4
|
+
require 'build-tool/vcs/base'
|
5
|
+
require 'build-tool/errors'
|
6
|
+
|
7
|
+
module BuildTool; module VCS
|
8
|
+
|
9
|
+
class BazarError < BuildTool::Error; end
|
10
|
+
|
11
|
+
class BazarConfiguration < BaseConfiguration
|
12
|
+
|
13
|
+
include MJ::Mixins::InheritedAttributes
|
14
|
+
|
15
|
+
def name
|
16
|
+
"bazar"
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
super
|
21
|
+
@url = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def vcs( mod )
|
25
|
+
raise StandardError if @module and ! mod.equal?( @module )
|
26
|
+
@module = mod
|
27
|
+
Bazar.new( self )
|
28
|
+
end
|
29
|
+
|
30
|
+
inherited_attr_accessor :url
|
31
|
+
|
32
|
+
def copy_configuration( other )
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Implementation for the bzr version control system.
|
39
|
+
#
|
40
|
+
class Bazar < Base
|
41
|
+
|
42
|
+
def initialize( config )
|
43
|
+
super( config )
|
44
|
+
@vcs = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
### ATTRIBUTES
|
49
|
+
#
|
50
|
+
def name
|
51
|
+
"bazar"
|
52
|
+
end
|
53
|
+
|
54
|
+
def fetching_supported?
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
### METHODS
|
60
|
+
#
|
61
|
+
|
62
|
+
def checkedout?
|
63
|
+
return false if !local_path_exist?
|
64
|
+
if !Pathname.new( local_path ).join( ".bzr" ).exist?
|
65
|
+
raise Base::VcsError, "Checkout path #{local_path} is not a bazar repo!"
|
66
|
+
end
|
67
|
+
return true
|
68
|
+
end
|
69
|
+
|
70
|
+
# Initialize the local repository
|
71
|
+
def clone
|
72
|
+
# Check if path exists
|
73
|
+
if local_path_exist?
|
74
|
+
raise BazarError, "Failed to create repository at '#{local_path}': Path exists"
|
75
|
+
end
|
76
|
+
FileUtils.mkdir_p Pathname.new( local_path ).dirname if ! $noop
|
77
|
+
|
78
|
+
# Initialize the repository
|
79
|
+
if bzr( "branch #{config.url} #{local_path}", Pathname.new( local_path ).dirname) != 0
|
80
|
+
raise BazarError, "Error while initializing the repo `bzr branch #{config.url} #{local_path}'`: #{$?}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Is the git executable available?
|
85
|
+
def self.bzr_available?()
|
86
|
+
return @bzr_available unless @bzr_available.nil?
|
87
|
+
%x( bzr --version 2>&1 )
|
88
|
+
@bzr_available = $?.success?
|
89
|
+
return @bzr_available
|
90
|
+
end
|
91
|
+
|
92
|
+
def ready_for_fetch
|
93
|
+
if not self.class.bzr_available?
|
94
|
+
logger.error( "#{config.module.name}: Calling `bzr` failed!" )
|
95
|
+
return false
|
96
|
+
end
|
97
|
+
|
98
|
+
if checkedout?
|
99
|
+
# Check if the index is dirty.
|
100
|
+
if bzr( "diff" ) != 0
|
101
|
+
logger.info( "#{config.module.name}: Local changes will prevent the update." )
|
102
|
+
bzr( "status --short --versioned" ) do |line|
|
103
|
+
logger.info line.chomp
|
104
|
+
end
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
return true
|
110
|
+
end
|
111
|
+
|
112
|
+
# Fetch from +repository+
|
113
|
+
#
|
114
|
+
# Initializes the local clone if it does not exist.
|
115
|
+
def fetch( verbose = false )
|
116
|
+
|
117
|
+
if !checkedout? and !$noop
|
118
|
+
clone
|
119
|
+
end
|
120
|
+
|
121
|
+
if verbose
|
122
|
+
cmd = "update -v"
|
123
|
+
else
|
124
|
+
cmd = "update"
|
125
|
+
end
|
126
|
+
|
127
|
+
rc = bzr( cmd ) do |line|
|
128
|
+
logger.info( line )
|
129
|
+
end
|
130
|
+
|
131
|
+
if rc != 0
|
132
|
+
raise BazarError, "Error while update: #{rc}"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Execute +command+ in directory +wd+ and yield every line of output.
|
137
|
+
def bzr( command, wd = local_path, &block )
|
138
|
+
rc = self.class.execute "bzr #{command}", wd, &block
|
139
|
+
end
|
140
|
+
|
141
|
+
def rebase( verbose = false )
|
142
|
+
# Rebasing is not supported
|
143
|
+
0
|
144
|
+
end
|
145
|
+
|
146
|
+
end # class Bazar
|
147
|
+
|
148
|
+
end; end # module BuildTool::VCS
|
149
|
+
|
150
|
+
|
@@ -121,7 +121,7 @@ def clone
|
|
121
121
|
raise GitSvnError, "Error while initializing the repo `git svn init '#{config.repository}/#{remote_path}'`: #{$?}"
|
122
122
|
end
|
123
123
|
|
124
|
-
fetch( "HEAD" )
|
124
|
+
fetch( revision: "HEAD" )
|
125
125
|
end
|
126
126
|
|
127
127
|
def configure
|
@@ -131,21 +131,26 @@ def configure
|
|
131
131
|
# Fetch from +repository+
|
132
132
|
#
|
133
133
|
# Initializes the local clone if it does not exist.
|
134
|
-
def fetch(
|
134
|
+
def fetch( verbose = false, options = {} )
|
135
|
+
revision = options[:revision] || nil
|
136
|
+
|
135
137
|
if !checkedout? and !$noop # Beware of looping
|
136
138
|
clone
|
137
139
|
else
|
138
140
|
# clone() calls those methods.
|
139
141
|
git.check_config
|
140
142
|
end
|
143
|
+
|
141
144
|
if revision
|
142
145
|
cmd = "fetch -r#{revision}"
|
143
146
|
else
|
144
147
|
cmd = "fetch"
|
145
148
|
end
|
149
|
+
|
146
150
|
if ( rc = git_svn( cmd ) ) != 0
|
147
151
|
raise GitSvnError, "Error while fetching: #{rc}"
|
148
152
|
end
|
153
|
+
|
149
154
|
update_externals
|
150
155
|
end
|
151
156
|
|
@@ -175,7 +180,7 @@ def rebase( verbose = false )
|
|
175
180
|
remote_branch = "#{config.track_branch}"
|
176
181
|
|
177
182
|
if verbose
|
178
|
-
git.git('log --first-parent HEAD..%s' % remote_branch ) do |line|
|
183
|
+
git.git('log --first-parent --pretty=oneline HEAD..%s' % remote_branch ) do |line|
|
179
184
|
logger.info( line )
|
180
185
|
end
|
181
186
|
end
|
data/lib/build-tool/vcs/git.rb
CHANGED
@@ -300,7 +300,7 @@ def gc
|
|
300
300
|
# Fetch from +repository+
|
301
301
|
#
|
302
302
|
# Initializes the local clone if it does not exist.
|
303
|
-
def fetch()
|
303
|
+
def fetch( verbose = false )
|
304
304
|
if !checkedout? and !$noop
|
305
305
|
clone
|
306
306
|
else
|
@@ -439,7 +439,7 @@ def rebase( verbose = false )
|
|
439
439
|
remote_branch = "#{config.track_remote}/#{config.track_branch}"
|
440
440
|
|
441
441
|
if verbose
|
442
|
-
git('log --first-parent HEAD..%s' % remote_branch ) do |line|
|
442
|
+
git('log --first-parent --pretty=oneline HEAD..%s' % remote_branch ) do |line|
|
443
443
|
logger.info( line )
|
444
444
|
end
|
445
445
|
end
|
data/lib/build-tool/vcs/svn.rb
CHANGED
@@ -66,7 +66,7 @@ class << self
|
|
66
66
|
svn_available = nil
|
67
67
|
|
68
68
|
# Is the git executable available?
|
69
|
-
def svn_available
|
69
|
+
def svn_available?
|
70
70
|
return @svn_available unless @svn_available.nil?
|
71
71
|
%x( svn --version 2>&1 )
|
72
72
|
@svn_available = $?.success?
|
@@ -120,21 +120,31 @@ def clone
|
|
120
120
|
else
|
121
121
|
svn "checkout --depth=infinity #{repository.url}/#{remote_path} #{local_path}", local_path.dirname
|
122
122
|
end
|
123
|
+
return true
|
123
124
|
end
|
124
125
|
|
125
126
|
def ready_for_fetch
|
126
|
-
if not Svn.svn_available
|
127
|
+
if not Svn.svn_available?
|
127
128
|
logger.info( "#{config.module.name}: Calling `svn` failed!" )
|
129
|
+
return false
|
128
130
|
end
|
129
|
-
return
|
131
|
+
return true
|
130
132
|
end
|
131
133
|
|
132
|
-
def fetch()
|
134
|
+
def fetch( verbose = false )
|
135
|
+
|
133
136
|
if !checkedout?
|
134
|
-
clone
|
135
|
-
else
|
136
|
-
svn "update"
|
137
|
+
return clone
|
137
138
|
end
|
139
|
+
|
140
|
+
if verbose
|
141
|
+
svn "log -r HEAD:BASE -q" do |line|
|
142
|
+
logger.info( line )
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
svn "update"
|
147
|
+
|
138
148
|
return true
|
139
149
|
end
|
140
150
|
|
@@ -181,11 +191,6 @@ def self.svn( command, wd, &block )
|
|
181
191
|
end
|
182
192
|
|
183
193
|
def rebase( verbose = false )
|
184
|
-
|
185
|
-
if verbose
|
186
|
-
logger.info( 'Verbose rebase not yet implemented for subversion.' )
|
187
|
-
end
|
188
|
-
|
189
194
|
# Rebasing is not supported
|
190
195
|
0
|
191
196
|
end
|
data/lib/build-tool/version.rb
CHANGED
@@ -20,6 +20,17 @@ module "toplevel2_disabled"
|
|
20
20
|
end
|
21
21
|
disable module "toplevel2_disabled"
|
22
22
|
|
23
|
+
feature "feature2"
|
24
|
+
|
25
|
+
module "feature2/module1"
|
26
|
+
end
|
27
|
+
|
28
|
+
module "feature2/module2"
|
29
|
+
end
|
30
|
+
disable module "feature2/module2"
|
31
|
+
end
|
32
|
+
disable feature "feature2"
|
33
|
+
|
23
34
|
feature "feature1"
|
24
35
|
|
25
36
|
module "feature1/module1"
|
@@ -34,16 +45,6 @@ module "feature1/module3"
|
|
34
45
|
disable module "feature1/module2"
|
35
46
|
end
|
36
47
|
|
37
|
-
feature "feature2"
|
38
|
-
|
39
|
-
module "feature2/module1"
|
40
|
-
end
|
41
|
-
|
42
|
-
module "feature2/module2"
|
43
|
-
end
|
44
|
-
disable module "feature2/module2"
|
45
|
-
end
|
46
|
-
disable feature "feature2"
|
47
48
|
EOF
|
48
49
|
end
|
49
50
|
|
@@ -79,21 +80,24 @@ module "feature2/module2"
|
|
79
80
|
end
|
80
81
|
|
81
82
|
test 'selecting a active module from a inactive feature works not.' do
|
82
|
-
assert_raises( BuildTool::ConfigurationError ) do
|
83
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
83
84
|
@configuration.complete_modules( 'feature2/module1' )
|
84
85
|
end
|
86
|
+
assert_match( /inactive feature/, exc.message )
|
85
87
|
end
|
86
88
|
|
87
89
|
test 'selecting a inactive module from a inactive feature works not.' do
|
88
|
-
assert_raises( BuildTool::ConfigurationError ) do
|
90
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
89
91
|
@configuration.complete_modules( 'feature2/module2' )
|
90
92
|
end
|
93
|
+
assert_match( /inactive feature/, exc.message )
|
91
94
|
end
|
92
95
|
|
93
96
|
test 'selecting a nonexistant module works not.' do
|
94
|
-
assert_raises( BuildTool::ConfigurationError ) do
|
97
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
95
98
|
@configuration.complete_modules( 'nothere' )
|
96
99
|
end
|
100
|
+
assert_match( /Unknown module/, exc.message )
|
97
101
|
end
|
98
102
|
|
99
103
|
test 'selecting a group works.' do
|
@@ -119,11 +123,26 @@ module "feature2/module2"
|
|
119
123
|
[ 'feature1/module2', 'feature1/module3' ],
|
120
124
|
@configuration.complete_modules( 'feature1/', false, true, @configuration.complete_module( 'feature1/module2' ) ).map { |m| m.name } )
|
121
125
|
end
|
126
|
+
|
122
127
|
test 'selecting a group works with all = true on disabled feature' do
|
123
128
|
assert_equal(
|
124
129
|
[ 'feature2/module1', 'feature2/module2' ],
|
125
130
|
@configuration.complete_modules( 'feature2/', false, true ).map { |m| m.name } )
|
126
131
|
end
|
132
|
+
|
133
|
+
test 'selecting a notexistand package works not.' do
|
134
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
135
|
+
@configuration.complete_modules( 'unknownpackage/' )
|
136
|
+
end
|
137
|
+
assert_match( /Unknown module/, exc.message )
|
138
|
+
end
|
139
|
+
|
140
|
+
test 'selecting a ambiguous module throws ambiguous message' do
|
141
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
142
|
+
@configuration.complete_modules( 'module1' )
|
143
|
+
end
|
144
|
+
assert_match( /ambiguous/, exc.message )
|
145
|
+
end
|
127
146
|
end
|
128
147
|
|
129
148
|
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
require 'build-tool/cfg/parser'
|
4
|
+
|
5
|
+
class TestParserBazar < ActiveSupport::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@configuration = BuildTool::Configuration.new()
|
9
|
+
@configuration.truncate()
|
10
|
+
@parser = BuildTool::Cfg::Parser.new( @configuration )
|
11
|
+
end
|
12
|
+
|
13
|
+
test "Parses a valid bazar repository declation." do
|
14
|
+
assert_nothing_raised() { @parser.parse_string <<-EOF }
|
15
|
+
module "oxygen-icons"
|
16
|
+
vcs bazar
|
17
|
+
url "https://bazar.url/test"
|
18
|
+
end # vcs
|
19
|
+
end # module
|
20
|
+
EOF
|
21
|
+
# Now check the parsed configuration
|
22
|
+
assert_not_nil( @configuration.module('oxygen-icons') )
|
23
|
+
assert_attributes(
|
24
|
+
@configuration.module('oxygen-icons'),
|
25
|
+
{
|
26
|
+
:vcs =>
|
27
|
+
{
|
28
|
+
:name => 'bazar',
|
29
|
+
:config =>
|
30
|
+
{
|
31
|
+
:url => 'https://bazar.url/test',
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
}
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
test "Bazar Repository inheritance works." do
|
40
|
+
assert_nothing_raised() { @parser.parse_string <<-EOF }
|
41
|
+
module "oxygen-icons"
|
42
|
+
vcs bazar
|
43
|
+
url "https://bazar.url/test"
|
44
|
+
end # vcs
|
45
|
+
end # module
|
46
|
+
module "oxygen-icons"
|
47
|
+
vcs bazar <
|
48
|
+
end
|
49
|
+
end # module
|
50
|
+
EOF
|
51
|
+
# Now check the parsed configuration
|
52
|
+
assert_not_nil( @configuration.module('oxygen-icons') )
|
53
|
+
assert_attributes(
|
54
|
+
@configuration.module('oxygen-icons'),
|
55
|
+
{
|
56
|
+
:vcs =>
|
57
|
+
{
|
58
|
+
:name => 'bazar',
|
59
|
+
:config =>
|
60
|
+
{
|
61
|
+
:url => 'https://bazar.url/test',
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
}
|
66
|
+
)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
data/test/test_helper.rb
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# Set up the database.
|
16
16
|
def setup_database
|
17
17
|
if not ActiveRecord::Base.connected?
|
18
|
-
ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => ':memory:' )
|
18
|
+
ActiveRecord::Base.establish_connection( :adapter => 'sqlite3', :database => ':memory:', :timeout => 5000 )
|
19
19
|
ActiveRecord::Migrator.migrate( [ 'db/migrations' ] )
|
20
20
|
end
|
21
21
|
end
|
@@ -12,12 +12,16 @@ class ConfigurationTest < ActiveSupport::TestCase
|
|
12
12
|
|
13
13
|
test 'log_directory is not allowed to be relative' do
|
14
14
|
c = BuildTool::Configuration.new
|
15
|
-
|
15
|
+
|
16
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
16
17
|
c.log_directory = 'my/relative/dir'
|
17
18
|
end
|
18
|
-
|
19
|
+
assert_match( /Log directory .* is relative/, exc.message )
|
20
|
+
|
21
|
+
exc = assert_raises( BuildTool::ConfigurationError ) do
|
19
22
|
c.log_directory = '$SOME_SHELL_VAR/relative/dir'
|
20
23
|
end
|
24
|
+
assert_match( /Log directory .* is relative/, exc.message )
|
21
25
|
end
|
22
26
|
|
23
27
|
test 'log_directory handles ~ and $HOME' do
|
@@ -14,7 +14,7 @@ class MercurialConfigurationTest < ActiveSupport::TestCase
|
|
14
14
|
|
15
15
|
test 'accessor url() works.' do
|
16
16
|
cfg = create_configuration
|
17
|
-
assert_equal( '
|
17
|
+
assert_equal( 'some_url', cfg.url )
|
18
18
|
end
|
19
19
|
|
20
20
|
test 'accessor url() works with inheritance.' do
|
@@ -31,12 +31,12 @@ class MercurialConfigurationTest < ActiveSupport::TestCase
|
|
31
31
|
assert_equal( 'some_url', cfg.url )
|
32
32
|
end
|
33
33
|
|
34
|
-
test 'accessor
|
34
|
+
test 'accessor track() works.' do
|
35
35
|
cfg = create_configuration
|
36
36
|
assert_equal( 'some_branch', cfg.track )
|
37
37
|
end
|
38
38
|
|
39
|
-
test 'accessor
|
39
|
+
test 'accessor track() works with inheritance.' do
|
40
40
|
parent = create_configuration
|
41
41
|
cfg = BuildTool::VCS::MercurialConfiguration.new
|
42
42
|
cfg.parent = parent
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
require 'build-tool/vcs/bazar'
|
4
|
+
|
5
|
+
class BazarConfigurationTest < ActiveSupport::TestCase
|
6
|
+
|
7
|
+
test 'Constructor' do
|
8
|
+
cfg = BuildTool::VCS::BazarConfiguration.new
|
9
|
+
cfg.vcs( ModuleMock.new( 'bazar/test' ) )
|
10
|
+
assert_equal( cfg.name, 'bazar' )
|
11
|
+
assert_nil( cfg.url )
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'accessor url() works.' do
|
15
|
+
cfg = create_configuration
|
16
|
+
assert_equal( 'some_url', cfg.url() )
|
17
|
+
end
|
18
|
+
|
19
|
+
test 'accessor url() works with inheritance.' do
|
20
|
+
parent = create_configuration
|
21
|
+
cfg = BuildTool::VCS::BazarConfiguration.new
|
22
|
+
cfg.parent = parent
|
23
|
+
# We get the value from the parent
|
24
|
+
assert_equal( 'some_url', cfg.url )
|
25
|
+
# Unless we have it overriden
|
26
|
+
cfg.url = 'different_url'
|
27
|
+
assert_equal( 'different_url', cfg.url )
|
28
|
+
# But we can reset it
|
29
|
+
cfg.url = nil
|
30
|
+
assert_equal( 'some_url', cfg.url )
|
31
|
+
end
|
32
|
+
|
33
|
+
#######
|
34
|
+
private
|
35
|
+
#######
|
36
|
+
|
37
|
+
def create_configuration
|
38
|
+
cfg = BuildTool::VCS::BazarConfiguration.new
|
39
|
+
cfg.url = 'some_url'
|
40
|
+
cfg
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: build-tool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.6.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Michael Jansen
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-03-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: logging
|
16
|
-
requirement: &
|
16
|
+
requirement: &5456920 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.6.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *5456920
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activerecord
|
27
|
-
requirement: &
|
27
|
+
requirement: &5454940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 3.2.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *5454940
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &5454460 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.3.5
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *5454460
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ansi
|
49
|
-
requirement: &
|
49
|
+
requirement: &5453900 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.4.2
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *5453900
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: grit
|
60
|
-
requirement: &
|
60
|
+
requirement: &5453440 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 2.4.1
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *5453440
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: racc
|
71
|
-
requirement: &
|
71
|
+
requirement: &5452620 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: 1.4.7
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *5452620
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rexical
|
82
|
-
requirement: &
|
82
|
+
requirement: &5452040 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: 1.0.5
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *5452040
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: rake
|
93
|
-
requirement: &
|
93
|
+
requirement: &5482000 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: 0.9.2
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *5482000
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: yard
|
104
|
-
requirement: &
|
104
|
+
requirement: &5481460 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: 0.7.5
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *5481460
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: turn
|
115
|
-
requirement: &
|
115
|
+
requirement: &5480980 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0.9'
|
121
121
|
type: :development
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *5480980
|
124
124
|
description: ! "\n The tool helps \n\n ...\n "
|
125
125
|
email:
|
126
126
|
- info@michael-jansen.biz
|
@@ -128,7 +128,7 @@ executables:
|
|
128
128
|
- build-tool
|
129
129
|
extensions: []
|
130
130
|
extra_rdoc_files:
|
131
|
-
- README.
|
131
|
+
- README.rdoc
|
132
132
|
files:
|
133
133
|
- .gitattributes
|
134
134
|
- .gitignore
|
@@ -136,9 +136,9 @@ files:
|
|
136
136
|
- .yardopts
|
137
137
|
- Gemfile
|
138
138
|
- Gemfile.lock
|
139
|
-
- History.
|
139
|
+
- History.rdoc
|
140
140
|
- KNOWN_PROBLEMS
|
141
|
-
- README.
|
141
|
+
- README.rdoc
|
142
142
|
- Rakefile
|
143
143
|
- bin/build-tool
|
144
144
|
- build-tool.gemspec
|
@@ -216,6 +216,7 @@ files:
|
|
216
216
|
- lib/build-tool/state_helper.rb
|
217
217
|
- lib/build-tool/vcs/archive.rb
|
218
218
|
- lib/build-tool/vcs/base.rb
|
219
|
+
- lib/build-tool/vcs/bazar.rb
|
219
220
|
- lib/build-tool/vcs/git-svn.rb
|
220
221
|
- lib/build-tool/vcs/git.rb
|
221
222
|
- lib/build-tool/vcs/mercurial.rb
|
@@ -236,6 +237,7 @@ files:
|
|
236
237
|
- tasks/test.rake
|
237
238
|
- test/integration/configuration_test.rb
|
238
239
|
- test/integration/history_test.rb
|
240
|
+
- test/integration/parser_bazar_test.rb
|
239
241
|
- test/integration/parser_configuration.rb
|
240
242
|
- test/integration/parser_environment_parser.rb
|
241
243
|
- test/integration/parser_feature_test.rb
|
@@ -250,6 +252,7 @@ files:
|
|
250
252
|
- test/unit/git_configuration_test.rb
|
251
253
|
- test/unit/git_svn_configuration_test.rb
|
252
254
|
- test/unit/mercurial_configuration_test.rb
|
255
|
+
- test/unit/model/bazar_configuration_test.rb
|
253
256
|
- test/unit/model/command_log_test.rb
|
254
257
|
- test/unit/model/feature_test.rb
|
255
258
|
- test/unit/model/module_log_test.rb
|
@@ -278,9 +281,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
278
281
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
279
282
|
none: false
|
280
283
|
requirements:
|
281
|
-
- - ! '
|
284
|
+
- - ! '>='
|
282
285
|
- !ruby/object:Gem::Version
|
283
|
-
version:
|
286
|
+
version: '0'
|
284
287
|
requirements: []
|
285
288
|
rubyforge_project: build-tool
|
286
289
|
rubygems_version: 1.8.15
|
@@ -290,6 +293,7 @@ summary: A tool helping to download, configure and compile from sources.
|
|
290
293
|
test_files:
|
291
294
|
- test/integration/configuration_test.rb
|
292
295
|
- test/integration/history_test.rb
|
296
|
+
- test/integration/parser_bazar_test.rb
|
293
297
|
- test/integration/parser_configuration.rb
|
294
298
|
- test/integration/parser_environment_parser.rb
|
295
299
|
- test/integration/parser_feature_test.rb
|
@@ -304,6 +308,7 @@ test_files:
|
|
304
308
|
- test/unit/git_configuration_test.rb
|
305
309
|
- test/unit/git_svn_configuration_test.rb
|
306
310
|
- test/unit/mercurial_configuration_test.rb
|
311
|
+
- test/unit/model/bazar_configuration_test.rb
|
307
312
|
- test/unit/model/command_log_test.rb
|
308
313
|
- test/unit/model/feature_test.rb
|
309
314
|
- test/unit/model/module_log_test.rb
|