From 09f817c2c9b6ec00b5d3d9f17a94c222a6e4517a Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Wed, 13 Sep 2017 18:01:44 +0200 Subject: [PATCH 01/25] Hotfix for "Add time manually" (https://github.com/go-gitea/gitea/pull/2211#issuecomment-328780125) Signed-off-by: Jonas Franz --- routers/repo/issue_timetrack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/repo/issue_timetrack.go b/routers/repo/issue_timetrack.go index e01cd48a6..4d77ca3ce 100644 --- a/routers/repo/issue_timetrack.go +++ b/routers/repo/issue_timetrack.go @@ -41,7 +41,7 @@ func AddTimeManually(c *context.Context, form auth.AddTimeManuallyForm) { return } - if _, err := models.AddTime(c.User, issue, int64(total)); err != nil { + if _, err := models.AddTime(c.User, issue, int64(total.Seconds())); err != nil { c.Handle(http.StatusInternalServerError, "AddTime", err) return } From 05885364473e8efe841ad527b588178f277f27d6 Mon Sep 17 00:00:00 2001 From: Konrad Langenberg Date: Sat, 26 Aug 2017 18:58:35 +0200 Subject: [PATCH 02/25] Init: * Added models * Added UI * Added Routes Signed-off-by: kolaente --- models/issue_dependency_add.go | 79 +++++++++++++++++++ routers/repo/issue_dependency_add.go | 38 +++++++++ routers/routes/routes.go | 8 +- .../repo/issue/view_content/sidebar.tmpl | 37 +++++++++ 4 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 models/issue_dependency_add.go create mode 100644 routers/repo/issue_dependency_add.go diff --git a/models/issue_dependency_add.go b/models/issue_dependency_add.go new file mode 100644 index 000000000..04db222ee --- /dev/null +++ b/models/issue_dependency_add.go @@ -0,0 +1,79 @@ +// Copyright 2017 The Gitea 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 ( + "time" +) + +// IssueDependency is connection request for receiving issue notification. +type IssueDependency struct { + ID int64 `xorm:"pk autoincr"` + UserID int64 `xorm:"UNIQUE(watch) NOT NULL"` + IssueID int64 `xorm:"UNIQUE(watch) NOT NULL"` + DependencyID int64 `xorm:"UNIQUE(watch) NOT NULL"` + Created time.Time `xorm:"-"` + CreatedUnix int64 `xorm:"NOT NULL"` + Updated time.Time `xorm:"-"` + UpdatedUnix int64 `xorm:"NOT NULL"` +} + +// BeforeInsert is invoked from XORM before inserting an object of this type. +func (iw *IssueDependency) BeforeInsert() { + var ( + t = time.Now() + u = t.Unix() + ) + iw.Created = t + iw.CreatedUnix = u + iw.Updated = t + iw.UpdatedUnix = u +} + +// BeforeUpdate is invoked from XORM before updating an object of this type. +func (iw *IssueDependency) BeforeUpdate() { + var ( + t = time.Now() + u = t.Unix() + ) + iw.Updated = t + iw.UpdatedUnix = u +} + +// CreateOrUpdateIssueDependency sets or updates a dependency for an issue +func CreateOrUpdateIssueDependency(userID, issueID int64, dep int64) error { + id, exists, err := getIssueWatch(x, userID, issueID) + if err != nil { + return err + } + + if !exists { + id = &IssueWatch{ + UserID: userID, + IssueID: issueID, + IsWatching: isWatching, + } + + if _, err := x.Insert(iw); err != nil { + return err + } + } else { + iw.IsWatching = isWatching + + if _, err := x.Id(iw.ID).Cols("is_watching", "updated_unix").Update(iw); err != nil { + return err + } + } + return nil +} + +// +func getIssueDep(e Engine, issueID int64) (Dependencies []*IssueDependency, err error) { + id = new(IssueDependency) + err = e. + Where("issue_id = ?", issueID). + Find(&Dependencies) + return +} diff --git a/routers/repo/issue_dependency_add.go b/routers/repo/issue_dependency_add.go new file mode 100644 index 000000000..384d04aca --- /dev/null +++ b/routers/repo/issue_dependency_add.go @@ -0,0 +1,38 @@ +// Copyright 2017 The Gitea 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 repo + +import ( + "fmt" + "net/http" + "strconv" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/context" +) + +// IssueWatch sets issue watching +func AddDependency(c *context.Context) { + dep, err := strconv.ParseInt(c.Req.PostForm.Get("newDependency"), 10, 64) + if err != nil { + c.Handle(http.StatusInternalServerError, "issue ID is not int", err) + return + } + + issueIndex := c.ParamsInt64("index") + issue, err := models.GetIssueByIndex(c.Repo.Repository.ID, issueIndex) + if err != nil { + c.Handle(http.StatusInternalServerError, "GetIssueByIndex", err) + return + } + + if err := models.CreateOrUpdateIssueDependency(c.User.ID, issue.ID, dep); err != nil { + c.Handle(http.StatusInternalServerError, "CreateOrUpdateIssueWatch", err) + return + } + + url := fmt.Sprintf("%s/issues/%d", c.Repo.RepoLink, issueIndex) + c.Redirect(url, http.StatusSeeOther) +} diff --git a/routers/routes/routes.go b/routers/routes/routes.go index a0684c847..888ea2c92 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -485,6 +485,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/content", repo.UpdateIssueContent) m.Post("/watch", repo.IssueWatch) m.Combo("/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment) + m.Post("/addDependency", repo.AddDependency) m.Group("/times", func() { m.Post("/add", bindIgnErr(auth.AddTimeManuallyForm{}), repo.AddTimeManually) m.Group("/stopwatch", func() { @@ -611,7 +612,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/*", repo.WikiRaw) }, repo.MustEnableWiki, context.CheckUnit(models.UnitTypeWiki), context.CheckUnit(models.UnitTypeWiki)) - m.Get("/archive/*", repo.MustBeNotBare, context.CheckUnit(models.UnitTypeCode), repo.Download) + m.Get("/archive/*", repo.MustBeNotBare, repo.Download, context.CheckUnit(models.UnitTypeCode)) m.Group("/pulls/:index", func() { m.Get("/commits", context.RepoRef(), repo.ViewPullCommits) @@ -631,11 +632,10 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/src/*", repo.SetEditorconfigIfExists, repo.Home) m.Get("/forks", repo.Forks) }, context.RepoRef(), context.CheckUnit(models.UnitTypeCode)) - m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", - repo.MustBeNotBare, context.CheckUnit(models.UnitTypeCode), repo.RawDiff) + m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.MustBeNotBare, repo.RawDiff, context.CheckUnit(models.UnitTypeCode)) m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", repo.SetEditorconfigIfExists, - repo.SetDiffViewStyle, repo.MustBeNotBare, context.CheckUnit(models.UnitTypeCode), repo.CompareDiff) + repo.SetDiffViewStyle, repo.MustBeNotBare, repo.CompareDiff, context.CheckUnit(models.UnitTypeCode)) }, ignSignIn, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits()) m.Group("/:username/:reponame", func() { m.Get("/stars", repo.Stars) diff --git a/templates/repo/issue/view_content/sidebar.tmpl b/templates/repo/issue/view_content/sidebar.tmpl index 079c6f52a..4fa89bbdd 100644 --- a/templates/repo/issue/view_content/sidebar.tmpl +++ b/templates/repo/issue/view_content/sidebar.tmpl @@ -190,5 +190,42 @@ {{end}} {{end}} + +
+ +
+ Dependencies +
+ This issue currently doesn't have any dependencies. +
+
+ +
+
+ + + + + From 9ec41580c06efd8a16beca0b2cd04e612d3ec983 Mon Sep 17 00:00:00 2001 From: Konrad Langenberg Date: Sat, 26 Aug 2017 22:37:52 +0200 Subject: [PATCH 03/25] Added create new issue method Signed-off-by: Konrad --- models/issue_dependency_add.go | 40 ++++++++++--------- public/js/index.js | 11 +++++ routers/repo/issue_dependency_add.go | 5 ++- routers/routes/routes.go | 2 +- .../repo/issue/view_content/sidebar.tmpl | 1 + 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/models/issue_dependency_add.go b/models/issue_dependency_add.go index 04db222ee..5200d57b5 100644 --- a/models/issue_dependency_add.go +++ b/models/issue_dependency_add.go @@ -6,6 +6,7 @@ package models import ( "time" + "fmt" ) // IssueDependency is connection request for receiving issue notification. @@ -13,7 +14,7 @@ type IssueDependency struct { ID int64 `xorm:"pk autoincr"` UserID int64 `xorm:"UNIQUE(watch) NOT NULL"` IssueID int64 `xorm:"UNIQUE(watch) NOT NULL"` - DependencyID int64 `xorm:"UNIQUE(watch) NOT NULL"` + DependencyID int64 `xorm:"UNIQUE(watch) NOT NULL"` Created time.Time `xorm:"-"` CreatedUnix int64 `xorm:"NOT NULL"` Updated time.Time `xorm:"-"` @@ -43,37 +44,38 @@ func (iw *IssueDependency) BeforeUpdate() { } // CreateOrUpdateIssueDependency sets or updates a dependency for an issue -func CreateOrUpdateIssueDependency(userID, issueID int64, dep int64) error { - id, exists, err := getIssueWatch(x, userID, issueID) +func CreateOrUpdateIssueDependency(userID, issueID int64, depID int64) error { + err := x.Sync(new(IssueDependency)) + if err != nil { + return err + } + + exists, err := issueDepExists(x, issueID, depID) if err != nil { return err } if !exists { - id = &IssueWatch{ - UserID: userID, - IssueID: issueID, - IsWatching: isWatching, - } + newId := new(IssueDependency) + newId.UserID = userID + newId.IssueID = issueID + newId.DependencyID = depID - if _, err := x.Insert(iw); err != nil { + if _, err := x.Insert(newId); err != nil { return err } } else { - iw.IsWatching = isWatching - - if _, err := x.Id(iw.ID).Cols("is_watching", "updated_unix").Update(iw); err != nil { - return err - } + fmt.Println("Dependency exists") + // TODO: Should display a message on issue page } return nil } // -func getIssueDep(e Engine, issueID int64) (Dependencies []*IssueDependency, err error) { - id = new(IssueDependency) - err = e. - Where("issue_id = ?", issueID). - Find(&Dependencies) +func issueDepExists(e Engine, issueID int64, depID int64) (exists bool, err error) { + var Dependencies = IssueDependency{IssueID: issueID, DependencyID: depID} + + //err = e.Where("issue_id = ?", issueID).Where("dependency_id = ?", depID).Find(&Dependencies) + exists, err = e.Get(&Dependencies) return } diff --git a/public/js/index.js b/public/js/index.js index cded5e2a1..c808a13de 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -1822,3 +1822,14 @@ function toggleStopwatch() { function cancelStopwatch() { $("#cancel_stopwatch_form").submit(); } + +function showAddDependencyModal() { + $('.tiny.modal') + .modal({ + duration: 200, + onApprove: function() { + $('#addDependencyForm').submit(); + } + }).modal('show') + ; +} diff --git a/routers/repo/issue_dependency_add.go b/routers/repo/issue_dependency_add.go index 384d04aca..3ebf20285 100644 --- a/routers/repo/issue_dependency_add.go +++ b/routers/repo/issue_dependency_add.go @@ -17,7 +17,7 @@ import ( func AddDependency(c *context.Context) { dep, err := strconv.ParseInt(c.Req.PostForm.Get("newDependency"), 10, 64) if err != nil { - c.Handle(http.StatusInternalServerError, "issue ID is not int", err) + c.Handle(http.StatusBadRequest, "issue ID is not int", err) return } @@ -29,7 +29,8 @@ func AddDependency(c *context.Context) { } if err := models.CreateOrUpdateIssueDependency(c.User.ID, issue.ID, dep); err != nil { - c.Handle(http.StatusInternalServerError, "CreateOrUpdateIssueWatch", err) + c.Handle(http.StatusInternalServerError, "CreateOrUpdateIssueDependency", err) + fmt.Println("updateerr") return } diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 888ea2c92..a2e6cbcb6 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -484,7 +484,6 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/title", repo.UpdateIssueTitle) m.Post("/content", repo.UpdateIssueContent) m.Post("/watch", repo.IssueWatch) - m.Combo("/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment) m.Post("/addDependency", repo.AddDependency) m.Group("/times", func() { m.Post("/add", bindIgnErr(auth.AddTimeManuallyForm{}), repo.AddTimeManually) @@ -499,6 +498,7 @@ func RegisterRoutes(m *macaron.Macaron) { return } }) + m.Combo("/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment) }) m.Post("/labels", repo.UpdateIssueLabel, reqRepoWriter) diff --git a/templates/repo/issue/view_content/sidebar.tmpl b/templates/repo/issue/view_content/sidebar.tmpl index 4fa89bbdd..7dfb19f08 100644 --- a/templates/repo/issue/view_content/sidebar.tmpl +++ b/templates/repo/issue/view_content/sidebar.tmpl @@ -214,6 +214,7 @@
+ {{$.CsrfTokenHtml}}
From b6ecf50342e54de5c5dbc6a36486111a459d8d11 Mon Sep 17 00:00:00 2001 From: Konrad Langenberg Date: Sun, 27 Aug 2017 20:23:16 +0200 Subject: [PATCH 04/25] Added basic functionality: * Add new dependecy * Show dependencies Signed-off-by: Konrad --- conf/app.ini | 2 +- models/issue_comment.go | 2 + models/issue_dependency_add.go | 45 ++++++++++----- models/repo.go | 49 ++++++++++++++++ options/locale/locale_en-US.ini | 8 +++ routers/repo/issue.go | 4 ++ routers/repo/issue_dependency_add.go | 8 ++- .../repo/issue/view_content/comments.tmpl | 12 ++++ .../repo/issue/view_content/sidebar.tmpl | 56 ++++++++++++++++--- 9 files changed, 161 insertions(+), 25 deletions(-) diff --git a/conf/app.ini b/conf/app.ini index 9674b815c..b4b2509f2 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -389,7 +389,7 @@ MODE = console ; Buffer length of channel, keep it as it is if you don't know what it is. BUFFER_LEN = 10000 ; Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace" -LEVEL = Trace +LEVEL = Debug ; For "console" mode only [log.console] diff --git a/models/issue_comment.go b/models/issue_comment.go index 084a2a81b..a3e54b4fc 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -60,6 +60,8 @@ const ( CommentTypeAddTimeManual // Cancel a stopwatch for time tracking CommentTypeCancelTracking + // Dependency added + CommentTypeAddedDependency ) // CommentTag defines comment tag type diff --git a/models/issue_dependency_add.go b/models/issue_dependency_add.go index 5200d57b5..702a0a795 100644 --- a/models/issue_dependency_add.go +++ b/models/issue_dependency_add.go @@ -6,7 +6,6 @@ package models import ( "time" - "fmt" ) // IssueDependency is connection request for receiving issue notification. @@ -43,18 +42,20 @@ func (iw *IssueDependency) BeforeUpdate() { iw.UpdatedUnix = u } -// CreateOrUpdateIssueDependency sets or updates a dependency for an issue -func CreateOrUpdateIssueDependency(userID, issueID int64, depID int64) error { - err := x.Sync(new(IssueDependency)) +// CreateOrUpdateIssueDependency creates a new dependency for an issue +func CreateOrUpdateIssueDependency(userID, issueID int64, depID int64) (err error, exists bool) { + err = x.Sync(new(IssueDependency)) if err != nil { - return err + return err, exists } - exists, err := issueDepExists(x, issueID, depID) + // Check if it aleready exists + exists, err = issueDepExists(x, issueID, depID) if err != nil { - return err + return err, exists } + // If it not exists, create it, otherwise show an error message if !exists { newId := new(IssueDependency) newId.UserID = userID @@ -62,20 +63,36 @@ func CreateOrUpdateIssueDependency(userID, issueID int64, depID int64) error { newId.DependencyID = depID if _, err := x.Insert(newId); err != nil { - return err + return err, exists + } + + // Add comment referencing to the stopwatch + comment := &Comment{ + IssueID: issueID, + PosterID: userID, + Type: CommentTypeAddedDependency, + } + + if _, err := x.Insert(comment); err != nil { + return err, exists } - } else { - fmt.Println("Dependency exists") - // TODO: Should display a message on issue page } - return nil + return nil, exists } -// +// Check if the dependency already exists func issueDepExists(e Engine, issueID int64, depID int64) (exists bool, err error) { var Dependencies = IssueDependency{IssueID: issueID, DependencyID: depID} - //err = e.Where("issue_id = ?", issueID).Where("dependency_id = ?", depID).Find(&Dependencies) exists, err = e.Get(&Dependencies) + + // Check for dependencies the other way around + // Otherwise two issues could block each other which would result in none of them could be closed. + if !exists { + Dependencies.IssueID = depID + Dependencies.DependencyID = issueID + exists, err = e.Get(&Dependencies) + } + return } diff --git a/models/repo.go b/models/repo.go index 4b3b0322d..55c82ebfc 100644 --- a/models/repo.go +++ b/models/repo.go @@ -692,6 +692,39 @@ func (repo *Repository) getUsersWithAccessMode(e Engine, mode AccessMode) (_ []* return users, nil } +func (repo *Repository) BlockedByDependencies(issueID int64) (_ []*Issue, err error) { + + issueDeps, err := repo.getBlockedByDependencies(x, issueID) + var issueDepsFull = make([]*Issue, 0) + + for _, issueDep := range issueDeps{ + issueDetails, _ := getIssueByID(x, issueDep.DependencyID) + issueDepsFull = append(issueDepsFull, issueDetails) + } + + if err != nil { + return + } + + return issueDepsFull, nil +} + +func (repo *Repository) BlockingDependencies(issueID int64) (_ []*Issue, err error) { + + issueDeps, err := repo.getBlockingDependencies(x, issueID) + var issueDepsFull = make([]*Issue, 0) + + for _, issueDep := range issueDeps{ + issueDetails, _ := getIssueByID(x, issueDep.IssueID) + issueDepsFull = append(issueDepsFull, issueDetails) + } + + if err != nil { + return + } + + return issueDepsFull, nil +} // NextIssueIndex returns the next issue index // FIXME: should have a mutex to prevent producing same index for two issues that are created // closely enough. @@ -2425,3 +2458,19 @@ func (repo *Repository) CreateNewBranch(doer *User, oldBranchName, branchName st return nil } + +// Get Blocked By Dependencies, aka all issues this issue is blocked by. +func (repo *Repository) getBlockedByDependencies(e Engine, issueID int64) (_ []IssueDependency, err error) { + var dependencies []IssueDependency + err = e.Where("issue_id = ?", issueID).Find(&dependencies) // + + return dependencies, err +} + +// Get Blocking Dependencies, aka all issues this issue blocks. +func (repo *Repository) getBlockingDependencies(e Engine, issueID int64) (_ []IssueDependency, err error) { + var dependencies []IssueDependency + err = e.Where("dependency_id = ?", issueID).Find(&dependencies) + + return dependencies, err +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 2e4520a7a..dc2fc4968 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -725,6 +725,14 @@ issues.add_time_sum_to_small = No time was entered issues.cancel_tracking = Cancel issues.cancel_tracking_history = `cancelled time tracking %s` issues.time_spent_total = Total time spent +issues.dependency.title = Dependencies +issues.dependency.no_dependencies = This issue currently doesn't have any dependencies. +issues.dependency.add = Add +issues.dependency.cancel = Cancel +issues.dependency.add_header = Add New Dependency +issues.dependency.issue_number = Issuenumber +issues.dependency.added_dependency = `%[2]s added a new dependency %[3]s` + pulls.desc = Pulls management your code review and merge requests pulls.new = New Pull Request diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 4c4f9037b..3ba669f21 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -707,6 +707,10 @@ func ViewIssue(ctx *context.Context) { ctx.Data["IsPullBranchDeletable"] = canDelete && pull.HeadRepo != nil && git.IsBranchExist(pull.HeadRepo.RepoPath(), pull.HeadBranch) } + // Get Dependencies + ctx.Data["BlockedByDependencies"], err = repo.BlockedByDependencies(issue.ID) + ctx.Data["BlockingDependencies"], err = repo.BlockingDependencies(issue.ID) + ctx.Data["Participants"] = participants ctx.Data["NumParticipants"] = len(participants) ctx.Data["Issue"] = issue diff --git a/routers/repo/issue_dependency_add.go b/routers/repo/issue_dependency_add.go index 3ebf20285..03c4b3db4 100644 --- a/routers/repo/issue_dependency_add.go +++ b/routers/repo/issue_dependency_add.go @@ -28,12 +28,16 @@ func AddDependency(c *context.Context) { return } - if err := models.CreateOrUpdateIssueDependency(c.User.ID, issue.ID, dep); err != nil { + err, exists := models.CreateOrUpdateIssueDependency(c.User.ID, issue.ID, dep); + if err != nil { c.Handle(http.StatusInternalServerError, "CreateOrUpdateIssueDependency", err) - fmt.Println("updateerr") return } + if exists { + c.Flash.Error("Dependency already exists!") + } + url := fmt.Sprintf("%s/issues/%d", c.Repo.RepoLink, issueIndex) c.Redirect(url, http.StatusSeeOther) } diff --git a/templates/repo/issue/view_content/comments.tmpl b/templates/repo/issue/view_content/comments.tmpl index 34609ceb3..804aa1198 100644 --- a/templates/repo/issue/view_content/comments.tmpl +++ b/templates/repo/issue/view_content/comments.tmpl @@ -183,4 +183,16 @@ {{.Poster.Name}} {{$.i18n.Tr "repo.issues.cancel_tracking_history" $createdStr | Safe}}
{{end}} + {{else if eq .Type 16}} +
+ +
+ + + + + {{$.i18n.Tr "repo.issues.dependency.added_dependency" .Poster.HomeLink .Poster.Name $createdStr | Safe}} + + {{end}} + {{end}} diff --git a/templates/repo/issue/view_content/sidebar.tmpl b/templates/repo/issue/view_content/sidebar.tmpl index 7dfb19f08..90b149ced 100644 --- a/templates/repo/issue/view_content/sidebar.tmpl +++ b/templates/repo/issue/view_content/sidebar.tmpl @@ -194,13 +194,53 @@
- Dependencies -
- This issue currently doesn't have any dependencies. + {{.i18n.Tr "repo.issues.dependency.title"}} +
+ This issue is blocked by: +
+ {{range .BlockedByDependencies}} +
+
+ {{if .IsClosed}} +
+ +
+ {{else}} +
+ +
+ {{end}} +
+
#{{.Index}}
+ {{.Title}} +
+ {{end}} +
+ +
+ This issue blocks the following issues: + {{range .BlockingDependencies}} +
+
+ {{if .IsClosed}} +
+ +
+ {{else}} +
+ +
+ {{end}} +
+
#{{.Index}}
+ {{.Title}} +
+ {{end}} +

{{.i18n.Tr "repo.issues.dependency.no_dependencies"}}

@@ -210,22 +250,22 @@ + {{end}} + + {{if (and (not .BlockedByDependencies) (not .BlockingDependencies))}} +

{{.i18n.Tr "repo.issues.dependency.no_dependencies"}}

+ {{end}}
-