public IList<IGitRef> GetTreeRefs(string tree)
{
var itemsStrings = tree.Split('\n');
var gitRefs = new List<IGitRef>();
var defaultHeads = new Dictionary<string, GitRef>(); // remote -> HEAD
var remotes = GetRemotes(false);
foreach (var itemsString in itemsStrings)
{
if (itemsString == null || itemsString.Length <= 42 || itemsString.StartsWith("error: "))
continue;
var completeName = itemsString.Substring(41).Trim();
var guid = itemsString.Substring(0, 40);
var remoteName = GitCommandHelpers.GetRemoteName(completeName, remotes);
var head = new GitRef(this, guid, completeName, remoteName);
if (DefaultHeadPattern.IsMatch(completeName))
defaultHeads[remoteName] = head;
else
gitRefs.Add(head);
}
// do not show default head if remote has a branch on the same commit
GitRef defaultHead;
foreach (var gitRef in gitRefs.Where(head => defaultHeads.TryGetValue(head.Remote, out defaultHead) && head.Guid == defaultHead.Guid))
{
defaultHeads.Remove(gitRef.Remote);
}
gitRefs.AddRange(defaultHeads.Values);
return gitRefs;
}