Allow choosing merge diff parent

This commit is contained in:
Jesse van den Kieboom 2014-12-16 08:23:30 +01:00
parent b481e4f428
commit e5f467cbd3
6 changed files with 87 additions and 26 deletions

View File

@ -107,7 +107,7 @@ class CommitActionCreatePatch : GitgExt.UIElement, GitgExt.Action, GitgExt.Commi
opts.n_context_lines = nc;
opts.n_interhunk_lines = nc;
return commit.get_diff(opts);
return commit.get_diff(opts, 0);
}
private void create_patch(File file) throws Error

View File

@ -111,7 +111,7 @@ public class Commit : Ggit.Commit
}
}
public Ggit.Diff get_diff(Ggit.DiffOptions? options)
public Ggit.Diff get_diff(Ggit.DiffOptions? options, int parent)
{
Ggit.Diff? diff = null;
@ -121,9 +121,9 @@ public class Commit : Ggit.Commit
{
var parents = get_parents();
// Create a new diff from the parents to the commit tree
if (parents.size == 0)
{
// No parents, initial commit?
diff = new Ggit.Diff.tree_to_tree(repo,
null,
get_tree(),
@ -131,27 +131,15 @@ public class Commit : Ggit.Commit
}
else
{
for (var i = 0; i < parents.size; ++i)
if (parent >= parents.size)
{
var parent = parents[i];
if (i == 0)
{
diff = new Ggit.Diff.tree_to_tree(repo,
parent.get_tree(),
get_tree(),
options);
}
else
{
var d = new Ggit.Diff.tree_to_tree(repo,
parent.get_tree(),
get_tree(),
options);
diff.merge(d);
}
parent = (int)parents.size - 1;
}
diff = new Ggit.Diff.tree_to_tree(repo,
parents[parent].get_tree(),
get_tree(),
options);
}
}
catch (Error e)

View File

@ -42,6 +42,9 @@ namespace Gitg
case "load-parent":
d_view.load_parent(parameter("value"));
break;
case "select-parent":
d_view.select_parent(parameter("value"));
break;
}
return false;
@ -58,6 +61,7 @@ namespace Gitg
private Settings? d_fontsettings;
private bool d_has_selection;
private Ggit.DiffOptions? d_options;
private string? d_parent;
private static Gee.HashMap<string, DiffView> s_diff_map;
private static uint64 s_diff_id;
@ -103,6 +107,7 @@ namespace Gitg
{
d_diff = value;
d_commit = null;
d_parent = null;
update();
}
@ -113,8 +118,12 @@ namespace Gitg
get { return d_commit; }
set
{
d_commit = value;
d_diff = null;
if (d_commit != value)
{
d_commit = value;
d_diff = null;
d_parent = null;
}
update();
}
@ -230,6 +239,7 @@ namespace Gitg
o.set_boolean_member("debug", Environment.get_variable("GITG_GTK_DIFF_VIEW_DEBUG") != null);
o.set_boolean_member("changes_inline", changes_inline);
o.set_boolean_member("show_parents", show_parents);
o.set_string_member("parent", d_parent);
var strings = new Json.Object();
@ -238,6 +248,7 @@ namespace Gitg
strings.set_string_member("loading_diff", _("Loading diff…"));
strings.set_string_member("notes", _("Notes:"));
strings.set_string_member("parents", _("Parents:"));
strings.set_string_member("diff_against", _("Diff against:"));
o.set_object_member("strings", strings);
@ -512,7 +523,24 @@ namespace Gitg
if (d_commit != null)
{
d_diff = d_commit.get_diff(options);
int parent = 0;
var parents = d_commit.get_parents();
if (d_parent != null)
{
for (var i = 0; i < parents.size; i++)
{
var id = parents.get_id(i);
if (id.to_string() == d_parent)
{
parent = i;
break;
}
}
}
d_diff = d_commit.get_diff(options, parent);
}
if (d_diff != null)
@ -540,6 +568,12 @@ namespace Gitg
request_select_commit(id);
}
public void select_parent(string id)
{
d_parent = id;
update();
}
private PatchSet parse_patchset(Json.Node node)
{
PatchSet ret = new PatchSet();

View File

@ -244,6 +244,15 @@ div.commit .note_message {
margin-bottom: 5px;
}
div.commit .parent-chooser {
float: right;
}
div.commit .parent-chooser select {
margin-left: 6px;
padding: 1px;
}
a {
color: #3465a4;
}

View File

@ -35,6 +35,8 @@
<div id="diff">
<div id="diff_header">
<div class="commit">
<div class="parent-chooser" data-id="parent_chooser">
</div>
<img class="avatar" data-id="avatar" src="gitg-diff:/icon/avatar-default-symbolic?size=50"/>
<p>
<span class="author" data-id="author"></span><br/>

View File

@ -27,7 +27,8 @@ var settings = {
unstage: 'unstage',
loading_diff: 'Loading diff...',
notes: 'Notes:',
parents: 'Parents:'
parents: 'Parents:',
diff_against: 'Diff against:'
},
};
@ -165,6 +166,33 @@ function write_commit(content, commit)
elems.notes_container.hide();
}
if (commit.parents.length > 1)
{
var span = $('<span/>').text(settings.strings.diff_against);
var chooser = $('<select/>');
for (var i = 0; i < commit.parents.length; i++)
{
var parent = commit.parents[i];
var elem = $('<option/>', {
value: parent.id
}).text(parent.id.slice(0, 6));
if (parent.id === settings.parent)
{
elem.attr('selected', 'selected');
}
chooser.append(elem);
}
chooser.on('change', function() {
xhr_get('internal', {'action': 'select-parent', 'value': chooser.val()});
});
elems.parent_chooser.html([span, chooser]);
}
if (commit.parents.length > 1 && settings.show_parents)
{
var d = $('<div/>');