Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keeping/recovering original case with path.relpath, path.common_prefix, etc #297

Closed
Myaamori opened this issue May 1, 2019 · 5 comments · Fixed by #298
Closed

Keeping/recovering original case with path.relpath, path.common_prefix, etc #297

Myaamori opened this issue May 1, 2019 · 5 comments · Fixed by #298
Assignees

Comments

@Myaamori
Copy link

Myaamori commented May 1, 2019

Currently functions like path.relpath and path.common_prefix run normcase on the given paths, which on Windows means that the returned path will always be in lower case. However, this results in a path that cannot be used on *nix, since the original case cannot be reconstructed from the returned path.

It would be nice if there was a way to ensure that the returned path uses the original case, perhaps through an extra argument that instructs the functions not to use normcase, or through a separate function that does the inverse of normcase: Modifies the input path to reflect the actual case of the directories/files in the file system (no-op on *nix).

@Myaamori
Copy link
Author

Myaamori commented May 1, 2019

For reference in the case of an inverse of normcase, the way Java's File.getCanonicalPath() works is to repeatedly call FindFirstFileW for each part of the path and append the true name:

https://github.com/frohoff/jdk8u-jdk/blob/master/src/windows/native/java/io/canonicalize_md.c#L491

I'm not sure if this is linear in the number of files in the directories or if FindFirstFileW does something smarter under the hood, but either way a naive implementation would be to simply linearly scan each directory for a file that, after the case has been normalized, matches the current part of the path.

@Tieske
Copy link
Member

Tieske commented May 6, 2019

the normcase function only normalizes to lower case on Windows, and since Windows is case insensitive, this is a non-problem? On Unix the casing remains unchanged.

@tw-bert
Copy link

tw-bert commented May 6, 2019

@Tieske My 2 cents: Any case-sensitive software on windows can cause issues if the casing doesn't match, even if the file system itself is case insensitive. I've come across issues like these in plenty of xplat scenario's. Best not to mess with the casing whatsoever.

@Tieske Tieske self-assigned this May 6, 2019
@Myaamori
Copy link
Author

Myaamori commented May 6, 2019

This causes issues in my use case, since I use Penlight in conjunction with generating a sort of project file that contains a list of files, and this project file is expected to be opened by others, who are potentially using other platforms. Currently project files generated on Windows are useless to users on Linux due to this case normalization.

@Tieske
Copy link
Member

Tieske commented May 6, 2019

ok, then it makes sense. Albeit a very narrow use-case.

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this issue Feb 15, 2020
## 1.7.0 (2019-10-14)
### New features

  - `utils.quote_arg` will now optionally take an array of arguments and escape
    them all into a single string.
  - `app.parse_args` now accepts a 3rd parameter with a list of valid flags and aliasses
  - `app.script_name` returns the name of the current script (previously a private function)

### Changes

  - Documentation updates
  - `utils.quit`: exit message is no longer required, and closes the Lua state (on 5.2+).
  - `utils.assert_arg` and `utils.assert_string`: now return the validated value
  - `pl.compat`: now exports the `jit` and `jit52` flags
  - `pretty.write`: now sorts the output for easier diffs [#293](lunarmodules/Penlight#293)

### Fixes

  - `utils.raise` changed the global `on_error`-level when passing in bad arguments
  - `utils.writefile` now checks and returns errors when writing
  - `compat.execute` now handles the Windows exitcode -1 properly
  - `types.is_empty` would return true on spaces always, indepedent of the parameter
  - `types.to_bool` will now compare case-insensitive for the extra passed strings
  - `app.require_here` will now properly handle an absolute base path
  - `stringx.split` will no longer append an empty match if the number of requested
    elements has already been reached [#295](lunarmodules/Penlight#295)
  - `path.common_prefix` and `path.relpath` return the result in the original casing
    (only impacted Windows) [#297](lunarmodules/Penlight#297)
  - `dir.copyfile`, `dir.movefile`, and `dir.makepath` create the new file/path with
    the requested casing, and no longer force lowercase (only impacted Windows)
    [#297](lunarmodules/Penlight#297)
  - added a missing assertion on `path.getmtime` [#291](lunarmodules/Penlight#291)
  - `stringx.rpartition` returned bad results on a not-found [#299](lunarmodules/Penlight#299)

## 1.6.0 (2018-11-23)
### New features

  - `pl.compat` now provides `unpack` as `table.unpack` on Lua 5.1

### Changes

  - `utils.unpack` is now documented and respects `.n` field of its argument.
  - `tablex.deepcopy` and `tablex.deepcompare` are now cycle aware (#262)
  - Installing through LuaRocks will now include the full rendered documentation

### Fixes

  - Fixed `seq.last` returning `nil` instead of an empty list when given an empty iterator (#253).
  - `pl.template` now applies `tostring` when substituting values in templates, avoiding errors when they are not strings or numbers (#256).
  - Fixed `pl.import_into` not importing some Penlight modules (#268).
  - Fixed version number stuck at 1.5.2 (#260).
  - Fixed `types.is_empty` returning `true` on tables containing `false` key (#267).
  - Fixed `test.assertraise` throwing an error when passed an array with a function to call plus its arguments (#272).
  - Fixed `test.assertraise` not throwing an error when given function does not error but instead returns a string matching given error pattern.
  - Fixed placeholder expressions being evaluated with wrong precedence of binary and unary negation.
  - Fixed placeholder expressions being evaluated assuming wrong binary operator associativity (e.g. `_1-(_2+_3)` was evaluated as `(_1-_2)+_3`.
  - Fixed placeholder expressions being evaluated as if unary operators take precedence over power operator (e.g. `(-_1)^_2`) was evaluated as `-(_1^2)`).
  - Fixed vulnerable backtracking pattern in `pl.stringx.strip` (#275)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging a pull request may close this issue.

3 participants