You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by "Peter Donald (JIRA)" <ji...@apache.org> on 2012/09/23 14:13:07 UTC

[jira] [Closed] (BUILDR-627) Buildr cc doesn't support explicitly listed source files (patch included)

     [ https://issues.apache.org/jira/browse/BUILDR-627?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Peter Donald closed BUILDR-627.
-------------------------------

    Resolution: Fixed
      Assignee: Peter Donald

Patch applied - thanks!
                
> Buildr cc doesn't support explicitly listed source files (patch included)
> -------------------------------------------------------------------------
>
>                 Key: BUILDR-627
>                 URL: https://issues.apache.org/jira/browse/BUILDR-627
>             Project: Buildr
>          Issue Type: Bug
>          Components: Core features
>    Affects Versions: 1.4.7, 1.4.8
>         Environment: Mac OSX 10.7
> $ buildr --version
> Buildr 1.4.7
> $ ruby --version
> ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.1.0]
> $ java -version
> java version "1.6.0_29"
> Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-11M3527)
> Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
>            Reporter: Christopher Tiwald
>            Assignee: Peter Donald
>            Priority: Minor
>              Labels: cc, patch
>             Fix For: 1.4.8
>
>         Attachments: 0001-cc.rb-Added-support-for-non-directory-compilation-so.patch, buildr-627.diff
>
>
> Buildr cc's timestamp logic only handles source directories, not source files. This means that `buildr cc` neglects to recompile when explicitly declared source files are touched. The relevant logic in cc.rb:
>       timestamps = lambda do
>         times = {}
>         dirs.each { |d| Dir.glob("#{d}/**/*").map { |f| times[f] = File.mtime f } }
>         times
>       end
> When d is a file, Dir.glob("#{d}/**/*") returns [], meaning the timestamp is never recorded. The patch seems simple: Add a check to see what 'd' is. I've coded a patch to do just that. I've tested that it works for both dirs and files, but can't get rake spec to work on an up-to-date trunk. That problem, however, doesn't appear to be my patch. I've pushed the patch to my github buildr clone at https://github.com/ctiwald/buildr/commit/e9530fa554e9d64c720567aa00bfb6dbbea1fea0 and the raw git diff output is below. I'd be happy to submit this via another method. I wasn't quite clear on how to submit a patch in JIRA.
> Raw git patch:
> CompileTask's 'from' method accepts both directories and files, but
> the cc task polls files incorrectly. Test whether or not the source
> is a file or a directory and apply File.mtime accordingly. Directories
> use the original logic, running File.mtime on a map of <directory>/**/*.
> Skip the mapping if the source is a file.
> ---
>  lib/buildr/core/cc.rb |   22 ++++++++++++++--------
>  1 file changed, 14 insertions(+), 8 deletions(-)
> diff --git a/lib/buildr/core/cc.rb b/lib/buildr/core/cc.rb
> index 8638072..74e3677 100644
> --- a/lib/buildr/core/cc.rb
> +++ b/lib/buildr/core/cc.rb
> @@ -53,21 +53,27 @@ module Buildr
>          build_failed(project, ex)
>        end
>  
> -      dirs = []
> +      srcs = []
>        each_project do |p|
> -        dirs += p.compile.sources.map(&:to_s)
> -        dirs += p.test.compile.sources.map(&:to_s)
> -        dirs += p.resources.sources.map(&:to_s)
> +        srcs += p.compile.sources.map(&:to_s)
> +        srcs += p.test.compile.sources.map(&:to_s)
> +        srcs += p.resources.sources.map(&:to_s)
>        end
> -      if dirs.length == 1
> -        info "Monitoring directory: #{dirs.first}"
> +      if srcs.length == 1
> +        info "Monitoring directory: #{srcs.first}"
>        else
> -        info "Monitoring directories: [#{dirs.join ', '}]"
> +        info "Monitoring directories: [#{srcs.join ', '}]"
>        end
>  
>        timestamps = lambda do
>          times = {}
> -        dirs.each { |d| Dir.glob("#{d}/**/*").map { |f| times[f] = File.mtime f } }
> +        srcs.each { |a|
> +          if File.directory? a
> +            Dir.glob("#{a}/**/*").map { |f| times[f] = File.mtime f }
> +          else
> +            times[a] = File.mtime a
> +          end
> +        }
>          times
>        end

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira