Class: Gitballs::Compressor

Inherits:
Object
  • Object
show all
Defined in:
lib/gitballs/compressor.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(purl_string, output: nil, quiet: false) ⇒ Compressor

Returns a new instance of Compressor.



11
12
13
14
15
16
17
18
# File 'lib/gitballs/compressor.rb', line 11

def initialize(purl_string, output: nil, quiet: false)
  @purl = Purl.parse(purl_string)
  @output_dir = output || File.join(".", "gitballs", @purl.name)
  @quiet = quiet
  @client = Client.new
  @registry = Registry.new(@purl.type)
  @tarball_dir = File.join(@output_dir, ".tarballs")
end

Instance Attribute Details

#output_dirObject (readonly)

Returns the value of attribute output_dir.



9
10
11
# File 'lib/gitballs/compressor.rb', line 9

def output_dir
  @output_dir
end

#purlObject (readonly)

Returns the value of attribute purl.



9
10
11
# File 'lib/gitballs/compressor.rb', line 9

def purl
  @purl
end

#quietObject (readonly)

Returns the value of attribute quiet.



9
10
11
# File 'lib/gitballs/compressor.rb', line 9

def quiet
  @quiet
end

Instance Method Details

#cleanup_tarballsObject



102
103
104
# File 'lib/gitballs/compressor.rb', line 102

def cleanup_tarballs
  FileUtils.rm_rf(@tarball_dir)
end

#clear_working_dirObject



106
107
108
109
110
111
112
# File 'lib/gitballs/compressor.rb', line 106

def clear_working_dir
  Dir.chdir(@output_dir) do
    Dir.children(".").reject { |f| f == ".git" || f == ".tarballs" }.each do |entry|
      FileUtils.rm_rf(entry)
    end
  end
end

#commit_versions(versions) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/gitballs/compressor.rb', line 80

def commit_versions(versions)
  log "Committing versions..."
  versions.each_with_index do |version, index|
    number = version["number"]
    tarball = find_tarball(number)
    next unless tarball

    log "  [#{index + 1}/#{versions.size}] #{number}"
    clear_working_dir
    @registry.extract(tarball, @output_dir)
    git_add_and_commit(number)
  end
end

#dir_size(path) ⇒ Object



36
37
38
39
40
# File 'lib/gitballs/compressor.rb', line 36

def dir_size(path)
  return 0 unless File.directory?(path)

  `du -sk #{path}`.strip.split.first.to_i * 1024
end

#download_tarballs(versions) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/gitballs/compressor.rb', line 59

def download_tarballs(versions)
  log "Downloading #{versions.size} versions..."
  versions.each_with_index do |version, index|
    number = version["number"]
    url = version["download_url"]
    next unless url

    log "  [#{index + 1}/#{versions.size}] #{number}"
    extension = tarball_extension(url)
    destination = File.join(@tarball_dir, "#{number}#{extension}")
    @client.download_tarball(url, destination)
  rescue Error => e
    log "    skipping: #{e.message}"
  end
end

#fetch_and_sort_versionsObject



48
49
50
51
52
53
54
55
56
57
# File 'lib/gitballs/compressor.rb', line 48

def fetch_and_sort_versions
  log "Fetching versions..."
  versions = @client.fetch_versions(@purl.to_s)

  versions.sort_by do |v|
    Vers::Version.new(v["number"])
  rescue ArgumentError
    Vers::Version.new("0.0.0")
  end
end

#find_tarball(version_number) ⇒ Object



121
122
123
# File 'lib/gitballs/compressor.rb', line 121

def find_tarball(version_number)
  Dir.glob(File.join(@tarball_dir, "#{version_number}.*")).first
end

#git_add_and_commit(version_number) ⇒ Object



114
115
116
117
118
119
# File 'lib/gitballs/compressor.rb', line 114

def git_add_and_commit(version_number)
  Dir.chdir(@output_dir) do
    system("git", "add", "-A", out: File::NULL, err: File::NULL, exception: true)
    system("git", "commit", "-m", version_number, "--allow-empty", out: File::NULL, err: File::NULL, exception: true)
  end
end

#init_git_repoObject



75
76
77
78
# File 'lib/gitballs/compressor.rb', line 75

def init_git_repo
  log "Initializing git repository..."
  system("git", "init", @output_dir, out: File::NULL, err: File::NULL, exception: true)
end

#log(message) ⇒ Object



136
137
138
# File 'lib/gitballs/compressor.rb', line 136

def log(message)
  puts message unless @quiet
end

#optimize_repoObject



94
95
96
97
98
99
100
# File 'lib/gitballs/compressor.rb', line 94

def optimize_repo
  log "Optimizing repository..."
  Dir.chdir(@output_dir) do
    system("git", "gc", "--aggressive", "--prune=now", out: File::NULL, err: File::NULL, exception: true)
    system("git", "rm", "-rf", ".", out: File::NULL, err: File::NULL, exception: true)
  end
end

#runObject



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/gitballs/compressor.rb', line 20

def run
  setup_directories
  versions = fetch_and_sort_versions
  download_tarballs(versions)
  @tarball_size = dir_size(@tarball_dir)
  init_git_repo
  commit_versions(versions)
  optimize_repo
  cleanup_tarballs
  stats
end

#setup_directoriesObject



42
43
44
45
46
# File 'lib/gitballs/compressor.rb', line 42

def setup_directories
  FileUtils.rm_rf(@output_dir)
  FileUtils.mkdir_p(@output_dir)
  FileUtils.mkdir_p(@tarball_dir)
end

#statsObject



32
33
34
# File 'lib/gitballs/compressor.rb', line 32

def stats
  Stats.new(@output_dir, @tarball_size)
end

#tarball_extension(url) ⇒ Object



125
126
127
128
129
130
131
132
133
134
# File 'lib/gitballs/compressor.rb', line 125

def tarball_extension(url)
  case url
  when /\.gem$/ then ".gem"
  when /\.tgz$/ then ".tgz"
  when /\.tar\.gz$/ then ".tar.gz"
  when /\.zip$/ then ".zip"
  when /\.nupkg$/ then ".nupkg"
  else ".tar.gz"
  end
end