Ok, thanks, I'll take a look at it.

Anders

On Fri, Feb 26, 2010 at 6:58 PM, Alex Boisvert <alex.boisv...@gmail.com> wrote:
> Looking into it again this morning, I finally found the mysterious cause of
> the different behavior I was getting earlier.  Turns out that Rake's file()
> method returns a FileTask with a relative path whereas Buildr's file()
> method returns a FileTask with an absolute path.   So you get different
> result if you call file() inside or outside of a project and pass this as
> argument to artifact().from().
>
> I've also fixed the issue about the artifact being re-downloaded every time
> even if it exists.
>
> For now, I've attached the patch to
> http://issues.apache.org/jira/browse/BUILDR-383.   I didn't commit it yet
> since I can't run the specs successfully on my laptop since my upgrade to
> rubygems 1.3.6.   I'll commit once I've tested it on a different system.
>
> Could you give it a try to make sure it addresses your issue?
>
> thanks,
> alex
>
>
> On Fri, Feb 26, 2010 at 3:24 AM, Anders Janmyr 
> <anders.jan...@jayway.com>wrote:
>
>> Hi,
>>
>> I have made changes to allow you to write code like this
>>
>>  google_zip = download "target/google-collect-1.0.zip" =>
>>          '
>> http://google-collections.googlecode.com/files/google-collect-1.0.zip'
>>  google_jar = file("target/zip/google-collect-1.0/google-collect-1.0.jar"
>> =>
>>          unzip('target/zip'=>google_zip))
>>  google_artifact =
>> artifact('google:google-collect:jar:1.0').from(google_jar)
>>
>>  define 'core' do
>>    compile.with 'commons-lang:commons-lang:jar:2.4', google_artifact
>>    package :jar
>>  end
>>
>> instead of code like this.
>>
>> google_artifact = artifact('google:google-collect:jar:1.0').tap do |a|
>>    unless a.exist?
>>      google_zip = download "target/google-collect-1.0.zip" =>
>>              '
>> http://google-collections.googlecode.com/files/google-collect-1.0.zip'
>>      google_jar =
>> file("target/zip/google-collect-1.0/google-collect-1.0.jar" =>
>>              unzip('target/zip'=>google_zip))
>>      a.from(google_jar)
>>   end
>>  end
>>
>>
>> I cannot however get the tests to work the way I want.
>>
>>
>> The patch is below, I'll attach it to an issue, if you are interested
>> in it. The failing tests are also in the patch.
>>
>> Anders
>>
>> From 5b0247315fceadb544af92812c269a0fa417c5b3 Mon Sep 17 00:00:00 2001
>> From: Anders Janmyr <anders.jan...@jayway.com>
>> Date: Fri, 26 Feb 2010 12:12:48 +0100
>> Subject: [PATCH] artifact.from should only be invoked when needed.
>>
>> * It is only needed if the file it is dependent on is newer
>> or if the artifact does not exist at all.
>> * If the artifact exists, but the dependent file does not,
>> skip the dependency.
>> ---
>>  lib/buildr/packaging/artifact.rb |   26 ++++++++++++++++----------
>>  spec/packaging/artifact_spec.rb  |   17 +++++++++++++++++
>>  2 files changed, 33 insertions(+), 10 deletions(-)
>>
>> diff --git a/lib/buildr/packaging/artifact.rb
>> b/lib/buildr/packaging/artifact.rb
>> index e3ee045..6d3df6d 100644
>> --- a/lib/buildr/packaging/artifact.rb
>> +++ b/lib/buildr/packaging/artifact.rb
>> @@ -315,6 +315,10 @@ module Buildr
>>       end
>>     end
>>
>> +    def up_to_date_compared_to?(path)
>> +      File.exists?(path) ? test(?<, path, name) : File.exist?(name)
>> +    end
>> +
>>     # :call-seq:
>>     #   from(path) => self
>>     #
>> @@ -324,16 +328,18 @@ module Buildr
>>     # See also Buildr#install and Buildr#upload.
>>     def from(path)
>>       path = File.expand_path(path.to_s)
>> -      enhance [path] do
>> -        mkpath File.dirname(name)
>> -        pom.invoke unless type == :pom
>> -        cp path, name
>> -        info "Installed #{path} as #{to_spec}"
>> -      end
>> -      unless type == :pom
>> -        pom.enhance do
>> -          mkpath File.dirname(pom.name)
>> -          File.open(pom.name, 'w') { |file| file.write pom.pom_xml }
>> +      unless up_to_date_compared_to?(path)
>> +        enhance [path] do
>> +          mkpath File.dirname(name)
>> +          pom.invoke unless type == :pom
>> +          cp path, name
>> +          info "Installed #{path} as #{to_spec}"
>> +        end
>> +        unless type == :pom
>> +          pom.enhance do
>> +            mkpath File.dirname(pom.name)
>> +            File.open(pom.name, 'w') { |file| file.write pom.pom_xml }
>> +          end
>>         end
>>       end
>>       self
>> diff --git a/spec/packaging/artifact_spec.rb
>> b/spec/packaging/artifact_spec.rb
>> index 42e7b9c..45839f2 100644
>> --- a/spec/packaging/artifact_spec.rb
>> +++ b/spec/packaging/artifact_spec.rb
>> @@ -429,6 +429,23 @@ describe Buildr, '#artifact' do
>>     lambda { artifact.invoke }.should change {
>> File.exist?(artifact.to_s) }.to(true)
>>   end
>>
>> +
>> +  it 'should trigger from dependency if not installed' do
>> +    file = 'test.jar'
>> +    touch file
>> +    artifact = artifact('group:id:jar:1.0').from(file)
>> +    lambda { artifact.invoke }.should change {
>> artifact.up_to_date_compared_to?(file) }.to(true)
>> +  end
>> +
>> +  it 'should not trigger from dependency if installed' do
>> +    file = 'test.jar'
>> +    touch file
>> +    artifact = artifact('group:id:jar:1.0').from(file)
>> +    lambda { artifact.invoke }.should change {
>> artifact.up_to_date_compared_to?(file) }.to(true)
>> +    lambda { artifact.invoke }.should_not change {
>> artifact.up_to_date_compared_to?(file) }.to(true)
>> +  end
>> +
>> +
>>   it 'should reference artifacts defined on build.yaml by using ruby
>> symbols' do
>>     write 'build.yaml', <<-YAML
>>       artifacts:
>> --
>> 1.6.6
>>
>>
>>
>>
>> --
>> http://anders.janmyr.com/
>>
>



-- 
http://anders.janmyr.com/

Reply via email to