@@ -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+
182220fn 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
203242test "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
210250test "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
217258test "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
224266test "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
231274test "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
238282test "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