diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6905bc..ce0bd1a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,6 +28,7 @@ stages: - gitlab - gitlab-assets - gitlab-review-app + - workhorse - gitaly - automation diff --git a/.gitlab/ci/gitlab.images.yml b/.gitlab/ci/gitlab.images.yml index 7737f4a..bdb8999 100644 --- a/.gitlab/ci/gitlab.images.yml +++ b/.gitlab/ci/gitlab.images.yml @@ -58,3 +58,25 @@ gitlab-review-app: GCLOUD: '383' KUBECTL: '1.23' HELM: '3.5' + +# Used by GitLab's workhorse tests +gitlab-workhorse: + needs: [] + extends: + - .gitlab + stage: workhorse + variables: + EXIFTOOL: '12.60' + RUBYGEMS: '3.4' + parallel: + matrix: + - OS: ['debian:bullseye'] + RUBY: ['2.7', '3.0', '3.1', '3.2'] + GOLANG: ['1.18', '1.19'] + RUST: ['1.65'] + GIT: ['2.36'] + - OS: ['ubi:8.6'] + RUBY: ['2.7', '3.0', '3.1', '3.2'] + GOLANG: ['1.18', '1.19'] + RUST: ['1.65'] + GIT: ['2.36'] diff --git a/Dockerfile.custom b/Dockerfile.custom index 2bcb798..71f0c11 100644 --- a/Dockerfile.custom +++ b/Dockerfile.custom @@ -76,6 +76,13 @@ ARG GRAPHISMAGICK_DOWNLOAD_SHA256 RUN if [ -n "$GRAPHISMAGICK_VERSION" ]; then /scripts/install-graphicsmagick && gm version; fi +# Exiftool +ARG EXIFTOOL_VERSION +ARG EXIFTOOL_DOWNLOAD_URL=https://gitlab.com/gitlab-org/build/omnibus-mirror/exiftool/-/archive/${EXIFTOOL_VERSION}/exiftool-${EXIFTOOL_VERSION}.tar.gz +ARG EXIFTOOL_DOWNLOAD_SHA256 + +RUN if [ -n "$EXIFTOOL_VERSION" ]; then /scripts/install-exiftool && exiftool -ver; fi + # Docker ARG DOCKER_VERSION diff --git a/README.md b/README.md index fb74dbf..99712db 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ Minor components define tag name. [Supported minor](https://gitlab.com/gitlab-or 1. `CHROME` 1. `YARN` 1. `GRAPHICSMAGICK` +1. `EXIFTOOL` 1. `BAZELISK` 1. `DOCKER` 1. `BUILDX` diff --git a/patches/exiftool/12.60/allow-only-tiff-jpeg-exif-strip.patch b/patches/exiftool/12.60/allow-only-tiff-jpeg-exif-strip.patch new file mode 100644 index 0000000..ccf9e25 --- /dev/null +++ b/patches/exiftool/12.60/allow-only-tiff-jpeg-exif-strip.patch @@ -0,0 +1,686 @@ +diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm +index 57dbf679..077ed1b2 100644 +--- a/lib/Image/ExifTool.pm ++++ b/lib/Image/ExifTool.pm +@@ -189,18 +189,10 @@ $defaultLang = 'en'; # default language + # 2) Put types with weak file signatures at end of list to avoid false matches + # 3) PLIST must be in this list for the binary PLIST format, although it may + # cause a file to be checked twice for XML +-@fileTypes = qw(JPEG EXV CRW DR4 TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF +- PSD XMP BMP BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV OGG +- FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF LFP +- HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2 +- CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS +- MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB +- PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO TXT); ++@fileTypes = qw(JPEG TIFF); + + # file types that we can write (edit) +-my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS +- X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF +- RIFF); ++my @writeTypes = qw(JPEG TIFF); + my %writeTypes; # lookup for writable file types (hash filled if required) + + # file extensions that we can't write for various base types +@@ -221,341 +213,9 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV); + # (if extension may be more than one type, the type is a list where + # the writable type should come first if it exists) + %fileTypeLookup = ( +- '360' => ['MOV', 'GoPro 360 video'], +- '3FR' => ['TIFF', 'Hasselblad RAW format'], +- '3G2' => ['MOV', '3rd Gen. Partnership Project 2 audio/video'], +- '3GP' => ['MOV', '3rd Gen. Partnership Project audio/video'], +- '3GP2'=> '3G2', +- '3GPP'=> '3GP', +- A => ['EXE', 'Static library'], +- AA => ['AA', 'Audible Audiobook'], +- AAE => ['PLIST','Apple edit information'], +- AAX => ['MOV', 'Audible Enhanced Audiobook'], +- ACR => ['DICOM','American College of Radiology ACR-NEMA'], +- ACFM => ['Font', 'Adobe Composite Font Metrics'], +- AFM => ['Font', 'Adobe Font Metrics'], +- AMFM => ['Font', 'Adobe Multiple Master Font Metrics'], +- AI => [['PDF','PS'], 'Adobe Illustrator'], +- AIF => 'AIFF', +- AIFC => ['AIFF', 'Audio Interchange File Format Compressed'], +- AIFF => ['AIFF', 'Audio Interchange File Format'], +- AIT => 'AI', +- ALIAS=> ['ALIAS','MacOS file alias'], +- APE => ['APE', "Monkey's Audio format"], +- APNG => ['PNG', 'Animated Portable Network Graphics'], +- ARW => ['TIFF', 'Sony Alpha RAW format'], +- ARQ => ['TIFF', 'Sony Alpha Pixel-Shift RAW format'], +- ASF => ['ASF', 'Microsoft Advanced Systems Format'], +- AVC => ['AVC', 'Advanced Video Connection'], # (extensions are actually _AU,_AD,_IM,_ID) +- AVI => ['RIFF', 'Audio Video Interleaved'], +- AVIF => ['MOV', 'AV1 Image File Format'], +- AZW => 'MOBI', # (see http://wiki.mobileread.com/wiki/AZW) +- AZW3 => 'MOBI', +- BMP => ['BMP', 'Windows Bitmap'], +- BPG => ['BPG', 'Better Portable Graphics'], +- BTF => ['BTF', 'Big Tagged Image File Format'], #(unofficial) +- BZ2 => ['BZ2', 'BZIP2 archive'], +- CHM => ['CHM', 'Microsoft Compiled HTML format'], +- CIFF => ['CRW', 'Camera Image File Format'], +- COS => ['COS', 'Capture One Settings'], +- CR2 => ['TIFF', 'Canon RAW 2 format'], +- CR3 => ['MOV', 'Canon RAW 3 format'], +- CRM => ['MOV', 'Canon RAW Movie'], +- CRW => ['CRW', 'Canon RAW format'], +- CS1 => ['PSD', 'Sinar CaptureShop 1-Shot RAW'], +- CSV => ['TXT', 'Comma-Separated Values'], +- CUR => ['ICO', 'Windows Cursor'], +- CZI => ['CZI', 'Zeiss Integrated Software RAW'], +- DC3 => 'DICM', +- DCM => 'DICM', +- DCP => ['TIFF', 'DNG Camera Profile'], +- DCR => ['TIFF', 'Kodak Digital Camera RAW'], +- DCX => ['DCX', 'Multi-page PC Paintbrush'], +- DEX => ['DEX', 'Dalvik Executable format'], +- DFONT=> ['Font', 'Macintosh Data fork Font'], +- DIB => ['BMP', 'Device Independent Bitmap'], +- DIC => 'DICM', +- DICM => ['DICOM','Digital Imaging and Communications in Medicine'], +- DIR => ['DIR', 'Directory'], +- DIVX => ['ASF', 'DivX media format'], +- DJV => 'DJVU', +- DJVU => ['AIFF', 'DjVu image'], +- DLL => ['EXE', 'Windows Dynamic Link Library'], +- DNG => ['TIFF', 'Digital Negative'], +- DOC => ['FPX', 'Microsoft Word Document'], +- DOCM => [['ZIP','FPX'], 'Office Open XML Document Macro-enabled'], +- # Note: I have seen a password-protected DOCX file which was FPX-like, so I assume +- # that any other MS Office file could be like this too. The only difference is +- # that the ZIP and FPX formats are checked first, so if this is wrong, no biggie. +- DOCX => [['ZIP','FPX'], 'Office Open XML Document'], +- DOT => ['FPX', 'Microsoft Word Template'], +- DOTM => [['ZIP','FPX'], 'Office Open XML Document Template Macro-enabled'], +- DOTX => [['ZIP','FPX'], 'Office Open XML Document Template'], +- DPX => ['DPX', 'Digital Picture Exchange' ], +- DR4 => ['DR4', 'Canon VRD version 4 Recipe'], +- DS2 => ['DSS', 'Digital Speech Standard 2'], +- DSS => ['DSS', 'Digital Speech Standard'], +- DV => ['DV', 'Digital Video'], +- DVB => ['MOV', 'Digital Video Broadcasting'], +- 'DVR-MS'=>['ASF', 'Microsoft Digital Video recording'], +- DWF => ['DWF', 'Autodesk drawing (Design Web Format)'], +- DWG => ['DWG', 'AutoCAD Drawing'], +- DYLIB=> ['EXE', 'Mach-O Dynamic Link Library'], +- DXF => ['DXF', 'AutoCAD Drawing Exchange Format'], +- EIP => ['ZIP', 'Capture One Enhanced Image Package'], +- EPS => ['EPS', 'Encapsulated PostScript Format'], +- EPS2 => 'EPS', +- EPS3 => 'EPS', +- EPSF => 'EPS', +- EPUB => ['ZIP', 'Electronic Publication'], +- ERF => ['TIFF', 'Epson Raw Format'], +- EXE => ['EXE', 'Windows executable file'], +- EXR => ['EXR', 'Open EXR'], +- EXIF => ['EXIF', 'Exchangable Image File Metadata'], +- EXV => ['EXV', 'Exiv2 metadata'], +- F4A => ['MOV', 'Adobe Flash Player 9+ Audio'], +- F4B => ['MOV', 'Adobe Flash Player 9+ audio Book'], +- F4P => ['MOV', 'Adobe Flash Player 9+ Protected'], +- F4V => ['MOV', 'Adobe Flash Player 9+ Video'], +- FFF => [['TIFF','FLIR'], 'Hasselblad Flexible File Format'], +- FIT => 'FITS', +- FITS => ['FITS', 'Flexible Image Transport System'], +- FLAC => ['FLAC', 'Free Lossless Audio Codec'], +- FLA => ['FPX', 'Macromedia/Adobe Flash project'], +- FLIF => ['FLIF', 'Free Lossless Image Format'], +- FLIR => ['FLIR', 'FLIR File Format'], # (not an actual extension) +- FLV => ['FLV', 'Flash Video'], +- FPF => ['FPF', 'FLIR Public image Format'], +- FPX => ['FPX', 'FlashPix'], +- GIF => ['GIF', 'Compuserve Graphics Interchange Format'], +- GPR => ['TIFF', 'General Purpose RAW'], # https://gopro.github.io/gpr/ +- GZ => 'GZIP', +- GZIP => ['GZIP', 'GNU ZIP compressed archive'], +- HDP => ['TIFF', 'Windows HD Photo'], +- HDR => ['HDR', 'Radiance RGBE High Dynamic Range'], +- HEIC => ['MOV', 'High Efficiency Image Format still image'], +- HEIF => ['MOV', 'High Efficiency Image Format'], +- HIF => 'HEIF', +- HTM => 'HTML', +- HTML => ['HTML', 'HyperText Markup Language'], +- ICAL => 'ICS', +- ICC => ['ICC', 'International Color Consortium'], +- ICM => 'ICC', +- ICO => ['ICO', 'Windows Icon'], +- ICS => ['VCard','iCalendar Schedule'], +- IDML => ['ZIP', 'Adobe InDesign Markup Language'], +- IIQ => ['TIFF', 'Phase One Intelligent Image Quality RAW'], +- IND => ['IND', 'Adobe InDesign'], +- INDD => ['IND', 'Adobe InDesign Document'], +- INDT => ['IND', 'Adobe InDesign Template'], +- INSV => ['MOV', 'Insta360 Video'], +- INSP => ['JPEG', 'Insta360 Picture'], +- INX => ['XMP', 'Adobe InDesign Interchange'], +- ISO => ['ISO', 'ISO 9660 disk image'], +- ITC => ['ITC', 'iTunes Cover Flow'], +- J2C => ['JP2', 'JPEG 2000 codestream'], +- J2K => 'J2C', +- JNG => ['PNG', 'JPG Network Graphics'], +- JP2 => ['JP2', 'JPEG 2000 file'], +- # JP4? - looks like a JPEG but the image data is different +- JPC => 'J2C', +- JPE => 'JPEG', + JPEG => ['JPEG', 'Joint Photographic Experts Group'], +- JPF => 'JP2', + JPG => 'JPEG', +- JPM => ['JP2', 'JPEG 2000 compound image'], +- JPS => ['JPEG', 'JPEG Stereo image'], +- JPX => ['JP2', 'JPEG 2000 with extensions'], +- JSON => ['JSON', 'JavaScript Object Notation'], +- JXL => ['JXL', 'JPEG XL'], +- JXR => ['TIFF', 'JPEG XR'], +- K25 => ['TIFF', 'Kodak DC25 RAW'], +- KDC => ['TIFF', 'Kodak Digital Camera RAW'], +- KEY => ['ZIP', 'Apple Keynote presentation'], +- KTH => ['ZIP', 'Apple Keynote Theme'], +- LA => ['RIFF', 'Lossless Audio'], +- LFP => ['LFP', 'Lytro Light Field Picture'], +- LFR => 'LFP', # (Light Field RAW) +- LIF => ['LIF', 'Leica Image File'], +- LNK => ['LNK', 'Windows shortcut'], +- LRI => ['LRI', 'Light RAW'], +- LRV => ['MOV', 'Low-Resolution Video'], +- M2T => 'M2TS', +- M2TS => ['M2TS', 'MPEG-2 Transport Stream'], +- M2V => ['MPEG', 'MPEG-2 Video'], +- M4A => ['MOV', 'MPEG-4 Audio'], +- M4B => ['MOV', 'MPEG-4 audio Book'], +- M4P => ['MOV', 'MPEG-4 Protected'], +- M4V => ['MOV', 'MPEG-4 Video'], +- MACOS=> ['MacOS','MacOS ._ sidecar file'], +- MAX => ['FPX', '3D Studio MAX'], +- MEF => ['TIFF', 'Mamiya (RAW) Electronic Format'], +- MIE => ['MIE', 'Meta Information Encapsulation format'], +- MIF => 'MIFF', +- MIFF => ['MIFF', 'Magick Image File Format'], +- MKA => ['MKV', 'Matroska Audio'], +- MKS => ['MKV', 'Matroska Subtitle'], +- MKV => ['MKV', 'Matroska Video'], +- MNG => ['PNG', 'Multiple-image Network Graphics'], +- MOBI => ['PDB', 'Mobipocket electronic book'], +- MODD => ['PLIST','Sony Picture Motion metadata'], +- MOI => ['MOI', 'MOD Information file'], +- MOS => ['TIFF', 'Creo Leaf Mosaic'], +- MOV => ['MOV', 'Apple QuickTime movie'], +- MP3 => ['MP3', 'MPEG-1 Layer 3 audio'], +- MP4 => ['MOV', 'MPEG-4 video'], +- MPC => ['MPC', 'Musepack Audio'], +- MPEG => ['MPEG', 'MPEG-1 or MPEG-2 audio/video'], +- MPG => 'MPEG', +- MPO => ['JPEG', 'Extended Multi-Picture format'], +- MQV => ['MOV', 'Sony Mobile Quicktime Video'], +- MRC => ['MRC', 'Medical Research Council image'], +- MRW => ['MRW', 'Minolta RAW format'], +- MTS => 'M2TS', +- MXF => ['MXF', 'Material Exchange Format'], +- # NDPI => ['TIFF', 'Hamamatsu NanoZoomer Digital Pathology Image'], +- NEF => ['TIFF', 'Nikon (RAW) Electronic Format'], +- NEWER => 'COS', +- NKSC => ['XMP', 'Nikon Sidecar'], +- NMBTEMPLATE => ['ZIP','Apple Numbers Template'], +- NRW => ['TIFF', 'Nikon RAW (2)'], +- NUMBERS => ['ZIP','Apple Numbers spreadsheet'], +- O => ['EXE', 'Relocatable Object'], +- ODB => ['ZIP', 'Open Document Database'], +- ODC => ['ZIP', 'Open Document Chart'], +- ODF => ['ZIP', 'Open Document Formula'], +- ODG => ['ZIP', 'Open Document Graphics'], +- ODI => ['ZIP', 'Open Document Image'], +- ODP => ['ZIP', 'Open Document Presentation'], +- ODS => ['ZIP', 'Open Document Spreadsheet'], +- ODT => ['ZIP', 'Open Document Text file'], +- OFR => ['RIFF', 'OptimFROG audio'], +- OGG => ['OGG', 'Ogg Vorbis audio file'], +- OGV => ['OGG', 'Ogg Video file'], +- ONP => ['JSON', 'ON1 Presets'], +- OPUS => ['OGG', 'Ogg Opus audio file'], +- ORF => ['ORF', 'Olympus RAW format'], +- ORI => 'ORF', +- OTF => ['Font', 'Open Type Font'], +- PAC => ['RIFF', 'Lossless Predictive Audio Compression'], +- PAGES => ['ZIP', 'Apple Pages document'], +- PBM => ['PPM', 'Portable BitMap'], +- PCD => ['PCD', 'Kodak Photo CD Image Pac'], +- PCT => 'PICT', +- PCX => ['PCX', 'PC Paintbrush'], +- PDB => ['PDB', 'Palm Database'], +- PDF => ['PDF', 'Adobe Portable Document Format'], +- PEF => ['TIFF', 'Pentax (RAW) Electronic Format'], +- PFA => ['Font', 'PostScript Font ASCII'], +- PFB => ['Font', 'PostScript Font Binary'], +- PFM => [['Font','PFM2'], 'Printer Font Metrics'], # (description is overridden for Portable FloatMap images) +- PGF => ['PGF', 'Progressive Graphics File'], +- PGM => ['PPM', 'Portable Gray Map'], +- PHP => ['PHP', 'PHP Hypertext Preprocessor'], +- PHP3 => 'PHP', +- PHP4 => 'PHP', +- PHP5 => 'PHP', +- PHPS => 'PHP', +- PHTML=> 'PHP', +- PICT => ['PICT', 'Apple PICTure'], +- PLIST=> ['PLIST','Apple Property List'], +- PMP => ['PMP', 'Sony DSC-F1 Cyber-Shot PMP'], # should stand for Proprietery Metadata Package ;) +- PNG => ['PNG', 'Portable Network Graphics'], +- POT => ['FPX', 'Microsoft PowerPoint Template'], +- POTM => [['ZIP','FPX'], 'Office Open XML Presentation Template Macro-enabled'], +- POTX => [['ZIP','FPX'], 'Office Open XML Presentation Template'], +- PPAM => [['ZIP','FPX'], 'Office Open XML Presentation Addin Macro-enabled'], +- PPAX => [['ZIP','FPX'], 'Office Open XML Presentation Addin'], +- PPM => ['PPM', 'Portable Pixel Map'], +- PPS => ['FPX', 'Microsoft PowerPoint Slideshow'], +- PPSM => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow Macro-enabled'], +- PPSX => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow'], +- PPT => ['FPX', 'Microsoft PowerPoint Presentation'], +- PPTM => [['ZIP','FPX'], 'Office Open XML Presentation Macro-enabled'], +- PPTX => [['ZIP','FPX'], 'Office Open XML Presentation'], +- PRC => ['PDB', 'Palm Database'], +- PS => ['PS', 'PostScript'], +- PS2 => 'PS', +- PS3 => 'PS', +- PSB => ['PSD', 'Photoshop Large Document'], +- PSD => ['PSD', 'Photoshop Document'], +- PSDT => ['PSD', 'Photoshop Document Template'], +- PSP => ['PSP', 'Paint Shop Pro'], +- PSPFRAME => 'PSP', +- PSPIMAGE => 'PSP', +- PSPSHAPE => 'PSP', +- PSPTUBE => 'PSP', +- QIF => 'QTIF', +- QT => 'MOV', +- QTI => 'QTIF', +- QTIF => ['QTIF', 'QuickTime Image File'], +- R3D => ['R3D', 'Redcode RAW Video'], +- RA => ['Real', 'Real Audio'], +- RAF => ['RAF', 'FujiFilm RAW Format'], +- RAM => ['Real', 'Real Audio Metafile'], +- RAR => ['RAR', 'RAR Archive'], +- RAW => [['RAW','TIFF'], 'Kyocera Contax N Digital RAW or Panasonic RAW'], +- RIF => 'RIFF', +- RIFF => ['RIFF', 'Resource Interchange File Format'], +- RM => ['Real', 'Real Media'], +- RMVB => ['Real', 'Real Media Variable Bitrate'], +- RPM => ['Real', 'Real Media Plug-in Metafile'], +- RSRC => ['RSRC', 'Mac OS Resource'], +- RTF => ['RTF', 'Rich Text Format'], +- RV => ['Real', 'Real Video'], +- RW2 => ['TIFF', 'Panasonic RAW 2'], +- RWL => ['TIFF', 'Leica RAW'], +- RWZ => ['RWZ', 'Rawzor compressed image'], +- SEQ => ['FLIR', 'FLIR image Sequence'], +- SKETCH => ['ZIP', 'Sketch design file'], +- SO => ['EXE', 'Shared Object file'], +- SR2 => ['TIFF', 'Sony RAW Format 2'], +- SRF => ['TIFF', 'Sony RAW Format'], +- SRW => ['TIFF', 'Samsung RAW format'], +- SVG => ['XMP', 'Scalable Vector Graphics'], +- SWF => ['SWF', 'Shockwave Flash'], +- TAR => ['TAR', 'TAR archive'], +- THM => ['JPEG', 'Thumbnail'], +- THMX => [['ZIP','FPX'], 'Office Open XML Theme'], +- TIF => 'TIFF', + TIFF => ['TIFF', 'Tagged Image File Format'], +- TORRENT => ['Torrent', 'BitTorrent description file'], +- TS => 'M2TS', +- TTC => ['Font', 'True Type Font Collection'], +- TTF => ['Font', 'True Type Font'], +- TUB => 'PSP', +- TXT => ['TXT', 'Text file'], +- VCARD=> ['VCard','Virtual Card'], +- VCF => 'VCARD', +- VOB => ['MPEG', 'Video Object'], +- VNT => [['FPX','VCard'], 'Scene7 Vignette or V-Note text file'], +- VRD => ['VRD', 'Canon VRD Recipe Data'], +- VSD => ['FPX', 'Microsoft Visio Drawing'], +- WAV => ['RIFF', 'WAVeform (Windows digital audio)'], +- WDP => ['TIFF', 'Windows Media Photo'], +- WEBM => ['MKV', 'Google Web Movie'], +- WEBP => ['RIFF', 'Google Web Picture'], +- WMA => ['ASF', 'Windows Media Audio'], +- WMF => ['WMF', 'Windows Metafile Format'], +- WMV => ['ASF', 'Windows Media Video'], +- WV => ['RIFF', 'WavePack lossless audio'], +- X3F => ['X3F', 'Sigma RAW format'], +- XCF => ['XCF', 'GIMP native image format'], +- XHTML=> ['HTML', 'Extensible HyperText Markup Language'], +- XLA => ['FPX', 'Microsoft Excel Add-in'], +- XLAM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Add-in Macro-enabled'], +- XLS => ['FPX', 'Microsoft Excel Spreadsheet'], +- XLSB => [['ZIP','FPX'], 'Office Open XML Spreadsheet Binary'], +- XLSM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Macro-enabled'], +- XLSX => [['ZIP','FPX'], 'Office Open XML Spreadsheet'], +- XLT => ['FPX', 'Microsoft Excel Template'], +- XLTM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template Macro-enabled'], +- XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'], +- XMP => ['XMP', 'Extensible Metadata Platform'], +- WOFF => ['Font', 'Web Open Font Format'], +- WOFF2=> ['Font', 'Web Open Font Format2'], +- WTV => ['WTV', 'Windows recorded TV show'], +- ZIP => ['ZIP', 'ZIP archive'], + ); + + # typical extension for each file type (if different than FileType) +diff --git a/lib/Image/ExifTool/AIFF.pm b/lib/Image/ExifTool/AIFF.pm +deleted file mode 100644 +index a862a0de..00000000 +--- a/lib/Image/ExifTool/AIFF.pm ++++ /dev/null +@@ -1,312 +0,0 @@ +-#------------------------------------------------------------------------------ +-# File: AIFF.pm +-# +-# Description: Read AIFF meta information +-# +-# Revisions: 01/06/2006 - P. Harvey Created +-# 09/22/2008 - PH Added DjVu support +-# +-# References: 1) http://developer.apple.com/documentation/QuickTime/INMAC/SOUND/imsoundmgr.30.htm#pgfId=3190 +-# 2) http://astronomy.swin.edu.au/~pbourke/dataformats/aiff/ +-# 3) http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ +-#------------------------------------------------------------------------------ +- +-package Image::ExifTool::AIFF; +- +-use strict; +-use vars qw($VERSION); +-use Image::ExifTool qw(:DataAccess :Utils); +-use Image::ExifTool::ID3; +- +-$VERSION = '1.12'; +- +-# information for time/date-based tags (time zero is Jan 1, 1904) +-my %timeInfo = ( +- Groups => { 2 => 'Time' }, +- ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))', +- PrintConv => '$self->ConvertDateTime($val)', +-); +- +-# AIFF info +-%Image::ExifTool::AIFF::Main = ( +- GROUPS => { 2 => 'Audio' }, +- NOTES => q{ +- Tags extracted from Audio Interchange File Format (AIFF) files. See +- L for +- the AIFF specification. +- }, +-# FORM => 'Format', +- FVER => { +- Name => 'FormatVersion', +- SubDirectory => { TagTable => 'Image::ExifTool::AIFF::FormatVers' }, +- }, +- COMM => { +- Name => 'Common', +- SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Common' }, +- }, +- COMT => { +- Name => 'Comment', +- SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Comment' }, +- }, +- NAME => { +- Name => 'Name', +- ValueConv => '$self->Decode($val, "MacRoman")', +- }, +- AUTH => { +- Name => 'Author', +- Groups => { 2 => 'Author' }, +- ValueConv => '$self->Decode($val, "MacRoman")', +- }, +- '(c) ' => { +- Name => 'Copyright', +- Groups => { 2 => 'Author' }, +- ValueConv => '$self->Decode($val, "MacRoman")', +- }, +- ANNO => { +- Name => 'Annotation', +- ValueConv => '$self->Decode($val, "MacRoman")', +- }, +- 'ID3 ' => { +- Name => 'ID3', +- SubDirectory => { +- TagTable => 'Image::ExifTool::ID3::Main', +- ProcessProc => \&Image::ExifTool::ID3::ProcessID3, +- }, +- }, +- APPL => 'ApplicationData', # (first 4 bytes are the application signature) +-# SSND => 'SoundData', +-# MARK => 'Marker', +-# INST => 'Instrument', +-# MIDI => 'MidiData', +-# AESD => 'AudioRecording', +-); +- +-%Image::ExifTool::AIFF::Common = ( +- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, +- GROUPS => { 2 => 'Audio' }, +- FORMAT => 'int16u', +- 0 => 'NumChannels', +- 1 => { Name => 'NumSampleFrames', Format => 'int32u' }, +- 3 => 'SampleSize', +- 4 => { Name => 'SampleRate', Format => 'extended' }, #3 +- 9 => { +- Name => 'CompressionType', +- Format => 'string[4]', +- PrintConv => { +- NONE => 'None', +- ACE2 => 'ACE 2-to-1', +- ACE8 => 'ACE 8-to-3', +- MAC3 => 'MAC 3-to-1', +- MAC6 => 'MAC 6-to-1', +- sowt => 'Little-endian, no compression', +- alaw => 'a-law', +- ALAW => 'A-law', +- ulaw => 'mu-law', +- ULAW => 'Mu-law', +- 'GSM '=> 'GSM', +- G722 => 'G722', +- G726 => 'G726', +- G728 => 'G728', +- }, +- }, +- 11 => { #PH +- Name => 'CompressorName', +- Format => 'pstring', +- ValueConv => '$self->Decode($val, "MacRoman")', +- }, +-); +- +-%Image::ExifTool::AIFF::FormatVers = ( +- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData, +- FORMAT => 'int32u', +- 0 => { Name => 'FormatVersionTime', %timeInfo }, +-); +- +-%Image::ExifTool::AIFF::Comment = ( +- PROCESS_PROC => \&Image::ExifTool::AIFF::ProcessComment, +- GROUPS => { 2 => 'Audio' }, +- 0 => { Name => 'CommentTime', %timeInfo }, +- 1 => 'MarkerID', +- 2 => { +- Name => 'Comment', +- ValueConv => '$self->Decode($val, "MacRoman")', +- }, +-); +- +-%Image::ExifTool::AIFF::Composite = ( +- Duration => { +- Require => { +- 0 => 'AIFF:SampleRate', +- 1 => 'AIFF:NumSampleFrames', +- }, +- RawConv => '($val[0] and $val[1]) ? $val[1] / $val[0] : undef', +- PrintConv => 'ConvertDuration($val)', +- }, +-); +- +-# add our composite tags +-Image::ExifTool::AddCompositeTags('Image::ExifTool::AIFF'); +- +- +-#------------------------------------------------------------------------------ +-# Process AIFF Comment chunk +-# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref +-# Returns: 1 on success +-sub ProcessComment($$$) +-{ +- my ($et, $dirInfo, $tagTablePtr) = @_; +- my $dataPt = $$dirInfo{DataPt}; +- my $dirLen = $$dirInfo{DirLen}; +- my $verbose = $et->Options('Verbose'); +- return 0 unless $dirLen > 2; +- my $numComments = unpack('n',$$dataPt); +- my $pos = 2; +- my $i; +- $verbose and $et->VerboseDir('Comment', $numComments); +- for ($i=0; $i<$numComments; ++$i) { +- last if $pos + 8 > $dirLen; +- my ($time, $markerID, $size) = unpack("x${pos}Nnn", $$dataPt); +- $et->HandleTag($tagTablePtr, 0, $time); +- $et->HandleTag($tagTablePtr, 1, $markerID) if $markerID; +- $pos += 8; +- last if $pos + $size > $dirLen; +- my $val = substr($$dataPt, $pos, $size); +- $et->HandleTag($tagTablePtr, 2, $val); +- ++$size if $size & 0x01; # account for padding byte if necessary +- $pos += $size; +- } +-} +- +-#------------------------------------------------------------------------------ +-# Extract information from a AIFF file +-# Inputs: 0) ExifTool object reference, 1) DirInfo reference +-# Returns: 1 on success, 0 if this wasn't a valid AIFF file +-sub ProcessAIFF($$) +-{ +- my ($et, $dirInfo) = @_; +- my $raf = $$dirInfo{RAF}; +- my ($buff, $err, $tagTablePtr, $page, $type, $n); +- +- # verify this is a valid AIFF file +- return 0 unless $raf->Read($buff, 12) == 12; +- my $fast3 = $$et{OPTIONS}{FastScan} && $$et{OPTIONS}{FastScan} == 3; +- my $pos = 12; +- # check for DjVu image +- if ($buff =~ /^AT&TFORM/) { +- # http://www.djvu.org/ +- # http://djvu.sourceforge.net/specs/djvu3changes.txt +- my $buf2; +- return 0 unless $raf->Read($buf2, 4) == 4 and $buf2 =~ /^(DJVU|DJVM)/; +- $pos += 4; +- $buff = substr($buff, 4) . $buf2; +- $et->SetFileType('DJVU'); +- return 1 if $fast3; +- $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main'); +- # modify FileType to indicate a multi-page document +- $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM' and $$et{VALUE}{FileType}; +- $type = 'DjVu'; +- } else { +- return 0 unless $buff =~ /^FORM....(AIF(F|C))/s; +- $et->SetFileType($1); +- return 1 if $fast3; +- $tagTablePtr = GetTagTable('Image::ExifTool::AIFF::Main'); +- $type = 'AIFF'; +- } +- SetByteOrder('MM'); +- my $verbose = $et->Options('Verbose'); +-# +-# Read through the IFF chunks +-# +- for ($n=0;;++$n) { +- $raf->Read($buff, 8) == 8 or last; +- $pos += 8; +- my ($tag, $len) = unpack('a4N', $buff); +- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag); +- $et->VPrint(0, "AIFF '${tag}' chunk ($len bytes of data): ", $raf->Tell(),"\n"); +- # AIFF chunks are padded to an even number of bytes +- my $len2 = $len + ($len & 0x01); +- if ($len2 > 100000000) { +- if ($len2 >= 0x80000000 and not $et->Options('LargeFileSupport')) { +- $et->Warn('End of processing at large chunk (LargeFileSupport not enabled)'); +- last; +- } +- if ($tagInfo) { +- $et->Warn("Skipping large $$tagInfo{Name} chunk (> 100 MB)"); +- undef $tagInfo; +- } +- } +- if ($tagInfo) { +- if ($$tagInfo{TypeOnly}) { +- $len = $len2 = 4; +- $page = ($page || 0) + 1; +- $et->VPrint(0, $$et{INDENT} . "Page $page:\n"); +- } +- $raf->Read($buff, $len2) >= $len or $err=1, last; +- unless ($$tagInfo{SubDirectory} or $$tagInfo{Binary}) { +- $buff =~ s/\0+$//; # remove trailing nulls +- } +- $et->HandleTag($tagTablePtr, $tag, $buff, +- DataPt => \$buff, +- DataPos => $pos, +- Start => 0, +- Size => $len, +- ); +- } elsif (not $len) { +- next if ++$n < 100; +- $et->Warn('Aborting scan. Too many empty chunks'); +- last; +- } elsif ($verbose > 2 and $len2 < 1024000) { +- $raf->Read($buff, $len2) == $len2 or $err = 1, last; +- $et->VerboseDump(\$buff); +- } else { +- $raf->Seek($len2, 1) or $err=1, last; +- } +- $pos += $len2; +- $n = 0; +- } +- $err and $et->Warn("Error reading $type file (corrupted?)"); +- return 1; +-} +- +-1; # end +- +-__END__ +- +-=head1 NAME +- +-Image::ExifTool::AIFF - Read AIFF meta information +- +-=head1 SYNOPSIS +- +-This module is used by Image::ExifTool +- +-=head1 DESCRIPTION +- +-This module contains routines required by Image::ExifTool to extract +-information from AIFF (Audio Interchange File Format) audio files. +- +-=head1 AUTHOR +- +-Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com) +- +-This library is free software; you can redistribute it and/or modify it +-under the same terms as Perl itself. +- +-=head1 REFERENCES +- +-=over 4 +- +-=item L +- +-=item L +- +-=item L +- +-=back +- +-=head1 SEE ALSO +- +-L, +-L +- +-=cut + diff --git a/scripts/install-essentials b/scripts/install-essentials index 9c18985..feba899 100755 --- a/scripts/install-essentials +++ b/scripts/install-essentials @@ -52,7 +52,7 @@ function prepare_ubi_environment() { yum install -by --nodocs \ autoconf clang-devel cmake gcc gcc-c++ make patch perl bzip2 \ libedit ncurses uuid libarchive curl-devel \ - libicu-devel libffi-devel libuuid-devel openssl-devel \ + libicu-devel libyaml-devel libedit-devel libffi-devel libuuid-devel openssl-devel \ ncurses-devel pcre2-devel zlib-devel libstdc++-static \ libevent-devel redhat-lsb-core procps-ng diff --git a/scripts/install-exiftool b/scripts/install-exiftool new file mode 100755 index 0000000..3ee6325 --- /dev/null +++ b/scripts/install-exiftool @@ -0,0 +1,29 @@ +#!/bin/bash + +set -xeuo pipefail + +mkdir build \ + && curl -fsSL "$EXIFTOOL_DOWNLOAD_URL" -o exiftool.tar.gz \ + && echo "$EXIFTOOL_DOWNLOAD_SHA256 exiftool.tar.gz" | sha256sum -c - \ + && tar -C build -xzf exiftool.tar.gz + +cd build/exiftool-$EXIFTOOL_VERSION + +# Apply patches +patchdir="/patches/exiftool/${EXIFTOOL_VERSION}" +if [[ -d "${patchdir}" ]]; then + for i in "${patchdir}"/*.patch; do + echo "$i..." + patch -p1 -i "$i" + done +else + echo "!! Missing exiftools patch" + echo "!! Make sure the patch exists for exiftool version ${EXIFTOOL_VERSION} before proceeding." + exit 1 +fi + +perl Makefile.PL \ + && make install \ + && cd ../.. \ + && rm -rf build \ + && rm exiftool.tar.gz diff --git a/scripts/lib/custom-docker-build b/scripts/lib/custom-docker-build index 461cd26..ac4cc6f 100755 --- a/scripts/lib/custom-docker-build +++ b/scripts/lib/custom-docker-build @@ -189,6 +189,19 @@ function print_graphicsmagick_args() { printf -- "--build-arg GRAPHISMAGICK_DOWNLOAD_SHA256=%s " "$GRAPHISMAGICK_DOWNLOAD_SHA256" } +function print_exiftool_args() { + case "$1" in + 12.60) + EXIFTOOL_VERSION=12.60 + EXIFTOOL_DOWNLOAD_SHA256=30f22c28905c7aae46986c41cf1f3635781b336c8183b62348198734ffd33366 + ;; + *) fail "Unknown exiftool version $1" ;; + esac + + printf -- "--build-arg EXIFTOOL_VERSION=%s " "$EXIFTOOL_VERSION" + printf -- "--build-arg EXIFTOOL_DOWNLOAD_SHA256=%s " "$EXIFTOOL_DOWNLOAD_SHA256" +} + function print_bazelisk_args() { case "$1" in 1.9.0) @@ -358,6 +371,7 @@ function parse_arguments() { YARN) print_yarn_args $version ;; POSTGRESQL) print_postgres_args $version ;; GRAPHICSMAGICK) print_graphicsmagick_args $version ;; + EXIFTOOL) print_exiftool_args $version ;; BAZELISK) print_bazelisk_args $version ;; GCLOUD) print_gcloud_args $version ;; KUBECTL) print_kubectl_args $version ;; diff --git a/scripts/lib/custom-docker.sh b/scripts/lib/custom-docker.sh index 0b9599e..7a45b7c 100644 --- a/scripts/lib/custom-docker.sh +++ b/scripts/lib/custom-docker.sh @@ -2,7 +2,7 @@ # various variable operations used in this script. PATH_TOOLS=(DEBIAN OS UBI RUBY GOLANG RUST NODE POSTGRESQL) -TAG_TOOLS=(BUNDLER RUBYGEMS GIT LFS CHROME YARN GRAPHICSMAGICK BAZELISK DOCKER GCLOUD KUBECTL HELM) +TAG_TOOLS=(BUNDLER RUBYGEMS GIT LFS CHROME YARN GRAPHICSMAGICK EXIFTOOL BAZELISK DOCKER GCLOUD KUBECTL HELM) # Generate the docker image path using the components that were specified via # variables.