def get_repos( sa_session, path_to_repositories ): """ Load repos from DB and included tools from .xml configs. """ results = [] for repo in sa_session.query( model.Repository ).filter_by( deleted=False ).filter_by( deprecated=False ).filter( model.Repository.type != 'tool_dependency_definition' ): repo_id = repo.id name = repo.name description = repo.description long_description = repo.long_description homepage_url = repo.homepage_url remote_repository_url = repo.remote_repository_url times_downloaded = repo.times_downloaded if not isinstance( times_downloaded, ( int, long ) ): times_downloaded = 0 repo_owner_username = '' if repo.user_id is not None: user = sa_session.query( model.User ).filter( model.User.id == repo.user_id ).one() repo_owner_username = user.username approved = 'no' for review in repo.reviews: if review.approved == 'yes': approved = 'yes' break # Format the time since last update to be nicely readable. last_updated = pretty_print_time_interval( repo.update_time ) full_last_updated = repo.update_time.strftime( "%Y-%m-%d %I:%M %p" ) # Parse all the tools within repo for separate index. tools_list = [] path = os.path.join( path_to_repositories, *model.directory_hash_id( repo.id )) path = os.path.join( path, "repo_%d" % repo.id ) if os.path.exists(path): tools_list.extend( load_one_dir( path ) ) for root, dirs, files in os.walk( path ): if '.hg' in dirs: dirs.remove('.hg') for dirname in dirs: tools_in_dir = load_one_dir( os.path.join( root, dirname ) ) tools_list.extend( tools_in_dir ) results.append(dict( id=repo_id, name=name, description=description, long_description=long_description, homepage_url=homepage_url, remote_repository_url=remote_repository_url, repo_owner_username=repo_owner_username, times_downloaded=times_downloaded, approved=approved, last_updated=last_updated, full_last_updated=full_last_updated, tools_list=tools_list ) ) return results
def create_repository( app, name, type, description, long_description, user_id, category_ids=[], remote_repository_url=None, homepage_url=None, ): """Create a new ToolShed repository""" sa_session = app.model.context.current # Add the repository record to the database. repository = app.model.Repository( name=name, type=type, remote_repository_url=remote_repository_url, homepage_url=homepage_url, description=description, long_description=long_description, user_id=user_id, ) # Flush to get the id. sa_session.add(repository) sa_session.flush() # Create an admin role for the repository. repository_admin_role = create_repository_admin_role(app, repository) # Determine the repository's repo_path on disk. dir = os.path.join(app.config.file_path, *directory_hash_id(repository.id)) # Create directory if it does not exist. if not os.path.exists(dir): os.makedirs(dir) # Define repo name inside hashed directory. repository_path = os.path.join(dir, "repo_%d" % repository.id) # Create local repository directory. if not os.path.exists(repository_path): os.makedirs(repository_path) # Create the local repository. repo = hg_util.get_repo_for_repository(app, repository=None, repo_path=repository_path, create=True) # Add an entry in the hgweb.config file for the local repository. lhs = "repos/%s/%s" % (repository.user.username, repository.name) app.hgweb_config_manager.add_entry(lhs, repository_path) # Create a .hg/hgrc file for the local repository. hg_util.create_hgrc_file(app, repository) flush_needed = False if category_ids: # Create category associations for category_id in category_ids: category = sa_session.query(app.model.Category).get(app.security.decode_id(category_id)) rca = app.model.RepositoryCategoryAssociation(repository, category) sa_session.add(rca) flush_needed = True if flush_needed: sa_session.flush() # Update the repository registry. app.repository_registry.add_entry(repository) message = "Repository <b>%s</b> has been created." % escape(str(repository.name)) return repository, message
def create_repository(app, name, type, description, long_description, user_id, category_ids=[]): sa_session = app.model.context.current # Add the repository record to the database. repository = app.model.Repository(name=name, type=type, description=description, long_description=long_description, user_id=user_id) # Flush to get the id. sa_session.add(repository) sa_session.flush() # Create an admin role for the repository. repository_admin_role = create_repository_admin_role(app, repository) # Determine the repository's repo_path on disk. dir = os.path.join(app.config.file_path, *directory_hash_id(repository.id)) # Create directory if it does not exist. if not os.path.exists(dir): os.makedirs(dir) # Define repo name inside hashed directory. repository_path = os.path.join(dir, "repo_%d" % repository.id) # Create local repository directory. if not os.path.exists(repository_path): os.makedirs(repository_path) # Create the local repository. repo = hg_util.get_repo_for_repository(app, repository=None, repo_path=repository_path, create=True) # Add an entry in the hgweb.config file for the local repository. lhs = "repos/%s/%s" % (repository.user.username, repository.name) app.hgweb_config_manager.add_entry(lhs, repository_path) # Create a .hg/hgrc file for the local repository. hg_util.create_hgrc_file(app, repository) flush_needed = False if category_ids: # Create category associations for category_id in category_ids: category = sa_session.query( app.model.Category ) \ .get( app.security.decode_id( category_id ) ) rca = app.model.RepositoryCategoryAssociation(repository, category) sa_session.add(rca) flush_needed = True if flush_needed: sa_session.flush() # Update the repository registry. app.repository_registry.add_entry(repository) message = "Repository <b>%s</b> has been created." % escape( str(repository.name)) return repository, message
def create_repository( trans, name, type, description, long_description, user_id, category_ids=[] ): # Add the repository record to the database. repository = trans.app.model.Repository( name=name, type=type, description=description, long_description=long_description, user_id=user_id ) # Flush to get the id. trans.sa_session.add( repository ) trans.sa_session.flush() # Create an admin role for the repository. repository_admin_role = create_repository_admin_role( trans, repository ) # Determine the repository's repo_path on disk. dir = os.path.join( trans.app.config.file_path, *directory_hash_id( repository.id ) ) # Create directory if it does not exist. if not os.path.exists( dir ): os.makedirs( dir ) # Define repo name inside hashed directory. repository_path = os.path.join( dir, "repo_%d" % repository.id ) # Create local repository directory. if not os.path.exists( repository_path ): os.makedirs( repository_path ) # Create the local repository. repo = hg.repository( suc.get_configured_ui(), repository_path, create=True ) # Add an entry in the hgweb.config file for the local repository. lhs = "repos/%s/%s" % ( repository.user.username, repository.name ) trans.app.hgweb_config_manager.add_entry( lhs, repository_path ) # Create a .hg/hgrc file for the local repository. create_hgrc_file( trans, repository ) flush_needed = False if category_ids: # Create category associations for category_id in category_ids: category = trans.sa_session.query( trans.model.Category ) \ .get( trans.security.decode_id( category_id ) ) rca = trans.app.model.RepositoryCategoryAssociation( repository, category ) trans.sa_session.add( rca ) flush_needed = True if flush_needed: trans.sa_session.flush() message = "Repository <b>%s</b> has been created." % str( repository.name ) return repository, message
def get_repos(sa_session, path_to_repositories): """ Load repos from DB and included tools from .xml configs. """ results = [] for repo in sa_session.query(model.Repository).filter_by( deleted=False).filter_by(deprecated=False).filter( model.Repository.type != 'tool_dependency_definition'): repo_id = repo.id name = repo.name description = repo.description long_description = repo.long_description homepage_url = repo.homepage_url remote_repository_url = repo.remote_repository_url times_downloaded = repo.times_downloaded if not isinstance(times_downloaded, (int, long)): times_downloaded = 0 repo_owner_username = '' if repo.user_id is not None: user = sa_session.query( model.User).filter(model.User.id == repo.user_id).one() repo_owner_username = user.username approved = 'no' for review in repo.reviews: if review.approved == 'yes': approved = 'yes' break # Format the time since last update to be nicely readable. last_updated = pretty_print_time_interval(repo.update_time) full_last_updated = repo.update_time.strftime("%Y-%m-%d %I:%M %p") # Parse all the tools within repo for separate index. tools_list = [] path = os.path.join(path_to_repositories, *model.directory_hash_id(repo.id)) path = os.path.join(path, "repo_%d" % repo.id) if os.path.exists(path): tools_list.extend(load_one_dir(path)) for root, dirs, files in os.walk(path): if '.hg' in dirs: dirs.remove('.hg') for dirname in dirs: tools_in_dir = load_one_dir(os.path.join(root, dirname)) tools_list.extend(tools_in_dir) results.append( dict(id=repo_id, name=name, description=description, long_description=long_description, homepage_url=homepage_url, remote_repository_url=remote_repository_url, repo_owner_username=repo_owner_username, times_downloaded=times_downloaded, approved=approved, last_updated=last_updated, full_last_updated=full_last_updated, tools_list=tools_list)) return results
def get_repos( sa_session, path_to_repositories ): """ Load repos from DB and included tools from .xml configs. """ results = [] for repo in sa_session.query( model.Repository ).filter_by( deleted=False ).filter_by( deprecated=False ).filter( model.Repository.type != 'tool_dependency_definition' ): repo_id = repo.id name = repo.name description = repo.description long_description = repo.long_description homepage_url = repo.homepage_url remote_repository_url = repo.remote_repository_url times_downloaded = repo.times_downloaded if not isinstance( times_downloaded, ( int, long ) ): times_downloaded = 0 repo_owner_username = '' if repo.user_id is not None: user = sa_session.query( model.User ).filter( model.User.id == repo.user_id ).one() repo_owner_username = user.username approved = 'no' for review in repo.reviews: if review.approved == 'yes': approved = 'yes' break # Format the time since last update to be nicely readable. last_updated = pretty_print_time_interval( repo.update_time ) full_last_updated = repo.update_time.strftime( "%Y-%m-%d %I:%M %p" ) # Parse all the tools within repo for separate index. tools_list = [] path = os.path.join( path_to_repositories, *model.directory_hash_id( repo.id )) path = os.path.join( path, "repo_%d" % repo.id ) if os.path.exists(path): tool_elems = load_tool_elements_from_path(path) if tool_elems: for elem in tool_elems: root = elem[1].getroot() if root.tag == 'tool': tool = {} if root.find('help') is not None: tool.update( dict( help=root.find( 'help' ).text ) ) if root.find('description') is not None: tool.update( dict( description=root.find( 'description' ).text ) ) tool.update( dict( id=root.attrib.get('id'), name=root.attrib.get('name'), version=root.attrib.get('version') ) ) tools_list.append( tool ) results.append(dict( id=repo_id, name=name, description=description, long_description=long_description, homepage_url=homepage_url, remote_repository_url=remote_repository_url, repo_owner_username=repo_owner_username, times_downloaded=times_downloaded, approved=approved, last_updated=last_updated, full_last_updated=full_last_updated, tools_list=tools_list ) ) return results