blob: fd4047e277ba0fd246310580e236538b97a2ae53 [file] [log] [blame]
#!/bin/bash
#
# Copyright (C) 2020 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
set -e
function usage() {
echo "usage: $0 <exploded dir> <source path>"
echo "This script concatenates files in <exploded dir> and puts the results in <source path>"
exit 1
}
explodedDir="$1"
sourcePath="$2"
if [ "$sourcePath" == "" ]; then
usage
fi
sourcePath="$(readlink -f $sourcePath)"
if [ "$explodedDir" == "" ]; then
usage
fi
mkdir -p "$explodedDir"
explodedDir="$(cd $explodedDir && pwd)"
function joinPath() {
explodedPath="$1"
sourceFile="$2"
# replace ending '/.' with nothing
sourceFile="$(echo $sourceFile | sed 's|/\.$||')"
# if this file doesn't already exist, regenerate it
if [ ! -e "$sourceFile" ]; then
mkdir -p "$(dirname $sourceFile)"
bash -c "cd $explodedPath && find -type f | sort | xargs cat > $sourceFile"
chmod u+x "$sourceFile"
fi
}
function deleteStaleOutputs() {
if [ -e "$sourcePath" ]; then
# find everything in explodedDir newer than sourcePath
cd "$explodedDir"
changedPaths="$(find -newer "$sourcePath" | sed 's|\([/0-9]*\)$||' | sort | uniq)"
# for each modified inode in explodedDir, delete the corresponding inode in sourcePath
# first check for '.' because `rm` refuses to delete '.'
for filePath in $changedPaths; do
if [ "$filePath" == "." ]; then
# the source dir itself is older than the exploded dir, so we have to delete the entire source dir
rm "$sourcePath" -rf
return
fi
done
# now we can delete any stale paths
cd "$sourcePath"
for filePath in $changedPaths; do
rm $filePath -rf
done
fi
}
function main() {
# Remove most files and directories under $sourcePath other than build caches (out)
deleteStaleOutputs
mkdir -p "$sourcePath"
# regenerate missing files
cd "$explodedDir"
echo joining all file paths under $explodedDir into $sourcePath
filePaths="$(find -type f -name file | sed 's|/[^/]*$||' | sort | uniq)"
for filePath in $filePaths; do
joinPath "$explodedDir/$filePath" "$sourcePath/$filePath"
done
for filePath in $(find -type l); do
cp -PT "$explodedDir/$filePath" "$sourcePath/$filePath"
done
# record the timestamp at which we finished
touch $sourcePath
# announce that we're done
echo done joining all file paths under $explodedDir into $sourcePath
}
main