def main(options):
    log.addHandler(logging.StreamHandler(sys.stdout))
    log.setLevel(getattr(logging, options.log_level.upper()))

    g.solr = mock.Mock()
    preamble = options.dry_run and "Would delete" or "Deleting"
    options.preamble = preamble

    for nbhd in M.Neighborhood.query.find():
        q = {'neighborhood_id': nbhd._id}
        for projects in utils.chunked_find(M.Project, q):
            for p in projects:
                scrub_project(p, options)
            ThreadLocalORMSession.flush_all()
            ThreadLocalORMSession.close_all()

    log.info('%s %s EmailAddress documents' %
            (preamble, M.EmailAddress.query.find().count()))
    log.info('%s email addresses from %s User documents' %
            (preamble, M.User.query.find().count()))
    log.info('%s monitoring_email addresses from %s Forum documents' %
            (preamble, DM.Forum.query.find({"monitoring_email":
                                            {"$nin": [None, ""]}}).count()))

    if not options.dry_run:
        M.EmailAddress.query.remove()
        M.User.query.update({}, {"$set": {"email_addresses": []}}, multi=True)
        DM.Forum.query.update({"monitoring_email": {"$nin": [None, ""]}},
                              {"$set": {"monitoring_email": None}}, multi=True)
    return 0
def main():
    for chunk in utils.chunked_find(M.Project):
        for p in chunk:
            p.install_app('activity')

        ThreadLocalORMSession.flush_all()
        ThreadLocalORMSession.close_all()
Esempio n. 3
0
    def test_paged_diffs_with_detect_copies(self):
        # setup
        h.set_context('test', 'src-weird', neighborhood='Projects')
        repo_dir = pkg_resources.resource_filename(
            'forgegit', 'tests/data')
        repo = GM.Repository(
            name='weird-chars.git',
            fs_path=repo_dir,
            url_path='/src-weird/',
            tool='git',
            status='creating')
        repo.refresh()
        ThreadLocalORMSession.flush_all()
        ThreadLocalORMSession.close_all()

        diffs = repo.paged_diffs('346c52c1dddc729e2c2711f809336401f0ff925e')  # Test copy
        expected = {
            'added': [],
            'removed': [],
            'copied': [{'new': u'README.copy', 'old': u'README', 'ratio': 1.0}],
            'renamed': [],
            'changed': [u'README'],
            'total': 2,
        }
        assert_equals(diffs, expected)
        diffs = repo.paged_diffs('3cb2bbcd7997f89060a14fe8b1a363f01883087f')  # Test rename
        expected = {
            'added': [],
            'removed': [],
            'copied': [],
            'renamed': [{'new': u'README', 'old': u'README-copy.md', 'ratio': 1.0}],
            'changed': [],
            'total': 1,
        }
        assert_equals(diffs, expected)
Esempio n. 4
0
 def fork(self, project_id=None, mount_point=None, mount_label=None):
     # this shows the form and handles the submission
     security.require_authenticated()
     if not c.app.forkable: raise exc.HTTPNotFound
     from_repo = c.app.repo
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     from_project = c.project
     to_project = M.Project.query.get(_id=ObjectId(project_id))
     mount_label = mount_label or '%s - %s' % (c.project.name, c.app.config.options.mount_label)
     mount_point = (mount_point or from_project.shortname)
     if request.method != 'POST' or not mount_point:
         return dict(from_repo=from_repo,
                     user_project=c.user.private_project(),
                     mount_point=mount_point,
                     mount_label=mount_label)
     else:
         with h.push_config(c, project=to_project):
             if not to_project.database_configured:
                 to_project.configure_project(is_user_project=True)
             security.require(security.has_access(to_project, 'admin'))
             try:
                 to_project.install_app(
                     ep_name=from_repo.tool_name,
                     mount_point=mount_point,
                     mount_label=mount_label,
                     cloned_from_project_id=from_project._id,
                     cloned_from_repo_id=from_repo._id)
                 redirect(to_project.url()+mount_point+'/')
             except exc.HTTPRedirection:
                 raise
             except Exception, ex:
                 flash(str(ex), 'error')
                 redirect(request.referer)
Esempio n. 5
0
 def get_mr_page(r):
     r = r.follow()  # get merge request page; creates bg task for determining commits
     task = M.MonQTask.query.get(task_name='allura.tasks.repo_tasks.determine_mr_commits', state='ready')
     task()
     ThreadLocalORMSession.close_all()  # close ming connections so that new data gets loaded later
     r = self.app.get(r.request.url)  # refresh, data should be there now
     return r
Esempio n. 6
0
 def register_neighborhood_project(self, neighborhood, users, allow_register=False):
     from allura import model as M
     shortname = '--init--'
     name = 'Home Project for %s' % neighborhood.name
     p = M.Project(neighborhood_id=neighborhood._id,
                   shortname=shortname,
                   name=name,
                   short_description='',
                   description=(
                       'You can edit this description in the admin page'),
                   homepage_title = '# ' + name,
                   last_updated = datetime.utcnow(),
                   is_nbhd_project=True,
                   is_root=True)
     try:
         p.configure_project(
             users=users,
             is_user_project=False,
             apps=[
                 ('Wiki', 'wiki', 'Wiki'),
                 ('admin', 'admin', 'Admin')])
     except:
         ThreadLocalORMSession.close_all()
         log.exception('Error registering project %s' % p)
         raise
     if allow_register:
         role_auth = M.ProjectRole.authenticated(p)
         security.simple_grant(p.acl, role_auth._id, 'register')
         state(p).soil()
     return p
 def test_direct_sub(self):
     self._subscribe()
     self._post_notification(text='A')
     self._post_notification(text='B')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     M.Mailbox.fire_ready()
 def setup_with_tools(self):
     setup_global_objects()
     _clear_subscriptions()
     _clear_notifications()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     M.notification.MAILBOX_QUIESCENT=None # disable message combining
Esempio n. 9
0
def test_basic_task():
    task = M.MonQTask.post(pprint.pformat, ([5,6],))
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
    task = M.MonQTask.get()
    assert task
    task()
    assert task.result == 'I[5, 6]', task.result
Esempio n. 10
0
def setUp():
    controller = TestController()
    controller.setUp()
    controller.app.get("/wiki/Home/")
    setup_global_objects()
    ThreadLocalORMSession.close_all()
    h.set_context("test", "wiki", neighborhood="Projects")
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
Esempio n. 11
0
def setUp():
    controller = TestController()
    controller.setUp()
    controller.app.get('/wiki/Home/')
    setup_global_objects()
    ThreadLocalORMSession.close_all()
    h.set_context('test', 'wiki', neighborhood='Projects')
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
 def setup_with_tools(self):
     setup_global_objects()
     g.set_app('wiki')
     _clear_subscriptions()
     _clear_notifications()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     self.pg = WM.Page.query.get(app_config_id=c.app.config._id)
     M.notification.MAILBOX_QUIESCENT=None # disable message combining
 def test_redo_trees(self):
     old_tree = self.rev.tree
     del self.rev.tree
     M.repo.Tree.query.remove()
     ThreadLocalORMSession.close_all()
     new_tree =  self.rev.tree
     self.assertEqual(old_tree.tree_ids, new_tree.tree_ids)
     self.assertEqual(old_tree.blob_ids, new_tree.blob_ids)
     self.assertEqual(old_tree._id, new_tree._id)
Esempio n. 14
0
    def test_commit(self):
        assert self.rev.primary() is self.rev
        assert self.rev.index_id().startswith('allura/model/repo/Commit#')
        self.rev.author_url
        self.rev.committer_url
        assert self.rev.tree._id == self.rev.tree_id
        assert self.rev.summary == self.rev.message.splitlines()[0]
        assert self.rev.shorthand_id() == '[1e146e]'
        assert self.rev.symbolic_ids == (
            ['master'], ['foo']), self.rev.symbolic_ids
        assert self.rev.url() == (
            '/p/test/src-git/ci/'
            '1e146e67985dcd71c74de79613719bef7bddca4a/')
        all_cis = list(self.repo.log(self.rev._id, id_only=True))
        assert len(all_cis) == 4
        c.lcid_cache = {}
        self.rev.tree.ls()
        # print self.rev.tree.readme()
        assert_equal(self.rev.tree.readme(), (
            'README', 'This is readme\nAnother Line\n'))
        assert self.rev.tree.path() == '/'
        assert self.rev.tree.url() == (
            '/p/test/src-git/ci/'
            '1e146e67985dcd71c74de79613719bef7bddca4a/'
            'tree/')
        self.rev.tree.by_name['README']
        assert self.rev.tree.is_blob('README') == True
        ThreadLocalORMSession.close_all()
        c.app = None
        converted = g.markdown.convert('[1e146e]')
        assert '1e146e' in converted, converted
        h.set_context('test', 'wiki', neighborhood='Projects')
        pg = WM.Page(
            title='Test Page', text='This is a commit reference: [1e146e]')
        ThreadLocalORMSession.flush_all()
        M.MonQTask.run_ready()
        for ci in pg.related_artifacts():
            assert ci.shorthand_id() == '[1e146e]', ci.shorthand_id()
            assert ci.url() == (
                '/p/test/src-git/ci/'
                '1e146e67985dcd71c74de79613719bef7bddca4a/')

        assert_equal(self.rev.authored_user, None)
        assert_equal(self.rev.committed_user, None)
        user = M.User.upsert('rick')
        email = user.claim_address('*****@*****.**')
        email.confirmed = True
        session(email).flush(email)
        rev = self.repo.commit(self.rev._id)  # to update cached values of LazyProperty
        assert_equal(rev.authored_user, user)
        assert_equal(rev.committed_user, user)
        assert_equal(
            sorted(rev.webhook_info.keys()),
            sorted(['id', 'url', 'timestamp', 'message', 'author',
                    'committer', 'added', 'removed', 'renamed', 'modified', 'copied']))
Esempio n. 15
0
 def setup_with_tools(self):
     setup_global_objects()
     h.set_context('test', 'src-git', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename(
         'forgegit', 'tests/data')
     c.app.repo.fs_path = repo_dir
     c.app.repo.name = 'testgit.git'
     self.repo = c.app.repo
     self.repo.refresh()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
def main():
    for chunk in utils.chunked_find(SM.Repository):
        for r in chunk:
            print 'Processing {0}'.format(r)
            all_commit_ids = r._impl.all_commit_ids()
            if all_commit_ids:
                for commit in M.repo.Commit.query.find({'_id': {'$in': all_commit_ids}}):
                    if commit.tree_id and M.repo.Tree.query.get(_id=commit.tree_id):
                        kill_tree(r._impl, commit._id, '', commit.tree)
                ThreadLocalORMSession.flush_all()
                ThreadLocalORMSession.close_all()
Esempio n. 17
0
 def setUp(self):
     super(TestMergeRequest, self).setUp()
     c.project.install_app('svn', 'test2')
     h.set_context('test', 'test2', neighborhood='Projects')
     self.repo2 = M.Repository(name='test2', tool='svn')
     self.repo2._impl = mock.Mock(spec=M.RepositoryImplementation())
     self.repo2._impl.log = lambda *a,**kw:(['foo'], [])
     self.repo2._impl._repo = self.repo2
     self.repo2.init_as_clone('/p/test/', 'test1', '/p/test/test1/')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 18
0
 def _make_app(self, mount_point, name):
     h.set_context("test", mount_point, neighborhood="Projects")
     repo_dir = pkg_resources.resource_filename("forgesvn", "tests/data/")
     c.app.repo.fs_path = repo_dir
     c.app.repo.status = "ready"
     c.app.repo.name = name
     c.app.repo.refresh()
     if os.path.isdir(c.app.repo.tarball_path):
         shutil.rmtree(c.app.repo.tarball_path.encode("utf-8"))
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 19
0
 def setup_with_tools(self):
     h.set_context("test", "src-hg", neighborhood="Projects")
     repo_dir = pkg_resources.resource_filename("forgehg", "tests/data")
     c.app.repo.fs_path = repo_dir
     c.app.repo.status = "ready"
     c.app.repo.name = "testrepo.hg"
     c.app.repo.refresh()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     h.set_context("test", "src-hg", neighborhood="Projects")
     c.app.repo.refresh()
Esempio n. 20
0
 def setup_with_tools(self):
     h.set_context('test', 'src-git', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
     c.app.repo.fs_path = repo_dir
     c.app.repo.name = 'testui2.git'
     c.app.repo.status = 'ready'
     self.repo = c.app.repo
     self.repo.refresh()
     self.rev = self.repo.commit('HEAD')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
def scrub_project(p, options):
    log.info('Scrubbing project "%s"' % p.shortname)
    preamble = options.preamble
    if not public(p):
        log.info('%s project "%s"' % (preamble, p.shortname))
        if not options.dry_run:
            p.delete()
        return
    for ac in p.app_configs:
        ac.project = p
        c.app = p.app_instance(ac)
        mount_point = ac.options.get('mount_point')
        tool_name = ac.tool_name.lower()
        if tool_name in ('admin', 'search', 'profile'):
            continue
        if not public(ac, project=p):
            log.info('%s tool %s/%s on project "%s"' % (
                preamble, tool_name, mount_point, p.shortname))
            if not options.dry_run:
                p.uninstall_app(mount_point)
            continue
        q = dict(app_config_id=ac._id)
        ace = dict(access='DENY', permission='*', role_id=None)
        q['acl'] = {'$in': [ace]}
        counter = 0
        if tool_name == 'tickets':
            if ac.options.get('TicketMonitoringEmail'):
                log.info('%s options.TicketMonitoringEmail from the %s/%s '
                         'tool on project "%s"' % (preamble, tool_name,
                                                   mount_point, p.shortname))
                if not options.dry_run:
                    ac.options['TicketMonitoringEmail'] = None
            for tickets in utils.chunked_find(TM.Ticket, q):
                for t in tickets:
                    counter += 1
                    if not options.dry_run:
                        t.discussion_thread.delete()
                        t.delete()
                ThreadLocalORMSession.flush_all()
                ThreadLocalORMSession.close_all()
            if counter > 0:
                log.info('%s %s tickets from the %s/%s tool on '
                         'project "%s"' % (preamble, counter, tool_name,
                                           mount_point, p.shortname))
        elif tool_name == 'discussion':
            for forums in utils.chunked_find(DM.Forum, q):
                for f in forums:
                    counter += 1
                    if not options.dry_run:
                        f.delete()
            if counter > 0:
                log.info('%s %s forums from the %s/%s tool on '
                         'project "%s"' % (preamble, counter, tool_name,
                                           mount_point, p.shortname))
 def _make_app(self, mount_point, name):
     h.set_context('test', mount_point, neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename(
         'forgesvn', 'tests/data/')
     c.app.repo.fs_path = repo_dir
     c.app.repo.status = 'ready'
     c.app.repo.name = name
     c.app.repo.refresh()
     if os.path.isdir(c.app.repo.tarball_path):
         shutil.rmtree(c.app.repo.tarball_path)
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 23
0
 def test_status_html(self):
     resp = self.app.get("/src/").follow()
     # repo status not displayed if 'ready'
     assert None == resp.html.find("div", dict(id="repo_status"))
     h.set_context("test", "src", neighborhood="Projects")
     c.app.repo.status = "analyzing"
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     # repo status displayed if not 'ready'
     resp = self.app.get("/src/").follow()
     div = resp.html.find("div", dict(id="repo_status"))
     assert div.span.text == "analyzing"
 def setup_with_tools(self):
     h.set_context('test', 'src-hg', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename(
         'forgehg', 'tests/data')
     c.app.repo.fs_path = repo_dir
     c.app.repo.status = 'ready'
     c.app.repo.name = 'testrepo.hg'
     c.app.repo.refresh()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     h.set_context('test', 'src-hg', neighborhood='Projects')
     c.app.repo.refresh()
 def test_post_user_notification(self):
     u = M.User.query.get(username='******')
     n = M.Notification.post_user(u, self.pg, 'metadata')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     flash_msgs = list(h.pop_user_notifications(u))
     assert len(flash_msgs) == 1, flash_msgs
     msg = flash_msgs[0]
     assert msg['text'].startswith('Home modified by Test Admin')
     assert msg['subject'].startswith('[test:wiki]')
     flash_msgs = list(h.pop_user_notifications(u))
     assert not flash_msgs, flash_msgs
Esempio n. 26
0
 def setup_with_tools(self):
     setup_global_objects()
     h.set_context('test', 'src', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename(
         'forgesvn', 'tests/data/')
     c.app.repo.name = 'testsvn'
     c.app.repo.fs_path = repo_dir
     self.repo = c.app.repo
     self.repo.refresh()
     self.rev = self.repo.commit('HEAD')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
 def test_status_html(self):
     resp = self.app.get('/src-hg/').follow().follow()
     # repo status not displayed if 'ready'
     assert None == resp.html.find('div', dict(id='repo_status'))
     h.set_context('test', 'src-hg', neighborhood='Projects')
     c.app.repo.status = 'analyzing'
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     # repo status displayed if not 'ready'
     resp = self.app.get('/src-hg/').follow().follow()
     div = resp.html.find('div', dict(id='repo_status'))
     assert div.span.text == 'analyzing'
Esempio n. 28
0
def test_update_neighborhood():
    cmd = create_neighborhood.UpdateNeighborhoodCommand('update-neighborhood')
    cmd.run([test_config, 'Projects', 'True'])
    ThreadLocalORMSession.close_all() # make sure the app_configs get freshly queried
    nb = M.Neighborhood.query.get(name='Projects')
    assert nb.has_home_tool == True

    cmd = create_neighborhood.UpdateNeighborhoodCommand('update-neighborhood')
    cmd.run([test_config, 'Projects', 'False'])
    ThreadLocalORMSession.close_all() # make sure the app_configs get freshly queried
    nb = M.Neighborhood.query.get(name='Projects')
    assert nb.has_home_tool == False
 def setup_with_tools(self):
     h.set_context('test', 'src', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename('forgesvn', 'tests/data/')
     c.app.repo.fs_path = repo_dir
     c.app.repo.status = 'ready'
     c.app.repo.name = 'testsvn'
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     h.set_context('test', 'src', neighborhood='Projects')
     c.app.repo.refresh()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     h.set_context('test', 'src', neighborhood='Projects')
Esempio n. 30
0
def test_deleted_thread_index():
    d = M.Discussion(shortname='test', name='test')
    t = M.Thread(discussion_id=d._id, subject='Test Thread')
    p = M.Post(discussion_id=d._id, thread_id=t._id, status='ok')
    t.delete()
    ThreadLocalORMSession.flush_all()

    # re-query, so relationships get reloaded
    ThreadLocalORMSession.close_all()
    p = M.Post.query.get(_id=p._id)

    # just make sure this doesn't fail
    p.index()
Esempio n. 31
0
def test_deleted_thread_index():
    d = M.Discussion(shortname='test', name='test')
    t = M.Thread(discussion_id=d._id, subject='Test Thread')
    p = M.Post(discussion_id=d._id, thread_id=t._id, status='ok')
    t.delete()
    ThreadLocalORMSession.flush_all()

    # re-query, so relationships get reloaded
    ThreadLocalORMSession.close_all()
    p = M.Post.query.get(_id=p._id)

    # just make sure this doesn't fail
    p.index()
Esempio n. 32
0
 def setup_with_tools(self):
     setup_global_objects()
     h.set_context('test', 'src-git', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
     self.repo = GM.Repository(name='testmime.git',
                               fs_path=repo_dir,
                               url_path='/test/',
                               tool='git',
                               status='creating')
     self.repo.refresh()
     self.rev = self.repo.commit('HEAD')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 33
0
    def execute(cls, options):
        # This script will indirectly call app.sidebar_menu() for every app in
        # every project. Some of the sidebar_menu methods expect the
        # pylons.request threadlocal object to be present. So, we're faking it.
        #
        # The fact that this isn't a 'real' request doesn't matter for the
        # purposes of the sitemap.
        pylons.request._push_object(webob.Request.blank('/'))

        output_path = options.output_dir
        if os.path.exists(output_path):
            raise Exception('%s directory already exists.' % output_path)
        os.mkdir(output_path)

        now = datetime.utcnow().date()
        sitemap_content_template = Template(SITEMAP_TEMPLATE)

        def write_sitemap(urls, file_no):
            sitemap_content = sitemap_content_template.render(dict(now=now, locs=urls))
            with open(os.path.join(output_path, 'sitemap-%d.xml' % file_no), 'w') as f:
                f.write(sitemap_content)

        creds = security.Credentials.get()
        locs = []
        file_count = 0

        excl_nbhd_ids = []
        if options.exclude_neighborhoods:
            prefix = ['/%s/' % n for n in options.exclude_neighborhoods]
            excl_nbhd_ids = [nbhd._id for nbhd in M.Neighborhood.query.find({'url_prefix': {'$in': prefix}})]

        # write sitemap files, MAX_SITEMAP_URLS per file
        for chunk in utils.chunked_find(M.Project, {'deleted': False, 'neighborhood_id': {'$nin': excl_nbhd_ids}}):
            for p in chunk:
                c.project = p
                try:
                    for s in p.sitemap(excluded_tools=options.exclude_tools):
                        url = config['base_url'] + s.url if s.url[0] == '/' else s.url
                        locs.append({'url': url,
                                     'date': p.last_updated.strftime("%Y-%m-%d")})

                except Exception, e:
                    print "Error creating sitemap for project '%s': %s" %\
                        (p.shortname, e)
                creds.clear()
                if len(locs) >= options.urls_per_file:
                    write_sitemap(locs[:options.urls_per_file], file_count)
                    del locs[:options.urls_per_file]
                    file_count += 1
                M.main_orm_session.clear()
            ThreadLocalORMSession.close_all()
Esempio n. 34
0
    def execute(cls, options):
        # This script will indirectly call app.sidebar_menu() for every app in
        # every project. Some of the sidebar_menu methods expect the
        # pylons.request threadlocal object to be present. So, we're faking it.
        #
        # The fact that this isn't a 'real' request doesn't matter for the
        # purposes of the sitemap.
        pylons.request._push_object(webob.Request.blank('/'))

        output_path = options.output_dir
        if os.path.exists(output_path):
            raise Exception('%s directory already exists.' % output_path)
        os.mkdir(output_path)

        now = datetime.utcnow().date()
        sitemap_content_template = Template(SITEMAP_TEMPLATE)

        def write_sitemap(urls, file_no):
            sitemap_content = sitemap_content_template.render(dict(now=now, locs=urls))
            with open(os.path.join(output_path, 'sitemap-%d.xml' % file_no), 'w') as f:
                f.write(sitemap_content)

        creds = security.Credentials.get()
        locs = []
        file_count = 0

        nbhd_id = []
        if options.neighborhood:
            prefix = ['/%s/' % n for n in options.neighborhood]
            nbhd_id = [nbhd._id for nbhd in M.Neighborhood.query.find({'url_prefix': {'$in': prefix}})]

        # write sitemap files, MAX_SITEMAP_URLS per file
        for chunk in utils.chunked_find(M.Project, {'deleted': False, 'neighborhood_id': {'$nin': nbhd_id}}):
            for p in chunk:
                c.project = p
                try:
                    for s in p.sitemap(excluded_tools=['git', 'hg', 'svn']):
                        url = config['base_url'] + s.url if s.url[0] == '/' else s.url
                        locs.append({'url': url,
                                     'date': p.last_updated.strftime("%Y-%m-%d")})

                except Exception, e:
                    print "Error creating sitemap for project '%s': %s" %\
                        (p.shortname, e)
                creds.clear()
                if len(locs) >= options.urls_per_file:
                    write_sitemap(locs[:options.urls_per_file], file_count)
                    del locs[:options.urls_per_file]
                    file_count += 1
                M.main_orm_session.clear()
            ThreadLocalORMSession.close_all()
 def setup_with_tools(self):
     setup_global_objects()
     h.set_context('test', 'src', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename('forgesvn', 'tests/data/')
     self.repo = SM.Repository(name='testsvn',
                               fs_path=repo_dir,
                               url_path='/test/',
                               tool='svn',
                               status='creating')
     self.repo.refresh()
     self.rev = M.repo.Commit.query.get(_id=self.repo.heads[0]['object_id'])
     self.rev.repo = self.repo
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 36
0
def test_update_neighborhood():
    cmd = create_neighborhood.UpdateNeighborhoodCommand('update-neighborhood')
    cmd.run([test_config, 'Projects', 'True'])
    # make sure the app_configs get freshly queried
    ThreadLocalORMSession.close_all()
    nb = M.Neighborhood.query.get(name='Projects')
    assert nb.has_home_tool == True

    cmd = create_neighborhood.UpdateNeighborhoodCommand('update-neighborhood')
    cmd.run([test_config, 'Projects', 'False'])
    # make sure the app_configs get freshly queried
    ThreadLocalORMSession.close_all()
    nb = M.Neighborhood.query.get(name='Projects')
    assert nb.has_home_tool == False
Esempio n. 37
0
    def test_merge_request_detail_view(self):
        r, mr_num = self._request_merge()
        assert_in('wants to merge', r)

        merge_instructions = r.html.findAll('textarea')[0].getText()
        assert_in('git checkout master', merge_instructions)
        assert_in('git fetch /srv/git/p/test2/code master', merge_instructions)
        c_id = self.forked_repo.get_heads()[0]['object_id']
        assert_in('git merge {}'.format(c_id), merge_instructions)
        assert_regexp_matches(str(r), r'[0-9]+ seconds? ago')

        merge_form = r.html.find('div', {'class': 'merge-help-text merge-ok'})
        assert merge_form
        assert_in(
            'Merge request has no conflicts. You can merge automatically.',
            merge_form.getText())

        assert_not_in('Improve documentation', r)  # no details yet

        # a task is busy/ready to compute
        r = self.app.get('/p/test/src-git/merge-requests/1/commits_html',
                         status=202)  # 202 used for "busy"
        # run task to compute the commits list
        task = M.MonQTask.query.get(
            task_name='allura.tasks.repo_tasks.determine_mr_commits',
            state='ready')
        task()
        ThreadLocalORMSession.close_all(
        )  # close ming connections so that new data gets loaded later

        def assert_commit_details(r):
            assert_in('Improve documentation', r.body)
            revs = r.html.findAll('tr', attrs={'class': 'rev'})
            assert_equal(len(revs), 1)
            rev_links = revs[0].findAll('a', attrs={'class': 'rev'})
            browse_links = revs[0].findAll('a', attrs={'class': 'browse'})
            assert_equal(rev_links[0].get('href'),
                         '/p/test2/code/ci/%s/' % c_id)
            assert_equal(rev_links[0].getText(), '[%s]' % c_id[:6])
            assert_equal(browse_links[0].get('href'),
                         '/p/test2/code/ci/%s/tree' % c_id)
            assert_equal(browse_links[0].getText(), 'Tree')

        r = self.app.get('/p/test/src-git/merge-requests/1/commits_html',
                         status=200)
        assert_commit_details(r)

        r = self.app.get('/p/test/src-git/merge-requests/1/', status=200)
        assert_commit_details(r)
Esempio n. 38
0
 def _test_message(self):
     self._subscribe()
     thd = M.Thread.query.get(ref_id=self.pg.index_id())
     thd.post('This is a very cool message')
     M.MonQTask.run_ready()
     ThreadLocalORMSession.flush_all()
     M.Mailbox.fire_ready()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     msg = M.MonQTask.query.get(
         task_name='allura.tasks.mail_tasks.sendmail', state='ready')
     assert msg is not None
     assert '[email protected]' in msg.kwargs['reply_to']
     u = M.User.by_username('test-admin')
     assert str(u._id) in msg.kwargs['fromaddr'], msg.kwargs['fromaddr']
Esempio n. 39
0
def main():
    for chunk in utils.chunked_find(SM.Repository):
        for r in chunk:
            print 'Processing {0}'.format(r)
            all_commit_ids = r._impl.all_commit_ids()
            if all_commit_ids:
                for commit in M.repository.Commit.query.find(
                    {'_id': {
                        '$in': all_commit_ids
                    }}):
                    if commit.tree_id and M.repository.Tree.query.get(
                            _id=commit.tree_id):
                        kill_tree(r._impl, commit._id, '', commit.tree)
                ThreadLocalORMSession.flush_all()
                ThreadLocalORMSession.close_all()
Esempio n. 40
0
 def setUp(self):
     super(_TestWithRepo, self).setUp()
     h.set_context('test', neighborhood='Projects')
     c.project.install_app('svn', 'test1')
     h.set_context('test', 'test1', neighborhood='Projects')
     self.repo = M.Repository(name='test1', tool='svn')
     self.repo._impl = mock.Mock(spec=M.RepositoryImplementation())
     self.repo._impl.shorthand_for_commit = M.RepositoryImplementation.shorthand_for_commit
     self.repo._impl.url_for_commit = (
         lambda *a, **kw: M.RepositoryImplementation.url_for_commit(
             self.repo._impl, *a, **kw))
     self.repo._impl.log = lambda *a, **kw: (['foo'], [])
     self.repo._impl._repo = self.repo
     self.repo._impl.all_commit_ids = lambda *a, **kw: []
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 41
0
def setup_unit_test():
    try:
        while True:
            REGISTRY.cleanup()
    except:
        pass
    REGISTRY.prepare()
    REGISTRY.register(ew.widget_context,
                      ew.core.WidgetContext('http', ew.ResourceManager()))
    REGISTRY.register(g, Globals())
    REGISTRY.register(c, mock.Mock())
    REGISTRY.register(url, lambda: None)
    REGISTRY.register(request, Request.blank('/', remote_addr='127.0.0.1'))
    REGISTRY.register(response, Response())
    REGISTRY.register(allura.credentials, allura.lib.security.Credentials())
    c.model_cache = None
    ThreadLocalORMSession.close_all()
Esempio n. 42
0
 def setup_with_tools(self):
     setup_global_objects()
     h.set_context('test', 'src-git', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
     c.app.repo.fs_path = repo_dir
     c.app.repo.name = 'testgit.git'
     self.repo = c.app.repo
     #self.repo = GM.Repository(
     #     name='testgit.git',
     #     fs_path=repo_dir,
     #     url_path = '/test/',
     #     tool = 'git',
     #     status = 'creating')
     self.repo.refresh()
     self.rev = self.repo.commit('master')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 43
0
def test_discussion_methods():
    d = M.Discussion(shortname='test', name='test')
    assert d.thread_class() == M.Thread
    assert d.post_class() == M.Post
    assert d.attachment_class() == M.DiscussionAttachment
    ThreadLocalORMSession.flush_all()
    d.update_stats()
    ThreadLocalORMSession.flush_all()
    assert d.last_post == None
    assert d.url().endswith('wiki/_discuss/')
    assert d.index()['name_s'] == 'test'
    assert d.find_posts().count() == 0
    jsn = d.__json__()
    assert jsn['name'] == d.name
    d.delete()
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
 def setup_with_tools(self):
     setup_global_objects()
     h.set_context('test', 'src', neighborhood='Projects')
     repo_dir = pkg_resources.resource_filename('forgesvn', 'tests/data/')
     self.repo = SM.Repository(name='testsvn',
                               fs_path=repo_dir,
                               url_path='/test/',
                               tool='svn',
                               status='creating')
     self.repo.refresh()
     self.svn_tags = SM.Repository(name='testsvn-trunk-tags-branches',
                                   fs_path=repo_dir,
                                   url_path='/test/',
                                   tool='svn',
                                   status='creating')
     self.svn_tags.refresh()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 45
0
 def setup_with_tools(self):
     setup_global_objects()
     repo_dir = pkg_resources.resource_filename('forgesvn', 'tests/data/')
     with h.push_context('test', 'src', neighborhood='Projects'):
         c.app.repo.name = 'testsvn'
         c.app.repo.fs_path = repo_dir
         self.repo = c.app.repo
         self.repo.refresh()
         ThreadLocalORMSession.flush_all()
         ThreadLocalORMSession.close_all()
     with h.push_context('test', 'svn-tags', neighborhood='Projects'):
         c.app.repo.name = 'testsvn-trunk-tags-branches'
         c.app.repo.fs_path = repo_dir
         self.svn_tags = c.app.repo
         self.svn_tags.refresh()
         ThreadLocalORMSession.flush_all()
         ThreadLocalORMSession.close_all()
     h.set_context('test', 'src', neighborhood='Projects')
Esempio n. 46
0
 def test_commit(self):
     assert self.rev.primary() is self.rev
     assert self.rev.index_id().startswith('allura/model/repo/Commit#')
     self.rev.author_url
     self.rev.committer_url
     assert self.rev.tree._id == self.rev.tree_id
     assert self.rev.summary == self.rev.message.splitlines()[0]
     assert self.rev.shorthand_id() == '[1e146e]'
     assert self.rev.symbolic_ids == (['master', 'zz'], [])
     assert self.rev.url() == (
         '/p/test/src-git/ci/'
         '1e146e67985dcd71c74de79613719bef7bddca4a/')
     all_cis = self.repo.log(self.rev._id, 0, 1000)
     assert len(all_cis) == 4
     assert_equal(self.repo.log(self.rev._id, 1,1000), all_cis[1:])
     assert_equal(self.repo.log(self.rev._id, 0,3), all_cis[:3])
     assert_equal(self.repo.log(self.rev._id, 1,2), all_cis[1:3])
     for ci in all_cis:
         ci.context()
     self.rev.tree.ls()
     # print self.rev.tree.readme()
     assert_equal(self.rev.tree.readme(), (
         'README', 'This is readme\nAnother Line\n'))
     assert self.rev.tree.path() == '/'
     assert self.rev.tree.url() == (
         '/p/test/src-git/ci/'
         '1e146e67985dcd71c74de79613719bef7bddca4a/'
         'tree/')
     self.rev.tree.by_name['README']
     assert self.rev.tree.is_blob('README') == True
     ThreadLocalORMSession.close_all()
     c.app = None
     converted = g.markdown.convert('[1e146e]')
     assert '1e146e' in converted, converted
     h.set_context('test', 'wiki', neighborhood='Projects')
     pg = WM.Page(
         title='Test Page', text='This is a commit reference: [1e146e]')
     ThreadLocalORMSession.flush_all()
     M.MonQTask.run_ready()
     for ci in pg.related_artifacts():
         assert ci.shorthand_id() == '[1e146e]', ci.shorthand_id()
         assert ci.url() == (
             '/p/test/src-git/ci/'
             '1e146e67985dcd71c74de79613719bef7bddca4a/')
Esempio n. 47
0
def main(options):
    log.addHandler(logging.StreamHandler(sys.stdout))
    log.setLevel(getattr(logging, options.log_level.upper()))

    g.solr = mock.Mock()
    preamble = options.dry_run and "Would delete" or "Deleting"
    options.preamble = preamble

    for nbhd in M.Neighborhood.query.find():
        q = {'neighborhood_id': nbhd._id}
        for projects in utils.chunked_find(M.Project, q):
            for p in projects:
                scrub_project(p, options)
            ThreadLocalORMSession.flush_all()
            ThreadLocalORMSession.close_all()

    log.info('%s %s EmailAddress documents' %
             (preamble, M.EmailAddress.find().count()))
    log.info('%s email addresses from %s User documents' %
             (preamble, M.User.query.find().count()))
    log.info('%s monitoring_email addresses from %s Forum documents' %
             (preamble,
              DM.Forum.query.find({
                  "monitoring_email": {
                      "$nin": [None, ""]
                  }
              }).count()))

    if not options.dry_run:
        M.EmailAddress.query.remove()
        M.User.query.update({}, {
            "$set": {
                "email_addresses": [],
                "last_access": {}
            },
        },
                            multi=True)
        DM.Forum.query.update({"monitoring_email": {
            "$nin": [None, ""]
        }}, {"$set": {
            "monitoring_email": None
        }},
                              multi=True)
    return 0
Esempio n. 48
0
def test_thread_methods():
    d = M.Discussion(shortname='test', name='test')
    t = M.Thread.new(discussion_id=d._id, subject='Test Thread')
    assert t.discussion_class() == M.Discussion
    assert t.post_class() == M.Post
    assert t.attachment_class() == M.DiscussionAttachment
    p0 = t.post('This is a post')
    p1 = t.post('This is another post')
    time.sleep(0.25)
    p2 = t.post('This is a reply', parent_id=p0._id)
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
    d = M.Discussion.query.get(shortname='test')
    t = d.threads[0]
    assert d.last_post is not None
    assert t.last_post is not None
    t.create_post_threads(t.posts)
    posts0 = t.find_posts(page=0, limit=10, style='threaded')
    posts1 = t.find_posts(page=0, limit=10, style='timestamp')
    assert posts0 != posts1
    ts = p0.timestamp.replace(
        microsecond=int(p0.timestamp.microsecond // 1000) * 1000)
    posts2 = t.find_posts(page=0, limit=10, style='threaded', timestamp=ts)
    assert len(posts2) > 0

    assert 'wiki/_discuss/' in t.url()
    assert t.index()['views_i'] == 0
    assert not t.subscription
    t.subscription = True
    assert t.subscription
    t.subscription = False
    assert not t.subscription
    assert t.top_level_posts().count() == 2
    assert t.post_count == 3
    jsn = t.__json__()
    assert '_id' in jsn
    assert_equals(len(jsn['posts']), 3)
    (p.approve() for p in (p0, p1))
    assert t.num_replies == 2
    t.spam()
    assert t.num_replies == 0
    ThreadLocalORMSession.flush_all()
    assert len(t.find_posts()) == 0
    t.delete()
Esempio n. 49
0
    def test_paged_diffs_with_detect_copies(self):
        # setup
        h.set_context('test', 'src-weird', neighborhood='Projects')
        repo_dir = pkg_resources.resource_filename('forgegit', 'tests/data')
        repo = GM.Repository(name='weird-chars.git',
                             fs_path=repo_dir,
                             url_path='/src-weird/',
                             tool='git',
                             status='creating')
        repo.refresh()
        ThreadLocalORMSession.flush_all()
        ThreadLocalORMSession.close_all()

        diffs = repo.paged_diffs(
            '346c52c1dddc729e2c2711f809336401f0ff925e')  # Test copy
        expected = {
            'added': [],
            'removed': [],
            'copied': [{
                'new': 'README.copy',
                'old': 'README',
                'ratio': 1.0
            }],
            'renamed': [],
            'changed': ['README'],
            'total': 2,
        }
        assert_equals(diffs, expected)
        diffs = repo.paged_diffs(
            '3cb2bbcd7997f89060a14fe8b1a363f01883087f')  # Test rename
        expected = {
            'added': [],
            'removed': [],
            'copied': [],
            'renamed': [{
                'new': 'README',
                'old': 'README-copy.md',
                'ratio': 1.0
            }],
            'changed': [],
            'total': 1,
        }
        assert_equals(diffs, expected)
Esempio n. 50
0
def setup_unit_test():
    try:
        while True:
            REGISTRY.cleanup()
    except:
        pass
    REGISTRY.prepare()
    REGISTRY.register(ew.widget_context,
                      ew.core.WidgetContext('http', ew.ResourceManager()))
    REGISTRY.register(g, Globals())
    REGISTRY.register(c, mock.Mock())
    REGISTRY.register(url, lambda: None)
    REGISTRY.register(response, Response())
    REGISTRY.register(session, beaker.session.SessionObject({}))
    REGISTRY.register(allura.credentials, allura.lib.security.Credentials())
    c.memoize_cache = {}
    c.queued_messages = None
    c.model_cache = None
    ThreadLocalORMSession.close_all()
Esempio n. 51
0
 def test_send_direct_no_access(self, sendmail):
     c.user = M.User.query.get(username='******')
     wiki = c.project.app_instance('wiki')
     page = WM.Page.query.get(app_config_id=wiki.config._id)
     page.parent_security_context().acl = []
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     notification = M.Notification(
         _id='_id',
         ref=page.ref,
         from_address='from_address',
         reply_to_address='reply_to_address',
         in_reply_to='in_reply_to',
         subject='subject',
         text='text',
     )
     notification.footer = lambda: ' footer'
     notification.send_direct(c.user._id)
     assert_equal(sendmail.post.call_count, 0)
Esempio n. 52
0
 def test_subscribe_unsubscribe(self):
     M.Mailbox.subscribe(type='direct')
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     subscriptions = M.Mailbox.query.find(
         dict(project_id=c.project._id,
              app_config_id=c.app.config._id,
              user_id=c.user._id)).all()
     assert len(subscriptions) == 1
     assert subscriptions[0].type == 'direct'
     assert M.Mailbox.query.find().count() == 1
     M.Mailbox.unsubscribe()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     subscriptions = M.Mailbox.query.find(
         dict(project_id=c.project._id,
              app_config_id=c.app.config._id,
              user_id=c.user._id)).all()
     assert len(subscriptions) == 0
     assert M.Mailbox.query.find().count() == 0
Esempio n. 53
0
 def handle_command(self, sender, cmd, rest):
     if cmd == 'NOTICE': pass
     elif cmd == '433':
         self.set_nick()
         self.channels = {}
         self.configure()
     elif cmd == 'PING':
         self.say('PONG ' + rest)
     elif cmd in ('NOTICE', 'PRIVMSG'):
         rcpt, msg = rest.split(' ', 1)
         if not self.set_context(rcpt): return
         if msg.startswith(':'): msg = msg[1:]
         self.log_channel(sender, cmd, rcpt, msg)
         if cmd == 'NOTICE': return
         for lnk in search.find_shortlinks(msg):
             self.handle_shortlink(lnk, sender, rcpt)
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     self.check_configure()
     ThreadLocalORMSession.close_all()
Esempio n. 54
0
def setup_unit_test():
    try:
        while True:
            REGISTRY.cleanup()
    except Exception:
        pass
    REGISTRY.prepare()
    REGISTRY.register(ew.widget_context,
                      ew.core.WidgetContext('http', ew.ResourceManager()))
    REGISTRY.register(allura.credentials, allura.lib.security.Credentials())

    # turbogears has its own special magic wired up for its globals, can't use a regular Registry
    tgl = RequestLocals()
    tgl.app_globals = Globals()
    tgl.tmpl_context = mock.Mock()
    tgl.url = lambda: None
    tgl.request = Request.blank('/', remote_addr='127.0.0.1')
    tgl.response = Response()
    tg.request_local.context._push_object(tgl)

    c.model_cache = None
    ThreadLocalORMSession.close_all()
Esempio n. 55
0
 def fork(self, project_id=None, mount_point=None, mount_label=None, **kw):
     # this shows the form and handles the submission
     require_authenticated()
     if not c.app.forkable:
         raise exc.HTTPNotFound
     from_repo = c.app.repo
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     from_project = c.project
     to_project = M.Project.query.get(_id=ObjectId(project_id))
     mount_label = mount_label or '%s - %s' % (c.project.name,
                                               c.app.config.options.mount_label)
     mount_point = (mount_point or from_project.shortname)
     if request.method != 'POST' or not mount_point:
         return dict(from_repo=from_repo,
                     user_project=c.user.private_project(),
                     mount_point=mount_point,
                     mount_label=mount_label)
     else:
         with h.push_config(c, project=to_project):
             if not to_project.database_configured:
                 to_project.configure_project(is_user_project=True)
             require_access(to_project, 'admin')
             try:
                 to_project.install_app(
                     ep_name=from_repo.tool_name,
                     mount_point=mount_point,
                     mount_label=mount_label,
                     cloned_from_project_id=from_project._id,
                     cloned_from_repo_id=from_repo._id)
                 redirect(to_project.url() + mount_point + '/')
             except exc.HTTPRedirection:
                 raise
             except Exception, ex:
                 flash(str(ex), 'error')
                 redirect(request.referer)
 def setUp(self):
     setup_basic_test()
     setup_global_objects()
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
     self.prefix = tg.config.get('scm.repos.root', '/')
Esempio n. 57
0
 def _subscribe(self, **kw):
     self.pg.subscribe(type='direct', **kw)
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 58
0
def tearDown():
    ThreadLocalORMSession.close_all()
Esempio n. 59
0
 def _clear_subscriptions(self):
     M.Mailbox.query.remove({})
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()
Esempio n. 60
0
 def _subscribe(self, type='direct', topic=None):
     self.pg.subscribe(type=type, topic=topic)
     ThreadLocalORMSession.flush_all()
     ThreadLocalORMSession.close_all()