|
1 |
| ---- NOTES: |
2 |
| ---- Rework on plenary.Path with a focus on better cross-platform support |
3 |
| ---- including 'shellslash' support. |
4 |
| ---- Effort to improve performance made (notably `:absolue` ~2x faster). |
5 |
| ---- |
6 |
| ---- |
7 |
| ---- BREAKING CHANGES: |
8 |
| ---- - `Path.new` no longer supported (think it's more confusing that helpful |
9 |
| ---- and not really used as far as I can tell) |
10 |
| ---- |
11 |
| ---- - `Path.new` drops `sep` table param (eg. `Path:new {"foo\\bar/baz", sep = "/"}`) |
12 |
| ---- |
13 |
| ---- - drop `__concat` metamethod? it was untested and had some todo comment, |
14 |
| ---- not sure how functional it is |
15 |
| ---- |
16 |
| ---- - `Path` objects are now "read-only", I don't think people were ever doing |
17 |
| ---- things like `path.filename = 'foo'` but now explicitly adding some barrier |
18 |
| ---- to this. Allows us to compute `filename` from "metadata" parsed once on |
19 |
| ---- instantiation. |
20 |
| ---- |
21 |
| ---- - FIX: `Path:make_relative` throws error if you try to make a path relative |
22 |
| ---- to another path that is not in the same subpath. |
23 |
| ---- |
24 |
| ---- eg. `Path:new("foo/bar_baz"):make_relative("foo/bar")` => errors as you |
25 |
| ---- can't get to "foo/bar_baz" from "foo/bar" without going up in directory. |
26 |
| ---- This would previously return "foo/bar_baz" which is wrong. |
27 |
| ---- |
28 |
| ---- Adds an option to walk up path to compensate. |
29 |
| ---- |
30 |
| ---- eg. `Path:new("foo/bar_baz"):make_relative("foo/bar", true)` => returns |
31 |
| ---- "../bar_baz" |
32 |
| ---- |
33 |
| ---- - error handling is generally more loud, ie. emit errors from libuv rather |
34 |
| ---- than swallowing it |
35 |
| ---- |
36 |
| ---- - remove `Path:normalize`. It doesn't make any sense. eg. this test case |
37 |
| ---- ```lua |
38 |
| ---- it("can normalize ~ when file is within home directory (trailing slash)", function() |
39 |
| ---- local home = "/home/test/" |
40 |
| ---- local p = Path:new { home, "./test_file" } |
41 |
| ---- p.path.home = home |
42 |
| ---- p._cwd = "/tmp/lua" |
43 |
| ---- assert.are.same("~/test_file", p:normalize()) |
44 |
| ---- end) |
45 |
| ---- ``` |
46 |
| ---- if the idea is to make `/home/test/test_file` relative to `/tmp/lua`, the result |
47 |
| ---- should be `../../home/test/test_file`, only then can you substitue the |
48 |
| ---- home directory for `~`. |
49 |
| ---- So should really be `../../~/test_file`. But using `~` in a relative path |
50 |
| ---- like that looks weird to me. And as this function first makes paths |
51 |
| ---- relative, you will never get a leading `~` (since `~` literally |
52 |
| ---- represents the absolute path of the home directory). |
53 |
| ---- To top it off, something like `../../~/test_file` is impossible on Windows. |
54 |
| ---- `C:/Users/test/test_file` relative to `C:/Windows/temp` is |
55 |
| ---- `../../Users/test/test_file` and there's no home directory absolute path |
56 |
| ---- in this. |
57 |
| ---- |
58 |
| ---- - `rename` returns new path rather than mutating path |
59 |
| ---- |
60 |
| ---- - `copy` |
61 |
| ---- - drops interactive mode |
62 |
| ---- - return value table is pre-flattened |
63 |
| ---- - return value table value is `{success: boolean, err: string?}` rather than just `boolean` |
64 |
| ---- |
65 |
| ---- - drops `check_self` mechanism (ie. doing `Path.read("some/file/path")`) |
66 |
| ---- seems unnecessary... just do `Path:new("some/file/path"):read()` |
67 |
| ---- |
68 |
| ---- - renamed `iter` into `iter_lines` for more clarity |
69 |
| ---- |
70 |
| ---- - `find_upwards` returns `nil` if file not found rather than an empty string |
71 |
| - |
72 |
| --- TODO: add windows test for path2_spec only? |
73 |
| - |
74 | 1 | local bit = require "plenary.bit"
|
75 | 2 | local uv = vim.loop
|
| 3 | + |
76 | 4 | local iswin = uv.os_uname().sysname == "Windows_NT"
|
77 | 5 | local hasshellslash = vim.fn.exists "+shellslash" == 1
|
78 | 6 |
|
|
0 commit comments