Repository: reef
Updated Branches:
  refs/heads/master 47568d78c -> 41e4be255


[REEF-1822] Create a script to analyze CLR Compliance

This adds a script that analyzes the build artifacts for compliance of the
various CLR runtimes

JIRA:
  [REEF-1822](https://issues.apache.org/jira/browse/REEF-1822)

Pull Request:
  This closes #1325


Project: http://git-wip-us.apache.org/repos/asf/reef/repo
Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/41e4be25
Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/41e4be25
Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/41e4be25

Branch: refs/heads/master
Commit: 41e4be2550b5a4954cf38641210ba524d2cbbd17
Parents: 47568d7
Author: roganc <[email protected]>
Authored: Tue Jul 11 12:25:07 2017 -0700
Committer: Markus Weimer <[email protected]>
Committed: Tue Jul 11 21:30:26 2017 -0700

----------------------------------------------------------------------
 appveyor.yml                    |   3 +
 bin/AnalyzeClrCompatibility.ps1 | 134 +++++++++++++++++++++++++++++++++++
 2 files changed, 137 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/reef/blob/41e4be25/appveyor.yml
----------------------------------------------------------------------
diff --git a/appveyor.yml b/appveyor.yml
index 52cc158..ae56572 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -39,6 +39,9 @@ build_script:
 test_script:
   - cmd: msbuild .\lang\cs\TestRunner.proj /p:Configuration="Debug" 
/p:Platform="x64"
 
+after_build:
+  - ps: .\bin\AnalyzeClrCompatibility.ps1
+
 notifications:
   - provider: Email
     on_build_success: false

http://git-wip-us.apache.org/repos/asf/reef/blob/41e4be25/bin/AnalyzeClrCompatibility.ps1
----------------------------------------------------------------------
diff --git a/bin/AnalyzeClrCompatibility.ps1 b/bin/AnalyzeClrCompatibility.ps1
new file mode 100644
index 0000000..99b1e4e
--- /dev/null
+++ b/bin/AnalyzeClrCompatibility.ps1
@@ -0,0 +1,134 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# Input / Output Settings
+$baseDir = ".\lang\cs\"
+$buildDir="${baseDir}\bin\x64\Debug"
+$outputDirectory = "${buildDir}\ClrCompatibility\"
+$incompatibilityFile = "${outputDirectory}\incompatibilities.txt"
+
+# Compatibility Analyzer settings
+$libraryDotNetTargets = @(".NET Standard, Version=2.0")
+$exeDotNetTargets = @(".NET Core + Platform Extensions, Version=1.0", ".NET 
Framework, Version=4.5.1")
+
+# Set up the directory structure
+If (Test-Path $outputDirectory)
+{
+       Remove-Item $outputDirectory -Force -Recurse
+}
+New-Item -ItemType Directory -Force -Path $outputDirectory | Out-Null
+
+# Install the API Portability Analyzer if it is not present
+$portabilityAnalyzer = "${buildDir}\ApiPort\ApiPort.exe"
+If (!(Test-Path $portabilityAnalyzer))
+{
+       Write-Output "Downloading the DotNet API Portability Analyzer"
+       
$analyzerUrl="https://github.com/Microsoft/dotnet-apiport/releases/download/v1.4.0.alpha.00175/ApiPort.zip";
+       $analyzerZip="${buildDir}\analyzer.zip"
+       Invoke-WebRequest $analyzerUrl -OutFile $analyzerZip
+       Add-Type -assembly "System.IO.Compression.Filesystem";
+       # Now, external libraries don't understand relative paths
+       [IO.Compression.Zipfile]::ExtractToDirectory((Get-Item 
$analyzerZip).FullName,(Get-Item $buildDir).FullName);
+       Remove-Item $analyzerZip
+}
+
+# Set up the counter
+[int] $totalIncompatibilities = 0
+
+# Start a unique list of dependencies
+$missingDependencies = @{}
+
+# Get all the folders
+Get-ChildItem $baseDir -dir -Filter "Org.Apache.*" |
+       ForEach-Object {
+               $projectName = $_.Name
+
+               # Verify that the project is part of the .NET solution
+               $csProj = "${baseDir}\${projectName}\${projectName}.csproj"
+               If (!(Test-Path $csProj))
+               {
+                       Write-Output "Skipping ${projectName}: No csproj"
+                       return
+               }
+
+               # Determine the output type for the project
+               $outputType = $(Select-String -Path $csProj -Pattern 
"<OutputType>").Line -replace '^\s+<OutputType>(.+?)</OutputType>\s*$','$1'
+
+               # Get the portability settings for this project
+               $objectSuffix = ""
+               $dotNetTargets = @()
+               If ($outputType -eq "Library")
+               {
+                       $objectSuffix = "dll"
+                       $dotNetTargets = $libraryDotNetTargets
+               }
+               ElseIf ($outputType -eq "Exe")
+               {
+                       $objectSuffix = "exe"
+                       $dotNetTargets = $exeDotNetTargets
+               }
+               Else
+               {
+                       Write-Output "Skipping ${projectName}: OutputType is 
not 'Library','Exe'"
+                       return
+               }
+
+               # Define the object we want to explore
+               $objectPath = 
"${buildDir}\${projectName}\${projectName}.${objectSuffix}"
+               If(!(Test-Path $objectPath)) {
+                       Write-Output "Warning: Could not find build object: 
${objectPath}; Skipping ${projectName}"
+                       return
+               }
+
+               # Announce our intentions (there may be many slow loops)
+               Write-Output "Analyzing $projectName - $outputType"
+
+               # Define the portability command
+               $outputFileName = 
"${outputDirectory}\${projectName}.${objectSuffix}.json"
+               $analyzeParams = "analyze", "-r", "Json", "-f", $objectPath, 
"-o", $outputFileName
+               ForEach ($target in $dotNetTargets)
+               {
+                       $analyzeParams += "-t", $target
+               }
+
+               # Run the command
+               & $portabilityAnalyzer $analyzeParams | Out-Null
+
+               # Read in the resulting object
+               $compliance = Get-Content -Raw -Path $outputFileName | 
ConvertFrom-Json
+               
+               # Count the incompatibilities
+               $incompatibilities = $compliance.MissingDependencies.Count
+               $totalIncompatibilities += $incompatibilities
+               Write-Output "`tFound ${incompatibilities} incompatibilities"
+
+               # Keep a unique list of the incompatible libraries
+               ForEach ($item in $compliance.MissingDependencies)
+               {
+                       $assembly = 
$item.DefinedInAssemblyIdentity.split(',')[0]
+                       $missingDependencies[$assembly] = 1
+               }
+       }
+
+# Now report the status
+Write-Output "Found ${totalIncompatibilities} total incompatibilities"
+Write-Output "Missing Dependencies:"
+$dependencyString = "`t" + ($missingDependencies.Keys -join "`n`t")
+Write-Output "${dependencyString}"
+
+# And checkpoint it to a file
+$totalIncompatibilities | Out-File $incompatibilityFile

Reply via email to