bug fix to docker volume mapping

This commit is contained in:
usmannasir
2019-02-06 17:53:07 +05:00
parent f2a1b09964
commit d95b847d80
7 changed files with 534 additions and 483 deletions

View File

@@ -570,7 +570,7 @@ def changeAdminPassword(request):
firstName="Cyber", lastName="Panel", acl=acl, token=token) firstName="Cyber", lastName="Panel", acl=acl, token=token)
admin.save() admin.save()
vers = version(currentVersion="1.8", build=0) vers = version(currentVersion="1.8", build=1)
vers.save() vers.save()
package = Package(admin=admin, packageName="Default", diskSpace=1000, package = Package(admin=admin, packageName="Default", diskSpace=1000,

View File

@@ -1005,6 +1005,8 @@ class ContainerManager(multi.Thread):
volumes = {} volumes = {}
for index, volume in volList.iteritems(): for index, volume in volList.iteritems():
if volume['src'] == '' or volume['dest'] == '':
continue
volumes[volume['src']] = {'bind': volume['dest'], volumes[volume['src']] = {'bind': volume['dest'],
'mode': 'rw'} 'mode': 'rw'}
# Prepare data for recreate function # Prepare data for recreate function

View File

@@ -569,12 +569,12 @@ app.controller('viewContainer', function ($scope, $http) {
$('#actionLoading').hide(); $('#actionLoading').hide();
} }
}) })
} };
$scope.addEnvField = function () { $scope.addEnvField = function () {
var countEnv = Object.keys($scope.envList).length; var countEnv = Object.keys($scope.envList).length;
$scope.envList[countEnv + 1] = {'name': '', 'value': ''}; $scope.envList[countEnv + 1] = {'name': '', 'value': ''};
} };
$scope.showTop = function () { $scope.showTop = function () {
$scope.topHead = []; $scope.topHead = [];
@@ -615,7 +615,7 @@ app.controller('viewContainer', function ($scope, $http) {
$scope.loadingTop = false; $scope.loadingTop = false;
} }
} };
$scope.cRemove = function () { $scope.cRemove = function () {
(new PNotify({ (new PNotify({
@@ -672,7 +672,7 @@ app.controller('viewContainer', function ($scope, $http) {
$('#actionLoading').hide(); $('#actionLoading').hide();
} }
}) })
} };
$scope.refreshStatus = function () { $scope.refreshStatus = function () {
url = "/docker/getContainerStatus"; url = "/docker/getContainerStatus";
@@ -784,7 +784,7 @@ app.controller('viewContainer', function ($scope, $http) {
$scope.rPolicy = "No"; $scope.rPolicy = "No";
} }
} };
$scope.cAction = function (action) { $scope.cAction = function (action) {
$('#actionLoading').show(); $('#actionLoading').show();
@@ -831,7 +831,7 @@ app.controller('viewContainer', function ($scope, $http) {
$('#actionLoading').hide(); $('#actionLoading').hide();
} }
} };
$scope.loadLogs = function (name) { $scope.loadLogs = function (name) {
$scope.logs = "Loading..."; $scope.logs = "Loading...";
@@ -865,7 +865,7 @@ app.controller('viewContainer', function ($scope, $http) {
console.log("not good"); console.log("not good");
$scope.logs = "Error loading log"; $scope.logs = "Error loading log";
} }
} };
}); });

View File

@@ -17,7 +17,8 @@
<div ng-controller="runContainer" class="panel"> <div ng-controller="runContainer" class="panel">
<div class="panel-body"> <div class="panel-body">
<h3 class="title-hero"> <h3 class="title-hero">
{% trans "Container Details" %} <img ng-hide="containerCreationLoading" src="{% static 'images/loading.gif' %}"> {% trans "Container Details" %} <img ng-hide="containerCreationLoading"
src="{% static 'images/loading.gif' %}">
</h3> </h3>
<div class="example-box-wrapper"> <div class="example-box-wrapper">
@@ -34,14 +35,16 @@
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Image" %}</label> <label class="col-sm-3 control-label">{% trans "Image" %}</label>
<div class="col-sm-6" ng-init="image='{{ image }}' "> <div class="col-sm-6" ng-init="image='{{ image }}' ">
<input name="image" type="text" class="form-control" ng-model="image" required disabled="disabled"> <input name="image" type="text" class="form-control" ng-model="image" required
disabled="disabled">
</div> </div>
</div> </div>
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Tag" %}</label> <label class="col-sm-3 control-label">{% trans "Tag" %}</label>
<div class="col-sm-6" ng-init="tag='{{ tag }}' "> <div class="col-sm-6" ng-init="tag='{{ tag }}' ">
<input name="tag" type="text" class="form-control" ng-model="tag" required disabled="disabled"> <input name="tag" type="text" class="form-control" ng-model="tag" required
disabled="disabled">
</div> </div>
</div> </div>
@@ -70,14 +73,17 @@
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Port" %}</label> <label class="col-sm-3 control-label">{% trans "Port" %}</label>
<div class="col-sm-2" ng-init="iport[{{ port }}]={{ port }} "> <div class="col-sm-2" ng-init="iport[{{ port }}]={{ port }} ">
<input name="iport[{{port}}]" type="text" class="form-control" ng-model="iport[{{port}}]" required disabled="disabled"> <input name="iport[{{ port }}]" type="text" class="form-control"
ng-model="iport[{{ port }}]" required disabled="disabled">
</div> </div>
<div class="col-sm-1" ng-init="portType['{{ port }}']='{{ protocol }}'"> <div class="col-sm-1" ng-init="portType['{{ port }}']='{{ protocol }}'">
<input name="portType['{{port}}']" type="text" class="form-control" ng-model="portType['{{port}}']" required disabled="disabled"> <input name="portType['{{ port }}']" type="text" class="form-control"
ng-model="portType['{{ port }}']" required disabled="disabled">
</div> </div>
<div class="col-sm-1 current-pack text-center">to</div> <div class="col-sm-1 current-pack text-center">to</div>
<div class="col-sm-2"> <div class="col-sm-2">
<input name="eport['{{port}}']" type="number" class="form-control" ng-model="eport['{{port}}']" required> <input name="eport['{{ port }}']" type="number" class="form-control"
ng-model="eport['{{ port }}']" required>
</div> </div>
</div> </div>
@@ -99,17 +105,20 @@
</div> </div>
</label> </label>
<div class="col-sm-2"> <div class="col-sm-2">
<input name="$index" type="text" class="form-control" ng-model="envList[$index].name" required> <input name="$index" type="text" class="form-control"
ng-model="envList[$index].name" required>
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
<input name="$index" type="text" class="form-control" ng-model="envList[$index].value" required> <input name="$index" type="text" class="form-control"
ng-model="envList[$index].value" required>
</div> </div>
</div> </div>
</div> </div>
<div ng-hide="installationDetailsForm" class="col-md-offset-3"> <div ng-hide="installationDetailsForm" class="col-md-offset-3">
<button type="button" class="btn btn-info" ng-click="addEnvField()">Add more</button> <button type="button" class="btn btn-info" ng-click="addEnvField()">Add more</button>
</div><br> </div>
<br>
<div ng-hide="installationDetailsForm" class="form-group text-center"> <div ng-hide="installationDetailsForm" class="form-group text-center">
<label class="control-label"> <label class="control-label">
@@ -119,16 +128,20 @@
<div ng-repeat="volume in volList track by $index"> <div ng-repeat="volume in volList track by $index">
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<div class="col-sm-3"></div> <div class="col-sm-1"></div>
<div class="col-sm-2"> <div class="col-sm-5">
<input type="text" class="form-control" ng-model="volList[$index].dest" placeholder="Destination" required> <input type="text" class="form-control" ng-model="volList[$index].dest"
placeholder="Destination" required>
</div> </div>
<div class="col-sm-4"> <div class="col-sm-5">
<input type="text" class="form-control" ng-model="volList[$index].src" placeholder="Source" required> <input type="text" class="form-control" ng-model="volList[$index].src"
placeholder="Source" required>
</div> </div>
<div ng-show="$last"> <div ng-show="$last">
<div class="col-sm-1"> <div class="col-sm-1">
<button class="btn btn-primary" type="button" ng-click="removeVolField()"><i class="fa fa-times"></i></button> <button class="btn btn-primary" type="button" ng-click="removeVolField()"><i
style="position: inherit; top: 0px; left: 0px" class="fa fa-times"></i>
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -136,19 +149,21 @@
</div> </div>
<div ng-hide="installationDetailsForm" class="text-center"> <div ng-hide="installationDetailsForm" class="text-center">
<button type="button" class="btn btn-info" ng-click="addVolField()">{% trans "Add field" %}</button> <button type="button" class="btn btn-info"
</div><br> ng-click="addVolField()">{% trans "Add field" %}</button>
</div>
<br>
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-4"> <div class="col-sm-4">
<button type="button" ng-click="createContainer()" class="btn btn-primary btn-lg btn-block">{% trans "Create Container" %}</button> <button type="button" ng-click="createContainer()"
class="btn btn-primary btn-lg btn-block">{% trans "Create Container" %}</button>
</div> </div>
</div> </div>
<div ng-hide="installationProgress" class="form-group"> <div ng-hide="installationProgress" class="form-group">
<label class="col-sm-2 control-label"></label> <label class="col-sm-2 control-label"></label>
<div class="col-sm-7"> <div class="col-sm-7">
@@ -166,7 +181,6 @@
</div> </div>
<div ng-hide="couldNotConnect" class="alert alert-danger"> <div ng-hide="couldNotConnect" class="alert alert-danger">
<p>{% trans "Could not connect to server. Please refresh this page." %}</p> <p>{% trans "Could not connect to server. Please refresh this page." %}</p>
</div> </div>
@@ -178,7 +192,8 @@
<div ng-hide="installationProgress" class="form-group"> <div ng-hide="installationProgress" class="form-group">
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-4"> <div class="col-sm-4">
<button type="button" ng-disabled="goBackDisable" ng-click="goBack()" class="btn btn-primary btn-lg btn-block">{% trans "Go Back" %}</button> <button type="button" ng-disabled="goBackDisable" ng-click="goBack()"
class="btn btn-primary btn-lg btn-block">{% trans "Go Back" %}</button>
</div> </div>
</div> </div>
@@ -190,7 +205,6 @@
</div> </div>
</div> </div>

View File

@@ -55,7 +55,6 @@
</div> </div>
</div> </div>
</div> </div>
@@ -69,7 +68,8 @@
{% trans "Container ID" %}: {{ cid }} {% trans "Container ID" %}: {{ cid }}
<br> <br>
{% trans "Image" %}: {{ image }} {% trans "Image" %}: {{ image }}
<span ng-show="'{{image}}' == 'unknown:unknown'" title="Actions involving container recreation cannot be executed"> <span ng-show="'{{ image }}' == 'unknown:unknown'"
title="Actions involving container recreation cannot be executed">
<i class="fa fa-warning btn-icon"></i> <i class="fa fa-warning btn-icon"></i>
</span> </span>
<br> <br>
@@ -82,8 +82,12 @@
</div> </div>
<button class="btn btn-warning" data-toggle="modal" data-target="#settings"><i class="fa fa-gear btn-icon"></i> Settings</button> <button class="btn btn-warning" data-toggle="modal" data-target="#settings"><i
<button class="btn btn-warning" ng-click="recreate()"><i class="fa fa-refresh btn-icon"></i> Recreate</button> class="fa fa-gear btn-icon"></i> Settings
</button>
<button class="btn btn-warning" ng-click="recreate()"><i
class="fa fa-refresh btn-icon"></i> Recreate
</button>
</div> </div>
</div> </div>
@@ -113,14 +117,23 @@
<div class="panel-body"> <div class="panel-body">
<div class="example-box-wrapper"> <div class="example-box-wrapper">
<h3 class="title-hero" ng-init="status='{{ status }}'">Main Actions <h3 class="title-hero" ng-init="status='{{ status }}'">Main Actions
<img id="actionLoading" src="/static/images/loading.gif" style="display: none;width: 20px;"> <img id="actionLoading" src="/static/images/loading.gif"
style="display: none;width: 20px;">
</h3> </h3>
<b>Status:</b> <span ng-bind="status"></span> <b>Status:</b> <span ng-bind="status"></span>
<span ng-click='refreshStatus()' style="cursor:pointer;" class="pull-right" title="Refresh status"><i class="fa fa-refresh btn-icon"></i></span> <span ng-click='refreshStatus()' style="cursor:pointer;" class="pull-right"
title="Refresh status"><i class="fa fa-refresh btn-icon"></i></span>
<hr> <hr>
<button ng-disabled="status=='running'" class="btn btn-primary" ng-click="cAction('start')"><i class="fa fa-play btn-icon"></i> Start</button> <button ng-disabled="status=='running'" class="btn btn-primary"
<button ng-disabled="status!='running'" class="btn btn-primary" ng-click="cAction('restart')"><i class="fa fa-refresh btn-icon"></i> Restart</button> ng-click="cAction('start')"><i class="fa fa-play btn-icon"></i> Start
<button ng-disabled="status!='running'" class="btn btn-primary" ng-click="cAction('stop')"><i class="fa fa-stop btn-icon"></i> Stop</button> </button>
<button ng-disabled="status!='running'" class="btn btn-primary"
ng-click="cAction('restart')"><i class="fa fa-refresh btn-icon"></i>
Restart
</button>
<button ng-disabled="status!='running'" class="btn btn-primary"
ng-click="cAction('stop')"><i class="fa fa-stop btn-icon"></i> Stop
</button>
<button class="btn btn-primary" ng-click="cRemove()">Remove</button> <button class="btn btn-primary" ng-click="cRemove()">Remove</button>
</div> </div>
</div> </div>
@@ -131,10 +144,15 @@
<div class="panel"> <div class="panel">
<div class="panel-body"> <div class="panel-body">
<div class="example-box-wrapper"> <div class="example-box-wrapper">
<h3 class="title-hero" ng-init="rPolicy='{{restartPolicy}}'">Other Actions</h3> <h3 class="title-hero" ng-init="rPolicy='{{ restartPolicy }}'">Other
<b>Restart on system reboot:</b> <span ng-bind="rPolicy"></span><hr> Actions</h3>
<a href="/docker/exportContainer/?name={{name}}" class="btn btn-primary">Export file</a> <b>Restart on system reboot:</b> <span ng-bind="rPolicy"></span>
<button class="btn btn-primary" ng-disabled="loadingTop" ng-click="showTop()">View Process</button> <hr>
<a href="/docker/exportContainer/?name={{ name }}" class="btn btn-primary">Export
file</a>
<button class="btn btn-primary" ng-disabled="loadingTop" ng-click="showTop()">
View Process
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -154,7 +172,8 @@
<h3 class="content-box-header" ng-init="loadLogs('{{ name }}')"> <h3 class="content-box-header" ng-init="loadLogs('{{ name }}')">
{% trans "Logs" %} {% trans "Logs" %}
<span style="cursor:pointer;" class="pull-right" ng-click="loadLogs('{{name}}')"><i class="fa fa-refresh btn-icon"></i></span> <span style="cursor:pointer;" class="pull-right" ng-click="loadLogs('{{ name }}')"><i
class="fa fa-refresh btn-icon"></i></span>
</h3> </h3>
@@ -169,7 +188,6 @@
</div> </div>
<div id="settings" class="modal fade" role="dialog"> <div id="settings" class="modal fade" role="dialog">
<div class="modal-dialog"> <div class="modal-dialog">
@@ -197,7 +215,8 @@
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox" ng-init="startOnReboot={{ startOnReboot }}"> <div class="checkbox" ng-init="startOnReboot={{ startOnReboot }}">
<label> <label>
<input ng-model="startOnReboot" type="checkbox" value="" class="ng-pristine ng-untouched ng-valid ng-empty"> <input ng-model="startOnReboot" type="checkbox" value=""
class="ng-pristine ng-untouched ng-valid ng-empty">
</label> </label>
</div> </div>
</div> </div>
@@ -232,25 +251,29 @@
</div> </div>
</label> </label>
<div class="col-sm-2"> <div class="col-sm-2">
<input name="$index" ng-disabled="!envConfirmation" type="text" class="form-control" ng-model="envList[$index].name" required> <input name="$index" ng-disabled="!envConfirmation" type="text"
class="form-control" ng-model="envList[$index].name" required>
</div> </div>
<div class="col-sm-4"> <div class="col-sm-4">
<input name="$index" ng-disabled="!envConfirmation" type="text" class="form-control" ng-model="envList[$index].value" required> <input name="$index" ng-disabled="!envConfirmation" type="text"
class="form-control" ng-model="envList[$index].value" required>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-offset-3"> <div class="col-md-offset-3">
<button type="button" ng-disabled="!envConfirmation" class="btn btn-info" ng-click="addEnvField()">Add more</button> <button type="button" ng-disabled="!envConfirmation" class="btn btn-info"
</div><br> ng-click="addEnvField()">Add more
</button>
</div>
<br>
<span ng-init="volList = {}"></span> <span ng-init="volList = {}"></span>
<span ng-init="volListNumber=1"></span>
{% for key, value in volList.items %} {% for key, value in volList.items %}
<span ng-init="volList[{{ forloop.counter0 }}] = {'dest':'{{ value.bind }}' , 'src':'{{ key }}'}"></span> <span ng-init="volList[{{ forloop.counter0 }}] = {'dest':'{{ value.bind }}' , 'src':'{{ key }}'}"></span>
<span ng-init="volListNumber={{ forloop.counter0 }} + 1"></span> <span ng-init="volListNumber={{ forloop.counter0 }} + 1"></span>
{% endfor %} {% endfor %}
<hr> <hr>
@@ -262,16 +285,20 @@
</div> </div>
<div ng-repeat="volume in volList track by $index"> <div ng-repeat="volume in volList track by $index">
<div ng-hide="installationDetailsForm" class="form-group"> <div ng-hide="installationDetailsForm" class="form-group">
<div class="col-sm-3"></div> <div class="col-sm-5">
<div class="col-sm-2"> <input type="text" ng-disabled="!envConfirmation" class="form-control"
<input type="text" ng-disabled="!envConfirmation" class="form-control" ng-model="volList[$index].dest" placeholder="Destination" required> ng-model="volList[$index].dest" placeholder="Destination" required>
</div> </div>
<div class="col-sm-4"> <div class="col-sm-5">
<input type="text" ng-disabled="!envConfirmation" class="form-control" ng-model="volList[$index].src" placeholder="Source" required> <input type="text" ng-disabled="!envConfirmation" class="form-control"
ng-model="volList[$index].src" placeholder="Source" required>
</div> </div>
<div ng-show="$last"> <div ng-show="$last">
<div class="col-sm-1"> <div class="col-sm-1">
<button class="btn btn-primary" ng-disabled="!envConfirmation" type="button" ng-click="removeVolField()"><i class="fa fa-times"></i></button> <button class="btn btn-primary" ng-disabled="!envConfirmation" type="button"
ng-click="removeVolField()"><i
style="position: inherit; top: 0px; left: 0px"
class="fa fa-times"></i></button>
</div> </div>
</div> </div>
</div> </div>
@@ -279,15 +306,21 @@
</div> </div>
<div ng-hide="installationDetailsForm" class="text-center"> <div ng-hide="installationDetailsForm" class="text-center">
<button type="button" ng-disabled="!envConfirmation" class="btn btn-info" ng-click="addVolField()">{% trans "Add field" %}</button> <button type="button" ng-disabled="!envConfirmation" class="btn btn-info"
</div><br> ng-click="addVolField()">{% trans "Add field" %}</button>
</div>
<br>
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" ng-disabled="savingSettings" class="btn btn-primary" ng-click="saveSettings()">Save</button> <button type="button" ng-disabled="savingSettings" class="btn btn-primary"
<button type="button" ng-disabled="savingSettings" class="btn btn-default" data-dismiss="modal">Close</button> ng-click="saveSettings()">Save
</button>
<button type="button" ng-disabled="savingSettings" class="btn btn-default" data-dismiss="modal">
Close
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -304,7 +337,8 @@
</div> </div>
<div class="modal-body"> <div class="modal-body">
<table cellpadding="0" cellspacing="0" border="0" class="table table-striped" id="datatable-example"> <table cellpadding="0" cellspacing="0" border="0" class="table table-striped"
id="datatable-example">
<thead> <thead>
<tr> <tr>
<th ng-repeat="item in topHead track by $index">{$ item $}</th> <th ng-repeat="item in topHead track by $index">{$ item $}</th>
@@ -321,8 +355,12 @@
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" ng-disabled="savingSettings" class="btn btn-primary" ng-click="showTop()">Refresh</button> <button type="button" ng-disabled="savingSettings" class="btn btn-primary" ng-click="showTop()">
<button type="button" ng-disabled="savingSettings" class="btn btn-default" data-dismiss="modal">Close</button> Refresh
</button>
<button type="button" ng-disabled="savingSettings" class="btn btn-default" data-dismiss="modal">
Close
</button>
</div> </div>
</div> </div>

View File

@@ -161,7 +161,7 @@ def loadLoginPage(request):
firstName="Cyber",lastName="Panel", acl=acl, token=token) firstName="Cyber",lastName="Panel", acl=acl, token=token)
admin.save() admin.save()
vers = version(currentVersion="1.8", build=0) vers = version(currentVersion="1.8", build=1)
vers.save() vers.save()
package = Package(admin=admin, packageName="Default", diskSpace=1000, package = Package(admin=admin, packageName="Default", diskSpace=1000,

View File

@@ -47,14 +47,12 @@
<ul class="list-group row"> <ul class="list-group row">
<li class="col-md-3"> <li class="col-md-3">
<a href="" ng-click="setProvider('github')" class="list-group-item"> <a href="" ng-click="setProvider('github')" class="list-group-item">
<i class="fa fa-github" aria-hidden="true"></i>
Github Github
<i class="glyph-icon icon-chevron-right"></i> <i class="glyph-icon icon-chevron-right"></i>
</a> </a>
</li> </li>
<li class="col-md-3"> <li class="col-md-3">
<a href="" ng-click="setProvider('gitlab')" class="list-group-item"> <a href="" ng-click="setProvider('gitlab')" class="list-group-item">
<i class="fa fa-gitlab" aria-hidden="true"></i>
GitLab GitLab
<i class="glyph-icon font-green icon-chevron-right"></i> <i class="glyph-icon font-green icon-chevron-right"></i>
</a> </a>
@@ -205,13 +203,13 @@
<li class="col-md-3 active"> <li class="col-md-3 active">
<a href="#tab-example-1" data-toggle="tab" class="list-group-item"> <a href="#tab-example-1" data-toggle="tab" class="list-group-item">
<i class="fa fa-git" aria-hidden="true"></i> <i style="top: 11px" class="fa fa-git" aria-hidden="true"></i>
{% trans 'Manage' %} {% trans 'Manage' %}
</a> </a>
</li> </li>
<li class="col-md-3"> <li class="col-md-3">
<a href="#tab-example-3" data-toggle="tab" class="list-group-item"> <a href="#tab-example-3" data-toggle="tab" class="list-group-item">
<i class="fa fa-tree" aria-hidden="true"></i> <i style="top: 11px" class="fa fa-tree" aria-hidden="true"></i>
{% trans 'Change Branch' %} {% trans 'Change Branch' %}
</a> </a>
</li> </li>
@@ -221,7 +219,6 @@
<ul class="list-group row"> <ul class="list-group row">
<li class="col-md-3"> <li class="col-md-3">
<a href="" ng-click="detachRepo()" class="list-group-item"> <a href="" ng-click="detachRepo()" class="list-group-item">
<i class="fa fa-github" aria-hidden="true"></i>
{% trans 'Detach Repo' %} {% trans 'Detach Repo' %}
<i class="glyph-icon icon-chevron-right"></i> <i class="glyph-icon icon-chevron-right"></i>
</a> </a>