Skip to content

Commit d7e4a99

Browse files
committed
Fixed #37 - Performance improvement in extracting GEMs
1 parent 1f1e833 commit d7e4a99

File tree

5 files changed

+68
-76
lines changed

5 files changed

+68
-76
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ dependencies {
4545
repositories {
4646
jcenter()
4747
mavenLocal()
48+
maven { url 'http://rubygems-proxy.torquebox.org/releases' }
4849
}
4950

5051
dependencies {
@@ -77,7 +78,7 @@ test {
7778
}
7879

7980
integrationTest {
80-
systemProperties TESTROOT : new File(buildDir,'tmp/test/integration-tests').absolutePath
81+
systemProperties TESTROOT : new File(buildDir,'tmp/integrationTest/root').absolutePath
8182
systemProperties TEST_SCRIPT_DIR : new File(projectDir,'src/integTest/resources/scripts').absolutePath
8283
systemProperties 'logback.configurationFile' : new File(projectDir,'src/integTest/resources/logback-test.xml').absolutePath
8384

src/integTest/groovy/com/lookout/jruby/JRubyPrepareGemsIntegrationSpec.groovy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import org.gradle.api.file.FileCollection
44
import org.gradle.testfixtures.ProjectBuilder
55
import spock.lang.Ignore
66
import spock.lang.IgnoreIf
7+
import spock.lang.IgnoreRest
78
import spock.lang.Specification
89

910
import static org.gradle.api.logging.LogLevel.LIFECYCLE
@@ -14,7 +15,7 @@ import static org.gradle.api.logging.LogLevel.LIFECYCLE
1415
class JRubyPrepareGemsIntegrationSpec extends Specification {
1516

1617
static final boolean TESTS_ARE_OFFLINE = System.getProperty('TESTS_ARE_OFFLINE') != null
17-
static final File TESTROOT = new File( "${System.getProperty('TESTROOT') ?: 'build/tmp/test/integration-tests'}/jpgis")
18+
static final File TESTROOT = new File( "${System.getProperty('TESTROOT') ?: 'build/tmp/integrationTest'}/jpgis")
1819
static final String TASK_NAME = 'RubyWax'
1920
static final String OUR_GEM = 'rubygems:slim:2.0.2'
2021

src/main/groovy/com/lookout/jruby/GemUtils.groovy

Lines changed: 53 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -25,47 +25,6 @@ class GemUtils {
2525
}
2626
}
2727

28-
/** Extract a gem to the default {@code gemInstallDir} dreictory using the default jruby version
29-
*
30-
* @param project Current project
31-
* @param gem GEM to extract
32-
*/
33-
static void extractGem(Project project, File gem) {
34-
extractGem(project,gem,new File(project.jruby.gemInstallDir),GemUtils.OverwriteAction.SKIP)
35-
}
36-
37-
/** Extracts a gem to a folder using the default JRuby version
38-
*
39-
* @param project Project instance
40-
* @param gem Gem file to extract
41-
* @param destDir Directory to extract to
42-
* @param overwrite Allow overwrite of an existing gem folder
43-
*/
44-
static void extractGem(Project project,
45-
File gem,
46-
File destDir,
47-
GemUtils.OverwriteAction overwrite) {
48-
extractGem(project,project.configurations.jrubyExec,gem,destDir,overwrite)
49-
}
50-
51-
/** Extracts a gem to a folder
52-
*
53-
* @param project Project instance
54-
* @param jRubyConfig Where to find the jruby-complete jar (FileCollection, File or Configuration)
55-
* @param gem Gem file to extract
56-
* @param destDir Directory to extract to
57-
* @param overwrite Allow overwrite of an existing gem folder
58-
*/
59-
static void extractGem(Project project,
60-
Configuration jRubyConfig,
61-
File gem,
62-
File destDir,
63-
GemUtils.OverwriteAction overwrite) {
64-
Set<File> cp = jRubyConfig.files
65-
File jRubyClasspath = cp.find { it.name.startsWith('jruby-complete-') }
66-
extractGem(project,jRubyClasspath,gem,destDir,overwrite)
67-
}
68-
6928
/** Extracts a gem to a folder
7029
*
7130
* @param project Project instance
@@ -79,45 +38,76 @@ class GemUtils {
7938
File gem,
8039
File destDir,
8140
GemUtils.OverwriteAction overwrite) {
82-
String gemName = gemFullNameFromFile(gem.name)
83-
File extractDir = new File(destDir, gemName)
8441

85-
if (extractDir.exists()) {
42+
extractGems(project,jRubyClasspath,project.files(gem),destDir,overwrite)
43+
}
44+
45+
static void extractGems(Project project,
46+
File jRubyClasspath,
47+
FileCollection gems,
48+
File destDir,
49+
GemUtils.OverwriteAction overwrite) {
50+
Set<File> gemsToProcess = []
51+
Set<File> deletes = []
52+
getGems(gems).files.each { File gem ->
53+
String gemName = gemFullNameFromFile(gem.name)
54+
File extractDir = new File(destDir, gemName)
55+
8656
switch (overwrite) {
8757
case GemUtils.OverwriteAction.SKIP:
88-
return
58+
if(extractDir.exists()) {
59+
return
60+
}
8961
case GemUtils.OverwriteAction.OVERWRITE:
90-
project.delete extractDir
62+
deletes.add(extractDir)
9163
break
9264
case GemUtils.OverwriteAction.FAIL:
93-
throw new DuplicateFileCopyingException("Gem ${gem.name} already exists")
65+
if(extractDir.exists()) {
66+
throw new DuplicateFileCopyingException("Gem ${gem.name} already exists")
67+
}
9468
}
69+
70+
gemsToProcess.add(gem)
9571
}
9672

97-
destDir.mkdirs()
73+
if(gemsToProcess.size()) {
74+
75+
deletes.each { project.delete it }
76+
destDir.mkdirs()
77+
78+
project.logger.info "Installing " + (gemsToProcess.collect { File it -> it.name }).join(',')
9879

99-
project.javaexec {
100-
setEnvironment [:]
101-
main 'org.jruby.Main'
102-
classpath jRubyClasspath
103-
args '-S', 'gem', 'install', gem, '--ignore-dependencies', "--install-dir=${destDir.absolutePath}", '-N'
80+
project.javaexec {
81+
setEnvironment [:]
82+
main 'org.jruby.Main'
83+
classpath jRubyClasspath
84+
args '-S', 'gem', 'install'
85+
gemsToProcess.each { File gem ->
86+
args gem
87+
}
88+
args '--ignore-dependencies', "--install-dir=${destDir.absolutePath}", '-N'
89+
}
10490
}
10591
}
10692

10793
/** Extract Gems from a given configuration.
10894
*
109-
* @param project Current project
110-
* @param jRubyClasspath
111-
* @param gemConfig
112-
* @param destDir
113-
* @param action
95+
* @param project Project instance
96+
* @param jRubyClasspath Where to find the jruby-complete jar
97+
* @param gemConfig Configuration containing GEMs
98+
* @param destDir Directory to extract to
99+
* @param action Allow overwrite of an existing gem folder
114100
*/
115-
static void extractGems(Project project,Configuration jRubyClasspath, Configuration gemConfig,File destDir,GemUtils.OverwriteAction action ) {
116-
getGems(project.files(gemConfig.files)).each { File f ->
117-
GemUtils.extractGem(project,jRubyClasspath,f,destDir,action)
118-
}
119-
101+
static void extractGems(
102+
Project project,
103+
Configuration jRubyConfig,
104+
Configuration gemConfig,
105+
File destDir,
106+
GemUtils.OverwriteAction action ) {
120107

108+
Set<File> cp = jRubyConfig.files
109+
File jRubyClasspath = cp.find { it.name.startsWith('jruby-complete-') }
110+
extractGems(project,jRubyClasspath,project.files(gemConfig.files),destDir,action)
121111
}
122112

123113
/** Take the given .gem filename (e.g. rake-10.3.2.gem) and just return the

src/main/groovy/com/lookout/jruby/JRubyExec.groovy

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,13 @@ class JRubyExec extends JavaExec {
138138
environment 'GEM_HOME' : gemDir
139139

140140
if(configuration != null) {
141-
project.configurations.getByName(jrubyConfigurationName)
142-
project.with {
143-
configurations.getByName(configuration).files.findAll { File f ->
144-
f.name.endsWith('.gem')
145-
}.each { File f ->
146-
GemUtils.extractGem(project,jrubyCompletePath,f,gemDir,GemUtils.OverwriteAction.OVERWRITE)
147-
}
148-
}
141+
GemUtils.extractGems(
142+
project,
143+
jrubyCompletePath,
144+
project.configurations.getByName(configuration),
145+
gemDir,
146+
GemUtils.OverwriteAction.OVERWRITE
147+
)
149148
}
150149

151150
super.classpath JRubyExecUtils.classpathFromConfiguration(project.configurations.getByName(jrubyConfigurationName))

src/main/groovy/com/lookout/jruby/JRubyPrepareGems.groovy

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ class JRubyPrepareGems extends DefaultTask {
4747
@TaskAction
4848
void copy() {
4949
File jrubyJar = JRubyExecUtils.jrubyJar(project.configurations.getByName(JRubyExec.JRUBYEXEC_CONFIG))
50-
getGems().each { File f ->
51-
GemUtils.extractGem(project,jrubyJar,f,outputDir,GemUtils.OverwriteAction.SKIP)
52-
}
50+
// getGems().each { File f ->
51+
// GemUtils.extractGem(project,jrubyJar,f,outputDir,GemUtils.OverwriteAction.SKIP)
52+
// }
53+
GemUtils.extractGems(project,jrubyJar,getGems(),outputDir,GemUtils.OverwriteAction.SKIP)
5354
}
5455

5556
private List<Object> gems

0 commit comments

Comments
 (0)