Sha256: b6d66a675ec2a3de0e231ec9066fb11eeef18bab82c4ce52d5aa6f79cc2b8974

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

require 'tmpdir'

module Wrapp
  class DMGBuilder
    BIG_SOURCE_FOLDER_SIZE = 100

    attr_reader :app_path

    def initialize(app_path, opts = {})
      @app_path = app_path
      @opts = opts
    end

    def create
      Dir.mktmpdir('wrapp_dmg') { |dir|
        FileUtils.cp_r(source_path, dir)

        if @opts[:add_applications_link]
          File.symlink('/Applications', File.join(dir, 'Applications'))
        end

        cmd = %w(hdiutil create)
        cmd << "-srcfolder '#{dir}'"
        # NOTE: There is a known bug in hdiutil that causes the image creation
        # to fail, see: https://discussions.apple.com/thread/5667409
        # Therefore we have to explicitely set the dmg size for bigger sources.
        cmd << "-megabytes #{dmg_size}" if big_source_folder?
        cmd << "'#{dmg_filename}'"
        system(cmd.join(' '))
      }
    end

    private

    def source_path
      @opts[:include_parent_dir] ? File.dirname(app_path) : app_path
    end

    # @returns [Boolean] true if source folder is bigger or equal then 100MB.
    def big_source_folder?
      folder_size >= BIG_SOURCE_FOLDER_SIZE
    end

    # @returns [Integer] Size of dmg in megabytes.
    def dmg_size
      (folder_size * 1.1).to_i # Source folder + 10% buffer.
    end

    # @returns [Integer] Size of source folder in megabytes.
    def folder_size
      `du -ms '#{source_path}'`[/^(\d+)\s+/,1].to_i
    end

    def dmg_filename
      "#{app.full_name}.dmg"
    end

    def vol_name
      @opts[:volume_name] ? @opts[:volume_name] : app.name
    end

    def app
      @app_info ||= AppInfo.new(plist)
    end

    def plist
      File.join(app_path, 'Contents', 'Info.plist')
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
wrapp-0.7.0 lib/wrapp/dmg_builder.rb