Compare commits

...

2 commits
v6.0 ... master

3 changed files with 32 additions and 14 deletions

5
XD.1
View file

@ -26,6 +26,7 @@ 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
@ -56,8 +57,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 enable ERR
in the config.mk.
returns 1. If you wish to find out more infomation about the error pass in
-Derr at build time.
.Sh OPTIONS
.Ss -v
Print version information to stdout and exit.

View file

@ -10,7 +10,7 @@ const std = @import("std");
const util = @import("util.zig");
repo: ?*c.git_repository,
git_path: []const u8,
git_path: [:0]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, 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) {
@ -114,6 +114,20 @@ 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());
@ -238,7 +252,7 @@ pub fn headIsDetached(self: *Git) bool {
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();
defer perf.e(s, @src());
@ -260,20 +274,18 @@ fn findRepoRoot(allocator: std.mem.Allocator) !?[]u8 {
};
return switch (stat.kind) {
.directory => try allocator.dupe(u8, try cur_path.realpathZ(
.directory => try allocator.dupeZ(u8, try cur_path.realpath(
".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: ";
if (std.mem.startsWith(u8, &buf, prefix)) {
buf[read - 1] = 0; // remove the newline
return try allocator.dupe(u8, buf[prefix.len..]);
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]);
}
return null;
},

View file

@ -59,7 +59,12 @@ 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.?.hasStashes()) {
if (git.?.inBisect()) {
face[@intFromEnum(FaceParts.eyes)] = .{
.symbol = '=',
.explanation = "The current git repo is bisecting.",
};
} else if (git.?.hasStashes()) {
face[@intFromEnum(FaceParts.eyes)] = .{
.symbol = '8',
.explanation = "The current git repo has stashed changes.",