{"thread":{"id":"15213","subject":"[PATCH] Teach git.el to mark/unmark files by regexp","startedAt":"2008-08-27T03:24:40Z","lastAt":"2008-09-12T04:22:04Z","messageCount":5,"participants":["David Christensen","Alexandre Julliard"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"88682","messageId":"1219807480-57122-1-git-send-email-david@endpoint.com","threadId":"15213","inReplyTo":null,"subject":"[PATCH] Teach git.el to mark/unmark files by regexp","fromName":"David Christensen","fromEmail":"david@endpoint.com","sentAt":"2008-08-27T03:24:40Z","receivedAt":"2008-08-27T03:24:40Z","isPatch":true,"sender":{"key":"david@endpoint.com","avatar":"https://gravatar.com/avatar/6089b35cc409d9d15ab439753a213d7528cd5e0a04f3917fa452d8dc45296612?d=mp&s=160"},"body":"Adds the functions git-mark-regexp and git-unmark-regexp to git.el.\nCreates a mark-map keymap to support dired-like behavior for\nmarking/unmarking via regexp.  Also adds these functions to the\nmenubar.\n\nSigned-off-by: David Christensen <david@endpoint.com>\n---\n contrib/emacs/git.el |   30 +++++++++++++++++++++++++++++-\n 1 files changed, 29 insertions(+), 1 deletions(-)\n\ndiff --git a/contrib/emacs/git.el b/contrib/emacs/git.el\nindex c1cf1cb..279610f 100644\n--- a/contrib/emacs/git.el\n+++ b/contrib/emacs/git.el\n@@ -944,6 +944,27 @@ Return the list of files that haven't been handled.\"\n   ; move back to goal column after invalidate\n   (when goal-column (move-to-column goal-column)))\n \n+(defun git-mark-regexp (re)\n+  \"Mark all files which match a provided regexp.\"\n+  (interactive \"sMark files matching regular expression: \")\n+  (unless git-status (error \"Not in git-status buffer.\"))\n+  (ewoc-map (lambda (info) (unless (git-fileinfo->marked info)\n+                             (when (string-match re (git-fileinfo->name info))\n+                               (setf (git-fileinfo->marked info) t)))) git-status)\n+  ; move back to goal column after invalidate\n+  (when goal-column (move-to-column goal-column)))\n+\n+(defun git-unmark-regexp (re)\n+  \"Unmark all files which match a provided regexp.\"\n+  (interactive \"sUnmark files matching regular expression: \")\n+  (unless git-status (error \"Not in git-status buffer.\"))\n+  (ewoc-map (lambda (info) (when (git-fileinfo->marked info)\n+                             (when (string-match re (git-fileinfo->name info))\n+                               (setf (git-fileinfo->marked info) nil)) t)) git-status)\n+  ; move back to goal column after invalidate\n+  (when goal-column (move-to-column goal-column)))\n+\n+\n (defun git-toggle-all-marks ()\n   \"Toggle all file marks.\"\n   (interactive)\n@@ -1420,9 +1441,11 @@ amended version of it.\"\n   (let ((map (make-keymap))\n         (commit-map (make-sparse-keymap))\n         (diff-map (make-sparse-keymap))\n-        (toggle-map (make-sparse-keymap)))\n+        (toggle-map (make-sparse-keymap))\n+        (mark-map (make-sparse-keymap)))\n     (suppress-keymap map)\n     (define-key map \"?\"   'git-help)\n+    (define-key map \"*\"    mark-map)\n     (define-key map \"h\"   'git-help)\n     (define-key map \" \"   'git-next-file)\n     (define-key map \"a\"   'git-add-file)\n@@ -1469,6 +1492,9 @@ amended version of it.\"\n     (define-key toggle-map \"i\" 'git-toggle-show-ignored)\n     (define-key toggle-map \"k\" 'git-toggle-show-unknown)\n     (define-key toggle-map \"m\" 'git-toggle-all-marks)\n+    ; the mark submap\n+    (define-key mark-map \"%\" 'git-mark-regexp)\n+    (define-key mark-map \"\\C-?\" 'git-unmark-regexp)\n     (setq git-status-mode-map map))\n   (easy-menu-define git-menu git-status-mode-map\n     \"Git Menu\"\n@@ -1499,8 +1525,10 @@ amended version of it.\"\n       \"--------\"\n       [\"Mark\" git-mark-file t]\n       [\"Mark All\" git-mark-all t]\n+      [\"Mark Regexp\" git-mark-regexp t]\n       [\"Unmark\" git-unmark-file t]\n       [\"Unmark All\" git-unmark-all t]\n+      [\"Unmark Regexp\" git-unmark-regexp t]\n       [\"Toggle All Marks\" git-toggle-all-marks t]\n       [\"Hide Handled Files\" git-remove-handled t]\n       \"--------\"\n-- \n1.6.0.1.90.g27a6e.dirty\n"},{"id":"89236","messageId":"87myiuwdk0.fsf@wine.dyndns.org","threadId":"15213","inReplyTo":"1219807480-57122-1-git-send-email-david@endpoint.com","subject":"Re: [PATCH] Teach git.el to mark/unmark files by regexp","fromName":"Alexandre Julliard","fromEmail":"julliard@winehq.org","sentAt":"2008-08-30T18:41:35Z","receivedAt":"2008-08-30T18:41:35Z","isPatch":true,"sender":{"key":"julliard@winehq.org","avatar":null},"body":"David Christensen <david@endpoint.com> writes:\n\n> Adds the functions git-mark-regexp and git-unmark-regexp to git.el.\n> Creates a mark-map keymap to support dired-like behavior for\n> marking/unmarking via regexp.  Also adds these functions to the\n> menubar.\n\nI think that emulating dired behavior is a good idea, but you should go\nall the way and make it fully compatible, unmark is supposed to be \"* %\"\nwith a prefix arg, and \"* DEL\" should be git-unmark-file-up.\n\n-- \nAlexandre Julliard\njulliard@winehq.org\n"},{"id":"89239","messageId":"F0D63233-0302-4CF8-9CE1-FC12F2B80F91@endpoint.com","threadId":"15213","inReplyTo":"87myiuwdk0.fsf@wine.dyndns.org","subject":"Re: [PATCH] Teach git.el to mark/unmark files by regexp","fromName":"David Christensen","fromEmail":"david@endpoint.com","sentAt":"2008-08-30T19:02:37Z","receivedAt":"2008-08-30T19:02:37Z","isPatch":true,"sender":{"key":"david@endpoint.com","avatar":"https://gravatar.com/avatar/6089b35cc409d9d15ab439753a213d7528cd5e0a04f3917fa452d8dc45296612?d=mp&s=160"},"body":">> Adds the functions git-mark-regexp and git-unmark-regexp to git.el.\n>> Creates a mark-map keymap to support dired-like behavior for\n>> marking/unmarking via regexp.  Also adds these functions to the\n>> menubar.\n>\n> I think that emulating dired behavior is a good idea, but you should  \n> go\n> all the way and make it fully compatible, unmark is supposed to be  \n> \"* %\"\n> with a prefix arg, and \"* DEL\" should be git-unmark-file-up.\n\n\nSounds good; I'll review other mark-related dired bindings and see if  \nthere are other correspondences we can make, and then resubmit a patch.\n\nRegards,\n\nDavid\n--\nDavid Christensen\nEnd Point Corporation\ndavid@endpoint.com\n"},{"id":"90512","messageId":"1221193324-59334-1-git-send-email-david@endpoint.com","threadId":"15213","inReplyTo":"F0D63233-0302-4CF8-9CE1-FC12F2B80F91@endpoint.com","subject":"[PATCH v2] Teach git.el to mark/unmark files by regexp","fromName":"David Christensen","fromEmail":"david@endpoint.com","sentAt":"2008-09-12T04:22:03Z","receivedAt":"2008-09-12T04:22:03Z","isPatch":true,"sender":{"key":"david@endpoint.com","avatar":"https://gravatar.com/avatar/6089b35cc409d9d15ab439753a213d7528cd5e0a04f3917fa452d8dc45296612?d=mp&s=160"},"body":"\nTeaches git-mark-regexp to respect a prefix argument as an indication\nto unmark files.  Also adds other dired-like key bindings.\n"},{"id":"90513","messageId":"1221193324-59334-2-git-send-email-david@endpoint.com","threadId":"15213","inReplyTo":"1221193324-59334-1-git-send-email-david@endpoint.com","subject":"[PATCH] Teach git.el to mark/unmark files by regexp","fromName":"David Christensen","fromEmail":"david@endpoint.com","sentAt":"2008-09-12T04:22:04Z","receivedAt":"2008-09-12T04:22:04Z","isPatch":true,"sender":{"key":"david@endpoint.com","avatar":"https://gravatar.com/avatar/6089b35cc409d9d15ab439753a213d7528cd5e0a04f3917fa452d8dc45296612?d=mp&s=160"},"body":"Adds the functions git-mark-regexp and git-unmark-regexp to git.el.\nCreates a mark-map keymap to support dired-like behavior for\nmarking/unmarking via regexp.  Also adds these functions to the\nmenubar.\n\nSigned-off-by: David Christensen <david@endpoint.com>\n---\n contrib/emacs/git.el |   25 +++++++++++++++++--------\n 1 files changed, 17 insertions(+), 8 deletions(-)\n\ndiff --git a/contrib/emacs/git.el b/contrib/emacs/git.el\nindex 580652c..a982fbe 100644\n--- a/contrib/emacs/git.el\n+++ b/contrib/emacs/git.el\n@@ -950,14 +950,18 @@ Return the list of files that haven't been handled.\"\n   (when goal-column (move-to-column goal-column)))\n \n (defun git-mark-regexp (re)\n-  \"Mark all files which match a provided regexp.\"\n-  (interactive \"sMark files matching regular expression: \")\n+  \"Mark all files which match a provided regexp.  With prefix argument, unmark files which match.\"\n+  (interactive\n+   (list\n+    (read-from-minibuffer (if current-prefix-arg \"Unmark files matching regular expression: \" \"Mark files matching regular expression: \"))))\n   (unless git-status (error \"Not in git-status buffer.\"))\n-  (ewoc-map (lambda (info) (unless (git-fileinfo->marked info)\n-                             (when (string-match re (git-fileinfo->name info))\n-                               (setf (git-fileinfo->marked info) t)))) git-status)\n-  ; move back to goal column after invalidate\n-  (when goal-column (move-to-column goal-column)))\n+  (if current-prefix-arg\n+      (git-unmark-regexp re)\n+    (ewoc-map (lambda (info) (unless (git-fileinfo->marked info)\n+                               (when (string-match re (git-fileinfo->name info))\n+                                 (setf (git-fileinfo->marked info) t)))) git-status)\n+    ; move back to goal column after invalidate\n+    (when goal-column (move-to-column goal-column))))\n \n (defun git-unmark-regexp (re)\n   \"Unmark all files which match a provided regexp.\"\n@@ -1504,7 +1508,12 @@ amended version of it.\"\n     (define-key toggle-map \"m\" 'git-toggle-all-marks)\n     ; the mark submap\n     (define-key mark-map \"%\" 'git-mark-regexp)\n-    (define-key mark-map \"\\C-?\" 'git-unmark-regexp)\n+    (define-key mark-map \"m\" 'git-mark-file)\n+    (define-key mark-map \"u\" 'git-unmark-file)\n+    (define-key mark-map \"t\" 'git-toggle-all-marks)\n+    (define-key mark-map \"!\" 'git-unmark-all)\n+    (define-key mark-map \"?\" 'git-unmark-all)\n+    (define-key mark-map \"\\C-?\" 'git-unmark-file-up)\n     (setq git-status-mode-map map))\n   (easy-menu-define git-menu git-status-mode-map\n     \"Git Menu\"\n-- \n1.6.0.1.90.g27a6e.dirty\n"}]}