Our baseline is Java 1.5, so use of Path is out.

On Wed, Feb 26, 2014 at 5:17 AM, Joachim Nilsson <jocce.nils...@gmail.com>
wrote:

> Thanks Adam.
> A follow up question:
> CONTRIBUTION.md states 'Avoid using features introduced in Java 1.6 or
> later'.
> Is this a hard requirement or could I use java.nio.Path from java7?
> That would really simplify the use of relative paths, which I will need if
> I use cache dir as base.
> I have one concern, that is if output or input resides in directories
> outside of the root project.
> In that case, forcing the use of relative paths may destroy portability as
> well, if the destination directory is not on 'same path depth' as the
> origin.
> With my first simple approach to use rootDir as detector of when a path
> could be rewritten, paths and files outside the project would remain
> absolute when serialized.
> This may be a minor concern and can probably be handled by documentation.
> Just something to think about.
> Regards,
> Joachim
> On Wed, Feb 26, 2014 at 4:46 AM, Adam Murdoch
> <adam.murd...@gradleware.com>wrote:
>>
>> On 21 Feb 2014, at 6:02 pm, Joachim Nilsson <jocce.nils...@gmail.com>
>> wrote:
>>
>> Hi, I ran into a tricky part of the code that I would like some hints with.
>> Background: I am investigating how to make it possible to make incremental
>> builds after a rename or move of the rootDir (normal for incremental builds
>> in CI servers running many executors on different slaves).
>>
>> The first part was  fairly easy to solve, in a not so pretty way, but with
>> minimal changes.
>> Now I can read the task history even after a move of directories.
>>
>> My solution for the first part was to use the incoming task in
>> CacheBackedTaskHistoryRepository to get the project root dir and then strip
>> that part from the path in the binary file just before serializing.
>> Changing the internal representation to non absolute will have way too big
>> impact for me to grasp so I figured small change (a new boolan before the
>> path) in the binary format was better.
>>
>>             public void write(Encoder encoder, LazyTaskExecution
>> execution) throws Exception {
>>                 ...
>>                 encoder.writeInt(execution.getOutputFiles().size());
>>                 for (String outputFile : execution.getOutputFiles()) {
>>                     if (canBeConvertedFromAbsolutePath(outputFile)){
>>                         encoder.writeBoolean(true);
>>
>> encoder.writeString(convertFromAbsolutePath(outputFile));
>>                     }else{
>>                         encoder.writeBoolean(false);
>>                         encoder.writeString(outputFile);
>>                     }
>>                 }
>>                 ...
>>             }
>>
>> However, it was not done yet. Now I face that the
>> CacheBackedFileSnapshotRepository is also involved in setting the
>> UP-TO-DATE flag to false since it compares output files directly between
>> runs. And this time the whole FileCollectionSnapshot is stored so my
>> minimal change attempt will fail.
>>
>> Any suggestions for solving the CacheBackedFileSnapshotRepository?
>> Here, the whole object is serialized and in the serializer, there is no
>> access to Task, Project or Gradle. Replacing the object with relative file
>> references would probably fail the serialization since it uses File.exists
>> for each file.
>>
>>
>> I would use the cache base directory as the base directory, in both
>> CacheBackedFileSnapshotRepository and CacheBackedFileSnapshotRepository. It
>> can be queried from TaskArtifactStateCacheAccess, but you'll have to add a
>> getter on it to expose the cache base dir.
>>
>>
>> --
>> Adam Murdoch
>> Gradle Co-founder
>> http://www.gradle.org
>> VP of Engineering, Gradleware Inc. - Gradle Training, Support, Consulting
>> http://www.gradleware.com
>>
>>
>>
>>

Reply via email to