using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor.Collaboration;
|
|
using UnityEngine;
|
|
|
|
#if UNITY_2019_1_OR_NEWER
|
|
using UnityEngine.UIElements;
|
|
#else
|
|
using UnityEngine.Experimental.UIElements;
|
|
using UnityEngine.Experimental.UIElements.StyleEnums;
|
|
#endif
|
|
|
|
|
|
namespace UnityEditor.Collaboration
|
|
{
|
|
internal class CollabHistoryItemFactory : ICollabHistoryItemFactory
|
|
{
|
|
const int k_MaxChangesPerRevision = 10;
|
|
|
|
public IEnumerable<RevisionData> GenerateElements(IEnumerable<Revision> revisions, int totalRevisions, int startIndex, string tipRev, string inProgressRevision, bool revisionActionsEnabled, bool buildServiceEnabled, string currentUser)
|
|
{
|
|
int index = startIndex;
|
|
|
|
foreach (var rev in revisions)
|
|
{
|
|
index++;
|
|
var current = rev.revisionID == tipRev;
|
|
|
|
// Calculate build status
|
|
BuildState buildState = BuildState.None;
|
|
int buildFailures = 0;
|
|
if (rev.buildStatuses != null && rev.buildStatuses.Length > 0)
|
|
{
|
|
bool inProgress = false;
|
|
foreach (CloudBuildStatus buildStatus in rev.buildStatuses)
|
|
{
|
|
if (buildStatus.complete)
|
|
{
|
|
if (!buildStatus.success)
|
|
{
|
|
buildFailures++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
inProgress = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (inProgress)
|
|
{
|
|
buildState = BuildState.InProgress;
|
|
}
|
|
else if (buildFailures > 0)
|
|
{
|
|
buildState = BuildState.Failed;
|
|
}
|
|
else
|
|
{
|
|
buildState = BuildState.Success;
|
|
}
|
|
}
|
|
else if (current && !buildServiceEnabled)
|
|
{
|
|
buildState = BuildState.Configure;
|
|
}
|
|
|
|
// Calculate the number of changes performed on files and folders (not meta files)
|
|
var paths = new Dictionary<string, ChangeData>();
|
|
foreach (ChangeAction change in rev.entries)
|
|
{
|
|
if (change.path.EndsWith(".meta"))
|
|
{
|
|
var path = change.path.Substring(0, change.path.Length - 5);
|
|
// Actions taken on meta files are secondary to any actions taken on the main file
|
|
if (!paths.ContainsKey(path))
|
|
paths[path] = new ChangeData() {path = path, action = change.action};
|
|
}
|
|
else
|
|
{
|
|
paths[change.path] = new ChangeData() {path = change.path, action = change.action};
|
|
}
|
|
}
|
|
|
|
var displayName = (rev.author != currentUser) ? rev.authorName : "You";
|
|
|
|
var item = new RevisionData
|
|
{
|
|
id = rev.revisionID,
|
|
index = totalRevisions - index + 1,
|
|
timeStamp = TimeStampToDateTime(rev.timeStamp),
|
|
authorName = displayName,
|
|
comment = rev.comment,
|
|
|
|
obtained = rev.isObtained,
|
|
current = current,
|
|
inProgress = (rev.revisionID == inProgressRevision),
|
|
enabled = revisionActionsEnabled,
|
|
|
|
buildState = buildState,
|
|
buildFailures = buildFailures,
|
|
|
|
changes = paths.Values.Take(k_MaxChangesPerRevision).ToList(),
|
|
changesTotal = paths.Values.Count,
|
|
changesTruncated = paths.Values.Count > k_MaxChangesPerRevision,
|
|
};
|
|
|
|
yield return item;
|
|
}
|
|
}
|
|
|
|
private static DateTime TimeStampToDateTime(double timeStamp)
|
|
{
|
|
DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
|
|
dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime();
|
|
return dateTime;
|
|
}
|
|
}
|
|
}
|