예제 #1
0
        public async Task RecursivelyGetProjectReferences_ReturnsProjectReferences()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), Helpers.GetProjectFileWithProjectReferences(
                      new string[] {
                        @"..\Project2\Project2.csproj",
                    }) },
                { XFS.Path(@"c:\SolutionPath\Project2\Project2.csproj"), Helpers.GetProjectFileWithProjectReferences(
                      new string[] {
                        @"..\Project3\Project3.csproj",
                    }) },
                { XFS.Path(@"c:\SolutionPath\Project3\Project3.csproj"), new MockFileData(@"<Project></Project>") },
            });
            var mockDotnetUtilsService       = new Mock <IDotnetUtilsService>();
            var mockPackageFileService       = new Mock <IPackagesFileService>();
            var mockProjectAssetsFileService = new Mock <IProjectAssetsFileService>();
            var projectFileService           = new ProjectFileService(
                mockFileSystem,
                mockDotnetUtilsService.Object,
                mockPackageFileService.Object,
                mockProjectAssetsFileService.Object);

            var projects = await projectFileService.RecursivelyGetProjectReferencesAsync(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj")).ConfigureAwait(false);

            var sortedProjects = new List <string>(projects);

            sortedProjects.Sort();

            Assert.Collection(sortedProjects,
                              item => Assert.Equal(XFS.Path(@"c:\SolutionPath\Project2\Project2.csproj"), item),
                              item => Assert.Equal(XFS.Path(@"c:\SolutionPath\Project3\Project3.csproj"), item));
        }
        public StudioViewsEditorViewModel(EditorController editorController,
                                          FilterItemService filterItemService, ProjectService projectService, ProjectFileService projectFileService,
                                          SdlxliffMerger sdlxliffMerger, SdlxliffExporter sdlxliffExporter, SdlxliffReader sdlxliffReader)
        {
            _filterItemService  = filterItemService;
            _projectService     = projectService;
            _projectFileService = projectFileService;
            _sdlxliffMerger     = sdlxliffMerger;
            _sdlxliffExporter   = sdlxliffExporter;
            _sdlxliffReader     = sdlxliffReader;

            _editorController = editorController;
            _editorController.ActiveDocumentChanged += EditorController_ActiveDocumentChanged;

            ActivateDocument(_editorController.ActiveDocument);

            // Default values
            ExportSelectedSegments     = true;
            FilterItems                = new List <FilterItem>(_filterItemService.GetFilterItems());
            SelectedExcludeFilterItems = new ObservableCollection <FilterItem>(
                _filterItemService.GetFilterItems(FilterItems, new List <string> {
                "Locked"
            }));
            SelectedTabItem = 0;
        }
        public async Task GetProjectNugetPackages_ReturnsMultipleNugetPackages()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\Project\Project.csproj"), Helpers.GetProjectFileWithPackageReferences(
                      new List <NugetPackage> {
                        new NugetPackage {
                            Name = "Package1", Version = "1.2.3"
                        },
                        new NugetPackage {
                            Name = "Package2", Version = "1.2.3"
                        },
                        new NugetPackage {
                            Name = "Package3", Version = "1.2.3"
                        },
                    }) },
            });
            var projectFileService = new ProjectFileService(mockFileSystem);

            var packages = await projectFileService.GetProjectNugetPackagesAsync(XFS.Path(@"c:\Project\Project.csproj"));

            var sortedPackages = new List <NugetPackage>(packages);

            sortedPackages.Sort();

            Assert.Collection(sortedPackages,
                              item => Assert.Equal("Package1", item.Name),
                              item => Assert.Equal("Package2", item.Name),
                              item => Assert.Equal("Package3", item.Name));
        }
        private void Run(IReadOnlyCollection <SystemFileInfo> importFiles, Language language)
        {
            var projectHelper         = new ProjectService(_projectsController, _studioVersionService);
            var analysisBands         = projectHelper.GetAnalysisBands(_projectsController.CurrentProject ?? _projectsController.SelectedProjects.FirstOrDefault());
            var filterItemService     = new FilterItemService(analysisBands);
            var commonService         = new ProjectFileService();
            var segmentVisitor        = new SegmentVisitor();
            var segmentBuilder        = new SegmentBuilder();
            var paragraphUnitProvider = new ParagraphUnitProvider(segmentVisitor, filterItemService, segmentBuilder);
            var sdlxliffImporter      = new SdlxliffImporter(commonService, filterItemService, paragraphUnitProvider, segmentBuilder);
            var sdlXliffReader        = new SdlxliffReader();

            _window = new StudioViewsFilesImportView();
            var model = new StudioViewsFilesImportViewModel(_window, _filesController, language, commonService, filterItemService, sdlxliffImporter, sdlXliffReader);

            _window.DataContext = model;
            if (importFiles != null)
            {
                model.AddFiles(importFiles);
            }

            _window.ShowDialog();

            if (model.DialogResult != DialogResult.OK)
            {
                return;
            }

            OpenMessageWindow(model);
        }
예제 #5
0
        protected override void Initialize()
        {
            _editorController     = SdlTradosStudio.Application.GetController <EditorController>();
            _projectsController   = SdlTradosStudio.Application.GetController <ProjectsController>();
            _studioVersionService = new StudioVersionService();

            var commonService         = new ProjectFileService();
            var projectHelper         = new ProjectService(_projectsController, _studioVersionService);
            var analysisBands         = projectHelper.GetAnalysisBands(_projectsController.CurrentProject ?? _projectsController.SelectedProjects.FirstOrDefault());
            var filterItemService     = new FilterItemService(analysisBands);
            var sdlxliffMerger        = new SdlxliffMerger();
            var segmentBuilder        = new SegmentBuilder();
            var segmentVisitor        = new SegmentVisitor();
            var paragraphUnitProvider = new ParagraphUnitProvider(segmentVisitor, filterItemService);
            var sdlxliffExporter      = new SdlxliffExporter(segmentBuilder);
            var sdlXliffReader        = new SdlxliffReader();
            var displayFilter         = new DisplayFilter();

            var model = new StudioViewsEditorViewModel(_editorController, filterItemService,
                                                       commonService, sdlxliffMerger, sdlxliffExporter, sdlXliffReader, paragraphUnitProvider, displayFilter);

            _control = new StudioViewsEditorView {
                DataContext = model
            };
        }
예제 #6
0
 public void TestInitialize()
 {
     _directoryServiceMoq = new Mock <IDirectoryService>();
     _directoryServiceMoq.Setup(m => m.Exists(It.IsAny <string>())).Returns(false);
     _directoryServiceMoq.Setup(m => m.GetCurrentDirectory()).Returns("testDirectory");
     _projectFileService = new ProjectFileService(_directoryServiceMoq.Object);
     _projectFileService.ProjectDirectory = Directory;
 }
예제 #7
0
        static void Execute(string basePath, SearchQueryFilter filter, string?setVersion, string outputFile,
                            string outputFileFormatStr)
        {
            var tools           = new ProjectNugetVersionUpdater(new DotNetPackageReferenceUpdater());
            var projFileService = new ProjectFileService();

            OutputFileFormat outputFormat = !string.IsNullOrEmpty(outputFileFormatStr) ?
                                            Enum.Parse <OutputFileFormat>(outputFileFormatStr, true)
                : OutputFileFormat.Default;

            IProjectFileResultsRenderer projectFileRenderer;

            basePath = Path.GetFullPath(basePath);
            var projFiles = projFileService.GetProjectFilesByFilter(basePath, filter);

            if (!string.IsNullOrEmpty(outputFile))
            {
                var outputFilePath = Path.GetFullPath(outputFile);

                Console.Write($"Writing output to {outputFilePath}");
                if (!string.IsNullOrEmpty(outputFileFormatStr))
                {
                    Console.Write($" format: {outputFileFormatStr}");
                }
                Console.WriteLine();

                // no format so just redirect
                FileOutput.RedirectConsoleToFile(outputFilePath);
            }

            switch (outputFormat)
            {
            case OutputFileFormat.Json:
                projectFileRenderer = new ProjectFileJsonRenderer();
                break;

            default:
                projectFileRenderer = new ProjectFileConsoleRenderer();
                break;
            }

            projectFileRenderer.RenderResults(basePath, filter, projFiles);

            if (!string.IsNullOrEmpty(setVersion))
            {
                var startTabPad = 10;
                var strPad      = new string(' ', startTabPad);
                if (projFileService.SetNugetPackageVersions(filter, setVersion, projFiles, strPad, tools))
                {
                    return;
                }
            }
        }
        public async Task GetProjectNugetPackages_IgnoresImplicitPackageVersions()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\Project\Project.csproj"), Helpers.GetProjectFileWithPackageReference("Package", "") },
            });
            var projectFileService = new ProjectFileService(mockFileSystem);

            var packages = await projectFileService.GetProjectNugetPackagesAsync(XFS.Path(@"c:\Project\Project.csproj"));

            Assert.Empty(packages);
        }
예제 #9
0
        public async Task GetProjectNugetPackages_WithPackagesConfig_ReturnsMultipleNugetPackages()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\Project\Project.csproj"), "" },
                { XFS.Path(@"c:\Project\packages.config"), "" },
            });
            var mockDotnetUtilsService = new Mock <IDotnetUtilsService>();

            mockDotnetUtilsService
            .Setup(s => s.Restore(It.IsAny <string>()))
            .Returns(new DotnetUtilsResult());
            var mockPackageFileService = new Mock <IPackagesFileService>();

            mockPackageFileService
            .Setup(s => s.GetNugetPackagesAsync(It.IsAny <string>()))
            .ReturnsAsync(
                new HashSet <NugetPackage>
            {
                new NugetPackage {
                    Name = "Package1", Version = "1.2.3"
                },
                new NugetPackage {
                    Name = "Package2", Version = "1.2.3"
                },
                new NugetPackage {
                    Name = "Package3", Version = "1.2.3"
                },
            }
                );
            var mockProjectAssetsFileService = new Mock <IProjectAssetsFileService>();

            mockProjectAssetsFileService
            .Setup(s => s.GetNugetPackages(It.IsAny <string>()))
            .Returns(new HashSet <NugetPackage>());
            var projectFileService = new ProjectFileService(
                mockFileSystem,
                mockDotnetUtilsService.Object,
                mockPackageFileService.Object,
                mockProjectAssetsFileService.Object);

            var packages = await projectFileService.GetProjectNugetPackagesAsync(XFS.Path(@"c:\Project\Project.csproj")).ConfigureAwait(false);

            var sortedPackages = new List <NugetPackage>(packages);

            sortedPackages.Sort();

            Assert.Collection(sortedPackages,
                              item => Assert.Equal("Package1", item.Name),
                              item => Assert.Equal("Package2", item.Name),
                              item => Assert.Equal("Package3", item.Name));
        }
예제 #10
0
        public StudioViewsFilesSplitViewModel(Window window, List <ProjectFile> selectedFiles, ProjectFileService projectFileService,
                                              SdlxliffMerger sdlxliffMerger, SdlxliffExporter sdlxliffExporter, SdlxliffReader sdlxliffReader)
        {
            _window             = window;
            _selectedFiles      = selectedFiles;
            _projectFileService = projectFileService;
            _sdlxliffMerger     = sdlxliffMerger;
            _sdlxliffExporter   = sdlxliffExporter;
            _sdlxliffReader     = sdlxliffReader;

            WindowTitle = PluginResources.StudioViews_SplitSelectedFiles_Name;

            DialogResult = DialogResult.None;
            Reset(null);
        }
        public StudioViewsFilesImportViewModel(Window window, List <ProjectFile> selectedProjectFiles, ProjectFileService projectFileService,
                                               FilterItemService filterItemService, SdlxliffImporter sdlxliffImporter, SdlxliffReader sdlxliffReader)
        {
            _window               = window;
            _filterItemService    = filterItemService;
            _selectedProjectFiles = selectedProjectFiles;
            _sdlxliffImporter     = sdlxliffImporter;
            _sdlxliffReader       = sdlxliffReader;
            _projectFileService   = projectFileService;

            WindowTitle  = PluginResources.WindowTitle_Import;
            DialogResult = DialogResult.None;

            Reset(null);
        }
예제 #12
0
        public StudioViewsFilesImportViewModel(Window window, FilesController filesController, Language language, ProjectFileService projectFileService,
                                               FilterItemService filterItemService, SdlxliffImporter sdlxliffImporter, SdlxliffReader sdlxliffReader)
        {
            _window             = window;
            _filterItemService  = filterItemService;
            _filesController    = filesController;
            _language           = language;
            _sdlxliffImporter   = sdlxliffImporter;
            _sdlxliffReader     = sdlxliffReader;
            _projectFileService = projectFileService;

            WindowTitle  = PluginResources.WindowTitle_Import;
            DialogResult = DialogResult.None;

            Reset(null);
        }
        public async Task GetProjectNugetPackages_ReturnsNugetPackage()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\Project\Project.csproj"), Helpers.GetProjectFileWithPackageReference("Package", "1.2.3") },
            });
            var projectFileService = new ProjectFileService(mockFileSystem);

            var packages = await projectFileService.GetProjectNugetPackagesAsync(XFS.Path(@"c:\Project\Project.csproj"));

            Assert.Collection(packages,
                              item => {
                Assert.Equal("Package", item.Name);
                Assert.Equal("1.2.3", item.Version);
            });
        }
예제 #14
0
        protected override void Execute()
        {
            var selectedFiles = _filesController.SelectedFiles.Where(projectFile => projectFile.Role == FileRole.Translatable).ToList();

            if (selectedFiles.Count == 0)
            {
                MessageBox.Show(PluginResources.Message_No_files_selected, PluginResources.Plugin_Name, MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }

            var missingFiles = selectedFiles.Any(file => file.LocalFileState == LocalFileState.Missing);

            if (missingFiles)
            {
                MessageBox.Show(PluginResources.Message_Missing_Project_Files_Download_From_Server, PluginResources.Plugin_Name, MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }

            var project            = _projectsController.CurrentProject ?? _projectsController.SelectedProjects.FirstOrDefault();
            var projectFileService = new ProjectFileService();
            var sdlxliffMerger     = new SdlxliffMerger();
            var segmentBuilder     = new SegmentBuilder();
            var sdlxliffExporter   = new SdlxliffExporter(segmentBuilder);
            var sdlXliffReader     = new SdlxliffReader();


            var projectHelper     = new ProjectService(_projectsController, _studioVersionService);
            var analysisBands     = projectHelper.GetAnalysisBands(_projectsController.CurrentProject ?? _projectsController.SelectedProjects.FirstOrDefault());
            var filterItemService = new FilterItemService(analysisBands);

            _window = new StudioViewsFilesSplitView();
            var model = new StudioViewsFilesSplitViewModel(_window, project, selectedFiles, projectFileService, filterItemService,
                                                           sdlxliffMerger, sdlxliffExporter, sdlXliffReader);

            _window.DataContext = model;
            _window.ShowDialog();

            if (model.DialogResult != DialogResult.OK)
            {
                return;
            }


            OpenMessageWindow(model);
        }
예제 #15
0
        protected override void Initialize()
        {
            _editorController   = SdlTradosStudio.Application.GetController <EditorController>();
            _projectsController = SdlTradosStudio.Application.GetController <ProjectsController>();

            var commonService    = new ProjectFileService();
            var filterItemHelper = new FilterItemService();
            var projectHelper    = new ProjectService(_projectsController);
            var sdlxliffMerger   = new SdlxliffMerger();
            var sdlxliffExporter = new SdlxliffExporter();
            var sdlXliffReader   = new SdlxliffReader();

            var model = new StudioViewsEditorViewModel(_editorController, filterItemHelper, projectHelper,
                                                       commonService, sdlxliffMerger, sdlxliffExporter, sdlXliffReader);

            _control = new StudioViewsEditorView {
                DataContext = model
            };
        }
예제 #16
0
 public void TestInitialize()
 {
     _projectMoq         = new Mock <ProjectModel>();
     _dialogServiceMoq   = new Mock <IDialogService>();
     _projectLoadSaveMoq = new Mock <IProjectLoadSave>();
     _testDialogMoq      = new Mock <IFileDialog>();
     _testDialogMoq.Setup(d => d.ShowDialog()).Returns(MessageBoxResult.Cancel);
     _testDialogMoq.SetupAllProperties();
     _directoryServiceMoq = new Mock <IDirectoryService>();
     _directoryServiceMoq.Setup(m => m.Exists(It.IsAny <string>())).Returns(false);
     _directoryServiceMoq.Setup(m => m.GetCurrentDirectory()).Returns("testDirectory");
     _projectFileService = new ProjectFileService(
         _directoryServiceMoq.Object,
         _testDialogMoq.Object,
         _testDialogMoq.Object,
         _projectLoadSaveMoq.Object,
         _dialogServiceMoq.Object)
     {
         ProjectDirectory = Directory
     };
 }
        public async Task GetProjectNugetPackages_WithProjectAssetsFileWithoutRestore_ReturnsNugetPackage()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\Project\Project.csproj"), "" },
                { XFS.Path(@"c:\Project\obj\project.assets.json"), "" },
            });
            var mockDotnetUtilsService = new Mock <IDotnetUtilsService>();

            mockDotnetUtilsService
            .Setup(s => s.Restore(It.IsAny <string>()))
            .Throws(new ApplicationException("Restore should not be called"));
            var mockPackageFileService       = new Mock <IPackagesFileService>();
            var mockProjectAssetsFileService = new Mock <IProjectAssetsFileService>();

            mockProjectAssetsFileService
            .Setup(s => s.GetNugetPackages(It.IsAny <string>(), It.IsAny <bool>()))
            .Returns(new HashSet <NugetPackage>
            {
                new NugetPackage {
                    Name = "Package", Version = "1.2.3"
                },
            });
            var projectFileService = new ProjectFileService(
                mockFileSystem,
                mockDotnetUtilsService.Object,
                mockPackageFileService.Object,
                mockProjectAssetsFileService.Object);

            projectFileService.DisablePackageRestore = true;

            var packages = await projectFileService.GetProjectNugetPackagesAsync(XFS.Path(@"c:\Project\Project.csproj"), "", false).ConfigureAwait(false);

            Assert.Collection(packages,
                              item => {
                Assert.Equal("Package", item.Name);
                Assert.Equal("1.2.3", item.Version);
            });
        }
예제 #18
0
        protected override void Execute()
        {
            var selectedFiles = _filesController.SelectedFiles.Where(projectFile => projectFile.Role == FileRole.Translatable).ToList();

            if (selectedFiles.Count == 0)
            {
                MessageBox.Show(PluginResources.Message_No_files_selected, PluginResources.Plugin_Name, MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }

            var missingFiles = selectedFiles.Any(file => file.LocalFileState == LocalFileState.Missing);

            if (missingFiles)
            {
                MessageBox.Show(PluginResources.Message_Missing_Project_Files_Download_From_Server, PluginResources.Plugin_Name, MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }

            var commonService    = new ProjectFileService();
            var sdlxliffMerger   = new SdlxliffMerger();
            var segmentBuilder   = new SegmentBuilder();
            var sdlxliffExporter = new SdlxliffExporter(segmentBuilder);
            var sdlXliffReader   = new SdlxliffReader();

            _window = new StudioViewsFilesSplitView();
            var model = new StudioViewsFilesSplitViewModel(_window, selectedFiles, commonService,
                                                           sdlxliffMerger, sdlxliffExporter, sdlXliffReader);

            _window.DataContext = model;
            _window.ShowDialog();

            if (model.DialogResult != DialogResult.OK)
            {
                return;
            }


            OpenMessageWindow(model);
        }
        public async Task GetProjectReferences_ReturnsProjectReferences()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\SolutionPath\Project\Project.csproj"), Helpers.GetProjectFileWithProjectReferences(
                      new string[] {
                        @"..\Project1\Project1.csproj",
                        @"..\Project2\Project2.csproj",
                        @"..\Project3\Project3.csproj",
                    }) },
            });
            var projectFileService = new ProjectFileService(mockFileSystem);

            var projects = await projectFileService.GetProjectReferencesAsync(XFS.Path(@"c:\SolutionPath\Project\Project.csproj"));

            var sortedProjects = new List <string>(projects);

            sortedProjects.Sort();

            Assert.Collection(sortedProjects,
                              item => Assert.Equal(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), item),
                              item => Assert.Equal(XFS.Path(@"c:\SolutionPath\Project2\Project2.csproj"), item),
                              item => Assert.Equal(XFS.Path(@"c:\SolutionPath\Project3\Project3.csproj"), item));
        }
        public void GetPropertyUseProjectFileName(string projectFilePath, string baseIntermediateOutputPath, string expected)
        {
            string outputPath = ProjectFileService.GetProjectProperty(XFS.Path(projectFilePath), XFS.Path(baseIntermediateOutputPath));

            Assert.Equal(XFS.Path(expected), outputPath);
        }
        public void Initialize()
        {
            var mockDb = new MockDataContext();

            #region Initialize files.
            var f1 = new ProjectFile
            {
                ID               = 1,
                _projectID       = 2,
                _projectFileName = "TestFile_01",
                _projectFileData = "...lorem ipsum...",
                _projectFileType = ".css",
                _aceExtension    = "css"
            };
            mockDb._projectFiles.Add(f1);

            var f2 = new ProjectFile
            {
                ID               = 2,
                _projectID       = 2,
                _projectFileName = "TestFile_02",
                _projectFileData = "...lorem ipsum...",
                _projectFileType = ".css",
                _aceExtension    = "css"
            };
            mockDb._projectFiles.Add(f2);

            var f3 = new ProjectFile
            {
                ID               = 3,
                _projectID       = 3,
                _projectFileName = "TestFile_03",
                _projectFileData = "...lorem ipsum...",
                _projectFileType = ".cs",
                _aceExtension    = "csharp"
            };
            mockDb._projectFiles.Add(f3);

            var f4 = new ProjectFile
            {
                ID               = 4,
                _projectID       = 3,
                _projectFileName = "TestFile_04",
                _projectFileData = "...lorem ipsum...",
                _projectFileType = ".cs",
                _aceExtension    = "csharp"
            };
            mockDb._projectFiles.Add(f4);
            #endregion

            #region Initialize Projects.
            var p1 = new Project
            {
                ID = 1,
                _projectFileTypeId = 1,
                _projectName       = "TestProject_01"
            };
            mockDb._projects.Add(p1);

            var p2 = new Project
            {
                ID = 2,
                _projectFileTypeId = 2,
                _projectName       = "TestProject_02"
            };
            mockDb._projects.Add(p2);

            var p3 = new Project
            {
                ID = 3,
                _projectFileTypeId = 3,
                _projectName       = "TestProject_03"
            };
            mockDb._projects.Add(p1);
            #endregion

            _service = new ProjectFileService(mockDb);
        }
예제 #22
0
        async Task <int> OnExecute()
        {
            Console.WriteLine();

            // check parameter values
            if (string.IsNullOrEmpty(SolutionOrProjectFile))
            {
                Console.Error.WriteLine($"A path is required");
                return((int)ExitCode.SolutionOrProjectFileParameterMissing);
            }

            if (string.IsNullOrEmpty(outputDirectory))
            {
                Console.Error.WriteLine($"The output directory is required");
                return((int)ExitCode.OutputDirectoryParameterMissing);
            }

            if (string.IsNullOrEmpty(githubUsername) ^ string.IsNullOrEmpty(githubToken))
            {
                Console.Error.WriteLine($"Both GitHub username and token are required");
                return((int)ExitCode.GitHubParameterMissing);
            }

            // instantiate services
            var fileDiscoveryService = new FileDiscoveryService(Program.fileSystem);
            // GitHubService requires its own HttpClient as it adds a default authorization header
            GithubService githubService;

            if (string.IsNullOrEmpty(githubUsername) || string.IsNullOrEmpty(githubToken))
            {
                githubService = new GithubService(new HttpClient());
            }
            else
            {
                githubService = new GithubService(new HttpClient(), githubUsername, githubToken);
            }
            var nugetService        = new NugetService(Program.httpClient, githubService, baseUrl);
            var packagesFileService = new PackagesFileService(Program.fileSystem);
            var projectFileService  = new ProjectFileService(Program.fileSystem);
            var solutionFileService = new SolutionFileService(Program.fileSystem);
            var packages            = new HashSet <NugetPackage>();

            // determine what we are analyzing and do the analysis
            var fullSolutionOrProjectFilePath = Program.fileSystem.Path.GetFullPath(SolutionOrProjectFile);
            var attr = Program.fileSystem.File.GetAttributes(fullSolutionOrProjectFilePath);

            if (SolutionOrProjectFile.ToLowerInvariant().EndsWith(".sln", StringComparison.OrdinalIgnoreCase))
            {
                packages = await solutionFileService.GetSolutionNugetPackages(fullSolutionOrProjectFilePath);
            }
            else if (Utils.IsSupportedProjectType(SolutionOrProjectFile) && scanProjectReferences)
            {
                packages = await projectFileService.RecursivelyGetProjectNugetPackagesAsync(fullSolutionOrProjectFilePath);
            }
            else if (Utils.IsSupportedProjectType(SolutionOrProjectFile))
            {
                packages = await projectFileService.GetProjectNugetPackagesAsync(fullSolutionOrProjectFilePath);
            }
            else if (Program.fileSystem.Path.GetFileName(SolutionOrProjectFile).ToLowerInvariant().Equals("packages.config", StringComparison.OrdinalIgnoreCase))
            {
                packages = await packagesFileService.GetNugetPackagesAsync(fullSolutionOrProjectFilePath);
            }
            else if (attr.HasFlag(FileAttributes.Directory))
            {
                packages = await packagesFileService.RecursivelyGetNugetPackagesAsync(fullSolutionOrProjectFilePath);
            }
            else
            {
                Console.Error.WriteLine($"Only .sln, .csproj, .vbproj, and packages.config files are supported");
                return((int)ExitCode.InvalidOptions);
            }

            // get all the components from the NuGet packages
            var components = new HashSet <Component>();

            try
            {
                foreach (var package in packages)
                {
                    var component = await nugetService.GetComponentAsync(package);

                    if (component != null)
                    {
                        components.Add(component);
                    }
                }
            }
            catch (InvalidGitHubApiCredentialsException)
            {
                return((int)ExitCode.InvalidGitHubApiCredentials);
            }
            catch (GitHubApiRateLimitExceededException)
            {
                return((int)ExitCode.GitHubApiRateLimitExceeded);
            }

            // create the BOM
            Console.WriteLine();
            Console.WriteLine("Creating CycloneDX BoM");
            var bomXml = BomService.CreateXmlDocument(components, noSerialNumber);

            // check if the output directory exists and create it if needed
            var bomPath = Program.fileSystem.Path.GetFullPath(outputDirectory);

            if (!Program.fileSystem.Directory.Exists(bomPath))
            {
                Program.fileSystem.Directory.CreateDirectory(bomPath);
            }

            // write the BOM to disk
            var bomFile = Program.fileSystem.Path.Combine(bomPath, "bom.xml");

            Console.WriteLine("Writing to: " + bomFile);
            using (var fileStream = Program.fileSystem.FileStream.Create(bomFile, FileMode.Create))
                using (var writer = new StreamWriter(fileStream, new UTF8Encoding(false))) {
                    bomXml.Save(writer);
                }

            return(0);
        }
        public async Task RecursivelyGetProjectNugetPackages_ReturnsNugetPackages()
        {
            var mockFileSystem = new MockFileSystem(new Dictionary <string, MockFileData>
            {
                { XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"), Helpers.GetProjectFileWithReferences(
                      new string[] {
                        @"..\Project2\Project2.csproj",
                        @"..\Project3\Project3.csproj",
                    },
                      new NugetPackage[] {
                        new NugetPackage {
                            Name = "Package1", Version = "1.2.3"
                        },
                        new NugetPackage {
                            Name = "Package2", Version = "1.2.3"
                        },
                        new NugetPackage {
                            Name = "Package3", Version = "1.2.3"
                        },
                    }) },
                { XFS.Path(@"c:\SolutionPath\Project2\Project2.csproj"), Helpers.GetProjectFileWithReferences(
                      new string[] {
                        @"..\Project3\Project3.csproj",
                    },
                      new NugetPackage[] {
                        new NugetPackage {
                            Name = "Package1", Version = "1.2.4"
                        },
                    }) },
                { XFS.Path(@"c:\SolutionPath\Project3\Project3.csproj"), Helpers.GetProjectFileWithReferences(
                      null,
                      new NugetPackage[] {
                        new NugetPackage {
                            Name = "Package1", Version = "1.2.3"
                        },
                    }) },
            });
            var projectFileService = new ProjectFileService(mockFileSystem);

            var packages = await projectFileService.RecursivelyGetProjectNugetPackagesAsync(XFS.Path(@"c:\SolutionPath\Project1\Project1.csproj"));

            var sortedPackages = new List <NugetPackage>(packages);

            sortedPackages.Sort();

            Assert.Collection(sortedPackages,
                              item => {
                Assert.Equal("Package1", item.Name);
                Assert.Equal("1.2.3", item.Version);
            },
                              item => {
                Assert.Equal("Package1", item.Name);
                Assert.Equal("1.2.4", item.Version);
            },
                              item => {
                Assert.Equal("Package2", item.Name);
                Assert.Equal("1.2.3", item.Version);
            },
                              item => {
                Assert.Equal("Package3", item.Name);
                Assert.Equal("1.2.3", item.Version);
            }
                              );
        }
예제 #24
0
 public ProjectFileServiceTests(ITestOutputHelper outputHelper) : base(outputHelper)
 {
     _projectFileService = new ProjectFileService();
 }
        public void IsTestProjectFalse()
        {
            string szProjectPath = System.Environment.CurrentDirectory + XFS.Path(@"\..\..\..\..\CycloneDX\CycloneDX.csproj");

            Assert.False(ProjectFileService.IsTestProject(szProjectPath));
        }