Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting file permissions dynamically in a gradle Copy task

I'm trying to get around a problem where a dependency in my build is a zip file that contains some read only files. When I extract that zip as part of my build I end out with read only files in a staging folder and they prevent the task running in the future since they cannot be overwritten.

Until there's a way to force overwrite in a gradle copy task I've been trying to find a way to change the file mode of the read-only files in a way that doesn't remove the execute bit from those files that need it.

I've come up with this:

task stageZip(type: Copy) {
  from({ zipTree(zipFile) })
  into stagingFolder

  eachFile {
    println "${it.name}, oldMode: ${Integer.toOctalString(it.mode)}, newMode: ${Integer.toOctalString(it.mode | 0200)}"
    fileMode it.mode | 0200
  }
}

But this doesn't work. If I comment out the fileMode line then the println correctly lists the old and new file modes with the write bit enabled for all files. If I leave the code as is, then all the files in the zip get extracted with the newMode of the first file.

This doesn't seem like this is an unreasonable thing to try and do, but I'm obviously doing something wrong. Any suggestions?

like image 478
Guy Gascoigne-Piggford Avatar asked Jan 24 '26 13:01

Guy Gascoigne-Piggford


1 Answers

Here is a method that answers the question about file permissions. The example is posted to GitHub here.

First, consider a method to add w to a file:

import java.nio.file.*
import java.nio.file.attribute.PosixFilePermission

def addWritePerm = { file ->
    println "TRACER adding 'w' to : " + file.absolutePath
    def path = Paths.get(file.absolutePath)
    def perms = Files.getPosixFilePermissions(path)
    perms << PosixFilePermission.OWNER_WRITE
    Files.setPosixFilePermissions(path, perms)
}

then, the Gradle task could be as follows:

project.ext.stagingFolder = 'staging'
project.ext.zipFile = 'data/data.zip'

task stageZip(type: Copy) {
    from({ zipTree(project.ext.zipFile) })
    into project.ext.stagingFolder

    doLast {
        new File(project.ext.stagingFolder).eachFileRecurse { def file ->
            if (! file.canWrite()) {
                addWritePerm(file)
            }
        }
    }
}
like image 148
Michael Easter Avatar answered Jan 27 '26 17:01

Michael Easter



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!