mercurial-ruby 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +32 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +86 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/mercurial-ruby.rb +66 -0
- data/lib/mercurial-ruby/branch.rb +45 -0
- data/lib/mercurial-ruby/changed_file.rb +51 -0
- data/lib/mercurial-ruby/command.rb +77 -0
- data/lib/mercurial-ruby/commit.rb +152 -0
- data/lib/mercurial-ruby/config_file.rb +119 -0
- data/lib/mercurial-ruby/configuration.rb +14 -0
- data/lib/mercurial-ruby/diff.rb +50 -0
- data/lib/mercurial-ruby/factories/branch_factory.rb +91 -0
- data/lib/mercurial-ruby/factories/changed_file_factory.rb +50 -0
- data/lib/mercurial-ruby/factories/commit_factory.rb +154 -0
- data/lib/mercurial-ruby/factories/diff_factory.rb +63 -0
- data/lib/mercurial-ruby/factories/hook_factory.rb +45 -0
- data/lib/mercurial-ruby/factories/node_factory.rb +111 -0
- data/lib/mercurial-ruby/factories/tag_factory.rb +48 -0
- data/lib/mercurial-ruby/file_index.rb +209 -0
- data/lib/mercurial-ruby/helper.rb +23 -0
- data/lib/mercurial-ruby/hook.rb +23 -0
- data/lib/mercurial-ruby/manifest.rb +58 -0
- data/lib/mercurial-ruby/node.rb +100 -0
- data/lib/mercurial-ruby/repository.rb +94 -0
- data/lib/mercurial-ruby/root_node.rb +27 -0
- data/lib/mercurial-ruby/shell.rb +64 -0
- data/lib/mercurial-ruby/style.rb +23 -0
- data/lib/mercurial-ruby/tag.rb +33 -0
- data/lib/stdlib_exts/string.rb +12 -0
- data/lib/styles/changeset.style +5 -0
- data/lib/styles/file_index.style +3 -0
- data/mercurial-ruby.gemspec +227 -0
- data/test/fixtures.rb +28 -0
- data/test/fixtures/test-repo/.DotFile +1 -0
- data/test/fixtures/test-repo/.hg/00changelog.i +0 -0
- data/test/fixtures/test-repo/.hg/branch +1 -0
- data/test/fixtures/test-repo/.hg/cache/branchheads +6 -0
- data/test/fixtures/test-repo/.hg/cache/tags +7 -0
- data/test/fixtures/test-repo/.hg/dirstate +0 -0
- data/test/fixtures/test-repo/.hg/hgrc +3 -0
- data/test/fixtures/test-repo/.hg/last-message.txt +1 -0
- data/test/fixtures/test-repo/.hg/requires +4 -0
- data/test/fixtures/test-repo/.hg/store/00changelog.i +0 -0
- data/test/fixtures/test-repo/.hg/store/00manifest.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_file _with _whitespace.pdf.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_l_i_c_e_n_s_e.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_l_i_c_e_n_s_e2.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_l_i_c_e_n_s_e3.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_l_i_c_e_n_s_e4.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_r_e_a_d_m_e.markdown.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_r_e_a_d_m_e.markup.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_rakefile.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_rakefile2.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/_rakefile3.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/check ~5c this ~5c out ~22 now.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/minitest__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/options.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/rdoc__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/rspec__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/shindo__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/shoulda__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/_gemfile.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/_l_i_c_e_n_s_e.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/_r_e_a_d_m_e.rdoc.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/_rakefile.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/bacon/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/bacon/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/bundler__setup.erb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/features/default.feature.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/features/support/env.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/jeweler__tasks.erb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/micronaut/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/micronaut/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/minitest/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/minitest/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/other__tasks.erb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/riot/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/riot/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/rspec/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/rspec/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/rspec/~2erspec.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/shindo/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/shindo/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/shoulda/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/shoulda/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/testspec/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/testspec/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/testunit/flunking.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/testunit/helper.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/~2edocument.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/templates/~2egitignore.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory two/~2e_d_s___store.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory__1/rubygems__dot__org__tasks.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory__1/rubygems__tasks.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory__1/specification.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory__1/tasks.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/directory__1/~2e_d_s___store.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/empty-file.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/goose.png.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/goose/pretty-thing.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-directory/another-boring-file.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-directory/something.csv.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-directory/subdirectory/_e_u_l_a5seat___chin___sim02.03.04.pdf.d +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-directory/subdirectory/_e_u_l_a5seat___chin___sim02.03.04.pdf.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-directory/subdirectory/_file _with _whitespace.pdf.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-directory/subdirectory/beansprout.png.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/new-file.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/old-directory/minitest__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/old-directory/options.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/old-directory/rspec__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/old-directory/shindo__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/old-directory/testunit__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/old-directory/yard__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/riot__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/riot__mixin__copy.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/style.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/super-cow.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/superman.txt.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/testspec__mixin.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/testspec__mixin__new.rb.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/~2e_dot_file.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/~2ehgignore.i +0 -0
- data/test/fixtures/test-repo/.hg/store/data/~2ehgtags.i +0 -0
- data/test/fixtures/test-repo/.hg/store/fncache +79 -0
- data/test/fixtures/test-repo/.hg/store/undo +0 -0
- data/test/fixtures/test-repo/.hg/undo.bookmarks +0 -0
- data/test/fixtures/test-repo/.hg/undo.branch +1 -0
- data/test/fixtures/test-repo/.hg/undo.desc +2 -0
- data/test/fixtures/test-repo/.hg/undo.dirstate +0 -0
- data/test/fixtures/test-repo/.hgignore +1 -0
- data/test/fixtures/test-repo/.hgtags +1 -0
- data/test/fixtures/test-repo/LICENSE3.txt +15 -0
- data/test/fixtures/test-repo/LICENSE4.txt +17 -0
- data/test/fixtures/test-repo/README.markup +218 -0
- data/test/fixtures/test-repo/Rakefile3 +83 -0
- data/test/fixtures/test-repo/check // this // out /" now" "b/data/test/fixtures/test-repo/check // this // out / → now +0 -0
- data/test/fixtures/test-repo/empty-file +0 -0
- data/test/fixtures/test-repo/goose.png +0 -0
- data/test/fixtures/test-repo/goose/pretty-thing.txt +0 -0
- data/test/fixtures/test-repo/new-directory/another-boring-file +78 -0
- data/test/fixtures/test-repo/new-directory/something.csv +1 -0
- data/test/fixtures/test-repo/new-directory/subdirectory/EULA5seat_Chin_Sim02.03.04.pdf +0 -0
- data/test/fixtures/test-repo/new-directory/subdirectory/File With Whitespace.pdf b/data/test/fixtures/test-repo/new-directory/subdirectory/File With → Whitespace.pdf +0 -0
- data/test/fixtures/test-repo/new-directory/subdirectory/beansprout.png +0 -0
- data/test/fixtures/test-repo/riot_mixin.rb +45 -0
- data/test/fixtures/test-repo/style +4 -0
- data/test/fixtures/test-repo/superman.txt +1 -0
- data/test/fixtures/test-repo/testspec_mixin_new.rb +44 -0
- data/test/helper.rb +41 -0
- data/test/test_branch_factory.rb +46 -0
- data/test/test_changed_file.rb +46 -0
- data/test/test_changed_file_factory.rb +16 -0
- data/test/test_command.rb +62 -0
- data/test/test_commit.rb +66 -0
- data/test/test_commit_factory.rb +101 -0
- data/test/test_config_file.rb +105 -0
- data/test/test_configuration.rb +26 -0
- data/test/test_diff.rb +39 -0
- data/test/test_diff_factory.rb +38 -0
- data/test/test_file_index.rb +113 -0
- data/test/test_hook.rb +39 -0
- data/test/test_hook_factory.rb +40 -0
- data/test/test_manifest.rb +39 -0
- data/test/test_node.rb +34 -0
- data/test/test_node_factory.rb +125 -0
- data/test/test_repository.rb +58 -0
- data/test/test_shell.rb +33 -0
- data/test/test_tag_factory.rb +27 -0
- metadata +328 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
module Helper
|
4
|
+
|
5
|
+
def hg(cmd)
|
6
|
+
repository.shell.hg(cmd)
|
7
|
+
end
|
8
|
+
|
9
|
+
def shell(cmd)
|
10
|
+
repository.shell.run(cmd)
|
11
|
+
end
|
12
|
+
|
13
|
+
def hg_to_array(cmd, separator="\n", &block)
|
14
|
+
[].tap do |returning|
|
15
|
+
hg(cmd).split(separator).each do |line|
|
16
|
+
returning << block.call(line)
|
17
|
+
end
|
18
|
+
end.compact
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
class Hook
|
4
|
+
|
5
|
+
attr_reader :repository, :name, :value
|
6
|
+
|
7
|
+
def initialize(repository, name, value)
|
8
|
+
@repository = repository
|
9
|
+
@name = name
|
10
|
+
@value = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def save
|
14
|
+
repository.config.add_setting('hooks', name, value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def destroy!
|
18
|
+
repository.config.delete_setting!('hooks', name)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
#
|
4
|
+
# Represents Mercurial manifest file. Use this class to get manifest's contents
|
5
|
+
# and scan it for file paths at specific revisions.
|
6
|
+
#
|
7
|
+
# Read more about Mercurial manifest:
|
8
|
+
#
|
9
|
+
# http://mercurial.selenic.com/wiki/Manifest
|
10
|
+
#
|
11
|
+
class Manifest
|
12
|
+
include Mercurial::Helper
|
13
|
+
|
14
|
+
# Instance of {Mercurial::Repository Repository}.
|
15
|
+
attr_reader :repository
|
16
|
+
|
17
|
+
def initialize(repository)
|
18
|
+
@repository = repository
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns contents of the manifest as a String at a specified revision.
|
22
|
+
# Latest version of the manifest is used if +revision+ is ommitted.
|
23
|
+
#
|
24
|
+
# == Example:
|
25
|
+
# repository.manifest.contents
|
26
|
+
#
|
27
|
+
def contents(revision=nil)
|
28
|
+
revision ||= 'tip'
|
29
|
+
hg(manifest_cmd(revision))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns an array of file paths from manifest that start with the specified +path+ at a specified +revision+.
|
33
|
+
# Latest version of the manifest is used if +revision+ is ommitted.
|
34
|
+
#
|
35
|
+
# == Example:
|
36
|
+
# repository.manifest.scan_for_path('/')
|
37
|
+
# repository.manifest.scan_for_path('some-interesting-directory/', '2d32410d9629')
|
38
|
+
#
|
39
|
+
def scan_for_path(path, revision=nil)
|
40
|
+
revision ||= 'tip'
|
41
|
+
path = path.without_trailing_slash
|
42
|
+
if path == '/' || path == ''
|
43
|
+
search_for = ".*"
|
44
|
+
else
|
45
|
+
path_re = Regexp.escape(path)
|
46
|
+
search_for = "#{ path_re }$|#{ path_re }\/.*"
|
47
|
+
end
|
48
|
+
contents(revision).scan(/^(\w{40}) (\d{3}) (\*?) +(#{ search_for })/)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def manifest_cmd(revision)
|
54
|
+
["manifest -r ? --debug", revision]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
#
|
4
|
+
# The class represents Mercurial file or directory. Data obtained by scanning +hg manifest+ output.
|
5
|
+
#
|
6
|
+
# The class represents Node object itself, {Mercurial::NodeFactory NodeFactory} is responsible
|
7
|
+
# for assembling instances of Node. For the list of all possible branch-related operations please
|
8
|
+
# look documentation for {Mercurial::NodeFactory NodeFactory}.
|
9
|
+
#
|
10
|
+
# Additionally {Mercurial::Manifest Manifest} is responsible for reading and scanning the manifest.
|
11
|
+
#
|
12
|
+
class Node
|
13
|
+
include Mercurial::Helper
|
14
|
+
|
15
|
+
# Instance of {Mercurial::Repository Repository}.
|
16
|
+
attr_reader :repository
|
17
|
+
|
18
|
+
# Absolute path to the node.
|
19
|
+
attr_reader :path
|
20
|
+
|
21
|
+
# File mode of the node in Octal notation (if file).
|
22
|
+
attr_reader :fmode
|
23
|
+
|
24
|
+
# Executable flag of the node (if file).
|
25
|
+
attr_reader :executable
|
26
|
+
|
27
|
+
# nodeid value for the node (if file).
|
28
|
+
attr_reader :nodeid
|
29
|
+
|
30
|
+
# Node's parent, instance of {Mercurial::Node Node}.
|
31
|
+
attr_reader :parent
|
32
|
+
|
33
|
+
def initialize(opts={})
|
34
|
+
@repository = opts[:repository]
|
35
|
+
@path = opts[:path]
|
36
|
+
@parent = opts[:parent]
|
37
|
+
@name = opts[:name]
|
38
|
+
@fmode = opts[:fmode]
|
39
|
+
@executable = opts[:executable] == '*' ? true : false
|
40
|
+
@revision = opts[:revision]
|
41
|
+
@nodeid = opts[:nodeid]
|
42
|
+
end
|
43
|
+
|
44
|
+
def name
|
45
|
+
@name ||= begin
|
46
|
+
n = path.split('/').last
|
47
|
+
n << '/' if path =~ /\/$/
|
48
|
+
n
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def revision
|
53
|
+
@revision || (parent ? parent.revision : nil) || 'tip'
|
54
|
+
end
|
55
|
+
|
56
|
+
def path_without_parent
|
57
|
+
if parent
|
58
|
+
path.gsub(/^#{ Regexp.escape(parent.path) }/, '')
|
59
|
+
else
|
60
|
+
path
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def entries
|
65
|
+
@_entries ||= repository.nodes.entries_for(path, revision, self)
|
66
|
+
end
|
67
|
+
|
68
|
+
def has_entry?(name)
|
69
|
+
entries.find do |e|
|
70
|
+
e.name == name
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def directory?
|
75
|
+
not file?
|
76
|
+
end
|
77
|
+
|
78
|
+
def file?
|
79
|
+
(name =~ /\/$/).nil?
|
80
|
+
end
|
81
|
+
|
82
|
+
def root?
|
83
|
+
false
|
84
|
+
end
|
85
|
+
|
86
|
+
def binary?
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
90
|
+
def contents
|
91
|
+
hg(["cat ? -r ?", path, revision])
|
92
|
+
end
|
93
|
+
|
94
|
+
def size
|
95
|
+
contents.size
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module Mercurial
|
2
|
+
class RepositoryNotFound < Error; end
|
3
|
+
|
4
|
+
class Repository
|
5
|
+
|
6
|
+
def self.create(destination)
|
7
|
+
init_repository(destination)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.open(destination)
|
11
|
+
if File.exists?(destination)
|
12
|
+
new(destination)
|
13
|
+
else
|
14
|
+
raise Mercurial::RepositoryNotFound.new(destination)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(source)
|
19
|
+
@path = source
|
20
|
+
end
|
21
|
+
|
22
|
+
def shell
|
23
|
+
@_shell ||= Mercurial::Shell.new(self)
|
24
|
+
end
|
25
|
+
|
26
|
+
def config
|
27
|
+
@_config ||= Mercurial::ConfigFile.new(self)
|
28
|
+
end
|
29
|
+
|
30
|
+
def hooks
|
31
|
+
@_hook_factory ||= Mercurial::HookFactory.new(self)
|
32
|
+
end
|
33
|
+
|
34
|
+
def commits
|
35
|
+
@_commits ||= Mercurial::CommitFactory.new(self)
|
36
|
+
end
|
37
|
+
|
38
|
+
def branches
|
39
|
+
@_branches ||= Mercurial::BranchFactory.new(self)
|
40
|
+
end
|
41
|
+
|
42
|
+
def tags
|
43
|
+
@_tags ||= Mercurial::TagFactory.new(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
def diffs
|
47
|
+
@_diffs ||= Mercurial::DiffFactory.new(self)
|
48
|
+
end
|
49
|
+
|
50
|
+
def nodes
|
51
|
+
@_nodes ||= Mercurial::NodeFactory.new(self)
|
52
|
+
end
|
53
|
+
|
54
|
+
def manifest
|
55
|
+
@_manifest ||= Mercurial::Manifest.new(self)
|
56
|
+
end
|
57
|
+
|
58
|
+
def file_index
|
59
|
+
@_file_index ||= Mercurial::FileIndex.new(self)
|
60
|
+
end
|
61
|
+
|
62
|
+
def node(name, hash_id)
|
63
|
+
nodes.find(name, hash_id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def destroy!
|
67
|
+
FileUtils.rm_rf(path)
|
68
|
+
end
|
69
|
+
|
70
|
+
def path
|
71
|
+
File.expand_path(@path)
|
72
|
+
end
|
73
|
+
|
74
|
+
def dothg_path
|
75
|
+
File.join(path, '.hg')
|
76
|
+
end
|
77
|
+
|
78
|
+
def mtime
|
79
|
+
File.mtime(dothg_path).to_i
|
80
|
+
end
|
81
|
+
|
82
|
+
protected
|
83
|
+
|
84
|
+
def self.init_repository(destination)
|
85
|
+
Mercurial::Shell.run("mkdir -p #{ destination }")
|
86
|
+
open(destination).tap do |repo|
|
87
|
+
repo.shell.hg('init', :cache => false)
|
88
|
+
repo.shell.hg('update null', :cache => false)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
class Shell
|
4
|
+
|
5
|
+
attr_reader :repository
|
6
|
+
|
7
|
+
def self.run(cmd, options={})
|
8
|
+
options[:cache] = true if options[:cache].nil?
|
9
|
+
build = []
|
10
|
+
|
11
|
+
if options[:in]
|
12
|
+
build << "cd #{ options[:in] }"
|
13
|
+
end
|
14
|
+
|
15
|
+
if cmd.kind_of?(Array)
|
16
|
+
cmd = interpolate_arguments(cmd)
|
17
|
+
end
|
18
|
+
|
19
|
+
build << cmd
|
20
|
+
to_run = build.join(' && ')
|
21
|
+
Mercurial::Command.new(to_run, :repository => options[:repository], :cache => options[:cache]).execute
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(repository)
|
25
|
+
@repository = repository
|
26
|
+
end
|
27
|
+
|
28
|
+
def hg(cmd, options={})
|
29
|
+
options[:in] ||= repository.path
|
30
|
+
options[:repository] = repository
|
31
|
+
cmd = append_command_with(hg_binary_path, cmd)
|
32
|
+
run(cmd, options)
|
33
|
+
end
|
34
|
+
|
35
|
+
def run(cmd, options={})
|
36
|
+
self.class.run(cmd, options)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def hg_binary_path
|
42
|
+
Mercurial.configuration.hg_binary_path
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.interpolate_arguments(cmd_with_args)
|
46
|
+
cmd_with_args.shift.tap do |cmd|
|
47
|
+
cmd.gsub!(/\?/) do
|
48
|
+
cmd_with_args.shift.to_s.enclose_in_single_quotes
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def append_command_with(append, cmd)
|
54
|
+
if cmd.kind_of?(Array)
|
55
|
+
cmd[0].insert(0, "#{ append } ")
|
56
|
+
cmd
|
57
|
+
else
|
58
|
+
"#{ append } #{ cmd }"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
module Style
|
4
|
+
extend self
|
5
|
+
|
6
|
+
FIELD_SEPARATOR = '|><|'
|
7
|
+
CHANGESET_SEPARATOR = "||$||\n"
|
8
|
+
|
9
|
+
def root_path
|
10
|
+
File.expand_path(File.join(File.dirname(__FILE__), '..', 'styles'))
|
11
|
+
end
|
12
|
+
|
13
|
+
def changeset
|
14
|
+
File.join(root_path, 'changeset.style')
|
15
|
+
end
|
16
|
+
|
17
|
+
def file_index
|
18
|
+
File.join(root_path, 'file_index.style')
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Mercurial
|
2
|
+
|
3
|
+
#
|
4
|
+
# The class represents Mercurial tag. Obtained by running an +hg tags+ command.
|
5
|
+
#
|
6
|
+
# The class represents Tag object itself, {Mercurial::TagFactory TagFactory} is responsible
|
7
|
+
# for assembling instances of Tag. For the list of all possible tag-related operations please
|
8
|
+
# look documentation for {Mercurial::TagFactory TagFactory}.
|
9
|
+
#
|
10
|
+
# Read more about Mercurial tags:
|
11
|
+
#
|
12
|
+
# http://mercurial.selenic.com/wiki/Tag
|
13
|
+
#
|
14
|
+
class Tag
|
15
|
+
|
16
|
+
# Instance of {Mercurial::Repository Repository}.
|
17
|
+
attr_reader :repository
|
18
|
+
|
19
|
+
# Name of the tag.
|
20
|
+
attr_reader :name
|
21
|
+
|
22
|
+
# Mercurial changeset ID of the tag. 40-chars long SHA1 hash.
|
23
|
+
attr_reader :hash_id
|
24
|
+
|
25
|
+
def initialize(repository, name, hash_id)
|
26
|
+
@repository = repository
|
27
|
+
@name = name
|
28
|
+
@hash_id = hash_id
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|