Commit f7a4f04a authored by Leo Iannacone's avatar Leo Iannacone

Merge branch 'master' into portable

parents 04380791 43903d3a
...@@ -19,6 +19,11 @@ var express = require('express'), ...@@ -19,6 +19,11 @@ var express = require('express'),
Broadcaster = require('./lib/broadcaster.js'); Broadcaster = require('./lib/broadcaster.js');
// serve dsc files as octet-stream
serve_static.mime.define({
'application/octet-stream': ['dsc']
});
app.set('views', __dirname + '/views'); app.set('views', __dirname + '/views');
app.set('view engine', 'ejs'); app.set('view engine', 'ejs');
app.use(serve_static(__dirname + '/public')); app.use(serve_static(__dirname + '/public'));
......
var config = require('./config.js') 'use strict';
, fs = require('fs')
, Tail = require('./tail.js')
function __watch_status_check_same_obj (obj1, obj2) { var config = require('./config.js'),
fs = require('fs'),
utils = require('./utils.js'),
Tail = require('./tail.js');
function __watch_status_check_same_obj(obj1, obj2) {
if (obj1.status == obj2.status) { if (obj1.status == obj2.status) {
if (obj1.distribution == obj2.distribution) { if (obj1.distribution == obj2.distribution) {
if (obj1.hasOwnProperty('package') && if (obj1.hasOwnProperty('package') &&
obj2.hasOwnProperty('package')) obj2.hasOwnProperty('package')) {
{
if (obj1.package == obj2.package) if (obj1.package == obj2.package)
return true; return true;
return false return false;
} }
return true return true;
} }
} }
return false return false;
} }
// watcher on build_status // watcher on build_status
function __watch_status (socket, status) { function __watch_status(socket, status) {
var watcher = new Tail(config.debomatic.jsonfile) var watcher = new Tail(config.debomatic.jsonfile);
watcher.on('line', function(new_content) { watcher.on('line', function (new_content) {
var data = null var data = null;
try { try {
data = JSON.parse(new_content) data = JSON.parse(new_content);
} catch (err) { } catch (err) {
utils.errors_handler('Broadcaster:__watch_status:JSON.parse(new_content) - ', err, socket) utils.errors_handler('Broadcaster:__watch_status:JSON.parse(new_content) - ', err, socket);
return return;
} }
// looking for same status already in statuses lists // looking for same status already in statuses lists
if (data.hasOwnProperty('success')) { if (data.hasOwnProperty('success')) {
for(i = 0; i < status.length; i++) { for (var i = 0; i < status.length; i++) {
if (__watch_status_check_same_obj(data, status[i])) { if (__watch_status_check_same_obj(data, status[i])) {
status.splice(i, 1) status.splice(i, 1);
break; break;
} } else
else
continue; continue;
} }
} else {
status.push(data);
} }
else { socket.emit(config.events.broadcast.status_update, data);
status.push(data) });
} watcher.on('error', function (msg) {
socket.emit(config.events.broadcast.status_update, data) socket.emit(config.events.error, msg);
}) });
watcher.on('error', function(msg) {
socket.emit(config.events.error, msg)
})
} }
// watcher on new distributions // watcher on new distributions
function __watch_distributions (socket) { function __watch_distributions(socket) {
fs.watch(config.debomatic.path, { persistent: true }, function (event, fileName) { fs.watch(config.debomatic.path, {
persistent: true
}, function (event, fileName) {
// wait half a second to get pool subdir created // wait half a second to get pool subdir created
setTimeout(function() { setTimeout(function () {
utils.send_distributions(socket) utils.send_distributions(socket);
}, 500) }, 500);
}) });
} }
function Broadcaster (sockets, status) { function Broadcaster(sockets, status) {
var sockets = sockets
__watch_status(sockets, status) __watch_status(sockets, status);
__watch_distributions(sockets) __watch_distributions(sockets);
return { return {
} };
} }
module.exports = Broadcaster module.exports = Broadcaster;
var fs = require('fs') 'use strict';
, path = require('path') var fs = require('fs'),
, config = require('./config.js') path = require('path'),
, utils = require('./utils.js') config = require('./config.js'),
utils = require('./utils.js');
var _e = config.events.client var _e = config.events.client;
function __get_files_list_from_package(data, callback) { function __get_files_list_from_package(data, callback) {
package_path = utils.get_package_path(data) var package_path = utils.get_package_path(data);
utils.get_files_list(package_path, false, function(files) { utils.get_files_list(package_path, false, function (files) {
data.package.files = [] data.package.files = [];
data.package.debs = [] data.package.debs = [];
data.package.sources = [] data.package.sources = [];
files.forEach(function (f) { files.forEach(function (f) {
file = {} var file = {};
file.path = path.join(package_path, f).replace(config.debomatic.path, config.routes.debomatic) file.path = path.join(package_path, f).replace(config.debomatic.path, config.routes.debomatic);
file.orig_name = f file.orig_name = f;
file.name = f.split('_')[0] file.name = f.split('_')[0];
file.extension = f.split('.').pop(); file.extension = f.split('.').pop();
if (file.extension == "deb" || file.extension == "ddeb") { if (file.extension == 'deb' || file.extension == 'ddeb') {
data.package.debs.push(file); data.package.debs.push(file);
} } else if (f.indexOf('.tar') >= 0 || file.extension == 'changes' || file.extension == 'dsc') {
else if (f.indexOf('.tar') >= 0 || file.extension == "changes" || file.extension == "dsc") { file.name = f.replace(data.package.name + '_' + data.package.version + '.', '');
file.name = f.replace(data.package.name + '_' + data.package.version + '.', '')
if (file.extension == 'changes') if (file.extension == 'changes')
file.name = file.extension file.name = file.extension;
else if (f.indexOf('.tar') >= 0 && f.indexOf('.orig.') > 0) else if (f.indexOf('.tar') >= 0 && f.indexOf('.orig.') > 0)
file.name = 'orig.' + f.split('.orig.').pop() file.name = 'orig.' + f.split('.orig.').pop();
data.package.sources.push(file) data.package.sources.push(file);
} } else {
else { file.name = file.extension;
file.name = file.extension data.package.files.push(file);
data.package.files.push(file)
} }
}); });
callback(data); callback(data);
}); });
} }
function __send_package_files_list (event_name, socket, data) { function __send_package_files_list(event_name, socket, data) {
__get_files_list_from_package(data, function(new_data){ __get_files_list_from_package(data, function (new_data) {
socket.emit(event_name, new_data) socket.emit(event_name, new_data);
}); });
} }
function __send_package_status(socket, data, package_data) { function __send_package_status(socket, data, package_data) {
var event_name = config.events.client.distribution_packages.status var event_name = config.events.client.distribution_packages.status;
var new_data = {} var new_data = {};
new_data.distribution = data.distribution new_data.distribution = data.distribution;
new_data.package = package_data new_data.package = package_data;
var status_data = {} var status_data = {};
status_data.status = config.status.build status_data.status = config.status.build;
status_data.distribution = data.distribution.name status_data.distribution = data.distribution.name;
status_data.package = package_data.orig_name status_data.package = package_data.orig_name;
var package_path = utils.get_package_path(new_data) var package_path = utils.get_package_path(new_data);
// status policy: // status policy:
// + successed: exists .dsc // + successed: exists .dsc
// + building: wc -l .datestamp == 1 (FIX_ME) // + building: wc -l .datestamp == 1 (FIX_ME)
// + failed: else // + failed: else
var base_path = path.join(package_path, package_data.orig_name) var base_path = path.join(package_path, package_data.orig_name);
fs.exists(base_path + '.dsc', function(dsc_exists){ fs.exists(base_path + '.dsc', function (dsc_exists) {
if (dsc_exists) { if (dsc_exists) {
status_data.success = config.status.success status_data.success = config.status.success;
socket.emit(event_name, status_data) socket.emit(event_name, status_data);
} } else {
else {
// emulate wc -l .datestamp in nodejs // emulate wc -l .datestamp in nodejs
var count = 0 var count = 0;
var datestamp = base_path + '.datestamp' var datestamp = base_path + '.datestamp';
fs.exists(datestamp, function(datestamp_exists){ fs.exists(datestamp, function (datestamp_exists) {
if (datestamp_exists) { if (datestamp_exists) {
// count lines // count lines
fs.createReadStream(datestamp) fs.createReadStream(datestamp)
.on('data', function(chunk) { .on('data', function (chunk) {
for (var i=0; i < chunk.length; ++i) for (var i = 0; i < chunk.length; ++i)
if (chunk[i] == 10) count++; if (chunk[i] == 10) count++;
}) })
.on('end', function() { .on('end', function () {
if (count > 1) if (count > 1)
status_data.success = config.status.fail status_data.success = config.status.fail;
socket.emit(event_name, status_data) socket.emit(event_name, status_data);
}); });
} }
}) });
} }
}) });
} }
function __send_distribution_packages (event_name, socket, data) { function __send_distribution_packages(event_name, socket, data) {
distro_path = utils.get_distribution_pool_path(data) var distro_path = utils.get_distribution_pool_path(data);
utils.get_files_list(distro_path, true, function (packages) { utils.get_files_list(distro_path, true, function (packages) {
data.distribution.packages = [] data.distribution.packages = [];
packages.forEach( function (p) { packages.forEach(function (p) {
pack = {} var pack = {};
info = p.split('_') var info = p.split('_');
pack.name = info[0] pack.name = info[0];
pack.version = info[1] pack.version = info[1];
pack.orig_name = p pack.orig_name = p;
data.distribution.packages.push(pack) data.distribution.packages.push(pack);
__send_package_status(socket, data, pack) __send_package_status(socket, data, pack);
}); });
socket.emit(event_name, data) socket.emit(event_name, data);
}); });
} }
function __send_file (event_name, socket, data) { function __send_file(event_name, socket, data) {
var file_path = utils.get_file_path(data) var file_path = utils.get_file_path(data);
fs.readFile(file_path, 'utf8', function (err, content) { fs.readFile(file_path, 'utf8', function (err, content) {
if (err) { if (err) {
utils.errors_handler('client:__send_file', err, socket) utils.errors_handler('client:__send_file', err, socket);
return return;
} }
data.file.orig_name = file_path.split('/').pop() data.file.orig_name = file_path.split('/').pop();
data.file.content = content data.file.content = content;
data.file.path = file_path.replace(config.debomatic.path, config.routes.debomatic) data.file.path = file_path.replace(config.debomatic.path, config.routes.debomatic);
socket.emit(event_name, data) socket.emit(event_name, data);
}); });
} }
function __handler_get_file (socket, data) { function __handler_get_file(socket, data) {
var file_path = utils.get_file_path(data) var file_path = utils.get_file_path(data);
utils.watch_path_onsocket(_e.file_newcontent, socket, data, file_path, function(event_name, socket, data) { utils.watch_path_onsocket(_e.file_newcontent, socket, data, file_path, function (event_name, socket, data) {
data.file.content = null data.file.content = null;
socket.emit(event_name, data) socket.emit(event_name, data);
}) });
__send_file(_e.file.set, socket, data) __send_file(_e.file.set, socket, data);
} }
function Client (socket) { function Client(socket) {
var socket = socket
this.start = function () { this.start = function () {
// init send distributions // init send distributions
utils.send_distributions(socket) utils.send_distributions(socket);
// init events // init events
socket.on(_e.distribution_packages.get, function (data) { socket.on(_e.distribution_packages.get, function (data) {
if (! utils.check_data_distribution(data)) if (!utils.check_data_distribution(data))
return return;
distribution_path = path.join(config.debomatic.path, data.distribution.name, 'pool') var distribution_path = path.join(config.debomatic.path, data.distribution.name, 'pool');
utils.generic_handler_watcher(_e.distribution_packages.set, socket, data, distribution_path, __send_distribution_packages) utils.generic_handler_watcher(_e.distribution_packages.set, socket, data, distribution_path, __send_distribution_packages);
}) });
socket.on(_e.package_files_list.get, function(data) { socket.on(_e.package_files_list.get, function (data) {
if (! utils.check_data_package(data)) if (!utils.check_data_package(data))
return return;
package_path = utils.get_package_path(data) var package_path = utils.get_package_path(data);
utils.generic_handler_watcher(_e.package_files_list.set, socket, data, package_path, __send_package_files_list) utils.generic_handler_watcher(_e.package_files_list.set, socket, data, package_path, __send_package_files_list);
}) });
socket.on(_e.file.get, function (data){ socket.on(_e.file.get, function (data) {
if (! utils.check_data_file(data)) if (!utils.check_data_file(data))
return return;
__handler_get_file(socket, data) __handler_get_file(socket, data);
}) });
// on client disconnection close all watchers // on client disconnection close all watchers
socket.on('disconnect', function() { socket.on('disconnect', function () {
socket.get("watchers", function(err, socket_watchers){ socket.get('watchers', function (err, socket_watchers) {
if (! socket_watchers) if (!socket_watchers)
return; return;
for (key in socket_watchers) { for (var key in socket_watchers) {
try { socket_watchers[key].close() } try {
catch (err) {} socket_watchers[key].close();
} catch (err) {}
} }
}) });
}); });
} };
this.send_status = function(status) { this.send_status = function (status) {
socket.emit(_e.status, status) socket.emit(_e.status, status);
} };
} }
module.exports = Client module.exports = Client;
'use strict';
/* /*
* Please DO NOT edit this file. * Please DO NOT edit this file.
* *
* Edit auto-generated "user.config.js" file instead. * Edit auto-generated 'user.config.js' file instead.
* *
*/ */
// #start config-auto-export // #start config-auto-export
var config = {} var config = {};
/* /*
* Configure host and port. * Configure host and port.
* Please for ports < 1000 use authbind. DO NOT RUN nodejs as root. * Please for ports < 1000 use authbind. DO NOT RUN nodejs as root.
* $ authbind nodejs index.js * $ authbind nodejs index.js
*/ */
config.host = 'localhost' config.host = 'localhost';
config.port = 3000 config.port = 3000;
config.socket = {} config.socket = {};
config.socket.log = false config.socket.log = false;
config.debomatic = {} config.debomatic = {};
config.debomatic.path = '/srv/debomatic-amd64' config.debomatic.path = '/srv/debomatic-amd64';
config.debomatic.jsonfile = '/var/log/debomatic-json.log' config.debomatic.jsonfile = '/var/log/debomatic-json.log';
config.routes = {} config.routes = {};
config.routes.debomatic = '/debomatic' config.routes.debomatic = '/debomatic';
config.routes.distribution = '/distribution' config.routes.distribution = '/distribution';
config.routes.preferences = '/preferences' config.routes.preferences = '/preferences';
config.web = {} config.web = {};
config.web.title = "Deb-o-Matic web.ui" config.web.title = 'Deb-o-Matic web.ui';
config.web.description = "This is a web interface for debomatic" config.web.description = 'This is a web interface for debomatic';
// debomatic configuration exportable for web // debomatic configuration exportable for web
config.web.debomatic = {} config.web.debomatic = {};
config.web.debomatic.admin = {} config.web.debomatic.admin = {};
config.web.debomatic.admin.name = "Your Name" config.web.debomatic.admin.name = 'Your Name';
config.web.debomatic.admin.email = "you AT debian DOT org" // please use this SPAMFREE form - it will be converted client side by javascript config.web.debomatic.admin.email = 'you AT debian DOT org'; // please use this SPAMFREE form - it will be converted client side by javascript
config.web.debomatic.architecture = 'amd64' config.web.debomatic.architecture = 'amd64';
config.web.debomatic.dput = {} config.web.debomatic.dput = {};
config.web.debomatic.dput.incoming = config.debomatic.path config.web.debomatic.dput.incoming = config.debomatic.path;
config.web.debomatic.dput.host = config.host config.web.debomatic.dput.host = config.host;
config.web.debomatic.dput.login = "debomatic" config.web.debomatic.dput.login = 'debomatic';
config.web.debomatic.dput.method = "scp" config.web.debomatic.dput.method = 'scp';
config.web.debomatic.dput.unsigned_uploads = false config.web.debomatic.dput.unsigned_uploads = false;
// default ui settings // default ui settings
config.web.preferences = {} config.web.preferences = {};
config.web.preferences.autoscroll = true config.web.preferences.autoscroll = true;
config.web.preferences.header = true config.web.preferences.header = true;
config.web.preferences.sidebar = true config.web.preferences.sidebar = true;
config.web.preferences.glossy_theme = true config.web.preferences.glossy_theme = true;
config.web.preferences.file_background = true config.web.preferences.file_background = true;
config.web.preferences.file_fontsize = 13 // valid values are [13..16] config.web.preferences.file_fontsize = 13; // valid values are [13..16]
config.web.preferences.debug = 0 // debug level - 0 means disabled config.web.preferences.debug = 0; // debug level - 0 means disabled
// #end config-auto-export // #end config-auto-export
// DO NOT TOUCH these ones // DO NOT TOUCH these ones
config.version = '0.2.2' config.version = '0.2.3';
// A simple function to quickly have // A simple function to quickly have
// get and set strings for client events // get and set strings for client events
...@@ -69,78 +70,74 @@ function _event_get_set(event_name) { ...@@ -69,78 +70,74 @@ function _event_get_set(event_name) {
return { return {
set: event_name, set: event_name,
get: 'get_' + event_name get: 'get_' + event_name
} };
} }
config.events = {} config.events = {};
config.events.error = 'error' config.events.error = 'error';
config.events.broadcast = {} config.events.broadcast = {};
config.events.broadcast.distributions = 'distributions' config.events.broadcast.distributions = 'distributions';
config.events.broadcast.status_update = 'status_update' config.events.broadcast.status_update = 'status_update';
config.events.client = {} config.events.client = {};
config.events.client.distribution_packages = _event_get_set('distribution_packages') config.events.client.distribution_packages = _event_get_set('distribution_packages');
config.events.client.distribution_packages.status = 'package_status' config.events.client.distribution_packages.status = 'package_status';
config.events.client.package_files_list = _event_get_set('package_files_list') config.events.client.package_files_list = _event_get_set('package_files_list');
config.events.client.file = _event_get_set('file') config.events.client.file = _event_get_set('file');
config.events.client.file_newcontent = 'file_newcontent' config.events.client.file_newcontent = 'file_newcontent';
config.events.client.status = 'status' config.events.client.status = 'status';
// debomatic status according with JSONLogger.py module // debomatic status according with JSONLogger.py module
config.status = {} config.status = {};
config.status.build = 'build' config.status.build = 'build';
config.status.create = 'create' config.status.create = 'create';
config.status.update = 'update' config.status.update = 'update';
config.status.success = true config.status.success = true;
config.status.fail = false config.status.fail = false;
// read user configuration and merge it // read user configuration and merge it
/* /*
* update object1 with object2 values * update object1 with object2 values
*/ */
function _merge(object1, object2) { function _merge(object1, object2) {
var result = {} var result = {};
for (p in object1) { for (var p in object1) {
if (object2.hasOwnProperty(p)) { if (object2.hasOwnProperty(p)) {
if (typeof object1[p] === 'object' && typeof object2[p] === 'object') { if (typeof object1[p] === 'object' && typeof object2[p] === 'object') {
result[p] = _merge(object1[p], object2[p]) result[p] = _merge(object1[p], object2[p]);
} } else {
else { result[p] = object2[p];
result[p] = object2[p]
}
} }
else { } else {
result[p] = object1[p] result[p] = object1[p];
} }
} }
return result return result;
} }
try { try {
var Parser = require('./parser.js') var Parser = require('./parser.js');
var parser = new Parser() var parser = new Parser();
var user_config = parser.getUserConfig() var user_config = parser.getUserConfig();
if (user_config) { if (user_config) {
console.log("Reading user configutation ...") console.log('Reading user configutation ...');
config = _merge(config, require(user_config)) config = _merge(config, require(user_config));
} } else {
else { console.log('No user config specified. Using global settings.');
console.log("No user config specified. Using global settings.")
} }
} catch (err) { } catch (err) {
if (err.code == 'MODULE_NOT_FOUND') { if (err.code == 'MODULE_NOT_FOUND') {
console.log("File %s not found.", user_config) console.log('File %s not found.', user_config);
process.exit(1) process.exit(1);
} } else {
else { console.error('Error reading user configutation', err);
console.error("Error reading user configutation", err); process.exit(1);
process.exit(1)
} }
} finally { } finally {
// export some variable // export some variable
config.web.paths = config.routes config.web.paths = config.routes;
config.web.events = config.events config.web.events = config.events;
config.web.status = config.status config.web.status = config.status;
config.web.host = config.host config.web.host = config.host;
module.exports = config module.exports = config;
} }
function Parser() 'use strict';
{
function Parser() {
var args = process.argv.slice(2); var args = process.argv.slice(2);
var help = function() { var help = function () {
console.log("\ console.log('\
Usage: %s [-c config]\n\ Usage: %s [-c config]\n\
-h print this help \n\ -h print this help \n\
-c set user configuration file", -c set user configuration file',
process.argv[1].split('/').pop()); process.argv[1].split('/').pop());
process.exit(0); process.exit(0);
} };
this.getUserConfig = function() { this.getUserConfig = function () {
var configFile = null; var configFile = null;
args.forEach(function (val, index) { args.forEach(function (val, index) {
if (val == '-c') { if (val == '-c') {
configFile = args[index+1] configFile = args[index + 1];
return return;
} }
}) });
if (configFile) if (configFile)
return process.cwd() + '/' + configFile; return process.cwd() + '/' + configFile;
else else
return null return null;
} };
args.forEach(function (val, index) { args.forEach(function (val, index) {
if (val == '-h') { if (val == '-h') {
help() help();
} }
}) });
} }
module.exports = Parser module.exports = Parser
var fs =require('fs') 'use strict';
, Tail = require('tail').Tail
Tail.prototype.watchEvent = function(e) { var fs = require('fs'),
Tail = require('tail').Tail;
Tail.prototype.watchEvent = function (e) {
var _this = this; var _this = this;
if (e === 'change') { if (e === 'change') {
return fs.stat(this.filename, function(err, stats) { return fs.stat(this.filename, function (err, stats) {
if (err) { if (err) {
_this.emit('error', err); _this.emit('error', err);
} }
...@@ -19,18 +21,18 @@ Tail.prototype.watchEvent = function(e) { ...@@ -19,18 +21,18 @@ Tail.prototype.watchEvent = function(e) {
}); });
_this.pos = stats.size; _this.pos = stats.size;
if (_this.queue.length === 1) { if (_this.queue.length === 1) {
return _this.internalDispatcher.emit("next"); return _this.internalDispatcher.emit('next');
} }
} }
}); });
} else if (e === 'rename') { } else if (e === 'rename') {
this.unwatch(); this.unwatch();
_this.emit('error', "File " + this.filename + " deleted."); _this.emit('error', 'File ' + this.filename + ' deleted.');
} }
}; };
Tail.prototype.close = function() { Tail.prototype.close = function () {
this.unwatch() this.unwatch();
} };
module.exports = Tail module.exports = Tail;
\ No newline at end of file
var path = require('path') 'use strict';
, fs = require('fs')
, config = require('./config.js') var path = require('path'),
, Tail = require('./tail.js') fs = require('fs'),
config = require('./config.js'),
Tail = require('./tail.js');
function __errors_handler(from, err, socket) { function __errors_handler(from, err, socket) {
if (! socket) if (!socket)
from = "NO SOCKET: " + from from = 'NO SOCKET: ' + from;
console.error(from, err) console.error(from, err);
if (socket) if (socket)
socket.emit(config.events.error, err.message) socket.emit(config.events.error, err.message);
} }
function __check_no_backward(backward_path) { function __check_no_backward(backward_path) {
try { try {
return backward_path.indexOf('..') < 0 return backward_path.indexOf('..') < 0;
} catch (err) { return true } } catch (err) {
return true;
}
} }
function __check_data_distribution(data) { function __check_data_distribution(data) {
return __check_no_backward(data) && __check_no_backward(data.distribution) && __check_no_backward(data.distribution.name) return __check_no_backward(data) && __check_no_backward(data.distribution) && __check_no_backward(data.distribution.name);
} }
function __check_data_package(data) { function __check_data_package(data) {
return __check_data_distribution(data) && __check_no_backward(data.package) && __check_no_backward(data.package.name) && __check_no_backward(data.package.version) return __check_data_distribution(data) && __check_no_backward(data.package) && __check_no_backward(data.package.name) && __check_no_backward(data.package.version);
} }
function __check_data_file(data) { function __check_data_file(data) {
return __check_data_package(data) && __check_no_backward(data.file) && __check_no_backward(data.file.name) return __check_data_package(data) && __check_no_backward(data.file) && __check_no_backward(data.file.name);
} }
function __get_distribution_pool_path(data) { function __get_distribution_pool_path(data) {
return path.join(config.debomatic.path, data.distribution.name, 'pool') return path.join(config.debomatic.path, data.distribution.name, 'pool');
} }
function __get_package_path(data) { function __get_package_path(data) {
return path.join(__get_distribution_pool_path(data), data.package.name + '_' + data.package.version) return path.join(__get_distribution_pool_path(data), data.package.name + '_' + data.package.version);
} }
function __get_file_path(data) { function __get_file_path(data) {
return path.join(__get_package_path(data), data.package.name + '_' + data.package.version + '.' + data.file.name) return path.join(__get_package_path(data), data.package.name + '_' + data.package.version + '.' + data.file.name);
} }
function __get_files_list(dir, onlyDirectories, callback) { function __get_files_list(dir, onlyDirectories, callback) {
fs.readdir(dir, function(err, files){ fs.readdir(dir, function (err, files) {
result = []; var result = [];
if (err) { if (err) {
__errors_handler("__get_files_list", err) __errors_handler('__get_files_list', err);
return; return;
} }
files.forEach( function(f) { files.forEach(function (f) {
try { try {
complete_path = path.join(dir, f); var complete_path = path.join(dir, f);
stat = fs.statSync(complete_path) var stat = fs.statSync(complete_path);
if (onlyDirectories) { if (onlyDirectories) {
if (stat.isDirectory()) { if (stat.isDirectory()) {
result.push(f); result.push(f);
} }
} } else {
else {
if (stat.isFile()) { if (stat.isFile()) {
result.push(f); result.push(f);
} }
} }
} catch (fs_error) { } catch (fs_error) {
__errors_handler("__get_files_list:forEach", fs_error) __errors_handler('__get_files_list:forEach', fs_error);
return return;
} }
}); });
callback(result); callback(result);
...@@ -72,102 +75,103 @@ function __get_files_list(dir, onlyDirectories, callback) { ...@@ -72,102 +75,103 @@ function __get_files_list(dir, onlyDirectories, callback) {
} }
function __watch_path_onsocket(event_name, socket, data, watch_path, updater) { function __watch_path_onsocket(event_name, socket, data, watch_path, updater) {
socket.get("watchers", function(err, socket_watchers){ socket.get('watchers', function (err, socket_watchers) {
if (! socket_watchers) { if (!socket_watchers) {
// init socket watchers // init socket watchers
socket_watchers = {} socket_watchers = {};
} }
try { try {
var watcher = socket_watchers[event_name] var watcher = socket_watchers[event_name];
if (watcher) if (watcher)
watcher.close() watcher.close();
fs.stat(watch_path, function(err, stats) { fs.stat(watch_path, function (err, stats) {
if (err) { if (err) {
__errors_handler("__watch_path_onsocket:fs.stat", err, socket) __errors_handler('__watch_path_onsocket:fs.stat', err, socket);
return return;
} }
if (stats.isDirectory()) { if (stats.isDirectory()) {
watcher = fs.watch(watch_path, {persistent: true}, function (event, fileName) { watcher = fs.watch(watch_path, {
if(event == 'rename') persistent: true
updater(event_name, socket, data) }, function (event, fileName) {
}) if (event == 'rename')
} updater(event_name, socket, data);
else if(stats.isFile()) {
watcher = new Tail(watch_path)
watcher.on('line', function(new_content, tailInfo) {
data.file.new_content = new_content + '\n'
updater(event_name, socket, data)
}); });
watcher.on('error', function(msg) { } else if (stats.isFile()) {
watcher = new Tail(watch_path);
watcher.on('line', function (new_content, tailInfo) {
data.file.new_content = new_content + '\n';
updater(event_name, socket, data);
});
watcher.on('error', function (msg) {
socket.emit(config.events.error, msg); socket.emit(config.events.error, msg);
}); });
} }
socket_watchers[event_name] = watcher socket_watchers[event_name] = watcher;
socket.set("watchers", socket_watchers) socket.set('watchers', socket_watchers);
}) });
} catch (err) { } catch (err) {
__errors_handler("__watch_path_onsocket <- " + arguments.callee.caller.name, err, socket) __errors_handler('__watch_path_onsocket <- ' + arguments.callee.caller.name, err, socket);
return return;
} }
}) });
} }
function __generic_handler_watcher(event_name, socket, data, watch_path, callback) { function __generic_handler_watcher(event_name, socket, data, watch_path, callback) {
callback(event_name, socket, data) callback(event_name, socket, data);
__watch_path_onsocket(event_name, socket, data, watch_path, callback) __watch_path_onsocket(event_name, socket, data, watch_path, callback);
} }
function __send_distributions(socket) { function __send_distributions(socket) {
__get_files_list(config.debomatic.path, true, function(directories) { __get_files_list(config.debomatic.path, true, function (directories) {
var distributions = [] var distributions = [];
directories.forEach(function(dir) { directories.forEach(function (dir) {
var data = {} var data = {};
data.distribution = {} data.distribution = {};
data.distribution.name = dir data.distribution.name = dir;
var pool_path = __get_distribution_pool_path(data) var pool_path = __get_distribution_pool_path(data);
if (fs.existsSync(pool_path)) { if (fs.existsSync(pool_path)) {
distributions.push(dir) distributions.push(dir);
} }
}) });
socket.emit(config.events.broadcast.distributions, distributions); socket.emit(config.events.broadcast.distributions, distributions);
}) });
} }
utils = { var utils = {
check_data_distribution: function(data) { check_data_distribution: function (data) {
return __check_data_distribution(data) return __check_data_distribution(data);
}, },
check_data_package: function(data) { check_data_package: function (data) {
return __check_data_package(data) return __check_data_package(data);
}, },
check_data_file: function(data) { check_data_file: function (data) {
return __check_data_file(data) return __check_data_file(data);
}, },
get_distribution_pool_path: function(data) { get_distribution_pool_path: function (data) {
return __get_distribution_pool_path(data) return __get_distribution_pool_path(data);
}, },
get_package_path: function(data) { get_package_path: function (data) {
return __get_package_path(data) return __get_package_path(data);
}, },
get_file_path: function(data) { get_file_path: function (data) {
return __get_file_path(data) return __get_file_path(data);
}, },
get_files_list: function(dir, onlyDirectories, callback) { get_files_list: function (dir, onlyDirectories, callback) {
return __get_files_list(dir, onlyDirectories, callback) return __get_files_list(dir, onlyDirectories, callback);
}, },
watch_path_onsocket: function(event_name, socket, data, watch_path, updater) { watch_path_onsocket: function (event_name, socket, data, watch_path, updater) {
return __watch_path_onsocket(event_name, socket, data, watch_path, updater) return __watch_path_onsocket(event_name, socket, data, watch_path, updater);
}, },
generic_handler_watcher: function(event_name, socket, data, watch_path, callback) { generic_handler_watcher: function (event_name, socket, data, watch_path, callback) {
return __generic_handler_watcher(event_name, socket, data, watch_path, callback); return __generic_handler_watcher(event_name, socket, data, watch_path, callback);
}, },
send_distributions: function(socket) { send_distributions: function (socket) {
return __send_distributions(socket) return __send_distributions(socket);
}, },
errors_handler: function(from, error, socket) { errors_handler: function (from, error, socket) {
return __errors_handler(from, error, socket) return __errors_handler(from, error, socket);
} }
} };
module.exports = utils module.exports = utils;
"use strict";
/* /*
General information about debugging: General information about debugging:
...@@ -10,17 +11,17 @@ ...@@ -10,17 +11,17 @@
3 - socket emit data 3 - socket emit data
4 - socket received data 4 - socket received data
*/ */
var debug = function() { var debug = function () {
if (arguments.length < 2) { if (arguments.length < 2) {
return return;
} }
var level = arguments[0] var level = arguments[0];
arguments[0] = "debug [" + level + "]:" arguments[0] = "debug [" + level + "]:";
if (level <= config.preferences.debug) { if (level <= config.preferences.debug) {
if (console.debug) if (console.debug)
console.debug.apply(console, arguments) console.debug.apply(console, arguments);
else else
console.log.apply(console, arguments) console.log.apply(console, arguments);
} }
} }
...@@ -30,11 +31,11 @@ var debug = function() { ...@@ -30,11 +31,11 @@ var debug = function() {
usage: debug_socket("emit"|"received", event_name, data) usage: debug_socket("emit"|"received", event_name, data)
*/ */
var debug_socket = function() { var debug_socket = function () {
if (arguments.length != 3) if (arguments.length != 3)
return return;
var level = 3; var level = 3;
if (arguments[0] == "received") if (arguments[0] == "received")
level = 4 level = 4;
debug(level, "socket", arguments[0], "event:", arguments[1], "data:", arguments[2]) debug(level, "socket", arguments[0], "event:", arguments[1], "data:", arguments[2]);
} }
// main client javascript // main client javascript
'use strict';
var preferences = new Preferences() var preferences = new Preferences();
var page_generic = new Page_Generic() var page_generic = new Page_Generic();
if (window.location.pathname == config.paths.preferences) { if (window.location.pathname == config.paths.preferences) {
preferences.initPage() preferences.initPage();
} }
if (window.location.pathname == '/') { if (window.location.pathname == '/') {
// convert email addresses in the right format // convert email addresses in the right format
var emails = $(".email") var emails = $('.email');
$.each(emails, function (){ $.each(emails, function () {
var subject = '' var subject = '';
if ($(this).attr('subject')) { if ($(this).attr('subject')) {
subject = '?subject=' + $(this).attr('subject') subject = '?subject=' + $(this).attr('subject');
} }
var real_email = $(this).attr('address').replace('AT','@').replace('DOT','.').replace(/ /g,'') var real_email = $(this).attr('address').replace('AT', '@').replace('DOT', '.').replace(/ /g, '');
var label = real_email var label = real_email;
if (config.debomatic.admin.name && config.debomatic.admin.name != 'Your Name') if (config.debomatic.admin.name && config.debomatic.admin.name != 'Your Name');
label = config.debomatic.admin.name label = config.debomatic.admin.name;
real_email = '<a href="mailto:' + real_email + subject + '">' + label + '</a>' real_email = '<a href="mailto:' + real_email + subject + '">' + label + '</a>';
$(this).html(real_email) $(this).html(real_email);
}) })
} }
var socket = io.connect('/'); var socket = io.connect('/');
page_generic.start(socket) page_generic.start(socket);
if (window.location.pathname == config.paths.distribution) { if (window.location.pathname == config.paths.distribution) {
new Page_Distrubion(socket).start() new Page_Distrubion(socket).start();
} }
'use strict';
// function to get all files in on click // function to get all files in on click
// event comes from HTML // event comes from HTML
function download_all (div_id) { function download_all(div_id) {
frame_id = 'downloadAllFrame' var frame_id = 'downloadAllFrame';
if ($("#" + frame_id).length > 0) var frame = null;
frame = $($("#" + frame_id)[0]) if ($('#' + frame_id).length > 0)
frame = $($('#' + frame_id)[0]);
else { else {
frame = $('<iframe></iframe>') frame = $('<iframe></iframe>');
frame.hide() frame.hide();
frame.attr('id', frame_id) frame.attr('id', frame_id);
$('body').append(frame) $('body').append(frame);
} }
files = $(div_id).find('ul li a') var files = $(div_id).find('ul li a');
$.each(files, function(index, item) { $.each(files, function (index, item) {
setTimeout(function() { setTimeout(function () {
frame.attr('src', item.href) frame.attr('src', item.href);
}, index * 1000) }, index * 1000);
}) });
} }
function Page_Distrubion(socket) function Page_Distrubion(socket) {
{
/* /*
...@@ -60,549 +62,533 @@ function Page_Distrubion(socket) ...@@ -60,549 +62,533 @@ function Page_Distrubion(socket)
*/ */
var socket = socket var _e = config.events.client;
var _e = config.events.client var view = Utils.from_hash_to_view();
var view = Utils.from_hash_to_view() var sidebarOffset = 0;
var sidebarOffset = 0 var new_lines = [];
var new_lines = []
function __check_hash_makes_sense() { function __check_hash_makes_sense() {
if (window.location.hash.indexOf('..') >= 0) { if (window.location.hash.indexOf('..') >= 0) {
error.set("Detected '..' God Is Watching You !") error.set('Detected ".." God Is Watching You !');
return false return false;
} }
if (! window.location.hash) { if (!window.location.hash) {
welcome.show() welcome.show();
return false return false;
} }
var info = window.location.hash.split('/') var info = window.location.hash.split('/');
if (info.length == 2) if (info.length == 2)
window.location.hash = info[0] window.location.hash = info[0];
return true return true;
} }
var title = { var title = {
set: function(label) { set: function (label) {
if (label) { if (label) {
$('#title').html(label) $('#title').html(label);
page_generic.set_window_title(label) page_generic.set_window_title(label);
return return;
} }
var label = '' label = '';
var window_title = null var window_title = null;
if (Utils.check_view_file(view)) { if (Utils.check_view_file(view)) {
var complete_name = view.package.orig_name + '.' + view.file.name var complete_name = view.package.orig_name + '.' + view.file.name;
window_title = complete_name window_title = complete_name;
if (! view.file.path) if (!view.file.path);
view.file.path = config.paths.debomatic + '/' + view.distribution.name + '/pool/' + view.package.orig_name + '/' + complete_name view.file.path = config.paths.debomatic + '/' + view.distribution.name + '/pool/' + view.package.orig_name + '/' + complete_name;
label = complete_name + ' \ label = complete_name + '<a class="btn btn-link btn-lg" title="Download" href="' + view.file.path + '"> ' +
<a class="btn btn-link btn-lg" title="Download" href="' + view.file.path + '">\ '<span class="glyphicon glyphicon-download-alt"></span></a>';
<span class="glyphicon glyphicon-download-alt"></span>\ } else if (Utils.check_view_package(view))
</a>' label = view.package.orig_name;
}
else if (Utils.check_view_package(view))
label = view.package.orig_name
else if (Utils.check_view_distribution(view)) else if (Utils.check_view_distribution(view))
label = view.distribution.name label = view.distribution.name;
$('#title').html(label) $('#title').html(label);
if (window_title) if (window_title)
label = window_title label = window_title;
page_generic.set_window_title(label) page_generic.set_window_title(label);
}, },
clean: function() { clean: function () {
$('#title').html('') $('#title').html('');
page_generic.set_window_title() page_generic.set_window_title();
}
} }
};
var packages = { var packages = {
set: function (socket_data) { set: function (socket_data) {
packages.clean() packages.clean();
var tmp = Utils.clone(socket_data) var tmp = Utils.clone(socket_data);
tmp.file = null tmp.file = null;
view.packages = {} view.packages = {};
if (socket_data.distribution.packages && socket_data.distribution.packages.length > 0) { if (socket_data.distribution.packages && socket_data.distribution.packages.length > 0) {
socket_data.distribution.packages.forEach(function(p){ socket_data.distribution.packages.forEach(function (p) {
tmp.package = p tmp.package = p;
// get datestamp if package is clicked // get datestamp if package is clicked
$('#packages ul').append('<li id="package-' + p.orig_name + '"><a href="' + Utils.from_view_to_hash(tmp) + '/datestamp">'+ p.name + ' <span>'+p.version+'</span></a></li>') $('#packages ul').append('<li id="package-' + p.orig_name + '"><a href="' +
view.packages[p.orig_name] = Utils.clone(p) Utils.from_view_to_hash(tmp) + '/datestamp">' + p.name + ' <span>' + p.version + '</span></a></li>');
}) view.packages[p.orig_name] = Utils.clone(p);
packages.select() });
} packages.select();
else { } else {
$('#packages ul').append('<li class="text-muted">No packages yet</li>') $('#packages ul').append('<li class="text-muted">No packages yet</li>');
} }
packages.show() packages.show();
sticky.updateOffset() sticky.updateOffset();
}, },
clean: function () { clean: function () {
$('#packages ul').html('') $('#packages ul').html('');
}, },
get: function () { get: function () {
if (Utils.check_view_distribution(view)) { if (Utils.check_view_distribution(view)) {
var query_data = {} var query_data = {};
query_data.distribution = view.distribution query_data.distribution = view.distribution;
debug_socket("emit", _e.distribution_packages.get, query_data) debug_socket('emit', _e.distribution_packages.get, query_data);
socket.emit(_e.distribution_packages.get, query_data) socket.emit(_e.distribution_packages.get, query_data);
} }
}, },
select: function() { select: function () {
packages.unselect() packages.unselect();
if (Utils.check_view_package(view)) { if (Utils.check_view_package(view)) {
$("#packages li[id='package-"+ view.package.orig_name + "']").addClass('active') $('#packages li[id="package-' + view.package.orig_name + '"]').addClass('active');
} }
}, },
unselect: function() { unselect: function () {
$('#packages li').removeClass('active') $('#packages li').removeClass('active');
}, },
set_status: function (status_data) { set_status: function (status_data) {
// set status in view // set status in view
if ( view.distribution.name == status_data.distribution if (view.distribution.name == status_data.distribution && view.packages[status_data.package]) {
&& view.packages[status_data.package] ) view.packages[status_data.package].status = status_data.status;
{
view.packages[status_data.package].status = status_data.status
if (status_data.hasOwnProperty('success')) if (status_data.hasOwnProperty('success'))
view.packages[status_data.package].success = status_data.success view.packages[status_data.package].success = status_data.success;
else else
delete(view.packages[status_data.package].success) delete(view.packages[status_data.package].success);
} }
// and in html // and in html
var p_html = $("#packages li[id='package-"+ status_data.package + "'] a") var p_html = $('#packages li[id="package-' + status_data.package + '"] a');
p_html.find('span.icon').remove() p_html.find('span.icon').remove();
p_html.append(Utils.get_status_icon_html(status_data)) p_html.append(Utils.get_status_icon_html(status_data));
if (Utils.check_view_package(view) if (Utils.check_view_package(view) && view.package.orig_name == status_data.package && view.distribution.name == status_data.distribution) {
&& view.package.orig_name == status_data.package
&& view.distribution.name == status_data.distribution)
{
// in case user is watching this package, update also view.package // in case user is watching this package, update also view.package
view.package = Utils.clone(view.packages[status_data.package]) view.package = Utils.clone(view.packages[status_data.package]);
} }
}, },
show: function() { show: function () {
$("#packages").show() $('#packages').show();
}, },
hide: function() { hide: function () {
$("#packages").hide() $('#packages').hide();
}
} }
};
var files = { var files = {
set: function (socket_data) { set: function (socket_data) {
files.clean() files.clean();
var tmp = Utils.clone(socket_data) var tmp = Utils.clone(socket_data);
if (socket_data.package.files && socket_data.package.files.length > 0) { if (socket_data.package.files && socket_data.package.files.length > 0) {
// update view // update view
view.package.files = Utils.clone(socket_data.package.files) view.package.files = Utils.clone(socket_data.package.files);
// update html // update html
socket_data.package.files.forEach(function(f){ socket_data.package.files.forEach(function (f) {
tmp.file = f tmp.file = f;
var html_file = $('<li id="file-'+ f.orig_name +'"><a title="'+ f.orig_name +'" href="'+ Utils.from_view_to_hash(tmp) + '">' + f.name + '</a></li>') var html_file = $('<li id="file-' + f.orig_name + '"><a title="' + f.orig_name + '" href="' +
html_file.on("click", function(){ Utils.from_view_to_hash(tmp) + '">' + f.name + '</a></li>');
files.select(this) html_file.on('click', function () {
}) files.select(this);
$('#logs ul').append(html_file) });
}) $('#logs ul').append(html_file);
$('#logs').show() });
files.select() $('#logs').show();
files.select();
} }
if (socket_data.package.debs && socket_data.package.debs.length > 0) { if (socket_data.package.debs && socket_data.package.debs.length > 0) {
// update view // update view
view.package.debs = Utils.clone(socket_data.package.debs) view.package.debs = Utils.clone(socket_data.package.debs);
// update.html // update.html
socket_data.package.debs.forEach(function(f){ socket_data.package.debs.forEach(function (f) {
$('#debs ul').append('<li><a title="'+ f.orig_name +'" href="' + f.path + '">' + f.name +'</a> <span>.' + f.extension + '</span></li>') $('#debs ul').append('<li><a title="' + f.orig_name + '" href="' + f.path + '">' +
}) f.name + '</a> <span>.' + f.extension + '</span></li>');
$('#debs').show() });
$('#debs').show();
} }
if (socket_data.package.sources && socket_data.package.sources.length > 0) { if (socket_data.package.sources && socket_data.package.sources.length > 0) {
// update view // update view
view.package.sources = Utils.clone(socket_data.package.sources) view.package.sources = Utils.clone(socket_data.package.sources);
// update html // update html
socket_data.package.sources.forEach(function(f){ socket_data.package.sources.forEach(function (f) {
$('#sources ul').append('<li><a title="'+ f.orig_name +'" href="' + f.path + '">' + f.name +'</a></li>') $('#sources ul').append('<li><a title="' + f.orig_name + '" href="' + f.path + '">' + f.name + '</a></li>');
}) })
$('#sources').show() $('#sources').show();
} }
files.show() files.show();
sticky.updateOffset() sticky.updateOffset();
}, },
clean: function() { clean: function () {
$('#logs ul').html(''); $('#logs ul').html('');
$('#logs').hide() $('#logs').hide();
$('#debs ul').html(''); $('#debs ul').html('');
$('#debs').hide(); $('#debs').hide();
$('#sources ul').html('') $('#sources ul').html('');
$('#sources').hide() $('#sources').hide();
files.hide() files.hide();
}, },
get: function () { get: function () {
if (Utils.check_view_package(view)) { if (Utils.check_view_package(view)) {
var query_data = {} var query_data = {};
query_data.distribution = view.distribution query_data.distribution = view.distribution;
query_data.package = view.package query_data.package = view.package;
debug_socket("emit", _e.package_files_list.get, query_data) debug_socket('emit', _e.package_files_list.get, query_data);
socket.emit(_e.package_files_list.get, query_data) socket.emit(_e.package_files_list.get, query_data);
} }
}, },
select: function() { select: function () {
files.show() files.show();
files.unselect() files.unselect();
if (Utils.check_view_file(view)) { if (Utils.check_view_file(view)) {
$("#logs li[id='file-" + view.file.orig_name + "']").addClass('active') $('#logs li[id="file-' + view.file.orig_name + '"]').addClass('active');
} }
}, },
unselect: function() { unselect: function () {
$('#logs li').removeClass('active'); $('#logs li').removeClass('active');
}, },
hide: function() { hide: function () {
$('#files').hide() $('#files').hide();
}, },
show: function() { show: function () {
$('#files').show() $('#files').show();
}, },
} };
var file = { var file = {
set: function(socket_data) { set: function (socket_data) {
view.file = Utils.clone(socket_data.file) view.file = Utils.clone(socket_data.file);
$("#file pre").html(socket_data.file.content) $('#file pre').html(socket_data.file.content);
$("#file").show() $('#file').show();
}, },
clean: function() { clean: function () {
$('#file pre').html('') $('#file pre').html('');
$('#file').hide() $('#file').hide();
}, },
append: function(new_content) { append: function (new_content) {
var content = $("#file pre") var content = $('#file pre');
content.append(new_content) content.append(new_content);
if (config.preferences.autoscroll) { if (config.preferences.autoscroll) {
// scroll down if file is covering footer // scroll down if file is covering footer
var file_height = $("#fileOffset").offset().top var file_height = $('#fileOffset').offset().top;
var footerOffset = $("footer").offset().top var footerOffset = $('footer').offset().top;
if (file_height > footerOffset) { if (file_height > footerOffset) {
debug(2, 'scoll down on new content') debug(2, 'scoll down on new content');
$('html,body').animate({ scrollTop: file_height }, 0); $('html,body').animate({
scrollTop: file_height
}, 0);
} }
} }
}, },
get: function() { get: function () {
if (Utils.check_view_file(view)) { if (Utils.check_view_file(view)) {
var query_data = {} var query_data = {};
query_data.distribution = view.distribution query_data.distribution = view.distribution;
query_data.package = view.package query_data.package = view.package;
query_data.file = view.file query_data.file = view.file;
query_data.file.content = null query_data.file.content = null;
// get a feedback to user while downloading file // get a feedback to user while downloading file
$("#file pre").html("Downloading file, please wait a while ...") $('#file pre').html('Downloading file, please wait a while ...');
$("#file").show() $('#file').show();
debug_socket("emit", _e.file.get, query_data) debug_socket('emit', _e.file.get, query_data);
socket.emit(_e.file.get, query_data) socket.emit(_e.file.get, query_data);
}
} }
} }
};
var breadcrumb = { var breadcrumb = {
update: function(label) { update: function (label) {
if (label) { if (label) {
$('.breadcrumb').html('<li class="active">' + label + '</li>') $('.breadcrumb').html('<li class="active">' + label + '</li>');
return return;
} }
hash = window.location.hash.replace('#', '') var hash = window.location.hash.replace('#', '');
var new_html = '' var new_html = '';
var new_hash = '#' var new_hash = '#';
var info = hash.split('/') var info = hash.split('/');
for (var i = 0; i < info.length ; i++) { for (var i = 0; i < info.length; i++) {
new_hash += info[i] new_hash += info[i];
if (i == (info.length - 1)) if (i == (info.length - 1))
new_html += '<li class="active">' + info[i] + '</li>' new_html += '<li class="active">' + info[i] + '</li>';
else else
new_html += '<li><a href="' + new_hash + '">' + info[i] + '</a>' new_html += '<li><a href="' + new_hash + '">' + info[i] + '</a>';
new_hash += '/' new_hash += '/';
}
$('.breadcrumb').html(new_html)
} }
$('.breadcrumb').html(new_html);
} }
};
// sticky sidebar // sticky sidebar
var sticky = { var sticky = {
init: function() { init: function () {
if (sidebarOffset == 0) if (sidebarOffset === 0)
return return;
if ($(window).scrollTop() > sidebarOffset) { if ($(window).scrollTop() > sidebarOffset) {
sticky.show() sticky.show();
} else { } else {
sticky.hide() sticky.hide();
sticky.updateOffset() sticky.updateOffset();
} }
}, },
start: function() { start: function () {
$(window).scroll(sticky.init) $(window).scroll(sticky.init);
}, },
stop: function() { stop: function () {
$(window).off("scroll") $(window).off('scroll');
}, },
reset: function() { reset: function () {
sticky.stop() sticky.stop();
sticky.update() sticky.update();
sticky.init() sticky.init();
sticky.start() sticky.start();
}, },
show: function() { show: function () {
if (config.preferences.sidebar) { if (config.preferences.sidebar) {
$("#sticky").addClass('fixed') $('#sticky').addClass('fixed');
} }
debug(2, "showing sticky") debug(2, 'showing sticky');
$("#sticky-package").fadeIn() $('#sticky-package').fadeIn();
}, },
hide: function() { hide: function () {
$("#sticky").removeClass('fixed') $('#sticky').removeClass('fixed');
$("#sticky-package").fadeOut(150) $('#sticky-package').fadeOut(150);
}, },
update: function() { update: function () {
sticky.updateOffset() sticky.updateOffset();
if (Utils.check_view_distribution(view)) if (Utils.check_view_distribution(view))
$("#sticky-package .distribution").html(view.distribution.name) $('#sticky-package .distribution').html(view.distribution.name);
if (Utils.check_view_package(view)) { if (Utils.check_view_package(view)) {
$("#sticky-package .name").html(view.package.name) $('#sticky-package .name').html(view.package.name);
$("#sticky-package .version").html(view.package.version) $('#sticky-package .version').html(view.package.version);
sticky.set_status() sticky.set_status();
} }
}, },
updateOffset: function() { updateOffset: function () {
var sidebar = $("#files") var sidebar = $('#files');
sidebarOffset = sidebar.offset().top sidebarOffset = sidebar.offset().top;
}, },
set_status: function(status_data) { set_status: function (status_data) {
if (! status_data) { if (!status_data) {
status_data = {} status_data = {};
status_data.distribution = view.distribution.name status_data.distribution = view.distribution.name;
status_data.package = view.package.orig_name status_data.package = view.package.orig_name;
status_data.status = view.package.status status_data.status = view.package.status;
if (view.package.hasOwnProperty('success')) if (view.package.hasOwnProperty('success'))
status_data.success = view.package.success status_data.success = view.package.success;
} }
if ( Utils.check_view_package(view) if (Utils.check_view_package(view) && status_data.distribution == view.distribution.name && status_data.package == view.package.orig_name) {
&& status_data.distribution == view.distribution.name
&& status_data.package == view.package.orig_name)
{
// update html // update html
var info = Utils.get_status_icon_and_class(status_data) var info = Utils.get_status_icon_and_class(status_data);
var panel = $("#sticky-package-content") var panel = $('#sticky-package-content');
panel.removeClass() panel.removeClass();
panel.addClass('panel panel-' + info.className) panel.addClass('panel panel-' + info.className);
var div = $("#sticky-package .status") var div = $('#sticky-package .status');
div.find('span.icon').remove() div.find('span.icon').remove();
div.append(Utils.get_status_icon_html(status_data)) div.append(Utils.get_status_icon_html(status_data));
}
} }
} }
};
var error = { var error = {
set: function(socket_error) { set: function (socket_error) {
$("#error span").html(socket_error) $('#error span').html(socket_error);
error.view() error.view();
}, },
clean: function() { clean: function () {
$("#error").hide() $('#error').hide();
$("#error span").html('') $('#error span').html('');
}, },
view: function() { view: function () {
$("#error").fadeIn(100) $('#error').fadeIn(100);
title.set("Something is wrong ...") title.set('Something is wrong ...');
breadcrumb.update('Something is wrong ...') breadcrumb.update('Something is wrong ...');
file.clean() file.clean();
files.hide() files.hide();
unselect() unselect();
}, },
} };
var welcome = { var welcome = {
set: function(distributions) { set: function (distributions) {
welcome.clean() welcome.clean();
if(distributions.length < 1) { if (distributions.length < 1) {
$('#welcome').append('<p class="lead text-muted">There is no distribution at the moment</p>') $('#welcome').append('<p class="lead text-muted">There is no distribution at the moment</p>');
} } else {
else { distributions.forEach(function (name) {
distributions.forEach(function (name){ $('#welcome').append('<a class="btn btn-lg btn-primary" href="' + config.paths.distribution +
$('#welcome').append('<a class="btn btn-lg btn-primary" href="'+ config.paths.distribution + '#'+ name + '">' + name + '</a>'); '# ' + name + '">' + name + '</a>');
}); });
} }
}, },
show: function() { show: function () {
title.set("Please select a distribution") title.set('Please select a distribution');
breadcrumb.update("Select a distribution") breadcrumb.update('Select a distribution');
packages.hide() packages.hide();
file.clean() file.clean();
files.hide() files.hide();
unselect() unselect();
$("#welcome").show() $('#welcome').show();
}, },
clean: function() { clean: function () {
$("#welcome").html('') $('#welcome').html('');
}, },
hide: function() { hide: function () {
$("#welcome").hide() $('#welcome').hide();
}
} }
};
var preferences = function() { var preferences = function () {
if (! config.preferences.sidebar) { if (!config.preferences.sidebar) {
debug(2, "no sidebar - updating html") debug(2, 'no sidebar - updating html');
$("#sidebar").removeClass() $('#sidebar').removeClass();
$("#sidebar").addClass("col-md-12 row") $('#sidebar').addClass('col-md-12 row');
$("#packages").addClass("col-md-4") $('#packages').addClass('col-md-4');
$("#logs").addClass("col-md-4") $('#logs').addClass('col-md-4');
$("#files .others").addClass("col-md-4") $('#files .others').addClass('col-md-4');
$("#main").removeClass().addClass("col-md-12") $('#main').removeClass().addClass('col-md-12');
$("#sticky-package").addClass("on-top") $('#sticky-package').addClass('on-top');
} }
if (! config.preferences.file_background) { if (!config.preferences.file_background) {
$("#file pre").addClass("no-background") $('#file pre').addClass('no-background');
}
$("#file pre").css('font-size', config.preferences.file_fontsize)
} }
$('#file pre').css('font-size', config.preferences.file_fontsize);
};
var select = function() { var select = function () {
unselect() unselect();
if (Utils.check_view_distribution(view)) { if (Utils.check_view_distribution(view)) {
$("#distributions li[id='distribution-" + view.distribution.name + "']").addClass('active') $('#distributions li[id="distribution-' + view.distribution.name + '"]').addClass('active');
} }
packages.select() packages.select();
files.select() files.select();
} };
var unselect = function() { var unselect = function () {
$('#distributions li').removeClass('active') $('#distributions li').removeClass('active');
files.unselect() files.unselect();
packages.unselect() packages.unselect();
} };
var clean = function() { var clean = function () {
welcome.hide() welcome.hide();
title.clean() title.clean();
packages.clean() packages.clean();
files.clean() files.clean();
file.clean() file.clean();
unselect() unselect();
breadcrumb.update() breadcrumb.update();
error.clean() error.clean();
} };
var update = { var update = {
page: function(old_view) { page: function (old_view) {
if ( ! old_view if (!old_view || !Utils.check_view_distribution(old_view) || !Utils.check_view_distribution(view) || view.distribution.name != old_view.distribution.name || !view.package.orig_name) { // new distribution view
|| ! Utils.check_view_distribution(old_view) populate();
|| ! Utils.check_view_distribution(view) return;
|| view.distribution.name != old_view.distribution.name } else if (!Utils.check_view_package(old_view) || !Utils.check_view_package(view) ||
|| ! view.package.orig_name view.package.orig_name != old_view.package.orig_name) { // new package view
) files.get();
{ // new distribution view file.get();
populate() } else if (!Utils.check_view_file(old_view) || !Utils.check_view_file(view) ||
return view.file.name != old_view.file.name) { // new file view
} file.get();
else if ( ! Utils.check_view_package(old_view) || }
! Utils.check_view_package(view) || update.view(view);
view.package.orig_name != old_view.package.orig_name ) },
{ // new package view view: function () {
files.get() error.clean();
file.get() title.set();
} breadcrumb.update();
else if ( ! Utils.check_view_file(old_view) || select();
! Utils.check_view_file(view) || sticky.reset();
view.file.name != old_view.file.name ) }
{ // new file view };
file.get()
}
update.view(view)
},
view : function() {
error.clean()
title.set()
breadcrumb.update()
select()
sticky.reset()
}
}
var populate = function () { var populate = function () {
clean() clean();
packages.get() packages.get();
files.get() files.get();
file.get() file.get();
update.view() update.view();
} };
this.start = function () { this.start = function () {
socket.on(config.events.error, function(socket_error) { socket.on(config.events.error, function (socket_error) {
debug_socket("received", config.events.error, socket_error) debug_socket('received', config.events.error, socket_error);
error.set(socket_error) error.set(socket_error);
}) });
socket.on(config.events.broadcast.distributions, function (socket_data) { socket.on(config.events.broadcast.distributions, function (socket_data) {
debug_socket("received", config.events.broadcast.distributions, socket_data) debug_socket('received', config.events.broadcast.distributions, socket_data);
welcome.set(socket_data) welcome.set(socket_data);
}) });
socket.on(_e.distribution_packages.set, function (socket_data){ socket.on(_e.distribution_packages.set, function (socket_data) {
debug_socket("received", _e.distribution_packages.set, socket_data) debug_socket('received', _e.distribution_packages.set, socket_data);
packages.set(socket_data) packages.set(socket_data);
}) });
socket.on(_e.distribution_packages.status, function (socket_data){ socket.on(_e.distribution_packages.status, function (socket_data) {
debug_socket("received", _e.distribution_packages.set, socket_data) debug_socket('received', _e.distribution_packages.set, socket_data);
packages.set_status(socket_data) packages.set_status(socket_data);
sticky.set_status(socket_data) sticky.set_status(socket_data);
}) });
socket.on(config.events.broadcast.status_update, function (socket_data){ socket.on(config.events.broadcast.status_update, function (socket_data) {
packages.set_status(socket_data) packages.set_status(socket_data);
sticky.set_status(socket_data) sticky.set_status(socket_data);
}) });
socket.on(_e.package_files_list.set, function (socket_data){ socket.on(_e.package_files_list.set, function (socket_data) {
debug_socket("received", _e.package_files_list.set, socket_data) debug_socket('received', _e.package_files_list.set, socket_data);
files.set(socket_data) files.set(socket_data);
}) });
socket.on(_e.file.set, function (socket_data) { socket.on(_e.file.set, function (socket_data) {
debug_socket("received", _e.file.set, socket_data) debug_socket('received', _e.file.set, socket_data);
file.set(socket_data) file.set(socket_data);
}) });
socket.on(_e.file_newcontent, function (socket_data) { socket.on(_e.file_newcontent, function (socket_data) {
debug_socket("received", _e.file_newcontent, socket_data) debug_socket('received', _e.file_newcontent, socket_data);
new_lines.push(socket_data.file.new_content) new_lines.push(socket_data.file.new_content);
}) });
$(window).on('hashchange', function() { $(window).on('hashchange', function () {
if (! __check_hash_makes_sense()) if (!__check_hash_makes_sense())
return return;
var old_view = Utils.clone(view) var old_view = Utils.clone(view);
var new_view = Utils.from_hash_to_view() var new_view = Utils.from_hash_to_view();
// reset current view // reset current view
view.distribution = Utils.clone(new_view.distribution) view.distribution = Utils.clone(new_view.distribution);
view.package = Utils.clone(new_view.package) view.package = Utils.clone(new_view.package);
if (view.packages[new_view.package.orig_name]) if (view.packages[new_view.package.orig_name])
view.package = Utils.clone(view.packages[new_view.package.orig_name]) view.package = Utils.clone(view.packages[new_view.package.orig_name]);
view.file = Utils.clone(new_view.file) view.file = Utils.clone(new_view.file);
update.page(old_view) update.page(old_view);
$('html,body').animate({scrollTop: 0}, 0); $('html,body').animate({
debug(1, "changing view", "old:", old_view, "new:", view) scrollTop: 0
}, 0);
debug(1, 'changing view', 'old:', old_view, 'new:', view);
}); });
if (! __check_hash_makes_sense()) if (!__check_hash_makes_sense())
return return;
populate() populate();
// Init sticky-package back_on_top on click // Init sticky-package back_on_top on click
$("#sticky-package").on("click", function(){ $('#sticky-package').on('click', function () {
$('html,body').animate({scrollTop: 0}, 100); $('html,body').animate({
}) scrollTop: 0
}, 100);
});
// WORKAROUND: // WORKAROUND:
// when page is loaded sidebar has offset().top // when page is loaded sidebar has offset().top
...@@ -615,15 +601,15 @@ function Page_Distrubion(socket) ...@@ -615,15 +601,15 @@ function Page_Distrubion(socket)
// Append lines every 200 mills. // Append lines every 200 mills.
function watch_for_new_lines() { function watch_for_new_lines() {
if (new_lines.length > 0) { if (new_lines.length > 0) {
file.append(new_lines.join('')) file.append(new_lines.join(''));
new_lines = [] new_lines = [];
} }
setTimeout(watch_for_new_lines, 200); setTimeout(watch_for_new_lines, 200);
} }
watch_for_new_lines() watch_for_new_lines();
// Update html according with preferences // Update html according with preferences
preferences() preferences();
} };
} }
function Page_Generic() 'use strict';
{
var _e = config.events function Page_Generic() {
var _e = config.events;
function __get_status_html_id(status_data) { function __get_status_html_id(status_data) {
var result = 'status-' + status_data.status + '-' + status_data.distribution var result = 'status-' + status_data.status + '-' + status_data.distribution;
if (status_data.hasOwnProperty('package')) if (status_data.hasOwnProperty('package'))
result += '-' + status_data.package result += '-' + status_data.package;
return result return result;
} }
function __get_status_html_href(status_data) { function __get_status_html_href(status_data) {
result = config.paths.distribution + '#' + status_data.distribution result = config.paths.distribution + '#' + status_data.distribution;
if (status_data.hasOwnProperty('package')) if (status_data.hasOwnProperty('package'))
result += '/' + status_data.package.replace('_', '/') + '/datestamp' result += '/' + status_data.package.replace('_', '/') + '/datestamp';
return result return result;
} }
function __get_status_html_title(status_data) { function __get_status_html_title(status_data) {
result = status_data.status + ': ' + status_data.distribution result = status_data.status + ': ' + status_data.distribution;
if (status_data.hasOwnProperty('package')) if (status_data.hasOwnProperty('package'))
result += ' > ' + status_data.package result += ' > ' + status_data.package;
if (status_data.hasOwnProperty('uploader') && status_data.uploader.length > 0) if (status_data.hasOwnProperty('uploader') && status_data.uploader.length > 0)
result += ' by ' + status_data.uploader result += ' by ' + status_data.uploader;
return result return result;
} }
function __get_status_html_inner(status_data) { function __get_status_html_inner(status_data) {
if (status_data.hasOwnProperty('package')) if (status_data.hasOwnProperty('package'))
return status_data.package; return status_data.package;
return status_data.distribution return status_data.distribution;
} }
function __get_status_html(status_data) { function __get_status_html(status_data) {
var _s = status_data var _s = status_data;
var li = $('<li></li>') var li = $('<li></li>');
li.attr('id', __get_status_html_id(status_data)) li.attr('id', __get_status_html_id(status_data));
var button = $('<a></a>') var button = $('<a></a>');
button.addClass('btn btn-xs') button.addClass('btn btn-xs');
button.addClass(_s.status) button.addClass(_s.status);
button.attr('title', __get_status_html_title(_s)) button.attr('title', __get_status_html_title(_s));
button.attr('href', __get_status_html_href(_s)) button.attr('href', __get_status_html_href(_s));
button.html(__get_status_html_inner(_s)) button.html(__get_status_html_inner(_s));
var info = Utils.get_status_icon_and_class(_s) var info = Utils.get_status_icon_and_class(_s);
button.addClass('btn-' + info.className) button.addClass('btn-' + info.className);
// add icon // add icon
button.html(button.html() + ' ' + Utils.get_status_icon_html(_s)) button.html(button.html() + ' ' + Utils.get_status_icon_html(_s));
li.html(button) li.html(button);
var result = $('<div></div>') var result = $('<div></div>');
result.html(li) result.html(li);
return result.html() return result.html();
} }
var distributions = { var distributions = {
set: function(distributions) { set: function (distributions) {
$('#distributions ul').html(''); $('#distributions ul').html('');
if(distributions.length < 1) { if (distributions.length < 1) {
$('#distributions ul').append('<li><a title="There is no distribution at the moment" onclick="return false">None</li>') $('#distributions ul').append('<li><a title="There is no distribution at the moment" onclick="return false">None</li>');
} } else {
else { distributions.forEach(function (name) {
distributions.forEach(function (name){ $('#distributions ul').append('<li id="distribution-' + name + '"><a href="' + config.paths.distribution + '#' + name + '">' + name + '</a></li>');
$('#distributions ul').append('<li id="distribution-' + name +'"><a href="'+ config.paths.distribution + '#'+ name + '">' + name + '</a></li>');
}); });
if (window.location.pathname == config.paths.distribution) { if (window.location.pathname == config.paths.distribution) {
var data = Utils.from_hash_to_view() var data = Utils.from_hash_to_view();
if (Utils.check_view_distribution(data)) { if (Utils.check_view_distribution(data)) {
$("#distributions li[id='distribution-" + data.distribution.name + "']").addClass('active') $('#distributions li[id="distribution-' + data.distribution.name + '"]').addClass('active');
} }
} }
} }
...@@ -72,107 +72,104 @@ function Page_Generic() ...@@ -72,107 +72,104 @@ function Page_Generic()
} }
var status = { var status = {
set: function(data_status) { set: function (data_status) {
$("#status ul").html('') $("#status ul").html('');
if (data_status.length > 0) { if (data_status.length > 0) {
data_status.forEach(function(s){ data_status.forEach(function (s) {
status.append(s) status.append(s);
}) })
} }
}, },
append: function(status_data) { append: function (status_data) {
$('#status .idle').hide() $('#status .idle').hide();
$("#status ul").append(__get_status_html(status_data)) $("#status ul").append(__get_status_html(status_data));
}, },
update: function(status_data) { update: function (status_data) {
var li = $("#status li[id='" + __get_status_html_id(status_data) + "']") var li = $('#status li[id="' + __get_status_html_id(status_data) + '"]');
if (li.length > 0 if (li.length > 0 && status_data.hasOwnProperty('success')) {
&& status_data.hasOwnProperty('success'))
{
// Update color and icon // Update color and icon
li = $(li[0]) li = $(li[0]);
li.html($(__get_status_html(status_data)).children()) li.html($(__get_status_html(status_data)).children());
li.attr('id', '') li.attr('id', '');
// This is a chain to have a fadeOut and correctly // This is a chain to have a fadeOut and correctly
// delete status li from list. // delete status li from list.
// The first timemout fades out the status element. // The first timemout fades out the status element.
setTimeout(function() { setTimeout(function () {
li.children().fadeOut(config.status.delay.fadeOut) li.children().fadeOut(config.status.delay.fadeOut);
// Then resize list. // Then resize list.
setTimeout(function() { setTimeout(function () {
li.animate({width: 'toggle'}) li.animate({
}, config.status.delay.fadeOut) width: 'toggle'
});
}, config.status.delay.fadeOut);
// Finally remove status html // Finally remove status html
// and show idle label if necessary. // and show idle label if necessary.
setTimeout(function() { setTimeout(function () {
li.remove() li.remove();
if ($('#status li').length == 0) if ($('#status li').length === 0);
$('#status .idle').show() $('#status .idle').show();
}, config.status.delay.remove + 2000) // more delay on remove html }, config.status.delay.remove + 2000); // more delay on remove html
}, config.status.delay.remove) }, config.status.delay.remove);
} } else if (!status_data.hasOwnProperty('success')) {
else if (!status_data.hasOwnProperty('success')) { status.append(status_data);
status.append(status_data)
} }
}, },
} };
this.preferences = function() { this.preferences = function () {
if (config.preferences.header) { if (config.preferences.header) {
$("#pageheader").show() $('#pageheader').show();
$(".navbar .home-link").hide() $('.navbar .home-link').hide();
} } else {
else { $('#pageheader').hide();
$("#pageheader").hide() $('.navbar .home-link').show();
$(".navbar .home-link").show()
} }
if (config.preferences.glossy_theme) { if (config.preferences.glossy_theme) {
if ($("head").find("link[href='/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css']").length == 0) if ($('head').find('link[href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css"]').length === 0)
$("head").append('<link rel="stylesheet" href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css">') $('head').append('<link rel="stylesheet" href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css">');
} } else {
else { $('head').find('link[href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css"]').remove();
$("head").find("link[href='/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css']").remove()
}
} }
};
this.set_window_title = function (label) { this.set_window_title = function (label) {
var window_title_separator = ' \u00ab ' var window_title_separator = ' \u00ab ';
if (label) if (label)
window.document.title = label + window_title_separator + config.title window.document.title = label + window_title_separator + config.title;
else else
window.document.title = config.title window.document.title = config.title;
} };
this.start = function (socket) { this.start = function (socket) {
// update distributions // update distributions
socket.on(_e.broadcast.distributions, function(socket_distributions) { socket.on(_e.broadcast.distributions, function (socket_distributions) {
debug_socket("received", _e.broadcast.distributions, socket_distributions) debug_socket('received', _e.broadcast.distributions, socket_distributions);
distributions.set(socket_distributions) distributions.set(socket_distributions);
}); });
socket.on(_e.client.status, function(socket_status) { socket.on(_e.client.status, function (socket_status) {
debug_socket("received", _e.client.status, socket_status) debug_socket('received', _e.client.status, socket_status);
status.set(socket_status) status.set(socket_status);
}) });
socket.on(_e.broadcast.status_update, function(package_status) { socket.on(_e.broadcast.status_update, function (package_status) {
debug_socket("received", _e.broadcast.status_update, package_status) debug_socket('received', _e.broadcast.status_update, package_status);
status.update(package_status) status.update(package_status);
}) });
socket.on(_e.error, function(error) { socket.on(_e.error, function (error) {
console.error("socket > " + error) console.error('socket > ' + error);
}) });
} };
// select current page in navbar // select current page in navbar
if (window.location.pathname != config.paths.distribution) { if (window.location.pathname != config.paths.distribution) {
$(".navbar li a[href='" + window.location.pathname + "']").parent().addClass("active") $('.navbar li a[href="' + window.location.pathname + '"]').parent().addClass('active');
} }
// update html according with preferences // update html according with preferences
this.preferences() this.preferences();
} }
'use strict';
function Preferences() { function Preferences() {
// update config.preferences according with user choices // update config.preferences according with user choices
var load = function () { var load = function () {
for (key in config.preferences) { for (var key in config.preferences) {
if ((value = localStorage.getItem(key))) { var value = localStorage.getItem(key);
debug(2, 'loading preference', key, value) if (value) {
config.preferences[key] = JSON.parse(value) debug(2, 'loading preference', key, value);
} config.preferences[key] = JSON.parse(value);
} }
} }
};
// set prefence // set prefence
var set = function (key, value) { var set = function (key, value) {
if (config.preferences.hasOwnProperty(key)) { if (config.preferences.hasOwnProperty(key)) {
debug(1, 'setting preference', key, value) debug(1, 'setting preference', key, value);
localStorage.setItem(key, value) localStorage.setItem(key, value);
config.preferences[key] = JSON.parse(value) config.preferences[key] = JSON.parse(value);
}
} }
};
// init prefence page // init prefence page
this.initPage = function() { this.initPage = function () {
page_generic.set_window_title("Preferences") page_generic.set_window_title('Preferences');
// set view according with config.preferences // set view according with config.preferences
for (key in config.preferences) { for (var key in config.preferences) {
var element = $("#preferences #" + key) var element = $('#preferences #' + key);
if (element.attr('type') == "checkbox") { if (element.attr('type') == 'checkbox') {
element.prop('checked', config.preferences[key]) element.prop('checked', config.preferences[key]);
} } else {
else { element.val(config.preferences[key]);
element.val(config.preferences[key])
} }
} }
// on input change, set prefence // on input change, set prefence
$("#preferences input, #preferences select").change(function() { $('#preferences input, #preferences select').change(function () {
var key = $(this).attr('id') var key = $(this).attr('id');
var value = $(this).val() var value = $(this).val();
if ($(this).attr('type') == 'checkbox') if ($(this).attr('type') == 'checkbox')
value = $(this).is(':checked') value = $(this).is(':checked');
set(key,value) set(key, value);
// give to user an immediate feedback changing preferences // give to user an immediate feedback changing preferences
page_generic.preferences() page_generic.preferences();
}) });
} };
load() load();
} }
'use strict';
var Utils = { var Utils = {
from_hash_to_view: function (hash) { from_hash_to_view: function (hash) {
if (! hash ) if (!hash)
hash = window.location.hash hash = window.location.hash;
hash = hash.replace('#', '') hash = hash.replace('#', '');
info = hash.split('/'); var info = hash.split('/');
var view = {} var view = {};
view.distribution = {} view.distribution = {};
view.packages = {} view.packages = {};
view.package = {} view.package = {};
view.file = {} view.file = {};
if (info.length >= 1) { if (info.length >= 1) {
view.distribution.name = info[0]; view.distribution.name = info[0];
} }
if (info.length >= 3){ if (info.length >= 3) {
view.package.name = info[1]; view.package.name = info[1];
view.package.version = info[2]; view.package.version = info[2];
view.package.orig_name = view.package.name + '_' + view.package.version view.package.orig_name = view.package.name + '_' + view.package.version;
} }
if (info.length >= 4) { if (info.length >= 4) {
view.file.name = info[3] view.file.name = info[3];
view.file.orig_name = view.package.orig_name + '.' + view.file.name view.file.orig_name = view.package.orig_name + '.' + view.file.name;
} }
return view return view;
}, },
from_view_to_hash: function (view) { from_view_to_hash: function (view) {
hash = "#" var hash = '#';
if (Utils.check_view_distribution(view)) { if (Utils.check_view_distribution(view)) {
hash = hash + view.distribution.name hash = hash + view.distribution.name;
if (Utils.check_view_package(view)) { if (Utils.check_view_package(view)) {
hash = hash + '/' + view.package.name + "/" + view.package.version hash = hash + '/' + view.package.name + '/' + view.package.version;
if (Utils.check_view_file(view)) if (Utils.check_view_file(view))
hash = hash + '/' + view.file.name hash = hash + '/' + view.file.name;
} }
} }
return hash return hash;
}, },
check_view_distribution: function(view) { check_view_distribution: function (view) {
return view && view.distribution && view.distribution.name return view && view.distribution && view.distribution.name;
}, },
check_view_package: function(view) { check_view_package: function (view) {
return Utils.check_view_distribution(view) && view.package && view.package.name && view.package.version && view.package.orig_name return Utils.check_view_distribution(view) && view.package && view.package.name && view.package.version && view.package.orig_name;
}, },
check_view_file: function(view) { check_view_file: function (view) {
return Utils.check_view_package(view) && view.file && view.file.name return Utils.check_view_package(view) && view.file && view.file.name;
}, },
get_status_icon_and_class: function (status_data) { get_status_icon_and_class: function (status_data) {
var _c = config.status.className var _c = config.status.className;
var _i = config.status.icons var _i = config.status.icons;
var _s = status_data var _s = status_data;
var className = null var className = null;
var icon = null var icon = null;
if (_s.hasOwnProperty('success')) { if (_s.hasOwnProperty('success')) {
if (_s.success == true) { if (_s.success === true) {
className = _c.success className = _c.success;
icon = _i.success icon = _i.success;
} } else {
else { className = _c.fail;
className = _c.fail icon = _i.fail;
icon = _i.fail
} }
} } else {
else { className = _c[_s.status];
className = _c[_s.status] icon = _i[_s.status];
icon = _i[_s.status]
} }
// do not change color if update or create and successed // do not change color if update or create and successed
if (_s.success == true && if (_s.success === true &&
_s.status != config.status.build) _s.status != config.status.build) {
{ className = _c[_s.status];
className = _c[_s.status]
} }
return { return {
className: className, className: className,
icon: icon icon: icon
} };
}, },
get_status_icon_html: function (status_data) { get_status_icon_html: function (status_data) {
info = Utils.get_status_icon_and_class(status_data) var info = Utils.get_status_icon_and_class(status_data);
return '<span class="icon glyphicon glyphicon-' + info.icon + '"></span>' return '<span class="icon glyphicon glyphicon-' + info.icon + '"></span>';
}, },
// clone an object via JSON // clone an object via JSON
clone: function (object) { clone: function (object) {
return JSON.parse(JSON.stringify(object)); return JSON.parse(JSON.stringify(object));
} }
} };
...@@ -24,7 +24,11 @@ ...@@ -24,7 +24,11 @@
</nav> </nav>
<div class="others"> <div class="others">
<nav id="sources"> <nav id="sources">
<h4>Sources</h4> <h4>Sources
<a class="btn btn-link" title="Get all sources in one click" onclick="download_all('#sources')">
<span class="glyphicon glyphicon-download-alt"></span>
</a>
</h4>
<ul></ul> <ul></ul>
</nav> </nav>
<nav id="debs"> <nav id="debs">
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment