Skip to content

Commit 9796a4d

Browse files
committed
WIP
1 parent 1a9cc91 commit 9796a4d

File tree

4 files changed

+62
-34
lines changed

4 files changed

+62
-34
lines changed

cabal-install-parsers/src/Cabal/Project.hs

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -447,36 +447,24 @@ parseCondTree subparse = go
447447
parseIfs accS accB (C.MkSection (C.Name _ name) test fields : sections) | name == "if" = do
448448
test' <- C.parseConditionConfVar test
449449
fields' <- go fields
450-
-- TODO: (elseFields, sections') <- parseElseIfs sections
451-
let condTree :: C.CondBranch C.ConfVar () a
452-
condTree = C.CondBranch test' fields' Nothing
453-
parseIfs accS (accB . (condTree :)) sections
450+
parseElseIfs (C.CondBranch test' fields') accS accB sections
454451
parseIfs accS accB (section : sections) = do
455452
parseIfs (accS . (section :)) accB sections
456453

457-
{-
458-
parseElseIfs
459-
:: [Section Position]
460-
-> ParseResult (Maybe (CondTree ConfVar [Dependency] a), [CondBranch ConfVar [Dependency] a])
461-
parseElseIfs [] = return (Nothing, [])
462-
parseElseIfs (MkSection (Name pos name) args fields : sections) | name == "else" = do
463-
unless (null args) $
464-
parseFailure pos $
465-
"`else` section has section arguments " ++ show args
466-
elseFields <- go fields
467-
sections' <- parseIfs sections
468-
return (Just elseFields, sections')
469-
parseElseIfs (MkSection (Name _ name) test fields : sections)
470-
| hasElif == HasElif
471-
, name == "elif" = do
472-
test' <- parseConditionConfVar test
473-
fields' <- go fields
474-
(elseFields, sections') <- parseElseIfs sections
475-
-- we parse an empty 'Fields', to get empty value for a node
476-
a <- parseFieldGrammar v mempty grammar
477-
return (Just $ CondNode a (cond a) [CondBranch test' fields' elseFields], sections')
478-
parseElseIfs (MkSection (Name pos name) _ _ : sections) | name == "elif" = do
479-
parseWarning pos PWTInvalidSubsection $ "invalid subsection \"elif\". You should set cabal-version: 2.2 or larger to use elif-conditionals."
480-
(,) Nothing <$> parseIfs sections
481-
parseElseIfs sections = (,) Nothing <$> parseIfs sections
482-
-}
454+
parseElseIfs
455+
:: (Maybe (C.CondTree C.ConfVar () a) -> C.CondBranch C.ConfVar () a)
456+
-> ([C.Section C.Position] -> [C.Section C.Position])
457+
-> ([C.CondBranch C.ConfVar () a] -> [C.CondBranch C.ConfVar () a])
458+
-> [C.Section C.Position]
459+
-> C.ParseResult ([C.Section C.Position], [C.CondBranch C.ConfVar () a])
460+
parseElseIfs make accS accB [] = do
461+
let condTree = make Nothing
462+
return (accS [], accB [condTree])
463+
parseElseIfs make accS accB (C.MkSection (C.Name pos name) _args _fields : _sections) | name == "else" = do
464+
C.parseFailure pos "else is not supprted yet"
465+
return ([], [])
466+
parseElseIfs make accS accB (C.MkSection (C.Name pos name) _args _fields : _sections) | name == "elif" = do
467+
C.parseFailure pos "elif is not supprted yet"
468+
return ([], [])
469+
parseElseIfs make accS accB (section : sections) = do
470+
parseIfs (accS . (section :)) (accB . (make Nothing :)) sections

fixtures/conditionals.bash

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ put_info "initial cabal.project for sdist"
451451
change_dir "$BUILDDIR"
452452
run_cmd touch cabal.project
453453
echo_to cabal.project "packages: $SRCDIR/servant"
454+
echo_to cabal.project "packages: $SRCDIR/servant-client"
454455
run_cmd cat cabal.project
455456

456457
# sdist
@@ -467,14 +468,18 @@ run_cmd find "$BUILDDIR/sdist" -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C
467468
# generate cabal.project
468469
put_info "generate cabal.project"
469470
PKGDIR_servant="$(find "$BUILDDIR/unpacked" -maxdepth 1 -type d -regex '.*/servant-[0-9.]*')"
471+
PKGDIR_servant_client="$(find "$BUILDDIR/unpacked" -maxdepth 1 -type d -regex '.*/servant-client-[0-9.]*')"
470472
run_cmd touch cabal.project
471473
run_cmd touch cabal.project.local
472474
echo_to cabal.project "packages: ${PKGDIR_servant}"
475+
echo_to cabal.project "packages: ${PKGDIR_servant_client}"
473476
echo_if_to $((HCNUMVER >= 80200)) cabal.project "package servant"
474477
echo_if_to $((HCNUMVER >= 80200)) cabal.project " ghc-options: -Werror=missing-methods"
478+
echo_if_to $((HCNUMVER >= 80200)) cabal.project "package servant-client"
479+
echo_if_to $((HCNUMVER >= 80200)) cabal.project " ghc-options: -Werror=missing-methods"
475480
cat >> cabal.project <<EOF
476481
EOF
477-
$HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(servant)$/; }' >> cabal.project.local
482+
$HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(servant|servant-client)$/; }' >> cabal.project.local
478483
run_cmd cat cabal.project
479484
run_cmd cat cabal.project.local
480485

@@ -504,6 +509,8 @@ run_cmd $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-detai
504509
put_info "cabal check"
505510
change_dir "${PKGDIR_servant}"
506511
run_cmd ${CABAL} -vnormal check
512+
change_dir "${PKGDIR_servant_client}"
513+
run_cmd ${CABAL} -vnormal check
507514
change_dir "$BUILDDIR"
508515

509516
# haddock

fixtures/conditionals.github

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ jobs:
245245
run: |
246246
touch cabal.project
247247
echo "packages: $GITHUB_WORKSPACE/source/servant" >> cabal.project
248+
echo "packages: $GITHUB_WORKSPACE/source/servant-client" >> cabal.project
248249
cat cabal.project
249250
- name: sdist
250251
run: |
@@ -258,15 +259,20 @@ jobs:
258259
run: |
259260
PKGDIR_servant="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/servant-[0-9.]*')"
260261
echo "PKGDIR_servant=${PKGDIR_servant}" >> "$GITHUB_ENV"
262+
PKGDIR_servant_client="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/servant-client-[0-9.]*')"
263+
echo "PKGDIR_servant_client=${PKGDIR_servant_client}" >> "$GITHUB_ENV"
261264
rm -f cabal.project cabal.project.local
262265
touch cabal.project
263266
touch cabal.project.local
264267
echo "packages: ${PKGDIR_servant}" >> cabal.project
268+
echo "packages: ${PKGDIR_servant_client}" >> cabal.project
265269
if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package servant" >> cabal.project ; fi
266270
if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
271+
if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package servant-client" >> cabal.project ; fi
272+
if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
267273
cat >> cabal.project <<EOF
268274
EOF
269-
$HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(servant)$/; }' >> cabal.project.local
275+
$HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(servant|servant-client)$/; }' >> cabal.project.local
270276
cat cabal.project
271277
cat cabal.project.local
272278
- name: dump install plan
@@ -296,6 +302,8 @@ jobs:
296302
run: |
297303
cd ${PKGDIR_servant} || false
298304
${CABAL} -vnormal check
305+
cd ${PKGDIR_servant_client} || false
306+
${CABAL} -vnormal check
299307
- name: haddock
300308
run: |
301309
$CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all

src/HaskellCI.hs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import System.Process (readProcessWithExitCode)
3636
import Distribution.PackageDescription (GenericPackageDescription, package, packageDescription, testedWith)
3737
import Distribution.Text
3838
import Distribution.Version
39+
import Distribution.Types.CondTree (CondTree (..), CondBranch (..))
3940

4041
import qualified Data.ByteString as BS
4142
import qualified Data.List.NonEmpty as NE
@@ -360,13 +361,37 @@ getCabalFiles
360361
-> m (Project URI Void (FilePath, GenericPackageDescription))
361362
getCabalFiles InputTypeProject path = do
362363
contents <- liftIO $ BS.readFile path
363-
prj0 <- either (putStrLnErr . renderParseError) return $ parseProject path contents
364-
prj1 <- either (putStrLnErr . renderResolveError) return =<< liftIO (resolveProject path prj0)
364+
prj0 <- either (putStrLnErr . renderParseError) return $ parseProjectWithConditionals path contents
365+
let prj0' :: Project Void String String
366+
prj0' = simplifyProject prj0
367+
prj1 <- either (putStrLnErr . renderResolveError) return =<< liftIO (resolveProject path prj0')
365368
either (putStrLnErr . renderParseError) return =<< liftIO (readPackagesOfProject prj1)
366369
getCabalFiles InputTypePackage path = do
367370
e <- liftIO $ readPackagesOfProject (emptyProject & field @"prjPackages" .~ [path])
368371
either (putStrLnErr . renderParseError) return e
369372

373+
simplifyProject :: CondTree c d (Project Void String String) -> Project Void String String
374+
simplifyProject (CondNode a _ ifs) =
375+
foldl (<<>>) a $ map simplifyProject' ifs
376+
377+
simplifyProject' :: CondBranch v d (Project Void String String) -> Project Void String String
378+
simplifyProject' (CondBranch _ t Nothing) = simplifyProject t
379+
simplifyProject' (CondBranch _ t (Just e)) = simplifyProject t <<>> simplifyProject e
380+
381+
(<<>>) :: Project pkg opt uri -> Project pkg opt uri -> Project pkg opt uri
382+
x <<>> y = Project
383+
{ prjPackages = prjPackages x <> prjPackages y
384+
, prjOptPackages = prjOptPackages x <> prjOptPackages y
385+
, prjUriPackages = prjUriPackages x <> prjUriPackages y
386+
, prjConstraints = prjConstraints x <> prjConstraints y
387+
, prjAllowNewer = prjAllowNewer x <> prjAllowNewer y
388+
, prjReorderGoals = prjReorderGoals x || prjReorderGoals y
389+
, prjMaxBackjumps = max (prjMaxBackjumps x) (prjMaxBackjumps y)
390+
, prjOptimization = prjOptimization x
391+
, prjSourceRepos = prjSourceRepos x <> prjSourceRepos y
392+
, prjOtherFields = prjOtherFields x<> prjOtherFields y
393+
}
394+
370395
-------------------------------------------------------------------------------
371396
-- Config
372397
-------------------------------------------------------------------------------

0 commit comments

Comments
 (0)