diff --git a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java index 6fd7057d..e8c3e758 100644 --- a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java +++ b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java @@ -60,7 +60,7 @@ public WPIExtension(Project project) { platforms = new NativePlatforms(); wpilibYear = factory.property(String.class); - wpilibYear.convention("2027_alpha5"); + wpilibYear.convention("2027_alpha7"); wpilibHome = factory.directoryProperty().fileProvider(project.provider(WPIExtension::computeHomeRoot)) .dir(wpilibYear); @@ -142,18 +142,35 @@ public Provider getWpilibHome() { } private static File computeHomeRoot() { - File homeRoot = null; - if (OperatingSystem.current().isWindows()) { - String publicFolder = System.getenv("PUBLIC"); - if (publicFolder == null) { - publicFolder = "C:\\Users\\Public"; + OperatingSystem currentOperatingSystem = OperatingSystem.current(); + return computeHomeRoot(currentOperatingSystem.isWindows(), currentOperatingSystem.isMacOsX(), + currentOperatingSystem.isLinux(), System.getProperty("user.home"), System.getenv("PUBLIC"), + System.getenv("XDG_DATA_HOME")); + } + + static File computeHomeRoot(boolean isWindows, boolean isMacOsX, boolean isLinux, String userFolder, + String publicFolder, String xdgDataHome) { + if (isWindows) { + String resolvedPublicFolder = publicFolder; + if (resolvedPublicFolder == null) { + resolvedPublicFolder = "C:\\Users\\Public"; } - homeRoot = new File(publicFolder, "wpilib"); - } else { - String userFolder = System.getProperty("user.home"); - homeRoot = new File(userFolder, "wpilib"); + return new File(resolvedPublicFolder, "wpilib"); + } + + if (isMacOsX) { + return new File(userFolder, ".wpilib"); } - return homeRoot; + + if (isLinux && xdgDataHome != null && !xdgDataHome.isBlank()) { + return new File(xdgDataHome, "wpilib"); + } + + if (isLinux) { + return new File(new File(userFolder, ".local/share"), "wpilib"); + } + + return new File(userFolder, ".wpilib"); } // public Map versions() { diff --git a/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy b/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy new file mode 100644 index 00000000..8988c1c0 --- /dev/null +++ b/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy @@ -0,0 +1,20 @@ +package org.wpilib.gradlerio.wpi + +import spock.lang.Specification + +class WPIExtensionHomeRootTest extends Specification { + def "WPILib home root uses platform specific locations"() { + expect: + WPIExtension.computeHomeRoot(isWindows, isMacOsX, isLinux, userHome, publicFolder, xdgDataHome) == expected + + where: + isWindows | isMacOsX | isLinux | userHome | publicFolder | xdgDataHome || expected + true | false | false | "/home/user" | "C:\\Users\\Team" | null || new File("C:\\Users\\Team", "wpilib") + true | false | false | "/home/user" | null | null || new File("C:\\Users\\Public", "wpilib") + false | true | false | "/Users/team" | null | null || new File("/Users/team", ".wpilib") + false | false | true | "/home/team" | null | "/data/team/share" || new File("/data/team/share", "wpilib") + false | false | true | "/home/team" | null | null || new File("/home/team/.local/share", "wpilib") + false | false | true | "/home/team" | null | "" || new File("/home/team/.local/share", "wpilib") + false | false | false | "/home/team" | null | "/data/team/share" || new File("/home/team", ".wpilib") + } +} diff --git a/testing/asm/settings.gradle b/testing/asm/settings.gradle index ce7076f6..b60651a9 100644 --- a/testing/asm/settings.gradle +++ b/testing/asm/settings.gradle @@ -4,7 +4,7 @@ pluginManagement { repositories { mavenLocal() gradlePluginPortal() - String wpilibYear = '2027_alpha5' + String wpilibYear = '2027_alpha7' File wpilibHome if (OperatingSystem.current().isWindows()) { String publicFolder = System.getenv('PUBLIC') @@ -13,9 +13,19 @@ pluginManagement { } def homeRoot = new File(publicFolder, "wpilib") wpilibHome = new File(homeRoot, wpilibYear) + } else if (OperatingSystem.current().isLinux()) { + String xdgDataHome = System.getenv('XDG_DATA_HOME') + if (xdgDataHome != null && !xdgDataHome.isBlank()) { + def homeRoot = new File(xdgDataHome, "wpilib") + wpilibHome = new File(homeRoot, wpilibYear) + } else { + def userFolder = System.getProperty("user.home") + def homeRoot = new File(new File(userFolder, ".local/share"), "wpilib") + wpilibHome = new File(homeRoot, wpilibYear) + } } else { def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, "wpilib") + def homeRoot = new File(userFolder, ".wpilib") wpilibHome = new File(homeRoot, wpilibYear) } def wpilibHomeMaven = new File(wpilibHome, 'maven') diff --git a/testing/cpp/settings.gradle b/testing/cpp/settings.gradle index ce7076f6..b60651a9 100644 --- a/testing/cpp/settings.gradle +++ b/testing/cpp/settings.gradle @@ -4,7 +4,7 @@ pluginManagement { repositories { mavenLocal() gradlePluginPortal() - String wpilibYear = '2027_alpha5' + String wpilibYear = '2027_alpha7' File wpilibHome if (OperatingSystem.current().isWindows()) { String publicFolder = System.getenv('PUBLIC') @@ -13,9 +13,19 @@ pluginManagement { } def homeRoot = new File(publicFolder, "wpilib") wpilibHome = new File(homeRoot, wpilibYear) + } else if (OperatingSystem.current().isLinux()) { + String xdgDataHome = System.getenv('XDG_DATA_HOME') + if (xdgDataHome != null && !xdgDataHome.isBlank()) { + def homeRoot = new File(xdgDataHome, "wpilib") + wpilibHome = new File(homeRoot, wpilibYear) + } else { + def userFolder = System.getProperty("user.home") + def homeRoot = new File(new File(userFolder, ".local/share"), "wpilib") + wpilibHome = new File(homeRoot, wpilibYear) + } } else { def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, "wpilib") + def homeRoot = new File(userFolder, ".wpilib") wpilibHome = new File(homeRoot, wpilibYear) } def wpilibHomeMaven = new File(wpilibHome, 'maven') diff --git a/testing/java/settings.gradle b/testing/java/settings.gradle index ce7076f6..b60651a9 100644 --- a/testing/java/settings.gradle +++ b/testing/java/settings.gradle @@ -4,7 +4,7 @@ pluginManagement { repositories { mavenLocal() gradlePluginPortal() - String wpilibYear = '2027_alpha5' + String wpilibYear = '2027_alpha7' File wpilibHome if (OperatingSystem.current().isWindows()) { String publicFolder = System.getenv('PUBLIC') @@ -13,9 +13,19 @@ pluginManagement { } def homeRoot = new File(publicFolder, "wpilib") wpilibHome = new File(homeRoot, wpilibYear) + } else if (OperatingSystem.current().isLinux()) { + String xdgDataHome = System.getenv('XDG_DATA_HOME') + if (xdgDataHome != null && !xdgDataHome.isBlank()) { + def homeRoot = new File(xdgDataHome, "wpilib") + wpilibHome = new File(homeRoot, wpilibYear) + } else { + def userFolder = System.getProperty("user.home") + def homeRoot = new File(new File(userFolder, ".local/share"), "wpilib") + wpilibHome = new File(homeRoot, wpilibYear) + } } else { def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, "wpilib") + def homeRoot = new File(userFolder, ".wpilib") wpilibHome = new File(homeRoot, wpilibYear) } def wpilibHomeMaven = new File(wpilibHome, 'maven')