/*
* This file is part of gitg
*
* Copyright (C) 2014 - Jesse van den Kieboom
*
* gitg is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* gitg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with gitg. If not, see .
*/
namespace Gitg
{
class RefActionFetch : GitgExt.UIElement, GitgExt.Action, GitgExt.RefAction, Object
{
// Do this to pull in config.h before glib.h (for gettext...)
private const string version = Gitg.Config.VERSION;
public GitgExt.Application? application { owned get; construct set; }
public GitgExt.RefActionInterface action_interface { get; construct set; }
public Gitg.Ref reference { get; construct set; }
private Gitg.Ref? d_remote_ref;
private Gitg.Remote? d_remote;
public RefActionFetch(GitgExt.Application application,
GitgExt.RefActionInterface action_interface,
Gitg.Ref reference)
{
Object(application: application,
action_interface: action_interface,
reference: reference);
var branch = reference as Ggit.Branch;
if (branch != null)
{
try
{
d_remote_ref = branch.get_upstream() as Gitg.Ref;
} catch {}
}
else if (reference.parsed_name.remote_name != null)
{
d_remote_ref = reference;
}
if (d_remote_ref != null)
{
d_remote = application.remote_lookup.lookup(d_remote_ref.parsed_name.remote_name);
}
}
public string id
{
owned get { return "/org/gnome/gitg/ref-actions/fetch"; }
}
public string display_name
{
owned get
{
if (d_remote != null)
{
return _("Fetch from %s").printf(d_remote_ref.parsed_name.remote_name);
}
else
{
return "";
}
}
}
public string description
{
owned get { return _("Fetch remote objects from %s").printf(d_remote_ref.parsed_name.remote_name); }
}
public bool available
{
get { return d_remote != null; }
}
public async bool fetch()
{
var notification = new RemoteNotification(d_remote);
application.notifications.add(notification);
notification.text = _("Fetching from %s").printf(d_remote.get_url());
var updates = new Gee.ArrayList();
var tip_updated_id = d_remote.tip_updated.connect((d_remote, name, a, b) => {
if (a.is_zero())
{
/* Translators: new refers to a new remote reference having been fetched, */
updates.add(@"$name (%s)".printf(_("new")));
}
else
{
/* Translators: updated refers to a remote reference having been updated, */
updates.add(@"$name (%s)".printf(_("updated")));
}
});
try
{
yield d_remote.fetch(null, null);
}
catch (Error e)
{
notification.error(_("Failed to fetch from %s: %s").printf(d_remote.get_url(), e.message));
stderr.printf("Failed to fetch: %s\n", e.message);
return false;
}
finally
{
((Object)d_remote).disconnect(tip_updated_id);
}
if (updates.size == 0)
{
/* Translators: the %s will get replaced with the remote url, */
notification.success(_("Fetched from %s: everything is up to date").printf(d_remote.get_url()));
}
else
{
/* Translators: the first %s is the remote url to fetch from,
* the second is a list of references that got updated. */
notification.success(_("Fetched from %s: %s").printf(d_remote.get_url(), string.joinv(", ", updates.to_array())));
}
return true;
}
public void activate()
{
fetch.begin((obj, res) => {
fetch.end(res);
});
}
}
}
// ex:set ts=4 noet