From 9ec87a2119e5fe7911833fba2e4a7a5dea4c5079 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:39:05 +0100 Subject: [PATCH 01/35] build: drop old Azure Pipelines YAML CI/PR builds --- .azure-pipelines/continuous-integration.yml | 66 ------------------- .azure-pipelines/pull-request.yml | 22 ------- .../templates/windows-build-and-unit-test.yml | 40 ----------- .../templates/windows-functional-test.yml | 28 -------- 4 files changed, 156 deletions(-) delete mode 100644 .azure-pipelines/continuous-integration.yml delete mode 100644 .azure-pipelines/pull-request.yml delete mode 100644 .azure-pipelines/templates/windows-build-and-unit-test.yml delete mode 100644 .azure-pipelines/templates/windows-functional-test.yml diff --git a/.azure-pipelines/continuous-integration.yml b/.azure-pipelines/continuous-integration.yml deleted file mode 100644 index a3f0d5c48b..0000000000 --- a/.azure-pipelines/continuous-integration.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: $(date:yy)$(DayOfYear)$(rev:.r) - -trigger: - - master - - releases/shipped - -variables: - majorAndMinorVersion: '0.5' - revision: '$(Build.BuildNumber)' - -jobs: - - job: Build_Windows - variables: - platformFriendlyName: Windows - strategy: - maxParallel: 2 - matrix: - debug: - configuration: Debug - release: - configuration: Release - pool: - vmImage: vs2017-win2016 - steps: - - template: templates/windows-build-and-unit-test.yml - - - job: Build_macOS - variables: - platformFriendlyName: macOS - strategy: - maxParallel: 2 - matrix: - debug: - configuration: Debug - release: - configuration: Release - pool: - vmImage: macOS 10.13 - steps: - - template: templates/macos-build-and-unit-test.yml - - - job: FunctionalTests_Windows - timeoutInMinutes: 240 - variables: - platformFriendlyName: Windows - configuration: Release - pool: - name: FunctionalTests - dependsOn: Build_Windows - condition: succeeded() - steps: - - checkout: none # We'll get the build drop from Build_Windows job - - template: templates/windows-functional-test.yml - - - job: FunctionalTests_macOS - timeoutInMinutes: 240 - variables: - platformFriendlyName: macOS - configuration: Release - pool: - name: MacFunctionalTests - dependsOn: Build_macOS - condition: succeeded() - steps: - - checkout: none # Use the drop from Build_macOS job - - template: templates/macos-functional-test.yml diff --git a/.azure-pipelines/pull-request.yml b/.azure-pipelines/pull-request.yml deleted file mode 100644 index 719ab58f62..0000000000 --- a/.azure-pipelines/pull-request.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: $(date:yy)$(DayOfYear)$(rev:.r) - -trigger: none - -variables: - majorAndMinorVersion: '0.4' - revision: '$(Build.BuildNumber)' - platform: 'x64' - configuration: release - -jobs: - - job: Windows - pool: - vmImage: vs2017-win2016 - steps: - - template: templates/windows-build-and-unit-test.yml - - - job: macOS - pool: - vmImage: macOS 10.13 - steps: - - template: templates/macos-build-and-unit-test.yml diff --git a/.azure-pipelines/templates/windows-build-and-unit-test.yml b/.azure-pipelines/templates/windows-build-and-unit-test.yml deleted file mode 100644 index 80cfc30b0a..0000000000 --- a/.azure-pipelines/templates/windows-build-and-unit-test.yml +++ /dev/null @@ -1,40 +0,0 @@ -steps: - - - script: $(Build.Repository.LocalPath)\\Scripts\\NukeBuildOutputs.bat - displayName: Delete previous build outputs - continueOnError: true - - - powershell: | - & 'C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exe' -Vr *,31bf3856ad364e35 - & 'C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\sn.exe' -Vr *,31bf3856ad364e35 - displayName: Disable strong name validation for MS delay-signed assemblies - - - script: $(Build.Repository.LocalPath)\Scripts\BuildGVFSForWindows.bat $(configuration) $(majorAndMinorVersion).$(revision) - displayName: Run VFSForGit build script ($(configuration)) - - - script: $(Build.Repository.LocalPath)\MirrorProvider\Scripts\Windows\Build.bat $(configuration) - displayName: Build MirrorProvider ($(configuration)) - - - script: $(Build.Repository.LocalPath)\Scripts\RunUnitTests.bat $(configuration) - displayName: Run unit tests - - - task: PublishTestResults@2 - displayName: Publish unit test results - inputs: - testRunner: NUnit - testResultsFiles: "**\\TestResult.xml" - searchFolder: $(System.DefaultWorkingDirectory) - testRunTitle: Windows $(configuration) Unit Tests - publishRunAttachments: true - - - script: $(Build.Repository.LocalPath)\Scripts\CI\CreateBuildDrop.bat $(configuration) $(Build.ArtifactStagingDirectory)\Tests - displayName: Create functional test drop. - - - task: PublishBuildArtifacts@1 - displayName: Publish functional test drop artifact. - inputs: - pathtoPublish: $(Build.ArtifactStagingDirectory)\Tests - artifactName: "FunctionalTests_$(platformFriendlyName)_$(configuration)" - parallel: true - parallelCount: 8 - condition: succeededOrFailed() diff --git a/.azure-pipelines/templates/windows-functional-test.yml b/.azure-pipelines/templates/windows-functional-test.yml deleted file mode 100644 index e221ddfc67..0000000000 --- a/.azure-pipelines/templates/windows-functional-test.yml +++ /dev/null @@ -1,28 +0,0 @@ -steps: - - - task: DownloadBuildArtifacts@0 - displayName: Download functional test drop - inputs: - buildType: current - downloadType: specific - artifactName: FunctionalTests_$(platformFriendlyName)_$(configuration) - downloadPath: $(Build.BinariesDirectory) - - - script: $(Build.BinariesDirectory)/FunctionalTests_$(platformFriendlyName)_$(configuration)/src/Scripts/ReinstallGVFS.bat $(configuration) - displayName: Run VFSForGit and G4W installers - - - script: git config --global credential.interactive never - displayName: Disable interactive auth - - - script: $(Build.BinariesDirectory)/FunctionalTests_$(platformFriendlyName)_$(configuration)/src/Scripts/RunFunctionalTests.bat $(configuration) --test-gvfs-on-path --replace-inbox-projfs - displayName: Run functional tests - - - task: PublishTestResults@2 - displayName: Publish functional test results - inputs: - testRunner: NUnit - testResultsFiles: "**\\TestResult*.xml" - searchFolder: $(System.DefaultWorkingDirectory) - testRunTitle: Windows $(configuration) Functional Tests - publishRunAttachments: true - condition: succeededOrFailed() From 3aa29b2182b6314acfbadb672422a4a7a793bef0 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:41:47 +0100 Subject: [PATCH 02/35] build: drop all old scripts --- Scripts/BuildGVFSForWindows.bat | 49 ------------- Scripts/CI/CreateBuildDrop.bat | 33 --------- Scripts/CapturePerfView.bat | 114 ------------------------------ Scripts/InitializeEnvironment.bat | 26 ------- Scripts/NukeBuildOutputs.bat | 42 ----------- Scripts/ReinstallGVFS.bat | 33 --------- Scripts/RestorePackages.bat | 19 ----- Scripts/RunFunctionalTests.bat | 50 ------------- Scripts/RunUnitTests.bat | 11 --- Scripts/StopAllServices.bat | 5 -- Scripts/StopService.bat | 2 - Scripts/UninstallGVFS.bat | 28 -------- Scripts/push-all-packages.sh | 9 --- 13 files changed, 421 deletions(-) delete mode 100644 Scripts/BuildGVFSForWindows.bat delete mode 100644 Scripts/CI/CreateBuildDrop.bat delete mode 100644 Scripts/CapturePerfView.bat delete mode 100644 Scripts/InitializeEnvironment.bat delete mode 100644 Scripts/NukeBuildOutputs.bat delete mode 100644 Scripts/ReinstallGVFS.bat delete mode 100644 Scripts/RestorePackages.bat delete mode 100644 Scripts/RunFunctionalTests.bat delete mode 100644 Scripts/RunUnitTests.bat delete mode 100644 Scripts/StopAllServices.bat delete mode 100644 Scripts/StopService.bat delete mode 100644 Scripts/UninstallGVFS.bat delete mode 100644 Scripts/push-all-packages.sh diff --git a/Scripts/BuildGVFSForWindows.bat b/Scripts/BuildGVFSForWindows.bat deleted file mode 100644 index 3e89b56327..0000000000 --- a/Scripts/BuildGVFSForWindows.bat +++ /dev/null @@ -1,49 +0,0 @@ -@if "%_echo%"=="" (echo off) else (echo on) -SETLOCAL -setlocal enabledelayedexpansion -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -IF "%1"=="" (SET "Configuration=Debug") ELSE (SET "Configuration=%1") -IF "%2"=="" (SET "GVFSVersion=0.2.173.2") ELSE (SET "GVFSVersion=%2") - -SET SolutionConfiguration=%Configuration%.Windows - -FOR /F "tokens=* USEBACKQ" %%F IN (`where nuget.exe`) DO ( - SET nuget=%%F - ECHO Found nuget.exe at '%%F' -) - -IF NOT EXIST %nuget% ( - ECHO ERROR: Could not find nuget.exe on the PATH - exit /b 10 -) - -:: Acquire vswhere to find dev15 installations reliably. -SET vswherever=2.6.7 -%nuget% install vswhere -Version %vswherever% || exit /b 1 -SET vswhere=%VFS_PACKAGESDIR%\vswhere.%vswherever%\tools\vswhere.exe - -:: Assumes default installation location for Windows 10 SDKs -IF NOT EXIST "c:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0" ( - echo ERROR: Could not find Windows 10 SDK Version 10240 - exit /b 1 -) - -:: Use vswhere to find the latest VS installation with the msbuild component. -:: See https://github.com/Microsoft/vswhere/wiki/Find-MSBuild -for /f "usebackq tokens=*" %%i in (`%vswhere% -all -prerelease -latest -products * -requires Microsoft.Component.MSBuild Microsoft.VisualStudio.Workload.ManagedDesktop Microsoft.VisualStudio.Workload.NativeDesktop Microsoft.Net.Core.Component.SDK.2.1 -find MSBuild\**\Bin\amd64\MSBuild.exe`) do ( - set msbuild="%%i" -) - -IF NOT DEFINED msbuild ( - echo ERROR: Could not locate a Visual Studio installation with required components. - echo Refer to Readme.md for a list of the required Visual Studio components. - exit /b 10 -) - -dotnet restore %VFS_SRCDIR% - -%msbuild% %VFS_SRCDIR%\GVFS.sln /p:GVFSVersion=%GVFSVersion% /p:Configuration=%SolutionConfiguration% /p:Platform=x64 || exit /b 1 - -dotnet publish %VFS_SRCDIR%\GVFS\FastFetch\FastFetch.csproj /p:Configuration=%Configuration% /p:Platform=x64 /p:SolutionDir=%VFS_SRCDIR%\ --runtime win-x64 --framework netcoreapp2.1 --self-contained --output %VFS_PUBLISHDIR%\FastFetch || exit /b 1 -ENDLOCAL diff --git a/Scripts/CI/CreateBuildDrop.bat b/Scripts/CI/CreateBuildDrop.bat deleted file mode 100644 index 168599ed7f..0000000000 --- a/Scripts/CI/CreateBuildDrop.bat +++ /dev/null @@ -1,33 +0,0 @@ -@ECHO OFF -CALL %~dp0\..\InitializeEnvironment.bat || EXIT /b 10 - -IF "%1"=="" GOTO USAGE -IF "%2"=="" GOTO USAGE - -SETLOCAL enableextensions -SET Configuration=%1 -SET VFS_STAGEDIR=%2 - -REM Prepare the staging directories for functional tests. -IF EXIST %VFS_STAGEDIR% ( - rmdir /s /q %VFS_STAGEDIR% -) -mkdir %VFS_STAGEDIR%\src\Scripts -mkdir %VFS_STAGEDIR%\BuildOutput\GVFS.Build -mkdir %VFS_STAGEDIR%\BuildOutput\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1 -mkdir %VFS_STAGEDIR%\BuildOutput\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\ - -REM Make a minimal 'test' enlistment to pass along our pipeline. -copy %VFS_SRCDIR%\init.cmd %VFS_STAGEDIR%\src\ -copy %VFS_SCRIPTSDIR%\*.* %VFS_STAGEDIR%\src\Scripts\ -copy %VFS_OUTPUTDIR%\GVFS.Build\*.* %VFS_STAGEDIR%\BuildOutput\GVFS.Build -dotnet publish %VFS_SRCDIR%\GVFS\GVFS.FunctionalTests\GVFS.FunctionalTests.csproj -p:StyleCopEnabled=False --self-contained --framework netcoreapp2.1 -r win-x64 -c Release -o %VFS_STAGEDIR%\BuildOutput\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\ -robocopy %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\ %VFS_STAGEDIR%\BuildOutput\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\ /E /XC /XN /XO -copy %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\*.* %VFS_STAGEDIR%\BuildOutput\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\ -GOTO END - -:USAGE -echo "ERROR: Usage: CreateBuildDrop.bat [configuration] [build drop root directory]" -exit 1 - -:END \ No newline at end of file diff --git a/Scripts/CapturePerfView.bat b/Scripts/CapturePerfView.bat deleted file mode 100644 index 1c0af046f5..0000000000 --- a/Scripts/CapturePerfView.bat +++ /dev/null @@ -1,114 +0,0 @@ -@if not defined _echo echo off -setlocal - -set filename=%~n0 -goto :parseargs - -:showhelp -echo. -echo Captures a system wide PerfView while running a command then compresses it into a zip. -echo. -echo USAGE: %filename% command -echo. -echo EXAMPLES: -echo %filename% git status -echo %filename% git fetch -goto :end - -:parseargs -if "%1" == "" goto :showhelp -if /i "%1" == "/?" goto :showhelp -if /i "%1" == "-?" goto :showhelp -if /i "%1" == "/h" goto :showhelp -if /i "%1" == "-h" goto :showhelp -if /i "%1" == "/help" goto :showhelp -if /i "%1" == "-help" goto :showhelp - -:: Find the given command on the path, then look for a .PDB file next to it -:VerifyPDB -set P2=.;%PATH% -for %%e in (%PATHEXT%) do @for %%i in (%~n1%%e) do @if NOT "%%~$P2:i"=="" if NOT exist "%%~dpn$P2:i.pdb" ( - echo Unable to locate PDB file %%~dpn$P2:i.pdb. Aborting %filename% 1>&2 - exit /B 1 -) - -:VerifyPerfView -where /q perfview || ( - echo Please see the PerfView GitHub Download Page to download an up-to-date version 1>&2 - echo of PerfView and copy it to a directory in your path. 1>&2 - echo. 1>&2 - echo https://github.com/Microsoft/perfview/blob/master/documentation/Downloading.md 1>&2 - exit /B 2 -) - -:: Generate output filenames -if NOT "%_NTUSER%" == "" ( - set perfviewfilename=%_NTUSER%-%~n1-%2 -) ELSE ( - if NOT "%USERNAME%" == "" ( - set perfviewfilename=%USERNAME%-%~n1-%2 - ) ELSE ( - set perfviewfilename=%~n1-%2 - ) -) -set perfviewstartlog=%perfviewfilename%.start.log.txt -set perfviewstoplog=%perfviewfilename%.end.log.txt - -:: Capture the perfview without requiring any human intervention -:CapturePerfView -echo Capture perf view for '%*'... -perfview start /AcceptEULA /NoGui /NoNGenRundown /Merge /Zip /Providers:*Microsoft.Git.GVFS:@StacksEnabled=true,*Microsoft.Internal.Git.Plugin:@StacksEnabled=true,*Microsoft.OSGENG.Testing.GitMsWrapper:@StacksEnabled=true /kernelEvents=default+FileIOInit /logfile:"%perfviewstartlog%" "%perfviewfilename%" || goto :HandlePerfViewStartError -echo. -set STARTTIME=%TIME% -%* -set ENDTIME=%TIME% -echo. -CALL :PrintElapsedTime - -:: Merge perfview into ZIP file -echo Merging and compressing perf view... -perfview stop /AcceptEULA /NoGui /NoNGenRundown /Merge /Zip /Providers:*Microsoft.Git.GVFS:@StacksEnabled=true,*Microsoft.Internal.Git.Plugin:@StacksEnabled=true,*Microsoft.OSGENG.Testing.GitMsWrapper:@StacksEnabled=true /kernelEvents=default+FileIOInit /logfile:"%perfviewstoplog%" || goto :HandlePerfViewStopError -CALL :CheckForFile -echo PerfView trace can be found in "%perfviewfilename%.etl.zip" -goto :end - -:HandlePerfViewStartError -echo Could not start perfview, please see %perfviewstartlog% for details. -EXIT /B 3 - -:HandlePerfViewStopError -echo Could not stop perfview, please see %perfviewstoplog% for details. -EXIT /B 4 - -:: Now wait for perfview to complete writing out the file -:CheckForFile -IF EXIST "%perfviewfilename%.etl.zip" EXIT /B 0 -TIMEOUT /T 1 >nul -goto :CheckForFile - -:PrintElapsedTime -:: Change formatting for the start and end times -for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do ( - set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" -) - -for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do ( - set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" -) - -:: Calculate the elapsed time by subtracting values -set /A elapsed=end-start - -:: Format the results for output -set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100 -if %hh% lss 10 set hh=0%hh% -if %mm% lss 10 set mm=0%mm% -if %ss% lss 10 set ss=0%ss% -if %cc% lss 10 set cc=0%cc% - -set DURATION=%hh%:%mm%:%ss%.%cc% -echo Command duration : %DURATION% -EXIT /B 0 - -:end -endlocal diff --git a/Scripts/InitializeEnvironment.bat b/Scripts/InitializeEnvironment.bat deleted file mode 100644 index faf4db72a9..0000000000 --- a/Scripts/InitializeEnvironment.bat +++ /dev/null @@ -1,26 +0,0 @@ -@if "%_echo%"=="" (echo off) else (echo on) - -REM Set environment variables for interesting paths that scripts might need access to. -PUSHD %~dp0 -SET VFS_SCRIPTSDIR=%CD% -POPD - -CALL :RESOLVEPATH "%VFS_SCRIPTSDIR%\.." -SET VFS_SRCDIR=%_PARSED_PATH_% - -CALL :RESOLVEPATH "%VFS_SRCDIR%\.." -SET VFS_ENLISTMENTDIR=%_PARSED_PATH_% - -SET VFS_OUTPUTDIR=%VFS_ENLISTMENTDIR%\BuildOutput -SET VFS_PACKAGESDIR=%VFS_ENLISTMENTDIR%\packages -SET VFS_PUBLISHDIR=%VFS_ENLISTMENTDIR%\Publish -SET VFS_TOOLSDIR=%VFS_ENLISTMENTDIR%\.tools - -REM Clean up -SET _PARSED_PATH_= - -GOTO :EOF - -:RESOLVEPATH -SET "_PARSED_PATH_=%~f1" -GOTO :EOF diff --git a/Scripts/NukeBuildOutputs.bat b/Scripts/NukeBuildOutputs.bat deleted file mode 100644 index f0eca0ac9f..0000000000 --- a/Scripts/NukeBuildOutputs.bat +++ /dev/null @@ -1,42 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -taskkill /f /im GVFS.Mount.exe 2>&1 -verify >nul - -powershell -NonInteractive -NoProfile -Command "& { (Get-MpPreference).ExclusionPath | ? {$_.StartsWith('C:\Repos\')} | %%{Remove-MpPreference -ExclusionPath $_} }" - -IF EXIST C:\Repos\GVFSFunctionalTests\enlistment ( - rmdir /s /q C:\Repos\GVFSFunctionalTests\enlistment -) ELSE ( - ECHO no test enlistment found -) - -IF EXIST C:\Repos\GVFSPerfTest ( - rmdir /s /q C:\Repos\GVFSPerfTest -) ELSE ( - ECHO no perf test enlistment found -) - -IF EXIST %VFS_OUTPUTDIR% ( - ECHO deleting build outputs - rmdir /s /q %VFS_OUTPUTDIR% -) ELSE ( - ECHO no build outputs found -) - -IF EXIST %VFS_PUBLISHDIR% ( - ECHO deleting published output - rmdir /s /q %VFS_PUBLISHDIR% -) ELSE ( - ECHO no packages found -) - -IF EXIST %VFS_PACKAGESDIR% ( - ECHO deleting packages - rmdir /s /q %VFS_PACKAGESDIR% -) ELSE ( - ECHO no packages found -) - -call %VFS_SCRIPTSDIR%\StopAllServices.bat diff --git a/Scripts/ReinstallGVFS.bat b/Scripts/ReinstallGVFS.bat deleted file mode 100644 index 29fb026a1a..0000000000 --- a/Scripts/ReinstallGVFS.bat +++ /dev/null @@ -1,33 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -IF "%1"=="" (SET "Configuration=Debug") ELSE (SET "Configuration=%1") - -REM Passing the remove prjflt flag to the uninstall script -call %VFS_SCRIPTSDIR%\UninstallGVFS.bat "%2" - -if not exist "c:\Program Files\Git" goto :noGit -for /F "delims=" %%g in ('dir "c:\Program Files\Git\unins*.exe" /B /S /O:-D') do %%g /VERYSILENT /SUPPRESSMSGBOXES /NORESTART & goto :deleteGit - -:deleteGit -rmdir /q/s "c:\Program Files\Git" - -:noGit -REM This is a hacky way to sleep for 2 seconds in a non-interactive window. The timeout command does not work if it can't redirect stdin. -ping 1.1.1.1 -n 1 -w 2000 >NUL - -call %VFS_SCRIPTSDIR%\StopService.bat gvflt -call %VFS_SCRIPTSDIR%\StopService.bat prjflt - -if not exist c:\Windows\System32\drivers\gvflt.sys goto :removePrjFlt -del c:\Windows\System32\drivers\gvflt.sys - -:removePrjFlt -if not "%2"=="--remove-prjflt" goto :runInstallers -if not exist c:\Windows\System32\drivers\PrjFlt.sys goto :runInstallers -sc delete prjflt -verify >nul -del c:\Windows\System32\drivers\PrjFlt.sys - -:runInstallers -call %VFS_OUTPUTDIR%\GVFS.Build\InstallProduct.bat diff --git a/Scripts/RestorePackages.bat b/Scripts/RestorePackages.bat deleted file mode 100644 index 653182076b..0000000000 --- a/Scripts/RestorePackages.bat +++ /dev/null @@ -1,19 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -SETLOCAL - -IF "%1"=="" (SET "Configuration=Debug") ELSE (SET "Configuration=%1") - -SET SolutionConfiguration=%Configuration%.Windows - -FOR /F "tokens=* USEBACKQ" %%F IN (`where nuget.exe`) DO ( - SET nuget=%%F - ECHO Found nuget.exe at '%%F' -) - -dotnet restore %VFS_SRCDIR%\GVFS.sln /p:Configuration=%SolutionConfiguration% /p:VCTargetsPath="C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140" --packages %VFS_PACKAGESDIR% || exit /b 1 - -%nuget% restore %VFS_SRCDIR%\GVFS.sln || exit /b 1 - -ENDLOCAL \ No newline at end of file diff --git a/Scripts/RunFunctionalTests.bat b/Scripts/RunFunctionalTests.bat deleted file mode 100644 index aa858d3b9a..0000000000 --- a/Scripts/RunFunctionalTests.bat +++ /dev/null @@ -1,50 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -IF "%1"=="" (SET "Configuration=Debug") ELSE (SET "Configuration=%1") - -SETLOCAL -SET PATH=C:\Program Files\GVFS;C:\Program Files\Git\cmd;%PATH% - -if not "%2"=="--test-gvfs-on-path" goto :startFunctionalTests - -REM Force GVFS.FunctionalTests.exe to use the installed version of GVFS -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GitHooksLoader.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.Hooks.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.ReadObjectHook.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.VirtualFileSystemHook.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.PostIndexChangedHook.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.Mount.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.Service.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.Service.UI.exe - -REM Same for GVFS.FunctionalTests.Windows.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GitHooksLoader.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.Hooks.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.ReadObjectHook.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.VirtualFileSystemHook.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.PostIndexChangedHook.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.Mount.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.Service.exe -del %VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.Service.UI.exe - -echo PATH = %PATH% -echo gvfs location: -where gvfs -echo GVFS.Service location: -where GVFS.Service -echo git location: -where git - -:startFunctionalTests -dotnet %VFS_OUTPUTDIR%\GVFS.FunctionalTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.FunctionalTests.dll /result:TestResultNetCore.xml %2 %3 %4 %5 || goto :endFunctionalTests -%VFS_OUTPUTDIR%\GVFS.FunctionalTests.Windows\bin\x64\%Configuration%\GVFS.FunctionalTests.Windows.exe /result:TestResultNetFramework.xml --windows-only %2 %3 %4 %5 || goto :endFunctionalTests - -:endFunctionalTests -set error=%errorlevel% - -call %VFS_SCRIPTSDIR%\StopAllServices.bat - -exit /b %error% \ No newline at end of file diff --git a/Scripts/RunUnitTests.bat b/Scripts/RunUnitTests.bat deleted file mode 100644 index 3e9af434d6..0000000000 --- a/Scripts/RunUnitTests.bat +++ /dev/null @@ -1,11 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -IF "%1"=="" (SET "Configuration=Debug") ELSE (SET "Configuration=%1") - -set RESULT=0 - -%VFS_OUTPUTDIR%\GVFS.UnitTests.Windows\bin\x64\%Configuration%\GVFS.UnitTests.Windows.exe || set RESULT=1 -dotnet %VFS_OUTPUTDIR%\GVFS.UnitTests\bin\x64\%Configuration%\netcoreapp2.1\GVFS.UnitTests.dll || set RESULT=1 - -exit /b %RESULT% \ No newline at end of file diff --git a/Scripts/StopAllServices.bat b/Scripts/StopAllServices.bat deleted file mode 100644 index 7aed517dbb..0000000000 --- a/Scripts/StopAllServices.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -call %VFS_SCRIPTSDIR%\StopService.bat GVFS.Service -call %VFS_SCRIPTSDIR%\StopService.bat Test.GVFS.Service diff --git a/Scripts/StopService.bat b/Scripts/StopService.bat deleted file mode 100644 index e380f0e250..0000000000 --- a/Scripts/StopService.bat +++ /dev/null @@ -1,2 +0,0 @@ -sc stop %1 -verify >nul diff --git a/Scripts/UninstallGVFS.bat b/Scripts/UninstallGVFS.bat deleted file mode 100644 index 66538f16ce..0000000000 --- a/Scripts/UninstallGVFS.bat +++ /dev/null @@ -1,28 +0,0 @@ -@ECHO OFF -CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 - -taskkill /F /T /FI "IMAGENAME eq git.exe" -taskkill /F /T /FI "IMAGENAME eq GVFS.exe" -taskkill /F /T /FI "IMAGENAME eq GVFS.Mount.exe" - -if not exist "c:\Program Files\GVFS" goto :end - -call %VFS_SCRIPTSDIR%\StopAllServices.bat - -if not "%2"=="--remove-prjflt" goto :uninstallGVFS -REM The GVFS uninstaller will not remove prjflt, and so we must remove it ourselves first. If we don't, the non-inbox ProjFS -REM will cause problems next time the inbox ProjFS is enabled -call %VFS_SCRIPTSDIR%\StopService.bat prjflt -rundll32.exe SETUPAPI.DLL,InstallHinfSection DefaultUninstall 128 C:\Program Files\GVFS\Filter\prjflt.inf - -:uninstallGVFS -REM Find the latest uninstaller file by date and run it. Goto the next step after a single execution. -for /F "delims=" %%f in ('dir "c:\Program Files\GVFS\unins*.exe" /B /S /O:-D') do %%f /VERYSILENT /SUPPRESSMSGBOXES /NORESTART & goto :deleteGVFS - -:deleteGVFS -rmdir /q/s "c:\Program Files\GVFS" - -REM Delete ProgramData\GVFS directory (logs, downloaded upgrades, repo-registry, gvfs.config). It can affect the behavior of a future GVFS install. -if exist "C:\ProgramData\GVFS" rmdir /q/s "C:\ProgramData\GVFS" - -:end diff --git a/Scripts/push-all-packages.sh b/Scripts/push-all-packages.sh deleted file mode 100644 index 635314f39b..0000000000 --- a/Scripts/push-all-packages.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Run this script from the repo root (in Git Bash) to -# push all local packages to the custom package repository. - -for pkg in $(find /c/Users/dstolee/.nuget/packages -type f -name '*.nupkg') -do - nuget push -Source "Dependencies" -SkipDuplicate -ApiKey az "$pkg" -done From bfc909d05627f298bb738617a57170bbe5ce4e05 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:43:45 +0100 Subject: [PATCH 03/35] GitHooksLoader: move under GVFS dir and migrate proj Move the GitHooksLoader under the GVFS directory and migrate the project file to v142 toolset (VS2019) and WinSDK10.0.16299. Also migrate project to use new MSBuild properties for the VSF for Git project. --- .../GitHooksLoader}/GitHooksLoader.cpp | 0 .../GitHooksLoader}/GitHooksLoader.vcxproj | 23 +++++++++--------- .../GitHooksLoader.vcxproj.filters | 0 .../GitHooksLoader}/Version.rc | Bin .../GitHooksLoader}/resource.h | Bin .../GitHooksLoader}/stdafx.cpp | 0 .../GitHooksLoader}/stdafx.h | 0 .../GitHooksLoader}/targetver.h | 0 8 files changed, 11 insertions(+), 12 deletions(-) rename {GitHooksLoader => GVFS/GitHooksLoader}/GitHooksLoader.cpp (100%) rename {GitHooksLoader => GVFS/GitHooksLoader}/GitHooksLoader.vcxproj (83%) rename {GitHooksLoader => GVFS/GitHooksLoader}/GitHooksLoader.vcxproj.filters (100%) rename {GitHooksLoader => GVFS/GitHooksLoader}/Version.rc (100%) rename {GitHooksLoader => GVFS/GitHooksLoader}/resource.h (100%) rename {GitHooksLoader => GVFS/GitHooksLoader}/stdafx.cpp (100%) rename {GitHooksLoader => GVFS/GitHooksLoader}/stdafx.h (100%) rename {GitHooksLoader => GVFS/GitHooksLoader}/targetver.h (100%) diff --git a/GitHooksLoader/GitHooksLoader.cpp b/GVFS/GitHooksLoader/GitHooksLoader.cpp similarity index 100% rename from GitHooksLoader/GitHooksLoader.cpp rename to GVFS/GitHooksLoader/GitHooksLoader.cpp diff --git a/GitHooksLoader/GitHooksLoader.vcxproj b/GVFS/GitHooksLoader/GitHooksLoader.vcxproj similarity index 83% rename from GitHooksLoader/GitHooksLoader.vcxproj rename to GVFS/GitHooksLoader/GitHooksLoader.vcxproj index dd251f6843..78a51bf7f8 100644 --- a/GitHooksLoader/GitHooksLoader.vcxproj +++ b/GVFS/GitHooksLoader/GitHooksLoader.vcxproj @@ -14,20 +14,19 @@ {798DE293-6EDA-4DC4-9395-BE7A71C563E3} Win32Proj GitHooksLoader - 10.0.10240.0 + 10.0.16299.0 - Application true - v141 + v142 Unicode Application false - v141 + v142 true Unicode @@ -57,19 +56,19 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;%(AdditionalIncludeDirectories) MultiThreadedDebug Console true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) @@ -82,7 +81,7 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;%(AdditionalIncludeDirectories) MultiThreaded @@ -90,13 +89,13 @@ true true true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) diff --git a/GitHooksLoader/GitHooksLoader.vcxproj.filters b/GVFS/GitHooksLoader/GitHooksLoader.vcxproj.filters similarity index 100% rename from GitHooksLoader/GitHooksLoader.vcxproj.filters rename to GVFS/GitHooksLoader/GitHooksLoader.vcxproj.filters diff --git a/GitHooksLoader/Version.rc b/GVFS/GitHooksLoader/Version.rc similarity index 100% rename from GitHooksLoader/Version.rc rename to GVFS/GitHooksLoader/Version.rc diff --git a/GitHooksLoader/resource.h b/GVFS/GitHooksLoader/resource.h similarity index 100% rename from GitHooksLoader/resource.h rename to GVFS/GitHooksLoader/resource.h diff --git a/GitHooksLoader/stdafx.cpp b/GVFS/GitHooksLoader/stdafx.cpp similarity index 100% rename from GitHooksLoader/stdafx.cpp rename to GVFS/GitHooksLoader/stdafx.cpp diff --git a/GitHooksLoader/stdafx.h b/GVFS/GitHooksLoader/stdafx.h similarity index 100% rename from GitHooksLoader/stdafx.h rename to GVFS/GitHooksLoader/stdafx.h diff --git a/GitHooksLoader/targetver.h b/GVFS/GitHooksLoader/targetver.h similarity index 100% rename from GitHooksLoader/targetver.h rename to GVFS/GitHooksLoader/targetver.h From 0ce4d9e8c11d3c43933eaa8b9c6fa4d9d4234a60 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:45:23 +0100 Subject: [PATCH 04/35] build: drop old targets/props and add new ones Drop the older custom targets and props files for the new ones. --- Directory.Build.props | 39 ++++++++++++++++++++++++ Directory.Build.targets | 11 +++++++ Directory.Solution.props | 6 ++++ GVFS/Directory.Build.props | 9 ------ GVFS/LibGit2Sharp.NativeBinaries.props | 17 ----------- GVFS/ProjectedFSLib.NativeBinaries.props | 9 ------ Version.props | 25 +++++++++++++++ global.json | 6 ++++ nuget.config | 14 ++++----- 9 files changed, 93 insertions(+), 43 deletions(-) create mode 100644 Directory.Build.props create mode 100644 Directory.Build.targets create mode 100644 Directory.Solution.props delete mode 100644 GVFS/Directory.Build.props delete mode 100644 GVFS/LibGit2Sharp.NativeBinaries.props delete mode 100644 GVFS/ProjectedFSLib.NativeBinaries.props create mode 100644 Version.props create mode 100644 global.json diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000000..61e42400d6 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,39 @@ + + + + + + + + $(MSBuildThisFileDirectory) + $(RepoPath) + $(RepoPath)..\out\ + $(RepoOutPath)$(MSBuildProjectName)\ + $(RepoPath)..\packages\ + + + true + + + + + win-x64 + x64 + $(ProjectOutPath)bin\ + $(ProjectOutPath)obj\ + + + + + x64 + $(ProjectOutPath)bin\$(Platform)\$(Configuration)\ + $(ProjectOutPath)intermediate\$(Platform)\$(Configuration)\ + $(IntDir)include\ + + + diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000000..94263857eb --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,11 @@ + + + + + $(GVFSVersion) + + + + + + diff --git a/Directory.Solution.props b/Directory.Solution.props new file mode 100644 index 0000000000..6ec70d7ef3 --- /dev/null +++ b/Directory.Solution.props @@ -0,0 +1,6 @@ + + + + + + diff --git a/GVFS/Directory.Build.props b/GVFS/Directory.Build.props deleted file mode 100644 index 42fff15fbd..0000000000 --- a/GVFS/Directory.Build.props +++ /dev/null @@ -1,9 +0,0 @@ - - - - - $(MSBuildThisFileDirectory)\..\..\BuildOutput\$(MSBuildProjectName)\obj - - \ No newline at end of file diff --git a/GVFS/LibGit2Sharp.NativeBinaries.props b/GVFS/LibGit2Sharp.NativeBinaries.props deleted file mode 100644 index caa67d3538..0000000000 --- a/GVFS/LibGit2Sharp.NativeBinaries.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - - git2.dll - PreserveNewest - - - git2.so - PreserveNewest - - - git2.dylib - PreserveNewest - - - diff --git a/GVFS/ProjectedFSLib.NativeBinaries.props b/GVFS/ProjectedFSLib.NativeBinaries.props deleted file mode 100644 index 0d585bd3de..0000000000 --- a/GVFS/ProjectedFSLib.NativeBinaries.props +++ /dev/null @@ -1,9 +0,0 @@ - - - - - ProjectedFSLib.dll - PreserveNewest - - - diff --git a/Version.props b/Version.props new file mode 100644 index 0000000000..547f704f3e --- /dev/null +++ b/Version.props @@ -0,0 +1,25 @@ + + + + + 0.2.173.2 + + + 2.20210322.1 + v2.31.0.vfs.0.1 + + + diff --git a/global.json b/global.json new file mode 100644 index 0000000000..f7ef5e1e9e --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "msbuild-sdks": { + "Microsoft.Build.Traversal": "2.0.19", + "Microsoft.Build.NoTargets": "1.0.85" + } +} diff --git a/nuget.config b/nuget.config index fd92d2c47a..a8ec2d485a 100644 --- a/nuget.config +++ b/nuget.config @@ -1,16 +1,14 @@ - + - + - - - - - - + + + + From 7004ac7b896400a15c5b2f3b01a2784f38b6f33a Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:47:11 +0100 Subject: [PATCH 05/35] build: drop more Mac/POSIX code --- GVFS/FastFetch/NativeUnixMethods.cs | 153 ----- .../HooksPlatform/GVFSHooksPlatform.Mac.cs | 32 - .../HooksPlatform/GVFSHooksPlatform.POSIX.cs | 27 - GVFS/GVFS.NativeHooks.Common/common.posix.cpp | 194 ------ .../IPC/VFSForGitNotification.h | 30 - .../IPC/VFSForGitNotification.m | 280 --------- .../StatusMenuItem/IPC/VFSMessageListener.h | 19 - .../StatusMenuItem/IPC/VFSMessageListener.m | 163 ----- .../StatusMenuItem/IPC/VFSMessageParser.h | 13 - .../StatusMenuItem/IPC/VFSMessageParser.m | 63 -- .../VFSForGit.Mac/StatusMenuItem/Info.plist | 38 -- .../UI/Assets.xcassets/Contents.json | 6 - .../StatusItem.imageset/Contents.json | 23 - .../StatusItem.imageset/VFSForGit_16.png | Bin 1171 -> 0 bytes .../StatusItem.imageset/VFSForGit_32.png | Bin 2194 -> 0 bytes .../StatusItem.imageset/VFSForGit_64.png | Bin 4509 -> 0 bytes .../VFS For Git.appiconset/Contents.json | 68 -- .../VFS For Git.appiconset/VFSForGit_1024.png | Bin 321940 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_128.png | Bin 10491 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_16.png | Bin 1171 -> 0 bytes .../VFSForGit_256-1.png | Bin 32137 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_256.png | Bin 32137 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_32-1.png | Bin 2194 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_32.png | Bin 2194 -> 0 bytes .../VFSForGit_512-1.png | Bin 104776 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_512.png | Bin 104776 -> 0 bytes .../VFS For Git.appiconset/VFSForGit_64.png | Bin 4509 -> 0 bytes .../StatusMenuItem/UI/Base.lproj/MainMenu.xib | 59 -- .../UI/VFSAboutWindowController.h | 11 - .../UI/VFSAboutWindowController.m | 55 -- .../UI/VFSAboutWindowController.xib | 98 --- .../StatusMenuItem/UI/VFSAppDelegate.h | 6 - .../StatusMenuItem/UI/VFSAppDelegate.m | 73 --- .../UI/VFSNotificationDisplay.h | 9 - .../UI/VFSNotificationDisplay.m | 70 --- .../StatusMenuItem/UI/VFSStatusBarItem.h | 10 - .../StatusMenuItem/UI/VFSStatusBarItem.m | 97 --- .../Utilities/VFSCommandRunner.h | 11 - .../Utilities/VFSCommandRunner.m | 25 - .../Utilities/VFSNotificationErrors.h | 18 - .../Utilities/VFSNotificationErrors.m | 3 - .../Utilities/VFSProcessRunner.h | 17 - .../Utilities/VFSProcessRunner.m | 82 --- .../Utilities/VFSProductInfoFetcher.h | 16 - .../Utilities/VFSProductInfoFetcher.m | 61 -- .../StatusMenuItem/VFSForGit.entitlements | 10 - .../VFSForGit.Mac/StatusMenuItem/main.m | 6 - .../VFSForGit.UnitTests/Info.plist | 22 - .../Mocks/VFSMockAboutWindowController.h | 8 - .../Mocks/VFSMockAboutWindowController.m | 23 - .../Mocks/VFSMockNotificationCenter.h | 7 - .../Mocks/VFSMockNotificationCenter.m | 31 - .../Mocks/VFSMockProductInfoFetcher.h | 13 - .../Mocks/VFSMockProductInfoFetcher.m | 39 -- .../VFSAboutWindowControllerTests.m | 47 -- .../VFSForGitNotificationTests.m | 93 --- .../VFSMessageParserTests.m | 115 ---- .../VFSStatusBarItemTests.m | 56 -- .../VFSForGit.xcodeproj/project.pbxproj | 595 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../org.vfsforgit.usernotification.plist | 38 -- .../GVFS.Platform.POSIX.csproj | 31 - .../POSIXFileSystem.Shared.cs | 13 - GVFS/GVFS.Platform.POSIX/POSIXFileSystem.cs | 108 ---- .../POSIXGitInstallation.cs | 32 - .../POSIXPlatform.Shared.cs | 66 -- GVFS/GVFS.Platform.POSIX/POSIXPlatform.cs | 302 --------- .../GVFS.PlatformLoader/PlatformLoader.Mac.cs | 21 - .../project.pbxproj | 280 --------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../project.pbxproj | 286 --------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - GVFS/GVFS.Service/GVFSMountProcess.Mac.cs | 87 --- GVFS/GVFS.Service/GVFSService.Mac.cs | 109 ---- .../Handlers/NotificationHandler.Mac.cs | 45 -- .../Mac/org.vfsforgit.service.plist | 38 -- GVFS/GVFS.Service/Program.Mac.cs | 67 -- GVFS/GVFS.Upgrader/MacUpgradeOrchestrator.cs | 17 - .../project.pbxproj | 280 --------- .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - 84 files changed, 4775 deletions(-) delete mode 100644 GVFS/FastFetch/NativeUnixMethods.cs delete mode 100644 GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Mac.cs delete mode 100644 GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.POSIX.cs delete mode 100644 GVFS/GVFS.NativeHooks.Common/common.posix.cpp delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Info.plist delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/Contents.json delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/Contents.json delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_16.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_32.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_64.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/Contents.json delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_1024.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_128.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_16.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_256-1.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_256.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_32-1.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_32.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_512-1.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_512.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_64.png delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Base.lproj/MainMenu.xib delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.xib delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/VFSForGit.entitlements delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/main.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Info.plist delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.h delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSAboutWindowControllerTests.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSForGitNotificationTests.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSMessageParserTests.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSStatusBarItemTests.m delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.pbxproj delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 GVFS/GVFS.Notifications/VFSForGit.Mac/org.vfsforgit.usernotification.plist delete mode 100644 GVFS/GVFS.Platform.POSIX/GVFS.Platform.POSIX.csproj delete mode 100644 GVFS/GVFS.Platform.POSIX/POSIXFileSystem.Shared.cs delete mode 100644 GVFS/GVFS.Platform.POSIX/POSIXFileSystem.cs delete mode 100644 GVFS/GVFS.Platform.POSIX/POSIXGitInstallation.cs delete mode 100644 GVFS/GVFS.Platform.POSIX/POSIXPlatform.Shared.cs delete mode 100644 GVFS/GVFS.Platform.POSIX/POSIXPlatform.cs delete mode 100644 GVFS/GVFS.PlatformLoader/PlatformLoader.Mac.cs delete mode 100644 GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.pbxproj delete mode 100644 GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.pbxproj delete mode 100644 GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 GVFS/GVFS.Service/GVFSMountProcess.Mac.cs delete mode 100644 GVFS/GVFS.Service/GVFSService.Mac.cs delete mode 100644 GVFS/GVFS.Service/Handlers/NotificationHandler.Mac.cs delete mode 100644 GVFS/GVFS.Service/Mac/org.vfsforgit.service.plist delete mode 100644 GVFS/GVFS.Service/Program.Mac.cs delete mode 100644 GVFS/GVFS.Upgrader/MacUpgradeOrchestrator.cs delete mode 100644 GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.pbxproj delete mode 100644 GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/GVFS/FastFetch/NativeUnixMethods.cs b/GVFS/FastFetch/NativeUnixMethods.cs deleted file mode 100644 index 1cf33db32e..0000000000 --- a/GVFS/FastFetch/NativeUnixMethods.cs +++ /dev/null @@ -1,153 +0,0 @@ -using GVFS.Common.Tracing; -using System; -using System.ComponentModel; -using System.IO.MemoryMappedFiles; -using System.Runtime.InteropServices; - -namespace FastFetch -{ - public class NativeUnixMethods - { - public const int ReadOnly = 0x0000; - public const int WriteOnly = 0x0001; - - public const int Create = 0x0200; - public const int Truncate = 0x0400; - private const int InvalidFileDescriptor = -1; - private const ushort SymLinkMode = 0xA000; - - public static unsafe void WriteFile(ITracer tracer, byte* originalData, long originalSize, string destination, ushort mode) - { - int fileDescriptor = InvalidFileDescriptor; - try - { - if (mode == SymLinkMode) - { - string linkTarget = Marshal.PtrToStringUTF8(new IntPtr(originalData)); - int result = CreateSymLink(linkTarget, destination); - if (result == -1) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), $"Failed to create symlink({linkTarget}, {destination})."); - } - } - else - { - fileDescriptor = Open(destination, WriteOnly | Create | Truncate, mode); - if (fileDescriptor == InvalidFileDescriptor) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), $"Failed to open({destination}.)"); - } - - IntPtr result = Write(fileDescriptor, originalData, (IntPtr)originalSize); - if (result.ToInt32() == -1) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), $"Failed to write contents into {destination}."); - } - } - } - catch (Win32Exception e) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("filemode", mode); - metadata.Add("destination", destination); - metadata.Add("exception", e.ToString()); - tracer.RelatedError(metadata, $"Failed to properly create {destination}"); - throw; - } - finally - { - Close(fileDescriptor); - } - } - - public static bool TryStatFileAndUpdateIndex(ITracer tracer, string path, MemoryMappedViewAccessor indexView, long offset) - { - try - { - NativeStat.StatBuffer st = StatFile(path); - Index.IndexEntry indexEntry = new Index.IndexEntry(indexView, offset); - indexEntry.MtimeSeconds = (uint)st.MTimespec.Sec; - indexEntry.MtimeNanosecondFraction = (uint)st.MTimespec.Nsec; - indexEntry.CtimeSeconds = (uint)st.CTimespec.Sec; - indexEntry.CtimeNanosecondFraction = (uint)st.CTimespec.Nsec; - indexEntry.Size = (uint)st.Size; - indexEntry.Dev = (uint)st.Dev; - indexEntry.Ino = (uint)st.Ino; - indexEntry.Uid = st.UID; - indexEntry.Gid = st.GID; - return true; - } - catch (Win32Exception e) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("path", path); - metadata.Add("exception", e.ToString()); - tracer.RelatedError(metadata, "Error stat-ing file."); - return false; - } - } - - [DllImport("libc", EntryPoint = "open", SetLastError = true)] - public static extern int Open(string path, int flag, ushort creationMode); - - [DllImport("libc", EntryPoint = "close", SetLastError = true)] - public static extern int Close(int fd); - - [DllImport("libc", EntryPoint = "write", SetLastError = true)] - private static unsafe extern IntPtr Write(int fileDescriptor, void* buf, IntPtr count); - - [DllImport("libc", EntryPoint = "symlink", SetLastError = true)] - private static extern int CreateSymLink(string linkTarget, string newLinkPath); - - private static NativeStat.StatBuffer StatFile(string fileName) - { - NativeStat.StatBuffer statBuffer = new NativeStat.StatBuffer(); - if (NativeStat.Stat(fileName, out statBuffer) != 0) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), $"Failed to stat {fileName}"); - } - - return statBuffer; - } - - private static class NativeStat - { - [DllImport("libc", EntryPoint = "stat$INODE64", SetLastError = true)] - public static extern int Stat(string path, [Out] out StatBuffer statBuffer); - - [StructLayout(LayoutKind.Sequential)] - public struct TimeSpec - { - public long Sec; - public long Nsec; - } - - [StructLayout(LayoutKind.Sequential)] - public struct StatBuffer - { - public int Dev; /* ID of device containing file */ - public ushort Mode; /* Mode of file (see below) */ - public ushort NLink; /* Number of hard links */ - public ulong Ino; /* File serial number */ - public uint UID; /* User ID of the file */ - public uint GID; /* Group ID of the file */ - public int RDev; /* Device ID */ - - public TimeSpec ATimespec; /* time of last access */ - public TimeSpec MTimespec; /* time of last data modification */ - public TimeSpec CTimespec; /* time of last status change */ - public TimeSpec BirthTimespec; /* time of file creation(birth) */ - - public long Size; /* file size, in bytes */ - public long Blocks; /* blocks allocated for file */ - public int BlkSize; /* optimal blocksize for I/O */ - public uint Glags; /* user defined flags for file */ - public uint Gen; /* file generation number */ - public int LSpare; /* RESERVED: DO NOT USE! */ - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] - public long[] QSpare; /* RESERVED: DO NOT USE! */ - } - } - } -} diff --git a/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Mac.cs b/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Mac.cs deleted file mode 100644 index 589ae46983..0000000000 --- a/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Mac.cs +++ /dev/null @@ -1,32 +0,0 @@ -using GVFS.Platform.Mac; - -namespace GVFS.Hooks.HooksPlatform -{ - public static partial class GVFSHooksPlatform - { - public static string GetUpgradeHighestAvailableVersionDirectory() - { - return MacPlatform.GetUpgradeHighestAvailableVersionDirectoryImplementation(); - } - - public static bool TryGetGVFSEnlistmentRoot(string directory, out string enlistmentRoot, out string errorMessage) - { - return MacPlatform.TryGetGVFSEnlistmentRootImplementation(directory, out enlistmentRoot, out errorMessage); - } - - public static string GetNamedPipeName(string enlistmentRoot) - { - return MacPlatform.GetNamedPipeNameImplementation(enlistmentRoot); - } - - public static string GetGitGuiBlockedMessage() - { - return "git gui is not supported in VFS for Git repos on Mac"; - } - - public static string GetUpgradeReminderNotification() - { - return MacPlatform.GetUpgradeReminderNotificationImplementation(); - } - } -} diff --git a/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.POSIX.cs b/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.POSIX.cs deleted file mode 100644 index 99f7eedcc5..0000000000 --- a/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.POSIX.cs +++ /dev/null @@ -1,27 +0,0 @@ -using GVFS.Platform.POSIX; - -namespace GVFS.Hooks.HooksPlatform -{ - public static partial class GVFSHooksPlatform - { - public static bool IsElevated() - { - return POSIXPlatform.IsElevatedImplementation(); - } - - public static bool IsProcessActive(int processId) - { - return POSIXPlatform.IsProcessActiveImplementation(processId); - } - - public static bool IsConsoleOutputRedirectedToFile() - { - return POSIXPlatform.IsConsoleOutputRedirectedToFileImplementation(); - } - - public static bool TryGetNormalizedPath(string path, out string normalizedPath, out string errorMessage) - { - return POSIXFileSystem.TryGetNormalizedPathImplementation(path, out normalizedPath, out errorMessage); - } - } -} diff --git a/GVFS/GVFS.NativeHooks.Common/common.posix.cpp b/GVFS/GVFS.NativeHooks.Common/common.posix.cpp deleted file mode 100644 index 7e982aadd2..0000000000 --- a/GVFS/GVFS.NativeHooks.Common/common.posix.cpp +++ /dev/null @@ -1,194 +0,0 @@ -#include "stdafx.h" - -#include -#include -#include -#include -#include -#include - -#include "common.h" - -#define MAX_PATH 260 - -PATH_STRING GetFinalPathName(const PATH_STRING& path) -{ - // TODO(#1358): Implement - return path; -} - -PATH_STRING GetGVFSPipeName(const char *appName) -{ - // The pipe name is built using the path of the GVFS enlistment root. - // Start in the current directory and walk up the directory tree - // until we find a folder that contains the ".gvfs" folder - - // TODO 640838: Support paths longer than MAX_PATH - char enlistmentRoot[MAX_PATH]; - if (getcwd(enlistmentRoot, MAX_PATH) == nullptr) - { - die(ReturnCode::GetCurrentDirectoryFailure, "getcwd failed (%d)\n", errno); - } - - PATH_STRING finalRootPath(GetFinalPathName(enlistmentRoot)); - size_t enlistmentRootLength = finalRootPath.length(); - // allow an extra byte in case we need to add a trailing slash - if (enlistmentRootLength + 2 > sizeof(enlistmentRoot)) - { - die(ReturnCode::PipeConnectError, - "Could not copy finalRootPath: %s, insufficient buffer. enlistmentRootLength: %zu, sizeof(enlistmentRoot): %zu\n", - finalRootPath.c_str(), - enlistmentRootLength, - sizeof(enlistmentRoot)); - } - - memcpy(enlistmentRoot, finalRootPath.c_str(), enlistmentRootLength); - if (enlistmentRootLength == 0 || enlistmentRoot[enlistmentRootLength - 1] != '/') - { - enlistmentRoot[enlistmentRootLength++] = '/'; - } - enlistmentRoot[enlistmentRootLength] = '\0'; - - // Walk up enlistmentRoot looking for a folder named .gvfs - char* lastslash = enlistmentRoot + enlistmentRootLength - 1; - bool gvfsFound = false; - while (1) - { - *lastslash = '\0'; - DIR* directory = opendir(enlistmentRoot); - if (directory == nullptr) - { - die(ReturnCode::NotInGVFSEnlistment, "Failed to open directory: %s, error: %d\n", enlistmentRoot, errno); - } - - dirent* dirEntry = readdir(directory); - while (!gvfsFound && dirEntry != nullptr) - { - if (dirEntry->d_type == DT_DIR && strcmp(dirEntry->d_name, ".gvfs") == 0) - { - gvfsFound = true; - } - else - { - dirEntry = readdir(directory); - } - } - - closedir(directory); - - if (gvfsFound) - { - break; - } - - if (errno != 0) - { - die(ReturnCode::NotInGVFSEnlistment, "readdir failed in directory: %s, error: %i\n", enlistmentRoot, errno); - } - - lastslash--; - while ((enlistmentRoot != lastslash) && (*lastslash != '/')) - { - lastslash--; - } - - if (enlistmentRoot == lastslash) - { - die(ReturnCode::NotInGVFSEnlistment, "%s must be run from inside a GVFS enlistment\n", appName); - } - - *(lastslash + 1) = 0; - }; - - *(lastslash) = 0; - - return PATH_STRING(enlistmentRoot) + "/.gvfs/GVFS_NetCorePipe"; -} - -PIPE_HANDLE CreatePipeToGVFS(const PATH_STRING& pipeName) -{ - PIPE_HANDLE socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); - if (socket_fd < 0) - { - die(ReturnCode::PipeConnectError, "Failed to create a new socket, pipeName: %s, error: %d\n", pipeName.c_str(), errno); - } - - struct sockaddr_un socket_address; - memset(&socket_address, 0, sizeof(struct sockaddr_un)); - - socket_address.sun_family = AF_UNIX; - size_t pathLength = pipeName.length(); - if (pathLength + 1 > sizeof(socket_address.sun_path)) - { - die(ReturnCode::PipeConnectError, - "Could not copy pipeName: %s, insufficient buffer. pathLength: %zu, sizeof(socket_address.sun_path): %zu\n", - pipeName.c_str(), - pathLength, - sizeof(socket_address.sun_path)); - } - - memcpy(socket_address.sun_path, pipeName.c_str(), pathLength); - socket_address.sun_path[pathLength] = '\0'; - - if(connect(socket_fd, (struct sockaddr *) &socket_address, sizeof(struct sockaddr_un)) != 0) - { - die(ReturnCode::PipeConnectError, "Failed to connect socket, pipeName: %s, error: %d\n", pipeName.c_str(), errno); - } - - return socket_fd; -} - -void DisableCRLFTranslationOnStdPipes() -{ - // not required on Mac -} - -bool WriteToPipe(PIPE_HANDLE pipe, const char* message, size_t messageLength, /* out */ size_t* bytesWritten, /* out */ int* error) -{ - - size_t bytesRemaining = messageLength; - while (bytesRemaining > 0) - { - size_t offset = messageLength - bytesRemaining; - ssize_t bytesSent = write(pipe, message + offset, bytesRemaining); - - if (-1 == bytesSent) - { - if (EINTR != errno) - { - break; - } - } - else - { - bytesRemaining -= bytesSent; - } - } - - *bytesWritten = messageLength - bytesRemaining; - - bool success = *bytesWritten == messageLength; - *error = success ? 0 : errno; - return success; -} - -bool ReadFromPipe(PIPE_HANDLE pipe, char* buffer, size_t bufferLength, /* out */ size_t* bytesRead, /* out */ int* error) -{ - *error = 0; - *bytesRead = 0; - ssize_t readByteCount; - - do - { - readByteCount = recv(pipe, buffer, bufferLength, 0); - } while (readByteCount == -1 && errno == EINTR); - - if (readByteCount < 0) - { - *error = errno; - return false; - } - - *bytesRead = readByteCount; - return true; -} diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.h deleted file mode 100644 index f1978445f6..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.h +++ /dev/null @@ -1,30 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -extern NSString * const KnownMessagePrefix; - -typedef NS_ENUM(NSInteger, Identifier) -{ - AutomountStart, - MountSuccess, - MountFailure, - UpgradeAvailable, - UnknownMessage -}; - -@interface VFSForGitNotification : NSObject - -@property (assign, readonly) Identifier identifier; -@property (copy, readonly) NSString *title; -@property (copy, readonly) NSString *actionTitle; -@property (copy, readonly) NSString *message; -@property (copy, readonly) NSString *gvfsCommand; -@property (assign, readonly) BOOL actionable; - -+ (BOOL)tryValidateMessage:(NSDictionary *)jsonMessage - buildNotification:(VFSForGitNotification *_Nullable *_Nonnull)notification - error:(NSError *__autoreleasing *)error; -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.m deleted file mode 100644 index bff539dda6..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSForGitNotification.m +++ /dev/null @@ -1,280 +0,0 @@ -#import "VFSForGitNotification.h" -#import "VFSNotificationErrors.h" - -NSString * const IdentifierKey = @"Id"; -NSString * const EnlistmentKey = @"Enlistment"; -NSString * const EnlistmentCountKey = @"EnlistmentCount"; -NSString * const NewUpgradeVersionKey = @"NewVersion"; -NSString * const TitleKey = @"Title"; -NSString * const ActionTitleKey = @"ActionTitle"; -NSString * const IsActionableKey = @"IsActionable"; -NSString * const MessageKey = @"Message"; -NSString * const GVFSCommandKey = @"GVFSCommand"; - -NSString * const AutomountTitle = @"GVFS AutoMount"; -NSString * const MountGVFSCommandFormat = @"gvfs mount %@"; -NSString * const MountActionTitle = @"Retry"; -NSString * const AutomountStartMessageFormat = @"Attempting to mount %lu GVFS repos(s)"; -NSString * const AutomountSuccessMessageFormat = @"The following GVFS repo is now mounted: \n%@"; -NSString * const AutomountFailureMessageFormat = @"The following GVFS repo failed to mount: \n%@"; - -NSString * const UpgradeAvailableTitleFormat = @"New version %@ is available"; -NSString * const UpgradeAvailableMessage = @"Upgrade will unmount and remount gvfs repos, ensure you are at a stopping point.\nWhen ready, click Upgrade button to run upgrade."; -NSString * const UpgradeActionTitle = @"Upgrade"; -NSString * const UpgradeGVFSCommandFormat = @"sudo gvfs upgrade --confirm"; - -@interface VFSForGitNotification() - -@property (readwrite) Identifier identifier; -@property (readwrite) NSString *title; -@property (readwrite) NSString *message; -@property (readwrite) NSString *actionTitle; -@property (readwrite) NSString *gvfsCommand; -@property (readwrite) BOOL actionable; - -NS_ASSUME_NONNULL_BEGIN - -- (instancetype _Nullable)initAsMountSuccessWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error; - -- (instancetype _Nullable)initAsMountFailureWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error; - -- (instancetype _Nullable)initAsMountWithMessage:(NSDictionary *)messageDict - title:(NSString *)title - messageFormat:(NSString *)messageFormat - actionFormat:(NSString * _Nullable)commandFormat - error:(NSError *__autoreleasing *)error; - -- (instancetype)initAsUpgradeAvailableWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error; -NS_ASSUME_NONNULL_END - -@end - -@implementation VFSForGitNotification - -+ (BOOL)tryValidateMessage:(NSDictionary *)jsonMessage - buildNotification:(VFSForGitNotification **)notification - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(notification); - NSParameterAssert(jsonMessage); - - id identifier = jsonMessage[IdentifierKey]; - if (![identifier isKindOfClass:[NSNumber class]]) - { - if (error != nil) - { - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitInvalidMessageIdFormatError - userInfo:@{ NSLocalizedDescriptionKey : @"Unexpected message id/format)" }]; - } - - return NO; - } - - Identifier idValue = [identifier integerValue]; - NSError *initError = nil; - switch (idValue) - { - case AutomountStart: - { - *notification = [[VFSForGitNotification alloc] - initAsAutomountStartWithMessage:jsonMessage - error:&initError]; - break; - } - - case MountSuccess: - { - *notification = [[VFSForGitNotification alloc] - initAsMountSuccessWithMessage:jsonMessage - error:&initError]; - break; - } - - case MountFailure: - { - *notification = [[VFSForGitNotification alloc] - initAsMountFailureWithMessage:jsonMessage - error:&initError]; - break; - } - - case UpgradeAvailable: - { - *notification = [[VFSForGitNotification alloc] - initAsUpgradeAvailableWithMessage:jsonMessage - error:&initError]; - break; - } - - default: - { - *notification = nil; - initError = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitUnsupportedMessageError - userInfo:@{ NSLocalizedDescriptionKey : @"Unrecognised message id" }]; - break; - } - } - - if (error != nil) - { - *error = initError; - } - - return *notification != nil; -} - -#pragma mark Private initializers - -- (instancetype)initAsAutomountStartWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error -{ - if (self = [super init]) - { - id repoCount = messageDict[EnlistmentCountKey]; - if ((repoCount != nil) && [repoCount isKindOfClass:[NSNumber class]]) - { - _title = [AutomountTitle copy]; - _message = [[NSString stringWithFormat:AutomountStartMessageFormat, [repoCount unsignedIntegerValue]] copy]; - } - else - { - if (error != nil) - { - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitMissingRepoCountError - userInfo:@{ NSLocalizedDescriptionKey : @"Missing repos count in AutomountStart message" }]; - } - - self = nil; - } - } - - return self; -} - -- (instancetype)initAsMountSuccessWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error -{ - return self = [self initAsMountWithMessage:messageDict - title:(NSString *)AutomountTitle - messageFormat:(NSString *)AutomountSuccessMessageFormat - actionFormat:nil - error:error]; -} - -- (instancetype)initAsMountFailureWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error -{ - return self = [self initAsMountWithMessage:messageDict - title:(NSString *)AutomountTitle - messageFormat:(NSString *)AutomountFailureMessageFormat - actionFormat:MountGVFSCommandFormat - error:error]; -} - -- (instancetype)initAsMountWithMessage:(NSDictionary *)messageDict - title:(NSString *)title - messageFormat:(NSString *)messageFormat - actionFormat:(NSString *)commandFormat - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(title); - NSParameterAssert(messageFormat); - - if (self = [super init]) - { - id enlistment = messageDict[EnlistmentKey]; - if ((enlistment != nil) && [enlistment isKindOfClass:[NSString class]]) - { - _title = [title copy]; - _message = [[NSString stringWithFormat: - (NSString *)messageFormat, - enlistment] copy]; - if (commandFormat != nil) - { - _gvfsCommand = [[NSString stringWithFormat:commandFormat, enlistment] copy]; - _actionable = YES; - _actionTitle = MountActionTitle; - } - - return self; - } - else - { - if (error != nil) - { - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitMissingEntitlementInfoError - userInfo:@{ NSLocalizedDescriptionKey : @"ERROR: missing enlistment info." }]; - } - - self = nil; - } - } - - return self; -} - -- (instancetype)initAsUpgradeAvailableWithMessage:(NSDictionary *)messageDict - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(messageDict); - - if (self = [super init]) - { - id newVersion = messageDict[NewUpgradeVersionKey]; - if ((newVersion != nil) && [newVersion isKindOfClass:[NSString class]]) - { - _title = [[NSString stringWithFormat:UpgradeAvailableTitleFormat, newVersion] copy]; - _message = [UpgradeAvailableMessage copy]; - _actionTitle = [UpgradeActionTitle copy]; - _actionable = YES; - _gvfsCommand = [UpgradeGVFSCommandFormat copy]; - } - else - { - if (error != nil) - { - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitMissingEntitlementInfoError - userInfo:@{ NSLocalizedDescriptionKey : @"ERROR: missing new upgrade version info." }]; - } - - self = nil; - } - } - - return self; -} - -- (void)encodeWithCoder:(NSCoder *)aCoder -{ - [aCoder encodeObject:[NSNumber numberWithInt:[self identifier]] forKey:IdentifierKey]; - [aCoder encodeObject:[self title] forKey:TitleKey]; - [aCoder encodeObject:[self message] forKey:MessageKey]; - [aCoder encodeObject:[self actionTitle] forKey:ActionTitleKey]; - [aCoder encodeObject:[self gvfsCommand] forKey:GVFSCommandKey]; - [aCoder encodeObject:[NSNumber numberWithBool:[self actionable]] forKey:IsActionableKey]; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder -{ - if (self = [super init]) - { - _identifier = [[aDecoder decodeObjectForKey:IdentifierKey] integerValue]; - _title = [[aDecoder decodeObjectForKey:TitleKey] copy]; - _message = [[aDecoder decodeObjectForKey:MessageKey] copy]; - _actionTitle = [[aDecoder decodeObjectForKey:ActionTitleKey] copy]; - _gvfsCommand = [[aDecoder decodeObjectForKey:GVFSCommandKey] copy]; - _actionable = [[aDecoder decodeObjectForKey:IsActionableKey] boolValue]; - } - - return self; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.h deleted file mode 100644 index 4f161a1317..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.h +++ /dev/null @@ -1,19 +0,0 @@ -#import - -typedef void (^NewMessageCallback) (NSDictionary *_Nonnull messageInfo); - -NS_ASSUME_NONNULL_BEGIN - -@interface VFSMessageListener : NSObject - -@property (copy) NSString *socketPath; -@property (copy) NewMessageCallback messageCallback; - -- (instancetype _Nullable)initWithSocket:(NSString *)socketPath - callback:(NewMessageCallback)callback; -- (BOOL)startListening; -- (void)stopListening; - -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.m deleted file mode 100644 index a4dce2259d..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageListener.m +++ /dev/null @@ -1,163 +0,0 @@ -#import -#import -#import -#import "VFSMessageListener.h" -#import "VFSMessageParser.h" - -NSString * const NotificationServerPipeName = @"vfsforgit.notification"; - -@interface VFSMessageListener () - -@property (strong) NSFileHandle *connectionHandle; -@property CFSocketRef socketRef; - -@end - -@implementation VFSMessageListener - -- (instancetype)initWithSocket:(NSString *)socketPath - callback:(nonnull NewMessageCallback)callback -{ - if (self = [super init]) - { - _socketPath = - [[socketPath stringByAppendingPathComponent:NotificationServerPipeName] - copy]; - _messageCallback = [callback copy]; - } - - return self; -} - -- (void) dealloc -{ - if (_socketRef != NULL) - { - CFSocketInvalidate(_socketRef); - CFRelease(_socketRef); - } -} - -- (BOOL)startListening -{ - CFSocketRef cfSocket; - if ((cfSocket = CFSocketCreate(kCFAllocatorDefault, - PF_LOCAL, - SOCK_STREAM, - 0, - kCFSocketNoCallBack, - NULL, - NULL)) == NULL) - { - return NO; - } - - CFAutorelease(cfSocket); - - int reuse = TRUE; - int socketDescriptor = CFSocketGetNative(cfSocket); - if (setsockopt(socketDescriptor, - SOL_SOCKET, - SO_REUSEADDR, - (void *) &reuse, - sizeof(reuse))) - { - return NO; - } - - if ([[NSFileManager defaultManager] fileExistsAtPath:self.socketPath] && - ![[NSFileManager defaultManager] removeItemAtPath:self.socketPath error:nil]) - { - return NO; - } - - struct sockaddr_un sockAddress = {}; - memset(&sockAddress, 0, sizeof(sockAddress)); - sockAddress.sun_family = AF_UNIX; - sockAddress.sun_len = sizeof(sockAddress); - [self.socketPath getCString:sockAddress.sun_path - maxLength:sizeof(sockAddress.sun_path) - encoding:NSUTF8StringEncoding]; - - CFDataRef addressData = CFDataCreate(kCFAllocatorDefault, - (const UInt8 *) &sockAddress, - sizeof(sockAddress)); - CFAutorelease(addressData); - if (CFSocketSetAddress(cfSocket, addressData) != kCFSocketSuccess) - { - return NO; - } - - self.socketRef = (CFSocketRef) CFRetain(cfSocket); - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(messageReadCompleteCallback:) - name:NSFileHandleReadToEndOfFileCompletionNotification - object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(newConnectionCallback:) - name:NSFileHandleConnectionAcceptedNotification - object:nil]; - - self.connectionHandle = [[NSFileHandle alloc] initWithFileDescriptor:socketDescriptor - closeOnDealloc:YES]; - [self.connectionHandle acceptConnectionInBackgroundAndNotify]; - - return YES; -} - -- (void)stopListening -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - CFSocketInvalidate(self.socketRef); - CFRelease(self.socketRef); - - self.socketRef = NULL; - self.connectionHandle = nil; -} - -- (void)newConnectionCallback:(NSNotification *)notification -{ - @autoreleasepool - { - NSFileHandle *readHandle = [[notification userInfo] - objectForKey:NSFileHandleNotificationFileHandleItem]; - if (readHandle != nil) - { - [readHandle readToEndOfFileInBackgroundAndNotify]; - } - - [self.connectionHandle acceptConnectionInBackgroundAndNotify]; - } -} - -- (void)messageReadCompleteCallback:(NSNotification *)notification -{ - @autoreleasepool - { - NSData *data = [[notification userInfo] objectForKey:NSFileHandleNotificationDataItem]; - if ((data != nil) && ([data length] > 0)) - { - NSError *error; - NSDictionary *message; - if([VFSMessageParser tryParseData:data message:&message error:&error]) - { - self.messageCallback(message); - } - else - { - NSLog(@"ERROR: Could not parse notification payload: %@.", [error description]); - } - } - else - { - NSNumber *unixError = [[notification userInfo] objectForKey:@"NSFileHandleError"]; - NSLog(@"ERROR: Could not read data from socket %s.", - unixError != nil ? strerror([unixError intValue]) : ""); - } - } -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.h deleted file mode 100644 index 7860d9ccc0..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface VFSMessageParser : NSObject - -+ (BOOL)tryParseData:(NSData *)data - message:(NSDictionary *_Nullable __autoreleasing *_Nonnull)parsedMessage - error:(NSError *__autoreleasing *)error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.m deleted file mode 100644 index f557085142..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/IPC/VFSMessageParser.m +++ /dev/null @@ -1,63 +0,0 @@ -#import "VFSMessageParser.h" -#import "VFSNotificationErrors.h" - -NSString * const NotificationPrefix = @"Notification|"; - -@implementation VFSMessageParser - -+ (BOOL)tryParseData:(NSData *)data - message:(NSDictionary *__autoreleasing *)parsedMessage - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(parsedMessage); - - NSString *messageStr; - if (!(messageStr = [[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding])) - { - if (error != nil) - { - NSString *info = [NSString stringWithFormat:@"%@: ERROR: error reading data.", - NSStringFromSelector(_cmd)]; - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitMessageReadError - userInfo:@{ NSLocalizedDescriptionKey : info }]; - } - *parsedMessage = nil; - return NO; - } - - if ([messageStr hasPrefix:NotificationPrefix]) - { - messageStr = [messageStr substringFromIndex:[NotificationPrefix length]]; - } - - messageStr = [messageStr stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]]; - - NSError *parseError; - if (!(*parsedMessage = [NSJSONSerialization - JSONObjectWithData:[messageStr dataUsingEncoding:NSUTF8StringEncoding] - options:NSJSONReadingAllowFragments - error:&parseError])) - { - if (error != nil) - { - if (parseError == nil) - { - NSString *info = [NSString stringWithFormat:@"%@: ERROR: Unknown parse error.", - NSStringFromSelector(_cmd)]; - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:VFSForGitMessageParseError - userInfo:@{ NSLocalizedDescriptionKey : info }]; - } - else - { - *error = parseError; - } - } - } - - return *parsedMessage != nil; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Info.plist b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Info.plist deleted file mode 100644 index fef4889365..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Info.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - LSApplicationCategoryType - - NSAppleEventsUsageDescription - `$(PRODUCT_NAME)` uses `Terminal` app to run `gvfs` commands. - LSUIElement - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - Copyright © 2019 Microsoft. All rights reserved. - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/Contents.json b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c91..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/Contents.json b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/Contents.json deleted file mode 100644 index 3830a74e1b..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "VFSForGit_16.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "VFSForGit_32.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "VFSForGit_64.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_16.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_16.png deleted file mode 100644 index 77915f68a896f760d1ee41e09e6fd702a6e7c188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 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 B(B}XE diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_64.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/StatusItem.imageset/VFSForGit_64.png deleted file mode 100644 index 72a22b25b4c37423de348c3b1c248a994f388819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4509 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%0DGMn6 zDFAfQzef3Cc1rSL7VX6gHP(s3F{9jlj6gk3hN=AQ5WI1To7#-^J*hUw?4R`eKUt=J zPFAU_ zK&h#y=O!(7S7g7VMNAU~60X)&Z5Ww28g_l<;iy#aubbR!lGsPOBC+q8E%)1^>Dxv? zS&kQ3hKNvUhCxxfI_k-ofBlg|X44}{T*tv5xsK}y25 zuz^e+g1)GxYBj0AU$J|+_@6x*OP@Xft=LR8Am!DytD993{)cee`ByPJhPQYmV> zvBDhr?$07Ki_X54A0*Q`V}=}~d2rH2Dqk9`O`(HDu?Mpvi!@?bTd5UECeP(vsanLe zW=+jA2q8LU8571wC#G2kif&Z#u z=RtL$4ZNc)RlD>YJ~NqWRoPrKf;G$(DWxwySI>9iumO%&Ti+Od1K=#Ow(n@*Dq2NH zUb;OUu*nD~?9WS212>2rXl%NFgcY-x@Vs*dQGc)`gZ9RcP@N6HAU+(esJin?1u!Hs zn6ip5@m+26$+ir8g))O4YS0b!=Pi-2Z{NwCg=xprDLD!`N>$p7(!dY6PR1X%_EgTV zg*E0Mk}m*JY=K7vQWtvvTpTHZGWcanVerO0m5k{D8v<%iPcM`*`XdTRj*KxeucVi|v(<0gf zAbb;ovtWLKCuUU>A`x1X)0WAj3l%Z;6?yvC6Gl6pI&wTt$ZXjPOOdK&+#@IP?&47A z-Hn6Lxx`0#*~8|)`^|B=2X(ATOi~nbdjx7>7r$p@O98r0*<6TMua1DxTFzf_Vq~AD zStgbu`>?eq8+PQ7yPr2%5FzgiLU{H}{gwK8=TmFaFJjA(XT~%`<2@YOM7jT)UzHhkwBmO#uDlz;OEgJJ zL!YUGk6MZwbs|_Os0Q8yBypprmYEBP_WSD^G+XU7U|{y&14k76N|uL zDbZ3HHdhp9%JtS-r$+^qeZ^XvcV&)lo>yYl#33k48^){2??$tdv{x`qd zYHHl}*>yF(YTsUq8*H)j5x^31&Rrzb2B8QHGs6RK*RDK8pi45+MXoswZRJk~N{ z{i4&RD`rG8i?SL|4#>C{#FG(1fv4Pk0nzWk3qm=yi4XCBf@ruw;K|a^S+e0yoXz2m z-=*qUTMwF6Rn{X}d9ueWAKLUXFPPcZ9%Zr~;SIB?6nfg6GwB<~X-qA)SWn!l2Js2SB;e+iEo^FD z;5}LzzuFW$Q+mMk9O4g+sY;gaz5iSUN~|63lVlQq5d2h?-u&3Oba#1$A~t53cXsAh zx_n%3dmRfgF02Ql>|{x`u&I0^#1CgVGCNS!w?I&ThyS87KD4p@8k70gaPG@mi3b); zuHC0SrQK>a1yX#gkk0Vb$8_rY6l0HZK+TW#PYmJVNrzreN>AGdW$-#I!`$=P2cu7dsA3v55t-#pxLv{wf(Z zuL%+)i3~_AUPi|OE8WU-G9GGMwZy<0KrJy->3yx|K5*d!QzK?t61?7aSsKCTf5O(B z2^XjRRp=&q4V%AdtP94z7voIn+yf85XEi1Ov-TVP@L=VV-Tt0)6VFc1u%Sd*p9O%5 zaGyP;F(dZ5=6YzA%BbgWMZXrl+Z|IK?Jo1eZRP#M^L=yVmmRraWnbDPo2ncZ#SgjF zjDN4lW0nfhd=|k_#a#Ty{p*w_1qa8Zw@tcwbj^ssR~C2Kxz7>bjE4h4bS*y+uc;G# z^5>SG0O(K-AhoH@`RFg}6A9Z!2V;q*Scd;A++f@nZfMf(xF3+vGXRVBNGU_*`|cmo zA^?*DUGmb)m!V_R*H5Evn?^_23*S$63!nLO2rg$}3tIH`k0R(#Z9@--DJv1^H`PY} z(*n>2Ocgz916Nv~^xIg}tyJ-iL|A>+$>W#?^WCj9KAFn``Ls}y()&-j{Zcy8(j;Lq zJw89}H_Kkrh?-3O5{Z1Jje2Ms&53MI3u?NDP21=%3*AFg{h*F^dXR(#0s__%ca#s1=nH{es`*Pp(& z7B6PxompmM{~eYNEiK|&G|!FZ!TArkk-|MpJVnnDCRDy5Z4fNv`c`qUmL9B1y%#6MzCC2Z9u}#Fs^rXa)b3jPv_U7 z3%PYJqw2u>{o51c105MOv359sUsM$akLc6GQ~i>TuhLwSXI~_9nXKe+H{J8f<|k;n zhn5WrO%<`O=QazfH~g=eJZ8sVJ84_UVC~5>NkwyAU@Og{6;zC55ubmuA-rOtpSJo- zyG*s>6i{&zov!qqaTEL$;g-HRbb5UCA#GBD(&RG?0UJeZ%NjT+VUCn!1BP9Eabhjg z-a_iDa{oa?5R@FdPIHa=;actq7#YfTszb!fK#xI!pjH@A{L4|<0_fGV98nm*Awq03 zqw%1$8G9E={Id2{G?V^-I~&F-swzI$W73qE1F+yamGc=k*SX0EL(R|0*`ooEp6kT) z6{WHPe#0|vQgW=ieu>qP0dxpwC)zs*2r1HAv1Emc+j$l;xtsIWg=k=Xu~KdE)Bp-ipen{~A| z@FO%bKqvnriQK(t8&m=r!)ARQd?YdWa~*s1Is7d&FIq7Y@%TzX480-!zR-dsV=P!9 zqVE4uB73wAMyQZ!LaR#nW#bN`$JG(#btUFyrKRfkb;xz_?zEOLjKiq;fV{A?_k;KX z9@jERXr@7NU;Rp`5<&`h$kecd8k91wm$sUeLiJ1EyXE#AC7Q!(lJ*}#^m71G*qPfx zZ)gRz9kwkt7CC`Xyi9d~>~rYcH&yc-%QUYGmnUA523K~>D-H@v^Gx=!G2G>~HD0RQ zJiWJ#S8rH#5gnv-W$=C!lKbE5SuL zUj~DKtf;lG7=2KTX-_C6IMGAJJ)HEL>*na@L13DeqH1oq(*s=)UM%=Tac~A@1LKST z`j_+jFfK^~V4#PR5Rxqrpx}>kQal@Yfq!Xd%4#(L2jfJAwhq49R5YwGT0JTaZf`mM zV#5SmT}J+8II}%UsucPSL9n%WSScZ6_b-XTzdAzXThW?XW!Lh+T(TdK*em~ z09#dt8*9aYLS{d_SWzRM`mJm>IkLOs;=%onNCf9eFA58c1C}ly@7tL8PL4vllU)%@CU?#0`4Cefo5`RwvJ!F*JPuMuC#mc3Vjp3j{QhK&^Mk5a z!|SeIKS%xWN|oHolyx&atm=#YpMWP&t`~2{3O+RrDehAXgccqz{-h~gL4GR;jAB~! zFEPBwKrXb7xUTH9TM4(55L7}$yJkGP`nZ^A9cNeRko!CnXw2EJSoSKnrB=u#qzz0_ z?NN4sg_yY^T+WyW7-v_3s~hi19nVBWfAgdJ)b7@97_lI9Z$UL{6#T_M>`Ah?M?9aM zLMpdgW_HTB#|F|E;L~3|sE`PL{&H`ZOHAaR{Z7H8(=s7n@Xrj`{GpF&7 zN^}M^hW98$I(~+oy<}N1u%g@=kgju7Vth^3kgV5AXy7)SR<~O4L^daRj>_Ak9Y!8 zutV%Bh2k%LubRvdo%E!!F2deUG0aM;tI(#1)r|Pi*!GrGog?sK`q@T$g2SI3C_3CN z&+R+&kvCKH!lZeqMANAzJzK|^e-g=$WQkzE$LW4O(dbp9CMF{q?-gxqV(|5V$1@vT z!=eeGx8w?Y#P>%#QW?jqq*MK_c0&!h4Fz$`m;?5g*QxU78{7{EG8d$3iZ`7V8E+$mXGR$ zbi!Qmu+ppp<0r| z)b5=vp=>E^%>Yt(*}%0`NJ-Gp%}M;N15%}&xlbZxZlk9g`R+1q6`yP;VB+cfMy9)% z|D)+D9GY&s=qL$k=~lX=TS8iCkXAyvMLGx4jdX)_cL~zc-CZKx&0uWbhVS_t4e|fARlwxL9bNIp(N>C^KYGU3!2%l(56MdWt&pYR(D$ns5wq zfnfmzN#9v~wTYnzl)ELK#eAjtFmi7}UfoBrNX7$gE1wR41_ABOp@*evfRrsZ^PYi_ z8p41whxtTA8sSyzS_fM2p)oNU8cSMW6Fx3O#T)p6TNgm|>>x~2P#novzkk%SplGRY zLbq*c*!RjvGIzfmPCeVLwo@=Gp)*7%*wf|vc9rpVXe`IbK@mOn2Xb+b0*g#nb_IeX zvmdt~t3Jw(hbzI*!S=TG?d&7&7&Q)%-_h?|k(Ma3uU<&YLv4uNv;BVpm64v>p8rGm z5WG;#zk~p%RQbYrn{tGd$0{dXByTaW+3s~RlqPbRflWHI9=L<}8x}qNy+fP2=d)Dc{ly#+mNKz8@DhC;)chiw`0G^@Y8~77+|G7d z`^`q2**%BK0zPD$G~ImXxTD`zH*34OpoZ%U@p00u`$FS@Xi0O{;<-Pxd19>=SCjjK8uH>S>a)dp7@h#r^VHSq8#ki4I&^P36 zP_O$PpE%Arw9uEfr<83O8jbdRkJpRI(3c`hzmEQLXtzAh)*2=lyHH^KdNi3^-?!at z;;1~gh!7{bKJD~4`O0`?hOS^{3Y`5B0eKk_M&DdF<9eMUeBTvZIv0I(d3ZohkS8c?J2uVk~ z7{SvLv#)^nc`r%?=DkJ07w>b;68(?Ve={=pE2?g<2}V_SX0F-bz_%DLwhsUQZEUya z{sW1Pq>`f0iiH7TTkngOJtEkO#tIxr%nZc1G_ccL;h0%wR!q552KiZT5fMahYw(3n+lFK=x4q$ zJpIu7KJnJ845;S3_wm+%%6T3};>UOhG}$#>HpA|KHvw8RN~hep#Z|}?{NGrXpgAv$ zc(|vygicyDE&pUfb!n=5wJBb9Fe=Q^B!#k-mOkM?1URw_DuQ~V-Z+z+PdDBN{5!%jegbtz_QU+{7^bD&7vsD$v_;sD9(~N_8AjRFRofW7>H_Y42PGB20l2 z-I*z4^!gLLQEz1#%ZyJ(=%@4;U-c`jT4klQ5ZkQtH%I&9!+1ZJg)JH9kmH!++=JVcp&N6^ZsB`FMq zzN;LnJmA$#S2!e{sajHONUuC*hJQN`t$trJm++Yk?FvUw!4L6V-NJI)NlFdmoc($T zBc%qyP}rIHB7^GV7H2h8j26vs+$HNCV}hF9$e(vNNO}({FYl++dyj}ar@rNm9A1wp zUvHd3Yke;|phr<;UldWJHgX21U>T;r4<)P~tw195}G>C>#YF9oJJD)22&x>0J2sMDu7aF5FH zwSkL%Ajn@1iBdpqIT4o9IKV}V>U{v>Z0Fr8%*Kb!D)1ICzM_L719(12os4$-s#dMW ztMmBw_NRzT$Zt_NF3pt7c`4~eg^K#Gg%g8^U4{gVJKM0jSxgom z!shUjfugpq&gP1c%(r3bC{sKpF3YT~Rt{T-gq43<`LJ~?z8ui=8=UO|9RWLSVV$rQ zY1x8^=W27O2gB_@075w_#1&FRJ7&KFg=s@1fDWId^Arq(eVap(#=9npW7V z^mo}#8IBoWIm-+?c03i^XoUrTdv(4PLkXJ?iS4D0M2KGC*)UriHT)qiINDc~Ts7yl zt>><_igR1mzp27XfLP0>gTEu1C)yLoZvfXTP_w`r8$Tf1-YZXeolPdkc+W^YB+3K& zWq@r$$v-uB9EWPRLljIdbC=I{Gxls%P4{}3rQ8K$?jdxg7S;z3| zhz8%PgJZnQP%5Z@lUo0=tG>G|PQU9fLzcP%;Ap~+m+ibyn1Eq~i8NdQR3cbVVSm8c zU{h4loe?jbwqm0E(*hpS`(ykji9%!c#(#1CP^iEd-V2u3w3Y(a+H$v0aq~s{RME-{|43@Dx?M&{&47(0*4_%i= z+3~sTsJ-21o8n>*U)+s)NLj4b!vj^=ZtLK|{0*A?_1=F7e`8CslSGIP%7y`bxN+{m zCH++pgOLtmdo!&4AXDW1bIqh-`W3ZktWi~`0|FqMV>Wuf9~ap zNH2TE8|bGUM@^eWk?Ocj=H0Z%c5PKTZk9vAl z^-%u$*nJ@PJ931w-gKL9$`~`6{Fpj&N9)qret#P9S66!xjd0Z2%gWly|L8>x4mS=% zN_9U)wY0qzJ8@YLeE69P~SAT^Z29csYucYu2qozxvmOT-4dFa;wvCeRZv|pn6?eKr`5@)S4?xIBMj^ z9pQ?Wl+}o;O9V(4cO1|C2$#4bPKXRf9R@Z;*+SU_qE|UD1k7^_2XhM zi^7#VBXv|`emVQW*!$U^M>UYr03?al3i~!r%;oiPxtaBTj13};tsqKIf7p8b8i%ik z59IJ};UDwYf|jxBGv-Vhm7qGR$;^)z?aZa8BMsSgR-bw$T31&I+oa< znYmS4E7FbRk3ha}x^YSc?awG`MC}8&K#U(9&w4TIkq1#rR*;eG4V%aaR6V)s@sXqsHAP_Un7=nbXZorYlf3FF^8x7DqHXm z`w2>q2;ABY7s1PV7?H0yVkW5bc@Fddys`+$)vt^mH?$*=X-lmstj7jn+wM^P+7%@k z@j8pWwO&5JdG5z%*_X`+<)eZgUjLd7u{f?-re1?YU`H|;R602s5Rz(}c-b*!6sArx zZyKr?sr-mfS@ZajxL!FKJ#O4eoD!a>T@7ivnlN$YIy* z3SI6UtKclzrg(}tfXjo^hx=_qXVN67L)dqwV?=vSRu^ZpgH>aio$ZE^0ovI2p}V8v zcHDIjFCIvu$_(I!oeT&)81)8)fJ1+HN!;E>Msf#YenEE1EGroO!2+9Wu%-U1ovD&= zpT$@h$XYw77X{6zC+yps9-9vPjRg{8!cNf@1=zz#7UQSVEe5B5=C9As zETUwzG6xs4&7oTY#vP>7rf;ZVWt@Ku%ma!1{{;;-1L7Zg3t4+pAAX)$|4nk)5WgXh zJI*&g_r)ZEiDMpn*q&9b`j$KEN#J;o?G+4z%l8O0qJe|=@pUkULJM{oqt(a?LkX3#?LSY)z~=Hl?*Lh zyNl`220}o)gxNu1k||<4L08o!id#2ux`Ubtu^o8>>9Ge?4aX^!v^0e;s1$8eM(&eS zZkl30?*P|Hnha0D_K>4}6S|uRQJ9v`3fOQEIag*MZL}U{1KIu<4)fFGKjxgCQZy(Y zB~7Gwyf&8DTKd4U#FhvG@%%9S$f|kdI*LnDTl4*ef%Cg#v>A1)eYL)Wt)ILN^Nd5xS+3G*Q~}PO zRvbGUK&k%vy5pXDOzU2~q5R%%%?a1$Zy-r`W&(WufV|YTu-~!bf&6MKXoA|K$p?V< zLQXhsi35SDEL-%>tP#(E7`lC>DZo1C`S>fMAL3atR(Ji8DxZ8B=>CQ)&Z{~-s%bxb z5lHbECt>(0pXO-=b`bZ1@RU|j+7q+)T9!}Bvb9Jplx?eOf2SxqFtuZ_2Rj?5IB?_$0keD4{Yw-0 z2rr^(B-yR={^>$9ILa0N|sHL@~dg}!JDeLIUMBwN|1b0|b+t|K#)ZkE++ z+K3ZJl#ndhdTjgfq5t36@TNq@|1_mpFWa9>(?U160A~TxUNh8BNP}mr4oEyp{G``& zi*P5JT@95M7-EM6KXI`F5^5*x%|WCu>mC=ekt95Z$Ji&1-XySXbz3}FXu42Fi5j1i zl_7~-%eZZPJ@iLw&cyC(Sy3D}%}xOq>pZ*z?o9(n1V|t$5GU+@bmFB*cAA^yo&gg( zs`k`_k2X1c)d(2%Q(_D_FJYifCIeLT5;mvD?s7wqq75w+pL}Qthn|w_*Ex*8Xxs z0kGE85gOC~6qWU9zetR#FgBQ>=al4;K1{t6`hL^|yxB7NNqFD8-)oKaLWfYu911cY zXk8vSzBuY2zpzej8G+dJts?^|5X~=cI>s75oE3n(ebU}pYlgjy;?Wq24Ejh=JYQX= z6tSS?q2xHNt*F0~q0u_;>aDB^C;nhpG4oZd=@v6f68CNt9mc)Z=L>PGJR7zGSes85 zCm-9qY9)vspgX4JuZM0l2Y_J$CbLmqzkAz_p>KczHjDra0l+=mnehM;m4l-WV|S@nRm|M$jG=&ooSe3Y#dHK>!|=Y5XsNx;9}jr}W{XA@c818LA^ zXPB+iMprIWrx_CF6_mJF_eh9s?w~id2d7P*rOH$eHx4mi83Q=VDATh_O#n$f0Wi> zY)o^SbK>(d+Zm`DwjxnX#n|D6e%%PIGz_kF*PSQs-_8MM z7$z}7Z=v_%?LXG8X@ZWsIK^hgY@jYZDeqmT0UAs2i*}Yp%lU}Wu^Vu``84YHr5`V) zVDa-WHkFmFF3yeT8)|h$m#SucDWcwY5r3M*v0)j379Dc!E_L{LS-wC4YxNq90(oCl zoK7xMMb)oT+sOA|E7Bdx_Yh(3(wts#-6bRXkqPG4Hb9or4y@C~Q;SOl(LrS7ate3a zKfjtZhZkfFYK~M%I)#O$)}@s>;5;n{Y-+gu#Xa3;#%~OorM-#KYNF}yQ(DFs7^?S- zkaO4(fAn)B#!5C)?0foO`U&7}%%g#-EWH(Dm=G5*I9t^L8!yjL>|&}{J;QqEhaClg z^z@x4o~M6cKw&U9B6|OA9rQs;%_VB^>CPjg32t5Cf$<*k;O8+DhZN2trKs4H+o}J z0VVP-XiV<5N>GHhX8tl7>=;r0+4>98?^9wXYJF0&b^jrX%~yBoR%RSo~{i~<3RvqinqM1$Vt=e%fdS%*!vI+x8_N7i*9`crKheiNs( zju1};LjmTqBM`1fi$~z7@6@93EmbGmkanb?q6xR%&Uzy_fO_UA7K;x%mkBXZ@HfkY`Yz@UcH_Dd{|^yR)L9qF9Xk{Y$da&jOudg zOh2N6n3h=>y{9ci>s_8j!RM}@{VqXxLqZ!wSUP_aPx06Dx~XRWF1Qfi0z{bbRPW~W z^GX*;40mi8AE`HW&e|z3UB!T&*=FWFS2Ux7yN1C_Nm}d7Wfk$$dmwq(eBaq4?S?X- z1KQyq^AAnyB5zC^<@{EqtPhXuN{egO4`NOWn(w$BuYJf~8HWzQy*urav#t=3*<8}CMr07d4)-N1(Qvf?Uip0Zj#1ESziS+rnM{$SknRqH*b6ul$$-b1ZvlJF! zRPaPn2jk1{qY8ZUU@9#=2pOXpZXq^v-*O%|NMmP;?*{Q(Bgt(2WR45ZzPVD-uP%@;8mcu=*EWOmEhDnR{Ob=c_BVkh`A18Aa+BGp!Km4NT!N6F%gi4 zHnJ-5yO{J!`6+$-HAo&F74az-P%^o$~YIhwNannzBd4QEEdEi0gfae zbg@;BX9&#%gO3RoJz<#d=E768=5}}&HO36%EXm&?kqzNVk?9o%8-Mtf3?!mXcsc>| zc(L4o;L1(hs$>P#c0ov;J?ZOvy-Vso?gzQM@z(VEX|f5*o9N(0R=k@_Q-sbIRSKvX zXNb!}XDhE_`W?UCKz{v{>r|gnxDDUf^}*PTO(3{X#@1$pwIPA@p>{#DHB|?WA_~(O zpF-2!1}?6WhK@3dN#+MGGW_2jP*xj1Y29=xO=ifH+X&C~Tg~c9YIZ+Y^o>H7Rg*I9 zH_e55mITEr7Iy&C6Y}1B-NwY;JvNW%HS+YFsXp5?F z?8;m!xLW%b8>RtuKZVeV(ZFI-^A?&kzuF;VNS7ir^&9sEPH)B1fx)S7oku`u?}oGH z8bstrE1s}Pp9Tf&B`?nSTk+3?W{`)Li4HB(UU6L`ZRLYS0~BRg3|BXH5^JiwYKrg;1UDO(+d((5cd zQ0h25A3!mkXxpEs6E7;!X*hJd5wjun)HTa_YxGiyD)?n|Vy?I!YE0H#K7D9EC&iAq zC^)*jbwMQ#g1XO_?y3?bI|l@@r8FDLFPNuRZy9x7({@9 zs#qS{l6K2fqdJB5GWgRf54Q^$hg?rJSst0w42tpQrRq#|_bB~bwon;}ZCXU5_n(;a zmm8Wl`IVAS{XqWc1#1LYaI2~t<|W+l^}eV9YJ1DA_NNrTtl{9i!1A6x(O`OykT)gI zH!QL9c`1e3ezkeJ#79I5V++}=M%1HfpN;Kv_wts_(f=SsEn2m|{N4N#5FPR$g=a$x zBGVShKkc;jZH<0n|0!R^8VtF)D|942-Gyk0012spW$($4&sY%p_!XpBj*6V!DPSCY z*W~ogFlVu+#i7ii&D?$RGR$|12;lDdxvgmK!NTiHbZfPJISQ5_QhAdRk$@4HKZTx! z_Y!Abew`Z{(jSj+q=%5>e_(`3R)oGQ-8@wMp=*q5DMA0{dRhsy_WsKzRMq7`(iY32e3y48~M=$J$}~XjR9SJ_z11AN zFTAcF8OIOgVtm(hf+v@+JDYiDTqjhk%ohn=BU+A+2h2T(ck5jFTX9Zb+cFtoW+Sbz7Jeqj+2t=0;VhS?Tg|IVO6h)kzZa&c7 z?Q&nvsQa;#{8F-~cbY&5X-DEGLVwh=FQw)Me7DN@Gs!D~zP)dKoaTH)pTzF-OjA+i zSI(b&D9U!$zpp<;`%S*bo2Exns^^?l(u}|0+13{r*ek@1?RLQ~;cIz^TKb%Deh2`< znCaC*C$ZC}xAdKh3Ch?fF#AH)%By4_{6Kt#suPf^|JEBJP;GVA93enhoL!5fTf2xh z5PE*dAuu#f4Ys=8o16-nL8~?rnP{6dJhfT;_Sq9Hf@u@poLHkoJU8=pyS)^7!rvQc zBwI-9NK(8RZv#kuxug|Rb3<@|YHxgSG0>qGQ{Jv$-{g$y%?&nPmaZjkI2;P;&WCYt zh?%84T9kw4)5dL)l57auBVZ4x5Q{$AOaghyWu$V9lp*nTz#9K04o_hnrDrTAGkq64 zKI-_>!mBieQ+Wj~Lz-(JS~5dN!T-_+YM6xnfKvVI$*wDjS02pce|UIReSRC}HNP)z zDL!>p6=6rB86c5(hpmCe2{IHAd1h)Hh;J-Ch#~^Wkm^(^zKa`+9x!2+@R45L&BsxD zMO`btfu}HNKx7OScD|fm(`|Nlne6z*G$z||zYZCrzfGa+pDEU>=ts?YoIDSlyYER!4Pf;AjRELaaoovXq_%rOk6jbZ4|RVC+0R=bsU7&V zRF0RLMjaPhg*z_&NAd$pV<5008!O^Ya=YjN1};RFlZ*aknF(CW=|(yx@=+U6`E+G6 zyT3E`MS^yDR5Vi`55te--xrCf9+GizMo9{UFR1@jwyt9ZR6_2sCDvPU-P=)@#5fNK zrRVU#lk^t0c%5?q@L7Wdea1Yfn0&0&Ea`TA=9a^C*wD%xNOC&inX|vgi44L(+r$H9 z2X7*Q7Z#egHi}ri;KLa0Hpsv4;EMxa689psP>~3MnK@tWrZvVTf{$j({V9)d^6NF% z!~6))V4IcG(}sfF!=P^7sR6635ox!73D^kkdFa5le?<+jMX`)VI7j}pHJf_;LlXA| zlW&#u2*>uBiX1P3pK-ltZgGLyl6-F{8BggCS=kwkgj*NMgVV$MYyN+giagpctTrC> zj_WU2tAquF$98-6v|FqKlSVA>7j`-Iutock0NWoc#xugx07tZ2m&a)2Oc-aB8V=LP z*oHLaz298X778LAkI5-+6(EKkabsgkOwTZ}T`d$Hkrdt|m3Q_9KIy&XOZ-nynv z^(J?X(S=s`U{9by38SIkC?LI3YmmC??}TY*{+TxJQajEYph%&}%SUZRy3o#SK1rAn zSXhuBS9Xn{7O_bSoqW-E>-sH)H23dMf!z(!pI^zge^=}mGlFy-tzB@n?14?79`8y! z)f7O&nVqys=|jVz>WtzIBdWhQrsom1pA0|&br0bfkPa|)yy>X4{+#a=iF^?55OETl zxEG--iaTZydEkA?sHe}_-jZGV5oM78?EQYSqBfum;|Y7XMZ_^>871q%^+B*|c-0o+~;F_`*`j1u)mXz*c{ADWo&pO$+n8QX`sx$0Ll!ODGZ zaWlKF6TdTI8`=p$V#l-m*6z|cV<#_riABfH>`?jydD=~o!37V|2sbBBKg056wcpO% z$bAppOYktpMi=dzT<{O%bCTd5a8U>_ueDaI!dw$Oo?oYjbo$vLmw?WXpXjtrDAU26 zhO2p9J_{mqkMp-1pph$Th&6ez0}6@+!F?}FAv>h73DnxMOXxM2(yMbY#c8dr;z+1q zlKC+naWnifgFxw(wb*dIGKT0s?W|n5-`K zOlygnQ|`rxOvnxb-}ZP?)s}(}@#_J1rBUsVF+yK3bviaYf2(F~aqYyK0pxVmI+)51 z%myNo%U_6`M1^a&l|pyM8-1a#Fsmr~{>&tiA5DX4j%d#WZ2FdP)*!+4msU@L)^=9p zC5|;W7o5}iCv4anE+J*I>>Xv+z@xV?vp8X{a5E^fv49iPv*o>g*59jL)9xN9SKd3w$yPyC#=tEgb}ZDAutZFu0k;^Jw>A|Z#si>AE=xP*8#xjrW)D_{EaG6 zYq}-}857!VW!{h4LC%^VGp$4XWD$&70K<*+#`NS!2`0xNH;e}H9|f+@V!1a`9L5zc zu;0~5Nw|jEq|kZ_N!|gwFlvdt1ERfjZ(SDG#YAvAV5jM}>_H`Kv5jvl=2cF`$HMfI zPWGjq52>P1+no=zD)7o^UaoVkx@vtz|3BFyo5V(V$vfLfwUu-da%Kd{o4@Y{eA_N% z+RtH*P0mZl?Uifg&UItYBp+O(K=j@#*xVp&HoCDi7NNVXp-3PR=W03Ly^WA-TtJb_ zN%PPWw0lH!^t_{7a+{ik1%b`~J)kh+HLp%o4Lz9Ejz`{8oxI~!pbQ2e-9KEjlFM}{ z>uP=G{GYLg8=k+klSOu$l7(ht=v-;}K5g8IbWh^cTlp&;AIo`ST|f@%1U{z^P9)W( zD5u$(&bq%7w~+NG6`_1I!NO}bt=%a69I^a)DP82hnjXBBb;OUpf@7tBuA04_KzXyH zlXYk1_gC+js6{;&y!H3YjB{@5KNtbU7t_>4qI`^{IN-^)%HK}}0Zf+T@d9?azaZO7 zNJJ(*Vs9Uv=9GwV9LI)>@KvG<7K zyBN??#y(prr$UIcYVWto<9hCCpYm`2Msi@XDmuM1DkxcnErz+3U3xITPjNW2HTx^F zipC+u-_8397)G^f02O&bs|SWygw_5n!wGDz11U1Z_Ls$(`^)X<-U6Y;hGHzXV(G+N zxg&ks@+^V51{{}1M`vuyM}d>Dk)EgGu5bM*qfeqrNoW+m=mk!1=s8@5Jrxe=K{!WFeIj$WBe&&3AnaGl0b7oHNezM+& zu%TRRZFk<^0zDFoBq@XnK2Aphldd;Y&ki!e`Xc;aIE8@4`A?LsxbOJd!{aNfUBgE4 zhh;_&yP<5fR+Rg^j5^s$?dM;F|DWztBy*Ism%G2d8Yo?fX3ab(Xlw~L)i`az-zfcw zexl>GIYB)S;eCr-Z+Js{T+7cQ zy=FaJbgPGLPXq0&@2?$j#%CBskXLYn{ZIcEVea7(iepK!lTV}^aXn5uBEboUUwnvt zB<(J&4*w-zm>Y~qcljH1Xw8KfIL=Y;`7(A0_ar8zxvFOxXng2%0abEYv%Ox(!{;jV zImmnpsE)&lejJ+i*hFiD-gys90>rN6#Ar4%j{cE;4j|#LxQ;Q0p4l-W7o$2cuuJqP zhEwwz3=2wy?~P6g)62&1>7z6}wAig5$Qmp@1vnfEe+Nm9S$+uFaTcz_g-o~0?^w$Y z^Rog>SlZ#jsdGSBry&?{AyLgdl{XU7UHBXz(az44rR&<~W|90}L|uB9P|WhLO<^hj zu&V7kdSH}{EFb*|DGCa`C|NHTHLVQ-8=7}P`3Y_qom+oW-v@?8J8+rN# zO)?TgegS76MvXdmf{&o!(XF*LL$X`B#|mGy>?+HhY|7;G8$nA?CpP{$=k!xuFS(H{RiBh@{5&!A{aMbcpC9Ug)6!V4|2_0L*CFD z{^I)ohzAP>MQ2>S?UM_U{X8|e@SXN*=l^+_SPe$*LsnL{IBlgGBq^iep9h+{Q1=j z-?1jgmLntKeYmpmP77~h`S|~Gs%0q}Zf-0Q+B)E|&zpVU=Bho+x)%z-`w(btQ`=~{ z!ldD``7XIfQ5}r$#2!fqgm`i4-de!|W~djJOWGV#lss>jUH!FVgA zrFsLCuzu4I_~7(KS`6m4-jR+2flZdijX`x8`1se8n$+?Dan|(Vzxoo-rQLi)>XnSf+~_zw?+bH8i))Vi$!JXPQcKiiFCR-(r4N@A_FDtR z$r^La?7Av5W}}C!odUI=R~;oFig@LJMN{G(ag z(Gel)J}<6*RXoAJX|$1olC(`hG*ow?wU~wwRAZ9hG(s!MOi>cCW9+f^kCR%!SwX{o z3#ezJ$&H~*9aQj=6y1!$vAQM_Es}$oR`8C9;!#^^HN!n?HI_vK8q~ zQ7bJ08iyoP3>Tf?>!I_q(iaAVdFSt{mb@;v)*&|+lX=<0_))k`ZL|Lf4- zu6-mAntW!%k~+%qcNF;iZMIAD$OY}uG_wul@{{62dILo7G)4t53fawUH-{{4hS8NL zzIkJlE^c?6e+|*YFv85?3UXZGpYDLo=_ID7D73~aJ9R4^@A96*RqXIA_RL?_FFQi+ za{niLl(He6K1wVBV6LVe>)nV}(GoQ-ibOqp>QyV$1*mCo;PooRmyx2%>Nd?`h-*D8 z8FLGT9S1a*gDHWI%bkGqR~yAFZ>wcpF)3C0Ss=W2CaM% zb#&AxhqS;=)95*kNd>U88LR%nrmZIeNzXfV^C!t2%0&ZTh05^lJBku_B;rY?x z^wHvO_72Q2sY&0kGO~8<*<7-|jMnjtSxrx$g2=$p$eD%SX$Pv5Sr+8oFtSE8#5Asi z9jawK)53;egkPivsHWo)2KP(=c7dGMwSw}r^o4^&Q4Ixv>L2kk+ayHHfJoT0%xN|c zarbt+9#3X9uqM|ru1-F(Jg;8cYMgS!eLDWaD`CF%0O|1xY61Xh_7C$L!}S-myL;$E z-`kn#_j&ZJm7vV$0tvqgiHHyoHpP2h<%rd@&LMca8YH{~cA5Kgw8}tOBF9xwd&gw> zhWg=Bl!wi-gXErZN2mBciK=-dTBBmCl1?!NB!-xd`qk^KH}I}ACW0H{9u)20)fPqk z{*o)}FHKLocrff2ywGT<*5LYt2EA3fqxSwe^^;Au?Hm9c^l0n8A9QJcX@1qiUmi85 zy(V{NabpOp<0#2&`V6yD8w%A8(td1>-YCZVWR|c`D~rTFMD6F9V|>ou!GMO9aTfq6 zM@%Yty(vp7VJO4CHuR-t>c8#*%$E0MtfgbAPt;tg--vXKMw_$JF*C7HOuZqV8L!>) z)zX2gQn*R@sCLdlFBVehnd9Ub_gj&XSV^T(*E+$xZIRyweEIwQ{RTASixa`i`&%D& z7I0=<42bStn7XA;ED8_v*HF4Yng^sW3zoN{6nTQZNvQg_3Ae_H+ehTmo z{s4~h|No|{fX<0V<|Pa0pS`Yy4C1Z}-pJYR*L)AqCMX4J;64dBCv%rk&C5#M z3DEnIG?sCZ7SS(etB(;`-Ej~$kiI>X@nGh5vJ>CUZRAmUvk&hp!0>w#OyB-hpLw}( z^tic&SV{S1L(#D}eJ5dR6D1Pev9>LiM0QC@!k{U?=nxwKMIs8*Sby{eoxv~R|6Tx0 zuQCa3mD2MZc3#j{)Ezke6{0Rw)-_ucJasPf_9lJJVJYZK>N}B~_SUDVKfQ0Y1siF7 zQKcddjFN+kCS~Iq(O6;s20s0Y=g%6IM*CEE!75<|WFz6vDE-y8Wn`@HeOe`9PuP~nXZK;k_jn*W78542D&Av6_DItDBIyZz1eJxD>~=$Z#8SDXsj z93sM6ZDy157si{~R(v>xRgU10Pbo}xw;}j6CdVBW(BwLCMYi4&$LHtfXO{V#Rdf+3 z$u-hEoF7!Xzm4|EpE2^L!Y26o+bbGG7xULswk`hq>M6Q^Q|>qnhTKmx`Mk89TQ@&G z=E1k}=B7`7qXG8*jUzu+F6N79ik8En^r?DFF@_2QL}JP+;gQ)8^Wr(+PGU2#Z;l|g z|F-Bzy&~6@e{8PN^>E%WOTLB%MXII$Z(;a^_ML}`nSkcTleBXQKBO}rJVp)&Vw5s8 z;T=)9Y<0j?I_2t6{l`(l?@utKqhX1X!fi}@xVFx~88zKSVBNgc%v{0r#Bfn;sM-?d z;FEUzNTvdHS@=B({80gE{%pIrwKrhQbA*?Xa>A6Q%$A|`>0k;I<5?-GiWA zx^~g8>#jdLm~F#=3Gsymj{pVTE->Lh-$vm$m@X~TIaEoM&kC-V_=1E8nOXtF62oRl z{b(m7jj%@}e@(s>959kEx30@}jO!RIt3&OPTfMFpD_$!v|3hPih3*rDk@Bd0vD2Yx zk@8;a+NV+dn;OQgaq~&f+=^Umh==6cSYjIwHvsH?8+yh<$RtnQNmt}^aYrmhtLJIi zYW&IOdm7yxiTo%^5hV&43~57Y?^kAgOKahd4e%V?PKazTmF|)!gJF=!=abKo=nS}T z@Qz^m{(e>>KDbfI$bQHoGBo}4yB699+D7#9KH?dn9jD8iI)}>!YBpl6D z+-Xv!3NO#TH6U=PdUljwjtzh1^-R2$WjrJ<+D&#ahy>pDM*9rsx=><6gQcQ4qvG~H zOaKbGkEY#3oeHBFDg9d`{2l_=%7^7t*qSm}`Dn#G zyPJ-_HLi<4kIHWr09Kqs5woQf4n`6`gR;$DfE_bN@cpcDcI0>B(7>q)i0atYtA=yi zLnF^G@AM>7wLmuAhPO3dVXItYQKd>LY5NWrg~6HleSZt2OH;B0ulb!cugxO26;^a=Aq2?>TaFuW%%*Gub|35El3LE6eqX!sD#O1Ryp4Fw*Y@VIMKdgbmAL_ zUK6cM36I1D0&O8u`O};VFMC=$xcJqdO-QamwgmS}`HI6}q+m)`z-tWo;0yg*O$+!m|Y>+h0s>?b5u)4csc^XSqv@*MQ)ZR=~2s7}FCS2|zIl{yMZ;&HNcoADXICP=I}Y>(|`I@<3f^-wAt^{IlF;%+s_ z%agEja6|c#JhMtHKCMN;^e=8G{=eU?CGKADKKTQ05TSMQN>`e{0+)R!iDd9{q#m*N zzRBYVUt2OfcJ9`7Xj?fljC`$a6g`*npc7)ZWLg^N^L@(|SS>ZVpY8E(4&P7lJs=gj zMK?iGR4?~+aPHmNC%wxmDGUU32m?6cN4Rl!6@6jlU^b@*v(Iwbed_UHqg`7T>?*+- z&Q__7^a-1Ws19$Hw9v}GPK~r;q3t455>96?YmtnpczjvZ3Lg>hz-C>+lIg7LJP(z} zxeGhRpfTg?Br_53<}beKc3T=obyL`gZEJebx!yBa0o=bBTo%!BfZyBw&rh7jAL3W? zt8r@AF5zEv!h=m({H%6|&l?CLUgB{&K)-NYDl8W6ZK&OX%O+Y^z-n$^77sN8tS2hM z8#u}AtZe8gt2IPi3{IzpsV-^sZaKQB8DZ~|_e-?0En@K=I%u#l> zLdr=;^Ye}W7Fs~l-#fjw&R%NVaw>(H0ss5MsDTpcg-u&d)LreAFBAY}_)6CxFt4w9 zd5jIVMWRBE4<$xpQSSz|sGl=}i{?f-5l$mmUem4)3QDn;V`}KH@2tnFaLq~v$txo+ z9P@whaM9agd=ywzp<1Z|URu@=`U!(U@pAjmi9$Bvm`5iZ)`DRR>VFRFJZxaU!X*t0 z&Wv3IUP;5Oxts3Ohi%`Gi0xaIb*#ZYw@N1L~e^Y+EKTMv1;*IGsGB>ZjsQ z!oTAquSM#o?E*&V#u7H(57#PF@5-~KnwHV$`%YSw(~dT(gJEfN^zFMIS9)0czH{k) zfCq5GHP6-C;L|uvi1O4A{Q~2Gu3Wu0-F~RilvPIekx5Wz?uYP;HvDyX)X72oCQc2r z0vNdq-WN$a^qM<9gbgYoo z9@3G(*Yzuw@*n81Q@9SMs{~(gUdg^3R?u~jI+*xhyNNLf{}cq>S6AQ z&AFJx=LopACWEveiEx{-?B?y3fK`jj z{66_m%;~qR#z1YEsqbWIwPcwtueV*2@;Z}V`HhEap?}DGUb#(LV!|DxGvO+YWBWWs zv?ySg4c&drUQkX~vzpK7y0o-bTLy+iqRZmTn>=d;NU}w-;b3I#>bQ4t9X7~)4AX^( zj(k)3MDe5V5Kfs%811M3LHpMM`A$1A(W%?sS!=1}h&FAzigVAkt~ z3fa8XXDNP|KTHwoI6okf@S6^-)j$I$-#;f^yZmbGZqoU@!d%OMI2p+jV3!tb%WLcM z){l?Qv`md;xu7)bGd(q^{T4z6@m2xllC+=_c}ic67V!6~lAU5mTByL*s);r-1w_wP(*?%n6vb9VRap=FkrF+-e6b%r$8b_VCz$t&%{)d@seuTS1 zoP9mSlj1asL~All=?6)%b5if`k5all;yoQoeIWA=^*;6Ir}#@|1)&xMSBjlt2Q0p; zThx$D$8^-Hi{0a7RN#|a1NvRt^Le(#I&<&xhcoeoU7kq)_Xfz zv)1U_e8#n{pSR#FfpOL{pyf!?i|3HW@t1Pc?K)Dm(Rq$JBfH_6TB#o@+4um>_(Y5L z_suJL!lG=4tL`*Dp0U3k2YiFO+P5cYmTe&eg*`s~-JoRCVA(f;-5@ko10(KzZ zN|?C3zR2=mpaljF&Eg1D1wZQc-dY=+7=)~ejSy`JH<|+N-0<+_PH`?7)v=GinVpn3 z7diT>Yy2Xwl^T5(OR4*u|3G8}8ihE$rR1I#l!~=OUau5OZ%Og7yse)MyU=`)l7dNJ z5(g5O@Juq#?Ysw=*~3@WMEu)J!won5{p3uMS0_j~usP0?*w-Hm{n&=StIt<&_}^cx z4y8Qtrg^OMuHUc}u-i%Fi^&9cj<^$geppnuH)!)9)6(KP90`5+FY%W zs>nT`&l+k$uMqwyhE-A@qud~w>zc8EutBZu-N_T@K2$sebT1OvKM7iBq7_Fa>0V0~ z12Up-H!X$h!mE|Hl;NQwH^{_N06VBr?dE`C(meS7zLDO<2$#tFH6^7mU}ZC z72HN0J{Vd#wLFF1j!7nz$irMXoK$nTjMoGE#PI>%<6u4wR%1$ILjj~^@3Ryr@`<{i z8hKu+~s6=B_Z>SPsH%3#y%Jls6}II$7wXY1bVd0Nn#K#!`0riaGrMjy*Mm(T9<0sID6rid-X>NCfLx>1WTork8ry(-r19SljA-wX6 z)y&wL%EiJNvD4e$YG2J3_SdS41fpo065?PFy|-Hy#+^B zx4?uH`s?FeOJs3|js&lqx%{RmbBCW8v!?wX65)M)sGXb$U6pB^5mOvRmM_!^#a&p> z+akbmV;X(hS`G9wkIQL#BTuvA*8~Iv`w3owZPw@dqXB?R=MMd2&+OviZ6jKLD-Rrp=q27Nu>mSZ?(mp{pJ%&F|5j{O)Rl zqUkX-@-BSo(+7yBU9{sBvhv<`e&aAb7wf|o8rl6zH~~Gq{tK>+^^hNySagTkA_jv9 zzgp1HQ_4x)C^;$0ZOX%Te`4c|9g~ls$?h!E%D>0nEU`b3fd`%XddHG()fVe>PON`j zzgRDtaq)hNNpXW8y@wzm%c-|Hy7xCTv!618lJkwa2Jz}vwv%H^Zj*7 z6rk;`<2A#Ye$c%}8bLalOo*wwGk;Rl>8OK-(*O{=92R~?0sLzf;u#&@c3hQ2(2mK~ zC|nAT(G%k7kuE%pwz+NS3=Vjmi!8l8@nB4_bJ!^Qg2@3W6X@Jx(jSdQL*9=adM44 zjdkjgxMA`N(!eg`RUi@>vKetvvOy@ug~QP5SyqpjaKs!@7;8x`))nHVT`L@erZ>9LhB@lVn~!EO=y-4q0`lkdD6u`BzT})w;m}zy-}$Xvhl_~esuJg}M0xv8 zE0S2(1^-F36W`YIW<04Y%#k*07qUDUJ$YiLzUQjGSAUq-&UN~0i41d|zhxiYSM&)( z0Wq1x%}E(A?*w|1E;e(=_2nqPNNOz19}6A6YQoQuf?I>(^<62TBWz{nDqPnl`kB1A zIC50{1n0Xs}~nE3Pd(yWW>va(%bPWITQrZN)Y>F}6a3Iu zA5Of{k?Zsb@~D3pyyS@Xmmt*(XN}1ka+u27Xpiy164`Suq+V&1udM3qa9%`y^Yj}iGtr!L*qZa*I$Utd3Q z3q3xsLOG1!?t~62F$b=I14bc&clJ)rPHdt+N(7QQ$~~}sO2D;lu}Z7n!~flI!-j^w zrMeswxz#ZinDeEqIHN?qNy4WhUOYMmM>}czG^^XGIUi7BKUloeV3}NDQMPwn#QEO7 zNoLZ7+}VW#xCZ3C5AgR)mWEX=AIx{UhtYr?E$b4MOjy6ZehJ;BGp?)RrG(4i!tm$a zJ4#PFIy`>g_wY*hueWYjaWB#m>S#LR~I-%-G;B6mDOF-$OCk&K2( z*6)F5;nmN_%*NbgGPV$59IcOmSQ)4;U_ zy1AM=o?`CMbT7f55~uinlOl-iIgq59ZHf4oq6N@m>Ckpl&2#aR^7Yx>!9h zMJC+UvLj~CY7I|*Tg)xItmIyQavR^JH&g!htxY|6kev|; zet$r?Gt1Y1^O9hGlPin$uNO^%GnvSYZ7Lu>g87$6zidxOXplc6;6AqPd#NIfEQp5z z<>19~z3i8p3if%1pC4nY{di7ybnBIy)mP5U)H(hfj?y0y2w{Jy&(=Q8n%Kv*iqg7C zo`nX@ym%%=@@8>Q{9rLg!j&~MO3P(Sz!CmJ1@L#e7RGr8WG3k$i$Z*y{w@(M(^&fL z3TKsp`fri3w={Z-6MB$OIBV1NANyd3Y>`Opp5(t~rWsI9dfv#BU!zkQjM>xQ z&{zoqzy(bwi0qA2IF1I|7e=YXnsQ$qL8ne5+I&K#SDtueWT@Sa_64O|QbzLS5JqCR zY>2f9T}5^cJeYiLOu%(drn^^`O`caj*aK3pD*q@xc?ZpT7{o=YH%d!K0Df4Aq**a$ zcZ?k>wn|Rpu5J#Cd&pHD4N1*%l@uVcCQE+mrxjo zx4?jszievbCpjtsv>pB$CKBk8uoq38@~3^>8lYuP_z_>~(mZfm0;V%qh42mPYhr)1 zeB$X)!{-mObAZ5=M-l*Gd0Fw5GkHBM7-zqx>GBS7Iit@K8SEViG+&?sOV5wsJ=m|E zbRP(>+Iji4nH9OAbNesKM`gkzDv6G(SqL(Q9<0Q40 zl$Vo2)+CRtlHKiWH*`@gjP_DR3!l)W?Yk2wdh*BZP-Z57Gdg{UGz1R~XYw<;ZHBu#r>o!!wuu&u7EuRqanx z9lY%&)`xZB0%UJw!)K<|_s8d%@Z8gyeLgu^wtgJ)c1XCULk+32|Fcq0_qS$_CtOjO zkH_D2PDAyQPw2=)1o*bbGJ@+7O;mX#L+9kqz_P3500B;qlF|q`5nI53*o;WOjLzTZ zrk8(^r#UktEwWMB;jyTzETb#bUL4xpM24AWjhd`6VE*{;BiO-gz0?0M*4&DBnl=fa zrwn=vm?#Vmba&O#&7c`;N?! z0fu2mFYnS3dt_e&o3s;jl$!L_P(4}KseAF?zD@^Lwd85 zRUCCBjT8<$eNMV_rID=GX;~~DKE;p7cQrw9fZj#>trT-ase)$)i=?`^tKe>QX0;r2 zuhS%7baU@Ak(s@F+vrde3V&u1MRcFVL3xw*|GdeasIn}09M^6MTI-7y$}Han1G23V zqZN?J+xA9XyX|LVp)o#JN_x9QvufFRFAK)WL|?Zo+uJN@Lr6YKxJZg_ zzp8r|S6vMb-nw>@c*jO7a}8rX){;$K;`}Dz7E2U*LUh6Vc74__<%GPk$|PYO$ikqa z-a&TzX?&CB98;lknjG|POmHrwobX^*BG}^1$qOmVulXRri20=)pWWK`9i(NWrM6D= z%z1XufS`O5SE#Ees;Aq+mwNhtwwphWq7hCGJ`|`Hx`mdw{^ACwAGqa&j3GRwA4|esxSwTmS_RH59v+N;BV-MDyv$%LU#(8O zdqu<19F^>!Sa$8vhtu8u{eq~{e^S_pzL=nt3PYxT*ZJG>!{|a@(FBl^aQ|3>EP&-b znB4w3fslh6`~4xe3a?XI@8j58xd;8RKm3tiAGTI{ewh6gBn^7w#;<}d{9wO=@hL5T znG^F9hzqkjw;PRJRHaBKhd^1womUIYxwSv+MXjqYrAwQ=A9z!o`;5U5l6gO5dEIPhmeNL^LO)$$}i;tX*JH%wuBcOEF9ya(@2Y_KMCopaZec@LYKRp0JtBx&lV z^Dg_Bn=Q51J}n)#hqciL$)! z1-j%!mDF_tw0u{mjyt=<3Oe5De3+rH8W&sqFH3|1*EIJ+@Xxq+ui}3RZ_&guduXuB@UaHfo+5 zcpv|Hty-ROok+UzKG-gNBM1r2NdlB&0;$aUjr_X_?t(kQX{3XNf49w?XeS=>ffmnK z6R{~C*)ThF{HZOqWS4N}s2YNJAyWP>Q=i7A>kqw@MRl!8RX2v;a4v4a5*+}|h)Z5Q zI-!Y(P>SD}VO24;LowhRWu)Kd2+?gJ@6hpQ0csH8F{cOWGIJhKc7IhQl{R6E`om|T zquhyvZC{|h{X^<4G+XOAdwI9tYgMIz{m*k=_MUh8el$_T1d+q9!zfl`7QI*K*wdka z&dpT?4jm~9y-SHfIhgHgsN7%|a!=hJgUL{DE!+7{lLL!O8~Q5d2RMnKf{ne7J-Vfw zl`yXgXc3XG9n748()kEUClYcmZyC44G`YASy=8c3CoKIn6wwLs<_=D)F}2}}HXla~ z2!eM~PFC38Vw@a8snOnt0rmTHj`iQ|N3&m_8IC1^Ts5&$^Cdo%6TQd7>=Cn?Hz{05 z5#RvfE7E}A4OXU4$_XKULkE3i^?xc#ZJ#&*n%Ja%fAH@L_;TNFWtU~*QuC5$g86q- zG*+W5lhor|YfYL`kKbz^Dv>#T~=DPGvwOApK+L@Qj6ABK8 zL*Oge_?%Az|w^}7X)nW_82&I__~ zezwL%v44wN^Ugx9t%unn6mWHlM$KN)3>w#IXuamnfoltpe<9$e! z$o5z-P5JESi$7KBa9k=&aY2-TGC*GU0sT_86zx_adLJDN0ePBkqrMakN2)R6u$U-> z#z1Wd6x#s|8J2=m(0~J`uS@pYbd>p`=d()8R6S_lGD%tBx4tjt94NI_6-e z{hrSQ&hP^NRH4YwTqoiVW%cR-Z`yNUv)u!`x3rvg^sf5aM;MEu?k&ZwNsBtB0sYR} zdgX`knV+%|k-R+{Jwo!50}W@kiCbJ+%)kA=MEprpeCbI#(k1rvsLA~-df(Zc*YsB0 zm51npQy({xGLwRg3Oe~W&&{5;l;OSf-9c>R z_z?O-vK^IV#9v=D7?$sN42E$!_x3hT7Tec@83t5pKD83t6RJ383&J>|4xL1^p$;`{o8y;xF0=>lU)DwG!ywFgRFnf~B9qH4$Oa4F3pzE4#MY46m< zL9Dg-XHO4sH;YEab=kLly18UWYS`vT*p5FRAKEj?x4lH^_Cxp5YR48cYW>(e$Zz1B zFR@JDv@ydQI?sSfbA-p?@}r2N^5$z!dEH9K!cRO@Km$GH!DM`cE8hWdn5UWLu_Q4L z2TZ)udV>JwP?b&a4>jAw%uxAEEYS@uO3mk+ z{=mG$%ABArKh6n`$>xgxJ96$R0lq^`rzc$}jg+C7Ic#D7Ec=-7GVxbIkz zs|W#bE{DSA0Utqn!9YNVh!xD&w@s|mVPO0#IFjF-!{ED9$+LTBxTQCD(x)x}hXo2i z&AE8CvC3+<@7tWfg}{?iAKcytLA*arP*!YZ6d5cM8qi4IWCcYJrY{%XOOQa4Zf9X z*p($FR6O}|LHlVEt3XV+)mcw5X#o`O9T#IG$%HR^-Uh0U1T6Fg$TYFx00s>u8~FU zE924&2D&s^6JgEXik~?~HE8gpKzeiE=6DFqLYj+I!Q^b@hYcoS??;l6OVbll6XhP+43W+pGxRB z$WNa39u|gxBGB2bfe*+EWh<`WgI0=E^ULvYipoE z;`|bZ8^5zh&~1L><-2z}B)jdu_l_TNJKGTLlcOa+TDV>1ksvC4Qo{zFZbbX-ZsHxN73Iho<)V+Q)rdrO>KUD@DTn)Uf_G< zC+~0_PUOzU0n3zUJLVC=(XUm&e8aB+bQlGF&lQ>m z*I9@*JMAp=Li<>oEq;T=Vs2i__U&lM7d5zBd%J}+j$R;|&IJiQd4WO63p*sQ z;N)dw&`&UqqVmaEE4zN_=a)fhj8K`)lx?CgUvQ>#cOlVkK z>Uf+tQu&hzR*PRFL#9lhxorjeoX_@0+Mq@OmhZj5;bv!Yr^C&K>wO;`h`V{GeA)L&|Lj z%6BaqTzuL(?NiU4a`Tx4^px(xI;duYYWBAbE%b{wtH4UGSi52=|8#hBfnUa=M zVo30^Pn=W@9gtVY+9c$0I()(;uRCdL99pj1iuheG^3-9mR3npmFeXp&Aye%uk#-{O zh?O5A{I9q71nk?l^m-qGM1Dlnc$j$|a)clm_7uOo6xskZ{P#yC&X80}3_YgOd)F*I zQCc4BuP6^4hcxJAD}!RqfUxOfI0sn($i%DN_Sqa@tMTj@NUH%+DoRUvVijx6R`QQy z7jH(!pL=>cmgFP9hS43w?Dza>-OwJlmqJF>gC?+&9jkjO#H2-kxd4d(^AF!(*RvOe z;!MA#h`%H1r5&;MLfYDO@CT9@pwHWlN#1ax^7AU!y|&EG1IhQF`l!$KEu~XcZOy|( z*}&SJ0W69q2wKRl2*Ze?CV4uDN+2PG0T%d%QbF~k+XI?b7Ut$>RNGQrQ=y}kZNvLK z*!BVP08VR4g|{M|l8UQD(2efxP8y$Wy>FfRwR0CO4vTM}}9b5&KuKc-j##8UqRZpxb1|N$b{TKn`Kbz@1w|76a z$r{(a0ey0PI5Az}2}7AE6pxoH3$8^Y(RHpBcGsa~)Alw>H@K(m2?NjCBU;D-{#Hgw ztJ?6GiBdMfCNzxEKmEL`6JqV|>q4o5&0p!x3hiwPrR=^ZN3y0twm^o%z#-w|77SbA z>-ECGv(r6)M)Ro&UMqha_l{nsNiVL{livqGkaRC;}csYQoaa@5EY;k*z9!~ecHFWfpNa-)M5E20G&$QNK}OLFR9T7 zg}4nLBGqUN*{K3Ho4}~Jw5EV>{n$McmjLr$DTIA($qUQf>Pdy#>2Da%aKuNoMfTJ0 z6bgrYr5%Xe@%kY{=h@XTL+#Cf2!FonUip4T$-)XSNbyY|Klvx6C;3D(5zzya8CF!|LMd$f>kgcly<42buJ5a8-+Pj#hn}Ixj5lO1? z{ndm#Z|Cz`@}`dqPW;~EzZlNbb>2&SLA?6nKOB^~%GO2$+tG={O(}y1tEgaeIDFw4 zAI|e7w`G`B-?;%@Z5(XeuWh^4K(n}he|;7{D=##w8u6TAwN|O`d6KN{IycvQ?5~4z zH%h|^(bfTtU;XAH4c9y!IP(NGW zY7m0SCT#JeF8D75Y{^_}`{;H?;#c<)u{MSc$F4WR4lVtqz)HEg^7d;l7LlJ6dTE0o z3njfnJfJ^t?l&H(TsS2aNIgC1Pt~l2c0{rUFy$_C3s7*5HLLiunFjbSs464;L|w`; z(l^7AEbEZcrbBtSz3!Xi3@IGkCM6lDk>P_gUCKI0Ie!ISZ=hHoq3HN&J9Guf?h)lz zbk2bh@8Bx_+lU%nF4ebH7JB_l(tP#Qd?C16y4^oVBB>Fvoyw8IG*P&2Y;8ox8JO%B z62W}sC+>4GcNzk4!YuebUEaX~;{{A;aq3!JL203Fk&ECb_O?}}4F4}RiOWMSR3N$T zcing`*Rl>mSbR6*qSF(gns@KtZ91BO>`vsHP5mo>c6-z57mP9shf}XHUMBoKJm@Uh zuGyyes+=iYf<=qckp95XTp&79@}b(=W>qsdg5G$&&yW%gU^iSChWMJBQ@X{uYC_wF z^JO}Medj7`qU^EgUTzNlESYo`71f}5j z5N#<~da6gC_#TKk*aB9Cv))JQ*!=lb`AMdiA4{1W>6@sb!hVortB+_`yp6DhHw=D% zC1R&HDeueNy?vH>?&ZQIpYC2K&{}sM4qN}I+!+^g)=i+ep`cT_scSl?%u->(dQxT> zdBOczNQ{*)R)rIT+PLhmX9d?k8nt(w8z~u2hLD6et29WIts7c4`F?OU`muN=kGLdq z>>z;u#O*%-z1$BDN^k?YwkXg z^Od#;slm(ydK1D8LB+SD0tvNJY$S^d{QyAKJ^T2Rmi-KWs)isM<$Jgi2>bVCqz-nRI9!j4&)qlq z<7J9>D({SPc}fjS*jv|@%epI-W!MZcEruxXg0-xzMN~Ny`z)u+sPiJz38LdpRuqF; z&-D>xX+>ZlZ}FneWgVX!+c(lHm49-6GL3m(@A~~DP&pDHFC?uHBrjLZf|064=)aJc z>Ok+HW`8?q$N2|L=N7Roo^cH<8lIzKiK)Q~#d7)UuqCHLDlQ!H9Yc{W8Wv14Mz6s% zy%!ezUodro3Pw~q!Spj{MxxIUiX9v1nTGacARG+$n?tzD&aIdH27f~jS*40$HNh%DS#Hr1O`&diwY?F9jh zS>OKkSa9@Jj0n}(aQh~I6;jePW?}sX7ZK_uDdn!n3|tY&$Ual_gtu&r%%-5 zaa8n7aasPE%oz*PCwu2`_|J6xon@VY=iDq)>^DyqU_uUK8}XgQQJF~)E~yO$)O|xw zK>*a{Q&0hhy?=Lj(Y-6%?_RF?sB4A`=ZuY;{LxFF&IGDc$&Rr!iv;9ExY*(AL2b(3$%V_tqjw z&)jv(0Sx=C5VE#tYLUI?MU3m=ODFgswGOU;@p6(~3Ka;@=TCXRjUq9jyl8R1+3#fQ zo5l4Z*d$`a=75NTgVL5gT5KDL%6Vu!2>G_G{P#zM2qJg4*H)Ta=uyg-*IMfhM@MO! z>8eW?hz|G$wfSCdr}s(mN-WQ?J=sMSqG>0NV;A?t8q{UGTKZJ@NZX{$^uvBLsvjb zl%S&&^=H`^1xbA#IjhWtl!1@uJvD!#eCS&o85>;@98`%!?&pg0eRa;2jplprmx^By zg)fOS3-7N=stVa(?gzxm3}5ixFgOLlAD|F;B6R2G!sV$(PwX@FnnNs+I}m)^_Ve_G z;8YS5I7{MuT!nf~ziL>D`cn|Dp&!xwrjG|Wt`Khqs>(*>M>(e9lZ3k45l3tB9qpe& zTw2h})2`pB%ez=d4j{xzpwGr{!Vyc=5B)sB?L`bTHtHhMGwQi29cKkOcUk%N4T|*x zK4FP>#Q{)(^Ic$i5u|l;_;Zj$w5hr^3eq;g))-sh1DongA7=R1X2uR+7Y>s}KW*g_ zDCf+`)T|_Y&va5>U`(i?k+^PA2gPpd)NNC z0ZQ@V6)1bsKc{^eh?Tw2-ltd~vYbwN$*TcuVKS)7SfHHJrdj%4szWNEJJ9YAfNf42 zIyb3I9tF%BknoBU5SGLgurOKd6FFhE2GXCfT3|yQn2vx6HW6eEIM|*7wbQYCtKBwI+X5fgqR5&49J-O5BlZg_VWWr*sunAwUZ_s4tFeOP z%Yjn}C`u<{q0u^}{vhT1Z!Apw$|a^Qa^v_6H5V}Y2OcQi*0Th)2X69 zA5=ixaDS#sbdN02e;&<|V6sdj!5{bKGyr?z`F6pGmacp7$O$^#*Gsd$W&2=`p!7>o zquPl_e54r;C_VPS&+;$7viE=Sn^&F?k_A#!No1-IIj5UFpkR7_#qUKC@iK|#c4E+p zdegce*tAdBTFsJROmmhb?c01v-bu=^rd8!h>b0l{dSE&@JDwxm^;!r-yiM$TgG$z+ z87hXS7H|Ama$RU1df;vwo9W|~`8Exlmv-Qxf$4eByDu&JZte4#Bja1gSnjh3apy&vI6`v} z3+^w<==Fx6cYh6$CBl6H(InH-y-0}flOzeLF27wON`W<{_X_#M9@{iXy@=%CI~0eD zoi0wwE%llk2`bgvU7O|K6OaFId~LzO#Nc;6{n zuytY@;FkPOL=ItNmP?q4qw z=r#-c4jS?BU>jxmEb4 zDtJEljYEcY$O?^oMWcuTx*P<$69r44pD`V1LRKqeCGbDIbMJ9&z4*SX0sDS;XonF8 zKk)T|tp^RaQBCDnH13o^g8n!Bog=J(C#@TEkOcoY3L-5!V@ZwR7!HXAvN+GFb2Uf$ z5Mv`zj8|)?G$)gh>(M}7i!RxTFxy?*DpULY_S9wd+fSFCN4pi8d$IIjzs%=LgO}`@ zRcK6Oe(P!au6_pmxRoukHUJJ(9U2fIx<7qW2CJKCvO|vn>!p0Rz`Zy8b!KpHH?GK{ z0+;XO%khwZN;5TvM7vNe@3@0pF~9Dktbb~F&Qs3X)pOTY=*(*9`>nApdYYa*BfF+y z`-cM~?3;IeFA5T?7KJ_Prv!X5K)V76MM?x(#RRC#g$4PrL_ayciu?ffF%AYHC0_XLvp=YnGO&j>)F?XHnaw5C5_A5UiEmN zbUZTVirS$o_rrpHk+8z{K<(H~VpMR=-uzL!V0!k23!qGVIuBH-g70{!qV~yD?-bUo8E&h{t7)l35|pu>(=&pY>kjXq z2FvwvUaHg|Z;~0CM1a0%uPo#=w1Je0;0FTC(`g zPeVyLBhhKMhM$-;i0$1*db~?9lva9Dc%`gGk$Srq4FQbMaYhRgbpb!_KJ^uqvt6|r zGVhV>p7ZQ66DsdFwi}gx8JruXXbCN{q|Ns8Icigw@gF)Y6blq3>uu!-L(wPUTr(+I z4BtrDs~!9R{XMQtb&&2jJA#e>7Lj8?dmxDtOOiMg^nLeO0x0Kl7@HD!$4;3aWp!bS zqfT*~489%3o*%H0pJk#HiU_!3b0iLOJF2HCu}A&-E6p{`VjhivOHZG#&T|ute^t$n zd8N0+%=PUhLRb9x8{n%(T%iaOpw)XzWPl*B+AgLnYupbT8#^NQYO#7q*|qHCy(Z1> zaJ5Q^rMxsgBxjJinE}60&1QPr$!aVFj5wUsTs#vXEh)4@ zJ{k;X(O}v;!xv4k=B;|;#MuUW!f8^sah%}tICI>po#+W@-fY_s;NJ@q4>k~7rzyKCnmySExdP>~vzj@?;ebm@;|&9o z<=E4vhI<1KtGMX?V`UMadBi_A0Yb3sEbX{qohA4sz4E;vW zuMy>INUs>b+#`swd6G>pfQyG;}trwR&YP)y;YB0S{=RwE6 zHr7IY9y;}_UQFp=1WcTT0NoWdo;Tz!ByHR9&krD?85hZFqWTBP)th4;P?D1u_PfaU zHb=4mN+qak62-3Q77>8?Ia1r^qCX?a<}8`InZy=qaid&}qw^?JY8DN7*VVTo-|G*x z>JZpH%t>*m^$S9412e2?44i|E&P4dSjc$6My$%Y&FVq50yZjR`&!_Z4x3bF`4xN23 zzMZy6)(PBf4HqDU?GqrmS3&Tsz%fYrO;xc||JSCS%=Ncg8HvPKp%x?5{&pL{IPHnLlB=ZTW60lG$5 zX1y3)g{{jC@z??qGk2psxX#}4YA<}qT$SjkcHW)xA+$@(J+S9m7@2#Ij=t_Qvn*`I zKl#Lzr;UM8uhik0;orIb)2=iHpVaLh7_qSO5`=huH7%eTL0T!8F0_)53d2{rFbj4~eF zPK-v6-j?d+uD(U4>`VAu4~}6f$1*LH;+s9=88As8N7;iK*9iGj)iLIi+7 z`$2?+E+QY%JCZf5J_-RzefuT>{|8A;v>(nO`{J&B-75ia-DxsP17FTtyW?HEf;YGs zz9N72^*+9Fp&8TcFjyADdV z?f*~+h7b6TT8^668-*sNe6!nY@i;R^4?a28jL~Ohnh0-t&&W-TQ<6Poh@t%S-xz@>Y4d{| zB}zMepG2;|Gl0MRgfII1sa=PEG`BjdQ7X5vGZ=?JNk8Q%1ax!KARQy-zZMe&j5!G3!43)0N) zX~ZG>LMiWU=FC{8=;wq`D9lxZz)E3Z6**AtZ|K3Z*Im51vUb3lP!V|LC8ju|9a4YL z%aA6$`ktSZBWKro0U_z6l&ET_WJnst(p>nnkVoO55To79NC2brz#!%$(_xM-9f)rE zXRK=;j&H2`gHB@2rGYv-lvoy?pD8H^p>Fo6!zG+Ce2X-fhJbtV2JnIc;3K~DUy^7u zdU?mjFs<9YzQTgNRS?wx==NPAzo>z2Y{U+*UCISkxX-sZ4cy%v=*_Ze&^~LlbpN=A zFy|^3k0*6wb4f?IbiiUrGB3i|a+3MM*))Gd;5&CP&5b>!z-(M;T(vvp2($n%KrWp$ zb~}baA&~5BgQ@>r#?Hl#}V;ZC;G$vte9uel~2yFi>{cmDQAl#@ndT?=C z*%vlz+amdT3kgZN4!;uUtX@D(CcW4v{`Z5Y2MmNwPX{PW`%)S&MlTG|(>;;zJ3Qql z8>4GK0^bzWAB8hN=N+_vzRQO9h0_nlrfikIWPF}lnXtK$gv5}-#m&4MTEMwaDtfE@ z6<#a|ovX#s!APkcZ;C&MHUg(*+jIo;s4C3? zW*Op#jJ(ByXln6EBC5Y+gb6l1@mq|{s`x2x^mx%P$v*Pb@^-aAiXZXL=lloB>Y_#l zQxozc_og+1rY^$rzN%->*Db3M`l7otk&=W$tawwonUI!>-cLH}_WuIyQLnJvdXPY} z@;^X1Nv7?BFC{Pr)V`kCV_$P}A@loKFOQJHOves$QlH?StwGIU81-i-$w&VL>a=U^ zX|peV2yw$8#8t<*J(q7;Vp*Za^Idh1HD#n56?HE)5QCXCZ4C~#eOJUf&+eygtB>n!&hRycbu?$i?@||Tu}A!e6wP;wNC=&cttEi&1{#t5L&vl1U2)js1J2- zZe5y+{k%*)-QOx)RTk%!9|ZwMV<^?3_)2k zTKP^0S?Berx&bFbzm`B@yQZe~?ii$1ToLhqbq%*zbBQ^%ga5q!r!3XalGTVF9*RSw z!R(YWLatCqB~y?&LGaq!vPB=hRwh*ZHhWi|5C#Dc9}hhY%-y*3r)c}xg3K7cMz)#J zGjvJd|EvoCr|qZlC;(PY$#`JEA9->(aB)E}q24iOGot!dy$OYL_o`{VH;YfI7_4>b z`nc^8Y70HyrvO*%uoDxS5ES)qt>g~0GRQyduNS?&e@XB8{ZFF$c)L zkPYWdNnjPhdx$BVHsdlvl@XpmC9|1%(4ta&i1TX`GyHybyKd|EA)op~u{Z5~oA}QvX|-KI2=t&v#?w`F}LMgG1f_ z`#yfMZMW63Yhk%9E!(zjoVe_*maS#mwr$(4Q|EhL@6Ye|FFf(Mug7&?aE>l};YP$3 z;X;ECAzZ?)9&eI6%jXmWAegw+_tg&Y@HDb@#=yNMVjo>gUd@}MA1IgFHdBtS6EJw|^SpC(xm|GZpw$)D^}RU)6LL^P$h#*5 z7&{&xU?i!`|J?LYhTSoOvAk&;a5YlrLGjw`pJJEp+)XetvP<$k5{pOBBX^*#Z7!YJ8++4Gf*JSm>HGn10XH z6AR#?W%B#;Wqmp2agz0RvgDgs)3P4d6ULPlt*DBkvRASBO0zhWYT8vFsOsrH|_xzQ6QiGBpdBGRx0DBLrG8$X3f(PGwOnu>|S?uzTje&bdU`~YGbU64j>3{kEZzDVyPv;on1(GaZ_JJ z!wG7L$5%nNAqpp|k zwQRX8n>>jMRhaQz`XMrOSK}Dl+>x^Mc}2$gpRbcWk48tyiQ0^FgR z(fsoeka5KpApq1V{+x6M;2}SazTB!(r$=3?$tQKjqS~juIwC)p$IGa+xk7TV(%h9j zU3tp-0lJ#Fg8j<@#`u*-Uf<2G)7TgfF*9FZvgH&J{%5m;tZvo@yFr=|F8$sSW#{P% zm<2Wf`dBbuC7+En$GIPR!)$brXery*zy$muvb(Cf%y~UR$9W`cyuRREs5^BS0=SYI z4%LeuX;&MKE+y;R-H0Qy)uD*+k%${+_)De1@p1&ke%4gJeL6rl98aIe|2NxBH!5Jn zLm&vzd4|>j6%%qDu`o-Q-r%^@+#d))?V{+Am=* z3RA;s+V4iMbDZ#)n}v>Alh12pdvx#LDZ7>T*!h1c+}gWkq;w=j?eDrWuJHm} z{B7>{DqmGbiRz3=u|L|8G}t<}YCYOstGeAaQB}0@&obZ0P_yqN>$aYjrrK=w%1KQ# zH@&m=b#!~0Ar58eJ@2T6EjgM1xy~;iBiw7XPw+Y#AQT#9;B75)yw;G*b)=YA)mAap zm9=NtfghhO2jf!Nz8tjjZ?@>XhoKu102p6c68?$Y!I1b^hj`Hp%Vgb|4`dst0VUhN zH-oQoh?iIL^#BX(kzeAJAU!y4r#P$Q^gK=(4t}+K{sJJ`w$N4RgurMI{-s@)Llb6r z$?Whzo~XcPnC*#O&Z7UuFQh0q@WRG&c)IGv@R8ivPFge3yCiCm+oDGb??& z1+~Vp*LC|p>PhX$xXKa|-W{6{%+S6onm|4KF`B5UDg1S?hdbwY7C660Ajk6Pc)f#*)<X+(1x3@&3Ulcjz_57NC`+gd+GB*uWZkx=`*%yo0rj8l=u&YKf&7Q;kSWBT3+nGb`catx124kIVs1h#H!TUx`B zH!>wRh4<0#Zlk8Wc2IuE6+?2>=fWS2#P1tQ?D__h6(mn^j(O31;><9DwQdP+wMuHm z#a@xhlJ52e(*FJTIV8}Ho>aKotKA_RfL5{U$_7S}A>INC!|vTW_ZYUB@RoWK7)$e2 z=gYrxpVY>?+LW>Hb86HB@M(X<`kJ15k#V(}_EKl)IX%R5w9vc6O%#d+uxj49FJ#@_ z8>x6|=pn3EKJ!?;viXG#a^Ziq>(@Y6`U;(<=T(lMH+VP1;xiVSx4TODvY zA(~@7G++$yW>kAHI(yf?Z$h6K?fMOK6rs13823bv-z@bo=llGrImY*=J?svQU*JckMSMT37#8TpJ+n@#=o5HUbi)%{u zE09RXh8_SpF|JfhaZlL`T}<3%5A6)6lho;sR)#5Uq@%v$5izFYwvG~O#|u^?ZceG{ zZ#_kl`fi*$C*Jj$5%k)dwCYxlSdOyUbS^m! zu0(B8^Jt3n!y6^EaBwqpHu6Pg_w7`JExG6bN+!!(S7)V^PaN2C_W_KeGKO3;nGV;g z<%@J3i=vUaRM-E7DZ~-M42J8%KrNjJi)y3wU>rE;X%lfh776cR_c08jLIt$`6Wz7< zu7O9Qzu%4Sy4(#OX{vZ1L0M-Fze~hkaR;hn#%XSt9dvz@AH8oL|96Lrwu_^l;FHkbqEG*x&c(Q*(nrUuX zdiVW*Ri<)OG#c(V;T&dZUq$Crx(OP4i>AQ5!CTtZ(}6`7sxbko#^mgs6*utwww%?C zM>J#zJJ~^o+Ii6vVfIO|Vp?3A==xhZRs@GT7bsh^f&7G7>XCma*Z}?r>IUX!c*$?y zCWcR0@4uO3ckfJH9|!5tjg&^&99mpTB2qHRAOqlQ?&k3TKfcEW+rt~KA!N;7b^l4o zcpH*OeJ(nD1^o7oUk@n^a?)2|`A6E3cs4XZd9jr3|1N$T^=6ldi}z2XmmGolC&C>Q>6~d9Bm1N@BQ_&&uM?YTTg9nuyEmqjJO>7Ilq+J1 z{bJD}j;^psMoy;drwnv3JyQks!~(w{OBq!{LuWhTIxzhCZ&CFX`Ul?Tzcalh-R2J3kE0-oYSzoscU&sP13{Qx5MV7Xds8B`Kjd2_aU2Apw#-($S7tthnNnsS_)qQ`}azC zS5GH$1cb}e?j0CE?=2Pq*K2iejH`U=L-s9`GXDi|vWHgYRh}HT0Y%JQn$Py@$l;)s zH~a2wlPyk*OGmPbfpfAua5Rq?r%8%xA z1%fSd1n;UyKT`O^lCa1UQ=)oEi;e~@+x@M@2}u8p-3g2oPNdizm1q;Z-;h*Oc9NxQ z8>UHevdB=igp>Vuv3G9p#1l33D{gG)dnI~9Pzwi>mpmTaBq;cz{C{6@tBP}_o=>QdRj?f}klk-bcv%e(o25`V_y`M%GD zP)6KXFoU$)+8p}dtotZagmAx5D<(sWLz05xFku*9V`tjQ$uu4)3O{ka0=7+Fh4V0i=!xIY2&fImh5d_AQHuagzXP2b43yg$ zXjf*m*}svWqfJ6Ki$8wCz6<6FMzk}9u-m6$C5vrhX{!h@u8+=&BcK^o$8wo1gt- z4X6l=C4k|Kimmyt4MZ+ws(!63-p7sIPv<+;F4DPrap+LE1DHE|jm_Le*@_f~`1?K? zmpnT;t|6G}OI~X7+|=bY7|G_kXqqni)CXz9roEKPm`PY6A)H)4lg%6w-KWZWW=h)l z2s0n!>LB?KCrLY1ZsnE{N`d6^?`!#qb}dCl5H|4o7u$6B=PgBR_SFB3F5!WO+-}&e zH0%{pFVYhoc0yUAi;jQ&+&r_urqvr`lB@`O-n9vb7W`@+zGcH&Mk9BA>I#pk0Z${l z@@WgUPfd7WGMX*9*;T{MOQ!{j*5u`$p-CBf{aQRBs%Dl{S)E_G^jJBHrYu2%ByX~T z`BeW=o-u|Ze&Y{~lr3;^l;h?0s52_U>@u$>C$n?u!b;cN07u;65-;(^jqHqV=FwIr z+G_Llo2=SDU5DOP`+UM{rwY1+{zIUoflrb_7-g;AJwkaYYJbSwW;bt?yj@=hu2nX$ zzIj4PCt7IpAUj_?Xzji0`EOe|QB^_NJcm&ox_@^a>pt5GMJ%}q z6O%_bH6|w6D`h!~ZR33gtfKJ$_;<=DAjH`B;8CAyaW4CY&T`97Oe3tr?mtNqh&?2J z8maRMc`{5Y+z{ESzV%$YV%7S2F7~Sp899;2uF+tFn?={9%1DT`9?#|*VzD=O^PH}b ziXB0bHWsYV1E21}QWDGgd=gRb8RF!@0Jz%mrj>{ZekY>1f_LKg0A zu^_Yry(wRIW1r>Ph>2`_k3NMk()1?C?5N3I7iTr|gBI;&CI0IJylyN}+zNFbqw)3w zdv!T`r#}O`#DABKq1ZsPq@;AUwfI2}QkH=~jfVbSiib%v;#Ya37_|kQQfIz`7s({+ z#T^5YUFy$vwPuB8*?j5DDfDYhZg5Gz?;VAv98MZe^l^OB`Fi{lhZw>#U{OAsKHxo@ z%f{cPOS2V0s0|1!S=BmmKeSYl5@$>OA#1vHFd%hvwZvP_YK^8&6})(2dyt&PdKk6P z9?}7RAo`H3MrNhok>RZ(h-SA1FJT4T^I>JDsP(jfL29%U%`gIdWEzqLnGXioOG{Qo z)Ky2A`DK~PtL~M0fUJlPFk+Fr`}M66iX^f+`&gAmVmgdncFYh==a1$nR8m1`$sC%M zuB%wF`q06tGib~A&79DDs3h=H95-v?CMD~)JyJNR4DK*3Q=EW$sq4b+7fmd84Jl`S zk*`IcoO=X*e$irwNXKAWQh(j;&&zW0j*T}IEL3*<3mv7S_vg~6c}*+1w~fBLu3T`K zu(eJXorg2ra<`xvgDdg4a>}eVXi}wNw!&PSZ*mHB4I_=A-ei?k_gBXq#IB&5cguDN z!VE~Kd@h3JOr|UqUBY~9|9Pvgl@EP5px7J?}<%?fdEEDUikt*d}|{8jEBH*77+t!2KIeOO<0gtD0=r zh;Q4k$_d0a<~9eyKVM@5vmGuQ*4EyhIn+ z|Bg^)F$QXT<$okjqhJpBRWgPCFaNc{a6h~VQq$uUP$c3G(o&;iLp=zv` zjK+MPZmd`V(<#XW`y=lEPIN}L?LiElKk}k>@~x8v+%cci8;3f4Uz|Cw9PF38T6JP* zn-ZF~Do@vcGqUqtS+$X!Q8)b+UP0?V1v12dA^iCq+AwP@s%vw)#$6riT{9vbe-o{D zc9%Qe0F6R0`*bp|Ba08Rb`jYZ9h9srKCGIW@#kwZqZwA?ZIj+^Qc)q5hiZkFfU#Hk zq~xnnsPL^)Qev?H0!^nP>7M48uyEZ?Pf4EaPqRk%B#+b5Q>IeLAOoz~5 zWX%Y|*6>p;JUjET+s)pMap}q)+HRga#xDgdUf|jq;U7PifTPH6Uqz3V2<{#8v~tK< zYMV}Fy~cLUf6lj3bYs=IY8Ii{wp{STF@3O2dW6fP0;h9wreVA>m1k>uLXV449;rDA z8e2Q`?q8ZPIIXxm(pz`Iqo^cfRcu~UOm5oDO3tKNRpnQr zX7c$BH3NLlXORG@5)xt89hlyXRb1%P<@kI53~cXl4~RQ{CU-ynFC9t+22tcWqS7Dy zsiZt#E!VUBj)oYQi_c#7$4f3-oOF9Z4f0`qVU@0O%hSJgMvXRQ7&_vm?ja7O9tf0U z3ywYhPut+hjOrOQj#KuzJ+0-wVHWCH>y}ApZQ}|zzwYa$?q)#3mU$Hm@t>r&@s+pu ztG9S4AK8tJ7X`ONVCEC?%fs_YtMESbcxjsYS6XFmq}ALk$88&&u5u3eY1xwY9~dDL zm0A=6=7*Z3pStBfC-+7|FlTpMD3n6|)O|W$Xp1~J)$C(|qGIh|ToYsNXp}z^jv3>> zRk&$H*ae*mYL>LhD`Pe8gxN00?WB`Z(c;Z5cCGSx4CgQS_Zj$Kh6&U`LcPyX=54|7 z;8D^)9+s)N$c_}S0Ys_y%T&C6W*&ejhAp$o0qz(mq+5Cd?cIBlCqH@wb4_cTHJDt zdyn!hAHi(2tA>D`TpJ8EQ(jM5yzP6H_3y=9^^JOy0r%9oTB}x48b`bJo=LUd*I?pS z$Hn>PoAhAU$?CX@UYYQZv03f39-Vt#wa4oAvRVRt7+y5u?P!NwrJx4?-Ov%9eAs%} z9TC1)C_Yf&UP5Z z{zLSkvW`BU6#Wg;J7I)4eZUR zcp^`_#m8x+*&-jJnt4pIBppl5p~q3F^7K3Wu>vZPYc`jDzc-ELUOVpt`3B57mySb+ zvV5U^COZ8D8~zBn2a>{6j_JjQoZV*+bXxYeVY{Qox8_~N&z<+H5+Md6F9f%>)tsyg zm3hoQXV^WHFcita{=+lh(+t6WV#^1ehzfem-F1Q=Onwf{Sr*VIm8gMndoVcR7KD>u8!)J(j()tsK&XhRpd^ z@Q^?8BC?3Zc<^-;kNq9A_(SWZRbHEss;dwntY44UNllU4(}xnxtN!Ixl?v9;AKJ#B zJ8OFy_*RO$bX^uE6r0bl%q%1lm9qrp01H5Lz1MRKqHM^g!~tQ#&Y;&$id(P|9Sj{E z3@rNJR-q^ELNZU4UZUQfX3N}R1PWrj4-LM|B;*7K7u5_?K~}|Aflyx;|ED~HP)n5X z>!d9lqV?}GI}}SgYh;sCiES%OU2lFsT@UWj`nG}6mW$R&h<#z>bD<#3DZgxc7SRwkL^mtmcCW40=d%^D zn^~su|CU-hy#e{l%ua6N51P@f+~`Xw6EgB=bI+oIV{u=3ePdFc*T5(b?snj&vkyd* zHTzdmK;^Sc_RUAEDc_kvZiS%W=;>|2sVePAfzRw!X2$yh5WJPaYrt|3s%Oa|=alT<4v|BB!U=}|8F@T@1-e&z zS?~=;|L0v7VnThsOYT&+m+V#^6=i(y5&*qzuwuZ!TPQps3>^&&YTsVC*K~HM6m{rm zO+N5hjdFwgC*L>|HjS{wZw!j^0ZpHP?x_K8uz*hhY>(d;+f~^t=M6|Jku&o9hpmGq zR!&t|tU><^Xa}N>;~d}7dx?<(A5M}t@iShTZU$r{GOgR#V4E8+Y5}xG*>7z%wN!0{ zR)SX{Qj#G31ad}jM5RStU2AhoE%RGtWz_e^3!$k*ka*UEKDq?IWXCCy#{2t{1@oOk z0TB*l^_ip!J?S`L5AWWx*C1JbF!E!ICjyF=vRYxTvGUJJ{tARfqyUf2WqxcoA7@eI zVq~pRbI>R5>+)ViQmhSjm8opj^DRActQtgSMWAkAk2tC6sxJJn!_y0_*EzwdzXQvL z*db7UN)u$3@3Jaua&D-QN?tS)jly`S81!@mKYm>8y^XTEjr`@rX(IA*)izx1YS8R9 z{+`uR2IW&iaY?IH9H&V6M?Q>f+8-rHhwXh<&o%w3KI}3~@Z3jjU|~SZj}a2L=6OTR%EFfZI&F@Ky{S4OTa zMRTwm1I zrGOd#6P|=g4pDMEEBghW+jk6CB60y)Uoasdp?{pL)(DyOjE>-C)IexsAToRNYm<0>05prJ2-5iWX1QW=mh&GGsb z$PEQ^&<|xDOvAEG-#7Of%(rVo1V0Z}M}n)LugbnY#zbaYUZRcfgn#zGd~@jyV8NV4 z=|&%*UfE@CJ>c$}C3kv~{$R<|2w7Vg*&QdZK1W$2Skcijh-_-n^(!j3sax}JA{Mmv;k^Z=ja_ zho3)_-f)5toetUhy+gdpU!H!3yp$x0uX;3)MZgH1<7bg{=?kVve(4ob<(~LjCi)IopZ1So0pP<; z#Pu|k6w9`yS^oFh;9>6GhknK2`N=5-@HnqLZCLq=e;!sBZ9uk=w2!$|L);6%m({wX zMY}xvxAMJ$vzZO-<_zD@jyfmvx8(a~So6y36eNnm%*WmPuh}^~T~f+_BEqiCsfJU7 z^R2znN&|zlG~wgBTx4VO<@S`0qB0NU%*89P#np!YxzsJFvmLTd)NIFFIk)msuLv~d z>VOZyqFxKA(G{t#4gw9|2pg6Ipx!7&swupl?L{!WXFH#J98}`C-Ko2~6|aeFVZXu- z(*)`vRU~lrU7lF$pE=um-5k9|jSFZMPtxP3o7N4#imPQsNBj6weWvp7dLCd+4s~nt z2m(BqUc@uBZOv=(7xVnfH%eWPC3l+*Ht-mmEMJmgK~qF;MpAimPQ}$o3}LUNvn?aJ zxFi1NVCYUzjw`bpHb~ncl%ydMv=J`S_)$w2&1ST{OBm;B zc+G>b1GN@#F@}GJc+{~mQQiw~mP{Nt;5N8uqq`(c)|;LG5k#1&4t8rt-};wxJ$3l4 zaab}aIt#VZle2_^ig>@@%-kL+^iV4)k2BpYDV$UCF(9@ZPIBArRl&x2^WJ8=jOO@$ zYue#~5liIee37zIE8a$-|_p;}@pO3U94;6ZuK{!7qex|&}YTcvEIQW&eF74?Z zNOXU*#Ou=)8mFKdeYli~Hmcp;M7Cat^6(K-lvWrnL$V^=!v^vGl{zJ51eGzJx8dYb zKbLhbS{X%3YsMnf&yjyF_{Np8(=A1q`uvA0hAI7~Lc5KNyj=W5V}`lHUUPy47j!Sl zXhIh9`(opKZ@FFK;><%*1d$h}do2)Be^)M%L#`TR+(n69x>G>Tt1%?79rc>n95+Ha86EzXH2Sw#@)u)J}Sz^zRkxo-7Y z)hiN10&YJY6r4TY?J@wkF7pX5>N+`8aCPboljTm+9@04%$RpC-n)i*pK*>xvmDo?m zMTey#a#T|j7HoE)kXLUEAib3n?a>B7OR8_U&QlnJSK;HUpSpfSHy*>yy`)GFW`Qeu zX1GqBY}dGNx|oH)>B7wU8&#CpW2U_GlEybAx#!x0hii|rnt1+ytUBe2;k5BqHnz~A z|0ysSYvHM095>w2@3nb&Bpv5|{xGWXcoS_QxL^;L8@nkWd7^RRxTsx0dySj0ErFRX z4RDf2;^-f6`DsF6r}g$>_5&otM+%#3>1Fx75vl}FyR?RGIf4hX50y2#RopOJYfkN0 zquxl&*Rx1ay=m(TmII{+)w({k|?c++o5C7tt2HLwcMd0;L?+JfYTC zH%HCBP-GlV$`hR0Fav~t**KqfK=Itl6hy)}_#%TVwgN194^9qyW#^Y0*#vEE9%@Hw zxrcn&)@4Ul$f}zvf$O}`j98BF-9IhY`>>j)5y!(~A9FsxbtK)z)KNa1O?`N=j@9|E z%PsQKSta#c)k4Y}Tly4zl2jey=}`lZ6X6wpDb=6$>#ZxJW$b^NY(}dGtpd*^amdgX z)4mur#Q!+hS`Ug6EO{)QO%q<-Udz&~Z(skfN85o2>S68QSz_%9^vUdGv2$`# zD^E)5Yh@^BI56T}@&=0n1-DvsJKvO9-uTA{N@WO2!aB7VxfvTm>r7Pp@p{aMjF5wld_Rk1l9lyw zCf5qGu+hxYT{?5WZEgm8UOmd!-?1@xxXHg=#}b>Ot5AX;EU40UzRvLCGU8U_o{b*VGRjJ9)kr3!w_aPG=!GIf4x4vM?R-0cNw~STx2}6Yj2LFu+k{4UhMIV z;o!oGNIUEMBEtl5f~hwQr07JPKj=_VjrWWJsJvtWWqluaY@}8LE0yt~5(0m$BYL#_ z155OFySDFZ;@rhXHkE{<;+2|Ws0=U#H8q)-P0HTO4H2~%KEbNC2h{vXbhWb1Ys@p0 z;*^kr>VE%(>`cTb#L3`Ad=N_ghej$?c8+?i)(RmMBRd8@WvH%dnSP{Zyrjf1x<)=Z;owM4%A<)rO&CsFFeA`z4=akvmv^8RbE_`vK)*-~Xz0lakog42nJK zpre00pCmdb#lA*0KK&w7^(I~H6Ca(_XL+`LJhlU5-R&CPy0!AJhXd?xQOEB$-wlxc z1+=+yrAWiV=Gj`U(_l6EQX`7A=JH-&_OV(TdrHjS z<&nRALqBLC4YUD4#YC-!*}v}I&)Eajyy$EM|CY*(aDCAWuQ@KZKq==E`k@kY!5CG! zr2S}boD3-Ri-IlnD_&h*q)!wq=t0*ZpE=e zct2ZViK&+*uXw*CS564H zd?0s!7BWa6Ew$ou_zsE!e50;_!Ct5BmMJMX8lTF(S%Gu{ywU%_lMUP@T3s^2bTy#X z^2fwW%D++X2N#uIHO{AiP_^{;xB?W}Ku_d?(<#F-RF0^D6$%UYm>623Aja$9<4ITM z&GaAd_m*6d=y$wS*g8tH`$XPQmQ^>LvAt;8yZOg_XmX>B2LJSM-WBciRu3yK2$U%d zXW`t|RNKnmklh8Cj?5dFnjDIwm6`)f~_WZ zegklSuY$zy2q!FhZ^X}FH>mHwq#+iQe9`Eu8L|zIu4hv|r&e+%+XY+yrcJ4ncVN7n zSR7*QB>9moq4!sEtf29zaA93Gij!L-jelw2v5jh40us1Dg4P6SWbZD+oaV_VzmN}k zAE9`c2KsdHA4l&&rNtqjn%kgSpP@QuM5G&-L;GhYI3gegko9ldujUlv#qyem=I;-8 znSSr@LNnYqPILQ$O)t)$Y?JvFrpoE0Zz_Vrs=Kj@1g4=Nbi!VoM~BYyt0#|i<7S!Q zc9St_x?-m1o0phNRin%S^L@Am*)bL2q!=j}^wK{kD1) zA^N-hFZN;L93&5~GyA6tmbX#DuP~3hi)PfJ;(a0D%PGZ6_b2-Un1o{B#T1^&eSLG3 z)yo}1Y``F{{*HeG-1g&SdyG&(cb7|X_%D|muo>$cWXx%7Y!23QUXVRf9=%DcmlwZJ zsw-8)#oi?BJ5U<=CoTHp`~vJ1*d^@!CM7&%$98TUBE^H2d%_$jW_Cuq5uQq(RD4Kk zNw=*M94s~Pw=5#wOTpKvsyolrzJo5aQhPjg2rlFRo72;(gG-6|Yeb8=Lk^8m(|z#^ z0R7vdKO?GVC2z^XkbQ^T0R?}~i4GM&iNT)@pG`^W>BNiJ{EIg7gMGPPJ(fNWY$N0Y zTJ2Sr&59nY-ql0P-rxP9Ff|9|S^-rTRmYGayoD2}f)G1ZSur4))K0ZaAwHCT+_EBe zG*QTlbu&dYWQHKt)jUbwYD0}XDbR={H^MixN})kC7Mgv?BJ&jyfpIP+S%*x)V=alm z(m$&5Mk6T`b0b5{vHU@WF#o7@-ib-jzn5+c*NEIPwL%_OSnHzjU%Ryr*~B|pcB@?d zS}($y&^Z@i-#?9^xBb(EGUdnNjz!RFH+o}nnWSaM`GCnn{OW4D#?qwg%g2QgWObvtA)DU z^F*I!(dTQM-cNN?3TGmnjg=R&OczcTtmw1erf73x6)g2AoZl={IyP9Xee{N0Er`2L zh3=tVG*px`pwaRpoI1krg_F<>U$S^*)4pKi<_j>VC43pO6qgjJGgi;L$AA|>+M&ol zFpvcZ4xON=R$RCszd`v*)F;Fi4@5~na(o;15Hjm=<25ySQY_T6sz;+tG=ExM@3S|n zMAmP6dpD63u?v`Uy!^B3!A#Q)3LQYq$;`0+rCl25{^%b0&e$>Ah$b-d>A?qS2>S6> zel~6_Bi}h+$gX)xg1`#AWW_t27?q~F#!~~tiZmu1Hn0+Vj}pd&IME46k;uI>-+$G? z^e#&^uS)LNqJEWmP{ElxTzc%T3K4~<|M0z;^!--Ibz66u$P+v&ZZDzw1G zYepPr49Ji!!9w(_yVPwS9pxFccgwEq;(HX#gAp4MnVg43!|#NXEm^sX!|I7E0=5nI z6Jo7#eYi-L<0q_2yck3u17FC_EEUXW&R4VrJQJQ)y!_4VQExdBl>+&XWoD zBBB~D_kUC2xsxz@Ql$6EN-q`f>Q9SrT)Cb0?6Tl09@?{&J4U~t<01c}D{GuwpgEX&IHH{Zc|+h72H7F=a3Yxe zPW#&;kM_5p4Y5m;Wn@F|FpsfQ?P&hC7x{Wk3p(0Wm0QcrP-&6>bQZ{heC*Vg z@I;m9FQ*04Y&H>?$ufH~u_z=&#yi2c0a9<&fhEBEXws}2$H(X@05;$TB^JdqRl(xT zX;x6`?jawz0-lq;_Xv9({+sX%9OmJ{x9PysBFH48bF#GGY?rpgG3M0e&f8=_39H>F zYl#n*yIYh5OgcrOf6}Ku?g|YCuRMW&g zE4Nr~IMmR#@O>W`Ad3uS_MPc&r;Nir=_<~MF=_Jm1%Fo`3!asgH!~;vOq|C=J4kbh zjdMLWCoptyjG00Z+HDSWY%p&yjpYc7k5z)uEAAoKM8iYd5f|fi%e@O8t$XmDZ3$A` zb^AdmY_#)%pY){T2^uYu;u#0{{3%+e-E9k|Vv`JT`eOoZ1pnhR=;_f? z!(&@fO%m?sKDfv6<@7=!4E*Np{8yJ@ufeV{%z%FO)>=6{BKAi>EHo1pzhD@7Ag*4$ z+}aUrre{>cJM*_ui40d|6_Mgc1_`LQAvx#(gBHhz=t1ywwG)@jSY0jr=cfXn3uB^+ zaGfx|swccFn%~5l$rB0xJn`l8M2$yOiz3=^bzYP)`kO4j9u~22^d($rL+^3C#$t9I zypVM28AytQz8Z8o#KW)1?44VwyFR|D5JHc*Cd=8Ivc7H|9_x=%paQr0^H1|g+oFt| zfS&DH#L{>!_WC=T0>I}IEJvh(xK{7?1Jb}b%<91N=Nw0EN6_WwyVvWn`)~3OYuXk! zGuAA7Ah}1D?^>#a6ANC(2-LzN-1JIe)ge4_R0290U)7F8^b^paSNs~=7$@bN4F+~Gfo zxRhL_YxsaMV=eUsO|6*BTmfetqu>43TX+dVibooq#XG8j{}|Yq`tFR^14z0W!qmY? zQ->eb9TAczZgi3Izb*7CKq_7Tto@G6Lo$@dR0>2mh(#05aF(OyoL2dMCK)H*KNhcL zUfK$O`}=;60d@i%P=NI^f7SMvP(B@9#)PQoRkoz8v7kfO3-SC%dN^TCtLApfON!>z zu9gks7BxML?5uiLw`h?Hb_lG5R}I?W)W1pcXcn}M{Ogm0=Ucm*+J>7k&^P+q5|Zf` zB>}2C54s^92mC}s)1v|aPo{#jCP_R!gv1fv_&t$uR5&06t2-^K(z*$j}Tuy4! zB;F>jxnnSN^F}H>)LWxz36py@`DQw|#AURo#>e#N5GkmxX2*KByjBx#Mc9T5)nM4TF<_9v2~4SR3qdA+ETnEN7WL65`vou)rV z2%!5&E~xmjI{0(m-LVaV8K7c{{~uRh85QNby*)Dw0)ljRhafGDba$6@ORJP1Go&;~ zcXu}kNJzJINlQw1&b;IAob&$IIiF_DhncnR=iYJcy{~IOBT>3=PqLz^IL;pPTEa>d z6nmFm^Y>p$qXU%8tY}sOjs=!HB$f$3C>0xZJ%*bHB=%$EtM&5Sqx}L(PP?4$cCstB ze37l}@J!mNyeZk_cxI}38FAP^PFcePgT~@ShcL_*K-g7$VqFz+Z~4hTN5Yh<-fr+5j6;Hr~S*b zylm&WOO87oW8-LF48!k@3Y|8f-mkq@jW3_o()B^G#oR9Az&P+PK=q`I(idN~2}39Q zIRuTKs9y=^kALKS%3L!T@tdV@>CL09)h|zk;K2Jay!3+|!rSPxgatt(*y`yd!-3!F zu{`oBg&)kRy`j?-RazKE$mgo?WdoOTepw=4+_9gi03va2fS{cIPqhY)A}PWpx$zFS z1fZlqnag@|E%aC8to3`0)NwR#qe@KWOK-HD&+K3qUqVWI}zS#pYbh!B^ZN`*n z)nMj0RWX)fN+XcaP)^U;*UU}(=D}lWEE}vJO+!NQu2^dp`^EY?r7snhE1u6|Ze3%M zBU;D4>jZm!p5Rq>5b11E`gc1Hk^()U`u4qn%s0}I_SA$v-HhMK>T+!_bRdPHxJNn( zo1Nt~dDWbpCN|j1RtsO7ETUT_-s0Sw24n_XdtOA9S%*cGD)g{FCxKTof(q9JLd?-0FV}() z>3tx8GKYP=Q1{`^M1&4k8M;ZLDKimo_lY=hX!2uhRDQ8_(}k;xjQI{nz9<~a({qc0 z0MS%zXjtoclkvqZozB$*d^{a;oVW)J&HLh-Y~@kYEK@snb{kUwzW$0bk^gZ@PR}=* z-mCeL$SzRp2C5izJMVqQ9F@-@{+OJ8Npv4X56FwG#a$6{|1kf(7B4g92sZCU!4W9h z*z66m&`_5PcyROfTG9X9#rKDZ6)^I?wsqOFG9*&OdON-7>iLd5eWB?w zGe>T?`XeeHwfU-5@v~Egz ze4lTHm>!2n?II;@ey51B+o#(RXON(N%sOU5wp z#N}JNEA|a^7W2OIoU|w8`rdS><3+Jh=uxRuQInSMtDgx}( z>$>?7%dEC3f3OUqO@oCtwlM#8e>-qW9*R}`dICFC2~u(2;9Y+U7_jS&(iNofXh0U1 zvz1^a*hVJ?O_<>zik({n|2+s{VLrW3TL0qx;j<+Llcyx1T&K{TPM_K4vyP7~`y+v+ zBew_IB0+T6*g0bu_TQP2@bS!|pGN{3%Qsw)8+tvq6w=^DF>%e8GO0Gg-n=P0#=lL^ z>*AA2Q6Ig;i8hGErTg~LfAi7sUq>i`0GVe+=z#gy4~b$EkCs1NYDiYXl*%Isi(Vh= zP7qd-b~+TtY*u+1zGgDqSq&(Yt-IGGCJ!kTkrX%>VgpoGlY00GP;^P|#X^P9xdhLC zP^hX6S%eh;tV+&Mi^TDJF8ztX+Y{Yb_L??aZv^aBo?VS(T3xbj_HLgz$a^_gq=Fy=WrzDyw_qpwmE@uKjTE(!L5qe7{wMQ;-OT`)G7iM)C z5%hVg*L$4Aeqz2gJ}|k{Tj;y{-KVCzbfRrNy{ua4mn-?#Ur|kQL|>)JawUlz>ty4z z{yq?hu)nQGT#$OYfB8p_28yS-fttP>T}xhaQsB+eZ`sKwj=cR{QwZO~!I@rtlrIn2 zm8|-8J@0Vq6F18oiI2hEygl(5j-;(xq%w)r^!fP3mPTMH8r*qz;fiVz&R^;b0NG4ccsp9TwloBGx-D)9NNEP9EU zH9{y%UgyEjtYuk=0h2Fe!_%=Jh2&VtF9rldi|r0iSK1USX8ogFZN`@PZOUb zmA2C?`|zT>!S{{uLHnU^tJ|#$thqD(DIK6XI_&p&dYnkSqW3mwH%u)8`E|9{qnKmO z_e(JW(5teagLY(>WtubK;$Z)`2{m0$w;Mz^79Z86v&A0D7M|L~SUWHRe_xKDCQt7v zXk&c({;}T=TDMp6p?!^z6x0h4_$@?R$W@F{io2o@o zaN_?2yH#T90thQZTY5ybZQj~2hiA}xb2A=jkdDbd9gW}C`z65dk0**bfeBu1u9X%X zwM}90exu3C?hMgP#ww$6VbD8yX9SI8Jzpk=a+J_iJ%5H;W3!?Zun_GRw;^RY5t<9HiNhPPL>uUc90*HNK<3wc3 zQr#b4mx}Hn$qMH1fQ(HY1{`NT`lh!BYzMc;5OSpfCSF1pDwkErl2d8Zys^gZoU@Z~ z^ac;LnsF?78bB%H+x5MJV5ACcHZu{9x+%8AG>T{87x=_Q6$jUr?yEMJho!kp&VSE) zymoo&f$s`}I~h9$Fr0^a+D!EooY(xU9`3(Pif-$WT)Y#VKlVeUTs~0b&^vpAZW-Z7 zO21kqq;`j5HF@Cn@q}vCdf5y3bSK=@ILqC~E-=QWR`ikQ(}<~=`cvfiC5vb%mp~GD zm2jWVohVGdV!$lG+?L}TvlhvZi~I<&e68gV0pf+jOklkXoeyYA$8?Wq36Eh!S}P<$ ztXy1nX!)^DKEfbZ)Gw(cC-HLs&@a*5@)tb5#t0e^5tAidC;Qc* zVly7F^Pqp>xsfB zZU(0IXBvV^-~Ud~p51kX?#N|8`vfKWz%@XlOpn>OKQtduA-bG^G=Ae?v@;Al^u%PFnJ?W*1R zZ%KXjh&hydt5b8+%2WBh-K_uChdR+FF8gJ%{%fsHt%oX4XZEWVU3g-qL8)=$_oM0w z03?k~uU^z+N%)!HuId4}uZMa<-RHP6p{qF6c(8W>idh~O~F_AUNq z_PP#X-Rm8b`sd36-}-R8Zcz0<%nx@)XU){cAF)NT%zD@@+HXzUzvtCR|Dxs*3dZ;x z_==O^a~|6sk9-JE2JAIUAK61e{dWrKDPboW|_g7xnC|6BJjtT z>qo&qGFBx8QJp!J!o4){-#tvep$IwSH_5NII}!V|A@h-xZhTMe&`SX&=GPUKow%0d z7cJt@a_%5GR*AjDO3F6%(HOYK1>@(=o#}X<&WjDxS5TDArEn^-JZ zMLOD+Ch9Rus~X`ru3>3G8pA_ac4FHjL&Y_R*!UDUwFLl7VGTF^q|AJStXdc9;S*`B zIuw6%qurb~RG4~!dAa@(cJ824viI3?l`}jC8^M`E(J?mBms@|JuCZ`6kXQ797w(H0 zx6NhZ-x)GxITI?>g*B1t-sU^?hqC%!RdY$FG(n1pEl}+`;iOwqF*HF>A*6DKTf}%i zWCsT%FfI#7E&%p-N=StUy5AY(y^viNCgB8LDiW}+~K9i%l9=kD_5^;5olbVtxSWehEh^%>M%@K4e6x#5?b z`{kIw*rPI}@lEOL!_izxF$hvXzjlOyJd~sfNVd-qZxZZMB(66y9&|=$-rNek-OYVw zOi+TCnDT)ky`X0!wgsPoDMyx^fcPq0grtk@Xlqp|Tx7NaV@d4f4dl&An@D|#2Gd+C zKS{%{B>g{T*BeQYqZ;}O;Y?4k?(2{X6K9U>zk!Gl(Pp>R;bnmtrT@0)%Hndha-fBg zd}hBW?d<=u`OI=sMbkXnyn+s1#Vzl2@$?1Q#Rb9TuoN5*L3&~MHtza`CZMjyglHgb z!6A>5{gvq6#50`4lUZx}ihsBbC#W+|v-gg(U;cDdw86H2d6XZ8Tl#IhO8eIEZA7a4 z?$FbE4PtLNZhHFNn^0~DuY)!Yu-+mT4QGwW_a#)T+ZQ;YeEW`pIPUZ831{nsJ>({I z9)Dd&Ktd%xvK@ckK(_b0?u8-_OnJo#%tLh-ED?+01-)@1KOLTS`P=I2 zz)68f?)}*CU;D;dh$Z?q$#Oi%0=LYYIo{y@JM#2z&H7&gl8q}->=Lg0@LvX2r`W5nE5^ng)k_Jgj76^V&C9)eQqnPeGkQ{HL6UA(pWZL?90 zvd&nV4AG(beqS!p9gSHWf5Niir4*2IM`+a@0R~_MAc3v=Htxp&m?c(o07VntYl{w* z%&8X4+EL(E-CW$8>MmwcWSX|~)QjM%b~(rg^$8fyN}Gu3#GGaQ4MaYm)p~dEDi!F) z>8-&iTo%6kd)WZ-}SnJ}4vB%GXtgR(@$ zp|x5lfs*Ary;w1Cc1C~_Mx3T`zNgZ zY4l;i0&ZtnUqLkIRC1&jPso?+DE_NhPN+S`!uA(V`wb}G0m&OWQ^M$ulI=vCuP3F-|E%pJTQ zrZTT&*@6IGRoHg@Ez8X(dC3<1m_cG~4W{NZ{qVy9t=}ERcL^PFl9zP%6b#?|_84%| zw#-n?B=*yLdnZ={-@G`MpAAKG`5Z+?b7|zccWURnu^S|{T^#*UBNgykD*%6Bw zcbY`Jd|i8%rC1=!jm$kRYSK)UZ0*}q^M~kgC`wKFwb`Okbnz3jw#p-G#v!9916E@j zPf>o0^Y{zUI6#13X9L*{yebCjM@tlaah~`lsT1k6 z-<*Ds8yp(=B=qLudi|&;t=Il(E5)>&2C#>6O*-)eoE)Kzp3_5t;uCjGDaxFY%7JhE8$r#H2VN{3Xjn&Wx5hb7a z0(l#<=@;)q^iG9j@fP$tPXEyFnN#@J({a-8slP47`vf>1l6&=`ws`}*D+Zc7cOe zXk_9S!AR&@pL)`HFr3RPC}6!b75Qo-2<@M;Oka9hSm9t@ERb~_RYi|>V{>Hgk1G=sEZ>z6#2Z`^~+g!e+! zu4Z0JGk?3o)mN*_#vl@5-#KBOMBVGaB_B(!kZmF9B~*)GZT*p;Fu+!Spq5FC4Bdl- z(w2^pDANe55~%v8AT3v8zz4hJu=UB7UCdnWj6}@!Abs{P zUk-oXCWx$rjoc3>SJK`diO?eYYZv;gCX90HU*x(ve(%$B)Jw3D)M28# zZ7Xs*IrYS<$?IV8rMS^CxKSdQ^3h!na!_`kb{@kC(c^+FUqyx46Ri$x!zZ=<3n6}O z+G?IGtQ;l!>k03jGtUYW`)xSMuRbFC)Wd<5TWEfb?6idKdlo9IyZidbJ%u!v&c|u) z`+>u3%B(nt4MTu$n%VIV&cx#8YfD(*U^M z<0tu~+Af{b-4fQ$J>A9^87=^sKCXJ@@H$+ikIRlf5-(Q z^KoC@pi-`|kk_5~oI!@4iX9Q^Ze9P3D;=Zys)3KW(tcSk*vYz1O#&{c4+upWH@%aJ zS)PY%;&6w2DIq%G`NXL)f0&yfkV*`6#EIqRh)}eOnN1f?(e-lKy1ob_tOf#kV*>eg{%`5Fa6i41)$f2(sdoZA4yN}PO(Oi~;aX&dwFckE~=PjbHK7Zsgx~fW(LJOVeQra5*s#`{H zTY4}+3?6piqC(b|?}+nn+HFhAN9_7ajkgPY+Z0ylQbuULe#fjG1|YztHK;W$I+G|K z6p*d+NjUNxR+=xqQxtu8tVC$Yd!wp2iM=Em|X0medIQ($p)YX7kAaR4Vw6uDDSXy{3UdmFqm0 zDXQX?2j=q@ND6k7xs<)UhUwqsd>omI9u&9c!O_3lm|{q=3(yaUce$FW-;kd}ZzqJjCl%z6cyy zt}!(e*>`8bO9V#SwgrY-wKlDjsbQwH*PTx-dd{C)O^@HS`W&*>wqsNZz8h&3sb~`d zo!|qP%3u3ff)b>@!fz^d!dbdB4_Q)AB(L+kj{N(zj60eA&QT7tNqpz_o$>K{Z`ALT zqT>^Ui|sl4Rf)}+B71R>lk-%h`yD9W%w^wAs$--McFJzWe(QJsWGc_V#q{6Tjkvk1$m7LK<+C91H3d$>H zd+4hqllLm^sNus2B@xbvCSM8I)^oZ9728m)7%4!%_t}=i`4}fx;Fw2H6+@?p?IlD5 zW4rnG$JK@XnV~|<)n{r%OuX@L-Q7pc;0K4?{W&H<>|HV5}pm zf=a`ep;6Wj7}OY)GAM==+jYKMje`@-*&3zyKhw!v1_({}i_B|dO5f07i!J#q@G-OT zYoUAuqxcvG^yg!AYTMenopH+fY&s{q1gpC!REO|~tmaWo zOleum0pBYk)|cR-Ti_0p*z9rJ2FHnxU_a6YMPi-_u?@eq82u9O#=DPIx9D|5UGb>b z3m=yn*XaD59rQ(s+d*(vYbps(H#>)NpeNf;9X!JF0v@_mw0svWXBdpOD}f8LX6^&Jbp#vs z5(n)EY-oC4^Hk1`7=CjMYs>DNg7a@G*1TsQnw}gm&>R-{{0K~18-L6Qpfo=><8sh9 ztvy7o-cM#Pm(bdx?;D#!&M9aJoer#|-iK2Dny2h;z2C!?ix(#JJRcg_^DchalhAo4 z*-?ddH(_aDRHn%3>Aox|*+l}_E#YowMpPjYUB1vc4e6&n55fDh>WjMRY|L}EEE1eyIECcn$xHMEo^VGaZ+yl5-B&R(<2TV%HkOdJA261A95)G1SH+$DPlGazVZu2 zX$gG^96t-d#>LgJ{S>GEE!KcEt6L@r9KxxQ?p zJEg=fSuzvloKvY=QI1J`>Gg|DabAX^1yfyl%9rqpujq-pmH-l>7Yd07h^JLc*FEzY zC43{?Hy~?i*<}E7T_P^%ajy{IlcVOy*M6mTU-|>*75>1dns&13bBAAVJVt!kk=aAE zyet>57T%ZTrqIpB-Zm!R=5Tum-t1J%d|?K| zNO8N0?Kr?zV&yKtwH5ivcrS-+NI#bqc{%w8COEK>Sj2AjSv%)rg&lUu@)RrHDc}Uj z-y6@D>YGp2-`OT5wjGx4%@$2L9E(c!Oi!;vIYsQFi7KOgGs;m`@rs>OLK z60I&Q=4tNPDY3Qd3?TgxZA-aN<%$bTsD#4AqBkfjojd!E-wyN3GP!>YivO1Jckk+- zyAK+ApF0OE5-|S6@r)zw(Q|z&jVCXpGvErntCJ=nA3W5=vEAC8I4Amy4^x3@nGfiO zoyxf`jpt*U7JMQlow_uYTknxFyYecT`wR)~faW@mEPe8QIDyBrD&Vd`Q6T6z-zRdq zVIaCITkJqF+F>Sa-}%tNeE@c7|A%>9@*o%G2GwOys4PmVX_%&?E?|t# zs{V^vDP^GLk%6dji;>D>_Vp%c)D>(>(qmLJo*mqlMati!gVWb#U)FW-68nU9z45+U zE6pm|LfolxiHSs2kL4!x^2Nm3IxK}C!(}1j$_QW9kDqxy%YEK9f3_HiZJCObE$LM6 z)C*4G0hHa?qqsgi$aW!K3E}y|3xjIdTU7!i@IFL zhqmeY7#>}QxG#h%1`6F=T&<|?K4v7MJVj=Pe8)}Xw%%oC6?Uk%q`Fi6IJU}0_MLuw z)-2m~c)olzF&MCiO|hZG%c3QVWOqjwigUIciEbbJ4J7aw?%vD;wLt{>giCY3|#7^2}z zv?&&TEbHTgwYi7MwmD!(o|1l6Uw!E9y8VGnb;qLFj>hCWE|*%D6T)HE5lzd#ej|h` zzQFZ+j&}AarI>u$!{@eUUig0Os-5kPLfj=`?`jP35u`UOU2XCFb3F3mA8h~Sg6}{e z$E0i6`bU!AZLRrVPzp1y@ByZYx%XTan)T47<>7*F(%aM?Ke#%Bnb09${UUGQYzHIj zz9teTRFoDIN0~Aig)XgP77n&j-&((0C(w`44*vMEl-=$5eX{y<61fR47$%X?6Vq?Y zA5S4GfHiuB%VpYh(W8WYKb#v`Z^K7Rdas+sq49GA-T69H&Oxv^?OL?xkp zRvHiek+s!C)g4)9b-fC~QDQbg2z$6@M0-WUf%ZrqyjH$wlt@l=vLHa=SGUysF*JAo zry#l&atTVPVhVObYyWv%T=xnAS>OHjFnX9gbOli9G*Ug{wbK z3f82C$|D)+jcT8C-cq3RbFP6^7hYI>&P16D1`?F+bN)GY>tWa7j!iEW?V3>401Q;g zv3azhQ>i&GU3y%(Y2e?BZ>K!6)M6~HWLDb_OXtY^fOh2y^ArRXW)5fx5ehx>6I(tUyALeL za5sIt&*qpvC?nDyqQ`kT9z;y|>5WMVwjxbWp)LOj3F6+pCJ5FSg+V7TfGqYBy{flLO`1=i}q8L-i3oWYn$_q$oyX0PYi!hJI;+-jo%9##ZSGte^Td*zrkU zo7GUhVB6iTvLCD;ut`FVOX5@xC%+r;t)RX0fA7rmcH>$b%pW$_D08$?wRi4Jf^%l< zJ6E#xN*c~{Ec98X6(}ShdATWYA}7PejEmsi6fAz!jF#o7U)+$|#}ODKpRlLYJdWUa zD^?xO6LZvrsA!Y`?L2m(=5p&IbX_-k*=AfoW$%&Clr6`v=?1;o+mpxsbyNhl5Wp!J z%*$P^qJ<$ud*Ndp;**WQSk>%;PK}+6Mui#-W59IX=m55tT;z>BFohm^NcYI3p5#an zDuA+zdDU2;+##|+TBicG6V4XQ_5O7Qc5B`HOp_gj)|Kw?L&r2i9Chvfoy03f0Q@{d zuBvh;4?8>uUD5<{FQ;jG6Y%N*)oX!klu+8u9M-FmZI|BrUAczhm_H20a@;JCcNO0r z>LI_W_;tX@o7*@d!hi$vNF~i-2vYpr_=2QVd5i$}7PkN011R!?7Q_y$2@Mq!1`#0v zJ9>SOo!)j9chjYqJCzE~U)BF5XaDDZDd>J;%LwJ7ycV5YrBmGx^NaDp$NGvvEGhen zwP)4oheEYa0-*+XIt@%zB7@8#+X;Z&3wc|`bBsj|`-w_*qY(UggM1JtHRR^yn2?X? z+;#A;A03z9iWe{I8}!k?a%@`q%yx_^e>F~d)m<5Noaae>|H@=6qn5fmb1iO*0{xxZ zTx={CGU#&Z1`3iNN&gPq3ku!J`j%MtK@n^#Uw1$8YCMiPlRo2ux2e%Dn28H%aCGcJs*3@zN_Cx8|Ch`4lSqHQ?EPSVhi6e8-OeptPe8BM9CJP=Q;n`9g*FN{J zi-BO(bzOQX{p~vO|v-5BVv8W;`!+ z16Z2gP;v(5Iq8G7Ibppz_9@ucSjGSAs9Ipr4!Y9~x~}=fXK7e)mB$xPbNDRE+$TA;AvxDgDT4d|}Q4$;7VDcRjP%uy6^To#YrQ6`KWtE6K(qm>zOmva;& zFa_^&i%}rz_us5M3v@=Mmps)2H(<*1cVVDG6&9lgwsXW(T^_CKu96`_%kT@1MEqg8 zbUsVu?Qh1tjl>&DL&gVJn%F)se+ggYq8yh7s)ip<+#n7k={VyVkMjr=PSh z^gPi+;gWJd)df)O?|S>C{m2M|$*8!N7p_3(3H>;j?X*co}b^kv<`d4mnMAhci#PjmxU;5@Vk6N&d ztti6&S{UnQ_-WZ;n|EpS!amD=_@mH>jeYa-pV4rPv6G?D7wh>yQ~{whu!zWQQ(fQ2 z=WlW1XfdOHXw!Vuk!9`Y_P47bf4Y9c;e7Vo{l4{M^})V$MhL@C?bL52!-K_|xMtRU zLuEgY&j*Z_*59W{7t%{B7D#PYGOPBx87gnJ#}iRBfEZVJ_g}OsBw@uh{5rAP#`*Fr zdYwG-yy6S3f2MUgJjr_2X4p;uV`2k2!F#zOTdmzpIAFV+m97tKsGaoIB;Qx2kWfqE;i+j<-x7A#rv!^(kAj~ zQ*FH2RF1a_*aimg)qWy#MuoqBMo~%!_+Te)AK_3q)r2eA+c{VtBF(eeNFkq9j;oKl z8}k92w86agY|s0rOgfhpKBoESyZr$+#d>c4Q!x{cxVvO@z0;EKeRq?(II7@SKU5af z$mw#8v}0pF0qeJkIBj#qKhNqa2KvY)6 z`v$f@7!J*?4M#o~d`@!BoyOp|p!K88{Za(i=-=44Ygr~Ii??G%TlBTu`dd0zF;dx^ zbG_CruHjfPEx7m zmOGkyk`&7Weup{@v`RmZb5?OM*b(^S{7gyZk>C0G>LOUkEx^B~UrE{b>7FmvvNSTc<(1LN*x->6J*@EE#;HhXkvCIEX|-RKa5^IeUiD0bL&4mWQI3eMA&P8)x>^(IJ5E{y`X zKW$x#_!s^aD{AWhn*0xL`zIQ8;Rv9hE)2uVM{2M3{YXTk!;|Ozj8(H72?Iy?!(m>% zvQS41VY4{7A%QTB997to=-aZ9-_lD(%ZCxd^av%-|3Lj z6u~?2z}h%3^36@T$SeM%#jSa@U z_aq|+@f$!LB^whSAB^|>3%&o1(Ej=GucubW^NKLntEiItu7F{b>#*&Qm4`Cq*D(8s zN|{e?d+*b)C^7#zIL6Z10Qg}dXU7l2?V4_|J6*(7MM!i|k^vaZde|r8uHrr(+ z-4)uk)vF=p%P|xZ+twrJNYXN(;s5$8C4tye4}^fKQmuH;A-$jc1!{0H9iR|TJSa2s zS(j*_tMr-CjI;;4Uac zx5oPlsbr59<##*QG$9D$!>_CxB7y3%HzBBiE^rANe=~eFFsfVEBk^L@g~08c_3OMH9T&@DJ zgx43EGqi~FXk$RdrNZ?%Z(JPfX0|nPoySAOBfio4E*Et-1$!=2b$S1;3rDN%anT8! zk&6YWSG;VzXUqbY0dPYh)4)*SqnveVg>)Y7wW~w+~y%ixK(UbkfhP6Z?X7;Sm^$E+MF%&)kx6$XTGEwDF_>ng^LcxBairJf9Zr+77YXt^v4jnEa z>d&$;%Q+$E&w80Xuf+?g6o{W(M8NGxJg9<@Xf!suXfPW;+Vd|t%GmG|@!K0a9#Qg7 zHAt;!7K}q|9QDp=h5K^?%Y=}1mC=k~98HbxU+rj!QKT2%rAXC(;Pihw6wx@h=hM{} z*~gGH+e~(_L4rhy#A$s%gfyUUP5~f6B(A-q{?0BiIZwb>f9FMYqj)DtuvfI{ttCg= zY?R4+WD1e$s+xY&tw|9Q&o0^t2&xqZdFZDUK$1t_-Xsmqd7lwN?;DC#oRg3TWzPVG z!dkEtRvE-mXmB^DgYtNlo|hu0P#Oz)k*H#;zjWyeBoE<-V*wsp_zD2o0Ky>j&&DqhRARRRwYkSc(c61lYbBxKTP)toqkHc)i`u%LeJS}SJ+hyb9 zyt@%hB3!`avmZ3eEyg{5f!fZJaclGgWNx^oa!l(wOS62F{PFLbl6Jp5?XhDZ@gurq zh`C{U*=fN4fx>?w2Nx>;$;pxS)jf3vboV7bP;7WY>3@VM?se5Nde_B4t2{hyu#TGGxoI0h%Zi zM#z#KMN~-qIV!)JkAmXxp$e(lmg3{?laYIwfiKs0)kc)q;jICn?#`DP#6VU}2b|@g zSXqFQ_KP3HfK9>#f+J#9&IZWL?&>5Gno@2-!;{*_+~;O-JKGIBsn*Z$+93P7OfVGq z$NTs7$(~t}!>~rG~xgZT}i^S|dZ4iLc9^NZ$W= z;^`{3oz}(xb7MTiy$SCFOKPiB9)VH+ZpWF!)TxNo(3eEx)uy-u*;Lg0gQmh|4;$czw-hKY;{tUS#H>`*fT^k%7Xn_^s_ zLo+dJqL&FN>DrlUzS^lh*Q2+m^xObp2-&-dYmwEiioH>ki(h3%6Z&nJA=rR;{w-n@VKm_P=0o(!A{NKklUmg@#B2 zucbjXG;fX`tM#` z+H4f7<`a~ak&09XxVtoyS~Rf6ymTs_yrxy5Y{UUbnm$PX!0~s(!0W;X+jxXZD?3;& z174JW$?BHSEkeRaI`+IcryiPWX{*gbEJKG$J=W+*H+T5_HJM|sYx4h&-iWPz!Ce`+ zmZ__em4j8PZ+u#1$?5CxRNt{mFMcpfpF!+zxTm9lCtt8V1NhV$WN)+a)1Bm;9I%x| zw&-}LA=O4tM$#m}J6?g`f!;Pg$h{%`J1PEEg$^F`F!TX?1t@fQ>!6!8H(oUVii9Dx!JO0ov z&J(j&+zUy|QkzMGN9Dk_ljCoFA|w5{_`ksR1hs+X1Kn=qxp3o*TQ`XdGQ9!r1yv{{ zPclM*1KNb_I)qscok5M{1!Vb`h`hEBup9IIN-QiI{g6cf%c~2Tm~7Nia1*6WIw7@(>fS%Tg>Nj*C72F zhP(IF4&6^seHi*UBerCaYnwN|<$m&7x0>u^GsyE0xY z+i=ID0vmQ3f;toA6nts$GS8WW>3x6xnN}+?1A3uzQva$KIQg`M^I{Cdb`hVXd)Ag) zxsU`{q=9V#-y&t={|r7#_<<2CkJbwjVGZ{c2@}re_Ty{)u$#Pvg5_s=&ulWSZ4DXI zClYPp0kD5UKfU>H)P1XtT{6fwX_+E;MwO-ZL{U3JReFe-4tRM65da91!l~N}YE%>f zPQrk3@?W}ma2?%Z#-l7TY>=%LXr{3APZiDecJ3F3pbIVqsE|KT=roEhR26COYm@48 zaoim86kc)ds;_$4GlyVc8h$S%l?Itp!o(`_S-0EjVp^o1CvO|x)A=4fUXI^dtB4c!Du_Vm#;{kcV6nn<=P6HqSo+}+=Z1sl_hZ!Q7e-z*fP7C4at?2y z^Xt2o^U9p3fE+J^yibG*B`x%}tiuC?6NzEp21sy9!Zyo3MP@-{X3F>^OBi}Py<=k& zU^5D*133v+-2mwancs4b$f&OZ_=@6z7Gdyw6eyEIVwcsXZ9irL3lrLC9Cv0P zxmqfX2M{c;D0e?*@B6RWB2rEWK9S>HP$771tqidRLPRyP4_?m5t)IsH#o z&awd9*6Y%f7L;>CK#BS9~|T-y2IQbY(f1@1ey ziu(bsFX~D0^kD-HEi5XIA$pVyvHA8%(Rl@?R{4|6D_NA6w)G=&PZbL-aVuez30Obn zG?+d;b{ram+BUodAn)i9?#f5%{NHxt3P#BKs=wW@d7m4QR6hBD8-&eo#J~hh4YhD8 zYsV;Daf%nr-vP3YB*{69PdlzN>>o5c86RZ!NN5DG4*$+8{9l2Df4jCDcGy-aYN6?} zKIGjjH#98B3f)Y+{ALWNN&1%Vf(Itloa~$b2o!&G=>ikep>T%9TlE{@Yf9(V6*Y(~ z^Kt$eK*?+u8IH3O86P?Gstd&L%I=ip7jKJI93LzH3wg`2-$VY(Wf75|oR+gd8H?&o zq{~`|@o>k|qYVrEK01FiMfNMJxM!*cI)ms_kxzf$L(UeUA z5oylWJ0K3HMSEHPf$n^lS z2@%vsUTFkAb-qUD(gcmo3_+3x{A39xS#Ie#7zxCu$Uv93uR z%d>S~@`D(mwr_lka49FwivFLZix5}f`iJ+E@&QlynzUZY$?c4hij_Zv;oSdx-;avD zQ5{iW5Z7k};ePFAI(_~6vu##{7|n2Axmc$XI8u%7-GgK5XgR8p%n?UFuPkQoHwMGv zi6zLZO>+|!veM<}m5PvAx|?rbEyRTx)xj_!8g`uXms3E*zSu{w0@SFt4S8h4=KqoP zm0@vh%eLK(6I>ez?(Xg$Jdoh-ZUF)W=|&P91NHEB==et4kXfYTV2{6eGU$F6 z*_caYd8}I)SUlwsJ~^+NbS@}LojaOuRX5tV7}2!6T%a0`4=-70{|#|{d5}eXo0v69 zxpHmwV(Q&I)SAciiXR4bFV$2QR*^m80Z^<-t3wKWfVsqAt6ZyQf4Qm$C2o(9+uG-* z=i7f>{IZKBWK0Lu!HZ7J2dFWo zx(77CC+s4;X&O@w@Fb6Zk2E13z^_>)PpcGeCeFKZpvd)(#@7qXh{@a@?8#73R&fGtT-EdQ z0F;{>Ky>?fJVz1$J(3aiF~+fQ6-tx*tSv-)kf!am^*oKirJxaS>yXG%k#ul>QYgv2$4J`=@*JvTwG$Wzhf;wrBRN4!^uc zEqp$!R}u--K&%@X->}V>o(bw66SvW?8?Zg)9wRL9zBUZ$a3*=L6*3gvRfcYl>>vZF zN7O32aoaw;T_(BsGuM(5!wJN?Pv-m%IJW#w4VuR=8FrAX4LD_&4<@H3;wV&66`n7R{d4f1@d$!+EEowF^4cB<;PFEz;ovI6c3BP49 z9yT8M$M@fYv70>43%<~25*Wq>f1Z2OS5kYcM}*9l0?b{J3H>(ITK_8o41Jvp{_5d0 z!VY>B+*EQ{-Q@?B;-%=aF z6Z=Z-i&`3GK9KyKnR)3r3=i6klm{wy5W@ixqY$R)M4=jMGi_2>u%|Wb;#2_Zz0Sbk3-ASJY4JZ_-+W31;$YxU?Qv_&p}u<31!yL6fRytQx9;(-eI}d#vrU7{GpoV!OKT|4J60 ze_Y#}R5Nh#HGS1MdBRiu9xX1lKv#MuPClEDpE&KV{Q8y z*bQ0ODFi(aZn_R`Ed{$gL|Qhv)hMtJ=RCwM0vf81eOazpQC1q^095^g>R4b$r`Vuc zml#K*L`;nmzyB?P48WKg+Z@)bu7!LTH>G$1+mu=TpRM3CJLhz@?#;%NDSv<@71#OCW>^c9HxbpvR0vC0xv2|D; zzt_B-clPp}IQBEJALkA!$p;>!+gg9(AfzY*wLkjyR=F0!^p!jr;tUZP`7BP z+;mm9;~vyOgN_%_Qy+4(@mtH}?B83X9d-T#iTw*wa`?Uylvb2X!ykM9m^Xw@2arh- zg?Bx!;(uV>+*Ej}7l}mSV4q+DwPR2cw|<+nmzUKLy0To#x(jRzWQ@j!Q9WMa;h?mm zQslWG;)s^W+R{Aa@p`GJ2QO~lF-2Vnor8oKihfE8F9$ffWa3rIDfklULX~vM91G*? zuNJ#P;v8Mw)?7CqvR4At;aVuFg7c}kxt-5(kU1~gE` zQPG}^2?FS%1{2_8&-lMSi`o9dV-Qv(?u2Hz5D6-O#Z94e6&fBi)B1Rkd$XxB|I`S6li&AN7cl1L-rI96X+G${HvlQ_*$n}%@MkeRP*sG`4VA;>xxx=bFy=S_RHcVA zpvR*QWDsKNBD%LVI}^8(Xk!m~Sbg5@oXJ}hwl{vthRMT>AvNGOmg7&}L+K$hXP+3*|y-m-*Yz253(oJ+ zW6E&kV-!n(qSSs#c8zc<)+)j02a2O_020+ayqzb%7-ruxt~H9{WCaNh`O^nJyYC`E=| z(xy`YnnzlVu?%z{biU1HK!RGRd80C@A^-+RCyfMVSkXee);g?kVQS z-IdSAO6VFhcOXwh)A6;y_31|6(&202k3;RNbWLM(*M60X4itX=oR2v4VP+yt1$z@R zF7I9qNkXGh8u{+t%oiyGN5gjARw+a}BiGPy*y_Whlqq}oB(k~{FbBwD9}ocYG^E<| zJfB=YTn|MQo?_k;@BqYiXUWOLOep@g*3wKm%D=6&SihcvbA&q`OmF5tv(L8dDwsl0 zhHU9Tnt1eGKVxpFz7}`Ye8k=Q!M&Bv?f7bofBcmzrArhC#g~>rcjK|kyN6zDG=F+& zCF-n?2J=p}3hyx2FqE}fVHeg*;y#x@4%A@fL1eV>p$8c{JU|Df4h)SlKMC>Nv24oT zdqG_Y#%A9HTIfMwIcVHUQ}(Iz#0OZff7Jb;Sd5y->H;D4?r5yayz zSRTUKXTU48hY}6G+~y3k+e(XS@p@LkVQKHKUa)9KD8hTH%zNHNpgR>51;p^1+oBnc zbtlh&!JtwUQ5m^I-_fYd=;HIq9AHH1$4~TcF6jpV0hW4G%V|u-i-Hv8PE?mWO6hYY zhD7T4eYhqCGIvb@zF2`@ei5F}XmKhu0|Nv3#S@=CWOUPy|B)0qp{_u2{&>~&saC^( zU`Y~i`p!&zij)KEAIrrS4eZ7flJwc_Gpxj{xq7iKkV z72hbgxVKkD+HgD@k3d@O79g{Gbnra%Lk`fS5B@qG9;LMV5%agmn-aai0JQJ;Q&F;m zC2WH{X}z^JOYH0MYQ0bKm3dY8Iew&GzX+gge1YPBlbXL|XsyKDq`n!_^*+<_kv*-L zc$?fmy9&)-cF8{@b~l-R(BTyd<5tmRUV*IG%|VN8j+GGm?bN003dn89tK6#m+ z;nq@qK^*ow>~H2E>->Y?61Tc0xlJ^Vat(~A2=UF~begHdH9~C95rm_;XS=g~?LLr%319$4@54~+U{;o*1p@G(Vwk-?fEW<0TZ%yDGytxOh`_{p`LhnRWX*aB z{C8{VqI7k3m-cuwc$QZ@C}MW0Wr+?)fn?J>hp^h6Y#)VRSc=P1rIwKp<-2z_4H6xn z^^|CeSw=aiQVQrvz+G?XHx$}mD`(%dOT(=hVModBh{Tm1zJ}T-|QRlNCv>5X@R`X)uB^?dk@2Xh$)KCeY5rV+xY|ZJ2+%n^l@NDI+woDz-5mRrw%oIDAMM9zC{Y8Q@V3u zC5{Fec|as;@@Lrwi^90mAMXjOEYc!*=PJ?_eyQODA)f}P?!*fuU`L`4?KjE4i~3)0 zJ7yhj@?^g`--y+1j{t3>@2s!LpHbZa>UsC<^$=SiRuWJG9=_`BdYg-xJ8@-%j+-Gu zUXv29qe?2}y`4#i4U};H=b%!nR*>k!IcaKWPan38@3CN*!@Dtsv#Yys+2m*fLq
w0SKf?7L}NR2%h$>J_ICGw2RET~xWsoq82&HfUV^?@|v z&|^a@k#btlp_44X%j1FFkJPghGq5+kAfJTEjU~W%y-n6;lX9sSjy6eAi>>eLC@85Z z`x@Mb7mEaJJv=S`=N^-jA^Q90k;iPjtIM{0R2zbzOlDUx4Pe{3W@?1MG-|(kCM52}pB_;qUgo zSgtUjFG@-GJbD$l^NgDk(94oZ3J62$-t^ff4*>Kb%qT>6DiPI5V7yH%Zo~61R2>i^ zHb-)MEKP>(Y`(B|ft#4Ut(|Qln27R!B;o$gwNk-~7(F?hU%X$ZD2N1z*cExRJyob4 z^KmG?MF|&rG~UrcT_*+baXK?JbW;B6Vz6GSw*xY0)sjfZ5jnwpaRE3W83?E;^6a-s zDAttKCEUg>ApLNc+`9NYq&KlBXbg_H?a_#vIvux&HNol7BkG%Vn+_ZDiKWW; zO{=sS{=BB9@l}C^hv{AM!xTD+M#CCgPGVc1&a@;2tPi4wV}Pct6V^JR|7%Azz+lzq zcS1xKwg#5qduE+2HEu0wZXK|ee7%~U6mY8eXo{y6P9lM|awPSR*CEy!8kZ@t29n68 zT!KSn`vrwpP$iLwm5a5u8S3d>7yy;!18v}cvwuqJ6tBP%trOjnd8LZH7TQsqrey=_ zw$&@N#BuzYkq@(cX#{Wde6_05Fi>*awp4)#+i0)+NDnK#AAWk^BCh%}&+izD5AQ4$ z$LoE`AYT587$DC2EPeD(u>r!J;K9Yar@RMC5MIQv*1aDR$FJEp<{yGgEjgal9VOEl zMyiDTz!t9^nq<%&iqA)df@`(hRyX=e>@k90+AtM7nY@^>cEHjSx=P=BB6K}6# zQ$A>C*dMFDf9Y)-d6z5)Jp{RknA9n(I3BkwjiZL%#0v+i5Xld~NXhYjIE7M?Wh8N@` z{^AipzYwRTLl(2-nlUQ`vR9(SH;~@AG~A!OT0gD>vPgbl$YWuLck!g>bNP{J1R!R! zh~?}6@{FPY$1!v{Z?!dfzp%U5YNVc)Ce!WZu=vR9YPFSZJS*J!;zZT9;xMct*HpR% z>K1yCw<$k+Y_+A|QUJX8z0eB~|7NHDvRaRq;HC$PJ$!xJny*T{#6Unxc4jlrB47*< zJI=$Y=vsTv?q<7iQzrYAh_=WjUI#zLWfvXsu!oJMcY4e*X89p`&rG%)#OXiB-6IA; znwg9VN~a&{AJVkY9%LsMCq!RXB$S}sk~rvTXxI(yp!~|6TMeV9H%;CZ-=h@YomQAv z+i%iNb|omXd76D%xANn;TQFJOobZ!_Ejeqfr0<}Ep!|KN43z&@5lBtehEqdEogTRq z5LXMiBLTU9*k3r+=a`cxVCwSw0~!Dd(8PBrhj=C2+BTK>#sD2se;OODn_g6gO~kT^ z5^#eBmy6HYh|U;#mG!PCe8&-2KL*H{oiRRL1K$y}kQs4YjjS0BwdC8*t^!SfI(FOP z^mx^s5>sqvtVN1R(hh#2`JlmACSkaxnJ2vIpD zZ4mZ>Q=N6zmj>Sej)e(T*P(VrPFwt&LJMY{4iHXd1OPynjSFIk!UgRc27~y2kXN0< zI6prrHvpiI$OG-N9V)&zBnPWAbiIX(bgx=IiELEH?u-*~3pcqu0XWud>nLB3ODjn;ldTrjyPI>o z41?1U^cQcNFXo`YERL+eTLeL8KSS%vSurZsgCpi5jjv6wkrFrnXjc#(gfVmpz>xs=tc2pNzqfvqte!oarifN;N2-0t_F?7srW|DYr<&` z3l4Sv&$V4C-@`x`IosY*)^7znTamyVlpT+Pdd(^FnP(pJx7=YW-IfE`_|4+DRth=z z5fv(PvgDx$lsyih8uW|y5cf62^U`!z!&NDGmxwyQr&!3Dv=a0k@V-dir~SSZR)rho z-&*G~;ubB3*A_i9tzA*5|0%X~{`XkPKOKy}-mkz-ZeD{<5Rramsb&AU%sJe)xR z>fiIY`R+$2A-qJ_G0*#}Dj#penX=^Mr>!n?ghHRoK7nNiT6)VT;W;S#)n-xy0Vcx- z_kcVH8SlHo?Deb@i`&w_|abbL3$e|!!e zdY>N7#y7J2Mjs#1 zXTsGhrtSS@*@d~30053ial*VS8n!bR8Ive236X8FEw3TQ1rWzI{*F1FLaK$X=ec0jtiM)bc zq_~@?7c?btjG^;7TT5+JU>4}df9curDCV%mQ4ZzSm6qv%hQgKLTrkfriDY{G?l0h{ zNNP(mb&}95>-5~6LCr{x&M`4UX!Dk^wCO(Eivy0y?*r9I@S0Rgtuqkc(k-ZTkp<$g z5-G!7#@TW*#NWy~r?i%-S=nl2WJEfPLu40Us=(_S*`gPIdmg_Go%f7hXEqEtVNmJY zy~LpDZ`-2wKBS6qyZI4C43lm2sB(PvG0I*3Zv2_g(dG}{tSj}2^98fncQj1gv47LM%FMf8e^ZM>zV;J4ATfASpeQ`jXR{#DQIbTJs;kBiZj4ymxR83 zsri^aK1j=^zDWW-?dbG71)t(pVoaX6a-Ea4tm-4T`meQFlDbZha^Ih`wWyO+8{GIM zCtr?-e{7r&r2n@~UAs4t02xLpxKVao+4|Vnc68`>cQB-}cZ+!HtW(_rfO|=mZ8nDq zxILYe-?2~CE+^!W*HTOP(t~V*I&nEnz#N|f1Z2nsZ2Emz57}Aocw7bp;kM$rDWRN$ zV!c$XDw}&5l|!7caNG-H=_gfW2_VNE=X&)3nmI=PwKD=p+Nv3o-kQdB^dqSI5K)2} zkRnuipsOnvpQ+!dme#y7F}$(Iir-k6LIKbTO2MR9@BpvMYKffwUO$#4_A)pR!hc(d zdu6+cSo5%BMaKI*hRjd#Y0$&CBGQc+IqZL>t zjTAIgQ#{j%QzT$0iSEldp3wNfaP^q5J;Ok;4mwsAb;4eWbGQeOMJb z1S5Dwojia&&ga=!qt-+@=B=u1%#vuf&JyqoaS;Om4>-0_4mJnh#85>7XMFHH;?10a z{u10`pnK@8zUJ^5RJ|@D6MAI9wRGFFJG`;q+0MFmck;Ils1A^=TaL5=Q0_6)Q&=*J+;=d{h^h~R)^b#3IF&{s>XyDOg!r>+78 zK5@+M8>d?HoN(kfqC0#Vm-4T-vm_$q;ivfzsblaWt#aDsvfo63aN=x;Jb6Fba|g!5 zn^dQ?eAC|37sHAy*`o#|b!SLi(@f`ouKda(QdSw>xB3Z$#FW$?d4K!}XnyR+xftac z?{l{k8YM}AT~y&t_*0?TOs{&8(fhjm3|*MGtt)_*KgrlA0eU&-Pn?OlYQ9Q_#sdK< zQ<|cZ0vr|dAb>TO(neEgd|lhwILkcjpk3HsXoxO7ChL6=$>{#kB1A*n_cA}4%$JQd zm{&Crs_ECea5v(W{-VAYLKSb_rBf@Xa;9KD=%EJGVgL_>FaB)UR6* zwURbvOLsoF1**ETU4d7|-^N?nZ~$+p!9J2*o(QauyUi-ugdU;%y#Vys%C z7)}@($0QFEUp`79s!bnUd`bAHQ^y<=aFHa1p=0~_=agc=S`!DKyDX7jbmW@kz3b1; zAX{T@@ku~zxEr~gg51a)Y_-hAZosBiZjMB}QUr-Q%`yCQO@xZ*C=f#d2*=DhX6Ztb z)H6B3gdykpFJo>8eB+YU*Qmoa+SLo|`U$sfY1}5Y)iWYK)Lx3J0u7(!HiNg`7k}vu zT4EP2@y&z;Jp|-pWRg*kvNBYSJ9m;;l+iISu3CD_GjO98LnaP7Rxu!ych(p&TX{L$ z?mkUaqGb=_y4O}e{5IoGRy}X-v(y{apLBOs)jLW47h$-ta(3(%hNYo@@bCS|N>0Ng zWMaaLD6?3<_wEB8#j_f^GT&DreR^#x*1kRqvV7f47hm0}N-RJ}X2)qBLdU+i@~cu9 z??<4(#m||n9bzDqHHvTRj;&`o7|?5zSstOcmeX|Ztm^qW=oQ#Y6V0nxSK6LA0yh)Y zXk^Fp+lZ$Aqil~`^QG7z8xBFE3@9|9j5VoKp^CB5kw39B1AKD#tjR?1x zxjrIHlt}EbtMq5arHKCdQ4tXYh#rw?mh;eOcsjvpQ-BEqHqEaAkC9A}FX|mZ!MLE^ zw~DK;$40ZnVKPMyKP_*zpIDIrE9cDKNIf1c9T}nIqT$rA1FZ#oP}8l`Gn>VKvC#(H zXt$KZtChMJ(r$2wM%Zweb>|Q-2E-i$&zs|A8QawF-$(xHN>pSexQ$k zstac?T;+VG@((s~v!3r^rhXwmlxwrA6=LQoSJ6$Jv2U>H;e1&n0jc6OO-w7y8y|dx zet#jqiKZ23%D*^jp}8f2zStcSiWB*fg>T_45t>R^V;)AxRTABX(6#?>bDEOCHgrzt z?H^dlDPIJ54F}xhSveSHkn-n+E6MpNqI@vlq&;gZ9$jKen#chgCny^sP#z>Oc$MImq;DftweQ)99AR*#Yw2mT6o`vr!qgKIMkO1pl%{xNymMpkntcESP?oO81Z3 z_zZhVo* z{?yWT9UTQ6FTuDsW#4KBu`(nO8fVlC>5mA$C=<-~9}Zw0IQvNgaNwsjzdutI;eySDkphP2UF-292h0`<)Wz+;ustF3SZ+0EWVUn1_Q=Vo_EA|@B+A1dzdcbF3huB z&aRh*8846cFM?RAADo(>*|?HWtOS=n8(toyprt&w#E3=FDq#gdF1>`wR>^wJro`uW zo_~_7#bo!^W@b$rJ6)}>)5P5H8FlyAk{vXq+Bmbvji=h>##>-TRKvjw z=&K95J%{6RtDp?i)@kn*Xx1vgt;(hESa3FBP3#gFbV&Sbb;N`O(3~vlxc$r>s9ilj z)?V-%_Vc&YChD&%dx@-E6l-VBY}joGFseP+db^csbFn41|9H|Ric(f_lZ~QeGFfZw z>R31U{fUH-bt+O0Rd?w89priz(n#`>@5#jk(V{;iFVMV_=b(VVFFAhjMVqXNF)kUD zZh*fuv8&_Pjc-f<)l;NU@~qLxqv60U8SpO1k{HWS&EL+3m)MuLpwcx#0~!N?oE>sO z6?M^`j%RY8o6F487~i=^eTsw%i5utFncnt>$rB$q#zeta!WLTOb+rwsR0K> zdqv%(>g(K(YJhu;u+Eb`;`X8jXU>inozI7aPV6J0iavjA7F=F_YJM%^|E20dZ9gPq z1zYsi;2LSfwKS{m74k^`M^%k6fB=%9Gb0MIu55j7aUx3Ff>U9|YEk=q<~!yxT;FF3 zf(sbUr?}TkNqD#EG)#?gM3K*ReJl>1%xu|eagtn0R2U7RK9&Z`@%bsy@y)X_rG%4B z**6mFegM0 zVx;*Z)cq5INcX>a!lYUGga7mbK>Nv!b~??v{9SIHEKY{F+l_zQhm2NnPu5#-Lth-G z*tb{J@OE!Kfxj>Pvd%_V%aW7TM**UhzvU2HG&xyRRC}~IetBG^eq~}Ldy0Vevl8s$ zMt$Rc;ZIAjxDCs@8uh!0;89sGQ;ri!#rN}itqOR9R7_=W_IVnn7boD~aK9RIH;V%3 z-Q^&fYW?2w{i9J!={q-pA5O0f6<-j{PinN3SQJHv(DBI?F2}6zPa=SWH%yaPjK^DxM4SDm2BYz~%PU*pGBOB#fIn*+(RERPR_BA>pdsJoh687h91vbF|OgWFI z`3)Fj>LpA-Yypyrrs|Y$>6|n&;i@Og4fex`8;*A;aHOqa(bx9SOH$C=(ftJ^R7gz@ z+jbUm;TwsAA5P9!tjX`aM-v`29K1o{TmSa#AzjoK@Ko}h7_1UX-V)q!2uu=JlR$5 ztw4FSTD#zUWP?B0An;CbQVg}>zFZUaXUQuNRJ&(x>yP)%aciX9jp$dFO|tnmxjc-5 z_G={rhD#4nwjTlMW0!XS4ZWY0vAD%NmOq&^ms$VChd2UnaZ5?Ms7W0kBQCEimf?xI z;wrufEU4@u{wSR9eIK4|n-``_%Zu=C9` zY8XlDA~HTHa6kP-=E?sLAo>Z1wk!O)t4WFaJW{$8tWdQHI3~$HZMDvq5Qr?dv@}!f zmKU+Kv)Jm+$T670#|b1t*)Z#6gYt-l716F~^3FwD%f~qD=vwa!@voysmhUvM(;%YN zp#@8S{(7iaHZ|VrV~>jz6GEhztoy#YCWaJX^?p}J%dgwo>{c*JnI4prPQ*V0(`~h& zqI;I9|5RjBRQZEuj$CC4dQ^DF^2|1us2q-jd;<-b?S>W!=do*lDXvrc(Plv{O)jv* zmSouT{ne)l{H7lLz`>!hDJ^P2s6vyUaa9FXk_<(e1(k#Jqiw)69Ea#bMLJ*udIIAs^kyY|*Ty0skfY7nH&6D;$@~4Z9KIUFL6}5R!tb-p6c5 zy$l?Q-%V$DqC2r}-L%rm_FpY+_(DVs@a9vfAv(BsRj*-3+tbu_X+TrD6STjg%@7~* z?~g=x9IazxX5Hd0q9&7+=vjySY8J1HfkIVyGPp^o5p&$$q{xN5oqfAwf~N5%b0k9o zn}jD?fimm@zp&%cXDHa`f2>wZFO)#=r|<>ow$jL~H(7bku-Bz1{Z|yNe!`5(hPJ&> zFJ_E4bOFvn>Y-n7xw}Qf{Uy^%8dd*iv7vtmvq3q zeawqdOvLVEcN&wro7HVSCS%b#&7W@@Z^?{5mj_fhr*xDJBaZfnLs8M#Ox7GtJCO12 zxrE#-X1qpcOfFl#JcoYlk5t-BSe4V&zAo=kT{ulGe8yYY4L> zgjN*cq0GMxDiw@-2LjzP+!uI3_@tBf1GeO5vMsWGKPb#>|Fjm02#7EX1gue^wI*Kr zjOSHoKJ8BK#=04o-YXnUeEslM(i<4Cx0_T3w?Z5+&0fIe;B&x$|UGDjy1TDa=)WwSKv- zUt%|{8M3$0C|MKn42hHT|zrF{6d<9Amt@XW?IJL$NX>Ry0J9 zok*ED4WK8#AQL;sf!}SZ$ThhR1HIwIIV5h{HtMF84c-^G8|*_P6%4c(&Q`n}EYuVt zalUMyFxU#z#F-{B=;+|>f))yV=$%{b+i&-1rkkMksN`CDTw^QZA&o}cR=u?DAKyrB z)tx`6WeQ?*6|`93mFWM_A>#N(ZQY4E-T@`H=REQ*O^7C%t?T;rK_=U;9wG6b7A>2s zFV5e6!btapIvY4&1+cw;0UbXn5ic`mQ>cl%!nTPkKeKz-4!HD$lG`HBIBBJMD3Mh9 z1}qDeYt&1VU11zhTLeEz$}ixv*TY_$27qC`+lY^9ELq6)drTDrJXxwGn>>s-x_yb1 zok{|l^FsFaB%fr}UQ~_h*9zIKXn6C<%eXqfwpL=TM0e}pd~l)P$8#!}>CC8gi^f5= zWR7NZKOGBaqTkFOirY_F#IsygMA03G9eD}>rTJoZ^tgF+l4LtF612qRd7ka9EaQD< zVs!uSx)W|0C^tHmsWTsFaAd?Va0I*Mq3{sBU_VTScbAD0n!KbykFuem!`Xmdd z%vXCr@c=O?81ib!G+5xm4^O&%6P}u0`uDk8?JM<(87`~U!>}_~YX#%gPbyI+hhGtQ z-Pn_Yh_J{q6D=%b6+f1B4G=h>*HT4sBcikP#&HbCTZm-hZwPz(i+bOljcu7U>%mVAotL)pWDWfm_O;;y zDuu>64>4a{ZWlmfMPH0qT3+`yjuA~?L{^TkM^tmFz_c(An=Gx`dqA% zW^FczPAn+FBge0MFGH-VS(7BJkT>7-My)R-Pkuu_PuiMPyS~EHQFEoJi2Q-12(3QN13T;!O8_n*X zT&Db!Enl0gw(-J~G`N!<=da37vSg{arCxVM8JopA{Gd+=H(lIQC*tbv3T$ zCNU+8i0q!r9`kOEr$x0~Or8Zx87IQqkzZS_ra&^o!mI#RnYKLs=C?#44hnA;0LY+x z4C-=#42nC&6{!qJ2HQMRyz4!#)>7c4gvVEIcU{*~N@*c4lv`bu*WHNs$d}mneGA8? zDErh-arrR~VeX60;YmkVFYQY0ls%fc@?9rILgQ-hQltbZyp}a*&2wsDfchF z_kD@H>ZR%*wAIazXBnVhg=zECk4sw%pFYYlX~uWGz_tnwL<&DQ>lDa=g*~x<40msv zGNO$W!O+f^4f2{#&SU9XwWb=I!VV)#-!_iMLK;$C9Mya1aLXx4oh1VNIAP$8_vBhd zZicDwcJ8FJ=z)saH{@4uPqxJfxkJvelspqBIrNkmDZw14GaOaQ$&Q`L-`c;3?cqHB zaJA!v;Nn!5Qu)_7$hYdRvJ_676ic41`yq$VD^z_7O1u(C zt5FsTJ9w_Uxy%lKnS&?-xm>##L!|)@Ut@{RN=s_Y4hM$&p_IHu3C4q`a?st zChS7O{ew#g`=sZv{o;%C&mkM-QuwJ)}KvT-bK~-7Ql+Y+CoSZ+wOo|iE z^BzcfTXio%sQ(F(-hSomAT(OF#2xyu=by*RKGCCZlU4gAI+ZZ@e09TX$Y`A8nxlJZrz1)-aj0Q8xP=4OxQjym?s~Md z!|^8KY?gduRjsD2j{nTAt%oJLi+>(uA|7E9ScC$uov|XL6M&{;DU@cOcv$}#=`CZU ze2Gc?L`0lY6FDm%IPM>vykJWCEP%f~z~c(N>Y}UojNA7sW?b1E+?9Dne?=VSC^SzO zJ^r4Xq;WzgeFCDocg()`Ms3ebZP#*jB6qdR{wYiB;em;*y>$H$Q=QjGE9+7bY!Y1m zMtSwnvz?;Er!UpXmjm3l;qk=cqkX!`bO4irc0>Y6z}4v~4r*2MP~;6Y^4gfV1Bd}# z#&v<5RtX>>50qb8>E26xx2s(qGAn$oS|&QecFuupQ=U!h&*pnU z%HBEKe%FBeEv6-;(G{qJi%^RIg>L|KkD@@-{8J!P^SQS-mYRNqiD&UFF`kMC!{L6Bk3X2)n!^K^;&-W=NzcxrXbvn@ z0XbQ3tO+iRso-5Q2}TMIc=$IUl7O5-Jzu!yl)UuCbK*lY2jrI@G(?+gswsT4S}#+Z z?3z%3Jbe)piy#kz3#CRN)f)`8#Vv zn@g_PUwZZE$G&J@7HraYx39kb%sA691+RwW8Oyhiy|y7t{C(ys#(eSfw}7*=#-+)j zTeQYVuGyD>wqVD&vh~_D<7AJ@gaUugJt7}QC6~mS3sScSML-y`jxszW6hJ1n)u~}g69?l=+ z9~{7@;{FsMCWdx@dNRK%3-{r=fG%e*N_I{@9W}6=D&t8?z!tn=J#J)jrfP0K%R;;E6V)fMbM#B}r?0)NF)#1_ z4|RFM(pKXPucOVR-|bHkR+rP4P^$;p+`hQJa2`^u(>o!f=TTQP#pjsfqWJFW^B6Kt z5Y#J#t)cH5G5@YM|L>pjebj6V`NpP+8FyL3{b^>c$f~W=S2|Zpvr2x>r>*ASXu};I zKEPFn-|3}#f6K>uN#kn)pYrUW%q1Up^$tC}InIg}R$sA~-J=4x@H5ICBq?L~I`LX;j$s!*H2RiUWk-mlx7T}7vyrE?7T%kGN8GSgb z^UMgpi-|L0XUzj9aQsFciMIf(wX6ie?KmhLaetrNz{h+m-8sP=`4jE7nhSH3b=r^f z0eouiERKMkge5T~64`!zG+TV7G;D0T7__H#BG?wgl-=kCaMgx1<$ zzEWcrr^`7auB7A94q3c!u&JfgKvWZJhK;bk!=Q=b%24HkV2P;-0s7amM}T)H^pgo% zEatCD?K(X!?zVMalOi-XR;!pkCoU5@+6E)Y5)BVirA1JpcUmwMiqYKEfoxK-2eZs3)}9d*_)$1oE?>bu_c>EkI!_nTLmSFjuo)uDU^u=YO<((bnw;;r1NfL!4GQ> z;wnht29w(yx79X?R(&qaD8xD_CVgpUlP|0c|Hv|-n1dM-FeWYq!$LILdRXJwZaci+ zydSN;;m`g<*C|zqzb1AY+)u&ES?-haG4%_M`&V8CoCq9qct$dAt z1%Z(Zg}ByYI*ktz{Dn{PClQ&t?E*q8PRx#ajrZGqu1B>EXN!$~yk4Q`V6R#5=@3MJ z6oE!CIyw%Wz}c#Ho}th&v~1&BPx83=Xcm3POE-5(5Yih$I@CI1IK~RX zD#XX+b7DL$|JZgdA6+=CY~#kPLb`-ky}WmFQ0E(Jw%N)#k9?9Eh$B*q<>V#+p{ihd zhpTLvI^epiUNZRoKq=biT3y}lc`Nbf=S_w8*OtjMCEGQr~o@=;}LsK(+&jp3|PmnVXc{n+D|D7I`=WSoDV+ArTNd0phF)l9-L|~xb_A> zj;?tc9}Rbl8OSR0YsV{iZy}klB!do|1^m9C7`vAd zH&94|_gQosq2Ywxfm2_M56i&AvDb`O0Xl~70>?nap^G;0*Gd~b^N(q?!ds{1AHe76 z5lM#}-pV1qO|vitZwry0gqmb)cIac%i#Y<7;eq~j-XJ;WO`?Y+*EQvO2bKJp+%!%o zJq!4we_OdvjN)6V*E}g%O=AzCfq%CERMQ(CAm4!!vK&Dfug}a#BjDX4k}8Ns&;yWx zP`Q6vilA%?(lYyoyruCZeSKjam`D9|u)uxf{$Uw50Y}8u(c_dlekJoP+VZIN!$h0Q z`;x8w|1R0+R745h`nvb}{>fk#=(ZI}se#g~n(ORHjyvsBSv0XZQE0Fp9yt$S2|SrN zj3PNigdl&OwI|mdnu160wfrN}M6tYc8%_dOU1O6NOTi?ioJ63mq`Y+|5e+P25FL7H zg+PfTON8ju+Im34togyQw+v{a3;6l`4|I}7xlOldp6|ot2}lE4kVVEGj~&bg@IVP- z#jL}o%TkIf#&G}Qm&Kvy9mMWtB>$fy=uC7)CwA#8{3pQxT#LD44}-i0c0{&EQ$Yna z3s1h%f(|xO07T1U3wi}!=AL%@#wDfu*#Uh7&H}=X#Z@Fu$Z*m5l_f_n-;|V-xB`JU zE_a8AORzTZga!WZO}eOV5;i=5(A37Tt%^dNGF~bbM~PK6x+&pvxY5$-fN1>F(Y2Rw z*Bk!v%ZXV1jA#F5IxU1xcd2yLIxrQCv`r6lASW#D{o>?`!T=25Eo{6Kk9~LQ#3#^+8csL~tW1j<6kJ9k;Ed|A^+o^jC~{$? z;zbWhsyN(tk+Ii<;19rGx15;tgkK`={*M5C#DXJ1AwuAZs&_5M2iS!66ZIYSeU!uF zS$Ei1+a+Sjs&jz(mhrI;S1pw+EG!)0g02%Aaow0HL#mtGs-_v>wVT$kS&0WIy#bdC zzf)G<6s{LY;jpMvkR}&r6lj7BO+@oX~6bgA{Mw zq%Y_1BbCe`mLF8mBv>I!1S&$E^0&fPuH~!q&K1ziRe72`rqk>SI}BGCxJ5EJ!xf`E z&+Ao;-Hr#GERRKH9-p%BgSwExOEfLZSQV0Ko@QR*6h5VfedCzAmqkv7ISR>&80X=H?BT>ngK*iaGwYixsEpwCj ztcg=Tm9%;?A&ws{-f8oZHSbD)-wi1H=YK{FL&r|s*~!N!+^f_9Z>*UN`>gwHkBLUY zUyDn{@*hJS3y7`T2E&pm8$XqvSp4&dkjJTb)7ws{U@Nyq6X*VJvV@vyqLD8%!(s{$ zTc=&6*wT3W1(8t2&MA8veaHF%QZDB>1cP_}@+py;lh(?M!ZcyuN@5zzrXwFzp)s={`YBVf)yv+e=0*>aI2P4!xov%HFgo+ODGPcZ-`L(mr4Odf}w} zS4Wv*;wJm{ta#)(f)>Ij$Bu%z%i8m6wnyhW%qPd}WaTCLN1ky%v1DcCWy~v|hf!<( zIp=W^fj#)_UnKjv%O%-BED`{wScRyAU)ia8;7Ykrkq9w)Kc&dJqSaf;GEZm7k1l~- zhoKH_Lb59&OZl}?6^pTxM!5>zY)jqH%!NwI!==yR+lO#sc|_oAy@;s{{o_SuF=l8$ z^f(}|%xAbZclGp#2T>dVG`Si34vNMG)n832ds``!AnEN`z*+?bZt@Z***o!xGm$&+ zjC}Ng&x_gWG*(4r{S()L89-4(_Ws)ZFW=WONu)!DMUb0(EiM^4uARvx@r6{qkz7&6 zUe!JRluaC!mG;wekByqDhC_G2T2Mxmi|K?rJT`_ho`|1e$RSE<}uP2{XK)LmBTnbpUeI_G4#%IGZfDipPKTZ2nyL;_vaVs zWK2KH^%mM!?xi=}``5-3YT}cIk7|he;hu@;s=mqhS}1_RL3&$u5WFOiw*qqG4xg7r zCtoDB0CDup9sjkry~}Z2gZ^r&n^;@Pa%%W>|9cAXaY-gu33hDP+#~;M%)^uTdn96L zs=I5|rtg`;svz~HVYEJ~U+Mqzd;1u3x&0m^9YX63WDNT+axo%$QNpKfw>-~>Z^4+yux)w?I{&KpZoj?n zN&`~#NTWEX#YPapXsKA&Hny*l0$lgaQ^f6te|O*oKiwaz`;$2<1e z0pSZ0LI~!-o)(nM(2q$uGjmTU4bkryCJXqRn?M^@Q{c0C{59=wkB4h>f!?aKf`uOp zA?8=Q`_}vY#E+lCDSbX*WEP~JWmwea5=1ibrs4ikOaBfl6AG^{+kv}2UQN*KLFrLO zzzh1hRLs#o0Y_P>9H}eg#{b$w!yxSQP9=6L$A`4s2cDnI%WnzA zzMLo_2mXiiG9ZD=R3W~7pGYQscFVsaET!q~5rng#|N9Xtuq@s4K0IUOrpl-$T`|Jp z-TqeYmPMQQ`GF&e`iLzDSvuEb<6i)G{STUWU$2$lA1vS}r2`{_4}uy;1QU6CPu#|F z)<@ME{37v&ThG{=Lbew;Kd&FXYsmi25VD4n+d6Rp;L5y9{X zhzr`B>CEzijqUBYvlzsI0w?Eg#u$IQ`wfLTQ!JSj_CV^RAc3PB*Wu;f)kJ+G%w@*z zWGRrMbECyht;jF+^v*P8Z}rdLYGYfs^}p4dMO~d9#v5&5>GRWr+w(iuQBz9F|N1+` z_z+V;vZJO=CEz%%CFOb&opmy_LLL|%OtC!Holi!#W`)uUkLMq}LqD-VTt3EHHZ{X= z3ZuxGXIm+!i>g^kFLoyi zt!~zD0_MDYe_(o(Mw9gF#X}QZ_;Rei^D_P7Aptl|TF+b+EnlcId3Ds3lYcdcy5XU3 zOp@7o7a;!~c?T@)zJlyY9QuPW<7RPUA4_C?sDtk@+IcKtP38r}`Qi0`8L)nF8Ofty z+Q6W+f-YUi42BXBzesjj`)+OG24x4bP+*ydcoLM5MSb1qD4!WVqZ0f{9-{5?Sa!XE z1VS*Gc=ezAY$|?x6S!Bg?x`_q%X5Z5j1|_nNvUNSIv+&WqT1N!8q_XN(f~w5t44

ud3R=9^@^{g+$F_eW5mA8qL?vAuPW}g>x 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 X1^mQtPkRP{`B7KaRQjf18T5YuUCQPq diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_128.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_128.png deleted file mode 100644 index d953ad9ae34e6ce6bc60fa1f525d9a6d81b9b78e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10491 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 diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_16.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_16.png deleted file mode 100644 index 77915f68a896f760d1ee41e09e6fd702a6e7c188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1171 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 diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_256.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_256.png deleted file mode 100644 index c57e4e533e4641a4080718ac95e112db6cce56bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32137 zcmb5VbyQqU@F+OIAcF^Yw+QY!xDTG-8r%u)?oMzgcnB6CxVyW%yE_c9e82bh?e3p@ z&$;JzS67$xsoPRj9j>Gxg@#Oo3;+PoWTeGa005ZxA`Act;r*lYqr~+612hwXhyVc9 zu_#bO`1d-+cWD&}0N_Cf0Qdy~08j5AzXJfknFRniG5`ShQUL&b`^+X~f%gWGy|kty z0Dyx1-wOjs&m?%Ku4$pB;iLhP=lgDF!(?b|XJo?UW@G=34FCwZ@x2#qOq>iU+-$6E z9r@e@ss0Cp@4fsVn3;;=e^8vP1gSJ2N)%#tKTIe%nK+nOsDzLyC@2Je7@P8`h)e$O z?(a20Dsv|%dp>4nS65diS9T`5A7;#~yu7^3ENskdY>e+1jE?TMPKIubwvN>Qi^%^? zN8H5m`wt6yCks1UivQ>u8reBJ2~tu0$LRk&|4U9M3)BCHlda?bR_k3s=KorlS(#Xv z{}1i=t^)r-`4oRxn7niTkG>GA!2e+We_;Qcj{x(3%>Q4){4Y)a2l}q65V8RC{~0zR zWce<7O#na`AR{iK<_2@p3X0R6^?q}&zt=l2Pm-X(q~PL20#y@55uqZnxSY@=oVq>I zb8@=Ssy><}EGV#Xs=hQ?TGF|&$?WB%sr9NRJ&;3lp!u)#X+2y7{>n8A3x1deC>h?k zut7mH&)R3L*N@qb=g0HqYczFD+DD#E>$+ot$LG+0*ZdjV#!P|22>z(Bgg`bVW6S}H zI1!5fe*m7Z6dT!}a0ibZx+pfH<#>tigTE{7YYzQo&9YQiSuu@y!zch(d zevkHwayOm)j~9;%5>8}x{p^tgc|7>XxC^zJI}X21Hu1hYhT7*; zQ35Fk_?Ss@{xz8X+dB{2T}JvlJt6Ogt0Qk;Z}r2SvX?CehduzF6#sZZvh?eM=35;p zMEcrg-eEa@VLzzaF>jv_pR#kj_xxnRAw}fC26{zvlo4bI=qbNKg|o-FYDw9z*X8z^ zjNZmyvAm6@n7`Q+{^@A0sJ>4@A~wke5mrhyOJVhMxAl7*Ci}YHplr0#lx%y%mX zTJ%3`gMM@KX1iA4Qyk>2@gS2*frS>(1?yyF{`JYa#W~#z*nZ;;>;B|WcHTjnE&0C_YUq zGr9~H@sP1j&j|c?sqGix6~2ksHR!1XTR3zbi=F!wRD>Ao);8?sf4rYrB0Eljj?oZv z&p`RAP0|!wSMPB?NlUOPmY`9DhBV~3%Z6r9K_PhlNFrmvNY13KHOSwNT)qZE(?^)C zzzpugoy`AmL?t^45-!I7I$Y=)?s`mZ*{=_@6U0*CVpc)@#S%eCSCzBs;#IMyov|Ha zMox738ooczc+JAvKtT6ZPVjd0tOmpXsVMzrrUnNe6Nsu@DsWlE3{EPmCDk};>@uiVx^~~4Mg7)l*0ksic(M^+?$74##`Zhdp6^J#>dWBGfi$uFZg^eV>s% z`GM8jr}Q-$mGP3;Z-mQMV~V?1^~2-OaRNvODuy(+8!*3TU5a{k?QS=kJVt?(ODo!h zqF5ng)C$5z+|d%?%f+r(&_>Jh!45j5`B{6_{K1xPjp8M%?C_pB6tof5sW{R_1kDxO z#yQq_hH?d$R!jj0241lzOg}+{9pNW{4-p?bW>I^FC((rVIi74@Uf|v&7ceBT73zqG zcO+kGiog4JSUWy`|0srM_Km`zARkgn&}@aVGCwsJ_lA^sn-MoVs=Vq;}=86LV+GZ9rq80kJWQ?$ztJj!e40PSp62w zi{#-_(HNM5I8Y&}0X_3%4V85>nAZMoXCW;WqHu9LQdPglW7Ep@u84o^EQkMuZs)NV z(isrq^g3h~G5|ArsHwp1nYYMkbSz{EH5b{eewu)-0BKQR)K0tGffOUH*^btHxKNB* zJE7P!Va)ln0z+L+ub?S5hKx@)Yr_Fk%I~?m(;mG+IXnQbD(YEZD4&u&6WM2EZ#>-U zH$S?M79ygL9kg%Vfw6k8ubpCof+t{u6`kb8J-6Sw>q|5f^JN<@>&CpxP3V33 zTQ;`ce1T28syKLJ&~H~(C9yI>znU6Tpxcy!!E^@6=;lUPW4c4$Ic&)%@hJhA^#vdc=2WmDZeBAsb)Vqu&_*otiuU38;bM{fx1Xs@DJRcC zm;)Sspw1syZgVoPG54-q`03pWPb1`^L=|EKIfvpmx0F7&s2AGO3BCgM^ix2BDtlPv ze{~>(Ui(bk7JX88Jx+$&f2}i{ZykpY=pU#)7^NxO3mBMPWm^E){igzuse`x&Vs>KV zp{Jg2{eko5LQk#gx^-k$EBmtrGp5k@x$P{O<+4$lxWhC%#FHc}iE3OIA24Hg>)Zk`+55?J=PDGdr>e zzfb!kI4akq3iQVWp#8q%j2tWDbqL*~TaJ;j9XsjXwXkqHa zNrTa5U!ni-%tgJ&{yil|Z`TFvfQ7M=y@HJ;S;eEPa z>3TkJ{EQdelMr$FTUSBsc!<3ct!!42iqfw0oGPTB;OKJ}^xbrfd#dQBfqr4EKYrbI z+>RNxZ09pbEnkTxX)|%9`#B*xCt)o_EAo3*icoCFaVmXjK&*@YYC*W)-gbJ|HIRYG zrM5WHef_fBqSIZdS5Zw_k%;-SRP|O+eMe53J8dfr!B)DNq01!=y_QE~uxj4qHYC7+ zt@4fdJ^6D_zKdzY43C0TH#zd7QxVLUnYrW}*(Yd5CIpSz^SRRHDp>IWjj_J5kxt>n z&=DdBHNv6)S@(88A(TWXEbE|Q3WjMAJINaM+RR9$ftL9n`>J*4hdh+i#ce*)D2;RY z$pF}W*Gejmno%4MuU+{vu3zAGKX+UzUNvX6`652waZB#zA;D49KrOv}BCNL-e?{6W z&~lg3ZKM+hW*Xoa0B0SHD`7(sOMMhM(R0Q){7d60wxd+L&0^a7&gRMmYe7A+M;N;b<7r}7v>b6g$IaI=bvK_Dc&ay^_RkM-vD6mLJVkvO zzJjyZK?OUdXKMXUP90qVd~)%#6@5JHB%gSyZqs`F``15aRN#94 z;%#juqz32|3w06v(Rjc=SUBxlTHpSI5)fZVs<*R-_Se>bhWn|puc(CWOWoT{-5t3N z_AI-Qb6QkQKAb($`Y5i3unt+L(iN=vD}WvGwXk*L{LGn*iC8Q&q+-)62D>oOU`emUxUL{!n;KcVic(PpcQzQ|VF6MC${Wa+wZj zM$Q9?&rV@F()xt#wNpEFpL5673f;Rs$6#Rx&!AP=Q1A~?Ii(@6fTL}npc@rEt}S=q zwUm4GcE@UL5AwilFnpFT5Y{eiC;_VRd>pQ?;>#-cdU?uONCyb|Ox-at=w4k<#<-yX zzB(ft!myoMK~A6&UL6>IsKxK}GzDfpOLA%9BeX9Rj<5Sp<{T$fd0%t5;T@`;a@XQ@5gws>@{We>J|&=#hmnS6 zU`sT8_c-e+HG8sH!-TYqQQ`3W(lp9PTXVT7O%aXimHHW)wgdi6moAMxF(5NS76{Ok z{5mzvZf1_1Rn|<++|>F~F516jl4B;B*97wyWR0);1$nc9;gh=>634SYHUV|IaAiib z=gX^#yA2N8DA?sp^z=M&2SYCK#4az8P1VYm?lHFPW1ki5ognOQ>-ZQtC3A6X0K zhk|WSut8f#OlRlNwZ4XrS#VnF6maUKw@y*>-5)^z&!U_|hNeC2&ED7PTivJ6;O7VT zwb9ZYGc#f(4qBf$MWnL!KjXgEj2wE{6U|Yj=CH68bu~QjUKRczuc_EfZEd0eIZyq1 zE*Q>!qY0p;_1QvhW^XzyEXX>~$avr%S-NS7;c|ee9DjoE3eUU9 z#eRpAzF62va{HhKR}TMF#%b^OJ&de5ti#Rpg5&vh*AaTX-7d3G^^vFH zR{)sW%UXR-6>6t>%TT<{26gG~OHP`l_WOP|UsPkn_yI)ES4-Q;(LI7{#DdhB*hbxgvUUcVTfxwS*CEvF-nLZM^R7#xg zw+PMMJfn@uL2|%Yw;49&Qw~05Ph}+EOtP}DOiD>W^VA&vbl^`Icm2vY3>kmc)T4i` zRqb9xYG>`275}A+vjEh{k$k(NUdvn8=y`ie-%ELpm&B^CtT;5jgxaCT@KNJ9w5S)_r_pYi<+gfKj!whKZ}O zD6k00l2v{pOwEsf$QxdD{uMWc5PFmMPkFgcOf=PM5&4k^eNaJY*0%{+kHo8L{0AxzAXbt*X8={URmtAAoXJ2{#;ldCf?u$Nr`zMsZb z^De9{wv1qCjPCR0Nc>&_HPxy~A+UmvqflTAdn%>rwlq%onpSEi z*h4yS()}cjPIOQ?VCI`a$ETIm`&Vd)h%K|~-n-hFa=E7bb&`nhUgq2s=)Gt}o)@v0_OkRMq z-Zxn{!4p!DLD%ysH3l6g-HXFt$Ql;BQxfc{yhx@yx6?LtC_v)O%9krCzhaCl-OhaA zSp-9(e_b+ujshn>x+>A%YWfx}ci5*-7<##XXyg;1c!~)=C=!GQ%`~O5pZ{6%{eAx^ zp;6b~WQMSQ2s9+l+Ue*1cMnr5c`&D9&=a)JL3-AIgi2iWaVn8fkX@0Y8k8EYsX&cg zC$#4=Y39Y;vT0AtS2n+B%~Ma6jeHHXu8YMD(-a5{#|x{dc|GPIzxw6&b3d4`=vjTC z>$$dsBT7$`)1y6!E93z`d4)c+C3Z;z{%5ZUw#%dO_TdK32qoGQ2h3h(OAc-Qng;&0TTA%nCLLVqz2Q?8Oa+ zRQ{AJWd6qWs+pSt)$zR{>;^?7fGms{vZL*$ux6Ki9f^PP>tm&Up5kC)luHjNw8S%u zv4l-*O5-J|=Z$~X93yS;sjBoU+H+C*V3f6z?zihP-NEoI00SJ6CV!>qz0d0+YQBk!3z!cxOE{HQc3R3sbYnqT~&JLo(x^QjTzdJJy>xpccd^)E4w z4mvP+Yz7{`@gt$IysQz}gI$Sp9U@+xsLVY?B>8fbbF)g5=C*WkMU9KLrbKc_u;a}M zSw_F+t)lWdeOY67L9<(SNh1h;hR&h8xSW+LI(LFmtkd|3kO~sWofdAuuNxx`lnt<> zH%t>W@la}ln9mdim{MVGpY9$det?{5>;CvFp?1U-V^~lvoa*g~c`5p^dfqjAi$BN3 zh5C(A7z>C-5Sig?I~ZndVZnECHY?0XuIFVPPM6cniSk)*Y}%isOiL3IRQ#liiG8rq zqSK2mW6s#b1Su-CD>|uzc2MDzh$9qfSMgnJS+9YT2pDnm_qyPQdLlPP9cY)Qo$Y$t z>;ZMMT`G<>-=4#!-n)-``d|Fc`KJgdq}v6je&3N=4h$Os#gp+uUB|_8plB)Z@1l6@ zY{L0y7U9RvIPMi(_90A3N*obLp?So-up#3sG{9PzjXnICny=Xo45PoZ9U0`kc)RV& z8rgE(*cgag&zBmRWjR|aSuu|NM}!GKSJBWYa+O7YG&ox1gxTb&=SOOWmxpm!wKkhzwMN*5R)AE)XB3qBII0y>A47taO5}lT4U9G z6mTaO05|B{N^)+NaBnb;vF=72@wOoVI{yhre?vZ$)JNP5>ZICiG&CxJBhZRz zYfk4m#|LotTok6ryH`ZJ0XaO#w;1-aj7bu!=#~|U$<*v9jD`!(`)GVhYo8a|-u*JZ z%JK>p<9;KhFABN0;&~PW+-6;Ky z5A`j1eM`YcTo2lQUB}$NA3R0_kQx~q&``$B#ua=u@R5{bEzfPa*s|j*=3=*Cs11nh z9?TA`oU{My;uoZK`P6`4GuDk!+3?Rzzf46T?5$woJ0^pPtt?X51Ej3!vIq=4i{M#z z`*`;`%KOZ$RcG6sL^ga*6ZgXxszK&0?x5hE&^Z9o1wp{t8f-{CI&6=b1 zlmEv}tFTPWkz5k&3Jo0gtiE2`{&R0T&QMx?nVn;XDLSoV0jjLdO65DT2Q~@0q2DB^ ztd95&#qQS}rE+P(hFiZ~r&d3x5I}MVQKS&o_D^#_KkUYCa~==5`R>zidby+U*es5& zU;UF5(lRh%zdu1ie;fFj4JgO)LB7O{o_tb@goCj-SRxdpsNX=GQEHhV0wAf6uvZ*F z;af}KPb_evxNmB=oKEuOH_V7}Di2=*zNFA=hlfb73864ba%uopOY<@#pKg(gL@}`u za|Fjt_eVh;R&Q=QY~83ECYMM`?3Up!w~LFh`xItZvTNeu@o%3yP2!$M3E=o9`}h`4 zsK*gV^FVmg<7n8FvI!n*gX{)%;8nxHFA;V~25_tKqOO9g z6^$g?nc9Po z-Wdjy`FiW|XLVN7WS;nif2Vq8{jz~pt(hxm%$R}lSPF0o9^|wOw*9A09<52ocm0Ce zCeGv;2>;Sdi?DR1?l->mopN1!lg4WssF@$;v7(E{s%Rc9$qZf#Wf4zTd?YDBjE|;^ z6T@aeYw2HZ&vjW*zwKHb_r4x$6$QeH4ZE6Z?H|grTdfyYKKwCpPN3nCyjo_ngFfAB zE?|3w_w8JuyK)YUcapO4%C#1l1n-oV$qdbG)3nZG>U}NyfP`B#MU=|S;n>h;0ItNq z-tgh@>nAE>WKN~7zhJmJ-ohMH+lXPqg8TiQ7H9xb`x*3pX2SSfImuG%jlUX(Zsw@k zZE*N&;IcAU)25Tm9)-B7_M4OwpGNRs>dxq_kTUT{0tEW@QXO44+%6|Z27my3TNmx8 z?Ptnxq4!BHZz|K%_&wZ~OMvTBaTjXfB>Xc6FN!@^hovy>Eg&q_L6nVqO=+dEhx9ka z<0>O6*n17_>gJ7AFYpxDGxjBj2bZ=T#-COte=uwz4jOV5h5Usk*`poBa0xqT3=U%R zS{81yZW|=)7ZX$NP#tEo)5D9j&Q@$R$&voC2G86ApRVAwJPK$V4APbOkiIz`g&$!N zdDM$E6BQAfQQF5v*Agrj&FDr%YVM>d(GXkfIdHEx&n!@X?AvUSLm;fn#ijW368gU4 z#C7??4*JfLgRA0U*4Kk(>M0h+VJ)@TxEc{X zg@z0vf_1`7Dr;b+^eu7QtHyB{e-zN+EVt3;rwrpU$0YDD zPw88*94)vF!B4bE6)nBXikk7O*jIFmil_cd+qG9v?6VxCOm9*3gduQ3k6zAX6f=h- z|Ir>(-K>7wb&76EfG?6iP%Kn(?Cz>@dGf72=t)r>y^9+`8#m5~h)&o>tyNt1*g{La z60~5}8A8v30O=U!G$0}M!A1)gqgW*eRyXetf}0<8r)U#r)0|7-#j&b9#V*v=N z`c-2#&~C)}>aY9wl!uHryG$Je(?vqy(K5+C?K_%CHs?u&R;j=RCKnsNMxTwEKkfju z1NfshxSAz!Gorrl8FpD43DL07i#JMqbycQk?nE{Y3n^n9*TvPNO-gmc`E;T+3UIMg zzITqHhs=PWiF6tNF#RtXE-}5t2gf5+qk&J9h8x#-(HAo8l&-%7*QS*$gs~gQz`bx< zs}iHQJn^~(wZ=c!YQlw+A9|5=Zyzh6M}fzr;HGKJ_G6o#u$~=sBF$6lMcPkf2;|oR zp)_GhR7N!P=gj4y<&otnn7m2Jrh2|D7&mL6r#1Z}erQ*Poi}`4$#VQoebwf03;&RC zsVBBrPL!?TK^sZKB^<}C0)t&n8nMCQDhtZ+cx>SY7FjrZ6r3B#m;!Yq;fEVq6hT&C z|L90kL;enie*0?~|F?7kWUhbB#x46#Y+C+}WA1C$#GfA{ORCn(bX>n`xU>sXugS_~ zM}O+SQDK44R`{7NCHC-fM#YKSW^8}PckS2(6`sJvp6ka|jF8+cXTQ*%J!GFUq~TRn z+cD2|H~S?in=E8Y&7#w^ZRS;`EFF_xVtHwL`?TGaW!|@sm)o%OQIMdMF_Bj)&v0jI zv9Z9DLm_=ljhto@o<*k%;MPUgfwBsdDgyfA5$i=Rp7nG$)we+(-Z|6b_hBT1u4;f2 z5J{8qdf-$s8iDk5D)PM2_AMP~~RV z^cv3FJRlnVRK8mvVS2rT#|p<{W86XZb+u;e@Ac<6cK*kP&y-%t$-P<=zbyVx$C%BP zT9j*n{JHOn?XLJW&%YmatLP^09U=M~)VXMG(oEvDqX>{0H@<3xjfb%yQwq@EDIG4ddF)kMB+iXh5Yc&a=`pB+c+E9*!^|2V3s8r&zKhr0xgR z+Af5|EA3hxAJrgo1#5j^)9~UNWhF?ojqN)`Zm#Sfg)nJa*0dC&P@{pm=3}9$I()cq=Kx(%Hw4Ugpc`da{NVdkwxlufgq8vcHVVfUdwZf)bcb!NHU z{oX<0Q6Tu7d1SzH(6(MX1zyoU3Hr!n{j0K4{mOdBbEt|7y6LUX{`dN;x!QZSk1~1s z+=)U|6ZIMf;n8`jZWct?g5VoP=`X^-B`cOhm(oE|jE9)FdqwZ-WO^%>uWODxeD)+s z0;UIFa>H0_=13}w1L?rk>~nZZS@M=-PF!cpR@Fx5eP7o7%xO zIO7KkWpy^W3pZiTV7lB^#X47cHA2%$;5|7H%Uv4-iN|hQ`_m0&8Dku)7m{lir$6tx zBMFAQ8MuP@{$}E!7iU6c_Cd3|%6rc94x8)9^#|Wh6CQQpXRObL99=k@`hB)HC|W+! zqJ-4+Jw?9C*-KEKtVzm5wE%6-48XN4wKXgO;vsIP3{y^|!2Weor4U zh(SC%z+VTgQh&8ZBxDBM9NV=|V*)#|IpmxrL(H#GHXr5xuA@nN!7SoIMx-pr8R}$r z$vkT9m*COSmQ$}U2NdmU^ZD$zTQA(~o}SYEi}*G8wML)erV`Bt9^7wPV_p+eOh zmIW4#eR}g^?3O6KePP094*#X_^V|ZIA#f7t#_ylrVO`U*9q<*8H?U(x7%(_8wFwC% zZ%k^Hdc*&6%}o^kXEEkS!fX+?9)0I&%J=pnU6?YEH2%cQkI9^5jY*V2!;n9(B%U3< zraOc_pmf7TiRPG8cdYG{4DrhRU*DY>GTfR{<)bLJTHKmDM~+xxe5fN(a){^lihoc+i7v;f#Mr{wr+%)~Xe0Rd z!okE-{KYpM8OxpwUBTF{0g7&qz=Z3tUu*yMaLJmIyZW|w$gbyv5CzH2Ql5`~V0SNR zIllt8fMY_g?am*GPspFFT2l-%CK8_7TeOK6 z_B-uPNbeI#f(#25lV9@tWi!HZI5A&=SrvvPx-^eCVAwBNOi;fuY78BJ{Uo0md2c6* zZ9qGxJ^u2D$EB5}`=4W0L0-g!UjwNC7a=f<_-`_C`g#Pzxaz!cn%u?)Gtq6z9iRI9bdZ7zrDs1+k7;WdZ*H% zQ|F#M4iy75E!q8}KmVO1!G2x03ll_F=*6^3lP)~6#r|4_Y!ormgu+OnF`O6F-s#nA z(;Yl@_%H5umvnd`rU;7=j)%zH#8A-#X=WTL%2B>^Qd+}WvU_Unkz~$+4?^)V;+RQF zq!HcJK9u;I-Qq<*|GduI^D;IBV9HvgZSU0ko&+}8`5DEVO$>mxJc1;Dhd99d#WgAm z0m#%JWrdfU=-2oSNOLaHEi-o%G0+=Mmm6(Tt1@|e6=b+nbuCe^^*9n%p9!ZNUH186 z(hAmb?pOvnW0ehQgc&$xD6IC1roZe!iS6%04BLXz#7|6RHRmS)k3+chGkdS1Hu*+k z?3e5`S}sn-um}zdeNB|cZiMs0Kv=vbaj$DC4R8 zF|YM=!q%0|UiyFGctvWn#xWFN4^Zb0;p8?HV`W**;TQXX9P{j6u7idVLR-_@z}N7% z?M3{HhGVWQIzOUZ?@!wg@;rD_KOH5o-~DHTf2Vot58*udu17dhAI$)4Lo9--?6q_O z8LRHet*bxJ51+*i+1s&^{N05*_uQ<$ec`iJPdVsuKu1qRafodH6t+^6M^ykWCC>Yu zKTcyZnrzUYv3uEqF1_mo09MRID_Dt^oUK3)mA{zd$bzNJBLFamJQ+Chvv4mDOdJt=*^f}~UfN`e!?HiJ`!XHp-A(R0&oDP8I0OjR^VSe!1 zL6CcT&hn)$#E?{#OY6{p7%;h$y5qvw&ojWn9G5SDKR@j!AD5aHYiyv+A^wroK~9D) zT0c76_?3CgVu9V!5gx{+%mntg!J2R~^`EaMZC;!NmNw3D4BYfsCKc~T>Bo|GYizL# zYiNFGMQ%cSKMZLm%ps!)EGuEy^>`1$o)6TwC`oPcOFouF2cEoz?i{PRI^{S$t}9>>i&qM z4Kb7PCHf{p(f!3iVq}rhHG0X5vJ>*qyn!j6MQyw3lsCMXZ<_EgIvY=&gwjfPK#_1f zk+dd4KII&W(tT^(ordW=@qk9@j}HGvBW1ql+r47E{L_0ZPB>7Mc)B3GJs&j`Pl|GIU{D)yeQ-HUH zc*o567fMO&4T5`nPWke$qhYZ3ue;-E9rXt#Kq6YHFG-+^qQ*rv^sVCJxW-05 zKcz_OPJ<@VFEDzlO1zz2B9?sZ3oKKf8%mSz_qSBuaPY#d+x7O&>~4giflXPflIKy% zblO!=UmSsDRJ}SYa-n%?->R`0!CBiq*oFSo(Dj#yehK+=>IfXFxq@r3<*Fq#%EA!x^rLyp!P z9GDq)^YdE2)j7BL-|d1m3qZyPZI&>GYR4gyA7dqBeSM{t3%wPhN1#XcyheLb#7?ni zvH^kXwF3C3dW$%!@dQp^(9DWCPp#6x9cnX~toP{|eh_E>RMr^#lHN+n42%jh#7AyQ zHaCn);=hD&3=1!Qeu=7G=k!Vwf+<$Nu*77ssM{WO=i2J8pnG<50h8cPD)B{T5I-^L zd63OTS#@;EeTW^dex!7W&fowxkOUtW-OgSYM7;W<`{t{N#CL8kI_Pt@(FuS0=Bjzo+C3|xbF>7Dt|;04AhM7 z;YW>)`@TY!h~?SCY2?M-oS?mYV_J+?2a>-v0=|`%eBMA5TJhli*4Z9@UHBaEV%BD- z0OE>cLlss;@dGL0$toNFNQ+@fF<>iu)p12BaiO;yy&ZvS4}n_4he~7GaYc$g(WAhz z1ao56vlJtLRCZLaM-_GSRv^2YbmCB{!vEU@M(u9*J&W#EWP*; zi1z()E-QJ;)oW{yOuq26ei48jrJmKGa%QS#NDbkq zcxcH>0`${zUAw2gRq14VurtS-pw~&hv`DnwP#?|Bu94}>tSmUAFs-@PGTl!)s;LA` zgT4Uycltvv^R&X{^u!=o+~3pJ-r(U>cm1hnf^`W1WL9D7TPxZ`)TXA_=`K-5{2t3K z`an)wDYrsFP7pp$8D_49Qm`~+l!T(SwpAhvPJkolqv;ErnW6U22$To)GELC99$2C zt@p*f$2G~v=`-=AlB6y1LXb+e62)w2oQGd`#E4oVmU@eONTNJCa=~Urgy8M0owAnQ zsUMh84Kh4imh@kJ3cgQMLta3vXz29gvQ&<$!W6-k8$||0(Vf-oX!f%ufPAhogg^T^ z4nNSenS30n?_emiG7;db8mI|IA}{$n@o&ja&4UJ~rG4yur!UaT{fTXiLq_mfg1nKP zw1|?V7>dndSJ*{E8t~*2u5vd1W)JMpK1!%i6&CDvcuu0?xhyUbG;|{PjYqTeC@`O= z&jx~&M{A8m(YenU&Ib7d&zXlkKNP11x#pU!Y`J&R`sDE<4Kh@GQ$wb(kycF5Q_Ob< zo%|^J&_I7KX(IFKS4Q-AZ3a+fRUcu9QRH_9U0nR3D?727DLnC=L^6EUD4M93I9>Vx z;Rta&y@0&bFZ&C-0!#H>uQ=y`#jG2&fBRRj*nz=;FP;(FpC$HuoN$|Gc0eoive1T? znLb(a5yA|#Zl7SWz@*vgbNvt)50upj{r7Aovmi{cZYmH3SFp36qfMk?n`s_OuVlsD zDM`SLURnXLzcL7IL}31e0Vb7Ld(#@~jnyzp`@2AuTpjIxOD@pTbd&;?AYMTr;mk?@ z`W4+X*>Hz_IsK=mU}y26DovdRvSU281-miK^;}#{vhlHPEqgY|95qC%NYjpg;v&%p znZDTmDVqR)w1!Ptp^g%xV5-L?9R}5!EAmJyR{G!8)Px(`#+3TnDmS6@dh}j>;M(d- zbDP6*#&<)Ud^Da4yseuX0mU6ApYIM9)(?a&h1U?ATCOMKZHtog-fMN8uD+#uKU7y` zHPfC+8$;Ree`?-P6@(vtc?%9}BDh9u`r!sU->RB8Uxe@P5qS}G$knc|iwHHFX*di6 zxp3Q;cTl;qWaur~uO)=w>>iO47ZPr6m2abom<~kK!W|?^sPv3=ke!6+Q8l*Tcu?UT z!Wl@WHWHEa`!GJ!xvmYi0x_nmLgLWTI}@a(`be^NLqtOPA2f1JhzFuPSCH6^gvu78 ziS!yWjLnBcc`eUj{f|-_SuvHG2cu~*VWw(ftPl?NzRtGtBT4(pF26KyfAtY1J^^1S zY5ecHri1Ci(=2sC8v~ z*7X}(Pth-y^3)a;d6d!69f`IseIqwPC3v9z8@SLFx#{U?asLzNJqHnfaG`fCHX=q} z<;Vn*IWZH-mrVE_At`=a{|9D390Y5Uh9)B6V2iHXk)GSU{v@8m5@WUGc5VLXe?9QE3w zIH{T8B?(W5TS>bxADq7wXek#k|ZWcs3evN zJ++@c&eSsCp%PM~k}p~0l=;7;IlQmFN!Rwv5m&J=cgMBPIy;?vBdVj(mhW!D-Q%D9 zHE(bzk4ecOiOAALmHNYBMRBO19X(PnYS&)MZdPS6D3RtMg%_o%hD zb&Dm%r@TEWa0CEh5(O+bh|C<@@^HAgr5qe-uf9EGJMw8}!7*z=!mdHBAzXWy@F@}! z=ovzNkdYYC_^RKzJP8SWuz+Gdqmn79?Vf+TN1Ie&D|`4+0S-nBr>gC$D=xBFBYd~0 z`~9$6Q`#s=*|mX-G>A?2A38PtF&cVpfA`eA1dSUjv{~ho|I$8fzC79ns-vqTRE%45 ztG)1;MpV|s|IHjbQHj!Hp!gD#Z_Xt~6B!p+n+A?VLB8XNEu)+eAzLfz zeJZvBddD(92R^GihIH8pU%P&AC#}-y%mTv8mp;p|iK4trJ_#>ryj^zL17m>hL_kQp z)@e7xo1Ey$F9#R)Zx6D)(d&gjxv-+uLZy`Mv+hLGR58n}9&Y)v;#K8|t1HkVN_@^w zt}y-_-H#Iu?MilGpv;z(Zs4_$Aht15zkNk|zae;IA{Y$A3XN>>`aYK3JvJa6)aeIE zjO{AKl}=6mTlzS=+h|Ts?>EdqSvo5M=Ma`Uc&k9(aEZR*8C|hOw&WhW4L`2Fx{?8Y zo{qI-daCB18N1bAu1-j*w2D7TiQC7`Cf1eA-jCNO9w=G$USyT}E5i^L8$oME>w7g; z-@C;D8)6CRot03h7p}R)EFp8`AsIN8rUz5;peKMgR(5D-H;))mNxcXwiDje_agZAR zDcb&H*wUqX(AlgzkLk9>zIUQ4}6}^m(%HG^n~X=Pb!1+ zd2HnlXyDa1w*x~yi7oKkEL$>#R1=y4uQkf5 zeVTT-Vp+(Vg~&loHqD&SgPbs&Y3ko%uv_uvORZIZnXIhEgC%Rf-euo+)R;|&BYrrP z4rN8juG@t{xF`bwI6s0&*oa{wOFQFx3}(sRrlh+TP)<^9^wKv#@USRUR>wdgT!OWn zHI7ANrQnP|$+h}LPy&YR>hos)_-k*nI*k`ZNw+OaDDN|yPGTExogl1K;F6sTHC<49 zu`RnYcA@!Du}4pH>Y+Hv%U%A57BvD3-<)4Yp7!W}F`+62i3KubeF(zxLJ6jcojdWy zfBrIw_Q0@6HF-49=%b+{Nv7X*2FthvZDB0??bqkx8Wh})DV0^ReO>Jeq!@W-F+Ks0 ziP&5Ek%#CtAd;I(iynDlNCB z@2SnX;y(SR9xSmE67o3f-_;^@(^LqY&&(dR`m@beIPIj?*=B^yJihOVpj5rF*gO+s$xe-bi$+>%h|9e!tAku41 z(F1(Ue(N0I_9w;S#_-_iud$u}~^u4%^3oXLPy61$_KvsUt| zUInsS6(y1@GsNXAgEv3V_fUdsg;3AOKtS^0!rc58Zviy`rH{hLh5xg`*hO_*ACJGD z3$2PH>!B&P-K4LXelg(5vUeD)U2$=O`sR+6k zdP%82Wlbx_|GV(7uK)O8!4jnq7$rx6 zJ_?y#NthPnp4SL|U@ip0TTv+E7~&iCQ7P#zvIYGGKq?W)@Pvd>2#!ACYz2OR!;|7! zPEZU%u^*;Zs-h03E%2I?WOs08{dg1rUggNQ|C9jA zV-_d*#OkxYdC?_>Y%`2;^2wH{$V^0N)qGDP+`sY1PFjOn2LX8>qTQS2^kK@HTbjCg zTN2+2dXdf5724<=T`mZcMi&=gyXSf#ZI5^Q3o)h-?!b9OUecv{H?l9gD-BS5-IPW+r=S>QWQt=Kg-~_pdOpl-)BILzNo%n1MeBS& zBUvrl^8ae>oWJX8-Zp;D$%)OTaT=?!?WD17Cyi~}wi+~P*w|KM+qTVbp7(Ef*ZzIh z-fOR!x$n8I>oa&N{^j=(LPNL$3)g^M);!@Q!pZW9$+m}Q!S{T#4)>W3mdzaJ6@v$z zI)zkqe#xV!(%CNP%BQX)G8o8pWJ~)t(WY49$r&j2 z_#~Mb!Ib(DSmUTR-+{Z=n0SPYGL9{^>)@^ zSBhZ9^VwwE^N+ha359{-1N=xU%?794*hD7oQhA@fRw)fSe0F4d?c}L44KeHQQ89G+ z$MBgkuR)=%ZOLps-qlUOqVF-E>4>o7^{!ZMn)dmZXA|N`qjc|Ntbn4u54A5xnyIl)4Y`h#|-e`Kl zhj&Ho)U1}Wz|$&o#ti>mvU6E%?!eK&LiMit69s`41k+geUiNTtg6I|jdc)523~|p+=tckpcTeVaQOsb4s8@zw;tKp) zLDrP)Z+c7zZ^!Xn@L*RAypqkqPMmr&8r`I#)Sw0O@R&Ys-QS$)eJTx#N43A>QD)1* zG%lR>s1R8onTv>=VSl^S7_%C-rwDg-0|t*qZ37lb3%EoJ_=5Zd3ik7(zgph}*Uug4 zVv!rYP+o)L#|RmWo1r1Y-!8Ti7WvSUq(<}tdr&1!3BH1{NWq2nSMCmQy3vDvBqTM#KI5mGNw$nZL{5>y7e*l^PM*@KZI9 z@OFF1U3>ls2jNLBkeVhUBz%-wdah$HF3t{o{0fT@N;QD6!Apq1b>TVJtJ!+lFe7gr z&ep*#e|EG4WkCL~*IarpLa9jaV=O5$P|_c!0Nh^5U2`Qz;69E>!z~%+2%ANtQC){{ zCI$<^Lj?lqCgfuOzAKSq@f;_rW*{bd4aS~Y{3;V(w|$Rz`GD995W_*LZ?gBV9Vocl zWM3h(Dw$Uwz>xgt@!INm6OPt53>j4C`s3RcDG&=~|85QXc4j08#lLcp3%ruDv`QOi zfa{l|jDl`v9Y29=Y^(Bi$Nn-L+}%~t;MioubKTQ?CQWDBM@*&Z(HmQ%_)R!(wb&&~ zNdln7okA4!)*HC>rp}iZzMr+z4G>!5kNyUpP-+yN z6rxiP_vQIJ@t|IJ&z)m0pv^L$?z#sNtby!Nh8zW8gW)sj-h#Ri#)z#Jdx-DuFz-ZM z9jho4Q&u9+i)GrkIA&y=e?M=3`iwVMB>TV5ZwX(pVqDWn1-^fgi+t0kBKe0Xm}Yc_ zGBSB{&QQ=BTJ`uG2+h;z5l3gmKbqR>|2AhnS&66Y!0Z(ANLO%tb{xdqLa*~C&i`t` z3TJET(`9L{eM3;EPdUYgKzbsfXU7yi%Fs)z4&{#y3%pcFp=nMEG2t+IB(Tou=4E~k zeZF{4Xl|4H3WefcUK;u?a8}uCq*~M4p4fBRH!ipQJqU(ovaogGu9u=9q$Bst zV)0ME;6D!E)ShrAa@U55N`{1Ya&1qmk(wqno&I7WHL#E1$@7Hi`y-qSj6X@@haL@B<0<^y@feYbq3<=X|TCZWb3Ak2B}A!@S0C8il4@8N1x#j8R@Q<68MS%l8i2aLw#XrSx> zx6x&0$Ri|J(g$thHd&`xzdzqZ8dG;H;=Af8rKHSn{S#8gwuK2BGAyMo{^V*^*|G@1GGvw{A$rgK)%$*Y0YO2weB<3E%vA#Uu) z?HrrgYWx1#$pPy+h&;x$q5L7?fD-XJ{9m5m=cWNL@1U&BD-M|TNs9@=nH5BagPmd`hd zfI``8+qLKv6h-@zh>syuTM@ABVd_MVp$tWkpwXdMrg5iFt zQG;JjI(Vuy4%m{|qH^xNQ-KrNYKME-4%_9MYZ~_t zP`u6V!Z4fcB9*@QH*c&j7ESSrQ33*)@rigIYHW7_O`iYsegS>)l+He%XyoKl1dqAe=oyLqwqY12lKAW|^u=rUyyiMdS zt)do=6i-}TLZ`&GWhoq?+d^y>yYKB7?i{8BNC>$fhgDipX$1VKUy=p4b%vkX1eSV{ znpHZyDb3~H`iu|-`r~Ny4dgAHD`?5VVx?tBw z)wzYS^Lz9il%b-|Vlft`nfp|h$x3`Ex$U{^b85HcUDfV{BVb5hq*4__7fGk!GDcKQ zL^OGcWJ9;ZhS z|LAVg6beG7)ItbH8+r6Z*b>G4I@xwS9KRkIJY%!*(xf%}Y9=FhZ_39Ve;bLEh|i`H zX^yh&Eb+uKPVV;Ot@UoK@^hU+2kqD^UWhVJn4E^1IzfI9qd$|MX}Q%vp*T1h$PiC)&n$)0$dihkG z;%qBzh_m?(T~o_A`>~OFOL9&O{)*=y24u^8**J7YsfeCl0_E zvQ#*He)HFWk*Us1#}Q=SCo@9dMhW-&$hd4#4rlk1+L0V)m@FKWIIQnxqBIU{`{j*I zn1s&IXzrFU3Vr4vVI!V&ahas0FEzHExGIYpNge$2ALB8}K{DV1o|9~Bk#Ef}p|Uv8qAsDAb!PzG!>uXi`!&n0xQDqLD& z1DkC~BT^_En({TE^Qy$p6gTmm`)Gxr{M`e(+_EsYw6@j!i995I@iB;cwy4`RjZ3BQ zY&irW&*b+BNW zGnvHh83Vi8gazv2wylT3yJ|NqWJ$BOvl)C6e?t!Mm%wcPeF#LPyv+FHyg}~g^4jLJ z0l*ziwL7h^JUC=;K|^zo9;r{;U#O#{%k<#$^#nQ)|2Y_SOqDX+^Zb$-`ynLz=-O_qvO`CY(Q_I#j&dL>j+|{v$DjN)&fOG6 zeGw&%z!m}~4{$cQAvb1or-BwOAsqTxVK=YN0qw~Vni={$O3QtA(rBjRo%Ju5lkHb} zuRF_uU${6@0g@`D0Fj*D^uNTt$Z*@GYz%C;f1(YMN%r;Ckk3o;+)n#Ld`JXS#Yx|M z5J)3N=^a0dPBJjd=V>ti%!>#|B1Z?Q-VzNxj$vn4emwctv)vZ_-@naFg{F;skaUm| zto%>ajRO;1h(Y^3XN%zqRB4?_=?oE+NJhmMObLXXBV`KC!R$=t*U6&3R%sIagBLVoKWbC2pqVIcDG&A36(Nvw9%HXNaCJTWf;~7i<|3y-#SU=ID$GY&prs*(&`<}~!dw&@g26RR zdE!1f=@t*kteB8!+{M(Ae5NF|{ig4-@KcAu-Xotg9g75vW+*>r#o{ZpVQ+FxfpFYW|A}j=Wzc0u;yxQu= z6b+HfgQvuSUB7|>IDjCFimQ~NLBAe5NR9x$E2Fl_=wBh0{nqN|=E4dmr|CY&lF~ch zVuOY8p#I(Rd!YS@lStV~yPYFT<26HTEckNjg5nvz66rXb{N-_vVPmS36VxyHm-?V*nL(|>O~n4-f219xT((GV4?L3?1$DU zbi&qU5|EFEsczr6y@FwEm$Jq#Mk(&9roq5#^-6ylz|&N;=L>@xHhm9BCtQ=Mp@dH# zA*xmp7XdYOy43)Wz01*AVEa0fF`HVmC#N`+pIAxk%vDx*!Yn>9~4L7mpcy% zo6H-mPQo=^o}w9j^-XS*bq&lTtF(-Cn87EiITE8}XR0qZ2*4QhNS`!Reoa@9QbjL& z{Sg>cFdVkd*9BG0uCboUL^GVk7bC;u`QL{U<@vNJUkiriTS|_jbPf%p8G>M?6u6e= zIPs;rj%2a1q4GEZ^`%{jf^_+{M1+WOBNKV5627nO zy_`|xz4O5tYbB6U^abXp;XM3Hw6k_0jGTD!KlkGW^*;@dSM~?O#UpKPa|h<%{G^vPNvqcxL-rOW2upylPqg6``$mviSF;_N^% z(bT4SV^Ry^`#wc7DZxuN-`%now^Sc=WJWKMztY6%6^9CKQ2p5C`4m&SKGR*dChi!{ zvIbM;IR97giXsAKz{}8QmWiFUzjS%3x9+VmmpB(GK%)3)-X09&*&2p+u)gXrRXy-J-_|EAqn7D zcNW)WlS-&xU95a(W($yn4PCz%bkgcW#{v}=e%<> zFS(7-q0w;sk}#BifnS#!PeR=B9k*ou!t$ZChnFgo5%SP)7C!o&ULP zg(@}60K1-Ay;HL4Ppb!?{owrBQ!y(|s=e$c)1o5$B~>0HV}<(4cdH8pjNhXsC>)kB zi~mY`a;TfYOzyfEFA9(PdORp+XBVE?)~DRTM-;1&6=UnT-Vo!>r`L{gd>m9(&+Zv#s_N#1Wxs;=K3O6bUxtRBjl$su0&{y978`81lH%$v^ywj#Nm zUA(cxz+JfczbG*^#jLUktXfS#s~t=aXMUsbn6-ln%*jS zJ+l~=ekKM?2yEBTvnNNFmK5**h;(~cuDV!NvoC;f>qKu}$7w*&l1X0_=(8?F2|-1b zEi&v2$o4iAqvtumZ(#N!fVz*`dExgxm$Thji_T>PA|mrr!>Qm$;5(T$e7eefdYWM( z`{<0_aMP>w2UvuZeHkTD&t(LQb3nuUwOWw5f?j{a`g)|k;J&L5eKfx zBej|F(F=VRF4eof!ir6m<7$reF^#lB_$N8b3+9*uI^<$yV|n_z1Ra?-bk>h$0$C!3YSpQaV*N&&@#4GLQ85;SX6#;vir2#JSA<92&_o2~t z$V!c00D}+ zE>xuUfpgnCD)EhgI*!i>cEv%-pAg{gS~X#Ogy45g$doEUp!%=MO7)a{qQJ{LvR{kT zoHOnUk^IM^HvC4=T%rf8OCa?ZDW-Ci9~Omt$B$+fpdfO)*K57Zx99tt%3S+}_j9@B zU)rT>h&|-9o`l6+D0&Qw4sLlD;=T_wl7#$-V{cW-WpF%76xPA@(!96c3D@_?VrG9u z6cavFhn+jdsZ5-J*(H{b`4y?r>@(Umc9D1>v3L0H$MAQ-?=3UlZk+=wF^d)Nb_?w1 zlcdd@&Yxl=Cx^V4L&!wH^n^moyYT{T3l%l>xD&)}@i^cDMrdGJ)P(M}a?r?e{9%0i z>;7IJ?@B|kX|A7P_Htz`I;RDQ)j1Sx=(#fYNUYCh=XxuDzroyhb@pEMFvJ#Y-D``i zDn(e{QczgbUvI~jLoCxPO+I`q(Yd(RqVpS^PR_V$qjXhDE=$oGRCi&lbrq}lWGX}b z>u*UX0y33jd`SEo6SlM;goLQw*bjN)Y%(7@e>Dm&Vq!>pJy7sR&JpXzII?IJRY||a z3(FU^cxKt4-2pY9GibtS?T?d^*+!v2b7*WT79@&7HFg170X1Iv(!~c(y0&g3v*wz0nT>7okyZq>yfJs&jJDsdanM2yE(r>3 zTJs;6uiA#L0#%LRQP^kFQYQ&i1u#_PX#q396KicVve?|1GQsiKc3X7QxIC_~MBi!p zfzi%f%K#Kc#V}MsOOdg!-_V_sojv4qD?$;ujC#~A7td(#pR?Dp6)LnDP&#+@x`;P( z{h!vL3UqOjHK-~ympzzQh8P4hb916Ah~39*BC$dG;dV-g7WhM!cA}JlV{ix&qWlAH zP(uB-0*W6)T^qCSNXtSmcmA&ZM180Z?gzAd&b99ulaTMAU5Q= z+DMsSYEjmw413$QM@Sg^ctBb5ii;P=>}wBp(-QKMv%L^N8_NcUHwY6gwg-pwcN-Bt zR1N7#~&ML<^{c#yXY152-_gID}*0p5^Sz<<-)s#L?{QzdcK>A$Cuo* zd*A=mMz8`9ogfS0CS$h{1pD&ozO^6*30bp#A3Ev|vftr5z9s2-Gpa}9)x@SGT)eB0 zLtuW2ZEKl2kGxAR_vJ&aCzq>{a8$6K5{p>%@z~5*T^G8c-l)Q6BYYeZhmg()k6#^kLV>5^iVRh*82k>9O#U&EcW~ae3%r^oTu8A zL<{O5z>IwS5&0KPpYgS{?*bXExG|@(fv@chY#lG1SQr_&J*dTSefe0Ig0IKGu)Ju- zuBb@i*MzjRbL|S6rUV8=PJD<4o)6o?7pdoER;JmX+D71 zcdGZNX2##*pG8A?j4p=v*XMNA&w~8DvpjTVc4!wA_T)Q{P0I{L`6n#Nr`nIRKBp=a z$S7PdpnEgC_g0>Oggn-W)YZFTEKGRz{g7LsxsGILPq+3GA~i@Bs$f6#Q6G?0nyRKhxoj*u*N84L_8?X z=I2<#pLC*o-rh3Ngl+3{8plWHF_9uYe0i;s@tJ@$K;Z!GWm>q@HgyR;Z*|;RgwfaM ztb_D)fn}?Y=k=Z%@233ggK{y?X*21sXEEtGeRsgzlBma?1o6`%JHS@t*U;Bk~96yoQh6#T91b(_uD(hz^ z5BBnZPLO#Qate*DL`l)Qm6N071S&Avy@s6BnNE<>(*8vG`0Xdb?$4F2u`#_$(sSM= zIH9p`uM_89$pZTYAobr@j|8?KH#BR>%Q`S-`#UEFHHbXM>U~8AFGoqa$tPSpIS2om zB5&!q72+~hZtFei!#;5gN#R#-Y4r&EN!zL|93>VKJ}V_g1__eyIIlI(5WvU-tcBo< z9+oX!$1OWr>BfXy687HV2~^q#{!JO?;GXQBs zOR#+OFZLVVSK*XS)NyM=Lcb9i$iqv=-@WebT)jvNhay;?Pr_|7(Tap4#2ZaPlpXI4rS+?!_tDiD}H^o!3y@D-sYcEY#*cZW6KlUj{) z?$Z01-lq4w^q=o4&>(KtY{5b#kgEMaXfV~VX))+e4N$QotmZof1s%iiKQ~z6No0Cf zLiU?-wHqc(FPNleQ3!u!BGMAW%XZysBU)j%A?!*S3!ii49}mhtg57qZ!VZy2_Dql6QJn&UAs7S%y1M5_%^~(Rl*zdL z-+4<#PD%R;iB+dVRIJCJ;Q200ckS2(JRza}B3m03ZtjN$T9&RZ=u)O4A*hY(u4CUb z>GB(}=N&d>t}pEos?S~Ivd*TKJ&ry7z{cEmNON^~N5i7Y_Gbchi=U`Z4dOvI1{U?> zNy+{dGBvSGL&oj2mQX^6kF3kLLa_F)Q&x?73iiAFM)qDuisqpH5cHbImqhqLth5ej zbV))!dmC5(hb+0+&S0vuSk%v%@?wl2U~!aL;lSv^y?$X0r&)$uazsIVz7iLA@~Umb zR~}`~mG=__hq#p1|H7to1w}?|VM+GKucRYk{|edR1CY7adKt^^<^#dd(M{Cb%BSU4 zOZ(WHGAyu>U#w^$x1gG>D}tg#F#GbWabPLSmQUN#(g8PfMAjXWGk3tUd+u_x_9#eO zKsZY(YsMnUw8LUd2;SSvoE(`_H z$Qyr6q&cbw9-fp6N)AhF$>cU_JfVO@aVRzs6s-TM6l|k!n0x8P{5Y?WOrO_kU+B-> z8lc!1{cJ9OE|*@`V>>=G_@ml+y|Y&K>-xCHI@R6s#S{LK|Fo@$e4ItStR3!UYOzLz zSkjRb!O}+r*eC#5v`Z?17xQ2Gd4AF4>8G6Ub_QHz$a)coiC}%nHVis^ z41cuNc*Kg+_upMg>od@)A7^!1)F87V`ZE4q9|AQkc>lT=o7NwS z2&gy=(bZTJ2Wee`&(w9NcSFnVs=+->t+e9giK z72`LkE(=Eq1(~-rUUnvG9;D!2Jl*;ob7rJ#QOGUx`xcQ?&rF5d0)a_4k5z%-@J~=a z8@3pDf#E`u3dVdxTq=#%1Vw^~$Ul)N=d%BYk2gf`*{Tmz+&UOpW8(92hPP;~V^aS7 z7SVV3)JK*0bY?(b^S3a47w?f$-H(^pPE9%l#M*pHRqq2R%1c!~8+}M(?uWef+8^?* zIY5vF_?r+a4(&|XRT7MI=#MA7j4ff@(MuHIqEE%tpDUt(1QY6jGu^8>Cr0JAse47o zC0bT%jSXp4Nx1#FV*caA&zHjv_7mi~gz|#)M&p4pVc8DOm+XPwyGHcr6ub76eQb%Q z{YO8`d}tCpVg3jH++rU=UwUfo@v75_LwVNS`Rro7wXtG}UmzNKN#G|x+RH0tdF6Iy zlx@i#6xwYfm>X(W+EoC+Bv-6v!}qmFF#m8Z(;9tNR9-vJLcdgehUkaH2Zz+ta}Rv9 zaTh4f?6d6lc5dD^*Om+3ht(JUgH=bpXZm1s<8UgxXoF=rq4a4( z%8dKlpCF|!|G%uA^WUJ7^i664T+U!%t@D*LS@`9ON^(CGN7I4;=IS6&YhbKx`MS@` zTxS=(9RmNF70i$)Oeb>nx=ep(`qy9yX`aHg>su@VWFdu?jYmI;bZz5m+DqlUAxT^C z0NP^QFGf4}AedWPxe@VTNLvy81rE|QLYY?&^o>}g2;YnpTe3=fw4ReA^J?Nw0#ka^ z6bMZ|jQClxW-NHs@$IugU%K%V2FkaH=X(gYsY7_FcT_Srr@mUrI-#=#5-&UIQ2JjGaB|qzp?@38=R<=MDm2*4^A+ ztHPyV$JQ9F&*AtnyZS1Tv;hG{?`$7#nN;31az_^5t&Nu9K<>R@Mg&&!;6}_ayq-jZ zWi3`gH5x^}=64D0^uK^vr6NpZYHP(k~7F&u!!|St95}R}H%4bzkNIC$A)AcaG%;R<>=pv^>tFJBH-MfVjdaA_Nrhb?E+#XyiF__H6AycqI*x`X*8C;+h#I1IWRlrksXC|+MT>3ff)wR| z)LQ1o+N9$Wo*)lYu-FX=obt_%B3#H~5Y!l_3x%wh z4H>BNHQ@)XbbMO+--Vr9jDQ6G3HTcPM<7;>Z`Ds>7v7lHqLQA^#0HtU=#u>-weBxm z`Aj(cKH|(+215x+7WwdQhdmKlIfP>mmO?R1*b&BrzssUj&QNMpAU{p9`(!n-2XnS3 z4VE}w%|ZVwmQHCuGrmsC_et**rn8%#EeMDSo@f7*q|yV6s^pz(hhv(RBDDi&-7CABhX(Xs1RCI^6xideHQgzC{SEvs12X ze&mR*B@v!fG2TKCl6)uCt|5_QLlPQmmD!4>IGsy!6c{N*Et`5xLeLb4$_!#H*GSDS z&Z@w++t6{@y*GrRvKp7$h{ z>Jk_=0?~DGD3le`ngcEK00R+Dy*f1bbB)&qqxM65UY*DP-fRnX4I@EDe6?Sh!xBGK z9jth99NHkB2)xrf?N_!JaR2#@dGmmFKGV|2;s!Yc^Xz!#2k{-N#e37(1{O%am>NeK zDILGLBgbc2DD97-tT@k4X5H2GWc+gN!NS8(JAhZR{mw&}3D{ftTQ)bb+B}-Ms6XuH z9tzE|k%19n7|x5g z`dX{!G?f@q2Lcm`nM+8^dJ%*SfdkFKK*co)p@NulvdMs&4(&0y%nj$~j>YEVJ3~gC zFml!zx0jVaG4rf;@J;+;Xn)UEa=I1}%FGMKH?iA3Y~MY7sAjxL+KH_g{N87;YF!yZ z@iu;QKpm0GALQ4A2TCZ_2#i@j(s-hZXQH39;6ad&)(AdZd6tMIX0Cj1MUJ*!j(fWF zFcw=Yp5X+$IZ7_~vY+GTrDjiPtTR{m*>Aa!$sT<17ZBE|r>Mb|CrO<6K`g$^C0LxIN zxD0mq5rdt?UNmMI8}6u&H%4#t(muLsdBe^;iSW-Fss2G}0+`Oa{qxvy(qz6=&InqC&+wwd~duCQCSLUW&c#<)4fi z_gs&|09ScG!=n)!<=4%I zrT6~)pi|j@v>JI+akqZ$!pRo{ayH{HuN?1dcXNFF!lH;JbA+#W1&RM#DMHAuu>sic+I@8uUp^$PNF z(*(U<#NYU+o-QIxxQcGFk4_R~y6leh-x$;RMcx!+cFG$?qo6qE9pGx&=+o_ZDm=wj z= zdFE*at?B$DzbMr1FXUisVbf8&93fhgpguN|2zjYQhtCFbP0@kw+zC|R%vR?%ihfcyp5AP ztM&IaTvfKN*hn(em8{mN`iZO&w`HdC6hCEA4W;vfz>6oFCSHU$T_Gp{zay-jsljN* z@^HQCtMQ(U?r%ER8Bw`!69cCQXI-MH6bXK%jFuzv`=rH~E9*dDQTC-1#?mhI`%rXQ8Im0aBg!?|HH zs5ASZ-huHQgfS?*%rs5{>f|X*sm#RE|1bsLrMKaf)(O;M{WVU)fmIN~Q7_Soii-LiKvRydKub0Q9a_vJh8?T9jx@R8? z6k>)xCH3_R?B(Hs`=<}9lUTK7ZUs!R7Kr7p9}jAJm%Zn;xrWfithB1NA<2Kv?;Nvl z0;cmcLB@#0l_%wnlF7ENQUZD32a8xb1NU9ESvqG5pYHY~)GehQpN+i%M>IYaS+NGN z&>fC)drqkzvWKl&laKrZuN&}>U+HNj%-k7yFJTXx{0jHK&@I`Bf0O%jg9=sm zBzkk=;v`6v@xklRo?SW9LDsvc)_1D*y$f+>Cn2n0ZILkc>iN%)PTMeu5c@|dF1BI z5;h7{$?=-R?mQOT$d9wtsMGS?w}SjAHy~=k>N^?^-&p}^M=Uq}_1l`3lh)eo#V(e2 z%Yh9=>IVtSvhZSOV~vY9ad}EL*vY&5z6P9-K}bxoqPKCinofQMcB zAvACw`aNSq_@)(c3^~;p3e&9el#u}Xb5sJ?={qg_*KsZiJW4*UB;3;T{0Qd2$)e5` z-qTs|>o-#4f4HTuwR044;O`3w6ny$P?i97pmV0?jUdr?Go2eZ_dx0VQzefptwfEIX zcO=vVi^FlOfQ6+j-y^a5{mt3#aXiLbKlV?!#oO{<7VR%-z?Gz4u>1BQ^^oc|>MJ9U z;5g_3kCety3O+s63_35$(kIM5rg_-3k)<16{)KL@_iiKO!_d*ojotYy_6MH!jI-9! z4*OyutxG+da1HoP2hQY-gI~jR?GU(x@Gg9BUClL0>tmDMGI5V+0{VygD)-u7Xhl-| z0)_!b=ASbWza9xD%tW7N8=M~&<}Oh9eJ zBbd^GrR&7|aili+JX2TyEi-m95C3(jVOQ2a1hANI*7bRI7BYZ_(q)b?CCOSPwz!~wmk6{Ht%uq7+$Xnt5J;|IMaK&%HKizX({qpcH^Y7h!&B^C7a ze|;R!Rr7tWn8-y~^J8ObhcI}gUP^?dS2>#b93G$r*FrhjMjboag$mD@pqlY*S>(nl zGuI}1`U!pY9OW`JdkNpORS&b4@Xu3jFU^y*ia|J|d2GX`z)#qwt(wl&BzogFGM@o0 zQQ*hd+!quejAssGieHztsVj*MOn!;IP;4+ji~IrLL$7A1fvf;^$3wqaWqjj#Z`w$R z_!Wz;KlnITVQLObB}7^sK2PTdQ#^7yd-X#u--i^Q-&>b4bCWMVN;XjcRh(&~>pSq5 zDu_BAYe5KpGn9#?b0Wcvwe2mifR%r9VJ>0l_tiaa0eQT&CnqeDI$;-STFSVZp*$gWu@54DJBT>7;;T1vv1T zorvv4mfCcu(C71w^L2b^ftJb4{i1whTj*b4?PpQsBr9S==hr}MN`j#Kc7K8Nu}e6Q z=ae0B>iuBk1@L_I8nxqs5cov$FiXCl9Oo9zq>$TZnV*@PYld*YO$ZT z2hCW)lCpL-i$&5@z!0ZgC9?UtAF|B05$SmIt-t4%G!l-M>^<>LlrJN1H|AY6LM30X`1!^aK>|0h`GAOub_w~9o=onM8+)z!t@P$M z!ct!^2_e=I$M}a=I{AD&nM4*{2e$l7PB}&`0&}a2Ns7YBy2gd!0~p#cH!gZh=BhR= z^spEb({zT6bt=pstIMm%>>%r|T6oFkLToxwH5wmNS5%)*Clh=W3EM5D> zki=$4WEyW%TH6;M{zOsuKn^6%z%h6vBdVyYUPw7KJJiWxY%oBE6wYVr)j-~WP{a&+ z^CSNxn7*@qD_;rqu%F95``yRtKDK|G3a)h&l>KY=Ckt~waH<1Otl<82?p_a`soQ}I zL;#G@yNB0dXK2jPXi#zY(+I+|33CWDMYZ&U`tkVaOpY_W;wDP)MUKA!2jK z-4#s1g~*X5I^Zsn0nqfPUeqy?cf2!1kCyow>7!sBm5^lX*Mx}#)8>MY53tkvMlUL! z4xUgiqcI90Q+|XaPkwf`XTr<-rQV-#H5gqVG1BVQKlQ9B+!-7Pi48QxBG%OU6SlbR z|4Hm5Ggt6i%Gi0S|c-QMY&X2V(rOi=DmL^%m zEUwF;|F=oWM9Em!8N$MR=lm=|?G5>84ngl91t->y@&rqS^Mx`5DRU^3HXwWs@FUO% z!3Rj?X%qd9QW|s<#U~X619CY?I&=SIhlahdkh~&Y&#D%Vk`Iuy;rVZ%7!Tezwk>}y z0eiG^G65j9tib#g$I6dCT~(`Kw+o0rWr9~1)rX&gVnbI9gvp?RJ#kN8%K=98Dzhy+ z6U1@<{NTU=?Z&HQBIx7WNNV82_1B^BW{aPu5UC6$l z=DU%Wq+thfe?_y5ffG#eu|%*TuzVq#90GV%9R8hWQaAh$Y=O_l993O8Pp_g&uYIdl zdA#)z5UPN>h?!E^LAQG~jF+3x*$I z8ZG?yWVVHm3pd8;efEYM$u!{DiwnAC@;K6bi(aUJUZlVk^w=i--KjnARJoUU`Oz%h z&~2b1*i1e8(o23Mt4#TaaM6~2oEwQrfgULn_1dgssSa!uT#-(#*^ToPo;lPZw(YO` zi;sa1r|c@XH5>Ace{9M9^{NC}wR;*4RpR9W?Qhibz8oW7B{0lE)DCtKk+PGKHG+8G_D~uuPvtj({5kX& zM3mg0;PI=E%TJ<|Z$N)i*Y8>8_^1&qhF2{spoK|33@l)AYWM$kQ5m~on*d{9{nmh2 g{r~!;5g@(t1Kj2>Zk6M%|GV&9QdCx?Qb<4Ge+QlB!~g&Q diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_32-1.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_32-1.png deleted file mode 100644 index b0bc232fe77f7cf8a00a2c95cdc48acbc0e93058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2194 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 B(B}XE diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_32.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_32.png deleted file mode 100644 index b0bc232fe77f7cf8a00a2c95cdc48acbc0e93058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2194 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 B(B}XE diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_512-1.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_512-1.png deleted file mode 100644 index c42a319ef308ce8087cd304c6a5aa98b55c420a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104776 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�E6&mrMMz7;*3Q3Y0P*aXH5x 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 diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_512.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_512.png deleted file mode 100644 index c42a319ef308ce8087cd304c6a5aa98b55c420a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104776 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�E6&mrMMz7;*3Q3Y0P*aXH5x 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 diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_64.png b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/Assets.xcassets/VFS For Git.appiconset/VFSForGit_64.png deleted file mode 100644 index 72a22b25b4c37423de348c3b1c248a994f388819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4509 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 - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.h deleted file mode 100644 index 54470a1ed3..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.h +++ /dev/null @@ -1,11 +0,0 @@ -#import -#import "VFSProductInfoFetcher.h" - -@interface VFSAboutWindowController : NSWindowController - -@property (readonly, nullable) NSString *vfsforgitVersion; -@property (readonly, nullable) NSString *gitVersion; - -- (instancetype _Nullable)initWithProductInfoFetcher:(VFSProductInfoFetcher *_Nonnull)productInfoFetcher; - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.m deleted file mode 100644 index bd93a6b8ac..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.m +++ /dev/null @@ -1,55 +0,0 @@ -#import "VFSAboutWindowController.h" - -@interface VFSAboutWindowController () - -@property (strong) VFSProductInfoFetcher *productInfoFetcher; - -@end - -@implementation VFSAboutWindowController - -- (instancetype)initWithProductInfoFetcher:(VFSProductInfoFetcher *)productInfoFetcher -{ - if (productInfoFetcher == nil) - { - self = nil; - } - else if (self = [super initWithWindowNibName:@"VFSAboutWindowController"]) - { - _productInfoFetcher = productInfoFetcher; - } - - return self; -} - -- (NSString *)vfsforgitVersion -{ - NSString *version; - NSError *error; - if ([self.productInfoFetcher tryGetVFSForGitVersion:&version error:&error]) - { - return version; - } - else - { - NSLog(@"Error getting VFS For Git version: %@", [error description]); - return @"Not available"; - } -} - -- (NSString *)gitVersion -{ - NSString *version; - NSError *error; - if ([self.productInfoFetcher tryGetGitVersion:&version error:&error]) - { - return version; - } - else - { - NSLog(@"Error getting Git version: %@", [error description]); - return @"Not available"; - } -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.xib b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.xib deleted file mode 100644 index b03070d52c..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAboutWindowController.xib +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.h deleted file mode 100644 index 0033a9e983..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import - -@interface VFSAppDelegate : NSObject - -@end - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.m deleted file mode 100644 index 7b1fe0077d..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSAppDelegate.m +++ /dev/null @@ -1,73 +0,0 @@ -#import "VFSAboutWindowController.h" -#import "VFSAppDelegate.h" -#import "VFSCommandRunner.h" -#import "VFSMessageListener.h" -#import "VFSNotificationDisplay.h" -#import "VFSForGitNotification.h" -#import "VFSProductInfoFetcher.h" -#import "VFSStatusBarItem.h" -#import "VFSNotificationDisplay.h" - -@interface VFSAppDelegate () - -@property (weak) IBOutlet NSWindow *Window; -@property (strong) VFSStatusBarItem *StatusDisplay; -@property (strong) VFSMessageListener *messageListener; -@property (strong) VFSNotificationDisplay *notificationDisplay; - -- (void)displayNotification:(NSDictionary *_Nonnull)messageInfo; - -@end - -@implementation VFSAppDelegate - -- (void)applicationDidFinishLaunching:(NSNotification *)aNotification -{ - self.messageListener = [[VFSMessageListener alloc] - initWithSocket:NSTemporaryDirectory() - callback:^(NSDictionary *messageInfo) - { - [self displayNotification:messageInfo]; - }]; - - [self.messageListener startListening]; - - VFSProductInfoFetcher *productInfoFetcher = - [[VFSProductInfoFetcher alloc] - initWithProcessRunner:[[VFSProcessRunner alloc] initWithProcessFactory:^NSTask * - { - return [[NSTask alloc] init]; - }]]; - - self.StatusDisplay = [[VFSStatusBarItem alloc] initWithAboutWindowController: - [[VFSAboutWindowController alloc] - initWithProductInfoFetcher:productInfoFetcher]]; - - [self.StatusDisplay load]; - - self.notificationDisplay = [[VFSNotificationDisplay alloc] - initWithCommandRunner:[[VFSCommandRunner alloc] init]]; -} - -- (void)applicationWillTerminate:(NSNotification *)aNotification -{ - [self.messageListener stopListening]; -} - -- (void)displayNotification:(NSDictionary *_Nonnull)messageInfo -{ - NSParameterAssert(messageInfo); - - VFSForGitNotification *notification; - NSError *error; - if (![VFSForGitNotification tryValidateMessage:messageInfo - buildNotification:¬ification - error:&error]) - { - NSLog(@"ERROR: Could not display notification. %@", [error description]); - return; - } - - [self.notificationDisplay display:notification]; -} -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.h deleted file mode 100644 index 8c3979cee8..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import "VFSForGitNotification.h" - -@interface VFSNotificationDisplay : NSObject - -- (instancetype)initWithCommandRunner:(VFSCommandRunner *)commandRunner; -- (void)display:(VFSForGitNotification *) notification; - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.m deleted file mode 100644 index d157508cd2..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSNotificationDisplay.m +++ /dev/null @@ -1,70 +0,0 @@ -#import -#import "VFSCommandRunner.h" -#import "VFSNotificationDisplay.h" - -@interface VFSNotificationDisplay () - -@property (strong, nonnull) VFSCommandRunner *commandRunner; - -@end - -@implementation VFSNotificationDisplay - -- (instancetype)initWithCommandRunner:(VFSCommandRunner *)commandRunner -{ - if (self = [super init]) - { - _commandRunner = commandRunner; - [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self]; - } - - return self; -} - -- (void)display:(VFSForGitNotification *) notification -{ - NSUserNotification *userNotification = [[NSUserNotification alloc] init]; - userNotification.title = notification.title; - userNotification.informativeText = notification.message; - userNotification.userInfo = [NSDictionary dictionaryWithObject:[NSKeyedArchiver archivedDataWithRootObject:notification] - forKey:@"VFSForGitNotification"]; - if (notification.actionable == YES) - { - userNotification.hasActionButton = notification.actionable; - userNotification.actionButtonTitle = notification.actionTitle; - } - - [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification]; -} - -- (void)userNotificationCenter:(NSUserNotificationCenter *)center - didActivateNotification:(NSUserNotification *)notification -{ - [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification:notification]; - - VFSForGitNotification *vfsNotification = [NSKeyedUnarchiver - unarchiveObjectWithData:[[notification userInfo] - objectForKey:@"VFSForGitNotification"]]; - if (vfsNotification != nil) - { - switch (notification.activationType) - { - case NSUserNotificationActivationTypeActionButtonClicked: - { - if (vfsNotification.gvfsCommand) - { - [self.commandRunner runCommand:vfsNotification.gvfsCommand]; - } - - break; - } - - default: - { - break; - } - } - } -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.h deleted file mode 100644 index 86160ed123..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.h +++ /dev/null @@ -1,10 +0,0 @@ -#import - -@interface VFSStatusBarItem : NSObject - -- (instancetype _Nullable)initWithAboutWindowController:(VFSAboutWindowController *_Nonnull)aboutWindowController; -- (void)load; -- (NSMenu *_Nullable)getStatusMenu; -- (IBAction)handleMenuClick:(id)sender; - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.m deleted file mode 100644 index 5b3f281e62..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/UI/VFSStatusBarItem.m +++ /dev/null @@ -1,97 +0,0 @@ -#import "VFSAboutWindowController.h" -#import "VFSStatusBarItem.h" -#import "VFSProductInfoFetcher.h" - -@interface VFSStatusBarItem () - -@property (strong, nonnull) NSStatusItem *statusItem; -@property (strong, nonnull) VFSAboutWindowController *aboutWindowController; - -@end - -@implementation VFSStatusBarItem - -- (instancetype)initWithAboutWindowController:(VFSAboutWindowController *)aboutWindowController -{ - if (aboutWindowController == nil) - { - self = nil; - } - else if (self = [super init]) - { - _aboutWindowController = aboutWindowController; - } - - return self; -} - -- (void)load -{ - self.statusItem = [[NSStatusBar systemStatusBar] - statusItemWithLength:NSVariableStatusItemLength]; - - [self.statusItem setHighlightMode:YES]; - - [self addStatusButton]; - [self addMenuItems]; -} - -- (IBAction)handleMenuClick:(id)sender -{ - switch (((NSButton *) sender).tag) - { - case 0: - { - [self displayAboutBox]; - break; - } - - default: - { - break; - } - } -} - -- (IBAction)displayAboutBox -{ - [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; - [self.aboutWindowController showWindow:self]; - [self.aboutWindowController.window makeKeyAndOrderFront:self]; -} - -- (NSMenu *)getStatusMenu -{ - return self.statusItem.menu; -} - -- (void)addStatusButton -{ - NSImage *image = [NSImage imageNamed:@"StatusItem"]; - - [image setTemplate:YES]; - - [self.statusItem.button setImage:image]; - [self.statusItem.button setTarget:nil]; - [self.statusItem.button setAction:nil]; -} - -- (void)addMenuItems -{ - NSUInteger index = 0; - NSMenu *menu = [[NSMenu alloc] init]; - NSMenuItem *aboutItem = [[NSMenuItem alloc] - initWithTitle:@"About VFS For Git" - action:@selector(handleMenuClick:) - keyEquivalent:@""]; - - [aboutItem setTag:0]; - [aboutItem setTarget:self]; - [menu insertItem:[NSMenuItem separatorItem] atIndex:index++]; - [menu insertItem:aboutItem atIndex:index++]; - [menu setAutoenablesItems:NO]; - - [self.statusItem setMenu:menu]; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.h deleted file mode 100644 index db7797276c..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface VFSCommandRunner : NSObject - -- (void) runCommand:(NSString *) command; - -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.m deleted file mode 100644 index e44bf3e10b..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSCommandRunner.m +++ /dev/null @@ -1,25 +0,0 @@ -#import "VFSCommandRunner.h" - -NSString * const LaunchTerminalScriptFormat = @"\ -tell application \"Terminal\" \n\ -activate \n\ -do script (\"echo;echo Running gvfs command: %@;echo You might need to type Admin password;%@ \") \n\ -end tell"; - -@implementation VFSCommandRunner - -- (void) runCommand:(NSString *) command -{ - NSString *scriptSource = [NSString stringWithFormat:LaunchTerminalScriptFormat, command, command]; - NSAppleScript *scriptObject = [[NSAppleScript alloc] initWithSource:scriptSource]; - NSDictionary *errorDict; - NSAppleEventDescriptor *returnDescriptor = NULL; - - returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; - if (returnDescriptor == nil) - { - NSLog(@"Error running %@. %@", command, [errorDict description]); - } -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.h deleted file mode 100644 index f9b10c96a3..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -extern NSErrorDomain const VFSForGitNotificationErrorDomain; -typedef NS_ERROR_ENUM(VFSForGitNotificationErrorDomain, VFSForGitNotificationErrorCode) -{ - VFSForGitInitError = 200, - VFSForGitAllocError, - VFSForGitInvalidMessageIdFormatError, - VFSForGitUnsupportedMessageError, - VFSForGitMissingEntitlementInfoError, - VFSForGitMissingRepoCountError, - VFSForGitMessageParseError, - VFSForGitMessageReadError, -}; - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.m deleted file mode 100644 index 2f21d3c6e4..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSNotificationErrors.m +++ /dev/null @@ -1,3 +0,0 @@ -#import "VFSNotificationErrors.h" - -NSErrorDomain const VFSForGitNotificationErrorDomain = @"VFSForGitNotificationErrorDomain"; diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.h deleted file mode 100644 index be03a9be13..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.h +++ /dev/null @@ -1,17 +0,0 @@ -#import - -NS_ASSUME_NONNULL_BEGIN - -typedef NSTask *_Nonnull (^ProcessFactory)(void); - -@interface VFSProcessRunner : NSObject - -- (instancetype _Nullable)initWithProcessFactory:(ProcessFactory)processFactory; -- (BOOL)tryRunExecutable:(NSURL *)path - args:(NSArray *_Nullable)args - output:(NSString *_Nullable __autoreleasing *_Nonnull)output - error:(NSError * __autoreleasing *)error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.m deleted file mode 100644 index 6c017ddeb9..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProcessRunner.m +++ /dev/null @@ -1,82 +0,0 @@ -#import "VFSProcessRunner.h" -#import "VFSNotificationErrors.h" - -@interface VFSProcessRunner() - -@property (strong) ProcessFactory processFactory; - -@end - -@implementation VFSProcessRunner - -- (instancetype)initWithProcessFactory:(ProcessFactory)processFactory -{ - if (processFactory == nil) - { - self = nil; - } - else if (self = [super init]) - { - _processFactory = processFactory; - } - - return self; -} - -/** - Runs an executable specified by path and args. If the executable could be run - successfully - output will contain the executable's combined stderr/stdout - output and the method returns YES. In case of failure, it returns NO and error - will hold the executable's combined stderr/stdout output. - - @param path - specify full path to the executable. - @param args - specify any command line args to pass to the executable. - @param output - contains executable's output, if it was successfully run. - @param error - contains executable's output, if it exited with an error. - @return YES if the executable was successfully run, NO otherwise. - */ -- (BOOL)tryRunExecutable:(NSURL *)path - args:(NSArray *)args - output:(NSString *__autoreleasing *)output - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(path); - NSParameterAssert(output); - - NSTask *task = self.processFactory(); - NSPipe *taskOut = [NSPipe pipe]; - - task.executableURL = path; - task.arguments = args; - task.standardOutput = taskOut; - task.standardError = taskOut; - - int exitCode = -1; - - if ([task launchAndReturnError:error]) - { - [task waitUntilExit]; - - exitCode = [task terminationStatus]; - - *output = [[NSString alloc] initWithData:[taskOut.fileHandleForReading availableData] - encoding:NSUTF8StringEncoding]; - - if (0 != exitCode) - { - if (error != nil) - { - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : *output }; - *error = [NSError errorWithDomain:VFSForGitNotificationErrorDomain - code:exitCode - userInfo:userInfo]; - } - - *output = nil; - } - } - - return 0 == exitCode; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.h deleted file mode 100644 index 32a3a53e93..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.h +++ /dev/null @@ -1,16 +0,0 @@ -#import -#import "VFSProcessRunner.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface VFSProductInfoFetcher : NSObject - -- (instancetype _Nullable)initWithProcessRunner:(VFSProcessRunner *)processRunner; -- (BOOL)tryGetGitVersion:(NSString *_Nullable __autoreleasing *_Nonnull)version - error:(NSError **)error; -- (BOOL)tryGetVFSForGitVersion:(NSString *_Nullable __autoreleasing *_Nonnull)version - error:(NSError **)error; - -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.m deleted file mode 100644 index 8b9014830a..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/Utilities/VFSProductInfoFetcher.m +++ /dev/null @@ -1,61 +0,0 @@ -#import -#import "VFSProductInfoFetcher.h" - -NSString * const VFSForGitPath = @"/usr/local/bin/gvfs"; -NSString * const GitPath = @"/usr/local/bin/git"; - -@interface VFSProductInfoFetcher() - -@property (strong, nonnull) VFSProcessRunner *processRunner; - -@end - -@implementation VFSProductInfoFetcher - -- (instancetype)initWithProcessRunner:(VFSProcessRunner *)processRunner -{ - if (processRunner == nil) - { - self = nil; - } - else if (self = [super init]) - { - _processRunner = processRunner; - } - - return self; -} - -- (BOOL)tryGetVFSForGitVersion:(NSString *__autoreleasing *)version - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(version); - - if (![self.processRunner tryRunExecutable:[NSURL fileURLWithPath:VFSForGitPath] - args:@[ @"version" ] - output:version - error:error]) - { - return NO; - } - - return YES; -} - -- (BOOL)tryGetGitVersion:(NSString *__autoreleasing *)version - error:(NSError *__autoreleasing *)error -{ - NSParameterAssert(version); - - if (![self.processRunner tryRunExecutable:[NSURL fileURLWithPath:GitPath] - args:@[ @"version" ] - output:version - error:error]) - { - return NO; - } - - return YES; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/VFSForGit.entitlements b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/VFSForGit.entitlements deleted file mode 100644 index f2ef3ae026..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/VFSForGit.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/main.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/main.m deleted file mode 100644 index 3eb7a378e1..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/StatusMenuItem/main.m +++ /dev/null @@ -1,6 +0,0 @@ -#import - -int main(int argc, const char * argv[]) -{ - return NSApplicationMain(argc, argv); -} diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Info.plist b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Info.plist deleted file mode 100644 index 6c40a6cd0c..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.h deleted file mode 100644 index b70ef79b33..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.h +++ /dev/null @@ -1,8 +0,0 @@ -#import -#import "VFSAboutWindowController.h" - -@interface VFSMockAboutWindowController : VFSAboutWindowController - -@property (readonly) BOOL aboutBoxDisplayed; - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.m deleted file mode 100644 index fd9ff69924..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockAboutWindowController.m +++ /dev/null @@ -1,23 +0,0 @@ -#import -#import "VFSMockAboutWindowController.h" - -@interface VFSMockAboutWindowController() - -@property (readwrite) BOOL aboutBoxDisplayed; - -@end - -@implementation VFSMockAboutWindowController - -- (instancetype) initWithProductInfo:(VFSProductInfoFetcher *) productInfo -{ - self = [super initWithProductInfoFetcher:productInfo]; - return self; -} - -- (IBAction)showWindow:(nullable id)sender -{ - self.aboutBoxDisplayed = YES; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.h deleted file mode 100644 index 357ffab45c..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.h +++ /dev/null @@ -1,7 +0,0 @@ -#import - -@interface VFSMockNotificationCenter : NSUserNotificationCenter - -@property (assign) BOOL notificationDelivered; - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.m deleted file mode 100644 index 6d9a2dd01a..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockNotificationCenter.m +++ /dev/null @@ -1,31 +0,0 @@ -#import -#import "VFSMockNotificationCenter.h" - -@interface VFSMockNotificationCenter () - -@property (strong) NSUserNotification *expectedNotification; - -@end - -@implementation VFSMockNotificationCenter - -- (instancetype) initWithExpectedNotification:(NSUserNotification *) notification -{ - if (self = [super init]) - { - _expectedNotification = notification; - } - - return self; -} - -- (void)deliverNotification:(NSUserNotification *) notification -{ - if ([notification.title isEqualToString:self.expectedNotification.title] && - [notification.informativeText isEqualToString:self.expectedNotification.informativeText]) - { - self.notificationDelivered = YES; - } -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.h b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.h deleted file mode 100644 index 32c7654c79..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.h +++ /dev/null @@ -1,13 +0,0 @@ -#import -#import "VFSProductInfoFetcher.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface VFSMockProductInfoFetcher : VFSProductInfoFetcher - -- (instancetype _Nullable) initWithGitVersion:(NSString *) gitVersion - vfsforgitVersion:(NSString *) vfsforgitVersion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.m deleted file mode 100644 index 500d95f68e..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/Mocks/VFSMockProductInfoFetcher.m +++ /dev/null @@ -1,39 +0,0 @@ -#import -#import "VFSMockProductInfoFetcher.h" - -@interface VFSMockProductInfoFetcher() - -@property (copy) NSString *gitVersion; -@property (copy) NSString *vfsforgitVersion; - -@end - -@implementation VFSMockProductInfoFetcher - -- (instancetype) initWithGitVersion:(NSString *) gitVersion - vfsforgitVersion:(NSString *) vfsforgitVersion -{ - if (self = [super init]) - { - _gitVersion = [gitVersion copy]; - _vfsforgitVersion = [vfsforgitVersion copy]; - } - - return self; -} - -- (BOOL) tryGetVFSForGitVersion:(NSString *__autoreleasing *) version - error:(NSError *__autoreleasing *) error -{ - *version = self.vfsforgitVersion; - return YES; -} - -- (BOOL) tryGetGitVersion:(NSString *__autoreleasing *) version - error:(NSError *__autoreleasing *) error -{ - *version = self.gitVersion; - return YES; -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSAboutWindowControllerTests.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSAboutWindowControllerTests.m deleted file mode 100644 index 96fcdb41f2..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSAboutWindowControllerTests.m +++ /dev/null @@ -1,47 +0,0 @@ -#import -#import "VFSMockAboutWindowController.h" -#import "VFSMockProductInfoFetcher.h" - -NSString * const ExpectedGitVersionString = @"2.20.1.vfs.1.1.104.g2ab7360"; -NSString * const ExpectedVFSForGitVersionString = @"1.0.19116.1"; - -@interface VFSAboutWindowControllerTests : XCTestCase - -@property (strong) VFSAboutWindowController *windowController; - -@end - -@implementation VFSAboutWindowControllerTests - -- (void)setUp -{ - [super setUp]; - - VFSMockProductInfoFetcher *mockProductInfoFetcher = - [[VFSMockProductInfoFetcher alloc] initWithGitVersion:(NSString *) ExpectedGitVersionString - vfsforgitVersion:(NSString *) ExpectedVFSForGitVersionString]; - - self.windowController = [[VFSAboutWindowController alloc] - initWithProductInfoFetcher:mockProductInfoFetcher]; -} - -- (void)tearDown -{ - [super tearDown]; -} - -- (void)testAboutWindowContainsGVFSVersion -{ - XCTAssertEqual(self.windowController.vfsforgitVersion, - ExpectedVFSForGitVersionString, - @"Incorrect VFSForGit version displayed in About box"); -} - -- (void)testAboutWindowContainsGitVersion -{ - XCTAssertEqual(self.windowController.gitVersion, - ExpectedGitVersionString, - @"Incorrect Git version displayed in About box"); -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSForGitNotificationTests.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSForGitNotificationTests.m deleted file mode 100644 index 3935e17dd3..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSForGitNotificationTests.m +++ /dev/null @@ -1,93 +0,0 @@ -#import -#import "VFSForGitNotification.h" - -@interface VFSForGitNotificationTests : XCTestCase -@end - -@implementation VFSForGitNotificationTests - -- (void)testCreateNotificationWithMissingIdFails -{ - NSDictionary *message = @{ - @"Title" : @"foo", - @"Message" : @"bar", - @"Enlistment" : @"/foo/bar", - @"EnlistmentCount" : [NSNumber numberWithLong:0] - }; - - NSError *error; - VFSForGitNotification *notification; - - XCTAssertFalse([VFSForGitNotification tryValidateMessage:message - buildNotification:¬ification - error:&error]); - XCTAssertNotNil(error); -} - -- (void)testCreateNotificationWithInvalidIdFails -{ - NSDictionary *message = @{ - @"Id" : [NSNumber numberWithLong:32], - @"Title" : @"foo", - @"Message" : @"bar", - @"EnlistmentCount" : [NSNumber numberWithLong:0] - }; - - NSError *error; - VFSForGitNotification *notification; - XCTAssertFalse([VFSForGitNotification tryValidateMessage:message - buildNotification:¬ification - error:&error]); - XCTAssertNotNil(error); -} - -- (void)testCreateAutomountNotificationWithValidMessageSucceeds -{ - NSDictionary *message = @{ - @"Id" : [NSNumber numberWithLong:0], - @"EnlistmentCount" : [NSNumber numberWithLong:5] - }; - - NSError *error; - VFSForGitNotification *notification; - XCTAssertTrue([VFSForGitNotification tryValidateMessage:message - buildNotification:¬ification - error:&error]); - XCTAssertTrue([notification.title isEqualToString:@"GVFS AutoMount"]); - XCTAssertTrue([notification.message isEqualToString:@"Attempting to mount 5 GVFS repos(s)"]); - XCTAssertNil(error); -} - -- (void)testCreateMountNotificationWithValidMessageSucceeds -{ - NSString *enlistment = @"/Users/foo/bar/foo.bar"; - NSDictionary *message = @{ - @"Id" : [NSNumber numberWithLong:1], - @"Enlistment" : enlistment - }; - - NSError *error; - VFSForGitNotification *notification; - XCTAssertTrue([VFSForGitNotification tryValidateMessage:message - buildNotification:¬ification - error:&error]); - XCTAssertTrue([notification.title isEqualToString:@"GVFS AutoMount"]); - XCTAssertTrue([notification.message containsString:enlistment]); - XCTAssertNil(error); -} - -- (void)testCreateMountNotificationWithMissingEnlistmentFails -{ - NSDictionary *message = @{ - @"Id" : [NSNumber numberWithLong:1], - }; - - NSError *error; - VFSForGitNotification *notification; - XCTAssertFalse([VFSForGitNotification tryValidateMessage:message - buildNotification:¬ification - error:&error]); - XCTAssertNotNil(error); -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSMessageParserTests.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSMessageParserTests.m deleted file mode 100644 index 3f3b14f977..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSMessageParserTests.m +++ /dev/null @@ -1,115 +0,0 @@ -#import -#import "VFSMessageParser.h" - -@interface MessageParserTests : XCTestCase -@end - -@implementation MessageParserTests - -- (void)testParsingValidMessageSucceeds -{ - NSDictionary *expectedDict = [self validMessage]; - NSData *messageData = - [NSJSONSerialization dataWithJSONObject:expectedDict - options:NSJSONWritingPrettyPrinted - error:nil]; - - NSError *error; - NSDictionary *parsedMessage; - XCTAssertTrue([VFSMessageParser tryParseData:messageData - message:&parsedMessage - error:&error]); - XCTAssertNil(error); - - [self validateParsedMessage:parsedMessage expectedMessage:expectedDict]; -} - -- (void)testParsingMessageWithTrailingCtrlCharsSucceed -{ - NSDictionary *expectedDict = [self validMessage]; - NSData *messageData = - [NSJSONSerialization dataWithJSONObject:expectedDict - options:NSJSONWritingPrettyPrinted - error:nil]; - NSMutableData *dataWithCtrlChars = [NSMutableData dataWithData:messageData]; - NSString *stringWithCtrlChars = [NSString stringWithFormat:@"%c%c%c%c%c%c%c", - 0x07, - 0x08, - 0x1B, - 0x0C, - 0x0A, - 0x0D, - 0x09]; - [dataWithCtrlChars appendData:[stringWithCtrlChars - dataUsingEncoding:NSUTF8StringEncoding]]; - - NSError *error; - NSDictionary *parsedMessage; - XCTAssertTrue([VFSMessageParser tryParseData:dataWithCtrlChars - message:&parsedMessage - error:&error]); - XCTAssertNil(error); - - [self validateParsedMessage:parsedMessage expectedMessage:expectedDict]; -} - -- (void)testParsingMalformedMessageFails -{ - NSString *message = @"{ \"Id\", \"Message\", \"Foobar\"}"; - NSError *error; - NSDictionary *parsedMessage; - XCTAssertFalse([VFSMessageParser tryParseData:[message dataUsingEncoding:NSUTF8StringEncoding] - message:&parsedMessage - error:&error]); - XCTAssertNil(parsedMessage); - XCTAssertNotNil(error); -} - -- (void)testParsingEmptyMessageFails -{ - NSString *message = @""; - NSError *error; - NSDictionary *parsedMessage; - - XCTAssertFalse([VFSMessageParser tryParseData:[message dataUsingEncoding:NSUTF8StringEncoding] - message:&parsedMessage - error:&error]); - XCTAssertNil(parsedMessage); - XCTAssertNotNil(error); -} - -#pragma mark Utility Methods - -- (NSDictionary *)validMessage -{ - NSInteger messageId = 1; - NSString *title = @"GVFS Mount"; - NSString *message = @"Successfully mount repo"; - NSString *enlistment = @"/Users/foo/bar"; - NSInteger enlistmentCount = 0; - NSDictionary *validDict = @{ - @"Id" : [NSNumber numberWithLong:messageId], - @"Title" : title, - @"Message" : message, - @"Enlistment" : enlistment, - @"EnlistmentCount" : [NSNumber numberWithLong:enlistmentCount] - }; - return validDict; -} - -- (BOOL)validateParsedMessage:(NSDictionary *)messageDict - expectedMessage:(NSDictionary *)expectedDict -{ - XCTAssertNotNil(messageDict, @"Parse error: failure parsing message"); - - [messageDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, - id _Nonnull obj, - BOOL * _Nonnull stop) - { - XCTAssertEqualObjects(obj, - expectedDict[key], - @"Parse error: mismatch in values of %@", - key); - }]; -} -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSStatusBarItemTests.m b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSStatusBarItemTests.m deleted file mode 100644 index 302ecd4d33..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.UnitTests/VFSStatusBarItemTests.m +++ /dev/null @@ -1,56 +0,0 @@ -#import -#import "VFSMockAboutWindowController.h" -#import "VFSMockProductInfoFetcher.h" -#import "VFSStatusBarItem.h" - -NSString * const ExpectedAboutMenuTitle = @"About VFS For Git"; - -@interface VFSStatusBarItemTests : XCTestCase - -@property (strong) VFSStatusBarItem *statusbarItem; -@property (strong) VFSMockAboutWindowController *aboutWindowController; - -@end - -@implementation VFSStatusBarItemTests - -- (void)setUp -{ - [super setUp]; - - VFSMockProductInfoFetcher *mockProductInfoFetcher = [[VFSMockProductInfoFetcher alloc] - initWithGitVersion:@"" - vfsforgitVersion:@""]; - - self.aboutWindowController = [[VFSMockAboutWindowController alloc] - initWithProductInfoFetcher:mockProductInfoFetcher]; - self.statusbarItem = [[VFSStatusBarItem alloc] - initWithAboutWindowController:self.aboutWindowController]; - - [self.statusbarItem load]; -} - -- (void)tearDown -{ - [super tearDown]; -} - -- (void)testStatusItemContainsAboutMenu -{ - NSMenu *statusMenu = [self.statusbarItem getStatusMenu]; - XCTAssertNotNil(statusMenu, @"Status bar does not contain VFSForGit menu"); - - NSMenuItem *menuItem = [statusMenu itemWithTitle:ExpectedAboutMenuTitle]; - XCTAssertNotNil(menuItem, @"Missing \"%@\" item in VFSForGit menu", ExpectedAboutMenuTitle); -} - -- (void)testAboutMenuClickDisplaysAboutBox -{ - [self.statusbarItem handleMenuClick:nil]; - - XCTAssertTrue(self.aboutWindowController.aboutBoxDisplayed, - @"Clicking on \"%@\" menu does not show About box", - ExpectedAboutMenuTitle); -} - -@end diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.pbxproj b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.pbxproj deleted file mode 100644 index 2664a692e9..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.pbxproj +++ /dev/null @@ -1,595 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 433FE819227B593500488730 /* VFSAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 433FE818227B593500488730 /* VFSAppDelegate.m */; }; - 433FE81B227B594300488730 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 433FE81A227B594300488730 /* Assets.xcassets */; }; - 433FE81E227B594300488730 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 433FE81C227B594300488730 /* MainMenu.xib */; }; - 433FE821227B594300488730 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 433FE820227B594300488730 /* main.m */; }; - 433FE8562280C21000488730 /* VFSStatusBarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 433FE8542280C21000488730 /* VFSStatusBarItem.m */; }; - 433FE85A2280E10F00488730 /* VFSProductInfoFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 433FE8592280E10F00488730 /* VFSProductInfoFetcher.m */; }; - 433FE8632281D06100488730 /* VFSAboutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 433FE8602281D06000488730 /* VFSAboutWindowController.m */; }; - 433FE8642281D06100488730 /* VFSAboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 433FE8612281D06100488730 /* VFSAboutWindowController.xib */; }; - 43583C362289BDAA003357D6 /* VFSStatusBarItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 43583C352289BDAA003357D6 /* VFSStatusBarItemTests.m */; }; - 43583C382289BE94003357D6 /* VFSAboutWindowControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 43583C372289BE94003357D6 /* VFSAboutWindowControllerTests.m */; }; - 435B1E0F228CC1E000E853F3 /* VFSProcessRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = 435B1E0E228CC1E000E853F3 /* VFSProcessRunner.m */; }; - 43AF0DF822B01C9800E54D48 /* VFSForGitNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0DF422B01C9700E54D48 /* VFSForGitNotification.m */; }; - 43AF0DFA22B01C9800E54D48 /* VFSMessageParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0DF522B01C9700E54D48 /* VFSMessageParser.m */; }; - 43AF0DFC22B01C9800E54D48 /* VFSMessageListener.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0DF622B01C9800E54D48 /* VFSMessageListener.m */; }; - 43AF0E0222B01E3200E54D48 /* VFSNotificationDisplay.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0E0122B01E3200E54D48 /* VFSNotificationDisplay.m */; }; - 43AF0E0322B023BE00E54D48 /* VFSMockAboutWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 435B1DFA228B4C8400E853F3 /* VFSMockAboutWindowController.m */; }; - 43AF0E0422B023BE00E54D48 /* VFSMockProductInfoFetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 435B1DFE228B590100E853F3 /* VFSMockProductInfoFetcher.m */; }; - 43AF0E0522B023BE00E54D48 /* VFSMockNotificationCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 435B1E01228B6C3900E853F3 /* VFSMockNotificationCenter.m */; }; - 43AF0E0822B023F200E54D48 /* VFSMessageParserTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0E0622B023F200E54D48 /* VFSMessageParserTests.m */; }; - 43AF0E0922B023F200E54D48 /* VFSForGitNotificationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0E0722B023F200E54D48 /* VFSForGitNotificationTests.m */; }; - 43C021F022B18BDD00F868F2 /* VFSNotificationErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 43C021EF22B18BDD00F868F2 /* VFSNotificationErrors.m */; }; - 43C0221A22BBFA7A00F868F2 /* VFSCommandRunner.m in Sources */ = {isa = PBXBuildFile; fileRef = 43C0221822BBFA7A00F868F2 /* VFSCommandRunner.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 43583C302285E3E1003357D6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 433FE80C227B593500488730 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 433FE813227B593500488730; - remoteInfo = VFSForGit; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 433FE814227B593500488730 /* VFS For Git.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VFS For Git.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 433FE817227B593500488730 /* VFSAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VFSAppDelegate.h; sourceTree = ""; }; - 433FE818227B593500488730 /* VFSAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSAppDelegate.m; sourceTree = ""; }; - 433FE81A227B594300488730 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 433FE81D227B594300488730 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; - 433FE81F227B594300488730 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 433FE820227B594300488730 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 433FE822227B594300488730 /* VFSForGit.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = VFSForGit.entitlements; sourceTree = ""; }; - 433FE8532280C21000488730 /* VFSStatusBarItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VFSStatusBarItem.h; sourceTree = ""; }; - 433FE8542280C21000488730 /* VFSStatusBarItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSStatusBarItem.m; sourceTree = ""; }; - 433FE8582280E10F00488730 /* VFSProductInfoFetcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VFSProductInfoFetcher.h; sourceTree = ""; }; - 433FE8592280E10F00488730 /* VFSProductInfoFetcher.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSProductInfoFetcher.m; sourceTree = ""; }; - 433FE8602281D06000488730 /* VFSAboutWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSAboutWindowController.m; sourceTree = ""; }; - 433FE8612281D06100488730 /* VFSAboutWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = VFSAboutWindowController.xib; sourceTree = ""; }; - 433FE8622281D06100488730 /* VFSAboutWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSAboutWindowController.h; sourceTree = ""; }; - 43583C2B2285E3E1003357D6 /* VFSForGit.UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VFSForGit.UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 43583C2F2285E3E1003357D6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 43583C352289BDAA003357D6 /* VFSStatusBarItemTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSStatusBarItemTests.m; sourceTree = ""; }; - 43583C372289BE94003357D6 /* VFSAboutWindowControllerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSAboutWindowControllerTests.m; sourceTree = ""; }; - 435B1DFA228B4C8400E853F3 /* VFSMockAboutWindowController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSMockAboutWindowController.m; sourceTree = ""; }; - 435B1DFC228B4CB500E853F3 /* VFSMockAboutWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSMockAboutWindowController.h; sourceTree = ""; }; - 435B1DFD228B590100E853F3 /* VFSMockProductInfoFetcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSMockProductInfoFetcher.h; sourceTree = ""; }; - 435B1DFE228B590100E853F3 /* VFSMockProductInfoFetcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSMockProductInfoFetcher.m; sourceTree = ""; }; - 435B1E00228B6C3900E853F3 /* VFSMockNotificationCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSMockNotificationCenter.h; sourceTree = ""; }; - 435B1E01228B6C3900E853F3 /* VFSMockNotificationCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSMockNotificationCenter.m; sourceTree = ""; }; - 435B1E0D228CC1E000E853F3 /* VFSProcessRunner.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VFSProcessRunner.h; sourceTree = ""; }; - 435B1E0E228CC1E000E853F3 /* VFSProcessRunner.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSProcessRunner.m; sourceTree = ""; }; - 43AF0DF222B01C9700E54D48 /* VFSForGitNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSForGitNotification.h; sourceTree = ""; }; - 43AF0DF322B01C9700E54D48 /* VFSMessageListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSMessageListener.h; sourceTree = ""; }; - 43AF0DF422B01C9700E54D48 /* VFSForGitNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSForGitNotification.m; sourceTree = ""; }; - 43AF0DF522B01C9700E54D48 /* VFSMessageParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSMessageParser.m; sourceTree = ""; }; - 43AF0DF622B01C9800E54D48 /* VFSMessageListener.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSMessageListener.m; sourceTree = ""; }; - 43AF0DF722B01C9800E54D48 /* VFSMessageParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSMessageParser.h; sourceTree = ""; }; - 43AF0E0022B01E3200E54D48 /* VFSNotificationDisplay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSNotificationDisplay.h; sourceTree = ""; }; - 43AF0E0122B01E3200E54D48 /* VFSNotificationDisplay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSNotificationDisplay.m; sourceTree = ""; }; - 43AF0E0622B023F200E54D48 /* VFSMessageParserTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSMessageParserTests.m; sourceTree = ""; }; - 43AF0E0722B023F200E54D48 /* VFSForGitNotificationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSForGitNotificationTests.m; sourceTree = ""; }; - 43C021EE22B18BDD00F868F2 /* VFSNotificationErrors.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VFSNotificationErrors.h; sourceTree = ""; }; - 43C021EF22B18BDD00F868F2 /* VFSNotificationErrors.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VFSNotificationErrors.m; sourceTree = ""; }; - 43C0221822BBFA7A00F868F2 /* VFSCommandRunner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VFSCommandRunner.m; sourceTree = ""; }; - 43C0221922BBFA7A00F868F2 /* VFSCommandRunner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VFSCommandRunner.h; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 433FE811227B593500488730 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 43583C282285E3E1003357D6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 430ED36D2281E6B200319408 /* UI */ = { - isa = PBXGroup; - children = ( - 43AF0E0022B01E3200E54D48 /* VFSNotificationDisplay.h */, - 43AF0E0122B01E3200E54D48 /* VFSNotificationDisplay.m */, - 433FE8532280C21000488730 /* VFSStatusBarItem.h */, - 433FE8542280C21000488730 /* VFSStatusBarItem.m */, - 433FE8622281D06100488730 /* VFSAboutWindowController.h */, - 433FE8602281D06000488730 /* VFSAboutWindowController.m */, - 433FE8612281D06100488730 /* VFSAboutWindowController.xib */, - 433FE817227B593500488730 /* VFSAppDelegate.h */, - 433FE818227B593500488730 /* VFSAppDelegate.m */, - 433FE81A227B594300488730 /* Assets.xcassets */, - 433FE81C227B594300488730 /* MainMenu.xib */, - ); - path = UI; - sourceTree = ""; - }; - 433FE80B227B593500488730 = { - isa = PBXGroup; - children = ( - 433FE816227B593500488730 /* StatusMenuItem */, - 43583C2C2285E3E1003357D6 /* VFSForGit.UnitTests */, - 433FE815227B593500488730 /* Products */, - ); - sourceTree = ""; - }; - 433FE815227B593500488730 /* Products */ = { - isa = PBXGroup; - children = ( - 433FE814227B593500488730 /* VFS For Git.app */, - 43583C2B2285E3E1003357D6 /* VFSForGit.UnitTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 433FE816227B593500488730 /* StatusMenuItem */ = { - isa = PBXGroup; - children = ( - 43AF0DFF22B01CD400E54D48 /* IPC */, - 435B1E04228C88E300E853F3 /* Utilities */, - 430ED36D2281E6B200319408 /* UI */, - 433FE81F227B594300488730 /* Info.plist */, - 433FE820227B594300488730 /* main.m */, - 433FE822227B594300488730 /* VFSForGit.entitlements */, - ); - path = StatusMenuItem; - sourceTree = ""; - }; - 43583C2C2285E3E1003357D6 /* VFSForGit.UnitTests */ = { - isa = PBXGroup; - children = ( - 43583C3B228A17D4003357D6 /* Mocks */, - 43583C2F2285E3E1003357D6 /* Info.plist */, - 43583C372289BE94003357D6 /* VFSAboutWindowControllerTests.m */, - 43AF0E0722B023F200E54D48 /* VFSForGitNotificationTests.m */, - 43AF0E0622B023F200E54D48 /* VFSMessageParserTests.m */, - 43583C352289BDAA003357D6 /* VFSStatusBarItemTests.m */, - ); - path = VFSForGit.UnitTests; - sourceTree = ""; - }; - 43583C3B228A17D4003357D6 /* Mocks */ = { - isa = PBXGroup; - children = ( - 435B1DFC228B4CB500E853F3 /* VFSMockAboutWindowController.h */, - 435B1DFA228B4C8400E853F3 /* VFSMockAboutWindowController.m */, - 435B1DFD228B590100E853F3 /* VFSMockProductInfoFetcher.h */, - 435B1DFE228B590100E853F3 /* VFSMockProductInfoFetcher.m */, - 435B1E00228B6C3900E853F3 /* VFSMockNotificationCenter.h */, - 435B1E01228B6C3900E853F3 /* VFSMockNotificationCenter.m */, - ); - path = Mocks; - sourceTree = ""; - }; - 435B1E04228C88E300E853F3 /* Utilities */ = { - isa = PBXGroup; - children = ( - 43C0221922BBFA7A00F868F2 /* VFSCommandRunner.h */, - 43C0221822BBFA7A00F868F2 /* VFSCommandRunner.m */, - 433FE8582280E10F00488730 /* VFSProductInfoFetcher.h */, - 433FE8592280E10F00488730 /* VFSProductInfoFetcher.m */, - 435B1E0D228CC1E000E853F3 /* VFSProcessRunner.h */, - 435B1E0E228CC1E000E853F3 /* VFSProcessRunner.m */, - 43C021EE22B18BDD00F868F2 /* VFSNotificationErrors.h */, - 43C021EF22B18BDD00F868F2 /* VFSNotificationErrors.m */, - ); - path = Utilities; - sourceTree = ""; - }; - 43AF0DFF22B01CD400E54D48 /* IPC */ = { - isa = PBXGroup; - children = ( - 43AF0DF222B01C9700E54D48 /* VFSForGitNotification.h */, - 43AF0DF422B01C9700E54D48 /* VFSForGitNotification.m */, - 43AF0DF322B01C9700E54D48 /* VFSMessageListener.h */, - 43AF0DF622B01C9800E54D48 /* VFSMessageListener.m */, - 43AF0DF722B01C9800E54D48 /* VFSMessageParser.h */, - 43AF0DF522B01C9700E54D48 /* VFSMessageParser.m */, - ); - path = IPC; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 433FE813227B593500488730 /* VFS For Git */ = { - isa = PBXNativeTarget; - buildConfigurationList = 433FE830227B594300488730 /* Build configuration list for PBXNativeTarget "VFS For Git" */; - buildPhases = ( - 433FE810227B593500488730 /* Sources */, - 433FE811227B593500488730 /* Frameworks */, - 433FE812227B593500488730 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "VFS For Git"; - productName = VFSForGit; - productReference = 433FE814227B593500488730 /* VFS For Git.app */; - productType = "com.apple.product-type.application"; - }; - 43583C2A2285E3E1003357D6 /* VFSForGit.UnitTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 43583C322285E3E1003357D6 /* Build configuration list for PBXNativeTarget "VFSForGit.UnitTests" */; - buildPhases = ( - 43583C272285E3E1003357D6 /* Sources */, - 43583C282285E3E1003357D6 /* Frameworks */, - 43583C292285E3E1003357D6 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 43583C312285E3E1003357D6 /* PBXTargetDependency */, - ); - name = VFSForGit.UnitTests; - productName = VFSForGit.UnitTests; - productReference = 43583C2B2285E3E1003357D6 /* VFSForGit.UnitTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 433FE80C227B593500488730 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = Microsoft; - TargetAttributes = { - 433FE813227B593500488730 = { - CreatedOnToolsVersion = 9.3; - }; - 43583C2A2285E3E1003357D6 = { - CreatedOnToolsVersion = 9.3; - TestTargetID = 433FE813227B593500488730; - }; - }; - }; - buildConfigurationList = 433FE80F227B593500488730 /* Build configuration list for PBXProject "VFSForGit" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 433FE80B227B593500488730; - productRefGroup = 433FE815227B593500488730 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 433FE813227B593500488730 /* VFS For Git */, - 43583C2A2285E3E1003357D6 /* VFSForGit.UnitTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 433FE812227B593500488730 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 433FE8642281D06100488730 /* VFSAboutWindowController.xib in Resources */, - 433FE81B227B594300488730 /* Assets.xcassets in Resources */, - 433FE81E227B594300488730 /* MainMenu.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 43583C292285E3E1003357D6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 433FE810227B593500488730 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 433FE85A2280E10F00488730 /* VFSProductInfoFetcher.m in Sources */, - 435B1E0F228CC1E000E853F3 /* VFSProcessRunner.m in Sources */, - 433FE8632281D06100488730 /* VFSAboutWindowController.m in Sources */, - 43AF0DF822B01C9800E54D48 /* VFSForGitNotification.m in Sources */, - 433FE821227B594300488730 /* main.m in Sources */, - 43C0221A22BBFA7A00F868F2 /* VFSCommandRunner.m in Sources */, - 43C021F022B18BDD00F868F2 /* VFSNotificationErrors.m in Sources */, - 43AF0DFA22B01C9800E54D48 /* VFSMessageParser.m in Sources */, - 433FE819227B593500488730 /* VFSAppDelegate.m in Sources */, - 43AF0E0222B01E3200E54D48 /* VFSNotificationDisplay.m in Sources */, - 433FE8562280C21000488730 /* VFSStatusBarItem.m in Sources */, - 43AF0DFC22B01C9800E54D48 /* VFSMessageListener.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 43583C272285E3E1003357D6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 43AF0E0322B023BE00E54D48 /* VFSMockAboutWindowController.m in Sources */, - 43AF0E0422B023BE00E54D48 /* VFSMockProductInfoFetcher.m in Sources */, - 43AF0E0822B023F200E54D48 /* VFSMessageParserTests.m in Sources */, - 43AF0E0922B023F200E54D48 /* VFSForGitNotificationTests.m in Sources */, - 43AF0E0522B023BE00E54D48 /* VFSMockNotificationCenter.m in Sources */, - 43583C362289BDAA003357D6 /* VFSStatusBarItemTests.m in Sources */, - 43583C382289BE94003357D6 /* VFSAboutWindowControllerTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 43583C312285E3E1003357D6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 433FE813227B593500488730 /* VFS For Git */; - targetProxy = 43583C302285E3E1003357D6 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 433FE81C227B594300488730 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 433FE81D227B594300488730 /* Base */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 433FE82E227B594300488730 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = VFSForGit; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 433FE82F227B594300488730 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_APPICON_NAME = VFSForGit; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - }; - name = Release; - }; - 433FE831227B594300488730 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "VFS For Git"; - CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = UBF8T346G9; - INFOPLIST_FILE = StatusMenuItem/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.13; - PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.VFSForGit; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 433FE832227B594300488730 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "VFS For Git"; - CODE_SIGN_ENTITLEMENTS = ""; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_TESTABILITY = YES; - INFOPLIST_FILE = StatusMenuItem/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - MACOSX_DEPLOYMENT_TARGET = 10.13; - PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.VFSForGit; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 43583C332285E3E1003357D6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = UBF8T346G9; - HEADER_SEARCH_PATHS = "$(SRCROOT)/VFSForGit.UnitTests/Mocks"; - INFOPLIST_FILE = VFSForGit.UnitTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.VFSForGit-UnitTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/VFS For Git.app/Contents/MacOS/VFS For Git"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 43583C342285E3E1003357D6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = UBF8T346G9; - HEADER_SEARCH_PATHS = "$(SRCROOT)/VFSForGit.UnitTests/Mocks"; - INFOPLIST_FILE = VFSForGit.UnitTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - "@loader_path/../Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.microsoft.VFSForGit-UnitTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/VFS For Git.app/Contents/MacOS/VFS For Git"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 433FE80F227B593500488730 /* Build configuration list for PBXProject "VFSForGit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 433FE82E227B594300488730 /* Debug */, - 433FE82F227B594300488730 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 433FE830227B594300488730 /* Build configuration list for PBXNativeTarget "VFS For Git" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 433FE831227B594300488730 /* Debug */, - 433FE832227B594300488730 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 43583C322285E3E1003357D6 /* Build configuration list for PBXNativeTarget "VFSForGit.UnitTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 43583C332285E3E1003357D6 /* Debug */, - 43583C342285E3E1003357D6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 433FE80C227B593500488730 /* Project object */; -} diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a952dc9ef2..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/VFSForGit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/GVFS/GVFS.Notifications/VFSForGit.Mac/org.vfsforgit.usernotification.plist b/GVFS/GVFS.Notifications/VFSForGit.Mac/org.vfsforgit.usernotification.plist deleted file mode 100644 index ed609ec568..0000000000 --- a/GVFS/GVFS.Notifications/VFSForGit.Mac/org.vfsforgit.usernotification.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - EnvironmentVariables - - - PATH - /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - - Label - org.vfsforgit.usernotification - ProgramArguments - - /Library/Application Support/VFS For Git/VFS For Git.app/Contents/MacOS/VFS For Git - - WorkingDirectory - /usr/local/vfsforgit - ProcessType - Interactive - LimitLoadToSessionType - Aqua - Disabled - - OnDemand - - KeepAlive - - RunAtLoad - - - diff --git a/GVFS/GVFS.Platform.POSIX/GVFS.Platform.POSIX.csproj b/GVFS/GVFS.Platform.POSIX/GVFS.Platform.POSIX.csproj deleted file mode 100644 index 9c267f5381..0000000000 --- a/GVFS/GVFS.Platform.POSIX/GVFS.Platform.POSIX.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - netcoreapp2.1;netstandard2.0 - x64 - true - true - - - - $(GVFSVersion) - - - $(GVFSVersion) - - - - $(GVFSVersion) - - - - - - - - - - all - - - diff --git a/GVFS/GVFS.Platform.POSIX/POSIXFileSystem.Shared.cs b/GVFS/GVFS.Platform.POSIX/POSIXFileSystem.Shared.cs deleted file mode 100644 index 212eeefeb4..0000000000 --- a/GVFS/GVFS.Platform.POSIX/POSIXFileSystem.Shared.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace GVFS.Platform.POSIX -{ - public partial class POSIXFileSystem - { - public static bool TryGetNormalizedPathImplementation(string path, out string normalizedPath, out string errorMessage) - { - // TODO(#1358): Properly determine normalized paths (e.g. across links) - errorMessage = null; - normalizedPath = path; - return true; - } - } -} diff --git a/GVFS/GVFS.Platform.POSIX/POSIXFileSystem.cs b/GVFS/GVFS.Platform.POSIX/POSIXFileSystem.cs deleted file mode 100644 index c1ff51c2ac..0000000000 --- a/GVFS/GVFS.Platform.POSIX/POSIXFileSystem.cs +++ /dev/null @@ -1,108 +0,0 @@ -using GVFS.Common; -using GVFS.Common.FileSystem; -using GVFS.Common.Tracing; -using System; -using System.IO; -using System.Runtime.InteropServices; - -namespace GVFS.Platform.POSIX -{ - public abstract partial class POSIXFileSystem : IPlatformFileSystem - { - // https://github.com/dotnet/corefx/blob/103639b6ff5aa6ab6097f70732530e411817f09b/src/Common/src/CoreLib/Interop/Unix/System.Native/Interop.OpenFlags.cs#L12 - [Flags] - public enum OpenFlags - { - // Access modes (mutually exclusive) - O_RDONLY = 0x0000, - O_WRONLY = 0x0001, - O_RDWR = 0x0002, - - // Flags (combinable) - O_CLOEXEC = 0x0010, - O_CREAT = 0x0020, - O_EXCL = 0x0040, - O_TRUNC = 0x0080, - O_SYNC = 0x0100, - } - - public bool SupportsFileMode { get; } = true; - - public void FlushFileBuffers(string path) - { - // TODO(#1057): Use native API to flush file - } - - public void MoveAndOverwriteFile(string sourceFileName, string destinationFilename) - { - if (Rename(sourceFileName, destinationFilename) != 0) - { - NativeMethods.ThrowLastWin32Exception($"Failed to rename {sourceFileName} to {destinationFilename}"); - } - } - - public abstract void ChangeMode(string path, ushort mode); - - public bool TryGetNormalizedPath(string path, out string normalizedPath, out string errorMessage) - { - return POSIXFileSystem.TryGetNormalizedPathImplementation(path, out normalizedPath, out errorMessage); - } - - public void SetDirectoryLastWriteTime(string path, DateTime lastWriteTime, out bool directoryExists) - { - directoryExists = Directory.Exists(path); - if (directoryExists) - { - Directory.SetLastWriteTime(path, lastWriteTime); - } - } - - public abstract bool HydrateFile(string fileName, byte[] buffer); - - public abstract bool IsExecutable(string fileName); - - public abstract bool IsSocket(string fileName); - - public bool TryCreateDirectoryAccessibleByAuthUsers(string directoryPath, out string error, ITracer tracer = null) - { - try - { - Directory.CreateDirectory(directoryPath); - error = null; - return true; - } - catch (Exception e) when (e is IOException || e is UnauthorizedAccessException) - { - if (tracer != null) - { - EventMetadata metadataData = new EventMetadata(); - metadataData.Add("Exception", e.ToString()); - metadataData.Add(nameof(directoryPath), directoryPath); - tracer.RelatedError(metadataData, $"{nameof(this.TryCreateDirectoryAccessibleByAuthUsers)}: Failed to create directory"); - } - - error = e.Message; - return false; - } - } - - public bool TryCreateDirectoryWithAdminAndUserModifyPermissions(string directoryPath, out string error) - { - throw new NotImplementedException(); - } - - public bool TryCreateOrUpdateDirectoryToAdminModifyPermissions(ITracer tracer, string directoryPath, out string error) - { - throw new NotImplementedException(); - } - - public virtual bool IsFileSystemSupported(string path, out string error) - { - error = null; - return true; - } - - [DllImport("libc", EntryPoint = "rename", SetLastError = true)] - private static extern int Rename(string oldPath, string newPath); - } -} diff --git a/GVFS/GVFS.Platform.POSIX/POSIXGitInstallation.cs b/GVFS/GVFS.Platform.POSIX/POSIXGitInstallation.cs deleted file mode 100644 index 5c63532dde..0000000000 --- a/GVFS/GVFS.Platform.POSIX/POSIXGitInstallation.cs +++ /dev/null @@ -1,32 +0,0 @@ -using GVFS.Common; -using GVFS.Common.Git; -using System.IO; - -namespace GVFS.Platform.POSIX -{ - public class POSIXGitInstallation : IGitInstallation - { - private const string GitProcessName = "git"; - - public bool GitExists(string gitBinPath) - { - if (!string.IsNullOrWhiteSpace(gitBinPath)) - { - return File.Exists(gitBinPath); - } - - return this.GetInstalledGitBinPath() != null; - } - - public string GetInstalledGitBinPath() - { - ProcessResult result = ProcessHelper.Run("which", args: "git", redirectOutput: true); - if (result.ExitCode != 0) - { - return null; - } - - return result.Output.Trim(); - } - } -} diff --git a/GVFS/GVFS.Platform.POSIX/POSIXPlatform.Shared.cs b/GVFS/GVFS.Platform.POSIX/POSIXPlatform.Shared.cs deleted file mode 100644 index 0a9d642e7f..0000000000 --- a/GVFS/GVFS.Platform.POSIX/POSIXPlatform.Shared.cs +++ /dev/null @@ -1,66 +0,0 @@ -using GVFS.Common; -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; - -namespace GVFS.Platform.POSIX -{ - public abstract partial class POSIXPlatform - { - public static bool IsElevatedImplementation() - { - int euid = GetEuid(); - return euid == 0; - } - - public static bool IsProcessActiveImplementation(int processId) - { - try - { - Process process = Process.GetProcessById(processId); - } - catch (ArgumentException) - { - return false; - } - - return true; - } - - public static string GetNamedPipeNameImplementation(string enlistmentRoot, string dotGVFSRoot) - { - // Pipes are stored as files on POSIX, use a rooted pipe name to keep full control of the location of the file - return Path.Combine(enlistmentRoot, dotGVFSRoot, "GVFS_NetCorePipe"); - } - - public static bool IsConsoleOutputRedirectedToFileImplementation() - { - // TODO(#1355): Implement proper check - return false; - } - - public static bool TryGetGVFSEnlistmentRootImplementation(string directory, string dotGVFSRoot, out string enlistmentRoot, out string errorMessage) - { - enlistmentRoot = null; - - string finalDirectory; - if (!POSIXFileSystem.TryGetNormalizedPathImplementation(directory, out finalDirectory, out errorMessage)) - { - return false; - } - - enlistmentRoot = Paths.GetRoot(finalDirectory, dotGVFSRoot); - if (enlistmentRoot == null) - { - errorMessage = $"Failed to find the root directory for {dotGVFSRoot} in {finalDirectory}"; - return false; - } - - return true; - } - - [DllImport("libc", EntryPoint = "geteuid", SetLastError = true)] - private static extern int GetEuid(); - } -} diff --git a/GVFS/GVFS.Platform.POSIX/POSIXPlatform.cs b/GVFS/GVFS.Platform.POSIX/POSIXPlatform.cs deleted file mode 100644 index 19bec8c9af..0000000000 --- a/GVFS/GVFS.Platform.POSIX/POSIXPlatform.cs +++ /dev/null @@ -1,302 +0,0 @@ -using GVFS.Common; -using GVFS.Common.Git; -using GVFS.Common.Tracing; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.IO.Pipes; -using System.Linq; -using System.Runtime.InteropServices; -using System.Security; - -namespace GVFS.Platform.POSIX -{ - public abstract partial class POSIXPlatform : GVFSPlatform - { - private const int StdInFileNo = 0; // STDIN_FILENO -> standard input file descriptor - private const int StdOutFileNo = 1; // STDOUT_FILENO -> standard output file descriptor - private const int StdErrFileNo = 2; // STDERR_FILENO -> standard error file descriptor - - protected POSIXPlatform() : this( - underConstruction: new UnderConstructionFlags( - supportsGVFSUpgrade: false, - supportsGVFSConfig: false, - supportsNuGetEncryption: false, - supportsNuGetVerification: false)) - { - } - - protected POSIXPlatform(UnderConstructionFlags underConstruction) - : base(underConstruction) - { - } - - public override IGitInstallation GitInstallation { get; } = new POSIXGitInstallation(); - - public override void ConfigureVisualStudio(string gitBinPath, ITracer tracer) - { - } - - public override bool TryGetGVFSHooksVersion(out string hooksVersion, out string error) - { - // TODO(#1044): Get the hooks version rather than the GVFS version (and share that code with the Windows platform) - hooksVersion = ProcessHelper.GetCurrentProcessVersion(); - error = null; - return true; - } - - public override bool TryInstallGitCommandHooks(GVFSContext context, string executingDirectory, string hookName, string commandHookPath, out string errorMessage) - { - errorMessage = null; - - string gvfsHooksPath = Path.Combine(executingDirectory, GVFSPlatform.Instance.Constants.GVFSHooksExecutableName); - - File.WriteAllText( - commandHookPath, - $"#!/bin/sh\n{gvfsHooksPath} {hookName} \"$@\""); - GVFSPlatform.Instance.FileSystem.ChangeMode(commandHookPath, Convert.ToUInt16("755", 8)); - - return true; - } - - public override bool TryVerifyAuthenticodeSignature(string path, out string subject, out string issuer, out string error) - { - throw new NotImplementedException(); - } - - public override bool IsProcessActive(int processId) - { - return POSIXPlatform.IsProcessActiveImplementation(processId); - } - - public override void IsServiceInstalledAndRunning(string name, out bool installed, out bool running) - { - throw new NotImplementedException(); - } - - public override void StartBackgroundVFS4GProcess(ITracer tracer, string programName, string[] args) - { - string programArguments = string.Empty; - try - { - programArguments = string.Join(" ", args.Select(arg => arg.Contains(' ') ? "\"" + arg + "\"" : arg)); - ProcessStartInfo processInfo = new ProcessStartInfo(programName, programArguments); - - // Redirecting stdin/out/err ensures that all standard input/output file descriptors are properly closed - // by dup2 before execve is called for the child process - // (see https://github.com/dotnet/corefx/blob/b10e8d67b260e26f2e47750cf96669e6f48e774d/src/Native/Unix/System.Native/pal_process.c#L381) - // - // Testing has shown that without redirecting stdin/err/out code like this: - // - // string result = process.StandardOutput.ReadToEnd(); - // process.WaitForExit(); - // - // That waits on a `gvfs` verb to exit can hang in the WaitForExit() call because the chuild process has inheritied - // standard input/output handle(s), and redirecting those streams before spawing the process appears to be the only - // way to ensure they're properly closed. - // - // Note that this approach requires that the child process know that it needs to redirect its standard input/output to /dev/null and - // so this method can only be used with VFS4G processes that are aware they're being launched in the background - processInfo.RedirectStandardError = true; - processInfo.RedirectStandardInput = true; - processInfo.RedirectStandardOutput = true; - - Process executingProcess = new Process(); - executingProcess.StartInfo = processInfo; - executingProcess.Start(); - } - catch (Exception ex) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add(nameof(programName), programName); - metadata.Add(nameof(programArguments), programArguments); - metadata.Add("Exception", ex.ToString()); - tracer.RelatedError(metadata, "Failed to start background process."); - throw; - } - } - - public override void PrepareProcessToRunInBackground() - { - int devNullIn = Open("/dev/null", (int)POSIXFileSystem.OpenFlags.O_RDONLY); - if (devNullIn == -1) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), "Unable to open /dev/null for reading"); - } - - int devNullOut = Open("/dev/null", (int)POSIXFileSystem.OpenFlags.O_WRONLY); - if (devNullOut == -1) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), "Unable to open /dev/null for writing"); - } - - // Redirect stdout/stdin/stderr to "/dev/null" - if (Dup2(devNullIn, StdInFileNo) == -1 || - Dup2(devNullOut, StdOutFileNo) == -1 || - Dup2(devNullOut, StdErrFileNo) == -1) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), "Error redirecting stdout/stdin/stderr to /dev/null"); - } - - Close(devNullIn); - Close(devNullOut); - - // Become session leader of a new session - if (SetSid() == -1) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), "Failed to become session leader"); - } - } - - public override NamedPipeServerStream CreatePipeByName(string pipeName) - { - NamedPipeServerStream pipe = new NamedPipeServerStream( - pipeName, - PipeDirection.InOut, - NamedPipeServerStream.MaxAllowedServerInstances, - PipeTransmissionMode.Byte, - PipeOptions.WriteThrough | PipeOptions.Asynchronous, - 0, // default inBufferSize - 0); // default outBufferSize) - - return pipe; - } - - public override string GetCurrentUser() - { - return Getuid().ToString(); - } - - public override string GetUserIdFromLoginSessionId(int sessionId, ITracer tracer) - { - // There are no separate User and Session Ids on POSIX platforms. - return sessionId.ToString(); - } - - public override Dictionary GetPhysicalDiskInfo(string path, bool sizeStatsOnly) - { - // TODO(#1356): Collect disk information - Dictionary result = new Dictionary(); - result.Add("GetPhysicalDiskInfo", "Not yet implemented on POSIX"); - return result; - } - - public override string GetGVFSServiceNamedPipeName(string serviceName) - { - // Pipes are stored as files on POSIX, use a rooted pipe name - // in the same location as the service to keep full control of the location of the file - return this.GetSecureDataRootForGVFSComponent(serviceName) + ".pipe"; - } - - public override bool IsConsoleOutputRedirectedToFile() - { - return POSIXPlatform.IsConsoleOutputRedirectedToFileImplementation(); - } - - public override bool IsElevated() - { - return POSIXPlatform.IsElevatedImplementation(); - } - - public override bool TryGetDefaultLocalCacheRoot(string enlistmentRoot, out string localCacheRoot, out string localCacheRootError) - { - string homeDirectory; - - try - { - homeDirectory = Environment.GetEnvironmentVariable("HOME"); - } - catch (SecurityException e) - { - localCacheRoot = null; - localCacheRootError = $"Failed to read $HOME, insufficient permission: {e.Message}"; - return false; - } - - if (string.IsNullOrEmpty(homeDirectory)) - { - localCacheRoot = null; - localCacheRootError = "$HOME empty or not found"; - return false; - } - - try - { - localCacheRoot = Path.Combine(homeDirectory, GVFSConstants.DefaultGVFSCacheFolderName); - localCacheRootError = null; - return true; - } - catch (ArgumentException e) - { - localCacheRoot = null; - localCacheRootError = $"Failed to build local cache path using $HOME('{homeDirectory}'): {e.Message}"; - return false; - } - } - - public override bool IsGitStatusCacheSupported() - { - // Git status cache is only supported on Windows - return false; - } - - public override bool TryKillProcessTree(int processId, out int exitCode, out string error) - { - ProcessResult result = ProcessHelper.Run("pkill", $"-P {processId}"); - error = result.Errors; - exitCode = result.ExitCode; - return result.ExitCode == 0; - } - - public override bool TryCopyPanicLogs(string copyToDir, out string error) - { - error = null; - return true; - } - - [DllImport("libc", EntryPoint = "getuid", SetLastError = true)] - private static extern uint Getuid(); - - [DllImport("libc", EntryPoint = "setsid", SetLastError = true)] - private static extern int SetSid(); - - [DllImport("libc", EntryPoint = "open", SetLastError = true)] - private static extern int Open(string path, int flag); - - [DllImport("libc", EntryPoint = "close", SetLastError = true)] - private static extern int Close(int filedes); - - [DllImport("libc", EntryPoint = "dup2", SetLastError = true)] - private static extern int Dup2(int oldfd, int newfd); - - public abstract class POSIXPlatformConstants : GVFSPlatformConstants - { - public override string ExecutableExtension - { - get { return string.Empty; } - } - - public override string GVFSExecutableName - { - get { return "gvfs"; } - } - - public override string ProgramLocaterCommand - { - get { return "which"; } - } - - public override HashSet UpgradeBlockingProcesses - { - get { return new HashSet(GVFSPlatform.Instance.Constants.PathComparer) { "GVFS.Mount", "git", "wish" }; } - } - - public override bool SupportsUpgradeWhileRunning => true; - - // Documented here (in the addressing section): https://www.unix.com/man-page/linux/7/unix/ - public override int MaxPipePathLength => 108; - } - } -} diff --git a/GVFS/GVFS.PlatformLoader/PlatformLoader.Mac.cs b/GVFS/GVFS.PlatformLoader/PlatformLoader.Mac.cs deleted file mode 100644 index fb2a642ec7..0000000000 --- a/GVFS/GVFS.PlatformLoader/PlatformLoader.Mac.cs +++ /dev/null @@ -1,21 +0,0 @@ -using GVFS.Common; -using GVFS.Common.Git; -using GVFS.Platform.Mac; -using GVFS.Virtualization.FileSystem; - -namespace GVFS.PlatformLoader -{ - public static class GVFSPlatformLoader - { - public static FileSystemVirtualizer CreateFileSystemVirtualizer(GVFSContext context, GVFSGitObjects gitObjects) - { - return new MacFileSystemVirtualizer(context, gitObjects); - } - - public static void Initialize() - { - GVFSPlatform.Register(new MacPlatform()); - return; - } - } -} \ No newline at end of file diff --git a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.pbxproj b/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.pbxproj deleted file mode 100644 index 4a3b3b90aa..0000000000 --- a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.pbxproj +++ /dev/null @@ -1,280 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 267A836C20EE9F27005E6B60 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 267A836B20EE9F27005E6B60 /* main.cpp */; }; - 26E839D920FD4026004E53CE /* common.posix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E839D620FD29D6004E53CE /* common.posix.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 267A836620EE9F27005E6B60 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 267A836820EE9F27005E6B60 /* GVFS.PostIndexChangedHook */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GVFS.PostIndexChangedHook; sourceTree = BUILT_PRODUCTS_DIR; }; - 267A836B20EE9F27005E6B60 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = SOURCE_ROOT; }; - 2686926B20EFF2610080F95D /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../GVFS.NativeHooks.Common/common.h; sourceTree = SOURCE_ROOT; }; - 26E839D620FD29D6004E53CE /* common.posix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.posix.cpp; path = ../GVFS.NativeHooks.Common/common.posix.cpp; sourceTree = SOURCE_ROOT; }; - 26E839DB20FD5918004E53CE /* stdafx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdafx.h; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 267A836520EE9F27005E6B60 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 2673FD8620EBD84A00B64B7F = { - isa = PBXGroup; - children = ( - 26E839DB20FD5918004E53CE /* stdafx.h */, - 26E839D620FD29D6004E53CE /* common.posix.cpp */, - 2686926B20EFF2610080F95D /* common.h */, - 267A836B20EE9F27005E6B60 /* main.cpp */, - 267A836920EE9F27005E6B60 /* Products */, - ); - sourceTree = ""; - }; - 267A836920EE9F27005E6B60 /* Products */ = { - isa = PBXGroup; - children = ( - 267A836820EE9F27005E6B60 /* GVFS.PostIndexChangedHook */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 267A836720EE9F27005E6B60 /* GVFS.PostIndexChangedHook */ = { - isa = PBXNativeTarget; - buildConfigurationList = 267A836F20EE9F27005E6B60 /* Build configuration list for PBXNativeTarget "GVFS.PostIndexChangedHook" */; - buildPhases = ( - 267A836420EE9F27005E6B60 /* Sources */, - 267A836520EE9F27005E6B60 /* Frameworks */, - 267A836620EE9F27005E6B60 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GVFS.PostIndexChangedHook; - productName = GVFS.PostIndexChangedHook; - productReference = 267A836820EE9F27005E6B60 /* GVFS.PostIndexChangedHook */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 2673FD8720EBD84A00B64B7F /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0940; - TargetAttributes = { - 267A836720EE9F27005E6B60 = { - CreatedOnToolsVersion = 9.4.1; - }; - }; - }; - buildConfigurationList = 2673FD8A20EBD84A00B64B7F /* Build configuration list for PBXProject "GVFS.PostIndexChangedHook.Mac" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 2673FD8620EBD84A00B64B7F; - productRefGroup = 267A836920EE9F27005E6B60 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 267A836720EE9F27005E6B60 /* GVFS.PostIndexChangedHook */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 267A836420EE9F27005E6B60 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 267A836C20EE9F27005E6B60 /* main.cpp in Sources */, - 26E839D920FD4026004E53CE /* common.posix.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 2673FD8B20EBD84A00B64B7F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Debug; - }; - 2673FD8C20EBD84A00B64B7F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; - 267A836D20EE9F27005E6B60 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 267A836E20EE9F27005E6B60 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2673FD8A20EBD84A00B64B7F /* Build configuration list for PBXProject "GVFS.PostIndexChangedHook.Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2673FD8B20EBD84A00B64B7F /* Debug */, - 2673FD8C20EBD84A00B64B7F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 267A836F20EE9F27005E6B60 /* Build configuration list for PBXNativeTarget "GVFS.PostIndexChangedHook" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 267A836D20EE9F27005E6B60 /* Debug */, - 267A836E20EE9F27005E6B60 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 2673FD8720EBD84A00B64B7F /* Project object */; -} diff --git a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 4054d401b8..0000000000 --- a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.pbxproj b/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.pbxproj deleted file mode 100644 index 5e9c95a823..0000000000 --- a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.pbxproj +++ /dev/null @@ -1,286 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 2673FD9620EBDAA900B64B7F /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2673FD9520EBDAA900B64B7F /* main.cpp */; }; - 2673FD9C20EBDEA500B64B7F /* packet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2673FD9B20EBDEA500B64B7F /* packet.cpp */; }; - 26E839D820FD387D004E53CE /* common.posix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E839D720FD29EC004E53CE /* common.posix.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 2673FD9020EBDAA900B64B7F /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 2673FD9220EBDAA900B64B7F /* GVFS.ReadObjectHook */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GVFS.ReadObjectHook; sourceTree = BUILT_PRODUCTS_DIR; }; - 2673FD9520EBDAA900B64B7F /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = SOURCE_ROOT; }; - 2673FD9A20EBDEA500B64B7F /* packet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = packet.h; sourceTree = SOURCE_ROOT; }; - 2673FD9B20EBDEA500B64B7F /* packet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = packet.cpp; sourceTree = SOURCE_ROOT; }; - 2673FD9D20EBDEAA00B64B7F /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../GVFS.NativeHooks.Common/common.h; sourceTree = SOURCE_ROOT; }; - 26E839D720FD29EC004E53CE /* common.posix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.posix.cpp; path = ../GVFS.NativeHooks.Common/common.posix.cpp; sourceTree = SOURCE_ROOT; }; - 26E839DA20FD58B8004E53CE /* stdafx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdafx.h; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 2673FD8F20EBDAA900B64B7F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 2673FD7F20EBD81D00B64B7F = { - isa = PBXGroup; - children = ( - 26E839DA20FD58B8004E53CE /* stdafx.h */, - 26E839D720FD29EC004E53CE /* common.posix.cpp */, - 2673FD9D20EBDEAA00B64B7F /* common.h */, - 2673FD9B20EBDEA500B64B7F /* packet.cpp */, - 2673FD9A20EBDEA500B64B7F /* packet.h */, - 2673FD9520EBDAA900B64B7F /* main.cpp */, - 2673FD9320EBDAA900B64B7F /* Products */, - ); - sourceTree = ""; - }; - 2673FD9320EBDAA900B64B7F /* Products */ = { - isa = PBXGroup; - children = ( - 2673FD9220EBDAA900B64B7F /* GVFS.ReadObjectHook */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 2673FD9120EBDAA900B64B7F /* GVFS.ReadObjectHook */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2673FD9720EBDAA900B64B7F /* Build configuration list for PBXNativeTarget "GVFS.ReadObjectHook" */; - buildPhases = ( - 2673FD8E20EBDAA900B64B7F /* Sources */, - 2673FD8F20EBDAA900B64B7F /* Frameworks */, - 2673FD9020EBDAA900B64B7F /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GVFS.ReadObjectHook; - productName = GVFS.ReadObjectHook; - productReference = 2673FD9220EBDAA900B64B7F /* GVFS.ReadObjectHook */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 2673FD8020EBD81D00B64B7F /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0940; - TargetAttributes = { - 2673FD9120EBDAA900B64B7F = { - CreatedOnToolsVersion = 9.4.1; - }; - }; - }; - buildConfigurationList = 2673FD8320EBD81D00B64B7F /* Build configuration list for PBXProject "GVFS.ReadObjectHook.Mac" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 2673FD7F20EBD81D00B64B7F; - productRefGroup = 2673FD9320EBDAA900B64B7F /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 2673FD9120EBDAA900B64B7F /* GVFS.ReadObjectHook */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 2673FD8E20EBDAA900B64B7F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 26E839D820FD387D004E53CE /* common.posix.cpp in Sources */, - 2673FD9620EBDAA900B64B7F /* main.cpp in Sources */, - 2673FD9C20EBDEA500B64B7F /* packet.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 2673FD8420EBD81D00B64B7F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Debug; - }; - 2673FD8520EBD81D00B64B7F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; - 2673FD9820EBDAA900B64B7F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 2673FD9920EBDAA900B64B7F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2673FD8320EBD81D00B64B7F /* Build configuration list for PBXProject "GVFS.ReadObjectHook.Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2673FD8420EBD81D00B64B7F /* Debug */, - 2673FD8520EBD81D00B64B7F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2673FD9720EBDAA900B64B7F /* Build configuration list for PBXNativeTarget "GVFS.ReadObjectHook" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2673FD9820EBDAA900B64B7F /* Debug */, - 2673FD9920EBDAA900B64B7F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 2673FD8020EBD81D00B64B7F /* Project object */; -} diff --git a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index fd68549aed..0000000000 --- a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/GVFS/GVFS.Service/GVFSMountProcess.Mac.cs b/GVFS/GVFS.Service/GVFSMountProcess.Mac.cs deleted file mode 100644 index 4b9dfd231a..0000000000 --- a/GVFS/GVFS.Service/GVFSMountProcess.Mac.cs +++ /dev/null @@ -1,87 +0,0 @@ -using GVFS.Common; -using GVFS.Common.Tracing; -using System.Diagnostics; -using System.IO; - -namespace GVFS.Service -{ - public class GVFSMountProcess : IRepoMounter - { - private const string ExecutablePath = "/bin/launchctl"; - - private MountLauncher processLauncher; - private ITracer tracer; - - public GVFSMountProcess(ITracer tracer, MountLauncher processLauncher = null) - { - this.tracer = tracer; - this.processLauncher = processLauncher ?? new MountLauncher(tracer); - } - - public bool MountRepository(string repoRoot, int sessionId) - { - string arguments = string.Format( - "asuser {0} {1} mount {2}", - sessionId, - Path.Combine(GVFSPlatform.Instance.Constants.GVFSBinDirectoryPath, GVFSPlatform.Instance.Constants.GVFSExecutableName), - repoRoot); - - if (!this.processLauncher.LaunchProcess(ExecutablePath, arguments, repoRoot)) - { - this.tracer.RelatedError($"{nameof(this.MountRepository)}: Unable to start the GVFS process."); - return false; - } - - string errorMessage; - if (!this.processLauncher.WaitUntilMounted(this.tracer, repoRoot, false, out errorMessage)) - { - this.tracer.RelatedError(errorMessage); - return false; - } - - return true; - } - - public class MountLauncher - { - private ITracer tracer; - - public MountLauncher(ITracer tracer) - { - this.tracer = tracer; - } - - public virtual bool LaunchProcess(string executablePath, string arguments, string workingDirectory) - { - ProcessStartInfo processInfo = new ProcessStartInfo(executablePath); - processInfo.Arguments = arguments; - processInfo.WindowStyle = ProcessWindowStyle.Hidden; - processInfo.WorkingDirectory = workingDirectory; - processInfo.UseShellExecute = false; - processInfo.RedirectStandardOutput = true; - - ProcessResult result = ProcessHelper.Run(processInfo); - if (result.ExitCode != 0) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("Area", nameof(GVFSMountProcess)); - metadata.Add(nameof(executablePath), executablePath); - metadata.Add(nameof(arguments), arguments); - metadata.Add(nameof(workingDirectory), workingDirectory); - metadata.Add(nameof(result.ExitCode), result.ExitCode); - metadata.Add(nameof(result.Errors), result.Errors); - - this.tracer.RelatedError(metadata, $"{nameof(this.LaunchProcess)} ERROR: Could not launch {executablePath}"); - return false; - } - - return true; - } - - public virtual bool WaitUntilMounted(ITracer tracer, string enlistmentRoot, bool unattended, out string errorMessage) - { - return GVFSEnlistment.WaitUntilMounted(tracer, enlistmentRoot, unattended: false, errorMessage: out errorMessage); - } - } - } -} diff --git a/GVFS/GVFS.Service/GVFSService.Mac.cs b/GVFS/GVFS.Service/GVFSService.Mac.cs deleted file mode 100644 index 5a706d4afc..0000000000 --- a/GVFS/GVFS.Service/GVFSService.Mac.cs +++ /dev/null @@ -1,109 +0,0 @@ -using GVFS.Common; -using GVFS.Common.NamedPipes; -using GVFS.Common.Tracing; -using GVFS.Service.Handlers; -using System; -using System.Threading; - -namespace GVFS.Service -{ - public class GVFSService - { - public const string ServiceNameArgPrefix = "--servicename="; - - private const string EtwArea = nameof(GVFSService); - - private ITracer tracer; - private Thread serviceThread; - private ManualResetEvent serviceStopped; - private string serviceName; - private IRepoRegistry repoRegistry; - private RequestHandler requestHandler; - - public GVFSService( - ITracer tracer, - string serviceName, - IRepoRegistry repoRegistry) - { - this.tracer = tracer; - this.repoRegistry = repoRegistry; - this.serviceName = serviceName; - - this.serviceStopped = new ManualResetEvent(false); - this.serviceThread = new Thread(this.ServiceThreadMain); - this.requestHandler = new RequestHandler(this.tracer, EtwArea, this.repoRegistry); - } - - public void Run() - { - try - { - this.AutoMountReposForUser(); - - if (!string.IsNullOrEmpty(this.serviceName)) - { - string pipeName = GVFSPlatform.Instance.GetGVFSServiceNamedPipeName(this.serviceName); - this.tracer.RelatedInfo("Starting pipe server with name: " + pipeName); - - using (NamedPipeServer pipeServer = NamedPipeServer.StartNewServer( - pipeName, - this.tracer, - this.requestHandler.HandleRequest)) - { - this.serviceThread.Start(); - this.serviceThread.Join(); - } - } - else - { - this.tracer.RelatedError("No name specified for Service Pipe."); - } - } - catch (Exception e) - { - this.LogExceptionAndExit(e, nameof(this.Run)); - } - } - - private void ServiceThreadMain() - { - try - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("Version", ProcessHelper.GetCurrentProcessVersion()); - this.tracer.RelatedEvent(EventLevel.Informational, $"{nameof(GVFSService)}_{nameof(this.ServiceThreadMain)}", metadata); - - this.serviceStopped.WaitOne(); - this.serviceStopped.Dispose(); - } - catch (Exception e) - { - this.LogExceptionAndExit(e, nameof(this.ServiceThreadMain)); - } - } - - private void AutoMountReposForUser() - { - string currentUser = GVFSPlatform.Instance.GetCurrentUser(); - if (int.TryParse(currentUser, out int sessionId)) - { - // On Mac, there is no separate session Id. currentUser is used as sessionId - this.repoRegistry.AutoMountRepos(currentUser, sessionId); - this.repoRegistry.TraceStatus(); - } - else - { - this.tracer.RelatedError($"{nameof(this.AutoMountReposForUser)} Error: could not parse current user({currentUser}) info from RepoRegistry."); - } - } - - private void LogExceptionAndExit(Exception e, string method) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("Area", EtwArea); - metadata.Add("Exception", e.ToString()); - this.tracer.RelatedError(metadata, "Unhandled exception in " + method); - Environment.Exit((int)ReturnCode.GenericError); - } - } -} diff --git a/GVFS/GVFS.Service/Handlers/NotificationHandler.Mac.cs b/GVFS/GVFS.Service/Handlers/NotificationHandler.Mac.cs deleted file mode 100644 index f38be1a57e..0000000000 --- a/GVFS/GVFS.Service/Handlers/NotificationHandler.Mac.cs +++ /dev/null @@ -1,45 +0,0 @@ -using GVFS.Common.NamedPipes; -using GVFS.Common.Tracing; -using System; -using System.IO; - -namespace GVFS.Service.Handlers -{ - public class NotificationHandler : INotificationHandler - { - private const string NotificationServerPipeName = "vfsforgit.notification"; - private ITracer tracer; - - public NotificationHandler(ITracer tracer) - { - this.tracer = tracer; - } - - public void SendNotification(NamedPipeMessages.Notification.Request request) - { - string pipeName = Path.Combine(Path.GetTempPath(), NotificationServerPipeName); - using (NamedPipeClient client = new NamedPipeClient(pipeName)) - { - if (client.Connect()) - { - try - { - client.SendRequest(request.ToMessage()); - } - catch (Exception ex) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("Area", nameof(NotificationHandler)); - metadata.Add("Exception", ex.ToString()); - metadata.Add(TracingConstants.MessageKey.ErrorMessage, "MacOS notification display error"); - this.tracer.RelatedError(metadata, $"MacOS notification: {request.Title} - {request.Message}."); - } - } - else - { - this.tracer.RelatedError($"ERROR: Communication failure with native notification display tool. Notification info: {request.Title} - {request.Message}."); - } - } - } - } -} diff --git a/GVFS/GVFS.Service/Mac/org.vfsforgit.service.plist b/GVFS/GVFS.Service/Mac/org.vfsforgit.service.plist deleted file mode 100644 index fee588529e..0000000000 --- a/GVFS/GVFS.Service/Mac/org.vfsforgit.service.plist +++ /dev/null @@ -1,38 +0,0 @@ - - - - - EnvironmentVariables - - - PATH - /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - - Label - org.vfsforgit.service - ProgramArguments - - /usr/local/vfsforgit/GVFS.Service - - WorkingDirectory - /usr/local/vfsforgit - ProcessType - Interactive - LimitLoadToSessionType - Aqua - Disabled - - OnDemand - - KeepAlive - - RunAtLoad - - - diff --git a/GVFS/GVFS.Service/Program.Mac.cs b/GVFS/GVFS.Service/Program.Mac.cs deleted file mode 100644 index d3b4b3a974..0000000000 --- a/GVFS/GVFS.Service/Program.Mac.cs +++ /dev/null @@ -1,67 +0,0 @@ -using GVFS.Common; -using GVFS.Common.FileSystem; -using GVFS.Common.Tracing; -using GVFS.PlatformLoader; -using GVFS.Service.Handlers; -using System; -using System.IO; -using System.Linq; - -namespace GVFS.Service -{ - public static class Program - { - public static void Main(string[] args) - { - GVFSPlatformLoader.Initialize(); - - AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler; - - using (JsonTracer tracer = new JsonTracer(GVFSConstants.Service.ServiceName, GVFSConstants.Service.ServiceName)) - { - CreateService(tracer, args).Run(); - } - } - - private static GVFSService CreateService(JsonTracer tracer, string[] args) - { - string serviceName = args.FirstOrDefault(arg => arg.StartsWith(GVFSService.ServiceNameArgPrefix, StringComparison.OrdinalIgnoreCase)); - if (serviceName != null) - { - serviceName = serviceName.Substring(GVFSService.ServiceNameArgPrefix.Length); - } - else - { - serviceName = GVFSConstants.Service.ServiceName; - } - - GVFSPlatform gvfsPlatform = GVFSPlatform.Instance; - - string logFilePath = GVFSPlatform.Instance.GetLogsDirectoryForGVFSComponent(serviceName); - Directory.CreateDirectory(logFilePath); - - tracer.AddLogFileEventListener( - GVFSEnlistment.GetNewGVFSLogFileName(logFilePath, GVFSConstants.LogFileTypes.Service), - EventLevel.Informational, - Keywords.Any); - - string serviceDataLocation = gvfsPlatform.GetSecureDataRootForGVFSComponent(serviceName); - RepoRegistry repoRegistry = new RepoRegistry( - tracer, - new PhysicalFileSystem(), - serviceDataLocation, - new GVFSMountProcess(tracer), - new NotificationHandler(tracer)); - - return new GVFSService(tracer, serviceName, repoRegistry); - } - - private static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) - { - using (JsonTracer tracer = new JsonTracer(GVFSConstants.Service.ServiceName, GVFSConstants.Service.ServiceName)) - { - tracer.RelatedError($"Unhandled exception in GVFS.Service: {e.ExceptionObject.ToString()}"); - } - } - } -} diff --git a/GVFS/GVFS.Upgrader/MacUpgradeOrchestrator.cs b/GVFS/GVFS.Upgrader/MacUpgradeOrchestrator.cs deleted file mode 100644 index 3d8a44a041..0000000000 --- a/GVFS/GVFS.Upgrader/MacUpgradeOrchestrator.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace GVFS.Upgrader -{ - public class MacUpgradeOrchestrator : UpgradeOrchestrator - { - public MacUpgradeOrchestrator(UpgradeOptions options) - : base(options) - { - } - - protected override bool TryMountRepositories(out string consoleError) - { - // Mac upgrader does not mount repositories - consoleError = null; - return true; - } - } -} diff --git a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.pbxproj b/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.pbxproj deleted file mode 100644 index 09425066c7..0000000000 --- a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.pbxproj +++ /dev/null @@ -1,280 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 267A836C20EE9F27005E6B60 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 267A836B20EE9F27005E6B60 /* main.cpp */; }; - 26E839D920FD4026004E53CE /* common.posix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E839D620FD29D6004E53CE /* common.posix.cpp */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 267A836620EE9F27005E6B60 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 267A836820EE9F27005E6B60 /* GVFS.VirtualFileSystemHook */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = GVFS.VirtualFileSystemHook; sourceTree = BUILT_PRODUCTS_DIR; }; - 267A836B20EE9F27005E6B60 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = SOURCE_ROOT; }; - 2686926B20EFF2610080F95D /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../GVFS.NativeHooks.Common/common.h; sourceTree = SOURCE_ROOT; }; - 26E839D620FD29D6004E53CE /* common.posix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.posix.cpp; path = ../GVFS.NativeHooks.Common/common.posix.cpp; sourceTree = SOURCE_ROOT; }; - 26E839DB20FD5918004E53CE /* stdafx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdafx.h; sourceTree = SOURCE_ROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 267A836520EE9F27005E6B60 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 2673FD8620EBD84A00B64B7F = { - isa = PBXGroup; - children = ( - 26E839DB20FD5918004E53CE /* stdafx.h */, - 26E839D620FD29D6004E53CE /* common.posix.cpp */, - 2686926B20EFF2610080F95D /* common.h */, - 267A836B20EE9F27005E6B60 /* main.cpp */, - 267A836920EE9F27005E6B60 /* Products */, - ); - sourceTree = ""; - }; - 267A836920EE9F27005E6B60 /* Products */ = { - isa = PBXGroup; - children = ( - 267A836820EE9F27005E6B60 /* GVFS.VirtualFileSystemHook */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 267A836720EE9F27005E6B60 /* GVFS.VirtualFileSystemHook */ = { - isa = PBXNativeTarget; - buildConfigurationList = 267A836F20EE9F27005E6B60 /* Build configuration list for PBXNativeTarget "GVFS.VirtualFileSystemHook" */; - buildPhases = ( - 267A836420EE9F27005E6B60 /* Sources */, - 267A836520EE9F27005E6B60 /* Frameworks */, - 267A836620EE9F27005E6B60 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GVFS.VirtualFileSystemHook; - productName = GVFS.VirtualFileSystemHook; - productReference = 267A836820EE9F27005E6B60 /* GVFS.VirtualFileSystemHook */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 2673FD8720EBD84A00B64B7F /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0940; - TargetAttributes = { - 267A836720EE9F27005E6B60 = { - CreatedOnToolsVersion = 9.4.1; - }; - }; - }; - buildConfigurationList = 2673FD8A20EBD84A00B64B7F /* Build configuration list for PBXProject "GVFS.VirtualFileSystemHook.Mac" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 2673FD8620EBD84A00B64B7F; - productRefGroup = 267A836920EE9F27005E6B60 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 267A836720EE9F27005E6B60 /* GVFS.VirtualFileSystemHook */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 267A836420EE9F27005E6B60 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 267A836C20EE9F27005E6B60 /* main.cpp in Sources */, - 26E839D920FD4026004E53CE /* common.posix.cpp in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 2673FD8B20EBD84A00B64B7F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Debug; - }; - 2673FD8C20EBD84A00B64B7F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - }; - name = Release; - }; - 267A836D20EE9F27005E6B60 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Debug; - }; - 267A836E20EE9F27005E6B60 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Mac Developer"; - CODE_SIGN_STYLE = Automatic; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = UBF8T346G9; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2673FD8A20EBD84A00B64B7F /* Build configuration list for PBXProject "GVFS.VirtualFileSystemHook.Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2673FD8B20EBD84A00B64B7F /* Debug */, - 2673FD8C20EBD84A00B64B7F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 267A836F20EE9F27005E6B60 /* Build configuration list for PBXNativeTarget "GVFS.VirtualFileSystemHook" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 267A836D20EE9F27005E6B60 /* Debug */, - 267A836E20EE9F27005E6B60 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 2673FD8720EBD84A00B64B7F /* Project object */; -} diff --git a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 811d6a7e6a..0000000000 --- a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Mac.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - From 8602d8aa55b7e94224da2b0bb88988fd72bba40b Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:50:43 +0100 Subject: [PATCH 06/35] build: replace GVFS.Build with simpler MSBuild code Replace the GVFS.Build directory and pre-build code with targets and tasks that are better integrated with the rest of the build. --- GVFS/GVFS.Build/.gitignore | 1 - GVFS/GVFS.Build/GVFS.PreBuild.csproj | 215 ------------------ GVFS/GVFS.Build/GVFS.cpp.props | 11 - GVFS/GVFS.Build/GVFS.cs.props | 32 --- GVFS/GVFS.Build/GVFS.props | 17 -- GVFS/GVFS.Build/GVFS.ruleset | 67 ------ GVFS/GVFS.Build/GenerateG4WNugetReference.cs | 31 --- .../GenerateGVFSInstallersNuspec.cs | 53 ----- .../GVFS.Build/GenerateGitVersionConstants.cs | 190 ---------------- GVFS/GVFS.Build/GenerateInstallScripts.cs | 61 ----- GVFS/GVFS.Build/GenerateVersionInfo.cs | 63 ----- GVFS/GVFS.Build/ProjFS.props | 7 - GVFS/GVFS.MSBuild/CompileTemplatedFile.cs | 88 +++++++ GVFS/GVFS.MSBuild/GVFS.MSBuild.csproj | 13 ++ GVFS/GVFS.MSBuild/GVFS.targets | 34 +++ GVFS/GVFS.MSBuild/GVFS.tasks | 31 +++ GVFS/GVFS.MSBuild/GenerateGVFSConstants.cs | 102 +++++++++ .../GVFS.MSBuild/GenerateGVFSVersionHeader.cs | 48 ++++ .../GenerateWindowsAppManifest.cs} | 17 +- 19 files changed, 324 insertions(+), 757 deletions(-) delete mode 100644 GVFS/GVFS.Build/.gitignore delete mode 100644 GVFS/GVFS.Build/GVFS.PreBuild.csproj delete mode 100644 GVFS/GVFS.Build/GVFS.cpp.props delete mode 100644 GVFS/GVFS.Build/GVFS.cs.props delete mode 100644 GVFS/GVFS.Build/GVFS.props delete mode 100644 GVFS/GVFS.Build/GVFS.ruleset delete mode 100644 GVFS/GVFS.Build/GenerateG4WNugetReference.cs delete mode 100644 GVFS/GVFS.Build/GenerateGVFSInstallersNuspec.cs delete mode 100644 GVFS/GVFS.Build/GenerateGitVersionConstants.cs delete mode 100644 GVFS/GVFS.Build/GenerateInstallScripts.cs delete mode 100644 GVFS/GVFS.Build/GenerateVersionInfo.cs delete mode 100644 GVFS/GVFS.Build/ProjFS.props create mode 100644 GVFS/GVFS.MSBuild/CompileTemplatedFile.cs create mode 100644 GVFS/GVFS.MSBuild/GVFS.MSBuild.csproj create mode 100644 GVFS/GVFS.MSBuild/GVFS.targets create mode 100644 GVFS/GVFS.MSBuild/GVFS.tasks create mode 100644 GVFS/GVFS.MSBuild/GenerateGVFSConstants.cs create mode 100644 GVFS/GVFS.MSBuild/GenerateGVFSVersionHeader.cs rename GVFS/{GVFS.Build/GenerateApplicationManifests.cs => GVFS.MSBuild/GenerateWindowsAppManifest.cs} (75%) diff --git a/GVFS/GVFS.Build/.gitignore b/GVFS/GVFS.Build/.gitignore deleted file mode 100644 index 761f8ceb83..0000000000 --- a/GVFS/GVFS.Build/.gitignore +++ /dev/null @@ -1 +0,0 @@ -packages.config \ No newline at end of file diff --git a/GVFS/GVFS.Build/GVFS.PreBuild.csproj b/GVFS/GVFS.Build/GVFS.PreBuild.csproj deleted file mode 100644 index 6f66a14dda..0000000000 --- a/GVFS/GVFS.Build/GVFS.PreBuild.csproj +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - {A4984251-840E-4622-AD0C-66DFCE2B2574} - Library - Properties - GVFS.PreBuild - GVFS.PreBuild - v4.6.1 - 512 - - - true - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - true - - - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - Designer - - - Designer - - - Designer - - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SetupGVFS.$(GVFSVersion).exe - $(BuildOutputDir)\GVFS.Installer.Windows\bin\x64\$(Configuration)\SetupGVFS.$(GVFSVersion).exe - $(BuildOutputDir)\GVFS.Build\ - $(OutDir)GVFSConstants.GitVersion.cs - $(OutDir)InstallG4W.bat - $(OutDir)InstallGVFS.bat - $(OutDir)InstallProduct.bat - $(OutDir)GVFS.Installers.nuspec - $(BuildOutputDir)\CommonAssemblyVersion.cs - $(BuildOutputDir)\CommonVersionHeader.h - $(BuildOutputDir)\restore.timestamp - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GVFS/GVFS.Build/GVFS.cpp.props b/GVFS/GVFS.Build/GVFS.cpp.props deleted file mode 100644 index b299c87266..0000000000 --- a/GVFS/GVFS.Build/GVFS.cpp.props +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - $(BuildOutputDir)\$(MSBuildProjectName)\bin\$(Platform)\$(Configuration)\ - $(BuildOutputDir)\$(MSBuildProjectName)\intermediate\$(Platform)\$(Configuration)\ - - - diff --git a/GVFS/GVFS.Build/GVFS.cs.props b/GVFS/GVFS.Build/GVFS.cs.props deleted file mode 100644 index 6b7cf63d88..0000000000 --- a/GVFS/GVFS.Build/GVFS.cs.props +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - $(BuildOutputDir)\$(MSBuildProjectName)\bin\$(Platform)\$(Configuration)\ - $(BuildOutputDir)\$(MSBuildProjectName)\obj\$(Platform)\$(Configuration)\ - $(BuildOutputDir)\$(MSBuildProjectName)\intermediate\$(Platform)\$(Configuration)\ - - - - true - $(MSBuildThisFileDirectory)\GVFS.ruleset - false - - - - - CommonAssemblyVersion.cs - - - - - $(DefaultItemExcludes);StyleCop.Cache;TestResults.xml - - - - NU1603 - NU1603 - - diff --git a/GVFS/GVFS.Build/GVFS.props b/GVFS/GVFS.Build/GVFS.props deleted file mode 100644 index 6805724bde..0000000000 --- a/GVFS/GVFS.Build/GVFS.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - - 0.2.173.2 - 2.20210505.2 - - - - Debug - x64 - ..\..\ - $(SolutionDir)..\BuildOutput - $(SolutionDir)..\packages - - - diff --git a/GVFS/GVFS.Build/GVFS.ruleset b/GVFS/GVFS.Build/GVFS.ruleset deleted file mode 100644 index 67842e3104..0000000000 --- a/GVFS/GVFS.Build/GVFS.ruleset +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GVFS/GVFS.Build/GenerateG4WNugetReference.cs b/GVFS/GVFS.Build/GenerateG4WNugetReference.cs deleted file mode 100644 index 448654dcb7..0000000000 --- a/GVFS/GVFS.Build/GenerateG4WNugetReference.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System; -using System.IO; - -namespace GVFS.PreBuild -{ - public class GenerateG4WNugetReference : Task - { - [Required] - public string GitPackageVersion { get; set; } - - public override bool Execute() - { - this.Log.LogMessage(MessageImportance.High, "Creating packages.config for G4W package version " + this.GitPackageVersion); - - File.WriteAllText( - Path.Combine(Environment.CurrentDirectory, "packages.config"), - string.Format( -@" - - - - -", - this.GitPackageVersion)); - - return true; - } - } -} diff --git a/GVFS/GVFS.Build/GenerateGVFSInstallersNuspec.cs b/GVFS/GVFS.Build/GenerateGVFSInstallersNuspec.cs deleted file mode 100644 index 4813866b5a..0000000000 --- a/GVFS/GVFS.Build/GenerateGVFSInstallersNuspec.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System.IO; - -namespace GVFS.PreBuild -{ - public class GenerateGVFSInstallersNuspec : Task - { - [Required] - public string GVFSSetupPath { get; set; } - - [Required] - public string GitPackageVersion { get; set; } - - [Required] - public string PackagesPath { get; set; } - - [Required] - public string OutputFile { get; set; } - - public override bool Execute() - { - this.Log.LogMessage(MessageImportance.High, "Generating GVFS.Installers.nuspec"); - - this.GVFSSetupPath = Path.GetFullPath(this.GVFSSetupPath); - this.PackagesPath = Path.GetFullPath(this.PackagesPath); - - File.WriteAllText( - this.OutputFile, - string.Format( -@" - - - GVFS.Installers - $GVFSVersion$ - Microsoft - false - GVFS and G4W installers - - - - - - -", - this.GVFSSetupPath, - this.PackagesPath, - this.GitPackageVersion)); - - return true; - } - } -} diff --git a/GVFS/GVFS.Build/GenerateGitVersionConstants.cs b/GVFS/GVFS.Build/GenerateGitVersionConstants.cs deleted file mode 100644 index 71caf79c7c..0000000000 --- a/GVFS/GVFS.Build/GenerateGitVersionConstants.cs +++ /dev/null @@ -1,190 +0,0 @@ -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System; -using System.IO; -using System.Linq; - -namespace GVFS.PreBuild -{ - public class GenerateGitVersionConstants : Task - { - [Required] - public string GitPackageVersion { get; set; } - - [Required] - public string PackagesPath { get; set; } - - [Required] - public string OutputFile {get; set; } - - [Output] - public string LatestInstaller { get; set; } - - [Output] - public string LatestInstallerFilename { get; set; } - - public override bool Execute() - { - this.Log.LogMessage(MessageImportance.High, "Creating constants for Git package " + this.GitPackageVersion); - - string installerDirectory = Path.Combine( - this.PackagesPath, - "GitForWindows.GVFS.Installer." + this.GitPackageVersion, - "tools"); - - if (!Directory.Exists(installerDirectory)) - { - this.Log.LogError("Git package not found. Re-run your build to allow the package to be downloaded by Visual Studio."); - return false; - } - - this.LatestInstaller = Path.GetFullPath(Directory.EnumerateFiles(installerDirectory).Single()); - this.LatestInstallerFilename = Path.GetFileName(this.LatestInstaller); - GitVersion version; - if (!GitVersion.TryParseInstallerName(this.LatestInstallerFilename, out version)) - { - this.Log.LogError("Unable to parse git version: " + this.LatestInstallerFilename); - return false; - } - - this.Log.LogMessage(MessageImportance.High, "Found Git version " + version.ToString()); - - string projectOutputPath = Path.GetDirectoryName(this.OutputFile); - if (!Directory.Exists(projectOutputPath)) - { - Directory.CreateDirectory(projectOutputPath); - } - - File.WriteAllText( - this.OutputFile, - string.Format( -@"// This file is auto-generated by GVFS.PreBuild.GenerateGitVersionConstants. Any changes made directly in this file will be lost. -using GVFS.Common.Git; - -namespace GVFS.Common -{{ - public static partial class GVFSConstants - {{ - public static readonly GitVersion SupportedGitVersion = new GitVersion({0}, {1}, {2}, ""{3}"", {4}, {5}); - }} -}}", - version.Major, - version.Minor, - version.Build, - version.Platform, - version.Revision, - version.MinorRevision)); - - return true; - } - - // This class was partially copied from GVFS.Common.Git.GitVersion for the parsing - private class GitVersion - { - private GitVersion(int major, int minor, int build, string platform, int revision, int minorRevision) - { - this.Major = major; - this.Minor = minor; - this.Build = build; - this.Platform = platform; - this.Revision = revision; - this.MinorRevision = minorRevision; - } - - public int Major { get; private set; } - public int Minor { get; private set; } - public string Platform { get; private set; } - public int Build { get; private set; } - public int Revision { get; private set; } - public int MinorRevision { get; private set; } - - public static bool TryParseInstallerName(string input, out GitVersion version) - { - // Installer name is of the form - // Git-2.14.1.gvfs.1.1.gb16030b-64-bit.exe - - version = null; - - if (!input.StartsWith("Git-", StringComparison.InvariantCultureIgnoreCase)) - { - return false; - } - - if (!input.EndsWith("-64-bit.exe", StringComparison.InvariantCultureIgnoreCase)) - { - return false; - } - - return TryParseVersion(input.Substring(4, input.Length - 15), out version); - } - - private static bool TryParseVersion(string input, out GitVersion version) - { - version = null; - int major, minor, build, revision, minorRevision; - - if (string.IsNullOrWhiteSpace(input)) - { - return false; - } - - string[] parsedComponents = input.Split(new char[] { '.' }); - int parsedComponentsLength = parsedComponents.Length; - if (parsedComponentsLength < 5) - { - return false; - } - - if (!TryParseComponent(parsedComponents[0], out major)) - { - return false; - } - - if (!TryParseComponent(parsedComponents[1], out minor)) - { - return false; - } - - if (!TryParseComponent(parsedComponents[2], out build)) - { - return false; - } - - if (!TryParseComponent(parsedComponents[4], out revision)) - { - return false; - } - - if (parsedComponentsLength < 6 || !TryParseComponent(parsedComponents[5], out minorRevision)) - { - minorRevision = 0; - } - - string platform = parsedComponents[3]; - - version = new GitVersion(major, minor, build, platform, revision, minorRevision); - return true; - } - - public override string ToString() - { - return string.Format("{0}.{1}.{2}.{3}.{4}.{5}", this.Major, this.Minor, this.Build, this.Platform, this.Revision, this.MinorRevision); - } - - private static bool TryParseComponent(string component, out int parsedComponent) - { - if (!int.TryParse(component, out parsedComponent)) - { - return false; - } - - if (parsedComponent < 0) - { - return false; - } - - return true; - } - } - } -} diff --git a/GVFS/GVFS.Build/GenerateInstallScripts.cs b/GVFS/GVFS.Build/GenerateInstallScripts.cs deleted file mode 100644 index 6ba1129b03..0000000000 --- a/GVFS/GVFS.Build/GenerateInstallScripts.cs +++ /dev/null @@ -1,61 +0,0 @@ -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System.IO; -using System.Text; - -namespace GVFS.PreBuild -{ - public class GenerateInstallScripts : Task - { - [Required] - public string GitInstallerFilename { get; set; } - - [Required] - public string VFSForGitSetupFilename { get; set; } - - [Required] - public string GitInstallBatPath { get; set; } - - [Required] - public string VFSForGitInstallBatPath { get; set; } - - [Required] - public string UnifiedInstallBatPath { get; set; } - - public override bool Execute() - { - this.Log.LogMessage(MessageImportance.High, "Creating install scripts for " + this.GitInstallerFilename); - - File.WriteAllText( - this.GitInstallBatPath, - this.GetGitInstallCommand()); - - File.WriteAllText( - this.VFSForGitInstallBatPath, - this.GetVFSForGitInstallCommand()); - - StringBuilder sb = new StringBuilder(); - sb.AppendLine("REM AUTOGENERATED DO NOT EDIT"); - sb.AppendLine(); - sb.AppendLine(this.GetGitInstallCommand()); - sb.AppendLine(); - sb.AppendLine(this.GetVFSForGitInstallCommand()); - - File.WriteAllText( - this.UnifiedInstallBatPath, - sb.ToString()); - - return true; - } - - public string GetGitInstallCommand() - { - return "%~dp0\\" + this.GitInstallerFilename + @" /DIR=""C:\Program Files\Git"" /NOICONS /COMPONENTS=""ext,ext\shellhere,ext\guihere,assoc,assoc_sh"" /GROUP=""Git"" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /ALLOWDOWNGRADE=1"; - } - - public string GetVFSForGitInstallCommand() - { - return "%~dp0\\" + this.VFSForGitSetupFilename + " /VERYSILENT /SUPPRESSMSGBOXES /NORESTART"; - } - } -} diff --git a/GVFS/GVFS.Build/GenerateVersionInfo.cs b/GVFS/GVFS.Build/GenerateVersionInfo.cs deleted file mode 100644 index ba69848012..0000000000 --- a/GVFS/GVFS.Build/GenerateVersionInfo.cs +++ /dev/null @@ -1,63 +0,0 @@ -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System.IO; - -namespace GVFS.PreBuild -{ - public class GenerateVersionInfo : Task - { - [Required] - public string Version { get; set; } - - [Required] - public string BuildOutputPath { get; set; } - - [Required] - public string AssemblyVersion { get; set; } - - [Required] - public string VersionHeader { get; set; } - - public override bool Execute() - { - this.Log.LogMessage(MessageImportance.High, "Creating version files"); - - EnsureParentDirectoryExistsFor(this.AssemblyVersion); - File.WriteAllText( - this.AssemblyVersion, - string.Format( -@"using System.Reflection; - -[assembly: AssemblyVersion(""{0}"")] -[assembly: AssemblyFileVersion(""{0}"")] -", - this.Version)); - - string commaDelimetedVersion = this.Version.Replace('.', ','); - EnsureParentDirectoryExistsFor(this.VersionHeader); - File.WriteAllText( - this.VersionHeader, - string.Format( -@" -#define GVFS_FILE_VERSION {0} -#define GVFS_FILE_VERSION_STRING ""{1}"" -#define GVFS_PRODUCT_VERSION {0} -#define GVFS_PRODUCT_VERSION_STRING ""{1}"" -", - commaDelimetedVersion, - this.Version)); - - return true; - } - - private void EnsureParentDirectoryExistsFor(string filename) - { - string directory = Path.GetDirectoryName(filename); - if (!Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - } - } -} diff --git a/GVFS/GVFS.Build/ProjFS.props b/GVFS/GVFS.Build/ProjFS.props deleted file mode 100644 index 0870080599..0000000000 --- a/GVFS/GVFS.Build/ProjFS.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - GVFS.ProjFS.2019.411.1 - Microsoft.Windows.ProjFS.1.1.19156.1 - - diff --git a/GVFS/GVFS.MSBuild/CompileTemplatedFile.cs b/GVFS/GVFS.MSBuild/CompileTemplatedFile.cs new file mode 100644 index 0000000000..a9c3df72cb --- /dev/null +++ b/GVFS/GVFS.MSBuild/CompileTemplatedFile.cs @@ -0,0 +1,88 @@ +using System; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace GVFS.MSBuild +{ + public class CompileTemplatedFile : Task + { + [Required] + public ITaskItem Template { get; set; } + + [Required] + public string OutputFile { get; set; } + + [Output] + public ITaskItem CompiledTemplate { get; set; } + + public override bool Execute() + { + string templateFilePath = this.Template.ItemSpec; + IDictionary properties = ParseProperties(this.Template.GetMetadata("Properties")); + + string outputFileDirectory = Path.GetDirectoryName(this.OutputFile); + + if (!File.Exists(templateFilePath)) + { + this.Log.LogError("Failed to find template file '{0}'.", templateFilePath); + return false; + } + + // Copy the template to the destination to keep the same file mode bits/ACLs as the template + File.Copy(templateFilePath, this.OutputFile, true); + + this.Log.LogMessage(MessageImportance.Low, "Reading template contents"); + string template = File.ReadAllText(this.OutputFile); + + this.Log.LogMessage(MessageImportance.Normal, "Compiling template '{0}'", templateFilePath); + string compiled = Compile(template, properties); + + if (!Directory.Exists(outputFileDirectory)) + { + this.Log.LogMessage(MessageImportance.Low, "Creating output directory '{0}'", outputFileDirectory); + Directory.CreateDirectory(outputFileDirectory); + } + + this.Log.LogMessage(MessageImportance.Normal, "Writing compiled template to '{0}'", this.OutputFile); + File.WriteAllText(this.OutputFile, compiled); + + this.CompiledTemplate = new TaskItem(this.OutputFile, this.Template.CloneCustomMetadata()); + + return true; + } + + private IDictionary ParseProperties(string propertiesStr) + { + string[] properties = propertiesStr?.Split(';') ?? new string[0]; + var dict = new Dictionary(); + + foreach (string propertyStr in properties) + { + string[] kvp = propertyStr.Split(new[] {'='}, count: 2); + if (kvp.Length > 1) + { + string key = kvp[0].Trim(); + dict[key] = kvp[1].Trim(); + } + } + + return dict; + } + + private string Compile(string template, IDictionary properties) + { + var sb = new StringBuilder(template); + + foreach (var kvp in properties) + { + this.Log.LogMessage(MessageImportance.Low, "Replacing \"{0}\" -> \"{1}\"", kvp.Key, kvp.Value); + sb.Replace(kvp.Key, kvp.Value); + } + + return sb.ToString(); + } + } +} diff --git a/GVFS/GVFS.MSBuild/GVFS.MSBuild.csproj b/GVFS/GVFS.MSBuild/GVFS.MSBuild.csproj new file mode 100644 index 0000000000..1505e24e07 --- /dev/null +++ b/GVFS/GVFS.MSBuild/GVFS.MSBuild.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + false + + + + + + + + diff --git a/GVFS/GVFS.MSBuild/GVFS.targets b/GVFS/GVFS.MSBuild/GVFS.targets new file mode 100644 index 0000000000..53859d6e62 --- /dev/null +++ b/GVFS/GVFS.MSBuild/GVFS.targets @@ -0,0 +1,34 @@ + + + + + + + $(IntermediateOutputPath)app.manifest + + + + + + + + + + + + + + + + + + diff --git a/GVFS/GVFS.MSBuild/GVFS.tasks b/GVFS/GVFS.MSBuild/GVFS.tasks new file mode 100644 index 0000000000..b9e9b35aed --- /dev/null +++ b/GVFS/GVFS.MSBuild/GVFS.tasks @@ -0,0 +1,31 @@ + + + <_TaskAssembly>$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll + <_TaskFactory>CodeTaskFactory + + + <_TaskAssembly>$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll + <_TaskFactory>RoslynCodeTaskFactory + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GVFS/GVFS.MSBuild/GenerateGVFSConstants.cs b/GVFS/GVFS.MSBuild/GenerateGVFSConstants.cs new file mode 100644 index 0000000000..bb831584d7 --- /dev/null +++ b/GVFS/GVFS.MSBuild/GenerateGVFSConstants.cs @@ -0,0 +1,102 @@ +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using System.IO; +using System.Text.RegularExpressions; + +namespace GVFS.MSBuild +{ + public class GenerateGVFSConstants : Task + { + [Required] + public string MinimumGitVersion { get; set; } + + [Required] + public string LibGit2FileName { get; set; } + + [Required] + public string OutputFile { get; set; } + + public override bool Execute() + { + this.Log.LogMessage(MessageImportance.Normal, + "Creating GVFS constants file with minimum Git version '{0}' at '{1}'...", + this.MinimumGitVersion, this.OutputFile); + + if (!TryParseVersion(this.MinimumGitVersion, out var version)) + { + this.Log.LogError("Failed to parse Git version '{0}'.", this.MinimumGitVersion); + return false; + } + + string outputDirectory = Path.GetDirectoryName(this.OutputFile); + if (!Directory.Exists(outputDirectory)) + { + Directory.CreateDirectory(outputDirectory); + } + + string template = +@"// +// This file is auto-generated by Scalar.Build.GenerateScalarConstants. +// Any changes made directly in this file will be lost. +// +using GVFS.Common.Git; + +namespace GVFS.Common +{{ + public static partial class GVFSConstants + {{ + public static readonly GitVersion SupportedGitVersion = new GitVersion({0}, {1}, {2}, ""{3}"", {4}, {5}); + public const string LibGit2LibraryName = ""{6}""; + }} +}}"; + + File.WriteAllText( + this.OutputFile, + string.Format( + template, + version.Major, + version.Minor, + version.Build, + version.Platform, + version.Revision, + version.MinorRevision, + this.LibGit2FileName)); + + return true; + } + + private static bool TryParseVersion(string versionString, out GitVersion version) + { + const string pattern = @"(\d+)\.(\d+)\.(\d+)\.([A-Z]+)\.(\d+)\.(\d+)"; + + Match match = Regex.Match(versionString, pattern, RegexOptions.IgnoreCase); + if (match.Success) + { + version = new GitVersion + { + Major = int.Parse(match.Groups[1].Value), + Minor = int.Parse(match.Groups[2].Value), + Build = int.Parse(match.Groups[3].Value), + Platform = match.Groups[4].Value, + Revision = int.Parse(match.Groups[5].Value), + MinorRevision = int.Parse(match.Groups[6].Value) + }; + + return true; + } + + version = default(GitVersion); + return false; + } + + private struct GitVersion + { + public int Major { get; set; } + public int Minor { get; set; } + public int Build { get; set; } + public string Platform { get; set; } + public int Revision { get; set; } + public int MinorRevision { get; set; } + } + } +} \ No newline at end of file diff --git a/GVFS/GVFS.MSBuild/GenerateGVFSVersionHeader.cs b/GVFS/GVFS.MSBuild/GenerateGVFSVersionHeader.cs new file mode 100644 index 0000000000..a6dcec9367 --- /dev/null +++ b/GVFS/GVFS.MSBuild/GenerateGVFSVersionHeader.cs @@ -0,0 +1,48 @@ +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using System.IO; + +namespace GVFS.MSBuild +{ + public class GenerateGVFSVersionHeader : Task + { + [Required] + public string Version { get; set; } + + [Required] + public string OutputFile { get; set; } + + public override bool Execute() + { + this.Log.LogMessage(MessageImportance.Normal, + "Creating GVFS version header file with version '{0}' at '{1}'...", + this.Version, this.OutputFile); + + string outputDirectory = Path.GetDirectoryName(this.OutputFile); + if (!Directory.Exists(outputDirectory)) + { + Directory.CreateDirectory(outputDirectory); + } + + string template = +@"/* + * This file is auto-generated by GVFS.MSBuild.GenerateGVFSVersionHeader. + * Any changes made directly in this file will be lost. + */ +#define GVFS_FILE_VERSION {1} +#define GVFS_FILE_VERSION_STRING ""{0}"" +#define GVFS_PRODUCT_VERSION {1} +#define GVFS_PRODUCT_VERSION_STRING ""{0}"" +"; + + File.WriteAllText( + this.OutputFile, + string.Format( + template, + this.Version, + this.Version?.Replace('.',','))); + + return true; + } + } +} \ No newline at end of file diff --git a/GVFS/GVFS.Build/GenerateApplicationManifests.cs b/GVFS/GVFS.MSBuild/GenerateWindowsAppManifest.cs similarity index 75% rename from GVFS/GVFS.Build/GenerateApplicationManifests.cs rename to GVFS/GVFS.MSBuild/GenerateWindowsAppManifest.cs index 296dd39833..fc16070024 100644 --- a/GVFS/GVFS.Build/GenerateApplicationManifests.cs +++ b/GVFS/GVFS.MSBuild/GenerateWindowsAppManifest.cs @@ -2,9 +2,9 @@ using Microsoft.Build.Utilities; using System.IO; -namespace GVFS.PreBuild +namespace GVFS.MSBuild { - public class GenerateApplicationManifests : Task + public class GenerateWindowsAppManifest : Task { [Required] public string Version { get; set; } @@ -13,13 +13,13 @@ public class GenerateApplicationManifests : Task public string ApplicationName { get; set; } [Required] - public string ManifestPath { get; set; } + public string OutputFile { get; set; } public override bool Execute() { - this.Log.LogMessage(MessageImportance.High, "Creating application manifest file for {0}", ApplicationName); + this.Log.LogMessage(MessageImportance.Normal, "Creating application manifest file for '{0}'...", this.ApplicationName); - string manifestDirectory = Path.GetDirectoryName(this.ManifestPath); + string manifestDirectory = Path.GetDirectoryName(this.OutputFile); if (!Directory.Exists(manifestDirectory)) { Directory.CreateDirectory(manifestDirectory); @@ -28,9 +28,9 @@ public override bool Execute() // Any application that calls GetVersionEx must have an application manifest in order to get an accurate response. // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx for details File.WriteAllText( - this.ManifestPath, + this.OutputFile, string.Format( -@" + @" @@ -47,5 +47,4 @@ public override bool Execute() return true; } } -} - +} \ No newline at end of file From 026b7b97bab5d8cd5b7a98fb1dd6dd66dc10b75b Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:53:25 +0100 Subject: [PATCH 07/35] build: migrate VC++ projects to new build Migrate the native VC++ projects to use the new build variables, package restore, and WinSDK to 10.0.16299. --- .../GVFS.NativeTests/GVFS.NativeTests.vcxproj | 26 ++++++++++--------- .../GVFS.NativeTests.vcxproj.filters | 3 +++ GVFS/GVFS.NativeTests/packages.config | 4 +++ ...proj => GVFS.PostIndexChangedHook.vcxproj} | 25 +++++++++--------- ...GVFS.PostIndexChangedHook.vcxproj.filters} | 0 ...ws.vcxproj => GVFS.ReadObjectHook.vcxproj} | 25 +++++++++--------- ...rs => GVFS.ReadObjectHook.vcxproj.filters} | 0 ...roj => GVFS.VirtualFileSystemHook.vcxproj} | 25 +++++++++--------- ...VFS.VirtualFileSystemHook.vcxproj.filters} | 0 9 files changed, 57 insertions(+), 51 deletions(-) create mode 100644 GVFS/GVFS.NativeTests/packages.config rename GVFS/GVFS.PostIndexChangedHook/{GVFS.PostIndexChangedHook.Windows.vcxproj => GVFS.PostIndexChangedHook.vcxproj} (81%) rename GVFS/GVFS.PostIndexChangedHook/{GVFS.PostIndexChangedHook.Windows.vcxproj.filters => GVFS.PostIndexChangedHook.vcxproj.filters} (100%) rename GVFS/GVFS.ReadObjectHook/{GVFS.ReadObjectHook.Windows.vcxproj => GVFS.ReadObjectHook.vcxproj} (81%) rename GVFS/GVFS.ReadObjectHook/{GVFS.ReadObjectHook.Windows.vcxproj.filters => GVFS.ReadObjectHook.vcxproj.filters} (100%) rename GVFS/GVFS.VirtualFileSystemHook/{GVFS.VirtualFileSystemHook.Windows.vcxproj => GVFS.VirtualFileSystemHook.vcxproj} (81%) rename GVFS/GVFS.VirtualFileSystemHook/{GVFS.VirtualFileSystemHook.Windows.vcxproj.filters => GVFS.VirtualFileSystemHook.vcxproj.filters} (100%) diff --git a/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj b/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj index f08d118aaf..87352d6112 100644 --- a/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj +++ b/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj @@ -1,5 +1,8 @@ + + GVFS.ProjFS.2019.411.1 + Debug @@ -14,21 +17,19 @@ {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} Win32Proj GVFSNativeTests - 10.0.10240.0 + 10.0.16299.0 - - DynamicLibrary true - v141 + v142 NotSet DynamicLibrary false - v141 + v142 true NotSet @@ -58,13 +59,13 @@ _DEBUG;_WINDOWS;_USRDLL;GVFSNATIVETESTS_EXPORTS;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\$(Projectname)\include;$(SolutionDir)\GVFS\$(Projectname)\interface;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;$(MSBuildProjectDirectory)\include;$(MSBuildProjectDirectory)\interface;%(AdditionalIncludeDirectories) Windows true ProjectedFSLib.lib;fltlib.lib;Shlwapi.lib;%(AdditionalDependencies) - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;$(PackagesDir)\$(ProjFSNativePackage)\lib + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;$(BuildPackagesPath)$(ProjFSNativePackage)\lib @@ -77,7 +78,7 @@ NDEBUG;_WINDOWS;_USRDLL;GVFSNATIVETESTS_EXPORTS;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\$(Projectname)\include;$(SolutionDir)\GVFS\$(Projectname)\interface;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;$(MSBuildProjectDirectory)\include;$(MSBuildProjectDirectory)\interface;%(AdditionalIncludeDirectories) Windows @@ -85,7 +86,7 @@ true true ProjectedFSLib.lib;fltlib.lib;Shlwapi.lib;%(AdditionalDependencies) - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;$(PackagesDir)\$(ProjFSNativePackage)\lib + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;$(BuildPackagesPath)$(ProjFSNativePackage)\lib @@ -151,7 +152,8 @@ Create + + + - - - + \ No newline at end of file diff --git a/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj.filters b/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj.filters index 78765fc3c5..4dfa38544d 100644 --- a/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj.filters +++ b/GVFS/GVFS.NativeTests/GVFS.NativeTests.vcxproj.filters @@ -160,4 +160,7 @@ source
+ + + \ No newline at end of file diff --git a/GVFS/GVFS.NativeTests/packages.config b/GVFS/GVFS.NativeTests/packages.config new file mode 100644 index 0000000000..0dac1a4251 --- /dev/null +++ b/GVFS/GVFS.NativeTests/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Windows.vcxproj b/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.vcxproj similarity index 81% rename from GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Windows.vcxproj rename to GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.vcxproj index 7200135816..0537dfaf1e 100644 --- a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Windows.vcxproj +++ b/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.vcxproj @@ -14,22 +14,21 @@ {24D161E9-D1F0-4299-BBD3-5D940BEDD535} Win32Proj GVFSPostIndexChangedHook - 10.0.10240.0 - GVFS.PostIndexChangedHook.Windows + 10.0.16299.0 + GVFS.PostIndexChangedHook GVFS.PostIndexChangedHook - Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte @@ -59,22 +58,22 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;..\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) /Zc:__cplusplus MultiThreadedDebug Console true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) @@ -87,7 +86,7 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;..\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) /Zc:__cplusplus MultiThreaded @@ -96,15 +95,15 @@ true true true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) diff --git a/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Windows.vcxproj.filters b/GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.vcxproj.filters similarity index 100% rename from GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.Windows.vcxproj.filters rename to GVFS/GVFS.PostIndexChangedHook/GVFS.PostIndexChangedHook.vcxproj.filters diff --git a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Windows.vcxproj b/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.vcxproj similarity index 81% rename from GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Windows.vcxproj rename to GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.vcxproj index 03d2702621..613e9d9a7c 100644 --- a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Windows.vcxproj +++ b/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.vcxproj @@ -14,22 +14,21 @@ {5A6656D5-81C7-472C-9DC8-32D071CB2258} Win32Proj readobject - 10.0.10240.0 - GVFS.ReadObjectHook.Windows + 10.0.16299.0 + GVFS.ReadObjectHook GVFS.ReadObjectHook - Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte @@ -59,22 +58,22 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;..\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) /Zc:__cplusplus MultiThreadedDebug Console true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) @@ -87,7 +86,7 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;..\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) /Zc:__cplusplus MultiThreaded @@ -96,15 +95,15 @@ true true true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) diff --git a/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Windows.vcxproj.filters b/GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.vcxproj.filters similarity index 100% rename from GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.Windows.vcxproj.filters rename to GVFS/GVFS.ReadObjectHook/GVFS.ReadObjectHook.vcxproj.filters diff --git a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Windows.vcxproj b/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.vcxproj similarity index 81% rename from GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Windows.vcxproj rename to GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.vcxproj index eda75135c0..8fb0cdb176 100644 --- a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Windows.vcxproj +++ b/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.vcxproj @@ -14,22 +14,21 @@ {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} Win32Proj GVFSVirtualFileSystemHook - 10.0.10240.0 - GVFS.VirtualFileSystemHook.Windows + 10.0.16299.0 + GVFS.VirtualFileSystemHook GVFS.VirtualFileSystemHook - Application true - v141 + v142 MultiByte Application false - v141 + v142 true MultiByte @@ -59,22 +58,22 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;..\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) /Zc:__cplusplus MultiThreadedDebug Console true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) @@ -87,7 +86,7 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true true - C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt;$(SolutionDir)\GVFS\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) + C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt;..\GVFS.NativeHooks.Common;%(AdditionalIncludeDirectories) /Zc:__cplusplus MultiThreaded @@ -96,15 +95,15 @@ true true true - C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64;%(AdditionalLibraryDirectories) + C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64;%(AdditionalLibraryDirectories) - $(BuildOutputDir)\$(ProjectName)\intermediate\$(Platform)\$(Configuration)\$(MSBuildProjectName).log + $(IntDir)\$(MSBuildProjectName).log - $(BuildOutputDir) + $(GeneratedIncludePath) diff --git a/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Windows.vcxproj.filters b/GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.vcxproj.filters similarity index 100% rename from GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.Windows.vcxproj.filters rename to GVFS/GVFS.VirtualFileSystemHook/GVFS.VirtualFileSystemHook.vcxproj.filters From d53ae03147c03d602569159e8c7b2254baf8fae0 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:55:06 +0100 Subject: [PATCH 08/35] build: migrate GVFS.Common project --- GVFS/GVFS.Common/GVFS.Common.csproj | 42 ++++++++----------- GVFS/GVFS.Common/Git/LibGit2Repo.cs | 2 +- ...{AssemblyInfo.cs => InternalsVisibleTo.cs} | 1 - GVFS/GVFS.Common/Properties/AssemblyInfo.cs | 22 ---------- 4 files changed, 19 insertions(+), 48 deletions(-) rename GVFS/GVFS.Common/{AssemblyInfo.cs => InternalsVisibleTo.cs} (60%) delete mode 100644 GVFS/GVFS.Common/Properties/AssemblyInfo.cs diff --git a/GVFS/GVFS.Common/GVFS.Common.csproj b/GVFS/GVFS.Common/GVFS.Common.csproj index 8934376fd6..9cc9a5cb8c 100644 --- a/GVFS/GVFS.Common/GVFS.Common.csproj +++ b/GVFS/GVFS.Common/GVFS.Common.csproj @@ -1,38 +1,32 @@ - - - - + - netcoreapp2.1;netstandard2.0 - x64 + net461 true - true - - - $(GVFSVersion) - - - $(GVFSVersion) - - - - - - - all - - - + + - + + + + + + + + + + + + diff --git a/GVFS/GVFS.Common/Git/LibGit2Repo.cs b/GVFS/GVFS.Common/Git/LibGit2Repo.cs index 8ea258a9c4..c1056def32 100644 --- a/GVFS/GVFS.Common/Git/LibGit2Repo.cs +++ b/GVFS/GVFS.Common/Git/LibGit2Repo.cs @@ -174,7 +174,7 @@ public static class Native { public const uint SuccessCode = 0; - public const string Git2NativeLibName = "git2"; + public const string Git2NativeLibName = GVFSConstants.LibGit2LibraryName; public enum ObjectTypes { diff --git a/GVFS/GVFS.Common/AssemblyInfo.cs b/GVFS/GVFS.Common/InternalsVisibleTo.cs similarity index 60% rename from GVFS/GVFS.Common/AssemblyInfo.cs rename to GVFS/GVFS.Common/InternalsVisibleTo.cs index a19d69f781..0ba48d81be 100644 --- a/GVFS/GVFS.Common/AssemblyInfo.cs +++ b/GVFS/GVFS.Common/InternalsVisibleTo.cs @@ -1,4 +1,3 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("GVFS.UnitTests")] -[assembly: InternalsVisibleTo("GVFS.UnitTests.Windows")] diff --git a/GVFS/GVFS.Common/Properties/AssemblyInfo.cs b/GVFS/GVFS.Common/Properties/AssemblyInfo.cs deleted file mode 100644 index 6acb6e0e51..0000000000 --- a/GVFS/GVFS.Common/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Common")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Common")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("9ea6ff63-6bb0-4440-9bfb-0ae79a8f9ba9")] From fc39a8afbb189866966041a42345ca94f523f1ce Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:55:44 +0100 Subject: [PATCH 09/35] build: migrate GVFS.GVFlt project --- GVFS/GVFS.GVFlt/GVFS.GVFlt.csproj | 67 ++-------------------- GVFS/GVFS.GVFlt/Properties/AssemblyInfo.cs | 22 ------- GVFS/GVFS.GVFlt/packages.config | 5 -- 3 files changed, 6 insertions(+), 88 deletions(-) delete mode 100644 GVFS/GVFS.GVFlt/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.GVFlt/packages.config diff --git a/GVFS/GVFS.GVFlt/GVFS.GVFlt.csproj b/GVFS/GVFS.GVFlt/GVFS.GVFlt.csproj index 094009ca9c..16074079a8 100644 --- a/GVFS/GVFS.GVFlt/GVFS.GVFlt.csproj +++ b/GVFS/GVFS.GVFlt/GVFS.GVFlt.csproj @@ -1,66 +1,11 @@ - - - - + + - {1118B427-7063-422F-83B9-5023C8EC5A7A} - Library - Properties - GVFS.GVFlt - GVFS.GVFlt - v4.6.1 - 512 - - + net461 - - true - DEBUG;TRACE - full - x64 - prompt - - - TRACE - true - pdbonly - x64 - prompt - - - - False - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - True - - - - - - - - - - - - - - - - - Designer - - + - - + - - + diff --git a/GVFS/GVFS.GVFlt/Properties/AssemblyInfo.cs b/GVFS/GVFS.GVFlt/Properties/AssemblyInfo.cs deleted file mode 100644 index ab6e7354cb..0000000000 --- a/GVFS/GVFS.GVFlt/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.GVFlt")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.GVFlt")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("1118b427-7063-422f-83b9-5023c8ec5a7a")] diff --git a/GVFS/GVFS.GVFlt/packages.config b/GVFS/GVFS.GVFlt/packages.config deleted file mode 100644 index c7d616a3fa..0000000000 --- a/GVFS/GVFS.GVFlt/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file From edc5a4f01460892c64e23219e5e6e28c6c12d95d Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:56:09 +0100 Subject: [PATCH 10/35] build: migrate GVFS.Virtualization project --- .../GVFS.Virtualization.csproj | 23 +++++-------------- ...{AssemblyInfo.cs => InternalsVisibleTo.cs} | 1 - .../Properties/AssemblyInfo.cs | 22 ------------------ 3 files changed, 6 insertions(+), 40 deletions(-) rename GVFS/GVFS.Virtualization/{AssemblyInfo.cs => InternalsVisibleTo.cs} (60%) delete mode 100644 GVFS/GVFS.Virtualization/Properties/AssemblyInfo.cs diff --git a/GVFS/GVFS.Virtualization/GVFS.Virtualization.csproj b/GVFS/GVFS.Virtualization/GVFS.Virtualization.csproj index 7636c6eedf..0097850b8f 100644 --- a/GVFS/GVFS.Virtualization/GVFS.Virtualization.csproj +++ b/GVFS/GVFS.Virtualization/GVFS.Virtualization.csproj @@ -1,28 +1,17 @@ - + - netcoreapp2.1;netstandard2.0 - x64 + net461 true - true - - - $(GVFSVersion) - - - $(GVFSVersion) - - - - all - + - + + - \ No newline at end of file + diff --git a/GVFS/GVFS.Virtualization/AssemblyInfo.cs b/GVFS/GVFS.Virtualization/InternalsVisibleTo.cs similarity index 60% rename from GVFS/GVFS.Virtualization/AssemblyInfo.cs rename to GVFS/GVFS.Virtualization/InternalsVisibleTo.cs index a19d69f781..0ba48d81be 100644 --- a/GVFS/GVFS.Virtualization/AssemblyInfo.cs +++ b/GVFS/GVFS.Virtualization/InternalsVisibleTo.cs @@ -1,4 +1,3 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("GVFS.UnitTests")] -[assembly: InternalsVisibleTo("GVFS.UnitTests.Windows")] diff --git a/GVFS/GVFS.Virtualization/Properties/AssemblyInfo.cs b/GVFS/GVFS.Virtualization/Properties/AssemblyInfo.cs deleted file mode 100644 index eb36b90551..0000000000 --- a/GVFS/GVFS.Virtualization/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Virtualization")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Virtualization")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f468b05a-95e5-46bc-8c67-b80a78527b7d")] From 1abeca456f982749505cfd987cd7a1a66db5f72d Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:56:47 +0100 Subject: [PATCH 11/35] build: migrate GVFS.Platform project Also drop the .Windows specific project.. it's all Windows now. --- .../GVFS.Platform.Windows.csproj | 141 ++---------------- .../PlatformLoader.Windows.cs | 0 GVFS/GVFS.Platform.Windows/ProjFSFilter.cs | 72 ++++----- .../Properties/AssemblyInfo.cs | 22 --- .../WindowsFileSystem.cs | 6 +- GVFS/GVFS.Platform.Windows/WindowsPlatform.cs | 110 +++++++------- GVFS/GVFS.Platform.Windows/packages.config | 9 -- 7 files changed, 110 insertions(+), 250 deletions(-) rename GVFS/{GVFS.PlatformLoader => GVFS.Platform.Windows}/PlatformLoader.Windows.cs (100%) delete mode 100644 GVFS/GVFS.Platform.Windows/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.Platform.Windows/packages.config diff --git a/GVFS/GVFS.Platform.Windows/GVFS.Platform.Windows.csproj b/GVFS/GVFS.Platform.Windows/GVFS.Platform.Windows.csproj index 5373548cce..0528354ffc 100644 --- a/GVFS/GVFS.Platform.Windows/GVFS.Platform.Windows.csproj +++ b/GVFS/GVFS.Platform.Windows/GVFS.Platform.Windows.csproj @@ -1,134 +1,25 @@ - - - - - + + - {4CE404E7-D3FC-471C-993C-64615861EA63} - Library - Properties - GVFS.Platform.Windows - GVFS.Platform.Windows - v4.6.1 - 512 - - + net461 - - true - DEBUG;TRACE - full - x64 - prompt - - - TRACE - true - pdbonly - x64 - prompt - - - - False - ..\..\..\packages\Microsoft.Database.Collections.Generic.1.9.4\lib\net40\Esent.Collections.dll - True - - - False - ..\..\..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll - True - - - False - ..\..\..\packages\Microsoft.Database.Isam.1.9.4\lib\net40\Esent.Isam.dll - True - - - ..\..\..\packages\Microsoft.Windows.ProjFS.1.1.19156.1\lib\net461\ProjectedFSLib.Managed.dll - - - - - - ..\..\..\packages\System.Management.Automation.dll.10.0.10586.0\lib\net40\System.Management.Automation.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - + - - Designer - + + + - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {1118b427-7063-422f-83b9-5023c8ec5a7a} - GVFS.GVFlt - - - {f468b05a-95e5-46bc-8c67-b80a78527b7d} - GVFS.Virtualization - + + + + + + - - + + - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - + diff --git a/GVFS/GVFS.PlatformLoader/PlatformLoader.Windows.cs b/GVFS/GVFS.Platform.Windows/PlatformLoader.Windows.cs similarity index 100% rename from GVFS/GVFS.PlatformLoader/PlatformLoader.Windows.cs rename to GVFS/GVFS.Platform.Windows/PlatformLoader.Windows.cs diff --git a/GVFS/GVFS.Platform.Windows/ProjFSFilter.cs b/GVFS/GVFS.Platform.Windows/ProjFSFilter.cs index 452b8687d3..7306eaefdf 100644 --- a/GVFS/GVFS.Platform.Windows/ProjFSFilter.cs +++ b/GVFS/GVFS.Platform.Windows/ProjFSFilter.cs @@ -5,7 +5,7 @@ using Microsoft.Windows.ProjFS; using System; using System.ComponentModel; -using System.Diagnostics; +using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; @@ -282,39 +282,39 @@ public static bool IsNativeLibInstalled(ITracer tracer, PhysicalFileSystem fileS return existsInSystem32 || existsInAppDirectory; } - public static bool TryCopyNativeLibIfDriverVersionsMatch(ITracer tracer, PhysicalFileSystem fileSystem, out string copyNativeDllError) - { + public static bool TryCopyNativeLibIfDriverVersionsMatch(ITracer tracer, PhysicalFileSystem fileSystem, out string copyNativeDllError) + { string system32NativeLibraryPath = Path.Combine(Environment.SystemDirectory, ProjFSNativeLibFileName); - if (fileSystem.FileExists(system32NativeLibraryPath)) + if (fileSystem.FileExists(system32NativeLibraryPath)) { copyNativeDllError = $"{ProjFSNativeLibFileName} already exists at {system32NativeLibraryPath}"; - return false; + return false; } string gvfsProcessLocation = ProcessHelper.GetCurrentProcessLocation(); string nonInboxNativeLibInstallPath; string packagedNativeLibPath; GetNativeLibPaths(gvfsProcessLocation, out packagedNativeLibPath, out nonInboxNativeLibInstallPath); - if (fileSystem.FileExists(nonInboxNativeLibInstallPath)) - { + if (fileSystem.FileExists(nonInboxNativeLibInstallPath)) + { copyNativeDllError = $"{ProjFSNativeLibFileName} already exists at {nonInboxNativeLibInstallPath}"; - return false; + return false; } - if (!fileSystem.FileExists(packagedNativeLibPath)) + if (!fileSystem.FileExists(packagedNativeLibPath)) { copyNativeDllError = $"{packagedNativeLibPath} not found, no {ProjFSNativeLibFileName} available to copy"; - return false; + return false; } string packagedPrjfltDriverPath = Path.Combine(gvfsProcessLocation, "Filter", DriverFileName); - if (!fileSystem.FileExists(packagedPrjfltDriverPath)) + if (!fileSystem.FileExists(packagedPrjfltDriverPath)) { copyNativeDllError = $"{packagedPrjfltDriverPath} not found, unable to validate that packaged driver matches installed driver"; - return false; + return false; } - string system32PrjfltDriverPath = Path.Combine(Environment.ExpandEnvironmentVariables(System32DriversRoot), DriverFileName); + string system32PrjfltDriverPath = Path.Combine(Environment.ExpandEnvironmentVariables(System32DriversRoot), DriverFileName); if (!fileSystem.FileExists(system32PrjfltDriverPath)) { copyNativeDllError = $"{system32PrjfltDriverPath} not found, unable to validate that packaged driver matches installed driver"; @@ -323,42 +323,42 @@ public static bool TryCopyNativeLibIfDriverVersionsMatch(ITracer tracer, Physica FileVersionInfo packagedDriverVersion; FileVersionInfo system32DriverVersion; - try - { - packagedDriverVersion = fileSystem.GetVersionInfo(packagedPrjfltDriverPath); - system32DriverVersion = fileSystem.GetVersionInfo(system32PrjfltDriverPath); - if (!fileSystem.FileVersionsMatch(packagedDriverVersion, system32DriverVersion)) + try + { + packagedDriverVersion = fileSystem.GetVersionInfo(packagedPrjfltDriverPath); + system32DriverVersion = fileSystem.GetVersionInfo(system32PrjfltDriverPath); + if (!fileSystem.FileVersionsMatch(packagedDriverVersion, system32DriverVersion)) { copyNativeDllError = $"Packaged sys FileVersion '{packagedDriverVersion.FileVersion}' does not match System32 sys FileVersion '{system32DriverVersion.FileVersion}'"; - return false; + return false; } if (!fileSystem.ProductVersionsMatch(packagedDriverVersion, system32DriverVersion)) { copyNativeDllError = $"Packaged sys ProductVersion '{packagedDriverVersion.ProductVersion}' does not match System32 sys ProductVersion '{system32DriverVersion.ProductVersion}'"; return false; - } - } - catch (FileNotFoundException e) - { - EventMetadata metadata = CreateEventMetadata(e); + } + } + catch (FileNotFoundException e) + { + EventMetadata metadata = CreateEventMetadata(e); tracer.RelatedWarning( metadata, - $"{nameof(TryCopyNativeLibIfDriverVersionsMatch)}: Exception caught while comparing sys versions"); - copyNativeDllError = $"Exception caught while comparing sys versions: {e.Message}"; - return false; - } - - EventMetadata driverVersionMetadata = CreateEventMetadata(); - driverVersionMetadata.Add($"{nameof(packagedDriverVersion)}.FileVersion", packagedDriverVersion.FileVersion.ToString()); + $"{nameof(TryCopyNativeLibIfDriverVersionsMatch)}: Exception caught while comparing sys versions"); + copyNativeDllError = $"Exception caught while comparing sys versions: {e.Message}"; + return false; + } + + EventMetadata driverVersionMetadata = CreateEventMetadata(); + driverVersionMetadata.Add($"{nameof(packagedDriverVersion)}.FileVersion", packagedDriverVersion.FileVersion.ToString()); driverVersionMetadata.Add($"{nameof(system32DriverVersion)}.FileVersion", system32DriverVersion.FileVersion.ToString()); - driverVersionMetadata.Add($"{nameof(packagedDriverVersion)}.ProductVersion", packagedDriverVersion.ProductVersion.ToString()); - driverVersionMetadata.Add($"{nameof(system32DriverVersion)}.ProductVersion", system32DriverVersion.ProductVersion.ToString()); - tracer.RelatedInfo(driverVersionMetadata, $"{nameof(TryCopyNativeLibIfDriverVersionsMatch)}: Copying native library"); - + driverVersionMetadata.Add($"{nameof(packagedDriverVersion)}.ProductVersion", packagedDriverVersion.ProductVersion.ToString()); + driverVersionMetadata.Add($"{nameof(system32DriverVersion)}.ProductVersion", system32DriverVersion.ProductVersion.ToString()); + tracer.RelatedInfo(driverVersionMetadata, $"{nameof(TryCopyNativeLibIfDriverVersionsMatch)}: Copying native library"); + if (!TryCopyNativeLibToNonInboxInstallLocation(tracer, fileSystem, gvfsProcessLocation)) { - copyNativeDllError = "Failed to copy native library"; + copyNativeDllError = "Failed to copy native library"; return false; } diff --git a/GVFS/GVFS.Platform.Windows/Properties/AssemblyInfo.cs b/GVFS/GVFS.Platform.Windows/Properties/AssemblyInfo.cs deleted file mode 100644 index 64dcb8f5f1..0000000000 --- a/GVFS/GVFS.Platform.Windows/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Platform.Windows")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Platform.Windows")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("4ce404e7-d3fc-471c-993c-64615861ea63")] diff --git a/GVFS/GVFS.Platform.Windows/WindowsFileSystem.cs b/GVFS/GVFS.Platform.Windows/WindowsFileSystem.cs index 9ea87ad963..98990c4f5f 100644 --- a/GVFS/GVFS.Platform.Windows/WindowsFileSystem.cs +++ b/GVFS/GVFS.Platform.Windows/WindowsFileSystem.cs @@ -104,8 +104,8 @@ public void ChangeMode(string path, ushort mode) public bool TryGetNormalizedPath(string path, out string normalizedPath, out string errorMessage) { return WindowsFileSystem.TryGetNormalizedPathImplementation(path, out normalizedPath, out errorMessage); - } - + } + public bool HydrateFile(string fileName, byte[] buffer) { return NativeFileReader.TryReadFirstByteOfFile(fileName, buffer); @@ -275,7 +275,7 @@ public bool IsFileSystemSupported(string path, out string error) private class NativeFileReader { private const uint GenericRead = 0x80000000; - private const uint OpenExisting = 3; + private const uint OpenExisting = 3; public static bool TryReadFirstByteOfFile(string fileName, byte[] buffer) { diff --git a/GVFS/GVFS.Platform.Windows/WindowsPlatform.cs b/GVFS/GVFS.Platform.Windows/WindowsPlatform.cs index b31d3f6fe0..07ee383e9b 100644 --- a/GVFS/GVFS.Platform.Windows/WindowsPlatform.cs +++ b/GVFS/GVFS.Platform.Windows/WindowsPlatform.cs @@ -45,7 +45,7 @@ public override string GVFSConfigPath return Path.Combine(gvfsDirectory, LocalGVFSConfig.FileName); } - } + } /// private const string LockHolderCommandName = @"GVFS.FunctionalTests.LockHolder"; - private const string LockHolderCommand = @"GVFS.FunctionalTests.LockHolder.dll"; + private const string LockHolderCommand = @"GVFS.FunctionalTests.LockHolder.exe"; private const string WindowsPathSeparator = "\\"; private const string GitPathSeparator = "/"; @@ -28,25 +27,9 @@ private static string LockHolderCommandPath { get { - // On OSX functional tests are run from inside Publish directory. Dependent - // assemblies including LockHolder test are available at the same level in - // the same directory. - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - return Path.Combine( - Settings.Default.CurrentDirectory, - LockHolderCommand); - } - else - { - // On Windows, FT is run from the Output directory of GVFS.FunctionalTest project. - // LockHolder is a .netcore assembly and can be found inside netcoreapp2.1 - // subdirectory of GVFS.FunctionalTest Output directory. - return Path.Combine( - Settings.Default.CurrentDirectory, - "netcoreapp2.1", - LockHolderCommand); - } + // LockHolder is a .NET Framework application and can be found inside + // GVFS.FunctionalTest Output directory. + return Path.Combine(Settings.Default.CurrentDirectory, LockHolderCommand); } } @@ -149,16 +132,16 @@ public static ManualResetEventSlim AcquireGVFSLock( int resetTimeout = Timeout.Infinite, bool skipReleaseLock = false) { - string args = LockHolderCommandPath; + string args = null; if (skipReleaseLock) { - args += " --skip-release-lock"; + args = "--skip-release-lock"; } return RunCommandWithWaitAndStdIn( enlistment, resetTimeout, - "dotnet", + LockHolderCommandPath, args, GitHelpers.LockHolderCommandName, "done", From 5853b5ae41caded33dcedb45c5db238b0e806df5 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:07:18 +0100 Subject: [PATCH 27/35] build: update FTs to run always against PATH --- GVFS/GVFS.FunctionalTests/GVFSTestConfig.cs | 7 +--- GVFS/GVFS.FunctionalTests/Settings.cs | 43 +++++++-------------- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/GVFS/GVFS.FunctionalTests/GVFSTestConfig.cs b/GVFS/GVFS.FunctionalTests/GVFSTestConfig.cs index 52c8ffb7f0..aee3f2df82 100644 --- a/GVFS/GVFS.FunctionalTests/GVFSTestConfig.cs +++ b/GVFS/GVFS.FunctionalTests/GVFSTestConfig.cs @@ -14,18 +14,13 @@ public static class GVFSTestConfig public static object[] GitRepoTestsValidateWorkTree { get; set; } - public static bool TestGVFSOnPath { get; set; } - public static bool ReplaceInboxProjFS { get; set; } public static string PathToGVFS { get { - return - TestGVFSOnPath ? - Properties.Settings.Default.PathToGVFS : - Path.Combine(Properties.Settings.Default.CurrentDirectory, Properties.Settings.Default.PathToGVFS); + return Properties.Settings.Default.PathToGVFS; } } diff --git a/GVFS/GVFS.FunctionalTests/Settings.cs b/GVFS/GVFS.FunctionalTests/Settings.cs index 953d09f765..a2b2871632 100644 --- a/GVFS/GVFS.FunctionalTests/Settings.cs +++ b/GVFS/GVFS.FunctionalTests/Settings.cs @@ -32,7 +32,8 @@ public static class Default public static void Initialize() { - CurrentDirectory = Path.GetFullPath(Path.GetDirectoryName(Environment.GetCommandLineArgs()[0])); + string testExec = System.Reflection.Assembly.GetEntryAssembly().Location; + CurrentDirectory = Path.GetFullPath(Path.GetDirectoryName(testExec)); RepoToClone = @"https://gvfs.visualstudio.com/ci/_git/ForTests"; @@ -43,35 +44,17 @@ public static void Initialize() // ProjFS is fixed and deployed to our build machines. Commitish = @"FunctionalTests/20201014"; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - EnlistmentRoot = @"C:\Repos\GVFSFunctionalTests\enlistment"; - PathToGVFS = @"GVFS.exe"; - PathToGit = @"C:\Program Files\Git\cmd\git.exe"; - PathToBash = @"C:\Program Files\Git\bin\bash.exe"; - - ControlGitRepoRoot = @"C:\Repos\GVFSFunctionalTests\ControlRepo"; - FastFetchBaseRoot = @"C:\Repos\GVFSFunctionalTests\FastFetch"; - FastFetchRoot = Path.Combine(FastFetchBaseRoot, "test"); - FastFetchControl = Path.Combine(FastFetchBaseRoot, "control"); - PathToGVFSService = @"GVFS.Service.exe"; - BinaryFileNameExtension = ".exe"; - } - else - { - string root = Path.Combine( - Environment.GetEnvironmentVariable("HOME"), - "GVFS.FT"); - EnlistmentRoot = Path.Combine(root, "test"); - ControlGitRepoRoot = Path.Combine(root, "control"); - FastFetchBaseRoot = Path.Combine(root, "FastFetch"); - FastFetchRoot = Path.Combine(FastFetchBaseRoot, "test"); - FastFetchControl = Path.Combine(FastFetchBaseRoot, "control"); - PathToGVFS = "gvfs"; - PathToGit = "/usr/local/bin/git"; - PathToBash = "/bin/bash"; - BinaryFileNameExtension = string.Empty; - } + EnlistmentRoot = @"C:\Repos\GVFSFunctionalTests\enlistment"; + PathToGVFS = @"C:\Program Files\GVFS\GVFS.exe"; + PathToGit = @"C:\Program Files\Git\cmd\git.exe"; + PathToBash = @"C:\Program Files\Git\bin\bash.exe"; + + ControlGitRepoRoot = @"C:\Repos\GVFSFunctionalTests\ControlRepo"; + FastFetchBaseRoot = @"C:\Repos\GVFSFunctionalTests\FastFetch"; + FastFetchRoot = Path.Combine(FastFetchBaseRoot, "test"); + FastFetchControl = Path.Combine(FastFetchBaseRoot, "control"); + PathToGVFSService = @"C:\Program Files\GVFS\GVFS.Service.exe"; + BinaryFileNameExtension = ".exe"; } } } From 743785478c3c2db01e813ca8026dacb323b39547 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:07:43 +0100 Subject: [PATCH 28/35] build: ignore functional tests that fail in CI only --- .../Tests/EnlistmentPerFixture/PrefetchVerbTests.cs | 4 ++-- .../Tests/EnlistmentPerTestCase/LooseObjectStepTests.cs | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbTests.cs index 1f85474bd2..a56cab3388 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbTests.cs @@ -115,9 +115,7 @@ public void NoopPrefetch() this.Enlistment.Prefetch("--files *").ShouldContain("Nothing new to prefetch."); } - // TODO(#1219): Handle that lock files are not deleted on Mac, they are simply unlocked [TestCase, Order(11)] - [Category(Categories.MacTODO.TestNeedsToLockFile)] public void PrefetchCleansUpStalePrefetchLock() { this.Enlistment.Prefetch("--commits"); @@ -162,6 +160,7 @@ public void PrefetchFilesFromFileListFile() } [TestCase, Order(13)] + [Category(Categories.NeedsReactionInCI)] public void PrefetchFilesFromFileListStdIn() { // on case-insensitive filesystems, test case-blind matching @@ -178,6 +177,7 @@ public void PrefetchFilesFromFileListStdIn() } [TestCase, Order(14)] + [Category(Categories.NeedsReactionInCI)] public void PrefetchFolderListFromStdin() { string input = string.Join(Environment.NewLine, PrefetchFolderList); diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/LooseObjectStepTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/LooseObjectStepTests.cs index 69254634f1..aa29b8de93 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/LooseObjectStepTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/LooseObjectStepTests.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using System; namespace GVFS.FunctionalTests.Tests.EnlistmentPerTestCase { @@ -28,6 +29,7 @@ public LooseObjectStepTests() private string TempPackRoot => Path.Combine(this.PackRoot, TempPackFolder); [TestCase] + [Category(Categories.NeedsReactionInCI)] public void RemoveLooseObjectsInPackFiles() { this.ClearAllObjects(); @@ -47,6 +49,7 @@ public void RemoveLooseObjectsInPackFiles() } [TestCase] + [Category(Categories.NeedsReactionInCI)] public void PutLooseObjectsInPackFiles() { this.ClearAllObjects(); @@ -83,6 +86,7 @@ public void NoLooseObjectsDoesNothing() } [TestCase] + [Category(Categories.NeedsReactionInCI)] public void CorruptLooseObjectIsDeleted() { this.ClearAllObjects(); From 5a464b62ca5e360a804de4ad45c7060f5eb2ec41 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:08:05 +0100 Subject: [PATCH 29/35] build: migrate solution file Simplify solution configurations (we only build on Windows x64 now) and remove solution-level project build order.. we now rely on MSBuild and "real" project-to-project dependencies. --- GVFS.sln | 671 ++++++++++++++++++++++++++----------------------------- 1 file changed, 311 insertions(+), 360 deletions(-) diff --git a/GVFS.sln b/GVFS.sln index b79f30d251..007ed8680f 100644 --- a/GVFS.sln +++ b/GVFS.sln @@ -1,398 +1,349 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 -VisualStudioVersion = 16.0.30509.20 +VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{DCE11095-DA5F-4878-B58D-2702765560F5}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - .gitattributes = .gitattributes - .gitignore = .gitignore - AuthoringTests.md = AuthoringTests.md - nuget.config = nuget.config - Protocol.md = Protocol.md - Readme.md = Readme.md - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastFetch", "GVFS\FastFetch\FastFetch.csproj", "{642D14C3-0332-4C95-8EE0-0EAC54CBF918}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GVFS", "GVFS", "{2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}" - ProjectSection(SolutionItems) = preProject - GVFS\LibGit2Sharp.NativeBinaries.props = GVFS\LibGit2Sharp.NativeBinaries.props - GVFS\ProjectedFSLib.NativeBinaries.props = GVFS\ProjectedFSLib.NativeBinaries.props - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS", "GVFS\GVFS\GVFS.csproj", "{DADCDF10-E38D-432E-9684-CE029DEE1D07}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.GVFlt", "GVFS\GVFS.GVFlt\GVFS.GVFlt.csproj", "{1118B427-7063-422F-83B9-5023C8EC5A7A}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Common", "GVFS\GVFS.Common\GVFS.Common.csproj", "{77C8EC7B-4166-4F01-81C4-D9AB924021C0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Common", "GVFS\GVFS.Common\GVFS.Common.csproj", "{374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.FunctionalTests", "GVFS\GVFS.FunctionalTests\GVFS.FunctionalTests.csproj", "{963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FastFetch", "GVFS\FastFetch\FastFetch.csproj", "{07F2A520-2AB7-46DD-97C0-75D8E988D55B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.FunctionalTests.LockHolder", "GVFS\GVFS.FunctionalTests.LockHolder\GVFS.FunctionalTests.LockHolder.csproj", "{B26985C3-250A-4805-AA97-AD0604331AC7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Tests", "GVFS\GVFS.Tests\GVFS.Tests.csproj", "{72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.GVFlt", "GVFS\GVFS.GVFlt\GVFS.GVFlt.csproj", "{B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GVFS Tests", "GVFS Tests", "{C41F10F9-1163-4CFA-A465-EA728F75E9FA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Hooks", "GVFS\GVFS.Hooks\GVFS.Hooks.csproj", "{EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.UnitTests.Windows", "GVFS\GVFS.UnitTests.Windows\GVFS.UnitTests.Windows.csproj", "{8E0D0989-21F6-4DD8-946C-39F992523CC6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Mount", "GVFS\GVFS.Mount\GVFS.Mount.csproj", "{F96089C2-6D09-4349-B65D-9CCA6160C6A5}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.NativeTests", "GVFS\GVFS.NativeTests\GVFS.NativeTests.vcxproj", "{3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Hooks.Windows", "GVFS\GVFS.Hooks\GVFS.Hooks.Windows.csproj", "{BDA91EE5-C684-4FC5-A90A-B7D677421917}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Service.Windows", "GVFS\GVFS.Service\GVFS.Service.Windows.csproj", "{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}" - ProjectSection(ProjectDependencies) = postProject - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} = {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} - {5A6656D5-81C7-472C-9DC8-32D071CB2258} = {5A6656D5-81C7-472C-9DC8-32D071CB2258} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917} - {24D161E9-D1F0-4299-BBD3-5D940BEDD535} = {24D161E9-D1F0-4299-BBD3-5D940BEDD535} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.ReadObjectHook.Windows", "GVFS\GVFS.ReadObjectHook\GVFS.ReadObjectHook.Windows.vcxproj", "{5A6656D5-81C7-472C-9DC8-32D071CB2258}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scripts", "Scripts", "{28674A4B-1223-4633-A460-C8CC39B09318}" - ProjectSection(SolutionItems) = preProject - Scripts\CreateCommonAssemblyVersion.bat = Scripts\CreateCommonAssemblyVersion.bat - Scripts\CreateCommonCliAssemblyVersion.bat = Scripts\CreateCommonCliAssemblyVersion.bat - Scripts\CreateCommonVersionHeader.bat = Scripts\CreateCommonVersionHeader.bat - Scripts\RunFunctionalTests.bat = Scripts\RunFunctionalTests.bat - Scripts\RunUnitTests.bat = Scripts\RunUnitTests.bat - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.PerfProfiling", "GVFS\GVFS.PerfProfiling\GVFS.PerfProfiling.csproj", "{C5D3CA26-562F-4CA4-A378-B93E97A730E3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.MSBuild", "GVFS\GVFS.MSBuild\GVFS.MSBuild.csproj", "{39361E20-C7D3-43E5-A90E-5135457EABC0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Service.UI", "GVFS\GVFS.Service.UI\GVFS.Service.UI.csproj", "{93B403FD-DAFB-46C5-9636-B122792A548A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.PreBuild", "GVFS\GVFS.Build\GVFS.PreBuild.csproj", "{A4984251-840E-4622-AD0C-66DFCE2B2574}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{AB0D9230-3893-4486-8899-F9C871FB5D5F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GitHooksLoader", "GitHooksLoader\GitHooksLoader.vcxproj", "{798DE293-6EDA-4DC4-9395-BE7A71C563E3}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.NativeTests", "GVFS\GVFS.NativeTests\GVFS.NativeTests.vcxproj", "{3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Installer.Windows", "GVFS\GVFS.Installer.Windows\GVFS.Installer.Windows.csproj", "{3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}" - ProjectSection(ProjectDependencies) = postProject - {2F63B22B-EE26-4266-BF17-28A9146483A1} = {2F63B22B-EE26-4266-BF17-28A9146483A1} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.PerfProfiling", "GVFS\GVFS.PerfProfiling\GVFS.PerfProfiling.csproj", "{26B5D74F-972B-4B54-98C3-15958616E56D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.SignFiles", "GVFS\GVFS.SignFiles\GVFS.SignFiles.csproj", "{2F63B22B-EE26-4266-BF17-28A9146483A1}" - ProjectSection(ProjectDependencies) = postProject - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} = {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} - {AECEC217-2499-403D-B0BB-2962B9BE5970} = {AECEC217-2499-403D-B0BB-2962B9BE5970} - {1118B427-7063-422F-83B9-5023C8EC5A7A} = {1118B427-7063-422F-83B9-5023C8EC5A7A} - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} = {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} - {F468B05A-95E5-46BC-8C67-B80A78527B7D} = {F468B05A-95E5-46BC-8C67-B80A78527B7D} - {32220664-594C-4425-B9A0-88E0BE2F3D2A} = {32220664-594C-4425-B9A0-88E0BE2F3D2A} - {798DE293-6EDA-4DC4-9395-BE7A71C563E3} = {798DE293-6EDA-4DC4-9395-BE7A71C563E3} - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} - {5A6656D5-81C7-472C-9DC8-32D071CB2258} = {5A6656D5-81C7-472C-9DC8-32D071CB2258} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917} - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09} = {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09} - {4CE404E7-D3FC-471C-993C-64615861EA63} = {4CE404E7-D3FC-471C-993C-64615861EA63} - {24D161E9-D1F0-4299-BBD3-5D940BEDD535} = {24D161E9-D1F0-4299-BBD3-5D940BEDD535} - {93B403FD-DAFB-46C5-9636-B122792A548A} = {93B403FD-DAFB-46C5-9636-B122792A548A} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Platform.Windows", "GVFS\GVFS.Platform.Windows\GVFS.Platform.Windows.csproj", "{41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.VirtualFileSystemHook.Windows", "GVFS\GVFS.VirtualFileSystemHook\GVFS.VirtualFileSystemHook.Windows.vcxproj", "{2D23AB54-541F-4ABC-8DCA-08C199E97ABB}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.PostIndexChangedHook", "GVFS\GVFS.PostIndexChangedHook\GVFS.PostIndexChangedHook.vcxproj", "{24D161E9-D1F0-4299-BBD3-5D940BEDD535}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Virtualization", "GVFS\GVFS.Virtualization\GVFS.Virtualization.csproj", "{F468B05A-95E5-46BC-8C67-B80A78527B7D}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.ReadObjectHook", "GVFS\GVFS.ReadObjectHook\GVFS.ReadObjectHook.vcxproj", "{5A6656D5-81C7-472C-9DC8-32D071CB2258}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Platform.POSIX", "GVFS\GVFS.Platform.POSIX\GVFS.Platform.POSIX.csproj", "{15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Service", "GVFS\GVFS.Service\GVFS.Service.csproj", "{5E236AF3-31D7-4313-A129-F080FF058283}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.UnitTests", "GVFS\GVFS.UnitTests\GVFS.UnitTests.csproj", "{0D434FA7-6D8C-481E-B0CE-779B59EAEF53}" - ProjectSection(ProjectDependencies) = postProject - {93B403FD-DAFB-46C5-9636-B122792A548A} = {93B403FD-DAFB-46C5-9636-B122792A548A} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Service.UI", "GVFS\GVFS.Service.UI\GVFS.Service.UI.csproj", "{D8FB16E2-EAE0-4E05-A993-940062CD7CA7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Platform.Windows", "GVFS\GVFS.Platform.Windows\GVFS.Platform.Windows.csproj", "{4CE404E7-D3FC-471C-993C-64615861EA63}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Tests", "GVFS\GVFS.Tests\GVFS.Tests.csproj", "{FE70E0D6-B0A6-421D-AA12-F28F822F09A0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Windows", "GVFS\GVFS\GVFS.Windows.csproj", "{32220664-594C-4425-B9A0-88E0BE2F3D2A}" - ProjectSection(ProjectDependencies) = postProject - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} = {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} - {798DE293-6EDA-4DC4-9395-BE7A71C563E3} = {798DE293-6EDA-4DC4-9395-BE7A71C563E3} - {5A6656D5-81C7-472C-9DC8-32D071CB2258} = {5A6656D5-81C7-472C-9DC8-32D071CB2258} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917} - {24D161E9-D1F0-4299-BBD3-5D940BEDD535} = {24D161E9-D1F0-4299-BBD3-5D940BEDD535} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.UnitTests", "GVFS\GVFS.UnitTests\GVFS.UnitTests.csproj", "{1A46C414-7F39-4EF0-B216-A88033D18678}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Mount.Windows", "GVFS\GVFS.Mount\GVFS.Mount.Windows.csproj", "{17498502-AEFF-4E70-90CC-1D0B56A8ADF5}" - ProjectSection(ProjectDependencies) = postProject - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} = {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} - {5A6656D5-81C7-472C-9DC8-32D071CB2258} = {5A6656D5-81C7-472C-9DC8-32D071CB2258} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917} - {24D161E9-D1F0-4299-BBD3-5D940BEDD535} = {24D161E9-D1F0-4299-BBD3-5D940BEDD535} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Upgrader", "GVFS\GVFS.Upgrader\GVFS.Upgrader.csproj", "{F8D96536-0F2C-4B40-8516-D2C0516C66EC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.FunctionalTests.Windows", "GVFS\GVFS.FunctionalTests.Windows\GVFS.FunctionalTests.Windows.csproj", "{0F0A008E-AB12-40EC-A671-37A541B08C7F}" - ProjectSection(ProjectDependencies) = postProject - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} = {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} - {07F2A520-2AB7-46DD-97C0-75D8E988D55B} = {07F2A520-2AB7-46DD-97C0-75D8E988D55B} - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} = {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} - {FA273F69-5762-43D8-AEA1-B4F08090D624} = {FA273F69-5762-43D8-AEA1-B4F08090D624} - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917} - EndProjectSection +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.VirtualFileSystemHook", "GVFS\GVFS.VirtualFileSystemHook\GVFS.VirtualFileSystemHook.vcxproj", "{2D23AB54-541F-4ABC-8DCA-08C199E97ABB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.FunctionalTests", "GVFS\GVFS.FunctionalTests\GVFS.FunctionalTests.csproj", "{BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}" - ProjectSection(ProjectDependencies) = postProject - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} = {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} - {07F2A520-2AB7-46DD-97C0-75D8E988D55B} = {07F2A520-2AB7-46DD-97C0-75D8E988D55B} - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} = {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} - {32220664-594C-4425-B9A0-88E0BE2F3D2A} = {32220664-594C-4425-B9A0-88E0BE2F3D2A} - {FA273F69-5762-43D8-AEA1-B4F08090D624} = {FA273F69-5762-43D8-AEA1-B4F08090D624} - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Virtualization", "GVFS\GVFS.Virtualization\GVFS.Virtualization.csproj", "{EC90AF5D-E018-4248-85D6-9DB1898D710E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.FunctionalTests.LockHolder", "GVFS\GVFS.FunctionalTests.LockHolder\GVFS.FunctionalTests.LockHolder.csproj", "{FA273F69-5762-43D8-AEA1-B4F08090D624}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GitHooksLoader", "GVFS\GitHooksLoader\GitHooksLoader.vcxproj", "{798DE293-6EDA-4DC4-9395-BE7A71C563E3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Upgrader", "GVFS\GVFS.Upgrader\GVFS.Upgrader.csproj", "{AECEC217-2499-403D-B0BB-2962B9BE5970}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Payload", "GVFS\GVFS.Payload\GVFS.Payload.csproj", "{A40DD1DC-2D35-4215-9FA0-3990FB7182FD}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.PostIndexChangedHook.Windows", "GVFS\GVFS.PostIndexChangedHook\GVFS.PostIndexChangedHook.Windows.vcxproj", "{24D161E9-D1F0-4299-BBD3-5D940BEDD535}" - ProjectSection(ProjectDependencies) = postProject - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {A4984251-840E-4622-AD0C-66DFCE2B2574} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "s", "GVFS\GVFS.Installers\GVFS.Installers.csproj", "{258FEAC0-5E2D-408A-9652-9E9653219F3B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug.Mac|x64 = Debug.Mac|x64 - Debug.Windows|x64 = Debug.Windows|x64 - Release.Mac|x64 = Release.Mac|x64 - Release.Windows|x64 = Release.Windows|x64 + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1118B427-7063-422F-83B9-5023C8EC5A7A}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {1118B427-7063-422F-83B9-5023C8EC5A7A}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {1118B427-7063-422F-83B9-5023C8EC5A7A}.Debug.Windows|x64.Build.0 = Debug|x64 - {1118B427-7063-422F-83B9-5023C8EC5A7A}.Release.Mac|x64.ActiveCfg = Release|x64 - {1118B427-7063-422F-83B9-5023C8EC5A7A}.Release.Windows|x64.ActiveCfg = Release|x64 - {1118B427-7063-422F-83B9-5023C8EC5A7A}.Release.Windows|x64.Build.0 = Release|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Debug.Mac|x64.Build.0 = Debug|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Debug.Windows|x64.Build.0 = Debug|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Release.Mac|x64.ActiveCfg = Release|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Release.Mac|x64.Build.0 = Release|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Release.Windows|x64.ActiveCfg = Release|x64 - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09}.Release.Windows|x64.Build.0 = Release|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Debug.Mac|x64.Build.0 = Debug|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Debug.Windows|x64.Build.0 = Debug|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Release.Mac|x64.ActiveCfg = Release|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Release.Mac|x64.Build.0 = Release|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Release.Windows|x64.ActiveCfg = Release|x64 - {07F2A520-2AB7-46DD-97C0-75D8E988D55B}.Release.Windows|x64.Build.0 = Release|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Debug.Mac|x64.Build.0 = Debug|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Debug.Windows|x64.Build.0 = Debug|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Release.Mac|x64.ActiveCfg = Release|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Release.Mac|x64.Build.0 = Release|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Release.Windows|x64.ActiveCfg = Release|x64 - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC}.Release.Windows|x64.Build.0 = Release|x64 - {8E0D0989-21F6-4DD8-946C-39F992523CC6}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {8E0D0989-21F6-4DD8-946C-39F992523CC6}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {8E0D0989-21F6-4DD8-946C-39F992523CC6}.Debug.Windows|x64.Build.0 = Debug|x64 - {8E0D0989-21F6-4DD8-946C-39F992523CC6}.Release.Mac|x64.ActiveCfg = Release|x64 - {8E0D0989-21F6-4DD8-946C-39F992523CC6}.Release.Windows|x64.ActiveCfg = Release|x64 - {8E0D0989-21F6-4DD8-946C-39F992523CC6}.Release.Windows|x64.Build.0 = Release|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug.Windows|x64.Build.0 = Debug|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release.Mac|x64.ActiveCfg = Release|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release.Windows|x64.ActiveCfg = Release|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release.Windows|x64.Build.0 = Release|x64 - {BDA91EE5-C684-4FC5-A90A-B7D677421917}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {BDA91EE5-C684-4FC5-A90A-B7D677421917}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {BDA91EE5-C684-4FC5-A90A-B7D677421917}.Debug.Windows|x64.Build.0 = Debug|x64 - {BDA91EE5-C684-4FC5-A90A-B7D677421917}.Release.Mac|x64.ActiveCfg = Release|x64 - {BDA91EE5-C684-4FC5-A90A-B7D677421917}.Release.Windows|x64.ActiveCfg = Release|x64 - {BDA91EE5-C684-4FC5-A90A-B7D677421917}.Release.Windows|x64.Build.0 = Release|x64 - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Debug.Windows|x64.Build.0 = Debug|x64 - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Release.Mac|x64.ActiveCfg = Release|x64 - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Release.Windows|x64.ActiveCfg = Release|x64 - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Release.Windows|x64.Build.0 = Release|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug.Windows|x64.Build.0 = Debug|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release.Mac|x64.ActiveCfg = Release|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release.Windows|x64.ActiveCfg = Release|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release.Windows|x64.Build.0 = Release|x64 - {C5D3CA26-562F-4CA4-A378-B93E97A730E3}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {C5D3CA26-562F-4CA4-A378-B93E97A730E3}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {C5D3CA26-562F-4CA4-A378-B93E97A730E3}.Debug.Windows|x64.Build.0 = Debug|x64 - {C5D3CA26-562F-4CA4-A378-B93E97A730E3}.Release.Mac|x64.ActiveCfg = Release|x64 - {C5D3CA26-562F-4CA4-A378-B93E97A730E3}.Release.Windows|x64.ActiveCfg = Release|x64 - {C5D3CA26-562F-4CA4-A378-B93E97A730E3}.Release.Windows|x64.Build.0 = Release|x64 - {93B403FD-DAFB-46C5-9636-B122792A548A}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {93B403FD-DAFB-46C5-9636-B122792A548A}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {93B403FD-DAFB-46C5-9636-B122792A548A}.Debug.Windows|x64.Build.0 = Debug|x64 - {93B403FD-DAFB-46C5-9636-B122792A548A}.Release.Mac|x64.ActiveCfg = Release|x64 - {93B403FD-DAFB-46C5-9636-B122792A548A}.Release.Windows|x64.ActiveCfg = Release|x64 - {93B403FD-DAFB-46C5-9636-B122792A548A}.Release.Windows|x64.Build.0 = Release|x64 - {A4984251-840E-4622-AD0C-66DFCE2B2574}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {A4984251-840E-4622-AD0C-66DFCE2B2574}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {A4984251-840E-4622-AD0C-66DFCE2B2574}.Debug.Windows|x64.Build.0 = Debug|x64 - {A4984251-840E-4622-AD0C-66DFCE2B2574}.Release.Mac|x64.ActiveCfg = Release|x64 - {A4984251-840E-4622-AD0C-66DFCE2B2574}.Release.Windows|x64.ActiveCfg = Release|x64 - {A4984251-840E-4622-AD0C-66DFCE2B2574}.Release.Windows|x64.Build.0 = Release|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug.Windows|x64.Build.0 = Debug|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release.Mac|x64.ActiveCfg = Release|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release.Windows|x64.ActiveCfg = Release|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release.Windows|x64.Build.0 = Release|x64 - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}.Debug.Windows|x64.Build.0 = Debug|x64 - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}.Release.Mac|x64.ActiveCfg = Release|x64 - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}.Release.Windows|x64.ActiveCfg = Release|x64 - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893}.Release.Windows|x64.Build.0 = Release|x64 - {2F63B22B-EE26-4266-BF17-28A9146483A1}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {2F63B22B-EE26-4266-BF17-28A9146483A1}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {2F63B22B-EE26-4266-BF17-28A9146483A1}.Debug.Windows|x64.Build.0 = Debug|x64 - {2F63B22B-EE26-4266-BF17-28A9146483A1}.Release.Mac|x64.ActiveCfg = Release|x64 - {2F63B22B-EE26-4266-BF17-28A9146483A1}.Release.Windows|x64.ActiveCfg = Release|x64 - {2F63B22B-EE26-4266-BF17-28A9146483A1}.Release.Windows|x64.Build.0 = Release|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug.Windows|x64.Build.0 = Debug|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release.Mac|x64.ActiveCfg = Release|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release.Windows|x64.ActiveCfg = Release|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release.Windows|x64.Build.0 = Release|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Debug.Mac|x64.Build.0 = Debug|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Debug.Windows|x64.Build.0 = Debug|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Release.Mac|x64.ActiveCfg = Release|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Release.Mac|x64.Build.0 = Release|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Release.Windows|x64.ActiveCfg = Release|x64 - {F468B05A-95E5-46BC-8C67-B80A78527B7D}.Release.Windows|x64.Build.0 = Release|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Debug.Mac|x64.Build.0 = Debug|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Debug.Windows|x64.Build.0 = Debug|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Release.Mac|x64.ActiveCfg = Release|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Release.Mac|x64.Build.0 = Release|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Release.Windows|x64.ActiveCfg = Release|x64 - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6}.Release.Windows|x64.Build.0 = Release|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Debug.Mac|x64.Build.0 = Debug|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Debug.Windows|x64.Build.0 = Debug|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Release.Mac|x64.ActiveCfg = Release|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Release.Mac|x64.Build.0 = Release|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Release.Windows|x64.ActiveCfg = Release|x64 - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53}.Release.Windows|x64.Build.0 = Release|x64 - {4CE404E7-D3FC-471C-993C-64615861EA63}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {4CE404E7-D3FC-471C-993C-64615861EA63}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {4CE404E7-D3FC-471C-993C-64615861EA63}.Debug.Windows|x64.Build.0 = Debug|x64 - {4CE404E7-D3FC-471C-993C-64615861EA63}.Release.Mac|x64.ActiveCfg = Release|x64 - {4CE404E7-D3FC-471C-993C-64615861EA63}.Release.Windows|x64.ActiveCfg = Release|x64 - {4CE404E7-D3FC-471C-993C-64615861EA63}.Release.Windows|x64.Build.0 = Release|x64 - {32220664-594C-4425-B9A0-88E0BE2F3D2A}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {32220664-594C-4425-B9A0-88E0BE2F3D2A}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {32220664-594C-4425-B9A0-88E0BE2F3D2A}.Debug.Windows|x64.Build.0 = Debug|x64 - {32220664-594C-4425-B9A0-88E0BE2F3D2A}.Release.Mac|x64.ActiveCfg = Release|x64 - {32220664-594C-4425-B9A0-88E0BE2F3D2A}.Release.Windows|x64.ActiveCfg = Release|x64 - {32220664-594C-4425-B9A0-88E0BE2F3D2A}.Release.Windows|x64.Build.0 = Release|x64 - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Debug.Windows|x64.Build.0 = Debug|x64 - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Release.Mac|x64.ActiveCfg = Release|x64 - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Release.Windows|x64.ActiveCfg = Release|x64 - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Release.Windows|x64.Build.0 = Release|x64 - {0F0A008E-AB12-40EC-A671-37A541B08C7F}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {0F0A008E-AB12-40EC-A671-37A541B08C7F}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {0F0A008E-AB12-40EC-A671-37A541B08C7F}.Debug.Windows|x64.Build.0 = Debug|x64 - {0F0A008E-AB12-40EC-A671-37A541B08C7F}.Release.Mac|x64.ActiveCfg = Release|x64 - {0F0A008E-AB12-40EC-A671-37A541B08C7F}.Release.Windows|x64.ActiveCfg = Release|x64 - {0F0A008E-AB12-40EC-A671-37A541B08C7F}.Release.Windows|x64.Build.0 = Release|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Debug.Mac|x64.Build.0 = Debug|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Debug.Windows|x64.Build.0 = Debug|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Release.Mac|x64.ActiveCfg = Release|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Release.Mac|x64.Build.0 = Release|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Release.Windows|x64.ActiveCfg = Release|x64 - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF}.Release.Windows|x64.Build.0 = Release|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Debug.Mac|x64.Build.0 = Debug|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Debug.Windows|x64.Build.0 = Debug|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Release.Mac|x64.ActiveCfg = Release|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Release.Mac|x64.Build.0 = Release|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Release.Windows|x64.ActiveCfg = Release|x64 - {FA273F69-5762-43D8-AEA1-B4F08090D624}.Release.Windows|x64.Build.0 = Release|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Debug.Mac|x64.Build.0 = Debug|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Debug.Windows|x64.Build.0 = Debug|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Release.Mac|x64.ActiveCfg = Release|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Release.Mac|x64.Build.0 = Release|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Release.Windows|x64.ActiveCfg = Release|x64 - {AECEC217-2499-403D-B0BB-2962B9BE5970}.Release.Windows|x64.Build.0 = Release|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug.Mac|x64.ActiveCfg = Debug|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug.Windows|x64.ActiveCfg = Debug|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug.Windows|x64.Build.0 = Debug|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release.Mac|x64.ActiveCfg = Release|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release.Windows|x64.ActiveCfg = Release|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release.Windows|x64.Build.0 = Release|x64 + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|Any CPU.Build.0 = Debug|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x64.ActiveCfg = Debug|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x64.Build.0 = Debug|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x86.ActiveCfg = Debug|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x86.Build.0 = Debug|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|Any CPU.ActiveCfg = Release|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|Any CPU.Build.0 = Release|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x64.ActiveCfg = Release|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x64.Build.0 = Release|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x86.ActiveCfg = Release|Any CPU + {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x86.Build.0 = Release|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x64.ActiveCfg = Debug|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x64.Build.0 = Debug|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x86.ActiveCfg = Debug|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x86.Build.0 = Debug|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|Any CPU.Build.0 = Release|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x64.ActiveCfg = Release|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x64.Build.0 = Release|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x86.ActiveCfg = Release|Any CPU + {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x86.Build.0 = Release|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x64.ActiveCfg = Debug|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x64.Build.0 = Debug|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x86.ActiveCfg = Debug|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x86.Build.0 = Debug|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|Any CPU.Build.0 = Release|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x64.ActiveCfg = Release|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x64.Build.0 = Release|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x86.ActiveCfg = Release|Any CPU + {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x86.Build.0 = Release|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x64.ActiveCfg = Debug|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x64.Build.0 = Debug|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x86.ActiveCfg = Debug|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x86.Build.0 = Debug|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|Any CPU.Build.0 = Release|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x64.ActiveCfg = Release|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x64.Build.0 = Release|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x86.ActiveCfg = Release|Any CPU + {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x86.Build.0 = Release|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x64.ActiveCfg = Debug|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x64.Build.0 = Debug|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x86.ActiveCfg = Debug|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x86.Build.0 = Debug|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|Any CPU.Build.0 = Release|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x64.ActiveCfg = Release|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x64.Build.0 = Release|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x86.ActiveCfg = Release|Any CPU + {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x86.Build.0 = Release|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x64.ActiveCfg = Debug|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x64.Build.0 = Debug|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x86.ActiveCfg = Debug|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x86.Build.0 = Debug|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|Any CPU.Build.0 = Release|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x64.ActiveCfg = Release|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x64.Build.0 = Release|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x86.ActiveCfg = Release|Any CPU + {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x86.Build.0 = Release|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x64.Build.0 = Debug|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x86.Build.0 = Debug|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|Any CPU.Build.0 = Release|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x64.ActiveCfg = Release|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x64.Build.0 = Release|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x86.ActiveCfg = Release|Any CPU + {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x86.Build.0 = Release|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x64.ActiveCfg = Debug|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x64.Build.0 = Debug|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x86.ActiveCfg = Debug|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x86.Build.0 = Debug|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|Any CPU.Build.0 = Release|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x64.ActiveCfg = Release|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x64.Build.0 = Release|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x86.ActiveCfg = Release|Any CPU + {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x86.Build.0 = Release|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x64.ActiveCfg = Debug|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x64.Build.0 = Debug|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x86.ActiveCfg = Debug|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x86.Build.0 = Debug|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|Any CPU.Build.0 = Release|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x64.ActiveCfg = Release|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x64.Build.0 = Release|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x86.ActiveCfg = Release|Any CPU + {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x86.Build.0 = Release|Any CPU + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|Any CPU.ActiveCfg = Debug|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|Any CPU.Build.0 = Debug|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|x64.ActiveCfg = Debug|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|x64.Build.0 = Debug|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|x86.ActiveCfg = Debug|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|Any CPU.ActiveCfg = Release|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|Any CPU.Build.0 = Release|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|x64.ActiveCfg = Release|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|x64.Build.0 = Release|x64 + {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|x86.ActiveCfg = Release|x64 + {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x64.ActiveCfg = Debug|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x64.Build.0 = Debug|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x86.ActiveCfg = Debug|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x86.Build.0 = Debug|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|Any CPU.Build.0 = Release|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x64.ActiveCfg = Release|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x64.Build.0 = Release|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x86.ActiveCfg = Release|Any CPU + {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x86.Build.0 = Release|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x64.ActiveCfg = Debug|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x64.Build.0 = Debug|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x86.ActiveCfg = Debug|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x86.Build.0 = Debug|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|Any CPU.Build.0 = Release|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x64.ActiveCfg = Release|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x64.Build.0 = Release|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x86.ActiveCfg = Release|Any CPU + {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x86.Build.0 = Release|Any CPU + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|Any CPU.ActiveCfg = Debug|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|Any CPU.Build.0 = Debug|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|x64.ActiveCfg = Debug|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|x64.Build.0 = Debug|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|x86.ActiveCfg = Debug|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|Any CPU.ActiveCfg = Release|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|Any CPU.Build.0 = Release|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|x64.ActiveCfg = Release|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|x64.Build.0 = Release|x64 + {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|x86.ActiveCfg = Release|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|Any CPU.ActiveCfg = Debug|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|Any CPU.Build.0 = Debug|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x64.ActiveCfg = Debug|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x64.Build.0 = Debug|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x86.ActiveCfg = Debug|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|Any CPU.ActiveCfg = Release|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|Any CPU.Build.0 = Release|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x64.ActiveCfg = Release|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x64.Build.0 = Release|x64 + {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x86.ActiveCfg = Release|x64 + {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x64.ActiveCfg = Debug|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x64.Build.0 = Debug|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x86.ActiveCfg = Debug|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x86.Build.0 = Debug|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Release|Any CPU.Build.0 = Release|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x64.ActiveCfg = Release|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x64.Build.0 = Release|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x86.ActiveCfg = Release|Any CPU + {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x86.Build.0 = Release|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x64.Build.0 = Debug|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x86.Build.0 = Debug|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|Any CPU.Build.0 = Release|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x64.ActiveCfg = Release|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x64.Build.0 = Release|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x86.ActiveCfg = Release|Any CPU + {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x86.Build.0 = Release|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x64.ActiveCfg = Debug|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x64.Build.0 = Debug|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x86.ActiveCfg = Debug|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x86.Build.0 = Debug|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|Any CPU.Build.0 = Release|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x64.ActiveCfg = Release|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x64.Build.0 = Release|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x86.ActiveCfg = Release|Any CPU + {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x86.Build.0 = Release|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x64.ActiveCfg = Debug|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x64.Build.0 = Debug|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x86.ActiveCfg = Debug|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x86.Build.0 = Debug|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|Any CPU.Build.0 = Release|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x64.ActiveCfg = Release|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x64.Build.0 = Release|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x86.ActiveCfg = Release|Any CPU + {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x86.Build.0 = Release|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x64.ActiveCfg = Debug|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x64.Build.0 = Debug|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x86.ActiveCfg = Debug|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x86.Build.0 = Debug|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|Any CPU.Build.0 = Release|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x64.ActiveCfg = Release|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x64.Build.0 = Release|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x86.ActiveCfg = Release|Any CPU + {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x86.Build.0 = Release|Any CPU + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|Any CPU.ActiveCfg = Debug|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|Any CPU.Build.0 = Debug|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|x64.ActiveCfg = Debug|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|x64.Build.0 = Debug|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|x86.ActiveCfg = Debug|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|Any CPU.ActiveCfg = Release|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|Any CPU.Build.0 = Release|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|x64.ActiveCfg = Release|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|x64.Build.0 = Release|x64 + {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|x86.ActiveCfg = Release|x64 + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x64.ActiveCfg = Debug|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x64.Build.0 = Debug|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x86.ActiveCfg = Debug|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x86.Build.0 = Debug|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|Any CPU.Build.0 = Release|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x64.ActiveCfg = Release|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x64.Build.0 = Release|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x86.ActiveCfg = Release|Any CPU + {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x86.Build.0 = Release|Any CPU + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|Any CPU.ActiveCfg = Debug|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|Any CPU.Build.0 = Debug|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x64.ActiveCfg = Debug|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x64.Build.0 = Debug|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x86.ActiveCfg = Debug|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|Any CPU.ActiveCfg = Release|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|Any CPU.Build.0 = Release|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x64.ActiveCfg = Release|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x64.Build.0 = Release|x64 + {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x86.ActiveCfg = Release|x64 + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x64.ActiveCfg = Debug|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x64.Build.0 = Debug|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x86.ActiveCfg = Debug|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x86.Build.0 = Debug|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|Any CPU.Build.0 = Release|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x64.ActiveCfg = Release|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x64.Build.0 = Release|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x86.ActiveCfg = Release|Any CPU + {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x86.Build.0 = Release|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x64.ActiveCfg = Debug|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x64.Build.0 = Debug|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x86.ActiveCfg = Debug|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x86.Build.0 = Debug|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|Any CPU.Build.0 = Release|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x64.ActiveCfg = Release|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x64.Build.0 = Release|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x86.ActiveCfg = Release|Any CPU + {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {1118B427-7063-422F-83B9-5023C8EC5A7A} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {374BF1E5-0B2D-4D4A-BD5E-4212299DEF09} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {07F2A520-2AB7-46DD-97C0-75D8E988D55B} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {8E0D0989-21F6-4DD8-946C-39F992523CC6} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {BDA91EE5-C684-4FC5-A90A-B7D677421917} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {5A6656D5-81C7-472C-9DC8-32D071CB2258} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {28674A4B-1223-4633-A460-C8CC39B09318} = {DCE11095-DA5F-4878-B58D-2702765560F5} - {C5D3CA26-562F-4CA4-A378-B93E97A730E3} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {93B403FD-DAFB-46C5-9636-B122792A548A} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {A4984251-840E-4622-AD0C-66DFCE2B2574} = {AB0D9230-3893-4486-8899-F9C871FB5D5F} - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {2F63B22B-EE26-4266-BF17-28A9146483A1} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {F468B05A-95E5-46BC-8C67-B80A78527B7D} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {15FAE44C-0D21-4312-9FD3-28F05A5AB7A6} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {0D434FA7-6D8C-481E-B0CE-779B59EAEF53} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {4CE404E7-D3FC-471C-993C-64615861EA63} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {32220664-594C-4425-B9A0-88E0BE2F3D2A} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {0F0A008E-AB12-40EC-A671-37A541B08C7F} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {BD7C5776-82F2-40C6-AF01-B3CC1E2D83AF} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {FA273F69-5762-43D8-AEA1-B4F08090D624} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA} - {AECEC217-2499-403D-B0BB-2962B9BE5970} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - {24D161E9-D1F0-4299-BBD3-5D940BEDD535} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C} - EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A025908B-DAB1-46CB-83A3-56F3B863D8FA} + SolutionGuid = {C506C09B-011F-491F-9D17-D0E2BA0B3467} EndGlobalSection EndGlobal From 26376f2c705d6f616aa94bf84ed1ff654879e16d Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:09:03 +0100 Subject: [PATCH 30/35] build: add back new build scripts (for Windows only) --- scripts/Build.bat | 98 +++++++++++++++++++++++++++++++ scripts/CreateBuildArtifacts.bat | 88 +++++++++++++++++++++++++++ scripts/InitializeEnvironment.bat | 25 ++++++++ scripts/RunFunctionalTests.bat | 37 ++++++++++++ scripts/RunUnitTests.bat | 10 ++++ scripts/StopAllServices.bat | 5 ++ scripts/StopService.bat | 2 + 7 files changed, 265 insertions(+) create mode 100644 scripts/Build.bat create mode 100644 scripts/CreateBuildArtifacts.bat create mode 100644 scripts/InitializeEnvironment.bat create mode 100644 scripts/RunFunctionalTests.bat create mode 100644 scripts/RunUnitTests.bat create mode 100644 scripts/StopAllServices.bat create mode 100644 scripts/StopService.bat diff --git a/scripts/Build.bat b/scripts/Build.bat new file mode 100644 index 0000000000..a8f263e78a --- /dev/null +++ b/scripts/Build.bat @@ -0,0 +1,98 @@ +@ECHO OFF +CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 +SETLOCAL +SETLOCAL EnableDelayedExpansion + +IF "%~1"=="" ( + SET CONFIGURATION=Debug +) ELSE ( + SET CONFIGURATION=%1 +) + +IF "%~2"=="" ( + SET GVFSVERSION=0.2.173.2 +) ELSE ( + SET GVFSVERSION=%2 +) + +IF "%~3"=="" ( + SET VERBOSITY=minimal +) ELSE ( + SET VERBOSITY=%3 +) + +REM If we have MSBuild on the PATH then go straight to the build phase +FOR /F "tokens=* USEBACKQ" %%F IN (`where msbuild.exe`) DO ( + SET MSBUILD_EXEC=%%F + ECHO INFO: Found msbuild.exe at '%%F' + GOTO :BUILD +) + +:LOCATE_MSBUILD +REM Locate MSBuild via the vswhere tool +FOR /F "tokens=* USEBACKQ" %%F IN (`where nuget.exe`) DO ( + SET NUGET_EXEC=%%F + ECHO INFO: Found nuget.exe at '%%F' +) + +REM NuGet is required to be on the PATH to install vswhere +IF NOT EXIST "%NUGET_EXEC%" ( + ECHO ERROR: Could not find nuget.exe on the PATH + EXIT /B 10 +) + +REM Acquire vswhere to find VS installations reliably +SET VSWHERE_VER=2.6.7 +"%NUGET_EXEC%" install vswhere -Version %VSWHERE_VER% || exit /b 1 +SET VSWHERE_EXEC=%VFS_PACKAGESDIR%\vswhere.%VSWHERE_VER%\tools\vswhere.exe + +REM Assumes default installation location for Windows 10 SDKs +IF NOT EXIST "C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0" ( + ECHO ERROR: Could not find Windows 10 SDK Version 16299 + EXIT /B 1 +) + +REM Use vswhere to find the latest VS installation with the MSBuild component +REM See https://github.com/Microsoft/vswhere/wiki/Find-MSBuild +FOR /F "tokens=* USEBACKQ" %%F IN (`%VSWHERE_EXEC% -all -prerelease -latest -products * -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\amd64\MSBuild.exe`) DO ( + SET MSBUILD_EXEC=%%F + ECHO INFO: Found msbuild.exe at '%%F' +) + +:BUILD +IF NOT DEFINED MSBUILD_EXEC ( + ECHO ERROR: Could not locate a Visual Studio installation with required components. + ECHO Refer to Readme.md for a list of the required Visual Studio components. + EXIT /B 10 +) + +ECHO ^********************** +ECHO ^* Restoring Packages * +ECHO ^********************** +"%MSBUILD_EXEC%" %VFS_SRCDIR%\GVFS.sln ^ + /t:Restore ^ + /v:%VERBOSITY% ^ + /p:Configuration=%CONFIGURATION% || GOTO ERROR + +ECHO ^********************* +ECHO ^* Building Solution * +ECHO ^********************* +"%MSBUILD_EXEC%" %VFS_SRCDIR%\GVFS.sln ^ + /t:Build ^ + /v:%VERBOSITY% ^ + /p:Configuration=%CONFIGURATION% || GOTO ERROR + +GOTO :EOF + +:USAGE +ECHO usage: %~n0%~x0 [^] [^] [^] +ECHO. +ECHO configuration Solution configuration (default: Debug). +ECHO version GVFS version (default: 0.2.173.2). +ECHO verbosity MSBuild verbosity (default: minimal). +ECHO. +EXIT 1 + +:ERROR +ECHO ERROR: Build failed with exit code %ERRORLEVEL% +EXIT /B %ERRORLEVEL% diff --git a/scripts/CreateBuildArtifacts.bat b/scripts/CreateBuildArtifacts.bat new file mode 100644 index 0000000000..a7ba9795e5 --- /dev/null +++ b/scripts/CreateBuildArtifacts.bat @@ -0,0 +1,88 @@ +@ECHO OFF +CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 +SETLOCAL + +IF "%~1"=="" ( + SET CONFIGURATION=Debug +) ELSE ( + SET CONFIGURATION=%1 +) + +IF "%~2"=="" ( + SET OUTROOT=%VFS_PUBLISHDIR% +) ELSE ( + SET OUTROOT=%2 +) + +REM Check NuGet is on the PATH +where /q nuget.exe +IF ERRORLEVEL 1 ( + ECHO ERROR: Could not find nuget.exe on the PATH + EXIT /B 1 +) + +IF EXIST %OUTROOT% ( + rmdir /s /q %OUTROOT% +) + +ECHO ^********************** +ECHO ^* Collecting Symbols * +ECHO ^********************** +mkdir %OUTROOT%\Symbols +SET COPY_SYM_CMD="&{Get-ChildItem -Recurse -Path '%VFS_OUTDIR%' -Include *.pdb | Where-Object FullName -Match '\\bin\\.*\\?%CONFIGURATION%\\' | Copy-Item -Destination '%OUTROOT%\Symbols'}" +powershell ^ + -NoProfile ^ + -ExecutionPolicy Bypass ^ + -Command %COPY_SYM_CMD% || GOTO ERROR + +ECHO ^****************************** +ECHO ^* Collecting GVFS.Installers * +ECHO ^****************************** +mkdir %OUTROOT%\GVFS.Installers +xcopy /S /Y ^ + %VFS_OUTDIR%\GVFS.Installers\bin\%CONFIGURATION%\win-x64 ^ + %OUTROOT%\GVFS.Installers\ || GOTO ERROR + +ECHO ^************************ +ECHO ^* Collecting FastFetch * +ECHO ^************************ +ECHO Collecting FastFetch... +mkdir %OUTROOT%\FastFetch +xcopy /S /Y ^ + %VFS_OUTDIR%\FastFetch\bin\%CONFIGURATION%\net461\win-x64 ^ + %OUTROOT%\FastFetch\ || GOTO ERROR + +ECHO ^*********************************** +ECHO ^* Collecting GVFS.FunctionalTests * +ECHO ^*********************************** +mkdir %OUTROOT%\GVFS.FunctionalTests +xcopy /S /Y ^ + %VFS_OUTDIR%\GVFS.FunctionalTests\bin\%CONFIGURATION%\net461\win-x64 ^ + %OUTROOT%\GVFS.FunctionalTests\ || GOTO ERROR + +ECHO ^************************************* +ECHO ^* Creating Installers NuGet Package * +ECHO ^************************************* +mkdir %OUTROOT%\NuGetPackages +nuget.exe pack ^ + %VFS_OUTDIR%\GVFS.Installers\bin\%CONFIGURATION%\win-x64\GVFS.Installers.nuspec ^ + -BasePath %VFS_OUTDIR%\GVFS.Installers\bin\%CONFIGURATION%\win-x64 ^ + -OutputDirectory %OUTROOT%\NuGetPackages || GOTO ERROR + +REM Move the nuspec file to the NuGetPackages artifact directory +move %OUTROOT%\GVFS.Installers\GVFS.Installers.nuspec ^ + %OUTROOT%\NuGetPackages + +GOTO :EOF + +:USAGE +ECHO usage: %~n0%~x0 [^] [^] +ECHO. +ECHO configuration Solution configuration (default: Debug). +ECHO destination Destination directory to copy artifacts (default: %VFS_PUBLISHDIR%). +ECHO. +EXIT 1 + +:ERROR +ECHO ERROR: Create build artifacts failed with exit code %ERRORLEVEL% +EXIT /B %ERRORLEVEL% diff --git a/scripts/InitializeEnvironment.bat b/scripts/InitializeEnvironment.bat new file mode 100644 index 0000000000..8bb31abb3c --- /dev/null +++ b/scripts/InitializeEnvironment.bat @@ -0,0 +1,25 @@ +@IF "%_echo%"=="" (ECHO OFF) ELSE (ECHO ON) + +REM Set environment variables for interesting paths that scripts might need access to. +PUSHD %~dp0 +SET VFS_SCRIPTSDIR=%CD% +POPD + +CALL :RESOLVEPATH "%VFS_SCRIPTSDIR%\.." +SET VFS_SRCDIR=%_PARSED_PATH_% + +CALL :RESOLVEPATH "%VFS_SRCDIR%\.." +SET VFS_ENLISTMENTDIR=%_PARSED_PATH_% + +SET VFS_OUTDIR=%VFS_ENLISTMENTDIR%\out +SET VFS_PACKAGESDIR=%VFS_ENLISTMENTDIR%\packages +SET VFS_PUBLISHDIR=%VFS_ENLISTMENTDIR%\publish + +REM Clean up +SET _PARSED_PATH_= + +GOTO :EOF + +:RESOLVEPATH +SET "_PARSED_PATH_=%~f1" +GOTO :EOF diff --git a/scripts/RunFunctionalTests.bat b/scripts/RunFunctionalTests.bat new file mode 100644 index 0000000000..f8be210a09 --- /dev/null +++ b/scripts/RunFunctionalTests.bat @@ -0,0 +1,37 @@ +@ECHO OFF +CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 + +IF "%1"=="" (SET "CONFIGURATION=Debug") ELSE (SET "CONFIGURATION=%1") + +REM Ensure GVFS installation is on the PATH for the Functional Tests to find +SETLOCAL +SET PATH=C:\Program Files\GVFS;C:\Program Files\Git\cmd;%PATH% + +ECHO PATH = %PATH% + +ECHO gvfs location: +where gvfs +IF NOT %ERRORLEVEL% == 0 ( + ECHO error: unable to locate GVFS on the PATH (has it been installed?) + EXIT /b 1 +) + +ECHO GVFS.Service location: +where GVFS.Service +IF NOT %ERRORLEVEL% == 0 ( + ECHO error: unable to locate GVFS.Service on the PATH (has it been installed?) + EXIT /b 1 +) + +ECHO git location: +where git +IF NOT %ERRORLEVEL% == 0 ( + ECHO error: unable to locate Git on the PATH (has it been installed?) + EXIT /b 1 +) + +%VFS_OUTDIR%\GVFS.FunctionalTests\bin\%CONFIGURATION%\net461\win-x64\GVFS.FunctionalTests.exe /result:TestResult.xml %2 %3 %4 %5 + +SET error=%ERRORLEVEL% +CALL %VFS_SCRIPTSDIR%\StopAllServices.bat +EXIT /b %error% diff --git a/scripts/RunUnitTests.bat b/scripts/RunUnitTests.bat new file mode 100644 index 0000000000..f9f6845806 --- /dev/null +++ b/scripts/RunUnitTests.bat @@ -0,0 +1,10 @@ +@ECHO OFF +CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 + +IF "%1"=="" (SET "CONFIGURATION=Debug") ELSE (SET "CONFIGURATION=%1") + +SET RESULT=0 + +%VFS_OUTDIR%\GVFS.UnitTests\bin\%CONFIGURATION%\net461\win-x64\GVFS.UnitTests.exe || SET RESULT=1 + +EXIT /b %RESULT% diff --git a/scripts/StopAllServices.bat b/scripts/StopAllServices.bat new file mode 100644 index 0000000000..237fb757f0 --- /dev/null +++ b/scripts/StopAllServices.bat @@ -0,0 +1,5 @@ +@ECHO OFF +CALL %~dp0\InitializeEnvironment.bat || EXIT /b 10 + +CALL %VFS_SCRIPTSDIR%\StopService.bat GVFS.Service +CALL %VFS_SCRIPTSDIR%\StopService.bat Test.GVFS.Service diff --git a/scripts/StopService.bat b/scripts/StopService.bat new file mode 100644 index 0000000000..e380f0e250 --- /dev/null +++ b/scripts/StopService.bat @@ -0,0 +1,2 @@ +sc stop %1 +verify >nul From 073780f817d3f62764c3648892b34efa55ca97a5 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:09:18 +0100 Subject: [PATCH 31/35] build: add GitHub Actions CI/PR workflow --- .github/workflows/build.yaml | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 .github/workflows/build.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000000..d4c6f75fcc --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,136 @@ +name: VFS for Git + +on: + pull_request: + branches: [ master ] + push: + branches: [ master, releases/shipped ] + +jobs: + build: + runs-on: windows-2019 + name: Build and Unit Test + + strategy: + matrix: + configuration: [ Debug, Release ] + + steps: + - name: Checkout source + uses: actions/checkout@v2 + with: + path: src + + - name: Install .NET SDK + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 5.0.201 + + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v1.0.2 + + - name: Build VFS for Git + shell: cmd + run: src\scripts\Build.bat ${{ matrix.configuration }} + + - name: Run unit tests + shell: cmd + run: src\scripts\RunUnitTests.bat ${{ matrix.configuration }} + + - name: Create build artifacts + shell: cmd + run: src\scripts\CreateBuildArtifacts.bat ${{ matrix.configuration }} artifacts + + - name: Upload functional tests drop + uses: actions/upload-artifact@v2 + with: + name: FunctionalTests_${{ matrix.configuration }} + path: artifacts\GVFS.FunctionalTests + + - name: Upload FastFetch drop + uses: actions/upload-artifact@v2 + with: + name: FastFetch_${{ matrix.configuration }} + path: artifacts\FastFetch + + - name: Upload installers + uses: actions/upload-artifact@v2 + with: + name: Installers_${{ matrix.configuration }} + path: artifacts\GVFS.Installers + + - name: Upload NuGet packages + uses: actions/upload-artifact@v2 + with: + name: NuGetPackages_${{ matrix.configuration }} + path: artifacts\NuGetPackages + + functional_test: + runs-on: windows-2019 + name: Functional Tests + needs: build + + # Only run the fuctional tests on pushes (not PRs) + if: ${{ github.event_name == 'push' }} + + strategy: + matrix: + configuration: [ Debug, Release ] + + steps: + - name: Download installers + uses: actions/download-artifact@v2 + with: + name: Installers_${{ matrix.configuration }} + path: install + + - name: Download functional tests drop + uses: actions/download-artifact@v2 + with: + name: FunctionalTests_${{ matrix.configuration }} + path: ft + + - name: ProjFS details (pre-install) + shell: cmd + run: install\info.bat + + - name: Install product + shell: cmd + run: install\install.bat + + - name: ProjFS details (post-install) + shell: cmd + run: install\info.bat + + - name: Upload installation logs + if: always() + uses: actions/upload-artifact@v2 + with: + name: InstallationLogs_${{ matrix.configuration }} + path: install\logs + + - name: Run functional tests + shell: cmd + run: | + SET PATH=C:\Program Files\GVFS;%PATH% + SET GIT_TRACE2_PERF=C:\temp\git-trace2.log + ft\GVFS.FunctionalTests.exe /result:TestResult.xml --ci + + - name: Upload functional test results + if: always() + uses: actions/upload-artifact@v2 + with: + name: FunctionalTests_Results_${{ matrix.configuration }} + path: TestResult.xml + + - name: Upload Git trace2 output + if: always() + uses: actions/upload-artifact@v2 + with: + name: GitTrace2_${{ matrix.configuration }} + path: C:\temp\git-trace2.log + + - name: ProjFS details (post-test) + if: always() + shell: cmd + run: install\info.bat From 072d7bcebe3dfdbe289b35a58c6097d5b29be730 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:09:31 +0100 Subject: [PATCH 32/35] build: add (currently unused) AzDO YAML release build --- .azure-pipelines/release.yml | 93 ++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 .azure-pipelines/release.yml diff --git a/.azure-pipelines/release.yml b/.azure-pipelines/release.yml new file mode 100644 index 0000000000..d098c5a70f --- /dev/null +++ b/.azure-pipelines/release.yml @@ -0,0 +1,93 @@ +# NOTE: this pipeline definition is not currently used to build releases of VFS for Git. +# This is still done in the GVFS-Release-RealSign "classic" pipeline. + +name: $(date:yy)$(DayOfYear)$(rev:.r) + +variables: + signType: test + teamName: GVFS + configuration: Release + signPool: VSEng-MicroBuildVS2019 + GVFSMajorAndMinorVersion: 1.0 + GVFSRevision: $(Build.BuildNumber) + +jobs: +- job: build + displayName: Windows Build and Sign + + pool: + name: $(signPool) + + steps: + - task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@2 + displayName: Install signing plugin + inputs: + signType: '$(SignType)' + + - task: UseDotNet@2 + displayName: Install .NET SDK + inputs: + packageType: sdk + version: 5.0.201 + + - task: CmdLine@2 + displayName: Build VFS for Git + inputs: + script: $(Build.Repository.LocalPath)\scripts\Build.bat $(configuration) $(GVFSMajorAndMinorVersion).$(GVFSRevision) detailed + + - task: CmdLine@2 + displayName: Run unit tests + inputs: + script: $(Build.Repository.LocalPath)\scripts\RunUnitTests.bat $(configuration) + + - task: CmdLine@2 + displayName: Create build artifacts + inputs: + script: $(Build.Repository.LocalPath)\scripts\CreateBuildArtifacts.bat $(configuration) $(Build.ArtifactStagingDirectory) + + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: Installer' + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)\NuGetPackages + ArtifactName: Installer + + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: FastFetch' + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)\FastFetch + ArtifactName: FastFetch + + - task: PublishSymbols@1 + displayName: Enable Source Server + condition: eq(succeeded(), eq(variables['signType'], 'real')) + inputs: + SearchPattern: '**\*.pdb' + SymbolsFolder: $(Build.ArtifactStagingDirectory)\Symbols + + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: Symbols' + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)\Symbols + ArtifactName: Symbols + + - task: ms-vscs-artifact.build-tasks.artifactSymbolTask-1.artifactSymbolTask@0 + displayName: Publish to Symbols on Symweb + condition: eq(succeeded(), eq(variables['signType'], 'real')) + inputs: + symbolServiceURI: https://microsoft.artifacts.visualstudio.com/DefaultCollection + sourcePath: $(Build.ArtifactStagingDirectory)/Symbols + expirationInDays: 2065 + usePat: false + + - task: NuGetCommand@2 + displayName: Push GVFS.Installers package + condition: eq(succeeded(), eq(variables['signType'], 'real')) + inputs: + command: push + packagesToPush: $(Build.ArtifactStagingDirectory)\NuGetPackages\GVFS.Installers.*.nupkg + nuGetFeedType: external + publishFeedCredentials: '1essharedassets GVFS [PUBLISH]' + + - task: ms-vseng.MicroBuildTasks.521a94ea-9e68-468a-8167-6dcf361ea776.MicroBuildCleanup@1 + displayName: Send MicroBuild Telemetry + condition: always() From 9f3b02ce9a8119ce4c62b4a77a47351c77bebe1f Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:28:47 +0100 Subject: [PATCH 33/35] build: run functional tests in PR builds --- .github/workflows/build.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d4c6f75fcc..20891df67b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -70,9 +70,6 @@ jobs: name: Functional Tests needs: build - # Only run the fuctional tests on pushes (not PRs) - if: ${{ github.event_name == 'push' }} - strategy: matrix: configuration: [ Debug, Release ] From 69336008bc7126833f1b38142fc0461c50bca55b Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 15:52:25 +0100 Subject: [PATCH 34/35] build: drop AnyCPU and x86 solution configurations --- GVFS.sln | 188 +------------------------------------------------------ 1 file changed, 1 insertion(+), 187 deletions(-) diff --git a/GVFS.sln b/GVFS.sln index 007ed8680f..3806b86627 100644 --- a/GVFS.sln +++ b/GVFS.sln @@ -49,296 +49,110 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GitHooksLoader", "GVFS\GitH EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Payload", "GVFS\GVFS.Payload\GVFS.Payload.csproj", "{A40DD1DC-2D35-4215-9FA0-3990FB7182FD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "s", "GVFS\GVFS.Installers\GVFS.Installers.csproj", "{258FEAC0-5E2D-408A-9652-9E9653219F3B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GVFS.Installers", "GVFS\GVFS.Installers\GVFS.Installers.csproj", "{258FEAC0-5E2D-408A-9652-9E9653219F3B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|Any CPU.Build.0 = Debug|Any CPU {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x64.ActiveCfg = Debug|Any CPU {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x64.Build.0 = Debug|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x86.ActiveCfg = Debug|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Debug|x86.Build.0 = Debug|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|Any CPU.ActiveCfg = Release|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|Any CPU.Build.0 = Release|Any CPU {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x64.ActiveCfg = Release|Any CPU {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x64.Build.0 = Release|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x86.ActiveCfg = Release|Any CPU - {642D14C3-0332-4C95-8EE0-0EAC54CBF918}.Release|x86.Build.0 = Release|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|Any CPU.Build.0 = Debug|Any CPU {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x64.ActiveCfg = Debug|Any CPU {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x64.Build.0 = Debug|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x86.ActiveCfg = Debug|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Debug|x86.Build.0 = Debug|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|Any CPU.Build.0 = Release|Any CPU {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x64.ActiveCfg = Release|Any CPU {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x64.Build.0 = Release|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x86.ActiveCfg = Release|Any CPU - {DADCDF10-E38D-432E-9684-CE029DEE1D07}.Release|x86.Build.0 = Release|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|Any CPU.Build.0 = Debug|Any CPU {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x64.ActiveCfg = Debug|Any CPU {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x64.Build.0 = Debug|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x86.ActiveCfg = Debug|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Debug|x86.Build.0 = Debug|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|Any CPU.Build.0 = Release|Any CPU {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x64.ActiveCfg = Release|Any CPU {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x64.Build.0 = Release|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x86.ActiveCfg = Release|Any CPU - {77C8EC7B-4166-4F01-81C4-D9AB924021C0}.Release|x86.Build.0 = Release|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|Any CPU.Build.0 = Debug|Any CPU {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x64.ActiveCfg = Debug|Any CPU {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x64.Build.0 = Debug|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x86.ActiveCfg = Debug|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Debug|x86.Build.0 = Debug|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|Any CPU.Build.0 = Release|Any CPU {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x64.ActiveCfg = Release|Any CPU {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x64.Build.0 = Release|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x86.ActiveCfg = Release|Any CPU - {963F33D0-09EE-42CB-9E5A-37A4F4F1BFAB}.Release|x86.Build.0 = Release|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x64.ActiveCfg = Debug|Any CPU {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x64.Build.0 = Debug|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x86.ActiveCfg = Debug|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Debug|x86.Build.0 = Debug|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|Any CPU.Build.0 = Release|Any CPU {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x64.ActiveCfg = Release|Any CPU {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x64.Build.0 = Release|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x86.ActiveCfg = Release|Any CPU - {B26985C3-250A-4805-AA97-AD0604331AC7}.Release|x86.Build.0 = Release|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|Any CPU.Build.0 = Debug|Any CPU {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x64.ActiveCfg = Debug|Any CPU {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x64.Build.0 = Debug|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x86.ActiveCfg = Debug|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Debug|x86.Build.0 = Debug|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|Any CPU.Build.0 = Release|Any CPU {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x64.ActiveCfg = Release|Any CPU {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x64.Build.0 = Release|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x86.ActiveCfg = Release|Any CPU - {B366D3B6-1E85-4015-8DB0-D5FA4331ECE4}.Release|x86.Build.0 = Release|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|Any CPU.Build.0 = Debug|Any CPU {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x64.ActiveCfg = Debug|Any CPU {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x64.Build.0 = Debug|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x86.ActiveCfg = Debug|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Debug|x86.Build.0 = Debug|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|Any CPU.Build.0 = Release|Any CPU {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x64.ActiveCfg = Release|Any CPU {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x64.Build.0 = Release|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x86.ActiveCfg = Release|Any CPU - {EDB4A40E-CFC9-486A-BDC5-AB2951FD8EDC}.Release|x86.Build.0 = Release|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|Any CPU.Build.0 = Debug|Any CPU {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x64.ActiveCfg = Debug|Any CPU {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x64.Build.0 = Debug|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x86.ActiveCfg = Debug|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Debug|x86.Build.0 = Debug|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|Any CPU.Build.0 = Release|Any CPU {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x64.ActiveCfg = Release|Any CPU {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x64.Build.0 = Release|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x86.ActiveCfg = Release|Any CPU - {F96089C2-6D09-4349-B65D-9CCA6160C6A5}.Release|x86.Build.0 = Release|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|Any CPU.Build.0 = Debug|Any CPU {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x64.ActiveCfg = Debug|Any CPU {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x64.Build.0 = Debug|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x86.ActiveCfg = Debug|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Debug|x86.Build.0 = Debug|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|Any CPU.Build.0 = Release|Any CPU {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x64.ActiveCfg = Release|Any CPU {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x64.Build.0 = Release|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x86.ActiveCfg = Release|Any CPU - {39361E20-C7D3-43E5-A90E-5135457EABC0}.Release|x86.Build.0 = Release|Any CPU - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|Any CPU.ActiveCfg = Debug|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|Any CPU.Build.0 = Debug|x64 {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|x64.ActiveCfg = Debug|x64 {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|x64.Build.0 = Debug|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Debug|x86.ActiveCfg = Debug|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|Any CPU.ActiveCfg = Release|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|Any CPU.Build.0 = Release|x64 {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|x64.ActiveCfg = Release|x64 {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|x64.Build.0 = Release|x64 - {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}.Release|x86.ActiveCfg = Release|x64 - {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|Any CPU.Build.0 = Debug|Any CPU {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x64.ActiveCfg = Debug|Any CPU {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x64.Build.0 = Debug|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x86.ActiveCfg = Debug|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Debug|x86.Build.0 = Debug|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|Any CPU.Build.0 = Release|Any CPU {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x64.ActiveCfg = Release|Any CPU {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x64.Build.0 = Release|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x86.ActiveCfg = Release|Any CPU - {26B5D74F-972B-4B54-98C3-15958616E56D}.Release|x86.Build.0 = Release|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|Any CPU.Build.0 = Debug|Any CPU {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x64.ActiveCfg = Debug|Any CPU {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x64.Build.0 = Debug|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x86.ActiveCfg = Debug|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Debug|x86.Build.0 = Debug|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|Any CPU.Build.0 = Release|Any CPU {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x64.ActiveCfg = Release|Any CPU {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x64.Build.0 = Release|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x86.ActiveCfg = Release|Any CPU - {41A25DAD-698D-47AB-8BB1-7E622FE6FAAC}.Release|x86.Build.0 = Release|Any CPU - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|Any CPU.ActiveCfg = Debug|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|Any CPU.Build.0 = Debug|x64 {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|x64.ActiveCfg = Debug|x64 {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|x64.Build.0 = Debug|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Debug|x86.ActiveCfg = Debug|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|Any CPU.ActiveCfg = Release|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|Any CPU.Build.0 = Release|x64 {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|x64.ActiveCfg = Release|x64 {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|x64.Build.0 = Release|x64 - {24D161E9-D1F0-4299-BBD3-5D940BEDD535}.Release|x86.ActiveCfg = Release|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|Any CPU.ActiveCfg = Debug|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|Any CPU.Build.0 = Debug|x64 {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x64.ActiveCfg = Debug|x64 {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x64.Build.0 = Debug|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x86.ActiveCfg = Debug|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|Any CPU.ActiveCfg = Release|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|Any CPU.Build.0 = Release|x64 {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x64.ActiveCfg = Release|x64 {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x64.Build.0 = Release|x64 - {5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x86.ActiveCfg = Release|x64 - {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|Any CPU.Build.0 = Debug|Any CPU {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x64.ActiveCfg = Debug|Any CPU {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x64.Build.0 = Debug|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x86.ActiveCfg = Debug|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Debug|x86.Build.0 = Debug|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Release|Any CPU.Build.0 = Release|Any CPU {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x64.ActiveCfg = Release|Any CPU {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x64.Build.0 = Release|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x86.ActiveCfg = Release|Any CPU - {5E236AF3-31D7-4313-A129-F080FF058283}.Release|x86.Build.0 = Release|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x64.ActiveCfg = Debug|Any CPU {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x64.Build.0 = Debug|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x86.ActiveCfg = Debug|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Debug|x86.Build.0 = Debug|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|Any CPU.Build.0 = Release|Any CPU {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x64.ActiveCfg = Release|Any CPU {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x64.Build.0 = Release|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x86.ActiveCfg = Release|Any CPU - {D8FB16E2-EAE0-4E05-A993-940062CD7CA7}.Release|x86.Build.0 = Release|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x64.ActiveCfg = Debug|Any CPU {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x64.Build.0 = Debug|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x86.ActiveCfg = Debug|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Debug|x86.Build.0 = Debug|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|Any CPU.Build.0 = Release|Any CPU {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x64.ActiveCfg = Release|Any CPU {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x64.Build.0 = Release|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x86.ActiveCfg = Release|Any CPU - {FE70E0D6-B0A6-421D-AA12-F28F822F09A0}.Release|x86.Build.0 = Release|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|Any CPU.Build.0 = Debug|Any CPU {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x64.ActiveCfg = Debug|Any CPU {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x64.Build.0 = Debug|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x86.ActiveCfg = Debug|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Debug|x86.Build.0 = Debug|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|Any CPU.Build.0 = Release|Any CPU {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x64.ActiveCfg = Release|Any CPU {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x64.Build.0 = Release|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x86.ActiveCfg = Release|Any CPU - {1A46C414-7F39-4EF0-B216-A88033D18678}.Release|x86.Build.0 = Release|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x64.ActiveCfg = Debug|Any CPU {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x64.Build.0 = Debug|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x86.ActiveCfg = Debug|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Debug|x86.Build.0 = Debug|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|Any CPU.Build.0 = Release|Any CPU {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x64.ActiveCfg = Release|Any CPU {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x64.Build.0 = Release|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x86.ActiveCfg = Release|Any CPU - {F8D96536-0F2C-4B40-8516-D2C0516C66EC}.Release|x86.Build.0 = Release|Any CPU - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|Any CPU.ActiveCfg = Debug|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|Any CPU.Build.0 = Debug|x64 {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|x64.ActiveCfg = Debug|x64 {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|x64.Build.0 = Debug|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Debug|x86.ActiveCfg = Debug|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|Any CPU.ActiveCfg = Release|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|Any CPU.Build.0 = Release|x64 {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|x64.ActiveCfg = Release|x64 {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|x64.Build.0 = Release|x64 - {2D23AB54-541F-4ABC-8DCA-08C199E97ABB}.Release|x86.ActiveCfg = Release|x64 - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|Any CPU.Build.0 = Debug|Any CPU {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x64.ActiveCfg = Debug|Any CPU {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x64.Build.0 = Debug|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x86.ActiveCfg = Debug|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Debug|x86.Build.0 = Debug|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|Any CPU.Build.0 = Release|Any CPU {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x64.ActiveCfg = Release|Any CPU {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x64.Build.0 = Release|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x86.ActiveCfg = Release|Any CPU - {EC90AF5D-E018-4248-85D6-9DB1898D710E}.Release|x86.Build.0 = Release|Any CPU - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|Any CPU.ActiveCfg = Debug|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|Any CPU.Build.0 = Debug|x64 {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x64.ActiveCfg = Debug|x64 {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x64.Build.0 = Debug|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x86.ActiveCfg = Debug|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|Any CPU.ActiveCfg = Release|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|Any CPU.Build.0 = Release|x64 {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x64.ActiveCfg = Release|x64 {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x64.Build.0 = Release|x64 - {798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x86.ActiveCfg = Release|x64 - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|Any CPU.Build.0 = Debug|Any CPU {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x64.ActiveCfg = Debug|Any CPU {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x64.Build.0 = Debug|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x86.ActiveCfg = Debug|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Debug|x86.Build.0 = Debug|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|Any CPU.Build.0 = Release|Any CPU {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x64.ActiveCfg = Release|Any CPU {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x64.Build.0 = Release|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x86.ActiveCfg = Release|Any CPU - {A40DD1DC-2D35-4215-9FA0-3990FB7182FD}.Release|x86.Build.0 = Release|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|Any CPU.Build.0 = Debug|Any CPU {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x64.ActiveCfg = Debug|Any CPU {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x64.Build.0 = Debug|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x86.ActiveCfg = Debug|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Debug|x86.Build.0 = Debug|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|Any CPU.Build.0 = Release|Any CPU {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x64.ActiveCfg = Release|Any CPU {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x64.Build.0 = Release|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x86.ActiveCfg = Release|Any CPU - {258FEAC0-5E2D-408A-9652-9E9653219F3B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 103dbfd3fc088f706ff4fdf6f0f7b19ebb09d6da Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Tue, 29 Jun 2021 14:40:58 +0100 Subject: [PATCH 35/35] build: add releases/shipped to PR build trigger --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 20891df67b..8dca590066 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -2,7 +2,7 @@ name: VFS for Git on: pull_request: - branches: [ master ] + branches: [ master, releases/shipped ] push: branches: [ master, releases/shipped ] /// On Windows VFSForGit does not need to use system wide logs to track @@ -162,9 +162,9 @@ public override void StartBackgroundVFS4GProcess(ITracer tracer, string programN } } - public override void PrepareProcessToRunInBackground() - { - // No additional work required + public override void PrepareProcessToRunInBackground() + { + // No additional work required } public override NamedPipeServerStream CreatePipeByName(string pipeName) @@ -333,28 +333,28 @@ public override string GetUserIdFromLoginSessionId(int sessionId, ITracer tracer } } - public override string GetUpgradeLogDirectoryParentDirectory() + public override string GetUpgradeLogDirectoryParentDirectory() { return Path.Combine( this.GetCommonAppDataRootForGVFS(), - ProductUpgraderInfo.UpgradeDirectoryName); - } + ProductUpgraderInfo.UpgradeDirectoryName); + } public override string GetSystemInstallerLogPath() { return null; } - - public override string GetUpgradeHighestAvailableVersionDirectory() - { - return this.GetUpgradeProtectedDataDirectory(); - } - - public override string GetUpgradeProtectedDataDirectory() - { - return GetUpgradeProtectedDataDirectoryImplementation(); - } - + + public override string GetUpgradeHighestAvailableVersionDirectory() + { + return this.GetUpgradeProtectedDataDirectory(); + } + + public override string GetUpgradeProtectedDataDirectory() + { + return GetUpgradeProtectedDataDirectoryImplementation(); + } + public override Dictionary GetPhysicalDiskInfo(string path, bool sizeStatsOnly) => WindowsPhysicalDiskInfo.GetPhysicalDiskInfo(path, sizeStatsOnly); public override bool IsConsoleOutputRedirectedToFile() @@ -374,45 +374,45 @@ public override FileBasedLock CreateFileBasedLock( { return new WindowsFileBasedLock(fileSystem, tracer, lockPath); } - - public override ProductUpgraderPlatformStrategy CreateProductUpgraderPlatformInteractions( - PhysicalFileSystem fileSystem, - ITracer tracer) - { - return new WindowsProductUpgraderPlatformStrategy(fileSystem, tracer); - } + + public override ProductUpgraderPlatformStrategy CreateProductUpgraderPlatformInteractions( + PhysicalFileSystem fileSystem, + ITracer tracer) + { + return new WindowsProductUpgraderPlatformStrategy(fileSystem, tracer); + } public override bool TryGetGVFSEnlistmentRoot(string directory, out string enlistmentRoot, out string errorMessage) { return WindowsPlatform.TryGetGVFSEnlistmentRootImplementation(directory, out enlistmentRoot, out errorMessage); } - public override bool TryGetDefaultLocalCacheRoot(string enlistmentRoot, out string localCacheRoot, out string localCacheRootError) + public override bool TryGetDefaultLocalCacheRoot(string enlistmentRoot, out string localCacheRoot, out string localCacheRootError) { string pathRoot; - try + try { - pathRoot = Path.GetPathRoot(enlistmentRoot); + pathRoot = Path.GetPathRoot(enlistmentRoot); } catch (ArgumentException e) { localCacheRoot = null; localCacheRootError = $"Failed to determine the root of '{enlistmentRoot}'): {e.Message}"; - return false; - } - + return false; + } + if (string.IsNullOrEmpty(pathRoot)) { localCacheRoot = null; localCacheRootError = $"Failed to determine the root of '{enlistmentRoot}', path does not contain root directory information"; return false; - } - + } + try { - localCacheRoot = Path.Combine(pathRoot, GVFSConstants.DefaultGVFSCacheFolderName); - localCacheRootError = null; + localCacheRoot = Path.Combine(pathRoot, GVFSConstants.DefaultGVFSCacheFolderName); + localCacheRootError = null; return true; } catch (ArgumentException e) @@ -420,7 +420,7 @@ public override bool TryGetDefaultLocalCacheRoot(string enlistmentRoot, out stri localCacheRoot = null; localCacheRootError = $"Failed to build local cache path using root directory '{pathRoot}'): {e.Message}"; return false; - } + } } public override bool TryKillProcessTree(int processId, out int exitCode, out string error) @@ -431,7 +431,7 @@ public override bool TryKillProcessTree(int processId, out int exitCode, out str return result.ExitCode == 0; } - public override bool TryCopyPanicLogs(string copyToDir, out string error) + public override bool TryCopyPanicLogs(string copyToDir, out string error) { error = null; return true; @@ -457,12 +457,12 @@ public override string InstallerExtension { get { return ".exe"; } } - - public override bool SupportsUpgradeWhileRunning => false; - - public override string WorkingDirectoryBackingRootPath - { - get { return GVFSConstants.WorkingDirectoryRootName; } + + public override bool SupportsUpgradeWhileRunning => false; + + public override string WorkingDirectoryBackingRootPath + { + get { return GVFSConstants.WorkingDirectoryRootName; } } public override string DotGVFSRoot @@ -478,23 +478,23 @@ public override string GVFSBinDirectoryPath Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), this.GVFSBinDirectoryName); } - } - - public override string GVFSBinDirectoryName - { - get { return "GVFS"; } - } - - public override string GVFSExecutableName - { - get { return "GVFS" + this.ExecutableExtension; } + } + + public override string GVFSBinDirectoryName + { + get { return "GVFS"; } + } + + public override string GVFSExecutableName + { + get { return "GVFS" + this.ExecutableExtension; } } public override string ProgramLocaterCommand { get { return "where"; } - } - + } + public override HashSet UpgradeBlockingProcesses { get { return new HashSet(GVFSPlatform.Instance.Constants.PathComparer) { "GVFS", "GVFS.Mount", "git", "ssh-agent", "wish", "bash" }; } diff --git a/GVFS/GVFS.Platform.Windows/packages.config b/GVFS/GVFS.Platform.Windows/packages.config deleted file mode 100644 index cbf3000052..0000000000 --- a/GVFS/GVFS.Platform.Windows/packages.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file From b60b9da14c0145aa279362518366b66b4ae80942 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:57:52 +0100 Subject: [PATCH 12/35] build: migrate GVFS.Hooks project --- GVFS/GVFS.Hooks/App.config | 6 -- ...Hooks.Windows.csproj => GVFS.Hooks.csproj} | 64 ++----------------- ...atform.Windows.cs => GVFSHooksPlatform.cs} | 2 +- GVFS/GVFS.Hooks/Program.cs | 2 +- GVFS/GVFS.Hooks/Properties/AssemblyInfo.cs | 22 ------- GVFS/GVFS.Hooks/packages.config | 4 -- 6 files changed, 7 insertions(+), 93 deletions(-) delete mode 100644 GVFS/GVFS.Hooks/App.config rename GVFS/GVFS.Hooks/{GVFS.Hooks.Windows.csproj => GVFS.Hooks.csproj} (54%) rename GVFS/GVFS.Hooks/HooksPlatform/{GVFSHooksPlatform.Windows.cs => GVFSHooksPlatform.cs} (95%) delete mode 100644 GVFS/GVFS.Hooks/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.Hooks/packages.config diff --git a/GVFS/GVFS.Hooks/App.config b/GVFS/GVFS.Hooks/App.config deleted file mode 100644 index 6d44256319..0000000000 --- a/GVFS/GVFS.Hooks/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/GVFS/GVFS.Hooks/GVFS.Hooks.Windows.csproj b/GVFS/GVFS.Hooks/GVFS.Hooks.csproj similarity index 54% rename from GVFS/GVFS.Hooks/GVFS.Hooks.Windows.csproj rename to GVFS/GVFS.Hooks/GVFS.Hooks.csproj index f8252b2563..10ad576b7a 100644 --- a/GVFS/GVFS.Hooks/GVFS.Hooks.Windows.csproj +++ b/GVFS/GVFS.Hooks/GVFS.Hooks.csproj @@ -1,45 +1,10 @@ - - - - + + - {BDA91EE5-C684-4FC5-A90A-B7D677421917} Exe - Properties - GVFS.Hooks - GVFS.Hooks - v4.6.1 - 512 - true - - + net461 - - true - DEBUG;TRACE - full - x64 - prompt - true - - - TRACE - true - pdbonly - x64 - prompt - true - - - - - - - - - - - + + diff --git a/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Windows.cs b/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.cs similarity index 95% rename from GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Windows.cs rename to GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.cs index f3bd65a012..1fbf2aaf30 100644 --- a/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.Windows.cs +++ b/GVFS/GVFS.Hooks/HooksPlatform/GVFSHooksPlatform.cs @@ -1,4 +1,4 @@ -using GVFS.Platform.Windows; +using GVFS.Platform.Windows; namespace GVFS.Hooks.HooksPlatform { diff --git a/GVFS/GVFS.Hooks/Program.cs b/GVFS/GVFS.Hooks/Program.cs index af84760803..eac434c5d5 100644 --- a/GVFS/GVFS.Hooks/Program.cs +++ b/GVFS/GVFS.Hooks/Program.cs @@ -1,4 +1,4 @@ -using GVFS.Common; +using GVFS.Common; using GVFS.Common.NamedPipes; using GVFS.Hooks.HooksPlatform; using System; diff --git a/GVFS/GVFS.Hooks/Properties/AssemblyInfo.cs b/GVFS/GVFS.Hooks/Properties/AssemblyInfo.cs deleted file mode 100644 index 21669de01f..0000000000 --- a/GVFS/GVFS.Hooks/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Hooks")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Hooks")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("bda91ee5-c684-4fc5-a90a-b7d677421917")] diff --git a/GVFS/GVFS.Hooks/packages.config b/GVFS/GVFS.Hooks/packages.config deleted file mode 100644 index 119108d189..0000000000 --- a/GVFS/GVFS.Hooks/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 4eb86775c3a8b2e71fd2d6dd4195183199e39853 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:58:10 +0100 Subject: [PATCH 13/35] build: migrate GVFS.Upgrader project --- GVFS/GVFS.Upgrader/App.config | 14 ----- GVFS/GVFS.Upgrader/GVFS.Upgrader.csproj | 59 +------------------ GVFS/GVFS.Upgrader/Properties/AssemblyInfo.cs | 22 ------- .../UpgradeOrchestratorFactory.cs | 8 +-- GVFS/GVFS.Upgrader/packages.config | 18 ------ 5 files changed, 4 insertions(+), 117 deletions(-) delete mode 100644 GVFS/GVFS.Upgrader/App.config delete mode 100644 GVFS/GVFS.Upgrader/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.Upgrader/packages.config diff --git a/GVFS/GVFS.Upgrader/App.config b/GVFS/GVFS.Upgrader/App.config deleted file mode 100644 index f5c0a8bea5..0000000000 --- a/GVFS/GVFS.Upgrader/App.config +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.Upgrader/GVFS.Upgrader.csproj b/GVFS/GVFS.Upgrader/GVFS.Upgrader.csproj index 3b9629484a..f67c032125 100644 --- a/GVFS/GVFS.Upgrader/GVFS.Upgrader.csproj +++ b/GVFS/GVFS.Upgrader/GVFS.Upgrader.csproj @@ -1,69 +1,16 @@ - - + Exe - GVFS.Upgrader - - x64 - x64 - GVFS.Upgrader - false - - true - - - - $(GVFSVersion) - - - $(GVFSVersion) + net461 - - - - - net461;netcoreapp2.1 - $(DefineConstants);WINDOWS_BUILD - - - - - PlatformLoader.Windows.cs - - - - - - netcoreapp2.1 - osx-x64 - $(DefineConstants);MACOS_BUILD - - - - - PlatformLoader.Mac.cs - - - - - - - - - - - - - all - + diff --git a/GVFS/GVFS.Upgrader/Properties/AssemblyInfo.cs b/GVFS/GVFS.Upgrader/Properties/AssemblyInfo.cs deleted file mode 100644 index 60bb28ce6b..0000000000 --- a/GVFS/GVFS.Upgrader/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Upgrader")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Upgrader")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("aecec217-2499-403d-b0bb-2962b9be5970")] diff --git a/GVFS/GVFS.Upgrader/UpgradeOrchestratorFactory.cs b/GVFS/GVFS.Upgrader/UpgradeOrchestratorFactory.cs index c2ce00dbcf..a2d9c5cb38 100644 --- a/GVFS/GVFS.Upgrader/UpgradeOrchestratorFactory.cs +++ b/GVFS/GVFS.Upgrader/UpgradeOrchestratorFactory.cs @@ -4,13 +4,7 @@ public static class UpgradeOrchestratorFactory { public static UpgradeOrchestrator Create(UpgradeOptions options) { -#if MACOS_BUILD - return new MacUpgradeOrchestrator(options); -#elif WINDOWS_BUILD return new WindowsUpgradeOrchestrator(options); -#else - throw new NotImplementedException(); -#endif - } + } } } diff --git a/GVFS/GVFS.Upgrader/packages.config b/GVFS/GVFS.Upgrader/packages.config deleted file mode 100644 index 92000da1c0..0000000000 --- a/GVFS/GVFS.Upgrader/packages.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file From 57c22482eedef6a4938cb5155e83f9b567d21d2c Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:58:25 +0100 Subject: [PATCH 14/35] build: migrate GVFS.Mount project --- GVFS/GVFS.Mount/GVFS.Mount.Windows.csproj | 135 --------------------- GVFS/GVFS.Mount/GVFS.Mount.csproj | 22 ++++ GVFS/GVFS.Mount/Properties/AssemblyInfo.cs | 22 ---- GVFS/GVFS.Mount/app.config | 6 - GVFS/GVFS.Mount/packages.config | 15 --- 5 files changed, 22 insertions(+), 178 deletions(-) delete mode 100644 GVFS/GVFS.Mount/GVFS.Mount.Windows.csproj create mode 100644 GVFS/GVFS.Mount/GVFS.Mount.csproj delete mode 100644 GVFS/GVFS.Mount/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.Mount/app.config delete mode 100644 GVFS/GVFS.Mount/packages.config diff --git a/GVFS/GVFS.Mount/GVFS.Mount.Windows.csproj b/GVFS/GVFS.Mount/GVFS.Mount.Windows.csproj deleted file mode 100644 index 677a482acf..0000000000 --- a/GVFS/GVFS.Mount/GVFS.Mount.Windows.csproj +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - {17498502-AEFF-4E70-90CC-1D0B56A8ADF5} - Exe - Properties - GVFS.Mount - GVFS.Mount - v4.6.1 - 512 - true - - - - - x64 - true - full - false - DEBUG;TRACE - prompt - 4 - false - - - x64 - pdbonly - TRACE - true - prompt - 4 - - - - False - ..\..\..\packages\CommandLineParser.2.1.1-beta\lib\net45\CommandLine.dll - True - - - ..\..\..\packages\Microsoft.Data.Sqlite.Core.2.2.4\lib\netstandard2.0\Microsoft.Data.Sqlite.dll - - - False - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - True - - - False - ..\..\..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll - True - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_green.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_v2.dll - - - ..\..\..\packages\SQLitePCLRaw.core.1.1.12\lib\net45\SQLitePCLRaw.core.dll - - - ..\..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.12\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll - - - - - - - - - - - - - - PlatformLoader.Windows.cs - - - - - - - - - - - Designer - - - - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {4ce404e7-d3fc-471c-993c-64615861ea63} - GVFS.Platform.Windows - - - {f468b05a-95e5-46bc-8c67-b80a78527b7d} - GVFS.Virtualization - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - xcopy /Y $(BuildOutputDir)\GVFS.ReadObjectHook.Windows\bin\$(Platform)\$(Configuration)\GVFS.ReadObjectHook.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GVFS.VirtualFileSystemHook.Windows\bin\$(Platform)\$(Configuration)\GVFS.VirtualFileSystemHook.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GVFS.PostIndexChangedHook.Windows\bin\$(Platform)\$(Configuration)\GVFS.PostIndexChangedHook.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GVFS.Hooks.Windows\bin\$(Platform)\$(Configuration)\GVFS.Hooks.* $(TargetDir) - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.Mount/GVFS.Mount.csproj b/GVFS/GVFS.Mount/GVFS.Mount.csproj new file mode 100644 index 0000000000..b770e6f99c --- /dev/null +++ b/GVFS/GVFS.Mount/GVFS.Mount.csproj @@ -0,0 +1,22 @@ + + + + Exe + net461 + + + + + false + Content + PreserveNewest + Build;DebugSymbolsProjectOutputGroup + + + + + + + + + diff --git a/GVFS/GVFS.Mount/Properties/AssemblyInfo.cs b/GVFS/GVFS.Mount/Properties/AssemblyInfo.cs deleted file mode 100644 index cd83cf8c2b..0000000000 --- a/GVFS/GVFS.Mount/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Mount")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Mount")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b8c1dfbd-cafd-4f7e-a1a3-e11907b5467b")] diff --git a/GVFS/GVFS.Mount/app.config b/GVFS/GVFS.Mount/app.config deleted file mode 100644 index 1da8c9b53a..0000000000 --- a/GVFS/GVFS.Mount/app.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/GVFS/GVFS.Mount/packages.config b/GVFS/GVFS.Mount/packages.config deleted file mode 100644 index 7b9c65be5c..0000000000 --- a/GVFS/GVFS.Mount/packages.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file From 2dbf900590ba7db4e8a4cba4397068eaaee87793 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:58:42 +0100 Subject: [PATCH 15/35] build: migrate GVFS.Service project --- GVFS/GVFS.Service/GVFS.Service.Windows.csproj | 115 ------------------ GVFS/GVFS.Service/GVFS.Service.csproj | 23 ++++ ...Process.Windows.cs => GVFSMountProcess.cs} | 0 ...dler.Windows.cs => NotificationHandler.cs} | 0 .../{Program.Windows.cs => Program.cs} | 0 GVFS/GVFS.Service/Properties/AssemblyInfo.cs | 22 ---- GVFS/GVFS.Service/app.config | 6 - GVFS/GVFS.Service/packages.config | 6 - 8 files changed, 23 insertions(+), 149 deletions(-) delete mode 100644 GVFS/GVFS.Service/GVFS.Service.Windows.csproj create mode 100644 GVFS/GVFS.Service/GVFS.Service.csproj rename GVFS/GVFS.Service/{GVFSMountProcess.Windows.cs => GVFSMountProcess.cs} (100%) rename GVFS/GVFS.Service/Handlers/{NotificationHandler.Windows.cs => NotificationHandler.cs} (100%) rename GVFS/GVFS.Service/{Program.Windows.cs => Program.cs} (100%) delete mode 100644 GVFS/GVFS.Service/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.Service/app.config delete mode 100644 GVFS/GVFS.Service/packages.config diff --git a/GVFS/GVFS.Service/GVFS.Service.Windows.csproj b/GVFS/GVFS.Service/GVFS.Service.Windows.csproj deleted file mode 100644 index 90a034794e..0000000000 --- a/GVFS/GVFS.Service/GVFS.Service.Windows.csproj +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} - Exe - Properties - GVFS.Service - GVFS.Service - v4.6.1 - 512 - true - - - - - x64 - true - full - false - DEBUG;TRACE - prompt - 4 - - - x64 - pdbonly - true - TRACE - prompt - 4 - - - - - - $(BuildOutputDir)\GVFS.Service.exe.manifest - - - - False - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - True - - - False - ..\..\..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll - True - - - - - - - - - - - - - - - - - Component - - - - - - - - - - - - - - - - - - - - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {4ce404e7-d3fc-471c-993c-64615861ea63} - GVFS.Platform.Windows - - - {93b403fd-dafb-46c5-9636-b122792a548a} - GVFS.Service.UI - - - - - - GVFS.Service.exe.manifest - - - - - - - - - - - - - diff --git a/GVFS/GVFS.Service/GVFS.Service.csproj b/GVFS/GVFS.Service/GVFS.Service.csproj new file mode 100644 index 0000000000..99fa85b3ee --- /dev/null +++ b/GVFS/GVFS.Service/GVFS.Service.csproj @@ -0,0 +1,23 @@ + + + + Exe + net461 + true + + + + + + + + + + + + + + + + + diff --git a/GVFS/GVFS.Service/GVFSMountProcess.Windows.cs b/GVFS/GVFS.Service/GVFSMountProcess.cs similarity index 100% rename from GVFS/GVFS.Service/GVFSMountProcess.Windows.cs rename to GVFS/GVFS.Service/GVFSMountProcess.cs diff --git a/GVFS/GVFS.Service/Handlers/NotificationHandler.Windows.cs b/GVFS/GVFS.Service/Handlers/NotificationHandler.cs similarity index 100% rename from GVFS/GVFS.Service/Handlers/NotificationHandler.Windows.cs rename to GVFS/GVFS.Service/Handlers/NotificationHandler.cs diff --git a/GVFS/GVFS.Service/Program.Windows.cs b/GVFS/GVFS.Service/Program.cs similarity index 100% rename from GVFS/GVFS.Service/Program.Windows.cs rename to GVFS/GVFS.Service/Program.cs diff --git a/GVFS/GVFS.Service/Properties/AssemblyInfo.cs b/GVFS/GVFS.Service/Properties/AssemblyInfo.cs deleted file mode 100644 index c31bc35a19..0000000000 --- a/GVFS/GVFS.Service/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.Service")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.Service")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b8c1dfba-cafd-4f7e-a1a3-e11907b5467b")] diff --git a/GVFS/GVFS.Service/app.config b/GVFS/GVFS.Service/app.config deleted file mode 100644 index 1da8c9b53a..0000000000 --- a/GVFS/GVFS.Service/app.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/GVFS/GVFS.Service/packages.config b/GVFS/GVFS.Service/packages.config deleted file mode 100644 index 5bd2182d5c..0000000000 --- a/GVFS/GVFS.Service/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 480006abc1907574c7a6ca59ce4b81e1541deedf Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:58:59 +0100 Subject: [PATCH 16/35] build: migrate GVFS.Service.UI project --- GVFS/GVFS.Service.UI/GVFS.Service.UI.csproj | 90 +++------------------ GVFS/GVFS.Service.UI/GVFSServiceUI.cs | 5 -- GVFS/GVFS.Service.UI/app.config | 6 -- GVFS/GVFS.Service.UI/packages.config | 4 - 4 files changed, 9 insertions(+), 96 deletions(-) delete mode 100644 GVFS/GVFS.Service.UI/app.config delete mode 100644 GVFS/GVFS.Service.UI/packages.config diff --git a/GVFS/GVFS.Service.UI/GVFS.Service.UI.csproj b/GVFS/GVFS.Service.UI/GVFS.Service.UI.csproj index 0693223d52..90589d9330 100644 --- a/GVFS/GVFS.Service.UI/GVFS.Service.UI.csproj +++ b/GVFS/GVFS.Service.UI/GVFS.Service.UI.csproj @@ -1,94 +1,22 @@ - - - - + + - {93B403FD-DAFB-46C5-9636-B122792A548A} Exe - Properties - GVFS.Service.UI - GVFS.Service.UI - v4.6.1 - 512 - true - - + net461 - - x64 - true - full - false - DEBUG;TRACE - prompt - 4 - false - - - x64 - pdbonly - true - TRACE - prompt - 4 - - - - - - - - - - - - - C:\Program Files (x86)\Windows Kits\10\App Certification Kit\winmds\windows81\Windows.winmd - - + - - PlatformLoader.Windows.cs - - - - - - - - - - - - - + + - - - - - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {4ce404e7-d3fc-471c-993c-64615861ea63} - GVFS.Platform.Windows - - - {f468b05a-95e5-46bc-8c67-b80a78527b7d} - GVFS.Virtualization - + + PreserveNewest - - - - - + diff --git a/GVFS/GVFS.Service.UI/GVFSServiceUI.cs b/GVFS/GVFS.Service.UI/GVFSServiceUI.cs index 58178919eb..c81e80b7d2 100644 --- a/GVFS/GVFS.Service.UI/GVFSServiceUI.cs +++ b/GVFS/GVFS.Service.UI/GVFSServiceUI.cs @@ -2,12 +2,7 @@ using GVFS.Common.NamedPipes; using GVFS.Common.Tracing; using System; -using System.Collections.Generic; -using System.Linq; -using System.ServiceProcess; -using System.Text; using System.Threading; -using System.Threading.Tasks; namespace GVFS.Service.UI { diff --git a/GVFS/GVFS.Service.UI/app.config b/GVFS/GVFS.Service.UI/app.config deleted file mode 100644 index 1da8c9b53a..0000000000 --- a/GVFS/GVFS.Service.UI/app.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/GVFS/GVFS.Service.UI/packages.config b/GVFS/GVFS.Service.UI/packages.config deleted file mode 100644 index 119108d189..0000000000 --- a/GVFS/GVFS.Service.UI/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From e5ce0407413f08bfb90344d9b64fe1918c4d5a8f Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:59:20 +0100 Subject: [PATCH 17/35] build: migrate GVFS project --- GVFS/GVFS/App.config | 18 --- GVFS/GVFS/CommandLine/GVFSVerb.cs | 21 ++- GVFS/GVFS/GVFS.Windows.csproj | 206 --------------------------- GVFS/GVFS/GVFS.csproj | 28 ++++ GVFS/GVFS/InternalsVisibleTo.cs | 3 + GVFS/GVFS/Properties/AssemblyInfo.cs | 26 ---- GVFS/GVFS/packages.config | 28 ---- 7 files changed, 46 insertions(+), 284 deletions(-) delete mode 100644 GVFS/GVFS/App.config delete mode 100644 GVFS/GVFS/GVFS.Windows.csproj create mode 100644 GVFS/GVFS/GVFS.csproj create mode 100644 GVFS/GVFS/InternalsVisibleTo.cs delete mode 100644 GVFS/GVFS/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS/packages.config diff --git a/GVFS/GVFS/App.config b/GVFS/GVFS/App.config deleted file mode 100644 index 3e680fdd37..0000000000 --- a/GVFS/GVFS/App.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/GVFS/GVFS/CommandLine/GVFSVerb.cs b/GVFS/GVFS/CommandLine/GVFSVerb.cs index 4e140a726a..97297a6ffb 100644 --- a/GVFS/GVFS/CommandLine/GVFSVerb.cs +++ b/GVFS/GVFS/CommandLine/GVFSVerb.cs @@ -877,33 +877,42 @@ private void CheckGitVersion(ITracer tracer, GVFSEnlistment enlistment, out stri GitVersion gitVersion = null; if (string.IsNullOrEmpty(enlistment.GitBinPath) || !GitProcess.TryGetVersion(enlistment.GitBinPath, out gitVersion, out string _)) { - this.ReportErrorAndExit(tracer, "Error: Unable to retrieve the git version"); + this.ReportErrorAndExit(tracer, "Error: Unable to retrieve the Git version"); } version = gitVersion.ToString(); if (gitVersion.Platform != GVFSConstants.SupportedGitVersion.Platform) { - this.ReportErrorAndExit(tracer, "Error: Invalid version of git {0}. Must use gvfs version.", version); + this.ReportErrorAndExit(tracer, "Error: Invalid version of Git {0}. Must use vfs version.", version); } if (gitVersion.IsLessThan(GVFSConstants.SupportedGitVersion)) { this.ReportErrorAndExit( tracer, - "Error: Installed git version {0} is less than the supported version of {1}.", + "Error: Installed Git version {0} is less than the minimum supported version of {1}.", gitVersion, GVFSConstants.SupportedGitVersion); } + /* We require that the revision (Z) of the Git version string (2.X.Y.vfs.Z.W) + * is an exact match. We will use this to signal that a microsoft/git version introduces + * a breaking change that requires a VFS for Git upgrade. + * Using the revision part allows us to modify the other version items arbitrarily, + * including taking version numbers 2.X.Y from upstream and updating .W if we have any + * hotfixes to microsoft/git. + */ else if (gitVersion.Revision != GVFSConstants.SupportedGitVersion.Revision) { this.ReportErrorAndExit( tracer, - "Error: Installed git version {0} has revision number {1} instead of {2}." + - " This Git version is too new, so either downgrade Git or upgrade VFS for Git", + "Error: Installed Git version {0} has revision number {1} instead of {2}." + + " This Git version is too new, so either downgrade Git or upgrade VFS for Git." + + " The minimum supported version of Git is {3}.", gitVersion, gitVersion.Revision, - GVFSConstants.SupportedGitVersion.Revision); + GVFSConstants.SupportedGitVersion.Revision, + GVFSConstants.SupportedGitVersion); } } diff --git a/GVFS/GVFS/GVFS.Windows.csproj b/GVFS/GVFS/GVFS.Windows.csproj deleted file mode 100644 index 2e0af3feb1..0000000000 --- a/GVFS/GVFS/GVFS.Windows.csproj +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - - {32220664-594C-4425-B9A0-88E0BE2F3D2A} - Exe - Properties - GVFS - GVFS - v4.6.1 - 512 - true - - - - - true - DEBUG;TRACE - full - x64 - prompt - true - - - TRACE - true - pdbonly - x64 - prompt - true - - - - False - ..\..\..\packages\CommandLineParser.2.1.1-beta\lib\net45\CommandLine.dll - True - - - ..\..\..\packages\Microsoft.Data.Sqlite.Core.2.2.4\lib\netstandard2.0\Microsoft.Data.Sqlite.dll - - - False - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - True - - - False - ..\..\..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll - True - - - ..\..\..\packages\NuGet.Commands.4.9.2\lib\net46\NuGet.Commands.dll - - - ..\..\..\packages\NuGet.Common.4.9.2\lib\net46\NuGet.Common.dll - - - ..\..\..\packages\NuGet.Configuration.4.9.2\lib\net46\NuGet.Configuration.dll - - - ..\..\..\packages\NuGet.Credentials.4.9.2\lib\net46\NuGet.Credentials.dll - - - ..\..\..\packages\NuGet.DependencyResolver.Core.4.9.2\lib\net46\NuGet.DependencyResolver.Core.dll - - - ..\..\..\packages\NuGet.Frameworks.4.9.2\lib\net46\NuGet.Frameworks.dll - - - ..\..\..\packages\NuGet.LibraryModel.4.9.2\lib\net46\NuGet.LibraryModel.dll - - - ..\..\..\packages\NuGet.Packaging.4.9.2\lib\net46\NuGet.Packaging.dll - - - ..\..\..\packages\NuGet.Packaging.Core.4.9.2\lib\net46\NuGet.Packaging.Core.dll - - - ..\..\..\packages\NuGet.ProjectModel.4.9.2\lib\net46\NuGet.ProjectModel.dll - - - ..\..\..\packages\NuGet.Protocol.4.9.2\lib\net46\NuGet.Protocol.dll - - - ..\..\..\packages\NuGet.Versioning.4.9.2\lib\net46\NuGet.Versioning.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_green.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_v2.dll - - - ..\..\..\packages\SQLitePCLRaw.core.1.1.12\lib\net45\SQLitePCLRaw.core.dll - - - ..\..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.12\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PlatformLoader.Windows.cs - - - - - - - Designer - - - PreserveNewest - - - - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {4ce404e7-d3fc-471c-993c-64615861ea63} - GVFS.Platform.Windows - - - {f468b05a-95e5-46bc-8c67-b80a78527b7d} - GVFS.Virtualization - - - - - - - - - xcopy /Y $(BuildOutputDir)\GVFS.ReadObjectHook.Windows\bin\$(Platform)\$(Configuration)\GVFS.ReadObjectHook.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GVFS.VirtualFileSystemHook.Windows\bin\$(Platform)\$(Configuration)\GVFS.VirtualFileSystemHook.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GVFS.PostIndexChangedHook.Windows\bin\$(Platform)\$(Configuration)\GVFS.PostIndexChangedHook.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GVFS.Hooks.Windows\bin\$(Platform)\$(Configuration)\GVFS.Hooks.* $(TargetDir) -xcopy /Y $(BuildOutputDir)\GitHooksLoader\bin\$(Platform)\$(Configuration)\GitHooksLoader.* $(TargetDir) - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS/GVFS.csproj b/GVFS/GVFS/GVFS.csproj new file mode 100644 index 0000000000..8c143ebbc7 --- /dev/null +++ b/GVFS/GVFS/GVFS.csproj @@ -0,0 +1,28 @@ + + + + Exe + net461 + + + + + false + Content + PreserveNewest + Build;DebugSymbolsProjectOutputGroup + + + + + + + + + + + PreserveNewest + + + + diff --git a/GVFS/GVFS/InternalsVisibleTo.cs b/GVFS/GVFS/InternalsVisibleTo.cs new file mode 100644 index 0000000000..0ba48d81be --- /dev/null +++ b/GVFS/GVFS/InternalsVisibleTo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("GVFS.UnitTests")] diff --git a/GVFS/GVFS/Properties/AssemblyInfo.cs b/GVFS/GVFS/Properties/AssemblyInfo.cs deleted file mode 100644 index 82d77cac1a..0000000000 --- a/GVFS/GVFS/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("32220664-594c-4425-b9a0-88e0be2f3d2a")] - -[assembly: InternalsVisibleTo("GVFS.UnitTests")] -[assembly: InternalsVisibleTo("GVFS.UnitTests.Windows")] \ No newline at end of file diff --git a/GVFS/GVFS/packages.config b/GVFS/GVFS/packages.config deleted file mode 100644 index 39e6630529..0000000000 --- a/GVFS/GVFS/packages.config +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From c55c731f479ef104e7d206a163493997afc70be6 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 13:59:34 +0100 Subject: [PATCH 18/35] build: migrate FastFetch project --- GVFS/FastFetch/FastFetch.csproj | 86 ++++++--------- GVFS/FastFetch/NativeMethods.cs | 107 +++++++++++++++++-- GVFS/FastFetch/NativeWindowsMethods.cs | 124 ---------------------- GVFS/FastFetch/Properties/AssemblyInfo.cs | 22 ---- GVFS/FastFetch/package.nuspec | 19 ---- 5 files changed, 129 insertions(+), 229 deletions(-) delete mode 100644 GVFS/FastFetch/NativeWindowsMethods.cs delete mode 100644 GVFS/FastFetch/Properties/AssemblyInfo.cs delete mode 100644 GVFS/FastFetch/package.nuspec diff --git a/GVFS/FastFetch/FastFetch.csproj b/GVFS/FastFetch/FastFetch.csproj index 90aac7cc48..52bb94654f 100644 --- a/GVFS/FastFetch/FastFetch.csproj +++ b/GVFS/FastFetch/FastFetch.csproj @@ -1,55 +1,31 @@ - - - - - Exe - FastFetch - netcoreapp2.1 - x64 - osx-x64;win-x64 - true - true - true - - - - $(GVFSVersion) - - - $(GVFSVersion) - - - - - - - - - - - - - - PlatformLoader.Windows.cs - - - - - - - - PlatformLoader.Mac.cs - - - - - - - - - - all - - - + + + + Exe + net461 + x64 + true + + + + + + + + + + + + + + Microsoft400 + false + + + + diff --git a/GVFS/FastFetch/NativeMethods.cs b/GVFS/FastFetch/NativeMethods.cs index a8f0ebc746..c71c2907b4 100644 --- a/GVFS/FastFetch/NativeMethods.cs +++ b/GVFS/FastFetch/NativeMethods.cs @@ -1,4 +1,8 @@ using GVFS.Common.Tracing; +using Microsoft.Win32.SafeHandles; +using System; +using System.ComponentModel; +using System.IO; using System.IO.MemoryMappedFiles; using System.Runtime.InteropServices; @@ -6,30 +10,115 @@ namespace FastFetch { internal static class NativeMethods { - public static bool isUnixOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + private const int AccessDeniedWin32Error = 5; public static unsafe void WriteFile(ITracer tracer, byte* originalData, long originalSize, string destination, ushort mode) { - if (isUnixOS) + try { - NativeUnixMethods.WriteFile(tracer, originalData, originalSize, destination, mode); + using (SafeFileHandle fileHandle = OpenForWrite(tracer, destination)) + { + if (fileHandle.IsInvalid) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + byte* data = originalData; + long size = originalSize; + uint written = 0; + while (size > 0) + { + uint toWrite = size < uint.MaxValue ? (uint)size : uint.MaxValue; + if (!WriteFile(fileHandle, data, toWrite, out written, IntPtr.Zero)) + { + throw new Win32Exception(Marshal.GetLastWin32Error()); + } + + size -= written; + data = data + written; + } + } } - else + catch (Exception e) { - NativeWindowsMethods.WriteFile(tracer, originalData, originalSize, destination); + EventMetadata metadata = new EventMetadata(); + metadata.Add("destination", destination); + metadata.Add("exception", e.ToString()); + tracer.RelatedError(metadata, "Error writing file."); + throw; } } public static bool TryStatFileAndUpdateIndex(ITracer tracer, string path, MemoryMappedViewAccessor indexView, long offset) { - if (isUnixOS) + try + { + FileInfo file = new FileInfo(path); + if (file.Exists) + { + Index.IndexEntry indexEntry = new Index.IndexEntry(indexView, offset); + indexEntry.Mtime = file.LastWriteTimeUtc; + indexEntry.Ctime = file.CreationTimeUtc; + indexEntry.Size = (uint)file.Length; + return true; + } + } + catch (System.Security.SecurityException) { - return NativeUnixMethods.TryStatFileAndUpdateIndex(tracer, path, indexView, offset); + // Skip these. } - else + catch (System.UnauthorizedAccessException) { - return NativeWindowsMethods.TryStatFileAndUpdateIndex(tracer, path, indexView, offset); + // Skip these. } + + return false; } + + private static SafeFileHandle OpenForWrite(ITracer tracer, string fileName) + { + SafeFileHandle handle = CreateFile(fileName, FileAccess.Write, FileShare.None, IntPtr.Zero, FileMode.Create, FileAttributes.Normal, IntPtr.Zero); + if (handle.IsInvalid) + { + // If we get a access denied, try reverting the acls to defaults inherited by parent + if (Marshal.GetLastWin32Error() == AccessDeniedWin32Error) + { + tracer.RelatedEvent( + EventLevel.Warning, + "FailedOpenForWrite", + new EventMetadata + { + { TracingConstants.MessageKey.WarningMessage, "Received access denied. Attempting to delete." }, + { "FileName", fileName } + }); + + File.SetAttributes(fileName, FileAttributes.Normal); + File.Delete(fileName); + + handle = CreateFile(fileName, FileAccess.Write, FileShare.None, IntPtr.Zero, FileMode.Create, FileAttributes.Normal, IntPtr.Zero); + } + } + + return handle; + } + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern SafeFileHandle CreateFile( + [MarshalAs(UnmanagedType.LPTStr)] string filename, + [MarshalAs(UnmanagedType.U4)] FileAccess access, + [MarshalAs(UnmanagedType.U4)] FileShare share, + IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero + [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, + [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes, + IntPtr templateFile); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static unsafe extern bool WriteFile( + SafeFileHandle file, + byte* buffer, + uint numberOfBytesToWrite, + out uint numberOfBytesWritten, + IntPtr overlapped); } } diff --git a/GVFS/FastFetch/NativeWindowsMethods.cs b/GVFS/FastFetch/NativeWindowsMethods.cs deleted file mode 100644 index 321abf3124..0000000000 --- a/GVFS/FastFetch/NativeWindowsMethods.cs +++ /dev/null @@ -1,124 +0,0 @@ -using GVFS.Common.Tracing; -using Microsoft.Win32.SafeHandles; -using System; -using System.ComponentModel; -using System.IO; -using System.IO.MemoryMappedFiles; -using System.Runtime.InteropServices; - -namespace FastFetch -{ - public class NativeWindowsMethods - { - private const int AccessDeniedWin32Error = 5; - - public static unsafe void WriteFile(ITracer tracer, byte* originalData, long originalSize, string destination) - { - try - { - using (SafeFileHandle fileHandle = OpenForWrite(tracer, destination)) - { - if (fileHandle.IsInvalid) - { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } - - byte* data = originalData; - long size = originalSize; - uint written = 0; - while (size > 0) - { - uint toWrite = size < uint.MaxValue ? (uint)size : uint.MaxValue; - if (!WriteFile(fileHandle, data, toWrite, out written, IntPtr.Zero)) - { - throw new Win32Exception(Marshal.GetLastWin32Error()); - } - - size -= written; - data = data + written; - } - } - } - catch (Exception e) - { - EventMetadata metadata = new EventMetadata(); - metadata.Add("destination", destination); - metadata.Add("exception", e.ToString()); - tracer.RelatedError(metadata, "Error writing file."); - throw; - } - } - - public static bool TryStatFileAndUpdateIndex(ITracer tracer, string path, MemoryMappedViewAccessor indexView, long offset) - { - try - { - FileInfo file = new FileInfo(path); - if (file.Exists) - { - Index.IndexEntry indexEntry = new Index.IndexEntry(indexView, offset); - indexEntry.Mtime = file.LastWriteTimeUtc; - indexEntry.Ctime = file.CreationTimeUtc; - indexEntry.Size = (uint)file.Length; - return true; - } - } - catch (System.Security.SecurityException) - { - // Skip these. - } - catch (System.UnauthorizedAccessException) - { - // Skip these. - } - - return false; - } - - private static SafeFileHandle OpenForWrite(ITracer tracer, string fileName) - { - SafeFileHandle handle = CreateFile(fileName, FileAccess.Write, FileShare.None, IntPtr.Zero, FileMode.Create, FileAttributes.Normal, IntPtr.Zero); - if (handle.IsInvalid) - { - // If we get a access denied, try reverting the acls to defaults inherited by parent - if (Marshal.GetLastWin32Error() == AccessDeniedWin32Error) - { - tracer.RelatedEvent( - EventLevel.Warning, - "FailedOpenForWrite", - new EventMetadata - { - { TracingConstants.MessageKey.WarningMessage, "Received access denied. Attempting to delete." }, - { "FileName", fileName } - }); - - File.SetAttributes(fileName, FileAttributes.Normal); - File.Delete(fileName); - - handle = CreateFile(fileName, FileAccess.Write, FileShare.None, IntPtr.Zero, FileMode.Create, FileAttributes.Normal, IntPtr.Zero); - } - } - - return handle; - } - - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - private static extern SafeFileHandle CreateFile( - [MarshalAs(UnmanagedType.LPTStr)] string filename, - [MarshalAs(UnmanagedType.U4)] FileAccess access, - [MarshalAs(UnmanagedType.U4)] FileShare share, - IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero - [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, - [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes, - IntPtr templateFile); - - [DllImport("kernel32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static unsafe extern bool WriteFile( - SafeFileHandle file, - byte* buffer, - uint numberOfBytesToWrite, - out uint numberOfBytesWritten, - IntPtr overlapped); - } -} diff --git a/GVFS/FastFetch/Properties/AssemblyInfo.cs b/GVFS/FastFetch/Properties/AssemblyInfo.cs deleted file mode 100644 index b4aa706f75..0000000000 --- a/GVFS/FastFetch/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("FastFetch")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("FastFetch")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("07f2a520-2ab7-46dd-97c0-75d8e988d55b")] diff --git a/GVFS/FastFetch/package.nuspec b/GVFS/FastFetch/package.nuspec deleted file mode 100644 index ec291a94c0..0000000000 --- a/GVFS/FastFetch/package.nuspec +++ /dev/null @@ -1,19 +0,0 @@ - - - - FastFetch - 0.1.0 - Microsoft - https://github.com/Microsoft/GVFS - false - - An internal tool for quickly pulling large git repos from a GVFS-enabled git server. - This application will be deprecated once this same functionality is added to the gvfs prefetch verb. - - - - - - - - \ No newline at end of file From b9fc1a212e0bb267c495afd3d734974fcf5fddc9 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:00:17 +0100 Subject: [PATCH 19/35] build: migrate GVFS.UnitTests and .Tests projects Also combine the GVFS.UnitTests and .Windows projects in to one project (it's all Windows now). --- GVFS/GVFS.Tests/GVFS.Tests.csproj | 20 +- GVFS/GVFS.UnitTests.Windows/App.config | 26 - .../GVFS.UnitTests.Windows.csproj | 543 ------------------ .../Properties/AssemblyInfo.cs | 23 - GVFS/GVFS.UnitTests.Windows/packages.config | 30 - GVFS/GVFS.UnitTests/GVFS.UnitTests.csproj | 68 +-- .../Windows/CommandLine/SparseVerbTests.cs | 0 .../Windows/Mock/MockProcessLauncher.cs | 0 .../Mock/MockVirtualizationInstance.cs | 0 .../Windows/Mock/MockWriteBuffer.cs | 0 .../WindowsFileSystemVirtualizerTester.cs | 0 .../Windows/Platform/ProjFSFilterTests.cs | 0 .../ServiceUI/GVFSToastRequestHandlerTests.cs | 0 .../Windows/Upgrader/UpgradeVerbTests.cs | 0 .../Upgrader/WindowsNuGetUpgraderTests.cs | 0 .../Virtualization/ActiveEnumerationTests.cs | 0 .../Virtualization/PatternMatcherTests.cs | 0 .../WindowsFileSystemVirtualizerTests.cs | 0 .../Windows/WindowsFileBasedLockTests.cs | 0 19 files changed, 33 insertions(+), 677 deletions(-) delete mode 100644 GVFS/GVFS.UnitTests.Windows/App.config delete mode 100644 GVFS/GVFS.UnitTests.Windows/GVFS.UnitTests.Windows.csproj delete mode 100644 GVFS/GVFS.UnitTests.Windows/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.UnitTests.Windows/packages.config rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/CommandLine/SparseVerbTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Mock/MockProcessLauncher.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Mock/MockVirtualizationInstance.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Mock/MockWriteBuffer.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Mock/WindowsFileSystemVirtualizerTester.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Platform/ProjFSFilterTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/ServiceUI/GVFSToastRequestHandlerTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Upgrader/UpgradeVerbTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Upgrader/WindowsNuGetUpgraderTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Virtualization/ActiveEnumerationTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Virtualization/PatternMatcherTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/Virtualization/WindowsFileSystemVirtualizerTests.cs (100%) rename GVFS/{GVFS.UnitTests.Windows => GVFS.UnitTests}/Windows/WindowsFileBasedLockTests.cs (100%) diff --git a/GVFS/GVFS.Tests/GVFS.Tests.csproj b/GVFS/GVFS.Tests/GVFS.Tests.csproj index acf5c82801..c02954c262 100644 --- a/GVFS/GVFS.Tests/GVFS.Tests.csproj +++ b/GVFS/GVFS.Tests/GVFS.Tests.csproj @@ -1,24 +1,12 @@ - - netcoreapp2.1;netstandard2.0 - x64 - true - true - win-x64;osx-x64 - - - $(GVFSVersion) - - - $(GVFSVersion) + net461 - - all - + - \ No newline at end of file + + diff --git a/GVFS/GVFS.UnitTests.Windows/App.config b/GVFS/GVFS.UnitTests.Windows/App.config deleted file mode 100644 index 0acacc87be..0000000000 --- a/GVFS/GVFS.UnitTests.Windows/App.config +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/GVFS/GVFS.UnitTests.Windows/GVFS.UnitTests.Windows.csproj b/GVFS/GVFS.UnitTests.Windows/GVFS.UnitTests.Windows.csproj deleted file mode 100644 index 2150248d73..0000000000 --- a/GVFS/GVFS.UnitTests.Windows/GVFS.UnitTests.Windows.csproj +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - - - - {8E0D0989-21F6-4DD8-946C-39F992523CC6} - Exe - Properties - GVFS.UnitTests.Windows - GVFS.UnitTests.Windows - v4.6.1 - 512 - true - - - - - true - DEBUG;TRACE - full - x64 - prompt - true - true - - - TRACE - true - pdbonly - x64 - prompt - true - true - - - - ..\..\..\packages\Castle.Core.4.3.1\lib\net45\Castle.Core.dll - - - ..\..\..\packages\Microsoft.Data.Sqlite.Core.2.2.4\lib\netstandard2.0\Microsoft.Data.Sqlite.dll - - - ..\..\..\packages\Moq.4.10.1\lib\net45\Moq.dll - - - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - True - - - False - ..\..\..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll - True - - - ..\..\..\packages\NuGet.Common.4.9.2\lib\net46\NuGet.Common.dll - - - ..\..\..\packages\NuGet.Configuration.4.9.2\lib\net46\NuGet.Configuration.dll - - - ..\..\..\packages\NuGet.Frameworks.4.9.2\lib\net46\NuGet.Frameworks.dll - - - ..\..\..\packages\NuGet.Packaging.4.9.2\lib\net46\NuGet.Packaging.dll - - - ..\..\..\packages\NuGet.Packaging.Core.4.9.2\lib\net46\NuGet.Packaging.Core.dll - - - ..\..\..\packages\NuGet.Protocol.4.9.2\lib\net46\NuGet.Protocol.dll - - - ..\..\..\packages\NuGet.Versioning.4.9.2\lib\net46\NuGet.Versioning.dll - - - ..\..\..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll - - - ..\..\..\packages\NUnitLite.3.12.0\lib\net45\nunitlite.dll - - - ..\..\..\packages\Microsoft.Windows.ProjFS.1.1.19156.1\lib\net461\ProjectedFSLib.Managed.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_green.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_v2.dll - - - ..\..\..\packages\SQLitePCLRaw.core.1.1.12\lib\net45\SQLitePCLRaw.core.dll - - - ..\..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.12\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll - - - - - - ..\..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - - - - - - - - ..\..\..\packages\System.Threading.Tasks.Extensions.4.5.1\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {1118b427-7063-422f-83b9-5023c8ec5a7a} - GVFS.GVFlt - - - {15fae44c-0d21-4312-9fd3-28f05a5ab7a6} - GVFS.Platform.POSIX - - - {4ce404e7-d3fc-471c-993c-64615861ea63} - GVFS.Platform.Windows - - - {93b403fd-dafb-46c5-9636-b122792a548a} - GVFS.Service.UI - - - {b8c1dfba-cafd-4f7e-a1a3-e11907b5467b} - GVFS.Service.Windows - - - {72701bc3-5da9-4c7a-bf10-9e98c9fc8eac} - GVFS.Tests - - - {aecec217-2499-403d-b0bb-2962b9be5970} - GVFS.Upgrader - - - {F468B05A-95E5-46BC-8C67-B80A78527B7D} - GVFS.Virtualization - - - {32220664-594C-4425-B9A0-88E0BE2F3D2A} - GVFS.Windows - - - - - - - - NetCore\Category\\CategoryConstants.cs - - - NetCore\CommandLine\\HooksInstallerTests.cs - - - NetCore\Common\\AzDevOpsOrgFromNuGetFeedTests.cs - - - NetCore\Common\\BackgroundTaskQueueTests.cs - - - NetCore\Common\\CacheServerResolverTests.cs - - - NetCore\Common\Database\\GVFSDatabaseTests.cs - - - NetCore\Common\Database\\PlaceholderTableTests.cs - - - NetCore\Common\Database\\SparseTableTests.cs - - - NetCore\Common\Database\\TableTests.cs - - - NetCore\Common\\EpochConverterTests.cs - - - NetCore\Common\\FileBasedDictionaryTests.cs - - - NetCore\Common\\GitCommandLineParserTests.cs - - - NetCore\Common\\GitConfigHelperTests.cs - - - NetCore\Common\\GitObjectsTests.cs - - - NetCore\Common\\GitPathConverterTests.cs - - - NetCore\Common\\GitStatusCacheTests.cs - - - NetCore\Common\\GitVersionTests.cs - - - NetCore\Common\Git\\GitSslTests.cs - - - NetCore\Common\Git\\Sha1IdTests.cs - - - NetCore\Common\\GVFSEnlistmentHealthTests.cs - - - NetCore\Common\\GVFSEnlistmentTests.cs - - - NetCore\Common\\GVFSLockTests.cs - - - NetCore\Common\\InstallManifestTests.cs - - - NetCore\Common\\JsonTracerTests.cs - - - NetCore\Common\\LegacyPlaceholderDatabaseTests.cs - - - NetCore\Common\\LibGit2RepoInvokerTests.cs - - - NetCore\Common\\ModifiedPathsDatabaseTests.cs - - - NetCore\Common\\NamedPipeStreamReaderWriterTests.cs - - - NetCore\Common\\NamedPipeTests.cs - - - NetCore\Common\NuGetUpgrade\\NuGetUpgraderTests.cs - - - NetCore\Common\NuGetUpgrade\\OrgNuGetUpgraderTests.cs - - - NetCore\Common\\OrgInfoApiClientTests.cs - - - NetCore\Common\\PathsTests.cs - - - NetCore\Common\\PhysicalFileSystemDeleteTests.cs - - - NetCore\Common\\ProductUpgraderInfoTests.cs - - - NetCore\Common\\RefLogEntryTests.cs - - - NetCore\Common\\RetryBackoffTests.cs - - - NetCore\Common\\RetryConfigTests.cs - - - NetCore\Common\\RetryWrapperTests.cs - - - NetCore\Common\\SHA1UtilTests.cs - - - NetCore\Common\\TryCreateProductUpgraderTests.cs - - - NetCore\Git\\GitAuthenticationTests.cs - - - NetCore\Git\\GitObjectsTests.cs - - - NetCore\Git\\GitProcessTests.cs - - - NetCore\Git\\GVFSGitObjectsTests.cs - - - NetCore\Maintenance\\GitMaintenanceQueueTests.cs - - - NetCore\Maintenance\\GitMaintenanceStepTests.cs - - - NetCore\Maintenance\\LooseObjectStepTests.cs - - - NetCore\Maintenance\\PackfileMaintenanceStepTests.cs - - - NetCore\Maintenance\\PostFetchStepTests.cs - - - NetCore\Mock\Common\\MockFileBasedLock.cs - - - NetCore\Mock\Common\\MockGitStatusCache.cs - - - NetCore\Mock\Common\\MockGVFSEnlistment.cs - - - NetCore\Mock\Common\\MockLocalGVFSConfig.cs - - - NetCore\Mock\Common\\MockLocalGVFSConfigBuilder.cs - - - NetCore\Mock\Common\\MockPhysicalGitObjects.cs - - - NetCore\Mock\Common\\MockPlatform.cs - - - NetCore\Mock\Common\\MockProductUpgraderPlatformStrategy.cs - - - NetCore\Mock\Common\\MockTracer.cs - - - NetCore\Mock\Common\Tracing\\MockListener.cs - - - NetCore\Mock\FileSystem\\ConfigurableFileSystem.cs - - - NetCore\Mock\FileSystem\\MockDirectory.cs - - - NetCore\Mock\FileSystem\\MockFile.cs - - - NetCore\Mock\FileSystem\\MockFileSystem.cs - - - NetCore\Mock\FileSystem\\MockFileSystemCallbacks.cs - - - NetCore\Mock\FileSystem\\MockFileSystemWithCallbacks.cs - - - NetCore\Mock\FileSystem\\MockPlatformFileSystem.cs - - - NetCore\Mock\Git\\MockBatchHttpGitObjects.cs - - - NetCore\Mock\Git\\MockGitInstallation.cs - - - NetCore\Mock\Git\\MockGitProcess.cs - - - NetCore\Mock\Git\\MockGitRepo.cs - - - NetCore\Mock\Git\\MockGVFSGitObjects.cs - - - NetCore\Mock\Git\\MockHttpGitObjects.cs - - - NetCore\Mock\Git\\MockLibGit2Repo.cs - - - NetCore\Mock\\MockCacheServerInfo.cs - - - NetCore\Mock\\MockGitHubUpgrader.cs - - - NetCore\Mock\\MockInstallerPreRunChecker.cs - - - NetCore\Mock\\MockTextWriter.cs - - - NetCore\Mock\\ReusableMemoryStream.cs - - - NetCore\Mock\Virtualization\Background\\MockBackgroundTaskManager.cs - - - NetCore\Mock\Virtualization\BlobSize\\MockBlobSizesDatabase.cs - - - NetCore\Mock\Virtualization\FileSystem\\MockFileSystemVirtualizer.cs - - - NetCore\Mock\Virtualization\Projection\\MockGitIndexProjection.cs - - - NetCore\Prefetch\\BatchObjectDownloadStageTests.cs - - - NetCore\Prefetch\\BlobPrefetcherTests.cs - - - NetCore\Prefetch\\DiffHelperTests.cs - - - NetCore\Prefetch\\DiffTreeResultTests.cs - - - NetCore\Prefetch\\PrefetchPacksDeserializerTests.cs - - - NetCore\Prefetch\\PrefetchTracingTests.cs - - - NetCore\\Program.cs - - - NetCore\Service\\RepoRegistryTests.cs - - - NetCore\\Setup.cs - - - NetCore\Tracing\\EventListenerTests.cs - - - NetCore\Tracing\\QueuedPipeStringWriterTests.cs - - - NetCore\Tracing\\TelemetryDaemonEventListenerTests.cs - - - NetCore\Upgrader\\ProductUpgraderTests.cs - - - NetCore\Upgrader\\UpgradeOrchestratorTests.cs - - - NetCore\Upgrader\\UpgradeOrchestratorWithGitHubUpgraderTests.cs - - - NetCore\Upgrader\\UpgradeTests.cs - - - NetCore\Virtualization\\FileSystemCallbacksTests.cs - - - NetCore\Virtualization\Projection\\GitIndexEntryTests.cs - - - NetCore\Virtualization\Projection\\LazyUTF8StringTests.cs - - - NetCore\Virtualization\Projection\\ObjectPoolTests.cs - - - NetCore\Virtualization\Projection\\SortedFolderEntriesTests.cs - - - NetCore\Virtual\\CommonRepoSetup.cs - - - NetCore\Virtual\\FileSystemVirtualizerTester.cs - - - NetCore\Virtual\\TestsWithCommonRepo.cs - - - Data\%(RecursiveDir)\%(Filename)%(Extension) - Always - - - Readme.md - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.UnitTests.Windows/Properties/AssemblyInfo.cs b/GVFS/GVFS.UnitTests.Windows/Properties/AssemblyInfo.cs deleted file mode 100644 index e8d089a151..0000000000 --- a/GVFS/GVFS.UnitTests.Windows/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.UnitTests.Windows")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.UnitTests.Windows")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8e0d0989-21f6-4dd8-946c-39f992523cc6")] diff --git a/GVFS/GVFS.UnitTests.Windows/packages.config b/GVFS/GVFS.UnitTests.Windows/packages.config deleted file mode 100644 index c66117ee1f..0000000000 --- a/GVFS/GVFS.UnitTests.Windows/packages.config +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.UnitTests/GVFS.UnitTests.csproj b/GVFS/GVFS.UnitTests/GVFS.UnitTests.csproj index 8013af848b..57ed82f97b 100644 --- a/GVFS/GVFS.UnitTests/GVFS.UnitTests.csproj +++ b/GVFS/GVFS.UnitTests/GVFS.UnitTests.csproj @@ -1,26 +1,38 @@  - - - Exe - netcoreapp2.1 - x64 - false - true - win-x64;osx-x64 - + net461 + Exe true - GVFS.UnitTests - GVFS.UnitTests - - - $(GVFSVersion) - - - $(GVFSVersion) + + + + + + + + + + + + + + + + + + + + + ProjectedFSLib.dll + PreserveNewest + + + Always @@ -36,26 +48,4 @@ - - - - - - - - - - - all - - - - - - - - - - - diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/CommandLine/SparseVerbTests.cs b/GVFS/GVFS.UnitTests/Windows/CommandLine/SparseVerbTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/CommandLine/SparseVerbTests.cs rename to GVFS/GVFS.UnitTests/Windows/CommandLine/SparseVerbTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Mock/MockProcessLauncher.cs b/GVFS/GVFS.UnitTests/Windows/Mock/MockProcessLauncher.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Mock/MockProcessLauncher.cs rename to GVFS/GVFS.UnitTests/Windows/Mock/MockProcessLauncher.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Mock/MockVirtualizationInstance.cs b/GVFS/GVFS.UnitTests/Windows/Mock/MockVirtualizationInstance.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Mock/MockVirtualizationInstance.cs rename to GVFS/GVFS.UnitTests/Windows/Mock/MockVirtualizationInstance.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Mock/MockWriteBuffer.cs b/GVFS/GVFS.UnitTests/Windows/Mock/MockWriteBuffer.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Mock/MockWriteBuffer.cs rename to GVFS/GVFS.UnitTests/Windows/Mock/MockWriteBuffer.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Mock/WindowsFileSystemVirtualizerTester.cs b/GVFS/GVFS.UnitTests/Windows/Mock/WindowsFileSystemVirtualizerTester.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Mock/WindowsFileSystemVirtualizerTester.cs rename to GVFS/GVFS.UnitTests/Windows/Mock/WindowsFileSystemVirtualizerTester.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Platform/ProjFSFilterTests.cs b/GVFS/GVFS.UnitTests/Windows/Platform/ProjFSFilterTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Platform/ProjFSFilterTests.cs rename to GVFS/GVFS.UnitTests/Windows/Platform/ProjFSFilterTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/ServiceUI/GVFSToastRequestHandlerTests.cs b/GVFS/GVFS.UnitTests/Windows/ServiceUI/GVFSToastRequestHandlerTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/ServiceUI/GVFSToastRequestHandlerTests.cs rename to GVFS/GVFS.UnitTests/Windows/ServiceUI/GVFSToastRequestHandlerTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Upgrader/UpgradeVerbTests.cs b/GVFS/GVFS.UnitTests/Windows/Upgrader/UpgradeVerbTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Upgrader/UpgradeVerbTests.cs rename to GVFS/GVFS.UnitTests/Windows/Upgrader/UpgradeVerbTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Upgrader/WindowsNuGetUpgraderTests.cs b/GVFS/GVFS.UnitTests/Windows/Upgrader/WindowsNuGetUpgraderTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Upgrader/WindowsNuGetUpgraderTests.cs rename to GVFS/GVFS.UnitTests/Windows/Upgrader/WindowsNuGetUpgraderTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/ActiveEnumerationTests.cs b/GVFS/GVFS.UnitTests/Windows/Virtualization/ActiveEnumerationTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/ActiveEnumerationTests.cs rename to GVFS/GVFS.UnitTests/Windows/Virtualization/ActiveEnumerationTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/PatternMatcherTests.cs b/GVFS/GVFS.UnitTests/Windows/Virtualization/PatternMatcherTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/PatternMatcherTests.cs rename to GVFS/GVFS.UnitTests/Windows/Virtualization/PatternMatcherTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/WindowsFileSystemVirtualizerTests.cs b/GVFS/GVFS.UnitTests/Windows/Virtualization/WindowsFileSystemVirtualizerTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/WindowsFileSystemVirtualizerTests.cs rename to GVFS/GVFS.UnitTests/Windows/Virtualization/WindowsFileSystemVirtualizerTests.cs diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/WindowsFileBasedLockTests.cs b/GVFS/GVFS.UnitTests/Windows/WindowsFileBasedLockTests.cs similarity index 100% rename from GVFS/GVFS.UnitTests.Windows/Windows/WindowsFileBasedLockTests.cs rename to GVFS/GVFS.UnitTests/Windows/WindowsFileBasedLockTests.cs From e38a1295d099be8a73e6a3ff35636dcd050d1851 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:01:12 +0100 Subject: [PATCH 20/35] build: migrate GVFS.FunctionalTests.LockHolder project --- .../App.config | 6 --- .../GVFS.FunctionalTests.LockHolder.csproj | 38 ++++--------------- .../Properties/AssemblyInfo.cs | 23 ----------- .../packages.config | 18 --------- 4 files changed, 7 insertions(+), 78 deletions(-) delete mode 100644 GVFS/GVFS.FunctionalTests.LockHolder/App.config delete mode 100644 GVFS/GVFS.FunctionalTests.LockHolder/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.FunctionalTests.LockHolder/packages.config diff --git a/GVFS/GVFS.FunctionalTests.LockHolder/App.config b/GVFS/GVFS.FunctionalTests.LockHolder/App.config deleted file mode 100644 index 00bfd114af..0000000000 --- a/GVFS/GVFS.FunctionalTests.LockHolder/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.FunctionalTests.LockHolder/GVFS.FunctionalTests.LockHolder.csproj b/GVFS/GVFS.FunctionalTests.LockHolder/GVFS.FunctionalTests.LockHolder.csproj index 837fd98698..9a1615fbf3 100644 --- a/GVFS/GVFS.FunctionalTests.LockHolder/GVFS.FunctionalTests.LockHolder.csproj +++ b/GVFS/GVFS.FunctionalTests.LockHolder/GVFS.FunctionalTests.LockHolder.csproj @@ -1,42 +1,18 @@  - + + net461 Exe - netcoreapp2.1 - x64 - - true - true - win-x64;osx-x64 - - - - GVFS.FunctionalTests.LockHolder - GVFS.FunctionalTests.LockHolder - - $(GVFSVersion) - - - $(GVFSVersion) - - - - - + - + - - - - - - - all - + + + diff --git a/GVFS/GVFS.FunctionalTests.LockHolder/Properties/AssemblyInfo.cs b/GVFS/GVFS.FunctionalTests.LockHolder/Properties/AssemblyInfo.cs deleted file mode 100644 index 80fc7a26a1..0000000000 --- a/GVFS/GVFS.FunctionalTests.LockHolder/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.FunctionalTests.LockHolder")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.FunctionalTests.LockHolder")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("fa273f69-5762-43d8-aea1-b4f08090d624")] diff --git a/GVFS/GVFS.FunctionalTests.LockHolder/packages.config b/GVFS/GVFS.FunctionalTests.LockHolder/packages.config deleted file mode 100644 index 4dfb30949a..0000000000 --- a/GVFS/GVFS.FunctionalTests.LockHolder/packages.config +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file From 7c5c374c49913197134a03ec98308df30b0869fe Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:01:35 +0100 Subject: [PATCH 21/35] build: migrate GVFS.PerfProfiling project --- GVFS/GVFS.PerfProfiling/App.config | 6 - .../GVFS.PerfProfiling.csproj | 109 ++---------------- .../Properties/AssemblyInfo.cs | 23 ---- GVFS/GVFS.PerfProfiling/packages.config | 11 -- 4 files changed, 9 insertions(+), 140 deletions(-) delete mode 100644 GVFS/GVFS.PerfProfiling/App.config delete mode 100644 GVFS/GVFS.PerfProfiling/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.PerfProfiling/packages.config diff --git a/GVFS/GVFS.PerfProfiling/App.config b/GVFS/GVFS.PerfProfiling/App.config deleted file mode 100644 index 6d44256319..0000000000 --- a/GVFS/GVFS.PerfProfiling/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/GVFS/GVFS.PerfProfiling/GVFS.PerfProfiling.csproj b/GVFS/GVFS.PerfProfiling/GVFS.PerfProfiling.csproj index fac88be03a..de092f981c 100644 --- a/GVFS/GVFS.PerfProfiling/GVFS.PerfProfiling.csproj +++ b/GVFS/GVFS.PerfProfiling/GVFS.PerfProfiling.csproj @@ -1,105 +1,14 @@ - - - - + + - {C5D3CA26-562F-4CA4-A378-B93E97A730E3} Exe - Properties - GVFS.PerfProfiling - GVFS.PerfProfiling - v4.6.1 - 512 - true - - + net461 - - true - DEBUG;TRACE - full - x64 - prompt - - - TRACE - true - pdbonly - x64 - prompt - - - - ..\..\..\packages\Microsoft.Data.Sqlite.Core.2.2.4\lib\netstandard2.0\Microsoft.Data.Sqlite.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_green.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_v2.dll - - - ..\..\..\packages\SQLitePCLRaw.core.1.1.12\lib\net45\SQLitePCLRaw.core.dll - - - ..\..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.12\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll - - - - - - - - - - - - - - - - PlatformLoader.Windows.cs - - - - - - + - - {374bf1e5-0b2d-4d4a-bd5e-4212299def09} - GVFS.Common - - - {1118b427-7063-422f-83b9-5023c8ec5a7a} - GVFS.GVFlt - - - {4ce404e7-d3fc-471c-993c-64615861ea63} - GVFS.Platform.Windows - - - {f468b05a-95e5-46bc-8c67-b80a78527b7d} - GVFS.Virtualization - + + + - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file + + diff --git a/GVFS/GVFS.PerfProfiling/Properties/AssemblyInfo.cs b/GVFS/GVFS.PerfProfiling/Properties/AssemblyInfo.cs deleted file mode 100644 index 540c65d5d1..0000000000 --- a/GVFS/GVFS.PerfProfiling/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.PerfProfiling")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.PerfProfiling")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c5d3ca26-562f-4ca4-a378-b93e97a730e3")] diff --git a/GVFS/GVFS.PerfProfiling/packages.config b/GVFS/GVFS.PerfProfiling/packages.config deleted file mode 100644 index ebcf07f92f..0000000000 --- a/GVFS/GVFS.PerfProfiling/packages.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file From 173d930241b34d1b01f96145fec62b7d8b07d384 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:02:01 +0100 Subject: [PATCH 22/35] build: replace GVFS.SignFiles with GVFS.Payload project Replace the 'sign files' project with a 'payload' project and script (that gathers binaries for signing). --- GVFS/GVFS.Payload/GVFS.Payload.csproj | 61 ++++++++++++++++ GVFS/GVFS.Payload/layout.bat | 87 ++++++++++++++++++++++ GVFS/GVFS.SignFiles/GVFS.SignFiles.csproj | 88 ----------------------- GVFS/GVFS.SignFiles/packages.config | 4 -- 4 files changed, 148 insertions(+), 92 deletions(-) create mode 100644 GVFS/GVFS.Payload/GVFS.Payload.csproj create mode 100644 GVFS/GVFS.Payload/layout.bat delete mode 100644 GVFS/GVFS.SignFiles/GVFS.SignFiles.csproj delete mode 100644 GVFS/GVFS.SignFiles/packages.config diff --git a/GVFS/GVFS.Payload/GVFS.Payload.csproj b/GVFS/GVFS.Payload/GVFS.Payload.csproj new file mode 100644 index 0000000000..c6f7004c5d --- /dev/null +++ b/GVFS/GVFS.Payload/GVFS.Payload.csproj @@ -0,0 +1,61 @@ + + + + net461 + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Microsoft400 + false + + + + diff --git a/GVFS/GVFS.Payload/layout.bat b/GVFS/GVFS.Payload/layout.bat new file mode 100644 index 0000000000..10c7c8878d --- /dev/null +++ b/GVFS/GVFS.Payload/layout.bat @@ -0,0 +1,87 @@ +@ECHO OFF +SETLOCAL + +IF "%~1" == "" ( + ECHO error: missing configuration + ECHO. + GOTO USAGE +) + +IF "%~2" == "" ( + ECHO error: missing version + ECHO. + GOTO USAGE +) + +IF "%~3" == "" ( + ECHO error: missing ProjFS path + ECHO. + GOTO USAGE +) + +IF "%~4" == "" ( + ECHO error: missing VCRuntime path + ECHO. + GOTO USAGE +) + +IF "%~5" == "" ( + ECHO error: missing output path + ECHO. + GOTO USAGE +) + +SET CONFIGURATION=%1 +SET GVFSVERSION=%2 +SET PROJFS=%3 +SET VCRUNTIME=%4 +SET OUTPUT=%5 + +SET ROOT=%~dp0..\.. +SET BUILD_OUT=%ROOT%\..\out +SET MANAGED_OUT_FRAGMENT=bin\%CONFIGURATION%\net461\win-x64 +SET NATIVE_OUT_FRAGMENT=bin\x64\%CONFIGURATION% + +ECHO Copying files... +xcopy /Y %PROJFS%\filter\PrjFlt.sys %OUTPUT%\Filter\ +xcopy /Y %PROJFS%\filter\prjflt.inf %OUTPUT%\Filter\ +xcopy /Y %PROJFS%\lib\ProjectedFSLib.dll %OUTPUT%\ProjFS\ +xcopy /Y %VCRUNTIME%\lib\x64\msvcp140.dll %OUTPUT% +xcopy /Y %VCRUNTIME%\lib\x64\msvcp140_1.dll %OUTPUT% +xcopy /Y %VCRUNTIME%\lib\x64\msvcp140_2.dll %OUTPUT% +xcopy /Y %VCRUNTIME%\lib\x64\vcruntime140.dll %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS\%MANAGED_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.Hooks\%MANAGED_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.Mount\%MANAGED_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.Service\%MANAGED_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.Service.UI\%MANAGED_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.Upgrader\%MANAGED_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GitHooksLoader\%NATIVE_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.PostIndexChangedHook\%NATIVE_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.ReadObjectHook\%NATIVE_OUT_FRAGMENT%\* %OUTPUT% +xcopy /Y /S %BUILD_OUT%\GVFS.VirtualFileSystemHook\%NATIVE_OUT_FRAGMENT%\* %OUTPUT% + +ECHO Cleaning up... +REM Remove unused LibGit2 files +RMDIR /S /Q %OUTPUT%\lib +REM Remove files for x86 (not supported) +RMDIR /S /Q %OUTPUT%\x86 + +GOTO EOF + +:USAGE +ECHO usage: %~n0%~x0 ^ ^ ^ ^ ^ +ECHO. +ECHO configuration Build configuration (Debug, Release). +ECHO version GVFS version string. +ECHO projfs Path to GVFS.ProjFS NuGet package contents. +ECHO vcruntime Path to GVFS.VCRuntime NuGet package contents. +ECHO output Output directory. +ECHO. +EXIT 1 + +:ERROR +ECHO Failed with error %ERRORLEVEL% +EXIT /B %ERRORLEVEL% + +:EOF diff --git a/GVFS/GVFS.SignFiles/GVFS.SignFiles.csproj b/GVFS/GVFS.SignFiles/GVFS.SignFiles.csproj deleted file mode 100644 index e64f658d69..0000000000 --- a/GVFS/GVFS.SignFiles/GVFS.SignFiles.csproj +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - {2F63B22B-EE26-4266-BF17-28A9146483A1} - Library - Properties - GVFS.SignFiles - GVFS.SignFiles - $(BuildOutputDir) - - v4.6.1 - 512 - - - - - - true - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - - Microsoft400 - false - - - - - Designer - - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - diff --git a/GVFS/GVFS.SignFiles/packages.config b/GVFS/GVFS.SignFiles/packages.config deleted file mode 100644 index 7e1df5b5d9..0000000000 --- a/GVFS/GVFS.SignFiles/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From fbf300bf76c41e3193337b3d3a9fd37acad2935f Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:02:44 +0100 Subject: [PATCH 23/35] build: migrate GVFS.Installer.Windows project Migrate the Windows installer project to the new build system, and also use wildcard inclusion of files in the Inno setup. --- .../GVFS.Installer.Windows.csproj | 66 --------- GVFS/GVFS.Installer.Windows/packages.config | 6 - GVFS/GVFS.Installers/GVFS.Installers.csproj | 58 ++++++++ .../GVFS.Installers.template.nuspec | 15 ++ .../Setup.iss | 132 +----------------- GVFS/GVFS.Installers/info.bat | 68 +++++++++ GVFS/GVFS.Installers/install.bat | 19 +++ 7 files changed, 166 insertions(+), 198 deletions(-) delete mode 100644 GVFS/GVFS.Installer.Windows/GVFS.Installer.Windows.csproj delete mode 100644 GVFS/GVFS.Installer.Windows/packages.config create mode 100644 GVFS/GVFS.Installers/GVFS.Installers.csproj create mode 100644 GVFS/GVFS.Installers/GVFS.Installers.template.nuspec rename GVFS/{GVFS.Installer.Windows => GVFS.Installers}/Setup.iss (71%) create mode 100644 GVFS/GVFS.Installers/info.bat create mode 100644 GVFS/GVFS.Installers/install.bat diff --git a/GVFS/GVFS.Installer.Windows/GVFS.Installer.Windows.csproj b/GVFS/GVFS.Installer.Windows/GVFS.Installer.Windows.csproj deleted file mode 100644 index 0159c407e7..0000000000 --- a/GVFS/GVFS.Installer.Windows/GVFS.Installer.Windows.csproj +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - {3AB4FB1F-9E23-4CD8-BFAC-8A2221C8F893} - Library - Properties - GVFS.Installer.Windows - GVFS.Installer.Windows - v4.6.1 - 512 - - - - - true - DEBUG;TRACE - full - x64 - prompt - MinimumRecommendedRules.ruleset - - - TRACE - true - pdbonly - x64 - prompt - MinimumRecommendedRules.ruleset - - - - Microsoft400 - false - - - - - - - - Designer - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.Installer.Windows/packages.config b/GVFS/GVFS.Installer.Windows/packages.config deleted file mode 100644 index 7635037a7b..0000000000 --- a/GVFS/GVFS.Installer.Windows/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.Installers/GVFS.Installers.csproj b/GVFS/GVFS.Installers/GVFS.Installers.csproj new file mode 100644 index 0000000000..da65ffbe46 --- /dev/null +++ b/GVFS/GVFS.Installers/GVFS.Installers.csproj @@ -0,0 +1,58 @@ + + + + net461 + false + $(RepoOutPath)GVFS.Payload\bin\$(Configuration)\win-x64\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Microsoft400 + false + + + + + + + + + + + + + + + + + + + diff --git a/GVFS/GVFS.Installers/GVFS.Installers.template.nuspec b/GVFS/GVFS.Installers/GVFS.Installers.template.nuspec new file mode 100644 index 0000000000..8991bd81e0 --- /dev/null +++ b/GVFS/GVFS.Installers/GVFS.Installers.template.nuspec @@ -0,0 +1,15 @@ + + + + GVFS.Installers + $version$ + Microsoft + false + GVFS and G4W installers + + + + + + + diff --git a/GVFS/GVFS.Installer.Windows/Setup.iss b/GVFS/GVFS.Installers/Setup.iss similarity index 71% rename from GVFS/GVFS.Installer.Windows/Setup.iss rename to GVFS/GVFS.Installers/Setup.iss index 2b6525c3d2..268cbbbc95 100644 --- a/GVFS/GVFS.Installer.Windows/Setup.iss +++ b/GVFS/GVFS.Installers/Setup.iss @@ -3,23 +3,8 @@ ; General documentation on how to use InnoSetup scripts: http://www.jrsoftware.org/ishelp/index.php -#define PrjFltDir PackagesDir + "\" + ProjFSNativePackage + "\filter" -#define ProjFSNativeLibDir PackagesDir + "\" + ProjFSNativePackage + "\lib" -#define VCRuntimeDir PackagesDir + "\GVFS.VCRuntime.0.2.0-build\lib\x64" -#define GVFSDir BuildOutputDir + "\GVFS.Windows\bin\" + PlatformAndConfiguration -#define GVFSCommonDir BuildOutputDir + "\GVFS.Common\bin\" + PlatformAndConfiguration + "\netstandard2.0" -#define HooksDir BuildOutputDir + "\GVFS.Hooks.Windows\bin\" + PlatformAndConfiguration -#define HooksLoaderDir BuildOutputDir + "\GitHooksLoader\bin\" + PlatformAndConfiguration -#define ServiceDir BuildOutputDir + "\GVFS.Service.Windows\bin\" + PlatformAndConfiguration -#define ServiceUIDir BuildOutputDir + "\GVFS.Service.UI\bin\" + PlatformAndConfiguration -#define GVFSMountDir BuildOutputDir + "\GVFS.Mount.Windows\bin\" + PlatformAndConfiguration -#define ReadObjectDir BuildOutputDir + "\GVFS.ReadObjectHook.Windows\bin\" + PlatformAndConfiguration -#define VirtualFileSystemDir BuildOutputDir + "\GVFS.VirtualFileSystemHook.Windows\bin\" + PlatformAndConfiguration -#define PostIndexChangedDir BuildOutputDir + "\GVFS.PostIndexChangedHook.Windows\bin\" + PlatformAndConfiguration -#define GVFSUpgraderDir BuildOutputDir + "\GVFS.Upgrader\bin\" + PlatformAndConfiguration + "\net461" - #define MyAppName "GVFS" -#define MyAppInstallerVersion GetFileVersion(GVFSDir + "\GVFS.exe") +#define MyAppInstallerVersion GetFileVersion(LayoutDir + "\GVFS.exe") #define MyAppPublisher "Microsoft Corporation" #define MyAppPublisherURL "http://www.microsoft.com" #define MyAppURL "https://github.com/microsoft/VFSForGit" @@ -41,7 +26,7 @@ AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppPublisherURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} -AppCopyright=Copyright � Microsoft 2019 +AppCopyright=Copyright (c) Microsoft 2021 BackColor=clWhite BackSolid=yes DefaultDirName={pf}\{#MyAppName} @@ -53,14 +38,14 @@ SolidCompression=yes MinVersion=10.0.14374 DisableDirPage=yes DisableReadyPage=yes -SetupIconFile="{#GVFSDir}\GitVirtualFileSystem.ico" +SetupIconFile="{#LayoutDir}\GitVirtualFileSystem.ico" ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64 WizardImageStretch=no WindowResizable=no CloseApplications=yes ChangesEnvironment=yes -RestartIfNeededByRun=yes +RestartIfNeededByRun=yes [Languages] Name: "english"; MessagesFile: "compiler:Default.isl"; @@ -75,113 +60,8 @@ Name: "full"; Description: "Full installation"; Flags: iscustom; Type: files; Name: "{app}\ucrtbase.dll" [Files] -; PrjFlt Filter Files -DestDir: "{app}\Filter"; Flags: ignoreversion; Source:"{#PrjFltDir}\PrjFlt.sys" -DestDir : "{app}\Filter"; Flags: ignoreversion; Source: "{#PrjFltDir}\prjflt.inf" - -; PrjFlt Native Library Files, the GVFS.Service will copy these files into the {app} directory if needed -DestDir: "{app}\ProjFS"; Flags: ignoreversion; Source:"{#ProjFSNativeLibDir}\ProjectedFSLib.dll" - -; PrjFlt Managed Assembly Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\ProjectedFSLib.Managed.dll" - -; GitHooks Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#HooksDir}\GVFS.Hooks.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#HooksDir}\GVFS.Hooks.exe" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#HooksDir}\GVFS.Hooks.exe.config" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#HooksLoaderDir}\GitHooksLoader.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#HooksLoaderDir}\GitHooksLoader.exe" - -; GVFS.Common Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSCommonDir}\git2.dll" - -; GVFS.Mount Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSMountDir}\GVFS.Mount.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSMountDir}\GVFS.Mount.exe" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSMountDir}\GVFS.Mount.exe.config" - -; GVFS.Upgrader Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSUpgraderDir}\GVFS.Upgrader.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSUpgraderDir}\GVFS.Upgrader.exe" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSUpgraderDir}\GVFS.Upgrader.exe.config" - -; GVFS.ReadObjectHook files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ReadObjectDir}\GVFS.ReadObjectHook.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ReadObjectDir}\GVFS.ReadObjectHook.exe" - -; GVFS.VirtualFileSystemHook files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#VirtualFileSystemDir}\GVFS.VirtualFileSystemHook.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#VirtualFileSystemDir}\GVFS.VirtualFileSystemHook.exe" - -; GVFS.PostIndexChangedHook files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#PostIndexChangedDir}\GVFS.PostIndexChangedHook.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#PostIndexChangedDir}\GVFS.PostIndexChangedHook.exe" - -; Cpp Dependencies -DestDir: "{app}"; Flags: ignoreversion; Source:"{#VCRuntimeDir}\msvcp140.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#VCRuntimeDir}\msvcp140_1.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#VCRuntimeDir}\msvcp140_2.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#VCRuntimeDir}\vcruntime140.dll" - -; GVFS PDB's -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Esent.Collections.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Esent.Interop.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Esent.Isam.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.Common.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.GVFlt.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.Virtualization.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.Platform.Windows.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.pdb" - -; GVFS.Service.UI Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceUIDir}\GVFS.Service.UI.exe" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceUIDir}\GVFS.Service.UI.exe.config" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceUIDir}\GVFS.Service.UI.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceUIDir}\GitVirtualFileSystem.ico" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceUIDir}\System.Runtime.dll" - -; GVFS Files -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\CommandLine.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Esent.Collections.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Esent.Interop.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Esent.Isam.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Microsoft.Data.Sqlite.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\SQLitePCLRaw.batteries_green.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\SQLitePCLRaw.batteries_v2.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\SQLitePCLRaw.core.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\SQLitePCLRaw.provider.e_sqlite3.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\x64\e_sqlite3.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.Common.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.GVFlt.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.Virtualization.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.Platform.Windows.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\Newtonsoft.Json.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\ICSharpCode.SharpZipLib.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.exe.config" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GitVirtualFileSystem.ico" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\GVFS.exe" - -; NuGet support DLLs -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Commands.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Common.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Configuration.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Frameworks.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Packaging.Core.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Packaging.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Protocol.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\NuGet.Versioning.dll" - -; .NET Standard Files -; See https://github.com/dotnet/standard/issues/415 for a discussion on why this are copied -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\netstandard.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\System.Net.Http.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\System.ValueTuple.dll" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#GVFSDir}\System.IO.Compression.dll" - -; GVFS.Service Files and PDB's -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceDir}\GVFS.Service.pdb" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceDir}\GVFS.Service.exe.config" -DestDir: "{app}"; Flags: ignoreversion; Source:"{#ServiceDir}\GVFS.Service.exe"; AfterInstall: InstallGVFSService +DestDir: "{app}"; Flags: ignoreversion recursesubdirs; Source:"{#LayoutDir}\*" +DestDir: "{app}"; Flags: ignoreversion; Source:"{#LayoutDir}\GVFS.Service.exe"; AfterInstall: InstallGVFSService [Dirs] Name: "{app}\ProgramData\{#ServiceName}"; Permissions: users-readexec diff --git a/GVFS/GVFS.Installers/info.bat b/GVFS/GVFS.Installers/info.bat new file mode 100644 index 0000000000..335fc269e7 --- /dev/null +++ b/GVFS/GVFS.Installers/info.bat @@ -0,0 +1,68 @@ +@ECHO OFF +SETLOCAL + +SET SYS_PRJFLT=C:\Windows\System32\drivers\prjflt.sys +SET SYS_PROJFSLIB=C:\Windows\System32\ProjectedFSLib.dll +SET VFS_PROJFSLIB=C:\Program Files\GVFS\ProjectedFSLib.dll +SET VFS_BUND_PRJFLT=C:\Program Files\GVFS\Filter\PrjFlt.sys +SET VFS_BUND_PROJFSLIB=C:\Program Files\GVFS\ProjFS\ProjectedFSLib.dll +SET VFS_EXEC=C:\Program Files\GVFS\GVFS.exe +SET GIT_EXEC=C:\Program Files\Git\cmd\git.exe + +ECHO Checking ProjFS Windows feature... +powershell -Command "Get-WindowsOptionalFeature -Online -FeatureName Client-ProjFS" + +ECHO Checking ProjFS and GVFS services... +ECHO GVFS.Service: +sc query GVFS.Service + +ECHO Test.GVFS.Service: +sc query Test.GVFS.Service + +ECHO prjflt: +sc query prjflt + +ECHO Checking ProjFS files... +IF EXIST "%SYS_PRJFLT%" ( + ECHO [ FOUND ] %SYS_PRJFLT% +) ELSE ( + ECHO [MISSING] %SYS_PRJFLT% +) + +IF EXIST "%SYS_PROJFSLIB%" ( + ECHO [ FOUND ] %SYS_PROJFSLIB% +) ELSE ( + ECHO [MISSING] %SYS_PROJFSLIB% +) + +IF EXIST "%VFS_PROJFSLIB%" ( + ECHO [ FOUND ] %VFS_PROJFSLIB% +) ELSE ( + ECHO [MISSING] %VFS_PROJFSLIB% +) + +IF EXIST "%VFS_BUND_PRJFLT%" ( + ECHO [ FOUND ] %VFS_BUND_PRJFLT% +) ELSE ( + ECHO [MISSING] %VFS_BUND_PRJFLT% +) + +IF EXIST "%VFS_BUND_PROJFSLIB%" ( + ECHO [ FOUND ] %VFS_BUND_PROJFSLIB% +) ELSE ( + ECHO [MISSING] %VFS_BUND_PROJFSLIB% +) + +ECHO. +ECHO Print product versions... +IF EXIST "%VFS_EXEC%" ( + "%VFS_EXEC%" version +) ELSE ( + ECHO GVFS not installed at %VFS_EXEC% +) + +IF EXIST "%GIT_EXEC%" ( + "%GIT_EXEC%" version +) ELSE ( + ECHO Git not installed at %GIT_EXEC% +) diff --git a/GVFS/GVFS.Installers/install.bat b/GVFS/GVFS.Installers/install.bat new file mode 100644 index 0000000000..fb92991537 --- /dev/null +++ b/GVFS/GVFS.Installers/install.bat @@ -0,0 +1,19 @@ +@ECHO OFF +SETLOCAL + +REM Lookup full paths to Git and VFS for Git installers +FOR /F "tokens=* USEBACKQ" %%F IN ( `where /R %~dp0 Git*.exe` ) DO SET GIT_INSTALLER=%%F +FOR /F "tokens=* USEBACKQ" %%F IN ( `where /R %~dp0 SetupGVFS*.exe` ) DO SET GVFS_INSTALLER=%%F + +REM Create new empty directory for logs +SET LOGDIR=%~dp0\logs +IF EXIST %LOGDIR% ( + rmdir /S /Q %LOGDIR% +) +mkdir %LOGDIR% + +ECHO Installing Git for Windows... +%GIT_INSTALLER% /LOG="%LOGDIR%\git.log" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /ALLOWDOWNGRADE=1 + +ECHO Installing VFS for Git... +%GVFS_INSTALLER% /LOG="%LOGDIR%\gvfs.log" /VERYSILENT /SUPPRESSMSGBOXES /NORESTART From 5039078b3c7d4accafc31f8a38f6d63639183f9b Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:03:51 +0100 Subject: [PATCH 24/35] build: merge GVFS.FunctionalTests.Windows tests into main project --- .../GVFS.FunctionalTests.Windows.csproj | 214 ------------------ .../Properties/AssemblyInfo.cs | 24 -- .../TestData/BackgroundGitUpdates/epc.log | Bin 1048576 -> 0 bytes .../TestData/BackgroundGitUpdates/epctmp.log | Bin 1048576 -> 0 bytes .../packages.config | 17 -- .../PersistentDictionary.edb | Bin .../PersistentDictionary.jfm | Bin .../TestData/BackgroundGitUpdates/epc.chk | Bin .../BackgroundGitUpdates/epcres00001.jrs | Bin .../BackgroundGitUpdates/epcres00002.jrs | Bin .../Windows/Tests/JunctionAndSubstTests.cs | 1 - .../Windows/Tests/ServiceTests.cs | 11 - .../Windows/Tests/SharedCacheUpgradeTests.cs | 1 - .../Tests/WindowsDiskLayoutUpgradeTests.cs | 1 - .../Windows/Tests/WindowsFileSystemTests.cs | 1 - .../Windows/Tests/WindowsFolderUsnUpdate.cs | 1 - .../Windows/Tests/WindowsTombstoneTests.cs | 1 - .../Tests/WindowsUpdatePlaceholderTests.cs | 1 - .../Windows/Tools/ESENTDatabase.cs | 0 .../Windows/Tools/RegistryHelper.cs | 0 20 files changed, 273 deletions(-) delete mode 100644 GVFS/GVFS.FunctionalTests.Windows/GVFS.FunctionalTests.Windows.csproj delete mode 100644 GVFS/GVFS.FunctionalTests.Windows/Properties/AssemblyInfo.cs delete mode 100644 GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epc.log delete mode 100644 GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epctmp.log delete mode 100644 GVFS/GVFS.FunctionalTests.Windows/packages.config rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.edb (100%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.jfm (100%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/TestData/BackgroundGitUpdates/epc.chk (100%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/TestData/BackgroundGitUpdates/epcres00001.jrs (100%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/TestData/BackgroundGitUpdates/epcres00002.jrs (100%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/JunctionAndSubstTests.cs (97%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/ServiceTests.cs (87%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/SharedCacheUpgradeTests.cs (97%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs (97%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/WindowsFileSystemTests.cs (97%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/WindowsFolderUsnUpdate.cs (96%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/WindowsTombstoneTests.cs (96%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tests/WindowsUpdatePlaceholderTests.cs (98%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tools/ESENTDatabase.cs (100%) rename GVFS/{GVFS.FunctionalTests.Windows => GVFS.FunctionalTests}/Windows/Tools/RegistryHelper.cs (100%) diff --git a/GVFS/GVFS.FunctionalTests.Windows/GVFS.FunctionalTests.Windows.csproj b/GVFS/GVFS.FunctionalTests.Windows/GVFS.FunctionalTests.Windows.csproj deleted file mode 100644 index 3f69c0d626..0000000000 --- a/GVFS/GVFS.FunctionalTests.Windows/GVFS.FunctionalTests.Windows.csproj +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - {0F0A008E-AB12-40EC-A671-37A541B08C7F} - Exe - Properties - GVFS.FunctionalTests.Windows - GVFS.FunctionalTests.Windows - v4.6.1 - 512 - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - true - - - - - true - DEBUG;TRACE - full - x64 - prompt - - - TRACE - true - pdbonly - x64 - prompt - - - GVFS.FunctionalTests.Program - - - Always - - - - False - ..\..\..\packages\Microsoft.Database.Collections.Generic.1.9.4\lib\net40\Esent.Collections.dll - True - - - False - ..\..\..\packages\ManagedEsent.1.9.4\lib\net40\Esent.Interop.dll - True - - - False - ..\..\..\packages\Microsoft.Database.Isam.1.9.4\lib\net40\Esent.Isam.dll - True - - - ..\..\..\packages\Microsoft.Data.Sqlite.Core.2.2.4\lib\netstandard2.0\Microsoft.Data.Sqlite.dll - - - False - ..\..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll - True - - - False - ..\..\..\packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll - True - - - ..\..\..\packages\NUnit.3.12.0\lib\net45\nunit.framework.dll - - - ..\..\..\packages\NUnitLite.3.12.0\lib\net45\nunitlite.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_green.dll - - - ..\..\..\packages\SQLitePCLRaw.bundle_green.1.1.12\lib\net45\SQLitePCLRaw.batteries_v2.dll - - - ..\..\..\packages\SQLitePCLRaw.core.1.1.12\lib\net45\SQLitePCLRaw.core.dll - - - ..\..\..\packages\SQLitePCLRaw.provider.e_sqlite3.net45.1.1.12\lib\net45\SQLitePCLRaw.provider.e_sqlite3.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - NetCore\%(RecursiveDir)\%(Filename)%(Extension) - - - - - - - - {72701BC3-5DA9-4C7A-BF10-9E98C9FC8EAC} - GVFS.Tests - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - xcopy /Y $(BuildOutputDir)\GVFS.Windows\bin\$(Platform)\$(Configuration)\* $(TargetDir) - xcopy /Y $(BuildOutputDir)\GVFS.Windows\bin\$(Platform)\$(Configuration)\$(Platform)\* $(TargetDir) - xcopy /Y $(BuildOutputDir)\GVFS.Service.Windows\bin\$(Platform)\$(Configuration)\* $(TargetDir) - xcopy /Y $(BuildOutputDir)\GVFS.Mount.Windows\bin\$(Platform)\$(Configuration)\* $(TargetDir) - xcopy /Y $(BuildOutputDir)\GVFS.NativeTests\bin\$(Platform)\$(Configuration)\* $(TargetDir) - xcopy /Y $(BuildOutputDir)\GVFS.Hooks.Windows\bin\$(Platform)\$(Configuration)\* $(TargetDir) - mkdir $(TargetDir)\netcoreapp2.1 - xcopy /Y $(BuildOutputDir)\FastFetch\bin\$(Platform)\$(Configuration)\netcoreapp2.1\* $(TargetDir)\netcoreapp2.1 - xcopy /Y $(BuildOutputDir)\GVFS.FunctionalTests.LockHolder\bin\$(Platform)\$(Configuration)\netcoreapp2.1\* $(TargetDir)\netcoreapp2.1 - - - - - - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.FunctionalTests.Windows/Properties/AssemblyInfo.cs b/GVFS/GVFS.FunctionalTests.Windows/Properties/AssemblyInfo.cs deleted file mode 100644 index 313350adff..0000000000 --- a/GVFS/GVFS.FunctionalTests.Windows/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,24 +0,0 @@ -using NUnit.Framework; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("GVFS.FunctionalTests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("GVFS.FunctionalTests")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("0f0a008e-ab12-40ec-a671-37a541b08c7f")] diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epc.log b/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epc.log deleted file mode 100644 index 0b2ef2f5a3fc9f6613950a6392439ff31045e419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048576 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 z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ T0|pEjFkrxd0RsjM82APT0Pp|- diff --git a/GVFS/GVFS.FunctionalTests.Windows/packages.config b/GVFS/GVFS.FunctionalTests.Windows/packages.config deleted file mode 100644 index 066c75f4e0..0000000000 --- a/GVFS/GVFS.FunctionalTests.Windows/packages.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.edb b/GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.edb similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.edb rename to GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.edb diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.jfm b/GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.jfm similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.jfm rename to GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/PersistentDictionary.jfm diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epc.chk b/GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/epc.chk similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epc.chk rename to GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/epc.chk diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epcres00001.jrs b/GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/epcres00001.jrs similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epcres00001.jrs rename to GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/epcres00001.jrs diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epcres00002.jrs b/GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/epcres00002.jrs similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/TestData/BackgroundGitUpdates/epcres00002.jrs rename to GVFS/GVFS.FunctionalTests/Windows/TestData/BackgroundGitUpdates/epcres00002.jrs diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/JunctionAndSubstTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/JunctionAndSubstTests.cs similarity index 97% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/JunctionAndSubstTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/JunctionAndSubstTests.cs index be3f05e201..617691a005 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/JunctionAndSubstTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/JunctionAndSubstTests.cs @@ -13,7 +13,6 @@ namespace GVFS.FunctionalTests.Windows.Tests { [TestFixture] [Category(Categories.ExtraCoverage)] - [Category(Categories.WindowsOnly)] public class JunctionAndSubstTests : TestsWithEnlistmentPerFixture { private const string SubstDrive = "Q:"; diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/ServiceTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/ServiceTests.cs similarity index 87% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/ServiceTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/ServiceTests.cs index c1353a571a..ddbca48c19 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/ServiceTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/ServiceTests.cs @@ -14,7 +14,6 @@ namespace GVFS.FunctionalTests.Windows.Tests [TestFixture] [NonParallelizable] [Category(Categories.ExtraCoverage)] - [Category(Categories.WindowsOnly)] public class ServiceTests : TestsWithEnlistmentPerFixture { private const string NativeLibPath = @"C:\Program Files\GVFS\ProjectedFSLib.dll"; @@ -31,11 +30,6 @@ public ServiceTests() [TestCase] public void MountAsksServiceToEnsurePrjFltServiceIsHealthy() { - if (!GVFSTestConfig.TestGVFSOnPath) - { - Assert.Ignore("Skipping test, test only enabled when --test-gvfs-on-path is set"); - } - this.Enlistment.UnmountGVFS(); StopPrjFlt(); @@ -53,11 +47,6 @@ public void MountAsksServiceToEnsurePrjFltServiceIsHealthy() [TestCase] public void ServiceStartsPrjFltService() { - if (!GVFSTestConfig.TestGVFSOnPath) - { - Assert.Ignore("Skipping test, test only enabled when --test-gvfs-on-path is set"); - } - this.Enlistment.UnmountGVFS(); StopPrjFlt(); GVFSServiceProcess.StopService(); diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/SharedCacheUpgradeTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/SharedCacheUpgradeTests.cs similarity index 97% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/SharedCacheUpgradeTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/SharedCacheUpgradeTests.cs index 3be0cb77fe..3025b443e3 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/SharedCacheUpgradeTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/SharedCacheUpgradeTests.cs @@ -14,7 +14,6 @@ namespace GVFS.FunctionalTests.Windows.Windows.Tests { [TestFixture] [Category(Categories.ExtraCoverage)] - [Category(Categories.WindowsOnly)] public class SharedCacheUpgradeTests : TestsWithMultiEnlistment { private string localCachePath; diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs similarity index 97% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs index ff355734b4..328652458d 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsDiskLayoutUpgradeTests.cs @@ -13,7 +13,6 @@ namespace GVFS.FunctionalTests.Windows.Tests { [TestFixture] [Category(Categories.ExtraCoverage)] - [Category(Categories.WindowsOnly)] public class WindowsDiskLayoutUpgradeTests : DiskLayoutUpgradeTests { public const int CurrentDiskLayoutMajorVersion = 19; diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsFileSystemTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsFileSystemTests.cs similarity index 97% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsFileSystemTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsFileSystemTests.cs index 74d49a3c69..f6537afaa9 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsFileSystemTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsFileSystemTests.cs @@ -16,7 +16,6 @@ namespace GVFS.FunctionalTests.Windows.Windows.Tests { [TestFixture] - [Category(Categories.WindowsOnly)] public class WindowsFileSystemTests : TestsWithEnlistmentPerFixture { private enum CreationDisposition diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsFolderUsnUpdate.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsFolderUsnUpdate.cs similarity index 96% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsFolderUsnUpdate.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsFolderUsnUpdate.cs index 79f3d62b76..7ddb30aefb 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsFolderUsnUpdate.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsFolderUsnUpdate.cs @@ -10,7 +10,6 @@ namespace GVFS.FunctionalTests.Windows.Windows.Tests { [TestFixture] - [Category(Categories.WindowsOnly)] [Category(Categories.GitCommands)] [Ignore("fsutil requires WSL be enabled. Need to find a way to enable for builds or a different way to get the USN for the folder.")] public class WindowsFolderUsnUpdate : TestsWithEnlistmentPerFixture diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsTombstoneTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsTombstoneTests.cs similarity index 96% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsTombstoneTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsTombstoneTests.cs index a9c1f06360..f2c1b2d47d 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsTombstoneTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsTombstoneTests.cs @@ -10,7 +10,6 @@ namespace GVFS.FunctionalTests.Tests.EnlistmentPerFixture { [TestFixture] - [Category(Categories.WindowsOnly)] [Category(Categories.GitCommands)] public class WindowsTombstoneTests : TestsWithEnlistmentPerFixture { diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsUpdatePlaceholderTests.cs b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsUpdatePlaceholderTests.cs similarity index 98% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsUpdatePlaceholderTests.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsUpdatePlaceholderTests.cs index a9e2f4cf86..acd88a8844 100644 --- a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tests/WindowsUpdatePlaceholderTests.cs +++ b/GVFS/GVFS.FunctionalTests/Windows/Tests/WindowsUpdatePlaceholderTests.cs @@ -13,7 +13,6 @@ namespace GVFS.FunctionalTests.Tests.EnlistmentPerFixture { // WindowsOnly because tests in this class depend on Windows specific file sharing behavior [TestFixture] - [Category(Categories.WindowsOnly)] [Category(Categories.GitCommands)] public class WindowsUpdatePlaceholderTests : TestsWithEnlistmentPerFixture { diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tools/ESENTDatabase.cs b/GVFS/GVFS.FunctionalTests/Windows/Tools/ESENTDatabase.cs similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tools/ESENTDatabase.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tools/ESENTDatabase.cs diff --git a/GVFS/GVFS.FunctionalTests.Windows/Windows/Tools/RegistryHelper.cs b/GVFS/GVFS.FunctionalTests/Windows/Tools/RegistryHelper.cs similarity index 100% rename from GVFS/GVFS.FunctionalTests.Windows/Windows/Tools/RegistryHelper.cs rename to GVFS/GVFS.FunctionalTests/Windows/Tools/RegistryHelper.cs From 0a93076747be4a1728766a6f7e50306cb811777e Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:04:18 +0100 Subject: [PATCH 25/35] build: migrate GVFS.FunctionalTests project file --- .../GVFS.FunctionalTests.csproj | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/GVFS/GVFS.FunctionalTests/GVFS.FunctionalTests.csproj b/GVFS/GVFS.FunctionalTests/GVFS.FunctionalTests.csproj index 06ee65c93c..eb0a937ccb 100644 --- a/GVFS/GVFS.FunctionalTests/GVFS.FunctionalTests.csproj +++ b/GVFS/GVFS.FunctionalTests/GVFS.FunctionalTests.csproj @@ -1,54 +1,37 @@ - - - - Exe - netcoreapp2.1 - x64 - - true - true - win-x64;osx-x64 - + - GVFS.FunctionalTests - GVFS.FunctionalTests - - - $(GVFSVersion) - - - $(GVFSVersion) + net461 + Exe + + + - - - all - + + + false + Content + PreserveNewest + + + false + + + PreserveNewest + + + PreserveNewest + - - - - - - - - - - - - - - - From 29456745c8883762f54016dc6f68aebbb5da2fa6 Mon Sep 17 00:00:00 2001 From: Matthew John Cheetham Date: Mon, 28 Jun 2021 14:06:50 +0100 Subject: [PATCH 26/35] build: drop Mac/POSIX tests and drop WinOnly category --- GVFS/GVFS.FunctionalTests/Categories.cs | 26 +-- .../FileSystemRunners/BashRunner.cs | 10 +- GVFS/GVFS.FunctionalTests/Program.cs | 87 ++++------ .../BasicFileSystemTests.cs | 51 ------ .../Tests/EnlistmentPerFixture/CloneTests.cs | 60 ++----- .../EnlistmentPerFixture/DehydrateTests.cs | 14 +- .../EnlistmentPerFixture/GVFSLockTests.cs | 3 +- .../GVFSUpgradeReminderTests.cs | 1 - .../EnlistmentPerFixture/GitFilesTests.cs | 4 - .../GitMoveRenameTests.cs | 1 - .../Tests/EnlistmentPerFixture/HealthTests.cs | 2 +- .../Tests/EnlistmentPerFixture/MountTests.cs | 14 +- .../MoveRenameFolderTests.cs | 160 ------------------ .../PrefetchVerbWithoutSharedCacheTests.cs | 3 - .../Tests/EnlistmentPerFixture/SparseTests.cs | 55 ------ .../EnlistmentPerFixture/SymbolicLinkTests.cs | 8 +- .../WorkingDirectoryTests.cs | 65 +------ .../CaseOnlyFolderRenameTests.cs | 76 --------- .../MacDiskLayoutUpgradeTests.cs | 45 ----- .../ModifiedPathsTests.cs | 4 - .../Tests/FastFetchTests.cs | 15 +- .../Tests/GitCommands/CheckoutTests.cs | 5 +- .../GitCommands/CreatePlaceholderTests.cs | 1 - .../Tests/GitCommands/GitCommandsTests.cs | 23 --- .../Tests/GitCommands/StatusTests.cs | 10 +- .../MultiEnlistmentTests/ConfigVerbTests.cs | 3 - .../MultiEnlistmentTests/SharedCacheTests.cs | 1 - .../GVFS.FunctionalTests/Tools/GVFSHelpers.cs | 28 +-- .../Tools/GVFSServiceProcess.cs | 37 +--- GVFS/GVFS.FunctionalTests/Tools/GitHelpers.cs | 31 +--- 30 files changed, 84 insertions(+), 759 deletions(-) delete mode 100644 GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/CaseOnlyFolderRenameTests.cs delete mode 100644 GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/MacDiskLayoutUpgradeTests.cs diff --git a/GVFS/GVFS.FunctionalTests/Categories.cs b/GVFS/GVFS.FunctionalTests/Categories.cs index 613938c57c..7a55e9b687 100644 --- a/GVFS/GVFS.FunctionalTests/Categories.cs +++ b/GVFS/GVFS.FunctionalTests/Categories.cs @@ -5,30 +5,6 @@ public static class Categories public const string ExtraCoverage = "ExtraCoverage"; public const string FastFetch = "FastFetch"; public const string GitCommands = "GitCommands"; - - // Linux uses a separate device mount for its repository, and so is unable to rename(2) inodes - // in or out of the repository filesystem; attempts to do so fail with errno set to EXDEV. - // Therefore, tests which move files or directories across the repository boundary should - // be flagged with this category so they will be excluded on Linux. - public const string RepositoryMountsSameFileSystem = "RepositoryMountsSameFileSystem"; - - public const string WindowsOnly = "WindowsOnly"; - public const string MacOnly = "MacOnly"; - public const string POSIXOnly = "POSIXOnly"; - - public static class MacTODO - { - // Tests that require #360 (detecting/handling new empty folders) - public const string NeedsNewFolderCreateNotification = "NeedsNewFolderCreateNotification"; - - // Tests that require the Status Cache to be built - public const string NeedsStatusCache = "NeedsStatusCache"; - - // Tests that require Config to be built - public const string NeedsGVFSConfig = "NeedsConfig"; - - // Tests requires code updates so that we lock the file instead of looking for a .lock file - public const string TestNeedsToLockFile = "TestNeedsToLockFile"; - } + public const string NeedsReactionInCI = "NeedsReactionInCI"; } } diff --git a/GVFS/GVFS.FunctionalTests/FileSystemRunners/BashRunner.cs b/GVFS/GVFS.FunctionalTests/FileSystemRunners/BashRunner.cs index d3456d0da7..e0d75f013f 100644 --- a/GVFS/GVFS.FunctionalTests/FileSystemRunners/BashRunner.cs +++ b/GVFS/GVFS.FunctionalTests/FileSystemRunners/BashRunner.cs @@ -299,15 +299,7 @@ public override long FileSize(string path) { string bashPath = this.ConvertWinPathToBashPath(path); - string statCommand = null; - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - statCommand = string.Format("-c \"stat -f \"%z\" '{0}'\"", bashPath); - } - else - { - statCommand = string.Format("-c \"stat --format \"%s\" '{0}'\"", bashPath); - } + string statCommand = string.Format("-c \"stat --format \"%s\" '{0}'\"", bashPath); return long.Parse(this.RunProcess(statCommand)); } diff --git a/GVFS/GVFS.FunctionalTests/Program.cs b/GVFS/GVFS.FunctionalTests/Program.cs index 07aa380151..276a7d7011 100644 --- a/GVFS/GVFS.FunctionalTests/Program.cs +++ b/GVFS/GVFS.FunctionalTests/Program.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Runtime.InteropServices; namespace GVFS.FunctionalTests { @@ -14,6 +13,11 @@ public class Program public static void Main(string[] args) { Properties.Settings.Default.Initialize(); + Console.WriteLine("Settings.Default.CurrentDirectory: {0}", Settings.Default.CurrentDirectory); + Console.WriteLine("Settings.Default.PathToGit: {0}", Settings.Default.PathToGit); + Console.WriteLine("Settings.Default.PathToGVFS: {0}", Settings.Default.PathToGVFS); + Console.WriteLine("Settings.Default.PathToGVFSService: {0}", Settings.Default.PathToGVFSService); + NUnitRunner runner = new NUnitRunner(args); runner.AddGlobalSetupIfNeeded("GVFS.FunctionalTests.GlobalSetup"); @@ -23,12 +27,6 @@ public static void Main(string[] args) GVFSTestConfig.NoSharedCache = true; } - if (runner.HasCustomArg("--test-gvfs-on-path")) - { - Console.WriteLine("Running tests against GVFS on path"); - GVFSTestConfig.TestGVFSOnPath = true; - } - if (runner.HasCustomArg("--replace-inbox-projfs")) { Console.WriteLine("Tests will replace inbox ProjFS"); @@ -51,15 +49,7 @@ public static void Main(string[] args) } GVFSTestConfig.GitRepoTestsValidateWorkTree = modes.ToArray(); - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - GVFSTestConfig.FileSystemRunners = FileSystemRunners.FileSystemRunner.AllWindowsRunners; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - GVFSTestConfig.FileSystemRunners = FileSystemRunners.FileSystemRunner.AllMacRunners; - } + GVFSTestConfig.FileSystemRunners = FileSystemRunners.FileSystemRunner.AllWindowsRunners; } else { @@ -89,34 +79,17 @@ public static void Main(string[] args) excludeCategories.Add(Categories.ExtraCoverage); } - GVFSTestConfig.FileSystemRunners = FileSystemRunners.FileSystemRunner.DefaultRunners; - } - - if (runner.HasCustomArg("--windows-only")) - { - includeCategories.Add(Categories.WindowsOnly); - - // RunTests unions all includeCategories. Remove ExtraCoverage to - // ensure that we only run tests flagged as WindowsOnly - includeCategories.Remove(Categories.ExtraCoverage); - } + // If we're running in CI exclude tests that are currently + // flakey or broken when run in a CI environment. + if (runner.HasCustomArg("--ci")) + { + excludeCategories.Add(Categories.NeedsReactionInCI); + } - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - excludeCategories.Add(Categories.MacTODO.NeedsNewFolderCreateNotification); - excludeCategories.Add(Categories.MacTODO.NeedsGVFSConfig); - excludeCategories.Add(Categories.MacTODO.NeedsStatusCache); - excludeCategories.Add(Categories.MacTODO.TestNeedsToLockFile); - excludeCategories.Add(Categories.WindowsOnly); - } - else - { - // Windows excludes. - excludeCategories.Add(Categories.MacOnly); - excludeCategories.Add(Categories.POSIXOnly); + GVFSTestConfig.FileSystemRunners = FileSystemRunners.FileSystemRunner.DefaultRunners; } - GVFSTestConfig.DotGVFSRoot = RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? ".vfsforgit" : ".gvfs"; + GVFSTestConfig.DotGVFSRoot = ".gvfs"; GVFSTestConfig.RepoToClone = runner.GetCustomArgWithParam("--repo-to-clone") @@ -134,26 +107,26 @@ public static void Main(string[] args) private static void RunBeforeAnyTests() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if (GVFSTestConfig.ReplaceInboxProjFS) { - if (GVFSTestConfig.ReplaceInboxProjFS) - { - ProjFSFilterInstaller.ReplaceInboxProjFS(); - } + ProjFSFilterInstaller.ReplaceInboxProjFS(); + } - GVFSServiceProcess.InstallService(); + GVFSServiceProcess.InstallService(); - string statusCacheVersionTokenPath = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles, Environment.SpecialFolderOption.Create), - "GVFS", - "ProgramData", - "GVFS.Service", - "EnableGitStatusCacheToken.dat"); + string serviceProgramDataDir = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles, Environment.SpecialFolderOption.Create), + "GVFS", + "ProgramData", + "GVFS.Service"); - if (!File.Exists(statusCacheVersionTokenPath)) - { - File.WriteAllText(statusCacheVersionTokenPath, string.Empty); - } + string statusCacheVersionTokenPath = Path.Combine( + serviceProgramDataDir, "EnableGitStatusCacheToken.dat"); + + if (!File.Exists(statusCacheVersionTokenPath)) + { + Directory.CreateDirectory(serviceProgramDataDir); + File.WriteAllText(statusCacheVersionTokenPath, string.Empty); } } } diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/BasicFileSystemTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/BasicFileSystemTests.cs index 57f491c9fc..1a8925ed1b 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/BasicFileSystemTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/BasicFileSystemTests.cs @@ -81,7 +81,6 @@ public void FilesAreBufferedAndCanBeFlushed(FileSystemRunner fileSystem, string } [TestCaseSource(typeof(FileRunnersAndFolders), nameof(FileRunnersAndFolders.Folders))] - [Category(Categories.WindowsOnly)] public void NewFileAttributesAreUpdated(string parentFolder) { string filename = Path.Combine(parentFolder, "FileAttributesAreUpdated"); @@ -109,7 +108,6 @@ public void NewFileAttributesAreUpdated(string parentFolder) } [TestCaseSource(typeof(FileRunnersAndFolders), nameof(FileRunnersAndFolders.Folders))] - [Category(Categories.WindowsOnly)] public void NewFolderAttributesAreUpdated(string parentFolder) { string folderName = Path.Combine(parentFolder, "FolderAttributesAreUpdated"); @@ -136,7 +134,6 @@ public void NewFolderAttributesAreUpdated(string parentFolder) } [TestCase] - [Category(Categories.WindowsOnly)] public void ExpandedFileAttributesAreUpdated() { FileSystemRunner fileSystem = FileSystemRunner.DefaultRunner; @@ -182,7 +179,6 @@ public void ExpandedFileAttributesAreUpdated() } [TestCase] - [Category(Categories.WindowsOnly)] public void UnhydratedFolderAttributesAreUpdated() { FileSystemRunner fileSystem = FileSystemRunner.DefaultRunner; @@ -509,10 +505,7 @@ public void CanDeleteHydratedFilesWhileTheyAreOpenForWrite() virtualPath.ShouldNotExistOnDisk(fileSystem); } - // WindowsOnly because file timestamps on Mac are set to the time at which - // placeholders are written [TestCase] - [Category(Categories.WindowsOnly)] public void ProjectedBlobFileTimesMatchHead() { // TODO: 467539 - Update all runners to support getting create/modify/access times @@ -536,7 +529,6 @@ public void ProjectedBlobFileTimesMatchHead() } [TestCase] - [Category(Categories.WindowsOnly)] public void ProjectedBlobFolderTimesMatchHead() { // TODO: 467539 - Update all runners to support getting create/modify/access times @@ -814,23 +806,6 @@ public void DeleteIndexFileFails(FileSystemRunner fileSystem) indexFilePath.ShouldBeAFile(fileSystem); } - // On some platforms, a pre-rename event may be delivered prior to a - // file rename rather than a pre-delete event, so we check this - // separately from the DeleteIndexFileFails() test case - // This test is failing on Windows because the CmdRunner succeeds in moving the index file - [TestCaseSource(typeof(FileSystemRunner), nameof(FileSystemRunner.Runners))] - [Category(Categories.POSIXOnly)] - public void MoveIndexFileFails(FileSystemRunner fileSystem) - { - string indexFilePath = this.Enlistment.GetVirtualPathTo(Path.Combine(".git", "index")); - string indexTargetFilePath = this.Enlistment.GetVirtualPathTo(Path.Combine(".git", "index_target")); - indexFilePath.ShouldBeAFile(fileSystem); - indexTargetFilePath.ShouldNotExistOnDisk(fileSystem); - fileSystem.ReplaceFile_AccessShouldBeDenied(indexFilePath, indexTargetFilePath); - indexFilePath.ShouldBeAFile(fileSystem); - indexTargetFilePath.ShouldNotExistOnDisk(fileSystem); - } - [TestCaseSource(typeof(FileRunnersAndFolders), nameof(FileRunnersAndFolders.Runners))] public void MoveVirtualNTFSFolderIntoInvalidFolder(FileSystemRunner fileSystem, string parentFolder) { @@ -880,7 +855,6 @@ public void MoveVirtualNTFSFolderIntoInvalidFolder(FileSystemRunner fileSystem, } [TestCaseSource(typeof(FileRunnersAndFolders), nameof(FileRunnersAndFolders.Folders))] - [Category(Categories.WindowsOnly)] public void CreateFileInheritsParentDirectoryAttributes(string parentFolder) { string parentDirectoryPath = this.Enlistment.GetVirtualPathTo(Path.Combine(parentFolder, "CreateFileInheritsParentDirectoryAttributes")); @@ -897,7 +871,6 @@ public void CreateFileInheritsParentDirectoryAttributes(string parentFolder) } [TestCaseSource(typeof(FileRunnersAndFolders), nameof(FileRunnersAndFolders.Folders))] - [Category(Categories.WindowsOnly)] public void CreateDirectoryInheritsParentDirectoryAttributes(string parentFolder) { string parentDirectoryPath = this.Enlistment.GetVirtualPathTo(Path.Combine(parentFolder, "CreateDirectoryInheritsParentDirectoryAttributes")); @@ -913,30 +886,6 @@ public void CreateDirectoryInheritsParentDirectoryAttributes(string parentFolder FileSystemRunner.DefaultRunner.DeleteDirectory(parentDirectoryPath); } - [TestCase] - [Category(Categories.POSIXOnly)] - public void RunPythonExecutable() - { - GitProcess.Invoke(this.Enlistment.RepoRoot, "checkout FunctionalTests/PythonExecutable"); - - // Found an issue on Mac where running a python executable that is a placeholder, fails - // The fix was to always hydrate executables (no placeholders for this mode) - // To repro this issue in the C# framework the python executable must be run via a wrapper - string pythonDirectory = Path.Combine(this.Enlistment.RepoRoot, "Test_Executable"); - string pythonExecutable = Path.Combine(pythonDirectory, "python_wrapper.sh"); - - ProcessStartInfo startInfo = new ProcessStartInfo(pythonExecutable); - startInfo.RedirectStandardOutput = true; - startInfo.RedirectStandardError = true; - startInfo.WorkingDirectory = pythonDirectory; - - ProcessResult result = ProcessHelper.Run(startInfo); - result.ExitCode.ShouldEqual(0); - result.Output.ShouldContain("3.14"); - - GitProcess.Invoke(this.Enlistment.RepoRoot, "checkout " + this.Enlistment.Commitish); - } - private void VerifyExistenceAfterDeleteWhileOpen(string filePath, FileSystemRunner fileSystem) { if (this.SupportsPosixDelete()) diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/CloneTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/CloneTests.cs index d67ce5d56a..b554cfb591 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/CloneTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/CloneTests.cs @@ -3,7 +3,7 @@ using GVFS.FunctionalTests.Tools; using GVFS.Tests.Should; using NUnit.Framework; -using System; +using System; using System.Diagnostics; using System.IO; @@ -46,62 +46,30 @@ public void CloneWithLocalCachePathWithinSrc() result.Output.ShouldContain("'--local-cache-path' cannot be inside the src folder"); } - [TestCase] - [Category(Categories.POSIXOnly)] - public void CloneWithDefaultLocalCacheLocation() - { - FileSystemRunner fileSystem = FileSystemRunner.DefaultRunner; - string homeDirectory = Environment.GetEnvironmentVariable("HOME"); - homeDirectory.ShouldBeADirectory(fileSystem); - - string newEnlistmentRoot = GVFSFunctionalTestEnlistment.GetUniqueEnlistmentRoot(); - - ProcessStartInfo processInfo = new ProcessStartInfo(GVFSTestConfig.PathToGVFS); - processInfo.Arguments = $"clone {Properties.Settings.Default.RepoToClone} {newEnlistmentRoot} --no-mount --no-prefetch"; - processInfo.WindowStyle = ProcessWindowStyle.Hidden; - processInfo.CreateNoWindow = true; - processInfo.UseShellExecute = false; - processInfo.RedirectStandardOutput = true; - - ProcessResult result = ProcessHelper.Run(processInfo); - result.ExitCode.ShouldEqual(0, result.Errors); - - string dotGVFSRoot = Path.Combine(newEnlistmentRoot, GVFSTestConfig.DotGVFSRoot); - dotGVFSRoot.ShouldBeADirectory(fileSystem); - string localCacheRoot = GVFSHelpers.GetPersistedLocalCacheRoot(dotGVFSRoot); - string gitObjectsRoot = GVFSHelpers.GetPersistedGitObjectsRoot(dotGVFSRoot); - - string defaultGVFSCacheRoot = Path.Combine(homeDirectory, ".gvfsCache"); - localCacheRoot.StartsWith(defaultGVFSCacheRoot, StringComparison.Ordinal).ShouldBeTrue($"Local cache root did not default to using {homeDirectory}"); - gitObjectsRoot.StartsWith(defaultGVFSCacheRoot, StringComparison.Ordinal).ShouldBeTrue($"Git objects root did not default to using {homeDirectory}"); - - RepositoryHelpers.DeleteTestDirectory(newEnlistmentRoot); - } - [TestCase] public void CloneToPathWithSpaces() { GVFSFunctionalTestEnlistment enlistment = GVFSFunctionalTestEnlistment.CloneAndMountEnlistmentWithSpacesInPath(GVFSTestConfig.PathToGVFS); enlistment.UnmountAndDeleteAll(); - } - + } + [TestCase] public void CloneCreatesCorrectFilesInRoot() { GVFSFunctionalTestEnlistment enlistment = GVFSFunctionalTestEnlistment.CloneAndMount(GVFSTestConfig.PathToGVFS); - try - { - string[] files = Directory.GetFiles(enlistment.EnlistmentRoot); - files.Length.ShouldEqual(1); - files.ShouldContain(x => Path.GetFileName(x).Equals("git.cmd", StringComparison.Ordinal)); - string[] directories = Directory.GetDirectories(enlistment.EnlistmentRoot); - directories.Length.ShouldEqual(2); - directories.ShouldContain(x => Path.GetFileName(x).Equals(GVFSTestConfig.DotGVFSRoot, StringComparison.Ordinal)); - directories.ShouldContain(x => Path.GetFileName(x).Equals("src", StringComparison.Ordinal)); + try + { + string[] files = Directory.GetFiles(enlistment.EnlistmentRoot); + files.Length.ShouldEqual(1); + files.ShouldContain(x => Path.GetFileName(x).Equals("git.cmd", StringComparison.Ordinal)); + string[] directories = Directory.GetDirectories(enlistment.EnlistmentRoot); + directories.Length.ShouldEqual(2); + directories.ShouldContain(x => Path.GetFileName(x).Equals(GVFSTestConfig.DotGVFSRoot, StringComparison.Ordinal)); + directories.ShouldContain(x => Path.GetFileName(x).Equals("src", StringComparison.Ordinal)); } finally - { - enlistment.UnmountAndDeleteAll(); + { + enlistment.UnmountAndDeleteAll(); } } diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/DehydrateTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/DehydrateTests.cs index ca9a4fe4d9..f896825fed 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/DehydrateTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/DehydrateTests.cs @@ -36,16 +36,7 @@ public void TearDown() string backupFolder = Path.Combine(this.Enlistment.EnlistmentRoot, "dehydrate_backup"); if (this.fileSystem.DirectoryExists(backupFolder)) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - // Mac gets permission denied when using the System.IO DeleteDirectory - BashRunner runner = new BashRunner(); - runner.DeleteDirectory(backupFolder); - } - else - { - this.fileSystem.DeleteDirectory(backupFolder); - } + this.fileSystem.DeleteDirectory(backupFolder); } if (!this.Enlistment.IsMounted()) @@ -271,7 +262,6 @@ public void FolderDehydrateFolderThatWasDeleted() } [TestCase] - [Category(Categories.WindowsOnly)] public void FolderDehydrateFolderThatIsLocked() { const string folderToDehydrate = "GVFS"; @@ -420,7 +410,7 @@ public void FolderDehydrateCannotDehydrateDotGitFolder() this.DehydrateShouldSucceed(new[] { $"Cannot dehydrate folder '{TestConstants.DotGit.Info.Root}': invalid folder path." }, confirm: true, noStatus: false, foldersToDehydrate: TestConstants.DotGit.Info.Root); } - [TestCase] + [TestCase] public void FolderDehydratePreviouslyDeletedFolders() { string folderToDehydrate = "TrailingSlashTests"; diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSLockTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSLockTests.cs index af3fe49ec6..7046231e5d 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSLockTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSLockTests.cs @@ -1,5 +1,5 @@ using GVFS.FunctionalTests.FileSystemRunners; -using GVFS.FunctionalTests.Properties; +using GVFS.FunctionalTests.Properties; using GVFS.FunctionalTests.Tools; using GVFS.Tests.Should; using NUnit.Framework; @@ -64,7 +64,6 @@ public void GitCheckoutFailsOutsideLock() } [TestCase] - [Category(Categories.RepositoryMountsSameFileSystem)] public void LockPreventsRenameFromOutsideRootOnTopOfIndex() { this.OverwritingIndexShouldFail(Path.Combine(this.Enlistment.EnlistmentRoot, "LockPreventsRenameFromOutsideRootOnTopOfIndex.txt")); diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSUpgradeReminderTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSUpgradeReminderTests.cs index 909c402ac1..1801571128 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSUpgradeReminderTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GVFSUpgradeReminderTests.cs @@ -13,7 +13,6 @@ namespace GVFS.FunctionalTests.Tests.EnlistmentPerFixture [TestFixture] [NonParallelizable] [Category(Categories.ExtraCoverage)] - [Category(Categories.WindowsOnly)] public class UpgradeReminderTests : TestsWithEnlistmentPerFixture { private const string HighestAvailableVersionFileName = "HighestAvailableVersion"; diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitFilesTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitFilesTests.cs index 634e8e380b..50fc1e1ecc 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitFilesTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitFilesTests.cs @@ -332,9 +332,7 @@ public void OverwrittenFileAddedToModifiedPathsAndSkipWorktreeBitCleared() this.VerifyWorktreeBit(fileToOverwriteEntry, LsFilesStatus.Cached); } - // WindowsOnly because Mac does not support SupersedeFile [TestCase, Order(15)] - [Category(Categories.WindowsOnly)] public void SupersededFileAddedToModifiedPathsAndSkipWorktreeBitCleared() { string fileToSupersedeEntry = "GVFlt_FileOperationTest/WriteAndVerify.txt"; @@ -396,7 +394,6 @@ public void FileMovedFromInsideRepoToOutside() } [TestCase, Order(18)] - [Category(Categories.RepositoryMountsSameFileSystem)] public void HardlinkFromOutsideRepoToInside() { string fileName = "OutsideRepoToInside_FileForHardlink.txt"; @@ -416,7 +413,6 @@ public void HardlinkFromOutsideRepoToInside() } [TestCase, Order(19)] - [Category(Categories.RepositoryMountsSameFileSystem)] public void HardlinkFromInsideRepoToOutside() { string fileName = "Readme.md"; diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitMoveRenameTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitMoveRenameTests.cs index 6e2a21fb9d..b106876ec0 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitMoveRenameTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/GitMoveRenameTests.cs @@ -221,7 +221,6 @@ public void GitStatusAfterRenameFileOutOfRepo() } [TestCase, Order(11)] - [Category(Categories.RepositoryMountsSameFileSystem)] public void GitStatusAfterRenameFolderIntoRepo() { string folderName = "GitStatusAfterRenameFolderIntoRepo"; diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/HealthTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/HealthTests.cs index 605e2dcb17..d16cda74cc 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/HealthTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/HealthTests.cs @@ -11,7 +11,7 @@ namespace GVFS.FunctionalTests.Tests.EnlistmentPerFixture { - [TestFixture, Category(Categories.WindowsOnly)] + [TestFixture] public class HealthTests : TestsWithEnlistmentPerFixture { [TestCase, Order(0)] diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MountTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MountTests.cs index 72271b0b2f..40e9016ce4 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MountTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MountTests.cs @@ -30,16 +30,8 @@ public MountTests() { this.fileSystem = new SystemIORunner(); - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - this.fileDeletedBackgroundOperationCode = 16; - this.directoryDeletedBackgroundOperationCode = 17; - } - else - { - this.fileDeletedBackgroundOperationCode = 3; - this.directoryDeletedBackgroundOperationCode = 11; - } + this.fileDeletedBackgroundOperationCode = 3; + this.directoryDeletedBackgroundOperationCode = 11; } [TestCaseSource(typeof(MountSubfolders), MountSubfolders.MountFolders)] @@ -97,7 +89,6 @@ public void MountSetsCoreHooksPath() } [TestCase] - [Category(Categories.WindowsOnly)] // Only Windows uses GitHooksLoader.exe and merges hooks public void MountMergesLocalPrePostHooksConfig() { // Create some dummy pre/post command hooks @@ -379,7 +370,6 @@ public void MountFailsUpgradingFromInvalidUpgradePath(string mountSubfolder) // Ported from ProjFS's BugRegressionTest [TestCase] - [Category(Categories.WindowsOnly)] public void ProjFS_CMDHangNoneActiveInstance() { this.Enlistment.UnmountGVFS(); diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MoveRenameFolderTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MoveRenameFolderTests.cs index 78316ef815..48656333cb 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MoveRenameFolderTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/MoveRenameFolderTests.cs @@ -40,9 +40,7 @@ public MoveRenameFolderTests(FileSystemRunner fileSystem) this.fileSystem = fileSystem; } - // WindowsOnly because renames of partial folders are blocked only on Windows [TestCase] - [Category(Categories.WindowsOnly)] public void RenameFolderShouldFail() { string testFileName = "RenameFolderShouldFail.cpp"; @@ -59,70 +57,6 @@ public void RenameFolderShouldFail() this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, testFileName)).ShouldBeAFile(this.fileSystem).WithContents(TestFileContents); } - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void ChangeUnhydratedFolderName() - { - string testFileName = "ChangeUnhydratedFolderName.cpp"; - string oldFolderName = Path.Combine("Test_EPF_MoveRenameFolderTests", "ChangeUnhydratedFolderName", "source"); - string newFolderName = Path.Combine("Test_EPF_MoveRenameFolderTests", "ChangeUnhydratedFolderName", "source_renamed"); - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldNotExistOnDisk(this.fileSystem); - - this.fileSystem.MoveDirectory(this.Enlistment.GetVirtualPathTo(oldFolderName), this.Enlistment.GetVirtualPathTo(newFolderName)); - - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldBeADirectory(this.fileSystem); - this.Enlistment.GetVirtualPathTo(oldFolderName).ShouldNotExistOnDisk(this.fileSystem); - - this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, testFileName)).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(newFolderName, testFileName)).ShouldBeAFile(this.fileSystem).WithContents(TestFileContents); - } - - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void MoveUnhydratedFolderToNewFolder() - { - string testFileName = "MoveUnhydratedFolderToVirtualNTFSFolder.cpp"; - string oldFolderName = Path.Combine("Test_EPF_MoveRenameFolderTests", "MoveUnhydratedFolderToVirtualNTFSFolder"); - - string newFolderName = "NewPerFixtureParent"; - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldNotExistOnDisk(this.fileSystem); - this.fileSystem.CreateDirectory(this.Enlistment.GetVirtualPathTo(newFolderName)); - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldBeADirectory(this.fileSystem); - - string movedFolderPath = Path.Combine(newFolderName, "EnlistmentPerFixture"); - this.fileSystem.MoveDirectory(this.Enlistment.GetVirtualPathTo(oldFolderName), this.Enlistment.GetVirtualPathTo(movedFolderPath)); - - this.Enlistment.GetVirtualPathTo(movedFolderPath).ShouldBeADirectory(this.fileSystem); - this.Enlistment.GetVirtualPathTo(oldFolderName).ShouldNotExistOnDisk(this.fileSystem); - - this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, testFileName)).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(movedFolderPath, testFileName)).ShouldBeAFile(this.fileSystem).WithContents(TestFileContents); - } - - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void MoveUnhydratedFolderToFullFolderInDotGitFolder() - { - string testFileName = "MoveUnhydratedFolderToFullFolderInDotGitFolder.cpp"; - string oldFolderName = Path.Combine("Test_EPF_MoveRenameFolderTests", "MoveUnhydratedFolderToFullFolderInDotGitFolder"); - - string newFolderName = Path.Combine(".git", "NewPerFixtureParent"); - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldNotExistOnDisk(this.fileSystem); - this.fileSystem.CreateDirectory(this.Enlistment.GetVirtualPathTo(newFolderName)); - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldBeADirectory(this.fileSystem); - - string movedFolderPath = Path.Combine(newFolderName, "Should"); - this.fileSystem.MoveDirectory(this.Enlistment.GetVirtualPathTo(oldFolderName), this.Enlistment.GetVirtualPathTo(movedFolderPath)); - - this.Enlistment.GetVirtualPathTo(movedFolderPath).ShouldBeADirectory(this.fileSystem); - this.Enlistment.GetVirtualPathTo(oldFolderName).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, testFileName)).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(movedFolderPath, testFileName)).ShouldBeAFile(this.fileSystem).WithContents(TestFileContents); - } - [TestCase] public void MoveFullFolderToFullFolderInDotGitFolder() { @@ -150,99 +84,5 @@ public void MoveFullFolderToFullFolderInDotGitFolder() oldFolderPath.ShouldNotExistOnDisk(this.fileSystem); Path.Combine(movedFolderPath, testFileName).ShouldBeAFile(this.fileSystem).WithContents(fileContents); } - - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void MoveAndRenameUnhydratedFolderToNewFolder() - { - string testFileName = "MoveAndRenameUnhydratedFolderToNewFolder.cpp"; - string oldFolderName = Path.Combine("Test_EPF_MoveRenameFolderTests", "MoveAndRenameUnhydratedFolderToNewFolder"); - - string newFolderName = "NewPerTestCaseParent"; - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldNotExistOnDisk(this.fileSystem); - this.fileSystem.CreateDirectory(this.Enlistment.GetVirtualPathTo(newFolderName)); - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldBeADirectory(this.fileSystem); - - string movedFolderPath = Path.Combine(newFolderName, "MoveAndRenameUnhydratedFolderToNewFolder_renamed"); - this.fileSystem.MoveDirectory(this.Enlistment.GetVirtualPathTo(oldFolderName), this.Enlistment.GetVirtualPathTo(movedFolderPath)); - - this.Enlistment.GetVirtualPathTo(movedFolderPath).ShouldBeADirectory(this.fileSystem); - this.Enlistment.GetVirtualPathTo(oldFolderName).ShouldNotExistOnDisk(this.fileSystem); - - this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, testFileName)).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(movedFolderPath, testFileName)).ShouldBeAFile(this.fileSystem).WithContents(TestFileContents); - } - - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void MoveFolderWithUnhydratedAndFullContents() - { - string testFileName = "MoveFolderWithUnhydratedAndFullContents.cpp"; - string oldFolderName = Path.Combine("Test_EPF_MoveRenameFolderTests", "MoveFolderWithUnhydratedAndFullContents"); - - string newFile = "TestFile.txt"; - string newFileContents = "Contents of TestFile.txt"; - this.fileSystem.WriteAllText(this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, newFile)), newFileContents); - - string newFolderName = "New_MoveFolderWithUnhydratedAndFullContents"; - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldNotExistOnDisk(this.fileSystem); - this.fileSystem.CreateDirectory(this.Enlistment.GetVirtualPathTo(newFolderName)); - this.Enlistment.GetVirtualPathTo(newFolderName).ShouldBeADirectory(this.fileSystem); - - string movedFolderPath = Path.Combine(newFolderName, "MoveFolderWithUnhydratedAndFullContents_renamed"); - this.fileSystem.MoveDirectory(this.Enlistment.GetVirtualPathTo(oldFolderName), this.Enlistment.GetVirtualPathTo(movedFolderPath)); - - this.Enlistment.GetVirtualPathTo(movedFolderPath).ShouldBeADirectory(this.fileSystem); - this.Enlistment.GetVirtualPathTo(oldFolderName).ShouldNotExistOnDisk(this.fileSystem); - - // Test file should have been moved - this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, testFileName)).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(movedFolderPath, testFileName)).ShouldBeAFile(this.fileSystem).WithContents(TestFileContents); - - // New file should have been moved - this.Enlistment.GetVirtualPathTo(Path.Combine(oldFolderName, newFile)).ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(Path.Combine(movedFolderPath, newFile)).ShouldBeAFile(this.fileSystem).WithContents(newFileContents); - } - - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void MoveFolderWithUnexpandedChildFolders() - { - string oldFolderPath = this.Enlistment.GetVirtualPathTo("Test_EPF_MoveRenameFileTests"); - string newFolderName = "Test_EPF_MoveRenameFileTests_Renamed"; - string newFolderPath = this.Enlistment.GetVirtualPathTo(newFolderName); - this.fileSystem.MoveDirectory(oldFolderPath, newFolderPath); - oldFolderPath.ShouldNotExistOnDisk(this.fileSystem); - - newFolderPath.ShouldBeADirectory(this.fileSystem); - this.Enlistment.GetVirtualPathTo(newFolderName, "ChangeNestedUnhydratedFileNameCase", "Program.cs") - .ShouldBeAFile(this.fileSystem) - .WithContents(MoveRenameFileTests.TestFileContents); - - this.Enlistment.GetVirtualPathTo(newFolderName, "ChangeUnhydratedFileName", "Program.cs") - .ShouldBeAFile(this.fileSystem) - .WithContents(MoveRenameFileTests.TestFileContents); - - this.Enlistment.GetVirtualPathTo(newFolderName, "MoveUnhydratedFileToDotGitFolder", "Program.cs") - .ShouldBeAFile(this.fileSystem) - .WithContents(MoveRenameFileTests.TestFileContents); - - // Test moving a folder with a very deep unhydrated child tree - oldFolderPath = this.Enlistment.GetVirtualPathTo("Test_EPF_WorkingDirectoryTests"); - - // But expand the folder we will be renaming (so that only the children have not been expanded) - oldFolderPath.ShouldBeADirectory(this.fileSystem).WithDirectories().ShouldContain(dir => dir.Name.Equals("1")); - - newFolderName = "Test_EPF_WorkingDirectoryTests_Renamed"; - newFolderPath = this.Enlistment.GetVirtualPathTo(newFolderName); - this.fileSystem.MoveDirectory(oldFolderPath, newFolderPath); - oldFolderPath.ShouldNotExistOnDisk(this.fileSystem); - this.Enlistment.GetVirtualPathTo(newFolderName, "1", "2", "3", "4", "ReadDeepProjectedFile.cpp") - .ShouldBeAFile(this.fileSystem) - .WithContents(WorkingDirectoryTests.TestFileContents); - } } } diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbWithoutSharedCacheTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbWithoutSharedCacheTests.cs index d94fe70376..68dbb3dd65 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbWithoutSharedCacheTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/PrefetchVerbWithoutSharedCacheTests.cs @@ -9,11 +9,8 @@ namespace GVFS.FunctionalTests.Tests.EnlistmentPerFixture { - // TODO(#1219): Before these tests can be enabled PostFetchJobShouldComplete needs - // to work on Mac (where post-fetch.lock is not removed from disk) [TestFixture] [Category(Categories.ExtraCoverage)] - [Category(Categories.MacTODO.TestNeedsToLockFile)] public class PrefetchVerbWithoutSharedCacheTests : TestsWithEnlistmentPerFixture { private const string PrefetchPackPrefix = "prefetch"; diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SparseTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SparseTests.cs index 84c5de3b70..30a8056bd8 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SparseTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SparseTests.cs @@ -143,7 +143,6 @@ public void AddingSubfolderShouldKeepParentRecursive() } [TestCase, Order(6)] - [Category(Categories.WindowsOnly)] public void CreatingFolderShouldAddToSparseListAndStartProjecting() { this.gvfsProcess.AddSparseFolders(this.mainSparseFolder); @@ -166,33 +165,6 @@ public void CreatingFolderShouldAddToSparseListAndStartProjecting() projectedFile.ShouldBeAFile(this.fileSystem); } - [TestCase, Order(7)] - [Category(Categories.MacOnly)] - public void CreateFolderThenFileShouldAddToSparseListAndStartProjecting() - { - this.gvfsProcess.AddSparseFolders(this.mainSparseFolder); - this.ValidateFoldersInSparseList(this.mainSparseFolder); - - string newFolderPath = Path.Combine(this.Enlistment.RepoRoot, "GVFS", "GVFS.Common"); - newFolderPath.ShouldNotExistOnDisk(this.fileSystem); - Directory.CreateDirectory(newFolderPath); - string newFilePath = Path.Combine(newFolderPath, "test.txt"); - File.WriteAllText(newFilePath, "New file content"); - newFolderPath.ShouldBeADirectory(this.fileSystem); - newFilePath.ShouldBeAFile(this.fileSystem); - string[] fileSystemEntries = Directory.GetFileSystemEntries(newFolderPath); - fileSystemEntries.Length.ShouldEqual(33); - this.ValidateFoldersInSparseList(this.mainSparseFolder, Path.Combine("GVFS", "GVFS.Common")); - - string projectedFolder = Path.Combine(newFolderPath, "Git"); - projectedFolder.ShouldBeADirectory(this.fileSystem); - fileSystemEntries = Directory.GetFileSystemEntries(projectedFolder); - fileSystemEntries.Length.ShouldEqual(13); - - string projectedFile = Path.Combine(newFolderPath, "ReturnCode.cs"); - projectedFile.ShouldBeAFile(this.fileSystem); - } - [TestCase, Order(7)] public void ReadFileThenChangingSparseFoldersShouldRemoveFileAndFolder() { @@ -300,33 +272,6 @@ public void CreateNewFileAndCommitThenRemoveSparseFolderShouldKeepFileAndFolder( fileToCreate.ShouldBeAFile(this.fileSystem); } - [TestCase, Order(13)] - [Category(Categories.MacOnly)] - public void CreateFolderAndFileThatAreExcluded() - { - this.gvfsProcess.AddSparseFolders(this.mainSparseFolder); - this.ValidateFoldersInSparseList(this.mainSparseFolder); - - // Create a file that should already be in the projection but excluded - string newFolderPath = Path.Combine(this.Enlistment.RepoRoot, "GVFS", "GVFS.Mount"); - newFolderPath.ShouldNotExistOnDisk(this.fileSystem); - Directory.CreateDirectory(newFolderPath); - string newFilePath = Path.Combine(newFolderPath, "Program.cs"); - File.WriteAllText(newFilePath, "New file content"); - newFolderPath.ShouldBeADirectory(this.fileSystem); - newFilePath.ShouldBeAFile(this.fileSystem); - string[] fileSystemEntries = Directory.GetFileSystemEntries(newFolderPath); - fileSystemEntries.Length.ShouldEqual(7); - - string projectedFolder = Path.Combine(newFolderPath, "Properties"); - projectedFolder.ShouldBeADirectory(this.fileSystem); - fileSystemEntries = Directory.GetFileSystemEntries(projectedFolder); - fileSystemEntries.Length.ShouldEqual(1); - - string projectedFile = Path.Combine(newFolderPath, "MountVerb.cs"); - projectedFile.ShouldBeAFile(this.fileSystem); - } - [TestCase, Order(14)] public void ModifiedFileAndCommitThenChangingSparseFoldersWithPrune() { diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SymbolicLinkTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SymbolicLinkTests.cs index 5f7a83e04b..9e6140e21e 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SymbolicLinkTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/SymbolicLinkTests.cs @@ -1,14 +1,14 @@ using System.IO; using GVFS.FunctionalTests.FileSystemRunners; -using GVFS.FunctionalTests.Should; +using GVFS.FunctionalTests.Should; using GVFS.FunctionalTests.Tools; -using GVFS.Tests.Should; +using GVFS.Tests.Should; using NUnit.Framework; namespace GVFS.FunctionalTests.Tests.EnlistmentPerFixture { - // POSIXOnly until issue #297 (add SymLink support for Windows) is complete - [Category(Categories.POSIXOnly)] + // Ignored until issue #297 (add SymLink support for Windows) is complete + [Ignore("Symbolic link support not yet implemented (see issue #297)")] [TestFixture] public class SymbolicLinkTests : TestsWithEnlistmentPerFixture { diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/WorkingDirectoryTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/WorkingDirectoryTests.cs index f08e13ab48..683b02a2c4 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/WorkingDirectoryTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerFixture/WorkingDirectoryTests.cs @@ -398,7 +398,6 @@ public void FolderPlaceHolderHasVersionInfo() [TestCase, Order(13)] [Category(Categories.GitCommands)] - [Category(Categories.MacTODO.NeedsNewFolderCreateNotification)] public void FolderContentsProjectedAfterFolderCreateAndCheckout() { string folderName = "GVFlt_MultiThreadTest"; @@ -548,29 +547,15 @@ public void TruncatedObjectRedownloaded() objectPath.ShouldBeAFile(this.fileSystem); new FileInfo(objectPath).Length.ShouldEqual(objectLength - 16); - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - // Mac can't correct corrupt objects, but it should detect them and add to ModifiedPaths.dat - this.Enlistment.GetVirtualPathTo("Test_EPF_WorkingDirectoryTests", "TruncatedObjectRedownloaded.txt").ShouldBeAFile(this.fileSystem); - - GVFSHelpers.ModifiedPathsShouldContain(this.Enlistment, this.fileSystem, modifedFile); - GitHelpers.CheckGitCommandAgainstGVFSRepo( - this.Enlistment.RepoRoot, - "status", - $"modified: {modifedFile}"); - } - else - { - // Windows should correct a corrupt obect - // Read the original path and verify its contents are correct - this.Enlistment.GetVirtualPathTo("Test_EPF_WorkingDirectoryTests", "TruncatedObjectRedownloaded.txt").ShouldBeAFile(this.fileSystem).WithContents(testFileContents); + // Windows should correct a corrupt obect + // Read the original path and verify its contents are correct + this.Enlistment.GetVirtualPathTo("Test_EPF_WorkingDirectoryTests", "TruncatedObjectRedownloaded.txt").ShouldBeAFile(this.fileSystem).WithContents(testFileContents); - // Confirm there's a new item in the corrupt objects folder - corruptObjectFolderPath.ShouldBeADirectory(this.fileSystem).WithItems().Count().ShouldEqual(initialCorruptObjectCount + 1); + // Confirm there's a new item in the corrupt objects folder + corruptObjectFolderPath.ShouldBeADirectory(this.fileSystem).WithItems().Count().ShouldEqual(initialCorruptObjectCount + 1); - // File should not be in ModifiedPaths.dat - GVFSHelpers.ModifiedPathsShouldNotContain(this.Enlistment, this.fileSystem, "Test_EPF_WorkingDirectoryTests/TruncatedObjectRedownloaded.txt"); - } + // File should not be in ModifiedPaths.dat + GVFSHelpers.ModifiedPathsShouldNotContain(this.Enlistment, this.fileSystem, "Test_EPF_WorkingDirectoryTests/TruncatedObjectRedownloaded.txt"); } [TestCase, Order(18)] @@ -625,44 +610,12 @@ private void FolderEnumerationShouldHaveSingleEntry(string folderVirtualPath, st private void EnumerateAndReadShouldNotChangeEnumerationOrder(string folderRelativePath) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - NativeTests.EnumerateAndReadDoesNotChangeEnumerationOrder(folderRelativePath).ShouldEqual(true); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - string[] entries = Directory.GetFileSystemEntries(folderRelativePath); - foreach (string entry in entries) - { - File.ReadAllText(entry); - } - - string[] postReadEntries = Directory.GetFileSystemEntries(folderRelativePath); - Enumerable.SequenceEqual(entries, postReadEntries) - .ShouldBeTrue($"Entries are not the same after reading. Orignial list:\n{string.Join(",", entries)}\n\nAfter read:\n{string.Join(",", postReadEntries)}"); - } - else - { - Assert.Fail("Unsupported platform"); - } + NativeTests.EnumerateAndReadDoesNotChangeEnumerationOrder(folderRelativePath).ShouldEqual(true); } private bool PlaceholderHasVersionInfo(string relativePath, int version, string sha) { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - return NativeTests.PlaceHolderHasVersionInfo(relativePath, version, sha); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - // TODO(#1360): Add a version of PlaceHolderHasVersionInfo that works on Mac - return true; - } - else - { - Assert.Fail("Unsupported platform"); - return false; - } + return NativeTests.PlaceHolderHasVersionInfo(relativePath, version, sha); } private class NativeTests diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/CaseOnlyFolderRenameTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/CaseOnlyFolderRenameTests.cs deleted file mode 100644 index 3c4a9fc0c5..0000000000 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/CaseOnlyFolderRenameTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using GVFS.FunctionalTests.FileSystemRunners; -using GVFS.FunctionalTests.Should; -using GVFS.FunctionalTests.Tools; -using GVFS.Tests.Should; -using NUnit.Framework; -using System.IO; - -namespace GVFS.FunctionalTests.Tests.EnlistmentPerTestCase -{ - [TestFixture] - public class CaseOnlyFolderRenameTests : TestsWithEnlistmentPerTestCase - { - private FileSystemRunner fileSystem; - - public CaseOnlyFolderRenameTests() - { - this.fileSystem = new BashRunner(); - } - - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void CaseRenameFoldersAndRemountAndRenameAgain() - { - // Projected folder without a physical folder - string parentFolderName = "GVFS"; - string oldGVFSSubFolderName = "GVFS"; - string oldGVFSSubFolderPath = Path.Combine(parentFolderName, oldGVFSSubFolderName); - string newGVFSSubFolderName = "gvfs"; - string newGVFSSubFolderPath = Path.Combine(parentFolderName, newGVFSSubFolderName); - - this.Enlistment.GetVirtualPathTo(oldGVFSSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(oldGVFSSubFolderName); - - this.fileSystem.MoveFile(this.Enlistment.GetVirtualPathTo(oldGVFSSubFolderPath), this.Enlistment.GetVirtualPathTo(newGVFSSubFolderPath)); - - this.Enlistment.GetVirtualPathTo(newGVFSSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(newGVFSSubFolderName); - - // Projected folder with a physical folder - string oldTestsSubFolderName = "GVFS.FunctionalTests"; - string oldTestsSubFolderPath = Path.Combine(parentFolderName, oldTestsSubFolderName); - string newTestsSubFolderName = "gvfs.functionaltests"; - string newTestsSubFolderPath = Path.Combine(parentFolderName, newTestsSubFolderName); - - string fileToAdd = "NewFile.txt"; - string fileToAddContent = "This is new file text."; - string fileToAddPath = this.Enlistment.GetVirtualPathTo(Path.Combine(oldTestsSubFolderPath, fileToAdd)); - this.fileSystem.WriteAllText(fileToAddPath, fileToAddContent); - - this.Enlistment.GetVirtualPathTo(oldTestsSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(oldTestsSubFolderName); - - this.fileSystem.MoveFile(this.Enlistment.GetVirtualPathTo(oldTestsSubFolderPath), this.Enlistment.GetVirtualPathTo(newTestsSubFolderPath)); - - this.Enlistment.GetVirtualPathTo(newTestsSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(newTestsSubFolderName); - - // Remount - this.Enlistment.UnmountGVFS(); - this.Enlistment.MountGVFS(); - - this.Enlistment.GetVirtualPathTo(newGVFSSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(newGVFSSubFolderName); - this.Enlistment.GetVirtualPathTo(newTestsSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(newTestsSubFolderName); - this.Enlistment.GetVirtualPathTo(Path.Combine(newTestsSubFolderPath, fileToAdd)).ShouldBeAFile(this.fileSystem).WithContents().ShouldEqual(fileToAddContent); - - // Rename each folder again - string finalGVFSSubFolderName = "gvFS"; - string finalGVFSSubFolderPath = Path.Combine(parentFolderName, finalGVFSSubFolderName); - this.fileSystem.MoveFile(this.Enlistment.GetVirtualPathTo(newGVFSSubFolderPath), this.Enlistment.GetVirtualPathTo(finalGVFSSubFolderPath)); - this.Enlistment.GetVirtualPathTo(finalGVFSSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(finalGVFSSubFolderName); - - string finalTestsSubFolderName = "gvfs.FunctionalTESTS"; - string finalTestsSubFolderPath = Path.Combine(parentFolderName, finalTestsSubFolderName); - this.fileSystem.MoveFile(this.Enlistment.GetVirtualPathTo(newTestsSubFolderPath), this.Enlistment.GetVirtualPathTo(finalTestsSubFolderPath)); - this.Enlistment.GetVirtualPathTo(finalTestsSubFolderPath).ShouldBeADirectory(this.fileSystem).WithCaseMatchingName(finalTestsSubFolderName); - this.Enlistment.GetVirtualPathTo(Path.Combine(finalTestsSubFolderPath, fileToAdd)).ShouldBeAFile(this.fileSystem).WithContents().ShouldEqual(fileToAddContent); - } - } -} diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/MacDiskLayoutUpgradeTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/MacDiskLayoutUpgradeTests.cs deleted file mode 100644 index b8face6690..0000000000 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/MacDiskLayoutUpgradeTests.cs +++ /dev/null @@ -1,45 +0,0 @@ -using GVFS.FunctionalTests.Should; -using GVFS.FunctionalTests.Tools; -using GVFS.Tests.Should; -using NUnit.Framework; -using System; -using System.IO; - -namespace GVFS.FunctionalTests.Tests.EnlistmentPerTestCase -{ - [TestFixture] - [Category(Categories.ExtraCoverage)] - [Category(Categories.MacOnly)] - public class MacDiskLayoutUpgradeTests : DiskLayoutUpgradeTests - { - public const int CurrentDiskLayoutMajorVersion = 19; - public const int CurrentDiskLayoutMinorVersion = 0; - - public override int GetCurrentDiskLayoutMajorVersion() => CurrentDiskLayoutMajorVersion; - public override int GetCurrentDiskLayoutMinorVersion() => CurrentDiskLayoutMinorVersion; - - [TestCase] - public void MountUpgradesPlaceholderListDatabaseToSQLite() - { - this.Enlistment.UnmountGVFS(); - - this.fileSystem.DeleteFile(Path.Combine(this.Enlistment.DotGVFSRoot, TestConstants.Databases.VFSForGit)); - this.WriteOldPlaceholderListDatabase(); - - GVFSHelpers.SaveDiskLayoutVersion(this.Enlistment.DotGVFSRoot, "18", "0"); - - this.Enlistment.MountGVFS(); - this.Enlistment.UnmountGVFS(); - - // Validate the placeholders are in the SQLite placeholder database now - string placeholderDatabasePath = Path.Combine(this.Enlistment.DotGVFSRoot, TestConstants.Databases.VFSForGit); - placeholderDatabasePath.ShouldBeAFile(this.fileSystem); - string[] lines = GVFSHelpers.GetAllSQLitePlaceholdersAsString(placeholderDatabasePath).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); - lines.Length.ShouldEqual(10); - this.PlaceholderDatabaseShouldIncludeCommonLines(lines); - lines.ShouldContain(x => x == this.PartialFolderPlaceholderString("GVFS", "GVFS.Tests", "Properties")); - - this.ValidatePersistedVersionMatchesCurrentVersion(); - } - } -} diff --git a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/ModifiedPathsTests.cs b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/ModifiedPathsTests.cs index c07e601060..3754cfaaab 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/ModifiedPathsTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/EnlistmentPerTestCase/ModifiedPathsTests.cs @@ -61,7 +61,6 @@ public void DeletedTempFolderDeletesFilesFromModifiedFiles(FileSystemRunner file } [TestCaseSource(typeof(FileSystemRunner), nameof(FileSystemRunner.Runners))] - [Category(Categories.MacTODO.NeedsNewFolderCreateNotification)] public void ModifiedPathsFromChangesInsideRepoSavedAfterRemount(FileSystemRunner fileSystem) { string[] expectedModifiedFilesContentsAfterRemount = @@ -134,8 +133,6 @@ public void ModifiedPathsFromChangesInsideRepoSavedAfterRemount(FileSystemRunner } [TestCaseSource(typeof(FileSystemRunner), nameof(FileSystemRunner.Runners))] - [Category(Categories.RepositoryMountsSameFileSystem)] - [Category(Categories.MacTODO.NeedsNewFolderCreateNotification)] public void ModifiedPathsFromRenamingOutsideRepoSavedAfterRemount(FileSystemRunner fileSystem) { string[] expectedModifiedFilesContentsAfterRemount = @@ -221,7 +218,6 @@ public void ModifiedPathsCorrectAfterHardLinkingInsideRepo(FileSystemRunner file } [TestCaseSource(typeof(FileSystemRunner), nameof(FileSystemRunner.Runners))] - [Category(Categories.RepositoryMountsSameFileSystem)] public void ModifiedPathsCorrectAfterHardLinkingOutsideRepo(FileSystemRunner fileSystem) { string[] expectedModifiedFilesContentsAfterHardlinks = diff --git a/GVFS/GVFS.FunctionalTests/Tests/FastFetchTests.cs b/GVFS/GVFS.FunctionalTests/Tests/FastFetchTests.cs index faaa7edb38..2a09893276 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/FastFetchTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/FastFetchTests.cs @@ -9,7 +9,6 @@ using System.Diagnostics; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using System.Text.RegularExpressions; namespace GVFS.FunctionalTests.Tests @@ -492,21 +491,13 @@ private ProcessResult RunFastFetch(string args) { args = args + " --verbose"; - string fastfetch; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - fastfetch = Path.Combine(Settings.Default.CurrentDirectory, "netcoreapp2.1", "FastFetch.dll"); - } - else - { - fastfetch = Path.Combine(Settings.Default.CurrentDirectory, "FastFetch.dll"); - } + string fastfetch = Path.Combine(Settings.Default.CurrentDirectory, "FastFetch.exe"); File.Exists(fastfetch).ShouldBeTrue($"{fastfetch} did not exist."); Console.WriteLine($"Using {fastfetch}"); - ProcessStartInfo processInfo = new ProcessStartInfo("dotnet"); - processInfo.Arguments = $"{fastfetch} {args}"; + ProcessStartInfo processInfo = new ProcessStartInfo(fastfetch); + processInfo.Arguments = args; processInfo.WorkingDirectory = this.fastFetchRepoRoot; processInfo.UseShellExecute = false; processInfo.RedirectStandardOutput = true; diff --git a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CheckoutTests.cs b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CheckoutTests.cs index f7862cf42b..e6de487b72 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CheckoutTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CheckoutTests.cs @@ -644,9 +644,7 @@ public void CheckoutBranchWhileOutsideToolDoesNotAllowDeleteOfOpenRepoMetadata() } } - // WindowsOnly because the test depends on Windows specific file sharing behavior [TestCase] - [Category(Categories.WindowsOnly)] public void CheckoutBranchWhileOutsideToolHasExclusiveReadHandleOnDatabasesFolder() { this.ControlGitRepo.Fetch(GitRepoTests.ConflictSourceBranch); @@ -871,7 +869,6 @@ public void CheckoutEditCheckoutWithoutFolderThenCheckoutWithMultipleFiles() } [TestCase] - [Category(Categories.MacTODO.NeedsNewFolderCreateNotification)] public void CreateAFolderThenCheckoutBranchWithFolder() { this.ControlGitRepo.Fetch("FunctionalTests/20201014_Checkout8"); @@ -1004,6 +1001,6 @@ private static extern SafeFileHandle CreateFile( [In] IntPtr securityAttributes, [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, [MarshalAs(UnmanagedType.U4)] NativeFileAttributes flagsAndAttributes, - [In] IntPtr templateFile); + [In] IntPtr templateFile); } } diff --git a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CreatePlaceholderTests.cs b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CreatePlaceholderTests.cs index 8116824efe..ccf231e246 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CreatePlaceholderTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/CreatePlaceholderTests.cs @@ -39,7 +39,6 @@ public void AllowsPlaceholderCreationWhileGitCommandIsRunning(string commandToRu [TestCase("reset --stdin")] [TestCase("send-pack --stdin URL")] [TestCase("update-index --stdin")] - [Category(Categories.WindowsOnly)] // Mac never blocks placeholder creation public void BlocksPlaceholderCreationWhileGitCommandIsRunning(string commandToRun) { this.CheckPlaceholderCreation(commandToRun, shouldAllow: false); diff --git a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/GitCommandsTests.cs b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/GitCommandsTests.cs index e952373ee3..28f7523534 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/GitCommandsTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/GitCommandsTests.cs @@ -416,7 +416,6 @@ public void CaseOnlyRenameFileAndChangeBranches() } [TestCase] - [Category(Categories.RepositoryMountsSameFileSystem)] public void MoveFileFromOutsideRepoToInsideRepoAndAdd() { string testFileContents = "0123456789"; @@ -450,7 +449,6 @@ public void MoveFileFromOutsideRepoToInsideRepoAndAdd() } [TestCase] - [Category(Categories.RepositoryMountsSameFileSystem)] public void MoveFolderFromOutsideRepoToInsideRepoAndAdd() { string testFileContents = "0123456789"; @@ -488,7 +486,6 @@ public void MoveFolderFromOutsideRepoToInsideRepoAndAdd() } [TestCase] - [Category(Categories.RepositoryMountsSameFileSystem)] public void MoveFileFromInsideRepoToOutsideRepoAndCommit() { string newBranchName = "tests/functional/MoveFileFromInsideRepoToOutsideRepoAndCommit"; @@ -554,26 +551,6 @@ public void RenameFileCommitChangesSwitchBranchSwitchBackTest() this.CommitChangesSwitchBranchSwitchBack(fileSystemAction: this.RenameFile); } - // MacOnly because renames of partial folders are blocked on Windows - [TestCase] - [Category(Categories.MacOnly)] - public void MoveFolderCommitChangesSwitchBranchSwitchBackTest() - { - this.CommitChangesSwitchBranchSwitchBack(fileSystemAction: this.MoveFolder); - } - - // Mac and Linux only because Windows does not support file mode - [TestCase] - [Category(Categories.POSIXOnly)] - public void UpdateFileModeOnly() - { - const string TestFileName = "test-file-mode"; - this.CreateFile("#!/bin/bash\n", TestFileName); - this.ChangeMode(TestFileName, Convert.ToUInt16("755", 8)); - this.ValidateGitCommand($"add {TestFileName}"); - this.ValidateGitCommand($"ls-files --stage {TestFileName}"); - } - [TestCase] public void AddFileCommitThenDeleteAndCommit() { diff --git a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/StatusTests.cs b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/StatusTests.cs index bc5c776c25..65edacc6df 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/GitCommands/StatusTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/GitCommands/StatusTests.cs @@ -1,6 +1,6 @@ using GVFS.FunctionalTests.FileSystemRunners; using GVFS.FunctionalTests.Properties; -using GVFS.FunctionalTests.Should; +using GVFS.FunctionalTests.Should; using GVFS.FunctionalTests.Tools; using GVFS.Tests.Should; using NUnit.Framework; @@ -75,12 +75,11 @@ public void AppendFileUsingBash() // We check the contents after status, to ensure this check didn't cause the hydration string appendedContent = string.Concat("Commit2LockToPreventUpdate \r\n", content); - virtualFile.ShouldBeAFile(this.FileSystem).WithContents(appendedContent); - controlFile.ShouldBeAFile(this.FileSystem).WithContents(appendedContent); + virtualFile.ShouldBeAFile(this.FileSystem).WithContents(appendedContent); + controlFile.ShouldBeAFile(this.FileSystem).WithContents(appendedContent); } [TestCase] - [Category(Categories.MacTODO.NeedsStatusCache)] public void ModifyingAndDeletingRepositoryExcludeFileInvalidatesCache() { string repositoryExcludeFile = Path.Combine(".git", "info", "exclude"); @@ -106,7 +105,6 @@ public void ModifyingAndDeletingRepositoryExcludeFileInvalidatesCache() } [TestCase] - [Category(Categories.MacTODO.NeedsStatusCache)] public void NewRepositoryExcludeFileInvalidatesCache() { string repositoryExcludeFileRelativePath = Path.Combine(".git", "info", "exclude"); @@ -127,7 +125,6 @@ public void NewRepositoryExcludeFileInvalidatesCache() } [TestCase] - [Category(Categories.MacTODO.NeedsStatusCache)] public void ModifyingHeadSymbolicRefInvalidatesCache() { this.ValidateGitCommand("status"); @@ -143,7 +140,6 @@ public void ModifyingHeadSymbolicRefInvalidatesCache() } [TestCase] - [Category(Categories.MacTODO.NeedsStatusCache)] public void ModifyingHeadRefInvalidatesCache() { this.ValidateGitCommand("status"); diff --git a/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/ConfigVerbTests.cs b/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/ConfigVerbTests.cs index 9881020af8..b7c09600f0 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/ConfigVerbTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/ConfigVerbTests.cs @@ -3,14 +3,11 @@ using NUnit.Framework; using System; using System.Collections.Generic; -using System.Diagnostics; -using System.IO; namespace GVFS.FunctionalTests.Tests.MultiEnlistmentTests { [TestFixture] [Category(Categories.ExtraCoverage)] - [Category(Categories.MacTODO.NeedsGVFSConfig)] public class ConfigVerbTests : TestsWithMultiEnlistment { private const string IntegerSettingKey = "functionalTest_Integer"; diff --git a/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/SharedCacheTests.cs b/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/SharedCacheTests.cs index 5111b415e7..7d343d8b24 100644 --- a/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/SharedCacheTests.cs +++ b/GVFS/GVFS.FunctionalTests/Tests/MultiEnlistmentTests/SharedCacheTests.cs @@ -80,7 +80,6 @@ public void RepairFixesCorruptBlobSizesDatabase() } [TestCase] - [Category(Categories.MacTODO.TestNeedsToLockFile)] public void CloneCleansUpStaleMetadataLock() { GVFSFunctionalTestEnlistment enlistment1 = this.CloneAndMountEnlistment(); diff --git a/GVFS/GVFS.FunctionalTests/Tools/GVFSHelpers.cs b/GVFS/GVFS.FunctionalTests/Tools/GVFSHelpers.cs index 391579a9a4..d079e36684 100644 --- a/GVFS/GVFS.FunctionalTests/Tools/GVFSHelpers.cs +++ b/GVFS/GVFS.FunctionalTests/Tools/GVFSHelpers.cs @@ -206,44 +206,20 @@ public static string GetInternalParameter(string maintenanceJob = "null", string public static void RegisterForOfflineIO() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - uint result = PrjFSRegisterForOfflineIO(); - result.ShouldEqual(PrjFSResultSuccess, $"{nameof(RegisterForOfflineIO)} failed (result = {result})"); - } } public static void UnregisterForOfflineIO() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - uint result = PrjFSUnregisterForOfflineIO(); - result.ShouldEqual(PrjFSResultSuccess, $"{nameof(RegisterForOfflineIO)} failed (result = {result})"); - } } public static int GetCurrentDiskLayoutMajorVersion() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - return MacCurrentDiskLayoutMajorVersion; - } - else - { - return WindowsCurrentDiskLayoutMajorVersion; - } + return WindowsCurrentDiskLayoutMajorVersion; } public static int GetCurrentDiskLayoutMinimumMajorVersion() { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - return MacCurrentDiskLayoutMinimumMajorVersion; - } - else - { - return WindowsCurrentDiskLayoutMinimumMajorVersion; - } + return WindowsCurrentDiskLayoutMinimumMajorVersion; } private static string GetModifiedPathsContents(GVFSFunctionalTestEnlistment enlistment, FileSystemRunner fileSystem) diff --git a/GVFS/GVFS.FunctionalTests/Tools/GVFSServiceProcess.cs b/GVFS/GVFS.FunctionalTests/Tools/GVFSServiceProcess.cs index 5417a9337f..d27925e864 100644 --- a/GVFS/GVFS.FunctionalTests/Tools/GVFSServiceProcess.cs +++ b/GVFS/GVFS.FunctionalTests/Tools/GVFSServiceProcess.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.IO; using System.Linq; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using System.ServiceProcess; using System.Threading; @@ -17,20 +17,6 @@ public static string TestServiceName { get { - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - // Service name is used in the lookup of GVFS.Service communication pipes - // by clients for IPC. Custom pipe names can be specified as command line - // args to the Service during its startup. On the Mac, GVFS.Service started - // for testing is the same instance as the one that is installed by the - // Mac installer. Also it is not as easy as in Windows to pass command line - // args (that are specific to testing) to GVFS.Service (Service on Mac is a - // Launch agent and needs its args to be specified in its launchd.plist - // file). So on Mac - during tests GVFS.Service is started without any - // customized pipe name for testing. - return "GVFS.Service"; - } - return "Test.GVFS.Service"; } } @@ -127,25 +113,8 @@ private static ProcessResult RunScCommand(string command, string parameters) private static string GetPathToService() { - if (GVFSTestConfig.TestGVFSOnPath) - { - ProcessResult result = ProcessHelper.Run("where", Properties.Settings.Default.PathToGVFSService); - result.ExitCode.ShouldEqual(0, $"{nameof(GetPathToService)}: where returned {result.ExitCode} when looking for {Properties.Settings.Default.PathToGVFSService}"); - - string firstPath = - string.IsNullOrWhiteSpace(result.Output) - ? null - : result.Output.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); - - firstPath.ShouldNotBeNull($"{nameof(GetPathToService)}: Failed to find {Properties.Settings.Default.PathToGVFSService}"); - return firstPath; - } - else - { - return Path.Combine( - Properties.Settings.Default.CurrentDirectory, - Properties.Settings.Default.PathToGVFSService); - } + File.Exists(Properties.Settings.Default.PathToGVFSService).ShouldBeTrue("Failed to locate GVFS.Service.exe"); + return Properties.Settings.Default.PathToGVFSService; } } } diff --git a/GVFS/GVFS.FunctionalTests/Tools/GitHelpers.cs b/GVFS/GVFS.FunctionalTests/Tools/GitHelpers.cs index 092d0011ae..8aacac84a7 100644 --- a/GVFS/GVFS.FunctionalTests/Tools/GitHelpers.cs +++ b/GVFS/GVFS.FunctionalTests/Tools/GitHelpers.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Linq; -using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; @@ -19,7 +18,7 @@ public static class GitHelpers /// GVFS.FunctionalTests.LockHolder program. ///