Skip to content

Commit 80f93c2

Browse files
authored
Added option to drop changesets during the migration (#2607)
- Added option - Added code to drop changesets during the migration +semver: minor
2 parents e1fad0c + 2dbeeca commit 80f93c2

File tree

2 files changed

+87
-75
lines changed

2 files changed

+87
-75
lines changed

src/MigrationTools.Clients.TfsObjectModel/Tools/TfsGitRepositoryTool.cs

Lines changed: 82 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -99,101 +99,108 @@ public int Enrich(TfsProcessor processor, WorkItemData sourceWorkItem, WorkItem
9999
if (l is ExternalLink && gitWits.Contains(l.ArtifactLinkType.Name))
100100
{
101101
ExternalLink el = (ExternalLink)l;
102-
103-
TfsGitRepositoryInfo sourceRepoInfo = TfsGitRepositoryInfo.Create(el, sourceRepos, changeSetMappings, sourceWorkItem?.ProjectName);
104-
105-
// if sourceRepo is null ignore this link and keep processing further links
106-
if (sourceRepoInfo == null)
102+
if (Options.ShouldDropChangedSetLinks)
107103
{
108-
continue;
104+
Log.LogDebug("Dropping changeset {Id}", el.LinkedArtifactUri);
105+
removeEL.Add(el);
109106
}
110-
111-
// if repo was not found in source project, try to find it by repoId in the whole project collection
112-
if (sourceRepoInfo.GitRepo == null)
107+
else
113108
{
114-
var anyProjectSourceRepoInfo = TfsGitRepositoryInfo.Create(el, allSourceRepos, changeSetMappings, sourceWorkItem?.ProjectName);
115-
// if repo is found in a different project and the repo Name is listed in repo mappings, use it
116-
if (anyProjectSourceRepoInfo.GitRepo != null && Options.Mappings.ContainsKey(anyProjectSourceRepoInfo.GitRepo.Name))
117-
{
118-
sourceRepoInfo = anyProjectSourceRepoInfo;
119-
}
120-
else
109+
TfsGitRepositoryInfo sourceRepoInfo = TfsGitRepositoryInfo.Create(el, sourceRepos, changeSetMappings, sourceWorkItem?.ProjectName);
110+
111+
// if sourceRepo is null ignore this link and keep processing further links
112+
if (sourceRepoInfo == null)
121113
{
122-
Log.LogWarning("GitRepositoryEnricher: Could not find source git repo - repo referenced: {SourceRepoName}/{TargetRepoName}", anyProjectSourceRepoInfo?.GitRepo?.ProjectReference?.Name, anyProjectSourceRepoInfo?.GitRepo?.Name);
114+
continue;
123115
}
124-
}
125116

126-
if (sourceRepoInfo.GitRepo != null)
127-
{
128-
string targetRepoName = GetTargetRepoName(Options.Mappings, sourceRepoInfo);
129-
string sourceProjectName = sourceRepoInfo?.GitRepo?.ProjectReference?.Name ?? _processor.Target.Options.Project;
130-
string targetProjectName = _processor.Target.Options.Project;
131-
132-
TfsGitRepositoryInfo targetRepoInfo = TfsGitRepositoryInfo.Create(targetRepoName, sourceRepoInfo, targetRepos);
133-
// if repo was not found in the target project, try to find it in the whole target project collection
134-
if (targetRepoInfo.GitRepo == null)
117+
// if repo was not found in source project, try to find it by repoId in the whole project collection
118+
if (sourceRepoInfo.GitRepo == null)
135119
{
136-
if (Options.Mappings.Values.Contains(targetRepoName))
120+
var anyProjectSourceRepoInfo = TfsGitRepositoryInfo.Create(el, allSourceRepos, changeSetMappings, sourceWorkItem?.ProjectName);
121+
// if repo is found in a different project and the repo Name is listed in repo mappings, use it
122+
if (anyProjectSourceRepoInfo.GitRepo != null && Options.Mappings.ContainsKey(anyProjectSourceRepoInfo.GitRepo.Name))
137123
{
138-
var anyTargetRepoInCollectionInfo = TfsGitRepositoryInfo.Create(targetRepoName, sourceRepoInfo, allTargetRepos);
139-
if (anyTargetRepoInCollectionInfo.GitRepo != null)
140-
{
141-
targetRepoInfo = anyTargetRepoInCollectionInfo;
142-
}
124+
sourceRepoInfo = anyProjectSourceRepoInfo;
125+
}
126+
else
127+
{
128+
Log.LogWarning("GitRepositoryEnricher: Could not find source git repo - repo referenced: {SourceRepoName}/{TargetRepoName}", anyProjectSourceRepoInfo?.GitRepo?.ProjectReference?.Name, anyProjectSourceRepoInfo?.GitRepo?.Name);
143129
}
144130
}
145131

146-
// Fix commit links if target repo has been found
147-
if (targetRepoInfo.GitRepo != null)
132+
if (sourceRepoInfo.GitRepo != null)
148133
{
149-
Log.LogDebug("GitRepositoryEnricher: Fixing {SourceRepoUrl} to {TargetRepoUrl}?", sourceRepoInfo.GitRepo.RemoteUrl, targetRepoInfo.GitRepo.RemoteUrl);
134+
string targetRepoName = GetTargetRepoName(Options.Mappings, sourceRepoInfo);
135+
string sourceProjectName = sourceRepoInfo?.GitRepo?.ProjectReference?.Name ?? _processor.Target.Options.Project;
136+
string targetProjectName = _processor.Target.Options.Project;
150137

151-
// Create External Link object
152-
ExternalLink newLink = null;
153-
switch (l.ArtifactLinkType.Name)
138+
TfsGitRepositoryInfo targetRepoInfo = TfsGitRepositoryInfo.Create(targetRepoName, sourceRepoInfo, targetRepos);
139+
// if repo was not found in the target project, try to find it in the whole target project collection
140+
if (targetRepoInfo.GitRepo == null)
154141
{
155-
case "Branch":
156-
newLink = new ExternalLink(((TfsWorkItemMigrationClient)_processor.Target.WorkItems).Store.RegisteredLinkTypes[ArtifactLinkIds.Branch],
157-
$"vstfs:///git/ref/{targetRepoInfo.GitRepo.ProjectReference.Id}%2f{targetRepoInfo.GitRepo.Id}%2f{sourceRepoInfo.CommitID}");
158-
break;
159-
160-
case "Fixed in Changeset": // TFVC
161-
case "Fixed in Commit":
162-
newLink = new ExternalLink(((TfsWorkItemMigrationClient)_processor.Target.WorkItems).Store.RegisteredLinkTypes[ArtifactLinkIds.Commit],
163-
$"vstfs:///git/commit/{targetRepoInfo.GitRepo.ProjectReference.Id}%2f{targetRepoInfo.GitRepo.Id}%2f{sourceRepoInfo.CommitID}");
164-
newLink.Comment = el.Comment;
165-
break;
166-
167-
case "Pull Request":
168-
//newLink = new ExternalLink(targetStore.Store.RegisteredLinkTypes[ArtifactLinkIds.PullRequest],
169-
// $"vstfs:///Git/PullRequestId/{targetRepoInfo.GitRepo.ProjectReference.Id}%2f{targetRepoInfo.GitRepo.Id}%2f{sourceRepoInfo.CommitID}");
170-
removeEL.Add(el);
171-
break;
172-
173-
default:
174-
Log.LogWarning("Skipping unsupported link type {0}", l.ArtifactLinkType.Name);
175-
break;
142+
if (Options.Mappings.Values.Contains(targetRepoName))
143+
{
144+
var anyTargetRepoInCollectionInfo = TfsGitRepositoryInfo.Create(targetRepoName, sourceRepoInfo, allTargetRepos);
145+
if (anyTargetRepoInCollectionInfo.GitRepo != null)
146+
{
147+
targetRepoInfo = anyTargetRepoInCollectionInfo;
148+
}
149+
}
176150
}
177151

178-
if (newLink != null)
152+
// Fix commit links if target repo has been found
153+
if (targetRepoInfo.GitRepo != null)
179154
{
180-
var elinks = from Link lq in targetWorkItem.ToWorkItem().Links
181-
where gitWits.Contains(lq.ArtifactLinkType.Name)
182-
select (ExternalLink)lq;
183-
var found =
184-
(from Link lq in elinks
185-
where ((ExternalLink)lq).LinkedArtifactUri.ToLower() == newLink.LinkedArtifactUri.ToLower()
186-
select lq).SingleOrDefault();
187-
if (found == null)
155+
Log.LogDebug("GitRepositoryEnricher: Fixing {SourceRepoUrl} to {TargetRepoUrl}?", sourceRepoInfo.GitRepo.RemoteUrl, targetRepoInfo.GitRepo.RemoteUrl);
156+
157+
// Create External Link object
158+
ExternalLink newLink = null;
159+
switch (l.ArtifactLinkType.Name)
160+
{
161+
case "Branch":
162+
newLink = new ExternalLink(((TfsWorkItemMigrationClient)_processor.Target.WorkItems).Store.RegisteredLinkTypes[ArtifactLinkIds.Branch],
163+
$"vstfs:///git/ref/{targetRepoInfo.GitRepo.ProjectReference.Id}%2f{targetRepoInfo.GitRepo.Id}%2f{sourceRepoInfo.CommitID}");
164+
break;
165+
166+
case "Fixed in Changeset": // TFVC
167+
case "Fixed in Commit":
168+
newLink = new ExternalLink(((TfsWorkItemMigrationClient)_processor.Target.WorkItems).Store.RegisteredLinkTypes[ArtifactLinkIds.Commit],
169+
$"vstfs:///git/commit/{targetRepoInfo.GitRepo.ProjectReference.Id}%2f{targetRepoInfo.GitRepo.Id}%2f{sourceRepoInfo.CommitID}");
170+
newLink.Comment = el.Comment;
171+
break;
172+
173+
case "Pull Request":
174+
//newLink = new ExternalLink(targetStore.Store.RegisteredLinkTypes[ArtifactLinkIds.PullRequest],
175+
// $"vstfs:///Git/PullRequestId/{targetRepoInfo.GitRepo.ProjectReference.Id}%2f{targetRepoInfo.GitRepo.Id}%2f{sourceRepoInfo.CommitID}");
176+
removeEL.Add(el);
177+
break;
178+
179+
default:
180+
Log.LogWarning("Skipping unsupported link type {0}", l.ArtifactLinkType.Name);
181+
break;
182+
}
183+
184+
if (newLink != null)
188185
{
189-
newEL.Add(newLink);
186+
var elinks = from Link lq in targetWorkItem.ToWorkItem().Links
187+
where gitWits.Contains(lq.ArtifactLinkType.Name)
188+
select (ExternalLink)lq;
189+
var found =
190+
(from Link lq in elinks
191+
where ((ExternalLink)lq).LinkedArtifactUri.ToLower() == newLink.LinkedArtifactUri.ToLower()
192+
select lq).SingleOrDefault();
193+
if (found == null)
194+
{
195+
newEL.Add(newLink);
196+
}
197+
removeEL.Add(el);
190198
}
191-
removeEL.Add(el);
192199
}
193-
}
194-
else
195-
{
196-
Log.LogWarning("GitRepositoryEnricher: Target Repo not found. Cannot map {SourceRepoUrl} to ???", sourceRepoInfo.GitRepo.RemoteUrl);
200+
else
201+
{
202+
Log.LogWarning("GitRepositoryEnricher: Target Repo not found. Cannot map {SourceRepoUrl} to ???", sourceRepoInfo.GitRepo.RemoteUrl);
203+
}
197204
}
198205
}
199206
}

src/MigrationTools.Clients.TfsObjectModel/Tools/TfsGitRepositoryToolOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ namespace MigrationTools.Tools
1111
{
1212
public class TfsGitRepositoryToolOptions : ToolOptions
1313
{
14+
/// <summary>
15+
/// When set to True the changedset links will be dropped during the migration
16+
/// </summary>
17+
public bool ShouldDropChangedSetLinks { get; set; }
18+
1419
/// <summary>
1520
/// List of work item mappings.
1621
/// </summary>

0 commit comments

Comments
 (0)