shell-conduit icon indicating copy to clipboard operation
shell-conduit copied to clipboard

Build failure when some programs are on the PATH

Open facundominguez opened this issue 8 years ago • 1 comments

If any program in the PATH is called the same as any of the following identifiers, there is some risk that Data.Conduit.Shell fails to build as in:

shell-conduit $ touch fuse
shell-conduit $ chmod +x fuse
shell-conduit $ PATH=$(pwd):$PATH stack ghci
...
/home/facundo/tweag/shell-conduit/src/Data/Conduit/Shell.hs:111:4: error:
    Conflicting exports for ‘fuse’:
       ‘module Data.Conduit’ exports ‘Data.Conduit.fuse’
         imported from ‘Data.Conduit’ at /home/facundo/tweag/shell-conduit/src/Data/Conduit/Shell.hs:114:1-19
       ‘module Data.Conduit.Shell.PATH’ exports ‘Data.Conduit.Shell.PATH.fuse’
         imported from ‘Data.Conduit.Shell.PATH’ at /home/facundo/tweag/shell-conduit/src/Data/Conduit/Shell.hs:115:1-47
         (and originally defined
            at /home/facundo/tweag/shell-conduit/src/Data/Conduit/Shell/PATH.hs:29:3-18)
    |
111 |   ,module Data.Conduit)
Data.Conduit.Shell.Process.ProcessEmpty ::
Data.Conduit.Shell.Process.ProcessException ::
Data.Conduit.Shell.Types.ShellEmpty ::
Data.Conduit.Shell.Types.ShellExitFailure ::
Data.Conduit.Shell.Types.ShellT ::
Data.Conduit.Shell.Types.StMShell ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.ZipConduit ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.ZipSink ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.ZipSource ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.addCleanup ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.await ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.awaitForever ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.bracketP ::
Data.Conduit.Shell.Process.bytes ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.catchC ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.closeResumableSource ::
Data.Conduit.Shell.Process.conduit ::
Data.Conduit.connect ::
Data.Conduit.fuse ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.fuseBoth ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.fuseBothMaybe ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.fuseLeftovers ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.fuseReturnLeftovers ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.fuseUpstream ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.getZipConduit ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.getZipSink ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.getZipSource ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.handleC ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.leftover ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.mapInput ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.mapOutput ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.mapOutputMaybe ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.mergeSource ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.newResumableConduit ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.newResumableSource ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.passthroughSink ::
Data.Conduit.Shell.Process.proc ::
Data.Conduit.Shell.Process.run ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.runConduit ::
Data.Conduit.runConduitPure ::
Data.Conduit.runConduitRes ::
Data.Conduit.Shell.Types.runShellT ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.sequenceConduits ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.sequenceSinks ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.sequenceSources ::
Data.Conduit.Shell.Process.shell ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.sourceToList ::
Data.Conduit.Shell.Variadic.spr ::
Data.Conduit.Shell.Process.text ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.toConsumer ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.toProducer ::
Data.Conduit.Shell.Variadic.toTextArg ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.transPipe ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.tryC ::
Data.Conduit.Shell.Types.unStMGeoServer ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.unwrapResumable ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.unwrapResumableConduit ::
Data.Conduit.Shell.Variadic.variadicProcess ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.yield ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.yieldM ::
conduit-1.2.12.1:Data.Conduit.Internal.Conduit.yieldOr ::

Some mechanisms needs to be put in place to make sure that the names produced in Data.Conduit.Shell.PATH do not collide with the export list of Data.Conduit.Shell.

Additionally, the user should probably be warned to protect against program names in the PATH clashing with identifiers in his own modules when importing Data.Conduit.Shell.PATH or Data.Conduit.Shell by using qualified imports or explicit import lists.

facundominguez avatar Feb 05 '18 13:02 facundominguez

Sorry for my late reply. I agree with your judgement. I would welcome a PR which uses qualified import in shell-conduit's API.

psibi avatar Mar 30 '18 17:03 psibi