Return-Path: Delivered-To: apmail-incubator-buildr-commits-archive@locus.apache.org Received: (qmail 51331 invoked from network); 22 Aug 2008 22:11:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 22 Aug 2008 22:11:00 -0000 Received: (qmail 43284 invoked by uid 500); 22 Aug 2008 22:10:59 -0000 Delivered-To: apmail-incubator-buildr-commits-archive@incubator.apache.org Received: (qmail 43263 invoked by uid 500); 22 Aug 2008 22:10:58 -0000 Mailing-List: contact buildr-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: buildr-dev@incubator.apache.org Delivered-To: mailing list buildr-commits@incubator.apache.org Received: (qmail 43254 invoked by uid 99); 22 Aug 2008 22:10:58 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 22 Aug 2008 15:10:58 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 22 Aug 2008 22:09:58 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 6EBAC238889E; Fri, 22 Aug 2008 15:09:58 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r688204 - in /incubator/buildr/trunk: CHANGELOG lib/buildr/ide/eclipse.rb spec/eclipse_spec.rb Date: Fri, 22 Aug 2008 22:09:58 -0000 To: buildr-commits@incubator.apache.org From: lacton@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080822220958.6EBAC238889E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: lacton Date: Fri Aug 22 15:09:57 2008 New Revision: 688204 URL: http://svn.apache.org/viewvc?rev=688204&view=rev Log: BUILDR-123: eclipse task now honors ResourceTask's target directory (+ heavy refactoring) Modified: incubator/buildr/trunk/CHANGELOG incubator/buildr/trunk/lib/buildr/ide/eclipse.rb incubator/buildr/trunk/spec/eclipse_spec.rb Modified: incubator/buildr/trunk/CHANGELOG URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/CHANGELOG?rev=688204&r1=688203&r2=688204&view=diff ============================================================================== --- incubator/buildr/trunk/CHANGELOG (original) +++ incubator/buildr/trunk/CHANGELOG Fri Aug 22 15:09:57 2008 @@ -26,6 +26,7 @@ * Fixed: BUILDR-119 Eclipse task does not accept test resource folders (Lacton) * Fixed: BUILDR-122: eclipse task should not check for directory existence +* Fixed: BUILDR-123: eclipse task should honor ResourceTask's target directory * Fixed: BUILDR-124 unzip(...).from_path does not work correctly without include (Rhett Sutphin). * Fixed: BUILDR-126 Tests options are shared between unrelated projects when Modified: incubator/buildr/trunk/lib/buildr/ide/eclipse.rb URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/lib/buildr/ide/eclipse.rb?rev=688204&r1=688203&r2=688204&view=diff ============================================================================== --- incubator/buildr/trunk/lib/buildr/ide/eclipse.rb (original) +++ incubator/buildr/trunk/lib/buildr/ide/eclipse.rb Fri Aug 22 15:09:57 2008 @@ -59,20 +59,13 @@ file(project.path_to(".classpath")=>sources) do |task| info "Writing #{task.name}" - # Find a path relative to the project's root directory. - relative = lambda do |path| - path or raise "Invalid path '#{path.inspect}'" - msg = [:to_path, :to_str, :to_s].find { |msg| path.respond_to? msg } - path = path.__send__(msg) - Util.relative_path(File.expand_path(path), project.path_to) - end - m2repo = Buildr::Repositories.instance.local - excludes = [ '**/.svn/', '**/CVS/' ].join('|') File.open(task.name, "w") do |file| xml = Builder::XmlMarkup.new(:target=>file, :indent=>2) xml.classpath do + classpathentry = ClasspathEntryWriter.new project, xml + # Note: Use the test classpath since Eclipse compiles both "main" and "test" classes using the same classpath cp = project.test.compile.dependencies.map(&:to_s) - [ project.compile.target.to_s, project.resources.target.to_s ] cp = cp.uniq @@ -89,45 +82,23 @@ # Generated: classpath elements in the project are assumed to be generated generated, libs = others.partition { |path| path.to_s.index(project.path_to.to_s) == 0 } - # Main resources implicitly copied into project.compile.target - srcs = (project.compile.sources + generated + project.resources.sources).map { |src| relative[src] } - - srcs.sort.uniq.each do |path| - xml.classpathentry :kind=>'src', :path=>path, :excluding=>excludes - end + classpathentry.src project.compile.sources + generated + classpathentry.src project.resources if project.test.compile.target - # Test classes are generated in a separate output directory - test_sources = project.test.compile.sources.map { |src| relative[src] } - test_sources.each do |paths| - paths.sort.uniq.each do |path| - xml.classpathentry :kind=>'src', :path=>path, :output => relative[project.test.compile.target], :excluding=>excludes - end - end - - # Test resources go in separate output directory as well - test_resource_sources = project.test.resources.sources.map { |src| relative[src] } - test_resource_sources.each do |path| - xml.classpathentry :kind=>'src', :path=>path, :output => relative[project.test.compile.target], :excluding=>excludes - end + classpathentry.src project.test.compile + classpathentry.src project.test.resources end # Classpath elements from other projects - project_libs.map(&:id).sort.uniq.each do |project_id| - xml.classpathentry :kind=>'src', :combineaccessrules=>"false", :path=>"/#{project_id}" - end + classpathentry.src_projects project_libs - { :output => relative[project.compile.target], - :lib => libs.map(&:to_s), - :var => m2_libs.map { |path| path.to_s.sub(m2repo, 'M2_REPO') } - }.each do |kind, paths| - paths.sort.uniq.each do |path| - xml.classpathentry :kind=>kind, :path=>path - end - end + classpathentry.output project.compile.target + classpathentry.lib libs + classpathentry.var m2_libs, 'M2_REPO', m2repo - xml.classpathentry :kind=>'con', :path=>'ch.epfl.lamp.sdt.launching.SCALA_CONTAINER' if scala - xml.classpathentry :kind=>'con', :path=>'org.eclipse.jdt.launching.JRE_CONTAINER' + classpathentry.con 'ch.epfl.lamp.sdt.launching.SCALA_CONTAINER' if scala + classpathentry.con 'org.eclipse.jdt.launching.JRE_CONTAINER' end end end @@ -162,6 +133,83 @@ end + # Writes 'classpathentry' tags in an xml file. + # It converts tasks to paths. + # It converts absolute paths to relative paths. + # It ignores duplicate directories. + class ClasspathEntryWriter + def initialize project, xml_builder + @project = project + @xml = xml_builder + @excludes = [ '**/.svn/', '**/CVS/' ].join('|') + @paths_written = [] + end + + def con path + @xml.classpathentry :kind=>'con', :path=>path + end + + def lib libs + libs.map(&:to_s).sort.uniq.each do |path| + @xml.classpathentry :kind=>'lib', :path=>path + end + end + + # Write a classpathentry of kind 'src'. + # Accepts an array of absolute paths or a task. + def src arg + if [:sources, :target].all? { |message| arg.respond_to?(message) } + src_from_task arg + else + src_from_absolute_paths arg + end + end + + # Write a classpathentry of kind 'src' for dependent projects. + # Accepts an array of projects. + def src_projects project_libs + project_libs.map(&:id).sort.uniq.each do |project_id| + @xml.classpathentry :kind=>'src', :combineaccessrules=>"false", :path=>"/#{project_id}" + end + end + + def output target + @xml.classpathentry :kind=>'output', :path=>relative(target) + end + + def var libs, var_name, var_value + libs.map { |lib| lib.to_s.sub(var_value, var_name) }.sort.uniq.each do |path| + @xml.classpathentry :kind=>'var', :path=>path + end + end + + private + + # Find a path relative to the project's root directory. + def relative path + path or raise "Invalid path '#{path.inspect}'" + msg = [:to_path, :to_str, :to_s].find { |msg| path.respond_to? msg } + path = path.__send__(msg) + Util.relative_path(File.expand_path(path), @project.path_to) + end + + def src_from_task task + src_from_absolute_paths task.sources, task.target + end + + def src_from_absolute_paths absolute_paths, output=nil + relative_paths = absolute_paths.map { |src| relative(src) } + relative_paths.sort.uniq.each do |path| + unless @paths_written.include?(path) + attributes = { :kind=>'src', :path=>path, :excluding=>@excludes } + attributes[:output] = relative(output) if output + @xml.classpathentry attributes + @paths_written << path + end + end + end + end + end end # module Buildr Modified: incubator/buildr/trunk/spec/eclipse_spec.rb URL: http://svn.apache.org/viewvc/incubator/buildr/trunk/spec/eclipse_spec.rb?rev=688204&r1=688203&r2=688204&view=diff ============================================================================== --- incubator/buildr/trunk/spec/eclipse_spec.rb (original) +++ incubator/buildr/trunk/spec/eclipse_spec.rb Fri Aug 22 15:09:57 2008 @@ -18,10 +18,20 @@ module EclipseHelper - def classpath_sources attribute='path' + def classpath_xml_elements task('eclipse').invoke - REXML::Document.new(File.open('.classpath')). - root.elements.collect("classpathentry[@kind='src']") { |n| n.attributes[attribute] } + REXML::Document.new(File.open('.classpath')).root.elements + end + + def classpath_sources attribute='path' + classpath_xml_elements.collect("classpathentry[@kind='src']") { |n| n.attributes[attribute] } + end + + def classpath_output path + specific_output = classpath_xml_elements.collect("classpathentry[@path='#{path}']") { |n| n.attributes['output'] } + raise "expected: one output attribute for path '#{path}, got: #{specific_output} " if specific_output.length > 1 + default_output = classpath_xml_elements.collect("classpathentry[@kind='output']") { |n| n.attributes['path'] } + specific_output[0] || default_output[0] end end @@ -99,61 +109,128 @@ describe 'source folders' do include EclipseHelper - def classpath_sources attribute='path' - task('eclipse').invoke - REXML::Document.new(File.open('.classpath')). - root.elements.collect("classpathentry[@kind='src']") { |n| n.attributes[attribute] } - end - before do write 'buildfile' write 'src/main/java/Main.java' write 'src/test/java/Test.java' end - it 'should accept a default main source folder' do + describe 'source', :shared=>true do + it 'should ignore CVS and SVN files' do + define('foo') + classpath_sources('excluding').each do |excluding_attribute| + excluding = excluding_attribute.split('|') + excluding.should include('**/.svn/') + excluding.should include('**/CVS/') + end + end + end + + describe 'main code' do + it_should_behave_like 'source' + + it 'should accept to come from the default directory' do define('foo') classpath_sources.should include('src/main/java') end - - it 'should accept a user-defined main source folder' do + + it 'should accept to come from a user-defined directory' do define('foo') { compile path_to('src/java') } - write 'src/java/Foo.java' classpath_sources.should include('src/java') end - + it 'should accept a file task as a main source folder' do define('foo') { compile apt } classpath_sources.should include('target/generated/apt') end + + it 'should go to the default target directory' do + define('foo') + classpath_output('src/main/java').should == 'target/classes' + end + end - it 'should accept a default test source folder' do + describe 'test code' do + it_should_behave_like 'source' + + it 'should accept to come from the default directory' do define('foo') classpath_sources.should include('src/test/java') end - - it 'should accept a user-defined test source folder' do + + it 'should accept to come from a user-defined directory' do define('foo') { test.compile path_to('src/test') } classpath_sources.should include('src/test') end + + it 'should go to the default target directory' do + define('foo') + classpath_output('src/test/java').should == 'target/test/classes' + end + end - it 'should accept a default main resource folder' do + describe 'main resources' do + it_should_behave_like 'source' + + before do write 'src/main/resources/config.xml' + end + + it 'should accept to come from the default directory' do define('foo') classpath_sources.should include('src/main/resources') end - - it 'should accept a default test resource folder' do + + it 'should share a classpath entry if it comes from a directory with code' do + write 'src/main/java/config.properties' + define('foo') { resources.from('src/main/java').exclude('**/*.java') } + classpath_sources.select { |path| path == 'src/main/java'}.length.should == 1 + end + + it 'should go to the default target directory' do + define('foo') + classpath_output('src/main/resources').should == 'target/resources' + end + end + + describe 'test resources' do + it_should_behave_like 'source' + + before do write 'src/test/resources/config-test.xml' + end + + it 'should accept to come from the default directory' do define('foo') classpath_sources.should include('src/test/resources') end - - it 'should ignore CVS and SVN files' do - define('foo') - classpath_sources('excluding').uniq.should == ['**/.svn/|**/CVS/'] + + it 'should share a classpath entry if it comes from a directory with code' do + write 'src/test/java/config-test.properties' + define('foo') { test.resources.from('src/test/java').exclude('**/*.java') } + classpath_sources.select { |path| path == 'src/test/java'}.length.should == 1 + end + + it 'should go to the default target directory' do + define('foo') + classpath_output('src/test/resources').should == 'target/test/resources' + end end + describe 'project depending on another project' do + + it 'should have the underlying project in its classpath' do + mkdir 'bar' + define('myproject') { + project.version = '1.0' + define('foo') { package :jar } + define('bar') { compile.using(:javac).with project('foo'); } + } + task('eclipse').invoke + REXML::Document.new(File.open(File.join('bar', '.classpath'))).root. + elements.collect("classpathentry[@kind='src']") { |n| n.attributes['path'] }.should include('/myproject-foo') + end + end end end end