# opkhelper # lib/changelog # Functions for parsing changelogs. # # Copyright (C) 2012 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . [ -n "${_OH_CHANGELOG_SH}" ] && return 0 _OH_CHANGELOG_SH=true . @@LIBDIR@@/messages . @@LIBDIR@@/locale . @@LIBDIR@@/util # Constant global parameters: OH_SOURCE_RE='^[a-z0-9][a-z0-9+.-]+$' OH_SOURCE_VERSION_ID_RE='^' OH_SOURCE_VERSION_ID_RE="${OH_SOURCE_VERSION_ID_RE}"'[0-9a-z.~]+' OH_SOURCE_VERSION_ID_RE="${OH_SOURCE_VERSION_ID_RE}"'(\+sip[1-9][0-9]*)?' OH_SOURCE_VERSION_ID_RE="${OH_SOURCE_VERSION_ID_RE}"'(-[1-9][0-9]*)?' OH_SOURCE_VERSION_ID_RE="${OH_SOURCE_VERSION_ID_RE}"'(\+[a-z0-9]+-[1-9][0-9]*)?' OH_SOURCE_VERSION_ID_RE="${OH_SOURCE_VERSION_ID_RE}"'$' _changelog_parse_error() { _line_nr="${1}" _error="${2}" shift 2 _file_info=$(printf '%20s(l%d):' "${OH_SOURCE_DIR}/changelog" "${_line_nr}") oh_warn "${_file_info} ${_error}" "${@}" } _changelog_get_expect_str() { eval echo \$\{oh_str_changelog_expect_"${1}"\} } oh_changelog_parse() { # Parsing logic based on that of dpkg. _cb="${1}" _expect=first_heading _line_nr=0 _entries=0 while IFS= read _line; do _line_nr=$(($_line_nr + 1)) if [ -z "${_line}" ]; then if [ "${_expect}" = start_changes ]; then OH_CHANGELOG_CHANGES="${OH_CHANGELOG_CHANGES} ${_line}" elif [ "${_expect}" = next_or_eof ]; then : elif [ "${_expect}" != changes_or_trailer ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_found_blank_line}" \ "$(_changelog_get_expect_str "${_expect}")" else _blank_lines="${_blank_lines} ${_line}" fi elif [ "${_line# }" = "${_line}" ]; then if [ "${_expect}" != first_heading -a \ "${_expect}" != next_or_eof ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_found_heading}" \ "$(_changelog_get_expect_str "${_expect}")" fi _source="${_line%% (*}" _line_="${_line#* (}" _distribution="${_line_##*) }" _line_="${_line_%) *}" _version="${_line_}" if [ -z "${_source}" -o -z "${_distribution}" -o \ -z "${_version}" -o \ "${_version% *}" != "${_version}" ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_bad_heading}" OH_CHANGELOG_SOURCE= OH_CHANGELOG_VERSION= OH_CHANGELOG_DISTRIBUTION= OH_CHANGELOG_CHANGES= else echo "${_source}" | \ grep -E "${OH_SOURCE_RE}" >/dev/null 2>&1 if [ "${?}" -ne 0 ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_bad_source}" "${source}" fi echo "${_version}" | \ grep -E "${OH_SOURCE_VERSION_ID_RE}" >/dev/null 2>&1 if [ "${?}" -ne 0 ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_bad_source_version}" "${_version}" fi OH_CHANGELOG_SOURCE="${_source}" OH_CHANGELOG_VERSION="${_version}" OH_CHANGELOG_DISTRIBUTION="${_distribution}" OH_CHANGELOG_CHANGES="${_line}" fi _expect=start_changes _blank_lines= elif [ "${_line# -- }" != "${_line}" ]; then if [ "${_expect}" != changes_or_trailer ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_found_trailer}" \ "$(_changelog_get_expect_str "${_expect}")" fi _line="${_line# -- }" _maintainer="${_line%% *}" _date="${_line#* }" if [ -z "${_maintainer}" -o -z "${_date}" -o \ "${_maintainer}" = "${_date}" ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_bad_trailer}" OH_CHANGELOG_MAINTAINER= OH_CHANGELOG_DATE= elif [ -n "${OH_CHANGELOG_SOURCE}" ]; then OH_CHANGELOG_MAINTAINER="${_maintainer}" OH_CHANGELOG_DATE="${_date}" _entries=$(($_entries + 1)) "${_cb}" [ ${?} -ne 0 ] && return ${_entries} fi _expect=next_or_eof _blank_lines= elif [ "${_line# --}" != "${_line}" ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_bad_trailer}" elif [ "${_line## }" != "${_line}" ]; then if [ "${_expect}" != start_changes -a \ "${_expect}" != changes_or_trailer ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_found_change}" \ "$(_changelog_get_expect_str "${_expect}")" fi OH_CHANGELOG_CHANGES="${OH_CHANGELOG_CHANGES} ${_blank_lines}${_line}" _expect=changes_or_trailer _blank_lines= else _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_bad_line}" _blank_lines= fi done <"${OH_SOURCE_DIR}/changelog" if [ "${_expect}" != next_or_eof ]; then _changelog_parse_error "${_line_nr}" \ "${oh_str_changelog_found_eof}" \ "$(_changelog_get_expect_str "${_expect}")" fi return ${_entries} }