Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to use Windows zip dists when available #142

Merged
merged 4 commits into from
Nov 29, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,32 @@ class Setup_integTest
then:
result.wasExecuted( 'nodeSetup' )
}

def 'setup node (windows download)'()
{
System.setProperty( 'os.name', 'Windows' )

given:
writeBuild( '''
apply plugin: 'com.moowork.node'

node {
version = "4.5.0"
download = true
}
''' )

when:
def result = runTasksSuccessfully( 'nodeSetup' )

then:
result.wasExecuted( 'nodeSetup' )
}

def 'setup node (windows download separate exe)'()
{
System.setProperty( 'os.name', 'Windows' )

given:
writeBuild( '''
apply plugin: 'com.moowork.node'
Expand Down
46 changes: 37 additions & 9 deletions src/main/groovy/com/moowork/gradle/node/task/SetupTask.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class SetupTask

def set = new HashSet<>()
set.add( this.config.download )
set.add( this.variant.tarGzDependency )
set.add( this.variant.archiveDependency )
set.add( this.variant.exeDependency )
return set
}
Expand Down Expand Up @@ -65,12 +65,12 @@ class SetupTask
configureIfNeeded()
addRepository()

if ( this.variant.windows )
if ( this.variant.exeDependency )
{
copyNodeExe()
}

unpackNodeTarGz()
unpackNodeArchive()
setExecutableFlag()
restoreRepositories()
}
Expand All @@ -84,11 +84,39 @@ class SetupTask
}
}

private void unpackNodeTarGz()
private void unpackNodeArchive()
{
this.project.copy {
from this.project.tarTree( getNodeTarGzFile() )
into getNodeDir().parent
if ( getNodeArchiveFile().getName().endsWith('zip') )
{
this.project.copy {
from this.project.zipTree( getNodeArchiveFile() )
into getNodeDir().parent
}
}
else if ( this.variant.exeDependency )
{
//Remap lib/node_modules to node_modules (the same directory as node.exe) because that's how the zip dist does it
this.project.copy {
from this.project.tarTree( getNodeArchiveFile() )
into this.variant.nodeBinDir
eachFile {
def m = it.path =~ /^.*?[\\/]lib[\\/](node_modules.*$)/
if (m.matches()) {
// remap the file to the root
it.path = m.group(1)
} else {
it.exclude()
}
}
includeEmptyDirs = false
}
}
else
{
this.project.copy {
from this.project.tarTree( getNodeArchiveFile() )
into getNodeDir().parent
}
}
}

Expand All @@ -105,9 +133,9 @@ class SetupTask
return resloveSingle( this.variant.exeDependency )
}

protected File getNodeTarGzFile()
protected File getNodeArchiveFile()
{
return resloveSingle( this.variant.tarGzDependency )
return resloveSingle( this.variant.archiveDependency )
}

private File resloveSingle( String name )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class PlatformHelper
final String name = property( "os.name" ).toLowerCase()
if ( name.contains( "windows" ) )
{
return "windows"
return "win"
}

if ( name.contains( "mac" ) )
Expand Down Expand Up @@ -80,6 +80,6 @@ class PlatformHelper

public boolean isWindows()
{
return getOsName().equals( "windows" )
return getOsName().equals( "win" )
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class Variant

def String npmScriptFile

def String tarGzDependency
def String archiveDependency

def String exeDependency
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,30 +28,38 @@ class VariantBuilder
def variant = new Variant()
variant.windows = platformHelper.isWindows()
variant.nodeDir = getNodeDir( osName, osArch )
variant.nodeBinDir = new File( variant.nodeDir, 'bin' )

if ( variant.windows )
{
variant.tarGzDependency = getTarGzDependency( 'linux', 'x86' )
variant.exeDependency = getExeDependency()
variant.npmDir = getNpmDir( 'linux', 'x86' )
variant.nodeBinDir = variant.nodeDir
if (hasWindowsZip())
{
variant.archiveDependency = getArchiveDependency( osName, osArch, 'zip' )
}
else
{
variant.archiveDependency = getArchiveDependency( 'linux', 'x86', 'tar.gz' )
variant.exeDependency = getExeDependency()
}
variant.npmDir = new File( variant.nodeBinDir, 'node_modules' )
variant.nodeExec = new File( variant.nodeBinDir, 'node.exe' ).absolutePath
}
else
{
variant.tarGzDependency = getTarGzDependency( osName, osArch )
variant.npmDir = getNpmDir( osName, osArch )
variant.nodeBinDir = new File( variant.nodeDir, 'bin' )
variant.archiveDependency = getArchiveDependency( osName, osArch, 'tar.gz' )
variant.npmDir = new File( variant.nodeDir, 'lib/node_modules' )
variant.nodeExec = new File( variant.nodeBinDir, 'node' ).absolutePath
}

variant.npmScriptFile = new File( variant.npmDir, 'npm/bin/npm-cli.js' ).absolutePath
return variant
}

private String getTarGzDependency( final String osName, final String osArch )
private String getArchiveDependency( final String osName, final String osArch, final String type )
{
def version = this.ext.version
return "org.nodejs:node:${version}:${osName}-${osArch}@tar.gz"
return "org.nodejs:node:${version}:${osName}-${osArch}@${type}"
}

private String getExeDependency()
Expand Down Expand Up @@ -83,16 +91,29 @@ class VariantBuilder
}
}

private File getNodeDir( final String osName, final String osArch )
//https://github.com/nodejs/node/pull/5995
private boolean hasWindowsZip()
{
def version = this.ext.version
def dirName = "node-v${version}-${osName}-${osArch}"
return new File( this.ext.workDir, dirName )
def osArch = platformHelper.getOsArch()
def tokens = version.tokenize( '.' );
def majorVersion = tokens[0].toInteger()
def minorVersion = tokens[1].toInteger()
if (
( majorVersion == 4 && minorVersion >= 5 ) // >= 4.5.0
|| ( majorVersion == 6 && (minorVersion > 2 || (minorVersion == 2 && microVersion >= 1)) ) // >= 6.2.1
|| majorVersion > 6
)
{
return true
}
return false
}

private File getNpmDir( final String osName, final String osArch )
private File getNodeDir( final String osName, final String osArch )
{
def nodeDir = getNodeDir( osName, osArch )
return new File( nodeDir, 'lib/node_modules' )
def version = this.ext.version
def dirName = "node-v${version}-${osName}-${osArch}"
return new File( this.ext.workDir, dirName )
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ class PlatformHelperTest

where:
osProp | archProp | osName | osArch | isWindows
'Windows 8' | 'x86' | 'windows' | 'x86' | true
'Windows 8' | 'x86_64' | 'windows' | 'x64' | true
'Windows 8' | 'x86' | 'win' | 'x86' | true
'Windows 8' | 'x86_64' | 'win' | 'x64' | true
'Mac OS X' | 'x86' | 'darwin' | 'x86' | false
'Mac OS X' | 'x86_64' | 'darwin' | 'x64' | false
'Linux' | 'x86' | 'linux' | 'x86' | false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class VariantBuilderTest
}

@Unroll
def "test variant on windows (#osArch)"()
def "test variant on windows version <4 (#osArch)"()
{
given:
def project = ProjectBuilder.builder().build()
Expand All @@ -45,23 +45,22 @@ class VariantBuilderTest
variant != null
variant.windows
variant.exeDependency == exeDependency
variant.tarGzDependency == 'org.nodejs:node:0.11.1:linux-x86@tar.gz'
variant.archiveDependency == 'org.nodejs:node:0.11.1:linux-x86@tar.gz'

variant.nodeDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + 'bin')
variant.nodeExec.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "bin${PS}node.exe")
variant.npmDir.toString().endsWith(NODE_BASE_PATH + "node-v0.11.1-linux-x86${PS}lib${PS}node_modules")
variant.npmScriptFile.toString().endsWith(
NODE_BASE_PATH + "node-v0.11.1-linux-x86${PS}lib${PS}node_modules${PS}npm${PS}bin${PS}npm-cli.js")
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeExec.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node.exe")
variant.npmDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node_modules")
variant.npmScriptFile.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node_modules${PS}npm${PS}bin${PS}npm-cli.js")

where:
osArch | nodeDir | exeDependency
'x86' | 'node-v0.11.1-windows-x86' | 'org.nodejs:node:0.11.1@exe'
'x86_64' | 'node-v0.11.1-windows-x64' | 'org.nodejs:x64/node:0.11.1@exe'
'x86' | 'node-v0.11.1-win-x86' | 'org.nodejs:node:0.11.1@exe'
'x86_64' | 'node-v0.11.1-win-x64' | 'org.nodejs:x64/node:0.11.1@exe'
}

@Unroll
def "test variant on windows version 4.+ (#osArch)"()
def "test variant on windows version 4.+ with exe (#osArch)"()
{
given:
def project = ProjectBuilder.builder().build()
Expand All @@ -80,19 +79,51 @@ class VariantBuilderTest
variant != null
variant.windows
variant.exeDependency == exeDependency
variant.tarGzDependency == 'org.nodejs:node:4.0.0:linux-x86@tar.gz'
variant.archiveDependency == 'org.nodejs:node:4.0.0:linux-x86@tar.gz'

variant.nodeDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + 'bin')
variant.nodeExec.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "bin${PS}node.exe")
variant.npmDir.toString().endsWith(NODE_BASE_PATH + "node-v4.0.0-linux-x86${PS}lib${PS}node_modules")
variant.npmScriptFile.toString().endsWith(
NODE_BASE_PATH + "node-v4.0.0-linux-x86${PS}lib${PS}node_modules${PS}npm${PS}bin${PS}npm-cli.js")
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeExec.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node.exe")
variant.npmDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node_modules")
variant.npmScriptFile.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node_modules${PS}npm${PS}bin${PS}npm-cli.js")

where:
osArch | nodeDir | exeDependency
'x86' | 'node-v4.0.0-windows-x86' | 'org.nodejs:win-x86/node:4.0.0@exe'
'x86_64' | 'node-v4.0.0-windows-x64' | 'org.nodejs:win-x64/node:4.0.0@exe'
'x86' | 'node-v4.0.0-win-x86' | 'org.nodejs:win-x86/node:4.0.0@exe'
'x86_64' | 'node-v4.0.0-win-x64' | 'org.nodejs:win-x64/node:4.0.0@exe'
}

@Unroll
def "test variant on windows without exe (#osArch)"()
{
given:
def project = ProjectBuilder.builder().build()

this.props.setProperty("os.name", "Windows 8")
this.props.setProperty("os.arch", osArch)

def ext = new NodeExtension(project)
ext.version = '4.5.0'
ext.workDir = new File('.gradle/node').absoluteFile

def builder = new VariantBuilder(ext)
def variant = builder.build()

expect:
variant != null
variant.windows
variant.exeDependency == null
variant.archiveDependency == depName

variant.nodeDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeExec.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node.exe")
variant.npmDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node_modules")
variant.npmScriptFile.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + "node_modules${PS}npm${PS}bin${PS}npm-cli.js")
where:
osArch | nodeDir | depName
'x86' | 'node-v4.5.0-win-x86' | 'org.nodejs:node:4.5.0:win-x86@zip'
'x86_64' | 'node-v4.5.0-win-x64' | 'org.nodejs:node:4.5.0:win-x64@zip'
}

@Unroll
Expand All @@ -114,7 +145,7 @@ class VariantBuilderTest
variant != null
!variant.windows
variant.exeDependency == null
variant.tarGzDependency == depName
variant.archiveDependency == depName

variant.nodeDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + 'bin')
Expand Down Expand Up @@ -155,7 +186,7 @@ class VariantBuilderTest
variant != null
!variant.windows
variant.exeDependency == null
variant.tarGzDependency == depName
variant.archiveDependency == depName

variant.nodeDir.toString().endsWith(NODE_BASE_PATH + nodeDir)
variant.nodeBinDir.toString().endsWith(NODE_BASE_PATH + nodeDir + PS + 'bin')
Expand Down