diff --git a/diffido.py b/diffido.py index 9a896bb..e174a63 100755 --- a/diffido.py +++ b/diffido.py @@ -65,10 +65,10 @@ def next_id(schedules): return str(max([int(i) for i in ids]) + 1) -def get_schedule(id_, addID=True): +def get_schedule(id_, add_id=True): schedules = read_schedules() data = schedules.get('schedules', {}).get(id_, {}) - if addID: + if add_id: data['id'] = str(id_) return data @@ -81,14 +81,14 @@ def select_xpath(content, xpath): return content selected_content = [] for elem in elems: - selected_content.append(''.join([elem.text] + [ElementTree.tostring(e).decode('utf8', 'replace') + selected_content.append(''.join([elem.text] + [ElementTree.tostring(e).decode('utf-8', 'replace') for e in elem.getchildren()])) content = ''.join(selected_content) return content def run_job(id_=None, *args, **kwargs): - schedule = get_schedule(id_, addID=False) + schedule = get_schedule(id_, add_id=False) url = schedule.get('url') if not url: return @@ -147,10 +147,22 @@ def run_job(id_=None, *args, **kwargs): return # send notification diff = get_diff(id_) - msg = MIMEText('changes:\n\n%s' % diff.get('diff')) - msg['Subject'] = '%s page changed' % schedule.get('title') - msg['From'] = 'Diffido ' - msg['To'] = email + send_email(to=email, subject='%s page changed' % schedule.get('title'), + body='changes:\n\n%s' % diff.get('diff')) + + +def safe_run_job(id_=None, *args, **kwargs): + try: + run_job(id_, *args, **kwargs) + except Exception as e: + send_email('error executing job %s: %s' % (id_, e)) + + +def send_email(to, subject='diffido', body='', from_=None): + msg = MIMEText(body) + msg['Subject'] = subject + msg['From'] = from_ or 'Diffido ' + msg['To'] = to s = smtplib.SMTP('localhost') s.send_message(msg) s.quit() @@ -197,14 +209,15 @@ def get_history(id_): return {'history': history, 'lastid': lastid} -def get_diff(id_, diff='HEAD', oldid=None): - def _history(id_, diff, oldid, queue): +def get_diff(id_, commit_id='HEAD', old_commit_id=None): + def _history(id_, commit_id, old_commit_id, queue): os.chdir('storage/%s' % id_) - p = subprocess.Popen([GIT_CMD, 'diff', diff, oldid or '%s~' % diff], stdout=subprocess.PIPE) + p = subprocess.Popen([GIT_CMD, 'commit_id', old_commit_id or '%s~' % commit_id, commit_id], + stdout=subprocess.PIPE) stdout, _ = p.communicate() queue.put(stdout) queue = multiprocessing.Queue() - p = multiprocessing.Process(target=_history, args=(id_, diff, oldid, queue)) + p = multiprocessing.Process(target=_history, args=(id_, commit_id, old_commit_id, queue)) p.start() res = queue.get().decode('utf-8') p.join() @@ -212,7 +225,7 @@ def get_diff(id_, diff='HEAD', oldid=None): def scheduler_update(scheduler, id_): - schedule = get_schedule(id_, addID=False) + schedule = get_schedule(id_, add_id=False) if not schedule: return trigger = schedule.get('trigger') @@ -229,7 +242,7 @@ def scheduler_update(scheduler, id_): cron_trigger = CronTrigger.from_crontab(schedule.get('cron_crontab')) args['trigger'] = cron_trigger git_create_repo(id_) - scheduler.add_job(run_job, id=id_, replace_existing=True, kwargs={'id_': id_}, **args) + scheduler.add_job(safe_run_job, id=id_, replace_existing=True, kwargs={'id_': id_}, **args) def scheduler_delete(scheduler, id_): @@ -392,8 +405,8 @@ class HistoryHandler(BaseHandler): class DiffHandler(BaseHandler): @gen.coroutine - def get(self, id_, diff, oldid=None, *args, **kwargs): - self.write(get_diff(id_, diff, oldid)) + def get(self, id_, commit_id, old_commit_id=None, *args, **kwargs): + self.write(get_diff(id_, commit_id, old_commit_id)) class TemplateHandler(BaseHandler): @@ -442,8 +455,7 @@ def serve(): _reset_schedules_path = r'schedules/reset' _schedules_path = r'schedules/?(?P\d+)?' _history_path = r'history/?(?P\d+)' - _diff_path = r'diff/(?P\d+)/(?P\s+)/?(?P\s+)?' - _diff_path = r'diff/(?P\d+)/(?P[0-9a-f]+)/?(?P[0-9a-f]+)?/?' + _diff_path = r'diff/(?P\d+)/(?P[0-9a-f]+)/?(?P[0-9a-f]+)?/?' application = tornado.web.Application([ (r'/api/%s' % _reset_schedules_path, ResetSchedulesHandler, init_params), (r'/api/v%s/%s' % (API_VERSION, _reset_schedules_path), ResetSchedulesHandler, init_params),