#!/bin/bash -e xpifile=$1 destdir=$2 error () { echo "$*" >&2 } if [ -z "$xpifile" -o -z "$destdir" ] then error "Usage: $0 xpifile.xpi destdir" exit 1 fi if [ ! -f "$xpifile" ] then error "$xpifile does not exist or is not a regular file." exit 1 fi if [ -x "$destdir" ] then error "$destdir already exists." exit 1 fi # ensure we delete all temporary stuff upon exit olddir=`pwd` trap 'rm -fR $tmpdir; cd $olddir' EXIT # Unpack XPI into temporary directory tmpdir=`mktemp -d` unzip $xpifile -d $tmpdir cd $tmpdir # Check whether it is an original XPI or a language pack if [ -f bin/chrome/en-US.jar -a -f install.js ] then # Move the contents around if [ -f bin/chrome/en-US.manifest ] then mv bin/chrome/en-US.manifest chrome.manifest fi unzip bin/chrome/en-US.jar if [ -f bin/defaults/profile/extensions/*/install.rdf ] then # Determine the extension's and product's GUID and version enusguid=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/about="urn:mozilla:install-manifest"/,$s/.*\([^<]\+\)<\/em:id>.*/\1/p' | head -1` enusver=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '/about="urn:mozilla:install-manifest"/,$s/.*\([^<]\+\)<\/em:version>.*/\1/p' | head -1` prodguid=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '//,$s/.*\([^<]\+\)<\/em:id>.*/\1/p' | head -1` prodminver=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '//,$s/.*\([^<]\+\)<\/em:minVersion>.*/\1/p' | head -1` prodmaxver=`cat bin/defaults/profile/extensions/*/install.rdf | sed -n '//,$s/.*\([^<]\+\)<\/em:maxVersion>.*/\1/p' | head -1` else enusguid=langpack-en-US@mozilla.org enusver=`cat install.js | sed -n 's/.*initInstall *(.*,.*,[^"]*"\([^"]\+\)".*/\1/p' | head -1` prodminver=$enusver prodmaxver=$enusver for i in locale/{,en-US/}branding/brand.properties do if [ -f $i ] then brandpropfile=$i fi done prodname=`cat "$brandpropfile" | sed -n 's/^brandShortName *= *\(.\+\) *$/\1/p' | head -1` prodguid=`cat <\1<\/em:locale>/gp'` if [ -z "$registered" ] then registered=`cat chrome.manifest | sed -n 's/.*jar:en-US.jar!\/\(.*\)/ \1<\/em:locale>/gp'` fi cat < install.rdf $enusguid en-US Language Pack $enusver 8 $prodguid $prodminver $prodmaxver $registered EOT if [ -d locale/en-US ] then mv locale/en-US locale/lang-reg fi rm -fR bin/ install.js # Make sure it is a language pack elif [ -d chrome -a -f chrome/*.jar -a -f install.rdf ] then unzip chrome/*.jar rm -fR chrome # Determine the locale if [ -f chrome.manifest ] then locale=`cat chrome.manifest | sed -n 's/ *locale \+[^ ]\+ \+\([^ ]\+\) .*/\1/p' | head -1` else locale=`cat install.rdf | sed -n 's/.*about="urn:mozilla:extension:file:\([^.]\+\)\.jar.*/\1/p' | head -1` fi if [ -d locale/$locale ] then mv locale/$locale locale/lang-reg fi # It is neither an original XPI nor a translated language pack else error "$xpifile is not a language pack." exit 1 fi # Done; now move everything to $destdir cd $olddir if [ -x $destdir ] then error "$destdir did not previously exist but now does." exit 1 fi # The previous check does not avoid race conditions, but it helps mv $tmpdir $destdir