Subject: Re: 26.1; Tetris score is no longer updated due to commit 995be66f0f0d26d1a96cbb8dfb429c3941157771

From: Paul Eggert <[email-masked]>
Date: Sat, 30 Mar 2019 20:32:51 -0700

Apparently the problem is that there are two formats of Tetris game-score files. 
One format is used by play/gamegrid.el itself, the other is used by the 
update-game-score command. I didn't know that; I thought that the only reason to 
use update-game-score was to get setuid/setgid permissions, and that the file 
format didn't change.

To some extent the file-format problem is Just One Of Those Things: if up 
upgrade Emacs and it changes the file format, Emacs is not smart enough to deal 
with the format change and so it loses your old Tetris scores.

That being said, Emacs could try harder to use the update-game-score program if 
it's installed. Is it in your installation? If so, please try the attached 
patch. If not, please try redoing 'configure' so that update-game-score is built 
and installed, and then try the attached patch.

I suppose it would be possible to do more-serious hacking in gamegrid.el to deal 
with the incompatible file formats (convert formats back and forth, say), but 
that would be beyond my call of duty.

>From 9f14fc6f61c8c6609a24efa1024ef8a68d16a92f Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Sat, 30 Mar 2019 20:26:15 -0700
Subject: [PATCH] Use update-game-score more often with Tetris

* lisp/play/gamegrid.el (gamegrid-add-score-with-update-game-score):
Go back to previous way of deciding whether to invoke
update-game-score, except do not try to invoke it if file-modes
fails on it (Bug#35056).
---
 lisp/play/gamegrid.el | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/lisp/play/gamegrid.el b/lisp/play/gamegrid.el
index 430a2071bf..4a9dac7f74 100644
--- a/lisp/play/gamegrid.el
+++ b/lisp/play/gamegrid.el
@@ -565,8 +565,8 @@ gamegrid-add-score
 
 ;; On POSIX systems there are four cases to distinguish:
 
-;;     1. FILE is an absolute filename.  Then it should be a file in
-;;        temporary file directory.  This is the way,
+;;     1. FILE is an absolute filename or "update-game-score" does not exist.
+;;	  Then FILE should be a file in a temporary file directory.  This is how
 ;;        `gamegrid-add-score' was supposed to be used in the past and
 ;;        is covered here for backward-compatibility.
 ;;
@@ -583,21 +583,18 @@ gamegrid-add-score
 ;;        update FILE.  This is for the case that a user has installed
 ;;        a game on her own.
 ;;
-;;     4. "update-game-score" does not exist or is not setgid/setuid.
-;;        Create/update FILE in the user's home directory, without
-;;        using "update-game-score".  There is presumably no shared
-;;        game directory.
+;;     4. "update-game-score" is not setgid/setuid.  Use it to
+;;        create/update FILE in the user's home directory.  There is
+;;        presumably no shared game directory.
 
 (defvar gamegrid-shared-game-dir)
 
 (defun gamegrid-add-score-with-update-game-score (file score)
-  (let ((gamegrid-shared-game-dir
-	 (not (zerop (logand (or (file-modes
-				  (expand-file-name "update-game-score"
-						    exec-directory))
-				  0)
-			     #o6000)))))
-    (cond ((file-name-absolute-p file)
+  (let* ((update-game-score-modes
+	  (file-modes (expand-file-name "update-game-score" exec-directory)))
+	 (gamegrid-shared-game-dir
+	  (not (zerop (logand #o6000 (or update-game-score-modes 0))))))
+    (cond ((or (not update-game-score-modes) (file-name-absolute-p file))
 	   (gamegrid-add-score-insecure file score))
 	  ((and gamegrid-shared-game-dir
 		(file-exists-p (expand-file-name file shared-game-score-directory)))
@@ -607,12 +604,23 @@ gamegrid-add-score-with-update-game-score
 	    (expand-file-name file shared-game-score-directory) score))
 	  ;; Else: Add the score to a score file in the user's home
 	  ;; directory.
-	  (t
+	  (gamegrid-shared-game-dir
+	   ;; If gamegrid-shared-game-dir is non-nil the
+	   ;; "update-gamescore" program is setuid, so don't use it.
 	   (unless (file-exists-p
 		    (directory-file-name gamegrid-user-score-file-directory))
 	     (make-directory gamegrid-user-score-file-directory t))
 	   (gamegrid-add-score-insecure file score
-					gamegrid-user-score-file-directory)))))
+					gamegrid-user-score-file-directory))
+	  (t
+	   (unless (file-exists-p
+		    (directory-file-name gamegrid-user-score-file-directory))
+	     (make-directory gamegrid-user-score-file-directory t))
+	   (let ((f (expand-file-name file
+				      gamegrid-user-score-file-directory)))
+	     (unless (file-exists-p f)
+	       (write-region "" nil f nil 'silent nil 'excl))
+	     (gamegrid-add-score-with-update-game-score-1 file f score))))))
 
 (defun gamegrid-add-score-with-update-game-score-1 (file target score)
   (let ((default-directory "/")
-- 
2.17.1