3 Commits

Author SHA1 Message Date
203d7fee48 fix: memory leak 2025-09-07 18:17:01 -04:00
530f5a54c8 fix(man): typo 2025-09-07 18:02:24 -04:00
01567bb069 add support for submodules 2025-09-07 01:23:14 -04:00
2 changed files with 26 additions and 6 deletions

2
XD.1
View File

@@ -85,6 +85,6 @@ $ \fBXD -e $?\fR
.br
In a git repository.
.br
The're staged changes.
There staged changes.
.br
Return code of 130, ctrl-c was pressed, or SIGTERM sent.

26
XD.c
View File

@@ -61,8 +61,9 @@ static int explain = 0;
char
*find_git_repo()
{
char path[PATH_MAX] = ".", *rpath;
char path[PATH_MAX] = ".", fstr[PATH_MAX], *rpath, *res;
struct stat s;
FILE *f;
int i, c;
/* find the number of jumps to the root of the fs */
@@ -83,8 +84,27 @@ char
strcat(path, "/.git");
/* if there seems to be a git directory return the directory it was found in */
if (stat(path, &s) == 0 && S_ISDIR(s.st_mode)) {
if (stat(path, &s) == 0) {
if (S_ISDIR(s.st_mode)) {
return realpath(path, NULL);
} else if (S_ISREG(s.st_mode)) {
/* we do some special magic here to check if we're in a submodule */
f = fopen(path, "r");
if (!f) {
L("fopen: %s", strerror(errno));
return NULL;
}
res = fgets(fstr, PATH_MAX, f);
fclose(f);
if (!res) {
L("fgets: %s", strerror(errno));
return NULL;
}
if (strncmp(fstr, "gitdir: ", strlen("gitdir: ")) == 0) {
fstr[strlen(fstr) - 1] = '\0';
return realpath(fstr + strlen("gitdir: "), NULL);
}
}
}
/* reset contents of gpath, and go up a directory */
@@ -301,7 +321,7 @@ main(int argc, char *argv[])
/* change the nose depending on the current git repo's status */
if (has_staged(repo)) {
E("They're staged changes.")
E("There staged changes.")
P("*"); /* change to broken nose for staged changes */
} else if (has_untracked(repo)) {
E("There are untracked changes in the repository.")