示例#1
0
    def render(self, req, mimetype, content, filename=None, rev=None):
        # -n to ignore php.ini so we're using default colors
        cmdline = '%s -sn' % self.path
        self.env.log.debug("PHP command line: %s" % cmdline)

        content = content_to_unicode(self.env, content, mimetype)
        content = content.encode('utf-8')
        np = NaivePopen(cmdline, content, capturestderr=1)
        if (os.name != 'nt' and np.errorlevel) or np.err:
            msg = u'L\'exécution de la commande (%s) a echoué : %s, %s.' \
                        % (cmdline, np.errorlevel, np.err)
            raise Exception(msg)
        odata = ''.join(np.out.splitlines()[1:-1])
        if odata.startswith('X-Powered-By:') or \
                odata.startswith('Content-type:'):
            raise TracError(
                u'Apparemment, vous utilisez la version CGI de PHP. '
                u'Trac a besoin de la version CLI pour réaliser la '
                u'coloration syntaxique.')

        epilogues = ["</span>", "</font>"]
        for e in epilogues:
            if odata.endswith(e):
                odata = odata[:-len(e)]
                break

        html = PhpDeuglifier().format(odata.decode('utf-8'))
        for line in html.split('<br />'):
            # PHP generates _way_ too many non-breaking spaces...
            # We don't need them anyway, so replace them by normal spaces
            yield line.replace('&nbsp;', ' ')
示例#2
0
def display(data, mimetype, filename, rev, env):
    try:
        lang = types[mimetype]
    except KeyError:
        raise Exception, "Enscript doesn't support %s" % mimetype
    env.log.debug("type: %s enscript-suffix: %s" % (mimetype, lang))

    enscript = env.get_config('mimeviewer', 'enscript_path', 'enscript')
    enscript += ' --color -h -q --language=html -p - -E'
    if lang:
        enscript += lang

    np = NaivePopen(enscript, data, capturestderr=1)
    if np.errorlevel or np.err:
        err = 'Running (%s) failed: %s, %s.' % (enscript, np.errorlevel,
                                                np.err)
        raise Exception, err
    odata = np.out
    # Strip header and footer
    i = odata.find('</H1>')
    beg = i > 0 and i + 7
    i = odata.rfind('</PRE>')
    end = i > 0 and i + 6 or len(odata)

    odata = Deuglifier().format(odata[beg:end])
    return '<div class="code-block">' + odata + '</div>'
示例#3
0
    def render(self, context, mimetype, content, filename=None, rev=None):
        # -n to ignore php.ini so we're using default colors
        cmdline = '%s -sn' % self.path
        self.log.debug("PHP command line: %s" % cmdline)

        content = content_to_unicode(self.env, content, mimetype)
        content = content.encode('utf-8')
        np = NaivePopen(cmdline, content, capturestderr=1)
        if (os.name != 'nt' and np.errorlevel) or np.err:
            msg = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                    np.err)
            raise Exception(msg)

        odata = ''.join(np.out.splitlines()[1:-1])
        if odata.startswith('X-Powered-By:') or \
                odata.startswith('Content-type:'):
            raise TracError(
                _('You appear to be using the PHP CGI '
                  'binary. Trac requires the CLI version '
                  'for syntax highlighting.'))

        epilogues = ["</span>", "</font>"]
        for e in epilogues:
            if odata.endswith(e):
                odata = odata[:-len(e)]
                break

        html = PhpDeuglifier().format(odata.decode('utf-8'))

        # PHP generates _way_ too many non-breaking spaces...
        # We don't need them anyway, so replace them by normal spaces
        return [
            Markup(line.replace('&nbsp;', ' '))
            for line in html.split('<br />')
        ]
示例#4
0
    def test_severity_change_ok(self):
        """
        Tests the 'severity add' command in trac-admin.  This particular
        test passes valid arguments and checks for success.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'severity change critical end-of-the-world'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        cmd = 'severity list'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#5
0
    def test_version_remove_ok(self):
        """
        Tests the 'version remove' command in trac-admin.  This particular
        test passes a valid argument and checks for success.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'version remove 1.0'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        cmd = 'version list'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#6
0
    def test_milestone_add_ok(self):
        """
        Tests the 'milestone add' command in trac-admin.  This particular
        test passes valid arguments and checks for success.
        """

        test_name = sys._getframe().f_code.co_name
        new_years = time.strftime('%b %d, %Y', (2004, 1, 1, 0, 0, 0, 3, 1, -1))
        cmd = 'milestone add new_milestone "%s"' % new_years
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        cmd = 'milestone list'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#7
0
    def test_permission_remove_multiple_actions_ok(self):
        """
        Tests the 'permission remove' command in trac-admin.  This particular
        test passes valid arguments to remove multiple permission and checks
        for success.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'permission remove anonymous WIKI_CREATE WIKI_MODIFY'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        cmd = 'permission list'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#8
0
    def test_version_remove_error_bad_version(self):
        """
        Tests the 'version remove' command in trac-admin.  This particular
        test tries to remove a version that does not exist.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'version remove bad_version'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#9
0
    def test_severity_change_error_bad_new_name(self):
        """
        Tests the 'severity change' command in trac-admin.  This particular
        test tries to change a severity to a name that already exists.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'severity change critical major'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#10
0
    def test_severity_add_error_already_exists(self):
        """
        Tests the 'severity add' command in trac-admin.  This particular
        test passes a severity name that already exists and checks for an
        error message.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'severity add blocker'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name], test_results
示例#11
0
    def test_component_chown_error_bad_component(self):
        """
        Tests the 'component chown' command in trac-admin.  This particular
        test tries to change the owner of a component that does not
        exist.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'component chown bad_component changed_owner'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#12
0
    def test_milestone_list_ok(self):
        """
        Tests the 'milestone list' command in trac-admin.  Since this command
        has no command arguments, it is hard to call it incorrectly.  As
        a result, there is only this one test.
        """

        test_name = sys._getframe().f_code.co_name
        cmd = 'milestone list'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#13
0
    def test_version_time_error_bad_version(self):
        """
        Tests the 'version time' command in trac-admin.  This particular
        test tries to change the time on a version that does not exist.
        """

        test_name = sys._getframe().f_code.co_name
        new_years = time.strftime('%b %d, %Y', (2004, 1, 1, 0, 0, 0, 3, 1, -1))
        cmd = 'version time bad_version "%s"' % new_years
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#14
0
    def test_version_add_error_already_exists(self):
        """
        Tests the 'version add' command in trac-admin.  This particular
        test passes a version name that already exists and checks for an
        error message.
        """

        test_name = sys._getframe().f_code.co_name
        new_years = time.strftime('%b %d, %Y', (2004, 1, 1, 0, 0, 0, 3, 1, -1))
        cmd = 'version add 1.0 "%s"' % new_years
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == self.expected_results[test_name]
示例#15
0
    def render(self, req, mimetype, content, filename=None, rev=None):
        #cmdline = '/usr/bin/groff -Tutf8 -a -mandoc '
        cmdline = self.config.get('mimeviewer', 'groff_path')
        if len(cmdline) == 0:
            cmdline = '/usr/bin/groff'
        self.env.log.debug("groff got command line: %s" % cmdline)
        cmdline += ' -Thtml -P -r -P -l -mandoc '
        self.env.log.debug("groff command line: %s" % cmdline)

        content = content_to_unicode(self.env, content, mimetype)
        cont = content.encode('utf-8')
        np = NaivePopen(cmdline, cont, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                    np.err)
            raise Exception, err

        return np.out
示例#16
0
    def render(self, req, mimetype, content, filename=None, rev=None):
        cmdline = self.config.get('mimeviewer', 'enscript_path')
        cmdline += ' --color -h -q --language=html -p - -E' + types[mimetype]
        self.env.log.debug("Enscript command line: %s" % cmdline)

        np = NaivePopen(cmdline, content, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                    np.err)
            raise Exception, err
        odata = np.out

        # Strip header and footer
        i = odata.find('<PRE>')
        beg = i > 0 and i + 6
        i = odata.rfind('</PRE>')
        end = i > 0 and i or len(odata)

        odata = EnscriptDeuglifier().format(odata[beg:end])
        return odata.splitlines()
示例#17
0
    def render(self, req, mimetype, content, filename=None, rev=None):
        cmdline = self.path
        mimetype = mimetype.split(';', 1)[0]  # strip off charset
        mode = self._types[mimetype][0]
        cmdline += ' --color -h -q --language=html -p - -E%s' % mode
        self.env.log.debug("Enscript command line: %s" % cmdline)

        np = NaivePopen(cmdline, content.encode('utf-8'), capturestderr=1)
        if np.errorlevel or np.err:
            err = u"L'exécution de la commande (%s) a echoué: %s, %s." % \
                  (cmdline, np.errorlevel, np.err)
            raise Exception, err
        odata = np.out

        # Strip header and footer
        i = odata.find('<PRE>')
        beg = i > 0 and i + 6
        i = odata.rfind('</PRE>')
        end = i > 0 and i or len(odata)

        odata = EnscriptDeuglifier().format(odata[beg:end].decode('utf-8'))
        return odata.splitlines()
示例#18
0
    def render(self, req, mimetype, content, filename=None, rev=None):
        cmdline = self.config.get('mimeviewer', 'php_path')
        # -n to ignore php.ini so we're using default colors
        cmdline += ' -sn'
        self.env.log.debug("PHP command line: %s" % cmdline)

        np = NaivePopen(cmdline, content, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                    np.err)
            raise Exception, err
        odata = ''.join(np.out.splitlines()[1:-1])
        if odata.startswith('X-Powered-By'):
            raise TracError, 'You appear to be using the PHP CGI binary.  ' \
                             'Trac requires the CLI version for syntax ' \
                             'highlighting.'

        html = PhpDeuglifier().format(odata)
        for line in html.split('<br />'):
            # PHP generates _way_ too many non-breaking spaces...
            # We don't need them anyway, so replace them by normal spaces
            yield line.replace('&nbsp;', ' ')
示例#19
0
    def test_about(self):
        """
        Tests the 'about' command in trac-admin.  Since the 'about' command
        has no command arguments, it is hard to call it incorrectly.  As
        a result, there is only this one test.
        """

        expected_results = """
Trac Admin Console %s
=================================================================
%s
%s
""" % (trac.__version__, trac.__license_long__, trac.__credits__)
        cmd = 'about'
        trac_admin = 'trac-admin %s %s' % (self.env.path, cmd)
        np = NaivePopen(trac_admin, None, capturestderr=1)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % \
                  (trac_admin, np.errorlevel, np.err)
            raise Exception, err
        test_results = np.out
        assert test_results == expected_results
示例#20
0
    def render(self, context, mimetype, content, filename=None, rev=None):
        cmdline = self.path
        mimetype = mimetype.split(';', 1)[0]  # strip off charset
        mode = self._types[mimetype][0]
        cmdline += ' --color -h -q --language=html -p - -E%s' % mode
        self.log.debug("Enscript command line: %s" % cmdline)

        np = NaivePopen(cmdline, content.encode('utf-8'), capturestderr=1)
        if np.errorlevel or np.err:
            self.env.disable_component(self)
            err = "Running enscript failed with (%s, %s), disabling " \
                  "EnscriptRenderer (command: '%s')" \
                  % (np.errorlevel, np.err.strip(), cmdline)
            raise Exception(err)
        odata = np.out

        # Strip header and footer
        i = odata.find('<PRE>')
        beg = i > 0 and i + 6
        i = odata.rfind('</PRE>')
        end = i if i > 0 else len(odata)

        odata = EnscriptDeuglifier().format(odata[beg:end].decode('utf-8'))
        return [Markup(line) for line in odata.splitlines()]
示例#21
0
    def get_search_results(self, req, terms, filters):
        if not 'attachmenthyperest' in filters:
            return
        #estcmd.exeのパス
        estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path',
                                          'estcmd')
        #estcmd.exeの引数
        estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg',
                                         'search -vx -sf -ic Shift_JIS')
        estcmd_encode = self.env.config.get('searchhyperestraier',
                                            'estcmd_encode', 'mbcs')

        #インデックスのパス
        att_index_path = self.env.config.get('searchhyperestraier',
                                             'att_index_path', '')
        #コマンド実行時のエンコード(Pythonでの形式)
        #estcmd_argと一致(?)させる必要有り。

        #検索結果のパスの頭で削る文字列
        #self.log.debug('attpath:%s' % os.path.normpath(self.env.path))
        att_replace_left = os.path.join(os.path.normpath(self.env.path),
                                        'attachments')
        #self.log.debug('attleft:%s' % att_replace_left)

        #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,att_index_path,unicode(query,'utf-8').encode('CP932'))
        qline = ' '.join(terms)
        cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, att_index_path,
                                   qline)
        self.log.debug('SearchHyperEstraier:%s' % cmdline)
        cmdline = unicode(cmdline).encode(estcmd_encode)
        np = NaivePopen(cmdline)
        #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs'))
        #self.log.debug('Result:%s' % np.out)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                    np.err)
            raise Exception, err
        if np.out == '':  #添付ファイルフォルダに何も入ってない
            return

        dom = parseString(np.out)
        root = dom.documentElement
        #estresult_node = root.getElementsByTagName("document")[0]
        element_array = root.getElementsByTagName("document")
        for element in element_array:
            #self.log.debug('Result:%s' % 'hoge')
            url = ""
            title = ""
            date = 0
            detail = ""
            author = "不明"

            #detailを生成
            elem_array = element.getElementsByTagName("snippet")
            detail = self._get_innerText("", elem_array)

            #その他の属性を生成
            attrelem_array = element.getElementsByTagName("attribute")
            for attrelem in attrelem_array:
                attr_name = attrelem.getAttribute("name")
                attr_value = unicode(attrelem.getAttribute(
                    "value"))  #添付ファイルはパスがquoteされたものになっている
                #URLとタイトルを生成
                if attr_name == "_lreal":
                    attr_value = attr_value[len(att_replace_left):].replace(
                        "\\", "/")
                    url = self.env.href.attachment("")  #attachmentまでのurl取得
                    url = url + attr_value[1:]  #[1:]は先頭の"/"を除くため
                    #そのままunquoteすると文字化けするから
                    title = urllib.unquote(attr_value).encode(
                        'raw_unicode_escape').decode('utf-8')
                    title = "attachment" + title
                    title = title.replace("/", ":")
                #更新日時を生成
                elif attr_name == "@mdate":
                    date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ")
                    self.log.debug('date:%s' % attr_value)
                    date = to_datetime(
                        datetime.datetime(date[0], date[1], date[2], date[3],
                                          date[4], date[5], 0,
                                          utc))  # for Trac0.11
            yield (url, title, date, to_unicode(author, 'utf-8'),
                   to_unicode(detail, 'utf-8'))
        return
示例#22
0
    def get_search_results(self, req, terms, filters):
        if not 'changesethyperest' in filters:
            return
        #estcmd.exeのパス
        estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path',
                                          'estcmd')
        #estcmd.exeの引数
        estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg',
                                         'search -vx -sf -ic Shift_JIS')
        estcmd_encode = self.env.config.get('searchhyperestraier',
                                            'estcmd_encode', 'mbcs')

        #for multi repos
        for option in self.config['searchhyperestraier']:
            #リポジトリのパス
            if not option.endswith('.cs_index_path'):
                continue
            mrepstr = option[:-len(
                '.cs_index_path')]  #'.cs_index_path'の前の文字列がreponame
            if RepositoryManager(self.env).get_repository(
                    mrepstr) is None:  #mrepstrのrepositoryがない
                continue
            repoinfo = RepositoryManager(self.env).get_all_repositories().get(
                mrepstr, {})
            #self.log.debug('type:%s' % repoinfo.get('type'))
            if repoinfo.get(
                    'type') != 'direct-svnfs':  #'direct-svnfs'のリポジトリでない
                continue
            #インデックスのパス
            cs_index_path = self.env.config.get('searchhyperestraier',
                                                mrepstr + '.cs_index_path', '')
            if cs_index_path == '':  #mrepstr+'.cs_index_path'がない
                continue
            if mrepstr != '':  #defaultでない
                mrepstr = '/' + mrepstr

            #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,cs_index_path,unicode(query,'utf-8').encode('CP932'))
            qline = ' '.join(terms)
            cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, cs_index_path,
                                       qline)
            self.log.debug('SearchChangesetHyperEstraier:%s' % cmdline)
            cmdline = unicode(cmdline).encode(estcmd_encode)
            np = NaivePopen(cmdline)
            #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs'))
            #self.log.debug('Result:%s' % np.out)
            if np.errorlevel or np.err:
                err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                        np.err)
                raise Exception, err
            if np.out == '':  #何も入ってない
                continue
            dom = parseString(np.out)
            root = dom.documentElement
            #estresult_node = root.getElementsByTagName("document")[0]
            element_array = root.getElementsByTagName("document")
            for element in element_array:
                #self.log.debug('Result:%s' % 'hoge')
                url = ""
                title = ""
                date = 0
                detail = ""
                author = "不明"

                #detailを生成
                elem_array = element.getElementsByTagName("snippet")
                detail = self._get_innerText("", elem_array)

                #その他の属性を生成
                attrelem_array = element.getElementsByTagName("attribute")
                for attrelem in attrelem_array:
                    attr_name = attrelem.getAttribute("name")
                    attr_value = unicode(attrelem.getAttribute("value"))
                    #URLとタイトルを生成
                    if attr_name == "_lreal":
                        attr_value = attr_value.replace(".txt", "")
                        end = len(attr_value)
                        for m in range(1, end):
                            if not attr_value[(end - m):].isdigit():
                                break
                        attr_value = attr_value[
                            (end - m + 1):] + mrepstr  #数字の文字列 + mrepstr
                        url = self.env.href('/changeset/' + attr_value)
                        title = "changeset:" + attr_value
                    #更新日時を生成
                    elif attr_name == "@mdate":
                        date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ")
                        self.log.debug('date:%s' % attr_value)
                        date = to_datetime(
                            datetime.datetime(date[0], date[1], date[2],
                                              date[3], date[4], date[5], 0,
                                              utc))  # for Trac0.11
                yield (url, title, date, to_unicode(author, 'utf-8'),
                       to_unicode(detail, 'utf-8'))
        return
示例#23
0
    def get_search_results(self, req, terms, filters):
        if not 'repositoryhyperest' in filters:
            return
        #estcmd.exeのパス
        estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path',
                                          'estcmd')
        #estcmd.exeの引数
        estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg',
                                         'search -vx -sf -ic Shift_JIS')
        estcmd_encode = self.env.config.get('searchhyperestraier',
                                            'estcmd_encode', 'mbcs')
        #Tracのブラウザへのリンクを作るか否か。
        #enabled:Tracのブラウザへのリンクを作る
        #上記以外:replace_left,url_leftで指定したURLへのリンクを作る
        browse_trac = self.env.config.get('searchhyperestraier', 'browse_trac',
                                          'enabled')

        #for multi repos
        for option in self.config['searchhyperestraier']:
            #リポジトリのパス
            if not option.endswith('.index_path'):
                continue
            mrepstr = option[:-len(
                '.index_path')]  #'.index_path'の前の文字列がreponame
            if RepositoryManager(self.env).get_repository(
                    mrepstr) is None:  #mrepstrのrepositoryがない
                continue
            #インデックスのパス
            index_path = self.env.config.get('searchhyperestraier',
                                             mrepstr + '.index_path', '')
            if index_path == '':  #mrepstr+'.index_path'がない
                continue
            #検索結果のパスの頭で削る文字列
            replace_left = self.env.config.get('searchhyperestraier',
                                               mrepstr + '.replace_left', '')
            if replace_left == '':  #mrepstr+'.replace_left'がない
                continue
            #URLを生成する際に頭につける文字列
            #browse_trac=enabledの場合は/がリポジトリのルートになるように
            url_left = self.env.config.get('searchhyperestraier',
                                           mrepstr + '.url_left', '')
            if url_left == '':  #mrepstr+'.url_left'がない
                continue
            if mrepstr != '':  #defaultでない
                url_left = '/' + mrepstr + url_left

            #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,index_path,unicode(query,'utf-8').encode('CP932'))
            qline = ' '.join(terms)
            cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, index_path,
                                       qline)
            self.log.debug('SearchHyperEstraier:%s' % cmdline)
            cmdline = unicode(cmdline).encode(estcmd_encode)
            np = NaivePopen(cmdline)
            #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs'))
            #self.log.debug('Result:%s' % np.out)
            if np.errorlevel or np.err:
                err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                        np.err)
                raise Exception, err
            if np.out == '':  #何も入ってない
                continue
            dom = parseString(np.out)
            root = dom.documentElement
            #estresult_node = root.getElementsByTagName("document")[0]
            element_array = root.getElementsByTagName("document")
            for element in element_array:
                #self.log.debug('Result:%s' % 'hoge')
                url = ""
                title = ""
                date = 0
                detail = ""
                author = "不明"

                #detailを生成
                elem_array = element.getElementsByTagName("snippet")
                detail = self._get_innerText("", elem_array)

                #その他の属性を生成
                attrelem_array = element.getElementsByTagName("attribute")
                for attrelem in attrelem_array:
                    attr_name = attrelem.getAttribute("name")
                    attr_value = unicode(attrelem.getAttribute("value"))
                    #URLとタイトルを生成
                    #if attr_name == "_lreal": #"_lreal"ではファイル名に'  'などが入っている場合対応できない
                    #    attr_value=attr_value[len(replace_left):].replace("\\","/")
                    #    if browse_trac == "enabled":
                    #        url = self.env.href.browser(url_left + attr_value)
                    #        title = "source:"+ url_left + attr_value
                    #    else:
                    #        url = url_left + attr_value
                    #        title = url_left + attr_value
                    if attr_name == "_lpath":  #s-jisをquoteしたもの("file:///C|/TracLight/…"の形式)
                        attr_value = urllib.unquote(attr_value).encode(
                            'raw_unicode_escape').decode('CP932')
                        attr_value = attr_value[(len('file:///') +
                                                 len(replace_left)):]
                        if browse_trac == "enabled":
                            url = self.env.href.browser(url_left + attr_value)
                            title = "source:" + urllib.unquote(url).encode(
                                'raw_unicode_escape').decode('utf-8')
                        else:
                            url = url_left + attr_value
                            title = urllib.unquote(url).encode(
                                'raw_unicode_escape').decode('utf-8')
                    #更新日時を生成
                    elif attr_name == "@mdate":
                        date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ")
                        self.log.debug('date:%s' % attr_value)
                        date = to_datetime(
                            datetime.datetime(date[0], date[1], date[2],
                                              date[3], date[4], date[5], 0,
                                              utc))  # for Trac0.11
                yield (url, title, date, to_unicode(author, 'utf-8'),
                       to_unicode(detail, 'utf-8'))
        return
示例#24
0
    def get_search_results(self, req, terms, filters):
        if not 'documenthyperest' in filters:
            return
        #estcmd.exeのパス
        estcmd_path = self.env.config.get('searchhyperestraier', 'estcmd_path',
                                          'estcmd')
        #estcmd.exeの引数
        estcmd_arg = self.env.config.get('searchhyperestraier', 'estcmd_arg',
                                         'search -vx -sf -ic Shift_JIS')
        estcmd_encode = self.env.config.get('searchhyperestraier',
                                            'estcmd_encode', 'mbcs')

        #インデックスのパス
        doc_index_path = self.env.config.get('searchhyperestraier',
                                             'doc_index_path', '')
        #コマンド実行時のエンコード(Pythonでの形式)
        #estcmd_argと一致(?)させる必要有り。

        #検索結果のパスの頭で削る文字列
        doc_replace_left = self.env.config.get('searchhyperestraier',
                                               'doc_replace_left', '')

        #tracやsvnと同じならびにくるドキュメントのフォルダ名
        doc_url_left = self.env.config.get('searchhyperestraier',
                                           'doc_url_left', 'doc')

        #cmdline = "%s %s %s %s" % (estcmd_path,estcmd_arg,doc_index_path,unicode(query,'utf-8').encode('CP932'))
        qline = ' '.join(terms)
        cmdline = "%s %s %s %s" % (estcmd_path, estcmd_arg, doc_index_path,
                                   qline)
        self.log.debug('SearchHyperEstraier:%s' % cmdline)
        cmdline = unicode(cmdline).encode(estcmd_encode)
        np = NaivePopen(cmdline)
        #self.log.debug('Result:%s' % unicode(np.out,'utf-8').encode('mbcs'))
        #self.log.debug('Result:%s' % np.out)
        if np.errorlevel or np.err:
            err = 'Running (%s) failed: %s, %s.' % (cmdline, np.errorlevel,
                                                    np.err)
            raise Exception, err
        if np.out == '':  #ドキュメントフォルダに何も入ってない
            return
        dom = parseString(np.out)
        root = dom.documentElement
        #estresult_node = root.getElementsByTagName("document")[0]
        element_array = root.getElementsByTagName("document")
        for element in element_array:
            #self.log.debug('Result:%s' % 'hoge')
            url = ""
            title = ""
            date = 0
            detail = ""
            author = "不明"

            #detailを生成
            elem_array = element.getElementsByTagName("snippet")
            detail = self._get_innerText("", elem_array)

            #その他の属性を生成
            attrelem_array = element.getElementsByTagName("attribute")
            for attrelem in attrelem_array:
                attr_name = attrelem.getAttribute("name")
                attr_value = unicode(attrelem.getAttribute("value"))
                #URLとタイトルを生成
                #if attr_name == "_lreal": #"_lreal"ではファイル名に'  'などが入っている場合対応できない
                #    attr_value=attr_value[len(doc_replace_left):].replace("\\","/")
                #    title = doc_url_left + attr_value
                #    url = urllib.quote(title.encode('utf-8'))
                #    title = '/' + title
                if attr_name == "_lpath":  #s-jisをquoteしたもの("file:///C|/TracLight/…"の形式)
                    attr_value = urllib.unquote(attr_value).encode(
                        'raw_unicode_escape').decode('CP932')
                    attr_value = attr_value[(len('file:///') +
                                             len(doc_replace_left)):]
                    #url = doc_url_left + attr_value
                    #title = '/' + urllib.unquote(url)
                    title = '/' + doc_url_left + attr_value
                    url = urllib.quote(
                        (doc_url_left + attr_value).encode('utf-8'))
                #更新日時を生成
                elif attr_name == "@mdate":
                    date = time.strptime(attr_value, "%Y-%m-%dT%H:%M:%SZ")
                    self.log.debug('date:%s' % attr_value)
                    date = to_datetime(
                        datetime.datetime(date[0], date[1], date[2], date[3],
                                          date[4], date[5], 0,
                                          utc))  # for Trac0.11
            yield (url, title, date, to_unicode(author, 'utf-8'),
                   to_unicode(detail, 'utf-8'))
        return