public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            var settings = JsonConvert.DeserializeObject <TeamMembersWidgetSettings>(widget.settings);

            if (_sourceTeamList == null)
            {
                _sourceTeamList = TfsStatic.GetTeams(true, TfsStatic.GetTeamProjectId(true));
            }
            if (_targetTeamList == null)
            {
                _targetTeamList = TfsStatic.GetTeams(false, TfsStatic.GetTeamProjectId(false));
            }

            var sourceTeam     = _sourceTeamList.value.FirstOrDefault(o => o.id == settings.teamId);
            var sourceTeamName = sourceTeam?.name;

            if (string.IsNullOrEmpty(sourceTeamName))
            {
                WriteWarning($"Skipped: Can't find a team in the source project with an id of '{settings.teamId}'.");
                return;
            }
            var targetTeamId = _targetTeamList.value.FirstOrDefault(o => o.name == sourceTeamName)?.id;

            if (string.IsNullOrEmpty(targetTeamId))
            {
                if (sourceTeam.name.Equals($"{sourceTeam.projectName} Team"))
                {
                    var targetDefaultTeam = $"{TfsStatic.GetTeamProjectName(false)} Team";
                    var targetTeam        = _targetTeamList.value.FirstOrDefault(o => o.name.Equals(targetDefaultTeam, System.StringComparison.InvariantCultureIgnoreCase));
                    if (targetTeam == null)
                    {
                        WriteWarning($"Skipped: Can't find a team in the target project with the name of '{sourceTeamName}'.");
                        return;
                    }
                    WriteWarning($"Default team detected in the source, using default team in target: '{targetTeam.name}'.");
                    targetTeamId = targetTeam.id;
                }
                else
                {
                    WriteWarning($"Skipped: Can't find a team in the target project with the name of '{sourceTeamName}'.");
                    return;
                }
            }

            settings.teamId = targetTeamId;

            widget.settings = JsonConvert.SerializeObject(settings);
        }
        private static TargetQueryInfo GetTargetQueryFolderId(WorkItemQuery sourceQuery, QueryReplacementParameters replacementParameters)
        {
            TargetQueryInfo targetQueryFolder = new TargetQueryInfo();

            targetQueryFolder.FolderPath = sourceQuery.path;
            if (!string.IsNullOrEmpty(replacementParameters.PathFind) && !string.IsNullOrEmpty(replacementParameters.PathReplace) &&
                !replacementParameters.PathFind.Equals(replacementParameters.PathReplace, StringComparison.InvariantCultureIgnoreCase))
            {
                var findIndex = targetQueryFolder.FolderPath.IndexOf(replacementParameters.PathFind, StringComparison.InvariantCultureIgnoreCase);
                while (findIndex > -1)
                {
                    targetQueryFolder.FolderPath = targetQueryFolder.FolderPath.Remove(findIndex, replacementParameters.PathFind.Length);
                    targetQueryFolder.FolderPath = targetQueryFolder.FolderPath.Insert(findIndex, replacementParameters.PathReplace);
                    findIndex = targetQueryFolder.FolderPath.IndexOf(replacementParameters.PathFind, findIndex + replacementParameters.PathReplace.Length, StringComparison.InvariantCultureIgnoreCase);
                }
            }
            targetQueryFolder.QueryName  = targetQueryFolder.FolderPath.Remove(0, targetQueryFolder.FolderPath.LastIndexOf('/') + 1);
            targetQueryFolder.FolderPath = targetQueryFolder.FolderPath.Remove(targetQueryFolder.FolderPath.LastIndexOf('/'));
            try
            {
                targetQueryFolder.FolderId = TfsStatic.GetWorkItemQuery(false, targetQueryFolder.FolderPath, QueryExpand.minimal, 0).id;
            }
            catch
            {
                string pathLeft = targetQueryFolder.FolderPath;
                do
                {
                    pathLeft = pathLeft.Remove(pathLeft.LastIndexOf('/'));
                    try
                    {
                        targetQueryFolder.FolderId = TfsStatic.GetWorkItemQuery(false, pathLeft, QueryExpand.minimal, 0).id;
                        break;
                    }
                    catch { }
                }while (string.IsNullOrEmpty(targetQueryFolder.FolderId));

                do
                {
                    var nextFolder = targetQueryFolder.FolderPath.Remove(0, pathLeft.Length + 1);
                    if (nextFolder.IndexOf('/') > -1)
                    {
                        nextFolder = nextFolder.Remove(nextFolder.IndexOf('/'));
                    }
                    targetQueryFolder.FolderId = TfsStatic.CreateWorkItemQueryFolder(false, pathLeft, nextFolder).id;
                    pathLeft = $"{pathLeft}/{nextFolder}";
                }while (targetQueryFolder.FolderPath.Length != pathLeft.Length);
            }

            return(targetQueryFolder);
        }
Example #3
0
        public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            var settings = JsonConvert.DeserializeObject <CodeScalarWidgetSettings>(widget.settings);

            if (_sourceRepositoryList == null)
            {
                _sourceRepositoryList = TfsStatic.GetGitRepos(true);
            }
            if (_targetRepositoryList == null)
            {
                _targetRepositoryList = TfsStatic.GetGitRepos(false);
            }

            var sourceRepo     = _sourceRepositoryList.value.FirstOrDefault(o => o.id == settings.repositoryId);
            var sourceRepoName = sourceRepo?.name;

            if (string.IsNullOrEmpty(sourceRepoName))
            {
                WriteWarning($"Skipped: Can't find a repository in the source project with an id of '{settings.repositoryId}'.");
                return;
            }
            var targetRepoName = sourceRepoName;

            if (appConfig.Repos.Mapping.Keys.Any(o => o.Equals(targetRepoName, StringComparison.InvariantCultureIgnoreCase)))
            {
                targetRepoName = appConfig.Builds.Mapping[appConfig.Repos.Mapping.Keys.First(o => o.Equals(targetRepoName, StringComparison.InvariantCultureIgnoreCase))];
            }
            var targetRepoId = _targetRepositoryList.value.FirstOrDefault(o => o.name == sourceRepoName)?.id;

            if (string.IsNullOrEmpty(targetRepoId))
            {
                WriteWarning($"Skipped: Can't find a repository in the target project with the name of '{sourceRepoName}'.");
                return;
            }

            settings.repositoryId = targetRepoId;

            widget.settings = JsonConvert.SerializeObject(settings);
        }
        public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            var settings = JsonConvert.DeserializeObject <BuildHistogramWidgetSettings>(widget.settings);

            if (_targetBuildList == null)
            {
                _targetBuildList = TfsStatic.GetBuilds(false);
            }

            var targetBuildName = settings.buildDefinition.name;

            if (appConfig.Builds.Mapping.Keys.Any(o => o.Equals(targetBuildName, StringComparison.InvariantCultureIgnoreCase)))
            {
                targetBuildName = appConfig.Builds.Mapping[appConfig.Builds.Mapping.Keys.First(o => o.Equals(targetBuildName, StringComparison.InvariantCultureIgnoreCase))];
            }
            var targetBuild = _targetBuildList.value.FirstOrDefault(o => o.definition.name.Equals(targetBuildName, StringComparison.InvariantCultureIgnoreCase));

            if (targetBuild == null)
            {
                WriteWarning($"Skipped: Build named '{targetBuildName}' does not exist in target project");
                return;
            }
            if (widget.name.Equals(settings.buildDefinition.name, StringComparison.InvariantCultureIgnoreCase))
            {
                widget.name = targetBuildName;
            }
            settings.buildDefinition.id        = targetBuild.definition.id;
            settings.buildDefinition.name      = targetBuild.definition.name;
            settings.buildDefinition.projectId = targetBuild.definition.project.id;
            settings.buildDefinition.uri       = targetBuild.definition.uri;

            widget.settings = JsonConvert.SerializeObject(settings);
        }
        private static WorkItemQuery TryWriteQuery(WorkItemQuery sourceQuery, TargetQueryInfo targetQueryInfo)
        {
            WorkItemQuery targetQuery;
            var           queryExistsAlready = false;

            try
            {
                var targetFolder = TfsStatic.GetWorkItemQuery(true, targetQueryInfo.FolderId, QueryExpand.minimal, 1);
                if (targetFolder.hasChildren)
                {
                    targetQuery = targetFolder.children.FirstOrDefault(o => o.name.Equals(targetQueryInfo.QueryName, StringComparison.InvariantCultureIgnoreCase));
                    if (targetQuery != null)
                    {
                        queryExistsAlready = true;
                        sourceQuery.id     = targetQuery.id;
                        targetQuery        = TfsStatic.UpdateWorkItemQuery(false, sourceQuery);
                    }
                    else
                    {
                        targetQuery = TfsStatic.CreateWorkItemQuery(false, targetQueryInfo.FolderId, sourceQuery);
                    }
                }
                else
                {
                    targetQuery = TfsStatic.CreateWorkItemQuery(false, targetQueryInfo.FolderId, sourceQuery);
                }
            }
            catch
            {
                if (queryExistsAlready)
                {
                    throw;
                }
                targetQuery = TfsStatic.CreateWorkItemQuery(false, targetQueryInfo.FolderId, sourceQuery);
            }

            return(targetQuery);
        }
        public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            string        sourceProjectName = TfsStatic.GetTeamProjectName(true);
            string        sourceTeamName    = appConfig.SourceTeamName;
            string        targetProjectName = TfsStatic.GetTeamProjectName(false);
            string        targetTeamName    = appConfig.TargetTeamName;
            WorkItemQuery targetQuery;
            var           settings = JsonConvert.DeserializeObject <WitChartWidgetSettings>(widget.settings);

            targetQuery = QueryTools.CopyQuery(new CopyQueryParameters
            {
                QueryId           = settings.groupKey,
                QueryReplacements = appConfig.Queries,
            }, sourceProjectName, sourceTeamName, targetProjectName, targetTeamName);
            settings.groupKey = targetQuery.id;
            settings.transformOptions.filter = targetQuery.id;
            widget.settings = JsonConvert.SerializeObject(settings);
        }
Example #7
0
        public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            var settings = JsonConvert.DeserializeObject <CumulativeFlowDiagramWidgetSettings>(widget.settings);

            if (_sourceTeamList == null)
            {
                _sourceTeamList = TfsStatic.GetTeams(true, TfsStatic.GetTeamProjectId(true));
            }
            if (_targetTeamList == null)
            {
                _targetTeamList = TfsStatic.GetTeams(false, TfsStatic.GetTeamProjectId(false));
            }

            var sourceTeam     = _sourceTeamList.value.FirstOrDefault(o => o.id == settings.chartDataSettings.team);
            var sourceTeamName = sourceTeam?.name;

            if (string.IsNullOrEmpty(sourceTeamName))
            {
                WriteWarning($"Skipped: Can't find a team in the source project with an id of '{settings.chartDataSettings.team}'.");
                return;
            }
            var targetTeamName        = sourceTeamName;
            var sourceIsMigratingTeam = sourceTeamName.Equals(appConfig.SourceTeamName, StringComparison.OrdinalIgnoreCase);

            if (sourceIsMigratingTeam)
            {
                targetTeamName = appConfig.TargetTeamName;
            }
            var targetTeamId = _targetTeamList.value.FirstOrDefault(o => o.name == targetTeamName)?.id;

            if (string.IsNullOrEmpty(targetTeamId))
            {
                if (sourceTeam.name.Equals($"{sourceTeam.projectName} Team"))
                {
                    var targetDefaultTeam = $"{TfsStatic.GetTeamProjectName(false)} Team";
                    var targetTeam        = _targetTeamList.value.FirstOrDefault(o => o.name.Equals(targetDefaultTeam, System.StringComparison.InvariantCultureIgnoreCase));
                    if (targetTeam == null)
                    {
                        WriteWarning($"Skipped: Can't find a team in the target project with the name of '{targetDefaultTeam}'.");
                        return;
                    }
                    WriteWarning($"Default team detected in the source, using default team in target: '{targetTeam.name}'.");
                    targetTeamId = targetTeam.id;
                }
                else
                {
                    WriteWarning($"Skipped: Can't find a team in the target project with the name of '{targetTeamName}'.");
                    return;
                }
            }

            var sourceBoards = TfsStatic.GetTeamBoards(true, sourceTeam.id);
            var sourceBoard  = sourceBoards.value.FirstOrDefault(o => o.id.Equals(settings.chartDataSettings.board, StringComparison.OrdinalIgnoreCase));

            if (sourceBoard == null)
            {
                WriteWarning($"Can't find source board id '{settings.chartDataSettings.board}'.");
            }
            else
            {
                var targetBoards = TfsStatic.GetTeamBoards(false, targetTeamId);
                var targetBoard  = targetBoards.value.FirstOrDefault(o => o.name.Equals(sourceBoard.name, StringComparison.OrdinalIgnoreCase));
                if (targetBoard == null)
                {
                    WriteWarning($"Can't find target board named '{sourceBoard.name}'.");
                }
                else
                {
                    settings.chartDataSettings.board = targetBoard.id;

                    var sourceFullBoard = TfsStatic.GetTeamBoard(true, sourceTeam.id, sourceBoard.id);
                    var targetFullBoard = TfsStatic.GetTeamBoard(false, targetTeamId, targetBoard.id);

                    var desiredBoardColumnIds = new List <string>();
                    foreach (var desiredBoardColumnId in settings.chartDataSettings.desiredBoardColumnIds)
                    {
                        var sourceColumn = sourceFullBoard.columns.FirstOrDefault(o => o.id.Equals(desiredBoardColumnId, StringComparison.OrdinalIgnoreCase));
                        if (sourceColumn == null)
                        {
                            WriteWarning($"Can't find source column id '{desiredBoardColumnId}'.");
                            continue;
                        }
                        var targetColumn = targetFullBoard.columns.FirstOrDefault(o => o.name.Equals(sourceColumn.name, StringComparison.OrdinalIgnoreCase));
                        if (targetColumn == null)
                        {
                            WriteWarning($"Can't find target column named '{sourceColumn.name}'.");
                            continue;
                        }
                        desiredBoardColumnIds.Add(targetColumn.id);
                    }
                    settings.chartDataSettings.desiredBoardColumnIds = desiredBoardColumnIds;
                }
            }

            settings.chartDataSettings.project = TfsStatic.GetTeamProjectId(false);
            settings.chartDataSettings.team    = targetTeamId;
            settings.lastArtifactName?.Replace(appConfig.SourceTeamName, appConfig.TargetTeamName);

            widget.settings = JsonConvert.SerializeObject(settings);
        }
Example #8
0
        public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            var settings = JsonConvert.DeserializeObject <AnalyticsSprintBurndownWidgetSettings>(widget.settings);

            if (_sourceTeamList == null)
            {
                _sourceTeamList = TfsStatic.GetTeams(true, TfsStatic.GetTeamProjectId(true));
            }
            if (_targetTeamList == null)
            {
                _targetTeamList = TfsStatic.GetTeams(false, TfsStatic.GetTeamProjectId(false));
            }

            var sourceTeam            = _sourceTeamList.value.FirstOrDefault(o => o.id == settings.team.teamId);
            var sourceTeamName        = sourceTeam?.name;
            var sourceIsMigratingTeam = sourceTeamName.Equals(appConfig.SourceTeamName, StringComparison.OrdinalIgnoreCase);

            if (string.IsNullOrEmpty(sourceTeamName))
            {
                WriteWarning($"Skipped: Can't find a team in the source project with an id of '{settings.team.teamId}'.");
                return;
            }
            var targetTeamName = sourceTeamName;

            if (sourceIsMigratingTeam)
            {
                targetTeamName = appConfig.TargetTeamName;
            }
            var targetTeamId = _targetTeamList.value.FirstOrDefault(o => o.name == targetTeamName)?.id;

            if (string.IsNullOrEmpty(targetTeamId))
            {
                if (sourceTeam.name.Equals($"{sourceTeam.projectName} Team"))
                {
                    var targetDefaultTeam = $"{TfsStatic.GetTeamProjectName(false)} Team";
                    var targetTeam        = _targetTeamList.value.FirstOrDefault(o => o.name.Equals(targetDefaultTeam, System.StringComparison.InvariantCultureIgnoreCase));
                    if (targetTeam == null)
                    {
                        WriteWarning($"Skipped: Can't find a team in the target project with the name of '{targetDefaultTeam}'.");
                        return;
                    }
                    WriteWarning($"Default team detected in the source, using default team in target: '{targetTeam.name}'.");
                    targetTeamId = targetTeam.id;
                }
                else
                {
                    WriteWarning($"Skipped: Can't find a team in the target project with the name of '{targetTeamName}'.");
                    return;
                }
            }

            settings.team.projectId = TfsStatic.GetTeamProjectId(false);
            settings.team.teamId    = targetTeamId;
            var teamIterations = TfsStatic.GetTeamIterations(false, settings.team.teamId, true);

            if (teamIterations.count == 0)
            {
                WriteWarning($"Can't find any current iterations for '{targetTeamName}', please configure this manually.");
            }
            else
            {
                settings.iterationPath = teamIterations.value[0].path;
                settings.timePeriodConfiguration.startDate = teamIterations.value[0].attributes.startDate;
                if (!settings.timePeriodConfiguration.startDate.HasValue)
                {
                    WriteWarning($"startDate == null, please check @currentIteration for '{targetTeamName}'.");
                }
                settings.timePeriodConfiguration.endDate = teamIterations.value[0].attributes.finishDate;
                if (!settings.timePeriodConfiguration.endDate.HasValue)
                {
                    WriteWarning($"startDate == null, please check @currentIteration for '{targetTeamName}'.");
                }
            }

            widget.settings = JsonConvert.SerializeObject(settings);
        }
Example #9
0
        public override void Run(DashboardInfo_Widget1 widget, AppConfig appConfig)
        {
            if (widget.settings == null)
            {
                WriteWarning("Skipped: settings == null");
                return;
            }
            var settings = JsonConvert.DeserializeObject <CycleTimeWidgetSettings>(widget.settings);

            if (_sourceTeamList == null)
            {
                _sourceTeamList = TfsStatic.GetTeams(true, TfsStatic.GetTeamProjectId(true));
            }
            if (_targetTeamList == null)
            {
                _targetTeamList = TfsStatic.GetTeams(false, TfsStatic.GetTeamProjectId(false));
            }

            var newTeamIds = new List <string>();

            foreach (var teamId in settings.dataSettings.teamIds)
            {
                var sourceTeam     = _sourceTeamList.value.FirstOrDefault(o => o.id == teamId);
                var sourceTeamName = sourceTeam?.name;
                if (string.IsNullOrEmpty(sourceTeamName))
                {
                    WriteWarning($"Skipped: Can't find a team in the source project with an id of '{teamId}'.");
                    return;
                }
                var targetTeamName        = sourceTeamName;
                var sourceIsMigratingTeam = sourceTeamName.Equals(appConfig.SourceTeamName, StringComparison.OrdinalIgnoreCase);
                if (sourceIsMigratingTeam)
                {
                    targetTeamName = appConfig.TargetTeamName;
                }
                var targetTeamId = _targetTeamList.value.FirstOrDefault(o => o.name == targetTeamName)?.id;
                if (string.IsNullOrEmpty(targetTeamId))
                {
                    if (sourceTeam.name.Equals($"{sourceTeam.projectName} Team"))
                    {
                        var targetDefaultTeam = $"{TfsStatic.GetTeamProjectName(false)} Team";
                        var targetTeam        = _targetTeamList.value.FirstOrDefault(o => o.name.Equals(targetDefaultTeam, System.StringComparison.InvariantCultureIgnoreCase));
                        if (targetTeam == null)
                        {
                            WriteWarning($"Skipped: Can't find a team in the target project with the name of '{targetDefaultTeam}'.");
                            return;
                        }
                        WriteWarning($"Default team detected in the source, using default team in target: '{targetTeam.name}'.");
                        targetTeamId = targetTeam.id;
                    }
                    else
                    {
                        WriteWarning($"Skipped: Can't find a team in the target project with the name of '{targetTeamName}'.");
                        return;
                    }
                }
                newTeamIds.Add(targetTeamId);
            }

            // Need support still for
            // - swimLane
            // - fieldFilters largely with mappings per field name

            settings.dataSettings.project = TfsStatic.GetTeamProjectId(false);
            settings.dataSettings.teamIds = newTeamIds;
            settings.lastArtifactName?.Replace(appConfig.SourceTeamName, appConfig.TargetTeamName);

            widget.settings = JsonConvert.SerializeObject(settings);
        }
        public static WorkItemQuery CopyQuery(CopyQueryParameters parameters,
                                              string sourceProjectName, string sourceTeamName,
                                              string targetProjectName, string targetTeamName)
        {
            var sourceQuery = TfsStatic.GetWorkItemQuery(true, parameters.QueryId, QueryExpand.minimal, 0);

            var targetQueryInfo = GetTargetQueryFolderId(sourceQuery, parameters.QueryReplacements);

            if (TfsStatic.SourceTeamProjectBaseUri.Equals(TfsStatic.TargetTeamProjectBaseUri, StringComparison.InvariantCultureIgnoreCase) &&
                sourceQuery.path.Equals($"{targetQueryInfo.FolderPath}/{targetQueryInfo.QueryName}", StringComparison.InvariantCultureIgnoreCase))
            {
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                Console.WriteLine($"Skipped: Target query path matches source query ({targetQueryInfo.FolderPath}/{targetQueryInfo.QueryName})");
                Console.ForegroundColor = ConsoleColor.White;
                return(sourceQuery);
            }

            sourceQuery.name = targetQueryInfo.QueryName;
            sourceQuery.path = targetQueryInfo.FolderPath;
            RemoveTeamAreaId(sourceQuery);
            if (!string.IsNullOrEmpty(sourceProjectName) || !string.IsNullOrEmpty(sourceTeamName) ||
                !string.IsNullOrEmpty(targetProjectName) || !string.IsNullOrEmpty(targetTeamName))
            {
                if (parameters.QueryReplacements == null)
                {
                    parameters.QueryReplacements = new QueryReplacementParameters();
                }
                if (parameters.QueryReplacements.QueryFindAndReplace == null)
                {
                    parameters.QueryReplacements.QueryFindAndReplace = new();
                }
                if (!parameters.QueryReplacements.QueryFindAndReplace.Any(o => o.Find.Equals($"[{sourceProjectName}]\\{sourceTeamName}")))
                {
                    parameters.QueryReplacements.QueryFindAndReplace.Add(new FindAndReplace
                    {
                        Find    = $"[{sourceProjectName}]\\{sourceTeamName}",
                        Replace = $"[{targetProjectName}]\\{targetTeamName}",
                    });
                }
                if (!parameters.QueryReplacements.QueryFindAndReplace.Any(o => o.Find.Equals($"[{sourceProjectName}]")))
                {
                    parameters.QueryReplacements.QueryFindAndReplace.Add(new FindAndReplace
                    {
                        Find    = $"[{sourceProjectName}]",
                        Replace = $"[{targetProjectName}]",
                    });
                }
            }
            FindAndReplaceInWiql(parameters, sourceQuery);

            WorkItemQuery result;
            int           tryCount = 0;

            while (true)
            {
                try
                {
                    result = TryWriteQuery(sourceQuery, targetQueryInfo);
                    break;
                }
                catch
                {
                    tryCount++;
                    if (tryCount >= 5)
                    {
                        Program.WriteFileProgress($"Query creation failed from source query {sourceQuery.path}");
                        throw;
                    }
                }
                Thread.Sleep(2500);
            }
            return(result);
        }