From 8a078c3f72002af9bf79dc884fe321e3e48930fc Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 3 Nov 2006 17:41:23 +0100 Subject: [PATCH 1/6] git.el: Added functions for moving to the next/prev unmerged file. This is useful when doing a merge that changes many files with only a few conflicts here and there. Signed-off-by: Alexandre Julliard Signed-off-by: Junio C Hamano --- contrib/emacs/git.el | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el index 5354cd67b3..e283df2fdb 100644 --- a/contrib/emacs/git.el +++ b/contrib/emacs/git.el @@ -670,6 +670,32 @@ and returns the process output as a string." (unless git-status (error "Not in git-status buffer.")) (ewoc-goto-prev git-status n)) +(defun git-next-unmerged-file (&optional n) + "Move the selection down N unmerged files." + (interactive "p") + (unless git-status (error "Not in git-status buffer.")) + (let* ((last (ewoc-locate git-status)) + (node (ewoc-next git-status last))) + (while (and node (> n 0)) + (when (eq 'unmerged (git-fileinfo->state (ewoc-data node))) + (setq n (1- n)) + (setq last node)) + (setq node (ewoc-next git-status node))) + (ewoc-goto-node git-status last))) + +(defun git-prev-unmerged-file (&optional n) + "Move the selection up N unmerged files." + (interactive "p") + (unless git-status (error "Not in git-status buffer.")) + (let* ((last (ewoc-locate git-status)) + (node (ewoc-prev git-status last))) + (while (and node (> n 0)) + (when (eq 'unmerged (git-fileinfo->state (ewoc-data node))) + (setq n (1- n)) + (setq last node)) + (setq node (ewoc-prev git-status node))) + (ewoc-goto-node git-status last))) + (defun git-add-file () "Add marked file(s) to the index cache." (interactive) @@ -967,7 +993,9 @@ and returns the process output as a string." (define-key map "m" 'git-mark-file) (define-key map "M" 'git-mark-all) (define-key map "n" 'git-next-file) + (define-key map "N" 'git-next-unmerged-file) (define-key map "p" 'git-prev-file) + (define-key map "P" 'git-prev-unmerged-file) (define-key map "q" 'git-status-quit) (define-key map "r" 'git-remove-file) (define-key map "R" 'git-resolve-file) From b8ee51815ad0520b0340c2a594dee1f8de9c7c8a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 3 Nov 2006 17:41:46 +0100 Subject: [PATCH 2/6] git.el: Added a function to open the current file in another window. Bound to 'o' by default, compatible with pcl-cvs and buffer-mode. Suggested by Han-Wen Nienhuys. Signed-off-by: Alexandre Julliard Signed-off-by: Junio C Hamano --- contrib/emacs/git.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el index e283df2fdb..08d6404bcb 100644 --- a/contrib/emacs/git.el +++ b/contrib/emacs/git.el @@ -910,6 +910,15 @@ and returns the process output as a string." (when (eq 'unmerged (git-fileinfo->state info)) (smerge-mode)))) +(defun git-find-file-other-window () + "Visit the current file in its own buffer in another window." + (interactive) + (unless git-status (error "Not in git-status buffer.")) + (let ((info (ewoc-data (ewoc-locate git-status)))) + (find-file-other-window (git-fileinfo->name info)) + (when (eq 'unmerged (git-fileinfo->state info)) + (smerge-mode)))) + (defun git-find-file-imerge () "Visit the current file in interactive merge mode." (interactive) @@ -994,6 +1003,7 @@ and returns the process output as a string." (define-key map "M" 'git-mark-all) (define-key map "n" 'git-next-file) (define-key map "N" 'git-next-unmerged-file) + (define-key map "o" 'git-find-file-other-window) (define-key map "p" 'git-prev-file) (define-key map "P" 'git-prev-unmerged-file) (define-key map "q" 'git-status-quit) From 2ac2b19601cd8db8660a8d55647079f1ff4885b1 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 3 Nov 2006 17:42:17 +0100 Subject: [PATCH 3/6] git.el: Move point after the log message header when entering log-edit mode. Suggested by Han-Wen Nienhuys. Signed-off-by: Alexandre Julliard Signed-off-by: Junio C Hamano --- contrib/emacs/git.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el index 08d6404bcb..6f3b46df9f 100644 --- a/contrib/emacs/git.el +++ b/contrib/emacs/git.el @@ -899,7 +899,8 @@ and returns the process output as a string." (2 font-lock-function-name-face)) (,(concat "^\\(" (regexp-quote git-log-msg-separator) "\\)$") (1 font-lock-comment-face))))) - (log-edit #'git-do-commit nil #'git-log-edit-files buffer)))) + (log-edit #'git-do-commit nil #'git-log-edit-files buffer) + (re-search-forward (regexp-quote (concat git-log-msg-separator "\n")) nil t)))) (defun git-find-file () "Visit the current file in its own buffer." From 2379d61fa6355bc7a8cc8b5dce87a7d4a9505c76 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 3 Nov 2006 17:42:43 +0100 Subject: [PATCH 4/6] git.el: Include MERGE_MSG in the log-edit buffer even when not committing a merge. This lets us take advantage of the fact that git-cherry-pick now saves the message in MERGE_MSG too. Signed-off-by: Alexandre Julliard Signed-off-by: Junio C Hamano --- contrib/emacs/git.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el index 6f3b46df9f..972c402ea0 100644 --- a/contrib/emacs/git.el +++ b/contrib/emacs/git.el @@ -589,6 +589,7 @@ and returns the process output as a string." (let ((commit (git-commit-tree buffer tree head))) (git-update-ref "HEAD" commit head) (condition-case nil (delete-file ".git/MERGE_HEAD") (error nil)) + (condition-case nil (delete-file ".git/MERGE_MSG") (error nil)) (with-current-buffer buffer (erase-buffer)) (git-set-files-state files 'uptodate) (when (file-directory-p ".git/rr-cache") @@ -888,7 +889,7 @@ and returns the process output as a string." 'face 'git-header-face) (propertize git-log-msg-separator 'face 'git-separator-face) "\n") - (cond ((and merge-heads (file-readable-p ".git/MERGE_MSG")) + (cond ((file-readable-p ".git/MERGE_MSG") (insert-file-contents ".git/MERGE_MSG")) (sign-off (insert (format "\n\nSigned-off-by: %s <%s>\n" From 6768d6b8477db41a1cfdbd1d81ac8c5131c58e1d Mon Sep 17 00:00:00 2001 From: "Aneesh Kumar K.V" Date: Fri, 3 Nov 2006 10:41:45 +0530 Subject: [PATCH 5/6] gitweb: Remove extra "/" in path names for git_get_project_list Without this change we get a wrong $pfxlen value and the check_export_ok() checks with with a wrong directory name. Without this patch the below $projects_list fails with gitweb $projects_list = "/tmp/a/b/"; Signed-off-by: Aneesh Kumar K.V Signed-off-by: Junio C Hamano --- gitweb/gitweb.perl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 3dfa59f616..3759be37b8 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -902,6 +902,8 @@ sub git_get_projects_list { if (-d $projects_list) { # search in directory my $dir = $projects_list; + # remove the trailing "/" + $dir =~ s!/+$!!; my $pfxlen = length("$dir"); File::Find::find({ From 6f9f3b263b1c86889d6fae0d50c75be0f3227003 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 4 Nov 2006 02:28:53 -0800 Subject: [PATCH 6/6] apply: handle "traditional" creation/deletion diff correctly. We deduced a GNU diff output that does not use /dev/null convention as creation (deletion) diff correctly by looking at the lack of context and deleted lines (added lines), but forgot to reset the new (old) name field properly. This was a regression when we added a workaround for --unified=0 insanity. Signed-off-by: Junio C Hamano --- builtin-apply.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/builtin-apply.c b/builtin-apply.c index 11a5277a69..f70ee98e2d 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -1043,10 +1043,14 @@ static int parse_single_patch(char *line, unsigned long size, struct patch *patc * then not having oldlines means the patch is creation, * and not having newlines means the patch is deletion. */ - if (patch->is_new < 0 && !oldlines) + if (patch->is_new < 0 && !oldlines) { patch->is_new = 1; - if (patch->is_delete < 0 && !newlines) + patch->old_name = NULL; + } + if (patch->is_delete < 0 && !newlines) { patch->is_delete = 1; + patch->new_name = NULL; + } } if (0 < patch->is_new && oldlines)