Skip to content

Commit 4ba7f3b

Browse files
committed
Merge pull request #419 from NativeScript/fix-long-paths-build-on-windows
fixes #369 long paths on window
2 parents 2853fe1 + d6ce3e7 commit 4ba7f3b

File tree

1 file changed

+119
-32
lines changed

1 file changed

+119
-32
lines changed

build/project-template-gradle/build.gradle

Lines changed: 119 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def createPluginConfigFile = false
3838
def configStage = "\n:config phase: "
3939
def nodeModulesDir = "../../node_modules/"
4040
def libDir = "$projectDir/../../lib/Android/"
41-
def pluginNames = new ArrayList<String>()
41+
def flavorNames = new ArrayList<String>()
4242
def configDir = file(configurationsDir)
4343

4444
def dontRunSbg = project.hasProperty("dontRunSbg");
@@ -203,36 +203,119 @@ task pluginStructureCheck {
203203
}
204204
}
205205

206-
def createIncludeFile (filePath, fileName, dimensionName) {
207-
println "\t+creating include.gradle file for: " + filePath
206+
def createProductFlavorsContent(flavor, dimensionName, includeAndroidContent = true)
207+
{
208+
if (includeAndroidContent)
209+
{
210+
def content = """android {
211+
productFlavors {
212+
"${flavor}" {
213+
dimension "${dimensionName}"
214+
}
215+
}
216+
}"""
217+
return content;
218+
}
219+
else
220+
{
221+
def content = """productFlavors {
222+
"${flavor}" {
223+
dimension "${dimensionName}"
224+
}
225+
}"""
226+
return content;
227+
}
228+
}
229+
230+
231+
def createIncludeFile (filePath, flavor, dimensionName) {
232+
println "\t + creating include.gradle file for ${filePath}"
233+
208234
def defaultIncludeFile = new File(filePath, "include.gradle")
209-
defaultIncludeFile.write ""
210-
defaultIncludeFile << "android { \n"
211-
defaultIncludeFile << "\tproductFlavors {\n"
212-
defaultIncludeFile << '\t\t"' + fileName + '" {\n'
213-
defaultIncludeFile << '\t\t\tdimension "' + dimensionName + '"\n'
214-
defaultIncludeFile << "\t\t}\n"
215-
defaultIncludeFile << "\t}\n"
216-
defaultIncludeFile << "}"
235+
defaultIncludeFiletext.text = createProductFlavorsContent(flavor, dimensionName);
217236
}
218237

219238
def sanatizeDimensionName(str) {
220239
return str.replaceAll(/\W/, "")
221240
}
222241

242+
def replaceProductFlavorInContent(content, dimension, flavor)
243+
{
244+
def indexStart = content.indexOf("productFlavors");
245+
def index = indexStart + "productFlavors".length();
246+
def indexEnd = -1;
247+
def nestedOpenBraketsCount = 0;
248+
249+
while (index < content.length())
250+
{
251+
print content[index]
252+
if (content[index] == "}")
253+
{
254+
if (nestedOpenBraketsCount == 0)
255+
{
256+
indexEnd = index;
257+
break;
258+
}
259+
else
260+
{
261+
nestedOpenBraketsCount--;
262+
}
263+
}
264+
else if (content[index] == "{")
265+
{
266+
nestedOpenBraketsCount++;
267+
}
268+
269+
index++;
270+
}
271+
272+
if (indexEnd != -1)
273+
{
274+
def oldProductFlavorsText = content.substring(indexStart, indexEnd - 1);
275+
276+
def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, false);
277+
278+
return content.replace(oldProductFlavorsText, newProductFlavorsContent);
279+
}
280+
else
281+
{
282+
def androidContentExists = content.indexOf("android {") != -1;
283+
def newProductFlavorsContent = createProductFlavorsContent(flavor, dimension, !androidContentExists);
284+
285+
if (androidContentExists)
286+
{
287+
return content.replace("android {", "android { ${newProductFlavorsContent}");
288+
}
289+
else
290+
{
291+
return "${newProductFlavorsContent} \t ${content}"
292+
}
293+
}
294+
}
295+
223296
//make sure the include.gradle file, produced by the user, has only allowed characters in dimension attribute and remove any invalid characters if necessary
224-
def updateIncludeGradleFile(subFile, dimensionName) {
225-
def igFile = new File(subFile.getAbsolutePath())
226-
def newContent = igFile.text.replaceAll(/dimension\s+["'](.+?)["']/) { fullMatch, fDimension ->
227-
def newFg = sanatizeDimensionName(fDimension)
228-
dimensionName = newFg
229-
return "dimension \"$newFg\""
230-
}
231-
igFile.text = newContent
232-
233-
return dimensionName
297+
def updateIncludeGradleFile(targetFile, dimensionName, flavor)
298+
{
299+
def fileEntry = new File(targetFile.getAbsolutePath());
300+
def content = fileEntry.text;
301+
def replacedContent = replaceProductFlavorInContent(content, dimensionName, flavor);
302+
fileEntry.text = replacedContent;
234303
}
235304

305+
def renamePluginDirToFlavorName(directory, flavor)
306+
{
307+
def parentName = directory.getName();
308+
def parentFile = new File("src", parentName);
309+
if (parentFile.exists())
310+
{
311+
def targetDirName = new File("src", flavor);
312+
println "Renaming plugin directory to flavor name: ${parentFile.getAbsolutePath()} -> ${targetDirName.getAbsolutePath()}";
313+
parentFile.renameTo(targetDirName);
314+
}
315+
}
316+
317+
def flavorNumber = 0
318+
236319
task createDefaultIncludeFiles {
237320
description "creates default include.gradle files for added plugins IF NECESSARY"
238321
println "$configStage createDefaultIncludeFiles"
@@ -246,19 +329,23 @@ task createDefaultIncludeFiles {
246329
createPluginConfigFile = true
247330
def foundIncludeFile = false
248331

332+
def flavor = "F" + flavorNumber++
333+
249334
println "\t+found plugins: " + fileName
250335
fl.listFiles().each { subFile ->
251336

252337
if(subFile.name == "include.gradle") {
253338
foundIncludeFile = true
254-
dimensionName = updateIncludeGradleFile(subFile, dimensionName)
339+
updateIncludeGradleFile(subFile, dimensionName, flavor)
340+
renamePluginDirToFlavorName(subFile.getParentFile(), flavor);
255341
}
256342
}
257343

258-
pluginNames.add('"' + dimensionName + '"')
344+
flavorNames.add('"' + dimensionName + '"')
259345

260346
if(!foundIncludeFile) {
261-
createIncludeFile(fl.getAbsolutePath() ,fileName, dimensionName)
347+
createIncludeFile(fl.getAbsolutePath() , flavor, dimensionName)
348+
renamePluginDirToFlavorName(fl, flavor);
262349
}
263350
}
264351
}
@@ -271,15 +358,16 @@ task createPluginsConfigFile {
271358
println "$configStage createPluginsConfigFile"
272359

273360
def flavorsFile = new File("$configurationsDir/include.gradle")
274-
flavorsFile.write "" //clear config file
275-
361+
276362
if(createPluginConfigFile) {
277-
println "\t+creating product flavors include.gradle file in $configurationsDir folder..."
278-
def flavors = pluginNames.join(",")
363+
println "\t Creating product flavors include.gradle file in $configurationsDir folder..."
364+
def flavors = flavorNames.join(", ")
279365

280-
flavorsFile << "android { \n"
281-
flavorsFile << "\tflavorDimensions " + flavors + "\n"
282-
flavorsFile << "}\n"
366+
def content = """android {
367+
flavorDimensions ${flavors}
368+
}"""
369+
370+
flavorsFile.text = content
283371
}
284372
}
285373
}
@@ -527,4 +615,3 @@ task buildapk {
527615

528616
dependsOn deleteExplodedAarFolder
529617
}
530-

0 commit comments

Comments
 (0)