Subject: bug#59257: 29.0.50;vc-git-mode-line-string out of range

From: Stefan Kangas <[email-masked]>
Date: Mon, 14 Nov 2022 19:09:40 -0800

Uwe Brauer <[email-masked]> writes:

> When opening a file that is under git version control I obtain the
> following error:
>
> Debugger entered--Lisp error: (args-out-of-range "main" 0 7)
>   vc-git-mode-line-string("/home/oub/1-Matlab-Git/matlab-test/testode.m")
>   apply(vc-git-mode-line-string "/home/oub/1-Matlab-Git/matlab-test/testode.m")
>   vc-call-backend(Git mode-line-string "/home/oub/1-Matlab-Git/matlab-test/testode.m")
>   vc-mode-line("/home/oub/1-Matlab-Git/matlab-test/testode.m" Git)
>   vc-after-save()
>   basic-save-buffer(t)
>   save-buffer(1)
>   funcall-interactively(save-buffer 1)
>   call-interactively(save-buffer nil nil)
>   command-execute(save-buffer)

It seems like `vc-git--symbolic-ref' returns nil when it shouldn't?

I think the attached patch will stop the backtrace from happening, but
it's more of a workaround:

diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index a1ff03144b..ae3cada3d7 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -391,7 +391,7 @@ vc-git-mode-line-string
   "Return a string for `vc-mode-line' to put in the mode line for FILE."
   (let* ((rev (vc-working-revision file 'Git))
          (disp-rev (or (vc-git--symbolic-ref file)
-                       (and rev (substring rev 0 7))))
+                       (and rev (string-limit rev 7))))
          (def-ml (vc-default-mode-line-string 'Git file))
          (help-echo (get-text-property 0 'help-echo def-ml))
          (face   (get-text-property 0 'face def-ml)))