diff --git a/mingw-w64-epydoc/0001-handle-docutils-0.6.patch b/mingw-w64-epydoc/0001-handle-docutils-0.6.patch new file mode 100644 index 0000000000..53f941c981 --- /dev/null +++ b/mingw-w64-epydoc/0001-handle-docutils-0.6.patch @@ -0,0 +1,47 @@ +# Description: Handle problems encountered with docutils 0.6. +# The problem here is that the child.data element does not always exist any +# more. Apparently, the child element is sometimes a string instead. So, we +# work around it by only executing the code in question if child.data can be +# referenced. Thanks to Thomas Hille for research and the initial patch. +# Bug-Debian: http://bugs.debian.org/561793 +# Author: Kenneth J. Pronovici +--- a/epydoc/markup/restructuredtext.py ++++ b/epydoc/markup/restructuredtext.py +@@ -304,13 +304,14 @@ class _SummaryExtractor(NodeVisitor): + # Extract the first sentence. + for child in node: + if isinstance(child, docutils.nodes.Text): +- m = self._SUMMARY_RE.match(child.data) +- if m: +- summary_pieces.append(docutils.nodes.Text(m.group(1))) +- other = child.data[m.end():] +- if other and not other.isspace(): +- self.other_docs = True +- break ++ if hasattr(child, 'data'): ++ m = self._SUMMARY_RE.match(child.data) ++ if m: ++ summary_pieces.append(docutils.nodes.Text(m.group(1))) ++ other = child.data[m.end():] ++ if other and not other.isspace(): ++ self.other_docs = True ++ break + summary_pieces.append(child) + + summary_doc = self.document.copy() # shallow copy +@@ -489,10 +490,11 @@ class _SplitFieldsTranslator(NodeVisitor + if (len(fbody[0]) > 0 and + isinstance(fbody[0][0], docutils.nodes.Text)): + child = fbody[0][0] +- if child.data[:1] in ':-': +- child.data = child.data[1:].lstrip() +- elif child.data[:2] in (' -', ' :'): +- child.data = child.data[2:].lstrip() ++ if hasattr(child, 'data'): ++ if child.data[:1] in ':-': ++ child.data = child.data[1:].lstrip() ++ elif child.data[:2] in (' -', ' :'): ++ child.data = child.data[2:].lstrip() + + # Wrap the field body, and add a new field + self._add_field(tagname, arg, fbody) diff --git a/mingw-w64-epydoc/0002-python26-tokenizer.patch b/mingw-w64-epydoc/0002-python26-tokenizer.patch new file mode 100644 index 0000000000..c4956adc57 --- /dev/null +++ b/mingw-w64-epydoc/0002-python26-tokenizer.patch @@ -0,0 +1,65 @@ +# Description: Fix the tokenizer so comment docstrings work with Python 2.6. +# Bug: https://sourceforge.net/tracker/index.php?func=detail&aid=2585292&group_id=32455&atid=405618 +# Bug-Debian: http://bugs.debian.org/590112 +# Origin: https://sourceforge.net/tracker/?func=detail&aid=2872545&group_id=32455&atid=405620 +# Author: Andre Malo (ndparker) +# Reviewed-by: Kenneth J. Pronovici +--- a/epydoc/docparser.py ++++ b/epydoc/docparser.py +@@ -72,6 +72,26 @@ + from epydoc.compat import * + + ###################################################################### ++## Tokenizer change in 2.6 ++###################################################################### ++ ++def comment_includes_nl(): ++ """ Determine whether comments are parsed as one or two tokens... """ ++ readline = iter(u'\n#\n\n'.splitlines(True)).next ++ tokens = [ ++ token.tok_name[tup[0]] for tup in tokenize.generate_tokens(readline) ++ ] ++ if tokens == ['NL', 'COMMENT', 'NL', 'ENDMARKER']: ++ return True ++ elif tokens == ['NL', 'COMMENT', 'NL', 'NL', 'ENDMARKER']: ++ return False ++ raise AssertionError( ++ "Tokenizer returns unexexpected tokens: %r" % tokens ++ ) ++ ++comment_includes_nl = comment_includes_nl() ++ ++###################################################################### + ## Doc Parser + ###################################################################### + +@@ -520,6 +540,10 @@ + # inside that block, not outside it. + start_group = None + ++ # If the comment tokens do not include the NL, every comment token ++ # sets this to True in order to swallow the next NL token unprocessed. ++ comment_nl_waiting = False ++ + # Check if the source file declares an encoding. + encoding = get_module_encoding(module_doc.filename) + +@@ -570,7 +594,9 @@ + # then discard them: blank lines are not allowed between a + # comment block and the thing it describes. + elif toktype == tokenize.NL: +- if comments and not line_toks: ++ if comment_nl_waiting: ++ comment_nl_waiting = False ++ elif comments and not line_toks: + log.warning('Ignoring docstring comment block followed by ' + 'a blank line in %r on line %r' % + (module_doc.filename, srow-1)) +@@ -578,6 +604,7 @@ + + # Comment token: add to comments if appropriate. + elif toktype == tokenize.COMMENT: ++ comment_nl_waiting = not comment_includes_nl + if toktext.startswith(COMMENT_DOCSTRING_MARKER): + comment_line = toktext[len(COMMENT_DOCSTRING_MARKER):].rstrip() + if comment_line.startswith(" "): diff --git a/mingw-w64-epydoc/0003-string-exceptions.patch b/mingw-w64-epydoc/0003-string-exceptions.patch new file mode 100644 index 0000000000..eca9793f57 --- /dev/null +++ b/mingw-w64-epydoc/0003-string-exceptions.patch @@ -0,0 +1,18 @@ +# Description: Get rid of string exceptions. +# One of the changes brought by Python 2.6 is the removal of string +# exceptions. A mass bug filing identified Epydoc as having potential +# problems. I later spot-checked all of the exceptions in the code, and I +# believe this is the only one that we have to worry about. +# Bug-Debian: http://bugs.debian.org/585290 +# Author: Kenneth J. Pronovici +--- a/epydoc/apidoc.py ++++ b/epydoc/apidoc.py +@@ -1352,7 +1352,7 @@ class ClassDoc(NamespaceDoc): + nothead=[s for s in nonemptyseqs if cand in s[1:]] + if nothead: cand=None #reject candidate + else: break +- if not cand: raise "Inconsistent hierarchy" ++ if not cand: raise TypeError("Inconsistent hierarchy") + res.append(cand) + for seq in nonemptyseqs: # remove cand + if seq[0] == cand: del seq[0] diff --git a/mingw-w64-epydoc/PKGBUILD b/mingw-w64-epydoc/PKGBUILD new file mode 100644 index 0000000000..764deb04c4 --- /dev/null +++ b/mingw-w64-epydoc/PKGBUILD @@ -0,0 +1,62 @@ +# Maintainer: Alexey Pavlov + +_realname=epydoc +pkgbase=mingw-w64-${_realname} +pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}" +pkgver=3.0.1 +pkgrel=1 +pkgdesc="Tool for generating API documentation for Python modules, based on their docstrings (mingw-w64)" +arch=('any') +url="https://epydoc.sourceforge.net/" +license=("MIT") +makedepends=("${MINGW_PACKAGE_PREFIX}-gcc" + "${MINGW_PACKAGE_PREFIX}-pkg-config") +depends=("${MINGW_PACKAGE_PREFIX}-python2" + "${MINGW_PACKAGE_PREFIX}-python2-docutils") +optdepends=("${MINGW_PACKAGE_PREFIX}-tk: needed for epydocgui" + #"${MINGW_PACKAGE_PREFIX}-texlive-bin: needed for PDF conversion" + "${MINGW_PACKAGE_PREFIX}-graphviz: needed for graph generation") +options=('strip' 'staticlibs') +source=("https://downloads.sourceforge.net/sourceforge/${_realname}/${_realname}-${pkgver}.zip" + 0001-handle-docutils-0.6.patch + 0002-python26-tokenizer.patch + 0003-string-exceptions.patch) +sha256sums=('574c1dca1b0e8783be0121c32f589cf56255cdb288b4d4e52e60f0a8bcf799cb' + '84d6724e0fcb3a5307963cbe37875e72110bf707781c64e7ddff0dfe96eeb1ab' + '8bfd54be68ee8e743ab470370042e40130e9cf8c0430d493401fa44eae2d66f6' + '099a94ba394f0c1c4f3f721fc3c9cf982a54f182be457faa03a7bb54188c8364') + +prepare() { + cd "${srcdir}"/${_realname}-${pkgver} + + # py2 fix + sed -i "s|env python|&2|" `grep -Erl "env python" .` + + patch -p1 -i ${srcdir}/0001-handle-docutils-0.6.patch + patch -p1 -i ${srcdir}/0002-python26-tokenizer.patch + patch -p1 -i ${srcdir}/0003-string-exceptions.patch +} + +build() { + [[ -d ${srcdir}/build-${MINGW_CHOST} ]] && rm -rf ${srcdir}/build-${MINGW_CHOST} + cp -rf ${_realname}-${pkgver} build-${MINGW_CHOST} + cd "${srcdir}/build-${MINGW_CHOST}" + ${MINGW_PREFIX}/bin/python2 setup.py build +} + +package() { + cd "${srcdir}/build-${MINGW_CHOST}" + MSYS2_ARG_CONV_EXCL="--prefix=;--install-scripts=;--install-platlib=" \ + ${MINGW_PREFIX}/bin/python2 setup.py install --prefix=${MINGW_PREFIX} \ + --root="${pkgdir}" --optimize=1 --skip-build + + # fix python command in files + local _mingw_prefix=$(cygpath -am ${MINGW_PREFIX}) + for _f in "${pkgdir}${MINGW_PREFIX}"/bin/*; do + sed -e "s|${_mingw_prefix}/bin/|/usr/bin/env |g" -i ${_f} + done + + install -d "${pkgdir}${MINGW_PREFIX}/share/man/man1" + install -m644 man/*.1 "${pkgdir}${MINGW_PREFIX}/share/man/man1" + install -Dm644 LICENSE.txt "${pkgdir}${MINGW_PREFIX}/share/licenses/${_realname}/LICENSE" +}