• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mozilla / relman-auto-nag / #4750

22 Sep 2023 11:38PM UTC coverage: 22.066% (+0.06%) from 22.003%
#4750

push

coveralls-python

suhaibmujahid
[copy_duplicate_info] Drop disabled code

716 of 3560 branches covered (0.0%)

7 of 7 new or added lines in 1 file covered. (100.0%)

1925 of 8724 relevant lines covered (22.07%)

0.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/bugbot/rules/copy_duplicate_info.py
1
# This Source Code Form is subject to the terms of the Mozilla Public
2
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
3
# You can obtain one at http://mozilla.org/MPL/2.0/.
4

5
from libmozdata.bugzilla import Bugzilla
×
6

7
from bugbot import utils
×
8
from bugbot.bzcleaner import BzCleaner
×
9

10

11
class CopyDuplicateInfo(BzCleaner):
×
12
    def __init__(self):
×
13
        super(CopyDuplicateInfo, self).__init__()
×
14
        self.autofix_data = {}
×
15

16
    def description(self):
×
17
        return "Bugs which are DUPLICATE and some info haven't been moved"
×
18

19
    def set_autofix(self, bugs, dups, signatures):
×
20
        for bugid, missed_sgns in signatures.items():
×
21
            sgns = dups[bugid]["signature"]
×
22
            sgns = utils.add_signatures(sgns, missed_sgns)
×
23
            self.autofix_data[bugid] = {
×
24
                "cf_crash_signature": sgns,
25
                "comment": {"body": "Copying crash signatures from duplicate bugs."},
26
            }
27

28
    def get_fixed_bugs(self, bugs, dups, signatures):
×
29
        res = {}
×
30
        for bugid in signatures.keys():
×
31
            res[bugid] = info = dups[bugid]
×
32
            info["update_signature"] = "Yes"
×
33

34
        for info in res.values():
×
35
            if "update_signature" not in info:
×
36
                info["update_signature"] = "No"
×
37

38
        return res
×
39

40
    def columns(self):
×
41
        return ["id", "summary", "update_signature"]
×
42

43
    def sort_columns(self):
×
44
        return lambda p: (
×
45
            0 if p[2] == "Yes" else 1,
46
            0 if p[3] == "Yes" else 1,
47
            -int(p[0]),
48
        )
49

50
    def get_autofix_change(self):
×
51
        return self.autofix_data
×
52

53
    def handle_bug(self, bug, data):
×
54
        bugid = str(bug["id"])
×
55
        data[bugid] = {
×
56
            "id": bugid,
57
            "summary": self.get_summary(bug),
58
            "signature": bug.get("cf_crash_signature", ""),
59
            "dupe": str(bug["dupe_of"]),
60
            "version": bug["version"],
61
            "is_private": bool(bug["groups"]),
62
        }
63
        return bug
×
64

65
    def get_dups(self, bugs):
×
66
        bugids = [info["dupe"] for info in bugs.values()]
×
67
        data = {}
×
68

69
        Bugzilla(
×
70
            bugids=bugids,
71
            include_fields=[
72
                "cf_crash_signature",
73
                "dupe_of",
74
                "id",
75
                "summary",
76
                "groups",
77
                "version",
78
            ],
79
            bughandler=self.handle_bug,
80
            bugdata=data,
81
        ).get_data().wait()
82

83
        return data
×
84

85
    def compare(self, bugs, dups):
×
86
        # each bug in bugs is the dup of one in dups
87
        # so the characteristics of this bug should be in the dup
88
        signatures = {}
×
89
        for bugid, info in bugs.items():
×
90
            dupid = info["dupe"]
×
91
            if dupid not in dups:
×
92
                # the bug is unaccessible (sec bug for example)
93
                continue
×
94

95
            dup = dups[dupid]
×
96
            if info["is_private"] and not dup["is_private"]:
×
97
                # We avoid copying signatures from private to public bugs
98
                continue
×
99

100
            bs = utils.get_signatures(info["signature"])
×
101
            ds = utils.get_signatures(dup["signature"])
×
102
            if not bs.issubset(ds):
×
103
                signatures[dupid] = bs - ds
×
104

105
        return signatures
×
106

107
    def get_bz_params(self, date):
×
108
        start_date, end_date = self.get_dates(date)
×
109
        fields = ["cf_crash_signature", "dupe_of", "version", "groups"]
×
110
        params = {
×
111
            "include_fields": fields,
112
            "resolution": "DUPLICATE",
113
            "f1": "resolution",
114
            "o1": "changedafter",
115
            "v1": start_date,
116
        }
117

118
        return params
×
119

120
    def get_bugs(self, date="today", bug_ids=[]):
×
121
        bugs = super(CopyDuplicateInfo, self).get_bugs(date=date, bug_ids=bug_ids)
×
122
        dups = self.get_dups(bugs)
×
123
        signatures = self.compare(bugs, dups)
×
124

125
        self.set_autofix(bugs, dups, signatures)
×
126
        bugs = self.get_fixed_bugs(bugs, dups, signatures)
×
127

128
        return bugs
×
129

130

131
if __name__ == "__main__":
×
132
    CopyDuplicateInfo().run()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc