diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-collab.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-collab.el | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-collab.el b/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-collab.el new file mode 100644 index 000000000000..7c4b1a267104 --- /dev/null +++ b/configs/shared/emacs/.emacs.d/elpa/magit-20180719.1904/magit-collab.el @@ -0,0 +1,171 @@ +;;; magit-collab.el --- collaboration tools -*- lexical-binding: t -*- + +;; Copyright (C) 2010-2018 The Magit Project Contributors +;; +;; You should have received a copy of the AUTHORS.md file which +;; lists all contributors. If not, see http://magit.vc/authors. + +;; Author: Jonas Bernoulli <jonas@bernoul.li> +;; Maintainer: Jonas Bernoulli <jonas@bernoul.li> + +;; Magit is free software; you can redistribute it and/or modify it +;; under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. +;; +;; Magit is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +;; License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with Magit. If not, see http://www.gnu.org/licenses. + +;;; Commentary: + +;; This library implements various collaboration tools. These tools +;; are only early incarnation -- implementing collaboration tools is +;; a top priority for future development. + +;; Currently these tools (including `magit-branch-pull-request', which +;; is defined elsewhere) only support Github, but support for other +;; Git forges as well as mailing list based collaboration is in +;; planning. + +;;; Code: + +(require 'magit) +(require 'ghub) + +;;; Variables + +(defvar magit-github-token-scopes '(repo) + "The Github API scopes needed by Magit. + +`repo' is the only required scope. Without this scope none of +Magit's features that use the API work. Instead of this scope +you could use `public_repo' if you are only interested in public +repositories. + +`repo' Grants read/write access to code, commit statuses, + invitations, collaborators, adding team memberships, and + deployment statuses for public and private repositories + and organizations. + +`public_repo' Grants read/write access to code, commit statuses, + collaborators, and deployment statuses for public repositories + and organizations. Also required for starring public + repositories.") + +;;; Commands + +;;;###autoload +(defun magit-browse-pull-request (pr) + "Visit pull-request PR using `browse-url'. + +Currently this only supports Github, but that restriction will +be lifted eventually to support other Git forges." + (interactive (list (magit-read-pull-request "Visit pull request"))) + (browse-url (format "https://github.com/%s/pull/%s" + (--> pr + (cdr (assq 'base it)) + (cdr (assq 'repo it)) + (cdr (assq 'full_name it))) + (cdr (assq 'number pr))))) + +;;; Utilities + +(defun magit-read-pull-request (prompt) + "Read a pull request from the user, prompting with PROMPT. +Return the Git forge's API response. Currently this function +only supports Github, but that will change eventually." + (let* ((origin (magit-upstream-repository)) + (id (magit--forge-id origin)) + (fmtfun (lambda (pull-request) + (format "%s %s" + (cdr (assq 'number pull-request)) + (cdr (assq 'title pull-request))))) + (prs (ghub-get (format "/repos/%s/pulls" id) nil :auth 'magit)) + (choice (magit-completing-read + prompt (mapcar fmtfun prs) nil nil nil nil + (let ((default (thing-at-point 'github-pull-request))) + (and default (funcall fmtfun default))))) + (number (and (string-match "\\([0-9]+\\)" choice) + (string-to-number (match-string 1 choice))))) + (and number + ;; Don't reuse the pr from the list, it lacks some information + ;; that is only returned when requesting a single pr. #3371 + (ghub-get (format "/repos/%s/pulls/%s" id number) + nil :auth 'magit)))) + +(defun magit-upstream-repository () + "Return the remote name of the upstream repository. + +If the Git variable `magit.upstream' is set, then return its +value. Otherwise return \"origin\". If the remote does not +exist, then raise an error." + (let ((remote (or (magit-get "magit.upstream") "origin"))) + (unless (magit-remote-p remote) + (error "No remote named `%s' exists (consider setting `magit.upstream')" + remote)) + (unless (magit--github-remote-p remote) + (error "Currently only Github is supported")) + remote)) + +(defun magit--forge-id (remote) + (let ((url (magit-get "remote" remote "url"))) + (and (string-match "\\([^:/]+/[^/]+?\\)\\(?:\\.git\\)?\\'" url) + (match-string 1 url)))) + +(defconst magit--github-url-regexp "\ +\\`\\(?:git://\\|git@\\|ssh://git@\\|https://\\)\ +\\(.*?\\)[/:]\ +\\(\\([^:/]+\\)/\\([^/]+?\\)\\)\ +\\(?:\\.git\\)?\\'") + +(defun magit--github-url-p (url) + (save-match-data + (and url + (string-match magit--github-url-regexp url) + (let ((host (match-string 1 url))) + ;; Match values like "github.com-as-someone", which are + ;; translated to just "github.com" according to settings + ;; in "~/.ssh/config". Theoretically this could result + ;; in false-positives, but that's rather unlikely. #3392 + (and (or (string-match-p (regexp-quote "github.com") host) + (string-match-p (regexp-quote (ghub--host)) host)) + host))))) + +(defun magit--github-remote-p (remote) + (or (--when-let (magit-git-string "remote" "get-url" "--push" remote) + (magit--github-url-p it)) + (--when-let (magit-git-string "remote" "get-url" "--all" remote) + (magit--github-url-p it)))) + +(defun magit--github-url-equal (r1 r2) + (or (equal r1 r2) + (save-match-data + (let ((n1 (and (string-match magit--github-url-regexp r1) + (match-string 2 r1))) + (n2 (and (string-match magit--github-url-regexp r2) + (match-string 2 r2)))) + (and n1 n2 (equal n1 n2)))))) + +(defun magit--pullreq-from-upstream-p (pr) + (let-alist pr + (equal .head.repo.full_name + .base.repo.full_name))) + +(defun magit--pullreq-branch (pr &optional assert-new) + (let-alist pr + (let ((branch .head.ref)) + (when (and (not (magit--pullreq-from-upstream-p pr)) + (or (not .maintainer_can_modify) + (magit-branch-p branch))) + (setq branch (format "pr-%s" .number))) + (when (and assert-new (magit-branch-p branch)) + (user-error "Branch `%s' already exists" branch)) + branch))) + +(provide 'magit-collab) +;;; magit-collab.el ends here |