コード例 #1
0
ファイル: routes.py プロジェクト: pasliwa/code_review
def changeset_abandon(cs_id):
    logger.info("Requested URL /changeset/%d/abandon [POST]", cs_id)
    changeset = Changeset.query.filter(Changeset.id == cs_id).first()
    if changeset is None:
        flash("Changeset {0} doesn't exist".format(cs_id), "error")
        logger.error("Changeset %d doesn't exist", cs_id)
        return redirect(url_for('index'))
    if not changeset.is_active():
        flash("Not active changeset cannot be abandoned", "error")
        logger.error("Changeset %d is not active and cannot be abandoned", cs_id)
        return redirect(url_for('changeset_info', cs_id=cs_id))
    if not (changeset.diff is None):
        flash("Changeset with diff attached to it cannot be abandoned", "error")
        logger.error("Changeset %d has a diff attached to it and cannot be abandoned", cs_id)
        return redirect(url_for('changeset_info', cs_id=cs_id))
    
    review = Review.query.filter(Review.id == changeset.review_id).first()
      
    changeset.status = "ABANDONED"
    db.session.commit()
    repo.hg_sync()
    repo.hg_bookmark(bookmark=changeset.bookmark, delete=True)
    if review.active_changeset is None:
        review_abandon(review.id)
    else:
        repo.hg_update(review.active_changeset.sha1)
        repo.hg_command("bookmark", changeset.bookmark)
    
    if changeset.sha1 in repo.hg_heads():
        repo.hg_close_branch(changeset.sha1)
    flash("Changeset '{title}' (SHA1: {sha1}) has been abandoned".format(title=changeset.title,
                                                                         sha1=changeset.sha1), "notice")
    repo.hg_push()                                                                     
    return redirect(url_for("review_info", review_id=changeset.review_id))
コード例 #2
0
ファイル: routes.py プロジェクト: pasliwa/code_review
def merge_branch(cs_id):
    logger.info("Requested URL /changeset/%d/merge", cs_id)
    changeset = Changeset.query.filter(Changeset.id == cs_id).first()
    if changeset is None:
        flash("Changeset {0} doesn't exist".format(cs_id), "error")
        logger.error("Changeset %d doesn't exist", cs_id)
        return redirect(url_for("index"))
    review = Review.query.filter(Review.id == changeset.review_id).first()
    bookmark = review.target

    link = url_for("review_info", review_id=review.id, _external=True)

    refresh_heads()
    #TODO: Only active changeset can be merged

    logger.info("Merging %s into %s", changeset.sha1, review.target)
    repo.hg_update(bookmark)

    try:
        output = repo.hg_merge(changeset.sha1)
    except HgException as e:
        output = str(e)

    logger.info("Merge result: {output}".format(output=output))

    error = False
    subject = u"Successful merge '{name}' with {dest}".format(name=review.title, sha1=changeset.sha1, dest=review.target)

    if "abort: nothing to merge" in output:
        logger.info("Creating dummy commit for merge of {review} into {target}".format(review=review.id, target=review.target))
        open(os.path.join(app.config["REPO_PATH"], "dummy.txt"), "a").close()
        repo.hg_add("dummy.txt")
        repo.hg_commit("Prepare for merge with {target}".format(target=review.target))
        repo.hg_remove("dummy.txt")
        repo.hg_commit("Prepare for merge with {target}".format(target=review.target), amend=True)
        try:
            output = repo.hg_merge(changeset.sha1)
        except HgException as e:
            output = str(e)
        logger.info("Merge result: {output}".format(output=output))

    if "abort: nothing to merge" in output:
        flash("Unexpeced merge problem - administrator has been contacted")
        subject = u"Unexpected merge problem - can't merge '{name}' with {dest}".format(name=review.title,
                                                                                        dest=review.target)
        logger.error("Conflict when trying descendant merge of review {review} - unexpected conflict".format(
            review=review.id))
        error = True
    if ("use 'hg resolve' to retry unresolved" in output) or (("local changed" in output) and ("which remote deleted" in output)) or (("remote changed" in output) and ("which local deleted" in output)):
        flash("There is merge conflict. Merge with bookmark " + bookmark +
              " and try again.", "error")
        subject = u"Merge conflict - can't merge '{name}' with {dest}".format(name=review.title, dest=review.target)
        error = True
    elif "abort: merging with a working directory ancestor has no effect" in output:
        repo.hg_update(changeset.sha1)
        result = repo.hg_bookmark(bookmark, force=True)
        logger.info(result)
    else:
        repo.hg_commit("Merged with {target}".format(target=review.target))

    repo.hg_update("null", clean=True)
    repo.hg_purge()
    repo.hg_bookmark(bookmark=review.bookmark, delete=True)

    try:
        if not error:
            repo.hg_push()
    except HgException, ex:
        if not "no changes found" in ex.message:
            raise