How can I make Gradle ignore dangling symlinks?

My build directory has a number of symlinks in it. Depending on the state of affairs, some of them might be dangling symlinks when I start a build. This causes problems with Gradle: in particular, I’m using Project.fileTree() to search for all files matching a pattern, and it always crashes when it hits a dangling symlink.

Sample output:

“”" FAILURE: Build failed with an exception.

  • Where: Build file ‘/home/gward/sandbox/build.gradle’ line: 56

  • What went wrong: A problem occurred evaluating root project ‘sandbox’. Cause: Could not list contents of ‘/home/gward/sandbox/path/to/dangling/symlink’. “”"

It would be much better if Gradle simply ignored those dangling symlinks. Is there a way to do that?

1 Like

Oops, forgot to mention:

------------------------------------------------------------ Gradle 1.0-milestone-3 ------------------------------------------------------------

Gradle build time: Monday, 25 April 2011 5:40:11 PM EST Groovy: 1.7.10 Ant: Apache Ant™ version 1.8.2 compiled on December 20 2010 Ivy: 2.2.0 JVM: 1.6.0_22 (Sun Microsystems Inc. 17.1-b03) OS: Linux 2.6.35.14-97.fc14.x86_64 i386

When I run with --stacktrace, here’s what I get:

“”" * Exception is: org.gradle.api.GradleScriptException: A problem occurred evaluating root project ‘sandbox’.

at org.gradle.groovy.scripts.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:51)

at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:127)

at org.gradle.configuration.BuildScriptProcessor.evaluate(BuildScriptProcessor.java:38)

at org.gradle.configuration.DefaultProjectEvaluator.evaluate(DefaultProjectEvaluator.java:38)

at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:487)

at org.gradle.api.internal.project.AbstractProject.evaluate(AbstractProject.java:71)

at org.gradle.configuration.ProjectEvaluationConfigurer.execute(ProjectEvaluationConfigurer.java:23)

at org.gradle.configuration.ProjectEvaluationConfigurer.execute(ProjectEvaluationConfigurer.java:21)

at org.gradle.configuration.DefaultBuildConfigurer$1.execute(DefaultBuildConfigurer.java:38)

at org.gradle.configuration.DefaultBuildConfigurer$1.execute(DefaultBuildConfigurer.java:35)

at org.gradle.api.internal.project.AbstractProject.configure(AbstractProject.java:463)

at org.gradle.api.internal.project.AbstractProject.allprojects(AbstractProject.java:458)

at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:35)

at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)

at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:112)

at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:80)

at org.gradle.launcher.RunBuildAction.execute(RunBuildAction.java:41)

at org.gradle.launcher.RunBuildAction.execute(RunBuildAction.java:27)

at org.gradle.launcher.ExceptionReportingAction.execute(ExceptionReportingAction.java:32)

at org.gradle.launcher.ExceptionReportingAction.execute(ExceptionReportingAction.java:21)

at org.gradle.launcher.CommandLineActionFactory$WithLoggingAction.execute(CommandLineActionFactory.java:219)

at org.gradle.launcher.CommandLineActionFactory$WithLoggingAction.execute(CommandLineActionFactory.java:203)

at org.gradle.launcher.Main.execute(Main.java:55)

at org.gradle.launcher.Main.main(Main.java:40)

at org.gradle.launcher.ProcessBootstrap.runNoExit(ProcessBootstrap.java:46)

at org.gradle.launcher.ProcessBootstrap.run(ProcessBootstrap.java:28)

at org.gradle.launcher.GradleMain.main(GradleMain.java:24) Caused by: org.gradle.api.GradleException: Could not list contents of ‘/home/gward/sandbox/path/to/dangling/symlink’.

at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:141)

at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:166)

at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:166)

at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:166)

at org.gradle.api.internal.file.collections.DirectoryFileTree.visit(DirectoryFileTree.java:119)

at org.gradle.api.internal.file.collections.FileTreeAdapter.visit(FileTreeAdapter.java:96)

at org.gradle.api.internal.file.AbstractFileTree.getFiles(AbstractFileTree.java:37)

at org.gradle.api.internal.file.CompositeFileCollection.getFiles(CompositeFileCollection.java:39)

at org.gradle.api.file.FileCollection$getFiles.call(Unknown Source)

at build_nv4ukofdmoqstrhksj0eigimu$_run_closure5.doCall(/home/gward/repos/sandbox/build.gradle:51)

at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:61)

at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:31)

at org.gradle.api.internal.AbstractTask.configure(AbstractTask.java:398)

at org.gradle.api.internal.project.AbstractProject.task(AbstractProject.java:929)

at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:158)

at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:93)

at org.gradle.api.internal.project.DefaultProject_Decorated.invokeMethod(Unknown Source)

at org.gradle.groovy.scripts.BasicScript.methodMissing(BasicScript.groovy:68)

at build_nv4ukofdmoqstrhksj0eigimu.run(/home/gward/repos/sandbox/build.gradle:47)

at org.gradle.groovy.scripts.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:49)

… 26 more

“”"

I agree that it would be better to ignore such files than to throw an exception. Please file an issue at http://issues.gradle.org.

Done: see GRADLE-1843.

Is there a plan to fix GRADLE-1843 ?

No plan at this time. That doesn’t mean we don’t want to fix it. Just that it isn’t scheduled.

Any chance someone has an idea for a workaround? I tried using any and turning follow symlinks to false but that doesn’t work either

ant.delete() {
                    verbose = true
                    removeNotFollowedSymlinks = false
                    ant.fileset(dir: localWorkingCopy.absolutePath, includes: "**" ) {
                        followsymlinks
= false
                    }
                }

Was anyone able to get a workaround for this. I am seeing this behaviour with folders that have dangling symbolic links that are decorated with the @OutputDirectory

You could remove the dangling symlinks using an exec task first http://www.commandlinefu.com/commands/view/2369/find-broken-symlinks-and-delete-them

task removeDanglingSymlinks(type:Exec) {
   commandLine 'find', '-L', file("${buildDir}").absolutePath, '-type', 'l', '-delete'
}
  if (!System.properties['os.name'].toLowerCase().contains('windows')) {
   someOtherTask.dependsOn removeDanglingSymlinks
}