def get_timeline_events(self, req, start, stop, filters): if 'remote_changeset' in filters: for source in SubscriptionManager(self.env).get_subscriptions('changeset'): env = open_env(source) # Try to isolate the base URL to the other Trac base = '' if env in self.env_map: # First use our own mapping base = self.env_map[base] else: env_basename = os.path.split(env.path.rstrip(os.sep))[1] if self.config.get('intertrac', env_basename+'.url'): # Then try using an intertrac link base = self.config.get('intertrac', env_basename+'.url') else: # And finally look for a sibling path self.log.debug('ChangesetSubscribable: Falling back to sibling computation, base is %s'%env_basename) url = req.href().rstrip('/').split('/') url.pop() url.append(env_basename) base = '/'.join(url) self.log.debug('ChangesetSubscribable: Computed base URL of %s to be %s'%(env.path, base)) new_href = Href(base) env.href = new_href new_req = PseudoRequest(req, new_href) cset = ChangesetModule(env) try: for ret in cset.get_timeline_events(new_req, start, stop, ['changeset']): kind, href, title, date, author, message = ret title += Markup(' from %s',env.config.get('project','name',env.path)) yield (kind, href, title, date, author, message) except Exception, e: self.log.debug('ChangesetSubscribable: %s'%traceback.format_exc()) raise e
def expand_macro(self, formatter, name, content, args={}): reponame = args.get('repository') or '' rev = args.get('revision') repos = RepositoryManager(self.env).get_repository(reponame) try: changeset = repos.get_changeset(rev) message = changeset.message rev = changeset.rev resource = repos.resource except Exception: message = content resource = Resource('repository', reponame) if formatter.context.resource.realm == 'ticket': ticket_re = CommitTicketUpdater.ticket_re if not any( int(tkt_id) == int(formatter.context.resource.id) for tkt_id in ticket_re.findall(message)): return tag.p( "(The changeset message doesn't reference this " "ticket)", class_='hint') if ChangesetModule(self.env).wiki_format_messages: return tag.div(format_to_html(self.env, formatter.context.child( 'changeset', rev, parent=resource), message, escape_newlines=True), class_='message') else: return tag.pre(message, class_='message')
def expand_macro(self, formatter, name, content, args=None): # pylint: disable=too-many-function-args args = args or {} reponame = args.get('repository') or '' rev = args.get('revision') # pylint: disable=no-member repos = RepositoryManager(self.env).get_repository(reponame) try: changeset = repos.get_changeset(rev) message = changeset.message rev = changeset.rev resource = repos.resource except Exception: # pylint: disable=broad-except message = content resource = Resource('repository', reponame) if ChangesetModule(self.env).wiki_format_messages: return tag.div(format_to_html(self.env, formatter.context.child( 'changeset', rev, parent=resource), message, escape_newlines=True), class_='message') else: return tag.pre(message, class_='message')
def get_timeline_events(self, req, start, stop, filters): if 'remote_changeset' in filters: for source in SubscriptionManager( self.env).get_subscriptions('changeset'): env = open_env(source) # Try to isolate the base URL to the other Trac base = '' if env in self.env_map: # First use our own mapping base = self.env_map[base] else: env_basename = os.path.split(env.path.rstrip(os.sep))[1] if self.config.get( 'intertrac', env_basename + '.url'): # Then try using an intertrac link base = self.config.get('intertrac', env_basename + '.url') else: # And finally look for a sibling path self.log.debug( 'ChangesetSubscribable: Falling back to sibling computation, base is %s' % env_basename) url = req.href().rstrip('/').split('/') url.pop() url.append(env_basename) base = '/'.join(url) self.log.debug( 'ChangesetSubscribable: Computed base URL of %s to be %s' % (env.path, base)) new_href = Href(base) env.href = new_href new_req = PseudoRequest(req, new_href) cset = ChangesetModule(env) try: for ret in cset.get_timeline_events( new_req, start, stop, ['changeset']): kind, href, title, date, author, message = ret title += Markup( ' from %s', env.config.get('project', 'name', env.path)) yield (kind, href, title, date, author, message) except Exception, e: self.log.debug('ChangesetSubscribable: %s' % traceback.format_exc()) raise e
class CommitTicketReferenceMacro(WikiMacroBase): """This is intended to replace the builtin macro by providing additional code review status info for the changeset. To use, disable the builtin macro as follows: [components] tracopt.ticket.commit_updater.committicketreferencemacro = disabled """ def expand_macro(self, formatter, name, content, args={}): reponame = args.get('repository') or '' rev = args.get('revision') repos = RepositoryManager(self.env).get_repository(reponame) try: changeset = repos.get_changeset(rev) message = changeset.message # add review status to commit message ( review = CodeReview(self.env, reponame, rev) status = review.encode(review.status) message += '\n\n{{{#!html \n' message += '<div class="codereviewstatus">' message += ' <div class="system-message %s">' % status.lower() message += ' <p>Code review status: ' message += ' <span>%s</span>' % review.status message += ' </p>' message += ' </div>' message += '</div>' message += '\n}}}' rev = changeset.rev resource = repos.resource except Exception, e: message = content resource = Resource('repository', reponame) if formatter.context.resource.realm == 'ticket': ticket_re = CommitTicketUpdater.ticket_re if not any( int(tkt_id) == int(formatter.context.resource.id) for tkt_id in ticket_re.findall(message)): return tag.p( "(The changeset message doesn't reference this " "ticket)", class_='hint') if ChangesetModule(self.env).wiki_format_messages: return tag.div(format_to_html(self.env, formatter.context('changeset', rev, parent=resource), message, escape_newlines=True), class_='message') else: return tag.pre(message, class_='message')
def expand_macro(self, formatter, name, content, args=None): # pylint: disable=too-many-function-args args = args or {} reponame = args.get('repository') or '' rev = args.get('revision') # pylint: disable=no-member repos = RepositoryManager(self.env).get_repository(reponame) try: changeset = repos.get_changeset(rev) message = changeset.message rev = changeset.rev resource = repos.resource except Exception: # pylint: disable=broad-except message = content resource = Resource('repository', reponame) config = self.ticket_replace_section fields = {} for key, value in config.options(): idx = key.rfind('.') if idx >= 0: prefix, attribute = key[:idx], key[idx + 1:] field = fields.setdefault(prefix, {}) field[attribute] = config.get(key) else: fields[key] = {'': value} for prefix, field in fields.iteritems(): if not all(k in field for k in ['pattern', 'replace']): self.log.warn( "Ignoring [%s] %s, missing .pattern or .replace" % (self.ticket_replace_section_name, key)) continue subst = {'repository': reponame, 'revision': rev} pattern = field['pattern'].replace('$(', '%(') % subst replace = field['replace'].replace('$(', '%(') % subst message = re.sub(pattern, replace, message) if ChangesetModule(self.env).wiki_format_messages: message = '\n'.join( map(lambda line: "> " + line, message.split('\n'))) return tag.div(format_to_html(self.env, formatter.context.child( 'changeset', rev, parent=resource), message, escape_newlines=True), class_='message') else: return tag.pre(message, class_='message')
def expand_macro(self, formatter, name, content, args={}): reponame = args.get('repository') or '' rev_str = args.get('revision') repos = RepositoryManager(self.env).get_repository(reponame) rev = None try: changeset = repos.get_changeset(repos.normalize_rev(rev_str)) message = changeset.message rev = repos.db_rev(changeset.rev) resource = repos.resource # add review status to commit message ( review = CodeReview(self.env, reponame, rev) status = review.encode(review.status) message += '\n\n{{{#!html \n' message += '<div class="codereviewstatus">' message += ' <div class="system-message %s">' % status.lower() message += ' <p>Code review status: ' message += ' <span>%s</span>' % review.status message += ' </p>' message += ' </div>' message += '</div>' message += '\n}}}' except Exception: message = content resource = Resource('repository', reponame) if formatter.context.resource.realm == 'ticket': ticket_re = CommitTicketUpdater.ticket_re if not any( int(tkt_id) == int(formatter.context.resource.id) for tkt_id in ticket_re.findall(message)): return tag.p( "(The changeset message doesn't reference this " "ticket)", class_='hint') if ChangesetModule(self.env).wiki_format_messages: ctxt = formatter.context return tag.div(format_to_html(self.env, ctxt('changeset', rev, parent=resource), message, escape_newlines=True), class_='message') else: return tag.pre(message, class_='message')
def expand_macro(self, formatter, name, content, args={}): if args: reponame = args.get('repository', '') rev = args.get('revision') else: if ',' in content: reponame = '' rev = 0 for c in [x.strip() for x in content.split(',')]: if c.isnumeric(): rev = c else: reponame = c else: rev = content.strip() reponame = '' repos = RepositoryManager(self.env).get_repository(reponame) if repos: changeset = repos.get_changeset(rev) message = changeset.message rev = changeset.rev else: message = content if formatter.context.resource.realm == 'ticket': ticket_re = CommitTicketUpdater.ticket_re if not any(int(tkt_id) == formatter.context.resource.id for tkt_id in ticket_re.findall(message)): return tag.div(tag.p(_("(The changeset message doesn't " "reference this ticket)"), class_='hint'), class_='commitmessage') if ChangesetModule(self.env).wiki_format_messages: return tag.div(format_to_html(self.env, formatter.context('changeset', rev, parent=repos.resource), message, escape_newlines=True), class_='commitmessage') else: return tag.pre(message, class_='commitmessage')
def setUp(self): self.env = EnvironmentStub() self.cm = ChangesetModule(self.env)