Beispiel #1
0
def add_distro():

    form = anitya.forms.DistroForm()

    if form.validate_on_submit():
        name = form.name.data

        distro = models.Distro(name)

        utilities.publish_message(
            distro=distro.__json__(),
            topic="distro.add",
            message=dict(agent=flask.g.user.username, distro=distro.name),
        )

        try:
            Session.add(distro)
            Session.commit()
            flask.flash("Distribution added")
        except SQLAlchemyError:
            Session.rollback()
            flask.flash("Could not add this distro, already exists?", "error")
        return flask.redirect(flask.url_for("anitya_ui.distros"))

    return flask.render_template("distro_add_edit.html",
                                 context="Add",
                                 current="distros",
                                 form=form)
Beispiel #2
0
def delete_distro(distro_name):
    """ Delete a distro """

    distro = models.Distro.by_name(Session, distro_name)
    if not distro:
        flask.abort(404)

    if not is_admin():
        flask.abort(401)

    form = anitya.forms.ConfirmationForm()

    if form.validate_on_submit():
        utilities.publish_message(
            distro=distro.__json__(),
            topic="distro.remove",
            message=dict(agent=flask.g.user.username, distro=distro.name),
        )

        Session.delete(distro)
        Session.commit()
        flask.flash("Distro %s has been removed" % distro_name)
        return flask.redirect(flask.url_for("anitya_ui.distros"))

    return flask.render_template("distro_delete.html",
                                 current="distros",
                                 distro=distro,
                                 form=form)
Beispiel #3
0
def delete_project_version(project_id, version):

    project = models.Project.get(Session, project_id)
    if not project:
        flask.abort(404)

    version_obj = None
    for vers in project.versions_obj:
        if version == vers.version:
            version_obj = vers
            break

    if version_obj is None:
        flask.abort(
            404,
            "Version %s not found for project %s" % (version, project.name))

    if not is_admin():
        flask.abort(401)

    form = anitya.forms.ConfirmationForm()
    confirm = flask.request.form.get("confirm", False)

    if form.validate_on_submit():
        if confirm:
            utilities.publish_message(
                project=project.__json__(),
                topic="project.version.remove",
                message=dict(agent=flask.g.user.username,
                             project=project.name,
                             version=version),
            )

            # Delete the record of the version for this project
            Session.delete(version_obj)
            # Adjust the latest_version if needed
            sorted_versions = project.get_sorted_version_objects()
            if len(sorted_versions
                   ) > 1 and sorted_versions[0].version == version:
                project.latest_version = sorted_versions[1].parse()
                Session.add(project)
            elif len(sorted_versions) == 1:
                project.latest_version = None
                Session.add(project)
            Session.commit()

            flask.flash("Version for %s has been removed" % version)
        return flask.redirect(
            flask.url_for("anitya_ui.project", project_id=project.id))

    return flask.render_template(
        "version_delete.html",
        current="projects",
        project=project,
        version=version,
        form=form,
    )
Beispiel #4
0
def delete_project_mapping(project_id, distro_name, pkg_name):

    project = models.Project.get(Session, project_id)
    if not project:
        flask.abort(404)

    distro = models.Distro.get(Session, distro_name)
    if not distro:
        flask.abort(404)

    package = models.Packages.get(Session, project.id, distro.name, pkg_name)
    if not package:
        flask.abort(404)

    if not is_admin():
        flask.abort(401)

    form = anitya.forms.ConfirmationForm()
    confirm = flask.request.form.get("confirm", False)

    if form.validate_on_submit():
        if confirm:
            utilities.publish_message(
                project=project.__json__(),
                topic="project.map.remove",
                message=dict(
                    agent=flask.g.user.username,
                    project=project.name,
                    distro=distro.name,
                ),
            )

            Session.delete(package)
            Session.commit()

            flask.flash("Mapping for %s has been removed" % project.name)
        return flask.redirect(
            flask.url_for("anitya_ui.project", project_id=project.id))

    return flask.render_template(
        "regex_delete.html",
        current="projects",
        project=project,
        package=package,
        form=form,
    )
Beispiel #5
0
def delete_project_versions(project_id):
    """
    Delete all versions on the project.
    """

    project = models.Project.get(Session, project_id)
    if not project:
        flask.abort(404)

    if not is_admin():
        flask.abort(401)

    form = anitya.forms.ConfirmationForm()
    confirm = flask.request.form.get("confirm", False)

    if form.validate_on_submit():
        if confirm:
            for version in project.versions_obj:
                # Delete the record of the version for this project
                Session.delete(version)

                utilities.publish_message(
                    project=project.__json__(),
                    topic="project.version.remove",
                    message=dict(
                        agent=flask.g.user.username,
                        project=project.name,
                        version=str(version),
                    ),
                )

            project.latest_version = None
            Session.add(project)
            Session.commit()

            flask.flash("All versions were removed")
        return flask.redirect(
            flask.url_for("anitya_ui.project", project_id=project.id))

    return flask.render_template(
        "project_versions_delete.html",
        current="projects",
        project=project,
        form=form,
    )
Beispiel #6
0
    def update_project(self, project_id: int) -> None:
        """
        Check for updates on the specified project.

        Args:
            project_id: Id of project to check
        """
        session = db.Session()
        project = db.Project.query.filter(db.Project.id == project_id).one()
        if project.backend in self.blacklist_dict:
            self.blacklist_project(project,
                                   self.blacklist_dict[project.backend])
            _log.info("{}: Backend is blacklisted. Rescheduling to {}".format(
                project.name, self.blacklist_dict[project.backend]))
            project.next_check = self.blacklist_dict[project.backend]
            session.add(project)
            session.commit()
            return
        try:
            _log.debug(f"Checking project {project.name}")
            utilities.check_project_release(project, session)
        except RateLimitException as err:
            self.blacklist_project(project, err.reset_time)
            return
        except AnityaException as err:
            _log.info(f"{project.name} : {str(err)}")
            with self.error_counter_lock:
                self.error_counter += 1
            if self.is_delete_candidate(project):
                session.delete(project)
                utilities.publish_message(
                    project=project.__json__(),
                    topic="project.remove",
                    message=dict(agent="anitya", project=project.name),
                )
                session.commit()
            return

        with self.success_counter_lock:
            self.success_counter += 1
Beispiel #7
0
def edit_distro(distro_name):

    distro = models.Distro.by_name(Session, distro_name)
    if not distro:
        flask.abort(404)

    if not is_admin():
        flask.abort(401)

    form = anitya.forms.DistroForm(obj=distro)

    if form.validate_on_submit():
        name = form.name.data

        if name != distro.name:
            utilities.publish_message(
                distro=distro.__json__(),
                topic="distro.edit",
                message=dict(agent=flask.g.user.username,
                             old=distro.name,
                             new=name),
            )

            distro.name = name

            Session.add(distro)
            Session.commit()
            message = "Distribution edited"
            flask.flash(message)
        return flask.redirect(flask.url_for("anitya_ui.distros"))

    return flask.render_template(
        "distro_add_edit.html",
        context="Edit",
        current="distros",
        distro=distro,
        form=form,
    )
Beispiel #8
0
def delete_project(project_id):

    project = models.Project.get(Session, project_id)
    if not project:
        flask.abort(404)

    if not is_admin():
        flask.abort(401)

    project_name = project.name

    form = anitya.forms.ConfirmationForm()
    confirm = flask.request.form.get("confirm", False)

    if form.validate_on_submit():
        if confirm:
            utilities.publish_message(
                project=project.__json__(),
                topic="project.remove",
                message=dict(agent=flask.g.user.username,
                             project=project.name),
            )

            for version in project.versions_obj:
                Session.delete(version)

            Session.delete(project)
            Session.commit()
            flask.flash("Project %s has been removed" % project_name)
            return flask.redirect(flask.url_for("anitya_ui.projects"))
        else:
            return flask.redirect(
                flask.url_for("anitya_ui.project", project_id=project.id))

    return flask.render_template("project_delete.html",
                                 current="projects",
                                 project=project,
                                 form=form)
Beispiel #9
0
    def post(self):
        """
        Create a new package associated with an existing project and distribution.

        **Example request**:

        .. sourcecode:: http

            POST /api/v2/packages/ HTTP/1.1
            Accept: application/json
            Accept-Encoding: gzip, deflate
            Authorization: Token gAOFi2wQPzUJFIfDkscAKjbJfXELCz0r44m57Ur2
            Connection: keep-alive
            Content-Length: 120
            Content-Type: application/json
            Host: localhost:5000
            User-Agent: HTTPie/0.9.4

            {
                "distribution": "Fedora",
                "package_name": "python-requests",
                "project_ecosystem": "pypi",
                "project_name": "requests"
            }

        .. sourcecode:: http

            HTTP/1.0 201 CREATED
            Content-Length: 69
            Content-Type: application/json
            Date: Mon, 15 Jan 2018 21:49:01 GMT
            Server: Werkzeug/0.14.1 Python/2.7.14

            {
                "distribution": "Fedora",
                "name": "python-requests"
            }


        :reqheader Authorization: API token to use for authentication
        :reqjson string distribution: The name of the distribution that contains this
            package.
        :reqjson string package_name: The name of the package in the distribution repository.
        :reqjson string project_name: The project name in Anitya.
        :reqjson string project_ecosystem: The ecosystem the project is a part of.
            If it's not part of an ecosystem, use the homepage used in the Anitya project.

        :statuscode 201: When the package was successfully created.
        :statuscode 400: When required arguments are missing or malformed.
        :statuscode 401: When your access token is missing or invalid
        :statuscode 409: When the package already exists.
        """
        distribution_help = _(
            "The name of the distribution that contains this package.")
        package_name_help = _(
            "The name of the package in the distribution repository.")
        project_name_help = _("The project name in Anitya.")
        project_ecosystem_help = _(
            "The ecosystem the project is a part of. If it's not part of an ecosystem,"
            " use the homepage used in the Anitya project.")

        parser = _BASE_ARG_PARSER.copy()
        parser.add_argument("distribution",
                            type=str,
                            help=distribution_help,
                            required=True)
        parser.add_argument("package_name",
                            type=str,
                            help=package_name_help,
                            required=True)
        parser.add_argument("project_name",
                            type=str,
                            help=project_name_help,
                            required=True)
        parser.add_argument("project_ecosystem",
                            type=str,
                            help=project_ecosystem_help,
                            required=True)
        args = parser.parse_args(strict=True)
        try:
            project = models.Project.query.filter(
                func.lower(models.Project.name) == func.lower(
                    args.project_name),
                func.lower(models.Project.ecosystem_name) == func.lower(
                    args.project_ecosystem),
            ).one()
        except NoResultFound:
            return (
                {
                    "error":
                    'Project "{}" in ecosystem "{}" not found'.format(
                        args.project_name, args.project_ecosystem)
                },
                400,
            )

        try:
            distro = models.Distro.query.filter(
                func.lower(models.Distro.name) == func.lower(
                    args.distribution)).one()
        except NoResultFound:
            return (
                {
                    "error":
                    'Distribution "{}" not found'.format(args.distribution)
                },
                400,
            )

        try:
            package = models.Packages(distro_name=distro.name,
                                      project=project,
                                      package_name=args.package_name)

            Session.add(package)
            Session.commit()

            message = dict(
                agent=flask_login.current_user.email,
                project=project.name,
                distro=distro.name,
                new=package.package_name,
            )
            utilities.publish_message(
                project=project.__json__(),
                distro=distro.__json__(),
                topic="project.map.new",
                message=message,
            )
            return {
                "distribution": distro.name,
                "name": package.package_name
            }, 201
        except IntegrityError:
            Session.rollback()
            return {"error": "package already exists in distribution"}, 409