Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Paket-ShowInstalledPackages returns types
  • Loading branch information
Cameron Taggart
Cameron Taggart committed Jun 22, 2015
commit 8cf865d991ff54f70e61f942753c507cea7793d5
8 changes: 8 additions & 0 deletions src/Paket.PowerShell/EventSink.fs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@ type EventSink<'T>() =
let queue = new BlockingCollection<_>()
let subscriptions = List()

member __.Add state callback =
queue.Add((callback, state))

member __.Fill callback (source:IObservable<'T>) =
source |> Observable.subscribe (fun state -> queue.Add((callback, state)))
|> subscriptions.Add

/// converts the object to be compatible with the sink
member __.ConvertAndFill (converter:'S -> 'T) callback (source:IObservable<'S>) =
source |> Observable.subscribe (fun state -> queue.Add((callback, converter state)))
|> subscriptions.Add

member __.Drain() =
for callback, state in queue.GetConsumingEnumerable() do
callback state
Expand Down
82 changes: 66 additions & 16 deletions src/Paket.PowerShell/PowerShell.fs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,44 @@ open System
[<AutoOpen>]
module PaketPs =

let processWithLogging (cmdlet:PSCmdlet) computation =
type Package = { Name: string; Version: string }

type PaketOutput =
| Trace of Logging.Trace
| Package of Package

let runWithLogging (cmdlet:PSCmdlet) (computation:Async<'T>) (cont:'T -> EventSink<PaketOutput> -> unit) =
Environment.CurrentDirectory <- cmdlet.SessionState.Path.CurrentFileSystemLocation.Path
Logging.verbose <- cmdlet.Verbose
use sink = new EventSink<PaketOutput>()

Logging.event.Publish |> sink.ConvertAndFill PaketOutput.Trace (fun output ->
match output with
| Trace trace ->
match trace.Level with
| TraceLevel.Error -> cmdlet.WriteWarning trace.Text
| TraceLevel.Warning -> cmdlet.WriteWarning trace.Text
| TraceLevel.Verbose -> cmdlet.WriteVerbose trace.Text
| _ -> cmdlet.WriteObject trace.Text
| _ -> () )

let run =
async {
try
do! Async.SwitchToNewThread()
// prevent an exception from killing the thread, PS thread, and PS exe
try
let! v = computation
cont v sink
with
| ex -> Logging.traceWarn ex.Message
finally
sink.StopFill()
} |> Async.Start

sink.Drain()

let processWithLogging (cmdlet:PSCmdlet) (computation:Async<unit>) =
Environment.CurrentDirectory <- cmdlet.SessionState.Path.CurrentFileSystemLocation.Path
Logging.verbose <- cmdlet.Verbose
use sink = new EventSink<Logging.Trace>()
Expand All @@ -21,7 +58,7 @@ module PaketPs =
| TraceLevel.Warning -> cmdlet.WriteWarning trace.Text
| TraceLevel.Verbose -> cmdlet.WriteVerbose trace.Text
| _ -> cmdlet.WriteObject trace.Text )

async {
try
do! Async.SwitchToNewThread()
Expand Down Expand Up @@ -69,7 +106,7 @@ type Add() =
]
|> parser.CreateParseResultsOfList
|> Program.add
} |> processWithLogging x
} |> processWithLogging x

[<Cmdlet("Paket", "AutoRestore")>]
type AutoRestoreCmdlet() =
Expand Down Expand Up @@ -363,19 +400,32 @@ type ShowInstalledPackagesCmdlet() =
[<Parameter>] member val Silent = SwitchParameter() with get, set

override x.ProcessRecord() =
async {
let parser = UnionArgParser.Create<ShowInstalledPackagesArgs>()
[
if x.All.IsPresent then
yield ShowInstalledPackagesArgs.All
if String.IsNullOrEmpty x.Project = false then
yield ShowInstalledPackagesArgs.Project x.Project
if x.Silent.IsPresent then
yield ShowInstalledPackagesArgs.Silent
]
|> parser.CreateParseResultsOfList
|> Program.showInstalledPackages
} |> processWithLogging x
let computation =
async {
let packages =
let parser = UnionArgParser.Create<ShowInstalledPackagesArgs>()
[
if x.All.IsPresent then
yield ShowInstalledPackagesArgs.All
if String.IsNullOrEmpty x.Project = false then
yield ShowInstalledPackagesArgs.Project x.Project
if x.Silent.IsPresent then
yield ShowInstalledPackagesArgs.Silent
]
|> parser.CreateParseResultsOfList
|> Program.getInstalledPackages
return packages
}

runWithLogging x computation
(fun packages output ->
for name,version in packages do
output.Add
(PaketOutput.Package {Name=name; Version=version})
(fun po ->
match po with
| Package p -> x.WriteObject p
| _ -> () ) )

[<Cmdlet("Paket", "Update")>]
type UpdateCmdlet() =
Expand Down
32 changes: 17 additions & 15 deletions src/Paket/Program.fs
Original file line number Diff line number Diff line change
Expand Up @@ -213,24 +213,25 @@ let findPackages (results : ArgParseResults<_>) =

| Some searchText -> searchAndPrint searchText

let showInstalledPackages (results : ArgParseResults<_>) =
// separated out from showInstalledPackages to allow Paket.PowerShell to get the types
let getInstalledPackages (results : ArgParseResults<_>) =
let project = results.TryGetResult <@ ShowInstalledPackagesArgs.Project @>
let showAll = results.Contains <@ ShowInstalledPackagesArgs.All @>
let dependenciesFile = Dependencies.Locate()
let packages =
match project with
| None ->
if showAll then dependenciesFile.GetInstalledPackages()
else dependenciesFile.GetDirectDependencies()
| Some project ->
match ProjectFile.FindReferencesFile(FileInfo project) with
| None -> []
| Some referencesFile ->
let referencesFile = ReferencesFile.FromFile referencesFile
if showAll then dependenciesFile.GetInstalledPackages(referencesFile)
else dependenciesFile.GetDirectDependencies(referencesFile)

for name,version in packages do
match project with
| None ->
if showAll then dependenciesFile.GetInstalledPackages()
else dependenciesFile.GetDirectDependencies()
| Some project ->
match ProjectFile.FindReferencesFile(FileInfo project) with
| None -> []
| Some referencesFile ->
let referencesFile = ReferencesFile.FromFile referencesFile
if showAll then dependenciesFile.GetInstalledPackages(referencesFile)
else dependenciesFile.GetDirectDependencies(referencesFile)

let showInstalledPackages (results : ArgParseResults<_>) =
for name,version in getInstalledPackages results do
tracefn "%s - %s" name version

let findPackageVersions (results : ArgParseResults<_>) =
Expand Down Expand Up @@ -290,6 +291,7 @@ let main() =
let args = args.[1..]

handler command args
()
| [] ->
Environment.ExitCode <- 1
traceError "Command was:"
Expand Down