Exemplo n.º 1
0
 def _do_list(self):
     rm = RepositoryManager(self.env)
     values = []
     for (reponame, info) in sorted(rm.get_all_repositories().iteritems()):
         alias = ''
         if 'alias' in info:
             alias = info['alias'] or '(default)'
         values.append(
             (reponame
              or '(default)', info.get('type',
                                       ''), alias, info.get('dir', '')))
     print_table(values, [_('Name'), _('Type'), _('Alias'), _('Directory')])
Exemplo n.º 2
0
 def _process_repository(self, name, kind, git_url, https_url):
     rm = RepositoryManager(self.env)
     repo, remote = self._find_repository(rm, name, kind, git_url,
                                          https_url)
     if repo is None:
         self.env.log.warn(
             'BitbucketSync: Cannot find a %s repository named "%s"'
             ' with git url "%s" or https url "%s"' %
             (kind, name, git_url, https_url))
     elif kind == 'hg':
         self._process_hg_repository(rm, repo, remote)
     elif kind == 'git':
         self._process_git_repository(rm, repo, remote)
Exemplo n.º 3
0
 def get_repository(self, reponame=None, authname=None):
     """Return the version control repository with the given name, or the
     default repository if `None`.
     
     The standard way of retrieving repositories is to use the methods
     of `RepositoryManager`. This method is retained here for backward
     compatibility.
     
     @param reponame: the name of the repository
     @param authname: the user name for authorization (not used anymore,
                      left here for compatibility with 0.11)
     """
     return RepositoryManager(self).get_repository(reponame)
Exemplo n.º 4
0
 def _extend_info(self, reponame, info, editable):
     """Extend repository info for rendering."""
     info['name'] = reponame
     info['hidden'] = as_bool(info.get('hidden'))
     info['editable'] = editable
     if 'alias' not in info:
         if info.get('dir') is not None:
             info['prettydir'] = breakable_path(info['dir']) or ''
         try:
             repos = RepositoryManager(self.env).get_repository(reponame)
         except InvalidRepository, e:
             info['error'] = e
         except TracError:
             pass  # Probably "unsupported connector"
Exemplo n.º 5
0
 def unlink_product(self, reponame):
     if not isinstance(self.env, ProductEnvironment):
         return
     rm = RepositoryManager(self.env.parent)
     repoid = rm.get_repository_id(reponame)
     links = self._get_repository_links(repoid)
     links.remove(self.env.product.prefix)
     with self.env.db_direct_transaction as db:
         if len(links) > 0:
             db("""UPDATE repository SET value=%s WHERE id=%s
                   AND name='product'""", (','.join(links), repoid))
         else:
             db("""DELETE FROM repository WHERE id=%s AND name='product'
                     AND value='%s'""" % (repoid, self.env.product.prefix))
Exemplo n.º 6
0
    def openProject(self, req, projectname, revision, extensionlist):
        """ Returns project's connection string and repository file list matched to search criteria.
        """
        # Return values
        if str(projectname).strip() == '':
            e = exceptions.Exception
            raise e("Incorrect project name")

        if revision.strip() == '':
            revision = None
        if extensionlist.strip() == '':
            extensionlist = None

        # Find node for the requested path/rev
        repomgr = RepositoryManager(self.env)
        repository = repomgr.get_repository(None)
        projectname = conf.cleanupProjectName(projectname)
        parts = []

        project = Project.get(env_name=projectname)
        if project:
            parts.append(self.get_scm_repository_url(project.env_name))
        else:
            return []

        try:
            if revision:
                revision = repository.normalize_rev(revision)
            rev_or_latest = revision or repository.youngest_rev

            getfiles = []
            self._getfiles(req, getfiles, repository, '', rev_or_latest)

            if extensionlist:
                extensions = extensionlist.split(',')
                searchresult = []
                for file in getfiles:
                    extension = os.path.splitext(str(file))[1].strip('.')
                    if extension in extensions:
                        searchresult.append(file)
                addfiles = ",".join(searchresult)
            else:
                addfiles = ",".join(getfiles)

            if addfiles:
                # Append version control files
                parts.append('versioncontrolfiles|' + addfiles)
        except Exception:
            self.log.exception("ProjectsRPC.openProject failed")
        return parts
Exemplo n.º 7
0
 def link_product(self, reponame):
     if not isinstance(self.env, ProductEnvironment):
         return
     rm = RepositoryManager(self.env.parent)
     repoid = rm.get_repository_id(reponame)
     links = self._get_repository_links(repoid)
     with self.env.db_direct_transaction as db:
         if links:
             links.append(self.env.product.prefix)
             db("""UPDATE repository SET value=%s WHERE id=%s
                   AND name='product'""", (','.join(links), repoid))
         else:
             db("""INSERT INTO repository (id, name, value)
                     VALUES(%s, 'product', '%s')""" %
                     (repoid, self.env.product.prefix))
Exemplo n.º 8
0
 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')
Exemplo n.º 9
0
 def _extend_info(self, reponame, info, editable):
     """Extend repository info for rendering."""
     info['name'] = reponame
     if info.get('dir') is not None:
         info['prettydir'] = breakable_path(info['dir']) or ''
     info['hidden'] = as_bool(info.get('hidden'))
     info['editable'] = editable
     if not info.get('alias'):
         try:
             repos = RepositoryManager(self.env).get_repository(reponame)
             youngest_rev = repos.get_youngest_rev()
             info['rev'] = youngest_rev
             info['display_rev'] = repos.display_rev(youngest_rev)
         except Exception:
             pass
     return info
Exemplo n.º 10
0
    def _update_tickets(self, req, review):
        """Updates the tickets referenced by the given review's changeset
        with a comment of field changes.  Field changes and command execution
        may occur if specified in trac.ini and the review's changeset is the
        last one of the ticket."""
        status = review.encode(review.status).lower()
        summary = review.summaries[-1]

        # build comment
        if summary['status']:
            comment = "Code review set to %(status)s" % summary
        else:
            comment = "Code review comment"
        summary['_ref'] = review.changeset
        if review.repo:
            summary['_ref'] += '/' + review.repo
        comment += " for [%(_ref)s]:\n\n%(summary)s" % summary

        # find and update tickets
        # TODO: handle when there's no explicitly named repo
        repo = RepositoryManager(self.env).get_repository(review.repo)
        changeset = repo.get_changeset(review.changeset)
        ticket_re = CommitTicketUpdater.ticket_re
        tickets = ticket_re.findall(changeset.message)

        invoked = False
        for ticket in tickets:
            tkt = Ticket(self.env, ticket)

            # determine ticket changes
            changes = {}
            if self._is_complete(ticket, tkt, review, failed_ok=True):
                changes = self._get_ticket_changes(tkt, status)

            # update ticket if there's a review summary or ticket changes
            if summary['summary'] or changes:
                for field, value in changes.items():
                    tkt[field] = value
                tkt.save_changes(author=summary['reviewer'], comment=comment)

            # check to invoke command
            if not invoked and self._is_complete(ticket, tkt, review):
                self._execute_command(status)
                invoked = True

        return tickets
Exemplo n.º 11
0
 def add_repository(self, name):
     """Add a repository."""
     dir = os.path.join(self.parentpath, name)
     if not os.path.isabs(dir):
         raise TracError(_("The repository directory must be absolute"))
     trunk = os.path.join(dir, 'trunk')
     branches = os.path.join(dir, 'branches')
     tags = os.path.join(dir, 'tags')
     command = '"%(svnadmin)s" create "%(dir)s"; "%(svn)s" mkdir --parents -q -m "Created Folders" "file://%(trunk)s" "file://%(branches)s" "file://%(tags)s"' % {
         'svnadmin': self.admin,
         'dir': dir,
         'svn': self.client,
         'trunk': trunk,
         'branches': branches,
         'tags': tags
     }
     process = subprocess.Popen(command,
                                shell=True,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
     (result, error) = process.communicate()
     if error is not None and error != "":
         if error.find('E165002') > -1:
             raise TracError(
                 _('The repository "%(name)s" already exists.', name=name))
         elif error.find('E000002') > -1 or error.find('E000013') > -1:
             raise TracError(
                 _(
                     "Can't create the repository '%(name)s.' "
                     "Make sure the parent directory '%(parentpath)s' exists "
                     "and the web server has write permissions for it.",
                     name=name,
                     parentpath=self.parentpath))
         else:
             raise TracError(error)
     if self.hookspath and os.path.exists(self.hookspath):
         hooksdir = os.path.join(dir, 'hooks/')
         files = os.listdir(self.hookspath)
         files = [self.hookspath + '/' + filename for filename in files]
         for file in files:
             shutil.copy2(file, hooksdir)
     rm = RepositoryManager(self.env)
     rm.reload_repositories()
Exemplo n.º 12
0
    def _sync(self, reponame, rev, clean):
        rm = RepositoryManager(self.env)
        if reponame == '*':
            if rev is not None:
                raise TracError(
                    _('Cannot synchronize a single revision '
                      'on multiple repositories'))
            repositories = rm.get_real_repositories()
        else:
            if is_default(reponame):
                reponame = ''
            repos = rm.get_repository(reponame)
            if repos is None:
                raise TracError(
                    _("Repository \"%(repo)s\" doesn't exist",
                      repo=reponame or '(default)'))
            repositories = [repos]

        for repos in sorted(repositories, key=lambda r: r.reponame):
            pretty_name = repos.reponame or '(default)'
            if not isinstance(repos, CachedRepository):
                printout(
                    _("%(reponame)s is not a cached repository.",
                      reponame=pretty_name))
            elif rev is not None:
                repos.sync_changeset(rev)
                printout(
                    _('%(rev)s resynced on %(reponame)s.',
                      rev=rev,
                      reponame=pretty_name))
            else:
                printout(
                    _('Resyncing repository history for %(reponame)s... ',
                      reponame=pretty_name))
                repos.sync(self._sync_feedback, clean=clean)
                for cnt, in self.env.db_query(
                        "SELECT count(rev) FROM revision WHERE repos=%s",
                    (repos.id, )):
                    printout(
                        ngettext('%(num)s revision cached.',
                                 '%(num)s revisions cached.',
                                 num=cnt))
        printout(_('Done.'))
Exemplo n.º 13
0
    def _process_repository(self, name):
        if not name:
            return

        rm = RepositoryManager(self.env)
        trac_repo = rm.get_repository(name)

        if not trac_repo or not hasattr(trac_repo, 'path'):
            return

        # Global UI instance
        ui = mercurial_ui.ui()

        repo = hg.repository(ui, trac_repo.path)

        # Repo UI instance (with repo configuration)
        ui = repo.ui

        # Pulling from default source (as configured in repo configuration)
        commands.pull(ui, repo)
Exemplo n.º 14
0
    def _sync(self, reponame, rev, clean):
        rm = RepositoryManager(self.env)
        if reponame == '*':
            if rev is not None:
                raise TracError(
                    _('Cannot synchronize a single revision '
                      'on multiple repositories'))
            repositories = rm.get_real_repositories()
        else:
            if is_default(reponame):
                reponame = ''
            repos = rm.get_repository(reponame)
            if repos is None:
                raise TracError(
                    _("Repository '%(repo)s' not found",
                      repo=reponame or '(default)'))
            if rev is not None:
                repos.sync_changeset(rev)
                printout(
                    _('%(rev)s resynced on %(reponame)s.',
                      rev=rev,
                      reponame=repos.reponame or '(default)'))
                return
            repositories = [repos]

        db = self.env.get_db_cnx()
        for repos in sorted(repositories, key=lambda r: r.reponame):
            printout(
                _('Resyncing repository history for %(reponame)s... ',
                  reponame=repos.reponame or '(default)'))
            repos.sync(self._sync_feedback, clean=clean)
            cursor = db.cursor()
            cursor.execute("SELECT count(rev) FROM revision WHERE repos=%s",
                           (repos.id, ))
            for cnt, in cursor:
                printout(
                    ngettext('%(num)s revision cached.',
                             '%(num)s revisions cached.',
                             num=cnt))
        printout(_('Done.'))
Exemplo n.º 15
0
    def for_comment(cls, env, comment, notify=None):
        """
        Return all subscriptions for a comment.
        """
        args = {}
        if comment.type == 'attachment':
            args['type'] = comment.type
            args['path'] = comment.path.split(':')[1]

        if comment.type == 'changeset':
            args['type'] = comment.type
            args['rev'] = str(comment.revision)

        if comment.type == 'browser':
            rm = RepositoryManager(env)
            reponame, _, path = rm.get_repository_by_path(comment.path)
            args['type'] = ('browser', 'changeset')
            args['path'] = (path, '')
            args['repos'] = reponame
            args['rev'] = (str(comment.revision), '')

        return cls.select(env, args, notify)
Exemplo n.º 16
0
    def environment_created(self):
        """Index the repositories."""
        for repos in RepositoryManager(self.env).get_real_repositories():
            pretty_name = repos.reponame or '(default)'
            printout(_(" Indexing '%(name)s' repository", name=pretty_name))
            try:
                repos.sync(self._sync_feedback)
            except TracError:
                printerr(_("""
 ---------------------------------------------------------------------
 Warning: couldn't index '%(pretty_name)s' repository.

 This can happen for a variety of reasons: wrong repository type,
 no appropriate third party library for this repository type,
 no repository at the specified repository path...

 You can nevertheless start using your Trac environment, but you'll
 need to check your `%(name)s.type` and `%(name)s.dir` option values
 in the [repositories] section of your trac.ini file.
""", pretty_name=pretty_name, name=repos.reponame or ''))
            else:
                self._sync_feedback(None)
Exemplo n.º 17
0
 def _extend_info(self, reponame, info, editable):
     """Extend repository info for rendering."""
     info['name'] = reponame
     info['hidden'] = as_bool(info.get('hidden'))
     info['sync_per_request'] = as_bool(info.get('sync_per_request'))
     info['editable'] = editable
     if 'alias' not in info:
         if info.get('dir') is not None:
             info['prettydir'] = breakable_path(info['dir']) or ''
         try:
             repos = RepositoryManager(self.env).get_repository(reponame)
         except InvalidRepository as e:
             info['error'] = e
         except TracError:
             pass  # Probably "unsupported connector"
         else:
             youngest_rev = repos.get_youngest_rev()
             info['rev'] = youngest_rev
             try:
                 info['display_rev'] = repos.display_rev(youngest_rev)
             except NoSuchChangeset:
                 pass
     return info
Exemplo n.º 18
0
    def processCommitHook(self, req):
        self.env.log.debug("processCommitHook")
        status = self.closestatus
        if not status:
            status = 'closed'

        if self.autofetch:
            repodir = RepositoryManager(self.env).repository_dir
            if not os.path.isabs(repodir):
                repodir = os.path.join(self.env.path, repodir)
            # TODO: This was the previous code, the repo options is probably unecessary now.
            # repodir = "%s/%s" % (self.repo, reponame)
            self.env.log.debug("Autofetching: %s" % repodir)
            repo = Git(repodir)

            try:
                self.env.log.debug("Fetching repo %s" % self.repo)
                repo.execute(['git', 'fetch'])
                try:
                    self.env.log.debug("Resyncing local repo")
                    self.env.get_repository('').sync()
                except Exception:
                    self.env.log.error("git sync failed!")
            except Exception:
                self.env.log.error("git fetch failed!")

        data = req.args.get('payload')

        if data:
            jsondata = simplejson.loads(data)
            reponame = jsondata['repository']['name']

            for i in jsondata['commits']:
                self.hook.process(i, status, self.enable_revmap, reponame)

        self.env.log.debug("Redirect URL: %s" % req)
        req.redirect(self.browser)
Exemplo n.º 19
0
 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')
Exemplo n.º 20
0
 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')
Exemplo n.º 21
0
 def get_reponames(self):
     rm = RepositoryManager(self.env)
     return [
         reponame or '(default)' for reponame in rm.get_all_repositories()
     ]
Exemplo n.º 22
0
 def shutdown(self, tid=None):
     """Close the environment."""
     RepositoryManager(self).shutdown(tid)
     DatabaseManager(self).shutdown(tid)
Exemplo n.º 23
0
    def render_admin_panel(self, req, category, page, path_info):
        # Retrieve info for all repositories
        rm = RepositoryManager(self.env)
        all_repos = rm.get_all_repositories()
        db_provider = self.env[DbRepositoryProvider]

        if path_info:
            # Detail view
            reponame = path_info if not is_default(path_info) else ''
            info = all_repos.get(reponame)
            if info is None:
                raise TracError(
                    _("Repository '%(repo)s' not found", repo=path_info))
            if req.method == 'POST':
                if req.args.get('cancel'):
                    req.redirect(req.href.admin(category, page))

                elif db_provider and req.args.get('save'):
                    # Modify repository
                    changes = {}
                    valid = True
                    for field in db_provider.repository_attrs:
                        value = normalize_whitespace(req.args.get(field))
                        if (value is not None
                            or field in ('hidden', 'sync_per_request')) \
                                and value != info.get(field):
                            changes[field] = value
                    if 'dir' in changes and not \
                            self._check_dir(req, changes['dir']):
                        valid = False
                    if valid and changes:
                        db_provider.modify_repository(reponame, changes)
                        add_notice(req, _('Your changes have been saved.'))
                        name = req.args.get('name')
                        pretty_name = name or '(default)'
                        resync = tag.code('trac-admin "%s" repository resync '
                                          '"%s"' %
                                          (self.env.path, pretty_name))
                        if 'dir' in changes:
                            msg = tag_(
                                'You should now run %(resync)s to '
                                'synchronize Trac with the repository.',
                                resync=resync)
                            add_notice(req, msg)
                        elif 'type' in changes:
                            msg = tag_(
                                'You may have to run %(resync)s to '
                                'synchronize Trac with the repository.',
                                resync=resync)
                            add_notice(req, msg)
                        if name and name != path_info and 'alias' not in info:
                            cset_added = tag.code('trac-admin "%s" changeset '
                                                  'added "%s" $REV' %
                                                  (self.env.path, pretty_name))
                            msg = tag_(
                                'You will need to update your '
                                'post-commit hook to call '
                                '%(cset_added)s with the new '
                                'repository name.',
                                cset_added=cset_added)
                            add_notice(req, msg)
                    if valid:
                        req.redirect(req.href.admin(category, page))

            chrome = Chrome(self.env)
            chrome.add_wiki_toolbars(req)
            chrome.add_auto_preview(req)
            data = {'view': 'detail', 'reponame': reponame}

        else:
            # List view
            if req.method == 'POST':
                # Add a repository
                if db_provider and req.args.get('add_repos'):
                    name = req.args.get('name')
                    pretty_name = name or '(default)'
                    if name in all_repos:
                        raise TracError(
                            _('The repository "%(name)s" already '
                              'exists.',
                              name=pretty_name))
                    type_ = req.args.get('type')
                    # Avoid errors when copy/pasting paths
                    dir = normalize_whitespace(req.args.get('dir', ''))
                    if name is None or type_ is None or not dir:
                        add_warning(
                            req, _('Missing arguments to add a '
                                   'repository.'))
                    elif self._check_dir(req, dir):
                        db_provider.add_repository(name, dir, type_)
                        add_notice(
                            req,
                            _('The repository "%(name)s" has been '
                              'added.',
                              name=pretty_name))
                        resync = tag.code('trac-admin "%s" repository resync '
                                          '"%s"' %
                                          (self.env.path, pretty_name))
                        msg = tag_(
                            'You should now run %(resync)s to '
                            'synchronize Trac with the repository.',
                            resync=resync)
                        add_notice(req, msg)
                        cset_added = tag.code('trac-admin "%s" changeset '
                                              'added "%s" $REV' %
                                              (self.env.path, pretty_name))
                        doc = tag.a(_("documentation"),
                                    href=req.href.wiki('TracRepositoryAdmin') +
                                    '#Synchronization')
                        msg = tag_(
                            'You should also set up a post-commit hook '
                            'on the repository to call %(cset_added)s '
                            'for each committed changeset. See the '
                            '%(doc)s for more information.',
                            cset_added=cset_added,
                            doc=doc)
                        add_notice(req, msg)

                # Add a repository alias
                elif db_provider and req.args.get('add_alias'):
                    name = req.args.get('name')
                    pretty_name = name or '(default)'
                    alias = req.args.get('alias')
                    if name is not None and alias is not None:
                        try:
                            db_provider.add_alias(name, alias)
                        except self.env.db_exc.IntegrityError:
                            raise TracError(
                                _('The alias "%(name)s" already '
                                  'exists.',
                                  name=pretty_name))
                        add_notice(
                            req,
                            _('The alias "%(name)s" has been '
                              'added.',
                              name=pretty_name))
                    else:
                        add_warning(req,
                                    _('Missing arguments to add an '
                                      'alias.'))

                # Refresh the list of repositories
                elif req.args.get('refresh'):
                    pass

                # Remove repositories
                elif db_provider and req.args.get('remove'):
                    sel = req.args.getlist('sel')
                    if sel:
                        for name in sel:
                            db_provider.remove_repository(name)
                        add_notice(
                            req,
                            _('The selected repositories have '
                              'been removed.'))
                    else:
                        add_warning(req, _('No repositories were selected.'))

                req.redirect(req.href.admin(category, page))

            data = {'view': 'list'}

        # Find repositories that are editable
        db_repos = {}
        if db_provider is not None:
            db_repos = dict(db_provider.get_repositories())

        # Prepare common rendering data
        repositories = {
            reponame: self._extend_info(reponame, info.copy(), reponame
                                        in db_repos)
            for (reponame, info) in all_repos.iteritems()
        }
        types = sorted([''] + rm.get_supported_types())
        data.update({
            'types':
            types,
            'default_type':
            rm.default_repository_type,
            'repositories':
            repositories,
            'can_add_alias':
            any('alias' not in info for info in repositories.itervalues())
        })

        return 'admin_repositories.html', data
Exemplo n.º 24
0
 def get_admin_panels(self, req):
     types = RepositoryManager(self.env).get_supported_types()
     if types and 'VERSIONCONTROL_ADMIN' \
                   in req.perm('admin', 'versioncontrol/repository'):
         yield ('versioncontrol', _('Version Control'), 'repository',
                _('Repositories'))
Exemplo n.º 25
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
Exemplo n.º 26
0
 def _do_changeset_modified(self, reponame, *revs):
     if is_default(reponame):
         reponame = ''
     rm = RepositoryManager(self.env)
     rm.notify('changeset_modified', reponame, revs)
Exemplo n.º 27
0
    def render_admin_panel(self, req, category, page, path_info):
        req.perm.require('VERSIONCONTROL_ADMIN')

        # Retrieve info for all repositories
        rm = RepositoryManager(self.env)
        all_repos = rm.get_all_repositories()
        db_provider = self.env[DbRepositoryProvider]

        if path_info:
            # Detail view
            reponame = path_info if not is_default(path_info) else ''
            info = all_repos.get(reponame)
            if info is None:
                raise TracError(
                    _("Repository '%(repo)s' not found", repo=path_info))
            if req.method == 'POST':
                if req.args.get('cancel'):
                    req.redirect(req.href.admin(category, page))

                elif db_provider and req.args.get('save'):
                    # Modify repository
                    changes = {}
                    for field in db_provider.repository_attrs:
                        value = normalize_whitespace(req.args.get(field))
                        if (value is not None or field == 'hidden') \
                                and value != info.get(field):
                            changes[field] = value
                    if 'dir' in changes \
                            and not self._check_dir(req, changes['dir']):
                        changes = {}
                    if changes:
                        db_provider.modify_repository(reponame, changes)
                        add_notice(req, _('Your changes have been saved.'))
                    name = req.args.get('name')
                    resync = tag.tt('trac-admin $ENV repository resync "%s"' %
                                    (name or '(default)'))
                    if 'dir' in changes:
                        msg = tag_(
                            'You should now run %(resync)s to '
                            'synchronize Trac with the repository.',
                            resync=resync)
                        add_notice(req, msg)
                    elif 'type' in changes:
                        msg = tag_(
                            'You may have to run %(resync)s to '
                            'synchronize Trac with the repository.',
                            resync=resync)
                        add_notice(req, msg)
                    if name and name != path_info and not 'alias' in info:
                        cset_added = tag.tt('trac-admin $ENV changeset '
                                            'added "%s" $REV' %
                                            (name or '(default)'))
                        msg = tag_(
                            'You will need to update your post-commit '
                            'hook to call %(cset_added)s with the new '
                            'repository name.',
                            cset_added=cset_added)
                        add_notice(req, msg)
                    if changes:
                        req.redirect(req.href.admin(category, page))

            Chrome(self.env).add_wiki_toolbars(req)
            data = {'view': 'detail', 'reponame': reponame}

        else:
            # List view
            if req.method == 'POST':
                # Add a repository
                if db_provider and req.args.get('add_repos'):
                    name = req.args.get('name')
                    type_ = req.args.get('type')
                    # Avoid errors when copy/pasting paths
                    dir = normalize_whitespace(req.args.get('dir', ''))
                    if name is None or type_ is None or not dir:
                        add_warning(
                            req, _('Missing arguments to add a '
                                   'repository.'))
                    elif self._check_dir(req, dir):
                        db_provider.add_repository(name, dir, type_)
                        name = name or '(default)'
                        add_notice(
                            req,
                            _('The repository "%(name)s" has been '
                              'added.',
                              name=name))
                        resync = tag.tt('trac-admin $ENV repository resync '
                                        '"%s"' % name)
                        msg = tag_(
                            'You should now run %(resync)s to '
                            'synchronize Trac with the repository.',
                            resync=resync)
                        add_notice(req, msg)
                        cset_added = tag.tt('trac-admin $ENV changeset '
                                            'added "%s" $REV' % name)
                        msg = tag_(
                            'You should also set up a post-commit hook '
                            'on the repository to call %(cset_added)s '
                            'for each committed changeset.',
                            cset_added=cset_added)
                        add_notice(req, msg)
                        req.redirect(req.href.admin(category, page))

                # Add a repository alias
                elif db_provider and req.args.get('add_alias'):
                    name = req.args.get('name')
                    alias = req.args.get('alias')
                    if name is not None and alias is not None:
                        db_provider.add_alias(name, alias)
                        add_notice(
                            req,
                            _('The alias "%(name)s" has been '
                              'added.',
                              name=name or '(default)'))
                        req.redirect(req.href.admin(category, page))
                    add_warning(req, _('Missing arguments to add an '
                                       'alias.'))

                # Refresh the list of repositories
                elif req.args.get('refresh'):
                    req.redirect(req.href.admin(category, page))

                # Remove repositories
                elif db_provider and req.args.get('remove'):
                    sel = req.args.getlist('sel')
                    if sel:
                        for name in sel:
                            db_provider.remove_repository(name)
                        add_notice(
                            req,
                            _('The selected repositories have '
                              'been removed.'))
                        req.redirect(req.href.admin(category, page))
                    add_warning(req, _('No repositories were selected.'))

            data = {'view': 'list'}

        # Find repositories that are editable
        db_repos = {}
        if db_provider is not None:
            db_repos = dict(db_provider.get_repositories())

        # Prepare common rendering data
        repositories = dict(
            (reponame,
             self._extend_info(reponame, info.copy(), reponame in db_repos))
            for (reponame, info) in all_repos.iteritems())
        types = sorted([''] + rm.get_supported_types())
        data.update({
            'types': types,
            'default_type': rm.repository_type,
            'repositories': repositories
        })

        return 'admin_repositories.html', data
Exemplo n.º 28
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
Exemplo n.º 29
0
    def addBuild(self, groups, ports):
        db = self.env.get_db_cnx()
        cursor = db.cursor()

        self.status = 20

        if not self.queueid:
            self.queueid = datetime.now().strftime('%Y%m%d%H%M%S-%f')[0:20]

        if not self.revision:
            self.revision = None

        if not self.priority:
            self.priority = 5
        self.priority = int(self.priority)

        if not self.description:
            self.description = 'Web rebuild'

        if not ports:
            raise TracError('Portname needs to be set')

        if not self.owner:
            raise TracError('Owner is not set')

        if self.priority < 3:
            cursor.execute(
                "SELECT count(*) FROM buildqueue WHERE owner = %s AND priority < 3 AND status < 90",
                (self.owner, ))
            row = cursor.fetchone()
            if not row:
                raise TracError('SQL Error')
            if row[0] > 0:
                self.priority = 5

        cursor.execute(
            "SELECT id, type, replace(url, '%OWNER%', %s) FROM portrepositories WHERE id = %s AND ( username = %s OR username IS NULL )",
            (self.owner, self.repository, self.owner))
        if cursor.rowcount != 1:
            raise TracError('SQL Error')
        row = cursor.fetchone()

        if row[1] == 'svn':
            try:
                if self.revision:
                    self.revision = int(self.revision)
            except ValueError:
                raise TracError('SVN Revision number needs to be numeric')

            reponame, repo, fullrepopath = RepositoryManager(
                self.env).get_repository_by_path(row[2])
            if not repo:
                raise TracError(
                    _('Repository %(repopath)s not found', repopath=row[2]))
            if not self.revision:
                self.revision = repo.get_youngest_rev()
            if self.revision < 0 or self.revision > repo.get_youngest_rev():
                raise TracError('Invalid SVN revision number')
            if not repo.has_node(
                    fullrepopath[len(repo.get_path_url('/', self.revision)):],
                    self.revision):
                raise TracError(
                    'No permissions to schedule builds for this repository')
        if row[1] == 'git':
            if self.revision and len(self.revision) != 40:
                raise TracError('Invalid GIT revision number')

        if isinstance(groups, basestring):
            grouplist = list()
            grouplist.append(groups)
            groups = grouplist

        if isinstance(ports, basestring):
            ports = ports.split()
            ports.sort()

            for portname in ports:
                if not re.match('^([a-zA-Z0-9_+.-]+)/([a-zA-Z0-9_+.-]+)$',
                                portname):
                    raise TracError(
                        _('Invalid portname %(port)s', port=portname))
                if len(portname) >= 100:
                    raise TracError(
                        _('Portname %(port)s too long', port=portname))

        if groups[0] == 'automatic':
            cursor.execute(
                "SELECT buildgroup FROM automaticbuildgroups WHERE username = %s ORDER BY priority",
                (self.owner, ))
            if cursor.rowcount < 1:
                raise TracError(
                    'Cannot schedule automatic builds. You need to join a buildgroup first.'
                )
            groups = cursor.fetchall()
        else:
            for group in groups:
                cursor.execute("SELECT name FROM buildgroups WHERE name = %s",
                               (group, ))
                if cursor.rowcount != 1:
                    raise TracError('Invalid Buildqueue')

        if len(ports) > 2 and self.priority < 3:
            self.priority = 5

        cursor.execute(
            "INSERT INTO buildqueue (id, owner, repository, revision, status, priority, startdate, enddate, description) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)",
            (self.queueid, self.owner, self.repository, self.revision,
             self.status, self.priority, long(
                 time() * 1000000), 0, self.description))

        for portname in ports:
            for group in groups:
                cursor.execute(
                    "INSERT INTO builds (queueid, backendkey, buildgroup, portname, pkgversion, status, buildstatus, buildreason, buildlog, wrkdir, backendid, startdate, enddate, checkdate) VALUES (%s, SUBSTRING(MD5(RANDOM()::text), 1, 25), %s, %s, null, %s, null, null, null, null, 0, 0, 0, 0)",
                    (self.queueid, group, portname, self.status))
        db.commit()
        return True
Exemplo n.º 30
0
 def __init__(self):
     repo_dir = RepositoryManager(self.env).repository_dir
     self._svnserve_conf = Configuration(
         os.path.join(os.path.join(repo_dir, 'conf'), 'svnserve.conf'))
     self._userconf = None