diff --git a/githubtasksutils.go b/githubtasksutils.go index e95ce1c1..5c1be540 100644 --- a/githubtasksutils.go +++ b/githubtasksutils.go @@ -86,6 +86,7 @@ func (s *Server) processProjects(ctx context.Context) (time.Time, error) { for _, project := range s.config.GetProjects() { for _, milestone := range project.GetMilestones() { if milestone.GetState() == pb.Milestone_ACTIVE { + countActive := 0 // Sort tasks by the UID sort.SliceStable(milestone.GetTasks(), func(i, j int) bool { @@ -94,10 +95,12 @@ func (s *Server) processProjects(ctx context.Context) (time.Time, error) { for _, task := range milestone.GetTasks() { if task.GetState() == pb.Task_ACTIVE { + countActive++ break } if task.GetState() == pb.Task_CREATED { + countActive++ num, err := s.github.createTask(ctx, task, milestone.GetGithubProject(), milestone.GetNumber()) s.Log(fmt.Sprintf("Added task %v -> %v,%v", task.GetTitle(), num, err)) if err != nil { @@ -110,6 +113,12 @@ func (s *Server) processProjects(ctx context.Context) (time.Time, error) { } } + // If we've reached this point, we have no active taskss and no tasks that need creation + if len(milestone.GetTasks()) > 0 && countActive == 0 { + //Close out the milestone + milestone.State = pb.Milestone_COMPLETE + } + break } diff --git a/githubtasksutils_test.go b/githubtasksutils_test.go index 6613fd21..888c435a 100644 --- a/githubtasksutils_test.go +++ b/githubtasksutils_test.go @@ -252,6 +252,25 @@ func TestUpdateTasks(t *testing.T) { t.Errorf("Bad update: %v", err) } } + +func TestCompleteMilestone(t *testing.T) { + s := InitTestServer() + s.AddProject(context.Background(), &pb.AddProjectRequest{Add: &pb.Project{Name: "Hello", Milestones: []*pb.Milestone{&pb.Milestone{Name: "Testing", State: pb.Milestone_ACTIVE, Number: 1, Tasks: []*pb.Task{}}}}}) + _, err := s.processProjects(context.Background()) + + _, err = s.AddTask(context.Background(), + &pb.AddTaskRequest{MilestoneName: "Testing", MilestoneNumber: 1, Title: "Add stuff", Body: "Do Stuff"}) + _, err = s.processProjects(context.Background()) + _, err = s.updateProjects(context.Background()) + + if err != nil { + t.Errorf("Bad update: %v", err) + } + + // Completes the milestone + _, err = s.processProjects(context.Background()) +} + func TestUpdateTasksWithFail(t *testing.T) { s := InitTestServer()