1
2
3 import json
4 import pprint
5 import zmq
6 import sys
7 import os
8 import logging
9 import requests
10 import re
11
12 sys.path.append(
13 os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
14 )
15
16 from coprs import db, app
17 from coprs.logic.coprs_logic import CoprsLogic
18 from coprs.logic.builds_logic import BuildsLogic
19
20 TITO_TYPE = '3'
21 MOCK_SCM_TYPE = '4'
22
23 logging.basicConfig(
24 filename="{0}/build_on_pagure_commit.log".format(app.config.get("LOG_DIR")),
25 format='[%(asctime)s][%(levelname)6s]: %(message)s',
26 level=logging.DEBUG)
27 log = logging.getLogger(__name__)
28
29 PAGURE_BASE_URL = "https://pagure.io/"
34 raise NotImplemented()
35
36 @classmethod
45
46 @classmethod
48 if db.engine.url.drivername == "sqlite":
49 placeholder = '?'
50 true = '1'
51 else:
52 placeholder = '%s'
53 true = 'true'
54
55 rows = db.engine.execute(
56 """
57 SELECT package.id AS package_id, package.source_json AS source_json, package.copr_id AS copr_id
58 FROM package
59 WHERE package.source_type = '{0}' AND
60 package.webhook_rebuild = {1} AND
61 package.source_json ILIKE {placeholder}
62 """.format(source_type, true, placeholder=placeholder), '%'+clone_url_subpart+'%'
63 )
64 return [Package.new_from_db_row(source_type, row) for row in rows]
65
78
82
84 if not self.git_dir or not raw_commit_text:
85 return True
86
87 for line in raw_commit_text.split('\n'):
88 match = re.search(r'^(\+\+\+|---) [ab]/(\w*)/.*$', line)
89 if match and match.group(2).lower() == self.git_dir.lower():
90 return True
91
92 return False
93
111
114 log.debug("Setting up poller...")
115
116 endpoint = 'tcp://hub.fedoraproject.org:9940'
117 topic = 'io.pagure.prod.pagure.git.receive'
118
119 ctx = zmq.Context()
120 s = ctx.socket(zmq.SUB)
121 s.connect(endpoint)
122
123 s.setsockopt(zmq.SUBSCRIBE, topic)
124
125 poller = zmq.Poller()
126 poller.register(s, zmq.POLLIN)
127
128 while True:
129 log.debug("Polling...")
130 evts = poller.poll(10000)
131 if not evts:
132 continue
133
134 log.debug("Receiving...")
135 topic, msg = s.recv_multipart()
136
137 log.debug("Parsing...")
138 data = json.loads(msg)
139
140 namespace = data['msg']['repo']['namespace']
141 repo_name = data['msg']['repo']['name']
142 branch = data['msg']['branch']
143 start_commit = data['msg']['start_commit']
144 end_commit = data['msg']['end_commit']
145
146 if namespace:
147 clone_url_subpart = '/' + namespace + '/' + repo_name
148 else:
149 clone_url_subpart = '/' + repo_name
150
151 log.info("MSG:")
152 log.info("\tclone_url_subpart = {}".format(clone_url_subpart))
153 log.info("\tbranch = {}".format(branch))
154
155 tito_candidates = Package.get_candidates_for_rebuild(TITO_TYPE, clone_url_subpart)
156 scm_candidates = Package.get_candidates_for_rebuild(MOCK_SCM_TYPE, clone_url_subpart)
157
158 raw_commit_text = None
159
160 if tito_candidates and start_commit == end_commit:
161 raw_commit_url = PAGURE_BASE_URL + clone_url_subpart + '/raw/' + start_commit
162 r = requests.get(raw_commit_url)
163 if r.status_code == requests.codes.ok:
164 raw_commit_text = r.text
165 else:
166 log.error("Bad http status {0} from url {1}".format(r.status_code, raw_commit_url))
167
168 for pkg in tito_candidates:
169 log.info("Considering pkg id:{}, source_json:{}".format(pkg.pkg_id, pkg.source_json))
170 if (pkg.git_url.endswith(clone_url_subpart) or pkg.git_url.endswith(clone_url_subpart+'.git')) \
171 and (not pkg.git_branch or branch.endswith('/'+pkg.git_branch)) \
172 and pkg.is_dir_in_commit(raw_commit_text):
173 log.info("\t -> rebuilding.")
174 pkg.build()
175 else:
176 log.info("\t -> skipping.")
177
178 for pkg in scm_candidates:
179 log.info("Considering pkg id:{}, source_json:{}".format(pkg.pkg_id, pkg.source_json))
180 if (pkg.scm_url.endswith(clone_url_subpart) or pkg.scm_url.endswith(clone_url_subpart+'.git')) \
181 and (not pkg.scm_branch or branch.endswith('/'+pkg.scm_branch)):
182 log.info("\t -> rebuilding.")
183 pkg.build()
184 else:
185 log.info("\t -> skipping.")
186
187 if __name__ == '__main__':
188 while True:
189 try:
190 build_on_fedmsg_loop()
191 except:
192 log.exception("Error in fedmsg loop. Restarting it.")
193