shoesgem 0.1424.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (808) hide show
  1. data/LICENSE +30 -0
  2. data/README.rdoc +31 -0
  3. data/lib/shoes.rb +4 -0
  4. data/shoes/CHANGELOG.txt +21 -0
  5. data/shoes/COPYING.txt +30 -0
  6. data/shoes/README.txt +117 -0
  7. data/shoes/VERSION.txt +1 -0
  8. data/shoes/fonts/Coolvetica.ttf +0 -0
  9. data/shoes/fonts/Lacuna.ttf +0 -0
  10. data/shoes/freetype6.dll +0 -0
  11. data/shoes/lib/shoes/cache.rb +54 -0
  12. data/shoes/lib/shoes/data.rb +39 -0
  13. data/shoes/lib/shoes/help.rb +421 -0
  14. data/shoes/lib/shoes/image.rb +25 -0
  15. data/shoes/lib/shoes/inspect.rb +128 -0
  16. data/shoes/lib/shoes/log.rb +48 -0
  17. data/shoes/lib/shoes/minitar.rb +986 -0
  18. data/shoes/lib/shoes/override.rb +38 -0
  19. data/shoes/lib/shoes/pack.rb +503 -0
  20. data/shoes/lib/shoes/search.rb +46 -0
  21. data/shoes/lib/shoes/setup.rb +329 -0
  22. data/shoes/lib/shoes/shy.rb +131 -0
  23. data/shoes/lib/shoes/shybuilder.rb +44 -0
  24. data/shoes/lib/shoes.rb +522 -0
  25. data/shoes/libcairo-2.dll +0 -0
  26. data/shoes/libeay32.dll +0 -0
  27. data/shoes/libexpat-1.dll +0 -0
  28. data/shoes/libfontconfig-1.dll +0 -0
  29. data/shoes/libgio-2.0-0.dll +0 -0
  30. data/shoes/libglib-2.0-0.dll +0 -0
  31. data/shoes/libgmodule-2.0-0.dll +0 -0
  32. data/shoes/libgobject-2.0-0.dll +0 -0
  33. data/shoes/libgthread-2.0-0.dll +0 -0
  34. data/shoes/libiconv2.dll +0 -0
  35. data/shoes/libjpeg-8.dll +0 -0
  36. data/shoes/libpango-1.0-0.dll +0 -0
  37. data/shoes/libpangocairo-1.0-0.dll +0 -0
  38. data/shoes/libpangoft2-1.0-0.dll +0 -0
  39. data/shoes/libpangowin32-1.0-0.dll +0 -0
  40. data/shoes/libpng14-14.dll +0 -0
  41. data/shoes/libportaudio-2.dll +0 -0
  42. data/shoes/libshoes.dll +0 -0
  43. data/shoes/libssl32.dll +0 -0
  44. data/shoes/libungif4.dll +0 -0
  45. data/shoes/msvcrt-ruby191.dll +0 -0
  46. data/shoes/readline5.dll +0 -0
  47. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/fast_xs.so +0 -0
  48. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/blankslate.rb +63 -0
  49. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/builder.rb +216 -0
  50. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/elements.rb +510 -0
  51. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/htmlinfo.rb +691 -0
  52. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/inspect.rb +103 -0
  53. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/modules.rb +40 -0
  54. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/parse.rb +38 -0
  55. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tag.rb +202 -0
  56. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/tags.rb +164 -0
  57. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/traverse.rb +838 -0
  58. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot/xchar.rb +94 -0
  59. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot.rb +26 -0
  60. data/shoes/ruby/gems/1.9.1/gems/hpricot-0.8.1/lib/hpricot_scan.so +0 -0
  61. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/core.rb +135 -0
  62. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/add/rails.rb +58 -0
  63. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/common.rb +354 -0
  64. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/generator.so +0 -0
  65. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext/parser.so +0 -0
  66. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/ext.rb +13 -0
  67. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json/version.rb +9 -0
  68. data/shoes/ruby/gems/1.9.1/gems/json-shoes-1.1.3/lib/json.rb +8 -0
  69. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/constants.rb +49 -0
  70. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/database.rb +721 -0
  71. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/api.rb +152 -0
  72. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/dl/driver.rb +307 -0
  73. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/driver/native/driver.rb +219 -0
  74. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/errors.rb +68 -0
  75. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/pragmas.rb +271 -0
  76. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/resultset.rb +180 -0
  77. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/statement.rb +231 -0
  78. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/translator.rb +109 -0
  79. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/value.rb +57 -0
  80. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3/version.rb +16 -0
  81. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3.rb +1 -0
  82. data/shoes/ruby/gems/1.9.1/gems/sqlite3-ruby-1.2.5-x86-mswin32/lib/sqlite3_api.so +0 -0
  83. data/shoes/ruby/gems/1.9.1/specifications/hpricot-0.8.1.gemspec +32 -0
  84. data/shoes/ruby/gems/1.9.1/specifications/json-shoes-1.1.3.gemspec +34 -0
  85. data/shoes/ruby/gems/1.9.1/specifications/sqlite3-ruby-1.2.5-x86-mswin32.gemspec +46 -0
  86. data/shoes/ruby/lib/English.rb +155 -0
  87. data/shoes/ruby/lib/Win32API.rb +28 -0
  88. data/shoes/ruby/lib/abbrev.rb +103 -0
  89. data/shoes/ruby/lib/base64.rb +91 -0
  90. data/shoes/ruby/lib/benchmark.rb +573 -0
  91. data/shoes/ruby/lib/bigdecimal/jacobian.rb +85 -0
  92. data/shoes/ruby/lib/bigdecimal/ludcmp.rb +86 -0
  93. data/shoes/ruby/lib/bigdecimal/math.rb +237 -0
  94. data/shoes/ruby/lib/bigdecimal/newton.rb +77 -0
  95. data/shoes/ruby/lib/bigdecimal/util.rb +53 -0
  96. data/shoes/ruby/lib/cgi/cookie.rb +144 -0
  97. data/shoes/ruby/lib/cgi/core.rb +786 -0
  98. data/shoes/ruby/lib/cgi/html.rb +1021 -0
  99. data/shoes/ruby/lib/cgi/session/pstore.rb +111 -0
  100. data/shoes/ruby/lib/cgi/session.rb +537 -0
  101. data/shoes/ruby/lib/cgi/util.rb +181 -0
  102. data/shoes/ruby/lib/cgi.rb +274 -0
  103. data/shoes/ruby/lib/cmath.rb +233 -0
  104. data/shoes/ruby/lib/complex.rb +24 -0
  105. data/shoes/ruby/lib/csv.rb +2320 -0
  106. data/shoes/ruby/lib/date/format.rb +1313 -0
  107. data/shoes/ruby/lib/date.rb +1834 -0
  108. data/shoes/ruby/lib/debug.rb +907 -0
  109. data/shoes/ruby/lib/delegate.rb +311 -0
  110. data/shoes/ruby/lib/digest/hmac.rb +274 -0
  111. data/shoes/ruby/lib/digest/sha2.rb +74 -0
  112. data/shoes/ruby/lib/digest.rb +50 -0
  113. data/shoes/ruby/lib/dl/callback.rb +69 -0
  114. data/shoes/ruby/lib/dl/cparser.rb +109 -0
  115. data/shoes/ruby/lib/dl/func.rb +153 -0
  116. data/shoes/ruby/lib/dl/import.rb +215 -0
  117. data/shoes/ruby/lib/dl/pack.rb +173 -0
  118. data/shoes/ruby/lib/dl/stack.rb +146 -0
  119. data/shoes/ruby/lib/dl/struct.rb +213 -0
  120. data/shoes/ruby/lib/dl/types.rb +40 -0
  121. data/shoes/ruby/lib/dl/value.rb +112 -0
  122. data/shoes/ruby/lib/drb/acl.rb +146 -0
  123. data/shoes/ruby/lib/drb/drb.rb +1778 -0
  124. data/shoes/ruby/lib/drb/eq.rb +16 -0
  125. data/shoes/ruby/lib/drb/extserv.rb +71 -0
  126. data/shoes/ruby/lib/drb/extservm.rb +85 -0
  127. data/shoes/ruby/lib/drb/gw.rb +122 -0
  128. data/shoes/ruby/lib/drb/invokemethod.rb +34 -0
  129. data/shoes/ruby/lib/drb/observer.rb +22 -0
  130. data/shoes/ruby/lib/drb/ssl.rb +190 -0
  131. data/shoes/ruby/lib/drb/timeridconv.rb +91 -0
  132. data/shoes/ruby/lib/drb/unix.rb +108 -0
  133. data/shoes/ruby/lib/drb.rb +2 -0
  134. data/shoes/ruby/lib/e2mmap.rb +172 -0
  135. data/shoes/ruby/lib/erb.rb +902 -0
  136. data/shoes/ruby/lib/fileutils.rb +1592 -0
  137. data/shoes/ruby/lib/find.rb +81 -0
  138. data/shoes/ruby/lib/forwardable.rb +270 -0
  139. data/shoes/ruby/lib/ftsearch/analysis/analyzer.rb +16 -0
  140. data/shoes/ruby/lib/ftsearch/analysis/simple_identifier_analyzer.rb +23 -0
  141. data/shoes/ruby/lib/ftsearch/analysis/whitespace_analyzer.rb +22 -0
  142. data/shoes/ruby/lib/ftsearch/document_map_reader.rb +106 -0
  143. data/shoes/ruby/lib/ftsearch/document_map_writer.rb +46 -0
  144. data/shoes/ruby/lib/ftsearch/field_infos.rb +46 -0
  145. data/shoes/ruby/lib/ftsearch/fragment_writer.rb +114 -0
  146. data/shoes/ruby/lib/ftsearch/fulltext_reader.rb +52 -0
  147. data/shoes/ruby/lib/ftsearch/fulltext_writer.rb +75 -0
  148. data/shoes/ruby/lib/ftsearch/suffix_array_reader.rb +275 -0
  149. data/shoes/ruby/lib/ftsearch/suffix_array_writer.rb +99 -0
  150. data/shoes/ruby/lib/ftsearch/util.rb +21 -0
  151. data/shoes/ruby/lib/getoptlong.rb +610 -0
  152. data/shoes/ruby/lib/gserver.rb +253 -0
  153. data/shoes/ruby/lib/i386-mingw32/bigdecimal.so +0 -0
  154. data/shoes/ruby/lib/i386-mingw32/binject.so +0 -0
  155. data/shoes/ruby/lib/i386-mingw32/bloops.so +0 -0
  156. data/shoes/ruby/lib/i386-mingw32/continuation.so +0 -0
  157. data/shoes/ruby/lib/i386-mingw32/coverage.so +0 -0
  158. data/shoes/ruby/lib/i386-mingw32/curses.so +0 -0
  159. data/shoes/ruby/lib/i386-mingw32/digest/bubblebabble.so +0 -0
  160. data/shoes/ruby/lib/i386-mingw32/digest/md5.so +0 -0
  161. data/shoes/ruby/lib/i386-mingw32/digest/rmd160.so +0 -0
  162. data/shoes/ruby/lib/i386-mingw32/digest/sha1.so +0 -0
  163. data/shoes/ruby/lib/i386-mingw32/digest/sha2.so +0 -0
  164. data/shoes/ruby/lib/i386-mingw32/digest.so +0 -0
  165. data/shoes/ruby/lib/i386-mingw32/dl.so +0 -0
  166. data/shoes/ruby/lib/i386-mingw32/enc/big5.so +0 -0
  167. data/shoes/ruby/lib/i386-mingw32/enc/cp949.so +0 -0
  168. data/shoes/ruby/lib/i386-mingw32/enc/emacs_mule.so +0 -0
  169. data/shoes/ruby/lib/i386-mingw32/enc/encdb.so +0 -0
  170. data/shoes/ruby/lib/i386-mingw32/enc/euc_jp.so +0 -0
  171. data/shoes/ruby/lib/i386-mingw32/enc/euc_kr.so +0 -0
  172. data/shoes/ruby/lib/i386-mingw32/enc/euc_tw.so +0 -0
  173. data/shoes/ruby/lib/i386-mingw32/enc/gb18030.so +0 -0
  174. data/shoes/ruby/lib/i386-mingw32/enc/gb2312.so +0 -0
  175. data/shoes/ruby/lib/i386-mingw32/enc/gbk.so +0 -0
  176. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_1.so +0 -0
  177. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_10.so +0 -0
  178. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_11.so +0 -0
  179. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_13.so +0 -0
  180. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_14.so +0 -0
  181. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_15.so +0 -0
  182. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_16.so +0 -0
  183. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_2.so +0 -0
  184. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_3.so +0 -0
  185. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_4.so +0 -0
  186. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_5.so +0 -0
  187. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_6.so +0 -0
  188. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_7.so +0 -0
  189. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_8.so +0 -0
  190. data/shoes/ruby/lib/i386-mingw32/enc/iso_8859_9.so +0 -0
  191. data/shoes/ruby/lib/i386-mingw32/enc/koi8_r.so +0 -0
  192. data/shoes/ruby/lib/i386-mingw32/enc/koi8_u.so +0 -0
  193. data/shoes/ruby/lib/i386-mingw32/enc/shift_jis.so +0 -0
  194. data/shoes/ruby/lib/i386-mingw32/enc/trans/big5.so +0 -0
  195. data/shoes/ruby/lib/i386-mingw32/enc/trans/chinese.so +0 -0
  196. data/shoes/ruby/lib/i386-mingw32/enc/trans/escape.so +0 -0
  197. data/shoes/ruby/lib/i386-mingw32/enc/trans/gb18030.so +0 -0
  198. data/shoes/ruby/lib/i386-mingw32/enc/trans/gbk.so +0 -0
  199. data/shoes/ruby/lib/i386-mingw32/enc/trans/iso2022.so +0 -0
  200. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese.so +0 -0
  201. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_euc.so +0 -0
  202. data/shoes/ruby/lib/i386-mingw32/enc/trans/japanese_sjis.so +0 -0
  203. data/shoes/ruby/lib/i386-mingw32/enc/trans/korean.so +0 -0
  204. data/shoes/ruby/lib/i386-mingw32/enc/trans/single_byte.so +0 -0
  205. data/shoes/ruby/lib/i386-mingw32/enc/trans/transdb.so +0 -0
  206. data/shoes/ruby/lib/i386-mingw32/enc/trans/utf_16_32.so +0 -0
  207. data/shoes/ruby/lib/i386-mingw32/enc/utf_16be.so +0 -0
  208. data/shoes/ruby/lib/i386-mingw32/enc/utf_16le.so +0 -0
  209. data/shoes/ruby/lib/i386-mingw32/enc/utf_32be.so +0 -0
  210. data/shoes/ruby/lib/i386-mingw32/enc/utf_32le.so +0 -0
  211. data/shoes/ruby/lib/i386-mingw32/enc/windows_1251.so +0 -0
  212. data/shoes/ruby/lib/i386-mingw32/etc.so +0 -0
  213. data/shoes/ruby/lib/i386-mingw32/fcntl.so +0 -0
  214. data/shoes/ruby/lib/i386-mingw32/fiber.so +0 -0
  215. data/shoes/ruby/lib/i386-mingw32/ftsearchrt.so +0 -0
  216. data/shoes/ruby/lib/i386-mingw32/gdbm.so +0 -0
  217. data/shoes/ruby/lib/i386-mingw32/iconv.so +0 -0
  218. data/shoes/ruby/lib/i386-mingw32/io/wait.so +0 -0
  219. data/shoes/ruby/lib/i386-mingw32/json/ext/generator.so +0 -0
  220. data/shoes/ruby/lib/i386-mingw32/json/ext/parser.so +0 -0
  221. data/shoes/ruby/lib/i386-mingw32/mathn/complex.so +0 -0
  222. data/shoes/ruby/lib/i386-mingw32/mathn/rational.so +0 -0
  223. data/shoes/ruby/lib/i386-mingw32/nkf.so +0 -0
  224. data/shoes/ruby/lib/i386-mingw32/openssl.so +0 -0
  225. data/shoes/ruby/lib/i386-mingw32/racc/cparse.so +0 -0
  226. data/shoes/ruby/lib/i386-mingw32/rbconfig.rb +196 -0
  227. data/shoes/ruby/lib/i386-mingw32/readline.so +0 -0
  228. data/shoes/ruby/lib/i386-mingw32/ripper.so +0 -0
  229. data/shoes/ruby/lib/i386-mingw32/sdbm.so +0 -0
  230. data/shoes/ruby/lib/i386-mingw32/socket.so +0 -0
  231. data/shoes/ruby/lib/i386-mingw32/stringio.so +0 -0
  232. data/shoes/ruby/lib/i386-mingw32/strscan.so +0 -0
  233. data/shoes/ruby/lib/i386-mingw32/syck.so +0 -0
  234. data/shoes/ruby/lib/i386-mingw32/win32ole.so +0 -0
  235. data/shoes/ruby/lib/i386-mingw32/zlib.so +0 -0
  236. data/shoes/ruby/lib/io/nonblock.rb +23 -0
  237. data/shoes/ruby/lib/ipaddr.rb +813 -0
  238. data/shoes/ruby/lib/irb/cmd/chws.rb +32 -0
  239. data/shoes/ruby/lib/irb/cmd/fork.rb +38 -0
  240. data/shoes/ruby/lib/irb/cmd/help.rb +36 -0
  241. data/shoes/ruby/lib/irb/cmd/load.rb +66 -0
  242. data/shoes/ruby/lib/irb/cmd/nop.rb +38 -0
  243. data/shoes/ruby/lib/irb/cmd/pushws.rb +38 -0
  244. data/shoes/ruby/lib/irb/cmd/subirb.rb +42 -0
  245. data/shoes/ruby/lib/irb/completion.rb +207 -0
  246. data/shoes/ruby/lib/irb/context.rb +255 -0
  247. data/shoes/ruby/lib/irb/ext/change-ws.rb +61 -0
  248. data/shoes/ruby/lib/irb/ext/history.rb +109 -0
  249. data/shoes/ruby/lib/irb/ext/loader.rb +119 -0
  250. data/shoes/ruby/lib/irb/ext/math-mode.rb +36 -0
  251. data/shoes/ruby/lib/irb/ext/multi-irb.rb +240 -0
  252. data/shoes/ruby/lib/irb/ext/save-history.rb +100 -0
  253. data/shoes/ruby/lib/irb/ext/tracer.rb +60 -0
  254. data/shoes/ruby/lib/irb/ext/use-loader.rb +64 -0
  255. data/shoes/ruby/lib/irb/ext/workspaces.rb +55 -0
  256. data/shoes/ruby/lib/irb/extend-command.rb +272 -0
  257. data/shoes/ruby/lib/irb/frame.rb +66 -0
  258. data/shoes/ruby/lib/irb/help.rb +35 -0
  259. data/shoes/ruby/lib/irb/init.rb +288 -0
  260. data/shoes/ruby/lib/irb/input-method.rb +142 -0
  261. data/shoes/ruby/lib/irb/lc/error.rb +29 -0
  262. data/shoes/ruby/lib/irb/lc/help-message +38 -0
  263. data/shoes/ruby/lib/irb/lc/ja/encoding_aliases.rb +8 -0
  264. data/shoes/ruby/lib/irb/lc/ja/error.rb +27 -0
  265. data/shoes/ruby/lib/irb/lc/ja/help-message +39 -0
  266. data/shoes/ruby/lib/irb/locale.rb +195 -0
  267. data/shoes/ruby/lib/irb/magic-file.rb +36 -0
  268. data/shoes/ruby/lib/irb/notifier.rb +144 -0
  269. data/shoes/ruby/lib/irb/output-method.rb +69 -0
  270. data/shoes/ruby/lib/irb/ruby-lex.rb +1188 -0
  271. data/shoes/ruby/lib/irb/ruby-token.rb +270 -0
  272. data/shoes/ruby/lib/irb/slex.rb +282 -0
  273. data/shoes/ruby/lib/irb/src_encoding.rb +4 -0
  274. data/shoes/ruby/lib/irb/version.rb +15 -0
  275. data/shoes/ruby/lib/irb/workspace.rb +108 -0
  276. data/shoes/ruby/lib/irb/ws-for-case-2.rb +14 -0
  277. data/shoes/ruby/lib/irb/xmp.rb +97 -0
  278. data/shoes/ruby/lib/irb.rb +354 -0
  279. data/shoes/ruby/lib/json/add/core.rb +135 -0
  280. data/shoes/ruby/lib/json/add/rails.rb +58 -0
  281. data/shoes/ruby/lib/json/common.rb +354 -0
  282. data/shoes/ruby/lib/json/editor.rb +1371 -0
  283. data/shoes/ruby/lib/json/ext.rb +15 -0
  284. data/shoes/ruby/lib/json/version.rb +9 -0
  285. data/shoes/ruby/lib/json.rb +297 -0
  286. data/shoes/ruby/lib/kconv.rb +282 -0
  287. data/shoes/ruby/lib/logger.rb +732 -0
  288. data/shoes/ruby/lib/mathn.rb +206 -0
  289. data/shoes/ruby/lib/matrix.rb +1381 -0
  290. data/shoes/ruby/lib/minitest/autorun.rb +9 -0
  291. data/shoes/ruby/lib/minitest/mock.rb +37 -0
  292. data/shoes/ruby/lib/minitest/spec.rb +89 -0
  293. data/shoes/ruby/lib/minitest/unit.rb +497 -0
  294. data/shoes/ruby/lib/mkmf.rb +1958 -0
  295. data/shoes/ruby/lib/monitor.rb +265 -0
  296. data/shoes/ruby/lib/mutex_m.rb +91 -0
  297. data/shoes/ruby/lib/net/ftp.rb +981 -0
  298. data/shoes/ruby/lib/net/http.rb +2399 -0
  299. data/shoes/ruby/lib/net/https.rb +136 -0
  300. data/shoes/ruby/lib/net/imap.rb +3500 -0
  301. data/shoes/ruby/lib/net/pop.rb +1000 -0
  302. data/shoes/ruby/lib/net/protocol.rb +382 -0
  303. data/shoes/ruby/lib/net/smtp.rb +1014 -0
  304. data/shoes/ruby/lib/net/telnet.rb +759 -0
  305. data/shoes/ruby/lib/observer.rb +193 -0
  306. data/shoes/ruby/lib/open-uri.rb +832 -0
  307. data/shoes/ruby/lib/open3.rb +98 -0
  308. data/shoes/ruby/lib/openssl/bn.rb +35 -0
  309. data/shoes/ruby/lib/openssl/buffering.rb +242 -0
  310. data/shoes/ruby/lib/openssl/cipher.rb +65 -0
  311. data/shoes/ruby/lib/openssl/digest.rb +61 -0
  312. data/shoes/ruby/lib/openssl/ssl.rb +178 -0
  313. data/shoes/ruby/lib/openssl/x509.rb +155 -0
  314. data/shoes/ruby/lib/openssl.rb +24 -0
  315. data/shoes/ruby/lib/optparse/date.rb +17 -0
  316. data/shoes/ruby/lib/optparse/shellwords.rb +6 -0
  317. data/shoes/ruby/lib/optparse/time.rb +10 -0
  318. data/shoes/ruby/lib/optparse/uri.rb +6 -0
  319. data/shoes/ruby/lib/optparse/version.rb +70 -0
  320. data/shoes/ruby/lib/optparse.rb +1810 -0
  321. data/shoes/ruby/lib/ostruct.rb +145 -0
  322. data/shoes/ruby/lib/pathname.rb +1099 -0
  323. data/shoes/ruby/lib/pp.rb +532 -0
  324. data/shoes/ruby/lib/prettyprint.rb +896 -0
  325. data/shoes/ruby/lib/prime.rb +471 -0
  326. data/shoes/ruby/lib/profile.rb +10 -0
  327. data/shoes/ruby/lib/profiler.rb +59 -0
  328. data/shoes/ruby/lib/pstore.rb +543 -0
  329. data/shoes/ruby/lib/racc/parser.rb +441 -0
  330. data/shoes/ruby/lib/rake/classic_namespace.rb +8 -0
  331. data/shoes/ruby/lib/rake/clean.rb +33 -0
  332. data/shoes/ruby/lib/rake/gempackagetask.rb +97 -0
  333. data/shoes/ruby/lib/rake/loaders/makefile.rb +35 -0
  334. data/shoes/ruby/lib/rake/packagetask.rb +185 -0
  335. data/shoes/ruby/lib/rake/rake_test_loader.rb +5 -0
  336. data/shoes/ruby/lib/rake/rdoctask.rb +147 -0
  337. data/shoes/ruby/lib/rake/runtest.rb +23 -0
  338. data/shoes/ruby/lib/rake/tasklib.rb +23 -0
  339. data/shoes/ruby/lib/rake/testtask.rb +161 -0
  340. data/shoes/ruby/lib/rake/win32.rb +34 -0
  341. data/shoes/ruby/lib/rake.rb +2465 -0
  342. data/shoes/ruby/lib/rational.rb +19 -0
  343. data/shoes/ruby/lib/rbconfig/datadir.rb +24 -0
  344. data/shoes/ruby/lib/rdoc/code_objects.rb +1061 -0
  345. data/shoes/ruby/lib/rdoc/diagram.rb +340 -0
  346. data/shoes/ruby/lib/rdoc/dot.rb +249 -0
  347. data/shoes/ruby/lib/rdoc/generator/chm/chm.rb +100 -0
  348. data/shoes/ruby/lib/rdoc/generator/chm.rb +113 -0
  349. data/shoes/ruby/lib/rdoc/generator/html/common.rb +24 -0
  350. data/shoes/ruby/lib/rdoc/generator/html/frameless.rb +92 -0
  351. data/shoes/ruby/lib/rdoc/generator/html/hefss.rb +150 -0
  352. data/shoes/ruby/lib/rdoc/generator/html/html.rb +769 -0
  353. data/shoes/ruby/lib/rdoc/generator/html/kilmer.rb +151 -0
  354. data/shoes/ruby/lib/rdoc/generator/html/kilmerfactory.rb +427 -0
  355. data/shoes/ruby/lib/rdoc/generator/html/one_page_html.rb +122 -0
  356. data/shoes/ruby/lib/rdoc/generator/html.rb +445 -0
  357. data/shoes/ruby/lib/rdoc/generator/ri.rb +226 -0
  358. data/shoes/ruby/lib/rdoc/generator/texinfo/class.texinfo.erb +44 -0
  359. data/shoes/ruby/lib/rdoc/generator/texinfo/file.texinfo.erb +6 -0
  360. data/shoes/ruby/lib/rdoc/generator/texinfo/method.texinfo.erb +6 -0
  361. data/shoes/ruby/lib/rdoc/generator/texinfo/texinfo.erb +28 -0
  362. data/shoes/ruby/lib/rdoc/generator/texinfo.rb +81 -0
  363. data/shoes/ruby/lib/rdoc/generator/xml/rdf.rb +113 -0
  364. data/shoes/ruby/lib/rdoc/generator/xml/xml.rb +123 -0
  365. data/shoes/ruby/lib/rdoc/generator/xml.rb +117 -0
  366. data/shoes/ruby/lib/rdoc/generator.rb +1082 -0
  367. data/shoes/ruby/lib/rdoc/known_classes.rb +68 -0
  368. data/shoes/ruby/lib/rdoc/markup/attribute_manager.rb +265 -0
  369. data/shoes/ruby/lib/rdoc/markup/formatter.rb +14 -0
  370. data/shoes/ruby/lib/rdoc/markup/fragments.rb +337 -0
  371. data/shoes/ruby/lib/rdoc/markup/inline.rb +101 -0
  372. data/shoes/ruby/lib/rdoc/markup/lines.rb +152 -0
  373. data/shoes/ruby/lib/rdoc/markup/preprocess.rb +75 -0
  374. data/shoes/ruby/lib/rdoc/markup/to_flow.rb +185 -0
  375. data/shoes/ruby/lib/rdoc/markup/to_html.rb +403 -0
  376. data/shoes/ruby/lib/rdoc/markup/to_html_crossref.rb +148 -0
  377. data/shoes/ruby/lib/rdoc/markup/to_latex.rb +328 -0
  378. data/shoes/ruby/lib/rdoc/markup/to_test.rb +50 -0
  379. data/shoes/ruby/lib/rdoc/markup/to_texinfo.rb +69 -0
  380. data/shoes/ruby/lib/rdoc/markup.rb +378 -0
  381. data/shoes/ruby/lib/rdoc/options.rb +638 -0
  382. data/shoes/ruby/lib/rdoc/parser/c.rb +661 -0
  383. data/shoes/ruby/lib/rdoc/parser/f95.rb +1835 -0
  384. data/shoes/ruby/lib/rdoc/parser/perl.rb +165 -0
  385. data/shoes/ruby/lib/rdoc/parser/ruby.rb +2829 -0
  386. data/shoes/ruby/lib/rdoc/parser/simple.rb +38 -0
  387. data/shoes/ruby/lib/rdoc/parser.rb +142 -0
  388. data/shoes/ruby/lib/rdoc/rdoc.rb +293 -0
  389. data/shoes/ruby/lib/rdoc/ri/cache.rb +187 -0
  390. data/shoes/ruby/lib/rdoc/ri/descriptions.rb +156 -0
  391. data/shoes/ruby/lib/rdoc/ri/display.rb +392 -0
  392. data/shoes/ruby/lib/rdoc/ri/driver.rb +669 -0
  393. data/shoes/ruby/lib/rdoc/ri/formatter.rb +616 -0
  394. data/shoes/ruby/lib/rdoc/ri/paths.rb +99 -0
  395. data/shoes/ruby/lib/rdoc/ri/reader.rb +106 -0
  396. data/shoes/ruby/lib/rdoc/ri/util.rb +79 -0
  397. data/shoes/ruby/lib/rdoc/ri/writer.rb +68 -0
  398. data/shoes/ruby/lib/rdoc/ri.rb +8 -0
  399. data/shoes/ruby/lib/rdoc/stats.rb +115 -0
  400. data/shoes/ruby/lib/rdoc/template.rb +64 -0
  401. data/shoes/ruby/lib/rdoc/tokenstream.rb +33 -0
  402. data/shoes/ruby/lib/rdoc.rb +395 -0
  403. data/shoes/ruby/lib/resolv-replace.rb +63 -0
  404. data/shoes/ruby/lib/resolv.rb +2262 -0
  405. data/shoes/ruby/lib/rexml/attlistdecl.rb +62 -0
  406. data/shoes/ruby/lib/rexml/attribute.rb +188 -0
  407. data/shoes/ruby/lib/rexml/cdata.rb +67 -0
  408. data/shoes/ruby/lib/rexml/child.rb +96 -0
  409. data/shoes/ruby/lib/rexml/comment.rb +80 -0
  410. data/shoes/ruby/lib/rexml/doctype.rb +270 -0
  411. data/shoes/ruby/lib/rexml/document.rb +231 -0
  412. data/shoes/ruby/lib/rexml/dtd/attlistdecl.rb +10 -0
  413. data/shoes/ruby/lib/rexml/dtd/dtd.rb +51 -0
  414. data/shoes/ruby/lib/rexml/dtd/elementdecl.rb +17 -0
  415. data/shoes/ruby/lib/rexml/dtd/entitydecl.rb +56 -0
  416. data/shoes/ruby/lib/rexml/dtd/notationdecl.rb +39 -0
  417. data/shoes/ruby/lib/rexml/element.rb +1246 -0
  418. data/shoes/ruby/lib/rexml/encoding.rb +71 -0
  419. data/shoes/ruby/lib/rexml/encodings/CP-1252.rb +103 -0
  420. data/shoes/ruby/lib/rexml/encodings/EUC-JP.rb +35 -0
  421. data/shoes/ruby/lib/rexml/encodings/ICONV.rb +22 -0
  422. data/shoes/ruby/lib/rexml/encodings/ISO-8859-1.rb +7 -0
  423. data/shoes/ruby/lib/rexml/encodings/ISO-8859-15.rb +72 -0
  424. data/shoes/ruby/lib/rexml/encodings/SHIFT-JIS.rb +37 -0
  425. data/shoes/ruby/lib/rexml/encodings/SHIFT_JIS.rb +1 -0
  426. data/shoes/ruby/lib/rexml/encodings/UNILE.rb +34 -0
  427. data/shoes/ruby/lib/rexml/encodings/US-ASCII.rb +30 -0
  428. data/shoes/ruby/lib/rexml/encodings/UTF-16.rb +35 -0
  429. data/shoes/ruby/lib/rexml/encodings/UTF-8.rb +18 -0
  430. data/shoes/ruby/lib/rexml/entity.rb +166 -0
  431. data/shoes/ruby/lib/rexml/formatters/default.rb +109 -0
  432. data/shoes/ruby/lib/rexml/formatters/pretty.rb +139 -0
  433. data/shoes/ruby/lib/rexml/formatters/transitive.rb +58 -0
  434. data/shoes/ruby/lib/rexml/functions.rb +388 -0
  435. data/shoes/ruby/lib/rexml/instruction.rb +70 -0
  436. data/shoes/ruby/lib/rexml/light/node.rb +196 -0
  437. data/shoes/ruby/lib/rexml/namespace.rb +47 -0
  438. data/shoes/ruby/lib/rexml/node.rb +75 -0
  439. data/shoes/ruby/lib/rexml/output.rb +24 -0
  440. data/shoes/ruby/lib/rexml/parent.rb +166 -0
  441. data/shoes/ruby/lib/rexml/parseexception.rb +51 -0
  442. data/shoes/ruby/lib/rexml/parsers/baseparser.rb +530 -0
  443. data/shoes/ruby/lib/rexml/parsers/lightparser.rb +58 -0
  444. data/shoes/ruby/lib/rexml/parsers/pullparser.rb +196 -0
  445. data/shoes/ruby/lib/rexml/parsers/sax2parser.rb +247 -0
  446. data/shoes/ruby/lib/rexml/parsers/streamparser.rb +46 -0
  447. data/shoes/ruby/lib/rexml/parsers/treeparser.rb +100 -0
  448. data/shoes/ruby/lib/rexml/parsers/ultralightparser.rb +56 -0
  449. data/shoes/ruby/lib/rexml/parsers/xpathparser.rb +698 -0
  450. data/shoes/ruby/lib/rexml/quickpath.rb +263 -0
  451. data/shoes/ruby/lib/rexml/rexml.rb +31 -0
  452. data/shoes/ruby/lib/rexml/sax2listener.rb +97 -0
  453. data/shoes/ruby/lib/rexml/source.rb +258 -0
  454. data/shoes/ruby/lib/rexml/streamlistener.rb +92 -0
  455. data/shoes/ruby/lib/rexml/syncenumerator.rb +32 -0
  456. data/shoes/ruby/lib/rexml/text.rb +404 -0
  457. data/shoes/ruby/lib/rexml/undefinednamespaceexception.rb +8 -0
  458. data/shoes/ruby/lib/rexml/validation/relaxng.rb +559 -0
  459. data/shoes/ruby/lib/rexml/validation/validation.rb +155 -0
  460. data/shoes/ruby/lib/rexml/validation/validationexception.rb +9 -0
  461. data/shoes/ruby/lib/rexml/xmldecl.rb +119 -0
  462. data/shoes/ruby/lib/rexml/xmltokens.rb +18 -0
  463. data/shoes/ruby/lib/rexml/xpath.rb +77 -0
  464. data/shoes/ruby/lib/rexml/xpath_parser.rb +792 -0
  465. data/shoes/ruby/lib/rinda/rinda.rb +283 -0
  466. data/shoes/ruby/lib/rinda/ring.rb +271 -0
  467. data/shoes/ruby/lib/rinda/tuplespace.rb +642 -0
  468. data/shoes/ruby/lib/ripper/core.rb +70 -0
  469. data/shoes/ruby/lib/ripper/filter.rb +70 -0
  470. data/shoes/ruby/lib/ripper/lexer.rb +179 -0
  471. data/shoes/ruby/lib/ripper/sexp.rb +99 -0
  472. data/shoes/ruby/lib/ripper.rb +4 -0
  473. data/shoes/ruby/lib/rss/0.9.rb +427 -0
  474. data/shoes/ruby/lib/rss/1.0.rb +452 -0
  475. data/shoes/ruby/lib/rss/2.0.rb +111 -0
  476. data/shoes/ruby/lib/rss/atom.rb +748 -0
  477. data/shoes/ruby/lib/rss/content/1.0.rb +10 -0
  478. data/shoes/ruby/lib/rss/content/2.0.rb +12 -0
  479. data/shoes/ruby/lib/rss/content.rb +31 -0
  480. data/shoes/ruby/lib/rss/converter.rb +170 -0
  481. data/shoes/ruby/lib/rss/dublincore/1.0.rb +13 -0
  482. data/shoes/ruby/lib/rss/dublincore/2.0.rb +13 -0
  483. data/shoes/ruby/lib/rss/dublincore/atom.rb +17 -0
  484. data/shoes/ruby/lib/rss/dublincore.rb +161 -0
  485. data/shoes/ruby/lib/rss/image.rb +193 -0
  486. data/shoes/ruby/lib/rss/itunes.rb +410 -0
  487. data/shoes/ruby/lib/rss/maker/0.9.rb +467 -0
  488. data/shoes/ruby/lib/rss/maker/1.0.rb +434 -0
  489. data/shoes/ruby/lib/rss/maker/2.0.rb +223 -0
  490. data/shoes/ruby/lib/rss/maker/atom.rb +172 -0
  491. data/shoes/ruby/lib/rss/maker/base.rb +880 -0
  492. data/shoes/ruby/lib/rss/maker/content.rb +21 -0
  493. data/shoes/ruby/lib/rss/maker/dublincore.rb +124 -0
  494. data/shoes/ruby/lib/rss/maker/entry.rb +163 -0
  495. data/shoes/ruby/lib/rss/maker/feed.rb +430 -0
  496. data/shoes/ruby/lib/rss/maker/image.rb +111 -0
  497. data/shoes/ruby/lib/rss/maker/itunes.rb +242 -0
  498. data/shoes/ruby/lib/rss/maker/slash.rb +33 -0
  499. data/shoes/ruby/lib/rss/maker/syndication.rb +18 -0
  500. data/shoes/ruby/lib/rss/maker/taxonomy.rb +118 -0
  501. data/shoes/ruby/lib/rss/maker/trackback.rb +61 -0
  502. data/shoes/ruby/lib/rss/maker.rb +44 -0
  503. data/shoes/ruby/lib/rss/parser.rb +568 -0
  504. data/shoes/ruby/lib/rss/rexmlparser.rb +54 -0
  505. data/shoes/ruby/lib/rss/rss.rb +1313 -0
  506. data/shoes/ruby/lib/rss/slash.rb +49 -0
  507. data/shoes/ruby/lib/rss/syndication.rb +67 -0
  508. data/shoes/ruby/lib/rss/taxonomy.rb +145 -0
  509. data/shoes/ruby/lib/rss/trackback.rb +288 -0
  510. data/shoes/ruby/lib/rss/utils.rb +111 -0
  511. data/shoes/ruby/lib/rss/xml-stylesheet.rb +105 -0
  512. data/shoes/ruby/lib/rss/xml.rb +71 -0
  513. data/shoes/ruby/lib/rss/xmlparser.rb +93 -0
  514. data/shoes/ruby/lib/rss/xmlscanner.rb +121 -0
  515. data/shoes/ruby/lib/rss.rb +19 -0
  516. data/shoes/ruby/lib/rubygems/builder.rb +88 -0
  517. data/shoes/ruby/lib/rubygems/command.rb +406 -0
  518. data/shoes/ruby/lib/rubygems/command_manager.rb +146 -0
  519. data/shoes/ruby/lib/rubygems/commands/build_command.rb +53 -0
  520. data/shoes/ruby/lib/rubygems/commands/cert_command.rb +86 -0
  521. data/shoes/ruby/lib/rubygems/commands/check_command.rb +75 -0
  522. data/shoes/ruby/lib/rubygems/commands/cleanup_command.rb +91 -0
  523. data/shoes/ruby/lib/rubygems/commands/contents_command.rb +74 -0
  524. data/shoes/ruby/lib/rubygems/commands/dependency_command.rb +188 -0
  525. data/shoes/ruby/lib/rubygems/commands/environment_command.rb +128 -0
  526. data/shoes/ruby/lib/rubygems/commands/fetch_command.rb +62 -0
  527. data/shoes/ruby/lib/rubygems/commands/generate_index_command.rb +57 -0
  528. data/shoes/ruby/lib/rubygems/commands/help_command.rb +172 -0
  529. data/shoes/ruby/lib/rubygems/commands/install_command.rb +148 -0
  530. data/shoes/ruby/lib/rubygems/commands/list_command.rb +35 -0
  531. data/shoes/ruby/lib/rubygems/commands/lock_command.rb +110 -0
  532. data/shoes/ruby/lib/rubygems/commands/mirror_command.rb +111 -0
  533. data/shoes/ruby/lib/rubygems/commands/outdated_command.rb +33 -0
  534. data/shoes/ruby/lib/rubygems/commands/pristine_command.rb +93 -0
  535. data/shoes/ruby/lib/rubygems/commands/query_command.rb +233 -0
  536. data/shoes/ruby/lib/rubygems/commands/rdoc_command.rb +82 -0
  537. data/shoes/ruby/lib/rubygems/commands/search_command.rb +37 -0
  538. data/shoes/ruby/lib/rubygems/commands/server_command.rb +48 -0
  539. data/shoes/ruby/lib/rubygems/commands/sources_command.rb +152 -0
  540. data/shoes/ruby/lib/rubygems/commands/specification_command.rb +77 -0
  541. data/shoes/ruby/lib/rubygems/commands/stale_command.rb +27 -0
  542. data/shoes/ruby/lib/rubygems/commands/uninstall_command.rb +73 -0
  543. data/shoes/ruby/lib/rubygems/commands/unpack_command.rb +95 -0
  544. data/shoes/ruby/lib/rubygems/commands/update_command.rb +181 -0
  545. data/shoes/ruby/lib/rubygems/commands/which_command.rb +87 -0
  546. data/shoes/ruby/lib/rubygems/config_file.rb +266 -0
  547. data/shoes/ruby/lib/rubygems/custom_require.rb +46 -0
  548. data/shoes/ruby/lib/rubygems/defaults.rb +89 -0
  549. data/shoes/ruby/lib/rubygems/dependency.rb +119 -0
  550. data/shoes/ruby/lib/rubygems/dependency_installer.rb +258 -0
  551. data/shoes/ruby/lib/rubygems/dependency_list.rb +165 -0
  552. data/shoes/ruby/lib/rubygems/digest/digest_adapter.rb +40 -0
  553. data/shoes/ruby/lib/rubygems/digest/md5.rb +23 -0
  554. data/shoes/ruby/lib/rubygems/digest/sha1.rb +17 -0
  555. data/shoes/ruby/lib/rubygems/digest/sha2.rb +17 -0
  556. data/shoes/ruby/lib/rubygems/doc_manager.rb +214 -0
  557. data/shoes/ruby/lib/rubygems/exceptions.rb +84 -0
  558. data/shoes/ruby/lib/rubygems/ext/builder.rb +56 -0
  559. data/shoes/ruby/lib/rubygems/ext/configure_builder.rb +24 -0
  560. data/shoes/ruby/lib/rubygems/ext/ext_conf_builder.rb +23 -0
  561. data/shoes/ruby/lib/rubygems/ext/rake_builder.rb +27 -0
  562. data/shoes/ruby/lib/rubygems/ext.rb +18 -0
  563. data/shoes/ruby/lib/rubygems/format.rb +87 -0
  564. data/shoes/ruby/lib/rubygems/gem_openssl.rb +83 -0
  565. data/shoes/ruby/lib/rubygems/gem_path_searcher.rb +100 -0
  566. data/shoes/ruby/lib/rubygems/gem_runner.rb +58 -0
  567. data/shoes/ruby/lib/rubygems/indexer/abstract_index_builder.rb +88 -0
  568. data/shoes/ruby/lib/rubygems/indexer/latest_index_builder.rb +35 -0
  569. data/shoes/ruby/lib/rubygems/indexer/marshal_index_builder.rb +17 -0
  570. data/shoes/ruby/lib/rubygems/indexer/master_index_builder.rb +54 -0
  571. data/shoes/ruby/lib/rubygems/indexer/quick_index_builder.rb +50 -0
  572. data/shoes/ruby/lib/rubygems/indexer.rb +370 -0
  573. data/shoes/ruby/lib/rubygems/install_update_options.rb +113 -0
  574. data/shoes/ruby/lib/rubygems/installer.rb +578 -0
  575. data/shoes/ruby/lib/rubygems/local_remote_options.rb +134 -0
  576. data/shoes/ruby/lib/rubygems/old_format.rb +148 -0
  577. data/shoes/ruby/lib/rubygems/package/f_sync_dir.rb +24 -0
  578. data/shoes/ruby/lib/rubygems/package/tar_header.rb +245 -0
  579. data/shoes/ruby/lib/rubygems/package/tar_input.rb +219 -0
  580. data/shoes/ruby/lib/rubygems/package/tar_output.rb +143 -0
  581. data/shoes/ruby/lib/rubygems/package/tar_reader/entry.rb +99 -0
  582. data/shoes/ruby/lib/rubygems/package/tar_reader.rb +86 -0
  583. data/shoes/ruby/lib/rubygems/package/tar_writer.rb +180 -0
  584. data/shoes/ruby/lib/rubygems/package.rb +95 -0
  585. data/shoes/ruby/lib/rubygems/platform.rb +178 -0
  586. data/shoes/ruby/lib/rubygems/remote_fetcher.rb +344 -0
  587. data/shoes/ruby/lib/rubygems/require_paths_builder.rb +15 -0
  588. data/shoes/ruby/lib/rubygems/requirement.rb +163 -0
  589. data/shoes/ruby/lib/rubygems/rubygems_version.rb +6 -0
  590. data/shoes/ruby/lib/rubygems/security.rb +786 -0
  591. data/shoes/ruby/lib/rubygems/server.rb +629 -0
  592. data/shoes/ruby/lib/rubygems/source_index.rb +559 -0
  593. data/shoes/ruby/lib/rubygems/source_info_cache.rb +393 -0
  594. data/shoes/ruby/lib/rubygems/source_info_cache_entry.rb +56 -0
  595. data/shoes/ruby/lib/rubygems/spec_fetcher.rb +249 -0
  596. data/shoes/ruby/lib/rubygems/specification.rb +1262 -0
  597. data/shoes/ruby/lib/rubygems/test_utilities.rb +131 -0
  598. data/shoes/ruby/lib/rubygems/timer.rb +25 -0
  599. data/shoes/ruby/lib/rubygems/uninstaller.rb +242 -0
  600. data/shoes/ruby/lib/rubygems/user_interaction.rb +360 -0
  601. data/shoes/ruby/lib/rubygems/validator.rb +208 -0
  602. data/shoes/ruby/lib/rubygems/version.rb +167 -0
  603. data/shoes/ruby/lib/rubygems/version_option.rb +48 -0
  604. data/shoes/ruby/lib/rubygems.rb +888 -0
  605. data/shoes/ruby/lib/scanf.rb +703 -0
  606. data/shoes/ruby/lib/securerandom.rb +182 -0
  607. data/shoes/ruby/lib/set.rb +1274 -0
  608. data/shoes/ruby/lib/shell/builtin-command.rb +160 -0
  609. data/shoes/ruby/lib/shell/command-processor.rb +593 -0
  610. data/shoes/ruby/lib/shell/error.rb +25 -0
  611. data/shoes/ruby/lib/shell/filter.rb +109 -0
  612. data/shoes/ruby/lib/shell/process-controller.rb +319 -0
  613. data/shoes/ruby/lib/shell/system-command.rb +159 -0
  614. data/shoes/ruby/lib/shell/version.rb +15 -0
  615. data/shoes/ruby/lib/shell.rb +300 -0
  616. data/shoes/ruby/lib/shellwords.rb +156 -0
  617. data/shoes/ruby/lib/singleton.rb +313 -0
  618. data/shoes/ruby/lib/sync.rb +307 -0
  619. data/shoes/ruby/lib/tempfile.rb +218 -0
  620. data/shoes/ruby/lib/test/unit/assertions.rb +122 -0
  621. data/shoes/ruby/lib/test/unit/testcase.rb +12 -0
  622. data/shoes/ruby/lib/test/unit.rb +66 -0
  623. data/shoes/ruby/lib/thread.rb +367 -0
  624. data/shoes/ruby/lib/thwait.rb +168 -0
  625. data/shoes/ruby/lib/time.rb +869 -0
  626. data/shoes/ruby/lib/timeout.rb +108 -0
  627. data/shoes/ruby/lib/tmpdir.rb +138 -0
  628. data/shoes/ruby/lib/tracer.rb +166 -0
  629. data/shoes/ruby/lib/tsort.rb +290 -0
  630. data/shoes/ruby/lib/ubygems.rb +10 -0
  631. data/shoes/ruby/lib/un.rb +304 -0
  632. data/shoes/ruby/lib/uri/common.rb +727 -0
  633. data/shoes/ruby/lib/uri/ftp.rb +198 -0
  634. data/shoes/ruby/lib/uri/generic.rb +1128 -0
  635. data/shoes/ruby/lib/uri/http.rb +100 -0
  636. data/shoes/ruby/lib/uri/https.rb +20 -0
  637. data/shoes/ruby/lib/uri/ldap.rb +190 -0
  638. data/shoes/ruby/lib/uri/ldaps.rb +12 -0
  639. data/shoes/ruby/lib/uri/mailto.rb +266 -0
  640. data/shoes/ruby/lib/uri.rb +29 -0
  641. data/shoes/ruby/lib/weakref.rb +80 -0
  642. data/shoes/ruby/lib/webrick/accesslog.rb +75 -0
  643. data/shoes/ruby/lib/webrick/cgi.rb +260 -0
  644. data/shoes/ruby/lib/webrick/compat.rb +15 -0
  645. data/shoes/ruby/lib/webrick/config.rb +100 -0
  646. data/shoes/ruby/lib/webrick/cookie.rb +110 -0
  647. data/shoes/ruby/lib/webrick/htmlutils.rb +25 -0
  648. data/shoes/ruby/lib/webrick/httpauth/authenticator.rb +79 -0
  649. data/shoes/ruby/lib/webrick/httpauth/basicauth.rb +65 -0
  650. data/shoes/ruby/lib/webrick/httpauth/digestauth.rb +344 -0
  651. data/shoes/ruby/lib/webrick/httpauth/htdigest.rb +91 -0
  652. data/shoes/ruby/lib/webrick/httpauth/htgroup.rb +61 -0
  653. data/shoes/ruby/lib/webrick/httpauth/htpasswd.rb +83 -0
  654. data/shoes/ruby/lib/webrick/httpauth/userdb.rb +29 -0
  655. data/shoes/ruby/lib/webrick/httpauth.rb +45 -0
  656. data/shoes/ruby/lib/webrick/httpproxy.rb +288 -0
  657. data/shoes/ruby/lib/webrick/httprequest.rb +402 -0
  658. data/shoes/ruby/lib/webrick/httpresponse.rb +326 -0
  659. data/shoes/ruby/lib/webrick/https.rb +63 -0
  660. data/shoes/ruby/lib/webrick/httpserver.rb +217 -0
  661. data/shoes/ruby/lib/webrick/httpservlet/abstract.rb +70 -0
  662. data/shoes/ruby/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  663. data/shoes/ruby/lib/webrick/httpservlet/cgihandler.rb +110 -0
  664. data/shoes/ruby/lib/webrick/httpservlet/erbhandler.rb +54 -0
  665. data/shoes/ruby/lib/webrick/httpservlet/filehandler.rb +435 -0
  666. data/shoes/ruby/lib/webrick/httpservlet/prochandler.rb +33 -0
  667. data/shoes/ruby/lib/webrick/httpservlet.rb +22 -0
  668. data/shoes/ruby/lib/webrick/httpstatus.rb +132 -0
  669. data/shoes/ruby/lib/webrick/httputils.rb +392 -0
  670. data/shoes/ruby/lib/webrick/httpversion.rb +49 -0
  671. data/shoes/ruby/lib/webrick/log.rb +88 -0
  672. data/shoes/ruby/lib/webrick/server.rb +210 -0
  673. data/shoes/ruby/lib/webrick/ssl.rb +126 -0
  674. data/shoes/ruby/lib/webrick/utils.rb +175 -0
  675. data/shoes/ruby/lib/webrick/version.rb +13 -0
  676. data/shoes/ruby/lib/webrick.rb +29 -0
  677. data/shoes/ruby/lib/win32/registry.rb +832 -0
  678. data/shoes/ruby/lib/win32/resolv.rb +370 -0
  679. data/shoes/ruby/lib/win32/sspi.rb +330 -0
  680. data/shoes/ruby/lib/win32ole/property.rb +16 -0
  681. data/shoes/ruby/lib/xmlrpc/base64.rb +81 -0
  682. data/shoes/ruby/lib/xmlrpc/client.rb +625 -0
  683. data/shoes/ruby/lib/xmlrpc/config.rb +40 -0
  684. data/shoes/ruby/lib/xmlrpc/create.rb +290 -0
  685. data/shoes/ruby/lib/xmlrpc/datetime.rb +142 -0
  686. data/shoes/ruby/lib/xmlrpc/httpserver.rb +178 -0
  687. data/shoes/ruby/lib/xmlrpc/marshal.rb +76 -0
  688. data/shoes/ruby/lib/xmlrpc/parser.rb +813 -0
  689. data/shoes/ruby/lib/xmlrpc/server.rb +778 -0
  690. data/shoes/ruby/lib/xmlrpc/utils.rb +165 -0
  691. data/shoes/ruby/lib/yaml/baseemitter.rb +242 -0
  692. data/shoes/ruby/lib/yaml/basenode.rb +216 -0
  693. data/shoes/ruby/lib/yaml/constants.rb +45 -0
  694. data/shoes/ruby/lib/yaml/dbm.rb +111 -0
  695. data/shoes/ruby/lib/yaml/encoding.rb +33 -0
  696. data/shoes/ruby/lib/yaml/error.rb +34 -0
  697. data/shoes/ruby/lib/yaml/loader.rb +14 -0
  698. data/shoes/ruby/lib/yaml/rubytypes.rb +446 -0
  699. data/shoes/ruby/lib/yaml/store.rb +43 -0
  700. data/shoes/ruby/lib/yaml/stream.rb +40 -0
  701. data/shoes/ruby/lib/yaml/stringio.rb +83 -0
  702. data/shoes/ruby/lib/yaml/syck.rb +19 -0
  703. data/shoes/ruby/lib/yaml/tag.rb +91 -0
  704. data/shoes/ruby/lib/yaml/types.rb +192 -0
  705. data/shoes/ruby/lib/yaml/yamlnode.rb +54 -0
  706. data/shoes/ruby/lib/yaml/ypath.rb +52 -0
  707. data/shoes/ruby/lib/yaml.rb +440 -0
  708. data/shoes/samples/class-book.rb +43 -0
  709. data/shoes/samples/class-book.yaml +387 -0
  710. data/shoes/samples/expert-definr.rb +23 -0
  711. data/shoes/samples/expert-funnies.rb +51 -0
  712. data/shoes/samples/expert-irb.rb +112 -0
  713. data/shoes/samples/expert-minesweeper.rb +267 -0
  714. data/shoes/samples/expert-othello.rb +319 -0
  715. data/shoes/samples/expert-pong.rb +62 -0
  716. data/shoes/samples/expert-tankspank.rb +385 -0
  717. data/shoes/samples/good-arc.rb +37 -0
  718. data/shoes/samples/good-clock.rb +51 -0
  719. data/shoes/samples/good-follow.rb +26 -0
  720. data/shoes/samples/good-reminder.rb +174 -0
  721. data/shoes/samples/good-vjot.rb +56 -0
  722. data/shoes/samples/simple-accordion.rb +75 -0
  723. data/shoes/samples/simple-anim-shapes.rb +17 -0
  724. data/shoes/samples/simple-anim-text.rb +13 -0
  725. data/shoes/samples/simple-arc.rb +23 -0
  726. data/shoes/samples/simple-bounce.rb +24 -0
  727. data/shoes/samples/simple-calc.rb +70 -0
  728. data/shoes/samples/simple-control-sizes.rb +24 -0
  729. data/shoes/samples/simple-curve.rb +26 -0
  730. data/shoes/samples/simple-dialogs.rb +29 -0
  731. data/shoes/samples/simple-downloader.rb +27 -0
  732. data/shoes/samples/simple-draw.rb +13 -0
  733. data/shoes/samples/simple-editor.rb +28 -0
  734. data/shoes/samples/simple-form.rb +28 -0
  735. data/shoes/samples/simple-form.shy +0 -0
  736. data/shoes/samples/simple-mask.rb +21 -0
  737. data/shoes/samples/simple-menu.rb +31 -0
  738. data/shoes/samples/simple-menu1.rb +35 -0
  739. data/shoes/samples/simple-rubygems.rb +29 -0
  740. data/shoes/samples/simple-slide.rb +45 -0
  741. data/shoes/samples/simple-sphere.rb +28 -0
  742. data/shoes/samples/simple-timer.rb +13 -0
  743. data/shoes/samples/simple-video.rb +13 -0
  744. data/shoes/shoes +21 -0
  745. data/shoes/shoes.exe +0 -0
  746. data/shoes/shoes.exe.manifest +17 -0
  747. data/shoes/sqlite3.dll +0 -0
  748. data/shoes/static/Shoes.icns +0 -0
  749. data/shoes/static/Thumbs.db +0 -0
  750. data/shoes/static/app-icon.png +0 -0
  751. data/shoes/static/avatar.png +0 -0
  752. data/shoes/static/code_highlighter.js +188 -0
  753. data/shoes/static/code_highlighter_ruby.js +26 -0
  754. data/shoes/static/icon-debug.png +0 -0
  755. data/shoes/static/icon-error.png +0 -0
  756. data/shoes/static/icon-info.png +0 -0
  757. data/shoes/static/icon-warn.png +0 -0
  758. data/shoes/static/listbox_button1.png +0 -0
  759. data/shoes/static/listbox_button2.png +0 -0
  760. data/shoes/static/man-app.png +0 -0
  761. data/shoes/static/man-builds.png +0 -0
  762. data/shoes/static/man-editor-notepad.png +0 -0
  763. data/shoes/static/man-editor-osx.png +0 -0
  764. data/shoes/static/man-ele-background.png +0 -0
  765. data/shoes/static/man-ele-border.png +0 -0
  766. data/shoes/static/man-ele-button.png +0 -0
  767. data/shoes/static/man-ele-check.png +0 -0
  768. data/shoes/static/man-ele-editbox.png +0 -0
  769. data/shoes/static/man-ele-editline.png +0 -0
  770. data/shoes/static/man-ele-image.png +0 -0
  771. data/shoes/static/man-ele-listbox.png +0 -0
  772. data/shoes/static/man-ele-progress.png +0 -0
  773. data/shoes/static/man-ele-radio.png +0 -0
  774. data/shoes/static/man-ele-shape.png +0 -0
  775. data/shoes/static/man-ele-textblock.png +0 -0
  776. data/shoes/static/man-ele-video.png +0 -0
  777. data/shoes/static/man-intro-dmg.png +0 -0
  778. data/shoes/static/man-intro-exe.png +0 -0
  779. data/shoes/static/man-look-tiger.png +0 -0
  780. data/shoes/static/man-look-ubuntu.png +0 -0
  781. data/shoes/static/man-look-vista.png +0 -0
  782. data/shoes/static/man-run-osx.png +0 -0
  783. data/shoes/static/man-run-vista.png +0 -0
  784. data/shoes/static/man-run-xp.png +0 -0
  785. data/shoes/static/man-shot1.png +0 -0
  786. data/shoes/static/manual-en.txt +2783 -0
  787. data/shoes/static/manual-ja.txt +2780 -0
  788. data/shoes/static/manual.css +167 -0
  789. data/shoes/static/menu-corner1.png +0 -0
  790. data/shoes/static/menu-corner2.png +0 -0
  791. data/shoes/static/menu-gray.png +0 -0
  792. data/shoes/static/menu-left.png +0 -0
  793. data/shoes/static/menu-right.png +0 -0
  794. data/shoes/static/menu-top.png +0 -0
  795. data/shoes/static/shoes-dmg.jpg +0 -0
  796. data/shoes/static/shoes-icon-blue.png +0 -0
  797. data/shoes/static/shoes-icon.png +0 -0
  798. data/shoes/static/shoes-manual-apps.gif +0 -0
  799. data/shoes/static/stripe.png +0 -0
  800. data/shoes/static/stubs/blank.exe +0 -0
  801. data/shoes/static/stubs/blank.hfz +0 -0
  802. data/shoes/static/stubs/blank.run +375 -0
  803. data/shoes/static/stubs/cocoa-install +0 -0
  804. data/shoes/static/stubs/sh-install +48 -0
  805. data/shoes/static/tutor-back.png +0 -0
  806. data/shoes/zlib.dll +0 -0
  807. data/shoes/zlib1.dll +0 -0
  808. metadata +887 -0
@@ -0,0 +1,2465 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #--
4
+
5
+ # Copyright (c) 2003, 2004, 2005, 2006, 2007 Jim Weirich
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"), to
9
+ # deal in the Software without restriction, including without limitation the
10
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11
+ # sell copies of the Software, and to permit persons to whom the Software is
12
+ # furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included in
15
+ # all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23
+ # IN THE SOFTWARE.
24
+ #++
25
+ #
26
+ # = Rake -- Ruby Make
27
+ #
28
+ # This is the main file for the Rake application. Normally it is referenced
29
+ # as a library via a require statement, but it can be distributed
30
+ # independently as an application.
31
+
32
+ RAKEVERSION = '0.8.3'
33
+
34
+ require 'rbconfig'
35
+ require 'fileutils'
36
+ require 'singleton'
37
+ require 'monitor'
38
+ require 'optparse'
39
+ require 'ostruct'
40
+
41
+ require 'rake/win32'
42
+
43
+ ######################################################################
44
+ # Rake extensions to Module.
45
+ #
46
+ class Module
47
+ # Check for an existing method in the current class before extending. IF
48
+ # the method already exists, then a warning is printed and the extension is
49
+ # not added. Otherwise the block is yielded and any definitions in the
50
+ # block will take effect.
51
+ #
52
+ # Usage:
53
+ #
54
+ # class String
55
+ # rake_extension("xyz") do
56
+ # def xyz
57
+ # ...
58
+ # end
59
+ # end
60
+ # end
61
+ #
62
+ def rake_extension(method)
63
+ if method_defined?(method)
64
+ $stderr.puts "WARNING: Possible conflict with Rake extension: #{self}##{method} already exists"
65
+ else
66
+ yield
67
+ end
68
+ end
69
+ end # module Module
70
+
71
+
72
+ ######################################################################
73
+ # User defined methods to be added to String.
74
+ #
75
+ class String
76
+ rake_extension("ext") do
77
+ # Replace the file extension with +newext+. If there is no extenson on
78
+ # the string, append the new extension to the end. If the new extension
79
+ # is not given, or is the empty string, remove any existing extension.
80
+ #
81
+ # +ext+ is a user added method for the String class.
82
+ def ext(newext='')
83
+ return self.dup if ['.', '..'].include? self
84
+ if newext != ''
85
+ newext = (newext =~ /^\./) ? newext : ("." + newext)
86
+ end
87
+ self.chomp(File.extname(self)) << newext
88
+ end
89
+ end
90
+
91
+ rake_extension("pathmap") do
92
+ # Explode a path into individual components. Used by +pathmap+.
93
+ def pathmap_explode
94
+ head, tail = File.split(self)
95
+ return [self] if head == self
96
+ return [tail] if head == '.' || tail == '/'
97
+ return [head, tail] if head == '/'
98
+ return head.pathmap_explode + [tail]
99
+ end
100
+ protected :pathmap_explode
101
+
102
+ # Extract a partial path from the path. Include +n+ directories from the
103
+ # front end (left hand side) if +n+ is positive. Include |+n+|
104
+ # directories from the back end (right hand side) if +n+ is negative.
105
+ def pathmap_partial(n)
106
+ dirs = File.dirname(self).pathmap_explode
107
+ partial_dirs =
108
+ if n > 0
109
+ dirs[0...n]
110
+ elsif n < 0
111
+ dirs.reverse[0...-n].reverse
112
+ else
113
+ "."
114
+ end
115
+ File.join(partial_dirs)
116
+ end
117
+ protected :pathmap_partial
118
+
119
+ # Preform the pathmap replacement operations on the given path. The
120
+ # patterns take the form 'pat1,rep1;pat2,rep2...'.
121
+ def pathmap_replace(patterns, &block)
122
+ result = self
123
+ patterns.split(';').each do |pair|
124
+ pattern, replacement = pair.split(',')
125
+ pattern = Regexp.new(pattern)
126
+ if replacement == '*' && block_given?
127
+ result = result.sub(pattern, &block)
128
+ elsif replacement
129
+ result = result.sub(pattern, replacement)
130
+ else
131
+ result = result.sub(pattern, '')
132
+ end
133
+ end
134
+ result
135
+ end
136
+ protected :pathmap_replace
137
+
138
+ # Map the path according to the given specification. The specification
139
+ # controls the details of the mapping. The following special patterns are
140
+ # recognized:
141
+ #
142
+ # * <b>%p</b> -- The complete path.
143
+ # * <b>%f</b> -- The base file name of the path, with its file extension,
144
+ # but without any directories.
145
+ # * <b>%n</b> -- The file name of the path without its file extension.
146
+ # * <b>%d</b> -- The directory list of the path.
147
+ # * <b>%x</b> -- The file extension of the path. An empty string if there
148
+ # is no extension.
149
+ # * <b>%X</b> -- Everything *but* the file extension.
150
+ # * <b>%s</b> -- The alternate file separater if defined, otherwise use
151
+ # the standard file separator.
152
+ # * <b>%%</b> -- A percent sign.
153
+ #
154
+ # The %d specifier can also have a numeric prefix (e.g. '%2d'). If the
155
+ # number is positive, only return (up to) +n+ directories in the path,
156
+ # starting from the left hand side. If +n+ is negative, return (up to)
157
+ # |+n+| directories from the right hand side of the path.
158
+ #
159
+ # Examples:
160
+ #
161
+ # 'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b'
162
+ # 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d'
163
+ #
164
+ # Also the %d, %p, %f, %n, %x, and %X operators can take a
165
+ # pattern/replacement argument to perform simple string substititions on a
166
+ # particular part of the path. The pattern and replacement are speparated
167
+ # by a comma and are enclosed by curly braces. The replacement spec comes
168
+ # after the % character but before the operator letter. (e.g.
169
+ # "%{old,new}d"). Muliple replacement specs should be separated by
170
+ # semi-colons (e.g. "%{old,new;src,bin}d").
171
+ #
172
+ # Regular expressions may be used for the pattern, and back refs may be
173
+ # used in the replacement text. Curly braces, commas and semi-colons are
174
+ # excluded from both the pattern and replacement text (let's keep parsing
175
+ # reasonable).
176
+ #
177
+ # For example:
178
+ #
179
+ # "src/org/onestepback/proj/A.java".pathmap("%{^src,bin}X.class")
180
+ #
181
+ # returns:
182
+ #
183
+ # "bin/org/onestepback/proj/A.class"
184
+ #
185
+ # If the replacement text is '*', then a block may be provided to perform
186
+ # some arbitrary calculation for the replacement.
187
+ #
188
+ # For example:
189
+ #
190
+ # "/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext|
191
+ # ext.downcase
192
+ # }
193
+ #
194
+ # Returns:
195
+ #
196
+ # "/path/to/file.txt"
197
+ #
198
+ def pathmap(spec=nil, &block)
199
+ return self if spec.nil?
200
+ result = ''
201
+ spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag|
202
+ case frag
203
+ when '%f'
204
+ result << File.basename(self)
205
+ when '%n'
206
+ result << File.basename(self, '.*')
207
+ when '%d'
208
+ result << File.dirname(self)
209
+ when '%x'
210
+ result << File.extname(self)
211
+ when '%X'
212
+ result << self.ext
213
+ when '%p'
214
+ result << self
215
+ when '%s'
216
+ result << (File::ALT_SEPARATOR || File::SEPARATOR)
217
+ when '%-'
218
+ # do nothing
219
+ when '%%'
220
+ result << "%"
221
+ when /%(-?\d+)d/
222
+ result << pathmap_partial($1.to_i)
223
+ when /^%\{([^}]*)\}(\d*[dpfnxX])/
224
+ patterns, operator = $1, $2
225
+ result << pathmap('%' + operator).pathmap_replace(patterns, &block)
226
+ when /^%/
227
+ fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'"
228
+ else
229
+ result << frag
230
+ end
231
+ end
232
+ result
233
+ end
234
+ end
235
+ end # class String
236
+
237
+ ##############################################################################
238
+ module Rake
239
+
240
+ # Errors -----------------------------------------------------------
241
+
242
+ # Error indicating an ill-formed task declaration.
243
+ class TaskArgumentError < ArgumentError
244
+ end
245
+
246
+ # Error indicating a recursion overflow error in task selection.
247
+ class RuleRecursionOverflowError < StandardError
248
+ def initialize(*args)
249
+ super
250
+ @targets = []
251
+ end
252
+
253
+ def add_target(target)
254
+ @targets << target
255
+ end
256
+
257
+ def message
258
+ super + ": [" + @targets.reverse.join(' => ') + "]"
259
+ end
260
+ end
261
+
262
+ # --------------------------------------------------------------------------
263
+ # Rake module singleton methods.
264
+ #
265
+ class << self
266
+ # Current Rake Application
267
+ def application
268
+ @application ||= Rake::Application.new
269
+ end
270
+
271
+ # Set the current Rake application object.
272
+ def application=(app)
273
+ @application = app
274
+ end
275
+
276
+ # Return the original directory where the Rake application was started.
277
+ def original_dir
278
+ application.original_dir
279
+ end
280
+
281
+ end
282
+
283
+ # ##########################################################################
284
+ # Mixin for creating easily cloned objects.
285
+ #
286
+ module Cloneable
287
+ # Clone an object by making a new object and setting all the instance
288
+ # variables to the same values.
289
+ def dup
290
+ sibling = self.class.new
291
+ instance_variables.each do |ivar|
292
+ value = self.instance_variable_get(ivar)
293
+ new_value = value.clone rescue value
294
+ sibling.instance_variable_set(ivar, new_value)
295
+ end
296
+ sibling.taint if tainted?
297
+ sibling
298
+ end
299
+
300
+ def clone
301
+ sibling = dup
302
+ sibling.freeze if frozen?
303
+ sibling
304
+ end
305
+ end
306
+
307
+ ####################################################################
308
+ # TaskAguments manage the arguments passed to a task.
309
+ #
310
+ class TaskArguments
311
+ include Enumerable
312
+
313
+ attr_reader :names
314
+
315
+ # Create a TaskArgument object with a list of named arguments
316
+ # (given by :names) and a set of associated values (given by
317
+ # :values). :parent is the parent argument object.
318
+ def initialize(names, values, parent=nil)
319
+ @names = names
320
+ @parent = parent
321
+ @hash = {}
322
+ names.each_with_index { |name, i|
323
+ @hash[name.to_sym] = values[i] unless values[i].nil?
324
+ }
325
+ end
326
+
327
+ # Create a new argument scope using the prerequisite argument
328
+ # names.
329
+ def new_scope(names)
330
+ values = names.collect { |n| self[n] }
331
+ self.class.new(names, values, self)
332
+ end
333
+
334
+ # Find an argument value by name or index.
335
+ def [](index)
336
+ lookup(index.to_sym)
337
+ end
338
+
339
+ # Specify a hash of default values for task arguments. Use the
340
+ # defaults only if there is no specific value for the given
341
+ # argument.
342
+ def with_defaults(defaults)
343
+ @hash = defaults.merge(@hash)
344
+ end
345
+
346
+ def each(&block)
347
+ @hash.each(&block)
348
+ end
349
+
350
+ def method_missing(sym, *args, &block)
351
+ lookup(sym.to_sym)
352
+ end
353
+
354
+ def to_hash
355
+ @hash
356
+ end
357
+
358
+ def to_s
359
+ @hash.inspect
360
+ end
361
+
362
+ def inspect
363
+ to_s
364
+ end
365
+
366
+ protected
367
+
368
+ def lookup(name)
369
+ if @hash.has_key?(name)
370
+ @hash[name]
371
+ elsif ENV.has_key?(name.to_s)
372
+ ENV[name.to_s]
373
+ elsif ENV.has_key?(name.to_s.upcase)
374
+ ENV[name.to_s.upcase]
375
+ elsif @parent
376
+ @parent.lookup(name)
377
+ end
378
+ end
379
+ end
380
+
381
+ EMPTY_TASK_ARGS = TaskArguments.new([], [])
382
+
383
+ ####################################################################
384
+ # InvocationChain tracks the chain of task invocations to detect
385
+ # circular dependencies.
386
+ class InvocationChain
387
+ def initialize(value, tail)
388
+ @value = value
389
+ @tail = tail
390
+ end
391
+
392
+ def member?(obj)
393
+ @value == obj || @tail.member?(obj)
394
+ end
395
+
396
+ def append(value)
397
+ if member?(value)
398
+ fail RuntimeError, "Circular dependency detected: #{to_s} => #{value}"
399
+ end
400
+ self.class.new(value, self)
401
+ end
402
+
403
+ def to_s
404
+ "#{prefix}#{@value}"
405
+ end
406
+
407
+ def self.append(value, chain)
408
+ chain.append(value)
409
+ end
410
+
411
+ private
412
+
413
+ def prefix
414
+ "#{@tail.to_s} => "
415
+ end
416
+
417
+ class EmptyInvocationChain
418
+ def member?(obj)
419
+ false
420
+ end
421
+ def append(value)
422
+ InvocationChain.new(value, self)
423
+ end
424
+ def to_s
425
+ "TOP"
426
+ end
427
+ end
428
+
429
+ EMPTY = EmptyInvocationChain.new
430
+
431
+ end # class InvocationChain
432
+
433
+ end # module Rake
434
+
435
+ module Rake
436
+
437
+ # #########################################################################
438
+ # A Task is the basic unit of work in a Rakefile. Tasks have associated
439
+ # actions (possibly more than one) and a list of prerequisites. When
440
+ # invoked, a task will first ensure that all of its prerequisites have an
441
+ # opportunity to run and then it will execute its own actions.
442
+ #
443
+ # Tasks are not usually created directly using the new method, but rather
444
+ # use the +file+ and +task+ convenience methods.
445
+ #
446
+ class Task
447
+ # List of prerequisites for a task.
448
+ attr_reader :prerequisites
449
+
450
+ # List of actions attached to a task.
451
+ attr_reader :actions
452
+
453
+ # Application owning this task.
454
+ attr_accessor :application
455
+
456
+ # Comment for this task. Restricted to a single line of no more than 50
457
+ # characters.
458
+ attr_reader :comment
459
+
460
+ # Full text of the (possibly multi-line) comment.
461
+ attr_reader :full_comment
462
+
463
+ # Array of nested namespaces names used for task lookup by this task.
464
+ attr_reader :scope
465
+
466
+ # Return task name
467
+ def to_s
468
+ name
469
+ end
470
+
471
+ def inspect
472
+ "<#{self.class} #{name} => [#{prerequisites.join(', ')}]>"
473
+ end
474
+
475
+ # List of sources for task.
476
+ attr_writer :sources
477
+ def sources
478
+ @sources ||= []
479
+ end
480
+
481
+ # First source from a rule (nil if no sources)
482
+ def source
483
+ @sources.first if defined?(@sources)
484
+ end
485
+
486
+ # Create a task named +task_name+ with no actions or prerequisites. Use
487
+ # +enhance+ to add actions and prerequisites.
488
+ def initialize(task_name, app)
489
+ @name = task_name.to_s
490
+ @prerequisites = []
491
+ @actions = []
492
+ @already_invoked = false
493
+ @full_comment = nil
494
+ @comment = nil
495
+ @lock = Monitor.new
496
+ @application = app
497
+ @scope = app.current_scope
498
+ @arg_names = nil
499
+ end
500
+
501
+ # Enhance a task with prerequisites or actions. Returns self.
502
+ def enhance(deps=nil, &block)
503
+ @prerequisites |= deps if deps
504
+ @actions << block if block_given?
505
+ self
506
+ end
507
+
508
+ # Name of the task, including any namespace qualifiers.
509
+ def name
510
+ @name.to_s
511
+ end
512
+
513
+ # Name of task with argument list description.
514
+ def name_with_args # :nodoc:
515
+ if arg_description
516
+ "#{name}#{arg_description}"
517
+ else
518
+ name
519
+ end
520
+ end
521
+
522
+ # Argument description (nil if none).
523
+ def arg_description # :nodoc:
524
+ @arg_names ? "[#{(arg_names || []).join(',')}]" : nil
525
+ end
526
+
527
+ # Name of arguments for this task.
528
+ def arg_names
529
+ @arg_names || []
530
+ end
531
+
532
+ # Reenable the task, allowing its tasks to be executed if the task
533
+ # is invoked again.
534
+ def reenable
535
+ @already_invoked = false
536
+ end
537
+
538
+ # Clear the existing prerequisites and actions of a rake task.
539
+ def clear
540
+ clear_prerequisites
541
+ clear_actions
542
+ self
543
+ end
544
+
545
+ # Clear the existing prerequisites of a rake task.
546
+ def clear_prerequisites
547
+ prerequisites.clear
548
+ self
549
+ end
550
+
551
+ # Clear the existing actions on a rake task.
552
+ def clear_actions
553
+ actions.clear
554
+ self
555
+ end
556
+
557
+ # Invoke the task if it is needed. Prerequites are invoked first.
558
+ def invoke(*args)
559
+ task_args = TaskArguments.new(arg_names, args)
560
+ invoke_with_call_chain(task_args, InvocationChain::EMPTY)
561
+ end
562
+
563
+ # Same as invoke, but explicitly pass a call chain to detect
564
+ # circular dependencies.
565
+ def invoke_with_call_chain(task_args, invocation_chain) # :nodoc:
566
+ new_chain = InvocationChain.append(self, invocation_chain)
567
+ @lock.synchronize do
568
+ if application.options.trace
569
+ puts "** Invoke #{name} #{format_trace_flags}"
570
+ end
571
+ return if @already_invoked
572
+ @already_invoked = true
573
+ invoke_prerequisites(task_args, new_chain)
574
+ execute(task_args) if needed?
575
+ end
576
+ end
577
+ protected :invoke_with_call_chain
578
+
579
+ # Invoke all the prerequisites of a task.
580
+ def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
581
+ @prerequisites.each { |n|
582
+ prereq = application[n, @scope]
583
+ prereq_args = task_args.new_scope(prereq.arg_names)
584
+ prereq.invoke_with_call_chain(prereq_args, invocation_chain)
585
+ }
586
+ end
587
+
588
+ # Format the trace flags for display.
589
+ def format_trace_flags
590
+ flags = []
591
+ flags << "first_time" unless @already_invoked
592
+ flags << "not_needed" unless needed?
593
+ flags.empty? ? "" : "(" + flags.join(", ") + ")"
594
+ end
595
+ private :format_trace_flags
596
+
597
+ # Execute the actions associated with this task.
598
+ def execute(args=nil)
599
+ args ||= EMPTY_TASK_ARGS
600
+ if application.options.dryrun
601
+ puts "** Execute (dry run) #{name}"
602
+ return
603
+ end
604
+ if application.options.trace
605
+ puts "** Execute #{name}"
606
+ end
607
+ application.enhance_with_matching_rule(name) if @actions.empty?
608
+ @actions.each do |act|
609
+ case act.arity
610
+ when 1
611
+ act.call(self)
612
+ else
613
+ act.call(self, args)
614
+ end
615
+ end
616
+ end
617
+
618
+ # Is this task needed?
619
+ def needed?
620
+ true
621
+ end
622
+
623
+ # Timestamp for this task. Basic tasks return the current time for their
624
+ # time stamp. Other tasks can be more sophisticated.
625
+ def timestamp
626
+ @prerequisites.collect { |p| application[p].timestamp }.max || Time.now
627
+ end
628
+
629
+ # Add a description to the task. The description can consist of an option
630
+ # argument list (enclosed brackets) and an optional comment.
631
+ def add_description(description)
632
+ return if ! description
633
+ comment = description.strip
634
+ add_comment(comment) if comment && ! comment.empty?
635
+ end
636
+
637
+ # Writing to the comment attribute is the same as adding a description.
638
+ def comment=(description)
639
+ add_description(description)
640
+ end
641
+
642
+ # Add a comment to the task. If a comment alread exists, separate
643
+ # the new comment with " / ".
644
+ def add_comment(comment)
645
+ if @full_comment
646
+ @full_comment << " / "
647
+ else
648
+ @full_comment = ''
649
+ end
650
+ @full_comment << comment
651
+ if @full_comment =~ /\A([^.]+?\.)( |$)/
652
+ @comment = $1
653
+ else
654
+ @comment = @full_comment
655
+ end
656
+ end
657
+ private :add_comment
658
+
659
+ # Set the names of the arguments for this task. +args+ should be
660
+ # an array of symbols, one for each argument name.
661
+ def set_arg_names(args)
662
+ @arg_names = args.map { |a| a.to_sym }
663
+ end
664
+
665
+ # Return a string describing the internal state of a task. Useful for
666
+ # debugging.
667
+ def investigation
668
+ result = "------------------------------\n"
669
+ result << "Investigating #{name}\n"
670
+ result << "class: #{self.class}\n"
671
+ result << "task needed: #{needed?}\n"
672
+ result << "timestamp: #{timestamp}\n"
673
+ result << "pre-requisites: \n"
674
+ prereqs = @prerequisites.collect {|name| application[name]}
675
+ prereqs.sort! {|a,b| a.timestamp <=> b.timestamp}
676
+ prereqs.each do |p|
677
+ result << "--#{p.name} (#{p.timestamp})\n"
678
+ end
679
+ latest_prereq = @prerequisites.collect{|n| application[n].timestamp}.max
680
+ result << "latest-prerequisite time: #{latest_prereq}\n"
681
+ result << "................................\n\n"
682
+ return result
683
+ end
684
+
685
+ # ----------------------------------------------------------------
686
+ # Rake Module Methods
687
+ #
688
+ class << self
689
+
690
+ # Clear the task list. This cause rake to immediately forget all the
691
+ # tasks that have been assigned. (Normally used in the unit tests.)
692
+ def clear
693
+ Rake.application.clear
694
+ end
695
+
696
+ # List of all defined tasks.
697
+ def tasks
698
+ Rake.application.tasks
699
+ end
700
+
701
+ # Return a task with the given name. If the task is not currently
702
+ # known, try to synthesize one from the defined rules. If no rules are
703
+ # found, but an existing file matches the task name, assume it is a file
704
+ # task with no dependencies or actions.
705
+ def [](task_name)
706
+ Rake.application[task_name]
707
+ end
708
+
709
+ # TRUE if the task name is already defined.
710
+ def task_defined?(task_name)
711
+ Rake.application.lookup(task_name) != nil
712
+ end
713
+
714
+ # Define a task given +args+ and an option block. If a rule with the
715
+ # given name already exists, the prerequisites and actions are added to
716
+ # the existing task. Returns the defined task.
717
+ def define_task(*args, &block)
718
+ Rake.application.define_task(self, *args, &block)
719
+ end
720
+
721
+ # Define a rule for synthesizing tasks.
722
+ def create_rule(*args, &block)
723
+ Rake.application.create_rule(*args, &block)
724
+ end
725
+
726
+ # Apply the scope to the task name according to the rules for
727
+ # this kind of task. Generic tasks will accept the scope as
728
+ # part of the name.
729
+ def scope_name(scope, task_name)
730
+ (scope + [task_name]).join(':')
731
+ end
732
+
733
+ end # class << Rake::Task
734
+ end # class Rake::Task
735
+
736
+
737
+ # #########################################################################
738
+ # A FileTask is a task that includes time based dependencies. If any of a
739
+ # FileTask's prerequisites have a timestamp that is later than the file
740
+ # represented by this task, then the file must be rebuilt (using the
741
+ # supplied actions).
742
+ #
743
+ class FileTask < Task
744
+
745
+ # Is this file task needed? Yes if it doesn't exist, or if its time stamp
746
+ # is out of date.
747
+ def needed?
748
+ return true unless File.exist?(name)
749
+ return true if out_of_date?(timestamp)
750
+ false
751
+ end
752
+
753
+ # Time stamp for file task.
754
+ def timestamp
755
+ if File.exist?(name)
756
+ File.mtime(name.to_s)
757
+ else
758
+ Rake::EARLY
759
+ end
760
+ end
761
+
762
+ private
763
+
764
+ # Are there any prerequisites with a later time than the given time stamp?
765
+ def out_of_date?(stamp)
766
+ @prerequisites.any? { |n| application[n].timestamp > stamp}
767
+ end
768
+
769
+ # ----------------------------------------------------------------
770
+ # Task class methods.
771
+ #
772
+ class << self
773
+ # Apply the scope to the task name according to the rules for this kind
774
+ # of task. File based tasks ignore the scope when creating the name.
775
+ def scope_name(scope, task_name)
776
+ task_name
777
+ end
778
+ end
779
+ end # class Rake::FileTask
780
+
781
+ # #########################################################################
782
+ # A FileCreationTask is a file task that when used as a dependency will be
783
+ # needed if and only if the file has not been created. Once created, it is
784
+ # not re-triggered if any of its dependencies are newer, nor does trigger
785
+ # any rebuilds of tasks that depend on it whenever it is updated.
786
+ #
787
+ class FileCreationTask < FileTask
788
+ # Is this file task needed? Yes if it doesn't exist.
789
+ def needed?
790
+ ! File.exist?(name)
791
+ end
792
+
793
+ # Time stamp for file creation task. This time stamp is earlier
794
+ # than any other time stamp.
795
+ def timestamp
796
+ Rake::EARLY
797
+ end
798
+ end
799
+
800
+ # #########################################################################
801
+ # Same as a regular task, but the immediate prerequisites are done in
802
+ # parallel using Ruby threads.
803
+ #
804
+ class MultiTask < Task
805
+ private
806
+ def invoke_prerequisites(args, invocation_chain)
807
+ threads = @prerequisites.collect { |p|
808
+ Thread.new(p) { |r| application[r].invoke_with_call_chain(args, invocation_chain) }
809
+ }
810
+ threads.each { |t| t.join }
811
+ end
812
+ end
813
+ end # module Rake
814
+
815
+ # ###########################################################################
816
+ # Task Definition Functions ...
817
+
818
+ # Declare a basic task.
819
+ #
820
+ # Example:
821
+ # task :clobber => [:clean] do
822
+ # rm_rf "html"
823
+ # end
824
+ #
825
+ def task(*args, &block)
826
+ Rake::Task.define_task(*args, &block)
827
+ end
828
+
829
+
830
+ # Declare a file task.
831
+ #
832
+ # Example:
833
+ # file "config.cfg" => ["config.template"] do
834
+ # open("config.cfg", "w") do |outfile|
835
+ # open("config.template") do |infile|
836
+ # while line = infile.gets
837
+ # outfile.puts line
838
+ # end
839
+ # end
840
+ # end
841
+ # end
842
+ #
843
+ def file(*args, &block)
844
+ Rake::FileTask.define_task(*args, &block)
845
+ end
846
+
847
+ # Declare a file creation task.
848
+ # (Mainly used for the directory command).
849
+ def file_create(args, &block)
850
+ Rake::FileCreationTask.define_task(args, &block)
851
+ end
852
+
853
+ # Declare a set of files tasks to create the given directories on demand.
854
+ #
855
+ # Example:
856
+ # directory "testdata/doc"
857
+ #
858
+ def directory(dir)
859
+ Rake.each_dir_parent(dir) do |d|
860
+ file_create d do |t|
861
+ mkdir_p t.name if ! File.exist?(t.name)
862
+ end
863
+ end
864
+ end
865
+
866
+ # Declare a task that performs its prerequisites in parallel. Multitasks does
867
+ # *not* guarantee that its prerequisites will execute in any given order
868
+ # (which is obvious when you think about it)
869
+ #
870
+ # Example:
871
+ # multitask :deploy => [:deploy_gem, :deploy_rdoc]
872
+ #
873
+ def multitask(args, &block)
874
+ Rake::MultiTask.define_task(args, &block)
875
+ end
876
+
877
+ # Create a new rake namespace and use it for evaluating the given block.
878
+ # Returns a NameSpace object that can be used to lookup tasks defined in the
879
+ # namespace.
880
+ #
881
+ # E.g.
882
+ #
883
+ # ns = namespace "nested" do
884
+ # task :run
885
+ # end
886
+ # task_run = ns[:run] # find :run in the given namespace.
887
+ #
888
+ def namespace(name=nil, &block)
889
+ Rake.application.in_namespace(name, &block)
890
+ end
891
+
892
+ # Declare a rule for auto-tasks.
893
+ #
894
+ # Example:
895
+ # rule '.o' => '.c' do |t|
896
+ # sh %{cc -o #{t.name} #{t.source}}
897
+ # end
898
+ #
899
+ def rule(*args, &block)
900
+ Rake::Task.create_rule(*args, &block)
901
+ end
902
+
903
+ # Describe the next rake task.
904
+ #
905
+ # Example:
906
+ # desc "Run the Unit Tests"
907
+ # task :test => [:build]
908
+ # runtests
909
+ # end
910
+ #
911
+ def desc(description)
912
+ Rake.application.last_description = description
913
+ end
914
+
915
+ # Import the partial Rakefiles +fn+. Imported files are loaded _after_ the
916
+ # current file is completely loaded. This allows the import statement to
917
+ # appear anywhere in the importing file, and yet allowing the imported files
918
+ # to depend on objects defined in the importing file.
919
+ #
920
+ # A common use of the import statement is to include files containing
921
+ # dependency declarations.
922
+ #
923
+ # See also the --rakelibdir command line option.
924
+ #
925
+ # Example:
926
+ # import ".depend", "my_rules"
927
+ #
928
+ def import(*fns)
929
+ fns.each do |fn|
930
+ Rake.application.add_import(fn)
931
+ end
932
+ end
933
+
934
+ # ###########################################################################
935
+ # This a FileUtils extension that defines several additional commands to be
936
+ # added to the FileUtils utility functions.
937
+ #
938
+ module FileUtils
939
+ RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']).
940
+ sub(/.*\s.*/m, '"\&"')
941
+
942
+ OPT_TABLE['sh'] = %w(noop verbose)
943
+ OPT_TABLE['ruby'] = %w(noop verbose)
944
+
945
+ # Run the system command +cmd+. If multiple arguments are given the command
946
+ # is not run with the shell (same semantics as Kernel::exec and
947
+ # Kernel::system).
948
+ #
949
+ # Example:
950
+ # sh %{ls -ltr}
951
+ #
952
+ # sh 'ls', 'file with spaces'
953
+ #
954
+ # # check exit status after command runs
955
+ # sh %{grep pattern file} do |ok, res|
956
+ # if ! ok
957
+ # puts "pattern not found (status = #{res.exitstatus})"
958
+ # end
959
+ # end
960
+ #
961
+ def sh(*cmd, &block)
962
+ options = (Hash === cmd.last) ? cmd.pop : {}
963
+ unless block_given?
964
+ show_command = cmd.join(" ")
965
+ show_command = show_command[0,42] + "..."
966
+ # TODO code application logic heref show_command.length > 45
967
+ block = lambda { |ok, status|
968
+ ok or fail "Command failed with status (#{status.exitstatus}): [#{show_command}]"
969
+ }
970
+ end
971
+ if RakeFileUtils.verbose_flag == :default
972
+ options[:verbose] = false
973
+ else
974
+ options[:verbose] ||= RakeFileUtils.verbose_flag
975
+ end
976
+ options[:noop] ||= RakeFileUtils.nowrite_flag
977
+ rake_check_options options, :noop, :verbose
978
+ rake_output_message cmd.join(" ") if options[:verbose]
979
+ unless options[:noop]
980
+ res = rake_system(*cmd)
981
+ block.call(res, $?)
982
+ end
983
+ end
984
+
985
+ def rake_system(*cmd)
986
+ system(*cmd)
987
+ end
988
+ private :rake_system
989
+
990
+ # Run a Ruby interpreter with the given arguments.
991
+ #
992
+ # Example:
993
+ # ruby %{-pe '$_.upcase!' <README}
994
+ #
995
+ def ruby(*args,&block)
996
+ options = (Hash === args.last) ? args.pop : {}
997
+ if args.length > 1 then
998
+ sh(*([RUBY] + args + [options]), &block)
999
+ else
1000
+ sh("#{RUBY} #{args.first}", options, &block)
1001
+ end
1002
+ end
1003
+
1004
+ LN_SUPPORTED = [true]
1005
+
1006
+ # Attempt to do a normal file link, but fall back to a copy if the link
1007
+ # fails.
1008
+ def safe_ln(*args)
1009
+ unless LN_SUPPORTED[0]
1010
+ cp(*args)
1011
+ else
1012
+ begin
1013
+ ln(*args)
1014
+ rescue StandardError, NotImplementedError => ex
1015
+ LN_SUPPORTED[0] = false
1016
+ cp(*args)
1017
+ end
1018
+ end
1019
+ end
1020
+
1021
+ # Split a file path into individual directory names.
1022
+ #
1023
+ # Example:
1024
+ # split_all("a/b/c") => ['a', 'b', 'c']
1025
+ #
1026
+ def split_all(path)
1027
+ head, tail = File.split(path)
1028
+ return [tail] if head == '.' || tail == '/'
1029
+ return [head, tail] if head == '/'
1030
+ return split_all(head) + [tail]
1031
+ end
1032
+ end
1033
+
1034
+ # ###########################################################################
1035
+ # RakeFileUtils provides a custom version of the FileUtils methods that
1036
+ # respond to the <tt>verbose</tt> and <tt>nowrite</tt> commands.
1037
+ #
1038
+ module RakeFileUtils
1039
+ include FileUtils
1040
+
1041
+ class << self
1042
+ attr_accessor :verbose_flag, :nowrite_flag
1043
+ end
1044
+ RakeFileUtils.verbose_flag = :default
1045
+ RakeFileUtils.nowrite_flag = false
1046
+
1047
+ $fileutils_verbose = true
1048
+ $fileutils_nowrite = false
1049
+
1050
+ FileUtils::OPT_TABLE.each do |name, opts|
1051
+ default_options = []
1052
+ if opts.include?(:verbose) || opts.include?("verbose")
1053
+ default_options << ':verbose => RakeFileUtils.verbose_flag'
1054
+ end
1055
+ if opts.include?(:noop) || opts.include?("noop")
1056
+ default_options << ':noop => RakeFileUtils.nowrite_flag'
1057
+ end
1058
+
1059
+ next if default_options.empty?
1060
+ module_eval(<<-EOS, __FILE__, __LINE__ + 1)
1061
+ def #{name}( *args, &block )
1062
+ super(
1063
+ *rake_merge_option(args,
1064
+ #{default_options.join(', ')}
1065
+ ), &block)
1066
+ end
1067
+ EOS
1068
+ end
1069
+
1070
+ # Get/set the verbose flag controlling output from the FileUtils utilities.
1071
+ # If verbose is true, then the utility method is echoed to standard output.
1072
+ #
1073
+ # Examples:
1074
+ # verbose # return the current value of the verbose flag
1075
+ # verbose(v) # set the verbose flag to _v_.
1076
+ # verbose(v) { code } # Execute code with the verbose flag set temporarily to _v_.
1077
+ # # Return to the original value when code is done.
1078
+ def verbose(value=nil)
1079
+ oldvalue = RakeFileUtils.verbose_flag
1080
+ RakeFileUtils.verbose_flag = value unless value.nil?
1081
+ if block_given?
1082
+ begin
1083
+ yield
1084
+ ensure
1085
+ RakeFileUtils.verbose_flag = oldvalue
1086
+ end
1087
+ end
1088
+ RakeFileUtils.verbose_flag
1089
+ end
1090
+
1091
+ # Get/set the nowrite flag controlling output from the FileUtils utilities.
1092
+ # If verbose is true, then the utility method is echoed to standard output.
1093
+ #
1094
+ # Examples:
1095
+ # nowrite # return the current value of the nowrite flag
1096
+ # nowrite(v) # set the nowrite flag to _v_.
1097
+ # nowrite(v) { code } # Execute code with the nowrite flag set temporarily to _v_.
1098
+ # # Return to the original value when code is done.
1099
+ def nowrite(value=nil)
1100
+ oldvalue = RakeFileUtils.nowrite_flag
1101
+ RakeFileUtils.nowrite_flag = value unless value.nil?
1102
+ if block_given?
1103
+ begin
1104
+ yield
1105
+ ensure
1106
+ RakeFileUtils.nowrite_flag = oldvalue
1107
+ end
1108
+ end
1109
+ oldvalue
1110
+ end
1111
+
1112
+ # Use this function to prevent protentially destructive ruby code from
1113
+ # running when the :nowrite flag is set.
1114
+ #
1115
+ # Example:
1116
+ #
1117
+ # when_writing("Building Project") do
1118
+ # project.build
1119
+ # end
1120
+ #
1121
+ # The following code will build the project under normal conditions. If the
1122
+ # nowrite(true) flag is set, then the example will print:
1123
+ # DRYRUN: Building Project
1124
+ # instead of actually building the project.
1125
+ #
1126
+ def when_writing(msg=nil)
1127
+ if RakeFileUtils.nowrite_flag
1128
+ puts "DRYRUN: #{msg}" if msg
1129
+ else
1130
+ yield
1131
+ end
1132
+ end
1133
+
1134
+ # Merge the given options with the default values.
1135
+ def rake_merge_option(args, defaults)
1136
+ if Hash === args.last
1137
+ defaults.update(args.last)
1138
+ args.pop
1139
+ end
1140
+ args.push defaults
1141
+ args
1142
+ end
1143
+ private :rake_merge_option
1144
+
1145
+ # Send the message to the default rake output (which is $stderr).
1146
+ def rake_output_message(message)
1147
+ $stderr.puts(message)
1148
+ end
1149
+ private :rake_output_message
1150
+
1151
+ # Check that the options do not contain options not listed in +optdecl+. An
1152
+ # ArgumentError exception is thrown if non-declared options are found.
1153
+ def rake_check_options(options, *optdecl)
1154
+ h = options.dup
1155
+ optdecl.each do |name|
1156
+ h.delete name
1157
+ end
1158
+ raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless h.empty?
1159
+ end
1160
+ private :rake_check_options
1161
+
1162
+ extend self
1163
+ end
1164
+
1165
+ # ###########################################################################
1166
+ # Include the FileUtils file manipulation functions in the top level module,
1167
+ # but mark them private so that they don't unintentionally define methods on
1168
+ # other objects.
1169
+
1170
+ include RakeFileUtils
1171
+ private(*FileUtils.instance_methods(false))
1172
+ private(*RakeFileUtils.instance_methods(false))
1173
+
1174
+ ######################################################################
1175
+ module Rake
1176
+
1177
+ # #########################################################################
1178
+ # A FileList is essentially an array with a few helper methods defined to
1179
+ # make file manipulation a bit easier.
1180
+ #
1181
+ # FileLists are lazy. When given a list of glob patterns for possible files
1182
+ # to be included in the file list, instead of searching the file structures
1183
+ # to find the files, a FileList holds the pattern for latter use.
1184
+ #
1185
+ # This allows us to define a number of FileList to match any number of
1186
+ # files, but only search out the actual files when then FileList itself is
1187
+ # actually used. The key is that the first time an element of the
1188
+ # FileList/Array is requested, the pending patterns are resolved into a real
1189
+ # list of file names.
1190
+ #
1191
+ class FileList
1192
+
1193
+ include Cloneable
1194
+
1195
+ # == Method Delegation
1196
+ #
1197
+ # The lazy evaluation magic of FileLists happens by implementing all the
1198
+ # array specific methods to call +resolve+ before delegating the heavy
1199
+ # lifting to an embedded array object (@items).
1200
+ #
1201
+ # In addition, there are two kinds of delegation calls. The regular kind
1202
+ # delegates to the @items array and returns the result directly. Well,
1203
+ # almost directly. It checks if the returned value is the @items object
1204
+ # itself, and if so will return the FileList object instead.
1205
+ #
1206
+ # The second kind of delegation call is used in methods that normally
1207
+ # return a new Array object. We want to capture the return value of these
1208
+ # methods and wrap them in a new FileList object. We enumerate these
1209
+ # methods in the +SPECIAL_RETURN+ list below.
1210
+
1211
+ # List of array methods (that are not in +Object+) that need to be
1212
+ # delegated.
1213
+ ARRAY_METHODS = (Array.instance_methods - Object.instance_methods).map { |n| n.to_s }
1214
+
1215
+ # List of additional methods that must be delegated.
1216
+ MUST_DEFINE = %w[to_a inspect]
1217
+
1218
+ # List of methods that should not be delegated here (we define special
1219
+ # versions of them explicitly below).
1220
+ MUST_NOT_DEFINE = %w[to_a to_ary partition *]
1221
+
1222
+ # List of delegated methods that return new array values which need
1223
+ # wrapping.
1224
+ SPECIAL_RETURN = %w[
1225
+ map collect sort sort_by select find_all reject grep
1226
+ compact flatten uniq values_at
1227
+ + - & |
1228
+ ]
1229
+
1230
+ DELEGATING_METHODS = (ARRAY_METHODS + MUST_DEFINE - MUST_NOT_DEFINE).collect{ |s| s.to_s }.sort.uniq
1231
+
1232
+ # Now do the delegation.
1233
+ DELEGATING_METHODS.each_with_index do |sym, i|
1234
+ if SPECIAL_RETURN.include?(sym)
1235
+ ln = __LINE__+1
1236
+ class_eval %{
1237
+ def #{sym}(*args, &block)
1238
+ resolve
1239
+ result = @items.send(:#{sym}, *args, &block)
1240
+ FileList.new.import(result)
1241
+ end
1242
+ }, __FILE__, ln
1243
+ else
1244
+ ln = __LINE__+1
1245
+ class_eval %{
1246
+ def #{sym}(*args, &block)
1247
+ resolve
1248
+ result = @items.send(:#{sym}, *args, &block)
1249
+ result.object_id == @items.object_id ? self : result
1250
+ end
1251
+ }, __FILE__, ln
1252
+ end
1253
+ end
1254
+
1255
+ # Create a file list from the globbable patterns given. If you wish to
1256
+ # perform multiple includes or excludes at object build time, use the
1257
+ # "yield self" pattern.
1258
+ #
1259
+ # Example:
1260
+ # file_list = FileList.new('lib/**/*.rb', 'test/test*.rb')
1261
+ #
1262
+ # pkg_files = FileList.new('lib/**/*') do |fl|
1263
+ # fl.exclude(/\bCVS\b/)
1264
+ # end
1265
+ #
1266
+ def initialize(*patterns)
1267
+ @pending_add = []
1268
+ @pending = false
1269
+ @exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
1270
+ @exclude_procs = DEFAULT_IGNORE_PROCS.dup
1271
+ @exclude_re = nil
1272
+ @items = []
1273
+ patterns.each { |pattern| include(pattern) }
1274
+ yield self if block_given?
1275
+ end
1276
+
1277
+ # Add file names defined by glob patterns to the file list. If an array
1278
+ # is given, add each element of the array.
1279
+ #
1280
+ # Example:
1281
+ # file_list.include("*.java", "*.cfg")
1282
+ # file_list.include %w( math.c lib.h *.o )
1283
+ #
1284
+ def include(*filenames)
1285
+ # TODO: check for pending
1286
+ filenames.each do |fn|
1287
+ if fn.respond_to? :to_ary
1288
+ include(*fn.to_ary)
1289
+ else
1290
+ @pending_add << fn
1291
+ end
1292
+ end
1293
+ @pending = true
1294
+ self
1295
+ end
1296
+ alias :add :include
1297
+
1298
+ # Register a list of file name patterns that should be excluded from the
1299
+ # list. Patterns may be regular expressions, glob patterns or regular
1300
+ # strings. In addition, a block given to exclude will remove entries that
1301
+ # return true when given to the block.
1302
+ #
1303
+ # Note that glob patterns are expanded against the file system. If a file
1304
+ # is explicitly added to a file list, but does not exist in the file
1305
+ # system, then an glob pattern in the exclude list will not exclude the
1306
+ # file.
1307
+ #
1308
+ # Examples:
1309
+ # FileList['a.c', 'b.c'].exclude("a.c") => ['b.c']
1310
+ # FileList['a.c', 'b.c'].exclude(/^a/) => ['b.c']
1311
+ #
1312
+ # If "a.c" is a file, then ...
1313
+ # FileList['a.c', 'b.c'].exclude("a.*") => ['b.c']
1314
+ #
1315
+ # If "a.c" is not a file, then ...
1316
+ # FileList['a.c', 'b.c'].exclude("a.*") => ['a.c', 'b.c']
1317
+ #
1318
+ def exclude(*patterns, &block)
1319
+ patterns.each do |pat|
1320
+ @exclude_patterns << pat
1321
+ end
1322
+ if block_given?
1323
+ @exclude_procs << block
1324
+ end
1325
+ resolve_exclude if ! @pending
1326
+ self
1327
+ end
1328
+
1329
+
1330
+ # Clear all the exclude patterns so that we exclude nothing.
1331
+ def clear_exclude
1332
+ @exclude_patterns = []
1333
+ @exclude_procs = []
1334
+ calculate_exclude_regexp if ! @pending
1335
+ self
1336
+ end
1337
+
1338
+ # Define equality.
1339
+ def ==(array)
1340
+ to_ary == array
1341
+ end
1342
+
1343
+ # Return the internal array object.
1344
+ def to_a
1345
+ resolve
1346
+ @items
1347
+ end
1348
+
1349
+ # Return the internal array object.
1350
+ def to_ary
1351
+ to_a
1352
+ end
1353
+
1354
+ # Lie about our class.
1355
+ def is_a?(klass)
1356
+ klass == Array || super(klass)
1357
+ end
1358
+ alias kind_of? is_a?
1359
+
1360
+ # Redefine * to return either a string or a new file list.
1361
+ def *(other)
1362
+ result = @items * other
1363
+ case result
1364
+ when Array
1365
+ FileList.new.import(result)
1366
+ else
1367
+ result
1368
+ end
1369
+ end
1370
+
1371
+ # Resolve all the pending adds now.
1372
+ def resolve
1373
+ if @pending
1374
+ @pending = false
1375
+ @pending_add.each do |fn| resolve_add(fn) end
1376
+ @pending_add = []
1377
+ resolve_exclude
1378
+ end
1379
+ self
1380
+ end
1381
+
1382
+ def calculate_exclude_regexp
1383
+ ignores = []
1384
+ @exclude_patterns.each do |pat|
1385
+ case pat
1386
+ when Regexp
1387
+ ignores << pat
1388
+ when /[*?]/
1389
+ Dir[pat].each do |p| ignores << p end
1390
+ else
1391
+ ignores << Regexp.quote(pat)
1392
+ end
1393
+ end
1394
+ if ignores.empty?
1395
+ @exclude_re = /^$/
1396
+ else
1397
+ re_str = ignores.collect { |p| "(" + p.to_s + ")" }.join("|")
1398
+ @exclude_re = Regexp.new(re_str)
1399
+ end
1400
+ end
1401
+
1402
+ def resolve_add(fn)
1403
+ case fn
1404
+ when %r{[*?\[\{]}
1405
+ add_matching(fn)
1406
+ else
1407
+ self << fn
1408
+ end
1409
+ end
1410
+ private :resolve_add
1411
+
1412
+ def resolve_exclude
1413
+ calculate_exclude_regexp
1414
+ reject! { |fn| exclude?(fn) }
1415
+ self
1416
+ end
1417
+ private :resolve_exclude
1418
+
1419
+ # Return a new FileList with the results of running +sub+ against each
1420
+ # element of the oringal list.
1421
+ #
1422
+ # Example:
1423
+ # FileList['a.c', 'b.c'].sub(/\.c$/, '.o') => ['a.o', 'b.o']
1424
+ #
1425
+ def sub(pat, rep)
1426
+ inject(FileList.new) { |res, fn| res << fn.sub(pat,rep) }
1427
+ end
1428
+
1429
+ # Return a new FileList with the results of running +gsub+ against each
1430
+ # element of the original list.
1431
+ #
1432
+ # Example:
1433
+ # FileList['lib/test/file', 'x/y'].gsub(/\//, "\\")
1434
+ # => ['lib\\test\\file', 'x\\y']
1435
+ #
1436
+ def gsub(pat, rep)
1437
+ inject(FileList.new) { |res, fn| res << fn.gsub(pat,rep) }
1438
+ end
1439
+
1440
+ # Same as +sub+ except that the oringal file list is modified.
1441
+ def sub!(pat, rep)
1442
+ each_with_index { |fn, i| self[i] = fn.sub(pat,rep) }
1443
+ self
1444
+ end
1445
+
1446
+ # Same as +gsub+ except that the original file list is modified.
1447
+ def gsub!(pat, rep)
1448
+ each_with_index { |fn, i| self[i] = fn.gsub(pat,rep) }
1449
+ self
1450
+ end
1451
+
1452
+ # Apply the pathmap spec to each of the included file names, returning a
1453
+ # new file list with the modified paths. (See String#pathmap for
1454
+ # details.)
1455
+ def pathmap(spec=nil)
1456
+ collect { |fn| fn.pathmap(spec) }
1457
+ end
1458
+
1459
+ # Return a new array with <tt>String#ext</tt> method applied to each
1460
+ # member of the array.
1461
+ #
1462
+ # This method is a shortcut for:
1463
+ #
1464
+ # array.collect { |item| item.ext(newext) }
1465
+ #
1466
+ # +ext+ is a user added method for the Array class.
1467
+ def ext(newext='')
1468
+ collect { |fn| fn.ext(newext) }
1469
+ end
1470
+
1471
+
1472
+ # Grep each of the files in the filelist using the given pattern. If a
1473
+ # block is given, call the block on each matching line, passing the file
1474
+ # name, line number, and the matching line of text. If no block is given,
1475
+ # a standard emac style file:linenumber:line message will be printed to
1476
+ # standard out.
1477
+ def egrep(pattern, *opt)
1478
+ each do |fn|
1479
+ open(fn, "rb", *opt) do |inf|
1480
+ count = 0
1481
+ inf.each do |line|
1482
+ count += 1
1483
+ if pattern.match(line)
1484
+ if block_given?
1485
+ yield fn, count, line
1486
+ else
1487
+ puts "#{fn}:#{count}:#{line}"
1488
+ end
1489
+ end
1490
+ end
1491
+ end
1492
+ end
1493
+ end
1494
+
1495
+ # Return a new file list that only contains file names from the current
1496
+ # file list that exist on the file system.
1497
+ def existing
1498
+ select { |fn| File.exist?(fn) }
1499
+ end
1500
+
1501
+ # Modify the current file list so that it contains only file name that
1502
+ # exist on the file system.
1503
+ def existing!
1504
+ resolve
1505
+ @items = @items.select { |fn| File.exist?(fn) }
1506
+ self
1507
+ end
1508
+
1509
+ # FileList version of partition. Needed because the nested arrays should
1510
+ # be FileLists in this version.
1511
+ def partition(&block) # :nodoc:
1512
+ resolve
1513
+ result = @items.partition(&block)
1514
+ [
1515
+ FileList.new.import(result[0]),
1516
+ FileList.new.import(result[1]),
1517
+ ]
1518
+ end
1519
+
1520
+ # Convert a FileList to a string by joining all elements with a space.
1521
+ def to_s
1522
+ resolve
1523
+ self.join(' ')
1524
+ end
1525
+
1526
+ # Add matching glob patterns.
1527
+ def add_matching(pattern)
1528
+ Dir[pattern].each do |fn|
1529
+ self << fn unless exclude?(fn)
1530
+ end
1531
+ end
1532
+ private :add_matching
1533
+
1534
+ # Should the given file name be excluded?
1535
+ def exclude?(fn)
1536
+ calculate_exclude_regexp unless @exclude_re
1537
+ fn =~ @exclude_re || @exclude_procs.any? { |p| p.call(fn) }
1538
+ end
1539
+
1540
+ DEFAULT_IGNORE_PATTERNS = [
1541
+ /(^|[\/\\])CVS([\/\\]|$)/,
1542
+ /(^|[\/\\])\.svn([\/\\]|$)/,
1543
+ /\.bak$/,
1544
+ /~$/
1545
+ ]
1546
+ DEFAULT_IGNORE_PROCS = [
1547
+ proc { |fn| fn =~ /(^|[\/\\])core$/ && ! File.directory?(fn) }
1548
+ ]
1549
+ # @exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
1550
+
1551
+ def import(array)
1552
+ @items = array
1553
+ self
1554
+ end
1555
+
1556
+ class << self
1557
+ # Create a new file list including the files listed. Similar to:
1558
+ #
1559
+ # FileList.new(*args)
1560
+ def [](*args)
1561
+ new(*args)
1562
+ end
1563
+ end
1564
+ end # FileList
1565
+ end
1566
+
1567
+ module Rake
1568
+ class << self
1569
+
1570
+ # Yield each file or directory component.
1571
+ def each_dir_parent(dir) # :nodoc:
1572
+ old_length = nil
1573
+ while dir != '.' && dir.length != old_length
1574
+ yield(dir)
1575
+ old_length = dir.length
1576
+ dir = File.dirname(dir)
1577
+ end
1578
+ end
1579
+ end
1580
+ end # module Rake
1581
+
1582
+ # Alias FileList to be available at the top level.
1583
+ FileList = Rake::FileList
1584
+
1585
+ # ###########################################################################
1586
+ module Rake
1587
+
1588
+ # Default Rakefile loader used by +import+.
1589
+ class DefaultLoader
1590
+ def load(fn)
1591
+ Kernel.load(File.expand_path(fn))
1592
+ end
1593
+ end
1594
+
1595
+ # EarlyTime is a fake timestamp that occurs _before_ any other time value.
1596
+ class EarlyTime
1597
+ include Comparable
1598
+ include Singleton
1599
+
1600
+ def <=>(other)
1601
+ -1
1602
+ end
1603
+
1604
+ def to_s
1605
+ "<EARLY TIME>"
1606
+ end
1607
+ end
1608
+
1609
+ EARLY = EarlyTime.instance
1610
+ end # module Rake
1611
+
1612
+ # ###########################################################################
1613
+ # Extensions to time to allow comparisons with an early time class.
1614
+ #
1615
+ class Time
1616
+ alias rake_original_time_compare :<=>
1617
+ def <=>(other)
1618
+ if Rake::EarlyTime === other
1619
+ - other.<=>(self)
1620
+ else
1621
+ rake_original_time_compare(other)
1622
+ end
1623
+ end
1624
+ end # class Time
1625
+
1626
+ module Rake
1627
+
1628
+ ####################################################################
1629
+ # The NameSpace class will lookup task names in the the scope
1630
+ # defined by a +namespace+ command.
1631
+ #
1632
+ class NameSpace
1633
+
1634
+ # Create a namespace lookup object using the given task manager
1635
+ # and the list of scopes.
1636
+ def initialize(task_manager, scope_list)
1637
+ @task_manager = task_manager
1638
+ @scope = scope_list.dup
1639
+ end
1640
+
1641
+ # Lookup a task named +name+ in the namespace.
1642
+ def [](name)
1643
+ @task_manager.lookup(name, @scope)
1644
+ end
1645
+
1646
+ # Return the list of tasks defined in this namespace.
1647
+ def tasks
1648
+ @task_manager.tasks
1649
+ end
1650
+ end # NameSpace
1651
+
1652
+
1653
+ ####################################################################
1654
+ # The TaskManager module is a mixin for managing tasks.
1655
+ module TaskManager
1656
+ # Track the last comment made in the Rakefile.
1657
+ attr_accessor :last_description
1658
+ alias :last_comment :last_description # Backwards compatibility
1659
+
1660
+ def initialize
1661
+ super
1662
+ @tasks = Hash.new
1663
+ @rules = Array.new
1664
+ @scope = Array.new
1665
+ @last_description = nil
1666
+ end
1667
+
1668
+ def create_rule(*args, &block)
1669
+ pattern, arg_names, deps = resolve_args(args)
1670
+ pattern = Regexp.new(Regexp.quote(pattern) + '$') if String === pattern
1671
+ @rules << [pattern, deps, block]
1672
+ end
1673
+
1674
+ def define_task(task_class, *args, &block)
1675
+ task_name, arg_names, deps = resolve_args(args)
1676
+ task_name = task_class.scope_name(@scope, task_name)
1677
+ deps = [deps] unless deps.respond_to?(:to_ary)
1678
+ deps = deps.collect {|d| d.to_s }
1679
+ task = intern(task_class, task_name)
1680
+ task.set_arg_names(arg_names) unless arg_names.empty?
1681
+ task.add_description(@last_description)
1682
+ @last_description = nil
1683
+ task.enhance(deps, &block)
1684
+ task
1685
+ end
1686
+
1687
+ # Lookup a task. Return an existing task if found, otherwise
1688
+ # create a task of the current type.
1689
+ def intern(task_class, task_name)
1690
+ @tasks[task_name.to_s] ||= task_class.new(task_name, self)
1691
+ end
1692
+
1693
+ # Find a matching task for +task_name+.
1694
+ def [](task_name, scopes=nil)
1695
+ task_name = task_name.to_s
1696
+ self.lookup(task_name, scopes) or
1697
+ enhance_with_matching_rule(task_name) or
1698
+ synthesize_file_task(task_name) or
1699
+ fail "Don't know how to build task '#{task_name}'"
1700
+ end
1701
+
1702
+ def synthesize_file_task(task_name)
1703
+ return nil unless File.exist?(task_name)
1704
+ define_task(Rake::FileTask, task_name)
1705
+ end
1706
+
1707
+ # Resolve the arguments for a task/rule. Returns a triplet of
1708
+ # [task_name, arg_name_list, prerequisites].
1709
+ def resolve_args(args)
1710
+ if args.last.is_a?(Hash)
1711
+ deps = args.pop
1712
+ resolve_args_with_dependencies(args, deps)
1713
+ else
1714
+ resolve_args_without_dependencies(args)
1715
+ end
1716
+ end
1717
+
1718
+ # Resolve task arguments for a task or rule when there are no
1719
+ # dependencies declared.
1720
+ #
1721
+ # The patterns recognized by this argument resolving function are:
1722
+ #
1723
+ # task :t
1724
+ # task :t, [:a]
1725
+ # task :t, :a (deprecated)
1726
+ #
1727
+ def resolve_args_without_dependencies(args)
1728
+ task_name = args.shift
1729
+ if args.size == 1 && args.first.respond_to?(:to_ary)
1730
+ arg_names = args.first.to_ary
1731
+ else
1732
+ arg_names = args
1733
+ end
1734
+ [task_name, arg_names, []]
1735
+ end
1736
+ private :resolve_args_without_dependencies
1737
+
1738
+ # Resolve task arguments for a task or rule when there are
1739
+ # dependencies declared.
1740
+ #
1741
+ # The patterns recognized by this argument resolving function are:
1742
+ #
1743
+ # task :t => [:d]
1744
+ # task :t, [a] => [:d]
1745
+ # task :t, :needs => [:d] (deprecated)
1746
+ # task :t, :a, :needs => [:d] (deprecated)
1747
+ #
1748
+ def resolve_args_with_dependencies(args, hash) # :nodoc:
1749
+ fail "Task Argument Error" if hash.size != 1
1750
+ key, value = hash.map { |k, v| [k,v] }.first
1751
+ if args.empty?
1752
+ task_name = key
1753
+ arg_names = []
1754
+ deps = value
1755
+ elsif key == :needs
1756
+ task_name = args.shift
1757
+ arg_names = args
1758
+ deps = value
1759
+ else
1760
+ task_name = args.shift
1761
+ arg_names = key
1762
+ deps = value
1763
+ end
1764
+ deps = [deps] unless deps.respond_to?(:to_ary)
1765
+ [task_name, arg_names, deps]
1766
+ end
1767
+ private :resolve_args_with_dependencies
1768
+
1769
+ # If a rule can be found that matches the task name, enhance the
1770
+ # task with the prerequisites and actions from the rule. Set the
1771
+ # source attribute of the task appropriately for the rule. Return
1772
+ # the enhanced task or nil of no rule was found.
1773
+ def enhance_with_matching_rule(task_name, level=0)
1774
+ fail Rake::RuleRecursionOverflowError,
1775
+ "Rule Recursion Too Deep" if level >= 16
1776
+ @rules.each do |pattern, extensions, block|
1777
+ if md = pattern.match(task_name)
1778
+ task = attempt_rule(task_name, extensions, block, level)
1779
+ return task if task
1780
+ end
1781
+ end
1782
+ nil
1783
+ rescue Rake::RuleRecursionOverflowError => ex
1784
+ ex.add_target(task_name)
1785
+ fail ex
1786
+ end
1787
+
1788
+ # List of all defined tasks in this application.
1789
+ def tasks
1790
+ @tasks.values.sort_by { |t| t.name }
1791
+ end
1792
+
1793
+ # Clear all tasks in this application.
1794
+ def clear
1795
+ @tasks.clear
1796
+ @rules.clear
1797
+ end
1798
+
1799
+ # Lookup a task, using scope and the scope hints in the task name.
1800
+ # This method performs straight lookups without trying to
1801
+ # synthesize file tasks or rules. Special scope names (e.g. '^')
1802
+ # are recognized. If no scope argument is supplied, use the
1803
+ # current scope. Return nil if the task cannot be found.
1804
+ def lookup(task_name, initial_scope=nil)
1805
+ initial_scope ||= @scope
1806
+ task_name = task_name.to_s
1807
+ if task_name =~ /^rake:/
1808
+ scopes = []
1809
+ task_name = task_name.sub(/^rake:/, '')
1810
+ elsif task_name =~ /^(\^+)/
1811
+ scopes = initial_scope[0, initial_scope.size - $1.size]
1812
+ task_name = task_name.sub(/^(\^+)/, '')
1813
+ else
1814
+ scopes = initial_scope
1815
+ end
1816
+ lookup_in_scope(task_name, scopes)
1817
+ end
1818
+
1819
+ # Lookup the task name
1820
+ def lookup_in_scope(name, scope)
1821
+ n = scope.size
1822
+ while n >= 0
1823
+ tn = (scope[0,n] + [name]).join(':')
1824
+ task = @tasks[tn]
1825
+ return task if task
1826
+ n -= 1
1827
+ end
1828
+ nil
1829
+ end
1830
+ private :lookup_in_scope
1831
+
1832
+ # Return the list of scope names currently active in the task
1833
+ # manager.
1834
+ def current_scope
1835
+ @scope.dup
1836
+ end
1837
+
1838
+ # Evaluate the block in a nested namespace named +name+. Create
1839
+ # an anonymous namespace if +name+ is nil.
1840
+ def in_namespace(name)
1841
+ name ||= generate_name
1842
+ @scope.push(name)
1843
+ ns = NameSpace.new(self, @scope)
1844
+ yield(ns)
1845
+ ns
1846
+ ensure
1847
+ @scope.pop
1848
+ end
1849
+
1850
+ private
1851
+
1852
+ # Generate an anonymous namespace name.
1853
+ def generate_name
1854
+ @seed ||= 0
1855
+ @seed += 1
1856
+ "_anon_#{@seed}"
1857
+ end
1858
+
1859
+ def trace_rule(level, message)
1860
+ puts "#{" "*level}#{message}" if Rake.application.options.trace_rules
1861
+ end
1862
+
1863
+ # Attempt to create a rule given the list of prerequisites.
1864
+ def attempt_rule(task_name, extensions, block, level)
1865
+ sources = make_sources(task_name, extensions)
1866
+ prereqs = sources.collect { |source|
1867
+ trace_rule level, "Attempting Rule #{task_name} => #{source}"
1868
+ if File.exist?(source) || Rake::Task.task_defined?(source)
1869
+ trace_rule level, "(#{task_name} => #{source} ... EXIST)"
1870
+ source
1871
+ elsif parent = enhance_with_matching_rule(source, level+1)
1872
+ trace_rule level, "(#{task_name} => #{source} ... ENHANCE)"
1873
+ parent.name
1874
+ else
1875
+ trace_rule level, "(#{task_name} => #{source} ... FAIL)"
1876
+ return nil
1877
+ end
1878
+ }
1879
+ task = FileTask.define_task({task_name => prereqs}, &block)
1880
+ task.sources = prereqs
1881
+ task
1882
+ end
1883
+
1884
+ # Make a list of sources from the list of file name extensions /
1885
+ # translation procs.
1886
+ def make_sources(task_name, extensions)
1887
+ extensions.collect { |ext|
1888
+ case ext
1889
+ when /%/
1890
+ task_name.pathmap(ext)
1891
+ when %r{/}
1892
+ ext
1893
+ when /^\./
1894
+ task_name.ext(ext)
1895
+ when String
1896
+ ext
1897
+ when Proc
1898
+ if ext.arity == 1
1899
+ ext.call(task_name)
1900
+ else
1901
+ ext.call
1902
+ end
1903
+ else
1904
+ fail "Don't know how to handle rule dependent: #{ext.inspect}"
1905
+ end
1906
+ }.flatten
1907
+ end
1908
+
1909
+ end # TaskManager
1910
+
1911
+ ######################################################################
1912
+ # Rake main application object. When invoking +rake+ from the
1913
+ # command line, a Rake::Application object is created and run.
1914
+ #
1915
+ class Application
1916
+ include TaskManager
1917
+
1918
+ # The name of the application (typically 'rake')
1919
+ attr_reader :name
1920
+
1921
+ # The original directory where rake was invoked.
1922
+ attr_reader :original_dir
1923
+
1924
+ # Name of the actual rakefile used.
1925
+ attr_reader :rakefile
1926
+
1927
+ # List of the top level task names (task names from the command line).
1928
+ attr_reader :top_level_tasks
1929
+
1930
+ DEFAULT_RAKEFILES = ['rakefile', 'Rakefile', 'rakefile.rb', 'Rakefile.rb'].freeze
1931
+
1932
+ # Initialize a Rake::Application object.
1933
+ def initialize
1934
+ super
1935
+ @name = 'rake'
1936
+ @rakefiles = DEFAULT_RAKEFILES.dup
1937
+ @rakefile = nil
1938
+ @pending_imports = []
1939
+ @imported = []
1940
+ @loaders = {}
1941
+ @default_loader = Rake::DefaultLoader.new
1942
+ @original_dir = Dir.pwd
1943
+ @top_level_tasks = []
1944
+ add_loader('rb', DefaultLoader.new)
1945
+ add_loader('rf', DefaultLoader.new)
1946
+ add_loader('rake', DefaultLoader.new)
1947
+ @tty_output = STDOUT.tty?
1948
+ end
1949
+
1950
+ # Run the Rake application. The run method performs the following three steps:
1951
+ #
1952
+ # * Initialize the command line options (+init+).
1953
+ # * Define the tasks (+load_rakefile+).
1954
+ # * Run the top level tasks (+run_tasks+).
1955
+ #
1956
+ # If you wish to build a custom rake command, you should call +init+ on your
1957
+ # application. The define any tasks. Finally, call +top_level+ to run your top
1958
+ # level tasks.
1959
+ def run
1960
+ standard_exception_handling do
1961
+ init
1962
+ load_rakefile
1963
+ top_level
1964
+ end
1965
+ end
1966
+
1967
+ # Initialize the command line parameters and app name.
1968
+ def init(app_name='rake')
1969
+ standard_exception_handling do
1970
+ @name = app_name
1971
+ collect_tasks handle_options
1972
+ end
1973
+ end
1974
+
1975
+ # Find the rakefile and then load it and any pending imports.
1976
+ def load_rakefile
1977
+ standard_exception_handling do
1978
+ raw_load_rakefile
1979
+ end
1980
+ end
1981
+
1982
+ # Run the top level tasks of a Rake application.
1983
+ def top_level
1984
+ standard_exception_handling do
1985
+ if options.show_tasks
1986
+ display_tasks_and_comments
1987
+ elsif options.show_prereqs
1988
+ display_prerequisites
1989
+ else
1990
+ top_level_tasks.each { |task_name| invoke_task(task_name) }
1991
+ end
1992
+ end
1993
+ end
1994
+
1995
+ # Add a loader to handle imported files ending in the extension
1996
+ # +ext+.
1997
+ def add_loader(ext, loader)
1998
+ ext = ".#{ext}" unless ext =~ /^\./
1999
+ @loaders[ext] = loader
2000
+ end
2001
+
2002
+ # Application options from the command line
2003
+ def options
2004
+ @options ||= OpenStruct.new
2005
+ end
2006
+
2007
+ # private ----------------------------------------------------------------
2008
+
2009
+ def invoke_task(task_string)
2010
+ name, args = parse_task_string(task_string)
2011
+ t = self[name]
2012
+ t.invoke(*args)
2013
+ end
2014
+
2015
+ def parse_task_string(string)
2016
+ if string =~ /^([^\[]+)(\[(.*)\])$/
2017
+ name = $1
2018
+ args = $3.split(/\s*,\s*/)
2019
+ else
2020
+ name = string
2021
+ args = []
2022
+ end
2023
+ [name, args]
2024
+ end
2025
+
2026
+ # Provide standard execption handling for the given block.
2027
+ def standard_exception_handling
2028
+ begin
2029
+ yield
2030
+ rescue SystemExit => ex
2031
+ # Exit silently with current status
2032
+ raise
2033
+ rescue OptionParser::InvalidOption => ex
2034
+ # Exit silently
2035
+ exit(false)
2036
+ rescue Exception => ex
2037
+ # Exit with error message
2038
+ $stderr.puts "rake aborted!"
2039
+ $stderr.puts ex.message
2040
+ if options.trace
2041
+ $stderr.puts ex.backtrace.join("\n")
2042
+ else
2043
+ $stderr.puts ex.backtrace.find {|str| str =~ /#{@rakefile}/ } || ""
2044
+ $stderr.puts "(See full trace by running task with --trace)"
2045
+ end
2046
+ exit(false)
2047
+ end
2048
+ end
2049
+
2050
+ # True if one of the files in RAKEFILES is in the current directory.
2051
+ # If a match is found, it is copied into @rakefile.
2052
+ def have_rakefile
2053
+ @rakefiles.each do |fn|
2054
+ if File.exist?(fn) || fn == ''
2055
+ return fn
2056
+ end
2057
+ end
2058
+ return nil
2059
+ end
2060
+
2061
+ # True if we are outputting to TTY, false otherwise
2062
+ def tty_output?
2063
+ @tty_output
2064
+ end
2065
+
2066
+ # Override the detected TTY output state (mostly for testing)
2067
+ def tty_output=( tty_output_state )
2068
+ @tty_output = tty_output_state
2069
+ end
2070
+
2071
+ # We will truncate output if we are outputting to a TTY or if we've been
2072
+ # given an explicit column width to honor
2073
+ def truncate_output?
2074
+ tty_output? || ENV['RAKE_COLUMNS']
2075
+ end
2076
+
2077
+ # Display the tasks and dependencies.
2078
+ def display_tasks_and_comments
2079
+ displayable_tasks = tasks.select { |t|
2080
+ t.comment && t.name =~ options.show_task_pattern
2081
+ }
2082
+ if options.full_description
2083
+ displayable_tasks.each do |t|
2084
+ puts "rake #{t.name_with_args}"
2085
+ t.full_comment.split("\n").each do |line|
2086
+ puts " #{line}"
2087
+ end
2088
+ puts
2089
+ end
2090
+ else
2091
+ width = displayable_tasks.collect { |t| t.name_with_args.length }.max || 10
2092
+ max_column = truncate_output? ? terminal_width - name.size - width - 7 : nil
2093
+ displayable_tasks.each do |t|
2094
+ printf "#{name} %-#{width}s # %s\n",
2095
+ t.name_with_args, max_column ? truncate(t.comment, max_column) : t.comment
2096
+ end
2097
+ end
2098
+ end
2099
+
2100
+ def terminal_width
2101
+ if ENV['RAKE_COLUMNS']
2102
+ result = ENV['RAKE_COLUMNS'].to_i
2103
+ else
2104
+ result = unix? ? dynamic_width : 80
2105
+ end
2106
+ (result < 10) ? 80 : result
2107
+ rescue
2108
+ 80
2109
+ end
2110
+
2111
+ # Calculate the dynamic width of the
2112
+ def dynamic_width
2113
+ @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
2114
+ end
2115
+
2116
+ def dynamic_width_stty
2117
+ %x{stty size 2>/dev/null}.split[1].to_i
2118
+ end
2119
+
2120
+ def dynamic_width_tput
2121
+ %x{tput cols 2>/dev/null}.to_i
2122
+ end
2123
+
2124
+ def unix?
2125
+ RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
2126
+ end
2127
+
2128
+ def windows?
2129
+ Win32.windows?
2130
+ end
2131
+
2132
+ def truncate(string, width)
2133
+ if string.length <= width
2134
+ string
2135
+ else
2136
+ ( string[0, width-3] || "" ) + "..."
2137
+ end
2138
+ end
2139
+
2140
+ # Display the tasks and prerequisites
2141
+ def display_prerequisites
2142
+ tasks.each do |t|
2143
+ puts "rake #{t.name}"
2144
+ t.prerequisites.each { |pre| puts " #{pre}" }
2145
+ end
2146
+ end
2147
+
2148
+ # A list of all the standard options used in rake, suitable for
2149
+ # passing to OptionParser.
2150
+ def standard_rake_options
2151
+ [
2152
+ ['--classic-namespace', '-C', "Put Task and FileTask in the top level namespace",
2153
+ lambda { |value|
2154
+ require 'rake/classic_namespace'
2155
+ options.classic_namespace = true
2156
+ }
2157
+ ],
2158
+ ['--describe', '-D [PATTERN]', "Describe the tasks (matching optional PATTERN), then exit.",
2159
+ lambda { |value|
2160
+ options.show_tasks = true
2161
+ options.full_description = true
2162
+ options.show_task_pattern = Regexp.new(value || '')
2163
+ }
2164
+ ],
2165
+ ['--dry-run', '-n', "Do a dry run without executing actions.",
2166
+ lambda { |value|
2167
+ verbose(true)
2168
+ nowrite(true)
2169
+ options.dryrun = true
2170
+ options.trace = true
2171
+ }
2172
+ ],
2173
+ ['--execute', '-e CODE', "Execute some Ruby code and exit.",
2174
+ lambda { |value|
2175
+ eval(value)
2176
+ exit
2177
+ }
2178
+ ],
2179
+ ['--execute-print', '-p CODE', "Execute some Ruby code, print the result, then exit.",
2180
+ lambda { |value|
2181
+ puts eval(value)
2182
+ exit
2183
+ }
2184
+ ],
2185
+ ['--execute-continue', '-E CODE',
2186
+ "Execute some Ruby code, then continue with normal task processing.",
2187
+ lambda { |value| eval(value) }
2188
+ ],
2189
+ ['--libdir', '-I LIBDIR', "Include LIBDIR in the search path for required modules.",
2190
+ lambda { |value| $:.push(value) }
2191
+ ],
2192
+ ['--prereqs', '-P', "Display the tasks and dependencies, then exit.",
2193
+ lambda { |value| options.show_prereqs = true }
2194
+ ],
2195
+ ['--quiet', '-q', "Do not log messages to standard output.",
2196
+ lambda { |value| verbose(false) }
2197
+ ],
2198
+ ['--rakefile', '-f [FILE]', "Use FILE as the rakefile.",
2199
+ lambda { |value|
2200
+ value ||= ''
2201
+ @rakefiles.clear
2202
+ @rakefiles << value
2203
+ }
2204
+ ],
2205
+ ['--rakelibdir', '--rakelib', '-R RAKELIBDIR',
2206
+ "Auto-import any .rake files in RAKELIBDIR. (default is 'rakelib')",
2207
+ lambda { |value| options.rakelib = value.split(':') }
2208
+ ],
2209
+ ['--require', '-r MODULE', "Require MODULE before executing rakefile.",
2210
+ lambda { |value|
2211
+ begin
2212
+ require value
2213
+ rescue LoadError => ex
2214
+ begin
2215
+ rake_require value
2216
+ rescue LoadError => ex2
2217
+ raise ex
2218
+ end
2219
+ end
2220
+ }
2221
+ ],
2222
+ ['--rules', "Trace the rules resolution.",
2223
+ lambda { |value| options.trace_rules = true }
2224
+ ],
2225
+ ['--no-search', '--nosearch', '-N', "Do not search parent directories for the Rakefile.",
2226
+ lambda { |value| options.nosearch = true }
2227
+ ],
2228
+ ['--silent', '-s', "Like --quiet, but also suppresses the 'in directory' announcement.",
2229
+ lambda { |value|
2230
+ verbose(false)
2231
+ options.silent = true
2232
+ }
2233
+ ],
2234
+ ['--system', '-g',
2235
+ "Using system wide (global) rakefiles (usually '~/.rake/*.rake').",
2236
+ lambda { |value| options.load_system = true }
2237
+ ],
2238
+ ['--no-system', '--nosystem', '-G',
2239
+ "Use standard project Rakefile search paths, ignore system wide rakefiles.",
2240
+ lambda { |value| options.ignore_system = true }
2241
+ ],
2242
+ ['--tasks', '-T [PATTERN]', "Display the tasks (matching optional PATTERN) with descriptions, then exit.",
2243
+ lambda { |value|
2244
+ options.show_tasks = true
2245
+ options.show_task_pattern = Regexp.new(value || '')
2246
+ options.full_description = false
2247
+ }
2248
+ ],
2249
+ ['--trace', '-t', "Turn on invoke/execute tracing, enable full backtrace.",
2250
+ lambda { |value|
2251
+ options.trace = true
2252
+ verbose(true)
2253
+ }
2254
+ ],
2255
+ ['--verbose', '-v', "Log message to standard output (default).",
2256
+ lambda { |value| verbose(true) }
2257
+ ],
2258
+ ['--version', '-V', "Display the program version.",
2259
+ lambda { |value|
2260
+ puts "rake, version #{RAKEVERSION}"
2261
+ exit
2262
+ }
2263
+ ]
2264
+ ]
2265
+ end
2266
+
2267
+ # Read and handle the command line options.
2268
+ def handle_options
2269
+ options.rakelib = ['rakelib']
2270
+
2271
+ opts = OptionParser.new
2272
+ opts.banner = "rake [-f rakefile] {options} targets..."
2273
+ opts.separator ""
2274
+ opts.separator "Options are ..."
2275
+
2276
+ opts.on_tail("-h", "--help", "-H", "Display this help message.") do
2277
+ puts opts
2278
+ exit
2279
+ end
2280
+
2281
+ standard_rake_options.each { |args| opts.on(*args) }
2282
+ parsed_argv = opts.parse(ARGV)
2283
+
2284
+ # If class namespaces are requested, set the global options
2285
+ # according to the values in the options structure.
2286
+ if options.classic_namespace
2287
+ $show_tasks = options.show_tasks
2288
+ $show_prereqs = options.show_prereqs
2289
+ $trace = options.trace
2290
+ $dryrun = options.dryrun
2291
+ $silent = options.silent
2292
+ end
2293
+ parsed_argv
2294
+ end
2295
+
2296
+ # Similar to the regular Ruby +require+ command, but will check
2297
+ # for *.rake files in addition to *.rb files.
2298
+ def rake_require(file_name, paths=$LOAD_PATH, loaded=$")
2299
+ return false if loaded.include?(file_name)
2300
+ paths.each do |path|
2301
+ fn = file_name + ".rake"
2302
+ full_path = File.join(path, fn)
2303
+ if File.exist?(full_path)
2304
+ load full_path
2305
+ loaded << fn
2306
+ return true
2307
+ end
2308
+ end
2309
+ fail LoadError, "Can't find #{file_name}"
2310
+ end
2311
+
2312
+ def find_rakefile_location
2313
+ here = Dir.pwd
2314
+ while ! (fn = have_rakefile)
2315
+ Dir.chdir("..")
2316
+ if Dir.pwd == here || options.nosearch
2317
+ return nil
2318
+ end
2319
+ here = Dir.pwd
2320
+ end
2321
+ [fn, here]
2322
+ ensure
2323
+ Dir.chdir(Rake.original_dir)
2324
+ end
2325
+
2326
+ def raw_load_rakefile # :nodoc:
2327
+ rakefile, location = find_rakefile_location
2328
+ if (! options.ignore_system) &&
2329
+ (options.load_system || rakefile.nil?) &&
2330
+ system_dir && File.directory?(system_dir)
2331
+ puts "(in #{Dir.pwd})" unless options.silent
2332
+ glob("#{system_dir}/*.rake") do |name|
2333
+ add_import name
2334
+ end
2335
+ else
2336
+ fail "No Rakefile found (looking for: #{@rakefiles.join(', ')})" if
2337
+ rakefile.nil?
2338
+ @rakefile = rakefile
2339
+ Dir.chdir(location)
2340
+ puts "(in #{Dir.pwd})" unless options.silent
2341
+ $rakefile = @rakefile if options.classic_namespace
2342
+ load File.expand_path(@rakefile) if @rakefile && @rakefile != ''
2343
+ options.rakelib.each do |rlib|
2344
+ glob("#{rlib}/*.rake") do |name|
2345
+ add_import name
2346
+ end
2347
+ end
2348
+ end
2349
+ load_imports
2350
+ end
2351
+
2352
+ def glob(path, &block)
2353
+ Dir[path.gsub("\\", '/')].each(&block)
2354
+ end
2355
+ private :glob
2356
+
2357
+ # The directory path containing the system wide rakefiles.
2358
+ def system_dir
2359
+ @system_dir ||=
2360
+ begin
2361
+ if ENV['RAKE_SYSTEM']
2362
+ ENV['RAKE_SYSTEM']
2363
+ else
2364
+ standard_system_dir
2365
+ end
2366
+ end
2367
+ end
2368
+
2369
+ # The standard directory containing system wide rake files.
2370
+ if Win32.windows?
2371
+ def standard_system_dir #:nodoc:
2372
+ Win32.win32_system_dir
2373
+ end
2374
+ else
2375
+ def standard_system_dir #:nodoc:
2376
+ File.expand_path('.rake', '~')
2377
+ end
2378
+ end
2379
+ private :standard_system_dir
2380
+
2381
+ # Collect the list of tasks on the command line. If no tasks are
2382
+ # given, return a list containing only the default task.
2383
+ # Environmental assignments are processed at this time as well.
2384
+ def collect_tasks(argv)
2385
+ @top_level_tasks = []
2386
+ argv.each do |arg|
2387
+ if arg =~ /^(\w+)=(.*)$/
2388
+ ENV[$1] = $2
2389
+ else
2390
+ @top_level_tasks << arg unless arg =~ /^-/
2391
+ end
2392
+ end
2393
+ @top_level_tasks.push("default") if @top_level_tasks.size == 0
2394
+ end
2395
+
2396
+ # Add a file to the list of files to be imported.
2397
+ def add_import(fn)
2398
+ @pending_imports << fn
2399
+ end
2400
+
2401
+ # Load the pending list of imported files.
2402
+ def load_imports
2403
+ while fn = @pending_imports.shift
2404
+ next if @imported.member?(fn)
2405
+ if fn_task = lookup(fn)
2406
+ fn_task.invoke
2407
+ end
2408
+ ext = File.extname(fn)
2409
+ loader = @loaders[ext] || @default_loader
2410
+ loader.load(fn)
2411
+ @imported << fn
2412
+ end
2413
+ end
2414
+
2415
+ # Warn about deprecated use of top level constant names.
2416
+ def const_warning(const_name)
2417
+ @const_warning ||= false
2418
+ if ! @const_warning
2419
+ $stderr.puts %{WARNING: Deprecated reference to top-level constant '#{const_name}' } +
2420
+ %{found at: #{rakefile_location}} # '
2421
+ $stderr.puts %{ Use --classic-namespace on rake command}
2422
+ $stderr.puts %{ or 'require "rake/classic_namespace"' in Rakefile}
2423
+ end
2424
+ @const_warning = true
2425
+ end
2426
+
2427
+ def rakefile_location
2428
+ begin
2429
+ fail
2430
+ rescue RuntimeError => ex
2431
+ ex.backtrace.find {|str| str =~ /#{@rakefile}/ } || ""
2432
+ end
2433
+ end
2434
+ end
2435
+ end
2436
+
2437
+
2438
+ class Module
2439
+ # Rename the original handler to make it available.
2440
+ alias :rake_original_const_missing :const_missing
2441
+
2442
+ # Check for deprecated uses of top level (i.e. in Object) uses of
2443
+ # Rake class names. If someone tries to reference the constant
2444
+ # name, display a warning and return the proper object. Using the
2445
+ # --classic-namespace command line option will define these
2446
+ # constants in Object and avoid this handler.
2447
+ def const_missing(const_name)
2448
+ case const_name
2449
+ when :Task
2450
+ Rake.application.const_warning(const_name)
2451
+ Rake::Task
2452
+ when :FileTask
2453
+ Rake.application.const_warning(const_name)
2454
+ Rake::FileTask
2455
+ when :FileCreationTask
2456
+ Rake.application.const_warning(const_name)
2457
+ Rake::FileCreationTask
2458
+ when :RakeApp
2459
+ Rake.application.const_warning(const_name)
2460
+ Rake::Application
2461
+ else
2462
+ rake_original_const_missing(const_name)
2463
+ end
2464
+ end
2465
+ end