From 4df1a240965f6d3f4e3eed2bd4bddceeb9182614 Mon Sep 17 00:00:00 2001
From: Ethan Koenig <etk39@cornell.edu>
Date: Sat, 17 Jun 2017 23:38:24 -0400
Subject: [PATCH] Let not-logged-in users view releases (#1999)

---
 integrations/release_test.go | 8 ++++++++
 routers/repo/release.go      | 5 ++++-
 routers/routes/routes.go     | 8 +++++---
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/integrations/release_test.go b/integrations/release_test.go
index ce33ad61d9..f097531a35 100644
--- a/integrations/release_test.go
+++ b/integrations/release_test.go
@@ -19,3 +19,11 @@ func TestViewReleases(t *testing.T) {
 	resp := session.MakeRequest(t, req)
 	assert.EqualValues(t, http.StatusOK, resp.HeaderCode)
 }
+
+func TestViewReleasesNoLogin(t *testing.T) {
+	prepareTestEnv(t)
+
+	req := NewRequest(t, "GET", "/user2/repo1/releases")
+	resp := MakeRequest(req)
+	assert.EqualValues(t, http.StatusOK, resp.HeaderCode)
+}
diff --git a/routers/repo/release.go b/routers/repo/release.go
index 70a310cc13..093fec539a 100644
--- a/routers/repo/release.go
+++ b/routers/repo/release.go
@@ -79,7 +79,10 @@ func Releases(ctx *context.Context) {
 
 	// Temporary cache commits count of used branches to speed up.
 	countCache := make(map[string]int64)
-	cacheUsers := map[int64]*models.User{ctx.User.ID: ctx.User}
+	cacheUsers := make(map[int64]*models.User)
+	if ctx.User != nil {
+		cacheUsers[ctx.User.ID] = ctx.User
+	}
 	var ok bool
 
 	releasesToDisplay := make([]*models.Release, 0, len(releases))
diff --git a/routers/routes/routes.go b/routers/routes/routes.go
index c45cfd0e0c..c2f29613b4 100644
--- a/routers/routes/routes.go
+++ b/routers/routes/routes.go
@@ -529,14 +529,16 @@ func RegisterRoutes(m *macaron.Macaron) {
 	m.Group("/:username/:reponame", func() {
 		m.Group("/releases", func() {
 			m.Get("/", repo.MustBeNotBare, repo.Releases)
+		}, repo.MustBeNotBare, context.RepoRef())
+		m.Group("/releases", func() {
 			m.Get("/new", repo.NewRelease)
 			m.Post("/new", bindIgnErr(auth.NewReleaseForm{}), repo.NewReleasePost)
 			m.Post("/delete", repo.DeleteRelease)
-		}, repo.MustBeNotBare, reqRepoWriter, context.RepoRef())
+		}, reqSignIn, repo.MustBeNotBare, reqRepoWriter, context.RepoRef())
 		m.Group("/releases", func() {
 			m.Get("/edit/*", repo.EditRelease)
 			m.Post("/edit/*", bindIgnErr(auth.EditReleaseForm{}), repo.EditReleasePost)
-		}, repo.MustBeNotBare, reqRepoWriter, func(ctx *context.Context) {
+		}, reqSignIn, repo.MustBeNotBare, reqRepoWriter, func(ctx *context.Context) {
 			var err error
 			ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)
 			if err != nil {
@@ -550,7 +552,7 @@ func RegisterRoutes(m *macaron.Macaron) {
 			}
 			ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 		})
-	}, reqSignIn, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits(), context.CheckUnit(models.UnitTypeReleases))
+	}, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits(), context.CheckUnit(models.UnitTypeReleases))
 
 	m.Group("/:username/:reponame", func() {
 		m.Group("", func() {