Class: Capistrano::Deploy::Strategy::VagrantCopyBundled

Inherits:
Copy
  • Object
show all
Defined in:
lib/capistrano/recipes/deploy/strategy/vagrant_copy_bundled.rb

Instance Method Summary collapse

Instance Method Details

#deploy!Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/capistrano/recipes/deploy/strategy/vagrant_copy_bundled.rb', line 9

def deploy!
  if copy_cache
    if File.exists?(copy_cache)
      logger.debug "refreshing local cache to revision #{revision} at #{copy_cache}"
      system(source.sync(revision, copy_cache))
    else
      logger.debug "preparing local cache at #{copy_cache}"
      system(source.checkout(revision, copy_cache))
    end

    # Check the return code of last system command and rollback if not 0
    unless $? == 0
      raise Capistrano::Error, "shell command failed with return code #{$?}"
    end

    FileUtils.mkdir_p(destination)

    logger.debug "copying cache to deployment staging area #{destination}"
    Dir.chdir(copy_cache) do
      queue = Dir.glob("*", File::FNM_DOTMATCH)
      while queue.any?
        item = queue.shift
        name = File.basename(item)

        next if name == "." || name == ".."
        next if copy_exclude.any? { |pattern| File.fnmatch(pattern, item) }

        if File.symlink?(item)
          FileUtils.ln_s(File.readlink(item), File.join(destination, item))
        elsif File.directory?(item)
          queue += Dir.glob("#{item}/*", File::FNM_DOTMATCH)
          FileUtils.mkdir(File.join(destination, item))
        else
          FileUtils.ln(item, File.join(destination, item))
        end
      end
    end
  else
    logger.debug "getting (via #{copy_strategy}) revision #{revision} to #{destination}"
    system(command)

    if copy_exclude.any?
      logger.debug "processing exclusions..."

      copy_exclude.each do |pattern|
        delete_list = Dir.glob(File.join(destination, pattern), File::FNM_DOTMATCH)
        # avoid the /.. trap that deletes the parent directories
        delete_list.delete_if { |dir| dir =~ /\/\.\.$/ }
        FileUtils.rm_rf(delete_list.compact)
      end
    end
  end

  File.open(File.join(destination, "REVISION"), "w") { |f| f.puts(revision) }

  # execute bundler
  bundle!

  logger.trace "compressing #{destination} to #{filename}"
  Dir.chdir(copy_dir) { system(compress(File.basename(destination), File.basename(filename)).join(" ")) }

  distribute!
ensure
  FileUtils.rm filename rescue nil
  FileUtils.rm_rf destination rescue nil
end