capistrano-git-copy 1.0.2 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7aec6507f638bcb5e8ddf791bad63dde7e2f93b6
4
- data.tar.gz: 1a39e03172e841a9fff5095b90d21441e8bd1b96
3
+ metadata.gz: d4ae3564eccef2c188c4176c2ad8f2276b1f7c88
4
+ data.tar.gz: 993bfa2dc61a9c78376b5af0847f7c0fed5c6ae3
5
5
  SHA512:
6
- metadata.gz: bf4b39c80f04bbf15ffe45d0537c5115067678e96f2492e4f91bd2dd7d9dcef9b59b646e8fbb069971af5dffd7709ef29dd1c6501a0915d4b306b2d5532f1c8d
7
- data.tar.gz: b0796ae5712a0531d009a8ac53159d0589adc18355812d7af8d6c282b2065e517a7106d7094f0e5855df2df488f9ccb78992a46a0d8f55fc7240ea2c1a01d5bc
6
+ metadata.gz: 4833479a333245dda86f3b10fe27b90fd5050be08b9ec10444d751c11745c75d586de4d6e67b5d25ea1d1869b888aeb22aa1e71f219579f268f839a76b98c7b5
7
+ data.tar.gz: 31bd01e829bd93683883deb00a2ba0f960979d1f5badd3e77b4f7e6d855eb8b0a12b9607e05e98b676d2d87de7a22de1312c8989da00f3455abdee9e442a024e
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## 1.1.0 (2015-08-10)
4
+ ### Changes
5
+ - Deprecated: require 'capistrano/git/copy'
6
+ - Allow to skip submodules (uses _git archive_ instead of _git-archive-all_)
7
+ ### Fixed
8
+ - updated _git-archive-all_ to v1.11
9
+ - prevent tasks from being executed multiple times
10
+
3
11
  ## 1.0.2 (2015-05-26)
4
12
  ### Fixed
5
13
  - use commit hash to fetch revision for log
data/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
  [![Dependencies](https://img.shields.io/gemnasium/ydkn/capistrano-git-copy.svg)](https://gemnasium.com/ydkn/capistrano-git-copy)
3
3
  [![Code Climate](https://img.shields.io/codeclimate/github/ydkn/capistrano-git-copy.svg)](https://codeclimate.com/github/ydkn/capistrano-git-copy)
4
4
 
5
+ [![Join the chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ydkn/capistrano-git-copy)
6
+
7
+
5
8
  # Capistrano::GitCopy
6
9
 
7
10
  Creates a tar archive locally from the git repository and uploads it to the remote server.
@@ -19,13 +22,19 @@ end
19
22
  And require it in your `Capfile`:
20
23
 
21
24
  ```ruby
22
- require 'capistrano/git/copy'
25
+ require 'capistrano/git_copy'
23
26
  ```
24
27
 
25
28
  Now use `git_copy` as your SCM type in your `config/deploy.rb`:
26
29
 
27
30
  set :scm, :git_copy
28
31
 
32
+ By default, it includes all submodules into the deployment package. However,
33
+ if they are not needed in a particular deployment, you can disable them with
34
+ a configuration option:
35
+
36
+ set :with_submodules, false
37
+
29
38
  ## Notes
30
39
 
31
40
  * Uses [git-archive-all](https://github.com/Kentzo/git-archive-all) for bundling repositories.
@@ -0,0 +1 @@
1
+ STDERR.puts("[DEPRECATION] Please change \"require 'capistrano/git/copy'\" to \"require 'capistrano/git_copy'\" in your Capfile.")
@@ -1,3 +1,2 @@
1
1
  require 'capistrano/git_copy/utility'
2
-
3
- load File.expand_path('../git_copy/tasks/deploy.cap', __FILE__)
2
+ require 'capistrano/git_copy/task'
@@ -0,0 +1 @@
1
+ load File.expand_path('../tasks/deploy.cap', __FILE__)
@@ -1,3 +1,9 @@
1
+ namespace :load do
2
+ task :defaults do
3
+ set :with_submodules, true
4
+ end
5
+ end
6
+
1
7
  namespace :git_copy do
2
8
  def git_copy_utility
3
9
  @git_copy_utility ||= Capistrano::GitCopy::Utility.new(self)
@@ -5,8 +5,11 @@ module Capistrano
5
5
  module GitCopy
6
6
  # Utility stuff to avoid cluttering of deploy.cap
7
7
  class Utility
8
+ attr_reader :with_submodules
9
+
8
10
  def initialize(context)
9
11
  @context = context
12
+ @with_submodules = fetch(:with_submodules, true)
10
13
  end
11
14
 
12
15
  # Check if repo cache exists
@@ -40,20 +43,28 @@ module Capistrano
40
43
  git :reset, '--hard', commit_hash
41
44
 
42
45
  # submodules
43
- git :submodule, :init
44
- git :submodule, :update
45
- git :submodule, :foreach, '--recursive', :git, :submodule, :update, '--init'
46
+ if with_submodules
47
+ git :submodule, :init
48
+ git :submodule, :update
49
+ git :submodule, :foreach, '--recursive', :git, :submodule, :update, '--init'
50
+ end
46
51
 
47
52
  # cleanup
48
53
  git :clean, '-d', '-f'
49
- git :submodule, :foreach, '--recursive', :git, :clean, '-d', '-f'
54
+ if with_submodules
55
+ git :submodule, :foreach, '--recursive', :git, :clean, '-d', '-f'
56
+ end
50
57
  end
51
58
 
52
59
  # Create tar archive
53
60
  #
54
61
  # @return void
55
62
  def prepare_release
56
- execute git_archive_all_bin, "--prefix=''", archive_path
63
+ if with_submodules
64
+ execute git_archive_all_bin, "--prefix=''", archive_path
65
+ else
66
+ git "archive --format=tar HEAD | gzip > #{archive_path}"
67
+ end
57
68
  end
58
69
 
59
70
  # Upload and extract release
@@ -3,6 +3,6 @@ module Capistrano
3
3
  # GitCopy
4
4
  module GitCopy
5
5
  # gem version
6
- VERSION = '1.0.2'
6
+ VERSION = '1.1.0'
7
7
  end
8
8
  end
@@ -7,7 +7,7 @@ from __future__ import unicode_literals
7
7
  __version__ = "1.9"
8
8
 
9
9
  import logging
10
- from os import extsep, path, readlink
10
+ from os import extsep, path, readlink, curdir
11
11
  from subprocess import CalledProcessError, Popen, PIPE
12
12
  import sys
13
13
  import tarfile
@@ -64,7 +64,7 @@ class GitArchiver(object):
64
64
  try:
65
65
  self.run_shell("[ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1", main_repo_abspath)
66
66
  except Exception as e:
67
- raise ValueError("Not a git repository (or any of the parent directories).".format(path=main_repo_abspath))
67
+ raise ValueError("Not a git repository (or any of the parent directories).")
68
68
 
69
69
  main_repo_abspath = path.abspath(self.read_git_shell('git rev-parse --show-toplevel', main_repo_abspath).rstrip())
70
70
 
@@ -94,7 +94,7 @@ class GitArchiver(object):
94
94
  if output_format is None:
95
95
  file_name, file_ext = path.splitext(output_path)
96
96
  output_format = file_ext[len(extsep):].lower()
97
- self.LOG.debug("Output format is not explicitly set, determined format is {0}.".format(output_format))
97
+ self.LOG.debug("Output format is not explicitly set, determined format is {}.".format(output_format))
98
98
 
99
99
  if not dry_run:
100
100
  if output_format == 'zip':
@@ -116,19 +116,19 @@ class GitArchiver(object):
116
116
  elif output_format == 'txz':
117
117
  t_mode = 'w:xz'
118
118
  else:
119
- t_mode = 'w:{0}'.format(output_format)
119
+ t_mode = 'w:{}'.format(output_format)
120
120
 
121
121
  archive = tarfile.open(path.abspath(output_path), t_mode)
122
122
  add_file = lambda file_path, arcname: archive.add(file_path, arcname)
123
123
  else:
124
- raise RuntimeError("Unknown format: {0}".format(output_format))
124
+ raise RuntimeError("Unknown format: {}".format(output_format))
125
125
 
126
126
  def archiver(file_path, arcname):
127
- self.LOG.debug("Compressing {0} => {1}...".format(file_path, arcname))
127
+ self.LOG.debug("Compressing {} => {}...".format(file_path, arcname))
128
128
  add_file(file_path, arcname)
129
129
  else:
130
130
  archive = None
131
- archiver = lambda file_path, arcname: self.LOG.info("{0} => {1}".format(file_path, arcname))
131
+ archiver = lambda file_path, arcname: self.LOG.info("{} => {}".format(file_path, arcname))
132
132
 
133
133
  self.archive_all_files(archiver)
134
134
 
@@ -225,7 +225,7 @@ class GitArchiver(object):
225
225
  patterns = exclude_patterns[key]
226
226
  for p in patterns:
227
227
  if fnmatch(file_name, p) or fnmatch(repo_file_path, p):
228
- self.LOG.debug("Exclude pattern matched {pattern}: {path}".format(pattern=p, path=repo_file_path))
228
+ self.LOG.debug("Exclude pattern matched {}: {}".format(p, repo_file_path))
229
229
  is_excluded = True
230
230
 
231
231
  if not len(components):
@@ -270,13 +270,12 @@ class GitArchiver(object):
270
270
  # Git puts path in quotes if file path has unicode characters.
271
271
  repo_file_path = repo_file_path.strip('"') # file path relative to current repo
272
272
  file_name = path.basename(repo_file_path)
273
+ main_repo_file_path = path.join(repo_path, repo_file_path) # file path relative to the main repo
273
274
 
274
275
  # Only list symlinks and files that don't start with git.
275
- if file_name.startswith(".git") or (not path.islink(repo_file_path) and path.isdir(repo_file_path)):
276
+ if file_name.startswith(".git") or (not path.islink(main_repo_file_path) and path.isdir(main_repo_file_path)):
276
277
  continue
277
278
 
278
- main_repo_file_path = path.join(repo_path, repo_file_path) # file path relative to the main repo
279
-
280
279
  if self.is_file_excluded(repo_abspath, repo_file_path, exclude_patterns):
281
280
  continue
282
281
 
@@ -286,7 +285,7 @@ class GitArchiver(object):
286
285
  self.run_shell("git submodule init", repo_abspath)
287
286
  self.run_shell("git submodule update", repo_abspath)
288
287
 
289
- for submodule_path in self.read_shell("git submodule --quiet foreach 'pwd'", repo_abspath).splitlines():
288
+ for submodule_path in self.read_shell("git submodule --quiet foreach 'pwd -P'", repo_abspath).splitlines():
290
289
  # Shell command returns absolute paths to submodules.
291
290
  submodule_path = path.relpath(submodule_path, self.main_repo_abspath)
292
291
  for file_path in self.walk_git_files(submodule_path):
@@ -323,7 +322,7 @@ class GitArchiver(object):
323
322
  raise ValueError("abspath MUST be absoulte path.")
324
323
 
325
324
  if not path.commonprefix([repo_abspath, abspath]):
326
- raise ValueError("abspath (\"{0}\") MUST have common prefix with repo_abspath (\"{1}\")".format(abspath, repo_abspath))
325
+ raise ValueError("abspath (\"{}\") MUST have common prefix with repo_abspath (\"{}\")".format(abspath, repo_abspath))
327
326
 
328
327
  components = []
329
328
 
@@ -333,8 +332,7 @@ class GitArchiver(object):
333
332
  if tail:
334
333
  components.insert(0, tail)
335
334
 
336
- # Get portable version of '.'
337
- components.insert(0, path.relpath(repo_abspath, repo_abspath))
335
+ components.insert(0, curdir)
338
336
  return components
339
337
 
340
338
  @staticmethod
@@ -425,7 +423,7 @@ if __name__ == '__main__':
425
423
  from optparse import OptionParser
426
424
 
427
425
  parser = OptionParser(usage="usage: %prog [-v] [--prefix PREFIX] [--no-exclude] [--force-submodules] [--extra EXTRA1 [EXTRA2]] [--dry-run] OUTPUT_FILE",
428
- version="%prog {version}".format(version=__version__))
426
+ version="%prog {}".format(__version__))
429
427
 
430
428
  parser.add_option('--prefix',
431
429
  type='string',
@@ -491,6 +489,6 @@ if __name__ == '__main__':
491
489
  options.extra)
492
490
  archiver.create(output_file_path, options.dry_run)
493
491
  except Exception as e:
494
- parser.exit(2, "{0}\n".format(e))
492
+ parser.exit(2, "{}\n".format(e))
495
493
 
496
494
  sys.exit(0)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-git-copy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Schwab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-26 00:00:00.000000000 Z
11
+ date: 2015-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano
@@ -89,6 +89,7 @@ files:
89
89
  - capistrano-git-copy.gemspec
90
90
  - lib/capistrano/git/copy.rb
91
91
  - lib/capistrano/git_copy.rb
92
+ - lib/capistrano/git_copy/task.rb
92
93
  - lib/capistrano/git_copy/tasks/deploy.cap
93
94
  - lib/capistrano/git_copy/utility.rb
94
95
  - lib/capistrano/git_copy/version.rb
@@ -113,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
114
  version: '0'
114
115
  requirements: []
115
116
  rubyforge_project:
116
- rubygems_version: 2.4.6
117
+ rubygems_version: 2.4.8
117
118
  signing_key:
118
119
  specification_version: 4
119
120
  summary: Copy local git repository deploy strategy for capistrano