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 @@
|
|
|
1
|
+
amp_c_extension '../../../ext/amp/mercurial_patch/MercurialPatch', 'pure_ruby/ruby_mercurial_patch'
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# I have seen few files so poorly organized such as patch.py
|
|
2
|
+
# What. The. Fuck. This is going to take so long to make.
|
|
3
|
+
module Amp
|
|
4
|
+
module Patch
|
|
5
|
+
|
|
6
|
+
class PatchError < StandardError; end
|
|
7
|
+
class NoHunkError < PatchError; end
|
|
8
|
+
|
|
9
|
+
class Patch
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# The filename of the patch
|
|
13
|
+
attr_accessor :file_name
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# The opener used to open the patch
|
|
17
|
+
attr_accessor :opener
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
# @todo - add comment
|
|
21
|
+
attr_accessor :lines
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# does the patch exist?
|
|
25
|
+
attr_accessor :exists
|
|
26
|
+
alias_method :exists?, :exists
|
|
27
|
+
|
|
28
|
+
##
|
|
29
|
+
# Is the file in the filesystem
|
|
30
|
+
attr_accessor :missing
|
|
31
|
+
alias_method :missing?, :missing
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# @todo - add comment
|
|
35
|
+
attr_accessor :hash
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
# Is this dirty and does it need to be resynced with something?
|
|
39
|
+
attr_accessor :dirty
|
|
40
|
+
alias_method :dirty?, :dirty
|
|
41
|
+
|
|
42
|
+
##
|
|
43
|
+
# @todo - add comment
|
|
44
|
+
attr_accessor :offset
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# has this been printed? (duh)
|
|
48
|
+
attr_accessor :printed
|
|
49
|
+
alias_method :printed?, :printed
|
|
50
|
+
|
|
51
|
+
##
|
|
52
|
+
# @todo - add comment
|
|
53
|
+
attr_accessor :hunks
|
|
54
|
+
|
|
55
|
+
def initialize(file_name, opener, missing=false)
|
|
56
|
+
@file_name = file_name
|
|
57
|
+
@opener = opener
|
|
58
|
+
@lines = []
|
|
59
|
+
@exists = false
|
|
60
|
+
@hash = {}
|
|
61
|
+
@dirty = false
|
|
62
|
+
@offset = 0
|
|
63
|
+
@rejected = []
|
|
64
|
+
@printed = false
|
|
65
|
+
@hunks = 0
|
|
66
|
+
|
|
67
|
+
##
|
|
68
|
+
# If the patch is in the filesystem
|
|
69
|
+
# then we should read it and accurately set its existence
|
|
70
|
+
unless @missing = missing
|
|
71
|
+
begin
|
|
72
|
+
readlines!
|
|
73
|
+
@exists = true
|
|
74
|
+
rescue IOError
|
|
75
|
+
end
|
|
76
|
+
else
|
|
77
|
+
UI::warn "unable to find '#{@file_name}' for patching"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
##
|
|
82
|
+
# Loads up the patch info from +@file_name+
|
|
83
|
+
# into +@lines+
|
|
84
|
+
def readlines!
|
|
85
|
+
@opener.open @file_name do |f|
|
|
86
|
+
@lines = f.readlines
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
##
|
|
91
|
+
# Mysteriously and safely disappear...
|
|
92
|
+
#
|
|
93
|
+
# @return [Boolean] success marker
|
|
94
|
+
def unlink; File.safe_unlink @file_name; end
|
|
95
|
+
|
|
96
|
+
##
|
|
97
|
+
# Print out the patch to STDOUT, or STDERR if +warn+ is true.
|
|
98
|
+
#
|
|
99
|
+
# @param [Boolean] warn should we be printing to STDERR?
|
|
100
|
+
def print(warn=false)
|
|
101
|
+
return if printed? # no need to print it twice
|
|
102
|
+
|
|
103
|
+
@printed = true if warn
|
|
104
|
+
message = "patching file #{@file_name}"
|
|
105
|
+
warn ? UI::warn message : UI::note message
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# From the Python: looks through the hash and finds candidate lines. The
|
|
110
|
+
# result is a list of line numbers sorted based on distance from linenum.
|
|
111
|
+
#
|
|
112
|
+
# I wish I knew how to make sense of that sentence.
|
|
113
|
+
#
|
|
114
|
+
# @todo Look into removing an unnecessary `- number`.
|
|
115
|
+
# @param [String] line
|
|
116
|
+
# @param [Integer] number the line number
|
|
117
|
+
# @return [Array] the lines that matchish.
|
|
118
|
+
def find_lines(line, number)
|
|
119
|
+
return [] unless @hash.include? line
|
|
120
|
+
|
|
121
|
+
# really, we're just getting the lines and sorting them
|
|
122
|
+
# is the `- number` even necessary?
|
|
123
|
+
@hash[line].sort {|a, b| (a - number).abs <=> (b - number).abs }
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
##
|
|
127
|
+
# I have no clue what song I am listening to but it is SOOOOO GOOD!!!!!!!!
|
|
128
|
+
# "This time baby, I'll be bullet proof"
|
|
129
|
+
# If I had working internet now, I'd be googling the lyrics.
|
|
130
|
+
#
|
|
131
|
+
# Oh right, the method. I don't know what this does... YET
|
|
132
|
+
#
|
|
133
|
+
# @todo Figure out what this does
|
|
134
|
+
def hash_lines
|
|
135
|
+
@hash = Hash.new {|h, k| h[k] = [] }
|
|
136
|
+
(0 ... @lines.size).each do |x|
|
|
137
|
+
s = @lines[x]
|
|
138
|
+
@hash[s] << x
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
##
|
|
143
|
+
# our rejects are a little different from patch(1). This always
|
|
144
|
+
# creates rejects in the same form as the original patch. A file
|
|
145
|
+
# header is inserted so that you can run the reject through patch again
|
|
146
|
+
# without having to type the filename.
|
|
147
|
+
def write_rejects
|
|
148
|
+
return if @rejects.empty?
|
|
149
|
+
fname = @file_name + '.rej'
|
|
150
|
+
|
|
151
|
+
UI::warn("#{@rejects.size} out of #{@hunks} hunks FAILED --" +
|
|
152
|
+
"saving rejects to file #{fname}")
|
|
153
|
+
|
|
154
|
+
# i have never written code as horrid as this
|
|
155
|
+
# please help me
|
|
156
|
+
lz = []
|
|
157
|
+
base = File.dirname @file_name
|
|
158
|
+
lz << "--- #{base}\n+++ #{base}\n"
|
|
159
|
+
@rejects.each do |r|
|
|
160
|
+
r.hunk.each do |l|
|
|
161
|
+
lz << l
|
|
162
|
+
lz << "\n\n" if l.last.chr != "\n"
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
write fname, lz, true
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
##
|
|
170
|
+
# Write +linez+ to +fname+. We won't be doing any writing if
|
|
171
|
+
# nothing has been changed, but this can be overridden with the
|
|
172
|
+
# force parameter.
|
|
173
|
+
#
|
|
174
|
+
# @param [String] dest the filename to write to
|
|
175
|
+
# @param [Array<String>] linez an array of the lines to write
|
|
176
|
+
# @param [Boolean] force force a write
|
|
177
|
+
def write(dest=@file_name, linez=@lines, force=false)
|
|
178
|
+
return unless dirty? || force
|
|
179
|
+
|
|
180
|
+
@opener.open dest, 'w' do |f|
|
|
181
|
+
f.write linez.join("\n")
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
##
|
|
186
|
+
# A more restrictive version of {write}
|
|
187
|
+
def write_patch
|
|
188
|
+
write @file_name, @lines, true
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
##
|
|
192
|
+
# Closing rites. Write the patch and then write the rejects.
|
|
193
|
+
def close
|
|
194
|
+
write_patch
|
|
195
|
+
write_rejects
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
##
|
|
199
|
+
# Apply the current hunk +hunk+. Also, should we reverse the hunk? Consult +reverse+.
|
|
200
|
+
#
|
|
201
|
+
# @param
|
|
202
|
+
# @param
|
|
203
|
+
def apply(hunk, reverse)
|
|
204
|
+
unless hunk.complete?
|
|
205
|
+
raise PatchError.new("bad hunk #%d %s (%d %d %d %d)" %
|
|
206
|
+
[hunk.number, hunk.desc, hunk.a.size,
|
|
207
|
+
hunk.len_a, hunk.b.size, hunk.len_b])
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
@hunks += 1 # It's clear we're adding a new hunk.
|
|
211
|
+
|
|
212
|
+
# Obey reversal rules.
|
|
213
|
+
hunk.reverse if reverse
|
|
214
|
+
|
|
215
|
+
# Does the file already exist? Better tell someone
|
|
216
|
+
UI::warn "file #{@file_name} already exists" if exists? && hunk.create_file?
|
|
217
|
+
|
|
218
|
+
# Is this a misfit?
|
|
219
|
+
(@rejects << hunk; return -1) if missing? || (exists? && hunk.create_file?)
|
|
220
|
+
|
|
221
|
+
# Deal with GitHunks
|
|
222
|
+
if hunk.is_a? GitHunk
|
|
223
|
+
if hunk.remove_file?
|
|
224
|
+
File.safe_unlink @file_name
|
|
225
|
+
else
|
|
226
|
+
@lines = hunk.new
|
|
227
|
+
@offset += hunk.new.size
|
|
228
|
+
@dirty = true
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
return 0
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# fast case first, no offsets, no fuzz
|
|
235
|
+
old = hunk.old
|
|
236
|
+
|
|
237
|
+
# patch starts counting at 1 unless we are adding the file
|
|
238
|
+
start = hunk.start_a == 0 ? 0 : h.start_a + @offset - 1
|
|
239
|
+
|
|
240
|
+
orig_start = start
|
|
241
|
+
if DiffHelpers::test_hunk(old, @lines, start) == 0
|
|
242
|
+
if hunk.remove_file?
|
|
243
|
+
File.safe_unlink @file_name
|
|
244
|
+
else
|
|
245
|
+
@lines[start .. (start + hunk.len_a)] = hunk.new
|
|
246
|
+
@offset += hunk.len_b - hunk.len_a
|
|
247
|
+
@dirty = true
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
return 0
|
|
251
|
+
end # end if
|
|
252
|
+
end # end def
|
|
253
|
+
|
|
254
|
+
# Ok, We couldn't match the hunk. Let's look for offsets and fuzz it
|
|
255
|
+
# as well as use proper punctuation for the 'let us' contraction.
|
|
256
|
+
hash_lines
|
|
257
|
+
|
|
258
|
+
# if the hunk tried to put something at the bottom of the file
|
|
259
|
+
# then override the start line and use eof here
|
|
260
|
+
search_start = hunk[-1][0].chr != ' ' ? @lines.size : orig_start
|
|
261
|
+
|
|
262
|
+
0.upto(2) do |fuzz_len|
|
|
263
|
+
[true, false].each do |top_only|
|
|
264
|
+
old = hunk.old fuzz_len, top_only
|
|
265
|
+
# Continue at patch.py:407
|
|
266
|
+
# ...
|
|
267
|
+
# ...
|
|
268
|
+
end
|
|
269
|
+
end # end upto
|
|
270
|
+
|
|
271
|
+
end # end class Patch
|
|
272
|
+
|
|
273
|
+
class PatchMeta
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
class Hunk
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
class GitHunk
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
class BinaryHunk
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
class SymLinkHunk
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
class LineReader
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
end
|
|
292
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
|
|
2
|
+
module Amp
|
|
3
|
+
module Diffs
|
|
4
|
+
|
|
5
|
+
##
|
|
6
|
+
# This handles applying patches in mercurial. yay!!!!
|
|
7
|
+
module MercurialPatch
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# This attempts to apply a series of patches in time proportional to
|
|
11
|
+
# the total size of the patches, rather than patches * len(text). This
|
|
12
|
+
# means rather than shuffling strings around, we shuffle around
|
|
13
|
+
# pointers to fragments with fragment lists.
|
|
14
|
+
#
|
|
15
|
+
# When the fragment lists get too long, we collapse them. To do this
|
|
16
|
+
# efficiently, we do all our operations inside a buffer created by
|
|
17
|
+
# mmap and simply use memmove. This avoids creating a bunch of large
|
|
18
|
+
# temporary string buffers.
|
|
19
|
+
#
|
|
20
|
+
# UPDATE 2AM BEFORE I GO BACK TO SCHOOL
|
|
21
|
+
# I FUCKING HATE PYTHON
|
|
22
|
+
def self.apply_patches(source, patches)
|
|
23
|
+
return source if patches.empty?
|
|
24
|
+
patch_lens = patches.map {|patch| patch.size}
|
|
25
|
+
pl = patch_lens.sum
|
|
26
|
+
bl = source.size + pl
|
|
27
|
+
tl = bl + bl + pl
|
|
28
|
+
b1, b2 = 0, bl
|
|
29
|
+
|
|
30
|
+
return a if tl == 0 #empty patches. lame.
|
|
31
|
+
|
|
32
|
+
output = StringIO.new "",(ruby_19? ? "r+:ASCII-8BIT" : "r+")
|
|
33
|
+
output.write source
|
|
34
|
+
|
|
35
|
+
frags = [[source.size, b1]]
|
|
36
|
+
|
|
37
|
+
pos = b2 + bl
|
|
38
|
+
output.seek pos
|
|
39
|
+
patches.each {|patch| output.write(patch)}
|
|
40
|
+
patch_lens.each do |plen|
|
|
41
|
+
if frags.size > 128
|
|
42
|
+
b2, b1 = b1, b2
|
|
43
|
+
frags = [self.collect(output,b1,frags)]
|
|
44
|
+
end
|
|
45
|
+
newarr = []
|
|
46
|
+
endpt = pos + plen
|
|
47
|
+
last = 0
|
|
48
|
+
while pos < endpt
|
|
49
|
+
output.seek pos
|
|
50
|
+
p1, p2, l = output.read(12).unpack("NNN")
|
|
51
|
+
self.pull(newarr, frags, p1 - last)
|
|
52
|
+
self.pull([], frags, p2 - p1)
|
|
53
|
+
newarr << [l, pos + 12]
|
|
54
|
+
pos += l + 12
|
|
55
|
+
last = p2
|
|
56
|
+
end
|
|
57
|
+
frags = newarr + frags
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
t = self.collect output, b2, frags
|
|
61
|
+
output.seek t[1]
|
|
62
|
+
output.read t[0]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def self.patched_size(orig, delta)
|
|
67
|
+
outlen, last, bin = 0, 0, 0
|
|
68
|
+
binend = delta.size
|
|
69
|
+
data = 12 # size of the delta instruction values (3 longs)
|
|
70
|
+
while data <= binend
|
|
71
|
+
decode = delta[bin..(bin+11)]
|
|
72
|
+
start, endpt, length = decode.unpack("NNN")
|
|
73
|
+
break if start > endpt
|
|
74
|
+
|
|
75
|
+
bin = data + length
|
|
76
|
+
data = bin + 12
|
|
77
|
+
outlen += start - last
|
|
78
|
+
last = endpt
|
|
79
|
+
outlen += length
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
raise "patch cannot be decoded" if bin != binend
|
|
83
|
+
|
|
84
|
+
outlen += orig - last
|
|
85
|
+
outlen
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.copy_block(io, destination, source, count)
|
|
89
|
+
io.seek(source)
|
|
90
|
+
buf = io.read(count)
|
|
91
|
+
io.seek(destination)
|
|
92
|
+
io.write(buf)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
#
|
|
97
|
+
def self.pull(dst, src, l)
|
|
98
|
+
until l == 0
|
|
99
|
+
f = src.shift
|
|
100
|
+
if f[0] > l
|
|
101
|
+
src.unshift [f[0] - l, f[1] + l]
|
|
102
|
+
dst << [l, f[1]]
|
|
103
|
+
return
|
|
104
|
+
end
|
|
105
|
+
dst << f
|
|
106
|
+
l -= f[0]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
##
|
|
111
|
+
# Takes the fragments we've accumulated and applies them all to the IO.
|
|
112
|
+
def self.collect(io, buf, list)
|
|
113
|
+
start = buf
|
|
114
|
+
list.each do |l, p|
|
|
115
|
+
self.copy_block(io, buf, p, l)
|
|
116
|
+
buf += l
|
|
117
|
+
end
|
|
118
|
+
[buf - start, start]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
namespace :ditz do
|
|
2
|
+
|
|
3
|
+
command :close do |c|
|
|
4
|
+
c.desc "Close a Ditz bug and commit saying that it has been closed"
|
|
5
|
+
|
|
6
|
+
c.opt :message, "Any notes concerning this bug", :short => '-m', :type => :string, :default => ''
|
|
7
|
+
|
|
8
|
+
c.on_run do |opts, args|
|
|
9
|
+
repo = opts[:repository]
|
|
10
|
+
msg = opts[:message]
|
|
11
|
+
issue = args.shift
|
|
12
|
+
|
|
13
|
+
system "ditz close #{issue}"
|
|
14
|
+
|
|
15
|
+
repo.commit :message => "Closed Bug ##{issue}#{msg.empty? ? '' : ": #{msg}"}"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
command :add do |c|
|
|
20
|
+
c.desc "Add a Ditz bug and commit saying that it has been opened"
|
|
21
|
+
|
|
22
|
+
c.opt :message, "Any notes concerning this bug", :short => '-m', :type => :string, :default => ''
|
|
23
|
+
|
|
24
|
+
c.on_run do |opts, args|
|
|
25
|
+
repo = opts[:repository]
|
|
26
|
+
msg = opts[:message]
|
|
27
|
+
|
|
28
|
+
system "ditz add"
|
|
29
|
+
|
|
30
|
+
# seydar: *sigh* i hate taking advantage of side effects
|
|
31
|
+
# File.read('.ditz-config') =~ /^issue_dir:(.+)$/
|
|
32
|
+
# bugs = $1.strip
|
|
33
|
+
# adgar: then don't use them!
|
|
34
|
+
bugs = File.read('.ditz-config').match(/^issue_dir:(.+)$/)[1].strip
|
|
35
|
+
|
|
36
|
+
Amp::Command[:add].run opts, [bugs]
|
|
37
|
+
repo.commit :message => "Added Bugs"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|