summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorP. J. McDermott <pjm@nac.net>2012-07-26 01:18:31 (EDT)
committer P. J. McDermott <pjm@nac.net>2012-07-26 01:21:02 (EDT)
commit129aee4288fe239b8c46bd283977ac1667feac37 (patch)
treecef612ca73e575f3a1a00b6774af3295344579cb /lib
parent246deee73bc228f7da7bc2588bb59b08ac2eb843 (diff)
Add oh-parsechangelog.
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.in2
-rw-r--r--lib/changelog.sh145
2 files changed, 146 insertions, 1 deletions
diff --git a/lib/Makefile.in b/lib/Makefile.in
index 4e9ecdf..ecf1e3a 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -28,7 +28,7 @@ LIBDIR = @libdir@
.SUFFIXES:
.SUFFIXES: .sh
-SRCS = controlfields.sh architecture.sh archive.sh messages.sh
+SRCS = controlfields.sh architecture.sh archive.sh messages.sh changelog.sh
OBJS = $(SRCS:.sh=)
PACKAGE = @package@
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}
+}