summaryrefslogtreecommitdiff
path: root/tooling/lib
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-09-19 01:45:44 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-09-19 01:45:44 +0000
commit85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch)
tree9160f299afd8c80c038f08e1545be119f5e3f1e1 /tooling/lib
parent15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff)
downloadgitlab-ce-85dc423f7090da0a52c73eb66faf22ddb20efff9.tar.gz
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'tooling/lib')
-rw-r--r--tooling/lib/tooling/images.rb56
1 files changed, 56 insertions, 0 deletions
diff --git a/tooling/lib/tooling/images.rb b/tooling/lib/tooling/images.rb
new file mode 100644
index 00000000000..d0c464b983c
--- /dev/null
+++ b/tooling/lib/tooling/images.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+module Tooling
+ module Image
+ # Determine the tolerance till when we run pngquant in a loop
+ TOLERANCE = 10000
+
+ def self.check_executables
+ unless system('pngquant --version', out: File::NULL)
+ warn(
+ 'Error: pngquant executable was not detected in the system.',
+ 'Download pngquant at https://pngquant.org/ and place the executable in /usr/local/bin'
+ )
+ abort
+ end
+
+ unless system('gm version', out: File::NULL)
+ warn(
+ 'Error: gm executable was not detected in the system.',
+ 'Please install imagemagick: brew install imagemagick or sudo apt install imagemagick'
+ )
+ abort
+ end
+ end
+
+ def self.compress_image(file, keep_original = false)
+ check_executables
+
+ compressed_file = "#{file}.compressed"
+ FileUtils.copy(file, compressed_file)
+
+ pngquant_file = PngQuantizator::Image.new(compressed_file)
+
+ # Run the image repeatedly through pngquant until
+ # the change in file size is within TOLERANCE
+ # or the loop count is above 1000
+ 1000.times do
+ before = File.size(compressed_file)
+ pngquant_file.quantize!
+ after = File.size(compressed_file)
+ break if before - after <= TOLERANCE
+ end
+
+ savings = File.size(file) - File.size(compressed_file)
+ is_uncompressed = savings > TOLERANCE
+
+ if is_uncompressed && !keep_original
+ FileUtils.copy(compressed_file, file)
+ end
+
+ FileUtils.remove(compressed_file)
+
+ [is_uncompressed, savings]
+ end
+ end
+end