From e6524e90d51bdce49c7b9e88a36be27d1d27dffb Mon Sep 17 00:00:00 2001 From: Alex GUO Date: Sun, 3 Jun 2012 16:39:34 +0800 Subject: [PATCH 1/2] * merge git snapshot feature from 0.11 to master --- tracext/git/PyGIT.py | 4 ++++ tracext/git/git_fs.py | 49 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/tracext/git/PyGIT.py b/tracext/git/PyGIT.py index 8e8f7d3..6be2328 100644 --- a/tracext/git/PyGIT.py +++ b/tracext/git/PyGIT.py @@ -869,6 +869,10 @@ def __chg_tuple(): # handle left-over chg entry if chg: yield __chg_tuple() + + def archive(self, rev, path="", format='zip', prefix=''): + return self.repo.archive(str(rev), path, '--format=%s' % format, '--prefix=%s/' % prefix); + ############################################################################ ############################################################################ diff --git a/tracext/git/git_fs.py b/tracext/git/git_fs.py index 54eac17..6ff36f6 100644 --- a/tracext/git/git_fs.py +++ b/tracext/git/git_fs.py @@ -4,8 +4,10 @@ # # See COPYING for distribution information +import re from trac.core import * from trac.util import TracError, shorten_line +from trac.util import content_disposition from trac.util.datefmt import FixedOffset, to_timestamp, format_datetime from trac.util.text import to_unicode from trac.versioncontrol.api import \ @@ -15,8 +17,10 @@ from trac.versioncontrol.cache import CachedRepository, CachedChangeset from trac.versioncontrol.web_ui import IPropertyRenderer from trac.config import BoolOption, IntOption, PathOption, Option +from trac.web import IRequestHandler, RequestDone from trac.web.chrome import Chrome + from genshi.builder import tag from datetime import datetime @@ -53,6 +57,10 @@ def normalize_rev(self, rev): def get_changeset(self, rev): return GitCachedChangeset(self, self.normalize_rev(rev), self.env) + def get_snapshot(self, rev, path, format, prefix): + return self.repos.get_snapshot(rev, path, format, prefix) + + class GitCachedChangeset(CachedChangeset): """ @@ -101,7 +109,8 @@ def _parse_user_time(s): return user, time class GitConnector(Component): - implements(IRepositoryConnector, IWikiSyntaxProvider) + implements(IRepositoryConnector, IWikiSyntaxProvider, \ + IPropertyRenderer, IRequestHandler) def __init__(self): self._version = None @@ -251,6 +260,42 @@ def rlookup_uid(_): self.log.debug("disabled CachedRepository for '%s'" % dir) return repos + ######################### + # IRequestHandler methods + def match_request(self, req): + match = re.match(r'/(snapshot)(/.*)?$', req.path_info) + return match + def process_request(self, req): + rev = req.args.get('rev') + path = req.args.get('path') + filename = req.args.get('filename') + with_rev = req.args.get('with_rev') + #TODO: load default repo if repo == None + repo = req.args.get('repo') + if not rev: + rev = 'HEAD' + if not path: + path = '/' + path = path[1:] + if with_rev and (int(with_rev) != 0 or str(with_rev).lower() == 'True'): + with_rev = True + else: + with_rev = False + + if not filename: + filename = 'snapshot-%s' % str(rev)[:7] + elif with_rev: + filename += '-%s' % str(rev)[:7] + + req.send_response(200) + req.send_header('Content-Type', 'application/zip') + req.send_header('Content-Disposition', + content_disposition('inline', filename + '.zip')) + content = self.env.get_repository(repo).get_snapshot(rev, path, 'zip', filename) + req.send_header("Content-Length", len(content)) + req.write(content) + + raise RequestDone class CsetPropertyRenderer(Component): @@ -469,6 +514,8 @@ def sync(self, rev_callback=None, clean=None): revs = set(self.git.all_revs()) - revs for rev in revs: rev_callback(rev) + def get_snapshot(self, rev, path, format, prefix): + return self.git.archive(rev, path, format, prefix) class GitNode(Node): def __init__(self, repos, path, rev, log, ls_tree_info=None, historian=None): From 0e85b304692de82e11f3765b6f02bbaa6a45306f Mon Sep 17 00:00:00 2001 From: Alex GUO Date: Sun, 3 Jun 2012 16:56:00 +0800 Subject: [PATCH 2/2] * fix bug, GitConnector don't need IProp... --- tracext/git/git_fs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracext/git/git_fs.py b/tracext/git/git_fs.py index 6ff36f6..bf15596 100644 --- a/tracext/git/git_fs.py +++ b/tracext/git/git_fs.py @@ -110,7 +110,7 @@ def _parse_user_time(s): class GitConnector(Component): implements(IRepositoryConnector, IWikiSyntaxProvider, \ - IPropertyRenderer, IRequestHandler) + IRequestHandler) def __init__(self): self._version = None