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.
- data/.gitignore +1 -0
- data/.hgignore +26 -0
- data/AUTHORS +2 -0
- data/History.txt +6 -0
- data/LICENSE +37 -0
- data/MANIFESTO +7 -0
- data/Manifest.txt +294 -0
- data/README.md +129 -0
- data/Rakefile +102 -0
- data/SCHEDULE.markdown +12 -0
- data/STYLE +27 -0
- data/TODO.markdown +149 -0
- data/ampfile.rb +47 -0
- data/bin/amp +30 -0
- data/bin/amp1.9 +30 -0
- data/ext/amp/bz2/README.txt +39 -0
- data/ext/amp/bz2/bz2.c +1582 -0
- data/ext/amp/bz2/extconf.rb +77 -0
- data/ext/amp/bz2/mkmf.log +29 -0
- data/ext/amp/mercurial_patch/extconf.rb +5 -0
- data/ext/amp/mercurial_patch/mpatch.c +405 -0
- data/ext/amp/priority_queue/extconf.rb +5 -0
- data/ext/amp/priority_queue/priority_queue.c +947 -0
- data/ext/amp/support/extconf.rb +5 -0
- data/ext/amp/support/support.c +250 -0
- data/lib/amp.rb +200 -0
- data/lib/amp/commands/command.rb +507 -0
- data/lib/amp/commands/command_support.rb +137 -0
- data/lib/amp/commands/commands/config.rb +143 -0
- data/lib/amp/commands/commands/help.rb +29 -0
- data/lib/amp/commands/commands/init.rb +10 -0
- data/lib/amp/commands/commands/templates.rb +137 -0
- data/lib/amp/commands/commands/version.rb +7 -0
- data/lib/amp/commands/commands/workflow.rb +28 -0
- data/lib/amp/commands/commands/workflows/git/add.rb +65 -0
- data/lib/amp/commands/commands/workflows/git/copy.rb +27 -0
- data/lib/amp/commands/commands/workflows/git/mv.rb +23 -0
- data/lib/amp/commands/commands/workflows/git/rm.rb +60 -0
- data/lib/amp/commands/commands/workflows/hg/add.rb +53 -0
- data/lib/amp/commands/commands/workflows/hg/addremove.rb +86 -0
- data/lib/amp/commands/commands/workflows/hg/annotate.rb +46 -0
- data/lib/amp/commands/commands/workflows/hg/archive.rb +126 -0
- data/lib/amp/commands/commands/workflows/hg/branch.rb +28 -0
- data/lib/amp/commands/commands/workflows/hg/branches.rb +30 -0
- data/lib/amp/commands/commands/workflows/hg/bundle.rb +115 -0
- data/lib/amp/commands/commands/workflows/hg/clone.rb +95 -0
- data/lib/amp/commands/commands/workflows/hg/commit.rb +42 -0
- data/lib/amp/commands/commands/workflows/hg/copy.rb +31 -0
- data/lib/amp/commands/commands/workflows/hg/debug/dirstate.rb +32 -0
- data/lib/amp/commands/commands/workflows/hg/debug/index.rb +36 -0
- data/lib/amp/commands/commands/workflows/hg/default.rb +9 -0
- data/lib/amp/commands/commands/workflows/hg/diff.rb +30 -0
- data/lib/amp/commands/commands/workflows/hg/forget.rb +11 -0
- data/lib/amp/commands/commands/workflows/hg/heads.rb +25 -0
- data/lib/amp/commands/commands/workflows/hg/identify.rb +23 -0
- data/lib/amp/commands/commands/workflows/hg/import.rb +135 -0
- data/lib/amp/commands/commands/workflows/hg/incoming.rb +85 -0
- data/lib/amp/commands/commands/workflows/hg/info.rb +18 -0
- data/lib/amp/commands/commands/workflows/hg/log.rb +21 -0
- data/lib/amp/commands/commands/workflows/hg/manifest.rb +13 -0
- data/lib/amp/commands/commands/workflows/hg/merge.rb +53 -0
- data/lib/amp/commands/commands/workflows/hg/move.rb +28 -0
- data/lib/amp/commands/commands/workflows/hg/outgoing.rb +61 -0
- data/lib/amp/commands/commands/workflows/hg/pull.rb +74 -0
- data/lib/amp/commands/commands/workflows/hg/push.rb +20 -0
- data/lib/amp/commands/commands/workflows/hg/remove.rb +45 -0
- data/lib/amp/commands/commands/workflows/hg/resolve.rb +83 -0
- data/lib/amp/commands/commands/workflows/hg/revert.rb +53 -0
- data/lib/amp/commands/commands/workflows/hg/root.rb +13 -0
- data/lib/amp/commands/commands/workflows/hg/serve.rb +38 -0
- data/lib/amp/commands/commands/workflows/hg/status.rb +116 -0
- data/lib/amp/commands/commands/workflows/hg/tag.rb +69 -0
- data/lib/amp/commands/commands/workflows/hg/tags.rb +27 -0
- data/lib/amp/commands/commands/workflows/hg/tip.rb +13 -0
- data/lib/amp/commands/commands/workflows/hg/update.rb +27 -0
- data/lib/amp/commands/commands/workflows/hg/verify.rb +9 -0
- data/lib/amp/commands/commands/workflows/hg/view.rb +36 -0
- data/lib/amp/commands/dispatch.rb +181 -0
- data/lib/amp/commands/hooks.rb +81 -0
- data/lib/amp/dependencies/amp_support.rb +1 -0
- data/lib/amp/dependencies/amp_support/ruby_amp_support.rb +103 -0
- data/lib/amp/dependencies/minitar.rb +979 -0
- data/lib/amp/dependencies/priority_queue.rb +18 -0
- data/lib/amp/dependencies/priority_queue/c_priority_queue.rb +1 -0
- data/lib/amp/dependencies/priority_queue/poor_priority_queue.rb +46 -0
- data/lib/amp/dependencies/priority_queue/ruby_priority_queue.rb +525 -0
- data/lib/amp/dependencies/python_config.rb +211 -0
- data/lib/amp/dependencies/trollop.rb +713 -0
- data/lib/amp/dependencies/zip/ioextras.rb +155 -0
- data/lib/amp/dependencies/zip/stdrubyext.rb +111 -0
- data/lib/amp/dependencies/zip/tempfile_bugfixed.rb +186 -0
- data/lib/amp/dependencies/zip/zip.rb +1850 -0
- data/lib/amp/dependencies/zip/zipfilesystem.rb +609 -0
- data/lib/amp/dependencies/zip/ziprequire.rb +90 -0
- data/lib/amp/encoding/base85.rb +97 -0
- data/lib/amp/encoding/binary_diff.rb +82 -0
- data/lib/amp/encoding/difflib.rb +166 -0
- data/lib/amp/encoding/mercurial_diff.rb +378 -0
- data/lib/amp/encoding/mercurial_patch.rb +1 -0
- data/lib/amp/encoding/patch.rb +292 -0
- data/lib/amp/encoding/pure_ruby/ruby_mercurial_patch.rb +123 -0
- data/lib/amp/extensions/ditz.rb +41 -0
- data/lib/amp/extensions/lighthouse.rb +167 -0
- data/lib/amp/graphs/ancestor.rb +147 -0
- data/lib/amp/graphs/copies.rb +261 -0
- data/lib/amp/merges/merge_state.rb +164 -0
- data/lib/amp/merges/merge_ui.rb +322 -0
- data/lib/amp/merges/simple_merge.rb +450 -0
- data/lib/amp/profiling_hacks.rb +36 -0
- data/lib/amp/repository/branch_manager.rb +234 -0
- data/lib/amp/repository/dir_state.rb +950 -0
- data/lib/amp/repository/journal.rb +203 -0
- data/lib/amp/repository/lock.rb +207 -0
- data/lib/amp/repository/repositories/bundle_repository.rb +214 -0
- data/lib/amp/repository/repositories/http_repository.rb +377 -0
- data/lib/amp/repository/repositories/local_repository.rb +2661 -0
- data/lib/amp/repository/repository.rb +94 -0
- data/lib/amp/repository/store.rb +485 -0
- data/lib/amp/repository/tag_manager.rb +319 -0
- data/lib/amp/repository/updatable.rb +532 -0
- data/lib/amp/repository/verification.rb +431 -0
- data/lib/amp/repository/versioned_file.rb +475 -0
- data/lib/amp/revlogs/bundle_revlogs.rb +246 -0
- data/lib/amp/revlogs/changegroup.rb +217 -0
- data/lib/amp/revlogs/changelog.rb +338 -0
- data/lib/amp/revlogs/changeset.rb +521 -0
- data/lib/amp/revlogs/file_log.rb +165 -0
- data/lib/amp/revlogs/index.rb +493 -0
- data/lib/amp/revlogs/manifest.rb +195 -0
- data/lib/amp/revlogs/node.rb +18 -0
- data/lib/amp/revlogs/revlog.rb +1032 -0
- data/lib/amp/revlogs/revlog_support.rb +126 -0
- data/lib/amp/server/amp_user.rb +44 -0
- data/lib/amp/server/extension/amp_extension.rb +396 -0
- data/lib/amp/server/extension/authorization.rb +201 -0
- data/lib/amp/server/fancy_http_server.rb +252 -0
- data/lib/amp/server/fancy_views/_browser.haml +28 -0
- data/lib/amp/server/fancy_views/_diff_file.haml +13 -0
- data/lib/amp/server/fancy_views/_navbar.haml +17 -0
- data/lib/amp/server/fancy_views/changeset.haml +31 -0
- data/lib/amp/server/fancy_views/commits.haml +32 -0
- data/lib/amp/server/fancy_views/file.haml +35 -0
- data/lib/amp/server/fancy_views/file_diff.haml +23 -0
- data/lib/amp/server/fancy_views/harshcss/all_hallows_eve.css +72 -0
- data/lib/amp/server/fancy_views/harshcss/amy.css +147 -0
- data/lib/amp/server/fancy_views/harshcss/twilight.css +138 -0
- data/lib/amp/server/fancy_views/stylesheet.sass +175 -0
- data/lib/amp/server/http_server.rb +140 -0
- data/lib/amp/server/repo_user_management.rb +287 -0
- data/lib/amp/support/amp_config.rb +164 -0
- data/lib/amp/support/amp_ui.rb +287 -0
- data/lib/amp/support/docs.rb +54 -0
- data/lib/amp/support/generator.rb +78 -0
- data/lib/amp/support/ignore.rb +144 -0
- data/lib/amp/support/loaders.rb +93 -0
- data/lib/amp/support/logger.rb +103 -0
- data/lib/amp/support/match.rb +151 -0
- data/lib/amp/support/multi_io.rb +87 -0
- data/lib/amp/support/openers.rb +121 -0
- data/lib/amp/support/ruby_19_compatibility.rb +66 -0
- data/lib/amp/support/support.rb +1095 -0
- data/lib/amp/templates/blank.commit.erb +23 -0
- data/lib/amp/templates/blank.log.erb +18 -0
- data/lib/amp/templates/default.commit.erb +23 -0
- data/lib/amp/templates/default.log.erb +26 -0
- data/lib/amp/templates/template.rb +165 -0
- data/site/Rakefile +24 -0
- data/site/src/about/ampfile.haml +57 -0
- data/site/src/about/commands.haml +106 -0
- data/site/src/about/index.haml +33 -0
- data/site/src/about/performance.haml +31 -0
- data/site/src/about/workflows.haml +34 -0
- data/site/src/contribute/index.haml +65 -0
- data/site/src/contribute/style.haml +297 -0
- data/site/src/css/active4d.css +114 -0
- data/site/src/css/all_hallows_eve.css +72 -0
- data/site/src/css/all_themes.css +3299 -0
- data/site/src/css/amp.css +260 -0
- data/site/src/css/amy.css +147 -0
- data/site/src/css/blackboard.css +88 -0
- data/site/src/css/brilliance_black.css +605 -0
- data/site/src/css/brilliance_dull.css +599 -0
- data/site/src/css/cobalt.css +149 -0
- data/site/src/css/cur_amp.css +185 -0
- data/site/src/css/dawn.css +121 -0
- data/site/src/css/eiffel.css +121 -0
- data/site/src/css/espresso_libre.css +109 -0
- data/site/src/css/idle.css +62 -0
- data/site/src/css/iplastic.css +80 -0
- data/site/src/css/lazy.css +73 -0
- data/site/src/css/mac_classic.css +123 -0
- data/site/src/css/magicwb_amiga.css +104 -0
- data/site/src/css/pastels_on_dark.css +188 -0
- data/site/src/css/reset.css +55 -0
- data/site/src/css/slush_poppies.css +85 -0
- data/site/src/css/spacecadet.css +51 -0
- data/site/src/css/sunburst.css +180 -0
- data/site/src/css/twilight.css +137 -0
- data/site/src/css/zenburnesque.css +91 -0
- data/site/src/get/index.haml +32 -0
- data/site/src/helpers.rb +121 -0
- data/site/src/images/amp_logo.png +0 -0
- data/site/src/images/carbonica.png +0 -0
- data/site/src/images/revolution.png +0 -0
- data/site/src/images/tab-bg.png +0 -0
- data/site/src/images/tab-sliding-left.png +0 -0
- data/site/src/images/tab-sliding-right.png +0 -0
- data/site/src/include/_footer.haml +22 -0
- data/site/src/include/_header.haml +17 -0
- data/site/src/index.haml +104 -0
- data/site/src/learn/index.haml +46 -0
- data/site/src/scripts/jquery-1.3.2.min.js +19 -0
- data/site/src/scripts/jquery.cookie.js +96 -0
- data/tasks/stats.rake +155 -0
- data/tasks/yard.rake +171 -0
- data/test/dirstate_tests/dirstate +0 -0
- data/test/dirstate_tests/hgrc +5 -0
- data/test/dirstate_tests/test_dir_state.rb +192 -0
- data/test/functional_tests/resources/.hgignore +2 -0
- data/test/functional_tests/resources/STYLE.txt +25 -0
- data/test/functional_tests/resources/command.rb +372 -0
- data/test/functional_tests/resources/commands/annotate.rb +57 -0
- data/test/functional_tests/resources/commands/experimental/lolcats.rb +17 -0
- data/test/functional_tests/resources/commands/heads.rb +22 -0
- data/test/functional_tests/resources/commands/manifest.rb +12 -0
- data/test/functional_tests/resources/commands/status.rb +90 -0
- data/test/functional_tests/resources/version2/.hgignore +5 -0
- data/test/functional_tests/resources/version2/STYLE.txt +25 -0
- data/test/functional_tests/resources/version2/command.rb +372 -0
- data/test/functional_tests/resources/version2/commands/annotate.rb +45 -0
- data/test/functional_tests/resources/version2/commands/experimental/lolcats.rb +17 -0
- data/test/functional_tests/resources/version2/commands/heads.rb +22 -0
- data/test/functional_tests/resources/version2/commands/manifest.rb +12 -0
- data/test/functional_tests/resources/version2/commands/status.rb +90 -0
- data/test/functional_tests/resources/version3/.hgignore +5 -0
- data/test/functional_tests/resources/version3/STYLE.txt +31 -0
- data/test/functional_tests/resources/version3/command.rb +376 -0
- data/test/functional_tests/resources/version3/commands/annotate.rb +45 -0
- data/test/functional_tests/resources/version3/commands/experimental/lolcats.rb +17 -0
- data/test/functional_tests/resources/version3/commands/heads.rb +22 -0
- data/test/functional_tests/resources/version3/commands/manifest.rb +12 -0
- data/test/functional_tests/resources/version3/commands/status.rb +90 -0
- data/test/functional_tests/resources/version4/.hgignore +5 -0
- data/test/functional_tests/resources/version4/STYLE.txt +31 -0
- data/test/functional_tests/resources/version4/command.rb +376 -0
- data/test/functional_tests/resources/version4/commands/experimental/lolcats.rb +17 -0
- data/test/functional_tests/resources/version4/commands/heads.rb +22 -0
- data/test/functional_tests/resources/version4/commands/manifest.rb +12 -0
- data/test/functional_tests/resources/version4/commands/stats.rb +25 -0
- data/test/functional_tests/resources/version4/commands/status.rb +90 -0
- data/test/functional_tests/resources/version5_1/.hgignore +5 -0
- data/test/functional_tests/resources/version5_1/STYLE.txt +2 -0
- data/test/functional_tests/resources/version5_1/command.rb +374 -0
- data/test/functional_tests/resources/version5_1/commands/experimental/lolcats.rb +17 -0
- data/test/functional_tests/resources/version5_1/commands/heads.rb +22 -0
- data/test/functional_tests/resources/version5_1/commands/manifest.rb +12 -0
- data/test/functional_tests/resources/version5_1/commands/stats.rb +25 -0
- data/test/functional_tests/resources/version5_1/commands/status.rb +90 -0
- data/test/functional_tests/resources/version5_2/.hgignore +5 -0
- data/test/functional_tests/resources/version5_2/STYLE.txt +14 -0
- data/test/functional_tests/resources/version5_2/command.rb +376 -0
- data/test/functional_tests/resources/version5_2/commands/experimental/lolcats.rb +17 -0
- data/test/functional_tests/resources/version5_2/commands/manifest.rb +12 -0
- data/test/functional_tests/resources/version5_2/commands/newz.rb +12 -0
- data/test/functional_tests/resources/version5_2/commands/stats.rb +25 -0
- data/test/functional_tests/resources/version5_2/commands/status.rb +90 -0
- data/test/functional_tests/test_functional.rb +604 -0
- data/test/localrepo_tests/test_local_repo.rb +121 -0
- data/test/localrepo_tests/testrepo.tar.gz +0 -0
- data/test/manifest_tests/00manifest.i +0 -0
- data/test/manifest_tests/test_manifest.rb +72 -0
- data/test/merge_tests/base.txt +10 -0
- data/test/merge_tests/expected.local.txt +16 -0
- data/test/merge_tests/local.txt +11 -0
- data/test/merge_tests/remote.txt +11 -0
- data/test/merge_tests/test_merge.rb +26 -0
- data/test/revlog_tests/00changelog.i +0 -0
- data/test/revlog_tests/revision_added_changelog.i +0 -0
- data/test/revlog_tests/test_adding_index.i +0 -0
- data/test/revlog_tests/test_revlog.rb +333 -0
- data/test/revlog_tests/testindex.i +0 -0
- data/test/store_tests/store.tar.gz +0 -0
- data/test/store_tests/test_fncache_store.rb +122 -0
- data/test/test_amp.rb +9 -0
- data/test/test_base85.rb +14 -0
- data/test/test_bdiff.rb +42 -0
- data/test/test_commands.rb +122 -0
- data/test/test_difflib.rb +50 -0
- data/test/test_helper.rb +15 -0
- data/test/test_journal.rb +29 -0
- data/test/test_match.rb +134 -0
- data/test/test_mdiff.rb +74 -0
- data/test/test_mpatch.rb +14 -0
- data/test/test_support.rb +24 -0
- metadata +385 -0
|
@@ -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,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,12 @@
|
|
|
1
|
+
command :newz do |c|
|
|
2
|
+
c.desc "Prints the newz 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,25 @@
|
|
|
1
|
+
command :stats do |c|
|
|
2
|
+
c.desc "Prints the stats 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
|
|
13
|
+
|
|
14
|
+
command :stats do |c|
|
|
15
|
+
c.desc "Prints the stats at a given revision (defaults to working directory)"
|
|
16
|
+
c.add_opt :rev, "Specifies the revision to check", {:short => "-r", :type => :integer}
|
|
17
|
+
c.on_run do |options, arguments|
|
|
18
|
+
revision = options[:rev]
|
|
19
|
+
repo = options[:repository]
|
|
20
|
+
|
|
21
|
+
repo[revision].each do |k, v|
|
|
22
|
+
puts "#{k}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
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,604 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "../test_helper"))
|
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "../../lib/amp"))
|
|
4
|
+
|
|
5
|
+
# easyness
|
|
6
|
+
class String
|
|
7
|
+
def fun_local; File.join($current_basedir, self); end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class TestFunctional < Test::Unit::TestCase
|
|
11
|
+
|
|
12
|
+
AMP_FILE = (RUBY_VERSION < "1.9") ? "amp" : "amp1.9"
|
|
13
|
+
AMP_BINARY = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', AMP_FILE))
|
|
14
|
+
|
|
15
|
+
def setup
|
|
16
|
+
$current_dir = Dir.pwd
|
|
17
|
+
$current_basedir = File.expand_path(File.dirname(__FILE__))
|
|
18
|
+
FileUtils.safe_unlink(File.join($current_basedir, "test.log"))
|
|
19
|
+
clean_dir "testrepo" #just in case
|
|
20
|
+
clean_dir "newrepo"
|
|
21
|
+
clean_dir "conflictrepo"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# This is the big functional test. Since we will be building this repo up
|
|
26
|
+
# from scratch, every single test must pass in order - we can't hope a certain
|
|
27
|
+
# order is followed. So it all goes in one method. Sorry.
|
|
28
|
+
def test_init
|
|
29
|
+
|
|
30
|
+
# Create the mainline repository! Woo!
|
|
31
|
+
run_amp_command "init", "testrepo".fun_local
|
|
32
|
+
|
|
33
|
+
# Make sure we've correctly initialized the repository
|
|
34
|
+
assert_file 'testrepo'
|
|
35
|
+
assert_file 'testrepo/.hg'
|
|
36
|
+
assert_file 'testrepo/.hg/requires'
|
|
37
|
+
assert_file 'testrepo/.hg/store'
|
|
38
|
+
|
|
39
|
+
# Enter the repository. Time to take care of business
|
|
40
|
+
enter_repo "testrepo"
|
|
41
|
+
|
|
42
|
+
# Adds the first file, make sure it was successfully added to the dirstate
|
|
43
|
+
add_file_ensure_added "STYLE.txt"
|
|
44
|
+
|
|
45
|
+
# Commit the first file!
|
|
46
|
+
commit :message => "First commit."
|
|
47
|
+
|
|
48
|
+
# Make sure the first file made it into the manifest
|
|
49
|
+
assert_files_in_manifest "STYLE.txt"
|
|
50
|
+
|
|
51
|
+
# Run basic tests on the `head`, `log`, and `tip` commands
|
|
52
|
+
confirm_head_is_first_commit
|
|
53
|
+
confirm_head_equals_log_limit_one
|
|
54
|
+
confirm_head_equals_tip
|
|
55
|
+
|
|
56
|
+
# Get ready for revision 2: add a bunch of files!
|
|
57
|
+
# Make sure they were successfully added, too.
|
|
58
|
+
add_file_ensure_added "command.rb"
|
|
59
|
+
add_file_ensure_added "commands/annotate.rb"
|
|
60
|
+
add_file_ensure_added "commands/heads.rb"
|
|
61
|
+
add_file_ensure_added "commands/manifest.rb"
|
|
62
|
+
add_file_ensure_added "commands/status.rb"
|
|
63
|
+
|
|
64
|
+
# Copy a file into the repo, but don't add it. This is so we can check
|
|
65
|
+
# if `status` picks up unknown files.
|
|
66
|
+
copy_resource "commands/experimental/lolcats.rb", "commands/experimental/lolcats.rb"
|
|
67
|
+
|
|
68
|
+
# Make sure the file got copied
|
|
69
|
+
assert_file "testrepo/commands/experimental/lolcats.rb"
|
|
70
|
+
|
|
71
|
+
# Make sure status sees it and recognizes it as an unknown file.
|
|
72
|
+
assert_file_has_status "commands/experimental/lolcats.rb", :unknown
|
|
73
|
+
|
|
74
|
+
# Commit the second round of files
|
|
75
|
+
commit :message => "Second commit, added commands\nInteresting stuff."
|
|
76
|
+
|
|
77
|
+
# Make sure the second set of files are all in the manifest now
|
|
78
|
+
assert_files_in_manifest "command.rb", "commands/annotate.rb", "commands/heads.rb",
|
|
79
|
+
"commands/manifest.rb", "commands/status.rb", "STYLE.txt"
|
|
80
|
+
|
|
81
|
+
# Add our .hgignore file so we can test for ignored status
|
|
82
|
+
add_file_ensure_added ".hgignore"
|
|
83
|
+
|
|
84
|
+
# Make sure it picks up on lolcats.rb being an ignored file
|
|
85
|
+
assert_file_has_status "commands/experimental/lolcats.rb", :ignored
|
|
86
|
+
|
|
87
|
+
# Make sure we can see which files are clean
|
|
88
|
+
assert_file_has_status "STYLE.txt", :clean
|
|
89
|
+
|
|
90
|
+
## Let's move the repo to version 2. woot! This copies the version2
|
|
91
|
+
## resources into the working directory
|
|
92
|
+
replace_resources_with_version "version2"
|
|
93
|
+
|
|
94
|
+
# Version 2 modifies STYLE.txt and commands/annotate.rb.
|
|
95
|
+
# So let's run some status checks, making sure that those 2 files are marked
|
|
96
|
+
# as modified, .hgignore is still marked as added (we added it above), and
|
|
97
|
+
# an unmodified file is still marked as clean.
|
|
98
|
+
assert_file_has_status "STYLE.txt", :modified
|
|
99
|
+
assert_file_has_status "commands/annotate.rb", :modified
|
|
100
|
+
assert_file_has_status ".hgignore", :added #it's modified, but still should be added
|
|
101
|
+
assert_file_has_status "commands/manifest.rb", :clean
|
|
102
|
+
|
|
103
|
+
# Commit version 2, and specify a custom user.
|
|
104
|
+
commit :message => "Changed a couple files!", :user => "medgar"
|
|
105
|
+
|
|
106
|
+
# Make sure .hgignore got successfully added to the repo
|
|
107
|
+
assert_file_in_manifest ".hgignore"
|
|
108
|
+
|
|
109
|
+
# Make sure our custom user worked
|
|
110
|
+
assert_command_match(/user\: +medgar/, "log", nil, :limit => 1)
|
|
111
|
+
# Make sure the repo's still spiffy
|
|
112
|
+
assert_verify
|
|
113
|
+
|
|
114
|
+
# We're done with testrepo. Time to try some more advanced stuff. Exit testrepo.
|
|
115
|
+
exit_repo
|
|
116
|
+
|
|
117
|
+
# Clone testrepo to create "newrepo".
|
|
118
|
+
run_amp_command "clone #{"testrepo".fun_local} #{"newrepo".fun_local}"
|
|
119
|
+
# Enter the newrepo repository.
|
|
120
|
+
enter_repo "newrepo"
|
|
121
|
+
|
|
122
|
+
# Update this child repo to version 3
|
|
123
|
+
replace_resources_with_version "version3"
|
|
124
|
+
# Make sure command.rb was successfully modified
|
|
125
|
+
assert_file_has_status "command.rb", :modified
|
|
126
|
+
# Commit the modification
|
|
127
|
+
commit :message => "demonic infestation in command.rb", :user => "seydar"
|
|
128
|
+
|
|
129
|
+
# Add the curently ignored file
|
|
130
|
+
add_file_ensure_added "commands/experimental/lolcats.rb"
|
|
131
|
+
# And make sure it shows up as added, even though it falls under ignore rules
|
|
132
|
+
assert_file_has_status "commands/experimental/lolcats.rb", :added
|
|
133
|
+
# Commit our lolcats command
|
|
134
|
+
commit :message => "experimental branch with the lolcats command", :user => "seydar"
|
|
135
|
+
# Make sure that the custom user is still peachy
|
|
136
|
+
assert_command_match(/user\: +seydar/, "log", nil, :limit => 1)
|
|
137
|
+
|
|
138
|
+
# Push upstream to testrepo
|
|
139
|
+
run_amp_command "push"
|
|
140
|
+
|
|
141
|
+
# Switch to testrepo
|
|
142
|
+
exit_repo
|
|
143
|
+
enter_repo "testrepo"
|
|
144
|
+
|
|
145
|
+
# Make sure we didn't corrupt the upstream repo with our push
|
|
146
|
+
assert_verify
|
|
147
|
+
# Update to the newly pushed changesets
|
|
148
|
+
assert_command_match(/3 files updated/, "update")
|
|
149
|
+
# Verify that the head changeset is the correct one (about the lolcats branch)
|
|
150
|
+
assert_command_match(/experimental branch/, "head")
|
|
151
|
+
|
|
152
|
+
# Remove a file from the repo (using `amp remove`)
|
|
153
|
+
remove_file "commands/annotate.rb"
|
|
154
|
+
# And make sure it's marked as removed in the status
|
|
155
|
+
assert_file_is_removed "commands/annotate.rb"
|
|
156
|
+
# Update to version 4
|
|
157
|
+
replace_resources_with_version "version4"
|
|
158
|
+
# Add a file from version4 that we didn't have before, and make sure it gets
|
|
159
|
+
# added to the dirstate
|
|
160
|
+
add_file_ensure_added "version4/commands/stats.rb", "commands/stats.rb"
|
|
161
|
+
# Commit the file removal and the new addition
|
|
162
|
+
commit :message => "removed stupid annotate command. added stats!", :date => "1/1/2009"
|
|
163
|
+
|
|
164
|
+
# Make sure stats is marked as clean
|
|
165
|
+
assert_file_has_status "commands/stats.rb", :clean
|
|
166
|
+
|
|
167
|
+
# We have to do some juggling here because Ruby 1.9 will produce a different string for
|
|
168
|
+
# the date. So just hand-parse the input string and see if the result is in the changelog.
|
|
169
|
+
require 'time'
|
|
170
|
+
t = Time.parse("1/1/2009")
|
|
171
|
+
assert_command_match(/#{t.to_s}/, "log -l 1")
|
|
172
|
+
|
|
173
|
+
# Over-zealous verification never hurt anyone
|
|
174
|
+
assert_verify
|
|
175
|
+
|
|
176
|
+
# Switch to our child repo, so we can pull that new changeset!
|
|
177
|
+
exit_repo
|
|
178
|
+
enter_repo "newrepo"
|
|
179
|
+
|
|
180
|
+
# Pull! wooooo!
|
|
181
|
+
assert_command_match(/added 1 changesets/, "pull")
|
|
182
|
+
# Update it
|
|
183
|
+
update_result = run_amp_command "update"
|
|
184
|
+
# And check to see if the 2 things we did were both in the update
|
|
185
|
+
assert_match(/1 files updated/, update_result)
|
|
186
|
+
assert_match(/1 files removed/, update_result)
|
|
187
|
+
|
|
188
|
+
# Make sure that commands/annotate.rb was removed by the update
|
|
189
|
+
assert_false File.exist?(File.expand_path(File.join(Dir.pwd,"commands/annotate.rb")))
|
|
190
|
+
|
|
191
|
+
# ok, so right now, newrepo is the same as testrepo.
|
|
192
|
+
# now to generate a conflict, so we can test merging. we'll need a second child repo.
|
|
193
|
+
exit_repo
|
|
194
|
+
run_amp_command "clone #{"testrepo".fun_local} #{"conflictrepo".fun_local}"
|
|
195
|
+
|
|
196
|
+
# create one branch in conflictrepo
|
|
197
|
+
enter_repo "conflictrepo"
|
|
198
|
+
replace_resources_with_version "version5_1"
|
|
199
|
+
run_amp_command "status"
|
|
200
|
+
commit :message => "conflict, part 1"
|
|
201
|
+
exit_repo
|
|
202
|
+
|
|
203
|
+
# and create a conflicting branch in newrepo
|
|
204
|
+
enter_repo "newrepo"
|
|
205
|
+
remove_file_without_amp "commands/heads.rb"
|
|
206
|
+
replace_resources_with_version "version5_2"
|
|
207
|
+
|
|
208
|
+
# test addremove, while we're at it!
|
|
209
|
+
addremove_result = run_amp_command "addremove"
|
|
210
|
+
assert_match(/Adding commands\/newz.rb/, addremove_result)
|
|
211
|
+
assert_match(/Removing commands\/heads.rb/, addremove_result)
|
|
212
|
+
run_amp_command "status"
|
|
213
|
+
commit :message => "conflict, part 2"
|
|
214
|
+
|
|
215
|
+
# push our conflicting commit to testrepo from the "newrepo" child.
|
|
216
|
+
push_results = run_amp_command "push"
|
|
217
|
+
assert_match(/1 changeset/, push_results)
|
|
218
|
+
assert_match(/2 changes/, push_results)
|
|
219
|
+
assert_match(/2 files/, push_results)
|
|
220
|
+
|
|
221
|
+
exit_repo
|
|
222
|
+
|
|
223
|
+
# Ok, so conflictrepo wants to push its local commits, but they cross
|
|
224
|
+
# the branch that testrepo's at. So we'll need to pull newrepo's commit,
|
|
225
|
+
# merge, and then push.
|
|
226
|
+
enter_repo "conflictrepo"
|
|
227
|
+
# push should fail
|
|
228
|
+
assert_command_match(/new remote heads?/, "push")
|
|
229
|
+
# pull in newrepo's conflicting commit (it will yell at us for the extra head)
|
|
230
|
+
assert_command_match(/\+1 heads?/, "pull")
|
|
231
|
+
# Try to merge the 2 changesets
|
|
232
|
+
result = run_amp_command("merge")
|
|
233
|
+
|
|
234
|
+
# Expected results from the merge
|
|
235
|
+
assert_match(/1 files? unresolved/, result)
|
|
236
|
+
assert_match(/1 files? removed/, result)
|
|
237
|
+
assert_match(/1 files? updated/, result)
|
|
238
|
+
|
|
239
|
+
# Ok, so we have one file that conflicts: STYLE.txt. We want to keep conflictrepo's
|
|
240
|
+
# version of the file. So we'll suck out the local portion of the conflicted summary.
|
|
241
|
+
data = File.read("STYLE.txt")
|
|
242
|
+
vers1_groups = data.scan(/<<<<<<<.*?\n(.*?)=======/).first
|
|
243
|
+
File.open("STYLE.txt","w") {|f| f.write vers1_groups.first}
|
|
244
|
+
|
|
245
|
+
# mark STYLE.txt as resolved, and make sure it successfully was marked
|
|
246
|
+
resolve_result = run_amp_command("resolve", ["--mark", "STYLE.txt"])
|
|
247
|
+
assert_match(/STYLE.txt marked/, resolve_result)
|
|
248
|
+
assert_match(/resolved/, resolve_result)
|
|
249
|
+
|
|
250
|
+
# commit the branch merge
|
|
251
|
+
commit :message => "conflict resolved!"
|
|
252
|
+
|
|
253
|
+
# push to testrepo
|
|
254
|
+
run_amp_command "push"
|
|
255
|
+
assert_verify
|
|
256
|
+
# make sure we're still intact in conflictrepo
|
|
257
|
+
|
|
258
|
+
# let's go back to testrepo, and make sure our push was successful!
|
|
259
|
+
exit_repo
|
|
260
|
+
enter_repo "testrepo"
|
|
261
|
+
|
|
262
|
+
# did that push sparkle with testrepo?
|
|
263
|
+
assert_verify
|
|
264
|
+
|
|
265
|
+
# Test the copy command
|
|
266
|
+
run_amp_command("copy", ["-v", "STYLE.txt", "STYLE_copied.txt"])
|
|
267
|
+
assert_file_has_status "STYLE_copied.txt", :added
|
|
268
|
+
assert_equal File.read("STYLE.txt"), File.read("STYLE_copied.txt")
|
|
269
|
+
|
|
270
|
+
# Test the move command
|
|
271
|
+
run_amp_command("move", ["command.rb", "command_moved.rb"])
|
|
272
|
+
assert_false File.exist?("command.rb")
|
|
273
|
+
assert File.exist?("command_moved.rb")
|
|
274
|
+
assert_file_has_status "command.rb", :removed
|
|
275
|
+
assert_file_has_status "command_moved.rb", :added
|
|
276
|
+
|
|
277
|
+
# Test the "root" command
|
|
278
|
+
assert_command_match(/#{Dir.pwd}/, "root")
|
|
279
|
+
|
|
280
|
+
# We should be in the "default" branch right now.
|
|
281
|
+
assert_command_match(/default/, "branches")
|
|
282
|
+
assert_command_match(/default/, "branch")
|
|
283
|
+
# Let's change branches.
|
|
284
|
+
assert_command_match(/branch newbranch/, "branch", ["newbranch"])
|
|
285
|
+
assert_command_match(/newbranch/, "branch")
|
|
286
|
+
|
|
287
|
+
# Only 1 tag, which is the tip
|
|
288
|
+
result = run_amp_command("tags").split("\n")
|
|
289
|
+
result = result.select {|entry| entry =~ /[0-9a-f]{10}/}
|
|
290
|
+
assert_equal 1, result.size
|
|
291
|
+
assert_match(/tip/, result.first)
|
|
292
|
+
|
|
293
|
+
# Tag revision 3 as "noobsauce", by "medgar", with commit message "silly commit!"
|
|
294
|
+
run_amp_command("tag", ["noobsauce"], {:rev => 3, :user => "medgar", :message => "silly commit!"})
|
|
295
|
+
|
|
296
|
+
# Let's make sure our tag went in smoothly.
|
|
297
|
+
result = run_amp_command("tags").split("\n")
|
|
298
|
+
result = result.select {|entry| entry =~ /[0-9a-f]{10}/}
|
|
299
|
+
assert_equal 2, result.size
|
|
300
|
+
|
|
301
|
+
# Can't guarantee order, ruby 1.9 switches them, should investigate.
|
|
302
|
+
noobed = result.first =~ /noobsauce/ ? 0 : 1
|
|
303
|
+
tip = 1 - noobed
|
|
304
|
+
|
|
305
|
+
# First listed tag should be noobsauce:3
|
|
306
|
+
assert_match(/noobsauce/, result[noobed])
|
|
307
|
+
assert_match(/3/, result[noobed])
|
|
308
|
+
# second listed tag should be tip:9
|
|
309
|
+
assert_match(/tip/, result[tip])
|
|
310
|
+
assert_match(/9/, result[tip])
|
|
311
|
+
|
|
312
|
+
# And we should make sure the options were passed into the commit correctly.
|
|
313
|
+
head_result = run_amp_command("head")
|
|
314
|
+
assert_match(/medgar/, head_result)
|
|
315
|
+
assert_match(/silly commit!/, head_result)
|
|
316
|
+
|
|
317
|
+
# Commit that baby and make sure we're still rockin'.
|
|
318
|
+
commit :message => "moves and copies"
|
|
319
|
+
assert_verify
|
|
320
|
+
|
|
321
|
+
exit_repo
|
|
322
|
+
enter_repo 'testrepo'
|
|
323
|
+
|
|
324
|
+
# Create a dummy commit
|
|
325
|
+
File.open('used_in_bundle', 'w') {|f| f.write "monkay" }
|
|
326
|
+
amp "commit", :message => 'monkey'
|
|
327
|
+
assert_verify
|
|
328
|
+
|
|
329
|
+
# Create and compare bundles of ALL revisions
|
|
330
|
+
assert_amp_hg_bundle_same 'amp_bundle_all.bundle', :all => true
|
|
331
|
+
|
|
332
|
+
# Now go only up to the 3rd revision.
|
|
333
|
+
assert_amp_hg_bundle_same 'bundle_up_to_3.bundle', :rev => 3, :all => true
|
|
334
|
+
|
|
335
|
+
# We shall now test types 'none', 'bzip2', and 'gzip'
|
|
336
|
+
['none', 'bzip2', 'gzip'].each do |type|
|
|
337
|
+
assert_amp_hg_bundle_same "bundle_up_to_7_with_type_#{type}.bundle",
|
|
338
|
+
:rev => 7, :type => type, :all => true
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# Test making bundles with --base
|
|
342
|
+
assert_amp_hg_bundle_same 'bundle_up_to_3.bundle', :rev => 3, :base => 2
|
|
343
|
+
assert_amp_hg_bundle_same 'bundle_up_to_3.bundle', :base => 3
|
|
344
|
+
ensure
|
|
345
|
+
# cleanup
|
|
346
|
+
exit_repo
|
|
347
|
+
clean_dir "testrepo"
|
|
348
|
+
clean_dir "newrepo"
|
|
349
|
+
clean_dir "conflictrepo"
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
private ##################################
|
|
353
|
+
|
|
354
|
+
def assert_amp_hg_bundle_same(fname, opts={})
|
|
355
|
+
amp "bundle", ["amp_#{fname}"], opts
|
|
356
|
+
hg "bundle", ["hg_#{fname}"], opts
|
|
357
|
+
assert_files_are_same "amp_#{fname}", "hg_#{fname}"
|
|
358
|
+
["amp_#{fname}", "hg_#{fname}"].each {|f| File.delete f }
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
##
|
|
362
|
+
# Asserts that the repo is in perfect working order. This requires the
|
|
363
|
+
# hg binary, since we trust them above all when it comes to verifying our
|
|
364
|
+
# stuff. Fails if there are any integrity errors in our files.
|
|
365
|
+
def assert_verify
|
|
366
|
+
assert_command_no_match(/integrity errors/, "verify")
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
##
|
|
370
|
+
#
|
|
371
|
+
def confirm_head_is_first_commit
|
|
372
|
+
heads_result = run_amp_command("heads")
|
|
373
|
+
assert_match(/changeset\: +0\:/, heads_result)
|
|
374
|
+
assert_match(/First commit\./, heads_result)
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
##
|
|
378
|
+
# Asserts that a) heads returns the most recent revision, b) log -l 1 returns only
|
|
379
|
+
# one revision.
|
|
380
|
+
def confirm_head_equals_log_limit_one
|
|
381
|
+
assert_equal run_amp_command("heads").strip, run_amp_command("log -l 1").strip
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
##
|
|
385
|
+
# Asserts that a) heads returns the most recent revision, b) tip returns the correct
|
|
386
|
+
# revision.
|
|
387
|
+
def confirm_head_equals_tip
|
|
388
|
+
assert_equal run_amp_command("heads").strip, run_amp_command("tip").strip
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
##########################################
|
|
392
|
+
## MAJOR HELPER METHODS
|
|
393
|
+
###########################################
|
|
394
|
+
|
|
395
|
+
def add_file_ensure_added(source, dest=source)
|
|
396
|
+
copy_resource(source, dest)
|
|
397
|
+
assert_file "#{@current_repo}/#{dest}"
|
|
398
|
+
run_amp_command "add", dest
|
|
399
|
+
|
|
400
|
+
assert_file_is_added dest
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
def remove_file(source)
|
|
404
|
+
run_amp_command "remove", source
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
def assert_files_in_manifest(*files)
|
|
408
|
+
manifest_result = run_amp_command("manifest")
|
|
409
|
+
[*files].each do |file|
|
|
410
|
+
assert_match(/#{file}/, manifest_result)
|
|
411
|
+
end
|
|
412
|
+
end
|
|
413
|
+
alias_method :assert_file_in_manifest, :assert_files_in_manifest
|
|
414
|
+
|
|
415
|
+
def assert_file_is_added(file)
|
|
416
|
+
assert_file_has_status(file, :added)
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
def assert_file_is_removed(file)
|
|
420
|
+
assert_file_has_status(file, :removed)
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
def assert_files_are_same(file1, file2)
|
|
424
|
+
flunk "Tried to compare #{file1} but it doesn't exist" unless File.exist? file1
|
|
425
|
+
flunk "Tried to compare #{file2} but it doesn't exist" unless File.exist? file2
|
|
426
|
+
|
|
427
|
+
output1 = `md5 #{file1}`.strip.match(/MD5 (?:.+) = (.*)/)
|
|
428
|
+
output2 = `md5 #{file2}`.strip.match(/MD5 (?:.+) = (.*)/)
|
|
429
|
+
assert_equal output1[1], output2[1]
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
def assert_command_match(regex, command, args=[], opts={})
|
|
433
|
+
result = run_amp_command command, args, opts
|
|
434
|
+
assert_match regex, result
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
def assert_command_no_match(regex, command, args=[], opts={})
|
|
438
|
+
result = run_amp_command command, args, opts
|
|
439
|
+
assert_no_match regex, result
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
def assert_hg_command_match(regex, command, args=[], opts={})
|
|
443
|
+
result = run_hg_command command, args, opts
|
|
444
|
+
assert_match regex, result
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
def assert_hg_command_no_match(regex, command, args=[], opts={})
|
|
448
|
+
result = run_hg_command command, args, opts
|
|
449
|
+
assert_no_match regex, result
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def assert_file_has_status(file, status)
|
|
453
|
+
stat_letter = case status
|
|
454
|
+
when :added
|
|
455
|
+
"A"
|
|
456
|
+
when :removed
|
|
457
|
+
"R"
|
|
458
|
+
when :unknown
|
|
459
|
+
"\\?"
|
|
460
|
+
when :ignored
|
|
461
|
+
"I"
|
|
462
|
+
when :clean
|
|
463
|
+
"C"
|
|
464
|
+
when :modified
|
|
465
|
+
"M"
|
|
466
|
+
end
|
|
467
|
+
status_result = run_amp_command "status", nil, status.to_sym => true, :hg => true, :"no-color" => true
|
|
468
|
+
assert_match(/#{stat_letter} #{file}/, status_result)
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
def commit(options = {})
|
|
472
|
+
run_amp_command "commit", [], options
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
###########################################
|
|
476
|
+
# OTHER HELPER METHODS
|
|
477
|
+
##########################################
|
|
478
|
+
|
|
479
|
+
def get_resource(file_name, version="")
|
|
480
|
+
File.read(File.join($current_basedir, "resources", version, file_name))
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
def replace_resources_with_version(version_string)
|
|
484
|
+
resource_folder = File.join($current_basedir, "resources", version_string)
|
|
485
|
+
list = Dir["#{resource_folder}/**/.*","#{resource_folder}/**/*"]
|
|
486
|
+
list.reject! do |a|
|
|
487
|
+
b = File.basename(a)
|
|
488
|
+
b == "." || b == ".."
|
|
489
|
+
end
|
|
490
|
+
list.each do |file|
|
|
491
|
+
unless File.directory?(file)
|
|
492
|
+
new_dest = File.join($current_basedir, @current_repo, file[(resource_folder.size+1)..-1])
|
|
493
|
+
File.copy(file, new_dest)
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
def options_hash_to_string(options = {})
|
|
499
|
+
opt_arr = []
|
|
500
|
+
options.each do |k, v|
|
|
501
|
+
case v
|
|
502
|
+
when Integer
|
|
503
|
+
opt_arr << "--#{k}=#{v}"
|
|
504
|
+
when TrueClass
|
|
505
|
+
opt_arr << "--#{k}"
|
|
506
|
+
else
|
|
507
|
+
opt_arr << "--#{k}=\"#{v}\""
|
|
508
|
+
end
|
|
509
|
+
end
|
|
510
|
+
opt_arr.join(" ")
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
##
|
|
514
|
+
# Enters the given repository's working directory. Changes the program's working directory
|
|
515
|
+
# to the repo, so relative paths can be used
|
|
516
|
+
#
|
|
517
|
+
# @param [String] which_repo the name of the repository to enter. Must be a directory in the
|
|
518
|
+
# test/functional_tests directory.
|
|
519
|
+
def enter_repo(which_repo)
|
|
520
|
+
@current_repo = which_repo
|
|
521
|
+
Dir.chdir File.join($current_basedir, which_repo)
|
|
522
|
+
end
|
|
523
|
+
|
|
524
|
+
##
|
|
525
|
+
# Exits the current repository (changes the program's current working directory)
|
|
526
|
+
def exit_repo
|
|
527
|
+
Dir.chdir $current_dir
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
##
|
|
531
|
+
# Executes the given command using the amp binary. Backbone of the functional tests.
|
|
532
|
+
#
|
|
533
|
+
# @example
|
|
534
|
+
# run_amp_command(:commit, "STYLE.txt", :user => "seydar", :date => "1/1/2001")
|
|
535
|
+
# will run
|
|
536
|
+
# `amp commit --user="seydar" --date="1/1/2001" STYLE.txt`
|
|
537
|
+
#
|
|
538
|
+
# @param [String] command the command to execute
|
|
539
|
+
# @param [Array<String>] args the arguments to supply to the command.
|
|
540
|
+
# @param [Hash<#to_s => #to_s>] opts the options to pass to the command, such as :user => "seydar"
|
|
541
|
+
# for a commit command.
|
|
542
|
+
def run_amp_command(command, args = [], opts = {})
|
|
543
|
+
args = [args] unless args.kind_of?(Array)
|
|
544
|
+
%x(TESTING='true' && #{AMP_BINARY} #{command} #{options_hash_to_string(opts)} #{args.join(" ")})
|
|
545
|
+
end
|
|
546
|
+
alias_method :amp, :run_amp_command
|
|
547
|
+
|
|
548
|
+
##
|
|
549
|
+
# Executes the given command using the hg binary (mercurial's binary). Used for when
|
|
550
|
+
# we don't trust amp's output (i.e. for "verify" - that'd be like grading your own math exam).
|
|
551
|
+
#
|
|
552
|
+
# @see run_amp_command
|
|
553
|
+
def run_hg_command(command, args = [], opts = {})
|
|
554
|
+
args = [args] unless args.kind_of?(Array)
|
|
555
|
+
%x(hg #{command} #{options_hash_to_string(opts)} #{args.join(" ")})
|
|
556
|
+
end
|
|
557
|
+
alias_method :hg, :run_hg_command
|
|
558
|
+
|
|
559
|
+
##
|
|
560
|
+
# Copies a file, relative to "functional_tests/resources", to the destination, relative to
|
|
561
|
+
# the current repository's root. Creates any directories necessary to copy into the
|
|
562
|
+
# destination.
|
|
563
|
+
#
|
|
564
|
+
# @param [String] resource the path, relative to the resources root, of the file we wish
|
|
565
|
+
# to copy into the working directory
|
|
566
|
+
# @param [String] destination the destination, relative to the working repo's root, where
|
|
567
|
+
# we wish to move the file
|
|
568
|
+
def copy_resource(resource, destination)
|
|
569
|
+
# make sure the parent directories exist
|
|
570
|
+
FileUtils.makedirs File.dirname(File.join($current_basedir, @current_repo, destination))
|
|
571
|
+
File.copy(File.join($current_basedir, "resources", resource),
|
|
572
|
+
File.join($current_basedir, @current_repo, destination))
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
##
|
|
576
|
+
# Removes a file, without using amp to mark it as removed from the working directory.
|
|
577
|
+
# This method allows us to use relative path names without keeping track of which
|
|
578
|
+
# repo we're in, as well.
|
|
579
|
+
#
|
|
580
|
+
# @param [String] file a path to a file (relative to the repo's root) we wish to delete.
|
|
581
|
+
def remove_file_without_amp(file)
|
|
582
|
+
File.unlink File.join($current_basedir, @current_repo, file)
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
##
|
|
586
|
+
# Asserts that a file exists. Expects a path relative to the functional_tests directory.
|
|
587
|
+
#
|
|
588
|
+
# @param [String] file a path to a file relative to the functional_tests directory.
|
|
589
|
+
def assert_file(file)
|
|
590
|
+
assert File.exist?(file.fun_local)
|
|
591
|
+
rescue => e
|
|
592
|
+
puts "#{file.fun_local.inspect} does not exist!"
|
|
593
|
+
raise e # this kills e's backtrace
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
##
|
|
597
|
+
# Destroys a directory. rm -rf, motherfuckers.
|
|
598
|
+
#
|
|
599
|
+
# @param [String] file the directory to completely erase
|
|
600
|
+
def clean_dir(file)
|
|
601
|
+
FileUtils::rm_rf file.fun_local
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
end
|