Skip to content

Commit a9b0c8b

Browse files
authored
fix: find the actual path for nested or relative directories provided to path (#23)
1 parent 4d8c51e commit a9b0c8b

File tree

2 files changed

+64
-15
lines changed

2 files changed

+64
-15
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ to [Semantic Versioning][semver].
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Find the actual path for nested or relative directories provided to path.
13+
1014
### Maintenance
1115

1216
- Use minimum sets of permission and pinned external workflow step actions.

src/main.zig

Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,50 @@ test "repo ssh org" {
179179
try std.testing.expectEqualStrings(project, "example/git-coverage");
180180
}
181181

182+
fn relative(allocator: std.mem.Allocator, path: []const u8) ![]const u8 {
183+
const git = try std.process.Child.run(.{
184+
.allocator = allocator,
185+
.argv = &.{ "git", "rev-parse", "--show-toplevel" },
186+
});
187+
const root = std.mem.trimRight(u8, git.stdout, "\n");
188+
const cwd = try std.fs.cwd().realpathAlloc(allocator, path);
189+
const realpath = try std.process.Child.run(.{
190+
.allocator = allocator,
191+
.argv = &.{ "realpath", "--relative-to", root, cwd },
192+
});
193+
return std.mem.trimRight(u8, realpath.stdout, "\n");
194+
}
195+
196+
test "relative cwd" {
197+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
198+
defer aa.deinit();
199+
const path = ".";
200+
const full = try relative(aa.allocator(), path);
201+
try std.testing.expectEqualStrings(full, ".");
202+
}
203+
204+
test "relative dir" {
205+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
206+
defer aa.deinit();
207+
const path = ".././git-coverage/";
208+
const full = try relative(aa.allocator(), path);
209+
try std.testing.expectEqualStrings(full, ".");
210+
}
211+
212+
test "relative file" {
213+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
214+
defer aa.deinit();
215+
const path = "././src/.././README.md";
216+
const full = try relative(aa.allocator(), path);
217+
try std.testing.expectEqualStrings(full, "README.md");
218+
}
219+
182220
fn coverage(allocator: std.mem.Allocator, project: []const u8, branch: []const u8, path: []const u8) ![]const u8 {
183-
const slashes = std.mem.count(u8, path, "/");
184-
const encoding = try allocator.alloc(u8, path.len + slashes * 2);
221+
const fullpath = try relative(allocator, path);
222+
const slashes = std.mem.count(u8, fullpath, "/");
223+
const encoding = try allocator.alloc(u8, fullpath.len + slashes * 2);
185224
defer allocator.free(encoding);
186-
_ = std.mem.replace(u8, path, "/", "%2F", encoding);
225+
_ = std.mem.replace(u8, fullpath, "/", "%2F", encoding);
187226
const stat = try std.fs.cwd().statFile(path);
188227
switch (stat.kind) {
189228
.directory => return std.fmt.allocPrint(
@@ -201,43 +240,49 @@ fn coverage(allocator: std.mem.Allocator, project: []const u8, branch: []const u
201240
}
202241

203242
test "coverage project main root" {
243+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
244+
defer aa.deinit();
204245
const project = "zimeg/git-coverage";
205-
const url = try coverage(std.testing.allocator, project, "main", ".");
206-
defer std.testing.allocator.free(url);
246+
const url = try coverage(aa.allocator(), project, "main", ".");
207247
try std.testing.expectEqualStrings(url, "https://app.codecov.io/gh/zimeg/git-coverage/tree/main/.");
208248
}
209249

210250
test "coverage project main dir" {
251+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
252+
defer aa.deinit();
211253
const project = "zimeg/git-coverage";
212-
const url = try coverage(std.testing.allocator, project, "main", "src");
213-
defer std.testing.allocator.free(url);
254+
const url = try coverage(aa.allocator(), project, "main", "./src");
214255
try std.testing.expectEqualStrings(url, "https://app.codecov.io/gh/zimeg/git-coverage/tree/main/src");
215256
}
216257

217258
test "coverage project main file" {
259+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
260+
defer aa.deinit();
218261
const project = "zimeg/git-coverage";
219-
const url = try coverage(std.testing.allocator, project, "main", "src/main.zig");
220-
defer std.testing.allocator.free(url);
262+
const url = try coverage(aa.allocator(), project, "main", "./src/main.zig");
221263
try std.testing.expectEqualStrings(url, "https://app.codecov.io/gh/zimeg/git-coverage/blob/main/src%2Fmain.zig");
222264
}
223265

224266
test "coverage project dev root" {
267+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
268+
defer aa.deinit();
225269
const project = "zimeg/git-coverage";
226-
const url = try coverage(std.testing.allocator, project, "dev", ".");
227-
defer std.testing.allocator.free(url);
270+
const url = try coverage(aa.allocator(), project, "dev", ".");
228271
try std.testing.expectEqualStrings(url, "https://app.codecov.io/gh/zimeg/git-coverage/tree/dev/.");
229272
}
230273

231274
test "coverage project dev dir" {
275+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
276+
defer aa.deinit();
232277
const project = "zimeg/git-coverage";
233-
const url = try coverage(std.testing.allocator, project, "dev", "src");
234-
defer std.testing.allocator.free(url);
278+
const url = try coverage(aa.allocator(), project, "dev", "./src");
235279
try std.testing.expectEqualStrings(url, "https://app.codecov.io/gh/zimeg/git-coverage/tree/dev/src");
236280
}
237281

238282
test "coverage project dev file" {
283+
var aa = std.heap.ArenaAllocator.init(std.testing.allocator);
284+
defer aa.deinit();
239285
const project = "zimeg/git-coverage";
240-
const url = try coverage(std.testing.allocator, project, "dev", "src/main.zig");
241-
defer std.testing.allocator.free(url);
286+
const url = try coverage(aa.allocator(), project, "dev", "./src/main.zig");
242287
try std.testing.expectEqualStrings(url, "https://app.codecov.io/gh/zimeg/git-coverage/blob/dev/src%2Fmain.zig");
243288
}

0 commit comments

Comments
 (0)