Создание запросов на вытягивание прямо из Emacs

Я ненавижу ручные, утомительные и повторяющиеся задачи, как и любой нормальный разработчик. Недавно я понял, что создание пулл-реквестов в многочисленных git-репозиториях отнимает у меня слишком много времени. И большую часть времени вам приходится повторять почти точные шаги снова и снова:

  • войдите в веб-клиент провайдера git — мы используем Stash
  • нажимайте, нажимайте, нажимайте, пока не найдете кнопку «Создать запрос на включение», затем нажмите ее
  • выберите ветку - обычно это ветка, которая только что была отправлена
  • выберите целевую ветку - большую часть времени она "развивается"
  • добавить рецензентов - в большинстве случаев одни и те же люди
  • добавить описание - необязательно

В какой-то момент я начал задаваться вопросом, смогу ли я сделать все это без использования веб-клиента. И это кажется возможным. Stash и Bitbucket имеют API, У Github тоже есть (хотя он отличается - первый использует ssh, а последний http )

Теперь эта вещь, вероятно, упростит некоторые вещи, но я чувствую, что она может быть даже лучше.

Я использую Emacs (точнее, дистрибутив Spacemacs). Теперь мне интересно, кто-нибудь уже построил что-нибудь, что интегрируется с magit, или, может быть, я мог бы сделать это сам? Я имею в виду, насколько это будет сложно? Сценарий должен позволить вам зафиксировать, а затем отправить ветку, а затем создать запрос на включение на основе этой ветки против «разработки», используя заданные значения по умолчанию. Кто-нибудь делал что-нибудь подобное?

Не могли бы вы, ребята, указать мне на некоторые elisp плагины, которые используют силу magit для выполнения подобных задач. Может, я и сама что-нибудь напишу.


person iLemming    schedule 02.10.2015    source источник
comment
Magit теперь имеет форж github.com/magit/forge   -  person hjpotter92    schedule 22.01.2020


Ответы (3)


Я нашел этот оригинальный пост о создании PR из emacs на github. http://endlessparentheses.com/easily-create-github-prs-from-magit.html

Это не сработало для битбакета (тайника). Но мне хватило информации, чтобы собрать решение, которое работает для меня.

https://github.com/flamingbear/emacs-config/blob/master/site-lisp/lisp/mhs-magit.el

(defun endless/visit-pull-request-url ()
  "Visit the current branch's PR on Github."
  (interactive)
  (let ((repo (magit-get "remote" (magit-get-remote) "url")))
    (if (string-match "github\\.com" repo)
    (visit-gh-pull-request repo)
  (visit-bb-pull-request repo))))


(defun visit-gh-pull-request (repo)
  "Visit the current branch's PR on Github."
  (interactive)
  (browse-url
   (format "https://github.com/%s/pull/new/%s"
     (replace-regexp-in-string
      "\\`.+github\\.com:\\(.+\\)\\.git\\'" "\\1"
      repo)
     (cdr (magit-get-remote-branch)))))



;; Bitbucket pull requests are kinda funky, it seems to try to just do the
;; right thing, so there's no branches to include.
;; https://bitbucket.org/<username>/<project>/pull-request/new
(defun visit-bb-pull-request (repo)
  (browse-url
   (format "https://bitbucket.org/%s/pull-request/new"
           (replace-regexp-in-string
            "\\`.+bitbucket\\.org:\\(.+\\)\\.git\\'" "\\1"
            repo))))

;; visit PR for github or bitbucket repositories with "v"
(eval-after-load 'magit
  '(define-key magit-mode-map "v"
     #'endless/visit-pull-request-url))
person Matt Savoie    schedule 02.10.2015
comment
по какой-то причине этот (magit-get "remote" (magit-get-remote) "url") возвращает nil для меня :( Я не могу понять, почему - person iLemming; 02.10.2015
comment
Вы находитесь в каталоге с репозиторием git и удаленным? Я получаю ноль из рабочего буфера, но не из действительного каталога репо. Какую версию magit/emacs вы используете? Magit 20150825.414, Git 2.3.8 (Apple Git-58), Emacs 24.5.1 - person Matt Savoie; 02.10.2015
comment
Magit 20151001.1159, Git 2.5.3, Emacs 24.5.1 да, я нахожусь в действительном репозитории git - person iLemming; 03.10.2015
comment
Я понял. мой локальный филиал не отслеживал удаленный - person iLemming; 03.10.2015

магит кузница

Magit теперь поставляется с forge, который предназначен для работы с проблемами/PR/и т. д. в любой из git forges. Он поддерживает github, gitlab из коробки с частичной поддержкой bitbucket, gitea, gitweb, cgit, gogs и т.д.

Чтобы создать новый запрос на вытягивание (или задачу) (из документы< /а>):

' p     (forge-create-pullreq)

C-c C-n [в разделе запросов на вытягивание] (forge-create-pullreq)

Эта команда создает новый запрос на включение для текущего репозитория.

' i     (forge-create-issue)

C-c C-n [в разделе Проблемы] (forge-create-pullreq)

Эта команда создает новую задачу для текущего репозитория.


Старый ответ:

Существует расширение magit для работы с запросами на вытягивание github. Вы можете ознакомиться с проектом здесь.

Вы также должны просмотреть этот пост от сопровождающего проекта magit.

Поэтому я боюсь, что в настоящее время нет пакета, который делает то, что вы хотите. Если вы хотите написать его самостоятельно, я рекомендую вам использовать request.el, а затем реализовывать только те части API Github, которые вам действительно нужны, чтобы избежать чрезмерной разработки.

person hjpotter92    schedule 02.10.2015
comment
Большое спасибо. попробую с этим поиграть - person iLemming; 02.10.2015

В случае (magit-get "remote" (magit-get-remote) "url") возвращает ноль, улучшено.

(defun endless/visit-pull-request-url ()
  "Visit the current branch's PR on Github."
  (interactive)
  (let ((repo (magit-get "remote" (magit-get-remote) "url")))
    (if (not repo)
    (setq repo (magit-get "remote" (magit-get-push-remote) "url")))
    (if (string-match "github\\.com" repo)
    (visit-gh-pull-request repo)
      (visit-bb-pull-request repo))))

(defun visit-gh-pull-request (repo)
  "Visit the current branch's PR on Github."
  (interactive)
  (message repo)
  (browse-url
   (format "https://github.com/%s/pull/new/%s"
       (replace-regexp-in-string
        "\\`.+github\\.com:\\(.+\\)\\(\\.git\\)?\\'" "\\1"
        repo)
       (magit-get-current-branch))))

;; Bitbucket pull requests are kinda funky, it seems to try to just do the
;; right thing, so there's no branches to include.
;; https://bitbucket.org/<username>/<project>/pull-request/new
(defun visit-bb-pull-request (repo)
  (message repo)
  (browse-url
   (format "https://bitbucket.org/%s/pull-request/new?source=%s&t=1"
       (replace-regexp-in-string
        "\\`.+bitbucket\\.org:\\(.+\\)\\.git\\'" "\\1"
        repo)
       (magit-get-current-branch))))
;; visit PR for github or bitbucket repositories with "v"
(eval-after-load 'magit
  '(define-key magit-mode-map "v"
     #'endless/visit-pull-request-url))
person Kentaro Ohkouchi    schedule 05.09.2017