github.com/web-platform-tests/wpt.fyi@v0.0.0-20240530210107-70cf978996f1/git/hooks/pre-push (about)

     1  #!/bin/bash
     2  
     3  REPO_DIR="$(git rev-parse --show-toplevel)"
     4  source "${REPO_DIR}/util/logging.sh"
     5  source "${REPO_DIR}/util/commands.sh"
     6  
     7  DOCKER_INSTANCE="${DOCKER_INSTANCE:-wptd-dev-instance}"
     8  
     9  info "Checking where we're pushing..."
    10  IS_MASTER="false"
    11  while read local_ref local_sha remote_ref remote_sha
    12  do
    13    debug "$local_ref $local_sha $remote_ref $remote_sha"
    14    if [[ -n "$remote_ref" ]];
    15    then
    16      if [[ "$(echo $remote_ref | sed -e 's,.*/\(.*\),\1,')" == "master" ]]
    17      then
    18        IS_MASTER="true"
    19      fi
    20    fi
    21  done
    22  
    23  if [[ "${IS_MASTER}" == "true" ]]
    24  then
    25    confirm "Are you sure you want to push master?" || fatal "User cancelled the push"
    26  fi
    27  
    28  # Check for uncommitted changes.
    29  info "Checking for uncommitted changes..."
    30  ! git diff . 2>&1 | read > /dev/null 2>&1
    31  DIFF_STATUS="${?}"
    32  if [ "${DIFF_STATUS}" != "0" ]; then
    33    confirm "You have uncommitted local changes. Push committed changes anyway?" \
    34        || fatal "User cancelled the push"
    35  fi
    36  
    37  info "Running pre-push checks in docker..."
    38  docker inspect "${DOCKER_INSTANCE}" > /dev/null 2>&1
    39  INSPECT_STATUS="${?}"
    40  
    41  DOCKER_INSTANCE_PID=""
    42  if [ "${INSPECT_STATUS}" != "0" ]; then
    43    info "Docker instance ${DOCKER_INSTANCE} not found. Starting it..."
    44    docker run -t -d --entrypoint /bin/bash \
    45        -v "${WPTD_PATH}":/home/user/wpt.fyi \
    46        -u $(id -u $USER):$(id -g $USER) \
    47        --name "${DOCKER_INSTANCE}" wptd-dev &
    48    DOCKER_INSTANCE_PID="${!}"
    49    # Ensure rights.
    50    wptd_useradd
    51    wptd_chown "/home/user"
    52  else
    53    info "Found existing docker instance ${DOCKER_INSTANCE}"
    54  fi
    55  
    56  docker exec -t -u $(id -u $USER):$(id -g $USER) "${DOCKER_INSTANCE}" make prepush
    57  LINT_STATUS="${?}"
    58  FINAL_STATUS="${LINT_STATUS}"
    59  if [ "${LINT_STATUS}" != "0" ]; then
    60    confirm "Lint failed. Push anyway?" || fatal "User cancelled the push"
    61    info "Pushing in spite of lint errors..."
    62    FINAL_STATUS="0"
    63  fi
    64  
    65  if [ "${DOCKER_INSTANCE_PID}" != "" ]; then
    66    kill "${DOCKER_INSTANCE_PID}"
    67  fi
    68  
    69  if [ "${FINAL_STATUS}" == "0" ]; then
    70    info "Pre-push exit status: ${FINAL_STATUS}"
    71  else
    72    error "Pre-push exit status: ${FINAL_STATUS}"
    73  fi
    74  
    75  exit "${FINAL_STATUS}"