aboutsummaryrefslogblamecommitdiff
path: root/scripts/assert-content.sh
blob: f9ea345563817e3d14c333646acd25ffcc942245 (plain) (tree)






















                                                    















                                              


                      


                         

                                                 
                                                     

                                               
    



                                                       

                                               
                                        





                                                           


                         
                                                                                                                          
                                                       
                          
                                                            

                                

    




                                                               


                                                       
                          
                                                            

                              

                       
                                                       

                                                   
      


                                                          


              
#!/usr/bin/env bash
set -Eeuo pipefail

JSON="${1:-}"
[[ -z "${JSON}" ]] && {
  echo 'Missing input JSON file.'
  exit 2
}

contains-element() {
  local e match="$1"
  shift
  for e; do [[ "$e" == "$match" ]] && return 0; done
  return 1
}

fail-attr() {
  ATTRIBUTE="${1}"
  URL="${2}"
  red "Undefined '${ATTRIBUTE}' for ${URL}." >&2
  exit 1
}

get-lang() {
  echo "${1}" | base64 --decode | jq -r .lang
}

get-ref() {
  echo "${1}"  | base64 --decode | jq -r .ref
}

get-url() {
  echo "${1}"  | base64 --decode | jq -r .url
}

get-date() {
  echo "${1}"  | base64 --decode | jq -r .date
}

LANGS=(en pt)
assert-frontmatter() {
  F="${1}"
  LANG="$(get-lang "$F")"
  REF="$(get-ref "$F")"
  URL="$(get-url "$F")"
  [[ -z "${LANG}" ]] && fail-attr 'lang' "${URL}"
  [[ -z "${REF}" ]]  && fail-attr 'ref'  "${URL}"
  if ! contains-element "${LANG}" "${LANGS[@]}"; then
    red "Invalid lang '${LANG}' in ${URL}." >&2
    exit 1
  fi
}

echo Linting posts... >&2
for post in $(jq -r '.posts[] | @base64' "${JSON}"); do
  assert-frontmatter "$post"
  DATE="$(get-date "$post" | awk '{print $1}')"
  URL="$(basename "$(get-url "$post")")"
  FILE="_posts/${DATE}-${URL%.html}.md"

  [[ -f "${FILE}" ]] || {
    red "date/filename mismatch: '${FILE}' does not exist."
    exit 1
  }
done

echo Linting pages... >&2
IGNORED_PAGES=(/site.json /sitemap.xml /rss.xml /atom.xml /feed.atom /feed.xml /feed.all.atom /feed.en.atom /feed.pt.atom)
for page in $(jq -r '.pages[] | @base64' "${JSON}"); do
  URL="$(get-url "$page")"
  if ! contains-element "${URL}" "${IGNORED_PAGES[@]}"; then
    assert-frontmatter "${page}"
  fi
done

echo Linting pastebins... >&2
for pastebin in $(jq -r '.pastebins[] | @base64' "${JSON}"); do
  assert-frontmatter "$pastebin"
done

echo Asserting unique refs... >&2
KNOWN_IDS=()
for page in $(jq -r '.pages[] | @base64' "${JSON}"); do
  URL="$(get-url "$page")"
  if ! contains-element "${URL}" "${IGNORED_PAGES[@]}"; then
    LANG="$(get-lang "$page")"
    REF="$(get-ref "$page")"
    ID="${LANG}:${REF}"

    if contains-element "${ID}" "${KNOWN_IDS[@]}"; then
      red "Duplicated lang:ref match: '${ID}'." >&2
      exit 1
    fi

    KNOWN_IDS+=("${ID}") # printf '%s\n' "${KNOWN_IDS[@]}"
  fi
done

echo Done. >&2