#!/bin/bash
# dev/package/publish - Package Release Publishing
set -e
lib_load 'dev/package/install'
lib_load 'net/remote'
######
# Package Publishing Wizards
# package_publish_upload() - Automates uploading the packages to the
# project publishing website.
# $1 - Package version
#
# This function performs the following individual steps:
package_publish_upload() {
has_args 0 "$@"
local version=${1:-$(package_version_build_full)}
# - Publishes package distribution files
package_publish_tarballs "$version"
# - Publishes package documentation
package_publish_docs "$version"
# - Publishes package installers
package_publish_installers "$version"
# - Locks all published files
package_publish_lock "$version"
}
# package_publish_finish() - Updates the current package links on the
# project publishing website and announces them.
# $1 - Package version
# $2 - Release branch
#
# This function performs the following individual steps:
package_publish_finish() {
has_args 0 "$@"
local version=${1:-$(package_version_build_full)}
# - Publishes updated links to the newly published version
package_publish_links "$version"
# - Publishes package release announcements
package_publish_announce "$version"
}
######
# SSH Publishing Support
# package_publish_ssh() - Publishes files using ``rsync`` via SSH.
# This remote host and pat are specified by the ``$PUBLISH_SSH_HOST``
# and ``$PUBLISH_SSH_PATH`` settings in the package configuration files.
# $1 - Source path
# $2 - Destination path
package_publish_ssh() {
has_args 2 "$@"
local src=$1
local dst=$2
local host=$PUBLISH_SSH_HOST
local path=$PUBLISH_SSH_PATH
if [ -z "$host" -o -z "$path" ]; then
warn "ssh transport: host/path not definied, skipping $dst..."
return
fi
rsync_run -a "$src" "$host:$path/$dst"
}
# package_publish_cmd() - Runs a command on the publishing host.
# $@ - Command to run.
package_publish_cmd() {
min_args 1 "$@"
remote_run "$PUBLISH_SSH_HOST" "$@"
}
# package_publish_filename() - Prints the name of the published release
# directory ($1) for the given version ($2)
# $1 - Directory name (installers, releases, docs)
# $2 - Package version
package_publish_filename() {
local dirname
local ext
case "$1" in
docs) ext='docs' ;;
*) ext='' ;;
esac
dirname=$(package_dist_dirname "$ext" "$2")
echo "$PUBLISH_SSH_PATH/$1/$dirname"
}
# package_publish_foreach_dir() - Runs a publishing function ($1)
# for each published release directory of a given version ($2).
# $1 - Command to run
# $2 - Package version
package_publish_foreach_dir() {
local version
version=${2:-$(package_version_build_full)}
local dir
for dir in installers releases docs; do
"$1" "$dir" "$version"
done
}
######
# Published File Permissions
# package_publish_lock() - Locks published files for the given
# package version ($1).
package_publish_lock() {
package_publish_foreach_dir package_publish_lock_files
}
# package_publish_lock_files() - Locks the published release
# directory ($1) for the given version ($2)
# $1 - Directory name (installers, releases, docs)
# $2 - Package version
package_publish_lock_files() {
app_echo "v$2 downloads: locking $1..."
package_publish_cmd chmod -R a-w "$(package_publish_filename "$@")"
}
# package_publish_unlock() - Unlocks published files for the given
# package version ($1).
package_publish_unlock() {
package_publish_foreach_dir package_publish_unlock_files
}
# package_publish_unlock_files() - Unlocks the published release
# directory ($1) for the given version ($2)
# $1 - Directory name (installers, releases, docs)
# $2 - Package version
package_publish_unlock_files() {
app_echo "v$2 downloads: unlocking $1..."
package_publish_cmd chmod -R u+w "$(package_publish_filename "$@")"
}
######
# Publishing Cleanup
# package_publish_abort() - Removes all published files for the given
# package version ($1).
# $1 - Package version
package_publish_abort() {
package_publish_foreach_dir package_publish_unlock_files "$@"
package_publish_foreach_dir package_publish_remove_files "$@"
}
# package_publish_remove_files() - Removes the published release
# directory ($1) for the given version ($2)
# $1 - Directory name (installers, releases, docs)
# $2 - Package version
package_publish_remove_files() {
app_echo "v$3 downloads: removing $1..."
package_publish_cmd rm -rf "$(package_publish_filename "$@")"
}
######
# Distribution Files Publishing
# package_publish_tarballs() - Publishes distribution tarballs for the
# given package version ($1).
# $1 - Package version
package_publish_tarballs() {
local version=${1:-$(package_version_build_full)}
local dirname
dirname=$(package_dist_dirname '' "$version")
app_echo "publishing v$version release tarballs..."
package_publish_ssh "$package_distdir/$dirname" releases
}
######
# Documentation Publishing
# package_publish_docs() - Publishes documentation for the given package
# version ($1).
# $1 - Package version
package_publish_docs() {
local version=${1:-$(package_version_build_full)}
local dirname
dirname=$(package_dist_dirname docs "$version")
app_echo "publishing v$version documentation..."
package_publish_ssh "$package_objdir/$dirname" docs
}
######
# Installer Publishing
# package_publish_installers() - Publishes installers for the given package
# version ($1).
# $1 - Package version
package_publish_installers() {
local version=${1:-$(package_version_build_full)}
local dirname
dirname=$(package_dist_dirname '' "$version")
app_echo "creating v$version installer directory..."
package_publish_cmd mkdir -p "$PUBLISH_SSH_PATH/installers/$dirname"
package_publish_installer_kind 'local' "$version"
package_publish_installer_kind 'net' "$version"
package_publish_installer_kind 'complete' "$version"
}
package_publish_installer_kind() {
has_args 2 "$@"
local kind=$1
local version=$2
app_echo "generating v$version $kind installer..."
local tmp
tmp=$(cmd_tempfile)
package_install_script_$kind "$version" >"$tmp"
run chmod 0444 "$tmp"
app_echo "publishing v$version $kind installer..."
local installer="installers/$dirname/${dirname}-${kind}-install.sh"
package_publish_ssh "$tmp" "$installer"
}
######
# Current Link Publishing
package_publish_links() {
package_publish_links_dir installers "$@"
package_publish_links_dir releases "$@"
package_publish_links_dir docs "$@"
}
package_publish_links_dir() {
has_args 2 "$@"
local dir=$1
local version=$2
local ext
case "$dir" in
(*) ext='' ;;
(docs) ext='docs' ;;
(*) error "$dir: unknown link publishing directory"
esac
local branch=$RELEASE_BRANCH
[ "$RELEASE_BRANCH" ] || error "RELEASE_BRANCH must be set"
package_release_branch_required "$branch"
app_echo "generating symbolic link to v$version for $branch $dir..."
local dirname
dirname=$(package_dist_dirname "$ext" "$version")
app_echo "publishing new $branch $dir link..."
local link="$PUBLISH_SSH_PATH/$dir/current-$branch"
package_publish_cmd rm -f "$link"
package_publish_cmd ln -s "$dirname" "$link"
}
######
# Announcement Publishing
package_publish_announce() { warn "unimplemented"; }
Generated on Sat Jul 8 19:40:29 PDT 2017 by mcsh d14 v0.22.0.