From: Wolfgang Scherer <Wolfgang.Scherer@gmx.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 37215@debbugs.gnu.org, larsi@gnus.org
Subject: bug#37215: [PATCH] vc-cvs-ignore writes absolute filenames and duplicate strings
Date: Fri, 14 Feb 2020 02:24:12 +0100 [thread overview]
Message-ID: <d419ad34-60a1-170e-1711-05e74d9f422c@gmx.de> (raw)
In-Reply-To: <831rqyqnya.fsf@gnu.org>
Am 13.02.20 um 20:36 schrieb Eli Zaretskii:
>> From: Wolfgang Scherer <Wolfgang.Scherer@gmx.de>
>> Date: Thu, 30 Jan 2020 20:44:00 +0100
>> Cc: 37215@debbugs.gnu.org
>>
>>>> -(defun vc-cvs-ignore (file &optional _directory _remove)
>>>> - "Ignore FILE under CVS."
>>>> - (vc-cvs-append-to-ignore (file-name-directory file) file))
>>>> +(defun vc-cvs-ignore (file &optional directory _remove)
>>>> + "Ignore FILE under CVS.
>>>> +FILE is either absolute or relative to DIRECTORY."
>>>> + (setq file (directory-file-name (expand-file-name file directory)))
>>>> + (vc-cvs-append-to-ignore (file-name-directory file) (file-name-nondirectory file)))
>>> This is basically
>>>
>>> (file-name-nondirectory (directory-file-name (expand-file-name "foo" directory)))
>>>
>>> isn't it?
>> It is for `file` equal to "foo" (a simple basename).
>>> In what circumstances does that evaluate to something other
>>> than "foo"?
>> If "foo" is something other than a simple basename (see below).
>>> That is, what DIRECTORY is doesn't seem to matter, if I'm
>>> reading this right?
>> Your assumption, that `file` is always a simple basename is wrong.
> Yes, but when does it make sense to have FILE not absolute and not
> just a basename (i.e. with leading directories)? Do we have such use
> cases?
vc-dir-ignore with patch from #37240
> Because if that happens, the file's name will be added to
> .cvsignore not in DIRECTORY but in one of its subdirectories. Would
> that be surprising?
Not for anybody familiar with CVS. (Any other old-timers that can chime in here?)
> And if so, perhaps we should warn about that or
> even error out?
Certainly not.
Here is a long explanation of what is going on:
The latest patch to vc-dir-ignore (#37240) uses ewoc to get a list
of marked files. The files in this list are relative file pathes and
can also be in subdirectories. e.g.:
VC backend : CVS
Working dir: /re/po
./
unregistered .cvsignore
edited data
sub/
unregistered sub/.cvsignore
* unregistered sub/sub-file
sub/sub/
unregistered sub/sub/.cvsignore
edited sub/sub/data
Pressing G while "sub/sub-file" is marked, initiates the call chain
vc-dir-ignore => vc-ignore => vc-cvs-ignore with "sub/sub-file"
as FILE argument.
CVS has per-directory ignore files, which can only handle simple
filenames without directory parts. I.e,, it is incorrect to write
"sub/sub-file" into "/re/po/.cvsignore". Instead "sub-file" must be
written into "/re/po/sub/.cvsignore" to have the desired effect.
Therefore, it is necessary to expand the FILE parameter to
(directory-file-name (expand-file-name "sub/sub-file" "/re/po"))
=> "/re/po/sub/sub-file"
And the resulting absolute file path can be used to determine the
ignore file, which is located in the directory:
(expand-file-name ".cvsignore" (file-name-directory "/re/po/sub/sub-file"))
=> "/re/po/sub/.cvsignore"
and the string that must be written to it is the basename:
(file-name-nondirectory "/re/po/sub/sub-file") => "sub-file"
So, the algorithm is correct and I assume that anybody familiar with
CVS would expect just that behavior.
Citing from the CVS texinfo manual:
CVS has a list of files (or sh(1) file name patterns) that it should
ignore while running 'update', 'import' and 'release'. This list is
constructed in the following way.
* The list is initialized to include certain file name patterns:
[...]
* As CVS traverses through your directories, the contents of any
'.cvsignore' will be appended to the list. The patterns found in
'.cvsignore' are only valid for the directory that contains them,
not for any sub-directories.
next prev parent reply other threads:[~2020-02-14 1:24 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-28 22:32 bug#37215: [PATCH] vc-cvs-ignore writes absolute filenames and duplicate strings Wolfgang Scherer
2019-09-15 13:12 ` Lars Ingebrigtsen
2020-01-05 3:59 ` Wolfgang Scherer
2020-01-22 12:43 ` Lars Ingebrigtsen
2020-01-30 19:44 ` Wolfgang Scherer
2020-02-13 19:36 ` Eli Zaretskii
2020-02-14 1:24 ` Wolfgang Scherer [this message]
2020-02-14 8:33 ` Eli Zaretskii
2020-02-15 1:42 ` Wolfgang Scherer
2020-02-15 7:44 ` Eli Zaretskii
2020-02-15 12:55 ` Dmitry Gutov
2020-02-19 23:02 ` Wolfgang Scherer
2020-02-16 0:20 ` Wolfgang Scherer
2020-02-19 23:06 ` Wolfgang Scherer
2020-02-21 9:31 ` Eli Zaretskii
2020-02-21 10:16 ` Dmitry Gutov
2020-02-21 20:44 ` Wolfgang Scherer
2020-02-21 21:30 ` Dmitry Gutov
2020-02-21 22:23 ` Wolfgang Scherer
2020-02-21 20:32 ` Wolfgang Scherer
2020-02-22 8:59 ` Eli Zaretskii
2020-02-14 2:50 ` Wolfgang Scherer
2020-02-14 8:39 ` Eli Zaretskii
2020-02-14 9:24 ` Eli Zaretskii
2020-02-28 16:07 ` Mattias Engdegård
2020-02-28 16:24 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d419ad34-60a1-170e-1711-05e74d9f422c@gmx.de \
--to=wolfgang.scherer@gmx.de \
--cc=37215@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=larsi@gnus.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.