ed 0.2.1 → 0.3.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/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (C) 2011 by Robert Gleeson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
20
+
data/README.md CHANGED
@@ -55,11 +55,8 @@ _supported_
55
55
 
56
56
  * Rubinius
57
57
  * CRuby (1.8 / 1.9)
58
-
59
- _unsupported_
60
-
61
- * JRuby
62
- * MacRuby
58
+ * JRuby (support implemented without `Kernel#fork`.)
59
+ * MacRuby (support implemented without `Kernel#fork`.)
63
60
 
64
61
  __INSTALL__
65
62
 
data/lib/ed.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'observe'
2
2
  require 'ed/version'
3
+ require 'ed/env'
4
+ require 'ed/config'
3
5
  require 'ed/repository'
4
6
  require 'ed/context'
5
7
  require 'ed/core_ext/object'
@@ -8,6 +10,25 @@ class Ed
8
10
 
9
11
  include Observe
10
12
 
13
+ class << self
14
+
15
+ #
16
+ # @example
17
+ # Ed.configure do |config|
18
+ # config.fork = true
19
+ # end
20
+ #
21
+ # @yieldparam config
22
+ # (see Ed::Config.change)
23
+ #
24
+ # @return [void]
25
+ #
26
+ def configure &block
27
+ Ed::Config.change(&block)
28
+ end
29
+
30
+ end
31
+
11
32
  #
12
33
  # @param [String] path
13
34
  # The path to a git repository.
@@ -21,7 +42,7 @@ class Ed
21
42
  @repo = Ed::Repository.new(path)
22
43
 
23
44
  if block_given?
24
- yield(self)
45
+ yield self
25
46
  end
26
47
  end
27
48
 
@@ -29,6 +50,9 @@ class Ed
29
50
  # @param [Proc] block
30
51
  # A block executed before {#commit}, {#branch}, or {#tag} is called.
31
52
  #
53
+ # @yieldparam [String] path
54
+ # The path to the repository on local disk.
55
+ #
32
56
  # @return [void]
33
57
  #
34
58
  def before &block
@@ -37,29 +61,44 @@ class Ed
37
61
 
38
62
  #
39
63
  # @param [String] commit
40
- # Any string that is passable to 'git checkout'.
64
+ # A string you can pass to 'git checkout'.
41
65
  #
42
66
  # @param [Proc] block
43
67
  # A block executed while the repository has switched to 'commit'.
44
68
  #
69
+ # @yieldparam [String] path
70
+ # The path to the repository on local disk.
71
+ #
72
+ # @return [void]
73
+ #
45
74
  def commit commit, &block
46
- switch(commit, &block)
75
+ if Ed::Config.fork?
76
+ pid = fork {
77
+ switch(commit, &block)
78
+ }
79
+
80
+ Process.wait(pid)
81
+ else
82
+ switch(commit, &block)
83
+ end
47
84
  end
48
85
  alias_method :tag , :commit
49
86
  alias_method :branch, :commit
50
-
51
-
87
+
88
+ #
89
+ # Switches to 'commit', and runs &block.
90
+ #
91
+ # @param commit
92
+ # (see Ed#commit)
93
+ #
94
+ # @param block
95
+ # (see Ed#commit)
96
+ #
52
97
  def switch(commit, &block)
53
- pid = fork do
54
- @repo.checkout '-q', commit
55
- notify_observers(:before_filter, @repo.path)
56
- block.call(@repo.path)
57
- end
58
-
59
- Process.wait(pid)
98
+ @repo.checkout '-q', commit
99
+ notify_observers(:before_filter, @repo.path)
100
+ block.call(@repo.path)
60
101
  end
61
102
  private :switch
62
103
 
63
104
  end
64
-
65
-
data/lib/ed/config.rb ADDED
@@ -0,0 +1,75 @@
1
+ require 'pathname'
2
+
3
+ module Ed::Config
4
+
5
+ class << self
6
+
7
+ #
8
+ # @yieldparam [Ed::Config] config
9
+ # Yields {Ed::Config}.
10
+ #
11
+ # @example
12
+ #
13
+ # Ed::Config.change do |config|
14
+ # config.fork = false
15
+ # end
16
+ #
17
+ def change
18
+ yield self
19
+ end
20
+
21
+ #
22
+ # @param [String, #to_s] path
23
+ # The path to use when storing cloned repositories.
24
+ #
25
+ # @return [Pathname]
26
+ #
27
+ def repo_dir= path
28
+ @repo_dir = Pathname.new path.to_s
29
+ end
30
+
31
+ #
32
+ # @return [Pathname]
33
+ # The path being used to store cloned repositories.
34
+ #
35
+ def repo_dir
36
+ @repo_dir
37
+ end
38
+
39
+ #
40
+ # @param [Boolean] value
41
+ # Enable or disable the creation of a subprocess before checking out a commit.
42
+ #
43
+ # @return [Boolean]
44
+ #
45
+ def fork= value
46
+ if value && Ed::Env.fork_unavailable?
47
+ raise ArgumentError, 'Kernel#fork is not available on your platform.'
48
+ end
49
+
50
+ @fork = value
51
+ end
52
+
53
+ #
54
+ # @return [Boolean]
55
+ # Returns true if a subprocess is created before checking out a commit.
56
+ #
57
+ def fork
58
+ @fork
59
+ end
60
+ alias_method :fork?, :fork
61
+
62
+ end
63
+
64
+ change do |config|
65
+ config.fork = false
66
+
67
+ if Ed::Env.windows?
68
+ config.repo_dir = ::ENV["TEMP"]
69
+ else
70
+ config.repo_dir = ::ENV["TMPDIR"] || "/tmp"
71
+ end
72
+ end
73
+
74
+ end
75
+
data/lib/ed/env.rb ADDED
@@ -0,0 +1,40 @@
1
+ module Ed::Env
2
+
3
+ class << self
4
+ #
5
+ # @return [Boolean]
6
+ # Are we on Windows?
7
+ #
8
+ def windows?
9
+ RUBY_PLATFORM['mswin32'] ||
10
+ RUBY_PLATFORM['mingw'] ||
11
+ RUBY_PLATFORM['cygwin']
12
+ end
13
+
14
+ #
15
+ # @return [Boolean]
16
+ # Are we on JRuby?
17
+ #
18
+ def jruby?
19
+ RUBY_PLATFORM == 'java'
20
+ end
21
+
22
+ #
23
+ # @return [Boolean]
24
+ # Are we on MacRuby?
25
+ #
26
+ def macruby?
27
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == 'macruby'
28
+ end
29
+
30
+ #
31
+ # @return [Boolean]
32
+ # Returns true if Kernel#fork is unavailable.
33
+ #
34
+ def fork_unavailable?
35
+ macruby? || jruby? || windows?
36
+ end
37
+
38
+ end
39
+
40
+ end
data/lib/ed/repository.rb CHANGED
@@ -30,6 +30,14 @@ class Ed::Repository
30
30
  @path = path.to_s
31
31
  @copy = false
32
32
  end
33
+
34
+ parent = Process.pid
35
+
36
+ ObjectSpace.define_finalizer(self) do
37
+ if parent == Process.pid
38
+ FileUtils.rm_rf(@path)
39
+ end
40
+ end
33
41
  end
34
42
 
35
43
  #
@@ -38,26 +46,25 @@ class Ed::Repository
38
46
  #
39
47
  # @return [void]
40
48
  #
41
- def checkout *options
42
- git "checkout", *options
49
+ def checkout *args
50
+ git "checkout", *args
43
51
  end
44
52
 
45
53
  #
46
54
  # @param [String] from
47
55
  # The path to copy from.
48
56
  #
49
- # @param [String] to
50
- # The path to copy to.
51
- #
52
57
  # @return [String]
53
58
  # The path to the copied repository.
54
59
  #
55
- def copy! from, to = "/tmp/#{Process.pid}-#{Thread.current.object_id}.ed"
60
+ def copy! from
61
+ to = File.join(Ed::Config.repo_dir, "ed/#{Process.pid}/#{object_id}")
62
+
56
63
  unless File.exists? to
57
64
  FileUtils.mkdir_p(to)
58
65
  system 'git', 'clone', '-q', from, to
59
66
  end
60
-
67
+
61
68
  to
62
69
  end
63
70
  private :copy!
data/lib/ed/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Ed
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-14 00:00:00.000000000 Z
12
+ date: 2012-01-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: observe
16
- requirement: &70336697199260 !ruby/object:Gem::Requirement
16
+ requirement: &70173273170720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70336697199260
24
+ version_requirements: *70173273170720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &70336697198720 !ruby/object:Gem::Requirement
27
+ requirement: &70173273169240 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 0.9.2
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70336697198720
35
+ version_requirements: *70173273169240
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: minitest
38
- requirement: &70336697198240 !ruby/object:Gem::Requirement
38
+ requirement: &70173273168380 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '2.6'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70336697198240
46
+ version_requirements: *70173273168380
47
47
  description: A Domain Specific Language(DSL) that you can use to talk to Git from
48
48
  Ruby.
49
49
  email:
@@ -55,6 +55,7 @@ files:
55
55
  - .gitignore
56
56
  - .travis.yml
57
57
  - Gemfile
58
+ - LICENSE.txt
58
59
  - README.md
59
60
  - Rakefile
60
61
  - ed.gemspec
@@ -62,8 +63,10 @@ files:
62
63
  - examples/pry.rb
63
64
  - examples/test-suite.rb
64
65
  - lib/ed.rb
66
+ - lib/ed/config.rb
65
67
  - lib/ed/context.rb
66
68
  - lib/ed/core_ext/object.rb
69
+ - lib/ed/env.rb
67
70
  - lib/ed/repository.rb
68
71
  - lib/ed/version.rb
69
72
  - test/setup.rb
@@ -80,18 +83,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
80
83
  - - ! '>='
81
84
  - !ruby/object:Gem::Version
82
85
  version: '0'
83
- segments:
84
- - 0
85
- hash: -643359230186522538
86
86
  required_rubygems_version: !ruby/object:Gem::Requirement
87
87
  none: false
88
88
  requirements:
89
89
  - - ! '>='
90
90
  - !ruby/object:Gem::Version
91
91
  version: '0'
92
- segments:
93
- - 0
94
- hash: -643359230186522538
95
92
  requirements: []
96
93
  rubyforge_project: Ed
97
94
  rubygems_version: 1.8.11
@@ -101,3 +98,4 @@ summary: A Domain Specific Language(DSL) that you can use to talk to Git from Ru
101
98
  test_files:
102
99
  - test/setup.rb
103
100
  - test/test_ed.rb
101
+ has_rdoc: