Skip to content

Build failure when some programs are on the PATH  #14

@facundominguez

Description

@facundominguez

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions