Git-repo-root relative path

Petar Petar
Wed Nov 18 23:43:15 UTC 2020


On Monday, 16 November 2020 at 10:21:27 UTC, Per Nordlöw wrote:
> I need a function that gets the relative path of a file in a 
> Git-repo and preferrably also its status.

I'm not sure I understand the question. I have written two 
programs, hopefully one of them does what you want :D

> Either via an external call to `git` or optionally via `libgit` 
> (if available).
>
> Which DUB packages do you prefer?

For such small tasks, the easiest is to just use the shell.

1st answer:

Initially I thought that you want to convert the current working 
directory (I don't know why - I didn't read well the question 
apparently :D) to a path relative to the root git repo path. 
Here's my solution to that problem:

```d
import std.exception : enforce;
import std.format : format;
import std.file : getcwd;
import std.path : asRelativePath;
import std.process : executeShell;
import std.stdio : writeln;
import std.string : stripRight;

void main()
{
     auto cwd = getcwd();
     const gitRootPathResult = executeShell("git rev-parse 
--show-toplevel");
     enforce(
         gitRootPathResult.status == 0,
         "`git` is not installed, or '%s' is not a git 
repo".format(cwd)
     );
     // Trim trailing whitespace from the shell invocation
     const gitRoot = gitRootPathResult.output.stripRight;
     debug writeln("Git root path: ", gitRoot);
     gitRoot
         .asRelativePath(getcwd())
         .writeln;
}
```

Example usage:

```
$ cd ~/code/repos/dlang/dlang/dmd/src/dmd/backend/

$ dmd -run ~/code/cwd_to_git_relative_path.d
../../..

# Sanity check:

$ dmd -debug -run ~/code/cwd_to_git_relative_path.d
Git root path: /home/zlx/code/repos/dlang/dlang/dmd
../../..

$ cd '../../..' && pwd
/home/zlx/code/repos/dlang/dlang/dmd
```

2nd answer:

Reading a second time, I don't understand what you meant by "gets 
the relative path of a file in a Git-repo". Did you mean that it 
receives an absolute path (or relative to current working 
directory) to a file and converts it to a path relative to a git 
repo? If so, here's my solution and for determining the status of 
a file:

https://gist.github.com/PetarKirov/b4c8b64e7fc9bb7391901bcb541ddf3a


More information about the Digitalmars-d-learn mailing list