From b682a2c1b2d5efde24378858453903b5b89d6df8 Mon Sep 17 00:00:00 2001
From: Cirno the Strongest <1447794+CirnoT@users.noreply.github.com>
Date: Thu, 11 Jun 2020 21:42:55 +0200
Subject: [PATCH] Show exact tag for commit on diff view (#11846)

* Show exact tag for commit on diff view

* Fix comment

Co-authored-by: techknowlogick <techknowlogick@gitea.io>
---
 modules/git/commit.go           | 17 ++++++++++++++++-
 routers/repo/commit.go          |  6 ++++++
 templates/repo/commit_page.tmpl |  3 +++
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/modules/git/commit.go b/modules/git/commit.go
index a114c902dd..d6448bf26e 100644
--- a/modules/git/commit.go
+++ b/modules/git/commit.go
@@ -466,7 +466,7 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) {
 	return nil, nil
 }
 
-// GetBranchName gets the closes branch name (as returned by 'git name-rev --name-only')
+// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only')
 func (c *Commit) GetBranchName() (string, error) {
 	data, err := NewCommand("name-rev", "--exclude", "refs/tags/*", "--name-only", "--no-undefined", c.ID.String()).RunInDir(c.repo.Path)
 	if err != nil {
@@ -482,6 +482,21 @@ func (c *Commit) GetBranchName() (string, error) {
 	return strings.SplitN(strings.TrimSpace(data), "~", 2)[0], nil
 }
 
+// GetTagName gets the current tag name for given commit
+func (c *Commit) GetTagName() (string, error) {
+	data, err := NewCommand("describe", "--exact-match", "--tags", c.ID.String()).RunInDir(c.repo.Path)
+	if err != nil {
+		// handle special case where there is no tag for this commit
+		if strings.Contains(err.Error(), "no tag exactly matches") {
+			return "", nil
+		}
+
+		return "", err
+	}
+
+	return strings.TrimSpace(data), nil
+}
+
 // CommitFileStatus represents status of files in a commit.
 type CommitFileStatus struct {
 	Added    []string
diff --git a/routers/repo/commit.go b/routers/repo/commit.go
index 2b6c9cece5..004d4915df 100644
--- a/routers/repo/commit.go
+++ b/routers/repo/commit.go
@@ -311,6 +311,12 @@ func Diff(ctx *context.Context) {
 		ctx.ServerError("commit.GetBranchName", err)
 		return
 	}
+
+	ctx.Data["TagName"], err = commit.GetTagName()
+	if err != nil {
+		ctx.ServerError("commit.GetTagName", err)
+		return
+	}
 	ctx.HTML(200, tplCommitPage)
 }
 
diff --git a/templates/repo/commit_page.tmpl b/templates/repo/commit_page.tmpl
index 7a967ee55e..51f56574c1 100644
--- a/templates/repo/commit_page.tmpl
+++ b/templates/repo/commit_page.tmpl
@@ -30,6 +30,9 @@
 			{{if .BranchName}}
 				<span class="text grey">{{svg "octicon-git-branch" 16}}{{.BranchName}}</span>
 			{{end}}
+			{{if .TagName}}
+				<span class="text grey">{{svg "octicon-tag" 16}}{{.TagName}}</span>
+			{{end}}
 		</div>
 		<div class="ui attached info segment {{$class}}">
 			<div class="ui stackable grid">