~landscape/tarmac/ls-trunk-backout-r409

« back to all changes in this revision

Viewing changes to tarmac/plugins/bugresolver.py

  • Committer: David Britton
  • Date: 2014-03-24 21:19:37 UTC
  • mfrom: (431.1.9 set-milestone-2)
  • Revision ID: dpb@canonical.com-20140324211937-2iz5t4y0remduok6
Merging in result of code review from danilo

Show diffs side-by-side

added added

removed removed

Lines of Context:
85
85
            set_milestone = False
86
86
 
87
87
        default = self.get_config("default_milestone", None, *args)
88
 
        if default is not None and not len(default):
 
88
        if default == "":
89
89
            default = None
90
90
 
91
91
        return {
114
114
 
115
115
    def _find_milestones(self, project):
116
116
        """
117
 
        Return list of milestones in a project.  Filter list by active status.
118
 
        If the config `default_milestone` is set filter by that instead.
 
117
        Return list of active milestones in a project.  If the config
 
118
        `default_milestone` is set filter by that.  If not found, an 
 
119
        empty list will be returned.
119
120
        """
120
121
        default = self.config["default_milestone"]
121
 
        milestones = []
122
 
        for milestone in project.all_milestones:
123
 
            if default is not None:
124
 
                if milestone.name == default:
125
 
                    milestones.append(milestone)
126
 
                    return milestones
127
 
                else:
128
 
                    continue
129
 
            if not milestone.is_active:
130
 
                continue
131
 
            milestones.append(milestone)
132
 
        if default is not None and not len(milestones):
133
 
            self.logger.warning("Default Milestone not found: %s" % default)
134
 
        return milestones
135
 
 
 
122
        if default is None:
 
123
            return list(project.active_milestones)
 
124
        for milestone in project.active_milestones:
 
125
            if milestone.name == default:
 
126
                return [milestone]
 
127
        self.logger.warning("Default Milestone not found: %s" % default)
 
128
        return []
136
129
 
137
130
    def _find_target_milestone(self, project, now):
138
131
        """
139
132
        Find a target milestone when resolving a bug task.
140
133
 
141
134
        Compare the selected datetime `now` to the list of milestones.
142
 
        Return the milestone who's `targeted_date` is newer than the given
 
135
        Return the milestone where `targeted_date` is newer than the given
143
136
        datetime.  If the given time is greater than all open milestones:
144
137
        target to the newest milestone in the list.
145
138
 
152
145
            2) least lexically sorting milestone (by name)
153
146
            3) the last milestone in the list (covers len()==1 case).
154
147
        """
155
 
        # _find_milestones will take care of only getting 'active' milestones
156
 
        # and the short-circuit case of the user config specifying the milestone
157
148
        milestones = self._find_milestones(project)
158
 
        if len(milestones) == 0:
159
 
            return None
160
 
 
161
 
        # Purpose here is to Move all milestones with no date to the end of the
162
 
        # list in lexical order.
163
 
        date_milestones = []
164
 
        name_milestones = []
 
149
        earliest_after = latest_before = untargeted = None
165
150
        for milestone in milestones:
166
151
            if milestone.date_targeted is None:
167
 
                name_milestones.append(milestone)
168
 
            else:
169
 
                date_milestones.append(milestone)
170
 
        milestones = sorted(date_milestones, key=lambda x: x.date_targeted)
171
 
        milestones.extend(sorted(name_milestones, key=lambda x: x.name))
 
152
                if untargeted is not None:
 
153
                    if milestone.name < untargeted.name:
 
154
                        untargeted = milestone
 
155
                else:
 
156
                    untargeted = milestone
 
157
            elif milestone.date_targeted > now:
 
158
                if earliest_after is not None:
 
159
                    if earliest_after.date_targeted > milestone.date_targeted:
 
160
                        earliest_after = milestone
 
161
                else:
 
162
                    earliest_after = milestone
 
163
            elif milestone.date_targeted < now:
 
164
                if latest_before is not None:
 
165
                    if latest_before.date_targeted < milestone.date_targeted:
 
166
                        latest_before = milestone
 
167
                else:
 
168
                    latest_before = milestone
172
169
 
173
 
        previous_milestone = milestones[0]
174
 
        if previous_milestone.date_targeted is None or \
175
 
            now < previous_milestone.date_targeted:
176
 
            return previous_milestone
177
 
        for milestone in milestones:
178
 
            if now > previous_milestone.date_targeted:
179
 
                if milestone.date_targeted is None or \
180
 
                    now < milestone.date_targeted:
181
 
                    return milestone
182
 
            previous_milestone = milestone
183
 
        return milestones[-1]
 
170
        if earliest_after is not None:
 
171
            return earliest_after
 
172
        elif untargeted is not None:
 
173
            return untargeted
 
174
        else:
 
175
            return latest_before
184
176
 
185
177
 
186
178
tarmac_hooks['tarmac_post_commit'].hook(BugResolver(), 'Bug resolver')