From 5b4b64666880cfcb28b5b0611c8063d39c272780 Mon Sep 17 00:00:00 2001
From: Markus Schulz <msc@onesty-tech.de>
Date: Fri, 6 Jan 2023 15:50:54 +0100
Subject: [PATCH] feat(git): allow to install git-hook functions to local
 repositories (#19685)

---
 lib/util/git/index.spec.ts | 26 ++++++++++++++++++++++++++
 lib/util/git/index.ts      | 11 +++++++++++
 2 files changed, 37 insertions(+)

diff --git a/lib/util/git/index.spec.ts b/lib/util/git/index.spec.ts
index 459e4b9944..7f55240fa3 100644
--- a/lib/util/git/index.spec.ts
+++ b/lib/util/git/index.spec.ts
@@ -1056,4 +1056,30 @@ describe('util/git/index', () => {
       expect(sha).toBe(git.getBranchCommit(defaultBranch));
     });
   });
+
+  describe('installHook()', () => {
+    it('installHook()', async () => {
+      //git.getCommitMessages() only returns the first line (i.e. subject) of each msg
+      await git.installHook(
+        'commit-msg',
+        '#!/bin/sh\necho "APPENDED FROM COMMIT-MSG HOOK" >> $1;'
+      );
+      const files: FileChange[] = [
+        {
+          type: 'addition',
+          path: 'some-new-file',
+          contents: 'some new-contents',
+        },
+      ];
+      setNoVerify(['push']);
+      await git.commitFiles({
+        branchName: 'renovate/something',
+        files,
+        message: 'Orig-commit-msg',
+      });
+
+      const messages = await git.getCommitMessages();
+      expect(messages[0]).toBe('Orig-commit-msg APPENDED FROM COMMIT-MSG HOOK');
+    });
+  });
 });
diff --git a/lib/util/git/index.ts b/lib/util/git/index.ts
index 4698779d97..95fb7c1080 100644
--- a/lib/util/git/index.ts
+++ b/lib/util/git/index.ts
@@ -249,6 +249,17 @@ export async function initRepo(args: StorageConfig): Promise<void> {
   await fetchBranchCommits();
 }
 
+export async function installHook(
+  name: string,
+  hookSource: string
+): Promise<void> {
+  await syncGit();
+  const localDir = GlobalConfig.get('localDir')!;
+  const gitHooks = upath.join(localDir, '.git/hooks');
+  await fs.writeFile(`${gitHooks}/${name}`, hookSource);
+  await fs.chmod(`${gitHooks}/${name}`, 0o500);
+}
+
 async function resetToBranch(branchName: string): Promise<void> {
   logger.debug(`resetToBranch(${branchName})`);
   await git.raw(['reset', '--hard']);
-- 
GitLab