コード例 #1
0
def link_pr_to_ticket(self, session, pr_uid):
    """ Link the specified pull-request against the ticket(s) mentioned in
    the commits of the pull-request

    """
    _log.info('LINK_PR_TO_TICKET: Linking ticket(s) to PR for: %s' % pr_uid)

    request = pagure.lib.get_request_by_uid(session, pr_uid)
    if not request:
        _log.info('LINK_PR_TO_TICKET: Not PR found for: %s' % pr_uid)
        return

    if request.remote:
        repopath = pagure.utils.get_remote_repo_path(request.remote_git,
                                                     request.branch_from)
        parentpath = pagure.utils.get_repo_path(request.project)
    else:
        repo_from = request.project_from
        repopath = pagure.utils.get_repo_path(repo_from)
        parentpath = get_parent_repo_path(repo_from)

    repo_obj = pygit2.Repository(repopath)
    orig_repo = pygit2.Repository(parentpath)

    diff_commits = pagure.lib.git.diff_pull_request(
        session,
        request,
        repo_obj,
        orig_repo,
        requestfolder=pagure_config['REQUESTS_FOLDER'],
        with_diff=False)

    _log.info('LINK_PR_TO_TICKET: Found %s commits in that PR' %
              len(diff_commits))

    name = request.project.name
    namespace = request.project.namespace
    user = request.project.user.user \
        if request.project.is_fork else None

    for line in pagure.lib.git.read_git_lines(
        ['log', '--no-walk'] + [c.oid.hex for c in diff_commits] + ['--'],
            repopath):

        line = line.strip()
        for issue in pagure.lib.link.get_relation(session,
                                                  name,
                                                  user,
                                                  namespace,
                                                  line,
                                                  'fixes',
                                                  include_prs=False):
            _log.info('LINK_PR_TO_TICKET: Link ticket %s to PRs %s' %
                      (issue, request))
            pagure.lib.link_pr_issue(session, issue, request)

        for issue in pagure.lib.link.get_relation(session, name, user,
                                                  namespace, line, 'relates'):
            _log.info('LINK_PR_TO_TICKET: Link ticket %s to PRs %s' %
                      (issue, request))
            pagure.lib.link_pr_issue(session, issue, request)

    try:
        session.commit()
    except SQLAlchemyError:
        _log.exception('Could not link ticket to PR :(')
        session.rollback()
コード例 #2
0
def link_pr_to_ticket(self, session, pr_uid):
    """ Link the specified pull-request against the ticket(s) mentioned in
    the commits of the pull-request

    """
    _log.info("LINK_PR_TO_TICKET: Linking ticket(s) to PR for: %s" % pr_uid)

    request = pagure.lib.query.get_request_by_uid(session, pr_uid)
    if not request:
        _log.info("LINK_PR_TO_TICKET: Not PR found for: %s" % pr_uid)
        return

    if request.remote:
        repopath = pagure.utils.get_remote_repo_path(request.remote_git,
                                                     request.branch_from)
        parentpath = pagure.utils.get_repo_path(request.project)
    elif request.project_from:
        repo_from = request.project_from
        repopath = pagure.utils.get_repo_path(repo_from)
        parentpath = get_parent_repo_path(repo_from)
    else:
        _log.info("LINK_PR_TO_TICKET: PR neither remote, nor with a "
                  "project_from, bailing: %s" % pr_uid)
        return

    # Drop the existing commit-based relations
    session.query(pagure.lib.model.PrToIssue).filter(
        pagure.lib.model.PrToIssue.pull_request_uid == request.uid).filter(
            pagure.lib.model.PrToIssue.origin == "intial_comment_pr").delete(
                synchronize_session="fetch")

    repo_obj = pygit2.Repository(repopath)
    orig_repo = pygit2.Repository(parentpath)

    diff_commits = pagure.lib.git.diff_pull_request(session,
                                                    request,
                                                    repo_obj,
                                                    orig_repo,
                                                    with_diff=False,
                                                    notify=False)

    _log.info("LINK_PR_TO_TICKET: Found %s commits in that PR" %
              len(diff_commits))

    name = request.project.name
    namespace = request.project.namespace
    user = request.project.user.user if request.project.is_fork else None

    for line in pagure.lib.git.read_git_lines(
        ["log", "--no-walk"] + [c.oid.hex for c in diff_commits] + ["--"],
            repopath,
    ):

        line = line.strip()
        for issue in pagure.lib.link.get_relation(session,
                                                  name,
                                                  user,
                                                  namespace,
                                                  line,
                                                  "fixes",
                                                  include_prs=False):
            _log.info("LINK_PR_TO_TICKET: Link ticket %s to PRs %s" %
                      (issue, request))
            pagure.lib.query.link_pr_issue(session,
                                           issue,
                                           request,
                                           origin="commit")

        for issue in pagure.lib.link.get_relation(session, name, user,
                                                  namespace, line, "relates"):
            _log.info("LINK_PR_TO_TICKET: Link ticket %s to PRs %s" %
                      (issue, request))
            pagure.lib.query.link_pr_issue(session,
                                           issue,
                                           request,
                                           origin="commit")

    try:
        session.commit()
    except SQLAlchemyError:
        _log.exception("Could not link ticket to PR :(")
        session.rollback()
コード例 #3
0
ファイル: tasks.py プロジェクト: pypingou/pagure
def link_pr_to_ticket(self, session, pr_uid):
    """ Link the specified pull-request against the ticket(s) mentioned in
    the commits of the pull-request

    """
    _log.info("LINK_PR_TO_TICKET: Linking ticket(s) to PR for: %s" % pr_uid)

    request = pagure.lib.query.get_request_by_uid(session, pr_uid)
    if not request:
        _log.info("LINK_PR_TO_TICKET: Not PR found for: %s" % pr_uid)
        return

    if request.remote:
        repopath = pagure.utils.get_remote_repo_path(
            request.remote_git, request.branch_from
        )
        parentpath = pagure.utils.get_repo_path(request.project)
    elif request.project_from:
        repo_from = request.project_from
        repopath = pagure.utils.get_repo_path(repo_from)
        parentpath = get_parent_repo_path(repo_from)
    else:
        _log.info(
            "LINK_PR_TO_TICKET: PR neither remote, nor with a "
            "project_from, bailing: %s" % pr_uid
        )
        return

    # Drop the existing commit-based relations
    session.query(pagure.lib.model.PrToIssue).filter(
        pagure.lib.model.PrToIssue.pull_request_uid == request.uid
    ).filter(pagure.lib.model.PrToIssue.origin == "intial_comment_pr").delete(
        synchronize_session="fetch"
    )

    repo_obj = pygit2.Repository(repopath)
    orig_repo = pygit2.Repository(parentpath)

    diff_commits = pagure.lib.git.diff_pull_request(
        session, request, repo_obj, orig_repo, with_diff=False, notify=False
    )

    _log.info(
        "LINK_PR_TO_TICKET: Found %s commits in that PR" % len(diff_commits)
    )

    name = request.project.name
    namespace = request.project.namespace
    user = request.project.user.user if request.project.is_fork else None

    for line in pagure.lib.git.read_git_lines(
        ["log", "--no-walk"] + [c.oid.hex for c in diff_commits] + ["--"],
        repopath,
    ):

        line = line.strip()
        for issue in pagure.lib.link.get_relation(
            session, name, user, namespace, line, "fixes", include_prs=False
        ):
            _log.info(
                "LINK_PR_TO_TICKET: Link ticket %s to PRs %s"
                % (issue, request)
            )
            pagure.lib.query.link_pr_issue(
                session, issue, request, origin="commit"
            )

        for issue in pagure.lib.link.get_relation(
            session, name, user, namespace, line, "relates"
        ):
            _log.info(
                "LINK_PR_TO_TICKET: Link ticket %s to PRs %s"
                % (issue, request)
            )
            pagure.lib.query.link_pr_issue(
                session, issue, request, origin="commit"
            )

    try:
        session.commit()
    except SQLAlchemyError:
        _log.exception("Could not link ticket to PR :(")
        session.rollback()