public void ExportToVcs(string repoPath, DateTime?continueAfter) { if (resetRepo) { continueAfter = null; } this.continueAfter = continueAfter; workQueue.AddLast(delegate(object work) { var stopwatch = Stopwatch.StartNew(); logger.WriteSectionSeparator(); LogStatus(work, "Initializing repository"); // create repository directory if it does not exist if (!Directory.Exists(repoPath)) { if (continueAfter != null) { throw new ProcessException("Unable to continue: " + repoPath + " does not exist.", null, null); } Directory.CreateDirectory(repoPath); } string vcs = vcsWrapper.GetVcs(); while (!vcsWrapper.FindExecutable()) { var button = MessageBox.Show(vcs + " not found in PATH. " + "If you need to modify your PATH variable, please " + "restart the program for the changes to take effect.", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (button == DialogResult.Cancel) { workQueue.Abort(); return; } } bool makeInitialCommit = resetRepo; if (!RetryCancel(delegate { vcsWrapper.Init(resetRepo); })) { return; } AbortRetryIgnore(delegate { vcsWrapper.Configure(continueAfter == null); }); var pathMapper = new VssPathMapper(); if (UseProjectsFile) { string rootPath = repoPath; foreach (var rootProject in revisionAnalyzer.RootProjects) { string path = rootProject.RootPath; path = path.Replace("/", "\\"); if (path.StartsWith("\\")) { path = rootPath + path; } else { path = rootPath + "\\" + path; } pathMapper.SetProjectPath(rootProject.PhysicalName, path, rootProject.Path); } } else { // create mappings for root projects foreach (var rootProject in revisionAnalyzer.RootProjects) { // root must be repo path here - the path mapper uses paths relative to this one VssPathMapper vssPathMapper = new VssPathMapper(); var rootPath = repoPath; if (RemovePath != "") { if (rootProject.Path.StartsWith(RemovePath)) { string path = rootProject.Path.Replace(RemovePath, ""); path = path.Replace("/", "\\"); if (path.StartsWith("\\")) { rootPath = rootPath + path; } else { rootPath = rootPath + "\\" + path; } } else { var button = MessageBox.Show($"{RemovePath} not found in path, Do you wanne continue with all contint in the root folder.", "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error); if (button == DialogResult.Cancel) { workQueue.Abort(); return; } } } pathMapper.SetProjectPath(rootProject.PhysicalName, rootPath, rootProject.Path); } } var changesets = changesetBuilder.Changesets; // create a log of all MoveFrom and MoveTo actions logger.WriteSectionSeparator(); logger.WriteLine("List of Move Operations"); logger.WriteSectionSeparator(); int changeSetNo = 0; int revisionNo = 0; foreach (var changeset in changesets) { foreach (var revision in changeset.Revisions) { var actionType = revision.Action.Type; VssItemName target = null; var namedAction = revision.Action as VssNamedAction; if (namedAction != null) { target = namedAction.Name; } switch (actionType) { case VssActionType.MoveFrom: var moveFromAction = (VssMoveFromAction)revision.Action; logger.WriteLine("{3}-{4}-{0}: MoveFrom {1} to {2}", revision.Item, moveFromAction.OriginalProject, target, changeSetNo, revisionNo); break; case VssActionType.MoveTo: var moveToAction = (VssMoveToAction)revision.Action; logger.WriteLine("{3}-{4}-{0}: MoveTo {1} from {2}", revision.Item, moveToAction.NewProject, target, changeSetNo, revisionNo); break; } revisionNo++; } changeSetNo++; //AdvancedTaskbar.SetPosition((uint)changeSetNo); } // replay each changeset logger.WriteSectionSeparator(); logger.WriteLine("Replaying Changesets"); var changesetId = 0; var commitCount = 0; var tagCount = 0; var replayStopwatch = new Stopwatch(); var labels = new LinkedList <Revision>(); tagsUsed.Clear(); bool found = continueAfter == null; foreach (var changeset in changesets) { ++changesetId; if (workQueue.IsAborting) { return; } if (!found) { if (continueAfter.Equals(changeset.DateTime)) { found = true; } SkipChangeset(pathMapper, changeset); continue; } var changesetDesc = string.Format("changeset {0} from {1:yyyy-MM-dd HH:mm:ss}", changesetId, changeset.DateTime); // replay each revision in changeset logger.WriteSectionSeparator(); LogStatus(work, "Replaying " + changesetDesc); labels.Clear(); replayStopwatch.Start(); try { ReplayChangeset(pathMapper, changeset, labels); if (makeInitialCommit) { vcsWrapper.Init(changeset, repoPath); makeInitialCommit = false; } vcsWrapper.NeedsCommit(); // to flush outstanding adds/deletes } finally { replayStopwatch.Stop(); } if (workQueue.IsAborting) { return; } // commit changes if (vcsWrapper.NeedsCommit()) { LogStatus(work, "Committing " + changesetDesc); if (CommitChangeset(changeset)) { ++commitCount; } } // create tags for any labels in the changeset if (labels.Count > 0) { foreach (Revision label in labels) { var labelName = ((VssLabelAction)label.Action).Label; if (string.IsNullOrEmpty(labelName)) { logger.WriteLine("NOTE: Ignoring empty label"); } else if (commitCount == 0) { logger.WriteLine("NOTE: Ignoring label '{0}' before initial commit", labelName); } else { //Datell B.V. Specific operation of adding folder structure to label. //It is optional by using the checkbox if (FolderBeforeLabel && label.Item.IsProject) { labelName = pathMapper.GetProjectPath(label.Item.PhysicalName) + "_" + labelName; labelName = labelName.Replace(repoPath, "").TrimStart('\\'); } var tagName = GetTagFromLabel(labelName); var tagMessage = "Creating tag " + tagName; if (tagName != labelName) { tagMessage += " for label '" + labelName + "'"; } LogStatus(work, tagMessage); // tags always get a tag message; var tagComment = label.Comment; if (string.IsNullOrEmpty(tagComment)) { // use the original VSS label as the tag message if none was provided tagComment = labelName; } if (AbortRetryIgnore( delegate { vcsWrapper.Tag(tagName, label.User, GetEmail(label.User), tagComment, label.DateTime); })) { ++tagCount; } } } } AdvancedTaskbar.SetPosition((uint)changesetId); } stopwatch.Stop(); if (!found) { logger.WriteLine("Cannot Sync: VSS changeset at {0} not found.", continueAfter); throw new ProcessException(string.Format("Cannot Sync: VSS changeset at {0} not found.", continueAfter), null, null); } logger.WriteSectionSeparator(); logger.WriteLine(vcs + " export complete in {0:HH:mm:ss}", new DateTime(stopwatch.ElapsedTicks)); logger.WriteLine("Replay time: {0:HH:mm:ss}", new DateTime(replayStopwatch.ElapsedTicks)); logger.WriteLine(vcs + " time: {0:HH:mm:ss}", new DateTime(vcsWrapper.ElapsedTime().Ticks)); logger.WriteLine(vcs + " commits: {0}", commitCount); logger.WriteLine(vcs + " tags: {0}", tagCount); }); }