rant 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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