[PATCH v2] git: add references for Git pull request heads
Dominik Ruf
dominikruf at gmail.com
Wed Apr 19 07:27:46 UTC 2017
+1
Andrew Shadura <andrew at shadura.me> schrieb am Sa., 15. Apr. 2017, 14:12:
> # HG changeset patch
> # User Andrew Shadura <andrew at shadura.me>
> # Date 1492258239 -7200
> # Sat Apr 15 14:10:39 2017 +0200
> # Node ID 977c0cfec8c00806d4331ebf402ce492657cf34a
> # Parent a1f8bf0428c5a3123da9c3ba2dbd8ada50be0b0e
> git: add references for Git pull request heads
>
> When a pull request is created, stick a reference to it in the refs/pull
> namespace, similarly to what GitHub does, and remove it when the pull
> request is deleted. That reference guarantees the commits stay around
> and don't get garbage-collected when a PR is rebased or revised.
> Also, that makes it possible to access head of the historis pull
> requests using Git by fetching a ref from the source repository.
>
> Unlike GitHub though, we don't put the ref into the destination repository
> and don't copy commits there to prevent undesired repository growth.
> Kallithea uses global pull request identifiers, so there should not be
> any confusion as to what pull request the ref corresponds to.
> We may later provide a shim to redirect users to the source repository
> if that deems needed.
>
> diff --git a/kallithea/model/pull_request.py
> b/kallithea/model/pull_request.py
> --- a/kallithea/model/pull_request.py
> +++ b/kallithea/model/pull_request.py
> @@ -39,8 +39,7 @@ from kallithea.lib import helpers as h
> from kallithea.model.db import PullRequest, PullRequestReviewer,
> Notification, \
> ChangesetStatus, User
> from kallithea.model.notification import NotificationModel
> -from kallithea.lib.utils2 import extract_mentioned_users, safe_unicode
> -
> +from kallithea.lib.utils2 import extract_mentioned_users, safe_str,
> safe_unicode
>
> log = logging.getLogger(__name__)
>
> @@ -139,6 +138,12 @@ class PullRequestModel(object):
> def delete(self, pull_request):
> pull_request = PullRequest.guess_instance(pull_request)
> Session().delete(pull_request)
> + if pull_request.org_repo.scm_instance.alias == 'git':
> + # remove a ref under refs/pull/ so that commits can be
> garbage-collected
> + try:
> + del
> pull_request.org_repo.scm_instance._repo["refs/pull/%d/head" %
> pull_request.pull_request_id]
> + except KeyError:
> + pass
>
> def close_pull_request(self, pull_request):
> pull_request = PullRequest.guess_instance(pull_request)
> @@ -228,6 +233,7 @@ class CreatePullRequestAction(object):
> self.org_repo = org_repo
> self.other_repo = other_repo
> self.org_ref = org_ref
> + self.org_rev = org_rev
> self.other_ref = other_ref
> self.title = title
> self.description = description
> @@ -252,6 +258,10 @@ class CreatePullRequestAction(object):
> Session().add(pr)
> Session().flush() # make database assign pull_request_id
>
> + if self.org_repo.scm_instance.alias == 'git':
> + # create a ref under refs/pull/ so that commits don't get
> garbage-collected
> + self.org_repo.scm_instance._repo["refs/pull/%d/head" %
> pr.pull_request_id] = safe_str(self.org_rev)
> +
> #reset state to under-review
> from kallithea.model.changeset_status import ChangesetStatusModel
> from kallithea.model.comment import ChangesetCommentsModel
> _______________________________________________
> kallithea-general mailing list
> kallithea-general at sfconservancy.org
> https://lists.sfconservancy.org/mailman/listinfo/kallithea-general
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sfconservancy.org/pipermail/kallithea-general/attachments/20170419/c33f85f9/attachment.html>
More information about the kallithea-general
mailing list