caplock 0.1.0 → 0.2.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.
@@ -2,6 +2,19 @@
2
2
 
3
3
  Adds a lock file to Capistrano deployments.
4
4
 
5
+ == Installation
6
+
7
+ $ gem install caplock
8
+
9
+ Include in your Capfile
10
+ require 'rubygems'
11
+ require 'caplock'
12
+
13
+ == Usage
14
+
15
+ Define the name of your lock file in your deploy.rb
16
+ set :lockfile, "my.lock" # defaults to "cap.lock"
17
+
5
18
  == Note on Patches/Pull Requests
6
19
 
7
20
  * Fork the project.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -1,42 +1,36 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{caplock}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Dru Ibarra}]
12
- s.date = %q{2012-01-10}
12
+ s.date = %q{2012-03-09}
13
13
  s.description = %q{Adds a lock file to Capistrano deployments to prevent concurrent deployments.}
14
14
  s.email = %q{Druwerd@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE",
17
- "README.rdoc"
17
+ "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
- ".gitignore",
22
- "LICENSE",
23
- "README.rdoc",
24
- "Rakefile",
25
- "VERSION",
26
- "caplock.gemspec",
27
- "lib/caplock.rb",
28
- "test/helper.rb",
29
- "test/test_caplock.rb"
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "caplock.gemspec",
26
+ "lib/caplock.rb",
27
+ "test/helper.rb",
28
+ "test/test_caplock.rb"
30
29
  ]
31
30
  s.homepage = %q{http://github.com/Druwerd/caplock}
32
- s.rdoc_options = [%q{--charset=UTF-8}]
33
31
  s.require_paths = [%q{lib}]
34
- s.rubygems_version = %q{1.8.5}
32
+ s.rubygems_version = %q{1.8.6}
35
33
  s.summary = %q{Adds a lock file to Capistrano deployments}
36
- s.test_files = [
37
- "test/helper.rb",
38
- "test/test_caplock.rb"
39
- ]
40
34
 
41
35
  if s.respond_to? :specification_version then
42
36
  s.specification_version = 3
@@ -1,59 +1,79 @@
1
- Capistrano::Configuration.instance.load do
2
-
3
- set :lockfile, "cap.lock"
1
+ require 'capistrano'
2
+
3
+ module Capistrano
4
+ module Caplock
4
5
 
5
- # Returns Boolean indicating the result of +filetest+ on +full_path+ on the server, evaluated by shell on
6
- # the server (usually bash or something roughly compatible).
7
- def remote_filetest_passes?(filetest, full_path)
8
- 'true' == capture("if [ #{filetest} #{full_path} ]; then echo 'true'; fi").strip
9
- end
6
+ # Returns Boolean indicating the result of +filetest+ on +full_path+ on the server, evaluated by shell on
7
+ # the server (usually bash or something roughly compatible).
8
+ def remote_filetest_passes?(filetest, full_path)
9
+ 'true' == capture("if [ #{filetest} #{full_path} ]; then echo 'true'; fi").strip
10
+ end
10
11
 
11
- # Checks if a symlink exists on the remote machine.
12
- def remote_symlink_exists?(full_path)
13
- remote_filetest_passes?('-L', full_path)
14
- end
12
+ # Checks if a symlink exists on the remote machine.
13
+ def remote_symlink_exists?(full_path)
14
+ remote_filetest_passes?('-L', full_path)
15
+ end
15
16
 
16
- # Returns Boolean value indicating whether file exists on server
17
- def remote_file_exists?(full_path)
18
- remote_filetest_passes?('-e', full_path)
19
- end
17
+ # Returns Boolean value indicating whether file exists on server
18
+ def remote_file_exists?(full_path)
19
+ remote_filetest_passes?('-e', full_path)
20
+ end
20
21
 
21
- # Returns Boolean value indicating whether the file at +full_path+ matches +content+. Checks if file
22
- # is equivalent to content by checking whether or not the MD5 of the remote content is the same as the
23
- # MD5 of the String in +content+.
24
- def remote_file_content_same_as?(full_path, content)
25
- Digest::MD5.hexdigest(content) == capture("md5sum #{full_path} | awk '{ print $1 }'").strip
26
- end
22
+ # Returns Boolean value indicating whether the file at +full_path+ matches +content+. Checks if file
23
+ # is equivalent to content by checking whether or not the MD5 of the remote content is the same as the
24
+ # MD5 of the String in +content+.
25
+ def remote_file_content_same_as?(full_path, content)
26
+ Digest::MD5.hexdigest(content) == capture("md5sum #{full_path} | awk '{ print $1 }'").strip
27
+ end
27
28
 
28
- # Returns Boolean indicating whether the remote file is present and has the same contents as
29
- # the String in +content+.
30
- def remote_file_differs?(full_path, content)
31
- !remote_file_exists?(full_path) || remote_file_exists?(full_path) && !remote_file_content_same_as?(full_path, content)
32
- end
33
-
34
- namespace :lock do
35
- desc "check lock"
36
- task :check, :roles => :app do
37
- if remote_file_exists?("#{deploy_to}/#{lockfile}")
38
- abort "\n\n\n\e[0;31m A Deployment is already in progress\n Remove #{deploy_to}/#{lockfile} to unlock \e[0m\n\n\n"
39
- end
29
+ # Returns Boolean indicating whether the remote file is present and has the same contents as
30
+ # the String in +content+.
31
+ def remote_file_differs?(full_path, content)
32
+ !remote_file_exists?(full_path) || remote_file_exists?(full_path) && !remote_file_content_same_as?(full_path, content)
40
33
  end
41
34
 
42
- desc "create lock"
43
- task :create, :roles => :app do
44
- timestamp = Time.now.strftime("%m/%d/%Y %H:%M:%S %Z")
45
- lock_message = "Deploy started at #{timestamp} in progress"
46
- put lock_message, "#{deploy_to}/#{lockfile}", :mode => 0644
35
+ def self.load_into(configuration)
36
+ configuration.load do
37
+ set :lockfile, "cap.lock"
38
+
39
+ namespace :lock do
40
+ desc "check lock"
41
+ task :check, :roles => :app do
42
+ if caplock.remote_file_exists?("#{deploy_to}/#{lockfile}")
43
+ abort "\n\n\n\e[0;31m A Deployment is already in progress\n Remove #{deploy_to}/#{lockfile} to unlock \e[0m\n\n\n"
44
+ end
45
+ end
46
+
47
+ desc "create lock"
48
+ task :create, :roles => :app do
49
+ timestamp = Time.now.strftime("%m/%d/%Y %H:%M:%S %Z")
50
+ lock_message = "Deploy started at #{timestamp} in progress"
51
+ put lock_message, "#{deploy_to}/#{lockfile}", :mode => 0644
52
+ end
53
+
54
+ desc "release lock"
55
+ task :release, :roles => :app do
56
+ run "rm -f #{deploy_to}/#{lockfile}"
57
+ end
58
+ end
59
+
60
+ # Deployment
61
+ before "deploy", "lock:check"
62
+ after "lock:check", "lock:create"
63
+ after "deploy", "lock:release"
64
+
65
+ # Rollback
66
+ before "deploy:rollback", "lock:check"
67
+ after "deploy:rollback", "lock:release"
68
+
69
+ end
47
70
  end
48
71
 
49
- desc "release lock"
50
- task :release, :roles => :app do
51
- run "rm -f #{deploy_to}/#{lockfile}"
52
- end
72
+ Capistrano.plugin :caplock, Caplock
73
+
53
74
  end
54
-
55
- before "deploy", "lock:check"
56
- after "lock:check", "lock:create"
57
- after "deploy", "lock:release"
75
+ end
58
76
 
77
+ if Capistrano::Configuration.instance
78
+ Capistrano::Caplock.load_into(Capistrano::Configuration.instance)
59
79
  end
@@ -1,7 +1,35 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestCaplock < Test::Unit::TestCase
4
- should "probably rename this file and start testing for real" do
5
- flunk "hey buddy, you should probably rename this file and start testing for real"
4
+ def setup
5
+ @config = Capistrano::Configuration.new
6
+ Capistrano::Caplock.load_into(@config)
7
+ @config.set :deploy_to, "/tmp"
8
+ @config.role :app, "localhost"
9
+ end
10
+
11
+ should "use default lockfile name 'cap.lock'" do
12
+ assert_equal @config.lockfile, 'cap.lock'
13
+ end
14
+
15
+ should "set lockfile name to 'test.lock'" do
16
+ @config.set :lockfile, 'test.lock'
17
+ assert_equal @config.lockfile, 'test.lock'
18
+ end
19
+
20
+ should "create lock" do
21
+ assert_nil @config.lock.create
22
+ assert File.exists?("/tmp/cap.lock")
23
+ end
24
+
25
+ should "remove lock" do
26
+ assert_nil @config.lock.create
27
+ assert_nil @config.lock.release
28
+ assert !File.exists?("/tmp/cap.lock")
29
+ end
30
+
31
+ should "check for lock and pass" do
32
+ assert_nil @config.lock.release
33
+ assert_nil @config.lock.check
6
34
  end
7
35
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caplock
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dru Ibarra
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-10 00:00:00 Z
18
+ date: 2012-03-09 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: capistrano
@@ -58,7 +58,6 @@ extra_rdoc_files:
58
58
  - README.rdoc
59
59
  files:
60
60
  - .document
61
- - .gitignore
62
61
  - LICENSE
63
62
  - README.rdoc
64
63
  - Rakefile
@@ -71,8 +70,8 @@ homepage: http://github.com/Druwerd/caplock
71
70
  licenses: []
72
71
 
73
72
  post_install_message:
74
- rdoc_options:
75
- - --charset=UTF-8
73
+ rdoc_options: []
74
+
76
75
  require_paths:
77
76
  - lib
78
77
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -96,10 +95,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
95
  requirements: []
97
96
 
98
97
  rubyforge_project:
99
- rubygems_version: 1.8.5
98
+ rubygems_version: 1.8.6
100
99
  signing_key:
101
100
  specification_version: 3
102
101
  summary: Adds a lock file to Capistrano deployments
103
- test_files:
104
- - test/helper.rb
105
- - test/test_caplock.rb
102
+ test_files: []
103
+
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC