RDI 0.1.0.20091020
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -0
- data/ChangeLog +46 -0
- data/Credits +21 -0
- data/LICENSE +31 -0
- data/README +18 -0
- data/TODO +17 -0
- data/lib/rdi/Installer.rb +678 -0
- data/lib/rdi/Model/ContextModifier.rb +20 -0
- data/lib/rdi/Model/DependencyDescription.rb +154 -0
- data/lib/rdi/Model/DependencyUserChoice.rb +202 -0
- data/lib/rdi/Model/Installer.rb +24 -0
- data/lib/rdi/Model/LocationSelector.rb +16 -0
- data/lib/rdi/Model/ProgressView.rb +16 -0
- data/lib/rdi/Model/Tester.rb +20 -0
- data/lib/rdi/Model/View.rb +16 -0
- data/lib/rdi/Plugins/ContextModifiers/GemPath.desc.rb +13 -0
- data/lib/rdi/Plugins/ContextModifiers/GemPath.rb +106 -0
- data/lib/rdi/Plugins/ContextModifiers/LibraryPath.rb +74 -0
- data/lib/rdi/Plugins/ContextModifiers/RubyLoadPath.rb +76 -0
- data/lib/rdi/Plugins/ContextModifiers/SystemPath.rb +74 -0
- data/lib/rdi/Plugins/GemCommon.rb +127 -0
- data/lib/rdi/Plugins/Installers/Download.rb +72 -0
- data/lib/rdi/Plugins/Installers/DownloadAndInstall.desc.rb +11 -0
- data/lib/rdi/Plugins/Installers/DownloadAndInstall.rb +54 -0
- data/lib/rdi/Plugins/Installers/Gem.desc.rb +13 -0
- data/lib/rdi/Plugins/Installers/Gem.rb +67 -0
- data/lib/rdi/Plugins/Installers/Icons/Download.png +0 -0
- data/lib/rdi/Plugins/Installers/Icons/DownloadAndInstall.png +0 -0
- data/lib/rdi/Plugins/Installers/Icons/Gem.png +0 -0
- data/lib/rdi/Plugins/Installers/Yum.rb +52 -0
- data/lib/rdi/Plugins/ProgressViews/SimpleWxGUI.desc.rb +13 -0
- data/lib/rdi/Plugins/ProgressViews/SimpleWxGUI.rb +58 -0
- data/lib/rdi/Plugins/ProgressViews/Text.rb +68 -0
- data/lib/rdi/Plugins/RubyGemsDepDesc.rb +41 -0
- data/lib/rdi/Plugins/Testers/Binaries.rb +56 -0
- data/lib/rdi/Plugins/Testers/DynamicLibraries.rb +56 -0
- data/lib/rdi/Plugins/Testers/RubyRequires.rb +76 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/DependenciesLoaderDialog.rb +147 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/DependencyPanel.rb +301 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/Dependency.png +0 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/Ignore.png +0 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/ValidKO.png +0 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/Icons/ValidOK.png +0 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/LocationSelectors/Directory.desc.rb +13 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI/LocationSelectors/Directory.rb +45 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI.desc.rb +13 -0
- data/lib/rdi/Plugins/Views/SimpleWxGUI.rb +60 -0
- data/lib/rdi/Plugins/Views/Text/LocationSelectors/Directory.rb +44 -0
- data/lib/rdi/Plugins/Views/Text.rb +257 -0
- data/lib/rdi/Plugins/WxCommon.rb +69 -0
- data/lib/rdi/Plugins/WxRubyDepDesc.rb +36 -0
- data/lib/rdi/rdi.rb +8 -0
- data/test/Common.rb +796 -0
- data/test/Flows/BasicFlows.rb +114 -0
- data/test/Flows/UIFlows.rb +460 -0
- data/test/Plugins/ContextModifiers/GemPath.rb +44 -0
- data/test/Plugins/ContextModifiers/LibraryPath.rb +36 -0
- data/test/Plugins/ContextModifiers/RubyLoadPath.rb +36 -0
- data/test/Plugins/ContextModifiers/SystemPath.rb +36 -0
- data/test/Plugins/Installers/Download.rb +65 -0
- data/test/Plugins/Installers/DownloadAndInstall.rb +73 -0
- data/test/Plugins/Installers/Gem.rb +79 -0
- data/test/Plugins/LocationSelectors/Directory.rb +34 -0
- data/test/Plugins/Testers/Binaries.rb +46 -0
- data/test/Plugins/Testers/DynamicLibraries.rb +46 -0
- data/test/Plugins/Testers/RubyRequires.rb +48 -0
- data/test/Plugins/Views/SimpleWxGUI.rb +190 -0
- data/test/Plugins/Views/Text.rb +112 -0
- data/test/Plugins/WxEnv.rb +58 -0
- data/test/Plugins/WxEnvApp.rb +53 -0
- data/test/Repository/Binaries/DummyBinary +1 -0
- data/test/Repository/Libraries/DummyLibrary.so +1 -0
- data/test/Repository/RubyGems/DummyGem-0.0.1.20090828.gem +0 -0
- data/test/Repository/RubyGems/GemsSources/DummyGem/DummyGem.gemspec.rb +23 -0
- data/test/Repository/RubyGems/GemsSources/DummyGem/lib/DummyGemMain.rb +5 -0
- data/test/Repository/RubyLibraries/DummyRubyLib.rb +1 -0
- data/test/run.rb +23 -0
- metadata +145 -0
@@ -0,0 +1,76 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/ContextModifier'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module ContextModifiers
|
11
|
+
|
12
|
+
class RubyLoadPath < RDI::Model::ContextModifier
|
13
|
+
|
14
|
+
# Get the name of classes that provide selection facility for locations
|
15
|
+
#
|
16
|
+
# Return:
|
17
|
+
# * _String_: The name of the LocationSelector class
|
18
|
+
def getLocationSelectorName
|
19
|
+
return 'Directory'
|
20
|
+
end
|
21
|
+
|
22
|
+
# Transform a given content based on an installation environment.
|
23
|
+
# This is called to pass some specific installation parameters to a more generic content (useful for installation directories for example)
|
24
|
+
#
|
25
|
+
# Parameters:
|
26
|
+
# * *iLocation* (_Object_): Location to transform
|
27
|
+
# * *iInstallEnv* (<em>map<Symbol,Object></em>): The installation environment that called this context modification
|
28
|
+
# Return:
|
29
|
+
# * _Object_: The location transformed with the installation environment
|
30
|
+
def transformContentWithInstallEnv(iLocation, iInstallEnv)
|
31
|
+
rNewLocation = iLocation
|
32
|
+
|
33
|
+
lInstallDir = iInstallEnv[:InstallDir]
|
34
|
+
if (lInstallDir != nil)
|
35
|
+
rNewLocation = iLocation.gsub(/%INSTALLDIR%/, lInstallDir)
|
36
|
+
end
|
37
|
+
|
38
|
+
return rNewLocation
|
39
|
+
end
|
40
|
+
|
41
|
+
# Is a given location present in the context ?
|
42
|
+
#
|
43
|
+
# Parameters:
|
44
|
+
# * *iLocation* (_Object_): Location to add
|
45
|
+
# Return:
|
46
|
+
# * _Boolean_: Is the location already present ?
|
47
|
+
def isLocationInContext?(iLocation)
|
48
|
+
# * *iLocation* (_String_): Directory
|
49
|
+
return $LOAD_PATH.include?(iLocation)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Add a given location to the context
|
53
|
+
#
|
54
|
+
# Parameters:
|
55
|
+
# * *iLocation* (_Object_): Location to add
|
56
|
+
def addLocationToContext(iLocation)
|
57
|
+
# * *iLocation* (_String_): Directory
|
58
|
+
$LOAD_PATH << iLocation
|
59
|
+
end
|
60
|
+
|
61
|
+
# Remove a given location from the context
|
62
|
+
#
|
63
|
+
# Parameters:
|
64
|
+
# * *iLocation* (_Object_): Location to remove
|
65
|
+
def removeLocationFromContext(iLocation)
|
66
|
+
# * *iLocation* (_String_): Directory
|
67
|
+
$LOAD_PATH.delete_if do |iLoadDir|
|
68
|
+
(iLoadDir == iLocation)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/ContextModifier'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module ContextModifiers
|
11
|
+
|
12
|
+
class SystemPath < RDI::Model::ContextModifier
|
13
|
+
|
14
|
+
# Get the name of classes that provide selection facility for locations
|
15
|
+
#
|
16
|
+
# Return:
|
17
|
+
# * _String_: The name of the LocationSelector class
|
18
|
+
def getLocationSelectorName
|
19
|
+
return 'Directory'
|
20
|
+
end
|
21
|
+
|
22
|
+
# Transform a given content based on an installation environment.
|
23
|
+
# This is called to pass some specific installation parameters to a more generic content (useful for installation directories for example)
|
24
|
+
#
|
25
|
+
# Parameters:
|
26
|
+
# * *iLocation* (_Object_): Location to transform
|
27
|
+
# * *iInstallEnv* (<em>map<Symbol,Object></em>): The installation environment that called this context modification
|
28
|
+
# Return:
|
29
|
+
# * _Object_: The location transformed with the installation environment
|
30
|
+
def transformContentWithInstallEnv(iLocation, iInstallEnv)
|
31
|
+
rNewLocation = iLocation
|
32
|
+
|
33
|
+
lInstallDir = iInstallEnv[:InstallDir]
|
34
|
+
if (lInstallDir != nil)
|
35
|
+
rNewLocation = iLocation.gsub(/%INSTALLDIR%/, lInstallDir)
|
36
|
+
end
|
37
|
+
|
38
|
+
return rNewLocation
|
39
|
+
end
|
40
|
+
|
41
|
+
# Is a given location present in the context ?
|
42
|
+
#
|
43
|
+
# Parameters:
|
44
|
+
# * *iLocation* (_Object_): Location to add
|
45
|
+
# Return:
|
46
|
+
# * _Boolean_: Is the location already present ?
|
47
|
+
def isLocationInContext?(iLocation)
|
48
|
+
# * *iLocation* (_String_): Directory
|
49
|
+
return $rUtilAnts_Platform_Info.getSystemExePath.include?(iLocation)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Add a given location to the context
|
53
|
+
#
|
54
|
+
# Parameters:
|
55
|
+
# * *iLocation* (_Object_): Location to add
|
56
|
+
def addLocationToContext(iLocation)
|
57
|
+
# * *iLocation* (_String_): Directory
|
58
|
+
$rUtilAnts_Platform_Info.setSystemExePath($rUtilAnts_Platform_Info.getSystemExePath + [ iLocation ])
|
59
|
+
end
|
60
|
+
|
61
|
+
# Remove a given location from the context
|
62
|
+
#
|
63
|
+
# Parameters:
|
64
|
+
# * *iLocation* (_Object_): Location to remove
|
65
|
+
def removeLocationFromContext(iLocation)
|
66
|
+
# * *iLocation* (_String_): Directory
|
67
|
+
$rUtilAnts_Platform_Info.setSystemExePath($rUtilAnts_Platform_Info.getSystemExePath - [ iLocation ])
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
module Gem
|
7
|
+
|
8
|
+
class GemPathList < Array
|
9
|
+
|
10
|
+
# Add a path to the list
|
11
|
+
#
|
12
|
+
# Parameters:
|
13
|
+
# * *iDirName* (_String_): Directory to add to the list
|
14
|
+
def <<(iDirName)
|
15
|
+
# Add the path for real in the internals
|
16
|
+
super
|
17
|
+
# Add the lib directory if it is already initialized
|
18
|
+
if ((defined?(@LibDirs) != nil) and
|
19
|
+
(@LibDirs != nil))
|
20
|
+
Dir.glob("#{iDirName}/gems/*").each do |iGemDirName|
|
21
|
+
if (File.exists?("#{iGemDirName}/lib"))
|
22
|
+
@LibDirs << iGemDirName
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
# Add the path in RubyGems
|
27
|
+
Gem.path_ORG << iDirName
|
28
|
+
end
|
29
|
+
|
30
|
+
# Get the list of lib directories accessible through the paths
|
31
|
+
#
|
32
|
+
# Return:
|
33
|
+
# * <em>list<String></em>: List of paths
|
34
|
+
def getLibDirs
|
35
|
+
if ((defined?(@LibDirs) == nil) or
|
36
|
+
(@LibDirs == nil))
|
37
|
+
# Create it
|
38
|
+
@LibDirs = []
|
39
|
+
each do |iGemsDirName|
|
40
|
+
Dir.glob("#{iGemsDirName}/gems/*").each do |iGemDirName|
|
41
|
+
if (File.exists?("#{iGemDirName}/lib"))
|
42
|
+
@LibDirs << iGemDirName
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
return @LibDirs
|
49
|
+
end
|
50
|
+
|
51
|
+
# Clear the paths
|
52
|
+
def clear_paths
|
53
|
+
Gem.clear_paths_ORG
|
54
|
+
# Reset our cache with the new paths
|
55
|
+
replace(Gem.path_ORG)
|
56
|
+
@LibDirs = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
# Clear the cache
|
60
|
+
def clearCache
|
61
|
+
@LibDirs = nil
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
$RDI_GemPath_Cache = GemPathList.new(Gem.path)
|
67
|
+
|
68
|
+
# Alias the old class methods
|
69
|
+
class << self
|
70
|
+
alias :find_files_ORG :find_files
|
71
|
+
remove_method :find_files
|
72
|
+
alias :path_ORG :path
|
73
|
+
remove_method :path
|
74
|
+
alias :clear_paths_ORG :clear_paths
|
75
|
+
remove_method :clear_paths
|
76
|
+
end
|
77
|
+
|
78
|
+
# Return the list of files matching a Ruby require
|
79
|
+
#
|
80
|
+
# Parameters:
|
81
|
+
# * *iRequireName* (_String_): Name to require
|
82
|
+
# Return:
|
83
|
+
# * <em>list<String></em>: File names list
|
84
|
+
def self.find_files(iRequireName)
|
85
|
+
rFilesList = []
|
86
|
+
|
87
|
+
lRequireGlob = iRequireName
|
88
|
+
if (File.extname(iRequireName).empty?)
|
89
|
+
# Look using globs of any extension
|
90
|
+
lRequireGlob = "#{iRequireName}.{rb,so,o,sl,dll}"
|
91
|
+
end
|
92
|
+
# 1. Look through Ruby LOAD PATH and the cache
|
93
|
+
($LOAD_PATH + $RDI_GemPath_Cache.getLibDirs).each do |iLibDir|
|
94
|
+
lList = Dir.glob("#{iLibDir}/#{lRequireGlob}")
|
95
|
+
if (!lList.empty?)
|
96
|
+
rFilesList = lList
|
97
|
+
break
|
98
|
+
end
|
99
|
+
end
|
100
|
+
# 3. Ask RubyGems for real
|
101
|
+
if (rFilesList.empty?)
|
102
|
+
rFilesList = Gem.find_files_ORG(iRequireName)
|
103
|
+
end
|
104
|
+
|
105
|
+
return rFilesList
|
106
|
+
end
|
107
|
+
|
108
|
+
# Return the list of Gem paths
|
109
|
+
#
|
110
|
+
# Return:
|
111
|
+
# * <em>list<String></em>: List of Gem paths
|
112
|
+
def self.path
|
113
|
+
return $RDI_GemPath_Cache
|
114
|
+
end
|
115
|
+
|
116
|
+
# Clear the paths
|
117
|
+
def self.clear_paths
|
118
|
+
$RDI_GemPath_Cache.clear_paths
|
119
|
+
end
|
120
|
+
|
121
|
+
# Clear the library cache
|
122
|
+
# This is useful to ensure usecase tests isolation
|
123
|
+
def self.clearCache_RDI
|
124
|
+
$RDI_GemPath_Cache.clearCache
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/Installer'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module Installers
|
11
|
+
|
12
|
+
class Download < RDI::Model::Installer
|
13
|
+
|
14
|
+
# Get the list of possible destinations
|
15
|
+
#
|
16
|
+
# Return:
|
17
|
+
# * <em>list<[Integer,Object]></em>: The list of possible destinations and their corresponding installation location (or location selector name for DEST_OTHER)
|
18
|
+
def getPossibleDestinations
|
19
|
+
return [
|
20
|
+
[ DEST_LOCAL, "#{@Installer.ExtDir}/Downloads" ],
|
21
|
+
[ DEST_SYSTEM, @Installer.SystemDir ],
|
22
|
+
[ DEST_USER, @Installer.UserDir ],
|
23
|
+
[ DEST_TEMP, @Installer.TempDir ],
|
24
|
+
[ DEST_OTHER, 'Directory' ]
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Install a dependency
|
29
|
+
#
|
30
|
+
# Parameters:
|
31
|
+
# * *iContent* (_Object_): The dependency's content
|
32
|
+
# * *iLocation* (_Object_): The installation location
|
33
|
+
# * *ioInstallEnv* (<em>map<Symbol,Object></em>): The installed environment, that can be modified here. Stored variables will the be accessible to ContextModifiers. [optional = {}]
|
34
|
+
# Return:
|
35
|
+
# * _Exception_: The error, or nil in case of success
|
36
|
+
def installDependency(iContent, iLocation, ioInstallEnv = {})
|
37
|
+
# * *iContent* (_String_): The URL
|
38
|
+
# * *iLocation* (_String_): The directory to install to
|
39
|
+
rError = nil
|
40
|
+
|
41
|
+
# Download the URL
|
42
|
+
# The URL can be a zip file, a targz, a direct file ...
|
43
|
+
# Don't use URL caching.
|
44
|
+
accessFile(iContent, { :LocalFileAccess => true }) do |iLocalFileName, iBaseName|
|
45
|
+
case File.extname(iLocalFileName).upcase
|
46
|
+
when '.ZIP'
|
47
|
+
# Unzip before
|
48
|
+
rError = extractZipFile(iLocalFileName, iLocation)
|
49
|
+
if (rError != nil)
|
50
|
+
rError = RuntimeError.new("Error while unzipping from #{iLocalFileName} to #{iLocation}:\n#{rError}")
|
51
|
+
end
|
52
|
+
# TODO: Handle targz, bz...
|
53
|
+
else
|
54
|
+
# Just copy
|
55
|
+
begin
|
56
|
+
FileUtils::mkdir_p(iLocation)
|
57
|
+
FileUtils::cp(iLocalFileName, "#{iLocation}/#{File.basename(iLocalFileName)}")
|
58
|
+
rescue Exception
|
59
|
+
rError = $!
|
60
|
+
end
|
61
|
+
end
|
62
|
+
ioInstallEnv[:InstallDir] = iLocation
|
63
|
+
end
|
64
|
+
|
65
|
+
return rError
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
{
|
7
|
+
:PluginsDependencies => [
|
8
|
+
# We depend on the Download dependency
|
9
|
+
[ 'Installers', 'Download' ]
|
10
|
+
]
|
11
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/Installer'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module Installers
|
11
|
+
|
12
|
+
class DownloadAndInstall < RDI::Installers::Download
|
13
|
+
|
14
|
+
# Install a dependency
|
15
|
+
#
|
16
|
+
# Parameters:
|
17
|
+
# * *iContent* (_Object_): The dependency's content
|
18
|
+
# * *iLocation* (_Object_): The installation location
|
19
|
+
# * *ioInstallEnv* (<em>map<Symbol,Object></em>): The installed environment, that can be modified here. Stored variables will the be accessible to ContextModifiers. [optional = {}]
|
20
|
+
# Return:
|
21
|
+
# * _Exception_: The error, or nil in case of success
|
22
|
+
def installDependency(iContent, iLocation, ioInstallEnv = {})
|
23
|
+
# * *iContent* (<em>[String,Proc]</em>): The URL and the code to install
|
24
|
+
# * *iLocation* (_String_): The directory to install to
|
25
|
+
rError = nil
|
26
|
+
|
27
|
+
iURL, iCmdProc = iContent
|
28
|
+
# First we download in a temp directory
|
29
|
+
lTmpDir = "#{@Installer.TempDir}/DlAndInst"
|
30
|
+
require 'fileutils'
|
31
|
+
FileUtils::mkdir_p(lTmpDir)
|
32
|
+
rError = super(iURL, lTmpDir)
|
33
|
+
if (rError == nil)
|
34
|
+
# And then we execute the command to install it
|
35
|
+
lOldDir = Dir.getwd
|
36
|
+
Dir.chdir(lTmpDir)
|
37
|
+
if (iCmdProc.call(iLocation))
|
38
|
+
# Remove temporary directory
|
39
|
+
FileUtils::rm_rf(lTmpDir)
|
40
|
+
ioInstallEnv[:InstallDir] = iLocation
|
41
|
+
else
|
42
|
+
rError = RuntimeError.new('Installation code failed')
|
43
|
+
end
|
44
|
+
Dir.chdir(lOldDir)
|
45
|
+
end
|
46
|
+
|
47
|
+
return rError
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Plugins/RubyGemsDepDesc'
|
7
|
+
|
8
|
+
{
|
9
|
+
:Dependencies => [
|
10
|
+
# RubyGems
|
11
|
+
::RDI::getRubyGemsDepDesc
|
12
|
+
]
|
13
|
+
}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/Installer'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module Installers
|
11
|
+
|
12
|
+
class Gem < RDI::Model::Installer
|
13
|
+
|
14
|
+
# Get the list of possible destinations
|
15
|
+
#
|
16
|
+
# Return:
|
17
|
+
# * <em>list<[Integer,Object]></em>: The list of possible destinations and their corresponding installation location (or location selector name for DEST_OTHER)
|
18
|
+
def getPossibleDestinations
|
19
|
+
return [
|
20
|
+
[ DEST_LOCAL, "#{@Installer.ExtDir}/LocalGems" ],
|
21
|
+
[ DEST_SYSTEM, ::Gem.dir ],
|
22
|
+
[ DEST_USER, ::Gem.user_dir ],
|
23
|
+
[ DEST_TEMP, @Installer.TempDir ],
|
24
|
+
[ DEST_OTHER, 'Directory' ]
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Install a dependency
|
29
|
+
#
|
30
|
+
# Parameters:
|
31
|
+
# * *iContent* (_Object_): The dependency's content
|
32
|
+
# * *iLocation* (_Object_): The installation location
|
33
|
+
# * *ioInstallEnv* (<em>map<Symbol,Object></em>): The installed environment, that can be modified here. Stored variables will the be accessible to ContextModifiers. [optional = {}]
|
34
|
+
# Return:
|
35
|
+
# * _Exception_: The error, or nil in case of success
|
36
|
+
def installDependency(iContent, iLocation, ioInstallEnv = {})
|
37
|
+
# * *iContent* (_String_): The gem install command
|
38
|
+
# * *iLocation* (_String_): The directory to install to
|
39
|
+
rError = nil
|
40
|
+
|
41
|
+
# Load RubyGems
|
42
|
+
require 'rubygems/command_manager'
|
43
|
+
# Install
|
44
|
+
begin
|
45
|
+
lSplitContent = iContent.split(' ') + [ '-i', iLocation, '--no-rdoc', '--no-ri', '--no-test' ]
|
46
|
+
::Gem::CommandManager.instance.find_command('install').invoke(*lSplitContent)
|
47
|
+
rescue ::Gem::SystemExitException
|
48
|
+
# For RubyGems, this is normal behaviour: success results in an exception thrown with exit_code 0.
|
49
|
+
if ($!.exit_code != 0)
|
50
|
+
rError = $!
|
51
|
+
else
|
52
|
+
# Refresh as otherwise, Gems installed in paths already part of Gem.path will still not be seen by Gem.find_files.
|
53
|
+
::Gem.refresh
|
54
|
+
ioInstallEnv[:InstallDir] = iLocation
|
55
|
+
end
|
56
|
+
rescue Exception
|
57
|
+
rError = $!
|
58
|
+
end
|
59
|
+
|
60
|
+
return rError
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/Installer'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module Installers
|
11
|
+
|
12
|
+
class Yum < RDI::Model::Installer
|
13
|
+
|
14
|
+
# Get the list of possible destinations
|
15
|
+
#
|
16
|
+
# Return:
|
17
|
+
# * <em>list<[Integer,Object]></em>: The list of possible destinations and their corresponding installation location (or location selector name for DEST_OTHER)
|
18
|
+
def getPossibleDestinations
|
19
|
+
return [
|
20
|
+
[ DEST_SYSTEM, '/' ]
|
21
|
+
]
|
22
|
+
end
|
23
|
+
|
24
|
+
# Install a dependency
|
25
|
+
#
|
26
|
+
# Parameters:
|
27
|
+
# * *iContent* (_Object_): The dependency's content
|
28
|
+
# * *iLocation* (_Object_): The installation location
|
29
|
+
# * *ioInstallEnv* (<em>map<Symbol,Object></em>): The installed environment, that can be modified here. Stored variables will the be accessible to ContextModifiers. [optional = {}]
|
30
|
+
# Return:
|
31
|
+
# * _Exception_: The error, or nil in case of success
|
32
|
+
def installDependency(iContent, iLocation, ioInstallEnv = {})
|
33
|
+
# * *iContent* (_String_): The yum install command
|
34
|
+
# * *iLocation* (_String_): The directory to install to
|
35
|
+
rError = nil
|
36
|
+
|
37
|
+
begin
|
38
|
+
if (!system("yum -y -q install #{iContent}"))
|
39
|
+
rError = RuntimeError.new("Execution of 'yum -y -q install #{iContent}' ended in error with code #{$?.exitstatus}.")
|
40
|
+
end
|
41
|
+
rescue Exception
|
42
|
+
rError = $!
|
43
|
+
end
|
44
|
+
|
45
|
+
return rError
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Plugins/WxRubyDepDesc'
|
7
|
+
|
8
|
+
{
|
9
|
+
:Dependencies => [
|
10
|
+
# WxRuby
|
11
|
+
::RDI::getWxRubyDepDesc
|
12
|
+
]
|
13
|
+
}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/ProgressView'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module ProgressViews
|
11
|
+
|
12
|
+
class SimpleWxGUI < RDI::Model::ProgressView
|
13
|
+
|
14
|
+
# Proxy class that will route calls made by RDI to the corresponding RUtilAnts::GUI::TextProgressDialog
|
15
|
+
class SimpleWxGUIProgressDialog < RUtilAnts::GUI::TextProgressDialog
|
16
|
+
|
17
|
+
# Set the title of the operation
|
18
|
+
#
|
19
|
+
# Parameters:
|
20
|
+
# * *iTitle* (_String_): Title of the operation
|
21
|
+
def setTitle(iTitle)
|
22
|
+
setText(iTitle)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set the range
|
26
|
+
#
|
27
|
+
# Parameters:
|
28
|
+
# * *iRange* (_Integer_): Range to set
|
29
|
+
def setRange(iRange)
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
# Increment the value
|
34
|
+
#
|
35
|
+
# Parameters:
|
36
|
+
# * *iIncrement* (_Integer_): The increment [optional = 1]
|
37
|
+
def incValue(iIncrement = 1)
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
# Setup the progress and call the client code to execute inside
|
44
|
+
#
|
45
|
+
# Parameters:
|
46
|
+
# * _CodeBlock_: The code to execute during this progression:
|
47
|
+
# ** *ioProgressView* (_Object_): The progress view that will receive notifications of progression (can be nil if no progression view available)
|
48
|
+
def setupProgress(&iCodeToExecute)
|
49
|
+
showModal(SimpleWxGUIProgressDialog, Wx.get_app.get_top_window, iCodeToExecute, '') do |iModalResult, iDialog|
|
50
|
+
# Nothing to do
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2009 Muriel Salvan (murielsalvan@users.sourceforge.net)
|
3
|
+
# Licensed under the terms specified in LICENSE file. No warranty is provided.
|
4
|
+
#++
|
5
|
+
|
6
|
+
require 'rdi/Model/ProgressView'
|
7
|
+
|
8
|
+
module RDI
|
9
|
+
|
10
|
+
module ProgressViews
|
11
|
+
|
12
|
+
class Text < RDI::Model::ProgressView
|
13
|
+
|
14
|
+
# Proxy class that will route calls made by RDI to stdout
|
15
|
+
class TextProgressDialog
|
16
|
+
|
17
|
+
# Constructor
|
18
|
+
def initialize
|
19
|
+
@Range = 0
|
20
|
+
@Value = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
# Set the title of the operation
|
24
|
+
#
|
25
|
+
# Parameters:
|
26
|
+
# * *iTitle* (_String_): Title of the operation
|
27
|
+
def setTitle(iTitle)
|
28
|
+
puts "==== #{iTitle} ... ===="
|
29
|
+
end
|
30
|
+
|
31
|
+
# Set the range
|
32
|
+
#
|
33
|
+
# Parameters:
|
34
|
+
# * *iRange* (_Integer_): Range to set
|
35
|
+
def setRange(iRange)
|
36
|
+
@Range = iRange
|
37
|
+
end
|
38
|
+
|
39
|
+
# Increment the value
|
40
|
+
#
|
41
|
+
# Parameters:
|
42
|
+
# * *iIncrement* (_Integer_): The increment [optional = 1]
|
43
|
+
def incValue(iIncrement = 1)
|
44
|
+
@Value += iIncrement
|
45
|
+
# Display the value
|
46
|
+
if (@Range == 0)
|
47
|
+
puts '...'
|
48
|
+
else
|
49
|
+
puts "#{(@Value*100)/@Range} %"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
# Setup the progress and call the client code to execute inside
|
56
|
+
#
|
57
|
+
# Parameters:
|
58
|
+
# * _CodeBlock_: The code to execute during this progression:
|
59
|
+
# ** *ioProgressView* (_Object_): The progress view that will receive notifications of progression (can be nil if no progression view available)
|
60
|
+
def setupProgress
|
61
|
+
yield(TextProgressDialog.new)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|