From e8f0eeb575c0f46eb8af8d8c4307841ff4a20ca6 Mon Sep 17 00:00:00 2001 From: Maximillian Leonov Date: Fri, 7 Oct 2022 15:08:55 +0400 Subject: [PATCH] Add convention plugin for Git hooks setup --- app/build.gradle.kts | 3 +- build-logic/convention/build.gradle.kts | 4 ++ .../main/kotlin/GitHooksConventionPlugin.kt | 39 +++++++++++++++++++ settings.gradle.kts | 14 ------- 4 files changed, 45 insertions(+), 15 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/GitHooksConventionPlugin.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f887e7f35..0c0a2a838 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,6 +23,7 @@ plugins { id("nowinandroid.android.hilt") id("jacoco") id("nowinandroid.firebase-perf") + id("nowinandroid.git-hooks") } android { @@ -119,4 +120,4 @@ configurations.configureEach { // Temporary workaround for https://issuetracker.google.com/174733673 force("org.objenesis:objenesis:2.6") } -} \ No newline at end of file +} diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 453085807..30ce6f709 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -72,5 +72,9 @@ gradlePlugin { id = "nowinandroid.firebase-perf" implementationClass = "FirebasePerfConventionPlugin" } + register("gitHooks") { + id = "nowinandroid.git-hooks" + implementationClass = "GitHooksConventionPlugin" + } } } diff --git a/build-logic/convention/src/main/kotlin/GitHooksConventionPlugin.kt b/build-logic/convention/src/main/kotlin/GitHooksConventionPlugin.kt new file mode 100644 index 000000000..ae10ee0f3 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/GitHooksConventionPlugin.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class GitHooksConventionPlugin : Plugin { + override fun apply(target: Project) { + with(target) { + tasks.register("setupGitHooks") { + val prePushHook = file(".git/hooks/pre-push") + val commitMsgHook = file(".git/hooks/commit-msg") + val hooksInstalled = commitMsgHook.exists() + && prePushHook.exists() + && prePushHook.readBytes().contentEquals(file("tools/pre-push").readBytes()) + + if (!hooksInstalled) { + exec { + commandLine("tools/setup.sh") + workingDir = rootProject.projectDir + } + } + } + } + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 9d86e6622..686c9a493 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -54,17 +54,3 @@ include(":feature:topic") include(":lint") include(":sync:work") include(":sync:sync-test") - - -val prePushHook = file(".git/hooks/pre-push") -val commitMsgHook = file(".git/hooks/commit-msg") -val hooksInstalled = commitMsgHook.exists() - && prePushHook.exists() - && prePushHook.readBytes().contentEquals(file("tools/pre-push").readBytes()) - -if (!hooksInstalled) { - exec { - commandLine("tools/setup.sh") - workingDir = rootProject.projectDir - } -} \ No newline at end of file