From 4514de9ff58a777c043804e09d6902417795bb82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Tue, 14 Jun 2022 00:34:33 +0200 Subject: [PATCH 01/14] Add release script --- release.sh | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100755 release.sh diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..a645c02 --- /dev/null +++ b/release.sh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash + +set -o nounset +set -o errexit +set -o pipefail + +usage() { + printf '%s\n' "usage: $0 (master|minor|patch)" >&2 +} + +if (( $# != 1 )) ; then + usage + exit 1 +fi + +current_version="$(grep '^version \?=' Cargo.toml | head -1 | cut -d '=' -f 2 | tr -d " '"'"')" + +major="$(printf '%s' "${current_version}" | grep -oP '^\d+')" +minor="$(printf '%s' "${current_version}" | grep -oP '\.\d+\.' | tr -d '.')" +patch="$(printf '%s' "${current_version}" | grep -oP '\d+$' | tr -d '.')" + +case "$1" in + major) + (( major++ )) || true + minor=0 + patch=0 + ;; + minor) + (( minor++ )) || true + patch=0 + ;; + patch) + (( patch++ )) || true + ;; + *) + usage + exit 1 + ;; +esac + +new_version="${major}.${minor}.${patch}" + +if ! [[ "${new_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then + printf '%s\n' 'Version has to a complete semver' >&2 + exit 1 +fi + +if [[ $(git rev-parse --abbrev-ref HEAD) != "develop" ]] ; then + printf '%s\n' 'You need to be on develop' >&2 + exit 1 +fi + +if [[ -n "$(git status --porcelain)" ]] ; then + printf '%s\n' 'There are uncommitted changes' >&2 + exit 1 +fi + +if git tag --list "v${new_version}" | grep -q . ; then + printf 'Tag %s already exists\n' "v${new_version}" >&2 + exit 1 +fi + +for remote in $(git remote) ; do + if git ls-remote --tags "${remote}" | grep -q "refs/tags/v${new_version}$" ; then + printf 'Tag %s already exists on %s' "v${new_version}" "${remote}" >&2 + exit 1 + fi +done + +git fetch --all + +for remote in $(git remote) ; do + for branch in master develop ; do + if ! git diff --quiet "${remote}/${branch}..${branch}" ; then + printf 'Remote branch %s/%s not up to date, synchronize first!\n' "${remote}" "${branch}" >&2 + exit 1 + fi + done +done + +if ! git merge-base --is-ancestor master develop ; then + printf '%s\n' 'Develop is not a straight descendant of master, rebase!' >&2 + exit 1 +fi + +if (( $(git log --oneline master..develop | wc -l) == 0 )) ; then + printf '%s\n' 'No changes between master and develop?' >&2 + exit 1 +fi + +just update-dependencies + +just check + +sed -i "0,/^version/{s/^version.*$/version = \"${new_version}\"/}" Cargo.toml + +cargo update --package git-repo-manager --precise "${new_version}" + +diff="$(git diff --numstat)" +if (( $(printf '%s\n' "${diff}" | wc -l) != 2 )) ; then + printf '%s\n' 'Weird changes detected, bailing' >&2 + exit 1 +fi + +if ! printf '%s\n' "${diff}" | grep -Pq '^1\s+1\s+Cargo.lock$' ; then + printf '%s\n' 'Weird changes detected, bailing' >&2 + exit 1 +fi + +if ! printf '%s\n' "${diff}" | grep -Pq '^1\s+1\s+Cargo.toml$' ; then + printf '%s\n' 'Weird changes detected, bailing' >&2 + exit 1 +fi + +git add Cargo.lock Cargo.toml + +git commit -m "Release v${new_version}" + +git switch master 2>/dev/null || { [[ -d "../master" ]] && cd "../master" ; } || { printf '%s\n' 'Could not change to master' >&2 ; exit 1 ; } + +if [[ $(git rev-parse --abbrev-ref HEAD) != "master" ]] ; then + printf '%s\n' 'Looks like branch switching to master did not work' >&2 + exit 1 +fi + +git merge --no-ff --no-edit develop +git tag "v${new_version}" + +for remote in $(git remote) ; do + while ! git push "${remote}" "v${new_version}" master ; do + : + done +done + +git switch develop 2>/dev/null || { [[ -d "../develop" ]] && cd "../develop" ; } || { printf '%s\n' 'Could not change to develop' >&2 ; exit 1 ; } + +if [[ $(git rev-parse --abbrev-ref HEAD) != "develop" ]] ; then + printf '%s\n' 'Looks like branch switching to develop did not work' >&2 + exit 1 +fi + +git merge --ff-only master + +for remote in $(git remote) ; do + while ! git push "${remote}" develop ; do + : + done +done + +cargo publish + +printf 'Published %s successfully\n' "${new_version}" +exit 0 From aebed5639d1fd39b3f3ea96e8446da8d34aaa89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Tue, 14 Jun 2022 09:37:51 +0200 Subject: [PATCH 02/14] Add Max to contributors --- CONTRIBUTORS | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c345969..3a98579 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1 +1,2 @@ nonnominandus +Maximilian Volk From 8c0c3ad1698c57cce25f83e6b5b56d72f809ca0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 19:44:07 +0200 Subject: [PATCH 03/14] dependencies: Update clap to 3.2.5 --- Cargo.lock | 26 +++++++++++++------------- Cargo.toml | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d916426..dd675cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,16 +80,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "3.1.18" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b" +checksum = "d53da17d37dba964b9b3ecb5c5a1f193a2762c700e6829201e645b9381c99dc7" dependencies = [ "atty", "bitflags", "clap_derive", "clap_lex", "indexmap", - "lazy_static", + "once_cell", "strsim", "termcolor", "textwrap", @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.1.18" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25320346e922cffe59c0bbc5410c8d8784509efb321488971081313cb1e1a33c" +checksum = "c11d40217d16aee8508cc8e5fde8b4ff24639758608e5374e731b53f85749fb9" dependencies = [ "heck", "proc-macro-error", @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213" +checksum = "5538cd660450ebeb4234cfecf8f2284b844ffc4c50531e66d584ad5b91293613" dependencies = [ "os_str_bytes", ] @@ -410,9 +410,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" +checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a" dependencies = [ "autocfg", "hashbrown", @@ -1015,9 +1015,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942" +checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ "proc-macro2", "quote", @@ -1154,9 +1154,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-ident" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" [[package]] name = "unicode-normalization" diff --git a/Cargo.toml b/Cargo.toml index b97339c..0191081 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,7 @@ version = "=0.14.4" version = "=2.1.0" [dependencies.clap] -version = "=3.1.18" +version = "=3.2.5" features = ["derive", "cargo"] [dependencies.console] From 0b8896d11d37f086fc393fa349d49e7aade7920c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 19:44:10 +0200 Subject: [PATCH 04/14] Cargo.lock: Updating getrandom v0.2.6 -> v0.2.7 --- Cargo.lock | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dd675cc..0411f14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -321,13 +321,13 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -584,7 +584,7 @@ checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys", ] @@ -1212,12 +1212,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" From d53e28668bb02234f7baa29fdb5e8e4da1f00ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 19:44:14 +0200 Subject: [PATCH 05/14] Cargo.lock: Updating http v0.2.7 -> v0.2.8 --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0411f14..a1ddef3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -388,9 +388,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", @@ -1105,9 +1105,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" +checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" dependencies = [ "cfg-if", "log", @@ -1129,11 +1129,11 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" +checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] From d0cbc2f9851d7d6a10a306b64c415ae6129afdd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 20:38:02 +0200 Subject: [PATCH 06/14] forge: Add option to specify remote name Close #32 --- e2e_tests/test_repos_find_remote.py | 11 ++++++++++- src/config.rs | 4 ++++ src/grm/cmd.rs | 6 ++++++ src/grm/main.rs | 26 ++++++++++++++++++++++---- src/provider/mod.rs | 5 ++++- 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/e2e_tests/test_repos_find_remote.py b/e2e_tests/test_repos_find_remote.py index 0ada999..f0f37cf 100644 --- a/e2e_tests/test_repos_find_remote.py +++ b/e2e_tests/test_repos_find_remote.py @@ -248,6 +248,7 @@ def test_repos_find_remote_user_empty( @pytest.mark.parametrize("force_ssh", [True, False]) @pytest.mark.parametrize("use_alternate_endpoint", [True, False]) @pytest.mark.parametrize("use_config", [True, False]) +@pytest.mark.parametrize("override_remote_name", [True, False]) def test_repos_find_remote_user( provider, configtype, @@ -258,6 +259,7 @@ def test_repos_find_remote_user( force_ssh, use_alternate_endpoint, use_config, + override_remote_name, ): if use_config: with tempfile.NamedTemporaryFile() as config: @@ -274,6 +276,8 @@ def test_repos_find_remote_user( cfg += f"worktree = {str(worktree).lower()}\n" if force_ssh: cfg += f"force_ssh = true\n" + if override_remote_name: + cfg += f'remote_name = "otherremote"\n' if use_owner: cfg += """ [filters] @@ -310,6 +314,8 @@ def test_repos_find_remote_user( args += ["--user", "myuser1"] if force_ssh: args += ["--force-ssh"] + if override_remote_name: + args += ["--remote-name", "otherremote"] if not worktree_default: args += ["--worktree", str(worktree).lower()] if use_alternate_endpoint: @@ -350,7 +356,10 @@ def test_repos_find_remote_user( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + if override_remote_name: + assert repo["remotes"][0]["name"] == "otherremote" + else: + assert repo["remotes"][0]["name"] == provider if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] diff --git a/src/config.rs b/src/config.rs index f8e9464..2858050 100644 --- a/src/config.rs +++ b/src/config.rs @@ -53,6 +53,8 @@ pub struct ConfigProvider { pub worktree: Option, pub init_worktree: Option, + + pub remote_name: Option, } #[derive(Debug, Serialize, Deserialize)] @@ -192,6 +194,7 @@ impl Config { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, )? } RemoteProvider::Gitlab => { @@ -205,6 +208,7 @@ impl Config { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, )? } }; diff --git a/src/grm/cmd.rs b/src/grm/cmd.rs index 593474b..178f28e 100644 --- a/src/grm/cmd.rs +++ b/src/grm/cmd.rs @@ -103,6 +103,9 @@ pub struct FindRemoteArgs { #[clap(arg_enum, short, long, help = "Remote provider to use")] pub provider: RemoteProvider, + #[clap(short, long, help = "Name of the remote to use")] + pub remote_name: Option, + #[clap( multiple_occurrences = true, name = "user", @@ -189,6 +192,9 @@ pub struct SyncRemoteArgs { #[clap(arg_enum, short, long, help = "Remote provider to use")] pub provider: RemoteProvider, + #[clap(short, long, help = "Name of the remote to use")] + pub remote_name: Option, + #[clap( multiple_occurrences = true, name = "user", diff --git a/src/grm/main.rs b/src/grm/main.rs index ebf9b1f..6c7ab86 100644 --- a/src/grm/main.rs +++ b/src/grm/main.rs @@ -64,7 +64,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } cmd::RemoteProvider::Gitlab => { match provider::Gitlab::new(filter, token, args.api_url) { @@ -74,7 +78,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } }; @@ -280,6 +288,7 @@ fn main() { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, ) { Ok(provider) => provider, Err(error) => { @@ -299,6 +308,7 @@ fn main() { .get_repos( config.worktree.unwrap_or(false), config.force_ssh.unwrap_or(false), + config.remote_name, ) { Ok(provider) => provider, Err(error) => { @@ -382,7 +392,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } cmd::RemoteProvider::Gitlab => { match provider::Gitlab::new(filter, token, args.api_url) { @@ -392,7 +406,11 @@ fn main() { process::exit(1); } } - .get_repos(worktree, args.force_ssh) + .get_repos( + worktree, + args.force_ssh, + args.remote_name, + ) } }; diff --git a/src/provider/mod.rs b/src/provider/mod.rs index da72500..cbf4007 100644 --- a/src/provider/mod.rs +++ b/src/provider/mod.rs @@ -213,6 +213,7 @@ pub trait Provider { &self, worktree_setup: bool, force_ssh: bool, + remote_name: Option, ) -> Result, Vec>, String> { let mut repos = vec![]; @@ -292,10 +293,12 @@ pub trait Provider { let mut ret: HashMap, Vec> = HashMap::new(); + let remote_name = remote_name.unwrap_or_else(|| self.name().to_string()); + for repo in repos { let namespace = repo.namespace(); - let mut repo = repo.into_repo_config(self.name(), worktree_setup, force_ssh); + let mut repo = repo.into_repo_config(&remote_name, worktree_setup, force_ssh); // Namespace is already part of the hashmap key. I'm not too happy // about the data exchange format here. From 4b79b6dd1d005d85e045b852760810ab3b5ba28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 20:38:55 +0200 Subject: [PATCH 07/14] just: Update targets for static builds --- Justfile | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Justfile b/Justfile index 670a285..6422c1d 100644 --- a/Justfile +++ b/Justfile @@ -1,6 +1,6 @@ set positional-arguments -target := "x86_64-unknown-linux-musl" +static_target := "x86_64-unknown-linux-musl" check: fmt-check lint test cargo check @@ -22,25 +22,28 @@ lint-fix: cargo clippy --no-deps --fix release: - cargo build --release --target {{target}} + cargo build --release + +release-static: + cargo build --release --target {{static_target}} --features=static-build test-binary: env \ GITHUB_API_BASEURL=http://rest:5000/github \ GITLAB_API_BASEURL=http://rest:5000/gitlab \ - cargo build --target {{target}} --profile e2e-tests --features=static-build + cargo build --target {{static_target}} --profile e2e-tests --features=static-build install: cargo install --path . install-static: - cargo install --target {{target}} --features=static-build --path . + cargo install --target {{static_target}} --features=static-build --path . build: cargo build build-static: - cargo build --target {{target}} --features=static-build + cargo build --target {{static_target}} --features=static-build test: test-unit test-integration test-e2e @@ -56,7 +59,7 @@ test-e2e +tests=".": test-binary && docker-compose build \ && docker-compose run \ --rm \ - -v $PWD/../target/{{target}}/e2e-tests/grm:/grm \ + -v $PWD/../target/{{static_target}}/e2e-tests/grm:/grm \ pytest \ "GRM_BINARY=/grm ALTERNATE_DOMAIN=alternate-rest python3 -m pytest -p no:cacheprovider --color=yes "$@"" \ && docker-compose rm --stop -f From 9fc34e69896abfc9ed01a15551fdde9ab5c14c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 20:39:01 +0200 Subject: [PATCH 08/14] just: Add clean target --- Justfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Justfile b/Justfile index 6422c1d..149817f 100644 --- a/Justfile +++ b/Justfile @@ -7,6 +7,10 @@ check: fmt-check lint test cargo fmt --check cargo clippy --no-deps -- -Dwarnings +clean: + cargo clean + git clean -f -d -X + fmt: cargo fmt git ls-files | grep '\.py$' | xargs black From 27ef86c1b4d1c420719a71ec94c945b114aab063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Wed, 15 Jun 2022 20:49:13 +0200 Subject: [PATCH 09/14] forge: Use "origin" as the default remote name Close #33 --- e2e_tests/test_repos_find_remote.py | 22 +++++++++++----------- src/provider/github.rs | 5 ----- src/provider/gitlab.rs | 5 ----- src/provider/mod.rs | 5 +++-- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/e2e_tests/test_repos_find_remote.py b/e2e_tests/test_repos_find_remote.py index f0f37cf..77023be 100644 --- a/e2e_tests/test_repos_find_remote.py +++ b/e2e_tests/test_repos_find_remote.py @@ -359,7 +359,7 @@ def test_repos_find_remote_user( if override_remote_name: assert repo["remotes"][0]["name"] == "otherremote" else: - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] @@ -544,14 +544,14 @@ def test_repos_find_remote_group( assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 if force_ssh or i == 1: - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" assert ( repo["remotes"][0]["url"] == f"ssh://git@example.com/mygroup1/myproject{i}.git" ) assert repo["remotes"][0]["type"] == "ssh" else: - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" assert ( repo["remotes"][0]["url"] == f"https://example.com/mygroup1/myproject{i}.git" @@ -668,7 +668,7 @@ def test_repos_find_remote_user_and_group( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] @@ -693,7 +693,7 @@ def test_repos_find_remote_user_and_group( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] @@ -823,7 +823,7 @@ def test_repos_find_remote_owner( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] @@ -846,7 +846,7 @@ def test_repos_find_remote_owner( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] @@ -870,7 +870,7 @@ def test_repos_find_remote_owner( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh: assert ( repo["remotes"][0]["url"] == f"ssh://git@example.com/myuser2/myproject3.git" @@ -899,7 +899,7 @@ def test_repos_find_remote_owner( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh or i == 1: assert ( repo["remotes"][0]["url"] @@ -919,7 +919,7 @@ def test_repos_find_remote_owner( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh: assert ( repo["remotes"][0]["url"] @@ -945,7 +945,7 @@ def test_repos_find_remote_owner( assert repo["worktree_setup"] is (not worktree_default and worktree) assert isinstance(repo["remotes"], list) assert len(repo["remotes"]) == 1 - assert repo["remotes"][0]["name"] == provider + assert repo["remotes"][0]["name"] == "origin" if force_ssh: assert ( repo["remotes"][0]["url"] diff --git a/src/provider/github.rs b/src/provider/github.rs index 76b6b53..e495237 100644 --- a/src/provider/github.rs +++ b/src/provider/github.rs @@ -8,7 +8,6 @@ use super::JsonError; use super::Project; use super::Provider; -const PROVIDER_NAME: &str = "github"; const ACCEPT_HEADER_JSON: &str = "application/vnd.github.v3+json"; const GITHUB_API_BASEURL: &str = option_env!("GITHUB_API_BASEURL").unwrap_or("https://api.github.com"); @@ -88,10 +87,6 @@ impl Provider for Github { }) } - fn name(&self) -> &str { - PROVIDER_NAME - } - fn filter(&self) -> &Filter { &self.filter } diff --git a/src/provider/gitlab.rs b/src/provider/gitlab.rs index 6acff35..b1a08b8 100644 --- a/src/provider/gitlab.rs +++ b/src/provider/gitlab.rs @@ -8,7 +8,6 @@ use super::JsonError; use super::Project; use super::Provider; -const PROVIDER_NAME: &str = "gitlab"; const ACCEPT_HEADER_JSON: &str = "application/json"; const GITLAB_API_BASEURL: &str = option_env!("GITLAB_API_BASEURL").unwrap_or("https://gitlab.com"); @@ -105,10 +104,6 @@ impl Provider for Gitlab { }) } - fn name(&self) -> &str { - PROVIDER_NAME - } - fn filter(&self) -> &Filter { &self.filter } diff --git a/src/provider/mod.rs b/src/provider/mod.rs index cbf4007..c96557f 100644 --- a/src/provider/mod.rs +++ b/src/provider/mod.rs @@ -14,6 +14,8 @@ use super::repo; use std::collections::HashMap; +const DEFAULT_REMOTE_NAME: &str = "origin"; + #[derive(Debug, Deserialize, Serialize, clap::ArgEnum, Clone)] pub enum RemoteProvider { #[serde(alias = "github", alias = "GitHub")] @@ -122,7 +124,6 @@ pub trait Provider { where Self: Sized; - fn name(&self) -> &str; fn filter(&self) -> &Filter; fn secret_token(&self) -> &auth::AuthToken; fn auth_header_key() -> &'static str; @@ -293,7 +294,7 @@ pub trait Provider { let mut ret: HashMap, Vec> = HashMap::new(); - let remote_name = remote_name.unwrap_or_else(|| self.name().to_string()); + let remote_name = remote_name.unwrap_or_else(|| DEFAULT_REMOTE_NAME.to_string()); for repo in repos { let namespace = repo.namespace(); From 58fdcfba9f737617ff994967f64063b72b407673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Thu, 16 Jun 2022 00:32:16 +0200 Subject: [PATCH 10/14] Enable linting for shell scripts --- Justfile | 1 + release.sh | 17 +++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Justfile b/Justfile index 149817f..4e5c342 100644 --- a/Justfile +++ b/Justfile @@ -21,6 +21,7 @@ fmt-check: lint: cargo clippy --no-deps -- -Dwarnings + find -name '*.sh' | xargs -L 1 shellcheck --norc lint-fix: cargo clippy --no-deps --fix diff --git a/release.sh b/release.sh index a645c02..12fb3d3 100755 --- a/release.sh +++ b/release.sh @@ -45,12 +45,14 @@ if ! [[ "${new_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then exit 1 fi -if [[ $(git rev-parse --abbrev-ref HEAD) != "develop" ]] ; then +current_branch="$(git rev-parse --abbrev-ref HEAD)" +if [[ "${current_branch}" != "develop" ]] ; then printf '%s\n' 'You need to be on develop' >&2 exit 1 fi -if [[ -n "$(git status --porcelain)" ]] ; then +gitstatus="$(git status --porcelain)" +if [[ -n "${gitstatus}" ]] ; then printf '%s\n' 'There are uncommitted changes' >&2 exit 1 fi @@ -83,7 +85,8 @@ if ! git merge-base --is-ancestor master develop ; then exit 1 fi -if (( $(git log --oneline master..develop | wc -l) == 0 )) ; then +changes="$(git log --oneline master..develop | wc -l)" +if (( changes == 0 )) ; then printf '%s\n' 'No changes between master and develop?' >&2 exit 1 fi @@ -97,7 +100,7 @@ sed -i "0,/^version/{s/^version.*$/version = \"${new_version}\"/}" Cargo.toml cargo update --package git-repo-manager --precise "${new_version}" diff="$(git diff --numstat)" -if (( $(printf '%s\n' "${diff}" | wc -l) != 2 )) ; then +if (( $(printf '%s\n' "${diff}" | wc -l || true) != 2 )) ; then printf '%s\n' 'Weird changes detected, bailing' >&2 exit 1 fi @@ -118,7 +121,8 @@ git commit -m "Release v${new_version}" git switch master 2>/dev/null || { [[ -d "../master" ]] && cd "../master" ; } || { printf '%s\n' 'Could not change to master' >&2 ; exit 1 ; } -if [[ $(git rev-parse --abbrev-ref HEAD) != "master" ]] ; then +current_branch="$(git rev-parse --abbrev-ref HEAD)" +if [[ "${current_branch}" != "master" ]] ; then printf '%s\n' 'Looks like branch switching to master did not work' >&2 exit 1 fi @@ -134,7 +138,8 @@ done git switch develop 2>/dev/null || { [[ -d "../develop" ]] && cd "../develop" ; } || { printf '%s\n' 'Could not change to develop' >&2 ; exit 1 ; } -if [[ $(git rev-parse --abbrev-ref HEAD) != "develop" ]] ; then +current_branch="$(git rev-parse --abbrev-ref HEAD)" +if [[ "${current_branch}" != "develop" ]] ; then printf '%s\n' 'Looks like branch switching to develop did not work' >&2 exit 1 fi From df8e69bce2c7bf0c423e786f04204d197d9559cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Thu, 16 Jun 2022 00:36:45 +0200 Subject: [PATCH 11/14] Enable autoformatting for shell scripts --- CONTRIBUTING.md | 3 +- Justfile | 4 ++- release.sh | 96 ++++++++++++++++++++++++++----------------------- 3 files changed, 56 insertions(+), 47 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7464058..c0fb0f6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,8 @@ If you want, add yourself to the `CONTRIBUTORS` file in your pull request. For Rust, just use `cargo fmt`. For Python, use [black](https://github.com/psf/black). I'd rather not spend any effort in -configuring the formatters (not possible for black anyway). +configuring the formatters (not possible for black anyway). For shell scripts, +use [`shfmt`](https://github.com/mvdan/sh). ## Tooling diff --git a/Justfile b/Justfile index 4e5c342..52a8cb8 100644 --- a/Justfile +++ b/Justfile @@ -14,14 +14,16 @@ clean: fmt: cargo fmt git ls-files | grep '\.py$' | xargs black + git ls-files | grep '\.sh$' | xargs -L 1 shfmt --indent 4 --write fmt-check: cargo fmt --check git ls-files | grep '\.py$' | xargs black --check + git ls-files | grep '\.sh$' | xargs -L 1 shfmt --indent 4 --diff lint: cargo clippy --no-deps -- -Dwarnings - find -name '*.sh' | xargs -L 1 shellcheck --norc + git ls-files | grep '\.sh$' | xargs -L 1 shellcheck --norc lint-fix: cargo clippy --no-deps --fix diff --git a/release.sh b/release.sh index 12fb3d3..67a01a3 100755 --- a/release.sh +++ b/release.sh @@ -8,7 +8,7 @@ usage() { printf '%s\n' "usage: $0 (master|minor|patch)" >&2 } -if (( $# != 1 )) ; then +if (($# != 1)); then usage exit 1 fi @@ -20,50 +20,50 @@ minor="$(printf '%s' "${current_version}" | grep -oP '\.\d+\.' | tr -d '.')" patch="$(printf '%s' "${current_version}" | grep -oP '\d+$' | tr -d '.')" case "$1" in - major) - (( major++ )) || true - minor=0 - patch=0 - ;; - minor) - (( minor++ )) || true - patch=0 - ;; - patch) - (( patch++ )) || true - ;; - *) - usage - exit 1 - ;; +major) + ((major++)) || true + minor=0 + patch=0 + ;; +minor) + ((minor++)) || true + patch=0 + ;; +patch) + ((patch++)) || true + ;; +*) + usage + exit 1 + ;; esac new_version="${major}.${minor}.${patch}" -if ! [[ "${new_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then +if ! [[ "${new_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then printf '%s\n' 'Version has to a complete semver' >&2 exit 1 fi current_branch="$(git rev-parse --abbrev-ref HEAD)" -if [[ "${current_branch}" != "develop" ]] ; then +if [[ "${current_branch}" != "develop" ]]; then printf '%s\n' 'You need to be on develop' >&2 exit 1 fi gitstatus="$(git status --porcelain)" -if [[ -n "${gitstatus}" ]] ; then +if [[ -n "${gitstatus}" ]]; then printf '%s\n' 'There are uncommitted changes' >&2 exit 1 fi -if git tag --list "v${new_version}" | grep -q . ; then +if git tag --list "v${new_version}" | grep -q .; then printf 'Tag %s already exists\n' "v${new_version}" >&2 exit 1 fi -for remote in $(git remote) ; do - if git ls-remote --tags "${remote}" | grep -q "refs/tags/v${new_version}$" ; then +for remote in $(git remote); do + if git ls-remote --tags "${remote}" | grep -q "refs/tags/v${new_version}$"; then printf 'Tag %s already exists on %s' "v${new_version}" "${remote}" >&2 exit 1 fi @@ -71,22 +71,22 @@ done git fetch --all -for remote in $(git remote) ; do - for branch in master develop ; do - if ! git diff --quiet "${remote}/${branch}..${branch}" ; then +for remote in $(git remote); do + for branch in master develop; do + if ! git diff --quiet "${remote}/${branch}..${branch}"; then printf 'Remote branch %s/%s not up to date, synchronize first!\n' "${remote}" "${branch}" >&2 exit 1 fi done done -if ! git merge-base --is-ancestor master develop ; then +if ! git merge-base --is-ancestor master develop; then printf '%s\n' 'Develop is not a straight descendant of master, rebase!' >&2 exit 1 fi changes="$(git log --oneline master..develop | wc -l)" -if (( changes == 0 )) ; then +if ((changes == 0)); then printf '%s\n' 'No changes between master and develop?' >&2 exit 1 fi @@ -100,29 +100,32 @@ sed -i "0,/^version/{s/^version.*$/version = \"${new_version}\"/}" Cargo.toml cargo update --package git-repo-manager --precise "${new_version}" diff="$(git diff --numstat)" -if (( $(printf '%s\n' "${diff}" | wc -l || true) != 2 )) ; then - printf '%s\n' 'Weird changes detected, bailing' >&2 - exit 1 +if (($(printf '%s\n' "${diff}" | wc -l || true) != 2)); then + printf '%s\n' 'Weird changes detected, bailing' >&2 + exit 1 fi -if ! printf '%s\n' "${diff}" | grep -Pq '^1\s+1\s+Cargo.lock$' ; then - printf '%s\n' 'Weird changes detected, bailing' >&2 - exit 1 +if ! printf '%s\n' "${diff}" | grep -Pq '^1\s+1\s+Cargo.lock$'; then + printf '%s\n' 'Weird changes detected, bailing' >&2 + exit 1 fi -if ! printf '%s\n' "${diff}" | grep -Pq '^1\s+1\s+Cargo.toml$' ; then - printf '%s\n' 'Weird changes detected, bailing' >&2 - exit 1 +if ! printf '%s\n' "${diff}" | grep -Pq '^1\s+1\s+Cargo.toml$'; then + printf '%s\n' 'Weird changes detected, bailing' >&2 + exit 1 fi git add Cargo.lock Cargo.toml git commit -m "Release v${new_version}" -git switch master 2>/dev/null || { [[ -d "../master" ]] && cd "../master" ; } || { printf '%s\n' 'Could not change to master' >&2 ; exit 1 ; } +git switch master 2>/dev/null || { [[ -d "../master" ]] && cd "../master"; } || { + printf '%s\n' 'Could not change to master' >&2 + exit 1 +} current_branch="$(git rev-parse --abbrev-ref HEAD)" -if [[ "${current_branch}" != "master" ]] ; then +if [[ "${current_branch}" != "master" ]]; then printf '%s\n' 'Looks like branch switching to master did not work' >&2 exit 1 fi @@ -130,24 +133,27 @@ fi git merge --no-ff --no-edit develop git tag "v${new_version}" -for remote in $(git remote) ; do - while ! git push "${remote}" "v${new_version}" master ; do +for remote in $(git remote); do + while ! git push "${remote}" "v${new_version}" master; do : done done -git switch develop 2>/dev/null || { [[ -d "../develop" ]] && cd "../develop" ; } || { printf '%s\n' 'Could not change to develop' >&2 ; exit 1 ; } +git switch develop 2>/dev/null || { [[ -d "../develop" ]] && cd "../develop"; } || { + printf '%s\n' 'Could not change to develop' >&2 + exit 1 +} current_branch="$(git rev-parse --abbrev-ref HEAD)" -if [[ "${current_branch}" != "develop" ]] ; then +if [[ "${current_branch}" != "develop" ]]; then printf '%s\n' 'Looks like branch switching to develop did not work' >&2 exit 1 fi git merge --ff-only master -for remote in $(git remote) ; do - while ! git push "${remote}" develop ; do +for remote in $(git remote); do + while ! git push "${remote}" develop; do : done done From 33a5a1a2624c127f15d429767c7fe9b4359a9209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Thu, 16 Jun 2022 00:39:43 +0200 Subject: [PATCH 12/14] Add short doc snipper about "just check" --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c0fb0f6..06fa527 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,6 +42,9 @@ When contributing, consider whether it makes sense to add tests which could prevent regressions in the future. When fixing bugs, it makes sense to add tests that expose the wrong behaviour beforehand. +To also ensure proper formatting and that the linter is happy, use `just check`. +If that succeeds, your code is most likely fine to push! + ## Documentation The documentation lives in `docs` and uses From c21fb5813b4c9022608e765b024d23d9d6949ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Thu, 16 Jun 2022 00:39:57 +0200 Subject: [PATCH 13/14] just: Remove redunant commands from check target --- Justfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Justfile b/Justfile index 52a8cb8..d5071da 100644 --- a/Justfile +++ b/Justfile @@ -4,8 +4,6 @@ static_target := "x86_64-unknown-linux-musl" check: fmt-check lint test cargo check - cargo fmt --check - cargo clippy --no-deps -- -Dwarnings clean: cargo clean From 58db521b5bcc023d93c83732d24a89e52a0b9590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20K=C3=B6rber?= Date: Thu, 16 Jun 2022 00:55:13 +0200 Subject: [PATCH 14/14] Release v0.7.3 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1ddef3..33b7ec8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -332,7 +332,7 @@ dependencies = [ [[package]] name = "git-repo-manager" -version = "0.7.2" +version = "0.7.3" dependencies = [ "clap", "comfy-table", diff --git a/Cargo.toml b/Cargo.toml index 0191081..86e463e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "git-repo-manager" -version = "0.7.2" +version = "0.7.3" edition = "2021" authors = [