mirror of https://github.com/luizdepra/hugo-coder.git

Khosrow Moossavi
10.32.2018 ce21f192aa0f126cb8507ee0ef539b9ecea11c01
Use hugo-wrapper for demo target of exampleSite (#74)

hugow is a platform independent wrapper for hugo binary
and it removes the need to actually have the correct
binary installed, rather than controlling the required
version through a version file checked in the repo.
2 files added
2 files modified
439 ■■■■■ changed files
.gitignore 2 ●●●●● patch | view | raw | blame | history
Makefile 6 ●●●● patch | view | raw | blame | history
exampleSite/.hugo/version 1 ●●●● patch | view | raw | blame | history
exampleSite/hugow 430 ●●●●● patch | view | raw | blame | history
.gitignore
@@ -1,3 +1,5 @@
**/themes/
demo/
resources/
.hugo/*
!.hugo/version
Makefile
@@ -1,10 +1,10 @@
.PHONY: demo clear
.PHONY: demo clean
demo:
    mkdir -p demo/themes/hugo-coder
    rsync -av exampleSite/* demo
    rsync -av exampleSite/ demo
    rsync -av --exclude='demo' --exclude='exampleSite' --exclude='.git' . demo/themes/hugo-coder
    cd demo && hugo serve -D
    cd demo && ./hugow serve -D
clean:
    rm -rf demo
exampleSite/.hugo/version
New file
@@ -0,0 +1 @@
0.48/extended
exampleSite/hugow
New file
@@ -0,0 +1,430 @@
#!/usr/bin/env sh
# ------------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# Hugo Wrapper (v1.1.0)
#
# Hugo Wrapper is a POSIX-style shell script which acts as a wrapper to download
# and execute Hugo binary for your platform. It  can  be  executed in variety of
# Operating  Systems  and  Command  Shells. As a  result, hugow has very minimal
# number of dependencies:
#
#  downloader: wget or curl
#  checksum  : sha256sum or shasum or cksum
#  tarball   : tar
#
# https://github.com/khos2ow/hugo-wrapper
# ------------------------------------------------------------------------------
set -e
VERSION_NUMBER="v1.1.0"
# hugo-wrapper command available flags
get_version=""
get_latest=false
get_extended=false
upgrade=false
version=false
show_help=false
# hugo related commands to pass through the actual binary
HUGO_ARGS=""
while [ -n "$1" ]; do
    case "$1" in
        --get-version)  get_version=$2;    shift 2 ;;
        --get-latest)   get_latest=true;   shift 1 ;;
        --get-extended) get_extended=true; shift 1 ;;
        --upgrade)      upgrade=true;      shift 1 ;;
        --version)      version=true;      shift 1 ;;
        -h | --help)    show_help=true;    shift 1 ;;
        *) HUGO_ARGS="$HUGO_ARGS $1";      shift 1 ;;
    esac
done
set -- $HUGO_ARGS
if [ "$upgrade" = true ]; then
    if [ "$get_extended" = true -o "$get_latest" = true -o -n "$get_version" ]; then
        echo "Error: Flag --upgrade cannot be used together with --get-extended, --get-version or --get-latest"
        exit 1
    fi
else
    if [ "$get_latest" = true -a -n "$get_version" ]; then
        echo "Error: Flags --get-version and --get-latest cannot be used together"
        exit 1
    fi
fi
# normalizing get_version
get_version_base="$(echo "$get_version" | cut -d "/" -f1)"
get_version_extended="$(echo "$get_version" | cut -d "/" -f2)"
get_version="$get_version_base"
if [ "$get_version_extended" = "extended" ]; then
    get_extended=true
fi
# check which download command (wget or curl) is available.
DOWNLOAD_COMMAND=""
DOWNLOAD_OUTPUT=""
DOWNLOAD_SILENT=""
DOWNLOAD_REDIRECT=""
if command -v wget > /dev/null; then
    DOWNLOAD_COMMAND="wget"
    DOWNLOAD_OUTPUT="-O"
    DOWNLOAD_SILENT="-q"
    DOWNLOAD_REDIRECT=""
elif command -v curl > /dev/null; then
    DOWNLOAD_COMMAND="curl"
    DOWNLOAD_OUTPUT="-o"
    DOWNLOAD_SILENT="-s"
    DOWNLOAD_REDIRECT="-L"
else
    echo "Error: Unable to find 'wget' or 'curl' command."
    exit 1
fi
# OS type
os_type=""
case "`uname -s`" in
    Darwin)     os_type="macOS" ;;
    Linux)      os_type="Linux" ;;
    DragonFly)  os_type="DragonFlyBSD" ;;
    FreeBSD)    os_type="FreeBSD" ;;
    NetBSD)     os_type="NetBSD" ;;
    OpenBSD)    os_type="OpenBSD" ;;
    # CYGWIN*     os_type="Windows" ;;
    # MINGW*)     os_type="Windows" ;;
    # Windows_NT) os_type="Windows" ;;
esac
# OS architecture
os_arch=""
case "`uname -m`" in
    x86)      os_arch="32bit" ;;
    x86_64)   os_arch="64bit" ;;
    amd64)    os_arch="64bit" ;;
    armv7l)   os_arch="ARM" ;;
    armv8)    os_arch="ARM64" ;;
esac
if [ -z "$os_type" -o -z "$os_arch" ]; then
    echo "Error: Unknown OS type or architecture"
    exit 1
fi
# ------------------------------------------------------------------------------
# traverses directory structure from process work directory to filesystem root
# first directory with .hugo subdirectory is considered project base directory
# ------------------------------------------------------------------------------
find_basedir() {
    if [ -z "$1" ]; then
        echo "Error: Path not specified to find_basedir"
        return 1
    fi
    basedir="$1"
    wdir="$1"
    while [ "$wdir" != '/' ]; do
        if [ -d "$wdir"/.hugo ]; then
            basedir=$wdir
            break
        fi
        if [ -d "${wdir}" ]; then
            wdir=`cd "$wdir/.."; pwd`
        fi
    done
    echo "${basedir}"
}
BASE_DIR=`find_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
    echo "Error: Unable to find base directory."
    exit 1
fi
if [ ! -d "$BASE_DIR/.hugo" ]; then
    mkdir -p "$BASE_DIR/.hugo"
else
    if [ -r "$BASE_DIR/.hugo/hugo" -a ! -s "$BASE_DIR/.hugo/hugo" ]; then
        rm "$BASE_DIR/.hugo/hugo"
    fi
    if [ -r "$BASE_DIR/.hugo/version" -a ! -s "$BASE_DIR/.hugo/version" ]; then
        rm "$BASE_DIR/.hugo/version"
    fi
fi
parse_json() {
    local json="$1"
    local field="$2"
    if [ -z "$json" ]; then
        echo ""
    elif [ -z "$field" ]; then
        echo ""
    fi
    temp=`echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $field`
    echo ${temp##*|} | sed "s/${field}: //g"
}
perform_checksum() {
    if [ -n "$1" ]; then
        if command -v sha256sum > /dev/null; then
            echo "$1" | sha256sum --check > /dev/null
        elif command -v shasum > /dev/null; then
            echo "$1" | shasum --algorithm 256 --check > /dev/null
        elif command -v cksum > /dev/null; then
            echo "$1" | cksum -a SHA256 -c > /dev/null
        else
            echo "Error: cannot find any checksum command"
            exit 1
        fi
    fi
}
remove_file() {
    if [ -n "$1" -a "$1" != "/" -a -f "$1" -a -r "$1" ] ; then
        rm "$1"
    fi
}
download_version() {
    local versionToDownload="$1"
    local isExtended="$2"
    if [ -n "$versionToDownload" ]; then
        local filenamePrefix="hugo"
        local versionDownloadSuffix=""
        if [ "$isExtended" = true ]; then
            filenamePrefix="hugo_extended"
            versionDownloadSuffix="/extended"
        fi
        if [ "$versionToDownload" = "LATEST" ]; then
            latest_release=`$DOWNLOAD_COMMAND $DOWNLOAD_SILENT $DOWNLOAD_REDIRECT ${DOWNLOAD_OUTPUT}- https://api.github.com/repos/gohugoio/hugo/releases/latest`
            versionToDownload=`parse_json "$latest_release" "tag_name"`
        fi
        # strip down 'v' from begining of the string if exists
        versionToDownload=`echo $versionToDownload | sed -ne 's/[^0-9]*\(\([0-9]*\.\)\{0,4\}[0-9]*\(\/extended\)*\).*/\1/p'`
        printf "downloading hugo binary version v${versionToDownload}${versionDownloadSuffix} ... "
        # download for specific OS and architecture
        local binaryUrl="https://github.com/gohugoio/hugo/releases/download/v${versionToDownload}/${filenamePrefix}_${versionToDownload}_${os_type}-${os_arch}.tar.gz"
        local checksumUrl="https://github.com/gohugoio/hugo/releases/download/v${versionToDownload}/${filenamePrefix}_${versionToDownload}_checksums.txt"
        local tarballName="${filenamePrefix}_${versionToDownload}_${os_type}-${os_arch}.tar.gz"
        local tarballPath="$BASE_DIR/.hugo/${tarballName}"
        local checksumName="checksum.txt"
        local checksumPath="$BASE_DIR/.hugo/${checksumName}"
        $DOWNLOAD_COMMAND $DOWNLOAD_SILENT $DOWNLOAD_REDIRECT $DOWNLOAD_OUTPUT "$tarballPath" "$binaryUrl" &
        $DOWNLOAD_COMMAND $DOWNLOAD_SILENT $DOWNLOAD_REDIRECT $DOWNLOAD_OUTPUT "$checksumPath" "$checksumUrl" &
        wait
        if [ -s "$tarballPath" -a -s "$checksumPath" ]; then
            printf "[done]\n"
        else
            printf "[failed]\n"
            remove_file "$checksumPath"
            remove_file "$tarballPath"
            exit 1
        fi
        printf "verifying hugo binary version v${versionToDownload}${versionDownloadSuffix} ..... "
        cd $BASE_DIR/.hugo/
        grep "${tarballName}" "$BASE_DIR/.hugo/$checksumName" | perform_checksum
        cd - > /dev/null 2>&1
        wait
        printf "[done]\n"
        printf "unzipping hugo binary version v${versionToDownload}${versionDownloadSuffix} ..... "
        if [ -f "${tarballPath}" -a -r "${tarballPath}" ]; then
            tar --directory="$BASE_DIR/.hugo/" -xzf "${tarballPath}" 2>&1
            wait
            printf "[done]\n"
        else
            printf "[failed]\n"
            remove_file "$checksumPath"
            remove_file "$tarballPath"
            exit 1
        fi
        # save the downloaded binary version into $BASE_DIR/.hugo/version
        echo "${versionToDownload}${versionDownloadSuffix}" > $BASE_DIR/.hugo/version
        # cleanup after extraction
        remove_file "$checksumPath"
        remove_file "$tarballPath"
        remove_file "$BASE_DIR/.hugo/LICENSE"
        remove_file "$BASE_DIR/.hugo/README.md"
    fi
}
# ------------------------------------------------------------------------------
# upgrade hugo wrapper binary and save it as ${BASE_DIR}/hugow
# ------------------------------------------------------------------------------
if [ "$version" = true ]; then
    echo "Hugo Wrapper $VERSION_NUMBER"
    exit
fi
# ------------------------------------------------------------------------------
# upgrade hugo wrapper binary and save it as ${BASE_DIR}/hugow
# ------------------------------------------------------------------------------
if [ "$upgrade" = true ]; then
    printf "downloading hugow binary ... "
    latest_release=`$DOWNLOAD_COMMAND $DOWNLOAD_SILENT $DOWNLOAD_REDIRECT ${DOWNLOAD_OUTPUT}- https://api.github.com/repos/khos2ow/hugo-wrapper/releases/latest`
    versionToDownload=`parse_json "$latest_release" "tag_name"`
    $DOWNLOAD_COMMAND $DOWNLOAD_SILENT $DOWNLOAD_REDIRECT $DOWNLOAD_OUTPUT "hugow" "https://github.com/khos2ow/hugo-wrapper/releases/download/${versionToDownload}/hugow" &
    wait
    printf "[done]\n"
    chmod +x hugow
    exit
fi
# ------------------------------------------------------------------------------
# download hugo binary and save it as ${BASE_DIR}/.hugo/hugo
# ------------------------------------------------------------------------------
if [ -r "$BASE_DIR/.hugo/hugo" ]; then
    current_binary_version="$($BASE_DIR/.hugo/hugo version | sed -ne 's/[^0-9]*\(\([0-9]*\.\)\{0,4\}[0-9]*\(\/extended\)*\).*/\1/p' | sed 's/^ *//;s/ *$//')"
    if [ "$get_extended" = true ]; then
        suffix_extended_version="/extended"
    fi
    # download hugo binary and save it as ${BASE_DIR}/.hugo/hugo
    if [ -n "$get_version" ]; then
        if [ "${get_version}${suffix_extended_version}" != "$current_binary_version" ]; then
            # specified hugo version
            download_version "$get_version" $get_extended
        else
            echo "hugo binary version ${get_version}${suffix_extended_version} already exists"
            echo "${get_version}${suffix_extended_version}" > $BASE_DIR/.hugo/version
        fi
     elif [ $get_latest = true ]; then
        latest_release=`$DOWNLOAD_COMMAND $DOWNLOAD_SILENT $DOWNLOAD_REDIRECT ${DOWNLOAD_OUTPUT}- https://api.github.com/repos/gohugoio/hugo/releases/latest`
        latest_version=`parse_json "$latest_release" "tag_name" | sed -ne 's/[^0-9]*\(\([0-9]*\.\)\{0,4\}[0-9]*\(\/extended\)*\).*/\1/p'`
        if [ "${latest_version}${suffix_extended_version}" != "$current_binary_version" ]; then
            # latest hugo version
            download_version "$latest_version" $get_extended
        else
            echo "latest hugo binary version ${latest_version}${suffix_extended_version} already exists"
            echo "${latest_version}${suffix_extended_version}" > $BASE_DIR/.hugo/version
        fi
    elif [ -r "$BASE_DIR/.hugo/version" ]; then
        current_file_version="$(cat "$BASE_DIR/.hugo/version")"
        if [ "$current_file_version" != "$current_binary_version" ]; then
            version_from_file="$(echo "$current_file_version" | cut -d "/" -f1)"
            extended_from_file="$(echo "$current_file_version" | cut -d "/" -f2)"
            if [ "${extended_from_file}" = "extended" ]; then
                isExtended=true
            else
                isExtended=false
            fi
            # specified hugo version
            download_version "$version_from_file" $isExtended
        fi
    else
        # save the current binary version into $BASE_DIR/.hugo/version
        echo "$current_binary_version" > $BASE_DIR/.hugo/version
    fi
else
    if [ -n "$get_version" ]; then
        # specified hugo version
        download_version "$get_version" $get_extended
    elif [ $get_latest = true ]; then
        # latest hugo version
        download_version "LATEST" $get_extended
    elif [ -r "$BASE_DIR/.hugo/version" ]; then
        # specified hugo version
        version_from_file="$(cat "$BASE_DIR/.hugo/version" | cut -d "/" -f1)"
        extended_from_file="$(cat "$BASE_DIR/.hugo/version" | cut -d "/" -f2)"
        if [ "${extended_from_file}" = "extended" ]; then
            isExtended=true
        else
            isExtended=false
        fi
        download_version "${version_from_file}" $isExtended
    else
        # latest hugo version
        download_version "LATEST" $get_extended
    fi
fi
# ------------------------------------------------------------------------------
# only download binary and not execute hugo related command
# ------------------------------------------------------------------------------
if [ "$get_latest" = true -o -n "$get_version" ]; then
    ${BASE_DIR}/.hugo/hugo version
    exit
fi
# ------------------------------------------------------------------------------
# Show help, both from hugow and ${BASE_DIR}/.hugo/hugo
# ------------------------------------------------------------------------------
if [ $show_help = true ]; then
    help=$(${BASE_DIR}/.hugo/hugo --help)
    cat << USAGE
hugow is the universal wrapper for hugo main command.
Hugo is a Fast and Flexible Static Site Generator
built with love by spf13 and friends in Go.
Complete documentation is available at http://gohugo.io/.
Flags:
      --get-extended               get hugo extended binary
      --get-latest                 get latest version of hugo binary
      --get-version string         get specified version of hugo binary
      --upgrade                    upgrade hugo wrapper binary itself
      --version                    show version of hugo wrapper binary itself
  -h, --help                       help for hugo-wrapper
--------
$help
USAGE
    exit 0
fi
# ------------------------------------------------------------------------------
# pass commands and flags to actual hugo binary
# ------------------------------------------------------------------------------
${BASE_DIR}/.hugo/hugo "$@"