chiark / gitweb /
stgit.el: Fix problem where standard-output isn't bound correctly
[stgit] / contrib / stgit.el
index e8995b34ba658be70297c68b41f2d045655d88f6..bbc7eb1e6bfc56f3b78fcadf4fe89e251c35aa99 100644 (file)
@@ -17,7 +17,9 @@ (require 'cl)
 (require 'ewoc)
 
 (defun stgit (dir)
-  "Manage StGit patches for the tree in DIR."
+  "Manage StGit patches for the tree in DIR.
+
+See `stgit-mode' for commands available."
   (interactive "DDirectory: \n")
   (switch-to-stgit-buffer (git-get-top-dir dir))
   (stgit-reload))
@@ -199,7 +201,9 @@ (defun stgit-run-series (ewoc)
         worktree-node
         all-patchsyms)
     (with-temp-buffer
-      (let ((exit-status (stgit-run-silent "series" "--description" "--empty")))
+      (let* ((standard-output (current-buffer))
+             (exit-status (stgit-run-silent "series"
+                                            "--description" "--empty")))
         (goto-char (point-min))
         (if (not (zerop exit-status))
             (cond ((looking-at "stg series: \\(.*\\)")
@@ -253,9 +257,9 @@ (defun stgit-reload ()
     (ewoc-set-hf stgit-ewoc
                  (concat "Branch: "
                          (propertize
-                          (with-temp-buffer
-                            (stgit-run-silent "branch")
-                            (buffer-substring (point-min) (1- (point-max))))
+                          (substring (with-output-to-string
+                                       (stgit-run-silent "branch"))
+                                     0 -1)
                           'face 'stgit-branch-name-face)
                          "\n\n")
                  (if stgit-show-worktree
@@ -270,15 +274,58 @@ (defun stgit-reload ()
       (goto-line curline)))
   (stgit-refresh-git-status))
 
+(defun stgit-set-default (symbol value)
+  "Set default value of SYMBOL to VALUE using `set-default' and
+reload all StGit buffers."
+  (set-default symbol value)
+  (dolist (buf (buffer-list))
+    (with-current-buffer buf
+      (when (eq major-mode 'stgit-mode)
+        (stgit-reload)))))
+
 (defgroup stgit nil
   "A user interface for the StGit patch maintenance tool."
-  :group 'tools)
+  :group 'tools
+  :link '(function-link stgit)
+  :link '(url-link "http://www.procode.org/stgit/"))
 
-(defface stgit-description-face
-  '((((background dark)) (:foreground "tan"))
-    (((background light)) (:foreground "dark red")))
-  "The face used for StGit descriptions"
-  :group 'stgit)
+(defcustom stgit-abbreviate-copies-and-renames t
+  "If non-nil, abbreviate copies and renames as \"dir/{old -> new}/file\"
+instead of \"dir/old/file -> dir/new/file\"."
+  :type 'boolean
+  :group 'stgit
+  :set 'stgit-set-default)
+
+(defcustom stgit-default-show-worktree t
+  "Set to non-nil to by default show the working tree in a new stgit buffer.
+
+Use \\<stgit-mode-map>\\[stgit-toggle-worktree] to toggle the this setting in an already-started StGit buffer."
+  :type 'boolean
+  :group 'stgit
+  :link '(variable-link stgit-show-worktree))
+
+(defcustom stgit-find-copies-harder nil
+  "Try harder to find copied files when listing patches.
+
+When not nil, runs git diff-tree with the --find-copies-harder
+flag, which reduces performance."
+  :type 'boolean
+  :group 'stgit
+  :set 'stgit-set-default)
+
+(defcustom stgit-show-worktree-mode 'center
+  "This variable controls where the \"Index\" and \"Work tree\"
+will be shown on in the buffer.
+
+It can be set to 'top (above all patches), 'center (show between
+applied and unapplied patches), and 'bottom (below all patches)."
+  :type '(radio (const :tag "above all patches (top)" top)
+                (const :tag "between applied and unapplied patches (center)"
+                       center)
+                (const :tag "below all patches (bottom)" bottom))
+  :group 'stgit
+  :link '(variable-link stgit-show-worktree)
+  :set 'stgit-set-default)
 
 (defface stgit-branch-name-face
   '((t :inherit bold))
@@ -306,10 +353,16 @@ (defface stgit-unapplied-patch-face
   "The face used for unapplied patch names"
   :group 'stgit)
 
-(defface stgit-modified-file-face
-  '((((class color) (background light)) (:foreground "purple"))
-    (((class color) (background dark)) (:foreground "salmon")))
-  "StGit mode face used for modified file status"
+(defface stgit-description-face
+  '((((background dark)) (:foreground "tan"))
+    (((background light)) (:foreground "dark red")))
+  "The face used for StGit descriptions"
+  :group 'stgit)
+
+(defface stgit-index-work-tree-title-face
+  '((((supports :slant italic)) :slant italic)
+    (t :inherit bold))
+  "StGit mode face used for the \"Index\" and \"Work tree\" titles"
   :group 'stgit)
 
 (defface stgit-unmerged-file-face
@@ -335,20 +388,10 @@ (defface stgit-file-permission-face
   "StGit mode face used for permission changes."
   :group 'stgit)
 
-(defface stgit-index-work-tree-title-face
-  '((((supports :slant italic)) :slant italic)
-    (t :inherit bold))
-  "StGit mode face used for the \"Index\" and \"Work tree\" titles"
-  :group 'stgit)
-
-
-(defcustom stgit-find-copies-harder
-  nil
-  "Try harder to find copied files when listing patches.
-
-When not nil, runs git diff-tree with the --find-copies-harder
-flag, which reduces performance."
-  :type 'boolean
+(defface stgit-modified-file-face
+  '((((class color) (background light)) (:foreground "purple"))
+    (((class color) (background dark)) (:foreground "salmon")))
+  "StGit mode face used for modified file status"
   :group 'stgit)
 
 (defconst stgit-file-status-code-strings
@@ -512,9 +555,10 @@ (defun stgit-file-pp (file)
                       (stgit-file-old-perm file)
                       (stgit-file-new-perm file)))
         (start (point)))
-    (insert (format "    %-12s%1s%s%s\n"
+    (insert (format "    %-12s%s%s%s%s\n"
                     (stgit-file-status-code-as-string file)
                     mode-change
+                    (if (zerop (length mode-change)) "" " ")
                     name
                     (propertize (stgit-file-type-change-string
                                  (stgit-file-old-perm file)
@@ -549,67 +593,68 @@ (defun stgit-insert-patch-files (patch)
     (set-marker-insertion-type end t)
     (setf (stgit-patch-files-ewoc patch) ewoc)
     (with-temp-buffer
-      (apply 'stgit-run-git
-             (cond ((eq patchsym :work)
-                    `("diff-files" "-0" ,@args))
-                   ((eq patchsym :index)
-                    `("diff-index" ,@args "--cached" "HEAD"))
-                   (t
-                    `("diff-tree" ,@args "-r" ,(stgit-id patchsym)))))
-
-      (when (and (eq patchsym :work))
-        (when stgit-show-ignored
-          (stgit-insert-ls-files '("--ignored" "--others") "I"))
-        (when stgit-show-unknown
-          (stgit-insert-ls-files '("--others") "X"))
-        (sort-regexp-fields nil ":[^\0]*\0\\([^\0]*\\)\0" "\\1"
-                            (point-min) (point-max)))
+      (let ((standard-output (current-buffer)))
+        (apply 'stgit-run-git
+               (cond ((eq patchsym :work)
+                      `("diff-files" "-0" ,@args))
+                     ((eq patchsym :index)
+                      `("diff-index" ,@args "--cached" "HEAD"))
+                     (t
+                      `("diff-tree" ,@args "-r" ,(stgit-id patchsym)))))
+
+        (when (and (eq patchsym :work))
+          (when stgit-show-ignored
+            (stgit-insert-ls-files '("--ignored" "--others") "I"))
+          (when stgit-show-unknown
+            (stgit-insert-ls-files '("--others") "X"))
+          (sort-regexp-fields nil ":[^\0]*\0\\([^\0]*\\)\0" "\\1"
+                              (point-min) (point-max)))
 
-      (goto-char (point-min))
-      (unless (or (eobp) (memq patchsym '(:work :index)))
-        (forward-char 41))
-      (while (looking-at ":\\([0-7]+\\) \\([0-7]+\\) [0-9A-Fa-f]\\{40\\} [0-9A-Fa-f]\\{40\\} ")
-        (let ((old-perm (string-to-number (match-string 1) 8))
-              (new-perm (string-to-number (match-string 2) 8)))
-          (goto-char (match-end 0))
-          (let ((file
-                 (cond ((looking-at
-                         "\\([CR]\\)\\([0-9]*\\)\0\\([^\0]*\\)\0\\([^\0]*\\)\0")
-                        (let* ((patch-status (stgit-patch-status patch))
-                               (file-subexp  (if (eq patch-status 'unapplied)
-                                                 3
-                                               4))
-                               (file         (match-string file-subexp)))
+        (goto-char (point-min))
+        (unless (or (eobp) (memq patchsym '(:work :index)))
+          (forward-char 41))
+        (while (looking-at ":\\([0-7]+\\) \\([0-7]+\\) [0-9A-Fa-f]\\{40\\} [0-9A-Fa-f]\\{40\\} ")
+          (let ((old-perm (string-to-number (match-string 1) 8))
+                (new-perm (string-to-number (match-string 2) 8)))
+            (goto-char (match-end 0))
+            (let ((file
+                   (cond ((looking-at
+                           "\\([CR]\\)\\([0-9]*\\)\0\\([^\0]*\\)\0\\([^\0]*\\)\0")
+                          (let* ((patch-status (stgit-patch-status patch))
+                                 (file-subexp  (if (eq patch-status 'unapplied)
+                                                   3
+                                                 4))
+                                 (file         (match-string file-subexp)))
+                            (make-stgit-file
+                             :old-perm       old-perm
+                             :new-perm       new-perm
+                             :copy-or-rename t
+                             :cr-score       (string-to-number (match-string 2))
+                             :cr-from        (match-string 3)
+                             :cr-to          (match-string 4)
+                             :status         (stgit-file-status-code
+                                              (match-string 1))
+                             :file           file)))
+                         ((looking-at "\\([ABD-QS-Z]\\)\0\\([^\0]*\\)\0")
                           (make-stgit-file
                            :old-perm       old-perm
                            :new-perm       new-perm
-                           :copy-or-rename t
-                           :cr-score       (string-to-number (match-string 2))
-                           :cr-from        (match-string 3)
-                           :cr-to          (match-string 4)
+                           :copy-or-rename nil
+                           :cr-score       nil
+                           :cr-from        nil
+                           :cr-to          nil
                            :status         (stgit-file-status-code
                                             (match-string 1))
-                           :file           file)))
-                       ((looking-at "\\([ABD-QS-Z]\\)\0\\([^\0]*\\)\0")
-                        (make-stgit-file
-                         :old-perm       old-perm
-                         :new-perm       new-perm
-                         :copy-or-rename nil
-                         :cr-score       nil
-                         :cr-from        nil
-                         :cr-to          nil
-                         :status         (stgit-file-status-code
-                                          (match-string 1))
-                         :file           (match-string 2))))))
-            (goto-char (match-end 0))
-            (ewoc-enter-last ewoc file))))
-
-      (unless (ewoc-nth ewoc 0)
-        (ewoc-set-hf ewoc ""
-                     (concat "    "
-                             (propertize "<no files>"
-                                         'face 'stgit-description-face)
-                             "\n"))))
+                           :file           (match-string 2))))))
+              (goto-char (match-end 0))
+              (ewoc-enter-last ewoc file))))
+
+        (unless (ewoc-nth ewoc 0)
+          (ewoc-set-hf ewoc ""
+                       (concat "    "
+                               (propertize "<no files>"
+                                           'face 'stgit-description-face)
+                               "\n")))))
     (goto-char end)))
 
 (defun stgit-find-file (&optional other-window)
@@ -766,14 +811,100 @@ (unless stgit-mode-map
             ([?\C-c ?\C-/] . stgit-redo)
             ("\C-c\C-_" . stgit-redo)
             ("B" .        stgit-branch)
+            ("\C-c\C-b" . stgit-rebase)
             ("t" .        ,toggle-map)
             ("d" .        ,diff-map)
             ("q" .        stgit-quit)))))
 
 (defun stgit-mode ()
   "Major mode for interacting with StGit.
-Commands:
-\\{stgit-mode-map}"
+
+Start StGit using \\[stgit].
+
+Basic commands:
+\\<stgit-mode-map>\
+\\[stgit-help] Show this help text
+\\[stgit-quit] Hide the StGit buffer
+\\[describe-bindings]  Show all key bindings
+
+\\[stgit-reload-or-repair]     Reload the StGit buffer
+\\[universal-argument] \\[stgit-reload-or-repair]      Repair StGit metadata
+
+\\[stgit-undo] Undo most recent StGit operation
+\\[stgit-redo] Undo recent undo
+
+\\[stgit-git-status]   Run `git-status' (if available)
+
+Movement commands:
+\\[stgit-previous-line]        Move to previous line
+\\[stgit-next-line]    Move to next line
+\\[stgit-previous-patch]       Move to previous patch
+\\[stgit-next-patch]   Move to next patch
+
+\\[stgit-mark] Mark patch
+\\[stgit-unmark-up]    Unmark patch and move up
+\\[stgit-unmark-down]  Unmark patch and move down
+
+Commands for patches:
+\\[stgit-select]       Toggle showing changed files in patch
+\\[stgit-refresh]      Refresh patch with changes in index or work tree
+\\[stgit-diff] Show the patch log and diff
+
+\\[stgit-new]  Create a new, empty patch
+\\[stgit-rename]       Rename patch
+\\[stgit-edit] Edit patch description
+\\[stgit-delete]       Delete patch(es)
+
+\\[stgit-push-next]    Push next patch onto stack
+\\[stgit-pop-next]     Pop current patch from stack
+\\[stgit-push-or-pop]  Push or pop patch at point
+\\[stgit-goto] Make current patch current by popping or pushing
+
+\\[stgit-squash]       Squash (meld together) patches
+\\[stgit-move-patches] Move patch(es) to point
+
+\\[stgit-commit]       Commit patch(es)
+\\[stgit-uncommit]     Uncommit patch(es)
+
+Commands for files:
+\\[stgit-select]       Open the file in this window
+\\[stgit-find-file-other-window]       Open the file in another window
+\\[stgit-diff] Show the file's diff
+
+\\[stgit-file-toggle-index]    Toggle change between index and work tree
+\\[stgit-revert-file]  Revert changes to file
+
+Display commands:
+\\[stgit-toggle-worktree]      Toggle showing index and work tree
+\\[stgit-toggle-unknown]       Toggle showing unknown files
+\\[stgit-toggle-ignored]       Toggle showing ignored files
+
+Commands for diffs:
+\\[stgit-diff] Show diff of patch or file
+\\[stgit-diff-base]    Show diff against the merge base
+\\[stgit-diff-ours]    Show diff against our branch
+\\[stgit-diff-theirs]  Show diff against their branch
+
+  With one prefix argument (e.g., \\[universal-argument] \\[stgit-diff]), \
+ignore space changes.
+  With two prefix arguments (e.g., \\[universal-argument] \
+\\[universal-argument] \\[stgit-diff]), ignore all space changes.
+
+Commands for merge conflicts:
+\\[stgit-find-file-merge]      Resolve conflicts using `smerge-ediff'
+\\[stgit-resolve-file] Mark unmerged file as resolved
+
+Commands for branches:
+\\[stgit-branch]       Switch to another branch
+\\[stgit-rebase]       Rebase the current branch
+
+Customization variables:
+`stgit-abbreviate-copies-and-renames'
+`stgit-default-show-worktree'
+`stgit-find-copies-harder'
+`stgit-show-worktree-mode'
+
+See also \\[customize-group] for the \"stgit\" group."
   (kill-all-local-variables)
   (buffer-disable-undo)
   (setq mode-name "StGit"
@@ -960,6 +1091,31 @@ (defun stgit-branch (branch)
   (stgit-capture-output nil (stgit-run "branch" "--" branch))
   (stgit-reload))
 
+(defun stgit-available-refs (&optional omit-stgit)
+  "Returns a list of the available git refs.
+If OMIT-STGIT is not nil, filter out \"resf/heads/*.stgit\"."
+  (let* ((output (with-output-to-string
+                   (stgit-run-git-silent "for-each-ref" "--format=%(refname)"
+                                         "refs/tags" "refs/heads"
+                                         "refs/remotes")))
+         (result (split-string output "\n" t)))
+    (mapcar (lambda (s)
+              (if (string-match "^refs/\\(heads\\|tags\\|remotes\\)/" s)
+                  (substring s (match-end 0))
+                s))
+            (if omit-stgit
+                (delete-if (lambda (s)
+                             (string-match "^refs/heads/.*\\.stgit$" s))
+                           result)
+              result))))
+
+(defun stgit-rebase (new-base)
+  "Rebase to NEW-BASE."
+  (interactive (list (completing-read "Rebase to: "
+                                      (stgit-available-refs t))))
+  (stgit-capture-output nil (stgit-run "rebase" new-base))
+  (stgit-reload))
+
 (defun stgit-commit (count)
   "Run stg commit on COUNT commits.
 Interactively, the prefix argument is used as COUNT.
@@ -980,6 +1136,22 @@ (defun stgit-uncommit (count)
     (stgit-capture-output nil (stgit-run "uncommit" "-n" count))
     (stgit-reload)))
 
+(defun stgit-neighbour-file ()
+  "Return the file name of the next file after point, or the
+previous file if point is at the last file within a patch."
+  (let ((old-point (point))
+        neighbour-file)
+    (and (zerop (forward-line 1))
+         (let ((f (stgit-patched-file-at-point)))
+           (and f (setq neighbour-file (stgit-file-file f)))))
+    (goto-char old-point)
+    (unless neighbour-file
+      (and (zerop (forward-line -1))
+           (let ((f (stgit-patched-file-at-point)))
+             (and f (setq neighbour-file (stgit-file-file f)))))
+      (goto-char old-point))
+    neighbour-file))
+
 (defun stgit-revert-file ()
   "Revert the file at point, which must be in the index or the
 working tree."
@@ -995,7 +1167,8 @@ (defun stgit-revert-file ()
          (co-file      (cond ((eq file-status 'rename)
                               (stgit-file-cr-from patched-file))
                              ((not (memq file-status '(copy add)))
-                              (stgit-file-file patched-file)))))
+                              (stgit-file-file patched-file))))
+         (next-file    (stgit-neighbour-file)))
 
     (unless (memq patch-name '(:work :index))
       (error "No index or working tree file on this line"))
@@ -1015,7 +1188,8 @@ (defun stgit-revert-file ()
             (stgit-run-git "rm" "-f" "-q" "--" rm-file))
           (when co-file
             (stgit-run-git "checkout" "HEAD" co-file)))
-        (stgit-reload)))))
+        (stgit-reload)
+        (stgit-goto-patch patch-name next-file)))))
 
 (defun stgit-resolve-file ()
   "Resolve conflict in the file at point."
@@ -1170,12 +1344,15 @@ (stgit-define-diff stgit-diff-combined
                    "--cc"
                    "show a combined diff")
 
-(defun stgit-move-change-to-index (file)
-  "Copies the workspace state of FILE to index, using git add or git rm"
+(defun stgit-move-change-to-index (file &optional force)
+  "Copies the work tree state of FILE to index, using git add or git rm.
+
+If FORCE is not nil, use --force."
   (let ((op (if (or (file-exists-p file) (file-symlink-p file))
                 '("add") '("rm" "-q"))))
     (stgit-capture-output "*git output*"
-      (apply 'stgit-run-git (append op '("--") (list file))))))
+      (apply 'stgit-run-git (append op (and force '("--force"))
+                                    '("--") (list file))))))
 
 (defun stgit-remove-change-from-index (file)
   "Unstages the change in FILE from the index"
@@ -1189,42 +1366,32 @@ (defun stgit-file-toggle-index ()
 file ended up. You can then jump to the file with \
 \\[exchange-point-and-mark]."
   (interactive)
-  (let ((patched-file (stgit-patched-file-at-point)))
-    (unless patched-file
-      (error "No file on the current line"))
-    (when (eq (stgit-file-status patched-file) 'unmerged)
+  (let* ((patched-file   (or (stgit-patched-file-at-point)
+                            (error "No file on the current line")))
+        (patched-status (stgit-file-status patched-file)))
+    (when (eq patched-status 'unmerged)
       (error (substitute-command-keys "Use \\[stgit-resolve-file] to move an unmerged file to the index")))
-    (when (eq (stgit-file-status patched-file) 'ignore)
-      (error "You cannot add ignored files to the index"))
     (let* ((patch      (stgit-patch-at-point))
            (patch-name (stgit-patch-name patch))
-           (old-point  (point))
-           next-file)
-
-      ;; find the next file in the patch, or the previous one if this
-      ;; was the last file
-      (and (zerop (forward-line 1))
-           (let ((f (stgit-patched-file-at-point)))
-             (and f (setq next-file (stgit-file-file f)))))
-      (goto-char old-point)
-      (unless next-file
-        (and (zerop (forward-line -1))
-             (let ((f (stgit-patched-file-at-point)))
-               (and f (setq next-file (stgit-file-file f)))))
-        (goto-char old-point))
+           (mark-file  (if (eq patched-status 'rename)
+                          (stgit-file-cr-to patched-file)
+                        (stgit-file-file patched-file)))
+           (point-file  (if (eq patched-status 'rename)
+                          (stgit-file-cr-from patched-file)
+                        (stgit-neighbour-file))))
 
       (cond ((eq patch-name :work)
-             (stgit-move-change-to-index (stgit-file-file patched-file)))
+             (stgit-move-change-to-index (stgit-file-file patched-file)
+                                         (eq patched-status 'ignore)))
             ((eq patch-name :index)
              (stgit-remove-change-from-index (stgit-file-file patched-file)))
             (t
-             (error "Can only move files in the working tree to index")))
+             (error "Can only move files between working tree and index")))
       (stgit-refresh-worktree)
       (stgit-refresh-index)
-      (stgit-goto-patch (if (eq patch-name :index) :work :index)
-                        (stgit-file-file patched-file))
+      (stgit-goto-patch (if (eq patch-name :index) :work :index) mark-file)
       (push-mark nil t t)
-      (stgit-goto-patch patch-name next-file))))
+      (stgit-goto-patch patch-name point-file))))
 
 (defun stgit-edit ()
   "Edit the patch on the current line."
@@ -1325,7 +1492,7 @@ (defun stgit-move-patches-target ()
 This is either the patch at point, or one of :top and :bottom, if
 the point is after or before the applied patches."
 
-  (let ((patchsym (stgit-patch-name-at-point)))
+  (let ((patchsym (stgit-patch-name-at-point nil t)))
     (cond (patchsym patchsym)
          ((save-excursion (re-search-backward "^>" nil t)) :top)
          (t :bottom))))
@@ -1334,7 +1501,7 @@ (defun stgit-sort-patches (patchsyms)
   "Returns the list of patches in PATCHSYMS sorted according to
 their position in the patch series, bottommost first.
 
-PATCHSYMS may not contain duplicate entries."
+PATCHSYMS must not contain duplicate entries."
   (let (sorted-patchsyms
         (series (with-output-to-string
                   (with-current-buffer standard-output
@@ -1481,28 +1648,6 @@ (defun stgit-refresh (&optional arg)
     (stgit-refresh-git-status))
   (stgit-reload))
 
-(defcustom stgit-show-worktree-mode 'center
-  "This variable controls where the \"Index\" and \"Work tree\"
-will be shown on in the buffer.
-
-It can be set to 'top (above all patches), 'center (show between
-applied and unapplied patches), and 'bottom (below all patches).
-
-See also `stgit-show-worktree'."
-  :type '(radio (const :tag "above all patches (top)" top)
-                (const :tag "between applied and unapplied patches (center)"
-                       center)
-                (const :tag "below all patches (bottom)" bottom))
-  :group 'stgit)
-
-(defcustom stgit-default-show-worktree
-  t
-  "Set to non-nil to by default show the working tree in a new stgit buffer.
-
-This value is used as the default value for `stgit-show-worktree'."
-  :type 'boolean
-  :group 'stgit)
-
 (defvar stgit-show-worktree nil
   "If nil, inhibit showing work tree and index in the stgit buffer.
 
@@ -1516,7 +1661,7 @@ (defvar stgit-show-unknown nil
 
 (defun stgit-toggle-worktree (&optional arg)
   "Toggle the visibility of the work tree.
-With arg, show the work tree if arg is positive.
+With ARG, show the work tree if ARG is positive.
 
 Its initial setting is controlled by `stgit-default-show-worktree'.
 
@@ -1553,11 +1698,4 @@ (defun stgit-toggle-unknown (&optional arg)
           (not stgit-show-unknown)))
   (stgit-reload))
 
-(defcustom stgit-abbreviate-copies-and-renames
-  t
-  "If non-nil, abbreviate copies and renames as \"dir/{old -> new}/file\"
-instead of \"dir/old/file -> dir/new/file\"."
-  :type 'boolean
-  :group 'stgit)
-
 (provide 'stgit)