Merge pull request #752 from jordanhubbard/main
E2E / chaos testing - first PoC with just 48% code coverage
This commit is contained in:
116
cmd/bd/show.go
116
cmd/bd/show.go
@@ -748,8 +748,8 @@ var updateCmd = &cobra.Command{
|
||||
fmt.Fprintf(os.Stderr, "Error getting %s: %v\n", id, err)
|
||||
continue
|
||||
}
|
||||
if issue != nil && issue.IsTemplate {
|
||||
fmt.Fprintf(os.Stderr, "Error: cannot update template %s: templates are read-only; use 'bd molecule instantiate' to create a work item\n", id)
|
||||
if err := validateIssueUpdatable(id, issue); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%s\n", err)
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -768,48 +768,21 @@ var updateCmd = &cobra.Command{
|
||||
}
|
||||
|
||||
// Handle label operations
|
||||
// Set labels (replaces all existing labels)
|
||||
if setLabels, ok := updates["set_labels"].([]string); ok && len(setLabels) > 0 {
|
||||
// Get current labels
|
||||
currentLabels, err := store.GetLabels(ctx, id)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error getting labels for %s: %v\n", id, err)
|
||||
var setLabels, addLabels, removeLabels []string
|
||||
if v, ok := updates["set_labels"].([]string); ok {
|
||||
setLabels = v
|
||||
}
|
||||
if v, ok := updates["add_labels"].([]string); ok {
|
||||
addLabels = v
|
||||
}
|
||||
if v, ok := updates["remove_labels"].([]string); ok {
|
||||
removeLabels = v
|
||||
}
|
||||
if len(setLabels) > 0 || len(addLabels) > 0 || len(removeLabels) > 0 {
|
||||
if err := applyLabelUpdates(ctx, store, id, actor, setLabels, addLabels, removeLabels); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error updating labels for %s: %v\n", id, err)
|
||||
continue
|
||||
}
|
||||
// Remove all current labels
|
||||
for _, label := range currentLabels {
|
||||
if err := store.RemoveLabel(ctx, id, label, actor); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error removing label %s from %s: %v\n", label, id, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
// Add new labels
|
||||
for _, label := range setLabels {
|
||||
if err := store.AddLabel(ctx, id, label, actor); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error setting label %s on %s: %v\n", label, id, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add labels
|
||||
if addLabels, ok := updates["add_labels"].([]string); ok {
|
||||
for _, label := range addLabels {
|
||||
if err := store.AddLabel(ctx, id, label, actor); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error adding label %s to %s: %v\n", label, id, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove labels
|
||||
if removeLabels, ok := updates["remove_labels"].([]string); ok {
|
||||
for _, label := range removeLabels {
|
||||
if err := store.RemoveLabel(ctx, id, label, actor); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error removing label %s from %s: %v\n", label, id, err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Run update hook (bd-kwro.8)
|
||||
@@ -1084,14 +1057,8 @@ var closeCmd = &cobra.Command{
|
||||
if showErr == nil {
|
||||
var issue types.Issue
|
||||
if json.Unmarshal(showResp.Data, &issue) == nil {
|
||||
// Check if issue is a template (beads-1ra): templates are read-only
|
||||
if issue.IsTemplate {
|
||||
fmt.Fprintf(os.Stderr, "Error: cannot close template %s: templates are read-only\n", id)
|
||||
continue
|
||||
}
|
||||
// Check if issue is pinned (bd-6v2)
|
||||
if !force && issue.Status == types.StatusPinned {
|
||||
fmt.Fprintf(os.Stderr, "Error: cannot close pinned issue %s (use --force to override)\n", id)
|
||||
if err := validateIssueClosable(id, &issue, force); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%s\n", err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
@@ -1169,20 +1136,11 @@ var closeCmd = &cobra.Command{
|
||||
// Get issue for checks
|
||||
issue, _ := store.GetIssue(ctx, id)
|
||||
|
||||
// Check if issue is a template (beads-1ra): templates are read-only
|
||||
if issue != nil && issue.IsTemplate {
|
||||
fmt.Fprintf(os.Stderr, "Error: cannot close template %s: templates are read-only\n", id)
|
||||
if err := validateIssueClosable(id, issue, force); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "%s\n", err)
|
||||
continue
|
||||
}
|
||||
|
||||
// Check if issue is pinned (bd-6v2)
|
||||
if !force {
|
||||
if issue != nil && issue.Status == types.StatusPinned {
|
||||
fmt.Fprintf(os.Stderr, "Error: cannot close pinned issue %s (use --force to override)\n", id)
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
if err := store.CloseIssue(ctx, id, reason, actor); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Error closing %s: %v\n", id, err)
|
||||
continue
|
||||
@@ -1427,15 +1385,13 @@ func findRepliesTo(ctx context.Context, issueID string, daemonClient *rpc.Client
|
||||
return ""
|
||||
}
|
||||
// Direct mode - query storage
|
||||
if sqliteStore, ok := store.(*sqlite.SQLiteStorage); ok {
|
||||
deps, err := sqliteStore.GetDependenciesWithMetadata(ctx, issueID)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
for _, dep := range deps {
|
||||
if dep.DependencyType == types.DepRepliesTo {
|
||||
return dep.ID
|
||||
}
|
||||
deps, err := store.GetDependencyRecords(ctx, issueID)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
for _, dep := range deps {
|
||||
if dep.Type == types.DepRepliesTo {
|
||||
return dep.DependsOnID
|
||||
}
|
||||
}
|
||||
return ""
|
||||
@@ -1484,7 +1440,25 @@ func findReplies(ctx context.Context, issueID string, daemonClient *rpc.Client,
|
||||
}
|
||||
return replies
|
||||
}
|
||||
return nil
|
||||
|
||||
allDeps, err := store.GetAllDependencyRecords(ctx)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
var replies []*types.Issue
|
||||
for childID, deps := range allDeps {
|
||||
for _, dep := range deps {
|
||||
if dep.Type == types.DepRepliesTo && dep.DependsOnID == issueID {
|
||||
issue, _ := store.GetIssue(ctx, childID)
|
||||
if issue != nil {
|
||||
replies = append(replies, issue)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return replies
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
||||
Reference in New Issue
Block a user