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,77 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
ARGV.collect! {|x| x.sub(/^--with-bz2-prefix=/, "--with-bz2-dir=") }
|
3
|
+
|
4
|
+
require 'mkmf'
|
5
|
+
|
6
|
+
if unknown = enable_config("unknown")
|
7
|
+
libs = if CONFIG.key?("LIBRUBYARG_STATIC")
|
8
|
+
Config::expand(CONFIG["LIBRUBYARG_STATIC"].dup).sub(/^-l/, '')
|
9
|
+
else
|
10
|
+
Config::expand(CONFIG["LIBRUBYARG"].dup).sub(/^lib([^.]*).*/, '\\1')
|
11
|
+
end
|
12
|
+
unknown = find_library(libs, "ruby_init",
|
13
|
+
Config::expand(CONFIG["archdir"].dup))
|
14
|
+
end
|
15
|
+
|
16
|
+
dir_config('bz2')
|
17
|
+
if !have_library('bz2', 'BZ2_bzWriteOpen')
|
18
|
+
raise "libz2 not found"
|
19
|
+
end
|
20
|
+
|
21
|
+
if enable_config("shared", true)
|
22
|
+
$static = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
create_makefile('bz2')
|
26
|
+
|
27
|
+
begin
|
28
|
+
make = open("Makefile", "a")
|
29
|
+
if unknown
|
30
|
+
make.print <<-EOF
|
31
|
+
|
32
|
+
unknown: $(DLLIB)
|
33
|
+
\t@echo "main() {}" > /tmp/a.c
|
34
|
+
\t$(CC) -static /tmp/a.c $(OBJS) $(CPPFLAGS) $(LIBPATH) $(LIBS) $(LOCAL_LIBS)
|
35
|
+
\t@-rm /tmp/a.c a.out
|
36
|
+
|
37
|
+
EOF
|
38
|
+
end
|
39
|
+
make.print <<-EOF
|
40
|
+
|
41
|
+
%.html: %.rd
|
42
|
+
\trd2 $< > ${<:%.rd=%.html}
|
43
|
+
|
44
|
+
EOF
|
45
|
+
make.print "HTML = bz2.html"
|
46
|
+
docs = Dir['docs/*.rd']
|
47
|
+
docs.each {|x| make.print " \\\n\t#{x.sub(/\.rd$/, '.html')}" }
|
48
|
+
make.print "\n\nRDOC = docs/bz2.rb"
|
49
|
+
make.puts
|
50
|
+
make.print <<-EOF
|
51
|
+
|
52
|
+
rdoc: docs/doc/index.html
|
53
|
+
|
54
|
+
docs/doc/index.html: $(RDOC)
|
55
|
+
\t@-(cd docs; rdoc bz2.rb)
|
56
|
+
|
57
|
+
ri: docs/bz2.rb
|
58
|
+
\t@-(cd docs; rdoc -r bz2.rb)
|
59
|
+
|
60
|
+
ri-site:
|
61
|
+
\t@-(cd docs; rdoc -R bz2.rb)
|
62
|
+
|
63
|
+
rd2: html
|
64
|
+
|
65
|
+
html: $(HTML)
|
66
|
+
|
67
|
+
test: $(DLLIB)
|
68
|
+
EOF
|
69
|
+
Dir.foreach('../../../test') do |x|
|
70
|
+
next if /^\./ =~ x || /(_\.rb|~)$/ =~ x
|
71
|
+
next if FileTest.directory?(x)
|
72
|
+
make.print "\t-$(RUBY) tests/#{x}\n"
|
73
|
+
end
|
74
|
+
ensure
|
75
|
+
make.close
|
76
|
+
end
|
77
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
have_library: checking for BZ2_bzWriteOpen() in -lbz2... -------------------- yes
|
2
|
+
|
3
|
+
"gcc -o conftest -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin10.0 -I/Users/michaeledgar/mygems/amp/ext/amp/bz2 -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -arch i386 -arch x86_64 -g -Os -pipe -fno-common -DENABLE_DTRACE -fno-common -pipe -fno-common conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib -L. -arch i386 -arch x86_64 -lruby -lbz2 -lpthread -ldl "
|
4
|
+
conftest.c: In function ‘t’:
|
5
|
+
conftest.c:3: error: ‘BZ2_bzWriteOpen’ undeclared (first use in this function)
|
6
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
7
|
+
conftest.c:3: error: for each function it appears in.)
|
8
|
+
conftest.c: In function ‘t’:
|
9
|
+
conftest.c:3: error: ‘BZ2_bzWriteOpen’ undeclared (first use in this function)
|
10
|
+
conftest.c:3: error: (Each undeclared identifier is reported only once
|
11
|
+
conftest.c:3: error: for each function it appears in.)
|
12
|
+
lipo: can't figure out the architecture type of: /var/folders/zy/zyqc-SWsGjeyuLdp+7qPO++++TI/-Tmp-//cc7a8sUN.out
|
13
|
+
checked program was:
|
14
|
+
/* begin */
|
15
|
+
1: /*top*/
|
16
|
+
2: int main() { return 0; }
|
17
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))BZ2_bzWriteOpen; return 0; }
|
18
|
+
/* end */
|
19
|
+
|
20
|
+
"gcc -o conftest -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin10.0 -I/Users/michaeledgar/mygems/amp/ext/amp/bz2 -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -arch i386 -arch x86_64 -g -Os -pipe -fno-common -DENABLE_DTRACE -fno-common -pipe -fno-common conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib -L. -arch i386 -arch x86_64 -lruby -lbz2 -lpthread -ldl "
|
21
|
+
checked program was:
|
22
|
+
/* begin */
|
23
|
+
1: /*top*/
|
24
|
+
2: int main() { return 0; }
|
25
|
+
3: int t() { BZ2_bzWriteOpen(); return 0; }
|
26
|
+
/* end */
|
27
|
+
|
28
|
+
--------------------
|
29
|
+
|
@@ -0,0 +1,405 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <stdlib.h>
|
3
|
+
#include "ruby.h"
|
4
|
+
#include "rubyio.h"
|
5
|
+
|
6
|
+
// these defines are taken from the mercurial source. They're relatively standard for
|
7
|
+
// byte-swapping, but credit goes where credit's due.
|
8
|
+
#ifdef _WIN32
|
9
|
+
# ifdef _MSC_VER
|
10
|
+
/* msvc 6.0 has problems */
|
11
|
+
# define inline __inline
|
12
|
+
typedef unsigned long uint32_t;
|
13
|
+
typedef unsigned __int64 uint64_t;
|
14
|
+
# else
|
15
|
+
# include <stdint.h>
|
16
|
+
# endif
|
17
|
+
static uint32_t ntohl(uint32_t x)
|
18
|
+
{
|
19
|
+
return ((x & 0x000000ffUL) << 24) |
|
20
|
+
((x & 0x0000ff00UL) << 8) |
|
21
|
+
((x & 0x00ff0000UL) >> 8) |
|
22
|
+
((x & 0xff000000UL) >> 24);
|
23
|
+
}
|
24
|
+
#else
|
25
|
+
/* not windows */
|
26
|
+
# include <sys/types.h>
|
27
|
+
# if defined __BEOS__ && !defined __HAIKU__
|
28
|
+
# include <ByteOrder.h>
|
29
|
+
# else
|
30
|
+
# include <arpa/inet.h>
|
31
|
+
# endif
|
32
|
+
# include <inttypes.h>
|
33
|
+
#endif
|
34
|
+
|
35
|
+
|
36
|
+
VALUE rb_mAmp, rb_mDiffs, rb_mMercurialPatch;
|
37
|
+
|
38
|
+
|
39
|
+
struct frag {
|
40
|
+
uint32_t start, end, len;
|
41
|
+
const char *data;
|
42
|
+
};
|
43
|
+
|
44
|
+
struct flist {
|
45
|
+
struct frag *base, *head, *tail;
|
46
|
+
};
|
47
|
+
|
48
|
+
static struct flist *lalloc(int size)
|
49
|
+
{
|
50
|
+
struct flist *a = NULL;
|
51
|
+
|
52
|
+
if (size < 1)
|
53
|
+
size = 1;
|
54
|
+
|
55
|
+
a = (struct flist *)malloc(sizeof(struct flist));
|
56
|
+
if (a) {
|
57
|
+
a->base = (struct frag *)malloc(sizeof(struct frag) * size);
|
58
|
+
if (a->base) {
|
59
|
+
a->head = a->tail = a->base;
|
60
|
+
return a;
|
61
|
+
}
|
62
|
+
free(a);
|
63
|
+
a = NULL;
|
64
|
+
}
|
65
|
+
// if (!PyErr_Occurred())
|
66
|
+
// PyErr_NoMemory();
|
67
|
+
return NULL;
|
68
|
+
}
|
69
|
+
|
70
|
+
static void lfree(struct flist *a)
|
71
|
+
{
|
72
|
+
if (a) {
|
73
|
+
free(a->base);
|
74
|
+
free(a);
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
static int lsize(struct flist *a)
|
79
|
+
{
|
80
|
+
return a->tail - a->head;
|
81
|
+
}
|
82
|
+
|
83
|
+
/* move hunks in source that are less cut to dest, compensating
|
84
|
+
for changes in offset. the last hunk may be split if necessary.
|
85
|
+
*/
|
86
|
+
static int gather(struct flist *dest, struct flist *src, int cut, int offset)
|
87
|
+
{
|
88
|
+
struct frag *d = dest->tail, *s = src->head;
|
89
|
+
int postend, c, l;
|
90
|
+
|
91
|
+
while (s != src->tail) {
|
92
|
+
if (s->start + offset >= cut)
|
93
|
+
break; /* we've gone far enough */
|
94
|
+
|
95
|
+
postend = offset + s->start + s->len;
|
96
|
+
if (postend <= cut) {
|
97
|
+
/* save this hunk */
|
98
|
+
offset += s->start + s->len - s->end;
|
99
|
+
*d++ = *s++;
|
100
|
+
}
|
101
|
+
else {
|
102
|
+
/* break up this hunk */
|
103
|
+
c = cut - offset;
|
104
|
+
if (s->end < c)
|
105
|
+
c = s->end;
|
106
|
+
l = cut - offset - s->start;
|
107
|
+
if (s->len < l)
|
108
|
+
l = s->len;
|
109
|
+
|
110
|
+
offset += s->start + l - c;
|
111
|
+
|
112
|
+
d->start = s->start;
|
113
|
+
d->end = c;
|
114
|
+
d->len = l;
|
115
|
+
d->data = s->data;
|
116
|
+
d++;
|
117
|
+
s->start = c;
|
118
|
+
s->len = s->len - l;
|
119
|
+
s->data = s->data + l;
|
120
|
+
|
121
|
+
break;
|
122
|
+
}
|
123
|
+
}
|
124
|
+
|
125
|
+
dest->tail = d;
|
126
|
+
src->head = s;
|
127
|
+
return offset;
|
128
|
+
}
|
129
|
+
|
130
|
+
/* like gather, but with no output list */
|
131
|
+
static int discard(struct flist *src, int cut, int offset)
|
132
|
+
{
|
133
|
+
struct frag *s = src->head;
|
134
|
+
int postend, c, l;
|
135
|
+
|
136
|
+
while (s != src->tail) {
|
137
|
+
if (s->start + offset >= cut)
|
138
|
+
break;
|
139
|
+
|
140
|
+
postend = offset + s->start + s->len;
|
141
|
+
if (postend <= cut) {
|
142
|
+
offset += s->start + s->len - s->end;
|
143
|
+
s++;
|
144
|
+
}
|
145
|
+
else {
|
146
|
+
c = cut - offset;
|
147
|
+
if (s->end < c)
|
148
|
+
c = s->end;
|
149
|
+
l = cut - offset - s->start;
|
150
|
+
if (s->len < l)
|
151
|
+
l = s->len;
|
152
|
+
|
153
|
+
offset += s->start + l - c;
|
154
|
+
s->start = c;
|
155
|
+
s->len = s->len - l;
|
156
|
+
s->data = s->data + l;
|
157
|
+
|
158
|
+
break;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
src->head = s;
|
163
|
+
return offset;
|
164
|
+
}
|
165
|
+
|
166
|
+
/* combine hunk lists a and b, while adjusting b for offset changes in a/
|
167
|
+
this deletes a and b and returns the resultant list. */
|
168
|
+
static struct flist *combine(struct flist *a, struct flist *b)
|
169
|
+
{
|
170
|
+
struct flist *c = NULL;
|
171
|
+
struct frag *bh, *ct;
|
172
|
+
int offset = 0, post;
|
173
|
+
|
174
|
+
if (a && b)
|
175
|
+
c = lalloc((lsize(a) + lsize(b)) * 2);
|
176
|
+
|
177
|
+
if (c) {
|
178
|
+
|
179
|
+
for (bh = b->head; bh != b->tail; bh++) {
|
180
|
+
/* save old hunks */
|
181
|
+
offset = gather(c, a, bh->start, offset);
|
182
|
+
|
183
|
+
/* discard replaced hunks */
|
184
|
+
post = discard(a, bh->end, offset);
|
185
|
+
|
186
|
+
/* insert new hunk */
|
187
|
+
ct = c->tail;
|
188
|
+
ct->start = bh->start - offset;
|
189
|
+
ct->end = bh->end - post;
|
190
|
+
ct->len = bh->len;
|
191
|
+
ct->data = bh->data;
|
192
|
+
c->tail++;
|
193
|
+
offset = post;
|
194
|
+
}
|
195
|
+
|
196
|
+
/* hold on to tail from a */
|
197
|
+
memcpy(c->tail, a->head, sizeof(struct frag) * lsize(a));
|
198
|
+
c->tail += lsize(a);
|
199
|
+
}
|
200
|
+
|
201
|
+
lfree(a);
|
202
|
+
lfree(b);
|
203
|
+
return c;
|
204
|
+
}
|
205
|
+
|
206
|
+
/* decode a binary patch into a hunk list */
|
207
|
+
static struct flist *decode(const char *bin, int len)
|
208
|
+
{
|
209
|
+
struct flist *l;
|
210
|
+
struct frag *lt;
|
211
|
+
const char *data = bin + 12, *end = bin + len;
|
212
|
+
char decode[12]; /* for dealing with alignment issues */
|
213
|
+
|
214
|
+
/* assume worst case size, we won't have many of these lists */
|
215
|
+
l = lalloc(len / 12);
|
216
|
+
if (!l)
|
217
|
+
return NULL;
|
218
|
+
|
219
|
+
lt = l->tail;
|
220
|
+
|
221
|
+
while (data <= end) {
|
222
|
+
memcpy(decode, bin, 12);
|
223
|
+
lt->start = (uint32_t)ntohl(*(uint32_t *)decode);
|
224
|
+
lt->end = (uint32_t)ntohl(*(uint32_t *)(decode + 4));
|
225
|
+
lt->len = (uint32_t)ntohl(*(uint32_t *)(decode + 8));
|
226
|
+
if (lt->start > lt->end)
|
227
|
+
break; /* sanity check */
|
228
|
+
bin = data + lt->len;
|
229
|
+
if (bin < data)
|
230
|
+
break; /* big data + big (bogus) len can wrap around */
|
231
|
+
lt->data = data;
|
232
|
+
data = bin + 12;
|
233
|
+
lt++;
|
234
|
+
}
|
235
|
+
|
236
|
+
if (bin != end) {
|
237
|
+
rb_raise(rb_eStandardError, "patch cannot be decoded");
|
238
|
+
lfree(l);
|
239
|
+
return NULL;
|
240
|
+
}
|
241
|
+
|
242
|
+
l->tail = lt;
|
243
|
+
return l;
|
244
|
+
}
|
245
|
+
|
246
|
+
/* calculate the size of resultant text */
|
247
|
+
static int calcsize(int len, struct flist *l)
|
248
|
+
{
|
249
|
+
int outlen = 0, last = 0;
|
250
|
+
struct frag *f = l->head;
|
251
|
+
|
252
|
+
while (f != l->tail) {
|
253
|
+
if (f->start < last || f->end > len) {
|
254
|
+
rb_raise(rb_eStandardError, "invalid patch");
|
255
|
+
return -1;
|
256
|
+
}
|
257
|
+
outlen += f->start - last;
|
258
|
+
last = f->end;
|
259
|
+
outlen += f->len;
|
260
|
+
f++;
|
261
|
+
}
|
262
|
+
|
263
|
+
outlen += len - last;
|
264
|
+
return outlen;
|
265
|
+
}
|
266
|
+
|
267
|
+
static int apply(char *buf, const char *orig, int len, struct flist *l)
|
268
|
+
{
|
269
|
+
struct frag *f = l->head;
|
270
|
+
int last = 0;
|
271
|
+
char *p = buf;
|
272
|
+
|
273
|
+
while (f != l->tail) {
|
274
|
+
if (f->start < last || f->end > len) {
|
275
|
+
rb_raise(rb_eStandardError, "invalid patch");
|
276
|
+
return 0;
|
277
|
+
}
|
278
|
+
memcpy(p, orig + last, f->start - last);
|
279
|
+
p += f->start - last;
|
280
|
+
memcpy(p, f->data, f->len);
|
281
|
+
last = f->end;
|
282
|
+
p += f->len;
|
283
|
+
f++;
|
284
|
+
}
|
285
|
+
memcpy(p, orig + last, len - last);
|
286
|
+
return 1;
|
287
|
+
}
|
288
|
+
|
289
|
+
/* recursively generate a patch of all bins between start and end */
|
290
|
+
static struct flist *fold(VALUE bins, int start, int end)
|
291
|
+
{
|
292
|
+
int len;
|
293
|
+
int blen;
|
294
|
+
const char *buffer;
|
295
|
+
VALUE str;
|
296
|
+
|
297
|
+
if (start + 1 == end) {
|
298
|
+
/* trivial case, output a decoded list */
|
299
|
+
VALUE tmp = rb_ary_entry(bins, start);
|
300
|
+
if (!tmp)
|
301
|
+
return NULL;
|
302
|
+
str = rb_str_new3(tmp);
|
303
|
+
if (!str || str == Qnil)
|
304
|
+
return NULL;
|
305
|
+
blen = RSTRING_LEN(str);
|
306
|
+
buffer = RSTRING_PTR(str);
|
307
|
+
return decode(buffer, blen);
|
308
|
+
}
|
309
|
+
|
310
|
+
/* divide and conquer, memory management is elsewhere */
|
311
|
+
len = (end - start) / 2;
|
312
|
+
return combine(fold(bins, start, start + len),
|
313
|
+
fold(bins, start + len, end));
|
314
|
+
}
|
315
|
+
|
316
|
+
static VALUE amp_mpatch_apply_patches(VALUE self, VALUE text, VALUE bins)
|
317
|
+
{
|
318
|
+
VALUE result;
|
319
|
+
struct flist *patch;
|
320
|
+
const char *in;
|
321
|
+
char *out;
|
322
|
+
int len, outlen;
|
323
|
+
int inlen;
|
324
|
+
|
325
|
+
len = RARRAY_LEN(bins);
|
326
|
+
if (!len) {
|
327
|
+
/* nothing to do */
|
328
|
+
return text;
|
329
|
+
}
|
330
|
+
|
331
|
+
in = RSTRING_PTR(text);
|
332
|
+
inlen = RSTRING_LEN(text);
|
333
|
+
|
334
|
+
patch = fold(bins, 0, len);
|
335
|
+
if (!patch)
|
336
|
+
return Qnil;
|
337
|
+
|
338
|
+
outlen = calcsize(inlen, patch);
|
339
|
+
if (outlen < 0) {
|
340
|
+
result = Qnil;
|
341
|
+
goto cleanup;
|
342
|
+
}
|
343
|
+
result = rb_str_new(NULL, outlen);
|
344
|
+
if (!result) {
|
345
|
+
result = Qnil;
|
346
|
+
goto cleanup;
|
347
|
+
}
|
348
|
+
out = RSTRING_PTR(result);
|
349
|
+
if (!apply(out, in, inlen, patch)) {
|
350
|
+
result = Qnil;
|
351
|
+
}
|
352
|
+
cleanup:
|
353
|
+
lfree(patch);
|
354
|
+
return result;
|
355
|
+
}
|
356
|
+
|
357
|
+
static VALUE amp_mpatch_patched_size(VALUE self, VALUE orig_r, VALUE bin_r)
|
358
|
+
{
|
359
|
+
uint32_t orig, start, end, len, outlen = 0, last = 0;
|
360
|
+
int patchlen;
|
361
|
+
char *bin, *binend, *data;
|
362
|
+
char decode[12]; /* for dealing with alignment issues */
|
363
|
+
|
364
|
+
orig = FIX2INT(orig_r);
|
365
|
+
bin = RSTRING_PTR(bin_r);
|
366
|
+
patchlen = RSTRING_LEN(bin_r);
|
367
|
+
|
368
|
+
binend = bin + patchlen;
|
369
|
+
data = bin + 12;
|
370
|
+
|
371
|
+
while (data <= binend) {
|
372
|
+
memcpy(decode, bin, 12);
|
373
|
+
start = (uint32_t)ntohl(*(uint32_t *)decode);
|
374
|
+
end = (uint32_t)ntohl(*(uint32_t *)(decode + 4));
|
375
|
+
len = (uint32_t)ntohl(*(uint32_t *)(decode + 8));
|
376
|
+
if (start > end)
|
377
|
+
break; /* sanity check */
|
378
|
+
bin = data + len;
|
379
|
+
if (bin < data)
|
380
|
+
break; /* big data + big (bogus) len can wrap around */
|
381
|
+
data = bin + 12;
|
382
|
+
outlen += start - last;
|
383
|
+
last = end;
|
384
|
+
outlen += len;
|
385
|
+
}
|
386
|
+
|
387
|
+
if (bin != binend) {
|
388
|
+
rb_raise(rb_eStandardError, "patch cannot be decoded");
|
389
|
+
return Qnil;
|
390
|
+
}
|
391
|
+
|
392
|
+
outlen += orig - last;
|
393
|
+
return INT2FIX(outlen);
|
394
|
+
}
|
395
|
+
|
396
|
+
|
397
|
+
void Init_MercurialPatch() {
|
398
|
+
|
399
|
+
rb_mAmp = rb_define_module("Amp");
|
400
|
+
rb_mDiffs = rb_define_module_under(rb_mAmp, "Diffs");
|
401
|
+
rb_mMercurialPatch = rb_define_module_under(rb_mDiffs, "MercurialPatch");
|
402
|
+
|
403
|
+
rb_define_singleton_method(rb_mMercurialPatch, "patched_size", amp_mpatch_patched_size, 2);
|
404
|
+
rb_define_singleton_method(rb_mMercurialPatch, "apply_patches", amp_mpatch_apply_patches, 2);
|
405
|
+
}
|