Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build failure when some programs are on the PATH #14

Open
facundominguez opened this issue Feb 5, 2018 · 1 comment
Open

Build failure when some programs are on the PATH #14

facundominguez opened this issue Feb 5, 2018 · 1 comment

Comments

@facundominguez
Copy link

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.

@psibi
Copy link
Owner

psibi commented Mar 30, 2018

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants