diff --git a/External/libgit2 b/External/libgit2 index 2fcb8705e..6cf25a397 160000 --- a/External/libgit2 +++ b/External/libgit2 @@ -1 +1 @@ -Subproject commit 2fcb8705e584ca61f6c4657525c9d2713f6a39d2 +Subproject commit 6cf25a397e88acc37e86e978b24b6470d6764c9d diff --git a/ObjectiveGit/GTRepository.m b/ObjectiveGit/GTRepository.m index 5f9f2fb7b..e2abf1d8d 100644 --- a/ObjectiveGit/GTRepository.m +++ b/ObjectiveGit/GTRepository.m @@ -592,7 +592,33 @@ - (NSURL *)fileURL { // bare repository, you may be looking for gitDirectoryURL if (path == NULL) return nil; - return [NSURL fileURLWithPath:@(path) isDirectory:YES]; + NSString *pathString = @(path); + NSURL *fileURL = [NSURL fileURLWithPath:pathString isDirectory:YES]; + + if ([fileURL baseURL]) { + // This might be a relative path because we've loaded a worktree + // In this case we need to see if we can find the parent repository to construct an absolute URL + git_buf root = {0}; + + int error = git_repository_discover(&root, [[[self gitDirectoryURL] URLByDeletingLastPathComponent] fileSystemRepresentation], false, NULL); + + if (!error) { + git_repository *repository; + + if (git_repository_open(&repository, root.ptr) == 0) { + const char *workdir = git_repository_workdir(repository); + NSString *workdirString = [NSString stringWithUTF8String:workdir]; + + fileURL = [NSURL fileURLWithPath:pathString isDirectory:YES relativeToURL:[NSURL fileURLWithPath:workdirString]]; + + git_repository_free(repository); + } + } + + git_buf_free(&root); + } + + return fileURL; } - (NSURL *)gitDirectoryURL {