diff options
| -rw-r--r-- | libbson-issue1068.patch | 11 | ||||
| -rw-r--r-- | libbson.spec | 25 | ||||
| -rw-r--r-- | mallard2man.py | 358 | 
3 files changed, 30 insertions, 364 deletions
diff --git a/libbson-issue1068.patch b/libbson-issue1068.patch new file mode 100644 index 0000000..262887f --- /dev/null +++ b/libbson-issue1068.patch @@ -0,0 +1,11 @@ +--- Makefile.in.ol	2016-01-21 10:52:15.347439341 +0100 ++++ Makefile.in	2016-01-21 10:52:45.601555239 +0100 +@@ -1869,7 +1869,7 @@ + 	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \ + 	  fi; \ + 	done; \ +-	for i in $$list; do echo "$$i"; done | $(am__base_list) | \ ++	for i in $$list; do echo "$$i"; done | sort -u | $(am__base_list) | \ + 	while read files; do \ + 	  test -z "$$files" || { \ + 	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \ diff --git a/libbson.spec b/libbson.spec index 446cea5..53f5c1d 100644 --- a/libbson.spec +++ b/libbson.spec @@ -1,6 +1,6 @@ -# spec file for libbson +# remirepo spec file for libbson  # -# Copyright (c) 2015 Remi Collet +# Copyright (c) 2015-2016 Remi Collet  # License: CC-BY-SA  # http://creativecommons.org/licenses/by-sa/4.0/  # @@ -19,14 +19,15 @@  Name:      libbson  Summary:   Library to build, parse, and iterate BSON documents -Version:   1.3.0 +Version:   1.3.1  Release:   1%{?dist}  License:   ASL 2.0  Group:     System Environment/Libraries  URL:       https://github.com/%{gh_owner}/%{gh_project}  Source0:   https://github.com/%{gh_owner}/%{gh_project}/releases/download/%{version}%{?prever:-%{prever}}/%{gh_project}-%{version}%{?prever:-%{prever}}.tar.gz -# https://jira.mongodb.org/browse/CDRIVER-1039 -Source1:   https://raw.githubusercontent.com/mongodb/libbson/master/doc/mallard2man.py + +# https://jira.mongodb.org/browse/CDRIVER-1068 - Man pages installation broken +Patch0:    %{name}-issue1068.patch  BuildRequires: python @@ -54,7 +55,7 @@ for %{name}.  %prep  %setup -q -n %{gh_project}-%{version}%{?prever:-%{prever}} -install -m 0755 %{SOURCE1} doc/ +%patch0 -p0 -b .orig  %build @@ -69,6 +70,11 @@ make install-man DESTDIR=%{buildroot}  rm    %{buildroot}%{_libdir}/*la  rm -r %{buildroot}%{_datadir}/doc + +# https://jira.mongodb.org/browse/CDRIVER-1069 +# Man pages are no more generated / installed +install -pm 644 doc/man/bson*.3 %{buildroot}/%{_mandir}/man3 +  # drop "generic" man pages, avoid conflicts  # https://jira.mongodb.org/browse/CDRIVER-1039  rm    %{buildroot}/%{_mandir}/man3/[c-v]* @@ -99,6 +105,13 @@ make check  %changelog +* Thu Jan 21 2016 Remi Collet <remi@fedoraproject.org> - 1.3.1-1 +- Update to 1.3.1 +- workaround for man pages are no more generated / installed +  https://jira.mongodb.org/browse/CDRIVER-1069 +- workaround for man pages installation broken +  https://jira.mongodb.org/browse/CDRIVER-1068 +  * Wed Dec 16 2015 Remi Collet <remi@fedoraproject.org> - 1.3.0-1  - Update to 1.3.0 diff --git a/mallard2man.py b/mallard2man.py deleted file mode 100644 index 20ea792..0000000 --- a/mallard2man.py +++ /dev/null @@ -1,358 +0,0 @@ -#!/usr/bin/env python - -# -# mallard2man.py -# -# Copyright (C) 2014 MongoDB, Inc. -# -# 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/>. -# - -COPYRIGHT_HOLDER = "MongoDB, Inc." -GROUP = "libbson" -BUG_URL = 'https://jira.mongodb.org/browse/CDRIVER' - -""" -This script is mean to convert a fairly basic mallard format documentation -page to a groff styled man page. -""" - -import os -import re -import sys - -import codecs -from datetime import datetime -from xml.etree import ElementTree - -INCLUDE = '{http://www.w3.org/2001/XInclude}include' -TITLE = '{http://projectmallard.org/1.0/}title' -SUBTITLE = '{http://projectmallard.org/1.0/}subtitle' -SECTION = '{http://projectmallard.org/1.0/}section' -INFO = '{http://projectmallard.org/1.0/}info' -ITEM = '{http://projectmallard.org/1.0/}item' -LISTING = '{http://projectmallard.org/1.0/}listing' -LIST = '{http://projectmallard.org/1.0/}list' -LINK = '{http://projectmallard.org/1.0/}link' -LINKS = '{http://projectmallard.org/1.0/}links' -SYNOPSIS = '{http://projectmallard.org/1.0/}synopsis' -CODE = '{http://projectmallard.org/1.0/}code' -P = '{http://projectmallard.org/1.0/}p' -SCREEN = '{http://projectmallard.org/1.0/}screen' -EM = '{http://projectmallard.org/1.0/}em' -NOTE = '{http://projectmallard.org/1.0/}note' -TABLE = '{http://projectmallard.org/1.0/}table' -TR = '{http://projectmallard.org/1.0/}tr' -TD = '{http://projectmallard.org/1.0/}td' -OUTPUT = '{http://projectmallard.org/1.0/}output' - -# Matches "\" and "-", but not "\-". -replaceables = re.compile(r'(\\(?!-))|((?<!\\)-)') - - -class Convert(object): -    title = None -    subtitle = None -    sections = None -    relpath = None - -    def __init__(self, inFile, outFile, section): -        self.inFile = inFile -        self.relpath = os.path.dirname(inFile) -        self.outFile = outFile -        self.section = section -        self.sections = [] - -        # Map: section id -> section element. -        self.sections_map = {} - -    def _parse(self): -        self.tree = ElementTree.ElementTree() -        self.tree.parse(open(self.inFile)) -        self.root = self.tree.getroot() - -        # Python's standard ElementTree doesn't store an element's parent on -        # the element. Make a child->parent map. -        try: -            iterator = self.tree.iter() -        except AttributeError: -            # Python 2.6. -            iterator = self.tree.getiterator() -        self.parent_map = dict((c, p) for p in iterator for c in p) - -    def _get_parent(self, ele): -        return self.parent_map[ele] - -    def _extract(self): -        # Extract the title and subtitle. -        for child in self.root.getchildren(): -            if child.tag == TITLE: -                # A title like "Version Checks" can't have spaces, otherwise -                # the "whatis" entry can't be parsed from the man page title. -                self.title = child.text.strip().replace(' ', '_') -            elif child.tag == SUBTITLE: -                self.subtitle = child.text.strip() -            elif child.tag == SECTION: -                if child.get('id'): -                    self.sections_map[child.get('id')] = child -                self.sections.append(child) - -        if not self.subtitle and 'description' in self.sections_map: -            # No "subtitle" element, use description section title as subtitle. -            self.subtitle = self._section_text(self.sections_map['description']) - -    def _section_text(self, section): -        # Find <section id="description"><p>some text</p></section>. -        for child in section: -            if child.tag != TITLE: -                return self._textify_elem(child) - -    def _textify_elem(self, elem): -        return ''.join(elem.itertext()).strip() - -    def _writeComment(self, text=''): -        lines = text.split('\n') -        for line in lines: -            self.outFile.write('.\\" ') -            self.outFile.write(line) -            self.outFile.write('\n') - -    def _escape_char(self, match): -        c = match.group(0) -        if c == "-": -            return r"\(hy" -        elif c == "\\": -            return "\\e" - -        assert False, "invalid char passed to _escape_char: %r" % c - -    def _escape(self, text): -        # Avoid "hyphen-used-as-minus-sign" lintian warning about man pages, -        # and escape text like "\0" as "\\0". We'll replace all "-" with "\(hy", -        # which is an explicit hyphen, but leave alone the first line's -        # "name \- description" text. -        return replaceables.sub(self._escape_char, text) - -    def _write(self, text): -        self._write_noescape(self._escape(text)) - -    def _write_noescape(self, text): -        self.outFile.write(text) - -    def _writeCommand(self, text): -        self._write(text) -        self._write('\n') - -    def _writeLine(self, text): -        if text is not None: -            text = text.strip() -            if text.startswith('.'): -                text = '\\&' + text -            self._write(text) -        self._write('\n') - -    def _generateHeader(self): -        year = datetime.utcnow().year -        self._writeComment('This manpage is Copyright (C) %s %s' % (year, COPYRIGHT_HOLDER)) -        self._writeComment('') -        self._writeComment( -    "Permission is granted to copy, distribute and/or modify this document\n" -    "under the terms of the GNU Free Documentation License, Version 1.3\n" -    "or any later version published by the Free Software Foundation;\n" -    "with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.\n" -    "A copy of the license is included in the section entitled \"GNU\n" -    "Free Documentation License\".") -        self._writeComment('') - -        date = datetime.fromtimestamp(int(os.stat(self.inFile).st_mtime)).strftime('%Y-%m-%d') -        title = self.title.replace('()','').upper() -        self._write('.TH "%s" "%s" "%s" "%s"\n' % (title, self.section, date, GROUP)) -        self._write('.SH NAME\n') -        self._write_noescape('%s \\- %s\n' % (self.title, self.subtitle)) - -    def _generateSection(self, section): -        # Try to render the title first -        for child in section.getchildren(): -            if child.tag == TITLE: -                s = child.text.strip().upper() -                self._writeCommand('.SH "%s"' % s) -        for child in section.getchildren(): -            self._generateElement(child) -            if child.tail: -                self._writeLine(child.tail) - -    def _generateSynopsis(self, synopsis): -        self._writeCommand('.nf') -        for child in synopsis.getchildren(): -            self._generateElement(child) -            if child.tail: -                self._writeLine(child.tail) -        self._writeCommand('.fi') - -    def _generateCode(self, code): -        text = code.text -        is_synopsis = self._get_parent(code).tag.endswith('synopsis') -        if text and '\n' not in text and not is_synopsis: -            text = text.replace('()', '(%s)' % self.section) -            self._writeCommand('.B ' + text) -        else: -            self._writeCommand('.nf') -            self._writeLine(code.text) -            for child in code.getchildren(): -                self._generateElement(child) -            self._writeCommand('.fi') - -    def _generateNote(self, note): -        self._writeCommand('.B NOTE') -        self._writeCommand('.RS') -        for child in note.getchildren(): -            self._generateElement(child) -            if child.tail: -                self._writeLine(child.tail) -        self._writeCommand('.RE') - -    def _generateP(self, p): -        if p.text: -            self._writeLine(p.text) -        for child in p.getchildren(): -            self._generateElement(child) -            if child.tail: -                self._writeLine(child.tail) - -    def _generateScreen(self, screen): -        for child in screen.getchildren(): -            self._generateElement(child) - -    def _generateListing(self, listing): -        for child in listing.getchildren(): -            self._generateElement(child) - -    def _generateList(self, l): -        for child in l.getchildren(): -            self._generateElement(child) - -    def _generateEM(self, em): -        self._writeCommand('.B %s' % em.text) - -    def _generateOutput(self, output): -        self._generateCode(output) - -    def _generateItem(self, item): -        self._writeCommand('.IP \\[bu] 2') -        for child in item.getchildren(): -            self._generateElement(child) - -    def _generateElement(self, ele): -        if ele.tag == SECTION: -            self._generateSection(ele) -        elif ele.tag == SYNOPSIS: -            self._generateSynopsis(ele) -        elif ele.tag == CODE: -            self._generateCode(ele) -        elif ele.tag == OUTPUT: -            self._generateOutput(ele) -        elif ele.tag == P: -            self._generateP(ele) -        elif ele.tag == EM: -            self._generateEM(ele) -        elif ele.tag == LISTING: -            self._generateListing(ele) -        elif ele.tag == ITEM: -            self._generateItem(ele) -        elif ele.tag == LIST: -            self._generateList(ele) -        elif ele.tag == TITLE: -            pass -        elif ele.tag == SCREEN: -            self._generateScreen(ele) -        elif ele.tag == LINK: -            self._generateLink(ele) -        elif ele.tag == NOTE: -            self._generateNote(ele) -        elif ele.tag == TABLE: -            self._generateTable(ele) -        elif ele.tag == TR: -            self._generateTr(ele) -        elif ele.tag == TD: -            self._generateTd(ele) -        elif ele.tag == INCLUDE: -            f = ele.attrib['href'] -            f = os.path.join(self.relpath, f) -            d = codecs.open(f, 'r', encoding='utf-8').read() -            self._writeLine(d) -        else: -            print('unknown element type %s' % ele) - -    def _generateTable(self, table): -        for child in table.getchildren(): -            self._generateElement(child) - -    def _generateTr(self, tr): -        self._writeCommand('.TP') -        self._writeCommand('.B') -        for child in tr.getchildren(): -            self._generateElement(child) -        self._writeCommand('.LP') - -    def _generateTd(self, td): -        for child in td.getchildren(): -            self._generateElement(child) - -    def _generateLink(self, link): -        text = link.text -        if text and '()' in text: -            text = text.replace('()', '(%s)' % self.section) -        if text: -            self._writeCommand('.B ' + text) - -    def _generateSections(self): -        for section in self.sections: -            self._generateElement(section) - -    def _generateFooter(self): -        self._write('\n.B') -        self._write('\n.SH COLOPHON') -        self._write('\nThis page is part of %s.' % GROUP) -        self._write('\nPlease report any bugs at %s.' % BUG_URL.replace('-','\\-')) - -    def _generate(self): -        self.realname = self.outFile -        self.outFile = codecs.open(self.outFile + '.tmp', 'w', encoding='utf-8') -        self._generateHeader() -        self._generateSections() -        self._generateFooter() -        os.rename(self.outFile.name, self.realname) -        self.outFile.close() - -    def convert(self): -        self._parse() -        self._extract() -        self._generate() - -def main(filenames, section='3'): -    for inFile in filenames: -        dirName = os.path.dirname(inFile) + '/man/' -        baseName = os.path.basename(inFile) -        baseFile = os.path.splitext(baseName)[0] -        outFile = dirName + baseFile + '.' + section -        c = Convert(inFile, outFile, section) -        c.convert() - -if __name__ == '__main__': -    if len(sys.argv) < 3: -        print('usage: %s SECTION FILENAMES...' % sys.argv[0]) -        sys.exit(1) -    section = sys.argv[1] -    main(sys.argv[2:], section) -    sys.exit(0)  | 
