commit eec5484fcc63c8286f6c91292660d97acc6faabe Author: Gergely Polonkai Date: Tue Sep 13 16:13:04 2016 +0200 Initial commit that can actually fetch some changes diff --git a/start.js b/start.js new file mode 100644 index 0000000..5b65bf5 --- /dev/null +++ b/start.js @@ -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: , +// url_base: , +// username: , +// password: , +// 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();