From 719fedec20010c516584d38516b941bafe1f9f03 Mon Sep 17 00:00:00 2001
From: Luke Tomlinson <luketomlinson@github.com>
Date: Tue, 30 May 2023 19:07:40 +0000
Subject: [PATCH] Use rev-list for tags

---
 dist/index.js              | 14 +++++++++++++-
 src/git-command-manager.ts | 12 ++++++++++++
 src/ref-helper.ts          |  2 +-
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/dist/index.js b/dist/index.js
index e6f5df8ff..429b1ccf8 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -722,6 +722,18 @@ class GitCommandManager {
             return output.stdout.trim();
         });
     }
+    /**
+     * Lists SHAs pointed to by a revision.
+     * @param {string} ref  For example: 'refs/heads/main' or '/refs/tags/v1'
+     * @param {number} numberOfRefs
+     * @param value
+     */
+    revList(ref, numberOfRefs) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const output = yield this.execGit(['rev-list', ref, `-${numberOfRefs}`]);
+            return output.stdout.trim();
+        });
+    }
     setEnvironmentVariable(name, value) {
         this.gitEnv[name] = value;
     }
@@ -1982,7 +1994,7 @@ function testRef(git, ref, commit) {
         // refs/tags/
         else if (upperRef.startsWith('REFS/TAGS/')) {
             const tagName = ref.substring('refs/tags/'.length);
-            return ((yield git.tagExists(tagName)) && commit === (yield git.revParse(ref)));
+            return ((yield git.tagExists(tagName)) && commit === (yield git.revList(ref, 1)));
         }
         // Unexpected
         else {
diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts
index ab07524e1..8e6b9015e 100644
--- a/src/git-command-manager.ts
+++ b/src/git-command-manager.ts
@@ -35,6 +35,7 @@ export interface IGitCommandManager {
   log1(format?: string): Promise<string>
   remoteAdd(remoteName: string, remoteUrl: string): Promise<void>
   removeEnvironmentVariable(name: string): void
+  revList(ref: string, numberOfRefs: number): Promise<string>
   revParse(ref: string): Promise<string>
   setEnvironmentVariable(name: string, value: string): void
   shaExists(sha: string): Promise<boolean>
@@ -314,6 +315,17 @@ class GitCommandManager {
     return output.stdout.trim()
   }
 
+  /**
+   * Lists SHAs pointed to by a revision.
+   * @param {string} ref  For example: 'refs/heads/main' or '/refs/tags/v1'
+   * @param {number} numberOfRefs
+   * @param value
+   */
+  async revList(ref: string, numberOfRefs: number): Promise<string> {
+    const output = await this.execGit(['rev-list', ref, `-${numberOfRefs}`])
+    return output.stdout.trim()
+  }
+
   setEnvironmentVariable(name: string, value: string): void {
     this.gitEnv[name] = value
   }
diff --git a/src/ref-helper.ts b/src/ref-helper.ts
index 1c2504986..149989aae 100644
--- a/src/ref-helper.ts
+++ b/src/ref-helper.ts
@@ -167,7 +167,7 @@ export async function testRef(
   else if (upperRef.startsWith('REFS/TAGS/')) {
     const tagName = ref.substring('refs/tags/'.length)
     return (
-      (await git.tagExists(tagName)) && commit === (await git.revParse(ref))
+      (await git.tagExists(tagName)) && commit === (await git.revList(ref, 1))
     )
   }
   // Unexpected