From a8fbb22feae8299ebca27fded99b4e08b46347d6 Mon Sep 17 00:00:00 2001 From: Daniel Perna Date: Wed, 11 Jul 2018 23:51:22 +0200 Subject: [PATCH] Added git diff functionality (Issue #16) --- changelog.txt | 1 + configurator.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ dev.html | 28 ++++++++++++++++++++++ 3 files changed, 92 insertions(+) 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) {