Skip to content

Commit

Permalink
[preview] Update/azure dev ops api 19 (#1979)
Browse files Browse the repository at this point in the history
Full update to the latest v19 version of the Azure DevOps API files as
well as fix test implementation for revisions.
  • Loading branch information
MrHinsh authored Mar 13, 2024
1 parent 0b37825 commit 433f23a
Show file tree
Hide file tree
Showing 10 changed files with 72 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="16.205.1" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="19.225.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.2.2" />
<PackageReference Include="MSTest.TestFramework" Version="3.2.2" />
<PackageReference Include="coverlet.collector" Version="6.0.1">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MigrationTools.DataContracts;
Expand Down Expand Up @@ -31,18 +32,16 @@ private static TfsRevisionManagerOptions GetTfsRevisionManagerOptions()
return migrationConfig;
}

private static WorkItemData GetWorkItemWithRevisions(DateTime currentDateTime, int startHours = 1, int endHours = 1, bool dateIncreasing = true)
private static List<RevisionItem> GetWorkItemWithRevisions(DateTime currentDateTime, int startHours = 1, int endHours = 1, bool dateIncreasing = true)
{
var fakeWorkItem = new WorkItemData();
fakeWorkItem.Id = Guid.NewGuid().ToString();
fakeWorkItem.Revisions = new System.Collections.Generic.SortedDictionary<int, RevisionItem>();
var revisions = new System.Collections.Generic.SortedDictionary<int, RevisionItem>();
for (int i = startHours; i < endHours + startHours; i++)
{
DateTime dateTime = dateIncreasing ? currentDateTime.AddHours(-i) : currentDateTime;
fakeWorkItem.Revisions.Add(i, new RevisionItem() { Index = i, Number = i, ChangedDate = dateTime, OriginalChangedDate = dateTime });
DateTime dateTime = dateIncreasing ? currentDateTime.AddHours(i) : currentDateTime;
revisions.Add(i, new RevisionItem() { Index = i, Number = i, ChangedDate = dateTime, OriginalChangedDate = dateTime });
}

return fakeWorkItem;
return revisions.Values.ToList();
}


Expand All @@ -54,8 +53,8 @@ public void TfsRevisionManagerInSync1()
processorEnricher.Configure(peOptions);

var currentDateTime = System.DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 1);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 1, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 1);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -71,12 +70,12 @@ public void TfsRevisionManagerInSync10()
processorEnricher.Configure(peOptions);

var currentDateTime = System.DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 10);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 1, 10);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 10);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 10);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Assert.AreEqual(revs.Count, 0);
Assert.AreEqual(0, revs.Count);

}

Expand All @@ -88,8 +87,8 @@ public void TfsRevisionManagerSync1()
processorEnricher.Configure(peOptions);

var currentDateTime = System.DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 2, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -104,8 +103,8 @@ public void TfsRevisionManagerSync10()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 11);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 11, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 11);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -120,9 +119,9 @@ public void TfsRevisionManagerReplayRevisionsOff()
var processorEnricher = Services.GetRequiredService<TfsRevisionManager>();
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 4);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 4, 1);
var currentDateTime = DateTime.Now.AddDays(-100);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 4);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -139,12 +138,12 @@ public void TfsRevisionManagerMaxRevision51()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 2, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 2);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 2, 2);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Assert.AreEqual(1, revs.Count);
Assert.AreEqual(0, revs.Count);
}

[TestMethod(), TestCategory("L0"), TestCategory("AzureDevOps.ObjectModel")]
Expand All @@ -156,8 +155,8 @@ public void TfsRevisionManagerMaxRevision56()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 7);
WorkItemData target = GetWorkItemWithRevisions(currentDateTime, 7, 1);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 7);
List<RevisionItem> target = GetWorkItemWithRevisions(currentDateTime, 1, 1);

var revs = processorEnricher.GetRevisionsToMigrate(source, target);

Expand All @@ -173,7 +172,7 @@ public void TfsRevisionManagerMaxRevision59()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime, 1, 10);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 10);

var revs = processorEnricher.GetRevisionsToMigrate(source, null);

Expand All @@ -188,7 +187,7 @@ public void TfsRevisionManagerDatesMustBeIncreasing()
processorEnricher.Configure(peOptions);

var currentDateTime = DateTime.Now;
WorkItemData source = GetWorkItemWithRevisions(currentDateTime.AddHours(-1000), 1, 10, false);
List<RevisionItem> source = GetWorkItemWithRevisions(currentDateTime, 1, 10, false);

var revs = processorEnricher.GetRevisionsToMigrate(source, null);
Assert.AreEqual(true, CheckDateIncreasing(revs));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@

<ItemGroup>
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
<PackageReference Include="Microsoft.TeamFoundation.DistributedTask.WebApi" Version="16.205.1" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="16.205.1" />
<PackageReference Include="Microsoft.TeamFoundation.DistributedTask.Common.Contracts" Version="19.225.1" />
<PackageReference Include="Microsoft.TeamFoundation.DistributedTask.WebApi" Version="19.225.1" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="19.225.1" />
<PackageReference Include="TfsUrlParser" Version="1.4.1" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,34 +74,32 @@ protected override void RefreshForProcessorType(IProcessor processor)
}
}

public List<RevisionItem> GetRevisionsToMigrate(WorkItemData sourceWorkItem, WorkItemData targetWorkItem)
public List<RevisionItem> GetRevisionsToMigrate(List<RevisionItem> sourceRevisions, List<RevisionItem> targetRevisions)
{
// Revisions have been sorted already on object creation. Values of the Dictionary are sorted by RevisionItem.Number
var sortedRevisions = sourceWorkItem.Revisions.Values.ToList();
EnforceDatesMustBeIncreasing(sourceRevisions);

EnforceDatesMustBeIncreasing(sortedRevisions);
LogDebugCurrentSortedRevisions(sourceRevisions, "Source");
LogDebugCurrentSortedRevisions(targetRevisions, "Target");
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: Raw {sourceWorkItem} Has {sortedRevisions} revisions", "Source", sourceRevisions.Count);

LogDebugCurrentSortedRevisions(sourceWorkItem, sortedRevisions);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: Raw Source {sourceWorkItem} Has {sortedRevisions} revisions", sourceWorkItem.Id, sortedRevisions.Count);
sourceRevisions = RemoveRevisionsAlreadyOnTarget(targetRevisions, sourceRevisions);

sortedRevisions = RemoveRevisionsAlreadyOnTarget(targetWorkItem, sortedRevisions);
RemoveRevisionsAllExceptLatest(sourceRevisions);

RemoveRevisionsAllExceptLatest(sortedRevisions);
RemoveRevisionsMoreThanMaxRevisions(sourceRevisions);

RemoveRevisionsMoreThanMaxRevisions(sortedRevisions);
LogDebugCurrentSortedRevisions(sourceRevisions);

LogDebugCurrentSortedRevisions(sourceWorkItem, sortedRevisions);

return sortedRevisions;
return sourceRevisions;
}

private void EnforceDatesMustBeIncreasing(List<RevisionItem> sortedRevisions)
public void EnforceDatesMustBeIncreasing(List<RevisionItem> sortedRevisions)
{
Log.LogDebug("TfsRevisionManager::EnforceDatesMustBeIncreasing");
DateTime lastDateTime = DateTime.MinValue;
foreach (var revision in sortedRevisions)
{
if (revision.OriginalChangedDate == lastDateTime || revision.OriginalChangedDate < lastDateTime)
if (revision.ChangedDate == lastDateTime || revision.OriginalChangedDate < lastDateTime)
{
revision.ChangedDate = lastDateTime.AddSeconds(1);
Log.LogDebug("TfsRevisionManager::EnforceDatesMustBeIncreasing[{revision}]::Fix", revision.Number);
Expand All @@ -110,15 +108,20 @@ private void EnforceDatesMustBeIncreasing(List<RevisionItem> sortedRevisions)
}
}

private void LogDebugCurrentSortedRevisions(WorkItemData sourceWorkItem, List<RevisionItem> sortedRevisions)
public void LogDebugCurrentSortedRevisions(List<RevisionItem> sortedRevisions, string designation = "Source")
{
Log.LogInformation("Found {RevisionsCount} revisions to migrate on Work item:{sourceWorkItemId}", sortedRevisions.Count, sourceWorkItem.Id);
Log.LogDebug("RevisionsToMigrate:----------------------------------------------------");
if (sortedRevisions == null)
{
Log.LogDebug("{designation}: RevisionsToMigrate: No revisions to migrate", designation);
return;
}
Log.LogInformation("{designation}: Found {RevisionsCount} revisions to migrate on Work item:{sourceWorkItemId}", designation, sortedRevisions.Count, designation);
Log.LogDebug("{designation}: RevisionsToMigrate:----------------------------------------------------", designation);
foreach (RevisionItem item in sortedRevisions)
{
Log.LogDebug("RevisionsToMigrate: Index:{Index} - Number:{Number} - ChangedDate:{ChangedDate}", item.Index, item.Number, item.ChangedDate);
}
Log.LogDebug("RevisionsToMigrate:----------------------------------------------------");
Log.LogDebug("{designation}: RevisionsToMigrate:----------------------------------------------------", designation);
}

private void RemoveRevisionsMoreThanMaxRevisions(List<RevisionItem> sortedRevisions)
Expand All @@ -130,7 +133,7 @@ private void RemoveRevisionsMoreThanMaxRevisions(List<RevisionItem> sortedRevisi
{
var revisionsToRemove = sortedRevisions.Count - Options.MaxRevisions;
sortedRevisions.RemoveRange(0, revisionsToRemove);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: MaxRevisions={MaxRevisions}! There are {sortedRevisionsCount} left", Options.MaxRevisions, sortedRevisions.Count);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsMoreThanMaxRevisions MaxRevisions={MaxRevisions}! There are {sortedRevisionsCount} left", Options.MaxRevisions, sortedRevisions.Count);
}
}

Expand All @@ -140,29 +143,32 @@ private void RemoveRevisionsAllExceptLatest(List<RevisionItem> sortedRevisions)
{
// Remove all but the latest revision if we are not replaying revisions
sortedRevisions.RemoveRange(0, sortedRevisions.Count - 1);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: ReplayRevisions=false! There are {sortedRevisionsCount} left", sortedRevisions.Count);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAllExceptLatest ReplayRevisions=false! There are {sortedRevisionsCount} left", sortedRevisions.Count);
}
}

private List<RevisionItem> RemoveRevisionsAlreadyOnTarget(WorkItemData targetWorkItem, List<RevisionItem> sortedRevisions)
private List<RevisionItem> RemoveRevisionsAlreadyOnTarget(List<RevisionItem> targetRevisions, List<RevisionItem> sourceRevisions)
{
if (targetWorkItem != null)
if (targetRevisions != null)
{
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: Raw Target {targetWorkItemId} Has {targetWorkItemRevCount} revisions", targetWorkItem.Id, targetWorkItem.Revisions.Count);
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget Raw Target Has {targetWorkItemRevCount} revisions", targetRevisions.Count);
// Target exists so remove any Changed Date matches between them
var targetChangedDates = (from RevisionItem x in targetWorkItem.Revisions.Values select x.ChangedDate).ToList();
var targetChangedDates = (from RevisionItem x in targetRevisions select x.ChangedDate).ToList();
if (Options.ReplayRevisions)
{
sortedRevisions = sortedRevisions.Where(x => !targetChangedDates.Contains(x.ChangedDate)).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: After removing Date Matches there are {sortedRevisionsCount} left", sortedRevisions.Count);
sourceRevisions = sourceRevisions.Where(x => !targetChangedDates.Contains(x.ChangedDate)).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget After removing Date Matches there are {sortedRevisionsCount} left", sourceRevisions.Count);
}
// Find Max target date and remove all source revisions that are newer
var targetLatestDate = targetChangedDates.Max();
sortedRevisions = sortedRevisions.Where(x => x.ChangedDate > targetLatestDate).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate: After removing revisions before target latest date {targetLatestDate} there are {sortedRevisionsCount} left", targetLatestDate, sortedRevisions.Count);
sourceRevisions = sourceRevisions.Where(x => x.ChangedDate > targetLatestDate).ToList();
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget After removing revisions before target latest date {targetLatestDate} there are {sortedRevisionsCount} left", targetLatestDate, sourceRevisions.Count);
}

return sortedRevisions;
else
{
Log.LogDebug("TfsRevisionManager::GetRevisionsToMigrate::RemoveRevisionsAlreadyOnTarget Target is null");
}
return sourceRevisions;
}

public void AttachSourceRevisionHistoryJsonToTarget(WorkItemData sourceWorkItem, WorkItemData targetWorkItem)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="16.205.1" />
<PackageReference Include="Microsoft.TeamFoundationServer.Client" Version="19.225.1" />
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="6.0.0" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="16.205.1" />
<PackageReference Include="Microsoft.TeamFoundationServer.ExtendedClient" Version="19.225.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.2.2" />
<PackageReference Include="MSTest.TestFramework" Version="3.2.2" />
<PackageReference Include="coverlet.collector" Version="6.0.1">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.22.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.Debug" Version="2.0.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.InMemory" Version="0.11.0" />
Expand Down
4 changes: 2 additions & 2 deletions src/MigrationTools/MigrationTools.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.IdentityModel.Clients.ActiveDirectory" Version="5.3.0" />
<PackageReference Include="Microsoft.VisualStudio.Services.Client" Version="16.205.1" />
<PackageReference Include="Microsoft.VisualStudio.Services.ServiceEndpoints.WebApi" Version="16.205.1" />
<PackageReference Include="Microsoft.VisualStudio.Services.Client" Version="19.225.1" />
<PackageReference Include="Microsoft.VisualStudio.Services.ServiceEndpoints.WebApi" Version="19.225.1" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="System.Security.Principal.Windows" Version="5.0.0" />
</ItemGroup>
Expand Down
Loading

0 comments on commit 433f23a

Please sign in to comment.