70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			70 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require 'rubygems' | ||
|  | require 'rake' | ||
|  | require 'set' | ||
|  | require 'fileutils' | ||
|  | require 'file_path_utils.rb' | ||
|  | 
 | ||
|  | 
 | ||
|  | class FileSystemUtils | ||
|  |    | ||
|  |   constructor :file_wrapper | ||
|  | 
 | ||
|  |   # build up path list from input of one or more strings or arrays of (+/-) paths & globs | ||
|  |   def collect_paths(*paths) | ||
|  |     raw   = []  # all paths and globs | ||
|  |     plus  = Set.new # all paths to expand and add | ||
|  |     minus = Set.new # all paths to remove from plus set | ||
|  |      | ||
|  |     # assemble all globs and simple paths, reforming our glob notation to ruby globs | ||
|  |     paths.each do |paths_container| | ||
|  |       case (paths_container) | ||
|  |         when String then raw << (FilePathUtils::reform_glob(paths_container)) | ||
|  |         when Array  then paths_container.each {|path| raw << (FilePathUtils::reform_glob(path))} | ||
|  |         else raise "Don't know how to handle #{paths_container.class}" | ||
|  |       end | ||
|  |     end | ||
|  | 
 | ||
|  |     # iterate through each path and glob | ||
|  |     raw.each do |path| | ||
|  |      | ||
|  |       dirs = []  # container for only (expanded) paths | ||
|  |      | ||
|  |       # if a glob, expand it and slurp up all non-file paths | ||
|  |       if path.include?('*') | ||
|  |         # grab base directory only if globs are snug up to final path separator | ||
|  |         if (path =~ /\/\*+$/) | ||
|  |           dirs << FilePathUtils.extract_path(path) | ||
|  |         end | ||
|  |          | ||
|  |         # grab expanded sub-directory globs | ||
|  |         expanded = @file_wrapper.directory_listing( FilePathUtils.extract_path_no_aggregation_operators(path) ) | ||
|  |         expanded.each do |entry| | ||
|  |           dirs << entry if @file_wrapper.directory?(entry) | ||
|  |         end | ||
|  |          | ||
|  |       # else just grab simple path | ||
|  |       # note: we could just run this through glob expansion but such an | ||
|  |       #       approach doesn't handle a path not yet on disk) | ||
|  |       else | ||
|  |         dirs << FilePathUtils.extract_path_no_aggregation_operators(path) | ||
|  |       end | ||
|  |        | ||
|  |       # add dirs to the appropriate set based on path aggregation modifier if present | ||
|  |       FilePathUtils.add_path?(path) ? plus.merge(dirs) : minus.merge(dirs) | ||
|  |     end | ||
|  | 
 | ||
|  |     return (plus - minus).to_a.uniq | ||
|  |   end | ||
|  | 
 | ||
|  | 
 | ||
|  |   # given a file list, add to it or remove from it | ||
|  |   def revise_file_list(list, revisions) | ||
|  |     revisions.each do |revision| | ||
|  |       # include or exclude file or glob to file list | ||
|  |       file = FilePathUtils.extract_path_no_aggregation_operators( revision ) | ||
|  |       FilePathUtils.add_path?(revision) ? list.include(file) : list.exclude(file) | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  | end |