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/
>

Reply via email to