Merge pull request #4427 from mokaddem/submoduleUpdatev3

Submodule updateV3
pull/4435/head
Steve Clement 2019-04-05 18:18:35 +09:00 committed by GitHub
commit c8274c476e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 83 additions and 31 deletions

View File

@ -337,6 +337,7 @@ class ACLComponent extends Component
'getInstanceUUID' => array('perm_sync'),
'getPyMISPVersion' => array('*'),
'getSubmodulesStatus' => array('perm_site_admin'),
'getSubmoduleQuickUpdateForm' => array('perm_site_admin'),
'getVersion' => array('*'),
'index' => array('OR' => array('perm_sync', 'perm_admin')),
'postTest' => array('perm_sync'),

View File

@ -1542,6 +1542,11 @@ class ServersController extends AppController
}
}
public function getSubmoduleQuickUpdateForm($submodule_path=false) {
$this->set('submodule', base64_decode($submodule_path));
$this->render('ajax/submodule_quick_update_form');
}
public function updateSubmodule()
{
if (!$this->_isSiteAdmin()) {

View File

@ -4611,8 +4611,10 @@ class Server extends AppModel
'currentTimestamp' => exec(sprintf('cd %s; git log -1 --pretty=format:%%ct', $path)),
'remoteTimestamp' => exec(sprintf('cd %s; git show -s --pretty=format:%%ct %s', $path, $superproject_submodule_commit_id)),
'remote' => $superproject_submodule_commit_id,
'upToDate' => ''
'upToDate' => '',
'isReadable' => is_readable($path) && is_readable($path . '/.git'),
);
if (!empty($status['remote'])) {
if ($status['remote'] == $status['current']) {
$status['upToDate'] = 'same';
@ -4624,7 +4626,12 @@ class Server extends AppModel
} else {
$status['upToDate'] = 'error';
}
$status['timeDiff'] = (new DateTime('@' . $status['remoteTimestamp']))->diff(new DateTime('@' . $status['currentTimestamp']));
if ($status['isReadable'] && !empty($status['remoteTimestamp']) && !empty($status['currentTimestamp'])) {
$status['timeDiff'] = (new DateTime('@' . $status['remoteTimestamp']))->diff(new DateTime('@' . $status['currentTimestamp']));
} else {
$status['upToDate'] = 'error';
}
}
return $status;
}
@ -4632,17 +4639,17 @@ class Server extends AppModel
public function updateSubmodule($submodule_name=false) {
$path = APP . '../';
if ($submodule_name == false) {
$command = sprintf('cd %s; git submodule update', $path);
exec($command, $output);
$command = sprintf('cd %s; git submodule update 2>&1', $path);
exec($command, $output, $return_code);
$output = implode("\n", $output);
$res = array('status' => true, 'output' => $output);
$res = array('status' => ($return_code==0 ? true : false), 'output' => $output);
} else if ($this->_isAcceptedSubmodule($submodule_name)) {
$command = sprintf('cd %s; git submodule update -- %s', $path, $submodule_name);
exec($command, $output);
$command = sprintf('cd %s; git submodule update -- %s 2>&1', $path, $submodule_name);
exec($command, $output, $return_code);
$output = implode("\n", $output);
$res = array('status' => true, 'output' => $output);
$res = array('status' => ($return_code==0 ? true : false), 'output' => $output);
} else {
$res = array('status' => false);
$res = array('status' => false, 'output' => __('Invalid submodule.'));
}
return $res;
}

View File

@ -368,10 +368,14 @@
});
$('#refreshSubmoduleStatus').click(function() { updateSubModulesStatus(); });
function updateSubModulesStatus() {
function updateSubModulesStatus(message) {
$('#divSubmoduleVersions').empty().append('<it class="fa fa-spin fa-spinner" style="font-size: large; left: 50%; top: 50%;"></it>');
$.get('<?php echo $baseurl . '/servers/getSubmodulesStatus/'; ?>', function(html){
$('#divSubmoduleVersions').html(html);
if (message !== undefined) {
$('#submoduleGitResultDiv').show();
$('#submoduleGitResult').text(message);
}
});
}
</script>

View File

@ -37,7 +37,11 @@
break;
case 'error':
$class = 'error bold';
$versionText = __('Could not retrieve version from github');
if (!$status['isReadable']) {
$versionText = __('Invalid file permission.');
} else {
$versionText = __('Could not retrieve version');
}
break;
default:
$class = '';
@ -49,13 +53,10 @@
<td><?php echo h($submodule) ?></td>
<td><?php echo h($status['current']) ?></td>
<td><?php echo h($versionText) ?></td>
<td>
<td class="updateActionCell">
<?php
if ($status['upToDate'] != 'same') {
echo $this->Form->create('Server', array('url' => array('action' => 'updateSubmodule'), 'div' => false, 'style' => 'margin: 0px; display: inline-block;'));
echo $this->Form->hidden('submodule', array('value' => h($submodule)));
echo $this->Form->end();
echo '<it class="fas fa-sync useCursorPointer" title="' . __('Update submodule') . '" aria-label="Update" onclick="submitSubmoduleUpdate(this);"></it>';
if ($status['upToDate'] != 'same' && $status['isReadable']) {
echo '<it class="fas fa-sync useCursorPointer" title="' . __('Update submodule') . '" aria-label="Update" data-submodule="' . h($submodule) . '" onclick="submitSubmoduleUpdate(this);"></it>';
}
?>
</td>
@ -63,3 +64,9 @@
<?php endforeach; ?>
</tbody>
</table>
<div id="submoduleGitResultDiv" class="hidden">
<strong><?php echo _('Update result:'); ?></strong>
<div class="apply_css_arrow">
<pre id="submoduleGitResult" class="green bold" style="margin-left: 10px;"></pre>
</div>
</div>

View File

@ -0,0 +1,10 @@
<?php
echo $this->Form->create('Server', array(
'id' => 'form_update_' . h($submodule),
'url' => array('action' => 'updateSubmodule'),
'div' => false,
'style' => 'margin: 0px; display: inline-block;')
);
echo $this->Form->hidden('Server.submodule', array('value' => h($submodule)));
echo $this->Form->end();
?>

View File

@ -3807,25 +3807,43 @@ function submitMISPUpdate() {
function submitSubmoduleUpdate(clicked) {
var $clicked = $(clicked);
var $form = $clicked.parent().find('form');
var formData = $form.serialize();
var submodule_path = $clicked.data('submodule');
$.ajax({
beforeSend: function (XMLHttpRequest) {
$clicked.addClass('fa-spin');
},
data: formData,
success:function (data, textStatus) {
if (data.output !== '') {
showMessage('success', data.output);
}
updateSubModulesStatus();
},
complete:function() {
$clicked.removeClass('fa-spin');
},
type:"post",
dataType:"html",
cache: false,
url:$form.attr('action'),
success:function (formHTML, textStatus) {
var $form = $(formHTML);
$('body').append($form);
var formData = $form.serialize();
$.ajax({
data: formData,
success:function (data, textStatus) {
if (data.status) {
updateSubModulesStatus(data.output);
} else {
showMessage('error', 'Something went wrong');
$('#submoduleGitResultDiv').show();
$('#submoduleGitResult').removeClass('green').addClass('red').text(data.output);
}
},
error: function (data) {
showMessage('error', 'Something went wrong');
$('#submoduleGitResultDiv').show();
$('#submoduleGitResult').removeClass('green').addClass('red').text(data.output);
},
complete:function() {
$clicked.removeClass('fa-spin');
$form.remove();
},
type:"post",
cache: false,
url:$form.attr('action'),
});
},
url:'/servers/getSubmoduleQuickUpdateForm/' + (submodule_path !== undefined ? btoa(submodule_path) : ''),
});
}