about summary refs log tree commit diff
path: root/pkgs/applications/version-management/git-and-tools
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/applications/version-management/git-and-tools')
-rw-r--r--pkgs/applications/version-management/git-and-tools/delta/default.nix6
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-aggregator/default.nix43
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-backup/default.nix26
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-crecord/default.nix25
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-fire/default.nix31
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-ftp/default.nix99
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-hound/default.nix31
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-lfs/default.nix55
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-privacy/default.nix49
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-quick-stats/default.nix51
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-repo-updater/default.nix25
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-repo/default.nix62
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-repo/import-ssl-module.patch28
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-review/default.nix52
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-series/default.nix40
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-sizer/default.nix30
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-town/default.nix77
-rw-r--r--pkgs/applications/version-management/git-and-tools/git-up/default.nix36
-rw-r--r--pkgs/applications/version-management/git-and-tools/gitless/default.nix41
-rw-r--r--pkgs/applications/version-management/git-and-tools/gitlint/default.nix50
-rw-r--r--pkgs/applications/version-management/git-and-tools/gitls/default.nix34
-rw-r--r--pkgs/applications/version-management/git-and-tools/gitoxide/default.nix41
-rw-r--r--pkgs/applications/version-management/git-and-tools/gitsign/default.nix32
-rw-r--r--pkgs/applications/version-management/git-and-tools/gitstats/default.nix44
-rw-r--r--pkgs/applications/version-management/git-and-tools/josh/default.nix60
-rw-r--r--pkgs/applications/version-management/git-and-tools/lefthook/default.nix6
26 files changed, 1068 insertions, 6 deletions
diff --git a/pkgs/applications/version-management/git-and-tools/delta/default.nix b/pkgs/applications/version-management/git-and-tools/delta/default.nix
index 0bd1e2a51217f..1bdd028d8101b 100644
--- a/pkgs/applications/version-management/git-and-tools/delta/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/delta/default.nix
@@ -11,16 +11,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "delta";
-  version = "0.14.0";
+  version = "0.15.1";
 
   src = fetchFromGitHub {
     owner = "dandavison";
     repo = pname;
     rev = version;
-    sha256 = "sha256-hB8qpVXsAVJvtrdTnbPYcL9K4gL2nkZLo6vunjOP/7o=";
+    sha256 = "sha256-rPtLvO6raBY6BfrP0erBaXD86W1JL8g4XC4VbkR4Pww=";
   };
 
-  cargoSha256 = "sha256-19ZGWM8vPbIEYaCxrAZ2HWgSqbeLu3hEb8eLL4a7fAI=";
+  cargoSha256 = "sha256-raT8a8K05ZpiGuZdM1hNikGxqY6w0g8G1DohfybXD9s=";
 
   nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/applications/version-management/git-and-tools/git-aggregator/default.nix b/pkgs/applications/version-management/git-and-tools/git-aggregator/default.nix
new file mode 100644
index 0000000000000..9b2465366f672
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-aggregator/default.nix
@@ -0,0 +1,43 @@
+{ lib, git, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "git-aggregator";
+  version = "2.1.0";
+
+  src = python3Packages.fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-79xNPzYP1j71sU5wZM5e2xTqQExqQEdxXPxbk4T/Scw=";
+  };
+
+  nativeBuildInputs = with python3Packages; [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    argcomplete
+    colorama
+    git
+    kaptan
+    requests
+  ];
+
+  checkInputs = [
+    git
+  ];
+
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+    git config --global user.name John
+    git config --global user.email john@localhost
+    git config --global init.defaultBranch master
+    git config --global pull.rebase false
+  '';
+
+  meta = with lib; {
+    description = "Manage the aggregation of git branches from different remotes to build a consolidated one";
+    homepage = "https://github.com/acsone/git-aggregator";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ lourkeur ];
+    mainProgram = "gitaggregate";
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-backup/default.nix b/pkgs/applications/version-management/git-and-tools/git-backup/default.nix
new file mode 100644
index 0000000000000..8c45fdef3f7d7
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-backup/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, pkg-config, openssl, Security }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-backup";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    owner = "jsdw";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0h31j8clvk4gkw4mgva9p0ypf26zhf7f0y564fdmzyw6rsz9wzcj";
+  };
+
+  cargoSha256 = "0lb53sk7rikmj365gvcvn1hq70d6dmhp0aj2dyipb2qasypqz5l3";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ openssl ] ++ lib.optionals stdenv.isDarwin [ Security ];
+
+  meta = with lib; {
+    homepage = "https://github.com/jsdw/git-backup";
+    description = "A tool to help you backup your git repositories from services like GitHub";
+    license = licenses.mit;
+    maintainers = [ maintainers.marsam ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-crecord/default.nix b/pkgs/applications/version-management/git-and-tools/git-crecord/default.nix
new file mode 100644
index 0000000000000..1ad75e75b7bfd
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-crecord/default.nix
@@ -0,0 +1,25 @@
+{ lib, fetchFromGitHub, python3 }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "git-crecord";
+  version = "20220324.0";
+
+  src = fetchFromGitHub {
+    owner = "andrewshadura";
+    repo = "git-crecord";
+    rev = version;
+    sha256 = "sha256-LWO9vteTIe54zTDWyRotLKIIi5SaGD0c9s7B5aBHm0s=";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [ docutils ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/andrewshadura/git-crecord";
+    description = "Git subcommand to interactively select changes to commit or stage";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ onny ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-fire/default.nix b/pkgs/applications/version-management/git-and-tools/git-fire/default.nix
new file mode 100644
index 0000000000000..bc7e9f4840b71
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-fire/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "git-fire";
+  version = "unstable-2017-08-27";
+
+  src = fetchFromGitHub {
+    owner = "qw3rtman";
+    repo = "git-fire";
+    rev = "d72b68ed356f726c77c60294f9220275f16c9931";
+    sha256 = "1hdwkhyjjx31y0lpjkhbb4f5y9f7g70fnd4c2246cmk2rbsvj5b2";
+  };
+
+  installPhase = ''
+    install -D -m755 $src/git-fire $out/bin/git-fire
+  '';
+
+  meta = with lib; {
+    description = ''
+      Push ALL changes in a git repository
+    '';
+    longDescription = ''
+      In the event of an emergency (fire, etc.), automatically commit all changes/files in a repository, pushing to all known remotes all commits and stashes.
+    '';
+    homepage = "https://github.com/qw3rtman/git-fire";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ swflint ];
+    mainProgram = "git-fire";
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-ftp/default.nix b/pkgs/applications/version-management/git-and-tools/git-ftp/default.nix
new file mode 100644
index 0000000000000..57b5e3c463724
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-ftp/default.nix
@@ -0,0 +1,99 @@
+{ lib
+, resholve
+, fetchFromGitHub
+, fetchpatch
+, bash
+, coreutils
+, git
+, gnugrep
+, gawk
+, curl
+, hostname
+, gnused
+, findutils
+, lftp
+, pandoc
+, man
+}:
+
+resholve.mkDerivation rec {
+  pname = "git-ftp";
+  version = "1.6.0";
+  src = fetchFromGitHub {
+    owner = "git-ftp";
+    repo = "git-ftp";
+    rev = version;
+    sha256 = "1hxkqf7jbrx24q18yxpnd3dxzh4xk6asymwkylp1x7zg6mcci87d";
+  };
+
+  dontBuild = true;
+
+  # fix bug/typo; PRed upstream @
+  # https://github.com/git-ftp/git-ftp/pull/628
+  patches = [
+    (fetchpatch {
+      name = "fix-function-invocation-typo.patch";
+      url = "https://github.com/git-ftp/git-ftp/commit/cddf7cbba80e710758f6aac0ec0d77552ea8cd75.patch";
+      sha256 = "sha256-2B0QaMJi78Bg3bA1jp41aiyql1/LCryoaDs7+xmS1HY=";
+    })
+  ];
+
+  installPhase = ''
+    make install-all prefix=$out
+  '';
+
+  nativeBuildInputs = [ pandoc man ];
+
+  solutions = {
+    git-ftp = {
+      scripts = [ "bin/git-ftp" ];
+      interpreter = "${bash}/bin/bash";
+      inputs = [
+        coreutils
+        git
+        gnugrep
+        gawk
+        curl
+        hostname
+        gnused
+        findutils
+        lftp
+      ];
+      fake = {
+        # don't resolve impure system macOS security
+        # caution: will still be fragile if PATH is bad
+        # TODO: fixable once we figure out how to handle
+        # this entire class of problem...
+        "external" = [ "security" ];
+      };
+      keep = {
+        # looks like run-time user/env/git-config controlled
+        "$GIT_PAGER" = true;
+        "$hook" = true; # presumably git hooks given context
+      };
+      execer = [
+        # TODO: rm when binlore/resholve handle git; manually
+        # checked and see no obvious subexec for now
+        "cannot:${git}/bin/git"
+        /*
+        Mild uncertainty here. There *are* commandlikes in
+        the arguments (especially wait & cd), but I think they are
+        fine as-is, because I'm reading them as:
+        1. ftp commands
+        2. running on the remote anyways
+
+        See https://github.com/git-ftp/git-ftp/blob/057f7d8e9f00ffc5a8c6ceaa4be30af2939df41a/git-ftp#L1214-L1221
+        */
+        "cannot:${lftp}/bin/lftp"
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Git powered FTP client written as shell script";
+    homepage = "https://git-ftp.github.io/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ tweber ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-hound/default.nix b/pkgs/applications/version-management/git-and-tools/git-hound/default.nix
new file mode 100644
index 0000000000000..463d550cbcabb
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-hound/default.nix
@@ -0,0 +1,31 @@
+{ buildGoModule
+, fetchFromGitHub
+, lib
+}:
+
+buildGoModule rec {
+  pname = "git-hound";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "tillson";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-HD5OK8HjnLDbyC/TmVI2HfBRIUCyyHTbA3JvKoeXV5E=";
+  };
+
+  vendorSha256 = null; #vendorSha256 = "";
+
+  meta = with lib; {
+    description = "Reconnaissance tool for GitHub code search";
+    longDescription = ''
+      GitHound pinpoints exposed API keys and other sensitive information
+      across all of GitHub using pattern matching, commit history searching,
+      and a unique result scoring system.
+    '';
+    homepage = "https://github.com/tillson/git-hound";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    broken = true; # vendor isn't reproducible with go > 1.17: nix-build -A $name.go-modules --check
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-lfs/default.nix b/pkgs/applications/version-management/git-and-tools/git-lfs/default.nix
new file mode 100644
index 0000000000000..bbb7d29422aa7
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-lfs/default.nix
@@ -0,0 +1,55 @@
+{ lib, buildGoModule, fetchFromGitHub, asciidoctor, installShellFiles, git, testers, git-lfs }:
+
+buildGoModule rec {
+  pname = "git-lfs";
+  version = "3.3.0";
+
+  src = fetchFromGitHub {
+    owner = "git-lfs";
+    repo = "git-lfs";
+    rev = "v${version}";
+    hash = "sha256-r1z97sgqo1IyR0oW5b3bMGTUHGE8U+hrWgQ0Su9FRrw=";
+  };
+
+  vendorHash = "sha256-did6qAUawmQ/juLzJWIXGzmErj9tBKgM7HROTezX+tw=";
+
+  nativeBuildInputs = [ asciidoctor installShellFiles ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X github.com/git-lfs/git-lfs/v${lib.versions.major version}/config.Vendor=${version}"
+  ];
+
+  subPackages = [ "." ];
+
+  preBuild = ''
+    GOARCH= go generate ./commands
+  '';
+
+  postBuild = ''
+    make man
+  '';
+
+  checkInputs = [ git ];
+
+  preCheck = ''
+    unset subPackages
+  '';
+
+  postInstall = ''
+    installManPage man/man*/*
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = git-lfs;
+  };
+
+  meta = with lib; {
+    description = "Git extension for versioning large files";
+    homepage = "https://git-lfs.github.com/";
+    changelog = "https://github.com/git-lfs/git-lfs/raw/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ twey marsam ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-privacy/default.nix b/pkgs/applications/version-management/git-and-tools/git-privacy/default.nix
new file mode 100644
index 0000000000000..c17654174382a
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-privacy/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, fetchFromGitHub
+, git
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "git-privacy";
+  version = "2.1.0";
+  format = "setuptools";
+
+  disabled = python3.pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "EMPRI-DEVOPS";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "0hfy43fip1l81672xfwqrz1jryzkjy7h9f2lyikxgibibil0p444";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    click
+    git-filter-repo
+    GitPython
+    pynacl
+    setuptools
+  ];
+
+  checkInputs = with python3.pkgs; [
+    git
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests want to interact with a git repo
+    "TestGitPrivacy"
+  ];
+
+  pythonImportsCheck = [
+    "gitprivacy"
+  ];
+
+  meta = with lib; {
+    description = "Tool to redact Git author and committer dates";
+    homepage = "https://github.com/EMPRI-DEVOPS/git-privacy";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-quick-stats/default.nix b/pkgs/applications/version-management/git-and-tools/git-quick-stats/default.nix
new file mode 100644
index 0000000000000..336c24819baf0
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-quick-stats/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv
+, fetchFromGitHub
+, makeWrapper
+, coreutils
+, gawk
+, git
+, gnugrep
+, ncurses
+, util-linux
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-quick-stats";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    repo = "git-quick-stats";
+    owner = "arzzen";
+    rev = version;
+    sha256 = "sha256-QmHb5MWZpbZjc93XgdPFabgzT7S522ZN27p6tdL46Y0=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installFlags = [
+    "PREFIX=${builtins.placeholder "out"}"
+  ];
+
+  postInstall =
+    let
+      path = lib.makeBinPath [
+        coreutils
+        gawk
+        git
+        gnugrep
+        ncurses
+        util-linux
+      ];
+    in
+    ''
+      wrapProgram $out/bin/git-quick-stats --suffix PATH : ${path}
+    '';
+
+  meta = with lib; {
+    homepage = "https://github.com/arzzen/git-quick-stats";
+    description = "A simple and efficient way to access various statistics in git repository";
+    platforms = platforms.all;
+    maintainers = [ maintainers.kmein ];
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-repo-updater/default.nix b/pkgs/applications/version-management/git-and-tools/git-repo-updater/default.nix
new file mode 100644
index 0000000000000..d78972aa07bdf
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-repo-updater/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonApplication, fetchPypi
+, colorama, GitPython }:
+
+buildPythonApplication rec {
+  pname = "gitup";
+  version = "0.5.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1pa612rcc94nc461zs9sag9p46sycc214622b06gdn35rmwp0y2g";
+  };
+
+  propagatedBuildInputs = [ colorama GitPython ];
+
+  # no tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Easily update multiple Git repositories at once";
+    homepage = "https://github.com/earwig/git-repo-updater";
+    license = licenses.mit;
+    maintainers = [ maintainers.bdesham ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-repo/default.nix b/pkgs/applications/version-management/git-and-tools/git-repo/default.nix
new file mode 100644
index 0000000000000..e47ea6b12dbef
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-repo/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, nix-update-script
+, python3, git, gnupg, less, openssh
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-repo";
+  version = "2.30";
+
+  src = fetchFromGitHub {
+    owner = "android";
+    repo = "tools_repo";
+    rev = "v${version}";
+    sha256 = "sha256-Ck+Q7sHhMqUWu6WeA3DhY+svMxH2sU0WvmyvZ5qsW+E=";
+  };
+
+  # Fix 'NameError: name 'ssl' is not defined'
+  patches = [ ./import-ssl-module.patch ];
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ python3 ];
+
+  postPatch = ''
+    substituteInPlace repo --replace \
+      'urllib.request.urlopen(url)' \
+      'urllib.request.urlopen(url, context=ssl.create_default_context())'
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp repo $out/bin/repo
+
+    runHook postInstall
+  '';
+
+  # Important runtime dependencies
+  postFixup = ''
+    wrapProgram $out/bin/repo --prefix PATH ":" \
+      "${lib.makeBinPath [ git gnupg less openssh ]}"
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "gitRepo";
+    };
+  };
+
+  meta = with lib; {
+    description = "Android's repo management tool";
+    longDescription = ''
+      Repo is a Python script based on Git that helps manage many Git
+      repositories, does the uploads to revision control systems, and automates
+      parts of the development workflow. Repo is not meant to replace Git, only
+      to make it easier to work with Git.
+    '';
+    homepage = "https://android.googlesource.com/tools/repo";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ otavio ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-repo/import-ssl-module.patch b/pkgs/applications/version-management/git-and-tools/git-repo/import-ssl-module.patch
new file mode 100644
index 0000000000000..efc3d2b1f8a5e
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-repo/import-ssl-module.patch
@@ -0,0 +1,28 @@
+Fix runtime error due missing import
+
+Traceback (most recent call last):
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 1339, in <module>
+    main(sys.argv[1:])
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 1304, in main
+    _Init(args, gitc_init=(cmd == 'gitc-init'))
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 607, in _Init
+    _Clone(url, dst, opt.clone_bundle, opt.quiet, opt.verbose)
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 912, in _Clone
+    if clone_bundle and _DownloadBundle(url, cwd, quiet, verbose):
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 860, in _DownloadBundle
+    r = urllib.request.urlopen(url, context=ssl.create_default_context())
+NameError: name 'ssl' is not defined
+builder for '/nix/store/4hvds8fv8xmzlm86yg9cf1lj6hrya7sg-amdvlk-src.drv' failed with exit code 1
+
+diff --git a/repo b/repo
+index 8b05def..f394b3e 100755
+--- a/repo
++++ b/repo
+@@ -236,6 +236,7 @@ import optparse
+ import re
+ import shutil
+ import stat
++import ssl
+ 
+ if sys.version_info[0] == 3:
+   import urllib.request
diff --git a/pkgs/applications/version-management/git-and-tools/git-review/default.nix b/pkgs/applications/version-management/git-and-tools/git-review/default.nix
new file mode 100644
index 0000000000000..2650f330c0a99
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-review/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, fetchFromGitea
+, buildPythonApplication
+, pbr
+, requests
+, setuptools
+, gitUpdater
+}:
+
+buildPythonApplication rec {
+  pname = "git-review";
+  version = "2.3.1";
+
+  # Manually set version because prb wants to get it from the git
+  # upstream repository (and we are installing from tarball instead)
+  PBR_VERSION = version;
+
+  src = fetchFromGitea {
+    domain = "opendev.org";
+    owner = "opendev";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-C8M4b/paHJB9geizc1eIhXsTuLeeS4dDisCfCQF1RuU=";
+  };
+
+  outputs = [ "out" "man" ];
+
+  nativeBuildInputs = [
+    pbr
+  ];
+
+  propagatedBuildInputs = [
+    requests
+    setuptools # implicit dependency, used to get package version through pkg_resources
+  ];
+
+  # Don't run tests because they pull in external dependencies
+  # (a specific build of gerrit + maven plugins), and I haven't figured
+  # out how to work around this yet.
+  doCheck = false;
+
+  pythonImportsCheck = [ "git_review" ];
+
+  passthru.updateScript = gitUpdater { };
+
+  meta = with lib; {
+    description = "Tool to submit code to Gerrit";
+    homepage = "https://opendev.org/opendev/git-review";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ kira-bruneau ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-series/default.nix b/pkgs/applications/version-management/git-and-tools/git-series/default.nix
new file mode 100644
index 0000000000000..31d1c635512c4
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-series/default.nix
@@ -0,0 +1,40 @@
+{ lib, rustPlatform, fetchFromGitHub
+, pkg-config, openssl, zlib, curl, libgit2, libssh2
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-series";
+  version = "unstable-2019-10-15";
+
+  src = fetchFromGitHub {
+    owner = "git-series";
+    repo = "git-series";
+    rev = "c570a015e15214be46a7fd06ba08526622738e20";
+    sha256 = "1i0m2b7ma6xvkg95k57gaj1wpc1rfvka6h8jr5hglxmqqbz6cb6w";
+  };
+
+  cargoSha256 = "1hmx14z3098c98achgii0jkcm4474iw762rmib77amcsxj73zzdh";
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ openssl zlib curl libgit2 libssh2 ];
+
+  LIBGIT2_SYS_USE_PKG_CONFIG = true;
+  LIBSSH2_SYS_USE_PKG_CONFIG = true;
+
+  postInstall = ''
+    install -D "$src/git-series.1" "$out/man/man1/git-series.1"
+  '';
+
+  meta = with lib; {
+    description = "A tool to help with formatting git patches for review on mailing lists";
+    longDescription = ''
+      git series tracks changes to a patch series over time. git
+      series also tracks a cover letter for the patch series,
+      formats the series for email, and prepares pull requests.
+    '';
+    homepage = "https://github.com/git-series/git-series";
+
+    license = licenses.mit;
+    maintainers = with maintainers; [ edef vmandela ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-sizer/default.nix b/pkgs/applications/version-management/git-and-tools/git-sizer/default.nix
new file mode 100644
index 0000000000000..ed7239b80cb33
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-sizer/default.nix
@@ -0,0 +1,30 @@
+{ lib, buildGoModule, fetchFromGitHub, testers, git-sizer }:
+
+buildGoModule rec {
+  pname = "git-sizer";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "github";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-On7QBTzKfnuuzwMQ8m1odxGqfIKL+EDg5V05Kxuhmqw=";
+  };
+
+  vendorSha256 = "sha256-oRlsD99XiI/0ZWibjyRcycmGab+vMbXrV5hIdIyUDYg=";
+
+  ldflags = [ "-s" "-w" "-X main.BuildVersion=${version}" ];
+
+  doCheck = false;
+
+  passthru.tests.vesion = testers.testVersion {
+    package = git-sizer;
+  };
+
+  meta = with lib; {
+    description = "Compute various size metrics for a Git repository";
+    homepage = "https://github.com/github/git-sizer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthewbauer ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-town/default.nix b/pkgs/applications/version-management/git-and-tools/git-town/default.nix
new file mode 100644
index 0000000000000..abca61358d99b
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-town/default.nix
@@ -0,0 +1,77 @@
+{ lib, buildGoModule, fetchFromGitHub, fetchpatch, installShellFiles, git, testers, git-town, makeWrapper }:
+
+buildGoModule rec {
+  pname = "git-town";
+  version = "7.8.0";
+
+  src = fetchFromGitHub {
+    owner = "git-town";
+    repo = "git-town";
+    rev = "v${version}";
+    sha256 = "sha256-g9ooMIMN8DN2FcWYkDC1hICCleQYdHf30PYMCit/NMI=";
+  };
+
+  patches = [
+    # Fix "go vet" when building using Go 1.18.
+    (fetchpatch {
+      name = "fix-go-vet-in-go-1.18.patch";
+      url = "https://github.com/git-town/git-town/commit/23eb0aca7b28c6a0afc21db553aa0e35d35891aa.patch";
+      sha256 = "sha256-EyfhKVrQxRJNrYqaZI04dJogaXs1J+bbOIu7p8g2Clc=";
+    })
+  ];
+
+  vendorSha256 = null;
+
+  nativeBuildInputs = [ installShellFiles makeWrapper ];
+
+  buildInputs = [ git ];
+
+  ldflags =
+    let
+      modulePath = "github.com/git-town/git-town/v${lib.versions.major version}"; in
+    [
+      "-s"
+      "-w"
+      "-X ${modulePath}/src/cmd.version=v${version}"
+      "-X ${modulePath}/src/cmd.buildDate=nix"
+    ];
+
+  checkInputs = [ git ];
+  preCheck =
+    let
+      skippedTests = [
+        "TestGodog"
+        "TestRunner_CreateChildFeatureBranch"
+        "TestShellRunner_RunStringWith_Dir"
+        "TestMockingShell_MockCommand"
+        "TestShellRunner_RunStringWith_Input"
+      ];
+    in
+    ''
+      HOME=$(mktemp -d)
+      # Disable tests requiring local operations
+      buildFlagsArray+=("-run" "[^(${builtins.concatStringsSep "|" skippedTests})]")
+    '';
+
+  postInstall = ''
+    installShellCompletion --cmd git-town \
+      --bash <($out/bin/git-town completion bash) \
+      --fish <($out/bin/git-town completion fish) \
+      --zsh <($out/bin/git-town completion zsh)
+
+    wrapProgram $out/bin/git-town --prefix PATH : ${lib.makeBinPath [ git ]}
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = git-town;
+    command = "git-town version";
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    description = "Generic, high-level git support for git-flow workflows";
+    homepage = "https://www.git-town.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ allonsy blaggacao ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/git-up/default.nix b/pkgs/applications/version-management/git-and-tools/git-up/default.nix
new file mode 100644
index 0000000000000..0a366827e40d5
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/git-up/default.nix
@@ -0,0 +1,36 @@
+{ lib, pythonPackages, git }:
+
+pythonPackages.buildPythonApplication rec {
+  pname = "git-up";
+  version = "1.6.1";
+
+  src = pythonPackages.fetchPypi {
+    inherit pname version;
+    sha256 = "0gs791yb0cndg9879vayvcj329jwhzpk6wrf9ri12l5hg8g490za";
+  };
+
+  # git should be on path for tool to work correctly
+  propagatedBuildInputs = [ git ] ++ (with pythonPackages; [ click colorama docopt GitPython six termcolor ]);
+
+  checkInputs = [ git pythonPackages.nose ]; # git needs to be on path
+  # 1. git fails to run as it cannot detect the email address, so we set it
+  # 2. $HOME is by default not a valid dir, so we have to set that too
+  # https://github.com/NixOS/nixpkgs/issues/12591
+  preCheck = ''
+      export HOME=$TMPDIR
+      git config --global user.email "nobody@example.com"
+      git config --global user.name "Nobody"
+    '';
+
+  postInstall = ''
+    rm -r $out/${pythonPackages.python.sitePackages}/PyGitUp/tests
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/msiemens/PyGitUp";
+    description = "A git pull replacement that rebases all local branches when pulling";
+    license = licenses.mit;
+    maintainers = with maintainers; [ peterhoeg ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/gitless/default.nix b/pkgs/applications/version-management/git-and-tools/gitless/default.nix
new file mode 100644
index 0000000000000..31ab40d79478f
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/gitless/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, fetchFromGitHub
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gitless";
+  version = "0.8.8";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "gitless-vcs";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-xo5EWtP2aN8YzP8ro3bnxZwUGUp0PHD0g8hk+Y+gExE=";
+  };
+
+  nativeBuildInputs = [ python3.pkgs.pythonRelaxDepsHook ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    sh
+    pygit2
+    clint
+  ];
+
+  pythonRelaxDeps = [ "pygit2" ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gitless"
+  ];
+
+  meta = with lib; {
+    description = "Version control system built on top of Git";
+    homepage = "https://gitless.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cransom ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/gitlint/default.nix b/pkgs/applications/version-management/git-and-tools/gitlint/default.nix
new file mode 100644
index 0000000000000..626739864c713
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/gitlint/default.nix
@@ -0,0 +1,50 @@
+{ lib
+, buildPythonApplication
+, fetchFromGitHub
+, gitMinimal
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gitlint";
+  version = "0.18.0";
+
+  src = fetchFromGitHub {
+    owner = "jorisroovers";
+    repo = "gitlint";
+    rev = "v${version}";
+    sha256 = "sha256-MmXzrooN+C9MUaAz4+IEGkGJWHbgvPMSLHgssM0wyN8=";
+  };
+
+  # Upstream splitted the project into gitlint and gitlint-core to
+  # simplify the dependency handling
+  sourceRoot = "source/gitlint-core";
+
+  propagatedBuildInputs = with python3.pkgs; [
+    arrow
+    click
+    sh
+  ];
+
+  checkInputs = with python3.pkgs; [
+    gitMinimal
+    pytestCheckHook
+  ];
+
+  postPatch = ''
+    # We don't need gitlint-core
+    substituteInPlace setup.py \
+      --replace "'gitlint-core[trusted-deps]==' + version," ""
+  '';
+
+  pythonImportsCheck = [
+    "gitlint"
+  ];
+
+  meta = with lib; {
+    description = "Linting for your git commit messages";
+    homepage = "https://jorisroovers.com/gitlint/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ethancedwards8 fab ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/gitls/default.nix b/pkgs/applications/version-management/git-and-tools/gitls/default.nix
new file mode 100644
index 0000000000000..4cda10b380575
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/gitls/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildGoModule
+, gitls
+, fetchFromGitHub
+, testers
+}:
+
+buildGoModule rec {
+  pname = "gitls";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "hahwul";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kLkH/nNidd1QNPKvo7fxZwMhTgd4AVB8Ofw0Wo0z6c0=";
+  };
+
+  vendorSha256 = null;
+
+  passthru.tests.version = testers.testVersion {
+    package = gitls;
+    command = "gitls -version";
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    description = "Tools to enumerate git repository URL";
+    homepage = "https://github.com/hahwul/gitls";
+    changelog = "https://github.com/hahwul/gitls/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/gitoxide/default.nix b/pkgs/applications/version-management/git-and-tools/gitoxide/default.nix
new file mode 100644
index 0000000000000..d2a51c94727a2
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/gitoxide/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, cmake
+, pkg-config
+, stdenv
+, libiconv
+, Security
+, SystemConfiguration
+, openssl
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "gitoxide";
+  version = "0.19.0";
+
+  src = fetchFromGitHub {
+    owner = "Byron";
+    repo = "gitoxide";
+    rev = "v${version}";
+    sha256 = "sha256-GGXujTn5Xb63vKIycj5o9+PCsMN1Kp3RCSg1wiM31qA=";
+  };
+
+  cargoSha256 = "sha256-MAZhrd9CtFOIAaUUbXplBo+eo6Zaws2LIRkPoX4HztE=";
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = if stdenv.isDarwin
+    then [ libiconv Security SystemConfiguration ]
+    else [ openssl ];
+
+  # Needed to get openssl-sys to use pkg-config.
+  OPENSSL_NO_VENDOR = 1;
+
+  meta = with lib; {
+    description = "A command-line application for interacting with git repositories";
+    homepage = "https://github.com/Byron/gitoxide";
+    changelog = "https://github.com/Byron/gitoxide/blob/v${version}/CHANGELOG.md";
+    license = with licenses; [ mit /* or */ asl20 ];
+    maintainers = with maintainers; [ syberant ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/gitsign/default.nix b/pkgs/applications/version-management/git-and-tools/gitsign/default.nix
new file mode 100644
index 0000000000000..11a8394a63c49
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/gitsign/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildGoModule, fetchFromGitHub, stdenv, makeWrapper, gitMinimal }:
+
+buildGoModule rec {
+  pname = "gitsign";
+  version = "0.4.1";
+
+  src = fetchFromGitHub {
+    owner = "sigstore";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-lSE4BLwtxicngvnDCcMa6F6c3+Okn9NKAOnT2FGi7kU=";
+  };
+  vendorSha256 = "sha256-WrVunAxOXXGSbs9OyKydeg4N/s871mt2O3t2e5DxXQo=";
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  ldflags = [ "-s" "-w" "-buildid=" "-X github.com/sigstore/gitsign/pkg/version.gitVersion=${version}" ];
+
+  postInstall = ''
+    for f in $out/bin/*; do
+      wrapProgram $f --prefix PATH : ${lib.makeBinPath [ gitMinimal ]}
+    done
+  '';
+
+  meta = {
+    homepage = "https://github.com/sigstore/gitsign";
+    changelog = "https://github.com/sigstore/gitsign/releases/tag/v${version}";
+    description = "Keyless Git signing using Sigstore";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ lesuisse ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/gitstats/default.nix b/pkgs/applications/version-management/git-and-tools/gitstats/default.nix
new file mode 100644
index 0000000000000..6cfcb0077427f
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/gitstats/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchFromGitHub, perl, python2, gnuplot, coreutils, gnugrep }:
+
+stdenv.mkDerivation rec {
+  pname = "gitstats";
+  version = "2016-01-08";
+
+  # upstream does not make releases
+  src = fetchFromGitHub {
+    owner = "hoxu";
+    repo = "gitstats";
+    rev = "55c5c285558c410bb35ebf421245d320ab9ee9fa";
+    sha256 = "sha256-qUQB3aCRbPkbMoMf39kPQ0vil8RjXL8RqjdTryfkzK0=";
+  };
+
+  nativeBuildInputs = [ perl ];
+
+  buildInputs = [ python2 ];
+
+  strictDeps = true;
+
+  postPatch = ''
+    sed -e "s|gnuplot_cmd = .*|gnuplot_cmd = '${gnuplot}/bin/gnuplot'|" \
+        -e "s|\<wc\>|${coreutils}/bin/wc|g" \
+        -e "s|\<grep\>|${gnugrep}/bin/grep|g" \
+        -i gitstats
+  '';
+
+  buildPhase = ''
+    make man VERSION="${version}"
+  '';
+
+  installPhase = ''
+    make install PREFIX="$out" VERSION="${version}"
+    install -Dm644 doc/gitstats.1 "$out"/share/man/man1/gitstats.1
+  '';
+
+  meta = with lib; {
+    homepage = "http://gitstats.sourceforge.net/";
+    description = "Git history statistics generator";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/josh/default.nix b/pkgs/applications/version-management/git-and-tools/josh/default.nix
new file mode 100644
index 0000000000000..acf2b24c0794e
--- /dev/null
+++ b/pkgs/applications/version-management/git-and-tools/josh/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, libgit2
+, openssl
+, pkg-config
+, makeWrapper
+, git
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "josh";
+  version = "22.06.22";
+
+  src = fetchFromGitHub {
+    owner = "esrlabs";
+    repo = "josh";
+    rev = "r" + version;
+    sha256 = "0511qv9zyjvv4zfz6zyi69ssbkrwa24n0ah5w9mb4gzd547as8pq";
+  };
+
+  cargoSha256 = "0zfjjyyz4pxar1mfkkj9aij4dnwqy3asdrmay1iy6ijjn1qd97n4";
+
+  nativeBuildInputs = [
+    pkg-config
+    makeWrapper
+  ];
+
+  buildInputs = [
+    libgit2
+    openssl
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.Security
+  ];
+
+  cargoBuildFlags = [
+    "-p" "josh"
+    "-p" "josh-proxy"
+    # TODO: josh-ui
+  ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/josh-proxy" --prefix PATH : "${git}/bin"
+  '';
+
+  meta = {
+    description = "Just One Single History";
+    homepage = "https://josh-project.github.io/josh/";
+    downloadPage = "https://github.com/josh-project/josh";
+    changelog = "https://github.com/josh-project/josh/releases/tag/${version}";
+    license = lib.licenses.mit;
+    maintainers = [
+      lib.maintainers.sternenseemann
+      lib.maintainers.tazjin
+    ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/pkgs/applications/version-management/git-and-tools/lefthook/default.nix b/pkgs/applications/version-management/git-and-tools/lefthook/default.nix
index 6b019e50887cf..e73d4de6dc41c 100644
--- a/pkgs/applications/version-management/git-and-tools/lefthook/default.nix
+++ b/pkgs/applications/version-management/git-and-tools/lefthook/default.nix
@@ -2,16 +2,16 @@
 
 buildGoModule rec {
   pname = "lefthook";
-  version = "1.2.2";
+  version = "1.2.3";
 
   src = fetchFromGitHub {
     rev = "v${version}";
     owner = "evilmartians";
     repo = "lefthook";
-    sha256 = "sha256-66exuMb0dUQWRhcDUU7mAJ06yD/acKX96KIQwMEU6xM=";
+    sha256 = "sha256-tns/JUOYlgG+oiFACnXlCwHBF4enctV4GPlpEZCM/nM=";
   };
 
-  vendorSha256 = "sha256-NTZz0EDIjGdh8dD9jxbNVdWb7NFJsdtnMp7H6Ni0EbQ=";
+  vendorSha256 = "sha256-sBcgt2YsV9RQhSjPN6N54tRk7nNvcOVhPEsEP+0Dtco=";
 
   nativeBuildInputs = [ installShellFiles ];