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/