Age | Commit message (Collapse) | Author |
|
|
|
* capflam/filelib_wildcard_fix:
Fix filelib:wildcard/2 when 'Cwd' ends with a dot
|
|
In such case, filelib:wildcard/2 returned truncated results:
1> file:set_cwd("/usr/lib/erlang/lib").
ok
2> filelib:wildcard("stdlib-*/ebin/*.app", filename:absname(".")).
["dlib-2.1/ebin/stdlib.app"]
|
|
This fixes a bug introduced in f11aabdc9fec593c31e6c4f3fa25c1707e9c35df where
filelib:eval_read_file_info/2 was made to use file:read_link_info/1 to never
follow symlinks. This fixed wildcard/1 but broke every other function using
eval_read_file_info/2.
Reported-by: Louis-Philippe Gauthier
Reported-by: Danil Zagoskin
|
|
filelib:wildcard("broken_symlink") would return an empty list if
"broken_symlink" is a symlink that does not point to an existing
file.
|
|
|
|
files as delimiters.
While working on a tool that processes Erlang code and testing it against this repo,
I found out about those little sneaky 0xff. I thought it may be of help to other
people build such tools to remove non-conforming-to-standard characters.
|
|
|
|
Most functions in filelib support binaries as arguments but
that was not reflected in the typespecs.
The types filename_all() and dirname_all() were introduced
to mimic file:name_all().
|
|
|
|
|
|
We don't need this special case, since "-" is only special between
two other characters.
|
|
|
|
Use list comprehensions and 'orelse' to make the code more concise.
Rename wildcard_5/2 to match_part/2 to make it clearer what it does.
If the pattern always matches, don't test it in every iteration of
the loop.
|
|
There does not seem to be any advantage of sorting the result of
file:list_dir/1 directly. Disadvantages are that we'll need to be
careful to keep the result sorted, and that we could waste time
sorting filenames that the pattern matching will discard anyway.
|
|
Under controlled circumstances (and we are in control of the
circumstances), filename:join/2 can be replaced with '++'.
'++' is faster because it is implmented in C, does not need to
look at the list elements it copies, and does not need to copy
its right operand.
|
|
Commit 70b5e24c9498225fadc08d19503269c8aad851bf broke
filelib:wildcard(Pattern, ".").
Over the years, the logic for filelib:wilcard() has become a mess
of special cases.
Probably because of premature optimization, filelib:wildcard(Pattern)
and filelib:wildcard(Pattern, Cwd) are handled differently.
They can be consolidated if we use a "." as the default Cwd argument.
We can also simplify things by compiling the Cwd argument into the
wildcard. We did not that in the initial implementation because it
used to be possible to pre-compile a wildcard and pass it to
filelib:wildcard/{1,2}. Since that is no longer possible, there is
no point in keeping the compiled wildcard "portable" (not dependent
on the Cwd argument).
|
|
It is confusing. Rename our own exception-generating function to
badpattern/1.
|
|
filelib:wildcard() will no longer support "raw filenames", so it
makes no sense for it to accept a binary Cwd argument.
|
|
In R16B, file:list_dir/1 will never return binaries.
|
|
Two adjacent * used as a single pattern will match
all files and zero or more directories and subdirectories.
|
|
filelib:wildcard("some/relative/path/*.beam", Path) would fail to
match any file. That is, filelib:wildcard/2 would not work if the
first component of the pattern did not contain any wildcard
characters.
Noticed-by: Samuel Rivas
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Having various type declarations in the file.hrl file was once upon a time
necessary since the system could not really handle remote types. Now it can
and these declarations should not be there but appear in file.erl instead.
This means that files that need to use these types can refer to them using
a remote type reference, and not having to include file.hrl - at least not
for this reason.
|
|
* ta/ensure_dir_eexist:
filelib_SUITE: strenghten tests of filelib:ensure_dir/1
Don't return a false {error,eexist} in filelib:ensure_dir/1
OTP-8389 Because of a race condition, using filelib:ensure_dir/1 from
multiple processes to create the same path or parts of the same
directory structure, filelib:ensure_dir/1 could return a
meaningless {error,eexist}. That race condition has been
eliminated, and {error,eexist} will now be returned only if there
exists a regular file, device file, or some other non-directory
file with the same name. (Thanks to Tuncer Ayaz.)
|
|
This is about the non-atomicity of filelib:ensure_dir/1.
When using filelib:ensure_dir/1 from multiple processes to create
the same path or parts of the same directory structure (which happens
with rebar's worker processes) it happens quite a lot that between
a file:read_file_info/1 and file:make_dir/1 one of the other procs
has already created the directory we want to create.
mkdir(1) says one of the following for -p depending on which Unix
like system you're on:
"no error if existing"
"no error will be reported if a directory given as an operand already
exists"
I've seen more than one Erlang project where the return value of
ensure_dir/1 is ignored completely.
To eliminate the race condition, call file:make_dir/1 without first
testing whether the directory exists. If it succeeds everything
is fine. Otherwise, if the error code is {error,eexists}, check
whether the directory exists. If it does, everything is fine;
if not, return {error,eexist} (which indicates that there
exists a regular file with the same name, or (more unlikely)
that another process removed the directory after the call
to file:make_dir/1).
Signed-off-by: Tuncer Ayaz <[email protected]>
|
|
|