my-emacs-d/elpa/magithub-20160926.2044/magithub-core.el

150 lines
5.0 KiB
EmacsLisp
Raw Normal View History

2016-09-27 14:23:52 +00:00
;;; magithub-core.el --- core functions for magithub -*- lexical-binding: t; -*-
;; Copyright (C) 2016 Sean Allred
;; Author: Sean Allred <code@seanallred.com>
;; Keywords: tools
;; This program 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 of the License, or
;; (at your option) any later version.
;; This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;
;;; Code:
(require 'magit)
(defun magithub-github-repository-p ()
"Non-nil if \"origin\" points to GitHub."
(let ((url (magit-get "remote" "origin" "url")))
(or (s-prefix? "git@github.com:" url)
(s-prefix? "https://github.com/" url)
(s-prefix? "git://github.com/" url))))
(defun magithub--api-available-p ()
"Non-nil if the API is available."
(let ((magit-git-executable "ping")
(magit-pre-call-git-hook nil)
(magit-git-global-arguments nil))
(= 0 (magit-git-exit-code "-c 1" "api.github.com"))))
(defun magithub--completing-read-multiple (prompt collection)
"Using PROMPT, get a list of elements in COLLECTION.
This function continues until all candidates have been entered or
until the user enters a value of \"\". Duplicate entries are not
allowed."
(let (label-list this-label done)
(while (not done)
(setq collection (remove this-label collection)
this-label "")
(when collection
;; @todo it would be nice to detect whether or not we are
;; allowed to create labels -- if not, we can require-match
(setq this-label (completing-read prompt collection)))
(unless (setq done (s-blank? this-label))
(push this-label label-list)))
label-list))
(defconst magithub-hash-regexp
(rx bow (= 40 (| digit (any (?A . ?F) (?a . ?f)))) eow)
"Regexp for matching commit hashes.")
(defcustom magithub-hub-executable "hub"
"The hub executable used by Magithub."
:group 'magithub
:package-version '(magithub . "0.1")
:type 'string)
(defvar magithub-debug-mode nil
"When non-nil, echo hub commands before they're executed.")
(defvar magithub-hub-error nil
"When non-nil, this is a message for when hub fails.")
(defmacro magithub-with-hub (&rest body)
`(let ((magit-git-executable magithub-hub-executable)
(magit-pre-call-git-hook nil)
(magit-git-global-arguments nil))
,@body))
(defun magithub--hub-command (magit-function command args)
(unless (executable-find magithub-hub-executable)
(user-error "Hub (hub.github.com) not installed; aborting"))
(unless (file-exists-p "~/.config/hub")
(user-error "Hub hasn't been initialized yet; aborting"))
(when magithub-debug-mode
(message "Calling hub with args: %S %S" command args))
(with-timeout (5 (error "Took too long! %s%S" command args))
(magithub-with-hub (funcall magit-function command args))))
(defun magithub--command (command &optional args)
"Run COMMAND synchronously using `magithub-hub-executable'."
(magithub--hub-command #'magit-run-git command args))
(defun magithub--command-with-editor (command &optional args)
"Run COMMAND asynchronously using `magithub-hub-executable'.
Ensure GIT_EDITOR is set up appropriately."
(magithub--hub-command #'magit-run-git-with-editor command args))
(defun magithub--command-output (command &optional args)
"Run COMMAND synchronously using `magithub-hub-executable'
and returns its output as a list of lines."
(magithub--hub-command #'magit-git-lines command args))
(defun magithub--command-quick (command &optional args)
"Quickly execute COMMAND with ARGS."
(ignore (magithub--command-output command args)))
(defun magithub--meta-new-issue ()
"Open a new Magithub issue.
See /.github/ISSUE_TEMPLATE.md in this repository."
(interactive)
(browse-url "https://github.com/vermiculus/magithub/issues/new"))
(defun magithub--meta-help ()
"Opens Magithub help."
(interactive)
(browse-url "https://gitter.im/vermiculus/magithub"))
(defun magithub-error (err-message tag &optional trace)
"Report a Magithub error."
(setq trace (or trace (with-output-to-string (backtrace))))
(when (y-or-n-p (concat tag " Report? (A bug report will be placed in your clipboard.)"))
(with-current-buffer-window
(get-buffer-create "*magithub issue*")
#'display-buffer-pop-up-window nil
(when (fboundp 'markdown-mode) (markdown-mode))
(insert
(kill-new
(format
"## Automated error report
### Description
%s
### Backtrace
```
%s```
"
(read-string "Briefly describe what you were doing: ")
trace))))
(magithub--meta-new-issue))
(error err-message))
(provide 'magithub-core)
;;; magithub-core.el ends here