Initial commit that can actually fetch some changes
This commit is contained in:
commit
eec5484fcc
178
start.js
Normal file
178
start.js
Normal file
@ -0,0 +1,178 @@
|
||||
const Lang = imports.lang;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Secret = imports.gi.Secret;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Soup = imports.gi.Soup;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const GERRITEXT_SETTINGS_SCHEMA = 'org.gnome.shell.extensions.gerrit';
|
||||
|
||||
// TODO: Get this from GSettings
|
||||
let config = {
|
||||
instances: [
|
||||
// {
|
||||
// name: <display name of the instance>,
|
||||
// url_base: <base URL for the instance (ie. the front page>,
|
||||
// username: <username, or null>,
|
||||
// password: <password, or null>,
|
||||
// strict_ssl: false,
|
||||
// List of sections, with a Gerrit query string
|
||||
// rules: [
|
||||
// {
|
||||
// name: 'To be reviewed by me',
|
||||
// query: 'reviewer:self+is:open'
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
// ]
|
||||
};
|
||||
|
||||
const GerritChecker = new Lang.Class({
|
||||
Name: "GerritChecker",
|
||||
|
||||
_init: function(menu_button, instance_config) {
|
||||
menu_button.connect('network-state-changed',
|
||||
Lang.bind(this, this._onNetworkStateChanged));
|
||||
|
||||
this._config = instance_config;
|
||||
this._connected = false;
|
||||
|
||||
this._httpSession = new Soup.Session();
|
||||
this._httpSession.ssl_strict = this._config.strict_ssl;
|
||||
|
||||
if (this._config.username) {
|
||||
this._httpSession.add_feature_by_type = Soup.AuthDomainBasic;
|
||||
this._httpSession.connect(
|
||||
'authenticate',
|
||||
Lang.bind(this, function(session, message, auth, retrying) {
|
||||
log('Authenticating ' + this._config.name);
|
||||
auth.authenticate(this._config.username,
|
||||
this._config.password);
|
||||
}));
|
||||
}
|
||||
|
||||
GLib.timeout_add(null, 5000, Lang.bind(this, function() {
|
||||
if (this._connected) {
|
||||
this._update();
|
||||
}
|
||||
|
||||
return true;
|
||||
}));
|
||||
},
|
||||
|
||||
_onNetworkStateChanged: function(proxy, connected) {
|
||||
this._connected = connected;
|
||||
},
|
||||
|
||||
_update: function() {
|
||||
log("Updating " + this._config.name);
|
||||
|
||||
let url = this._config.url_base + 'a/changes/?q=reviewer:self+is:open';
|
||||
let uri = new Soup.URI(url);
|
||||
let message = Soup.Message.new_from_uri('GET', uri);
|
||||
log('Fetching: ' + uri.to_string(null));
|
||||
|
||||
this._httpSession.queue_message(
|
||||
message,
|
||||
Lang.bind(this, function(session, msg) {
|
||||
if (message.status_code >= 200 &&
|
||||
message.status_code < 300) {
|
||||
let json_data = JSON.parse(
|
||||
message.response_body.data.slice(5));
|
||||
json_data.forEach(function(change) {
|
||||
log(change.change_id);
|
||||
log(change.status);
|
||||
log(change.subject);
|
||||
});
|
||||
loop.quit();
|
||||
} else {
|
||||
log('Failed to fetch '
|
||||
+ message.uri.to_string(null)
|
||||
+ ' ('
|
||||
+ message.status_code
|
||||
+ ': '
|
||||
+ message.reason_phrase
|
||||
+ ')');
|
||||
}
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
const GerritMenuButton = new GObject.Class({
|
||||
Name: "GerritMenuButton",
|
||||
GTypeName: 'GerritMenuButton',
|
||||
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
log('Initializing');
|
||||
this._connected = false;
|
||||
this._network_monitor = Gio.network_monitor_get_default();
|
||||
this._network_monitor_connection = this._network_monitor.connect(
|
||||
'network-changed',
|
||||
Lang.bind(this, this._onNetworkStateChanged));
|
||||
|
||||
// Let’s check connectivity
|
||||
this._checkConnectionState();
|
||||
|
||||
this._instances = [];
|
||||
|
||||
let i;
|
||||
for (i in config.instances) {
|
||||
this._instances.push(new GerritChecker(this, config.instances[i]));
|
||||
}
|
||||
|
||||
this._password_schema = Secret.Schema.new(
|
||||
'eu.polonkai.gergely.gnome-shell-gerrit-extension.Store',
|
||||
Secret.SchemaFlags.NONE,
|
||||
{
|
||||
"username": Secret.SchemaAttributeType.STRING,
|
||||
});
|
||||
},
|
||||
|
||||
_onNetworkStateChanged: function() {
|
||||
log('Network change');
|
||||
this._checkConnectionState();
|
||||
},
|
||||
|
||||
_checkConnectionState: function() {
|
||||
// TODO: Get this from the config
|
||||
let url = 'https://www.gerritcodereview.com/';
|
||||
// TODO: Port number from schema!
|
||||
let port = 443;
|
||||
let address = Gio.NetworkAddress.parse_uri(url, port);
|
||||
let cancellable = Gio.Cancellable.new();
|
||||
|
||||
this._oldConnected = this._connected;
|
||||
this._connected = false;
|
||||
|
||||
log('Checking for connection');
|
||||
|
||||
try {
|
||||
this._network_monitor.can_reach_async(
|
||||
address, cancellable,
|
||||
Lang.bind(this, this._asyncReadyCallback));
|
||||
log('Checking');
|
||||
} catch (err) {
|
||||
let title = _("Can not connect to %s").format(url);
|
||||
log(title + '\n' + err.message); // TODO: Remove this!
|
||||
}
|
||||
},
|
||||
|
||||
_asyncReadyCallback: function(nm, res) {
|
||||
this._connected = this._network_monitor.can_reach_finish(res);
|
||||
|
||||
log('Connection check finished: '
|
||||
+ this._oldConnected
|
||||
+ ' => '
|
||||
+ this._connected);
|
||||
|
||||
this.emit('network-state-changed', this._connected);
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(GerritMenuButton.prototype);
|
||||
|
||||
let e = new GerritMenuButton();
|
||||
let loop = GLib.MainLoop.new(null, false);
|
||||
loop.run();
|
Loading…
Reference in New Issue
Block a user