| #!/bin/bash -e | |
| # | |
| # get-latest-series: Download latest patch series from Patchwork | |
| # | |
| # Copyright (C) 2023 BayLibre Inc. | |
| # | |
| # SPDX-License-Identifier: GPL-2.0-only | |
| # | |
| # the interval into the past which we want to check for new series, in minutes | |
| INTERVAL_MINUTES=30 | |
| # Maximum number of series to retrieve. the Patchwork API can support up to 250 | |
| # at once | |
| SERIES_LIMIT=250 | |
| # Location to save patches | |
| DOWNLOAD_PATH="." | |
| # Name of the file to use/check as a log of previously-tested series IDs | |
| SERIES_TEST_LOG=".series_test.log" | |
| # Patchwork project to pull series patches from | |
| PROJECT="oe-core" | |
| # The Patchwork server to pull from | |
| SERVER="https://patchwork.yoctoproject.org/api/1.2/" | |
| help() | |
| { | |
| echo "Usage: get-latest-series [ -i | --interval MINUTES ] | |
| [ -d | --directory DIRECTORY ] | |
| [ -l | --limit COUNT ] | |
| [ -h | --help ] | |
| [ -t | --tested-series LOGFILE] | |
| [ -p | --project PROJECT ] | |
| [ -s | --server SERVER ]" | |
| exit 2 | |
| } | |
| while [ "$1" != "" ]; do | |
| case $1 in | |
| -i|--interval) | |
| INTERVAL_MINUTES=$2 | |
| shift 2 | |
| ;; | |
| -l|--limit) | |
| SERIES_LIMIT=$2 | |
| shift 2 | |
| ;; | |
| -d|--directory) | |
| DOWNLOAD_PATH=$2 | |
| shift 2 | |
| ;; | |
| -p|--project) | |
| PROJECT=$2 | |
| shift 2 | |
| ;; | |
| -s|--server) | |
| SERVER=$2 | |
| shift 2 | |
| ;; | |
| -t|--tested-series) | |
| SERIES_TEST_LOG=$2 | |
| shift 2 | |
| ;; | |
| -h|--help) | |
| help | |
| ;; | |
| *) | |
| echo "Unknown option $1" | |
| help | |
| ;; | |
| esac | |
| done | |
| # The time this script is running at | |
| START_TIME=$(date --date "now" +"%Y-%m-%dT%H:%M:%S") | |
| # the corresponding timestamp we want to check against for new patch series | |
| SERIES_CHECK_LIMIT=$(date --date "now - ${INTERVAL_MINUTES} minutes" +"%Y-%m-%dT%H:%M:%S") | |
| echo "Start time is $START_TIME" | |
| echo "Series check limit is $SERIES_CHECK_LIMIT" | |
| # Create DOWNLOAD_PATH if it doesn't exist | |
| if [ ! -d "$DOWNLOAD_PATH" ]; then | |
| mkdir "${DOWNLOAD_PATH}" | |
| fi | |
| # Create SERIES_TEST_LOG if it doesn't exist | |
| if [ ! -f "$SERIES_TEST_LOG" ]; then | |
| touch "${SERIES_TEST_LOG}" | |
| fi | |
| # Retrieve a list of series IDs from the 'git-pw series list' output. The API | |
| # supports a maximum of 250 results, so make sure we allow that when required | |
| SERIES_LIST=$(git-pw --project "${PROJECT}" --server "${SERVER}" series list --since "${SERIES_CHECK_LIMIT}" --limit "${SERIES_LIMIT}" | awk '{print $2}' | xargs | sed -e 's/[^0-9 ]//g') | |
| if [ -z "$SERIES_LIST" ]; then | |
| echo "No new series for project ${PROJECT} since ${SERIES_CHECK_LIMIT}" | |
| exit 0 | |
| fi | |
| # Check each series ID | |
| for SERIES in $SERIES_LIST; do | |
| # Download the series only if it's not found in the SERIES_TEST_LOG | |
| if ! grep -w --quiet "${SERIES}" "${SERIES_TEST_LOG}"; then | |
| echo "Downloading $SERIES..." | |
| git-pw series download --separate "${SERIES}" "${DOWNLOAD_PATH}" | |
| echo "${SERIES}" >> "${SERIES_TEST_LOG}" | |
| else | |
| echo "Already tested ${SERIES}. Skipping..." | |
| fi | |
| done |