amp 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. data/.gitignore +1 -0
  2. data/.hgignore +26 -0
  3. data/AUTHORS +2 -0
  4. data/History.txt +6 -0
  5. data/LICENSE +37 -0
  6. data/MANIFESTO +7 -0
  7. data/Manifest.txt +294 -0
  8. data/README.md +129 -0
  9. data/Rakefile +102 -0
  10. data/SCHEDULE.markdown +12 -0
  11. data/STYLE +27 -0
  12. data/TODO.markdown +149 -0
  13. data/ampfile.rb +47 -0
  14. data/bin/amp +30 -0
  15. data/bin/amp1.9 +30 -0
  16. data/ext/amp/bz2/README.txt +39 -0
  17. data/ext/amp/bz2/bz2.c +1582 -0
  18. data/ext/amp/bz2/extconf.rb +77 -0
  19. data/ext/amp/bz2/mkmf.log +29 -0
  20. data/ext/amp/mercurial_patch/extconf.rb +5 -0
  21. data/ext/amp/mercurial_patch/mpatch.c +405 -0
  22. data/ext/amp/priority_queue/extconf.rb +5 -0
  23. data/ext/amp/priority_queue/priority_queue.c +947 -0
  24. data/ext/amp/support/extconf.rb +5 -0
  25. data/ext/amp/support/support.c +250 -0
  26. data/lib/amp.rb +200 -0
  27. data/lib/amp/commands/command.rb +507 -0
  28. data/lib/amp/commands/command_support.rb +137 -0
  29. data/lib/amp/commands/commands/config.rb +143 -0
  30. data/lib/amp/commands/commands/help.rb +29 -0
  31. data/lib/amp/commands/commands/init.rb +10 -0
  32. data/lib/amp/commands/commands/templates.rb +137 -0
  33. data/lib/amp/commands/commands/version.rb +7 -0
  34. data/lib/amp/commands/commands/workflow.rb +28 -0
  35. data/lib/amp/commands/commands/workflows/git/add.rb +65 -0
  36. data/lib/amp/commands/commands/workflows/git/copy.rb +27 -0
  37. data/lib/amp/commands/commands/workflows/git/mv.rb +23 -0
  38. data/lib/amp/commands/commands/workflows/git/rm.rb +60 -0
  39. data/lib/amp/commands/commands/workflows/hg/add.rb +53 -0
  40. data/lib/amp/commands/commands/workflows/hg/addremove.rb +86 -0
  41. data/lib/amp/commands/commands/workflows/hg/annotate.rb +46 -0
  42. data/lib/amp/commands/commands/workflows/hg/archive.rb +126 -0
  43. data/lib/amp/commands/commands/workflows/hg/branch.rb +28 -0
  44. data/lib/amp/commands/commands/workflows/hg/branches.rb +30 -0
  45. data/lib/amp/commands/commands/workflows/hg/bundle.rb +115 -0
  46. data/lib/amp/commands/commands/workflows/hg/clone.rb +95 -0
  47. data/lib/amp/commands/commands/workflows/hg/commit.rb +42 -0
  48. data/lib/amp/commands/commands/workflows/hg/copy.rb +31 -0
  49. data/lib/amp/commands/commands/workflows/hg/debug/dirstate.rb +32 -0
  50. data/lib/amp/commands/commands/workflows/hg/debug/index.rb +36 -0
  51. data/lib/amp/commands/commands/workflows/hg/default.rb +9 -0
  52. data/lib/amp/commands/commands/workflows/hg/diff.rb +30 -0
  53. data/lib/amp/commands/commands/workflows/hg/forget.rb +11 -0
  54. data/lib/amp/commands/commands/workflows/hg/heads.rb +25 -0
  55. data/lib/amp/commands/commands/workflows/hg/identify.rb +23 -0
  56. data/lib/amp/commands/commands/workflows/hg/import.rb +135 -0
  57. data/lib/amp/commands/commands/workflows/hg/incoming.rb +85 -0
  58. data/lib/amp/commands/commands/workflows/hg/info.rb +18 -0
  59. data/lib/amp/commands/commands/workflows/hg/log.rb +21 -0
  60. data/lib/amp/commands/commands/workflows/hg/manifest.rb +13 -0
  61. data/lib/amp/commands/commands/workflows/hg/merge.rb +53 -0
  62. data/lib/amp/commands/commands/workflows/hg/move.rb +28 -0
  63. data/lib/amp/commands/commands/workflows/hg/outgoing.rb +61 -0
  64. data/lib/amp/commands/commands/workflows/hg/pull.rb +74 -0
  65. data/lib/amp/commands/commands/workflows/hg/push.rb +20 -0
  66. data/lib/amp/commands/commands/workflows/hg/remove.rb +45 -0
  67. data/lib/amp/commands/commands/workflows/hg/resolve.rb +83 -0
  68. data/lib/amp/commands/commands/workflows/hg/revert.rb +53 -0
  69. data/lib/amp/commands/commands/workflows/hg/root.rb +13 -0
  70. data/lib/amp/commands/commands/workflows/hg/serve.rb +38 -0
  71. data/lib/amp/commands/commands/workflows/hg/status.rb +116 -0
  72. data/lib/amp/commands/commands/workflows/hg/tag.rb +69 -0
  73. data/lib/amp/commands/commands/workflows/hg/tags.rb +27 -0
  74. data/lib/amp/commands/commands/workflows/hg/tip.rb +13 -0
  75. data/lib/amp/commands/commands/workflows/hg/update.rb +27 -0
  76. data/lib/amp/commands/commands/workflows/hg/verify.rb +9 -0
  77. data/lib/amp/commands/commands/workflows/hg/view.rb +36 -0
  78. data/lib/amp/commands/dispatch.rb +181 -0
  79. data/lib/amp/commands/hooks.rb +81 -0
  80. data/lib/amp/dependencies/amp_support.rb +1 -0
  81. data/lib/amp/dependencies/amp_support/ruby_amp_support.rb +103 -0
  82. data/lib/amp/dependencies/minitar.rb +979 -0
  83. data/lib/amp/dependencies/priority_queue.rb +18 -0
  84. data/lib/amp/dependencies/priority_queue/c_priority_queue.rb +1 -0
  85. data/lib/amp/dependencies/priority_queue/poor_priority_queue.rb +46 -0
  86. data/lib/amp/dependencies/priority_queue/ruby_priority_queue.rb +525 -0
  87. data/lib/amp/dependencies/python_config.rb +211 -0
  88. data/lib/amp/dependencies/trollop.rb +713 -0
  89. data/lib/amp/dependencies/zip/ioextras.rb +155 -0
  90. data/lib/amp/dependencies/zip/stdrubyext.rb +111 -0
  91. data/lib/amp/dependencies/zip/tempfile_bugfixed.rb +186 -0
  92. data/lib/amp/dependencies/zip/zip.rb +1850 -0
  93. data/lib/amp/dependencies/zip/zipfilesystem.rb +609 -0
  94. data/lib/amp/dependencies/zip/ziprequire.rb +90 -0
  95. data/lib/amp/encoding/base85.rb +97 -0
  96. data/lib/amp/encoding/binary_diff.rb +82 -0
  97. data/lib/amp/encoding/difflib.rb +166 -0
  98. data/lib/amp/encoding/mercurial_diff.rb +378 -0
  99. data/lib/amp/encoding/mercurial_patch.rb +1 -0
  100. data/lib/amp/encoding/patch.rb +292 -0
  101. data/lib/amp/encoding/pure_ruby/ruby_mercurial_patch.rb +123 -0
  102. data/lib/amp/extensions/ditz.rb +41 -0
  103. data/lib/amp/extensions/lighthouse.rb +167 -0
  104. data/lib/amp/graphs/ancestor.rb +147 -0
  105. data/lib/amp/graphs/copies.rb +261 -0
  106. data/lib/amp/merges/merge_state.rb +164 -0
  107. data/lib/amp/merges/merge_ui.rb +322 -0
  108. data/lib/amp/merges/simple_merge.rb +450 -0
  109. data/lib/amp/profiling_hacks.rb +36 -0
  110. data/lib/amp/repository/branch_manager.rb +234 -0
  111. data/lib/amp/repository/dir_state.rb +950 -0
  112. data/lib/amp/repository/journal.rb +203 -0
  113. data/lib/amp/repository/lock.rb +207 -0
  114. data/lib/amp/repository/repositories/bundle_repository.rb +214 -0
  115. data/lib/amp/repository/repositories/http_repository.rb +377 -0
  116. data/lib/amp/repository/repositories/local_repository.rb +2661 -0
  117. data/lib/amp/repository/repository.rb +94 -0
  118. data/lib/amp/repository/store.rb +485 -0
  119. data/lib/amp/repository/tag_manager.rb +319 -0
  120. data/lib/amp/repository/updatable.rb +532 -0
  121. data/lib/amp/repository/verification.rb +431 -0
  122. data/lib/amp/repository/versioned_file.rb +475 -0
  123. data/lib/amp/revlogs/bundle_revlogs.rb +246 -0
  124. data/lib/amp/revlogs/changegroup.rb +217 -0
  125. data/lib/amp/revlogs/changelog.rb +338 -0
  126. data/lib/amp/revlogs/changeset.rb +521 -0
  127. data/lib/amp/revlogs/file_log.rb +165 -0
  128. data/lib/amp/revlogs/index.rb +493 -0
  129. data/lib/amp/revlogs/manifest.rb +195 -0
  130. data/lib/amp/revlogs/node.rb +18 -0
  131. data/lib/amp/revlogs/revlog.rb +1032 -0
  132. data/lib/amp/revlogs/revlog_support.rb +126 -0
  133. data/lib/amp/server/amp_user.rb +44 -0
  134. data/lib/amp/server/extension/amp_extension.rb +396 -0
  135. data/lib/amp/server/extension/authorization.rb +201 -0
  136. data/lib/amp/server/fancy_http_server.rb +252 -0
  137. data/lib/amp/server/fancy_views/_browser.haml +28 -0
  138. data/lib/amp/server/fancy_views/_diff_file.haml +13 -0
  139. data/lib/amp/server/fancy_views/_navbar.haml +17 -0
  140. data/lib/amp/server/fancy_views/changeset.haml +31 -0
  141. data/lib/amp/server/fancy_views/commits.haml +32 -0
  142. data/lib/amp/server/fancy_views/file.haml +35 -0
  143. data/lib/amp/server/fancy_views/file_diff.haml +23 -0
  144. data/lib/amp/server/fancy_views/harshcss/all_hallows_eve.css +72 -0
  145. data/lib/amp/server/fancy_views/harshcss/amy.css +147 -0
  146. data/lib/amp/server/fancy_views/harshcss/twilight.css +138 -0
  147. data/lib/amp/server/fancy_views/stylesheet.sass +175 -0
  148. data/lib/amp/server/http_server.rb +140 -0
  149. data/lib/amp/server/repo_user_management.rb +287 -0
  150. data/lib/amp/support/amp_config.rb +164 -0
  151. data/lib/amp/support/amp_ui.rb +287 -0
  152. data/lib/amp/support/docs.rb +54 -0
  153. data/lib/amp/support/generator.rb +78 -0
  154. data/lib/amp/support/ignore.rb +144 -0
  155. data/lib/amp/support/loaders.rb +93 -0
  156. data/lib/amp/support/logger.rb +103 -0
  157. data/lib/amp/support/match.rb +151 -0
  158. data/lib/amp/support/multi_io.rb +87 -0
  159. data/lib/amp/support/openers.rb +121 -0
  160. data/lib/amp/support/ruby_19_compatibility.rb +66 -0
  161. data/lib/amp/support/support.rb +1095 -0
  162. data/lib/amp/templates/blank.commit.erb +23 -0
  163. data/lib/amp/templates/blank.log.erb +18 -0
  164. data/lib/amp/templates/default.commit.erb +23 -0
  165. data/lib/amp/templates/default.log.erb +26 -0
  166. data/lib/amp/templates/template.rb +165 -0
  167. data/site/Rakefile +24 -0
  168. data/site/src/about/ampfile.haml +57 -0
  169. data/site/src/about/commands.haml +106 -0
  170. data/site/src/about/index.haml +33 -0
  171. data/site/src/about/performance.haml +31 -0
  172. data/site/src/about/workflows.haml +34 -0
  173. data/site/src/contribute/index.haml +65 -0
  174. data/site/src/contribute/style.haml +297 -0
  175. data/site/src/css/active4d.css +114 -0
  176. data/site/src/css/all_hallows_eve.css +72 -0
  177. data/site/src/css/all_themes.css +3299 -0
  178. data/site/src/css/amp.css +260 -0
  179. data/site/src/css/amy.css +147 -0
  180. data/site/src/css/blackboard.css +88 -0
  181. data/site/src/css/brilliance_black.css +605 -0
  182. data/site/src/css/brilliance_dull.css +599 -0
  183. data/site/src/css/cobalt.css +149 -0
  184. data/site/src/css/cur_amp.css +185 -0
  185. data/site/src/css/dawn.css +121 -0
  186. data/site/src/css/eiffel.css +121 -0
  187. data/site/src/css/espresso_libre.css +109 -0
  188. data/site/src/css/idle.css +62 -0
  189. data/site/src/css/iplastic.css +80 -0
  190. data/site/src/css/lazy.css +73 -0
  191. data/site/src/css/mac_classic.css +123 -0
  192. data/site/src/css/magicwb_amiga.css +104 -0
  193. data/site/src/css/pastels_on_dark.css +188 -0
  194. data/site/src/css/reset.css +55 -0
  195. data/site/src/css/slush_poppies.css +85 -0
  196. data/site/src/css/spacecadet.css +51 -0
  197. data/site/src/css/sunburst.css +180 -0
  198. data/site/src/css/twilight.css +137 -0
  199. data/site/src/css/zenburnesque.css +91 -0
  200. data/site/src/get/index.haml +32 -0
  201. data/site/src/helpers.rb +121 -0
  202. data/site/src/images/amp_logo.png +0 -0
  203. data/site/src/images/carbonica.png +0 -0
  204. data/site/src/images/revolution.png +0 -0
  205. data/site/src/images/tab-bg.png +0 -0
  206. data/site/src/images/tab-sliding-left.png +0 -0
  207. data/site/src/images/tab-sliding-right.png +0 -0
  208. data/site/src/include/_footer.haml +22 -0
  209. data/site/src/include/_header.haml +17 -0
  210. data/site/src/index.haml +104 -0
  211. data/site/src/learn/index.haml +46 -0
  212. data/site/src/scripts/jquery-1.3.2.min.js +19 -0
  213. data/site/src/scripts/jquery.cookie.js +96 -0
  214. data/tasks/stats.rake +155 -0
  215. data/tasks/yard.rake +171 -0
  216. data/test/dirstate_tests/dirstate +0 -0
  217. data/test/dirstate_tests/hgrc +5 -0
  218. data/test/dirstate_tests/test_dir_state.rb +192 -0
  219. data/test/functional_tests/resources/.hgignore +2 -0
  220. data/test/functional_tests/resources/STYLE.txt +25 -0
  221. data/test/functional_tests/resources/command.rb +372 -0
  222. data/test/functional_tests/resources/commands/annotate.rb +57 -0
  223. data/test/functional_tests/resources/commands/experimental/lolcats.rb +17 -0
  224. data/test/functional_tests/resources/commands/heads.rb +22 -0
  225. data/test/functional_tests/resources/commands/manifest.rb +12 -0
  226. data/test/functional_tests/resources/commands/status.rb +90 -0
  227. data/test/functional_tests/resources/version2/.hgignore +5 -0
  228. data/test/functional_tests/resources/version2/STYLE.txt +25 -0
  229. data/test/functional_tests/resources/version2/command.rb +372 -0
  230. data/test/functional_tests/resources/version2/commands/annotate.rb +45 -0
  231. data/test/functional_tests/resources/version2/commands/experimental/lolcats.rb +17 -0
  232. data/test/functional_tests/resources/version2/commands/heads.rb +22 -0
  233. data/test/functional_tests/resources/version2/commands/manifest.rb +12 -0
  234. data/test/functional_tests/resources/version2/commands/status.rb +90 -0
  235. data/test/functional_tests/resources/version3/.hgignore +5 -0
  236. data/test/functional_tests/resources/version3/STYLE.txt +31 -0
  237. data/test/functional_tests/resources/version3/command.rb +376 -0
  238. data/test/functional_tests/resources/version3/commands/annotate.rb +45 -0
  239. data/test/functional_tests/resources/version3/commands/experimental/lolcats.rb +17 -0
  240. data/test/functional_tests/resources/version3/commands/heads.rb +22 -0
  241. data/test/functional_tests/resources/version3/commands/manifest.rb +12 -0
  242. data/test/functional_tests/resources/version3/commands/status.rb +90 -0
  243. data/test/functional_tests/resources/version4/.hgignore +5 -0
  244. data/test/functional_tests/resources/version4/STYLE.txt +31 -0
  245. data/test/functional_tests/resources/version4/command.rb +376 -0
  246. data/test/functional_tests/resources/version4/commands/experimental/lolcats.rb +17 -0
  247. data/test/functional_tests/resources/version4/commands/heads.rb +22 -0
  248. data/test/functional_tests/resources/version4/commands/manifest.rb +12 -0
  249. data/test/functional_tests/resources/version4/commands/stats.rb +25 -0
  250. data/test/functional_tests/resources/version4/commands/status.rb +90 -0
  251. data/test/functional_tests/resources/version5_1/.hgignore +5 -0
  252. data/test/functional_tests/resources/version5_1/STYLE.txt +2 -0
  253. data/test/functional_tests/resources/version5_1/command.rb +374 -0
  254. data/test/functional_tests/resources/version5_1/commands/experimental/lolcats.rb +17 -0
  255. data/test/functional_tests/resources/version5_1/commands/heads.rb +22 -0
  256. data/test/functional_tests/resources/version5_1/commands/manifest.rb +12 -0
  257. data/test/functional_tests/resources/version5_1/commands/stats.rb +25 -0
  258. data/test/functional_tests/resources/version5_1/commands/status.rb +90 -0
  259. data/test/functional_tests/resources/version5_2/.hgignore +5 -0
  260. data/test/functional_tests/resources/version5_2/STYLE.txt +14 -0
  261. data/test/functional_tests/resources/version5_2/command.rb +376 -0
  262. data/test/functional_tests/resources/version5_2/commands/experimental/lolcats.rb +17 -0
  263. data/test/functional_tests/resources/version5_2/commands/manifest.rb +12 -0
  264. data/test/functional_tests/resources/version5_2/commands/newz.rb +12 -0
  265. data/test/functional_tests/resources/version5_2/commands/stats.rb +25 -0
  266. data/test/functional_tests/resources/version5_2/commands/status.rb +90 -0
  267. data/test/functional_tests/test_functional.rb +604 -0
  268. data/test/localrepo_tests/test_local_repo.rb +121 -0
  269. data/test/localrepo_tests/testrepo.tar.gz +0 -0
  270. data/test/manifest_tests/00manifest.i +0 -0
  271. data/test/manifest_tests/test_manifest.rb +72 -0
  272. data/test/merge_tests/base.txt +10 -0
  273. data/test/merge_tests/expected.local.txt +16 -0
  274. data/test/merge_tests/local.txt +11 -0
  275. data/test/merge_tests/remote.txt +11 -0
  276. data/test/merge_tests/test_merge.rb +26 -0
  277. data/test/revlog_tests/00changelog.i +0 -0
  278. data/test/revlog_tests/revision_added_changelog.i +0 -0
  279. data/test/revlog_tests/test_adding_index.i +0 -0
  280. data/test/revlog_tests/test_revlog.rb +333 -0
  281. data/test/revlog_tests/testindex.i +0 -0
  282. data/test/store_tests/store.tar.gz +0 -0
  283. data/test/store_tests/test_fncache_store.rb +122 -0
  284. data/test/test_amp.rb +9 -0
  285. data/test/test_base85.rb +14 -0
  286. data/test/test_bdiff.rb +42 -0
  287. data/test/test_commands.rb +122 -0
  288. data/test/test_difflib.rb +50 -0
  289. data/test/test_helper.rb +15 -0
  290. data/test/test_journal.rb +29 -0
  291. data/test/test_match.rb +134 -0
  292. data/test/test_mdiff.rb +74 -0
  293. data/test/test_mpatch.rb +14 -0
  294. data/test/test_support.rb +24 -0
  295. metadata +385 -0
@@ -0,0 +1,45 @@
1
+ command :annotate do |c|
2
+ c.desc "Shows who committed each line in a given file."
3
+ c.synonym :blame
4
+ c.opt :rev, "Which revision to annotate", :type => :integer, :default => nil, :short => "-r"
5
+ c.opt :user, "Shows the user who committed instead of the revision", :short => "-u"
6
+ c.opt :date, "Shows the date when the line was committed", :short => "-d"
7
+ c.opt :"line-number", "Show line number of first appearance", :short => "-l"
8
+ c.opt :changeset, "Show the changeset stuff la la la la", :short => "-c"
9
+ c.on_run do |opts, args|
10
+ repo = opts[:repository]
11
+
12
+ annotate = proc do ||
13
+ revpart = ""
14
+ showrev = !([opts[:changeset], opts[:user], opts[:date]].any?)
15
+ end
16
+
17
+ args.each do |arg|
18
+ newopts = {:line_numbers => opts[:"line-number"]}
19
+ results = repo.annotate(arg, opts[:rev], newopts)
20
+ leftparts = results.map do |file, line_number, line|
21
+ revpart = ""
22
+ showrev = !([opts[:changeset], opts[:user], opts[:date]].any?)
23
+
24
+ revpart += (opts[:verbose] ? file.changeset.user : file.changeset.user.split("@").first[0..15]) if opts[:user]
25
+ revpart += Time.at(file.changeset.date.first).to_s if opts[:date]
26
+ revpart += " " + file.changeset.node_id.hexlify[0..11] if opts[:changeset]
27
+ revpart += file.change_id.to_s if showrev
28
+
29
+ if line_number
30
+ revpart += ":" + line_number.to_s + ":"
31
+ else
32
+ revpart += ":"
33
+ end
34
+ end
35
+
36
+ maxleftsize = leftparts.max {|a, b| a.size <=> b.size }.size
37
+
38
+ results.map! do |file, line_number, line|
39
+ (revpart).rjust(maxleftsize) + " " + line
40
+ end
41
+
42
+ puts results.join("LOLZ")
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ command :lolcats do |c|
2
+ c.opt :cheezburger, "Add cheezburger to lolcat"
3
+ c.on_run do |opts, args|
4
+ puts "lolcats!"
5
+ puts "lolcats!"
6
+ puts "lolcats!"
7
+ puts "lolcats!"
8
+ puts "lolcats!"
9
+ end
10
+
11
+ c.before do |opts, args|
12
+ puts "Before lolcats...."
13
+ end
14
+ c.after do |opts, args|
15
+ puts "After lolcats!"
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ command :heads do |c|
2
+ c.desc "Prints the heads of the repository."
3
+ c.add_opt :rev, "show only heads which are descendants of rev", {:short => "-r"}
4
+ c.add_opt :active, "show only active heads", {:short => "-a"}
5
+ c.add_opt :template, "Which template to use while printing", {:short => "-t", :type => :string, :default => "default"}
6
+ c.on_run do |options, args|
7
+ repo = options[:repository]
8
+ start = options[:rev] ? repo.lookup(options[:rev]) : nil
9
+ closed = options[:active]
10
+ if args.size == 0
11
+ heads = repo.heads(start, :closed => closed)
12
+ else
13
+ #branch shit
14
+ end
15
+
16
+ options.merge!({:template_type => :log})
17
+ heads.each do |n|
18
+ puts repo[n].to_templated_s(options)
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ command :manifest do |c|
2
+ c.desc "Prints the manifest at a given revision (defaults to working directory)"
3
+ c.add_opt :rev, "Specifies the revision to check", {:short => "-r", :type => :integer}
4
+ c.on_run do |options, arguments|
5
+ revision = options[:rev]
6
+ repo = options[:repository]
7
+
8
+ repo[revision].each do |k, v|
9
+ puts "#{k}"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,90 @@
1
+ command :status do |c|
2
+ c.desc "Prints the status of the working directory (or another revision)"
3
+ c.add_opt :all, "Show all files", {:short => "-A"}
4
+ c.add_opt :modified, "Show only modified files", {:short => "-m"}
5
+ c.add_opt :added, "Show only added files", {:short => "-a"}
6
+ c.add_opt :deleted, "Show only deleted files", {:short => "-D"}
7
+ c.add_opt :removed, "Show only removed files", {:short => "-R"}
8
+ c.add_opt :clean, "Show only files without changes", {:short => "-c"}
9
+ c.add_opt :unknown, "Show only untracked files", {:short => "-u"}
10
+ c.add_opt :ignored, "Show only ignored files", {:short => "-i"}
11
+ c.add_opt :rev, "Selects which revision to use", {:short => "-r", :type => :string, :multi => true}
12
+ c.add_opt :hg, "Print the information in hg's style"
13
+ c.add_opt :"no-color","Don't use color to categorize the output"
14
+ c.synonym :st
15
+
16
+ c.on_run do |options, args|
17
+ repo = options[:repository]
18
+ node1, node2 = c.revision_pair(repo, options[:rev])
19
+ cwd = "" # use patterns later
20
+ stop = "\n"
21
+ copy = {}
22
+ colors = {'modified' => :cyan,
23
+ 'added' => :blue,
24
+ 'removed' => :red,
25
+ 'deleted' => :magenta,
26
+ 'unknown' => :green,
27
+ 'ignored' => :yellow,
28
+ 'clean' => :white
29
+ }
30
+ states = ['modified',
31
+ 'added' ,
32
+ 'removed' ,
33
+ 'deleted' ,
34
+ 'unknown' ,
35
+ 'ignored' ,
36
+ 'clean' ]
37
+ show = states.select {|k| options[k.to_sym]} # filter the list down
38
+
39
+ show = states if options[:all]
40
+ show = states[0..4] if show.empty?
41
+
42
+ statopts = {:node_1 => node1, :node_2 => node2 }
43
+
44
+ show.each {|switch| statopts[switch.to_sym] = true }
45
+
46
+ status = repo.status statopts
47
+
48
+ # PRINTING TIME!!!!!!!!
49
+
50
+ if options[:hg]
51
+ status_as_array = [status[:modified],
52
+ status[:added],
53
+ status[:removed],
54
+ status[:deleted],
55
+ status[:unknown],
56
+ status[:ignored],
57
+ status[:clean]
58
+ ]
59
+ changestates = states.zip("MAR!?IC".split(""), status_as_array)
60
+ changestates.each do |state, char, files|
61
+ if show.include? state
62
+ files.each do |f|
63
+ if options[:"no-color"]
64
+ Amp::UI.say "#{char} #{File.join(cwd, f.to_s)[1..-1]}#{stop}" unless f.nil?
65
+ else
66
+ Amp::UI.say "#{char.send colors[state]} #{File.join(cwd, f.to_s)[1..-1]}#{stop}" unless f.nil?
67
+ end
68
+ end
69
+ end
70
+ end
71
+ else
72
+ # print it our way
73
+
74
+ show.each do |state|
75
+ next if status[state.to_sym].empty?
76
+ num_of_files = status[state.to_sym].size
77
+
78
+ Amp::UI.say("#{state.upcase.send colors[state]}" +
79
+ " => #{num_of_files} file#{num_of_files > 1 ? 's' : ''}")
80
+
81
+ status[state.to_sym].each do |file|
82
+ Amp::UI.say "\t#{File.join(cwd, file)[1..-1]}"
83
+ end
84
+
85
+ puts
86
+ end
87
+ end
88
+
89
+ end
90
+ end
@@ -0,0 +1,5 @@
1
+ syntax: regexp
2
+ .*?lolcats\.rb$
3
+
4
+ syntax: glob
5
+ commands/experimental/*
@@ -0,0 +1,31 @@
1
+ The Amp Commandments Redux:
2
+ 1. Thou shalt not useth the "for...in" syntax.
3
+ 2. Thou shalt useth only but 80 columns, for those who useth the lord's
4
+ editors, vim and emacs. (emacs sucks - oh no he didn't)
5
+ 3. Thou shalt preface thine variables with _ only when thou needest,
6
+ lest ye face judgement for this most grave sin. (this isn't python.
7
+ no __method__ is necessary!)
8
+ 4. Thine variables should have descriptive names, for thine ruby might
9
+ read like the psalms.
10
+ 5. Thine variables, longer than 6 letters and composed of two or more
11
+ words, shall separate those words with the lord's underscore, so thine
12
+ code shall flow like the Nile herself.
13
+ 6. Thou shalt rake thine yard frequently, to be sure thine code is
14
+ well-documented for thine neighbors.
15
+ 7. Thou shalt use alias_method over alias or I shall goeth Chris Brown
16
+ all over thou. (meh we don't need threats in the commandments.)
17
+ 8. Thou shalt use parentheses in thine defintions of methods, for the
18
+ consistency of the codes in this repository.
19
+ 9. Thine comments shall start, when above thine method definitions, with
20
+ 2 (two) hashes, and the information, then, beginning on the line below
21
+ it. Thou shalt leave one blank comment line between thine comment info
22
+ and thine yard information.
23
+ 10. Thou shalt make great and grand use of the yard extension. It is
24
+ pretty sweet.
25
+ 11. Name thine motherfrakking vari
26
+
27
+
28
+ VERSION 3
29
+
30
+ VERSION 3
31
+ ables motherfrakking descriptively.
@@ -0,0 +1,376 @@
1
+ need { 'command_support.rb' }
2
+ module Amp
3
+ ##
4
+ # Represents a command within the Amp system. Simply instantiating a new
5
+ # command will make it available to the Amp executable. You configure the
6
+ # command by filling out a block in the command's initializer.
7
+ # @example
8
+ # Command.new("add") do |c|
9
+ # c.opt :include, "Paths to include",
10
+ # :options => {:short => "-I", :multi => true}
11
+ # c.opt :print_names, :desc => "Print the filenames",
12
+ # :options => {:short => "-p",
13
+ # :default => false,
14
+ # :type => :boolean}
15
+ # c.on_run do |options, arguments|
16
+ # if options[:print_names]
17
+ # arguments.each do |filename|
18
+ # puts filename
19
+ # end
20
+ # end
21
+ # end
22
+ # c.help "This is the help text when the user runs `amp help add`"
23
+ # end
24
+ #
25
+ class Command
26
+ include CommandSupport
27
+ # All the commands registered in the system
28
+ @@all_commands = {}
29
+
30
+ # Synonyms for commands. Used as a backup.
31
+ @@all_synonyms = {}
32
+
33
+ # These are options that all commands support. Allows the user to put
34
+ # them after the subcommand.
35
+ GLOBAL_OPTIONS = []
36
+
37
+ ##
38
+ # Returns all of the commands registered in the system.
39
+ #
40
+ # @return [Hash] the commands, keyed by command name as a string
41
+ def self.all_commands
42
+ @@all_commands
43
+ end
44
+
45
+ ##
46
+ # Returns all the synonyms registered in the system.
47
+ #
48
+ # @return [Hash] the synonyms, keyed by the synonym as a string
49
+ def self.all_synonyms
50
+ @@all_synonyms
51
+ end
52
+
53
+ ##
54
+ # Returns all of the commands registered in the system.
55
+ #
56
+ # @return [Hash] the commands, keyed by command name as a string
57
+ def self.[](arg)
58
+ return all_commands[arg] if all_commands[arg]
59
+ return all_synonyms[arg] if all_synonyms[arg]
60
+ nil
61
+ end
62
+
63
+ # Command-specific command-line options
64
+ attr_accessor :options
65
+ # The name of the command (eg add, init)
66
+ attr_accessor :name
67
+ # Short, 1-line description of the command
68
+ attr_accessor :description
69
+ # The options submitted
70
+ attr_accessor :options
71
+
72
+ ##
73
+ # Creates a command in the Amp system. Simply instantiating a new
74
+ # command will make it available to the Amp executable. You configure the
75
+ # command by filling out a block in the command's initializer.
76
+ #
77
+ # @example
78
+ # Command.new("add") do |c|
79
+ # c.opt :include, "Paths to include",
80
+ # :options => {:short => "-I", :multi => true}
81
+ # c.opt :print_names, :desc => "Print the filenames",
82
+ # :options => {:short => "-p", :default => false,
83
+ # :type => :boolean}
84
+ # c.on_run do |options, arguments|
85
+ # puts "silly!"
86
+ # end
87
+ # end
88
+ # @param name the name of the command that the user will use to call
89
+ # the command
90
+ # @param &block a block of code where you can configure the command
91
+ # @yield This block configures the command. Set up options, add an on_run
92
+ # handler, and so on.
93
+ # @yieldparam The command itself - it is yielded so you can modify it.
94
+ def initialize(name)
95
+ # so that you can do additions to commands, just like ammending rake takss
96
+ name = name.to_s
97
+ if @@all_commands[name]
98
+ yield @@all_commands[name]
99
+ return
100
+ end
101
+
102
+ @name = name
103
+ @help = ""
104
+ @description = ""
105
+ @options = []
106
+ @@all_commands[name] = self
107
+ @before = []
108
+ @after = []
109
+ @break = false
110
+ yield(self) if block_given?
111
+ @options += GLOBAL_OPTIONS
112
+ end
113
+
114
+ ##
115
+ # Adds an command-line option to the command.
116
+ #
117
+ # @param name the name of the command the user will type to run it
118
+ # @param desc the short, one-line description of the command
119
+ # @param options the options that configure the command-line option
120
+ # (too meta? sorry!)
121
+ # @option [String] options :short (nil) the short version of the option
122
+ # (e.g. "-I")
123
+ # @option [String] options :default (nil) the default value of the option.
124
+ # @option [Symbol] options :type (:string) the type of the option. Allows
125
+ # you to force Integer or URL matches.
126
+ # @option [Boolean] options :multi (false) can this option take multiple
127
+ # values?
128
+ def opt(name, desc='', options={})
129
+ @options << {:name => name, :desc => desc, :options => options}
130
+ end
131
+ alias_method :add_opt, :opt
132
+
133
+ ##
134
+ # This method is how you set what the command does when it is run.
135
+ #
136
+ # @param &block the code to run when the command runs
137
+ # @yield The code to run when the command is executed, after options
138
+ # are prepared.
139
+ # @yieldparam options The options that the dispatcher has prepared for
140
+ # the command. Includes global and local.
141
+ # @yieldparam arguments All arguments passed to the command, after
142
+ # the options.
143
+ # @example
144
+ # Command.new("email_news") do |c|
145
+ # c.on_run do |options, arguments|
146
+ # arguments.each do |email_address|
147
+ # send_some_email(options[:email_subject],email_address)
148
+ # end
149
+ # end
150
+ # end
151
+ def on_run(&block)
152
+ @code = block
153
+ end
154
+
155
+ ##
156
+ # This method lets you set a synonym (or synonyms) for this command.
157
+ # For example, the "remove" command has the synonym "rm". Example:
158
+ # command :remove do |c|
159
+ # c.synonym :rm, :destroy, :nuke
160
+ # end
161
+ # then you can do
162
+ # amp nuke badfile.rb
163
+ #
164
+ def synonym(*args)
165
+ args.each do |arg|
166
+ @@all_synonyms[arg.to_s] = self
167
+ end
168
+ end
169
+
170
+ ##
171
+ # This returns the list of actions to run before the command, in order (first
172
+ # ones are run first). You can modify this array in any way you choose, and
173
+ # it is run _before_ the command is run.
174
+ #
175
+ # @yield Extra code to run before the command is executed, after options are prepared.
176
+ # @yieldparam options The options that the dispatcher has prepared for the command. Includes global and local.
177
+ # @yieldparam arguments All arguments passed to the command, after the options.
178
+ # @return [Hash] an array of strings and blocks. Strings are assumed to be command
179
+ # names and blocks are pieces of code to be run.
180
+ def before(*args, &block)
181
+ args.each do |arg|
182
+ @before << proc {|opts, args| Volt::Command[arg.to_sym].run(opts, args) }
183
+ end
184
+
185
+ @before << block if block
186
+ @before
187
+ end
188
+
189
+ ##
190
+ # This returns the list of actions to run after the command, in order (first
191
+ # ones are run first). You can modify this array in any way you choose, and
192
+ # it is run _after_ the command is run.
193
+ #
194
+ # @yield Extra code to run after the command is executed, after options are prepared.
195
+ # @yieldparam options The options that the dispatcher has prepared for the command. Includes global and local.
196
+ # @yieldparam arguments All arguments passed to the command, after the options.
197
+ # @return [Hash] an array of strings and blocks. Strings are assumed to be command
198
+ # names and blocks are pieces of code to be run.
199
+ def after(*args, &block)
200
+ args.each do |arg|
201
+ @after << proc {|opts, args| Volt::Command[arg.to_sym].run(opts, args) }
202
+ end
203
+
204
+ @after << block if block
205
+ @after
206
+ end
207
+
208
+ ##
209
+ # Sets the short description for the command. This shouuld be only 1 line,
210
+ # as it's what the user sees when they run `amp --help` and get the
211
+ # full list of commands. `str` defaults to nil so that if no argument is
212
+ # passed, by default #desc will just return `@description`. If `str` is
213
+ # passed a string, then it will set `@description` to `str`.
214
+ #
215
+ # @example cmd.desc "This command is useless."
216
+ # @example cmd.desc # => "This command is useless."
217
+ # @param [String, nil] str the help text to set
218
+ def desc(str=nil)
219
+ str ? @description = str : @description
220
+ end
221
+
222
+ ##
223
+ # Sets the short description for the command. This shouuld be only 1 line,
224
+ # as it's what the user sees when they run `amp --help` and get the
225
+ # full list of commands.
226
+ #
227
+ # @param str the help text to set
228
+ alias :desc= :desc
229
+
230
+ ##
231
+ # Trollop's help info for the command
232
+ def educate
233
+ # comments are the devil's work.
234
+ # comments are the devil's work.
235
+ @parser ? @parser.educate : ''
236
+ end
237
+ alias_method :education, :educate
238
+
239
+ ##
240
+ # Sets the command to not laod a repository when run. Useful for purely
241
+ # informational commands (such as version) or initializing a new
242
+ # repository.
243
+ def no_repo
244
+ NO_REPO_ALLOWED[@name] = true
245
+ end
246
+
247
+ # @see no_repo
248
+ def no_repo=(value)
249
+ NO_REPO_ALLOWED[@name] = value
250
+ end
251
+
252
+ ##
253
+ # Sets the command to not require a repository to run, but try to load one.
254
+ # Used, for example, for the templates command, which sometimes stores
255
+ # comments are the devil's work.
256
+ # comments are the devil's work.
257
+ # comments are the devil's work.
258
+ # comments are the devil's work.
259
+ # information in the local repository.
260
+ def maybe_repo
261
+ MAYBE_REPO_ALLOWED[@name] = true
262
+ end
263
+
264
+ # @see no_repo
265
+ def maybe_repo=(value)
266
+ MAYBE_REPO_ALLOWED[@name] = value
267
+ end
268
+
269
+ ##
270
+ # Sets the help text for the command. This can be a very long string,
271
+ # as it is what the user sees when they type `amp help +name+`
272
+ #
273
+ # @param str the help text to set
274
+ # comments are the devil's work.
275
+ # comments are the devil's work.
276
+ # @example cmd.help %Q{
277
+ # Big help text!
278
+ # }
279
+ def help(str=nil)
280
+ str ? @help << str : @help
281
+ end
282
+
283
+ ##
284
+ # Sets the help text for the command. This can be a very long string,
285
+ # as it is what the user sees when they type `amp help +name+`
286
+ # comments are the devil's work.
287
+ # comments are the devil's work.
288
+ #
289
+ # @param str the help text to set
290
+ alias :help= :help
291
+
292
+ ##
293
+ # Parses the commands from the command line using Trollop. You probably
294
+ # shouldn't override this method, but if you have good reason, go for it.
295
+ #
296
+ # @return [Hash] The parsed command-line options
297
+ def collect_options
298
+ options = @options # hack to get around the fact that
299
+ help = @help # Trollop uses instance eval
300
+
301
+ Trollop::options do
302
+ # we can't use @options here because Trollop::options uses instance_eval
303
+ options.each do |option|
304
+ opt option[:name], option[:desc], option[:options]
305
+ end
306
+
307
+ banner help
308
+ end
309
+
310
+ end
311
+
312
+ def inspect
313
+ "#<Amp::Command #{name} >"
314
+ end
315
+
316
+ ##
317
+ # Stops this command from running any further - uses the global options.
318
+ # comments are the devil's work.
319
+ # comments are the devil's work.
320
+ def break
321
+ @break = true
322
+ end
323
+
324
+ ##
325
+ # comments are the devil's work.
326
+ def run(options={}, args=[])
327
+ # run the before commands
328
+ @before.each {|cmd| cmd.run options, args; return if @break }
329
+
330
+ @code[options, args] # and of course the actual command...
331
+
332
+ # top it off with the after commands
333
+ @after.each {|cmd| cmd.run options, args; return if @break }
334
+
335
+ self
336
+ end
337
+
338
+ NO_REPO_ALLOWED = {}
339
+ %w(clone init help version debugcomplete debugdata debugindex
340
+ debugindexdot debugdate debuginstall debugfsinfo).each do |k|
341
+ NO_REPO_ALLOWED[k] = true
342
+ end
343
+
344
+ MAYBE_REPO_ALLOWED = {}
345
+ %w().each do |k|
346
+ MAYBE_REPO_ALLOWED[k] = true
347
+ end
348
+
349
+ end
350
+ end
351
+
352
+ module Kernel
353
+ # shortcut
354
+ def command(name, &block)
355
+ Amp::Command.new name, &block
356
+ end
357
+
358
+ # Rake style namespacing
359
+ # After new commands are made, alter their names
360
+ # so that they're "#{namespace}:#{command}"
361
+ def silly_namespace(name)
362
+ # current commands
363
+ commands = Amp::Command.all_commands.keys
364
+
365
+ yield
366
+
367
+ more_commands = Amp::Command.all_commands.keys
368
+ new_commands = more_commands - commands
369
+
370
+ new_commands.each do |key|
371
+ command_to_modify = Amp::Command[key]
372
+ command_to_modify.name = "#{name}:#{key}" # construct the new name
373
+ Amp::Command.all_commands[command_to_modify.name] = Amp::Command.all_commands.delete(key) # and do the switch
374
+ end
375
+ end
376
+ end