amp 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,69 @@
|
|
1
|
+
command :tag do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Tags a revision with a given tag name"
|
5
|
+
c.opt :rev, "Specifies which revision to tag", :short => "-r", :type => :string
|
6
|
+
c.opt :message, "Specifies the commit message", :short => "-m", :type => :string
|
7
|
+
c.opt :local, "Marks the tag as local only (not shared among repositories)", :short => "-l"
|
8
|
+
c.opt :remove, "Removes the tag, instead of applying it", :short => "-R"
|
9
|
+
c.opt :force, "Forces the tag to be applied, ignoring existing tags", :short => "-f"
|
10
|
+
c.opt :user, "Specifies which user to commit under", :short => "-u", :type => :string
|
11
|
+
c.opt :date, "Specifies which date to use", :short => "-d", :type => :string
|
12
|
+
|
13
|
+
c.on_run do |opts, args|
|
14
|
+
repo = opts[:repository]
|
15
|
+
|
16
|
+
user = opts[:user] || opts[:global_config].username
|
17
|
+
date = opts[:date] ? DateTime.parse(opts[:date]) : Time.now
|
18
|
+
rev = opts[:rev] || "."
|
19
|
+
message = opts[:message]
|
20
|
+
|
21
|
+
names = args
|
22
|
+
if names.map! {|n| n.strip}.uniq!
|
23
|
+
raise abort("tag names must be unique")
|
24
|
+
end
|
25
|
+
names.each do |n|
|
26
|
+
if ["tip",".","null"].include? n
|
27
|
+
raise abort("the tag name #{n} is reserved")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
if opts[:rev] && opts[:remove]
|
31
|
+
raise abort("--rev and --remove are incompatible")
|
32
|
+
end
|
33
|
+
|
34
|
+
#removing a tag
|
35
|
+
if opts[:remove]
|
36
|
+
expected_type = opts[:local] ? "local" : "global"
|
37
|
+
names.each do |name|
|
38
|
+
unless repo.tag_type name
|
39
|
+
raise abort("tag #{name} does not exist")
|
40
|
+
end
|
41
|
+
if repo.tag_type(name) != expected_type
|
42
|
+
raise abort("tag #{name} is not a #{expected_type} tag")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
rev = Amp::RevlogSupport::Node::NULL_ID
|
46
|
+
message ||= "Removed tag #{names.join(", ")}"
|
47
|
+
elsif !opts[:force]
|
48
|
+
names.each do |name|
|
49
|
+
if repo.tags[name]
|
50
|
+
raise abort("tag #{name} already exists" +
|
51
|
+
" (use -f to force)")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
if !rev && repo.dirstate.parents[1] != Amp::RevlogSupport::Node::NULL_ID
|
57
|
+
raise abort("uncommited merge - please provide" +
|
58
|
+
" a specific revision")
|
59
|
+
end
|
60
|
+
|
61
|
+
node = repo[rev].node
|
62
|
+
|
63
|
+
message ||= "Added tag #{names.join(", ")} for changeset #{node.short_hex}"
|
64
|
+
repo.apply_tag names, node, :message => message,
|
65
|
+
:local => opts[:local],
|
66
|
+
:user => user,
|
67
|
+
:date => date
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
command "tags" do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Lists the repository tags."
|
5
|
+
c.opt :quiet, "Prints only tag names", :short => "-q"
|
6
|
+
|
7
|
+
c.on_run do |opts, args|
|
8
|
+
repo = opts[:repository]
|
9
|
+
list = repo.tag_list
|
10
|
+
list.reverse!
|
11
|
+
tag_type = ""
|
12
|
+
list.each do |entry|
|
13
|
+
tag, node, revision = entry[:tag], entry[:node], entry[:revision]
|
14
|
+
if opts[:quiet]
|
15
|
+
Amp::UI.say "#{tag}"
|
16
|
+
next
|
17
|
+
end
|
18
|
+
if revision == -2
|
19
|
+
revision = repo.changelog.rev(node)
|
20
|
+
end
|
21
|
+
text = "#{revision.to_s.rjust(5)}:#{node.short_hex}"
|
22
|
+
tag_type = (repo.tag_type(tag) == "local") ? " local" : ""
|
23
|
+
|
24
|
+
Amp::UI.say("#{tag.ljust(30)} #{text}#{tag_type}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
command :tip do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Prints the information about the repository's tip"
|
5
|
+
c.opt :template, "Which template to use while printing", :short => "-t", :type => :string, :default => "default"
|
6
|
+
|
7
|
+
c.on_run do |options, args|
|
8
|
+
repo = options[:repository]
|
9
|
+
options.merge! :template_type => :log
|
10
|
+
puts repo[repo.size - 1].to_templated_s(options)
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
command :update do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Updates the current repository to the specified (or tip-most) revision"
|
5
|
+
c.opt :rev, "The revision # to use for updating.", { :short => "-r", :type => :string }
|
6
|
+
c.opt :node, "The node ID to use for updating.", { :short => "-n", :type => :string }
|
7
|
+
c.opt :clean, "Remove uncommitted changes from the working directory.", { :short => "-C" }
|
8
|
+
|
9
|
+
c.on_run do |opts, args|
|
10
|
+
repo = opts[:repository]
|
11
|
+
|
12
|
+
if opts[:rev] && opts[:node]
|
13
|
+
raise ArgumentError.new("Please only specify either --rev or --node.")
|
14
|
+
end
|
15
|
+
|
16
|
+
rev = opts[:rev] ? opts[:rev] : opts[:node]
|
17
|
+
|
18
|
+
# TODO: add --date option
|
19
|
+
if opts[:clean]
|
20
|
+
stats = repo.clean(rev)
|
21
|
+
else
|
22
|
+
stats = repo.update(rev)
|
23
|
+
end
|
24
|
+
|
25
|
+
c.print_update_stats stats
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
command :verify do |c|
|
2
|
+
c.desc "Verifies the mercurial repository, checking for integrity errors"
|
3
|
+
c.workflow :hg
|
4
|
+
c.on_run do |opts, args|
|
5
|
+
results = opts[:repository].verify
|
6
|
+
puts "#{results.files} files, #{results.changesets} changesets, #{results.revisions} revisions"
|
7
|
+
puts "#{results.errors} integrity errors, #{results.warnings} warnings." if results.errors > 0 || results.warnings > 0
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
command :view do |c|
|
2
|
+
c.workflow :hg
|
3
|
+
|
4
|
+
c.desc "Decompresses a file (or files) at a given revision and prints its data"
|
5
|
+
c.opt :output, "print output to file with formatted name", :type => :string
|
6
|
+
c.opt :rev, "specify which revision to view", :type => :string
|
7
|
+
|
8
|
+
c.synonym :cat # mercurial notation
|
9
|
+
c.on_run do |opts, args|
|
10
|
+
repo = opts[:repository]
|
11
|
+
|
12
|
+
changeset = repo[opts[:rev]] # if unspecified will give nil which gives working directory anyway
|
13
|
+
changeset = changeset.parents.first unless opts[:rev] # parent of working dir if unspecified
|
14
|
+
|
15
|
+
should_close = !!opts[:output]
|
16
|
+
|
17
|
+
output_io = lambda do |filename|
|
18
|
+
if opts[:output]
|
19
|
+
path = opts[:output].gsub(/%s/, File.basename(filename)).gsub(/%d/, File.dirname(filename)).
|
20
|
+
gsub(/%p/, filename)
|
21
|
+
File.open(path, "w")
|
22
|
+
else
|
23
|
+
$stdout
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
args.each do |file|
|
28
|
+
versioned_file = changeset.get_file(repo.relative_join(file))
|
29
|
+
text = versioned_file.data
|
30
|
+
output = output_io[versioned_file.repo_path]
|
31
|
+
|
32
|
+
output.write text # write it exactly as is
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require 'abbrev'
|
2
|
+
require "amp/commands/command.rb"
|
3
|
+
require_dir { "commands/*.rb" }
|
4
|
+
require_dir { "commands/commands/*.rb" }
|
5
|
+
|
6
|
+
module Amp
|
7
|
+
|
8
|
+
##
|
9
|
+
# = Dispatch
|
10
|
+
# This class handles parsing command-line options, finding commands, and running them.
|
11
|
+
class Dispatch
|
12
|
+
|
13
|
+
##
|
14
|
+
# This method essentially runs the amp executable. It first parses global options (--config)
|
15
|
+
# finds the subcommand (eg add, init, clone), parses the subcommand's options, merges the
|
16
|
+
# two, and then runs the entire thing.
|
17
|
+
def self.run
|
18
|
+
# Get the subcommands so we can stop on them
|
19
|
+
sub_commands = Amp::Command.all_commands.keys
|
20
|
+
# Get the global options (everything before the subcommand)
|
21
|
+
global_opts = Trollop::options do
|
22
|
+
banner "Amp - some more crystal, sir?"
|
23
|
+
version "Amp version #{Amp::VERSION} (#{Amp::VERSION_TITLE})"
|
24
|
+
opt :debug_opts, "Debug the command-line options", :short => "-d", :default => false, :type => :boolean
|
25
|
+
opt :verbose, "Verbose output"
|
26
|
+
opt :profile, "Profile the command being run, running it the given number of times"
|
27
|
+
opt :repository, "The path to the repository to use", :short => "-R", :type => :string, :default => Dir.pwd
|
28
|
+
opt :"pure-ruby", "Use only pure ruby (no C-extensions)"
|
29
|
+
opt :testing, "Running a test. Not for users to use"
|
30
|
+
stop_on_unknown
|
31
|
+
end
|
32
|
+
global_opts = global_opts.first # we don't need the parser here
|
33
|
+
|
34
|
+
# This loads the built-in ruby profiler - it's extremely slow. Use with care.
|
35
|
+
if global_opts[:profile]
|
36
|
+
require 'profile'
|
37
|
+
end
|
38
|
+
|
39
|
+
# Never load a C extension if we're in pure-ruby mode.
|
40
|
+
if global_opts[:"pure-ruby"]
|
41
|
+
$USE_RUBY = true
|
42
|
+
end
|
43
|
+
|
44
|
+
global_config = Amp::AmpConfig.new
|
45
|
+
Amp::UI.config = global_config
|
46
|
+
cmd = ARGV.shift # get the subcommand
|
47
|
+
cmd ||= "default"
|
48
|
+
|
49
|
+
opts_as_arr = ARGV.dup
|
50
|
+
|
51
|
+
if global_opts[:debug_opts]
|
52
|
+
global_config["debug", "messages"] = true
|
53
|
+
end
|
54
|
+
|
55
|
+
unless global_config["amp"]["workflow"]
|
56
|
+
global_config["amp"]["workflow"] = :hg
|
57
|
+
global_config.save! rescue Errno::EACCES
|
58
|
+
end
|
59
|
+
|
60
|
+
# the options to send to the command
|
61
|
+
cmd_opts = {}
|
62
|
+
|
63
|
+
# Load the repository
|
64
|
+
#path_to_repo = find_repo(".", cmd_opts) unless global_opts[:repository]
|
65
|
+
path_to_repo = ""
|
66
|
+
|
67
|
+
if path_to_repo.empty?
|
68
|
+
local_config = global_config
|
69
|
+
else
|
70
|
+
local_config = AmpConfig.new(:parent_config => global_config)
|
71
|
+
local_config.read_file File.join(path_to_repo, ".hg", "hgrc")
|
72
|
+
end
|
73
|
+
|
74
|
+
begin
|
75
|
+
cmd_opts[:repository] = Repositories.pick(local_config, global_opts[:repository])
|
76
|
+
rescue
|
77
|
+
unless Command::NO_REPO_ALLOWED[cmd] || Command::MAYBE_REPO_ALLOWED[cmd]
|
78
|
+
raise
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
if cmd_opts[:repository].respond_to? :config
|
83
|
+
cmd_opts[:repository].config && local_config = cmd_opts[:repository].config
|
84
|
+
end
|
85
|
+
|
86
|
+
workflow = local_config["amp"]["workflow"]
|
87
|
+
|
88
|
+
if File.exists?(File.expand_path(File.join(File.dirname(__FILE__), "commands/workflows/#{workflow}/")))
|
89
|
+
require_dir { "amp/commands/commands/workflows/#{workflow}/**/*.rb" }
|
90
|
+
end
|
91
|
+
|
92
|
+
user_amprc = File.expand_path("~/.amprc")
|
93
|
+
File.exist?(user_amprc) && load(user_amprc)
|
94
|
+
|
95
|
+
path_to_ampfile = find_ampfile
|
96
|
+
load path_to_ampfile if path_to_ampfile
|
97
|
+
|
98
|
+
command = pick_command cmd, local_config
|
99
|
+
|
100
|
+
unless command
|
101
|
+
puts "Invalid command! #{cmd}"
|
102
|
+
exit(-1)
|
103
|
+
end
|
104
|
+
|
105
|
+
# get the sub-command's options
|
106
|
+
# if there's a conflict, check to see that the newest value isn't nil
|
107
|
+
cmd_opts.merge!(command.collect_options) {|k, v1, v2| v2 || v1 }
|
108
|
+
|
109
|
+
cmd_opts[:global_config] = local_config
|
110
|
+
if global_opts[:debug_opts]
|
111
|
+
require 'yaml'
|
112
|
+
puts "Current directory: #{Dir.pwd}"
|
113
|
+
puts "Global options: \n#{global_opts.inspect.to_yaml}"
|
114
|
+
puts "Subcommand: #{cmd.inspect}"
|
115
|
+
puts "Subcommand options: \n#{cmd_opts.to_yaml}"
|
116
|
+
puts "Remaining arguments: #{ARGV.inspect}"
|
117
|
+
puts "\n"
|
118
|
+
puts "Parsed and merged global config files:"
|
119
|
+
puts local_config.config.to_s
|
120
|
+
puts
|
121
|
+
end
|
122
|
+
|
123
|
+
# Run that fucker!!!
|
124
|
+
begin
|
125
|
+
full_backtrace_please do
|
126
|
+
command.run cmd_opts, ARGV
|
127
|
+
end
|
128
|
+
rescue AbortError => e
|
129
|
+
puts e.to_s
|
130
|
+
end
|
131
|
+
|
132
|
+
#Amp::Support::Logger.outdent.info("</#{command.name}>")
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Gets the path to the Ampfile if there is one.
|
137
|
+
#
|
138
|
+
# @return [String] the path to an Ampfile
|
139
|
+
def self.find_ampfile(dir=Dir.pwd)
|
140
|
+
rock_bottom = false
|
141
|
+
begin
|
142
|
+
rock_bottom = true if dir == "/"
|
143
|
+
["ampfile","Ampfile","ampfile.rb","Ampfile.rb"].each do |pos|
|
144
|
+
file = File.join(dir, pos)
|
145
|
+
return file if File.exist? file
|
146
|
+
end
|
147
|
+
dir = File.dirname(dir)
|
148
|
+
end until rock_bottom
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# Picks a command from the list of all possible commands, based on a couple
|
153
|
+
# simple rules.
|
154
|
+
#
|
155
|
+
# 1. Look up the command by exact name. If no command is provided, supply "default".
|
156
|
+
# 2. Check for "synonyms" - "remove" is synonym'd as "rm". This check occurs inside
|
157
|
+
# the call to Amp::Command[].
|
158
|
+
# 3. Check to see if there is only 1 command with our "cmd" as the prefix. For example,
|
159
|
+
# if the user inputs "amp stat", and only one command starts with "stat" (ie "status"),
|
160
|
+
# then return that command. If there is more than 1 match, then exit, showing an error
|
161
|
+
# due to the ambiguity.
|
162
|
+
#
|
163
|
+
# @param [String] cmd the command to look up
|
164
|
+
# @return [Amp::Command] the command object that was found, or nil if none was found.
|
165
|
+
def self.pick_command(cmd, config)
|
166
|
+
my_flow = config["amp"]["workflow"]
|
167
|
+
if c = Amp::Command.all_for_workflow(my_flow).keys.map {|k| k.to_s}.abbrev[cmd]
|
168
|
+
Amp::Command.command_for_workflow(c, my_flow)
|
169
|
+
else
|
170
|
+
prefix_list = Amp::Command.all_for_workflow(my_flow).keys.map {|k| k.to_s}.select {|k| k.start_with? cmd.to_s }
|
171
|
+
|
172
|
+
if prefix_list.size > 1
|
173
|
+
puts "Ambiguous command: #{cmd}. Could mean: #{prefix_list.join(", ")}"
|
174
|
+
exit(-1)
|
175
|
+
end
|
176
|
+
nil
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Amp
|
2
|
+
|
3
|
+
##
|
4
|
+
# = Hook
|
5
|
+
# The hook class allows the end-user to easily provide hooks into the code that
|
6
|
+
# makes Amp go. For example, one might want to easily hook into the commit command,
|
7
|
+
# and send an e-mail out to your team after every commit. You could use the Hook class,
|
8
|
+
# as well as the Kernel-level "hook" method, to do this.
|
9
|
+
#
|
10
|
+
# Hooks are global, currently - they cannot only be applied to one repo at a time.
|
11
|
+
class Hook
|
12
|
+
@@all_hooks = Hash.new {|h, k| h[k] = []}
|
13
|
+
def self.all_hooks; @@all_hooks; end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
|
17
|
+
raise "hell" if defined? DEFAULTS
|
18
|
+
DEFAULTS = {:throw => false}
|
19
|
+
|
20
|
+
##
|
21
|
+
# Call the hooks that run under +call+
|
22
|
+
#
|
23
|
+
# @param [Symbol] call the location in the system where the hooks
|
24
|
+
# are to be called
|
25
|
+
# @param [Hash] opts the options to pass to the hook
|
26
|
+
def run_hook(call, opts={})
|
27
|
+
opts = DEFAULTS.merge opts
|
28
|
+
all_hooks[call].each {|hook| hook[opts] }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# The call symbol this hook is associated with
|
34
|
+
attr_accessor :name
|
35
|
+
|
36
|
+
##
|
37
|
+
# The block to be executed when the hook is called
|
38
|
+
attr_accessor :block
|
39
|
+
|
40
|
+
##
|
41
|
+
# Registers a hook with the system. A hook is simply a proc that takes some
|
42
|
+
# options. The hook has a name, which specifies which action it is hooking into.
|
43
|
+
# Some hooks include:
|
44
|
+
# :outgoing
|
45
|
+
# :prechangegroup
|
46
|
+
# :changegroup
|
47
|
+
#
|
48
|
+
# @param [Symbol] hook_type the type of hook
|
49
|
+
# @yield the given block is the action to take when the hook is executed
|
50
|
+
# @yieldparam opts the options that are passed to the hook. See hook.rb for details
|
51
|
+
# on all possible hooks and their passed-in options.
|
52
|
+
def initialize(name, &block)
|
53
|
+
@name = name
|
54
|
+
@block = block
|
55
|
+
@@all_hooks[name] << self
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Runs the hook.
|
60
|
+
#
|
61
|
+
# @param [Hash] opts the options to pass to the hook.
|
62
|
+
def call(opts)
|
63
|
+
@block.call(opts)
|
64
|
+
end
|
65
|
+
alias_method :run, :call
|
66
|
+
alias_method :[], :call
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
module Kernel
|
71
|
+
|
72
|
+
##
|
73
|
+
# Adds a hook to each of the provided hook entry points.
|
74
|
+
# Requires a block.
|
75
|
+
#
|
76
|
+
# @param [Symbol] names the hook entry points for which to add the block as a hook
|
77
|
+
# @yield The block provided is the code that will be run as a hook at a later time.
|
78
|
+
def hook(names, &block)
|
79
|
+
Amp::Hook.new(names, &block)
|
80
|
+
end
|
81
|
+
end
|