Merge polecat/Nux: exclude pinned from bd blocked
This commit is contained in:
@@ -1063,6 +1063,7 @@ func (m *MemoryStorage) getOpenBlockers(issueID string) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetBlockedIssues returns issues that are blocked by other issues
|
// GetBlockedIssues returns issues that are blocked by other issues
|
||||||
|
// Note: Pinned issues are excluded from the output (beads-ei4)
|
||||||
func (m *MemoryStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) {
|
func (m *MemoryStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) {
|
||||||
m.mu.RLock()
|
m.mu.RLock()
|
||||||
defer m.mu.RUnlock()
|
defer m.mu.RUnlock()
|
||||||
@@ -1075,6 +1076,11 @@ func (m *MemoryStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedI
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Exclude pinned issues (beads-ei4)
|
||||||
|
if issue.Pinned {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
blockers := m.getOpenBlockers(issue.ID)
|
blockers := m.getOpenBlockers(issue.ID)
|
||||||
if issue.Status != types.StatusBlocked && len(blockers) == 0 {
|
if issue.Status != types.StatusBlocked && len(blockers) == 0 {
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -258,11 +258,13 @@ func (s *SQLiteStorage) GetStaleIssues(ctx context.Context, filter types.StaleFi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetBlockedIssues returns issues that are blocked by dependencies or have status=blocked
|
// GetBlockedIssues returns issues that are blocked by dependencies or have status=blocked
|
||||||
|
// Note: Pinned issues are excluded from the output (beads-ei4)
|
||||||
func (s *SQLiteStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) {
|
func (s *SQLiteStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedIssue, error) {
|
||||||
// Use UNION to combine:
|
// Use UNION to combine:
|
||||||
// 1. Issues with open/in_progress/blocked status that have dependency blockers
|
// 1. Issues with open/in_progress/blocked status that have dependency blockers
|
||||||
// 2. Issues with status=blocked (even if they have no dependency blockers)
|
// 2. Issues with status=blocked (even if they have no dependency blockers)
|
||||||
// Use GROUP_CONCAT to get all blocker IDs in a single query (no N+1)
|
// Use GROUP_CONCAT to get all blocker IDs in a single query (no N+1)
|
||||||
|
// Exclude pinned issues (beads-ei4)
|
||||||
rows, err := s.db.QueryContext(ctx, `
|
rows, err := s.db.QueryContext(ctx, `
|
||||||
SELECT
|
SELECT
|
||||||
i.id, i.title, i.description, i.design, i.acceptance_criteria, i.notes,
|
i.id, i.title, i.description, i.design, i.acceptance_criteria, i.notes,
|
||||||
@@ -279,6 +281,7 @@ func (s *SQLiteStorage) GetBlockedIssues(ctx context.Context) ([]*types.BlockedI
|
|||||||
AND blocker.status IN ('open', 'in_progress', 'blocked')
|
AND blocker.status IN ('open', 'in_progress', 'blocked')
|
||||||
)
|
)
|
||||||
WHERE i.status IN ('open', 'in_progress', 'blocked')
|
WHERE i.status IN ('open', 'in_progress', 'blocked')
|
||||||
|
AND i.pinned = 0
|
||||||
AND (
|
AND (
|
||||||
i.status = 'blocked'
|
i.status = 'blocked'
|
||||||
OR EXISTS (
|
OR EXISTS (
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ CREATE TABLE IF NOT EXISTS issues (
|
|||||||
pinned INTEGER DEFAULT 0,
|
pinned INTEGER DEFAULT 0,
|
||||||
-- NOTE: replies_to, relates_to, duplicate_of, superseded_by removed per Decision 004
|
-- NOTE: replies_to, relates_to, duplicate_of, superseded_by removed per Decision 004
|
||||||
-- These relationships are now stored in the dependencies table
|
-- These relationships are now stored in the dependencies table
|
||||||
|
-- Workflow fields
|
||||||
|
pinned INTEGER DEFAULT 0,
|
||||||
CHECK ((status = 'closed') = (closed_at IS NOT NULL))
|
CHECK ((status = 'closed') = (closed_at IS NOT NULL))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user