From 33f8b94fcdf20f8118815b7e6dc59507558b8ccc Mon Sep 17 00:00:00 2001 From: Thad House Date: Sat, 13 Jun 2026 16:31:47 -0700 Subject: [PATCH 1/4] Change install directory to ~/.wpilib or XDG_DATA_HOME/.wpilib --- .../wpilib/gradlerio/wpi/WPIExtension.java | 33 +++++++++++++------ .../wpi/WPIExtensionHomeRootTest.groovy | 20 +++++++++++ testing/asm/settings.gradle | 12 ++++++- testing/cpp/settings.gradle | 12 ++++++- testing/java/settings.gradle | 12 ++++++- 5 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy diff --git a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java index 6fd7057d..3a603d04 100644 --- a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java +++ b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java @@ -142,18 +142,31 @@ 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"); + } + + if (isLinux && xdgDataHome != null && !xdgDataHome.isBlank()) { + return new File(xdgDataHome, ".wpilib"); } - return homeRoot; + + 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..6a1e4fa8 --- /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", ".wpilib") + false | false | true | "/home/team" | null | "" || new File("/home/team", ".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..ab393f89 100644 --- a/testing/asm/settings.gradle +++ b/testing/asm/settings.gradle @@ -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(userFolder, ".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..ab393f89 100644 --- a/testing/cpp/settings.gradle +++ b/testing/cpp/settings.gradle @@ -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(userFolder, ".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..ab393f89 100644 --- a/testing/java/settings.gradle +++ b/testing/java/settings.gradle @@ -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(userFolder, ".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') From 3d2b2e8b6cc2010159d178c879ed9ed39e29947e Mon Sep 17 00:00:00 2001 From: Thad House Date: Sat, 13 Jun 2026 16:36:24 -0700 Subject: [PATCH 2/4] Update year --- src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java | 2 +- testing/asm/settings.gradle | 2 +- testing/cpp/settings.gradle | 2 +- testing/java/settings.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java index 3a603d04..3b74c822 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); diff --git a/testing/asm/settings.gradle b/testing/asm/settings.gradle index ab393f89..f0fb00a8 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') diff --git a/testing/cpp/settings.gradle b/testing/cpp/settings.gradle index ab393f89..f0fb00a8 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') diff --git a/testing/java/settings.gradle b/testing/java/settings.gradle index ab393f89..f0fb00a8 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') From e9751c9f46e5db4f9e50f6670f4ecb715c05a887 Mon Sep 17 00:00:00 2001 From: Thad House Date: Sat, 13 Jun 2026 17:38:09 -0700 Subject: [PATCH 3/4] Fix --- src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java | 4 ++++ .../org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy | 4 ++-- testing/asm/settings.gradle | 2 +- testing/cpp/settings.gradle | 2 +- testing/java/settings.gradle | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java index 3b74c822..6b9576d4 100644 --- a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java +++ b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java @@ -166,6 +166,10 @@ static File computeHomeRoot(boolean isWindows, boolean isMacOsX, boolean isLinux return new File(xdgDataHome, ".wpilib"); } + if (isLinux) { + return new File(new File(userFolder, ".local/share"), ".wpilib"); + } + return new File(userFolder, ".wpilib"); } diff --git a/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy b/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy index 6a1e4fa8..31ab40f7 100644 --- a/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy +++ b/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy @@ -13,8 +13,8 @@ class WPIExtensionHomeRootTest extends Specification { 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", ".wpilib") - false | false | true | "/home/team" | null | "" || new File("/home/team", ".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 f0fb00a8..a49dbeaa 100644 --- a/testing/asm/settings.gradle +++ b/testing/asm/settings.gradle @@ -20,7 +20,7 @@ pluginManagement { wpilibHome = new File(homeRoot, wpilibYear) } else { def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, ".wpilib") + def homeRoot = new File(new File(userFolder, ".local/share"), ".wpilib") wpilibHome = new File(homeRoot, wpilibYear) } } else { diff --git a/testing/cpp/settings.gradle b/testing/cpp/settings.gradle index f0fb00a8..a49dbeaa 100644 --- a/testing/cpp/settings.gradle +++ b/testing/cpp/settings.gradle @@ -20,7 +20,7 @@ pluginManagement { wpilibHome = new File(homeRoot, wpilibYear) } else { def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, ".wpilib") + def homeRoot = new File(new File(userFolder, ".local/share"), ".wpilib") wpilibHome = new File(homeRoot, wpilibYear) } } else { diff --git a/testing/java/settings.gradle b/testing/java/settings.gradle index f0fb00a8..a49dbeaa 100644 --- a/testing/java/settings.gradle +++ b/testing/java/settings.gradle @@ -20,7 +20,7 @@ pluginManagement { wpilibHome = new File(homeRoot, wpilibYear) } else { def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, ".wpilib") + def homeRoot = new File(new File(userFolder, ".local/share"), ".wpilib") wpilibHome = new File(homeRoot, wpilibYear) } } else { From 47cff60b4e6de3a599c9179b5a60fde389ae8f5d Mon Sep 17 00:00:00 2001 From: Thad House Date: Sun, 14 Jun 2026 10:21:19 -0700 Subject: [PATCH 4/4] Update to wpilib --- src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java | 4 ++-- .../wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy | 6 +++--- testing/asm/settings.gradle | 4 ++-- testing/cpp/settings.gradle | 4 ++-- testing/java/settings.gradle | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java index 6b9576d4..e8c3e758 100644 --- a/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java +++ b/src/main/java/org/wpilib/gradlerio/wpi/WPIExtension.java @@ -163,11 +163,11 @@ static File computeHomeRoot(boolean isWindows, boolean isMacOsX, boolean isLinux } if (isLinux && xdgDataHome != null && !xdgDataHome.isBlank()) { - return new File(xdgDataHome, ".wpilib"); + return new File(xdgDataHome, "wpilib"); } if (isLinux) { - return new File(new File(userFolder, ".local/share"), ".wpilib"); + return new File(new File(userFolder, ".local/share"), "wpilib"); } return new File(userFolder, ".wpilib"); diff --git a/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy b/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy index 31ab40f7..8988c1c0 100644 --- a/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy +++ b/src/test/groovy/org/wpilib/gradlerio/wpi/WPIExtensionHomeRootTest.groovy @@ -12,9 +12,9 @@ class WPIExtensionHomeRootTest extends Specification { 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 | 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 a49dbeaa..b60651a9 100644 --- a/testing/asm/settings.gradle +++ b/testing/asm/settings.gradle @@ -16,11 +16,11 @@ pluginManagement { } else if (OperatingSystem.current().isLinux()) { String xdgDataHome = System.getenv('XDG_DATA_HOME') if (xdgDataHome != null && !xdgDataHome.isBlank()) { - def homeRoot = new File(xdgDataHome, ".wpilib") + 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") + def homeRoot = new File(new File(userFolder, ".local/share"), "wpilib") wpilibHome = new File(homeRoot, wpilibYear) } } else { diff --git a/testing/cpp/settings.gradle b/testing/cpp/settings.gradle index a49dbeaa..b60651a9 100644 --- a/testing/cpp/settings.gradle +++ b/testing/cpp/settings.gradle @@ -16,11 +16,11 @@ pluginManagement { } else if (OperatingSystem.current().isLinux()) { String xdgDataHome = System.getenv('XDG_DATA_HOME') if (xdgDataHome != null && !xdgDataHome.isBlank()) { - def homeRoot = new File(xdgDataHome, ".wpilib") + 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") + def homeRoot = new File(new File(userFolder, ".local/share"), "wpilib") wpilibHome = new File(homeRoot, wpilibYear) } } else { diff --git a/testing/java/settings.gradle b/testing/java/settings.gradle index a49dbeaa..b60651a9 100644 --- a/testing/java/settings.gradle +++ b/testing/java/settings.gradle @@ -16,11 +16,11 @@ pluginManagement { } else if (OperatingSystem.current().isLinux()) { String xdgDataHome = System.getenv('XDG_DATA_HOME') if (xdgDataHome != null && !xdgDataHome.isBlank()) { - def homeRoot = new File(xdgDataHome, ".wpilib") + 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") + def homeRoot = new File(new File(userFolder, ".local/share"), "wpilib") wpilibHome = new File(homeRoot, wpilibYear) } } else {