~fginther/jenkins-launchpad-plugin/indirect-team-membership

12.4.1 by Allan LeSage
Minor organizational suggestions.
1
import os
2
import hashlib
79.3.1 by Martin Mrazik
adding more info for debugging stalled locks; eventually reusable for stalled lock cleanup
3
from settings import LAUNCHPADLOCKS_DIR, logger
12.4.1 by Allan LeSage
Minor organizational suggestions.
4
5
6
class MergeProposalReview():
7
    _mp = None
8
9
    def __init__(self, mp):
10
        self._mp = mp
11
12
    @property
13
    def mp(self):
14
        """Merge proposal."""
15
16
        return self._mp
17
18
    def _get_hash(self):
19
        return hashlib.sha224(self.mp.web_link).hexdigest()
44.1.1 by Martin Mrazik
pep8izing
20
12.4.1 by Allan LeSage
Minor organizational suggestions.
21
    def get_lockfile(self):
22
        return LAUNCHPADLOCKS_DIR + '/' + self._get_hash()
23
79.3.1 by Martin Mrazik
adding more info for debugging stalled locks; eventually reusable for stalled lock cleanup
24
    def lock(self, job_name):
12.4.1 by Allan LeSage
Minor organizational suggestions.
25
        if not os.path.exists(LAUNCHPADLOCKS_DIR):
26
            os.makedirs(LAUNCHPADLOCKS_DIR)
27
        lockfile = open(self.get_lockfile(), 'w')
79.3.1 by Martin Mrazik
adding more info for debugging stalled locks; eventually reusable for stalled lock cleanup
28
        lock_info = "{jenkins_job}\n{merge_proposal}\n"
29
        lock_info = lock_info.format(jenkins_job=job_name,
30
                                     merge_proposal=self.mp.web_link)
31
        lockfile.write(lock_info)
12.4.1 by Allan LeSage
Minor organizational suggestions.
32
        lockfile.close()
33
34
    def unlock(self):
35
        try:
36
            os.remove(self.get_lockfile())
37
            return True
38
        except OSError as error:
39
            if error.errno == 2:
79.3.1 by Martin Mrazik
adding more info for debugging stalled locks; eventually reusable for stalled lock cleanup
40
                logger.debug("mp lock doesn't exists. Ignoring this unlock.")
12.4.1 by Allan LeSage
Minor organizational suggestions.
41
            return False
42
79.3.1 by Martin Mrazik
adding more info for debugging stalled locks; eventually reusable for stalled lock cleanup
43
    def get_jenkins_job(self):
44
        if self.is_locked():
45
            lockfile = open(self.get_lockfile(), 'r')
46
            job_name = lockfile.readline().rstrip()
47
            return job_name
48
        else:
49
            return None
50
12.4.1 by Allan LeSage
Minor organizational suggestions.
51
    def is_locked(self):
52
        return os.path.exists(self.get_lockfile())