Skip to content

Commit

Permalink
sanityCheckNuget.fsx: sanitycheck for external sln
Browse files Browse the repository at this point in the history
Co-authored-by: Afshin Arani <afshin@arani.dev>
Co-authored-by: Andres G. Aragoneses <knocte@gmail.com>
  • Loading branch information
3 people committed Nov 8, 2023
1 parent df195a9 commit 69c24d2
Showing 1 changed file with 81 additions and 23 deletions.
104 changes: 81 additions & 23 deletions scripts/sanityCheckNuget.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,58 @@ open Fsdk.Process

#r "nuget: Microsoft.Build, Version=16.11.0"
open Microsoft.Build.Construction
let ScriptsDir = __SOURCE_DIRECTORY__ |> DirectoryInfo
let RootDir = Path.Combine(ScriptsDir.FullName, "..") |> DirectoryInfo

type ScriptTarget =
| Solution of FileInfo
| Folder of DirectoryInfo

let args = Misc.FsxOnlyArguments()

if args.Length > 1 then
printf "Usage: %s [example.sln(optional) NuGet.config]" __SOURCE_FILE__

Environment.Exit 1

let target =
if args.IsEmpty then
Directory.GetCurrentDirectory() |> DirectoryInfo |> ScriptTarget.Folder
else
let singleArg = args.[0]

if Directory.Exists singleArg then
failwithf "Use an .sln file insted of directory."
elif not(File.Exists singleArg) then
failwithf "'%s' does not exist." singleArg
elif singleArg.EndsWith ".sln" then
singleArg |> FileInfo |> ScriptTarget.Solution
else
failwithf
"'%s' argument is invalid. You should enter an .sln file or run this script on current directory"
singleArg


let NugetSolutionPackagesDir =
Path.Combine(RootDir.FullName, "packages") |> DirectoryInfo
match target with
| Solution _ ->
let nugetPackageConfigDir =
Path.Combine(Directory.GetCurrentDirectory(), "NuGet.config")

if not(File.Exists nugetPackageConfigDir) then
failwithf
"NuGet.config not found in '%s', please create it with the `globalPackagesFolder` key as `packages`."
nugetPackageConfigDir


Path.Combine(
(nugetPackageConfigDir |> FileInfo)
.Directory
.FullName,
"packages"
)
|> DirectoryInfo
| Folder directoryInfo ->
Path.Combine(directoryInfo.FullName, "packages") |> DirectoryInfo


module MapHelper =
let GetKeysOfMap(map: Map<'K, 'V>) : seq<'K> =
Expand Down Expand Up @@ -100,7 +147,10 @@ type private ComparableFileInfo =

let SanityCheckNugetPackages() =

let notPackagesFolder(dir: DirectoryInfo) : bool =
let notPackagesFolder
(solutionDir: DirectoryInfo)
(dir: DirectoryInfo)
: bool =
dir.FullName <> NugetSolutionPackagesDir.FullName

let notSubmodule(dir: DirectoryInfo) : bool =
Expand Down Expand Up @@ -167,7 +217,7 @@ let SanityCheckNugetPackages() =
dir
.EnumerateDirectories()
.Where(notSubmodule)
.Where(notPackagesFolder) do
.Where(notPackagesFolder sol.Directory) do
for file in findNuspecFiles subdir do
yield file
}
Expand Down Expand Up @@ -322,23 +372,25 @@ let SanityCheckNugetPackages() =
: Map<string, seq<DependencyHolder>> =
solDir.Refresh()

if not NugetSolutionPackagesDir.Exists then
let packagesDir = NugetSolutionPackagesDir

if not packagesDir.Exists then
failwithf
"'%s' subdir under solution dir %s doesn't exist, run `make` first"
NugetSolutionPackagesDir.Name
NugetSolutionPackagesDir.FullName
packagesDir.Name
packagesDir.FullName

let packageDirsAbsolutePaths =
NugetSolutionPackagesDir
packagesDir
.EnumerateDirectories()
.Select(fun dir -> dir.FullName)

if not(packageDirsAbsolutePaths.Any()) then
Console.Error.WriteLine(
sprintf
"'%s' subdir under solution dir %s doesn't contain any packages"
NugetSolutionPackagesDir.Name
NugetSolutionPackagesDir.FullName
packagesDir.Name
packagesDir.FullName
)

Console.Error.WriteLine
Expand All @@ -351,7 +403,7 @@ let SanityCheckNugetPackages() =
idealPackageDirs do
let pkgDirToLookFor =
Path.Combine(
NugetSolutionPackagesDir.FullName,
packagesDir.FullName,
packageDirNameThatShouldExist
)
|> DirectoryInfo
Expand All @@ -367,24 +419,26 @@ let SanityCheckNugetPackages() =
: seq<string> =
solDir.Refresh()

if not(NugetSolutionPackagesDir.Exists) then
let packagesDir = NugetSolutionPackagesDir

if not(packagesDir.Exists) then
failwithf
"'%s' subdir under solution dir %s doesn't exist, run `make` first"
NugetSolutionPackagesDir.Name
NugetSolutionPackagesDir.FullName
packagesDir.Name
packagesDir.FullName
// "src" is a directory for source codes and build scripts,
// not for packages, so we need to exclude it from here
let packageDirNames =
NugetSolutionPackagesDir
packagesDir
.EnumerateDirectories()
.Select(fun dir -> dir.Name)
.Except([ "src" ])

if not(packageDirNames.Any()) then
failwithf
"'%s' subdir under solution dir %s doesn't contain any packages"
NugetSolutionPackagesDir.Name
NugetSolutionPackagesDir.FullName
packagesDir.Name
packagesDir.FullName

let packageDirsThatShouldExist =
MapHelper.GetKeysOfMap idealPackageDirs
Expand Down Expand Up @@ -566,13 +620,17 @@ let SanityCheckNugetPackages() =
yield solution
}

let slnFile = Path.Combine(RootDir.FullName, "conventions.sln") |> FileInfo

if not slnFile.Exists then
raise
<| FileNotFoundException("Solution file not found", slnFile.FullName)
match target with
| Solution solution -> sanityCheckNugetPackagesFromSolution solution
| Folder folder ->

let solutions = findSolutions folder

sanityCheckNugetPackagesFromSolution slnFile
if Seq.isEmpty solutions then
failwithf "There is no *.sln file located in: '%s'" folder.FullName

for sol in solutions do
sanityCheckNugetPackagesFromSolution sol

SanityCheckNugetPackages()

0 comments on commit 69c24d2

Please sign in to comment.