Subject: RE: bug#30285: dired-do-chmod vs. top line of dired

From: Drew Adams <[email-masked]>
Date: Mon, 29 Jan 2018 20:43:06 -0800 (PST)

> > The `dired-do-*' commands already DTRT wrt the marked-files-or-file-
> > at-point.
>
> No, they don't.  They annoying users asking a useless prompt, like:
> 
> Change mode of * [0 files] to:
> ;; Just to notify the user after his input:
> No file on this line

I see that only for the reported places (this bug).
Dunno if that's what you meant.

Otherwise I don't see that at all.  With point on a file
or dir line (even on `.' or `..') and no files marked I
get this prompt, where THE-FILE-OR-DIR is the name of
the file or directory:

 Change mode of `THE-FILE-OR-DIR' to: 

IOW, except for the bug case it works fine, and there
is no function `dired-marked-files-or-file-at-point-p'.
Likewise, for other `dired-do-*' commands.

The marked-files-or-file-at-point behavior is done by
`dired-get-marked-files'.  That's exactly what it does.

(defun dired-do-chmod (&optional arg)
  "..."
  (interactive "P")
  (let* ((files (dired-get-marked-files t arg)) ; <======
    ...))

All that's needed is to test for FILES = nil.

> This bug report is just about the unnecessary prompt in the top line.

OK.  We agree that the bug is only about the top line (or
top two lines, if details are not hidden).

Well, not really.  It's really about point on any line where
there is no file or dir.  That includes:

1. The empty line at the end of the buffer.
2. The empty line before each inserted subdir listing.
3. The first two lines of the main dir and of each inserted
   subdir - that is, the highlighted line with the full
   (sub)dir name and the "total..." information line that
   follows it.

The right thing to do is to test first for whether point
is on a file or dir line.  There are several ways to do
that.

One is shown above: (dired-get-marked-files t arg), and
that's already used by commands such as `dired-do-chmod'.
We just need to test its return value.

Another is to use (dired-move-to-filename).  One of the
main uses of that simple function is to test whether or
not point is on a file or dir line.

A third way, more costly, is to use `dired-get-filename',

Some of these ways give you a choice of whether to raise
an error or just return nil when point is not on a file
or dir line, i.e., when we are in one of the cases where
we don't want to try to act on the indicated file(s),
because there are none.

For `dired-do-chmod' and similar, I'd say just test the
return value of `dired-get-marked-files' which is already
called at the beginning of the function.  If, in some
other `dired-do-*' command that function is not called at
the beginning anyway, just use `dired-move-to-filename': 

(defun dired-do-whatever (&optional arg)
  "..."
  (interactive (progn (dired-move-to-filename 'RAISE-ERROR)
                      (list current-prefix-arg))))
  ...)