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()
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)
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)
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
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
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
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(): 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)
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']))
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()
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()
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()
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 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()
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
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'
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')
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()
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()
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()
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()
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
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)
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']
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()
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()
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()
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()
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()
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')
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/')
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
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()
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)
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()
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)
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
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()
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()
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', '/')
def _subscribe(self, **kw): self.pg.subscribe(type='direct', **kw) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def tearDown(): ThreadLocalORMSession.close_all()
def _clear_subscriptions(self): M.Mailbox.query.remove({}) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()
def _subscribe(self, type='direct', topic=None): self.pg.subscribe(type=type, topic=topic) ThreadLocalORMSession.flush_all() ThreadLocalORMSession.close_all()