diff options
Diffstat (limited to 'lib/changelog.sh')
-rw-r--r-- | lib/changelog.sh | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/lib/changelog.sh b/lib/changelog.sh new file mode 100644 index 0000000..81e3332 --- /dev/null +++ b/lib/changelog.sh @@ -0,0 +1,145 @@ +#!@@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 <http://www.gnu.org/licenses/>. + +. @@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} +} |