private static void CopyQueryFolder(WorkItemQuery queryFolder, string sourceProjectName, string sourceTeamName, string targetProjectName, string targetTeamName) { WriteLine($"{queryFolder.path}"); if (!queryFolder.isFolder || queryFolder.children.Length == 0) { return; } foreach (var childQueryFolder in queryFolder.children.Where(o => o.isFolder)) { var childQueryFolderObject = TfsStatic.GetWorkItemQuery(true, childQueryFolder.id, QueryExpand.minimal, 1); CopyQueryFolder(childQueryFolderObject, sourceProjectName, sourceTeamName, targetProjectName, targetTeamName); } foreach (var query in queryFolder.children.Where(o => !o.isFolder)) { WriteLine($"\t- {query.name}"); QueryTools.CopyQuery(new Tools.Parameters.CopyQueryParameters { QueryId = query.id, QueryReplacements = _config.Queries, }, sourceProjectName, sourceTeamName, targetProjectName, targetTeamName); } }
private static void MigrateDashboard() { if (string.IsNullOrEmpty(_config.SourceDashboardName)) { WriteLine($"{nameof(AppConfig.SourceDashboardName)} is missing for Dashboard Migration!", ConsoleColor.Red); return; } if (string.IsNullOrEmpty(_config.TargetDashboardName)) { WriteLine($"{nameof(AppConfig.TargetDashboardName)} is missing for Dashboard Migration!", ConsoleColor.Red); return; } if (TargetDashboardExists() && !_config.DeleteTargetDashboardIfExists) { WriteLine($"Target dashboard '{_config.TargetDashboardName}' in the team '{_config.TargetTeamName}' already exists and DeleteTargetDashboardIfExists=false.", ConsoleColor.Red); return; } var output = string.Empty; var dashboards = TfsStatic.GetDashboards(true, _config.SourceTeamName, _config.SourceAsProject); var dashboard = dashboards.value.FirstOrDefault(o => o.name.Equals(_config.SourceDashboardName)); if (dashboard == null) { WriteLine($"Unable to find the dashboard '{_config.SourceDashboardName}' in the team '{_config.SourceTeamName}'.", ConsoleColor.Red); return; } WriteLine($"Source Dashboard: {dashboard.name} ({dashboard.id})"); WriteLine($"Target Dashboard: {_config.TargetDashboardName}"); WriteLine($"Source Team Name: {_config.SourceTeamName}"); WriteLine($"Target Team Name: {_config.TargetTeamName}"); var dashboardInfo = TfsStatic.GetDashboard(true, _config.SourceTeamName, _config.SourceAsProject, dashboard.id); dashboardInfo.name = _config.TargetDashboardName; WriteLine($"Widgets: {dashboardInfo.widgets.Length}"); foreach (var widget in dashboardInfo.widgets) { #if DEBUG WriteLine($"[{GetWidgetPositionDisplay(widget)}] {widget.name} | {widget.contributionId}"); #else WriteLine($"[{GetWidgetPositionDisplay(widget)}] {widget.name}"); #endif try { bool processorFound = false; RunMarkdownReplacementsOnName(widget, _config); foreach (var processor in WidgetProcessors) { if (widget.contributionId.Equals(processor.ContributionId, StringComparison.InvariantCultureIgnoreCase)) { WriteLine($"\tprocessing"); processor.Run(widget, _config); processorFound = true; continue; } } if (!processorFound) { if (_config.NullSettingsWhereNoSupportedProcessorExists) { widget.settings = null; } WriteLine($"No processor for '{widget.contributionId}' found.", ConsoleColor.DarkYellow); } } catch (Exception ex) { WriteFileProgress($"ERROR: {{{_config.TargetTeamName}}}[{GetWidgetPositionDisplay(widget)}] {widget.name} - {ex.Message}"); } } WriteLine(); WriteLine(); if (_config.UpdateQueriesOnly) { WriteLine($"Skipping dashboard creation, UpdateQueriesOnly=true."); WriteFileProgress($"Skipping dashboard for {_config.TargetTeamName}/{_config.TargetDashboardName}."); } else { DeleteDashboardIfExists(); Write($"Creating dashboard '{_config.TargetDashboardName}' in the team '{_config.TargetTeamName}'..."); DashboardInfo newDashboardInfo; int tryCount = 0; while (true) { try { newDashboardInfo = TfsStatic.CreateDashboard(false, _config.TargetTeamName, _config.TargetAsProject, dashboardInfo); break; } catch { tryCount++; if (tryCount >= 5) { WriteFileProgress($"Dashboard creation failed for {_config.TargetTeamName}/{_config.TargetDashboardName}...CreateDashboard"); throw; } } Thread.Sleep(2500); } var teamNameUrl = _config.TargetTeamName.Replace(" ", "%20"); if (newDashboardInfo.url.IndexOf(teamNameUrl) > -1) { var url = newDashboardInfo.url.Remove(newDashboardInfo.url.IndexOf(teamNameUrl), teamNameUrl.Length + 1); url = url.Replace("_apis/Dashboard/Dashboards", "_dashboards/dashboard"); WriteLine(url); } else if (newDashboardInfo.url.IndexOf("/") > -1) { WriteLine(newDashboardInfo.url.Remove(0, newDashboardInfo.url.LastIndexOf("/") + 1)); } WriteLine("Done!", ConsoleColor.Green); } }