1
0

pkgs/git-show-link: Add helper to display links to local git objects

This commit is contained in:
clerie 2025-03-06 20:05:08 +01:00
parent 26d1ddfaee
commit dbd16ed438
5 changed files with 101 additions and 0 deletions

@ -147,6 +147,7 @@
git-checkout-github-pr
git-diff-word
git-pp
git-show-link
harmonia
iot-data
nix-remove-result-links

@ -29,6 +29,7 @@
chromium-incognito
print-afra
git-show-link
factorio-launcher
];

@ -0,0 +1,13 @@
{ pkgs, ... }:
pkgs.writeTextFile {
name = "git-show-link";
executable = true;
destination = "/bin/git-show-link";
allowSubstitutes = true;
preferLocalBuild = false;
text = ''
#!${pkgs.python3.withPackages (ps: with ps; [])}/bin/python3
${builtins.readFile ./git-show-link.py}
'';
}

@ -0,0 +1,85 @@
#!/usr/bin/env python3
import argparse
import re
import subprocess
REMOTE_TYPES = [
{
# github
"match": re.compile(r'git@github.com:(?P<username>\w+)/(?P<project>\w+).git'),
"format-branch": lambda g, b: f"https://github.com/{g['username']}/{g['project']}/tree/{b}/",
"format-commit": lambda g, c: f"https://github.com/{g['username']}/{g['project']}/commit/{c}/",
},
{
# gitea
"match": re.compile(r'(?P<gituser>\w+)@(?P<host>[\w\.-]+):(?P<username>\w+)/(?P<project>\w+).git'),
"format-branch": lambda g, b: f"https://{g['host']}/{g['username']}/{g['project']}/src/branch/{b}/",
"format-commit": lambda g, c: f"https://{g['host']}/{g['username']}/{g['project']}/commit/{c}/",
},
]
def get_remote_branch():
s = subprocess.run(["git", "status", "--porcelain", "-uno", "-b", "--no-ahead-behind"], capture_output=True, text=True)
git_status_branch_info = s.stdout.splitlines()[0][3:].split()[0]
branches = git_status_branch_info.split("...")
if len(branches) != 2:
raise Exception("no branch name found")
local_branch, remote_branch = branches
remote, branch = remote_branch.split("/")
return {
"remote": remote,
"branch": branch,
}
def get_remote_url(remote):
s = subprocess.run(["git", "remote", "get-url", remote], capture_output=True, text=True)
remote_url = s.stdout.strip()
return remote_url
def get_last_commit():
s = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True)
commit = s.stdout.strip()
return commit
def main():
parser = argparse.ArgumentParser(
prog='git-show-link',
)
parser.add_argument("--branch", dest="display_branch", action='store_true', help="Display link to branch, instead to commit")
args = parser.parse_args()
r = get_remote_branch()
remote_url = get_remote_url(r["remote"])
for remote_type in REMOTE_TYPES:
m = remote_type["match"].match(remote_url)
if m is None:
continue
g = m.groupdict()
if args.display_branch:
print(remote_type["format-branch"](g, r["branch"]))
else:
commit = get_last_commit()
print(remote_type["format-commit"](g, commit))
break
if __name__ == "__main__":
main()

@ -14,6 +14,7 @@ final: prev: {
git-checkout-github-pr = final.callPackage ./git-checkout-github-pr {};
git-diff-word = final.callPackage ./git-diff-word {};
git-pp = final.callPackage ./git-pp {};
git-show-link = final.callPackage ./git-show-link {};
iot-data = final.python3.pkgs.callPackage ./iot-data {};
nix-remove-result-links = final.callPackage ./nix-remove-result-links {};
nixfiles-auto-install = final.callPackage ./nixfiles/nixfiles-auto-install.nix {};