my-emacs-d/elpa/gitconfig-20130718.235/gitconfig.el

229 lines
8.2 KiB
EmacsLisp

;;; gitconfig.el --- Emacs lisp interface to work with git-config variables
;;
;; Filename: gitconfig.el
;; Description: Emacs lisp interface to work with git-config variables
;; Author: Samuel Tonini
;; Maintainer: Samuel Tonini
;; Version: 1.0.0
;; Package-Version: 20130718.235
;; URL:
;; Keywords: git, gitconfig, git-config
;; 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, 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; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;; Manual Installation:
;;
;; (add-to-list 'load-path "~/path/to/gitconfig.el/")
;; (require 'gitconfig)
;;
;; Interesting variables are:
;;
;; `gitconfig-git-command'
;;
;; The shell command for <git>
;;
;; `gitconfig-buffer-name'
;;
;; Name of the <git> output buffer.
;;
;; Interactive functions are:
;;
;; M-x gitconfig-execute-command
;;
;; Run <git config> with custom ARGUMENTS and display it in `gitconfig-buffer-name'
;;
;; Non-Interactive functions are:
;;
;; `gitconfig-current-inside-git-repository-p'
;;
;; Return t if `default-directory' is a git repository
;;
;; `gitconfig-path-to-git-repository'
;;
;; Return the absolute path of the current git repository
;;
;; `gitconfig-get-variables'
;;
;; Get all variables for the given LOCATION
;; and return it as a hash table
;;
;; `gitconfig-set-variable'
;;
;; Set a specific LOCATION variable with a given NAME and VALUE
;;
;; `gitconfig-get-variable'
;;
;; Return a specific LOCATION variable for the given NAME
;;
;; `gitconfig-delete-variable'
;;
;; Delete a specific LOCATION variable for the given NAME
;;
;; `gitconfig-get-local-variables'
;;
;; Return all <git config --local --list> variables as hash table
;;
;; `gitconfig-get-global-variables'
;;
;; Return all <git config --global --list> variables as hash table
;;
;; `gitconfig-get-system-variables'
;;
;; Return all <git config --system --list> variables as hash table
;;
;; `gitconfig-get-local-variable'
;;
;; Return a specific <git config --local --list> variable by the given NAME
;;
;; `gitconfig-get-global-variable'
;;
;; Return a specific <git config --global --list> variable by the given NAME
;;
;; `gitconfig-get-system-variable'
;;
;; Return a specific <git config --system --list> variable by the given NAME
;;
;;; Code:
(defcustom gitconfig-git-command "git"
"The shell command for git"
:type 'string
:group 'gitconfig)
(defvar gitconfig-buffer-name "*GITCONFIG*"
"Name of the git output buffer.")
(defun gitconfig--get-keys (hash)
"Return all keys for given HASH"
(let (keys)
(maphash (lambda (key value) (setq keys (cons key keys))) hash)
keys))
(defun gitconfig--get-buffer (name)
"Get and kills a buffer if exists and returns a new one."
(let ((buffer (get-buffer name)))
(when buffer (kill-buffer buffer))
(generate-new-buffer name)))
(defun gitconfig--buffer-setup (buffer)
"Setup the gitconfig buffer before display."
(display-buffer buffer)
(with-current-buffer buffer
(setq buffer-read-only nil)
(local-set-key "q" 'quit-window)))
(defun gitconfig-current-inside-git-repository-p ()
"Return t if the `default-directory' is a <git> repository"
(let ((inside-work-tree (shell-command-to-string
(format "%s rev-parse --is-inside-work-tree"
gitconfig-git-command))))
(string= (replace-regexp-in-string "\n" "" inside-work-tree nil t) "true")))
(defun gitconfig-path-to-git-repository ()
"Return the absolute path of the current git repository"
(let ((path-to-git-repo (shell-command-to-string
(format "%s rev-parse --show-toplevel"
gitconfig-git-command))))
(replace-regexp-in-string "\n" "" path-to-git-repo nil t)))
(defun gitconfig--execute-command (arguments)
(unless (gitconfig-current-inside-git-repository-p)
(user-error "Fatal: Not a git repository (or any of the parent directories): .git"))
(shell-command-to-string (format "%s config %s" gitconfig-git-command arguments)))
(defun gitconfig-get-variables (location)
"Get all variables for the given LOCATION and return it as a hash table"
(let ((config-string (gitconfig--execute-command (format "--%s --list" location)))
(variable-hash (make-hash-table :test 'equal)))
(setq config-string (split-string config-string "\n"))
(delete "" config-string)
(mapcar (lambda (x) (puthash (car (split-string x "="))
(car (last (split-string x "=")))
variable-hash)) config-string)
variable-hash))
(defun gitconfig-set-variable (location name value)
"Set a specific LOCATION variable with a given NAME and VALUE"
(unless (gitconfig-current-inside-git-repository-p)
(user-error "Fatal: Not a git repository (or any of the parent directories): .git"))
(let ((exit-status (shell-command
(format "%s config --%s --replace-all %s %s"
gitconfig-git-command location name value))))
(unless (= exit-status 0)
(user-error (format "Error: key does not contain a section: %s" name)))
t))
(defun gitconfig-get-variable (location name)
"Return a specific LOCATION variable for the given NAME"
(when (string= name "")
(user-error "Error: variable does not exist."))
(let ((variable (gitconfig--execute-command (format "--%s --get %s" location name))))
(when (string-match "^error: " variable)
(user-error variable))
(if (string-match "\n+" variable)
(replace-match "" t t variable)
variable)))
(defun gitconfig-delete-variable (location name)
"Delete a specific LOCATION variable for the given NAME"
(unless (gitconfig-current-inside-git-repository-p)
(user-error "Fatal: Not a git repository (or any of the parent directories): .git"))
(let ((exit-status (shell-command
(format "%s config --%s --unset-all %s"
gitconfig-git-command location name))))
(unless (= exit-status 0)
(user-error (format "Error: key does not contain a section: %s" name)))
t))
(defun gitconfig-execute-command (arguments)
"Run <git config> with custom ARGUMENTS and display it in buffer"
(interactive "Mgit config: ")
(let ((buffer (gitconfig--get-buffer gitconfig-buffer-name)))
(shell-command (format "%s config %s" gitconfig-git-command arguments) buffer)
(gitconfig--buffer-setup buffer)))
(defun gitconfig-get-local-variables ()
"Return all <git config --local --list> variables as hash table"
(gitconfig-get-variables "local"))
(defun gitconfig-get-global-variables ()
"Return all <git config --global --list> variables as hash table"
(gitconfig-get-variables "global"))
(defun gitconfig-get-system-variables ()
"Return all <git config --system --list> variables as hash table"
(gitconfig-get-variables "system"))
(defun gitconfig-get-local-variable (name)
"Return a specific <git config --local --list> variable by the given NAME"
(gitconfig-get-variable "local" name))
(defun gitconfig-get-global-variable (name)
"Return a specific <git config --global --list> variable by the given NAME"
(gitconfig-get-variable "global" name))
(defun gitconfig-get-system-variable (name)
"Return a specific <git config --system --list> variable by the given NAME"
(gitconfig-get-variable "system" name))
(provide 'gitconfig)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; gitconfig.el ends here