From 588f3215c6c4a82c7ad9cbd2cc6a5683d0ca3cc2 Mon Sep 17 00:00:00 2001
From: Unknwon <u@gogs.io>
Date: Mon, 16 Mar 2015 04:04:27 -0400
Subject: [PATCH] #1040: dashboard no longer accessible when repo is missing

---
 cmd/serve.go               |  2 +-
 gogs.go                    |  2 +-
 models/access.go           |  6 ++++++
 models/error.go            | 31 +++++++++++++++++++++++++++++++
 models/repo.go             |  9 ++++-----
 modules/middleware/repo.go |  4 ++--
 routers/org/teams.go       |  2 +-
 routers/repo/http.go       |  2 +-
 routers/repo/repo.go       |  4 ++--
 routers/user/home.go       |  2 +-
 templates/.VERSION         |  2 +-
 11 files changed, 51 insertions(+), 15 deletions(-)
 create mode 100644 models/error.go

diff --git a/cmd/serve.go b/cmd/serve.go
index 1138317e29..484060c4c3 100644
--- a/cmd/serve.go
+++ b/cmd/serve.go
@@ -128,7 +128,7 @@ func runServ(c *cli.Context) {
 
 	repo, err := models.GetRepositoryByName(repoUser.Id, repoName)
 	if err != nil {
-		if err == models.ErrRepoNotExist {
+		if models.IsErrRepoNotExist(err) {
 			if user.Id == repoUser.Id || repoUser.IsOwnedBy(user.Id) {
 				fail("Repository does not exist", "Repository does not exist: %s/%s", repoUser.Name, repoName)
 			} else {
diff --git a/gogs.go b/gogs.go
index fd303fa28f..ab11b7e6f0 100644
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
 	"github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.5.16.0312 Beta"
+const APP_VER = "0.5.16.0316 Beta"
 
 func init() {
 	runtime.GOMAXPROCS(runtime.NumCPU())
diff --git a/models/access.go b/models/access.go
index f353c39a2f..ea2f7f7b4b 100644
--- a/models/access.go
+++ b/models/access.go
@@ -6,6 +6,8 @@ package models
 
 import (
 	"fmt"
+
+	"github.com/gogits/gogs/modules/log"
 )
 
 type AccessMode int
@@ -77,6 +79,10 @@ func (u *User) GetAccessibleRepositories() (map[*Repository]AccessMode, error) {
 	for _, access := range accesses {
 		repo, err := GetRepositoryById(access.RepoID)
 		if err != nil {
+			if IsErrRepoNotExist(err) {
+				log.Error(4, "%v", err)
+				continue
+			}
 			return nil, err
 		}
 		if err = repo.GetOwner(); err != nil {
diff --git a/models/error.go b/models/error.go
new file mode 100644
index 0000000000..6f1a366cb4
--- /dev/null
+++ b/models/error.go
@@ -0,0 +1,31 @@
+// Copyright 2015 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+	"fmt"
+)
+
+// __________                           .__  __
+// \______   \ ____ ______   ____  _____|__|/  |_  ___________ ___.__.
+//  |       _// __ \\____ \ /  _ \/  ___/  \   __\/  _ \_  __ <   |  |
+//  |    |   \  ___/|  |_> >  <_> )___ \|  ||  | (  <_> )  | \/\___  |
+//  |____|_  /\___  >   __/ \____/____  >__||__|  \____/|__|   / ____|
+//         \/     \/|__|              \/                       \/
+
+type ErrRepoNotExist struct {
+	ID   int64
+	UID  int64
+	Name string
+}
+
+func IsErrRepoNotExist(err error) bool {
+	_, ok := err.(ErrRepoNotExist)
+	return ok
+}
+
+func (err ErrRepoNotExist) Error() string {
+	return fmt.Sprintf("repository does not exist [id: %d, uid: %d, name: %s]", err.ID, err.UID, err.Name)
+}
diff --git a/models/repo.go b/models/repo.go
index 7abb793e5f..2718970f18 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -35,7 +35,6 @@ const (
 
 var (
 	ErrRepoAlreadyExist  = errors.New("Repository already exist")
-	ErrRepoNotExist      = errors.New("Repository does not exist")
 	ErrRepoFileNotExist  = errors.New("Repository file does not exist")
 	ErrRepoNameIllegal   = errors.New("Repository name contains illegal characters")
 	ErrRepoFileNotLoaded = errors.New("Repository file not loaded")
@@ -758,7 +757,7 @@ func DeleteRepository(uid, repoID int64, userName string) error {
 	if err != nil {
 		return err
 	} else if !has {
-		return ErrRepoNotExist
+		return ErrRepoNotExist{repoID, uid, ""}
 	}
 
 	// In case is a organization.
@@ -875,18 +874,18 @@ func GetRepositoryByName(uid int64, repoName string) (*Repository, error) {
 	if err != nil {
 		return nil, err
 	} else if !has {
-		return nil, ErrRepoNotExist
+		return nil, ErrRepoNotExist{0, uid, repoName}
 	}
 	return repo, err
 }
 
 func getRepositoryById(e Engine, id int64) (*Repository, error) {
-	repo := &Repository{}
+	repo := new(Repository)
 	has, err := e.Id(id).Get(repo)
 	if err != nil {
 		return nil, err
 	} else if !has {
-		return nil, ErrRepoNotExist
+		return nil, ErrRepoNotExist{id, 0, ""}
 	}
 	return repo, nil
 }
diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go
index 3350c03d22..a200d6d66f 100644
--- a/modules/middleware/repo.go
+++ b/modules/middleware/repo.go
@@ -47,7 +47,7 @@ func ApiRepoAssignment() macaron.Handler {
 		// Get repository.
 		repo, err := models.GetRepositoryByName(u.Id, repoName)
 		if err != nil {
-			if err == models.ErrRepoNotExist {
+			if models.IsErrRepoNotExist(err) {
 				ctx.Error(404)
 			} else {
 				ctx.JSON(500, &base.ApiJsonErr{"GetRepositoryByName: " + err.Error(), base.DOC_URL})
@@ -223,7 +223,7 @@ func RepoAssignment(redirect bool, args ...bool) macaron.Handler {
 		// Get repository.
 		repo, err := models.GetRepositoryByName(u.Id, repoName)
 		if err != nil {
-			if err == models.ErrRepoNotExist {
+			if models.IsErrRepoNotExist(err) {
 				ctx.Handle(404, "GetRepositoryByName", err)
 			} else {
 				ctx.Handle(500, "GetRepositoryByName", err)
diff --git a/routers/org/teams.go b/routers/org/teams.go
index 69f2734c64..40345cf7c6 100644
--- a/routers/org/teams.go
+++ b/routers/org/teams.go
@@ -124,7 +124,7 @@ func TeamsRepoAction(ctx *middleware.Context) {
 		var repo *models.Repository
 		repo, err = models.GetRepositoryByName(ctx.Org.Organization.Id, repoName)
 		if err != nil {
-			if err == models.ErrRepoNotExist {
+			if models.IsErrRepoNotExist(err) {
 				ctx.Flash.Error(ctx.Tr("org.teams.add_nonexistent_repo"))
 				ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName + "/repositories")
 				return
diff --git a/routers/repo/http.go b/routers/repo/http.go
index f5dc00b8df..9165128a36 100644
--- a/routers/repo/http.go
+++ b/routers/repo/http.go
@@ -65,7 +65,7 @@ func Http(ctx *middleware.Context) {
 
 	repo, err := models.GetRepositoryByName(repoUser.Id, reponame)
 	if err != nil {
-		if err == models.ErrRepoNotExist {
+		if models.IsErrRepoNotExist(err) {
 			ctx.Handle(404, "GetRepositoryByName", nil)
 		} else {
 			ctx.Handle(500, "GetRepositoryByName", err)
diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index 37d07c563f..a70f31e614 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -251,7 +251,7 @@ func Fork(ctx *middleware.Context) {
 	ctx.Data["Title"] = ctx.Tr("new_fork")
 
 	if _, err := getForkRepository(ctx); err != nil {
-		if err == models.ErrRepoNotExist {
+		if models.IsErrRepoNotExist(err) {
 			ctx.Redirect(setting.AppSubUrl + "/")
 		} else {
 			ctx.Handle(500, "getForkRepository", err)
@@ -275,7 +275,7 @@ func ForkPost(ctx *middleware.Context, form auth.CreateRepoForm) {
 
 	forkRepo, err := getForkRepository(ctx)
 	if err != nil {
-		if err == models.ErrRepoNotExist {
+		if models.IsErrRepoNotExist(err) {
 			ctx.Redirect(setting.AppSubUrl + "/")
 		} else {
 			ctx.Handle(500, "getForkRepository", err)
diff --git a/routers/user/home.go b/routers/user/home.go
index 0a1d9dd217..d690b3a7c5 100644
--- a/routers/user/home.go
+++ b/routers/user/home.go
@@ -354,7 +354,7 @@ func Issues(ctx *middleware.Context) {
 
 		issues[i].Repo, err = models.GetRepositoryById(issues[i].RepoId)
 		if err != nil {
-			if err == models.ErrRepoNotExist {
+			if models.IsErrRepoNotExist(err) {
 				log.Warn("user.Issues(GetRepositoryById #%d): repository not exist", issues[i].RepoId)
 				continue
 			} else {
diff --git a/templates/.VERSION b/templates/.VERSION
index 7bc05ce057..ce64b3a8bb 100644
--- a/templates/.VERSION
+++ b/templates/.VERSION
@@ -1 +1 @@
-0.5.16.0312 Beta
\ No newline at end of file
+0.5.16.0316 Beta
\ No newline at end of file