draft of history
This commit is contained in:
parent
85cbdc00ad
commit
e3b13edc1c
3 changed files with 117 additions and 10 deletions
51
diffido.py
51
diffido.py
|
@ -2,6 +2,8 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
import io
|
||||||
import json
|
import json
|
||||||
import shutil
|
import shutil
|
||||||
import urllib
|
import urllib
|
||||||
|
@ -28,6 +30,9 @@ API_VERSION = '1.0'
|
||||||
SCHEDULES_FILE = 'conf/schedules.json'
|
SCHEDULES_FILE = 'conf/schedules.json'
|
||||||
GIT_CMD = 'git'
|
GIT_CMD = 'git'
|
||||||
|
|
||||||
|
re_insertion = re.compile(r'(\d+) insertion')
|
||||||
|
re_deletion = re.compile(r'(\d+) deletion')
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
logger.setLevel(logging.INFO)
|
logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
@ -68,7 +73,7 @@ def run_job(id_=None, *args, **kwargs):
|
||||||
url = schedule.get('url')
|
url = schedule.get('url')
|
||||||
if not url:
|
if not url:
|
||||||
return
|
return
|
||||||
print('Running job id:%s title:%s url: %s' % (id_, schedule.get('title', ''), url))
|
logger.debug('Running job id:%s title:%s url: %s' % (id_, schedule.get('title', ''), url))
|
||||||
req = requests.get(url, allow_redirects=True, timeout=(30.10, 240))
|
req = requests.get(url, allow_redirects=True, timeout=(30.10, 240))
|
||||||
content = req.text
|
content = req.text
|
||||||
req_path = urllib.parse.urlparse(req.url).path
|
req_path = urllib.parse.urlparse(req.url).path
|
||||||
|
@ -86,6 +91,41 @@ def run_job(id_=None, *args, **kwargs):
|
||||||
p.join()
|
p.join()
|
||||||
|
|
||||||
|
|
||||||
|
def get_history(id_):
|
||||||
|
def _history(id_, queue):
|
||||||
|
os.chdir('storage/%s' % id_)
|
||||||
|
p = subprocess.Popen([GIT_CMD, 'log', '--pretty=oneline', '--shortstat'], stdout=subprocess.PIPE)
|
||||||
|
stdout, _ = p.communicate()
|
||||||
|
queue.put(stdout)
|
||||||
|
queue = multiprocessing.Queue()
|
||||||
|
p = multiprocessing.Process(target=_history, args=(id_, queue))
|
||||||
|
p.start()
|
||||||
|
res = queue.get().decode('utf-8')
|
||||||
|
p.join()
|
||||||
|
history = []
|
||||||
|
res_io = io.StringIO(res)
|
||||||
|
while True:
|
||||||
|
commit_line = res_io.readline().strip()
|
||||||
|
if not commit_line:
|
||||||
|
break
|
||||||
|
commit_id, message = commit_line.split(' ', 1)
|
||||||
|
if len(commit_id) != 40:
|
||||||
|
continue
|
||||||
|
changes_line = res_io.readline().strip()
|
||||||
|
insert = re_insertion.findall(changes_line)
|
||||||
|
if insert:
|
||||||
|
insert = int(insert[0])
|
||||||
|
else:
|
||||||
|
insert = 0
|
||||||
|
delete = re_deletion.findall(changes_line)
|
||||||
|
if delete:
|
||||||
|
delete = int(delete[0])
|
||||||
|
else:
|
||||||
|
delete = 0
|
||||||
|
history.append({'id': commit_id, 'message': message, 'insertions': insert, 'deletions': delete,
|
||||||
|
'changes': max(insert, delete)})
|
||||||
|
return history
|
||||||
|
|
||||||
def scheduler_update(scheduler, id_):
|
def scheduler_update(scheduler, id_):
|
||||||
schedule = get_schedule(id_, addID=False)
|
schedule = get_schedule(id_, addID=False)
|
||||||
if not schedule:
|
if not schedule:
|
||||||
|
@ -259,6 +299,12 @@ class ResetSchedulesHandler(BaseHandler):
|
||||||
reset_from_schedules(self.scheduler)
|
reset_from_schedules(self.scheduler)
|
||||||
|
|
||||||
|
|
||||||
|
class HistoryHandler(BaseHandler):
|
||||||
|
@gen.coroutine
|
||||||
|
def get(self, id_, *args, **kwargs):
|
||||||
|
self.write({'history': get_history(id_)})
|
||||||
|
|
||||||
|
|
||||||
class TemplateHandler(BaseHandler):
|
class TemplateHandler(BaseHandler):
|
||||||
"""Handler for the / path."""
|
"""Handler for the / path."""
|
||||||
app_path = os.path.join(os.path.dirname(__file__), "dist")
|
app_path = os.path.join(os.path.dirname(__file__), "dist")
|
||||||
|
@ -300,11 +346,14 @@ def serve():
|
||||||
|
|
||||||
_reset_schedules_path = r'schedules/reset'
|
_reset_schedules_path = r'schedules/reset'
|
||||||
_schedules_path = r'schedules/?(?P<id_>\d+)?'
|
_schedules_path = r'schedules/?(?P<id_>\d+)?'
|
||||||
|
_history_path = r'history/?(?P<id_>\d+)'
|
||||||
application = tornado.web.Application([
|
application = tornado.web.Application([
|
||||||
('/api/%s' % _reset_schedules_path, ResetSchedulesHandler, init_params),
|
('/api/%s' % _reset_schedules_path, ResetSchedulesHandler, init_params),
|
||||||
(r'/api/v%s/%s' % (API_VERSION, _reset_schedules_path), ResetSchedulesHandler, init_params),
|
(r'/api/v%s/%s' % (API_VERSION, _reset_schedules_path), ResetSchedulesHandler, init_params),
|
||||||
('/api/%s' % _schedules_path, SchedulesHandler, init_params),
|
('/api/%s' % _schedules_path, SchedulesHandler, init_params),
|
||||||
(r'/api/v%s/%s' % (API_VERSION, _schedules_path), SchedulesHandler, init_params),
|
(r'/api/v%s/%s' % (API_VERSION, _schedules_path), SchedulesHandler, init_params),
|
||||||
|
('/api/%s' % _history_path, HistoryHandler, init_params),
|
||||||
|
(r'/api/v%s/%s' % (API_VERSION, _history_path), HistoryHandler, init_params),
|
||||||
(r'/?(.*)', TemplateHandler, init_params),
|
(r'/?(.*)', TemplateHandler, init_params),
|
||||||
],
|
],
|
||||||
static_path=os.path.join(os.path.dirname(__file__), 'dist/static'),
|
static_path=os.path.join(os.path.dirname(__file__), 'dist/static'),
|
||||||
|
|
63
dist/history.html
vendored
Normal file
63
dist/history.html
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<div id="app">
|
||||||
|
<div class="md-layout">
|
||||||
|
<div class="md-layout-item" md-card>
|
||||||
|
<md-table id="history-table" v-model="history">
|
||||||
|
<md-table-toolbar>
|
||||||
|
<h1 class="md-title">History</h1>
|
||||||
|
</md-table-toolbar>
|
||||||
|
<md-table-row slot="md-table-row" slot-scope="{item}">
|
||||||
|
<md-table-cell md-label="commit ID" md-sort-by="id">${ item.id }</md-table-cell>
|
||||||
|
<md-table-cell md-label="message" md-sort-by="message">${ item.message }</md-table-cell>
|
||||||
|
</md-table-row>
|
||||||
|
</md-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
Vue.use(VueMaterial.default);
|
||||||
|
|
||||||
|
var app = new Vue({
|
||||||
|
el: '#app',
|
||||||
|
delimiters: ['${', '}'],
|
||||||
|
data: {
|
||||||
|
history: [],
|
||||||
|
{% if isinstance(id, str) %}
|
||||||
|
id: "{{id}}",
|
||||||
|
{% else %}
|
||||||
|
id: null,
|
||||||
|
{% end %}
|
||||||
|
},
|
||||||
|
mounted: function() {
|
||||||
|
this.getHistory();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getHistory: function() {
|
||||||
|
self = this;
|
||||||
|
var data = axios.get('/api/history/' + this.id).then(function(response) {
|
||||||
|
console.log(response);
|
||||||
|
self.history = response.data.history;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-table {
|
||||||
|
width: 60%;
|
||||||
|
min-height: 800px;
|
||||||
|
max-height: 800px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{% end %}
|
13
dist/index.html
vendored
13
dist/index.html
vendored
|
@ -9,9 +9,10 @@
|
||||||
<h1 class="md-title">Schedules <a href="schedule.html">add new</a></h1>
|
<h1 class="md-title">Schedules <a href="schedule.html">add new</a></h1>
|
||||||
</md-table-toolbar>
|
</md-table-toolbar>
|
||||||
<md-table-row slot="md-table-row" slot-scope="{item}">
|
<md-table-row slot="md-table-row" slot-scope="{item}">
|
||||||
<md-table-cell md-label="#" md-sort-by="id" md-numeric><a :href="settingsUrl(item)">${ item.id }</a></md-table-cell>
|
<md-table-cell md-label="#" md-sort-by="id" md-numeric><a :href="'/schedule.html?id=' + item.id">${ item.id }</a></md-table-cell>
|
||||||
<md-table-cell md-label="title" md-sort-by="title"><a :href="settingsUrl(item)">${ item.title }</a></md-table-cell>
|
<md-table-cell md-label="title" md-sort-by="title"><a :href="'/schedule.html?id=' + item.id">${ item.title }</a></md-table-cell>
|
||||||
<md-table-cell md-label="url" md-sort-by="email">${ item.url }</md-table-cell>
|
<md-table-cell md-label="url" md-sort-by="email"><a :href="item.url" target="_new">${ item.url }</a></md-table-cell>
|
||||||
|
<md-table-cell md-label="history" md-sort-by="email"><a :href="'/history.html?id=' + item.id">history</a></md-table-cell>
|
||||||
</md-table-row>
|
</md-table-row>
|
||||||
</md-table>
|
</md-table>
|
||||||
</div>
|
</div>
|
||||||
|
@ -34,12 +35,6 @@ var app = new Vue({
|
||||||
computed: {
|
computed: {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
settingsUrl: function(item) {
|
|
||||||
if (!(item && item.id !== undefined)) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
return '/schedule.html?id=' + item.id;
|
|
||||||
},
|
|
||||||
getSchedules: function() {
|
getSchedules: function() {
|
||||||
self = this;
|
self = this;
|
||||||
var data = axios.get('/api/schedules').then(function(response) {
|
var data = axios.get('/api/schedules').then(function(response) {
|
||||||
|
|
Loading…
Reference in a new issue