From f46176a418cfde3747045cdc71e600a8d19580c1 Mon Sep 17 00:00:00 2001
From: David Svantesson <david.svantesson@qrtech.se>
Date: Sat, 14 Dec 2019 01:53:32 +0100
Subject: [PATCH] Fix PR/issue redirects when having external tracker (#9339)

* Make sure only issues are redirected to external tracker

* Ensure correct redirects for pulls after dependency or watch.

* NewIssuePost is always issues so no need to redirect with type.
---
 routers/repo/issue.go            | 23 +++++++++++++----------
 routers/repo/issue_dependency.go |  5 ++---
 routers/repo/issue_watch.go      |  4 +---
 3 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index adafb64eb..7d11ed353 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -607,17 +607,20 @@ func commentTag(repo *models.Repository, poster *models.User, issue *models.Issu
 
 // ViewIssue render issue view page
 func ViewIssue(ctx *context.Context) {
-	extIssueUnit, err := ctx.Repo.Repository.GetUnit(models.UnitTypeExternalTracker)
-	if err == nil && extIssueUnit != nil {
-		if extIssueUnit.ExternalTrackerConfig().ExternalTrackerStyle == markup.IssueNameStyleNumeric || extIssueUnit.ExternalTrackerConfig().ExternalTrackerStyle == "" {
-			metas := ctx.Repo.Repository.ComposeMetas()
-			metas["index"] = ctx.Params(":index")
-			ctx.Redirect(com.Expand(extIssueUnit.ExternalTrackerConfig().ExternalTrackerFormat, metas))
+	if ctx.Params(":type") == "issues" {
+		// If issue was requested we check if repo has external tracker and redirect
+		extIssueUnit, err := ctx.Repo.Repository.GetUnit(models.UnitTypeExternalTracker)
+		if err == nil && extIssueUnit != nil {
+			if extIssueUnit.ExternalTrackerConfig().ExternalTrackerStyle == markup.IssueNameStyleNumeric || extIssueUnit.ExternalTrackerConfig().ExternalTrackerStyle == "" {
+				metas := ctx.Repo.Repository.ComposeMetas()
+				metas["index"] = ctx.Params(":index")
+				ctx.Redirect(com.Expand(extIssueUnit.ExternalTrackerConfig().ExternalTrackerFormat, metas))
+				return
+			}
+		} else if err != nil && !models.IsErrUnitTypeNotExist(err) {
+			ctx.ServerError("GetUnit", err)
 			return
 		}
-	} else if err != nil && !models.IsErrUnitTypeNotExist(err) {
-		ctx.ServerError("GetUnit", err)
-		return
 	}
 
 	issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
@@ -1255,7 +1258,7 @@ func NewComment(ctx *context.Context, form auth.CreateCommentForm) {
 
 	if ctx.HasError() {
 		ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
-		ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issue.Index))
+		ctx.Redirect(issue.HTMLURL())
 		return
 	}
 
diff --git a/routers/repo/issue_dependency.go b/routers/repo/issue_dependency.go
index 6b11f0cdf..00d7d85ce 100644
--- a/routers/repo/issue_dependency.go
+++ b/routers/repo/issue_dependency.go
@@ -5,7 +5,6 @@
 package repo
 
 import (
-	"fmt"
 	"net/http"
 
 	"code.gitea.io/gitea/models"
@@ -31,7 +30,7 @@ func AddDependency(ctx *context.Context) {
 	}
 
 	// Redirect
-	defer ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issueIndex), http.StatusSeeOther)
+	defer ctx.Redirect(issue.HTMLURL(), http.StatusSeeOther)
 
 	// Dependency
 	dep, err := models.GetIssueByID(depID)
@@ -85,7 +84,7 @@ func RemoveDependency(ctx *context.Context) {
 	}
 
 	// Redirect
-	ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issueIndex), http.StatusSeeOther)
+	ctx.Redirect(issue.HTMLURL(), http.StatusSeeOther)
 
 	// Dependency Type
 	depTypeStr := ctx.Req.PostForm.Get("dependencyType")
diff --git a/routers/repo/issue_watch.go b/routers/repo/issue_watch.go
index eae663495..07671af13 100644
--- a/routers/repo/issue_watch.go
+++ b/routers/repo/issue_watch.go
@@ -5,7 +5,6 @@
 package repo
 
 import (
-	"fmt"
 	"net/http"
 	"strconv"
 
@@ -54,6 +53,5 @@ func IssueWatch(ctx *context.Context) {
 		return
 	}
 
-	url := fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issue.Index)
-	ctx.Redirect(url, http.StatusSeeOther)
+	ctx.Redirect(issue.HTMLURL(), http.StatusSeeOther)
 }