diff --git a/XD.1 b/XD.1 index d5f4253..3203ff1 100644 --- a/XD.1 +++ b/XD.1 @@ -26,7 +26,6 @@ tab(;) allbox; c;l. :;default \;;in a git repo - =;in a git repo during a bisect 8;in a git repo with stashed changes X;in a git repo during a merge O;in a git repo during a rebase @@ -57,8 +56,8 @@ c;l. returns the number that was passed in to allow the user to re-run the program and get the same results. If there's an internal error .Nm -returns 1. If you wish to find out more infomation about the error pass in --Derr at build time. +returns 1. If you wish to find out more infomation about the error enable ERR +in the config.mk. .Sh OPTIONS .Ss -v Print version information to stdout and exit. diff --git a/src/Git.zig b/src/Git.zig index d1b682f..f38cf94 100644 --- a/src/Git.zig +++ b/src/Git.zig @@ -10,7 +10,7 @@ const std = @import("std"); const util = @import("util.zig"); repo: ?*c.git_repository, -git_path: [:0]const u8, +git_path: []const u8, repo_path: []const u8, allocator: std.mem.Allocator, repo_state: c_int, @@ -43,7 +43,7 @@ pub fn init(allocator: std.mem.Allocator) !?*Git { .allocator = allocator, .repo_state = undefined, .repo_path = undefined, - .cache = .init(self.allocator, std.mem.span(self.git_path.ptr)), + .cache = .init(self.allocator, self.git_path), }; if (c.git_repository_open(&self.repo, repo_root.?.ptr) != 0) { @@ -114,20 +114,6 @@ pub fn inRebase(self: *Git) bool { }; } -pub fn inBisect(self: *Git) bool { - const s = perf.s(); - defer perf.e(s, @src()); - - const path = std.fs.path.join(self.allocator, &[_][]const u8{ - std.mem.span(self.git_path.ptr), - "BISECT_LOG", - }) catch return false; - defer self.allocator.free(path); - - std.fs.cwd().access(path, .{ .mode = .read_only }) catch return false; - return true; -} - pub fn hasStaged(self: *Git) bool { const s = perf.s(); defer perf.e(s, @src()); @@ -252,7 +238,7 @@ pub fn headIsDetached(self: *Git) bool { return c.git_repository_head_detached(self.repo) == 1; } -fn findRepoRoot(allocator: std.mem.Allocator) !?[:0]u8 { +fn findRepoRoot(allocator: std.mem.Allocator) !?[]u8 { const s = perf.s(); defer perf.e(s, @src()); @@ -274,18 +260,20 @@ fn findRepoRoot(allocator: std.mem.Allocator) !?[:0]u8 { }; return switch (stat.kind) { - .directory => try allocator.dupeZ(u8, try cur_path.realpath( + .directory => try allocator.dupe(u8, try cur_path.realpathZ( ".git", &buf, )), .file => { @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: "; - var file_buf: [std.fs.max_path_bytes + prefix.len]u8 = undefined; - const read = try cur_path.readFile(".git", &file_buf); - - 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]); + if (std.mem.startsWith(u8, &buf, prefix)) { + buf[read - 1] = 0; // remove the newline + return try allocator.dupe(u8, buf[prefix.len..]); } return null; }, diff --git a/src/main.zig b/src/main.zig index cd2c90e..6d92890 100644 --- a/src/main.zig +++ b/src/main.zig @@ -59,12 +59,7 @@ pub fn main() u8 { var git = if (config.git) try @import("Git.zig").init(allocator) orelse null; defer if (config.git and git != null) git.?.deinit(); if (config.git and git != null) { - if (git.?.inBisect()) { - face[@intFromEnum(FaceParts.eyes)] = .{ - .symbol = '=', - .explanation = "The current git repo is bisecting.", - }; - } else if (git.?.hasStashes()) { + if (git.?.hasStashes()) { face[@intFromEnum(FaceParts.eyes)] = .{ .symbol = '8', .explanation = "The current git repo has stashed changes.",