libdolt 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -2,36 +2,25 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  libdolt (0.15.0)
5
- em_pessimistic (~> 0.1)
6
- em_rugged (~> 0.3)
7
- eventmachine (~> 1.0)
8
5
  htmlentities (~> 4.3)
9
6
  json (~> 1.7)
10
7
  makeup (~> 0.2)
11
8
  mime-types (~> 1.19)
9
+ rugged (= 0.17.0.b6)
12
10
  tzinfo (~> 0.3)
13
- when (~> 0)
14
11
 
15
12
  GEM
16
13
  remote: http://rubygems.org/
17
14
  specs:
18
- em-minitest-spec (1.1.1)
19
- eventmachine
20
- em_pessimistic (0.1.2)
21
- eventmachine (~> 1.0)
22
- em_rugged (0.3.0)
23
- eventmachine (~> 1.0)
24
- rugged (= 0.17.0.b6)
25
- eventmachine (1.0.0)
26
15
  github-markup (0.7.5)
27
16
  htmlentities (4.3.1)
28
- json (1.7.6)
17
+ json (1.7.7)
29
18
  makeup (0.3.0)
30
19
  github-markup (~> 0.7)
31
20
  htmlentities (~> 4.3)
32
21
  pygments.rb (~> 0.2)
33
22
  metaclass (0.0.1)
34
- mime-types (1.19)
23
+ mime-types (1.21)
35
24
  minitest (2.12.1)
36
25
  mocha (0.13.1)
37
26
  metaclass (~> 0.0.1)
@@ -46,14 +35,12 @@ GEM
46
35
  tiltout (1.4.0)
47
36
  tilt (~> 1.3)
48
37
  tzinfo (0.3.35)
49
- when (0.1.0)
50
38
  yajl-ruby (1.1.0)
51
39
 
52
40
  PLATFORMS
53
41
  ruby
54
42
 
55
43
  DEPENDENCIES
56
- em-minitest-spec (~> 1.1)
57
44
  libdolt!
58
45
  minitest (~> 2.0)
59
46
  mocha
data/Readme.md CHANGED
@@ -25,9 +25,8 @@ To install `dolt` you need Ruby, RubyGems and Python development files. The
25
25
  Python development files are required to support Pygments syntax highlighting.
26
26
 
27
27
  Note: Dolt uses [libgit2](http://libgit2.github.com) and its Ruby bindings,
28
- [Rugged](http://github.com/libgit2/rugged) through
29
- [em-rugged](http://gitorious.org/gitorious/em-rugged) for Git access where
30
- feasible. Currently, ``EMRugged`` relies on a version of `Rugged` that is not
28
+ [Rugged](http://github.com/libgit2/rugged) for Git access where
29
+ feasible. Currently, ``Dolt`` relies on a version of `Rugged` that is not
31
30
  yet released, so you have to build it yourself.
32
31
  [See em-rugged instructions](http://github.com/cjohansen/em-rugged).
33
32
 
@@ -15,21 +15,14 @@
15
15
  # You should have received a copy of the GNU Affero General Public License
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  #++
18
- require "when"
19
- require "eventmachine"
20
- require "em_pessimistic"
21
18
  require "fileutils"
19
+ require "shellwords"
20
+ require "libdolt/git"
22
21
 
23
22
  module Dolt
24
23
  module Git
25
24
  class Archiver
26
25
  def initialize(work_dir, cache_dir)
27
- # A hash of currently processing archiving jobs. It contains tuples of
28
- # "#{repo.id}-#{oid}-#{format}" => promises representing the eventual
29
- # completion of archiving tasks. When an archiving task is completed,
30
- # its promise is removed from the hash. Previously generated tarballs
31
- # can be found on disk.
32
- @processing = {}
33
26
  @work_dir = work_dir
34
27
  @cache_dir = cache_dir
35
28
  end
@@ -42,40 +35,23 @@ module Dolt
42
35
  # format - A symbol. If it is not :zip, tar.gz is assumed.
43
36
  def archive(repo, oid, format = :tgz)
44
37
  filename = cache_path(repo, oid, format)
45
- return When.resolve(filename) if File.exists?(filename)
46
- pending = pending_process(repo, oid, format)
47
- return pending if pending
48
- start_process(repo, oid, format)
38
+ return filename if File.exists?(filename)
39
+ archive_repo(repo, oid, format)
49
40
  end
50
41
 
51
42
  private
52
- def process_id(repo, oid, format)
53
- "#{repo.id}-#{oid}-#{ext(format)}"
54
- end
55
-
56
- def pending_process(repo, oid, format)
57
- @processing[process_id(repo, oid, format)]
58
- end
59
-
60
- def start_process(repo, oid, format)
61
- @processing[process_id(repo, oid, format)] = When.defer do |d|
62
- p = EMPessimistic::DeferrableChildProcess.open(cmd(repo, oid, format))
63
-
64
- p.callback do |output, status|
65
- filename = cache_path(repo, oid, format)
66
- FileUtils.mv(work_path(repo, oid, format), filename)
67
- d.resolve(filename)
68
- end
69
-
70
- p.errback do |output, status|
71
- d.reject(Exception.new(output))
72
- end
73
- end
43
+ def archive_repo(repo, oid, format)
44
+ process = Dolt::Git.shell(cmd(repo, oid, format))
45
+ raise process.exception if !process.success?
46
+ filename = cache_path(repo, oid, format)
47
+ FileUtils.mv(work_path(repo, oid, format), filename)
48
+ filename
74
49
  end
75
50
 
76
51
  def cmd(repository, oid, format)
77
52
  path_segment = repository.path_segment.gsub(/\//, "-")
78
- cmd = "sh -c 'git --git-dir #{repository.full_repository_path} archive "
53
+ git = Dolt::Git.binary
54
+ cmd = "sh -c '#{git} --git-dir #{repository.full_repository_path} archive "
79
55
  cmd += "--prefix='#{u(path_segment)}/' --format="
80
56
  wpath = u(work_path(repository, oid, format))
81
57
  cmd + (format.to_s == "zip" ? "zip #{u(oid)} > #{wpath}" : "tar #{u(oid)} | gzip -m > #{wpath}") + "'"
@@ -90,17 +66,16 @@ module Dolt
90
66
  end
91
67
 
92
68
  def basename(repository, oid, format)
93
- path_segment = repository.path_segment.gsub(/\//, "-")
94
- "#{path_segment}-#{oid}.#{ext(format)}"
69
+ path_segment = "#{repository.path_segment}-#{oid}".gsub(/\//, "-")
70
+ "#{path_segment}.#{ext(format)}"
95
71
  end
96
72
 
97
73
  def ext(format)
98
74
  format.to_s == "zip" ? "zip" : "tar.gz"
99
75
  end
100
76
 
101
- # Unquote a string by stripping off any single or double quotes
102
77
  def u(string)
103
- string.gsub("'", '').gsub('"', '')
78
+ Shellwords.escape(string)
104
79
  end
105
80
  end
106
81
  end
@@ -19,6 +19,8 @@ require "tzinfo"
19
19
 
20
20
  module Dolt
21
21
  module Git
22
+ class InvalidBlameFormat < Exception; end
23
+
22
24
  class Blame
23
25
  attr_reader :chunks
24
26
 
@@ -53,6 +55,8 @@ module Dolt
53
55
  end
54
56
 
55
57
  chunks
58
+ rescue Exception => error
59
+ raise InvalidBlameFormat.new("Failed parsing Procelain: #{error.message}")
56
60
  end
57
61
 
58
62
  def is_header?(line)
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ #--
3
+ # Copyright (C) 2013 Gitorious AS
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ #++
18
+
19
+ module Dolt
20
+ module Git
21
+ class Process
22
+ attr_reader :stdin, :stdout, :stderr
23
+
24
+ def initialize(stdin, stdout, stderr, process_status)
25
+ @stdin = stdin
26
+ @stdout = stdout
27
+ @stderr = stderr
28
+ @process_status = process_status
29
+ end
30
+
31
+ def success?
32
+ @process_status.success?
33
+ end
34
+
35
+ def exit_code
36
+ @process_status.exitstatus
37
+ end
38
+
39
+ def exception
40
+ Exception.new(stderr.read)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  #--
3
- # Copyright (C) 2012 Gitorious AS
3
+ # Copyright (C) 2012-2013 Gitorious AS
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Affero General Public License as published by
@@ -15,53 +15,45 @@
15
15
  # You should have received a copy of the GNU Affero General Public License
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  #++
18
- require "em_rugged/repository"
19
- require "em_pessimistic/deferrable_child_process"
18
+ require "rugged"
19
+ require "libdolt/git"
20
20
  require "libdolt/git/blame"
21
21
  require "libdolt/git/commit"
22
22
  require "libdolt/git/submodule"
23
23
  require "libdolt/git/tree"
24
- require "when"
25
24
 
26
25
  module Dolt
27
26
  module Git
28
- class Repository < EMRugged::Repository
29
- def submodules(ref)
30
- d = When.defer
31
- gm = rev_parse("#{ref}:.gitmodules")
32
- gm.callback do |config|
33
- d.resolve(Dolt::Git::Submodule.parse_config(config.content))
34
- end
35
- # Fails if .gitmodules cannot be found, which means no submodules
36
- gm.errback { |err| d.resolve([]) }
37
- d
27
+ class Repository
28
+ def initialize(root)
29
+ @repo = Rugged::Repository.new(root)
38
30
  end
39
31
 
40
- def tree_entry(ref, path)
41
- When.defer do |d|
42
- rp = rev_parse("#{ref}:#{path}")
43
- rp.callback { |object| annotate_tree(d, ref, path, object) }
44
- rp.errback { |err| d.reject(err) }
45
- end
32
+ def bare?; @repo.bare?; end
33
+ def path; @repo.path; end
34
+ def rev_parse(*args); @repo.rev_parse(*args); end
35
+
36
+ def submodules(ref)
37
+ config = rev_parse("#{ref}:.gitmodules")
38
+ Dolt::Git::Submodule.parse_config(config.content)
39
+ rescue Rugged::IndexerError => err
40
+ # Raised if .gitmodules cannot be found, which means no submodules
41
+ []
46
42
  end
47
43
 
48
44
  def tree(ref, path)
49
- When.defer do |d|
50
- rp = rev_parse("#{ref}:#{path}")
51
- rp.callback do |object|
52
- if !object.is_a?(Rugged::Tree)
53
- next d.reject(StandardError.new("Not a tree"))
54
- end
55
- annotate_tree(d, ref, path, object)
56
- end
57
- rp.errback { |err| d.reject(err) }
58
- end
45
+ object = rev_parse("#{ref}:#{path}")
46
+ raise StandardError.new("Not a tree") if !object.is_a?(Rugged::Tree)
47
+ annotate_tree(ref, path, object)
59
48
  end
60
49
 
61
- def blame(ref, path)
62
- deferred_method("blame -l -t -p #{ref} -- #{path}") do |output, s|
63
- Dolt::Git::Blame.parse_porcelain(output)
64
- end
50
+ def tree_entry(ref, path)
51
+ annotate_tree(ref, path, rev_parse("#{ref}:#{path}"))
52
+ end
53
+
54
+ def blame(ref, blob_path)
55
+ process = Dolt::Git.git(path, "blame -l -t -p #{ref} -- #{blob_path}")
56
+ Dolt::Git::Blame.parse_porcelain(process.stdout.read)
65
57
  end
66
58
 
67
59
  def log(ref, path, limit)
@@ -69,98 +61,61 @@ module Dolt
69
61
  end
70
62
 
71
63
  def tree_history(ref, path, limit = 1)
72
- When.defer do |d|
73
- rp = rev_parse("#{ref}:#{path}")
74
- rp.errback { |err| d.reject(err) }
75
- rp.callback do |tree|
76
- if tree.class != Rugged::Tree
77
- message = "#{ref}:#{path} is not a tree (#{tree.class.to_s})"
78
- next d.reject(Exception.new(message))
79
- end
64
+ tree = rev_parse("#{ref}:#{path}")
80
65
 
81
- building = build_history(path || "./", ref, tree, limit)
82
- building.callback { |history| d.resolve(history) }
83
- building.errback { |err| d.reject(err) }
84
- end
66
+ if tree.class != Rugged::Tree
67
+ message = "#{ref}:#{path} is not a tree (#{tree.class.to_s})"
68
+ raise Exception.new(message)
85
69
  end
70
+
71
+ annotate_history(path || "./", ref, tree, limit)
86
72
  end
87
73
 
88
74
  def readme(ref)
89
- When.defer do |d|
90
- t = self.tree(ref, "")
91
- t.callback do |tree|
92
- d.resolve(tree.entries.select do |e|
93
- e[:type] == :blob && e[:name].match(/readme/i)
94
- end)
95
- end
96
- t.errback { |err| d.resolve([]) }
75
+ tree(ref, "").entries.select do |e|
76
+ e[:type] == :blob && e[:name].match(/readme/i)
97
77
  end
78
+ rescue Exception => err
79
+ []
98
80
  end
99
81
 
100
82
  private
101
83
  def entry_history(ref, entry, limit)
102
- deferred_method("log -n #{limit} #{ref} -- #{entry}") do |out, s|
103
- Dolt::Git::Commit.parse_log(out)
104
- end
84
+ process = Dolt::Git.git(path, "log -n #{limit} #{ref} -- #{entry}")
85
+ Dolt::Git::Commit.parse_log(process.stdout.read)
105
86
  end
106
87
 
107
- def build_history(path, ref, entries, limit)
108
- d = When.defer
88
+ def annotate_history(path, ref, entries, limit)
109
89
  resolve = lambda { |p| path == "" ? p : File.join(path, p) }
110
- progress = When.all(entries.map do |e|
111
- entry_history(ref, resolve.call(e[:name]), limit)
112
- end)
113
- progress.errback { |e| d.reject(e) }
114
- progress.callback do |history|
115
- d.resolve(entries.map { |e| e.merge({ :history => history.shift }) })
90
+ entries.map do |e|
91
+ e.merge(:history => entry_history(ref, resolve.call(e[:name]), limit))
116
92
  end
117
- d
118
93
  end
119
94
 
120
- def annotate_tree(d, ref, path, object)
95
+ def annotate_tree(ref, path, object)
121
96
  if object.class.to_s.match(/Blob/) || !object.find { |e| e[:type].nil? }
122
- return d.resolve(object)
97
+ return object
123
98
  end
124
99
 
125
- annotate_submodules(d, ref, path, object)
100
+ annotate_submodules(ref, path, object)
126
101
  end
127
102
 
128
- def annotate_submodules(deferrable, ref, path, tree)
129
- submodules(ref).callback do |submodules|
130
- entries = tree.entries.map do |entry|
131
- if entry[:type].nil?
132
- mod = path == "" ? entry[:name] : File.join(path, entry[:name])
133
- meta = submodules.find { |s| s[:path] == mod }
134
- if meta
135
- entry[:type] = :submodule
136
- entry[:url] = meta[:url]
137
- end
103
+ def annotate_submodules(ref, path, tree)
104
+ modules = submodules(ref)
105
+
106
+ entries = tree.entries.map do |entry|
107
+ if entry[:type].nil?
108
+ mod = path == "" ? entry[:name] : File.join(path, entry[:name])
109
+ meta = modules.find { |s| s[:path] == mod }
110
+ if meta
111
+ entry[:type] = :submodule
112
+ entry[:url] = meta[:url]
138
113
  end
139
- entry
140
114
  end
141
-
142
- deferrable.resolve(Dolt::Git::Tree.new(tree.oid, entries))
143
- end
144
- end
145
-
146
- def deferred_method(cmd, &block)
147
- d = When.defer
148
- cmd = git(cmd)
149
- p = EMPessimistic::DeferrableChildProcess.open(cmd)
150
-
151
- p.callback do |output, status|
152
- d.resolve(block.call(output, status))
115
+ entry
153
116
  end
154
117
 
155
- p.errback do |stderr, status|
156
- d.reject(stderr)
157
- end
158
-
159
- d
160
- end
161
-
162
- def git(cmd)
163
- "git --git-dir #{path} #{cmd}"
118
+ Dolt::Git::Tree.new(tree.oid, entries)
164
119
  end
165
120
  end
166
121
  end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ #--
3
+ # Copyright (C) 2013 Gitorious AS
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ #++
18
+ require "open3"
19
+ require "libdolt/git/process"
20
+ require "shellwords"
21
+
22
+ module Dolt
23
+ module Git
24
+ def self.shell(command)
25
+ stdin, stdout, stderr = Open3.popen3(command)
26
+ Dolt::Git::Process.new(stdin, stdout, stderr, $?)
27
+ end
28
+
29
+ def self.git(git_dir, command)
30
+ args = Shellwords.join(command.split(" "))
31
+ shell("#{binary} --git-dir #{git_dir} #{args}")
32
+ end
33
+
34
+ def self.binary
35
+ @binary ||= "git"
36
+ end
37
+
38
+ def self.binary=(path)
39
+ @binary = path
40
+ end
41
+ end
42
+ end
@@ -28,50 +28,43 @@ module Dolt
28
28
  @archiver = archiver
29
29
  end
30
30
 
31
- def blob(repo, ref, path, &block)
32
- repo_action(repo, ref, path, :blob, :rev_parse, "#{ref}:#{path}", &block)
31
+ def blob(repo, ref, path)
32
+ repo_action(repo, ref, path, :blob, :rev_parse, "#{ref}:#{path}")
33
33
  end
34
34
 
35
- def tree(repo, ref, path, &block)
36
- repo_action(repo, ref, path, :tree, :tree, ref, path, &block)
35
+ def tree(repo, ref, path)
36
+ repo_action(repo, ref, path, :tree, :tree, ref, path)
37
37
  end
38
38
 
39
- def tree_entry(repo, ref, path, &block)
39
+ def tree_entry(repo, ref, path)
40
40
  repository = resolve_repository(repo)
41
- d = repository.tree_entry(ref, path)
42
- d.callback do |result|
43
- key = result.class.to_s.match(/Blob/) ? :blob : :tree
44
- block.call(nil, tpl_data(repository, ref, path, { key => result, :type => key }))
45
- end
46
- d.errback { |err| block.call(err, nil) }
41
+ result = repository.tree_entry(ref, path)
42
+ key = result.class.to_s.match(/Blob/) ? :blob : :tree
43
+ tpl_data(repository, ref, path, { key => result, :type => key })
47
44
  end
48
45
 
49
- def blame(repo, ref, path, &block)
50
- repo_action(repo, ref, path, :blame, :blame, ref, path, &block)
46
+ def blame(repo, ref, path)
47
+ repo_action(repo, ref, path, :blame, :blame, ref, path)
51
48
  end
52
49
 
53
- def history(repo, ref, path, count, &block)
54
- repo_action(repo, ref, path, :commits, :log, ref, path, count, &block)
50
+ def history(repo, ref, path, count)
51
+ repo_action(repo, ref, path, :commits, :log, ref, path, count)
55
52
  end
56
53
 
57
- def refs(repo, &block)
54
+ def refs(repo)
58
55
  repository = resolve_repository(repo)
59
- d = repository.refs
60
- d.callback do |refs|
61
- names = refs.map(&:name)
62
- block.call(nil, {
63
- :tags => expand_refs(repository, names, :tags),
64
- :heads => expand_refs(repository, names, :heads)
65
- }.merge(repository.to_hash))
66
- end
67
- d.errback { |err| block.call(err, nil) }
56
+ names = repository.refs.map(&:name)
57
+ {
58
+ :tags => expand_refs(repository, names, :tags),
59
+ :heads => expand_refs(repository, names, :heads)
60
+ }.merge(repository.to_hash)
68
61
  end
69
62
 
70
- def tree_history(repo, ref, path, count, &block)
71
- repo_action(repo, ref, path, :tree, :tree_history, ref, path, count, &block)
63
+ def tree_history(repo, ref, path, count)
64
+ repo_action(repo, ref, path, :tree, :tree_history, ref, path, count)
72
65
  end
73
66
 
74
- def archive(repo, ref, format, &block)
67
+ def archive(repo, ref, format)
75
68
  repository = resolve_repository(repo)
76
69
  d = @archiver.archive(repository, ref, format)
77
70
  d.callback { |filename| block.call(nil, filename) }
@@ -87,19 +80,18 @@ module Dolt
87
80
  end
88
81
 
89
82
  def rev_parse_oid(repo, ref)
90
- resolve_repository(repo).rev_parse_oid_sync(ref)
83
+ resolve_repository(repo).rev_parse_oid(ref)
91
84
  end
92
85
 
93
86
  private
94
87
  def repo_resolver; @repo_resolver; end
95
88
 
96
- def repo_action(repo, ref, path, data, method, *args, &block)
89
+ def repo_action(repo, ref, path, data, method, *args)
97
90
  repository = resolve_repository(repo)
98
- d = repository.send(method, *args)
99
- d.callback do |result|
100
- block.call(nil, tpl_data(repository, ref, path, { data => result }))
101
- end
102
- d.errback { |err| block.call(err, nil) }
91
+
92
+ tpl_data(repository, ref, path, {
93
+ data => repository.send(method, *args)
94
+ })
103
95
  end
104
96
 
105
97
  def tpl_data(repo, ref, path, locals = {})
@@ -109,7 +101,7 @@ module Dolt
109
101
 
110
102
  def expand_refs(repository, names, type)
111
103
  names.select { |n| n =~ /#{type}/ }.map do |n|
112
- [n.sub(/^refs\/#{type}\//, ""), repository.rev_parse_oid_sync(n)]
104
+ [n.sub(/^refs\/#{type}\//, ""), repository.rev_parse_oid(n)]
113
105
  end
114
106
  end
115
107
  end
@@ -17,5 +17,5 @@
17
17
  #++
18
18
 
19
19
  module Dolt
20
- VERSION = "0.15.0"
20
+ VERSION = "0.16.0"
21
21
  end
data/lib/libdolt.rb CHANGED
@@ -1,7 +1,6 @@
1
-
2
1
  # encoding: utf-8
3
2
  #--
4
- # Copyright (C) 2012 Gitorious AS
3
+ # Copyright (C) 2012-2013 Gitorious AS
5
4
  #
6
5
  # This program is free software: you can redistribute it and/or modify
7
6
  # it under the terms of the GNU Affero General Public License as published by
@@ -16,7 +15,6 @@
16
15
  # You should have received a copy of the GNU Affero General Public License
17
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
17
  #++
19
-
20
18
  require "libdolt/version"
21
19
  require "libdolt/disk_repo_resolver"
22
20
  require "libdolt/gitorious_repo_resolver"
data/libdolt.gemspec CHANGED
@@ -13,10 +13,7 @@ Gem::Specification.new do |s|
13
13
 
14
14
  s.rubyforge_project = "libdolt"
15
15
 
16
- s.add_dependency "eventmachine", "~>1.0"
17
- s.add_dependency "when", "~>0"
18
- s.add_dependency "em_pessimistic", "~>0.1"
19
- s.add_dependency "em_rugged", "~> 0.3"
16
+ s.add_dependency "rugged", "0.17.0.b6"
20
17
  s.add_dependency "tzinfo", "~> 0.3"
21
18
  s.add_dependency "makeup", "~>0.2"
22
19
  s.add_dependency "htmlentities", "~> 4.3"
@@ -24,7 +21,6 @@ Gem::Specification.new do |s|
24
21
  s.add_dependency "mime-types", "~> 1.19"
25
22
 
26
23
  s.add_development_dependency "minitest", "~> 2.0"
27
- s.add_development_dependency "em-minitest-spec", "~> 1.1"
28
24
  s.add_development_dependency "rake", "~> 0.9"
29
25
  s.add_development_dependency "redcarpet", "2.2.0"
30
26
  s.add_development_dependency "tiltout", "~>1.4"