build-tool 0.5.7 → 0.6.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.gitignore +1 -0
  2. data/.rvmrc +1 -0
  3. data/.yardopts +1 -0
  4. data/Gemfile +5 -0
  5. data/Gemfile.lock +56 -0
  6. data/History.txt +64 -0
  7. data/README.txt +0 -7
  8. data/Rakefile +8 -56
  9. data/bin/build-tool +4 -1
  10. data/build-tool.gemspec +62 -0
  11. data/db/migrations/20110703074000_add_command_logs.rb +17 -0
  12. data/db/migrations/20110703075000_add_module_logs.rb +20 -0
  13. data/db/migrations/20110815170000_add_features.rb +17 -0
  14. data/db/migrations/20120103204700_add_modules.rb +17 -0
  15. data/db/migrations/20120106181200_add_settings.rb +18 -0
  16. data/lib/build-tool.rb +3 -4
  17. data/lib/build-tool/application.rb +127 -37
  18. data/lib/build-tool/build-system/autoconf.rb +2 -8
  19. data/lib/build-tool/build-system/base.rb +12 -4
  20. data/lib/build-tool/build-system/cmake.rb +2 -0
  21. data/lib/build-tool/build-system/custom.rb +2 -0
  22. data/lib/build-tool/build-system/kdel10n.rb +2 -0
  23. data/lib/build-tool/build-system/make.rb +2 -0
  24. data/lib/build-tool/build-system/none.rb +2 -0
  25. data/lib/build-tool/build-system/qmake.rb +2 -0
  26. data/lib/build-tool/build-system/qt.rb +4 -0
  27. data/lib/build-tool/cfg/lexer.rex +40 -8
  28. data/lib/build-tool/cfg/lexer_base.rb +3 -1
  29. data/lib/build-tool/cfg/node.rb +17 -1
  30. data/lib/build-tool/cfg/parser.y +92 -10
  31. data/lib/build-tool/cfg/visitor.rb +202 -78
  32. data/lib/build-tool/command_actions.rb +26 -10
  33. data/lib/build-tool/commands.rb +289 -197
  34. data/lib/build-tool/commands/build.rb +13 -9
  35. data/lib/build-tool/commands/configuration.rb +25 -0
  36. data/lib/build-tool/commands/configuration/edit.rb +42 -0
  37. data/lib/build-tool/commands/configuration/list.rb +48 -0
  38. data/lib/build-tool/commands/configure.rb +9 -5
  39. data/lib/build-tool/commands/ctags.rb +8 -3
  40. data/lib/build-tool/commands/environments.rb +2 -4
  41. data/lib/build-tool/commands/environments/list.rb +13 -10
  42. data/lib/build-tool/commands/environments/set.rb +5 -1
  43. data/lib/build-tool/commands/features.rb +24 -0
  44. data/lib/build-tool/commands/features/disable.rb +70 -0
  45. data/lib/build-tool/commands/features/enable.rb +66 -0
  46. data/lib/build-tool/commands/features/list.rb +92 -0
  47. data/lib/build-tool/commands/fetch.rb +9 -3
  48. data/lib/build-tool/commands/files.rb +9 -5
  49. data/lib/build-tool/commands/gc.rb +48 -15
  50. data/lib/build-tool/commands/history.rb +21 -16
  51. data/lib/build-tool/commands/info.rb +16 -13
  52. data/lib/build-tool/commands/install.rb +8 -4
  53. data/lib/build-tool/commands/modules.rb +2 -4
  54. data/lib/build-tool/commands/modules/cleanup.rb +52 -0
  55. data/lib/build-tool/commands/modules/disable.rb +95 -0
  56. data/lib/build-tool/commands/modules/enable.rb +52 -0
  57. data/lib/build-tool/commands/modules/info.rb +44 -35
  58. data/lib/build-tool/commands/modules/list.rb +67 -15
  59. data/lib/build-tool/commands/modules/shell.rb +8 -2
  60. data/lib/build-tool/commands/rebase.rb +15 -7
  61. data/lib/build-tool/commands/recipes.rb +2 -4
  62. data/lib/build-tool/commands/recipes/add.rb +16 -2
  63. data/lib/build-tool/commands/recipes/edit.rb +72 -0
  64. data/lib/build-tool/commands/recipes/incoming.rb +11 -7
  65. data/lib/build-tool/commands/recipes/info.rb +12 -8
  66. data/lib/build-tool/commands/recipes/install.rb +37 -42
  67. data/lib/build-tool/commands/recipes/list.rb +6 -2
  68. data/lib/build-tool/configuration.rb +88 -3
  69. data/lib/build-tool/environment.rb +2 -0
  70. data/lib/build-tool/errors.rb +5 -0
  71. data/lib/build-tool/history.rb +3 -181
  72. data/lib/build-tool/model/command_log.rb +93 -0
  73. data/lib/build-tool/model/feature.rb +80 -0
  74. data/lib/build-tool/{module.rb → model/module.rb} +110 -29
  75. data/lib/build-tool/model/module_log.rb +64 -0
  76. data/lib/build-tool/model/setting.rb +84 -0
  77. data/lib/build-tool/recipe.rb +40 -18
  78. data/lib/build-tool/repository.rb +39 -33
  79. data/lib/build-tool/server.rb +27 -3
  80. data/lib/build-tool/singleton.rb +2 -0
  81. data/lib/build-tool/sshkey.rb +2 -0
  82. data/lib/build-tool/state_helper.rb +64 -0
  83. data/lib/build-tool/vcs/archive.rb +3 -1
  84. data/lib/build-tool/vcs/base.rb +13 -0
  85. data/lib/build-tool/vcs/git-svn.rb +36 -14
  86. data/lib/build-tool/vcs/git.rb +180 -44
  87. data/lib/build-tool/vcs/mercurial.rb +25 -13
  88. data/lib/build-tool/vcs/svn.rb +20 -15
  89. data/lib/build-tool/version.rb +30 -0
  90. data/lib/mj/error.rb +2 -0
  91. data/lib/mj/logging.rb +2 -0
  92. data/lib/mj/mixins/inherited_attributes.rb +73 -0
  93. data/lib/mj/tools/editor.rb +34 -0
  94. data/lib/mj/tools/ssh.rb +2 -0
  95. data/lib/mj/tools/subprocess.rb +2 -1
  96. data/lib/mj/vcs/git.rb +14 -2
  97. data/lib/mj/visitor.rb +22 -0
  98. data/tasks/db.rake +36 -0
  99. data/tasks/racc.rake +14 -0
  100. data/tasks/rdoc.rake +8 -0
  101. data/tasks/rexical.rake +14 -0
  102. data/tasks/test.rake +21 -0
  103. data/test/integration/history_test.rb +88 -0
  104. data/test/integration/parser_configuration.rb +36 -0
  105. data/test/integration/parser_environment_parser.rb +156 -0
  106. data/test/integration/parser_feature_test.rb +75 -0
  107. data/test/integration/parser_git-svn_test.rb +92 -0
  108. data/test/integration/parser_git_test.rb +97 -0
  109. data/test/integration/parser_mercurial_test.rb +77 -0
  110. data/test/integration/parser_module_test.rb +103 -0
  111. data/test/integration/parser_svn_test.rb +92 -0
  112. data/test/integration/parser_test.rb +73 -0
  113. data/test/test_helper.rb +61 -0
  114. data/test/unit/configuration_test.rb +36 -0
  115. data/test/unit/git_configuration_test.rb +163 -0
  116. data/test/unit/git_svn_configuration_test.rb +240 -0
  117. data/test/unit/mercurial_configuration_test.rb +64 -0
  118. data/test/unit/model/command_log_test.rb +103 -0
  119. data/test/unit/model/feature_test.rb +29 -0
  120. data/test/unit/model/module_log_test.rb +70 -0
  121. data/test/unit/model/module_test.rb +32 -0
  122. data/test/unit/repository_test.rb +110 -0
  123. data/test/unit/server_test.rb +66 -0
  124. data/test/unit/svn_configuration_test.rb +90 -0
  125. metadata +134 -93
  126. data/Manifest.txt +0 -80
  127. data/db/migrations/001_command_histories.rb +0 -20
  128. data/db/migrations/002_module_events.rb +0 -24
  129. data/db/migrations/003_command_histories_add_logfile.rb +0 -19
  130. data/lib/build-tool/GUI.rb +0 -360
  131. data/lib/build-tool/commands/help.rb +0 -22
  132. data/lib/build-tool/commands/lsfeatures.rb +0 -76
  133. data/lib/build-tool/feature.rb +0 -47
data/.gitignore CHANGED
@@ -9,3 +9,4 @@ pkg/*
9
9
  lib/build-tool/cfg/parser.output
10
10
  lib/build-tool/cfg/parser.rb
11
11
  lib/build-tool/cfg/lexer.rb
12
+ .bundle/
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm ruby-1.9.3-p0@0.6-dev
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --charset=utf-8
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # A sample Gemfile
2
+ source "http://rubygems.org"
3
+
4
+ gemspec
5
+
data/Gemfile.lock ADDED
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ build-tool (0.6)
5
+ activerecord (>= 3.2.1)
6
+ ansi (>= 1.4.2)
7
+ grit (>= 2.4.1)
8
+ logging (>= 1.6.0)
9
+ sqlite3 (>= 1.3.5)
10
+
11
+ GEM
12
+ remote: http://rubygems.org/
13
+ specs:
14
+ activemodel (3.2.1)
15
+ activesupport (= 3.2.1)
16
+ builder (~> 3.0.0)
17
+ activerecord (3.2.1)
18
+ activemodel (= 3.2.1)
19
+ activesupport (= 3.2.1)
20
+ arel (~> 3.0.0)
21
+ tzinfo (~> 0.3.29)
22
+ activesupport (3.2.1)
23
+ i18n (~> 0.6)
24
+ multi_json (~> 1.0)
25
+ ansi (1.4.2)
26
+ arel (3.0.0)
27
+ builder (3.0.0)
28
+ diff-lcs (1.1.3)
29
+ grit (2.4.1)
30
+ diff-lcs (~> 1.1)
31
+ mime-types (~> 1.15)
32
+ i18n (0.6.0)
33
+ little-plugger (1.1.3)
34
+ logging (1.7.0)
35
+ little-plugger (>= 1.1.3)
36
+ mime-types (1.17.2)
37
+ multi_json (1.1.0)
38
+ racc (1.4.7)
39
+ rake (0.9.2.2)
40
+ rexical (1.0.5)
41
+ sqlite3 (1.3.5)
42
+ turn (0.9.3)
43
+ ansi
44
+ tzinfo (0.3.31)
45
+ yard (0.7.5)
46
+
47
+ PLATFORMS
48
+ ruby
49
+
50
+ DEPENDENCIES
51
+ build-tool!
52
+ racc (>= 1.4.7)
53
+ rake (>= 0.9.2)
54
+ rexical (>= 1.0.5)
55
+ turn (>= 0.9)
56
+ yard (>= 0.7.5)
data/History.txt CHANGED
@@ -1,3 +1,67 @@
1
+ == 0.6.0 ==
2
+
3
+ - Features
4
+ - Add --ionice and --nice N options to set IO (idle) and CPU Priority.
5
+ > kde-build --ionice --nice 19 build ....
6
+ - When updating the source show the newly applied commits if -v is specified.
7
+ They will allways end up in the rebase logfile.
8
+ - Make it possible to specify all modules at once.
9
+ kde-build fetch :all
10
+ - New command 'recipe edit'
11
+ - Opens the recipe override file in a editor.
12
+ - --global will open the recipe itself.
13
+ - --browser will open a file browser instead.
14
+ - New command 'module cleanup'
15
+ - Can remove the src and build dir of a module. Handle with care.
16
+ - The enabled/disabled state of features has been moved to the database.
17
+ - On the first start the current state will be migrated to the database.
18
+ AFTER that remove all 'feature enable|disable' lines from the override
19
+ file.
20
+ - command 'feature enable FEATURE' enables a feature.
21
+ - command 'feature disable FEATURE' disables a feature.
22
+ - The enabled/disabled state of modules has been moved to the database.
23
+ - On the first start the current state will be migrated to the database.
24
+ AFTER that remove all 'modules enable|disable' lines from the override
25
+ file.
26
+ - command 'module enable MODULE' enables a module.
27
+ - command 'module disable MODULE' disables a module and has options to
28
+ remove src and bld directory in one step.
29
+ - The 'recipe fetch incoming' command now works against a branch that has the
30
+ build-tool version encoded. This makes it possible to make a recipe that is
31
+ compatible to more than one version.
32
+ - The configuration values have been moved into the command line. A migration
33
+ will be done automatically on first run.
34
+ - 'configuration list' Will show the configuration values.
35
+ - 'configuration edit' will edit them.
36
+
37
+
38
+ - Enhancements
39
+ - Most of the --help texts have been improved dramatically.
40
+ - Unit testing was reenabled again.
41
+ - Command: lsmod
42
+ - Sort output alphabetically by default
43
+ - With --broken only shows modules that failed.
44
+ - With --no-sort shows modules in order of declaration / build order.
45
+ - With --all shows disabled modules too.
46
+ - With --disabled shows only disabled modules.
47
+ - Command lsfeat
48
+ - Looks much more similar to the module list output.
49
+ - Shows only active features by default.
50
+ - With --all shows all features.
51
+ - The long description statement now accepts multiline string with """....""".
52
+ - Command: gc
53
+ - Cleanup the logfiles more thoroughly.
54
+ - Disabled modules are accepted when given explicit on the command line if
55
+ they are associated with a active feature. This makes it possible to build
56
+ disabled modules.
57
+
58
+
59
+ - Bugfixes
60
+ - Change current directory to $HOME on start. The current working directory
61
+ could be removed while the command runs.
62
+
63
+
64
+
1
65
  == 0.5.7 ==
2
66
 
3
67
  - Features
data/README.txt CHANGED
@@ -46,13 +46,6 @@ Currently the following recipes are provided:
46
46
 
47
47
  http://michael-jansen.biz/build-tool
48
48
 
49
- == REQUIREMENTS:
50
-
51
- * logging >= 1.4.3
52
- * sequel >= 3.18.0
53
- * sqlite3-ruby >= 1.3.1
54
- * ansi >= 1.2.2
55
-
56
49
  == INSTALL:
57
50
 
58
51
  gem install build-tool
data/Rakefile CHANGED
@@ -1,61 +1,13 @@
1
1
  # -*- ruby -*-
2
- require 'rubygems'
2
+ require 'bundler/gem_tasks'
3
3
 
4
- # http://rubyforge.org/tracker/index.php?func=detail&aid=28920&group_id=1513&atid=5921
5
- begin
6
- require 'psych'
7
- rescue ::LoadError
8
- end
9
-
10
- require 'hoe'
11
- require 'fileutils'
12
- require './lib/build-tool'
13
-
14
- Hoe.plugin :git
15
- Hoe.plugin :doofus
16
- Hoe.plugin :debugging
17
- Hoe.plugin :racc
18
-
19
-
20
- # Generate all the Rake tasks
21
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
22
- Hoe.spec( 'build-tool' ) do
23
-
24
- self.developer 'Michael Jansen', 'info@michael-jansen.biz'
25
-
26
- self.version = BuildTool::VERSION
27
-
28
- self.post_install_message = <<-EOS
29
- To start with build-tool try the following commands:
30
- > build-tool recipe add git://gitorious.org/build-tool/kde-trunk-recipe.git kde
31
- > build-tool recipe list
32
- > build-tool recipe install kde
33
-
34
- For documentation see http://michael-jansen.biz/build-tool
35
-
36
- EOS
37
- self.rubyforge_name = self.name
38
-
39
- self.extra_deps <<
40
- ['logging', ">= 1.4.3"] <<
41
- ['sequel', ">= 3.18.0"] <<
42
- ['sqlite3', ">= 1.3.3" ] <<
43
- ['ansi', '>= 1.2.2' ] <<
44
- ['grit', ">= 2.4.1" ]
45
-
46
- self.extra_dev_deps <<
47
- ['hoe-debugging', ">= 1.0.1"] <<
48
- ['hoe-doofus', ">= 1.0.0"] <<
49
- ['hoe-git', ">= 1.3.0"] <<
50
- ['racc', ">= 1.4.6"] <<
51
- ['rexical', ">= 1.0.5"]
52
-
53
- self.rex_flags = ""
4
+ Dir['tasks/**/*.rake'].each { |t| load t }
54
5
 
6
+ # A task to build all generated files.
7
+ namespace :bt do
8
+ desc "Generate all needed files"
9
+ task :genall => [ :rexical, :racc ]
55
10
  end
56
11
 
57
- Dir['tasks/**/*.rake'].each { |t| load t }
58
-
59
- # Want other tests/tasks run by default
60
- # remove_task :default
61
- # task :default => [:spec, :features]
12
+ # Make sure all files are generated when building the pkg
13
+ task :build => 'bt:genall'
data/bin/build-tool CHANGED
@@ -1,15 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
2
3
  #
3
4
  # Created by Michael Jansen on 2009-8-31.
4
5
  # Copyright (c) 2009. All rights reserved.
5
6
 
7
+ # BEGIN { $VERBOSE = true }
8
+
6
9
  require 'pathname'
7
10
  require 'rubygems'
8
11
 
9
12
  # libs relative to the link target
10
13
  root_directory = Pathname.new(__FILE__).realpath.dirname.dirname
11
14
 
12
- require root_directory.join( 'lib/build-tool')
15
+ require root_directory.join( 'lib/build-tool').to_s
13
16
  require 'build-tool/application'
14
17
 
15
18
  exit BuildTool.main( $0, ARGV, root_directory );
@@ -0,0 +1,62 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'build-tool/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'build-tool'
7
+ s.version = BuildTool::VERSION
8
+ s.authors = ['Michael Jansen']
9
+ s.email = ['info@michael-jansen.biz']
10
+ s.homepage = 'http://michael-jansen.biz'
11
+ s.summary = %q{A tool helping to download, configure and compile from sources.}
12
+ s.description = %q{
13
+ The tool helps
14
+
15
+ ...
16
+ }
17
+
18
+ s.license = 'GPL-V2+'
19
+
20
+ # It only works with ruby 1.9
21
+ s.required_ruby_version = '>= 1.9.2'
22
+
23
+ # Additional requirements (verbose)
24
+ # s.requirements << ''
25
+
26
+ # Documentation
27
+ s.rubyforge_project = 'build-tool'
28
+ s.extra_rdoc_files = [ 'README.txt' ]
29
+
30
+ # Dependencies
31
+ s.add_dependency( 'logging', '>= 1.6.0' ) # Logging Support
32
+ s.add_dependency( 'activerecord', '>= 3.2.1' ) # Object Relation Model
33
+ s.add_dependency( 'sqlite3', '>= 1.3.5' ) # SQLite Database Support
34
+ s.add_dependency( 'ansi', '>= 1.4.2' ) # ANSI Codes at your Fingertips
35
+ s.add_dependency( 'grit', '>= 2.4.1' ) # Git Support
36
+
37
+ # Development Dependencies
38
+ s.add_development_dependency( 'racc', '>= 1.4.7' ) # A LALR(1) parser generator.
39
+ s.add_development_dependency( 'rexical', '>= 1.0.5') # A lexical scanner generator
40
+ s.add_development_dependency( 'rake', '>= 0.9.2' )
41
+ s.add_development_dependency( 'yard', '>= 0.7.5' )
42
+ s.add_development_dependency( 'turn', '>= 0.9' ) # Pretty test output
43
+
44
+ # Post installation message
45
+ s.post_install_message = <<-EOF
46
+ Thank you for using build-tool. For documentation see http://michael-jansen.biz/build-tool .
47
+ Report bugs to kde (at) michael-jansen.biz.
48
+
49
+ To start with build-tool try the following commands:
50
+ > build-tool recipe add git://gitorious.org/build-tool/kde-trunk-recipe.git kde
51
+ > build-tool recipe list
52
+ > build-tool recipe install kde
53
+
54
+ EOF
55
+
56
+ s.files = `git ls-files`.split("\n")
57
+ s.files += Dir.glob( 'lib/**/*.y' ).map { |p| p.sub( /.y$/, '.rb' ) }
58
+ s.files += Dir.glob( 'lib/**/*.rex' ).map { |p| p.sub( /.rex$/, '.rb' ) }
59
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
60
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
61
+ s.require_paths = ['lib']
62
+ end
@@ -0,0 +1,17 @@
1
+ class AddCommandLogs < ActiveRecord::Migration
2
+
3
+ def up
4
+ create_table :command_logs do |t|
5
+ t.string :command, :null => false
6
+ t.string :logdir
7
+ t.datetime :started_at
8
+ t.datetime :finished_at
9
+ t.integer :state, :default => 0, :null => false
10
+ end
11
+ end
12
+
13
+ def down
14
+ drop_table :command_logs
15
+ end
16
+
17
+ end
@@ -0,0 +1,20 @@
1
+ class AddModuleLogs < ActiveRecord::Migration
2
+
3
+ def up
4
+ create_table :module_logs do |t|
5
+ t.integer :command_log_id, :null => false
6
+ t.string :module, :null => false
7
+ t.string :event, :size => 20, :null => false
8
+ t.string :logfile
9
+ t.datetime :started_at
10
+ t.datetime :finished_at
11
+ t.integer :state, :default => 0, :null => false
12
+ end
13
+ end
14
+
15
+ def down
16
+ drop_table :module_events
17
+ end
18
+
19
+ end
20
+
@@ -0,0 +1,17 @@
1
+ class AddFeatures < ActiveRecord::Migration
2
+
3
+ def up
4
+ create_table :features do |t|
5
+ t.string :name, :null => false
6
+ t.integer :parent_id
7
+ t.boolean :active, :default => nil
8
+ end
9
+ add_index :features, [ :parent_id, :name ], :unique => true
10
+ end
11
+
12
+ def down
13
+ remove_index :features, [ :parent_id, :name ]
14
+ drop_table :features
15
+ end
16
+
17
+ end
@@ -0,0 +1,17 @@
1
+ class AddModules < ActiveRecord::Migration
2
+
3
+ def up
4
+ create_table :modules do |t|
5
+ t.string :name, :null => false
6
+ t.boolean :active, :default => nil
7
+ end
8
+ add_index :modules, [ :name ], :unique => true
9
+ end
10
+
11
+ def down
12
+ remove_index :modules, [ :name ]
13
+ drop_table :modules
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,18 @@
1
+ class AddSettings < ActiveRecord::Migration
2
+
3
+ def up
4
+ create_table :settings do |t|
5
+ t.string :name, :null => false
6
+ t.string :value
7
+ end
8
+
9
+ add_index :settings, :name
10
+ end
11
+
12
+ def down
13
+ remove_index :settings, :name
14
+ drop_table :settings
15
+ end
16
+
17
+ end
18
+
data/lib/build-tool.rb CHANGED
@@ -1,7 +1,6 @@
1
+ # -*- coding: UTF-8 -*-
2
+
1
3
  $:.unshift(File.dirname(__FILE__)) unless
2
4
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
5
 
4
- module BuildTool
5
- VERSION = '0.5.7'
6
- end
7
-
6
+ require 'build-tool/version'
@@ -1,20 +1,20 @@
1
+ # -*- encoding: UTF-8 -*-
1
2
 
2
3
  require 'logging'
3
- Logging.init :debug, :trace, :verbose, :info, :warn, :error
4
+ Logging.init :debug2, :debug, :trace, :verbose, :info, :warn, :error
4
5
  include Logging.globally
5
6
 
6
7
  require 'optparse'
7
8
  require 'erb'
8
9
  require 'yaml'
9
- require 'sequel'
10
- require 'sequel/extensions/migration'
11
10
 
12
11
  require 'mj/logging'
13
12
 
14
13
  require "build-tool/errors"
15
- require 'build-tool/recipe'
16
14
  require 'build-tool/singleton'
17
- require 'build-tool/cfg/parser'
15
+
16
+ require 'active_record'
17
+ require 'sqlite3'
18
18
 
19
19
  $noop = false
20
20
 
@@ -34,9 +34,8 @@ class Application < Singleton
34
34
  attr_reader :name
35
35
 
36
36
  def recipe
37
- return @recipe if @recipe
38
- configuration
39
- @recipe
37
+ return @configuration.recipe if @configuration
38
+ configuration.recipe
40
39
  end
41
40
 
42
41
  def initialize( name, application_root )
@@ -44,22 +43,107 @@ def initialize( name, application_root )
44
43
  @application_root = Pathname.new( application_root ).expand_path
45
44
  @database = nil
46
45
  @name = File.basename( name ).sub( "-build", "" )
47
- @recipe = nil
48
46
  @local_settings_file_path = local_configuration_dir.join("#{@name}.yaml")
49
47
  end
50
48
 
49
+ # Execute necessary migration steps
50
+ def migrate()
51
+
52
+ logger.debug( 'Checking for obsolete modules in db.' )
53
+ for mod in @configuration.modules do
54
+ if not mod.found_in_recipe
55
+ logger.info 'Module %s no longer supported by recipe. Removing it from db.' % [ mod.name ]
56
+ mod.destroy()
57
+ end
58
+ end
59
+
60
+ logger.debug( 'Checking for obsolete settings in db.' )
61
+ @configuration.settings.each do |n, s|
62
+ if not s.seen and not n.start_with? 'BUILD_TOOL.'
63
+ logger.info 'Setting %s no longer supported by recipe. Removing it from db.' % [ s.name ]
64
+ s.destroy()
65
+ end
66
+ end
67
+
68
+ end
69
+
51
70
  # Load the configuration
52
71
  def configuration
53
72
  return @configuration if @configuration
54
- # First load the settings file
73
+
74
+ require 'build-tool/configuration'
75
+ require 'build-tool/recipe'
76
+
77
+ # Read the configuration from the database
78
+ @configuration = Configuration.new()
79
+ @configuration.load()
80
+
81
+ #
82
+ ### MIGRATION FROM 0.5 START
83
+ #
84
+ # First load the old settings file if it exists. For new style the settings are
85
+ # correctly loaded from the database already.
55
86
  file = local_settings_file_path
56
- logger.debug "Loading settings file #{file}"
57
- raise ConfigurationError, "Configuration File #{file} does not exists!" if !file.exist?
58
- @settings = YAML.load_file( file )
59
- # Then load the recipe
60
- logger.debug "Loading configuration for #{name}"
61
- @recipe = BuildTool::Recipe.new( @settings['RECIPE'] || name )
62
- @configuration = @recipe.load( name, @settings['SETTINGS'] )
87
+ if file.exist?
88
+ logger.info "Loading old style settings file #{file}."
89
+ YAML.load( File.open( file, 'r:UTF-8' ) ).each do |n, v|
90
+ case n
91
+ when 'RECIPE'
92
+ n = "BUILD_TOOL.RECIPE"
93
+ logger.debug( " %s='%s'" % [ n, v ] )
94
+ s = ( @configuration.settings[ n ] or Setting.new( :name => n ) )
95
+ s.value = v
96
+ @configuration.add_setting( s )
97
+ when 'SETTINGS'
98
+ v.each do |n, v|
99
+ logger.debug( " %s='%s'" % [ n, v ] )
100
+ s = ( @configuration.settings[ n ] or Setting.new( :name => n ) )
101
+ s.value = v
102
+ @configuration.add_setting( s )
103
+ end
104
+ else
105
+ logger.warn( 'Unknown setting %s found in %s' % [ n, file ] )
106
+ end
107
+ end
108
+ @configuration.save()
109
+ # Now rename the old file.
110
+ file.rename( file.to_s + '_0.5' )
111
+ logger.info( "Renamed old style settings file to #{file}_0.5. Please delete later!" )
112
+ end
113
+ #
114
+ ### MIGRATION FROM 0.5 END
115
+ #
116
+
117
+
118
+ # Find the recipe. Will throw an exception if recipe is invalid.
119
+ recipe = BuildTool::Recipe.new( @configuration.settings['BUILD_TOOL.RECIPE'].value )
120
+ logger.debug( 'Determined associated recipe as %s ( %s )' % [ recipe.name, recipe.global_path ] )
121
+ @configuration.recipe = recipe
122
+
123
+ # Initialize the settings from the settings.yaml file from the recipe
124
+ logger.debug( 'Loading configuration values from recipe:settings.yaml' )
125
+ YAML.load( File.open( recipe.global_config_file_path( 'settings.yaml' ), 'r:UTF-8' ) ).each do |v|
126
+ name = v['name']
127
+ logger.debug2( ' - Setting %s' % name )
128
+ s = ( @configuration.settings[ name ] or Setting.new( :name => name ) )
129
+ s.description = v['description']
130
+ s.default = v['default']
131
+ s.seen = true
132
+ @configuration.add_setting( s )
133
+ end
134
+
135
+ # Load the recipe
136
+ logger.debug( 'Loading recipe %s' % recipe.name )
137
+ @configuration = recipe.load( name, @configuration )
138
+
139
+ # Save possible changes to the configuration.
140
+ @configuration.save
141
+
142
+ # Migrate the recipe (if necessary)
143
+ migrate()
144
+
145
+ # Finished.
146
+ @configuration
63
147
  end
64
148
 
65
149
  # Return the local configuration dir. Makes sure the directory exists
@@ -76,18 +160,19 @@ def local_configuration_dir
76
160
  # Open the database
77
161
  #
78
162
  # @return [Object] The database handle
79
- def open_database
163
+ def open_database( name )
80
164
  path = local_configuration_dir.join( "#{name}.db" )
81
165
  logger.debug "Opening the database #{path}."
82
- @database = Sequel.connect( "sqlite:///#{path.to_s}" )
83
- @database.logger= MJ::Logging::LoggerAdapter.new( 'db' )
84
- # Try to upgrade the database if necessary
85
- Sequel::Migrator.apply( @database, application_root.join( 'db/migrations' ) )
166
+ ActiveRecord::Base.establish_connection(
167
+ :adapter => 'sqlite3',
168
+ :database => path.to_s )
169
+ ActiveRecord::Migrator.migrate(
170
+ [ application_root.join( 'db/migrations' ) ] )
86
171
  end
87
172
 
88
173
  # Close the database
89
174
  def close_database
90
- @database.disconnect
175
+ ActiveRecord::Base.remove_connection()
91
176
  path = local_configuration_dir.join( "#{name}.db" )
92
177
  logger.debug "Closing the database #{path}."
93
178
  end
@@ -102,7 +187,7 @@ def main( args )
102
187
  # don't need a configuration. Help for example.
103
188
 
104
189
  # Initialize the database.
105
- open_database()
190
+ open_database( name )
106
191
 
107
192
  begin
108
193
 
@@ -110,14 +195,9 @@ def main( args )
110
195
  require 'build-tool/commands'
111
196
  @cli = Commands::Shell.new
112
197
 
113
- # Load the commands. This has to be done AFTER the database is opened because
114
- # sequel expects that there is a database before a Sequel::Model is created.
115
- #
116
- # And the commands require all that database related stuff.
117
- @cli.load_commands( @application_root.join( "lib/build-tool/commands" ), BuildTool::Commands )
118
-
119
198
  # Execute the given command (or start the cli)
120
199
  @cli.execute( args )
200
+
121
201
  ensure
122
202
  # Make sure the database is closed correctly
123
203
  close_database
@@ -135,15 +215,24 @@ def has_recipe?
135
215
 
136
216
  def BuildTool.main(name, args, root_directory)
137
217
 
218
+ Dir.chdir( ENV["HOME"] )
219
+
138
220
  begin
139
221
  # Setup logging
140
- Logging.logger.root.level = :debug
222
+ Logging.logger.root.level = :debug2
223
+
141
224
  # Special case for the configurationParser. It is very verbose if active.
142
225
  Logging.logger['BuildTool::Cfg::Parser'].level = :info
143
- Logging.logger['MJ::Logging::LoggerAdapter'].level = :warn
144
- Logging.logger['root'].appenders = Logging.appenders.stdout(
226
+
227
+ # Same goes for the activerecord logger, :info shows migrations
228
+ Logging.logger['ActiveRecord'].level = :warn
229
+ ActiveRecord::Base.logger = ::Logging::Logger['ActiveRecord']
230
+
231
+ # By default write only :info messages to stdout
232
+ Logging.logger['root'].add_appenders( Logging.appenders.stdout(
145
233
  :layout => MJ::Logging::BasicLayout.new(),
146
- :level => :info)
234
+ :level => :info) )
235
+
147
236
  # Create the application
148
237
  app = BuildTool::Application.new( name, root_directory )
149
238
  # Execute the application
@@ -152,11 +241,12 @@ def BuildTool.main(name, args, root_directory)
152
241
  logger.info "User interrupt!"
153
242
  return 0
154
243
  rescue BuildTool::Error => e
155
- logger.error e.message
156
- logger.verbose e.backtrace.join("\n")
244
+ logger.error( e.message )
245
+ logger.verbose( e.backtrace.join("\n") )
157
246
  return -1
158
247
  rescue Exception => e
159
- logger.error e
248
+ logger.error( e )
249
+ logger.verbose( e.backtrace.join("\n") )
160
250
  return -1
161
251
  end
162
252