How can I check if a PPA has packages for another Ubuntu version?

This can be scripted... It'll need altered versions of two of my previous answers: one to get a list of all the PPAs and another to check if a URL is live. With those two techniques we can build a real launchpad URL and test it.

dist="saucy"
ppas=$(grep -RoPish "ppa.launchpad.net/[^/]+/[^/ ]+" /etc/apt | sort -u)
while read -r ppa; do
    url="http://$ppa/ubuntu/dists/$dist/"
    if [[ $(wget -O /dev/null "$url" 2>&1|grep "200 OK"|wc -l) == "0" ]]; then
        echo "$ppa does not have a $dist version"
    fi
done <<< "$ppas"

It's an ugly script but it's so beautiful at the same time.


With the inspiration of @Oli's answer and what I shared here, I've put some scripts together to validate existing PPAs as well as validating given PPA / URL before they are added.

check_all_ppa_validity also returns a list of failed PPAs, so, these can be removed/disabled if desired.

#!/bin/bash

COL_RED="\e[31m"
COL_GRN="\e[32m"
COL_YEL="\e[33m"
COL_BLU="\e[34m"
COL_MAG="\e[35m"
COL_DFL="\e[39m"

function func_print_ok_message() {
    echo -e "${COL_GRN}`date +"%D-%T"` ok  :${COL_DFL} ""$1" | tee -a install.log
}

function func_print_fail_message() {
    echo -e "${COL_RED}`date +"%D-%T"` fail:${COL_DFL} ""$1" | tee -a install.log
}

function func_print_warn_message() {
    echo -e "${COL_YEL}`date +"%D-%T"` warn:${COL_DFL} ""$1" | tee -a install.log
}

function func_print_info_message() {
    echo -e "${COL_BLU}`date +"%D-%T"` warn:${COL_DFL} ""$1" | tee -a install.log
}

function func_print_dbg_message() {
    if [ ! -z "$BASH_GEN_DBG" ]; then
    echo -e "${COL_MAG}`date +"%D-%T"` warn:${COL_DFL} ""$1" | tee -a install.log
    fi
}

function add_ppa() {
  local __ppa_name=""
  for __ppa_name_to_check in "$@"; do
    grep -h "^deb.*$__ppa_name_to_check" /etc/apt/sources.list.d/* > /dev/null 2>&1
    if [ "$?" != "0" ]
    then
        local __is_ppa_valid=""
        check_if_ppa_is_valid "__is_ppa_valid" "$__ppa_name_to_check"
        if [ "$__is_ppa_valid" == "0" ]; then
            echo "Adding ppa:$__ppa_name_to_check"
            sudo add-apt-repository -y ppa:$__ppa_name_to_check
            func_print_ok_message "add_ppa: $__ppa_name_to_check"
        else
            func_print_fail_message "add_ppa: $__ppa_name_to_check"
        fi
    else
        func_print_info_message "repo already exists ppa:$__ppa_name_to_check"
    fi
  done
}

function check_all_ppa_validity() {
    local __invalid_ppa_list=()
    for __ppa_to_chk in `grep -RoPish "ppa.launchpad.net/[^/]+/[^/ ]+" /etc/apt | sort -u | uniq | cut -d"/" -f2-`; do
        check_if_ppa_is_valid "__is_ppa_valid" "$__ppa_to_chk"
        if [ "$__is_ppa_valid" == "0" ]; then
            func_print_ok_message "check_ppa: $__ppa_to_chk"
        else
            func_print_fail_message "check_ppa: $__ppa_to_chk"
            __invalid_ppa_list+=("$__ppa_to_chk")
        fi
    done
    eval "$1=(${__invalid_ppa_list[*]})"
}

function check_if_ppa_is_valid() {
    local __ppa_name="$2"
    local __ppa_prefix=$(echo $__ppa_name | cut -d"/" -f1)
    local __ppa_suffix=${__ppa_name##*/}
    curl -fsSL https://launchpad.net/~"$__ppa_prefix"/+archive/ubuntu/"$__ppa_suffix" &>/dev/stdout | grep "\"`lsb_release -sc`\"" -m1 >/dev/null 2>&1
    eval "$1=\"$?\""
}

# example use
add_ppa "wireshark-dev/stable"
add_to_sources_list "http://gb.archive.ubuntu.com/ubuntu/" "multiverse"
check_if_ppa_is_valid is_valid "wireshark-dev/stable"
check_all_ppa_validity invalid_ppa_list && echo "invalid ppas: ${invalid_ppa_list[@]}"

This and more is available on this repo, under post_install/common_bash_funcs.sh.