Edit

kmx.io/shpkg/bin/shpkg_ci_mux

Branch :

  • bin/shpkg_ci_mux
  • #!/bin/sh
    
    set -e -o pipefail
    
    # shpkg
    
    : ${SHPKG_DIR:=~/shpkg}
    
    . "${SHPKG_DIR}/etc/shpkg/profile"
    
    . "${SHPKG_DIR}/share/shpkg/shpkg.subr"
    
    verbose 2 shpkg_config
    
    verbose 2 shpkg_lock shpkg_ci_mux.lock
    
    # Configuration
    
    : ${SHPKG_CI_DIR:=${SHPKG_DIR}/ci}
    
    shpkg_ci_remote () {
        if [ "x$2" == "x--clean" ]; then
            verbose 1 ssh "$1" shpkg/bin/shpkg_ci "$2"
            rm -rf "${SHPKG_CI_DIR}"
        elif [ "x$2" != "x--upgrade" ]; then
            verbose 1 ssh "$1" shpkg/bin/shpkg_ci "$2"
        else
            verbose 1 ssh "$1" shpkg/bin/shpkg_ci "$2" |
                grep '^shpkg_ci_changed_file ' |
                cut -d ' ' -f 2 |
                while read F; do
                    D="${SHPKG_CI_DIR}/$(dirname "$F")"
                    mkdir -p "$D"
                    verbose 1 rsync "$1":shpkg/ci/"$F" "$D/"
                done
        fi
    }
    
    shpkg_ci_status2png () {
        for F in "${SHPKG_CI_DIR}/status"/*.status; do
            STATUS="$(cat "$F")"
            I="${SHPKG_CI_DIR}/log/$(basename "$F" .status).png"
            if ! [ -f "$I" ] ||
                    [ "$F" -nt "$I" ]; then
                verbose 1 cp "${SHPKG_DIR}/share/shpkg/img/status_${STATUS}.64.png" "$I"
            fi
        done
    }
    
    usage () {
        echo "Usage: $0 [OPTION] PKG REMOTE1 REMOTE2 ..."
        echo "Options :"
        echo " --no-remote      Do not run remote commands, only mux files."
        echo " --upgrade        Upgrade."
        echo " --clean          Remove CI files."
        exit $1
    }
    
    main () {
        if [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then
            usage 0
        fi
        SHPKG_REPO="$1"
        shift
        if [ "x${SHPKG_REPO}" != "x--no-remote" ]; then
            for SHPKG_CI_MUX_HOST; do
                verbose 2 shpkg_ci_remote "${SHPKG_CI_MUX_HOST}" "${SHPKG_REPO}" &
            done
            wait
            if [ "x${SHPKG_REPO}" == "x--upgrade" ]; then
                verbose 2 shpkg_upgrade
                exit
            fi
            if [ "x${SHPKG_REPO}" == "x--clean" ]; then
                exit
            fi
        fi
        ( cd "${SHPKG_CI_DIR}/status" &&
              for I in $(ls */*/*.status | cut -d / -f 3 | sort -u); do
                  {
                      if grep -q running */*/"$I"; then
                          echo running
                      elif grep -q ko */*/"$I"; then
                          echo ko
                      else
                          echo ok
                      fi
                  } > "${SHPKG_CI_DIR}/status/$I"
              done; )
        ( cd "${SHPKG_CI_DIR}/log" &&
              for I in $(ls */*/*.log | cut -d / -f 3 | sort -u); do
                  TITLE="$I"
                  STATUS="$(cat "${SHPKG_CI_DIR}/status/$(basename "$I" .log).status" || echo unknown)"
                  IMG="$(basename "$I" .log).png"
                  {
                      cat <<EOF
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8"/>
        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
        <title>${TITLE}</title>
        <link rel="stylesheet" href="/_assets/app.css">
        <script defer type="text/javascript" src="/_assets/app.js"></script>
        <link rel="icon" type="image/png" sizes="64x64" href="${IMG}">
      </head>
      <body>
        <div class="ci-header">
          <a href="./"><i class="fas fa-asterisk"></i> All logs</a>
        </div>
        <p>
          <h1>
            <img src="${IMG}" class="status-${STATUS}"/>
            ${TITLE}
          </h1>
          <ul class="list-group">
    EOF
                      for F in */*/"$I"; do
                          F_STATUS="$(cat "${SHPKG_CI_DIR}/status/$(echo "$F" | sed -e 's/[.]log$/.status/')" || echo unknown)"
                          F_IMG="$(echo "$F" | sed -e 's/[.]log$/.png/')"
                          cat <<EOF
            <li class="list-group-item">
              <a href="$F.html">
                <img src="${F_IMG}" class="status-${F_STATUS}"/>
                $F.html
              </a>
            </li>
    EOF
                      done
                      cat <<EOF
          </ul>
        </p>
      </body>
    </html>
    EOF
                  } > "${SHPKG_CI_DIR}/log/$I.html"
              done; )
        verbose 2 shpkg_ci_status2png
    }
    
    shpkg_log shpkg_ci_mux main "$@"