Hans Dockter wrote:
One of the things I would like to start soon with, is to improve our file operations support (Delete, Move, archive handling)

I think Steve's copy stuff is leading the way.

+1

For each operation we want to have a task as well as a project method as well as a spec. So we will have a move/delete/copy/zip/jar/tar task/spec/method. Specially for the archive tasks this provides the nice feature that specs can be reused for multiple archive operations. For example in the Gradle build the different distributions would share a common spec (and then have additionally specific specs). The archive specs should extend from the copy specs so that copy operations and archive operations can share specs.

I think most (or all?) of the stuff on ZipFileSet and TarFileSet could live on CopySpec and be supported by both the copy action and archive actions. For example, prefix (which is almost there in the into property), filemode, dirmode, etc.

I would change the 'into' property to be a String path relative to the destination directory/archive root, and allow into() to optionally take a configure closure:

zip {
   into 'META-INF' {
       from 'src/metaInf'
       from '../shared/src/metaInfo' { include '**/staging/**' }
   }
}

And maybe (as, I think, Tom suggested a while back) support a builder style:

zip {
   bin(filemode: '755') {
       from 'src/toplevel/scripts'
   }
   libs {
       from configurations.distLibs
   }
}

Another thing that would be good to have are archives as input(from) values for copy/archives operations. That way we can use the copy task to unzip/tar/jar. For archives this would provide the current merge functionality.


One question is how we distinguish between the case where you want to copy the archive and the case where you want to copy the contents of the archive.

One option is to have a method which takes an archive file and returns a FileTree containing its contents:

copy {
   from 'some.zip' // copies the file
   from contentsOf('some.zip') // copies the contents of the file
}

This allows the expanding stuff to be reused elsewhere:

contentsOf('some.zip').matching { include 'org/gradle/**' }.visit { println it.relativePath }


There's a few other things which might be useful for our file/archive handling:

- Copy and archive actions preserve file permissions (as best they can)

- Allow an Ant pattern to be specified anywhere that accepts multiple files as a shorthand:

files('lib/*.zip')
compileJava.source('src/*/java')
copy(from: 'src/*', into: ...)


Adam


---------------------------------------------------------------------
To unsubscribe from this list, please visit:

   http://xircles.codehaus.org/manage_email


Reply via email to