ef9aa9a756
After copying the mime db or packages the files were removed, but not the corresponding attribute storage files. So when an inode got reused the file inherited those leftover attributes. We now remove them before removing the files. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22940 a95241bf-73f2-0310-859d-f6bbb57e9c96
209 lines
4.5 KiB
Bash
Executable File
209 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# The first argument is the shell script that initializes the variables:
|
|
# sourceDir
|
|
# outputDir
|
|
# tmpDir
|
|
# installDir
|
|
# isImage
|
|
# imagePath
|
|
# imageSize
|
|
# addBuildCompatibilityLibDir
|
|
# sourceDirsToCopy
|
|
# updateOnly
|
|
# dontClearImage
|
|
#
|
|
# bfsShell
|
|
# copyattr
|
|
# fsShellCommand
|
|
# makebootable
|
|
# resattr
|
|
# rc
|
|
# unzip
|
|
#
|
|
if [ $# -gt 0 ]; then
|
|
. $1
|
|
shift
|
|
fi
|
|
|
|
# this adds the build library dir to LD_LIBRARY_PATH
|
|
eval "$addBuildCompatibilityLibDir"
|
|
|
|
# map the shell commands
|
|
if [ $isImage ]; then
|
|
sPrefix=:
|
|
tPrefix=/myfs/
|
|
cd="$fsShellCommand cd"
|
|
scd="$fsShellCommand cd"
|
|
cp="$fsShellCommand cp"
|
|
copyAttrs="$fsShellCommand cp -a"
|
|
ln="$fsShellCommand ln"
|
|
mkdir="$fsShellCommand mkdir"
|
|
rm="$fsShellCommand rm"
|
|
mkindex="$fsShellCommand mkindex"
|
|
else
|
|
sPrefix=
|
|
# TODO: This should come from the environment.
|
|
tPrefix="$installDir/"
|
|
cd=cd
|
|
scd=:
|
|
cp="$copyattr -d"
|
|
copyAttrs="$copyattr"
|
|
ln=ln
|
|
mkdir=mkdir
|
|
rm=rm
|
|
mkindex=mkindex
|
|
fi
|
|
|
|
|
|
# attribute-safe rm -rf
|
|
# This makes sure there are no leftover attribute file before removing each file
|
|
attrrmrf()
|
|
{
|
|
test -e "$1" || return
|
|
find "$1" -print0 | xargs -0 stat -c %i | awk "{ print \"$outputDir/attributes/\" \$1 }" | xargs rm -rf
|
|
rm -rf "$1"
|
|
}
|
|
|
|
unzipFile()
|
|
{
|
|
# unzipFile <archive> <directory>
|
|
zipFile=$1
|
|
targetUnzipDir=$2
|
|
|
|
echo "Unzipping $zipFile ..."
|
|
|
|
if [ $isImage ]; then
|
|
unzipDir=$tmpDir/unzip
|
|
attrrmrf $unzipDir
|
|
mkdir -p $unzipDir
|
|
|
|
$unzip -q -d $unzipDir $zipFile
|
|
$cp -r ${sPrefix}$unzipDir/. ${tPrefix}$targetUnzipDir
|
|
|
|
attrrmrf $unzipDir
|
|
else
|
|
$unzip -q -d ${tPrefix}$targetUnzipDir ${sPrefix}$zipFile
|
|
fi
|
|
}
|
|
|
|
|
|
# create the image and mount it
|
|
if [ $isImage ]; then
|
|
echo
|
|
if [ ! $updateOnly ]; then
|
|
echo "Creating image ..."
|
|
if [ ! -e $imagePath -o ! "$dontClearImage" ]; then
|
|
dd if=/dev/zero of=$imagePath bs=1048576 count=$imageSize
|
|
fi
|
|
$bfsShell --initialize $imagePath Haiku
|
|
$makebootable $imagePath
|
|
fi
|
|
$bfsShell -n $imagePath > /dev/null &
|
|
sleep 1
|
|
fi
|
|
|
|
# create BEOS:APP_SIG index -- needed to launch apps via signature
|
|
if [ ! $updateOnly ]; then
|
|
$mkindex BEOS:APP_SIG
|
|
fi
|
|
|
|
echo "Populating image ..."
|
|
while [ $# -gt 0 ]; do
|
|
. $1
|
|
shift
|
|
done
|
|
|
|
|
|
# install MIME database
|
|
# TODO: It should be possible to do that in the build system too.
|
|
|
|
if [ ! $updateOnly ]; then
|
|
mimeDBSource=$sourceDir/src/data/beos_mime
|
|
mimeDBDest=${tPrefix}home/config/settings/beos_mime
|
|
|
|
echo "Deleting old MIME database ..."
|
|
|
|
$rm -rf $mimeDBDest
|
|
$mkdir -p $mimeDBDest
|
|
mkdir -p $tmpDir
|
|
mimeTmpDir=$tmpDir/mime
|
|
mimeTmpIndex=0
|
|
|
|
# create tmp dir for the MIME conversion stuff
|
|
mkdir -p $mimeTmpDir
|
|
|
|
echo "Installing MIME database ..."
|
|
|
|
for inSuperFile in $mimeDBSource/*.super; do
|
|
superType=$(basename $inSuperFile .super)
|
|
outSuperDir=$mimeDBDest/$superType
|
|
|
|
# compile rdef to rsrc file and the rsrc file to attributes
|
|
mimeTmpIndex=$(($mimeTmpIndex + 1))
|
|
tmpFile=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.rsrc
|
|
tmpFile2=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.mime
|
|
$rc -o $tmpFile $inSuperFile
|
|
mkdir -p $tmpFile2
|
|
$resattr -O -o $tmpFile2 $tmpFile
|
|
$cp -r ${sPrefix}$tmpFile2 $outSuperDir
|
|
|
|
# iterate through the sub types
|
|
for inSubFile in $mimeDBSource/$superType/*; do
|
|
# check, if the type exists
|
|
if test -f $inSubFile && grep META:TYPE $inSubFile > /dev/null 2>&1 ; then
|
|
subType=$(basename $inSubFile)
|
|
outSubFile=$outSuperDir/$subType
|
|
|
|
# compile rdef to rsrc file and the rsrc file to attributes
|
|
mimeTmpIndex=$(($mimeTmpIndex + 1))
|
|
tmpFile=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.rsrc
|
|
tmpFile2=$mimeTmpDir/mimedb$$_${mimeTmpIndex}.mime
|
|
$rc -o $tmpFile $inSubFile
|
|
$resattr -O -o $tmpFile2 $tmpFile
|
|
$cp ${sPrefix}$tmpFile2 $outSubFile
|
|
fi
|
|
done
|
|
done
|
|
|
|
# cleanup tmp dir
|
|
attrrmrf $mimeTmpDir
|
|
fi # ! updateOnly
|
|
|
|
|
|
# install sources
|
|
|
|
sourcesDest=${tPrefix}home/HaikuSources
|
|
|
|
# create sources directory
|
|
if [ -n "${sourceDirsToCopy}" ]; then
|
|
echo "Installing Haiku Sources ..."
|
|
|
|
$mkdir -p ${sourcesDest}
|
|
fi
|
|
|
|
for sourcesDir in ${sourceDirsToCopy}; do
|
|
echo " sources dir: ${sourcesDir}"
|
|
|
|
# create all subdirectories
|
|
subDirs=$(find ${sourcesDir} -type d | grep -v '.svn' |
|
|
sed -e "s@^${sourceDir}@${sourcesDest}@")
|
|
$mkdir -p ${subDirs}
|
|
|
|
# get all files and copy each one individually
|
|
sourceFiles=$(find $sourcesDir -type f | grep -v '.svn')
|
|
for sourceFile in $sourceFiles; do
|
|
destSourceFile=$(echo $sourceFile |
|
|
sed -e "s@^${sourceDir}@${sourcesDest}@")
|
|
$cp ${sPrefix}$sourceFile $destSourceFile
|
|
done
|
|
done
|
|
|
|
|
|
# unmount
|
|
if [ $isImage ]; then
|
|
echo "Unmounting ..."
|
|
$fsShellCommand sync
|
|
$fsShellCommand quit
|
|
fi
|