Beispiel #1
0
def admin_redirects() -> Any:
    if not flask.session.get('admin'):
        return unauthorized()

    oldname = ''
    metapackages: List[Any] = []
    metapackagedata: Dict[str, Any] = {}

    if flask.request.method == 'POST':
        oldname = flask.request.form.get('oldname', '')
        newname = flask.request.form.get('newname')

        if oldname and newname:
            if flask.request.form.get('action') == 'remove':
                get_db().remove_project_redirect(oldname, newname)
                flask.flash('Redirect removed succesfully', 'success')
            else:
                get_db().add_project_redirect(oldname, newname, True)
                flask.flash('Redirect added succesfully', 'success')

        if oldname:
            newnames = get_db().get_project_redirects(oldname)

            metapackages = get_db().get_metapackages(newnames)
            packages = get_db().get_metapackages_packages(newnames, fields=['family', 'effname', 'version', 'versionclass', 'flags'])
            metapackagedata = packages_to_summary_items(packages)

    return flask.render_template(
        'admin-redirects.html',
        oldname=oldname,
        metapackages=metapackages,
        metapackagedata=metapackagedata,
    )
Beispiel #2
0
def project_related(name: str) -> Any:
    metapackage = get_db().get_metapackage(name)

    if not metapackage or metapackage['num_repos'] == 0:
        return handle_nonexisting_project(name, metapackage)

    metapackages = get_db().get_metapackage_related_metapackages(
        name, limit=config['METAPACKAGES_PER_PAGE'])

    metapackagedata = packages_to_summary_items(
        PackageDataSummarizable(**item)
        for item in get_db().get_metapackages_packages(
            list(metapackages.keys()), summarizable=True))

    too_many_warning = None
    if len(metapackagedata) == config['METAPACKAGES_PER_PAGE']:
        too_many_warning = config['METAPACKAGES_PER_PAGE']

    return (flask.render_template('project-related.html',
                                  name=name,
                                  metapackage=metapackage,
                                  metapackages=metapackages,
                                  metapackagedata=metapackagedata,
                                  too_many_warning=too_many_warning),
            200 if metapackages else 404)
Beispiel #3
0
def project_related(name: str) -> Any:
    metapackage = get_db().get_metapackage(name)

    if not metapackage or metapackage['num_repos'] == 0:
        return handle_nonexisting_project(name, metapackage)

    metapackages = get_db().get_metapackage_related_metapackages(name, limit=config['METAPACKAGES_PER_PAGE'])

    packages = get_db().get_metapackages_packages(list(metapackages.keys()), fields=['family', 'effname', 'version', 'versionclass', 'flags'])

    metapackagedata = packages_to_summary_items(packages)

    too_many_warning = None
    if len(metapackagedata) == config['METAPACKAGES_PER_PAGE']:
        too_many_warning = config['METAPACKAGES_PER_PAGE']

    return (
        flask.render_template(
            'project-related.html',
            name=name,
            metapackage=metapackage,
            metapackages=metapackages,
            metapackagedata=metapackagedata,
            too_many_warning=too_many_warning
        ),
        200 if metapackages else 404
    )
Beispiel #4
0
def projects(bound: Optional[str] = None) -> Response:
    # process search
    filterinfo = MetapackagesFilterInfo()
    filterinfo.parse_flask_args()

    request = filterinfo.get_request()
    request.set_bound(bound)

    # get packages
    def get_packages(
        request: MetapackageRequest
    ) -> Tuple[Dict[str, Dict[str, Any]], List[PackageDataSummarizable]]:
        metapackages = get_db().query_metapackages(
            **request.__dict__,
            limit=config['METAPACKAGES_PER_PAGE'],
        )

        packages = [
            PackageDataSummarizable(**item)
            for item in get_db().get_metapackages_packages(
                list(metapackages.keys()), summarizable=True)
        ]

        return metapackages, packages

    metapackages, packages = get_packages(request)

    # on empty result, fallback to show first, last set of results
    if not packages:
        request = filterinfo.get_request()
        if bound and bound.startswith('..'):
            request.require_name_to(None)
        metapackages, packages = get_packages(request)

    firstname, lastname = get_packages_name_range(packages)

    metapackagedata = packages_to_summary_items(packages,
                                                filterinfo.get_repo(),
                                                filterinfo.get_maintainer())

    return flask.render_template('projects.html',
                                 firstname=firstname,
                                 lastname=lastname,
                                 search=filterinfo.get_dict(),
                                 advanced=filterinfo.is_advanced(),
                                 metapackages=metapackages,
                                 metapackagedata=metapackagedata,
                                 repo=filterinfo.get_repo(),
                                 maintainer=filterinfo.get_maintainer())
Beispiel #5
0
def metapackages(bound=None):
    # process search
    filterinfo = MetapackagesFilterInfo()
    filterinfo.ParseFlaskArgs()

    request = filterinfo.GetRequest()
    request.Bound(bound)

    # get packages
    def get_packages(request):
        metapackages = get_db().query_metapackages(
            **request.__dict__,
            limit=config['METAPACKAGES_PER_PAGE'],
        )

        packages = get_db().get_metapackages_packages(
            list(metapackages.keys()),
            fields=[
                'repo', 'family', 'effname', 'version', 'versionclass',
                'maintainers', 'flags'
            ])

        return metapackages, packages

    metapackages, packages = get_packages(request)

    # on empty result, fallback to show first, last set of results
    if not packages:
        request = filterinfo.GetRequest()
        if bound and bound.startswith('..'):
            request.NameTo(None)
        metapackages, packages = get_packages(request)

    firstname, lastname = get_packages_name_range(packages)

    metapackagedata = packages_to_summary_items(packages, filterinfo.GetRepo(),
                                                filterinfo.GetMaintainer())

    return flask.render_template('metapackages.html',
                                 firstname=firstname,
                                 lastname=lastname,
                                 search=filterinfo.GetDict(),
                                 advanced=filterinfo.IsAdvanced(),
                                 metapackages=metapackages,
                                 metapackagedata=metapackagedata,
                                 repo=filterinfo.GetRepo(),
                                 maintainer=filterinfo.GetMaintainer())
Beispiel #6
0
def handle_nonexisting_project(name: str, metapackage: Dict[str, Any]) -> Any:
    # we don't show anything to user when REDIRECTS_PER_PAGE is reached as
    # number of redirect targets is natually limited and we don't expect it to be reached
    redirects = get_db().get_project_redirects(name, limit=config['REDIRECTS_PER_PAGE'])

    if len(redirects) == 1:
        # single redirect - follow it right away
        flask.flash('You were redirected from project {}, which is not known by Repology'.format(name), 'info')
        return flask.redirect(flask.url_for(flask.request.endpoint, name=redirects[0]), 301)

    metapackages: List[Any] = []
    metapackagedata: Dict[str, Any] = {}

    if redirects:
        # show redirects
        metapackages = get_db().get_metapackages(redirects)
        packages = get_db().get_metapackages_packages(redirects, fields=['family', 'effname', 'version', 'versionclass', 'flags'])

        metapackagedata = packages_to_summary_items(packages)

    if not metapackage:
        return (
            flask.render_template(
                'project-404.html',
                name=name,
                metapackages=metapackages,
                metapackagedata=metapackagedata
            ),
            404
        )
    else:
        has_history, has_reports = get_db().project_has_history_or_reports(name)

        return (
            flask.render_template(
                'project-410.html',
                name=name,
                metapackage=metapackage,
                metapackages=metapackages,
                metapackagedata=metapackagedata,
                has_history=has_history,
                has_reports=has_reports
            ),
            404
        )
Beispiel #7
0
def project_related(name: str) -> Any:
    metapackages = get_db().get_metapackage_related_metapackages(name, limit=config['METAPACKAGES_PER_PAGE'])

    packages = get_db().get_metapackages_packages(list(metapackages.keys()), fields=['family', 'effname', 'version', 'versionclass', 'flags'])

    metapackagedata = packages_to_summary_items(packages)

    too_many_warning = None
    if len(metapackagedata) == config['METAPACKAGES_PER_PAGE']:
        too_many_warning = config['METAPACKAGES_PER_PAGE']

    return flask.render_template(
        'project-related.html',
        metapackage=get_db().get_metapackage(name),
        name=name,
        metapackages=metapackages,
        metapackagedata=metapackagedata,
        too_many_warning=too_many_warning
    )
Beispiel #8
0
def handle_nonexisting_project(name: str, metapackage: Dict[str, Any]) -> Any:
    # we don't show anything to user when REDIRECTS_PER_PAGE is reached as
    # number of redirect targets is natually limited and we don't expect it to be reached
    redirects = get_db().get_project_redirects(
        name, limit=config['REDIRECTS_PER_PAGE'])

    if len(redirects) == 1:
        # single redirect - follow it right away
        flask.flash(
            f'You were redirected from {name}, which was moved or merged here',
            'info')
        return flask.redirect(
            flask.url_for(flask.request.endpoint, name=redirects[0]), 301)

    metapackages: List[Any] = []
    metapackagedata: Dict[str, Any] = {}

    if redirects:
        # show redirects
        metapackages = get_db().get_metapackages(redirects)

        metapackagedata = packages_to_summary_items(
            PackageDataSummarizable(**item)
            for item in get_db().get_metapackages_packages(redirects,
                                                           summarizable=True))

    if not metapackage:
        return (flask.render_template('project-404.html',
                                      name=name,
                                      metapackages=metapackages,
                                      metapackagedata=metapackagedata), 404)
    else:
        has_history, has_reports = get_db().project_has_history_or_reports(
            name)

        return (flask.render_template('project-410.html',
                                      name=name,
                                      metapackage=metapackage,
                                      metapackages=metapackages,
                                      metapackagedata=metapackagedata,
                                      has_history=has_history,
                                      has_reports=has_reports), 404)
Beispiel #9
0
def index() -> Any:
    top_by_total = Top()
    top_by_nonunique = Top()
    top_by_newest = Top()
    top_by_pnewest = Top()
    top_by_maintainers = Top()
    top_by_problematic = Top()  # not used right now
    top_by_ppm = Top(reverse=True)

    for repo in get_db().get_active_repositories():
        metadata = repometadata[repo['name']]
        if metadata['type'] != 'repository':
            continue
        top_by_total.add(metadata['statsgroup'], repo['name'],
                         repo['num_metapackages'])
        top_by_nonunique.add(
            metadata['statsgroup'], repo['name'],
            repo['num_metapackages'] - repo['num_metapackages_unique'])
        top_by_newest.add(metadata['statsgroup'], repo['name'],
                          repo['num_metapackages_newest'])
        top_by_maintainers.add(metadata['statsgroup'], repo['name'],
                               repo['num_maintainers'])
        top_by_problematic.add(
            metadata['statsgroup'], repo['name'],
            safe_percent(repo['num_metapackages_problematic'],
                         repo['num_metapackages']))

        if repo['num_metapackages'] > 1000:
            top_by_pnewest.add(
                metadata['statsgroup'], repo['name'],
                safe_percent(repo['num_metapackages_newest'],
                             repo['num_metapackages_comparable']))
            if repo['num_maintainers'] > 0:
                top_by_ppm.add(
                    metadata['statsgroup'], repo['name'],
                    repo['num_metapackages'] / repo['num_maintainers'])

    important_packages = [
        'apache24',
        'awesome',
        'bash',
        'binutils',
        'bison',
        'blender',
        'boost',
        'bzip2',
        'chromium',
        'claws-mail',
        'cmake',
        'cppcheck',
        'cups',
        'curl',
        'darktable',
        'dia',
        'djvulibre',
        'dosbox',
        'dovecot',
        'doxygen',
        'dvd+rw-tools',
        'emacs',
        'exim',
        'ffmpeg',
        'firefox',
        'flex',
        'fluxbox',
        'freecad',
        'freetype',
        'gcc',
        'gdb',
        'geeqie',
        'gimp',
        'git',
        'gnupg',
        'go',
        'graphviz',
        'grub',
        'icewm',
        'imagemagick',
        'inkscape',
        'irssi',
        'kodi',
        'lame',
        'lftp',
        'libreoffice',
        'libressl',
        'lighttpd',
        'links',
        'llvm',
        'mariadb',
        'maxima',
        'mc',
        'memcached',
        'mercurial',
        'mesa',
        'mplayer',
        'mutt',
        'mysql',
        'nginx',
        'nmap',
        'octave',
        'openbox',
        'openssh',
        'openssl',
        'openttf',
        'openvpn',
        'p7zip',
        'perl',
        'pidgin',
        'postfix',
        'postgresql',
        'privoxy',
        'procmail',
        'python3',
        'qemu',
        'rdesktop',
        'redis',
        'rrdtool',
        'rsync',
        'rtorrent',
        'rxvt-unicode',
        'samba',
        'sane-backends',
        'scons',
        'screen',
        'scribus',
        'scummvm',
        'sdl2',
        'smartmontools',
        'sqlite3',
        'squid',
        'subversion',
        'sudo',
        'sumversion',
        'thunderbird',
        'tigervnc',
        'tmux',
        'tor',
        'valgrind',
        'vim',
        'virtualbox',
        'vlc',
        'vsftpd',
        'wayland',
        'wesnoth',
        'wget',
        'wine',
        'wireshark',
        'xorg-server',
        'youtube-dl',
        'zsh',
    ]

    metapackages = get_db().get_metapackages(important_packages)

    metapackagedata = packages_to_summary_items(
        PackageDataSummarizable(**item)
        for item in get_db().get_metapackages_packages(important_packages,
                                                       summarizable=True))

    top_size = 10

    return flask.render_template(
        'index.html',
        top_by_total=top_by_total.get(top_size),
        top_by_nonunique=top_by_nonunique.get(top_size),
        top_by_newest=top_by_newest.get(top_size),
        top_by_pnewest=top_by_pnewest.get(top_size),
        top_by_maintainers=top_by_maintainers.get(top_size),
        top_by_ppm=top_by_ppm.get(top_size),
        metapackages=metapackages,
        metapackagedata=metapackagedata)
Beispiel #10
0
def index():
    repostats = [
        repo for repo in get_db().get_active_repositories()
        if repometadata[repo['name']]['type'] == 'repository'
    ]

    top_repos = {
        'by_total': [{
            'name': repo['name'],
            'value': repo['num_metapackages'],
        } for repo in sorted(
            repostats, key=lambda repo: repo['num_metapackages'], reverse=True)
                     ][:10],
        'by_nonunique': [{
            'name':
            repo['name'],
            'value':
            repo['num_metapackages'] - repo['num_metapackages_unique'],
        } for repo in sorted(repostats,
                             key=lambda repo: repo['num_metapackages'] - repo[
                                 'num_metapackages_unique'],
                             reverse=True)][:10],
        'by_newest': [{
            'name': repo['name'],
            'value': repo['num_metapackages_newest'],
        } for repo in sorted(repostats,
                             key=lambda repo: repo['num_metapackages_newest'],
                             reverse=True)][:10],
        'by_pnewest': [{
            'name':
            repo['name'],
            'value':
            '{:.2f}%'.format(
                safe_percent(repo['num_metapackages_newest'],
                             repo['num_metapackages_comparable'])),
        } for repo in sorted(
            repostats,
            key=lambda repo: safe_percent(repo['num_metapackages_newest'],
                                          repo['num_metapackages_comparable']),
            reverse=True) if repo['num_metapackages'] > 1000][:8]
    }

    important_packages = [
        'apache24',
        'awesome',
        'bash',
        'binutils',
        'bison',
        'blender',
        'boost',
        'bzip2',
        'chromium',
        'claws-mail',
        'cmake',
        'cppcheck',
        'cups',
        'curl',
        'darktable',
        'dia',
        'djvulibre',
        'dosbox',
        'dovecot',
        'doxygen',
        'dvd+rw-tools',
        'emacs',
        'exim',
        'ffmpeg',
        'firefox',
        'flex',
        'fluxbox',
        'freecad',
        'freetype',
        'gcc',
        'gdb',
        'geeqie',
        'gimp',
        'git',
        'gnupg',
        'go',
        'graphviz',
        'grub',
        'icewm',
        'imagemagick',
        'inkscape',
        'irssi',
        'kodi',
        'lame',
        'lftp',
        'libreoffice',
        'libressl',
        'lighttpd',
        'links',
        'llvm',
        'mariadb',
        'maxima',
        'mc',
        'memcached',
        'mercurial',
        'mesa',
        'mplayer',
        'mutt',
        'mysql',
        'nginx',
        'nmap',
        'octave',
        'openbox',
        'openssh',
        'openssl',
        'openttf',
        'openvpn',
        'p7zip',
        'perl',
        'pidgin',
        'postfix',
        'postgresql',
        'privoxy',
        'procmail',
        'python3',
        'qemu',
        'rdesktop',
        'redis',
        'rrdtool',
        'rsync',
        'rtorrent',
        'rxvt-unicode',
        'samba',
        'sane-backends',
        'scons',
        'screen',
        'scribus',
        'scummvm',
        'sdl2',
        'smartmontools',
        'sqlite3',
        'squid',
        'subversion',
        'sudo',
        'sumversion',
        'thunderbird',
        'tigervnc',
        'tmux',
        'tor',
        'valgrind',
        'vim',
        'virtualbox',
        'vlc',
        'vsftpd',
        'wayland',
        'wesnoth',
        'wget',
        'wine',
        'wireshark',
        'xorg-server',
        'youtube-dl',
        'zsh',
    ]

    metapackages = get_db().get_metapackages(important_packages)

    packages = get_db().get_metapackages_packages(
        important_packages,
        fields=['family', 'effname', 'version', 'versionclass', 'flags'])

    metapackagedata = packages_to_summary_items(packages)

    return flask.render_template('index.html',
                                 top_repos=top_repos,
                                 metapackages=metapackages,
                                 metapackagedata=metapackagedata)