Merge branch 'master' into log-edit
This commit is contained in:
commit
c66c004d66
7 changed files with 674 additions and 319 deletions
|
@ -1,17 +1,18 @@
|
|||
lispdir = $(datadir)/emacs/site-lisp
|
||||
sitestartdir = @SITESTART@
|
||||
|
||||
lisp_DATA = magit.el magit.elc
|
||||
lisp_DATA = magit.el magit.elc magit-svn.el magit-svn.elc magit-topgit.el magit-topgit.elc
|
||||
sitestart_DATA = 50magit.el
|
||||
|
||||
info_TEXINFOS = magit.texi
|
||||
|
||||
CLEANFILES = magit.elc
|
||||
EXTRA_DIST = magit.el 50magit.el magit.spec
|
||||
CLEANFILES = magit-*.elc
|
||||
EXTRA_DIST = magit.el 50magit.el magit.spec magit-svn.el magit-topgit.el
|
||||
|
||||
%.elc: %.el
|
||||
@if [ $(builddir) != $(srcdir) ]; then ln $(srcdir)/$*.el .; fi
|
||||
emacs --batch --eval '(byte-compile-file "$*.el")'
|
||||
emacs --batch --eval "(add-to-list 'load-path \"$(srcdir)\")" \
|
||||
--eval '(byte-compile-file "$*.el")'
|
||||
@if [ $(builddir) != $(srcdir) ]; then rm -f $*.el; fi
|
||||
|
||||
|
||||
|
|
|
@ -2,6 +2,14 @@
|
|||
|
||||
set -e
|
||||
|
||||
function configure_ac_ver_ok {
|
||||
cat configure.ac | grep "${1}" || return 1
|
||||
}
|
||||
|
||||
function magit_el_ver_ok {
|
||||
grep -e ";; Version: *$1" magit.el || return 1
|
||||
}
|
||||
|
||||
USAGE="usage: ${0##*/} <tag>"
|
||||
|
||||
tag="${1}"
|
||||
|
@ -20,6 +28,20 @@ fi
|
|||
# grab that tag
|
||||
git co "${tag}"
|
||||
|
||||
# correct version in magit?
|
||||
if ! magit_el_ver_ok "$tag"; then
|
||||
echo "Please set version in magit.el to $tag"
|
||||
git co master
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# correct version in configure.ac?
|
||||
if ! configure_ac_ver_ok "$tag"; then
|
||||
echo "Please set AC_INIT to $tag in configure.ac"
|
||||
git co master
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# clean up if we need to
|
||||
[ -f Makefile ] && make distclean
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
AC_INIT(magit, 0.8.1)
|
||||
AC_INIT(magit, 0.8.2)
|
||||
AC_CONFIG_SRCDIR([magit.el])
|
||||
AM_INIT_AUTOMAKE([1.10])
|
||||
|
||||
|
|
185
magit-svn.el
Normal file
185
magit-svn.el
Normal file
|
@ -0,0 +1,185 @@
|
|||
;;; magit-svn.el --- git-svn plug-in for Magit
|
||||
|
||||
;; Copyright (C) 2008, 2009 Marius Vollmer
|
||||
;; Copyright (C) 2008 Linh Dang
|
||||
;; Copyright (C) 2008 Alex Ott
|
||||
;; Copyright (C) 2008 Marcin Bachry
|
||||
;; Copyright (C) 2009 Alexey Voinov
|
||||
;; Copyright (C) 2009 John Wiegley
|
||||
;; Copyright (C) 2010 Yann Hodique
|
||||
;;
|
||||
;; 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 plug-in provides git-svn functionality as a separate component of Magit
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'magit)
|
||||
|
||||
;; git svn commands
|
||||
|
||||
(defun magit-svn-find-rev (rev &optional branch)
|
||||
(interactive
|
||||
(list (read-string "SVN revision: ")
|
||||
(if current-prefix-arg
|
||||
(read-string "In branch: "))))
|
||||
(let* ((sha (apply 'magit-git-string
|
||||
`("svn"
|
||||
"find-rev"
|
||||
,(concat "r" rev)
|
||||
,@(when branch (list branch))))))
|
||||
(if sha
|
||||
(magit-show-commit
|
||||
(magit-with-section sha 'commit
|
||||
(magit-set-section-info sha)
|
||||
sha))
|
||||
(error "Revision %s could not be mapped to a commit" rev))))
|
||||
|
||||
(defun magit-svn-rebase ()
|
||||
(interactive)
|
||||
(magit-run-git-async "svn" "rebase"))
|
||||
|
||||
(defun magit-svn-dcommit ()
|
||||
(interactive)
|
||||
(magit-run-git-async "svn" "dcommit"))
|
||||
|
||||
(defun magit-svn-enabled ()
|
||||
(not (null (magit-svn-get-ref-info))))
|
||||
|
||||
(defun magit-svn-get-local-ref (url)
|
||||
(let ((branches (cons (magit-get "svn-remote" "svn" "fetch")
|
||||
(magit-get-all "svn-remote" "svn" "branches")))
|
||||
(base-url (magit-get "svn-remote" "svn" "url"))
|
||||
(result nil))
|
||||
(while branches
|
||||
(let* ((pats (split-string (pop branches) ":"))
|
||||
(src (replace-regexp-in-string "\\*" "\\\\(.*\\\\)" (car pats)))
|
||||
(dst (replace-regexp-in-string "\\*" "\\\\1" (cadr pats)))
|
||||
(base-url (replace-regexp-in-string "\\+" "\\\\+" base-url))
|
||||
(pat1 (concat "^" src "$"))
|
||||
(pat2 (cond ((equal src "") (concat "^" base-url "$"))
|
||||
(t (concat "^" base-url "/" src "$")))))
|
||||
(cond ((string-match pat1 url)
|
||||
(setq result (replace-match dst nil nil url))
|
||||
(setq branches nil))
|
||||
((string-match pat2 url)
|
||||
(setq result (replace-match dst nil nil url))
|
||||
(setq branches nil)))))
|
||||
result))
|
||||
|
||||
(defvar magit-svn-get-ref-info-cache nil
|
||||
"A cache for svn-ref-info.
|
||||
As `magit-get-svn-ref-info' might be considered a quite
|
||||
expensive operation a cache is taken so that `magit-status'
|
||||
doesn't repeatedly call it.")
|
||||
|
||||
(defun magit-svn-get-ref-info (&optional use-cache)
|
||||
"Gather details about the current git-svn repository.
|
||||
Return nil if there isn't one. Keys of the alist are ref-path,
|
||||
trunk-ref-name and local-ref-name.
|
||||
If USE-CACHE is non-nil then return the value of `magit-get-svn-ref-info-cache'."
|
||||
(if use-cache
|
||||
magit-svn-get-ref-info-cache
|
||||
(let* ((fetch (magit-get "svn-remote" "svn" "fetch"))
|
||||
(url)
|
||||
(revision))
|
||||
(when fetch
|
||||
(let* ((ref (cadr (split-string fetch ":")))
|
||||
(ref-path (file-name-directory ref))
|
||||
(trunk-ref-name (file-name-nondirectory ref)))
|
||||
(setq magit-svn-get-ref-info-cache
|
||||
(list
|
||||
(cons 'ref-path ref-path)
|
||||
(cons 'trunk-ref-name trunk-ref-name)
|
||||
;; get the local ref from the log. This is actually
|
||||
;; the way that git-svn does it.
|
||||
(cons 'local-ref
|
||||
(with-temp-buffer
|
||||
(insert (or (magit-git-string "log" "--first-parent")
|
||||
""))
|
||||
(goto-char (point-min))
|
||||
(cond ((re-search-forward "git-svn-id: \\(.+/.+?\\)@\\([0-9]+\\)" nil t)
|
||||
(setq url (match-string 1)
|
||||
revision (match-string 2))
|
||||
(magit-svn-get-local-ref url))
|
||||
(t
|
||||
(setq url (magit-get "svn-remote" "svn" "url"))
|
||||
nil))))
|
||||
(cons 'revision revision)
|
||||
(cons 'url url))))))))
|
||||
|
||||
(defun magit-svn-get-ref (&optional use-cache)
|
||||
"Get the best guess remote ref for the current git-svn based branch.
|
||||
If USE-CACHE is non nil, use the cached information."
|
||||
(let ((info (magit-svn-get-ref-info use-cache)))
|
||||
(cdr (assoc 'local-ref info))))
|
||||
|
||||
(magit-define-inserter svn-unpulled (&optional use-cache)
|
||||
(when (magit-svn-get-ref-info)
|
||||
(magit-git-section 'svn-unpulled
|
||||
"Unpulled commits (SVN):" 'magit-wash-log
|
||||
"log" "--pretty=format:* %H %s"
|
||||
(format "HEAD..%s" (magit-svn-get-ref use-cache)))))
|
||||
|
||||
(magit-define-inserter svn-unpushed (&optional use-cache)
|
||||
(when (magit-svn-get-ref-info)
|
||||
(magit-git-section 'svn-unpushed
|
||||
"Unpushed commits (SVN):" 'magit-wash-log
|
||||
"log" "--pretty=format:* %H %s"
|
||||
(format "%s..HEAD" (magit-svn-get-ref use-cache)))))
|
||||
|
||||
(magit-define-section-jumper svn-unpushed "Unpushed commits (SVN)")
|
||||
|
||||
(defun magit-svn-remote-string ()
|
||||
(let ((svn-info (magit-svn-get-ref-info)))
|
||||
(when svn-info
|
||||
(concat (cdr (assoc 'url svn-info))
|
||||
" @ "
|
||||
(cdr (assoc 'revision svn-info))))))
|
||||
|
||||
(defun magit-svn-remote-update ()
|
||||
(interactive)
|
||||
(when (magit-svn-enabled)
|
||||
(magit-run-git-async "svn" "fetch")))
|
||||
|
||||
(defvar magit-svn-extension-keys
|
||||
`((,(kbd "N r") . magit-svn-rebase)
|
||||
(,(kbd "N c") . magit-svn-dcommit)
|
||||
(,(kbd "N f") . magit-svn-remote-update)
|
||||
(,(kbd "N s") . magit-svn-find-rev)))
|
||||
|
||||
(easy-menu-define magit-svn-extension-menu
|
||||
nil
|
||||
"Git SVN extension menu"
|
||||
'("Git SVN"
|
||||
["Rebase" magit-svn-rebase (magit-svn-enabled)]
|
||||
["Fetch" magit-svn-remote-update (magit-svn-enabled)]
|
||||
["Commit" magit-svn-dcommit (magit-svn-enabled)]))
|
||||
|
||||
(defvar magit-svn-extension-inserters
|
||||
'((:after unpulled-commits (lambda () (magit-insert-svn-unpulled t)))
|
||||
(:after unpushed-commits (lambda () (magit-insert-svn-unpushed t)))))
|
||||
|
||||
(defvar magit-svn-extension
|
||||
(make-magit-extension :keys magit-svn-extension-keys
|
||||
:menu magit-svn-extension-menu
|
||||
:insert magit-svn-extension-inserters
|
||||
:remote-string 'magit-svn-remote-string))
|
||||
|
||||
(magit-install-extension magit-svn-extension)
|
||||
|
||||
(provide 'magit-svn)
|
||||
;;; magit-svn.el ends here
|
99
magit-topgit.el
Normal file
99
magit-topgit.el
Normal file
|
@ -0,0 +1,99 @@
|
|||
;;; magit-topgit.el --- topgit plug-in for Magit
|
||||
|
||||
;; Copyright (C) 2008, 2009 Marius Vollmer
|
||||
;; Copyright (C) 2008 Linh Dang
|
||||
;; Copyright (C) 2008 Alex Ott
|
||||
;; Copyright (C) 2008 Marcin Bachry
|
||||
;; Copyright (C) 2009 Alexey Voinov
|
||||
;; Copyright (C) 2009 John Wiegley
|
||||
;; Copyright (C) 2010 Yann Hodique
|
||||
;;
|
||||
;; 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 plug-in provides topgit functionality as a separate component of Magit
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'magit)
|
||||
|
||||
(defcustom magit-topgit-executable "tg"
|
||||
"The name of the TopGit executable."
|
||||
:group 'magit
|
||||
:type 'string)
|
||||
|
||||
;;; Topic branches (using topgit)
|
||||
|
||||
(defun magit-topgit-create-branch (branch parent)
|
||||
(when (zerop (or (string-match "t/" branch) -1))
|
||||
(magit-run* (list magit-topgit-executable "create"
|
||||
branch (magit-rev-to-git parent))
|
||||
nil nil nil t)
|
||||
t))
|
||||
|
||||
(defun magit-topgit-pull ()
|
||||
(when (file-exists-p ".topdeps")
|
||||
(magit-run* (list magit-topgit-executable "update")
|
||||
nil nil nil t)
|
||||
t))
|
||||
|
||||
(defun magit-topgit-wash-topic ()
|
||||
(if (search-forward-regexp "^..\\(t/\\S-+\\)\\s-+\\(\\S-+\\)\\s-+\\(\\S-+\\)"
|
||||
(line-end-position) t)
|
||||
(let ((topic (match-string 1)))
|
||||
(delete-region (match-beginning 2) (match-end 2))
|
||||
(goto-char (line-beginning-position))
|
||||
(delete-char 4)
|
||||
(insert "\t")
|
||||
(goto-char (line-beginning-position))
|
||||
(magit-with-section topic 'topic
|
||||
(magit-set-section-info topic)
|
||||
(forward-line)))
|
||||
(delete-region (line-beginning-position) (1+ (line-end-position))))
|
||||
t)
|
||||
|
||||
(defun magit-topgit-wash-topics ()
|
||||
(let ((magit-old-top-section nil))
|
||||
(magit-wash-sequence #'magit-topgit-wash-topic)))
|
||||
|
||||
(magit-define-inserter topics ()
|
||||
(magit-git-section 'topics
|
||||
"Topics:" 'magit-topgit-wash-topics
|
||||
"branch" "-v"))
|
||||
|
||||
(defvar magit-topgit-extension-inserters
|
||||
'((:after stashes magit-insert-topics)))
|
||||
|
||||
(defvar magit-topgit-extension-actions
|
||||
'(("discard" ((topic)
|
||||
(when (yes-or-no-p "Discard topic? ")
|
||||
(magit-run* (list magit-topgit-executable "delete" "-f" info)
|
||||
nil nil nil t))))
|
||||
("visit" ((topic)
|
||||
(magit-checkout info)))))
|
||||
|
||||
(defvar magit-topgit-extension-commands
|
||||
'((create-branch . magit-topgit-create-branch)
|
||||
(pull . magit-topgit-pull)))
|
||||
|
||||
(defvar magit-topgit-extension
|
||||
(make-magit-extension :actions magit-topgit-extension-actions
|
||||
:insert magit-topgit-extension-inserters
|
||||
:commands magit-topgit-extension-commands))
|
||||
|
||||
(magit-install-extension magit-topgit-extension)
|
||||
|
||||
(provide 'magit-topgit)
|
||||
;;; magit-topgit.el ends here
|
19
magit.texi
19
magit.texi
|
@ -500,7 +500,8 @@ local branch. Deleting works for both local and remote branches.
|
|||
You can merge the branch in the current line by typing @kbd{m} for a
|
||||
manual merge and @kbd{M} for an automatic merge.
|
||||
|
||||
With @kbd{b} you can check out the branch in the current line.
|
||||
With @kbd{RET} or @kbd{b} you can check out the branch in the current
|
||||
line.
|
||||
|
||||
Typing @kbd{$} shows the @code{*magit-process*} buffer which contains
|
||||
the transcript of the most recent command.
|
||||
|
@ -649,10 +650,12 @@ it, like from any other diff.
|
|||
|
||||
Magit will run @code{git push} when you type @kbd{P}. If you give a
|
||||
prefix argument to @kbd{P}, you will be prompted for the repository to
|
||||
push to. When no default remote repositor has been configured yet for
|
||||
push to. When no default remote repository has been configured yet for
|
||||
the current branch, you will be prompted as well. Typing @kbd{P} will
|
||||
only push the current branch to the remote. In other words, it will
|
||||
run @code{git push <remote> <branch>}.
|
||||
only push the current branch to the remote. In other words, it will run
|
||||
@code{git push <remote> <branch>}. The branch will be created in the
|
||||
remote if it doesn't exist already. The local branch will be configured
|
||||
so that it pulls from the new remote branch.
|
||||
|
||||
Typing @kbd{f} will run @code{git remote update}. With a prefix arg, it
|
||||
will prompt for the name of the remote to update. Typing @kbd{F} will
|
||||
|
@ -676,13 +679,13 @@ Magit shows them in a section called @emph{Unpulled changes}. Typing
|
|||
@node Interfacing with Subversion
|
||||
@chapter Interfacing with Subversion
|
||||
|
||||
Typing @kbd{N r} runs @code{git svn rebase} and typing @kbd{N c} runs
|
||||
@code{git svn dcommit}.
|
||||
Typing @kbd{N r} runs @code{git svn rebase}, typing @kbd{N c} runs
|
||||
@code{git svn dcommit} and typing @kbd{N f} runs @code{git svn fetch}.
|
||||
|
||||
@kbd{N f} will prompt you for a (numeric, Subversion) revision and
|
||||
@kbd{N s} will prompt you for a (numeric, Subversion) revision and
|
||||
then search for a corresponding Git sha1 for the commit. This is
|
||||
limited to the path of the remote Subversion repository. With a prefix
|
||||
(@kbd{C-u N f} the user will also be prompted for a branch to search
|
||||
(@kbd{C-u N s} the user will also be prompted for a branch to search
|
||||
in.
|
||||
|
||||
@node Using Git Directly
|
||||
|
|
Loading…
Reference in a new issue