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,192 @@
1
+ require "test/unit"
2
+ require File.expand_path(File.join(File.dirname(__FILE__), "../../lib/amp"))
3
+
4
+ # easyness
5
+ class String
6
+ def dir_local; File.expand_path(File.join(File.dirname(__FILE__), self)); end
7
+ end
8
+
9
+
10
+ class TestDirState < Test::Unit::TestCase
11
+
12
+ def setup
13
+ f = File.open File.join(File.dirname(__FILE__), "hgrc")
14
+ @config = PythonConfig::ConfigParser.new f
15
+ opener = Amp::Opener.new File.expand_path(File.dirname(__FILE__))
16
+ opener.default = :open_file
17
+ @state = Amp::Repositories::DirState.new File.expand_path(File.dirname(__FILE__)), @config, opener
18
+ @files = []
19
+ end
20
+
21
+ def teardown
22
+ @files ||= []
23
+ @files.map {|f| File.delete f.dir_local }
24
+ @files = []
25
+ end
26
+
27
+ def test_root
28
+ assert_equal File.expand_path(File.dirname(__FILE__)), @state.root
29
+ end
30
+
31
+ def test_config
32
+ assert_equal @config, @state.config
33
+ end
34
+
35
+ def test_parents_equals
36
+ @state.parents = ["asdfasdf", Amp::RevlogSupport::Node::NULL_ID]
37
+
38
+ assert_equal ["asdfasdf", Amp::RevlogSupport::Node::NULL_ID], @state.parents
39
+
40
+ @state.parents = "asdfasdf"
41
+
42
+ assert_equal ["asdfasdf", Amp::RevlogSupport::Node::NULL_ID], @state.parents
43
+ end
44
+
45
+ def test_dirty?
46
+ @state.parents = ["asdfasdf", Amp::RevlogSupport::Node::NULL_ID] # something to dirty it up
47
+
48
+ assert @state.dirty?
49
+ end
50
+
51
+ def test_dirty
52
+ add_file "elephant"
53
+ @state.dirty "elephant"
54
+
55
+ assert @state["elephant"].dirty?
56
+ end
57
+
58
+ def test_maybe_dirty
59
+ add_file "eels"
60
+ @state.maybe_dirty "eels"
61
+
62
+ assert !@state.copy_map["eels"]
63
+ assert @state["eels"].maybe_dirty?
64
+ end
65
+
66
+ def test_branch_equals
67
+ @files << 'branch'
68
+ @state.branch = "monkey!"
69
+
70
+ text = File.read "branch".dir_local
71
+ assert_equal text, "monkey!\n"
72
+ assert_equal text.chomp, @state.branch
73
+ end
74
+
75
+ def test_copy
76
+ add_file "buttmunch"
77
+ @state.copy "buttmunch" => "arsemunch"
78
+
79
+ assert_equal "buttmunch", @state.copy_map["arsemunch"]
80
+ assert @state.dirty?
81
+
82
+ @state.copy "arsemunch" => "buttmunch"
83
+
84
+ assert @state.copy_map["buttmunch"]
85
+ assert @state.copy_map["arsemunch"]
86
+ end
87
+
88
+ def test_add
89
+ add_file "test"
90
+
91
+ assert @state.files.include?("test")
92
+ assert !@state.copy_map["test"]
93
+ end
94
+
95
+ # shouldn't actually happen IRL, but let's make sure we have
96
+ # the same quirks
97
+ def test_remove
98
+ add_file "monkey" # make sure it's in @files
99
+ @state.remove "monkey"
100
+
101
+ assert @state["monkey"].removed?
102
+ end
103
+
104
+ def test_forget
105
+ add_file "taco"
106
+ @state.forget "taco"
107
+
108
+ assert @state["taco"].untracked?
109
+ end
110
+
111
+ def test_merge
112
+ add_file "burritos"
113
+ @state.merge "burritos"
114
+
115
+ assert @state["burritos"].merged?
116
+ end
117
+
118
+ def test_normal
119
+ add_file "poop"
120
+ @state.normal "poop"
121
+
122
+ assert @state["poop"].normal?
123
+ assert !@state.copy_map["poop"]
124
+ end
125
+
126
+ def test_clear
127
+ add_file "poopy"
128
+ @state.clear
129
+
130
+ assert @state.files.empty?
131
+ end
132
+
133
+ def test_rebuild
134
+ #add_file "testy"
135
+
136
+ files = @state.files.dup
137
+ rents = @state.parents.dup
138
+
139
+ @state.rebuild rents, files
140
+ assert_equal files, @state.files
141
+ end
142
+
143
+ def test_write
144
+ add_file "oh_nuit"
145
+ @state.write
146
+
147
+ info = File.read("dirstate".dir_local)
148
+ info.force_encoding("ASCII-8BIT") if RUBY_VERSION >= "1.9"
149
+ string = "\000\000\000\000\000\000\000" +
150
+ "\000\000\000\000\000\000\000" +
151
+ "\000\000\000\000\000\000\000" +
152
+ "\000\000\000\000\000\000\000" +
153
+ "\000\000\000\000\000\000\000" +
154
+ "\000\000\000\000\000a\000\000" +
155
+ "\000\000\377\377\377\377\377" +
156
+ "\377\377\377\000\000\000\aoh_nuit"
157
+ assert_equal string, info
158
+ end
159
+
160
+ def test_parse
161
+ @files = []
162
+ # some fake data
163
+ open "dirstate".dir_local, "w" do |f|
164
+ string = "\000\000\000\000\000\000\000" +
165
+ "\000\000\000\000\000\000\000" +
166
+ "\000\000\000\000\000\000\000" +
167
+ "\000\000\000\000\000\000\000" +
168
+ "\000\000\000\000\000\000\000" +
169
+ "\000\000\000\000\000a\000\000" +
170
+ "\000\000\377\377\377\377\377" +
171
+ "\377\377\377\000\000\000\aoh_nuit"
172
+ f.write string
173
+ end
174
+
175
+ @state.send :read!
176
+
177
+ assert_equal({"oh_nuit" => Amp::Repositories::DirStateEntry.new(:added, 0, -1, -1)}, @state.files)
178
+ assert_equal({}, @state.copy_map)
179
+ end
180
+
181
+ private
182
+ def add_file(name)
183
+ open name.dir_local, "w" do |f|
184
+ f.puts "testyness!"
185
+ end
186
+
187
+ @state.add name
188
+ (@files ||= []) << name
189
+ end
190
+
191
+ end
192
+
@@ -0,0 +1,2 @@
1
+ syntax: regexp
2
+ .*?lolcats\.rb$
@@ -0,0 +1,25 @@
1
+ The Amp Commandments:
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.
5
+ 3. Thou shalt preface thine variables with _ only when thou needest,
6
+ lest ye face judgement for this most grave sin.
7
+ 4. Thine variables should have descriptive names, for thine ruby must
8
+ read like the psalms.
9
+ 5. Thine variables, longer than 6 letters and composed of two or more
10
+ words, shall separate those words with the lord's underscore, so thine
11
+ code shall flow like the Nile herself.
12
+ 6. Thou shalt rake thine yard frequently, to be sure thine code is
13
+ well-documented for thine neighbors.
14
+ 7. Thou shalt use alias_method over alias or I shall goeth Chris Brown
15
+ all over thou.
16
+ 8. Thou shalt use parentheses in thine defintions of methods, for the
17
+ consistency of the codes in this repository. Sir William Morgan will
18
+ have to change the style of himself, for his is strange yet beautiful
19
+ but still unwanted like a D of the ST kind.
20
+ 9. Thine comments shall start, when above thine method definitions, with
21
+ 2 (two) hashes, and the information, then, beginning on the line below
22
+ it. Thou shalt leave one blank comment line between thine comment info
23
+ and thine yard information.
24
+ 10. Thou shalt make great and grand use of the yard extension. It is good.
25
+ 11. Name thine motherfucking variables motherfucking descriptively.
@@ -0,0 +1,372 @@
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
+ @parser ? @parser.educate : ''
234
+ end
235
+ alias_method :education, :educate
236
+
237
+ ##
238
+ # Sets the command to not laod a repository when run. Useful for purely
239
+ # informational commands (such as version) or initializing a new
240
+ # repository.
241
+ def no_repo
242
+ NO_REPO_ALLOWED[@name] = true
243
+ end
244
+
245
+ # @see no_repo
246
+ def no_repo=(value)
247
+ NO_REPO_ALLOWED[@name] = value
248
+ end
249
+
250
+ ##
251
+ # Sets the command to not require a repository to run, but try to load one.
252
+ # Used, for example, for the templates command, which sometimes stores
253
+ # information in the local repository.
254
+ def maybe_repo
255
+ MAYBE_REPO_ALLOWED[@name] = true
256
+ end
257
+
258
+ # @see no_repo
259
+ def maybe_repo=(value)
260
+ MAYBE_REPO_ALLOWED[@name] = value
261
+ end
262
+
263
+ ##
264
+ # Sets the help text for the command. This can be a very long string,
265
+ # as it is what the user sees when they type `amp help +name+`
266
+ #
267
+ # @param str the help text to set
268
+ # @example cmd.help %Q{
269
+ # Big help text!
270
+ # }
271
+ def help(str=nil)
272
+ str ? @help << str : @help
273
+ end
274
+
275
+ ##
276
+ # Sets the help text for the command. This can be a very long string,
277
+ # as it is what the user sees when they type `amp help +name+`
278
+ #
279
+ # @param str the help text to set
280
+ alias :help= :help
281
+
282
+ ##
283
+ # Parses the commands from the command line using Trollop. You probably
284
+ # shouldn't override this method, but if you have good reason, go for it.
285
+ #
286
+ # @return [Hash] The parsed command-line options
287
+ def collect_options
288
+ options = @options # hack to get around the fact that
289
+ help = @help # Trollop uses instance eval
290
+
291
+ Trollop::options do
292
+ # we can't use @options here because Trollop::options uses instance_eval
293
+ options.each do |option|
294
+ opt option[:name], option[:desc], option[:options]
295
+ end
296
+
297
+ banner help
298
+ end
299
+
300
+ end
301
+
302
+ def inspect
303
+ "#<Amp::Command #{name} >"
304
+ end
305
+
306
+ ##
307
+ # Stops this command from running any further - uses the global options.
308
+ def break
309
+ @break = true
310
+ end
311
+
312
+ ##
313
+ # Called by the dispatcher to execute the command. You really don't need to
314
+ # override this. The `@break` instance variable can be set by anything, which
315
+ # will halt the chain.
316
+ #
317
+ # @param options The global options, merged with the command-specific
318
+ # options, as decided by the dispatcher.
319
+ # @param arguments The list of arguments, passed after the options. Could
320
+ # be a filename, for example.
321
+ # @return [Amp::Command] the command being run
322
+ def run(options={}, args=[])
323
+ # run the before commands
324
+ @before.each {|cmd| cmd.run options, args; return if @break }
325
+
326
+ @code[options, args] # and of course the actual command...
327
+
328
+ # top it off with the after commands
329
+ @after.each {|cmd| cmd.run options, args; return if @break }
330
+
331
+ self
332
+ end
333
+
334
+ NO_REPO_ALLOWED = {}
335
+ %w(clone init help version debugcomplete debugdata debugindex
336
+ debugindexdot debugdate debuginstall debugfsinfo).each do |k|
337
+ NO_REPO_ALLOWED[k] = true
338
+ end
339
+
340
+ MAYBE_REPO_ALLOWED = {}
341
+ %w().each do |k|
342
+ MAYBE_REPO_ALLOWED[k] = true
343
+ end
344
+
345
+ end
346
+ end
347
+
348
+ module Kernel
349
+ # shortcut
350
+ def command(name, &block)
351
+ Amp::Command.new name, &block
352
+ end
353
+
354
+ # Rake style namespacing
355
+ # After new commands are made, alter their names
356
+ # so that they're "#{namespace}:#{command}"
357
+ def volt_namespace(name)
358
+ # current commands
359
+ commands = Amp::Command.all_commands.keys
360
+
361
+ yield
362
+
363
+ more_commands = Amp::Command.all_commands.keys
364
+ new_commands = more_commands - commands
365
+
366
+ new_commands.each do |key|
367
+ command_to_modify = Amp::Command[key]
368
+ command_to_modify.name = "#{name}:#{key}" # construct the new name
369
+ Amp::Command.all_commands[command_to_modify.name] = Amp::Command.all_commands.delete(key) # and do the switch
370
+ end
371
+ end
372
+ end