build-tool 0.6.0.rc2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|