fix improper typing of path which caused crashes on .git file handling
This commit is contained in:
parent
eb0f31daa7
commit
6b7a176a70
1 changed files with 9 additions and 11 deletions
20
src/Git.zig
20
src/Git.zig
|
|
@ -10,7 +10,7 @@ const std = @import("std");
|
||||||
const util = @import("util.zig");
|
const util = @import("util.zig");
|
||||||
|
|
||||||
repo: ?*c.git_repository,
|
repo: ?*c.git_repository,
|
||||||
git_path: []const u8,
|
git_path: [:0]const u8,
|
||||||
repo_path: []const u8,
|
repo_path: []const u8,
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
repo_state: c_int,
|
repo_state: c_int,
|
||||||
|
|
@ -43,7 +43,7 @@ pub fn init(allocator: std.mem.Allocator) !?*Git {
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.repo_state = undefined,
|
.repo_state = undefined,
|
||||||
.repo_path = undefined,
|
.repo_path = undefined,
|
||||||
.cache = .init(self.allocator, self.git_path),
|
.cache = .init(self.allocator, std.mem.span(self.git_path.ptr)),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (c.git_repository_open(&self.repo, repo_root.?.ptr) != 0) {
|
if (c.git_repository_open(&self.repo, repo_root.?.ptr) != 0) {
|
||||||
|
|
@ -238,7 +238,7 @@ pub fn headIsDetached(self: *Git) bool {
|
||||||
return c.git_repository_head_detached(self.repo) == 1;
|
return c.git_repository_head_detached(self.repo) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn findRepoRoot(allocator: std.mem.Allocator) !?[]u8 {
|
fn findRepoRoot(allocator: std.mem.Allocator) !?[:0]u8 {
|
||||||
const s = perf.s();
|
const s = perf.s();
|
||||||
defer perf.e(s, @src());
|
defer perf.e(s, @src());
|
||||||
|
|
||||||
|
|
@ -260,20 +260,18 @@ fn findRepoRoot(allocator: std.mem.Allocator) !?[]u8 {
|
||||||
};
|
};
|
||||||
|
|
||||||
return switch (stat.kind) {
|
return switch (stat.kind) {
|
||||||
.directory => try allocator.dupe(u8, try cur_path.realpathZ(
|
.directory => try allocator.dupeZ(u8, try cur_path.realpath(
|
||||||
".git",
|
".git",
|
||||||
&buf,
|
&buf,
|
||||||
)),
|
)),
|
||||||
.file => {
|
.file => {
|
||||||
@branchHint(.cold);
|
@branchHint(.cold);
|
||||||
const f = try cur_path.openFile(".git", .{ .mode = .read_only });
|
|
||||||
const file_reader = f.reader(&buf);
|
|
||||||
var reader = file_reader.interface;
|
|
||||||
const read = try reader.readSliceShort(&buf);
|
|
||||||
const prefix = "gitdir: ";
|
const prefix = "gitdir: ";
|
||||||
if (std.mem.startsWith(u8, &buf, prefix)) {
|
var file_buf: [std.fs.max_path_bytes + prefix.len]u8 = undefined;
|
||||||
buf[read - 1] = 0; // remove the newline
|
const read = try cur_path.readFile(".git", &file_buf);
|
||||||
return try allocator.dupe(u8, buf[prefix.len..]);
|
|
||||||
|
if (read.len > 0 and std.mem.eql(u8, file_buf[0..prefix.len], prefix)) {
|
||||||
|
return try allocator.dupeZ(u8, read[prefix.len..read.len - 1]);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue