#!@@SHELL@@ # # 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 . . @@LIBDIR@@/opkhelper/messages oh_changelog_parse_error() { _file="${1}" _line_nr="${2}" _error="${3}" _expect_id="${4}" case "${_expect_id}" in FIRST_HEADING) _expect_str='first heading';; NEXT_OR_EOF) _expect_str='next heading or eof';; START_CHANGES) _expect_str='start of change data';; CHANGES_OR_TRAILER) _expect_str='more change data or trailer';; *) _expect_str='unknown';; esac _file_info=$(printf '%20s(l%d):' "${_file}" "${_line_nr}") oh_warn "${_file_info} ${_error}" "${_expect_str}" } oh_changelog_parse() { # Parsing logic based on that of dpkg. _file="${1}" _cb="${2}" _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 oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'found blank line where expected %s' "${_expect}" else _blank_lines="${_blank_lines} ${_line}" fi elif [ "${_line# }" = "${_line}" ]; then if [ "${_expect}" != FIRST_HEADING -a \ "${_expect}" != NEXT_OR_EOF ]; then oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'found start of entry where expected %s' "${_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 oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'badly formatted heading line' OH_CHANGELOG_SOURCE= OH_CHANGELOG_VERSION= OH_CHANGELOG_DISTRIBUTION= OH_CHANGELOG_CHANGES= else 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 oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'found trailer where expected %s' "${_expect}" fi _line="${_line# -- }" _maintainer="${_line%% *}" _date="${_line#* }" if [ -z "${_maintainer}" -o -z "${_date}" -o \ "${_maintainer}" = "${_date}" ]; then oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'badly formatted trailer line' OH_CHANGELOG_MAINTAINER= OH_CHANGELOG_DATE= elif [ -n "${OH_CHANGELOG_SOURCE}" ]; then OH_CHANGELOG_MAINTAINER="${_maintainer}" OH_CHANGELOG_DATE="${_date}" "${_cb}" _entries=$(($_entries + 1)) fi _expect=NEXT_OR_EOF _blank_lines= elif [ "${_line# --}" != "${_line}" ]; then oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'badly formatted trailer line' elif [ "${_line## }" != "${_line}" ]; then if [ "${_expect}" != START_CHANGES -a \ "${_expect}" != CHANGES_OR_TRAILER ]; then oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'found change data where expected %s' "${_expect}" fi OH_CHANGELOG_CHANGES="${OH_CHANGELOG_CHANGES} ${_blank_lines}${_line}" _expect=CHANGES_OR_TRAILER _blank_lines= else oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'unrecognized line' _blank_lines= fi done <"${_file}" if [ "${_expect}" != NEXT_OR_EOF ]; then oh_changelog_parse_error "${_file}" "${_line_nr}" \ 'found eof where expected %s' "${_expect}" fi return ${_entries} }