blob: f12d43e28596fc20ca9c8b25ebb6b64815081769 [file] [log] [blame]
#!/bin/bash
#
# Script to fetch generated API references docs and stage them.
#
# Examples:
#
# Stage refdocs from a given build ID (to the default staging DB):
#
# ./stageReferenceDocsWithDackka.sh --buildId 1234567
#
# Stage locally-generated refdocs (to the default staging DB) *.
# The directory path must be absolute (can't contain ~):
#
# /stageReferenceDocsWithDackka.sh --buildId 0
# --sourceDir=/dir/to/androidx-main/out/androidx/docs-public/build
#
# Stage ToT refdocs from a given build ID, to a specified DB, using a specific
# date string for the generated CL:
#
# ./stageReferenceDocsWithDackka.sh --buildId 1234567 --db androidx-docs
# --dateStr "April 29, 2021" --useToT
#
# ===
#
# * buildId still needs to be specified when staging locally-generated refdocs,
# but the value is unused and ignored.
#
# ===
#
source gbash.sh || exit
readonly defaultDb=""
DEFINE_string buildId --required "" "The build ID from the Android build server. This is ignored when specifying the 'sourceDir' flag."
DEFINE_string dateStr "<insert date here>" "Date string used for CL message. Enclose date in double quotes (ex: \"April 29, 2021\")"
DEFINE_string db "$defaultDb" "The database used for staging. Omitting this value will stage changes to the staging DB."
DEFINE_string sourceDir "" "Local directory to fetch doc artifacts from. Directory must be absolute (can't contain ~)."
DEFINE_bool useToT false "Stage docs from tip-of-tree docs build rather than public docs build"
DEFINE_bool buildNativeDocs false "Build and stage native docs generated with doxygen"
gbash::init_google "$@"
# Allowlist for including specific directories which are generated by
# Doclava/Dokka instead of Dackka.
#
# There are separate lists for Java and Kotlin refdocs as some libraries (such
# as Compose) only publish refdocs for a single language.
#
# Each directory's spelling must match the library's directory in
# frameworks/support.
readonly javaLibraryDirsThatDontUseDackka=(
"android/support/v4"
"androidx/ads"
"androidx/appcompat"
"androidx/appsearch"
"androidx/biometric"
"androidx/browser"
"androidx/camera"
"androidx/car"
"androidx/concurrent"
"androidx/contentpager"
"androidx/cursoradapter"
"androidx/customview"
"androidx/datastore"
"androidx/documentfile"
"androidx/draganddrop"
"androidx/dynamicanimation"
"androidx/enterprise"
"androidx/exifinterface"
"androidx/gridlayout"
"androidx/heifwriter"
"androidx/hilt"
"androidx/leanback"
"androidx/media"
"androidx/media2"
"androidx/mediarouter"
"androidx/palette"
"androidx/percentlayout"
"androidx/preference"
"androidx/print"
"androidx/profileinstaller"
"androidx/recommendation"
"androidx/recyclerview"
"androidx/remotecallback"
"androidx/resourceinspection"
"androidx/room"
"androidx/security"
"androidx/slice"
"androidx/sqlite"
"androidx/startup"
"androidx/swiperefreshlayout"
"androidx/textclassifier"
"androidx/tracing"
"androidx/transition"
"androidx/tvprovider"
"androidx/versionedparcelable"
"androidx/webkit"
"androidx/work"
)
readonly kotlinLibraryDirsThatDontUseDackka=(
"android/support/v4"
"androidx/ads"
"androidx/appcompat"
"androidx/appsearch"
"androidx/benchmark"
"androidx/biometric"
"androidx/browser"
"androidx/camera"
"androidx/car"
"androidx/concurrent"
"androidx/contentpager"
"androidx/cursoradapter"
"androidx/customview"
"androidx/datastore"
"androidx/documentfile"
"androidx/dynamicanimation"
"androidx/draganddrop"
"androidx/enterprise"
"androidx/exifinterface"
"androidx/glance"
"androidx/gridlayout"
"androidx/heifwriter"
"androidx/hilt"
"androidx/leanback"
"androidx/media"
"androidx/media2"
"androidx/mediarouter"
"androidx/palette"
"androidx/percentlayout"
"androidx/preference"
"androidx/print"
"androidx/profileinstaller"
"androidx/recommendation"
"androidx/recyclerview"
"androidx/remotecallback"
"androidx/resourceinspection"
"androidx/room"
"androidx/security"
"androidx/slice"
"androidx/sqlite"
"androidx/startup"
"androidx/swiperefreshlayout"
"androidx/textclassifier"
"androidx/tracing"
"androidx/transition"
"androidx/tvprovider"
"androidx/versionedparcelable"
"androidx/webkit"
"androidx/work"
)
# Change directory to this script's location and store the directory
cd "$(dirname $0)"
scriptDirectory=$(pwd)
# Working directories for the refdocs
outDir="$scriptDirectory/out"
readonly newDir="reference-docs"
readonly dokkaNewDir="reference-docs-dokka"
readonly doclavaNewDir="reference-docs-doclava"
readonly doxygenNewDir="reference-docs-doxygen"
# Remove and recreate the existing out directory to avoid conflicts from previous runs
rm -rf $outDir
mkdir -p $outDir/$newDir
mkdir -p $outDir/$dokkaNewDir
mkdir -p $outDir/$doclavaNewDir
mkdir -p $outDir/$doxygenNewDir
cd $outDir
if [ "$FLAGS_sourceDir" == "" ]; then
printf "=================================================================== \n"
printf "== Download the doc zip files from the build server \n"
printf "=================================================================== \n"
if (( FLAGS_useToT )); then
printf "Downloading docs-tip-of-tree zip files \n"
androidxDoclavaZip="doclava-tip-of-tree-docs-${FLAGS_buildId}.zip"
androidxDokkaZip="dokka-tip-of-tree-docs-${FLAGS_buildId}.zip"
androidxDackkaZip="dackka-tip-of-tree-docs-${FLAGS_buildId}.zip"
else
printf "Downloading docs-public zip files \n"
androidxDoclavaZip="doclava-public-docs-${FLAGS_buildId}.zip"
androidxDokkaZip="dokka-public-docs-${FLAGS_buildId}.zip"
androidxDackkaZip="dackka-public-docs-${FLAGS_buildId}.zip"
fi
if (( "${FLAGS_buildId::1}" == "P" )); then
/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx_incremental incremental/$androidxDoclavaZip
/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx_incremental incremental/$androidxDokkaZip
/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx_incremental incremental/$androidxDackkaZip
else
/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx $androidxDoclavaZip
/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx $androidxDokkaZip
/google/data/ro/projects/android/fetch_artifact --bid $FLAGS_buildId --target androidx $androidxDackkaZip
fi
# Let's double check we succeeded before continuing
if [[ -f "$androidxDoclavaZip" ]] && [[ -f "$androidxDokkaZip" ]] && [[ -f "$androidxDackkaZip" ]]; then
echo "Download completed"
else
printf "\n"
printf "=================================================================== \n"
echo "Failed to download doc zip files. Please double check your build ID and try again."
exit 1
fi
printf "\n"
printf "=================================================================== \n"
printf "== Unzip the doc zip files \n"
printf "=================================================================== \n"
unzip $androidxDoclavaZip -d $doclavaNewDir
unzip $androidxDokkaZip -d $dokkaNewDir
unzip $androidxDackkaZip -d $newDir
else
printf "=================================================================== \n"
printf "== Copying doc sources from local directory $FLAGS_sourceDir \n"
printf "=================================================================== \n"
cp -r "$FLAGS_sourceDir/javadoc/." $doclavaNewDir
cp -r "$FLAGS_sourceDir/dokkaKotlinDocs/." $dokkaNewDir
cp -r "$FLAGS_sourceDir/dackkaDocs/." $newDir
fi
printf "\n"
printf "=================================================================== \n"
printf "== Copy over Doclava/Dokka generated refdocs \n"
printf "=================================================================== \n"
# The Dackka versions of the docs for these libraries are intentionally not
# removed before copying the non-Dackka versions because some files aren't
# generated by Doclava/Dokka (such as Java refdocs based on Kotlin sources)
cd $outDir
for dir in "${javaLibraryDirsThatDontUseDackka[@]}"
do
printf "Copying Java refdocs for $dir\n"
cp -r $doclavaNewDir/reference/$dir/* $newDir/reference/$dir
done
for dir in "${kotlinLibraryDirsThatDontUseDackka[@]}"
do
printf "Copying Kotlin refdocs for $dir\n"
cp -r $dokkaNewDir/reference/kotlin/$dir/* $newDir/reference/kotlin/$dir
done
if (( FLAGS_buildNativeDocs )); then
printf "\n"
printf "=================================================================== \n"
printf "== Generate Doxygen docs \n"
printf "=================================================================== \n"
../generateDoxygenDocs.sh
fi
printf "\n"
printf "=================================================================== \n"
printf "== Generate the language switcher \n"
printf "=================================================================== \n"
cd $newDir/reference
python3 ./../../../switcher.py --work androidx
python3 ./../../../switcher.py --work support
if (( FLAGS_buildNativeDocs )); then
cd $outDir
# Copy over doxygen generated refdocs after switcher is added
rsync -avh --ignore-existing $doxygenNewDir/reference/ $newDir/reference/
# Include doxygen toc files in main toc
cd $newDir
find reference -name _doxygen.yaml -exec python3 $scriptDirectory/helpers/insert_include_into_toc.py {} \;
fi
printf "\n"
printf "=================================================================== \n"
printf "== Create (if needed) and sync g4 workspace \n"
printf "=================================================================== \n"
client="$(p4 g4d -f androidx-ref-docs-stage)"
cd "$client"
# Revert all local changes to prevent merge conflicts when syncing.
# This is OK since we always want to start with a fresh CitC client
g4 revert ...
g4 sync
printf "\n"
printf "=================================================================== \n"
printf "== Prep directories and copy refdocs to CitC client \n"
printf "=================================================================== \n"
cd third_party/devsite/android/en/reference
cd kotlin/androidx
ls | grep -v "package\|class\|book\|toc\|constraint\|test\|index\|redirects" | xargs -I {} rm -rf {}
cd ../../androidx
ls | grep -v "package\|class\|book\|toc\|constraint\|test\|index\|redirects" | xargs -I {} rm -rf {}
cd ..
cp -r $outDir/$newDir/reference/* .
printf "\n"
printf "=================================================================== \n"
printf "== Create a changelist of pending refdoc changes \n"
printf "=================================================================== \n"
stagingLinkJava="go/dac-stage/reference/androidx/packages"
stagingLinkKotlin="go/dac-stage/reference/kotlin/androidx/packages"
# Add the db param to links if the target database is not the default staging DB.
if [ "$FLAGS_db" != "$defaultdb" ]; then
stagingLinkJava+="?db=$FLAGS_db"
stagingLinkKotlin+="?db=$FLAGS_db"
fi
# Construct CL description
clDesc="Androidx $FLAGS_dateStr Ref Docs
DO NOT SUBMIT
GO LIVE TIME: $FLAGS_dateStr @ 10:00 AM PST
Staged:
* Java: $stagingLinkJava
* Kotlin: $stagingLinkKotlin
All docs build id: $FLAGS_buildId
The following scripts were used to create these docs:
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:development/referenceDocs/
"
# Grab the CL number generated from running `g4 change`.
clNum=$(g4 change --desc "$clDesc" | tail -1 | awk '{print $2}')
printf "View pending changes at http://cl/${clNum} \n"
printf "\n"
printf "=================================================================== \n"
printf "== Stage changes \n"
printf "=================================================================== \n"
# Construct the devsite command and parameters
devsiteCmd="/google/data/ro/projects/devsite/devsite2 stage"
devsiteCmd+=" --use_large_thread_pools"
devsiteCmd+=" --upload_safety_check_mode=ignore"
# Add the --db flag if the target database is not the default staging DB.
if [ "$FLAGS_db" != "$defaultDb" ]; then
devsiteCmd+=" --db=$FLAGS_db"
fi
# Directories to stage
devsiteCmd+=" android/support"
devsiteCmd+=" androidx"
devsiteCmd+=" kotlin/android/support"
devsiteCmd+=" kotlin/androidx"
printf "Running devsite command:\n"
printf "$devsiteCmd\n"
$devsiteCmd
# Print devsite command and CL link again in case they scrolled off the screen or
# scrollback buffer
printf "\n"
printf "Ran devsite command:\n"
printf "$devsiteCmd\n"
printf "\n"
printf "View pending changes at http://cl/${clNum} \n"