rant 0.3.6 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/NEWS +13 -0
  2. data/README +7 -1
  3. data/Rantfile +10 -14
  4. data/TODO +3 -0
  5. data/devel-notes +5 -0
  6. data/doc/advanced.rdoc +46 -0
  7. data/doc/c.rdoc +64 -0
  8. data/doc/examples/c_dependencies/Rantfile +27 -0
  9. data/doc/examples/c_dependencies/include/hello.h +7 -0
  10. data/doc/examples/c_dependencies/include/util.h +7 -0
  11. data/doc/examples/c_dependencies/src/main.c +9 -0
  12. data/doc/examples/c_dependencies/src/util.c +9 -0
  13. data/doc/examples/directedrule/Rantfile +0 -1
  14. data/doc/rantfile.rdoc +12 -9
  15. data/doc/rubyproject.rdoc +26 -0
  16. data/lib/rant/c/include.rb +51 -0
  17. data/lib/rant/import/autoclean.rb +16 -9
  18. data/lib/rant/import/c/dependencies.rb +127 -0
  19. data/lib/rant/import/directedrule.rb +8 -4
  20. data/lib/rant/import/rubypackage.rb +2 -1
  21. data/lib/rant/import/subfile.rb +41 -0
  22. data/lib/rant/import/truth.rb +6 -1
  23. data/lib/rant/import/win32/rubycmdwrapper.rb +37 -0
  24. data/lib/rant/import.rb +26 -3
  25. data/lib/rant/rantenv.rb +0 -32
  26. data/lib/rant/rantfile.rb +207 -194
  27. data/lib/rant/rantlib.rb +83 -150
  28. data/lib/rant/rantsys.rb +7 -10
  29. data/lib/rant/rantvar.rb +4 -6
  30. data/lib/rant.rb +57 -0
  31. data/rantmethods.rb +1 -47
  32. data/setup.rb +2 -2
  33. data/test/Rantfile +6 -1
  34. data/test/c/source.c +23 -0
  35. data/test/c/test_parse_includes.rb +41 -0
  36. data/test/import/c/dependencies/Rantfile +34 -0
  37. data/test/import/c/dependencies/bar.h +2 -0
  38. data/test/import/c/dependencies/foo.h +5 -0
  39. data/test/import/c/dependencies/hello.c +7 -0
  40. data/test/import/c/dependencies/include/foo.h +0 -0
  41. data/test/import/c/dependencies/include/sub/sub.h +8 -0
  42. data/test/import/c/dependencies/include/with space.h +7 -0
  43. data/test/import/c/dependencies/src/abc +5 -0
  44. data/test/import/c/dependencies/src/abc.c +5 -0
  45. data/test/import/c/dependencies/src/bar.c +11 -0
  46. data/test/import/c/dependencies/test_c_dependencies.rb +92 -0
  47. data/test/import/c/dependencies/test_on_the_fly.rb +44 -0
  48. data/test/import/directedrule/Rantfile +7 -2
  49. data/test/import/directedrule/test_directedrule.rb +6 -0
  50. data/test/import/subfile/Rantfile +28 -0
  51. data/test/import/subfile/autoclean.rf +16 -0
  52. data/test/import/subfile/test_subfile.rb +91 -0
  53. data/test/import/truth/Rantfile +7 -0
  54. data/test/import/truth/test_truth.rb +3 -0
  55. data/test/project2/buildfile +2 -0
  56. data/test/project2/test_project.rb +5 -3
  57. data/test/rant-import/Rantfile +4 -0
  58. data/test/rant-import/test_rant-import.rb +104 -1
  59. data/test/rule.rf +6 -0
  60. data/test/test_autosubfiletask.rb +59 -0
  61. data/test/test_clean.rb +48 -5
  62. data/test/test_dirtask.rb +45 -1
  63. data/test/test_examples.rb +25 -3
  64. data/test/test_filelist.rb +14 -2
  65. data/test/test_lighttask.rb +4 -6
  66. data/test/test_rant_interface.rb +8 -8
  67. data/test/test_rantfile_api.rb +37 -1
  68. data/test/test_rule.rb +6 -3
  69. data/test/test_source.rb +28 -1
  70. data/test/test_sourcenode.rb +163 -0
  71. data/test/test_task.rb +2 -2
  72. data/test/test_var.rb +3 -3
  73. data/test/tutil.rb +23 -2
  74. metadata +45 -3
  75. data/test/test_metatask.rb +0 -29
data/lib/rant/rantlib.rb CHANGED
@@ -60,7 +60,7 @@ class String
60
60
  if new_ext
61
61
  self.sub(/#{Regexp.escape ext}$/, new_ext)
62
62
  else
63
- self.sub(/\.[^.]+$/, ".#{ext}")
63
+ self.sub(/(\.[^.]*$)|$/, ".#{ext}")
64
64
  end
65
65
  end
66
66
  end
@@ -138,8 +138,8 @@ module RantContext
138
138
  rac.subdirs(*args)
139
139
  end
140
140
 
141
- def source rantfile
142
- rac.source(rantfile)
141
+ def source(opt, rantfile = nil)
142
+ rac.source(opt, rantfile)
143
143
  end
144
144
 
145
145
  def sys(*args, &block)
@@ -213,8 +213,8 @@ module Rant
213
213
  @@rac.args.replace(args.flatten)
214
214
  @@rac.run
215
215
  else
216
- @@rac = Rant::RantApp.new(args)
217
- @@rac.run
216
+ @@rac = Rant::RantApp.new
217
+ @@rac.run(args)
218
218
  end
219
219
  end
220
220
 
@@ -295,12 +295,13 @@ class Rant::RantApp
295
295
  # A list of all registered plugins.
296
296
  attr_reader :plugins
297
297
  # The context in which Rantfiles are loaded. RantContext methods
298
- # may be called through an instance_eval on this object (e.g. from
299
- # plugins).
298
+ # may be called through this object (e.g. from plugins).
300
299
  attr_reader :context
301
300
  alias cx context
302
301
  # A hash with all tasks. For fast task lookup use this hash with
303
302
  # the taskname as key.
303
+ #
304
+ # See also: #resolve, #make
304
305
  attr_reader :tasks
305
306
  # A list of all imports (code loaded with +import+).
306
307
  attr_reader :imports
@@ -314,6 +315,11 @@ class Rant::RantApp
314
315
  attr_reader :resolve_hooks
315
316
 
316
317
  def initialize *args
318
+ unless args.empty?
319
+ STDERR.puts caller[0]
320
+ STDERR.puts "Warning: Giving arguments Rant::RantApp.new " +
321
+ "is deprecated. Give them to the #run method."
322
+ end
317
323
  @args = args.flatten
318
324
  # Rantfiles will be loaded in the context of this object.
319
325
  @context = RantAppContext.new(self)
@@ -336,7 +342,7 @@ class Rant::RantApp
336
342
  @var.query :ignore, :AutoList, []
337
343
  @imports = []
338
344
 
339
- @task_show = nil
345
+ #@task_show = nil
340
346
  @task_desc = nil
341
347
 
342
348
  @orig_pwd = nil
@@ -358,8 +364,6 @@ class Rant::RantApp
358
364
  end
359
365
 
360
366
  def rootdir
361
- #od = @opts[:directory]
362
- #od ? od.dup : ""
363
367
  @opts[:directory]
364
368
  end
365
369
 
@@ -440,8 +444,9 @@ class Rant::RantApp
440
444
  end
441
445
 
442
446
  # Returns 0 on success and 1 on failure.
443
- def run
447
+ def run *args
444
448
  @run = true
449
+ @args.concat(args.flatten)
445
450
  # remind pwd
446
451
  @orig_pwd = Dir.pwd
447
452
  # Process commandline.
@@ -479,10 +484,6 @@ class Rant::RantApp
479
484
  goto "#"
480
485
  @plugins.each { |plugin| plugin.rant_done }
481
486
  return 0
482
- rescue Rant::RantfileException
483
- err_msg "Invalid Rantfile: " + $!.message
484
- $stderr.puts "rant aborted!"
485
- return 1
486
487
  rescue Rant::RantError
487
488
  ch = get_ch_from_backtrace($!.backtrace)
488
489
  if ch
@@ -509,9 +510,6 @@ class Rant::RantApp
509
510
  end
510
511
 
511
512
  ###### methods accessible through RantContext ####################
512
- def show *args
513
- @task_show = *args.join("\n")
514
- end
515
513
 
516
514
  def desc *args
517
515
  if args.empty? || (args.size == 1 && args.first.nil?)
@@ -539,12 +537,10 @@ class Rant::RantApp
539
537
  ch = Rant::Lib::parse_caller_elem(clr)
540
538
  name = nil
541
539
  pre = []
542
- ln = ch[:ln] || 0
543
- file = ch[:file]
544
540
  # validate args
545
541
  generator = args.shift
546
542
  unless generator.respond_to? :rant_generate
547
- abort(pos_text(file, ln),
543
+ abort_at(ch,
548
544
  "First argument to `gen' has to be a task-generator.")
549
545
  end
550
546
  # ask generator to produce a task for this application
@@ -603,7 +599,7 @@ class Rant::RantApp
603
599
  Rant::CODE_IMPORTS << import_name
604
600
  rescue LoadError
605
601
  abort(pos_text(file, ln),
606
- "no such plugin library - `#{lc_pl_name}'")
602
+ "no such plugin library -- #{lc_pl_name}")
607
603
  end
608
604
  end
609
605
  pl_class = nil
@@ -611,7 +607,7 @@ class Rant::RantApp
611
607
  pl_class = ::Rant::Plugin.const_get(pl_name)
612
608
  rescue NameError, ArgumentError
613
609
  abort(pos_text(file, ln),
614
- "`#{pl_name}': no such plugin")
610
+ "no such plugin -- #{pl_name}")
615
611
  end
616
612
 
617
613
  plugin = pl_class.rant_plugin_new(self, ch, *args, &block)
@@ -629,15 +625,14 @@ class Rant::RantApp
629
625
  # and a new file task.
630
626
  def enhance targ, &block
631
627
  prepare_task(targ, block) { |name,pre,blk|
632
- t = @tasks[name]
633
- if Rant::MetaTask === t
634
- t = t.last
635
- end
628
+ t = resolve(name).last
636
629
  if t
637
630
  unless t.respond_to? :enhance
638
631
  abort("Can't enhance task `#{name}'")
639
632
  end
640
633
  t.enhance(pre, &blk)
634
+ # Important: return from method, don't break to
635
+ # prepare_task which would add task t again
641
636
  return t
642
637
  end
643
638
  warn_msg "enhance \"#{name}\": no such task",
@@ -646,16 +641,21 @@ class Rant::RantApp
646
641
  }
647
642
  end
648
643
 
649
- def source rantfile
644
+ # Returns the value of the last expression executed in +rantfile+.
645
+ def source(opt, rantfile = nil)
646
+ unless rantfile
647
+ rantfile = opt
648
+ opt = nil
649
+ end
650
+ make_rf = opt != :n && opt != :now
650
651
  rf, is_new = rantfile_for_path(rantfile)
651
652
  return false unless is_new
652
- build rantfile
653
- unless rf.exist?
654
- abort("source: No such file - #{rantfile}")
653
+ make rantfile if make_rf
654
+ unless File.exist? rf.path
655
+ abort("source: No such file -- #{rantfile}")
655
656
  end
656
657
 
657
658
  load_file rf
658
- true
659
659
  end
660
660
 
661
661
  # Search the given directories for Rantfiles.
@@ -665,12 +665,9 @@ class Rant::RantApp
665
665
  ln = cinf[:ln] || 0
666
666
  file = cinf[:file]
667
667
  args.each { |arg|
668
- #if arg.is_a? Symbol
669
- # arg = arg.to_s
670
668
  if arg.respond_to? :to_str
671
669
  arg = arg.to_str
672
- end
673
- unless arg.is_a? String
670
+ else
674
671
  abort(pos_text(file, ln),
675
672
  "subdirs: arguments must be strings")
676
673
  end
@@ -686,15 +683,13 @@ class Rant::RantApp
686
683
  rantfiles_in_dir.each { |f|
687
684
  loaded = true
688
685
  rf, is_new = rantfile_for_path(f)
689
- if is_new
690
- load_file rf
691
- end
686
+ load_file rf if is_new
692
687
  }
693
688
  ensure
694
689
  #puts " going back to project dir: #{prev_subdir}"
695
690
  goto_project_dir prev_subdir
696
691
  end
697
- unless loaded || quiet?
692
+ unless loaded || @opts[:no_warn_subdir]
698
693
  warn_msg(pos_text(file, ln),
699
694
  "subdirs: No Rantfile in subdir `#{arg}'.")
700
695
  end
@@ -704,22 +699,14 @@ class Rant::RantApp
704
699
  end
705
700
 
706
701
  def sys(*args, &block)
707
- if args.empty?
708
- @sys
709
- else
710
- @sys.sh(*args)
711
- end
702
+ args.empty? ? @sys : @sys.sh(*args)
712
703
  end
713
704
 
714
705
  # The [] and []= operators may be used to set/get values from this
715
706
  # object (like a hash). It is intended to let the different
716
707
  # modules, plugins and tasks to communicate with each other.
717
708
  def var(*args, &block)
718
- if args.empty?
719
- @var
720
- else
721
- @var.query(*args, &block)
722
- end
709
+ args.empty? ? @var : @var.query(*args, &block)
723
710
  end
724
711
  ##################################################################
725
712
 
@@ -771,7 +758,6 @@ class Rant::RantApp
771
758
  }
772
759
  name_length < 7 && name_length = 7
773
760
  cmd_length = prefix.length + name_length
774
- # TODO: show what's done if rant is invoked without argument
775
761
  unless tlist.first.full_name == def_target
776
762
  defaults = list_task_names(
777
763
  resolve(def_target)).join(', ')
@@ -802,13 +788,7 @@ class Rant::RantApp
802
788
  rsl
803
789
  end
804
790
  private :list_task_names
805
-
806
- # Increase verbosity.
807
- def more_verbose
808
- @opts[:verbose] += 1
809
- @opts[:quiet] = false
810
- end
811
-
791
+
812
792
  # This is actually an integer indicating the verbosity level.
813
793
  # Usual values range from 0 to 3.
814
794
  def verbose
@@ -839,7 +819,7 @@ class Rant::RantApp
839
819
  # Print a command message as would be done from a call to a
840
820
  # Sys method.
841
821
  def cmd_msg cmd
842
- $stdout.puts cmd unless quiet?
822
+ puts cmd unless quiet?
843
823
  end
844
824
 
845
825
  ###### public methods regarding plugins ##########################
@@ -889,20 +869,15 @@ class Rant::RantApp
889
869
  # The target list is a list of strings, not Task objects!
890
870
  if target_list.empty?
891
871
  def_tasks = resolve "default"
892
- #have_default = @rantfiles.any? { |f|
893
- # f.tasks.any? { |t| t.name == "default" }
894
- #}
895
872
  unless def_tasks.empty?
896
873
  target_list << "default"
897
874
  else
898
- first = nil
899
875
  @rantfiles.each { |f|
900
876
  unless f.tasks.empty?
901
- first = f.tasks.first.full_name
877
+ target_list << f.tasks.first.full_name
902
878
  break
903
879
  end
904
880
  }
905
- target_list << first
906
881
  end
907
882
  end
908
883
  target_list
@@ -915,15 +890,15 @@ class Rant::RantApp
915
890
  matching_tasks = 0
916
891
  target_list.each do |target|
917
892
  goto "#"
918
- if build(target) == 0
919
- abort("Don't know how to build `#{target}'.")
893
+ if make(target) == 0
894
+ abort("Don't know how to make `#{target}'.")
920
895
  end
921
896
  end
922
897
  end
923
898
 
924
899
  # Invoke all tasks necessary to build +target+. Returns the number
925
900
  # of tasks invoked.
926
- def build target, opt = {}
901
+ def make target, opt = {}
927
902
  opt[:force] = true if @force_targets.delete(target)
928
903
  matching_tasks = 0
929
904
  old_subdir = @current_subdir
@@ -941,12 +916,12 @@ class Rant::RantApp
941
916
  Dir.chdir old_pwd
942
917
  matching_tasks
943
918
  end
944
- public :build
919
+ public :make
920
+ alias build make
945
921
 
922
+ # Currently always returns an array (which might actually be a
923
+ # an empty array, but never nil).
946
924
  def resolve task_name, rel_project_dir = @current_subdir
947
- #select_tasks_by_name task_name, rel_project_dir
948
- # Note: first lines copied from +select_tasks_by_name+
949
- # for efficiency reasons
950
925
  s = @tasks[expand_path(rel_project_dir, task_name)]
951
926
  case s
952
927
  when nil
@@ -956,8 +931,8 @@ class Rant::RantApp
956
931
  return s if s
957
932
  }
958
933
  []
959
- when Rant::Worker: [s]
960
- else # assuming MetaTask
934
+ when Rant::Node: [s]
935
+ else # assuming list of tasks
961
936
  s
962
937
  end
963
938
  end
@@ -972,9 +947,6 @@ class Rant::RantApp
972
947
  # returns true.
973
948
  def select_tasks
974
949
  selection = []
975
- ### pre 0.2.10 ##################
976
- # @rantfile.reverse.each { |rf|
977
- #################################
978
950
  @rantfiles.each { |rf|
979
951
  rf.tasks.each { |t|
980
952
  selection << t if yield t
@@ -984,32 +956,6 @@ class Rant::RantApp
984
956
  end
985
957
  public :select_tasks
986
958
 
987
- # Returns an array (might be a MetaTask) with all tasks that have
988
- # the given name.
989
- def select_tasks_by_name name, project_dir = @current_subdir
990
- # pre 0.3.1
991
- #s = @tasks[name]
992
- s = @tasks[expand_path(project_dir, name)]
993
- case s
994
- when nil: []
995
- when Rant::Worker: [s]
996
- else # assuming MetaTask
997
- s
998
- end
999
- end
1000
- public :select_tasks_by_name
1001
-
1002
- # Get the first task for which yield returns true. Returns nil if
1003
- # yield never returned true.
1004
- def select_task
1005
- @rantfiles.reverse.each { |rf|
1006
- rf.tasks.each { |t|
1007
- return t if yield t
1008
- }
1009
- }
1010
- nil
1011
- end
1012
-
1013
959
  def load_rantfiles
1014
960
  # Take care: When rant isn't invoked from commandline,
1015
961
  # some "rant code" could already have run!
@@ -1042,24 +988,28 @@ class Rant::RantApp
1042
988
  end
1043
989
  end
1044
990
 
991
+ # Returns the value of the last expression executed in +rantfile+.
992
+ # +rantfile+ has to be an Rant::Rantfile instance.
1045
993
  def load_file rantfile
1046
- msg 1, "source #{rantfile.path}"
994
+ msg 1, "source #{rantfile}"
995
+ rv = nil
1047
996
  begin
1048
- path = rantfile.absolute_path
1049
- @context.instance_eval(File.read(path), path)
997
+ path = rantfile.path
998
+ rv = @context.instance_eval(File.read(path), path)
1050
999
  rescue NameError => e
1051
- abort("Name error when loading `#{rantfile.path}':",
1000
+ abort("Name error when loading `#{rantfile}':",
1052
1001
  e.message, e.backtrace)
1053
1002
  rescue LoadError => e
1054
- abort("Load error when loading `#{rantfile.path}':",
1003
+ abort("Load error when loading `#{rantfile}':",
1055
1004
  e.message, e.backtrace)
1056
1005
  rescue ScriptError => e
1057
- abort("Script error when loading `#{rantfile.path}':",
1006
+ abort("Script error when loading `#{rantfile}':",
1058
1007
  e.message, e.backtrace)
1059
1008
  end
1060
1009
  unless @rantfiles.include?(rantfile)
1061
1010
  @rantfiles << rantfile
1062
1011
  end
1012
+ rv
1063
1013
  end
1064
1014
  private :load_file
1065
1015
 
@@ -1071,9 +1021,9 @@ class Rant::RantApp
1071
1021
  files = []
1072
1022
  ::Rant::RANTFILES.each { |rfn|
1073
1023
  path = dir ? File.join(dir, rfn) : rfn
1074
- # We load don't accept rantfiles with pathes that differ
1075
- # only in case. This protects from loading the same file
1076
- # twice on case insensitive file systems.
1024
+ # We don't accept rantfiles with pathes that differ only
1025
+ # in case. This protects from loading the same file twice
1026
+ # on case insensitive file systems.
1077
1027
  unless files.find { |f| f.downcase == path.downcase }
1078
1028
  files << path if test(?f, path)
1079
1029
  end
@@ -1091,14 +1041,9 @@ class Rant::RantApp
1091
1041
  cmd_opts.quiet = true
1092
1042
  cmd_opts.each { |opt, value|
1093
1043
  case opt
1094
- when "--verbose": more_verbose
1095
- when "--quiet"
1096
- @opts[:quiet] = true
1097
- @opts[:verbose] = -1
1098
- when "--err-commands"
1099
- @opts[:err_commands] = true
1044
+ when "--verbose": @opts[:verbose] += 1
1100
1045
  when "--version"
1101
- $stdout.puts "rant #{Rant::VERSION}"
1046
+ puts "rant #{Rant::VERSION}"
1102
1047
  raise Rant::RantDoneException
1103
1048
  when "--help"
1104
1049
  show_help
@@ -1111,12 +1056,9 @@ class Rant::RantApp
1111
1056
  @arg_rantfiles << value
1112
1057
  when "--force-run"
1113
1058
  @force_targets << value
1114
- when "--tasks"
1115
- @opts[:tasks] = true
1116
- when "--stop-after-load"
1117
- @opts[:stop_after_load] = true
1118
- when "--trace-abort"
1119
- @opts[:trace_abort] = true
1059
+ else
1060
+ # simple switch
1061
+ @opts[opt.sub(/^--/, '').tr('-', "_").to_sym] = true
1120
1062
  end
1121
1063
  }
1122
1064
  rescue GetoptLong::Error => e
@@ -1138,18 +1080,10 @@ class Rant::RantApp
1138
1080
  def prepare_task(targ, block, clr = caller[2])
1139
1081
  #STDERR.puts "prepare task (#@current_subdir):\n #{targ.inspect}"
1140
1082
 
1141
- # Allow override of caller, usefull for plugins and libraries
1083
+ # Allow override of caller, useful for plugins and libraries
1142
1084
  # that define tasks.
1143
1085
  if targ.is_a? Hash
1144
- targ.reject! { |k, v|
1145
- case k
1146
- when :__caller__
1147
- clr = v
1148
- true
1149
- else
1150
- false
1151
- end
1152
- }
1086
+ targ.reject! { |k, v| clr = v if k == :__caller__ }
1153
1087
  end
1154
1088
  cinf = Hash === clr ? clr : Rant::Lib::parse_caller_elem(clr)
1155
1089
 
@@ -1174,11 +1108,10 @@ class Rant::RantApp
1174
1108
  case et
1175
1109
  when nil
1176
1110
  @tasks[n] = task
1177
- when Rant::Worker
1178
- mt = Rant::MetaTask.new n
1179
- mt << et << task
1111
+ when Rant::Node
1112
+ mt = [et, task]
1180
1113
  @tasks[n] = mt
1181
- else # assuming Rant::MetaTask
1114
+ else # assuming list of tasks
1182
1115
  et << task
1183
1116
  end
1184
1117
  end
@@ -1192,14 +1125,15 @@ class Rant::RantApp
1192
1125
  # and the second is an array with the prerequisites.
1193
1126
  # The third is the file name of +clr+, the fourth is the line number
1194
1127
  # of +clr+.
1195
- def normalize_task_arg(targ, clr)
1128
+ def normalize_task_arg(targ, ch)
1129
+ # pre 0.3.7: ch in parameter list was clr
1196
1130
  # TODO: check the code calling this method so that we can
1197
1131
  # assume clr is already a hash
1198
- ch = Hash === clr ? clr : Rant::Lib::parse_caller_elem(clr)
1132
+ #ch = Hash === clr ? clr : Rant::Lib::parse_caller_elem(clr)
1133
+
1199
1134
  name = nil
1200
1135
  pre = []
1201
- ln = ch[:ln] || 0
1202
- file = ch[:file]
1136
+ ln, file = ch[:ln], ch[:file]
1203
1137
 
1204
1138
  # process and validate targ
1205
1139
  if targ.is_a? Hash
@@ -1255,15 +1189,14 @@ class Rant::RantApp
1255
1189
  # the rantfile was created and added, otherwise the rantfile
1256
1190
  # already existed.
1257
1191
  def rantfile_for_path path
1258
- # TODO: optimization: File.expand_path is called very often
1259
- # (don't forget the calls from Rant::Path#absolute_path)
1192
+ # all rantfiles have an absolute path as path attribute
1260
1193
  abs_path = File.expand_path(path)
1261
- if @rantfiles.any? { |rf| rf.absolute_path == abs_path }
1262
- file = @rantfiles.find { |rf| rf.absolute_path == abs_path }
1194
+ if @rantfiles.any? { |rf| rf.path == abs_path }
1195
+ file = @rantfiles.find { |rf| rf.path == abs_path }
1263
1196
  [file, false]
1264
1197
  else
1265
1198
  # create new Rantfile object
1266
- file = Rant::Rantfile.new(abs_path, abs_path)
1199
+ file = Rant::Rantfile.new abs_path
1267
1200
  file.project_subdir = @current_subdir
1268
1201
  @rantfiles << file
1269
1202
  [file, true]
@@ -1311,8 +1244,8 @@ class Rant::RantApp
1311
1244
  end
1312
1245
  elsif Rant::CommandError === orig
1313
1246
  msg << orig.message if @opts[:err_commands]
1314
- else
1315
- msg << orig.message unless Rant::RantAbortException
1247
+ elsif !(Rant::RantAbortException === orig)
1248
+ msg << orig.message << orig.backtrace[0..4]
1316
1249
  end
1317
1250
  end
1318
1251
  err_msg msg unless msg.empty?
data/lib/rant/rantsys.rb CHANGED
@@ -192,15 +192,12 @@ module Rant
192
192
  if File::ALT_SEPARATOR
193
193
  # TODO: check for FS case sensitivity?
194
194
  def mk_all_rx(file)
195
-
196
- /(^|(#{ESC_SEPARATOR}|#{ESC_ALT_SEPARATOR})+)
197
- #{Regexp.escape(file)}
195
+ /(^|(#{ESC_SEPARATOR}|#{ESC_ALT_SEPARATOR})+)#{Regexp.escape(file)}
198
196
  ((#{ESC_SEPARATOR}|#{ESC_ALT_SEPARATOR})+|$)/x
199
197
  end
200
198
  else
201
199
  def mk_all_rx(file)
202
- /(^|#{ESC_SEPARATOR}+)
203
- #{Regexp.escape(file)}
200
+ /(^|#{ESC_SEPARATOR}+)#{Regexp.escape(file)}
204
201
  (#{ESC_SEPARATOR}+|$)/x
205
202
  end
206
203
  end
@@ -213,7 +210,7 @@ module Rant
213
210
  end
214
211
 
215
212
  def apply_select blk
216
- @files = @files.select &blk
213
+ @files = @files.select(&blk)
217
214
  end
218
215
  private :apply_select
219
216
 
@@ -381,7 +378,7 @@ module Rant
381
378
 
382
379
  def each_entry &block
383
380
  @lists.each { |list|
384
- list.each &block
381
+ list.each(&block)
385
382
  }
386
383
  end
387
384
 
@@ -417,7 +414,7 @@ module Rant
417
414
  def message
418
415
  if !@msg && cmd
419
416
  if status
420
- "Command failed with status #{status.to_s}:\n" +
417
+ "Command failed with status #{status.exitstatus}:\n" +
421
418
  "[#{cmd}]"
422
419
  else
423
420
  "Command failed:\n[#{cmd}]"
@@ -476,8 +473,8 @@ module Rant
476
473
  end
477
474
  end
478
475
 
479
- # Returns a string that can be used as a valid path argument on the
480
- # shell respecting portability issues.
476
+ # Returns a string that can be used as a valid path argument
477
+ # on the shell respecting portability issues.
481
478
  def sp path
482
479
  Env.shell_path path
483
480
  end
data/lib/rant/rantvar.rb CHANGED
@@ -16,15 +16,16 @@
16
16
  # If you're looking for general info about Rant, read the
17
17
  # README[link:files/README.html].
18
18
  module Rant
19
- VERSION = '0.3.6'
19
+ VERSION = '0.3.8'
20
20
 
21
21
  # Those are the filenames for rantfiles.
22
22
  # Case matters!
23
23
  RANTFILES = [ "Rantfile",
24
24
  "rantfile",
25
25
  "Rantfile.rb",
26
- "rantfile.rb",
26
+ "rantfile.rb"
27
27
  ]
28
+ SUB_RANTFILES = ["subrant"]
28
29
 
29
30
  # Names of plugins and imports for which code was loaded.
30
31
  # Files that where loaded with the `import' commant are directly
@@ -41,9 +42,6 @@ module Rant
41
42
  class RantError < StandardError
42
43
  end
43
44
 
44
- class RantfileException < RantError
45
- end
46
-
47
45
  # This module is a namespace for generator classes.
48
46
  module Generators
49
47
  end
@@ -168,7 +166,7 @@ module Rant
168
166
  begin
169
167
  id = Constraints.const_get(id)
170
168
  rescue
171
- raise NotAConstraintFactoryError.new(ct), caller
169
+ raise NotAConstraintFactoryError.new(id), caller
172
170
  end
173
171
  end
174
172
  unless id.respond_to? :rant_constraint
data/lib/rant.rb CHANGED
@@ -2,6 +2,63 @@
2
2
 
3
3
  require 'rant/rantlib'
4
4
 
5
+ module RantContext
6
+ # Needed for irb, which defines its own +source+ method.
7
+ def source_rf(*args, &block)
8
+ rac.source(*args, &block)
9
+ end
10
+ end
11
+ module Rant
12
+ class FileList
13
+ def inspect
14
+ # what's the right encoding for object_id ?
15
+ s = "#<#{self.class}:0x#{"%x" % object_id} "
16
+ s << "#{@actions.size} actions, #{@files.size} files"
17
+ if @ignore_rx
18
+ is = @ignore_rx.inspect.gsub(/\n|\t/, ' ')
19
+ s << ", ignore#{is.squeeze ' '}"
20
+ end
21
+ if @glob_flags != 0
22
+ s << ", flags:#@glob_flags"
23
+ end
24
+ s << ">"
25
+ end
26
+ end
27
+ module Node
28
+ def inspect
29
+ s = "#<#{self.class}:0x#{"%x" % object_id} "
30
+ s << "task_id:#{full_name}, action:#{inspect_action}"
31
+ s << ", deps:#{inspect_deps}"
32
+ s << ">"
33
+ end
34
+ private
35
+ def inspect_action
36
+ (defined? @block) ? @block.inspect : "nil"
37
+ end
38
+ def inspect_deps
39
+ if respond_to? :deps
40
+ dl = deps
41
+ s = dl.size.to_s
42
+ dls = dl.join(",")
43
+ dls[12..dls.length] = "..." if dls.length > 12
44
+ s << "[#{dls}]"
45
+ else
46
+ "0"
47
+ end
48
+ end
49
+ end
50
+ class RantApp
51
+ def inspect
52
+ s = "#<#{self.class}:0x#{"%x" % object_id} "
53
+ if current_subdir && !current_subdir.empty?
54
+ s << "subdir:#{current_subdir}, "
55
+ end
56
+ s << "tasks:#{tasks.size}"
57
+ s << ">"
58
+ end
59
+ end
60
+ end
61
+
5
62
  def rac
6
63
  Rant.rac
7
64
  end