commit 2d9b0f77b39da209bdc85da987bd0778e61855e0 Author: Denis Lehmann Date: Fri Jul 12 19:26:58 2024 +0200 initial commit diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..e09000a --- /dev/null +++ b/flake.lock @@ -0,0 +1,23 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 0, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", + "path": "/nix/store/2nnisw4pxbifisbkg58hrnis9ycs5ah1-source", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..aafd9db --- /dev/null +++ b/flake.nix @@ -0,0 +1,25 @@ +{ + description = "Add new Git remotes quickly"; + outputs = { self, nixpkgs }@inputs: + let + forAllSystems = nixpkgs.lib.genAttrs nixpkgs.lib.platforms.unix; + + nixpkgsFor = forAllSystems (system: import nixpkgs { + inherit system; + }); + in + { + packages = forAllSystems (system: + let pkgs = nixpkgsFor.${system}; in + { + gra = pkgs.stdenv.mkDerivation { + name = "gra"; + src = self; + installPhase = '' + install -m 755 -D gra $out/bin/gra + ''; + }; + default = self.packages.${system}.gra; + }); + }; +} diff --git a/gra b/gra new file mode 100755 index 0000000..c820ffe --- /dev/null +++ b/gra @@ -0,0 +1,101 @@ +#!/usr/bin/env bash + +# Text formatting variables +text_reset=$'\e[0m' +text_bold=$'\e[1m' +text_red=$'\e[31m' + +function print_usage { + cat < /dev/null; then + error "Not inside a Git repository" +fi + +# Read config +[ -f ~/.config/gra.config ] && source ~/.config/gra.config + +# Set remote user +remote_user="" +if [ -v "$remote_name" ]; then + remote_user="${!remote_name}" +else + remote_user="$remote_name" +fi + +# Get origin URL +origin_url="" +while read -r remote; do + if [[ "$remote" =~ origin[[:space:]](.*)[[:space:]]\(fetch\) ]]; then + origin_url="${BASH_REMATCH[1]}" + break + fi +done < <(git remote -v) +[ "$origin_url" == "" ] && error "Failed to get ${text_bold}origin${text_reset} URL" + +# Create remote URL +remote_url="" +if [[ "$origin_url" =~ ^(.*)([:/])([^/]*)/([^/]*)$ ]]; then + remote_url="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${remote_user}/${BASH_REMATCH[4]}" +else + error "Failed to create remote URL for ${text_bold}${remote_user}${text_reset} from ${text_bold}${origin_url}${text_reset}" +fi + +# Add prefix to remote name +remote_name="origin-${remote_name}" + +# Add remote +echo "Adding remote ${text_bold}${remote_name}${text_reset} with URL ${text_bold}${remote_url}${text_reset}" +if ! git remote add "$remote_name" "$remote_url"; then + error "Failed to add remote ${text_bold}${remote_name}${text_reset}" +fi + +# Fetch +echo "Fetching from remote ${text_bold}${remote_name}${text_reset}" +if ! git fetch "$remote_name"; then + git remote rm "$remote_name" + error "Failed to fetch from ${text_bold}${remote_name}${text_reset}, remote was removed" +fi