Merge branch 'master' into ignore-file

This commit is contained in:
Nathan Weizenbaum 2010-08-01 15:48:44 -07:00
commit 5e1342f359
7 changed files with 673 additions and 318 deletions

View file

@ -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

View file

@ -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

View file

@ -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
View 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
View 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

657
magit.el

File diff suppressed because it is too large Load diff

View file

@ -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.
@ -651,8 +652,10 @@ 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 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