from trac import util from trac.core import * from trac.web.chrome import add_stylesheet, INavigationContributor from trac.web.main import IRequestHandler from trac.util import Markup import os, time class FilePlugin(Component): """A plugin to display released downloads""" implements(INavigationContributor, IRequestHandler) file_cs = """

()

Name Size Date
""" # file_cs # INavigationContributor methods def get_active_navigation_item(self, req): return 'downloads' def get_navigation_items(self, req): yield 'mainnav', 'downloads', Markup('Downloads' % self.env.href.downloads()) # IRequestHandler methods def match_request(self, req): import re match = re.match(r'/downloads(.*)$', req.path_info) if match: return 1 def listcategories(self, root, sort, order=None): files = [] names = os.listdir(root) if (sort): names.sort() if (order == "rev" or order == "reverse"): names.reverse() for file in names: if os.path.isdir(os.path.join(root, file)): files.append(file) return files def listfiles(self, root, category, sort, order=None): files = [] names = os.listdir(os.path.join(root, category)) if (sort): if (order == "age"): names.sort(lambda x, y: os.path.getmtime(os.sep.join([root, category, x])) - os.path.getmtime(os.sep.join([root, category, y]))) names.reverse() else: names.sort() for file in names: files.append(file) return files def timestamp(self, path): thetime = os.path.getmtime(path) return time.strftime('%x %X', time.localtime(thetime)) def process_request(self, req): req.hdf['title'] = self.config.get('download', 'title') or "Downloads" req.hdf['nightly'] = self.config.get('download', 'nightly') or "nightly" req.hdf['files.baseLink'] = self.env.href.cruisecontrol() path = self.config.get('download', 'path') + '/' baseurl = self.config.get('download', 'url') + '/' sort = self.config.get('download', 'sort') == 'true' catorder = self.config.get('download', 'category-order') order = self.config.get('download', 'file-order') categories = self.listcategories(path, sort, order=catorder) list = [] for category in categories: files = [] for file in self.listfiles(path, category, sort, order=order): url = baseurl + category + '/' + file filename = os.path.join(path, category, file) files.append({'name': file, 'time': self.timestamp(filename), 'size': util.pretty_size(os.path.getsize(filename)), 'url': url}) list.append({'name': category, 'time': self.timestamp(os.path.join(path, category)), 'files': files}) req.hdf['files.categories'] = list template = req.hdf.parse(self.file_cs) add_stylesheet(req, 'common/css/browser.css') return template, None