diff --git a/XD.c b/XD.c index 81616cf..a526964 100644 --- a/XD.c +++ b/XD.c @@ -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,9 +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)) { - return realpath(path, NULL); - } + 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) { + return realpath(strndup(fstr + strlen("gitdir: "), strlen(fstr + strlen("gitdir: ")) - 1), NULL); + } + } + } /* reset contents of gpath, and go up a directory */ memset(&path[strlen(path) - 4], '.', 2);