diff --git a/changelog.txt b/changelog.txt
index 88cd4c9..133dc47 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -6,6 +6,7 @@ Version 0.3.0 (2018-)
- CREDENTIALS setting replaced by USERNAME and PASSWORD @danielperna84
- PASSWORD can optionally be provided as SHA256 hash (Issue #100) @danielperna84
- Added SESAME_TOTP_SECRET for TOTP based IP whitelisting (Issue #100) @danielperna84
+- Added git diff functionality (Issue #16) @danielperna84
Version 0.2.9 (2018-06-22)
- Material Icons and HASS-help now open in new tab instead of modal (Issues #85 and #34) @danielperna84
diff --git a/configurator.py b/configurator.py
index dbb667a..53f51a4 100755
--- a/configurator.py
+++ b/configurator.py
@@ -2562,6 +2562,14 @@ INDEX = Template(r"""
dd_gitadd_a.innerHTML = "git add";
dd_gitadd.appendChild(dd_gitadd_a);
dropdown.appendChild(dd_gitadd);
+ // git diff button
+ var dd_gitdiff = document.createElement('li');
+ var dd_gitdiff_a = document.createElement('a');
+ dd_gitdiff_a.classList.add('waves-effect', 'fb_dd', 'modal-trigger');
+ dd_gitdiff_a.setAttribute('onclick', "gitdiff()");
+ dd_gitdiff_a.innerHTML = "git diff";
+ dd_gitdiff.appendChild(dd_gitdiff_a);
+ dropdown.appendChild(dd_gitdiff);
}
}
@@ -3051,6 +3059,26 @@ INDEX = Template(r"""
}
}
+ function gitdiff() {
+ var path = document.getElementById('fb_currentfile').value;
+ closefile();
+ if (path.length > 0) {
+ data = new Object();
+ data.path = path;
+ $.post("api/gitdiff", data).done(function(resp) {
+ if (resp.error) {
+ var $toastContent = $("
" + resp.message + "\n" + resp.path + "
");
+ Materialize.toast($toastContent, 5000);
+ }
+ else {
+ editor.setOption('mode', modemapping['diff']);
+ editor.getSession().setValue(resp.message, -1);
+ editor.session.getUndoManager().markClean();
+ }
+ });
+ }
+ }
+
function gitinit() {
var path = document.getElementById("fbheader").innerHTML;
if (path.length > 0) {
@@ -4144,6 +4172,41 @@ class RequestHandler(BaseHTTPRequestHandler):
LOG.warning(err)
else:
response['message'] = "Missing filename"
+ elif req.path.endswith('/api/gitdiff'):
+ try:
+ postvars = parse_qs(self.rfile.read(length).decode('utf-8'),
+ keep_blank_values=1)
+ except Exception as err:
+ LOG.warning(err)
+ response['message'] = "%s" % (str(err))
+ postvars = {}
+ if 'path' in postvars.keys():
+ if postvars['path']:
+ try:
+ diffpath = unquote(postvars['path'][0])
+ repo = REPO(diffpath,
+ search_parent_directories=True)
+ filepath = "/".join(diffpath.split(os.sep)[len(repo.working_dir.split(os.sep)):])
+ response['path'] = filepath
+ try:
+ diff = repo.index.diff(None, create_patch=True, paths=filepath)[0].diff.decode("utf-8")
+ response['error'] = False
+ response['message'] = diff
+ self.send_response(200)
+ self.send_header('Content-type', 'text/json')
+ self.end_headers()
+ self.wfile.write(bytes(json.dumps(response), "utf8"))
+ return
+ except Exception as err:
+ LOG.warning(err)
+ response['error'] = True
+ response['message'] = str(err)
+
+ except Exception as err:
+ response['message'] = "%s" % (str(err))
+ LOG.warning(err)
+ else:
+ response['message'] = "Missing filename"
elif req.path.endswith('/api/commit'):
try:
postvars = parse_qs(self.rfile.read(length).decode('utf-8'),
diff --git a/dev.html b/dev.html
index 3121431..e59714a 100644
--- a/dev.html
+++ b/dev.html
@@ -2456,6 +2456,14 @@
dd_gitadd_a.innerHTML = "git add";
dd_gitadd.appendChild(dd_gitadd_a);
dropdown.appendChild(dd_gitadd);
+ // git diff button
+ var dd_gitdiff = document.createElement('li');
+ var dd_gitdiff_a = document.createElement('a');
+ dd_gitdiff_a.classList.add('waves-effect', 'fb_dd', 'modal-trigger');
+ dd_gitdiff_a.setAttribute('onclick', "gitdiff()");
+ dd_gitdiff_a.innerHTML = "git diff";
+ dd_gitdiff.appendChild(dd_gitdiff_a);
+ dropdown.appendChild(dd_gitdiff);
}
}
@@ -2945,6 +2953,26 @@
}
}
+ function gitdiff() {
+ var path = document.getElementById('fb_currentfile').value;
+ closefile();
+ if (path.length > 0) {
+ data = new Object();
+ data.path = path;
+ $.post("api/gitdiff", data).done(function(resp) {
+ if (resp.error) {
+ var $toastContent = $("" + resp.message + "\n" + resp.path + "
");
+ Materialize.toast($toastContent, 5000);
+ }
+ else {
+ editor.setOption('mode', modemapping['diff']);
+ editor.getSession().setValue(resp.message, -1);
+ editor.session.getUndoManager().markClean();
+ }
+ });
+ }
+ }
+
function gitinit() {
var path = document.getElementById("fbheader").innerHTML;
if (path.length > 0) {