Skip to content

Commit b84f6f1

Browse files
committed
Use duplicateImportMsg for cycles too
1 parent 3f9a0ef commit b84f6f1

File tree

4 files changed

+43
-38
lines changed

4 files changed

+43
-38
lines changed

cabal-install-solver/src/Distribution/Solver/Types/ProjectConfigPath.hs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ module Distribution.Solver.Types.ProjectConfigPath
1111

1212
-- * Messages
1313
, docProjectConfigPath
14-
, cyclicalImportMsg
1514
, duplicateImportMsg
1615
, docProjectConfigPathFailReason
1716

@@ -64,22 +63,12 @@ docProjectConfigPath (ProjectConfigPath (p :| [])) = text p
6463
docProjectConfigPath (ProjectConfigPath (p :| ps)) = vcat $
6564
text p : [ text " " <+> text "imported by:" <+> text l | l <- ps ]
6665

67-
-- | A message for a cyclical import, assuming the head of the path is the
68-
-- duplicate.
69-
cyclicalImportMsg :: ProjectConfigPath -> Doc
70-
cyclicalImportMsg path@(ProjectConfigPath (duplicate :| _)) =
66+
-- | A message for a duplicate import. Useful for reporting cyclical imports and
67+
-- duplicate imports by different import paths.
68+
duplicateImportMsg :: String -> FilePath -> ProjectConfigPath -> [(FilePath, ProjectConfigPath)] -> Doc
69+
duplicateImportMsg description duplicate path seenImportsBy =
7170
vcat
72-
[ text "cyclical import of" <+> text duplicate <> semi
73-
, nest 2 (docProjectConfigPath path)
74-
]
75-
76-
-- | A message for a duplicate import. If a check for cyclical imports has
77-
-- already been made then this would report a duplicate import by two different
78-
-- paths.
79-
duplicateImportMsg :: FilePath -> ProjectConfigPath -> [(FilePath, ProjectConfigPath)] -> Doc
80-
duplicateImportMsg duplicate path seenImportsBy =
81-
vcat
82-
[ text "duplicate import of" <+> text duplicate <> semi
71+
[ text description <+> text "import of" <+> text duplicate <> semi
8372
, nest 2 (docProjectConfigPath path)
8473
, nest 2 $
8574
vcat

cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,9 @@ parseProjectSkeleton cacheDir httpTransport verbosity importsBy projectDir sourc
282282

283283
if
284284
| isCyclicConfigPath normLocPath ->
285-
pure . parseFail $ ParseUtils.FromString (render $ cyclicalImportMsg normLocPath) Nothing
285+
pure . parseFail $ ParseUtils.FromString (render $ duplicateImportMsg "cyclical (duplicate)" uniqueImport normLocPath seenImportsBy) Nothing
286286
| uniqueImport `elem` seenImports -> do
287-
pure . parseFail $ ParseUtils.FromString (render $ duplicateImportMsg uniqueImport normLocPath seenImportsBy) Nothing
287+
pure . parseFail $ ParseUtils.FromString (render $ duplicateImportMsg "duplicate" uniqueImport normLocPath seenImportsBy) Nothing
288288
| otherwise -> do
289289
normSource <- canonicalizeConfigPath projectDir source
290290
let fs = (\z -> CondNode z [normLocPath] mempty) <$> fieldsToConfig normSource (reverse acc)

cabal-testsuite/PackageTests/ConditionalAndImport/cabal.out

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,52 +14,62 @@ Warning: The directory <ROOT>/cabal.dist/home/.cabal/store/ghc-<GHCVER>/incoming
1414
# cabal v2-build
1515
Error: [Cabal-7090]
1616
Error parsing project file <ROOT>/cyclical-0-self.project:
17-
cyclical import of cyclical-0-self.project;
17+
cyclical (duplicate) import of cyclical-0-self.project;
1818
cyclical-0-self.project
1919
imported by: cyclical-0-self.project
20+
cyclical-0-self.project
2021
# checking cyclical with hops; out and back
2122
# cabal v2-build
2223
Error: [Cabal-7090]
2324
Error parsing project file <ROOT>/cyclical-1-out-back.project:
24-
cyclical import of cyclical-1-out-back.project;
25+
cyclical (duplicate) import of cyclical-1-out-back.project;
2526
cyclical-1-out-back.project
2627
imported by: cyclical-1-out-back.config
2728
imported by: cyclical-1-out-back.project
29+
cyclical-1-out-back.project
2830
# checking cyclical with hops; out to a config that imports itself
2931
# cabal v2-build
3032
Error: [Cabal-7090]
3133
Error parsing project file <ROOT>/cyclical-1-out-self.project:
32-
cyclical import of cyclical-1-out-self.config;
34+
cyclical (duplicate) import of cyclical-1-out-self.config;
3335
cyclical-1-out-self.config
3436
imported by: cyclical-1-out-self.config
3537
imported by: cyclical-1-out-self.project
38+
cyclical-1-out-self.config
39+
imported by: cyclical-1-out-self.project
3640
# checking cyclical with hops; out, out, twice back
3741
# cabal v2-build
3842
Error: [Cabal-7090]
3943
Error parsing project file <ROOT>/cyclical-2-out-out-backback.project:
40-
cyclical import of cyclical-2-out-out-backback.project;
44+
cyclical (duplicate) import of cyclical-2-out-out-backback.project;
4145
cyclical-2-out-out-backback.project
4246
imported by: cyclical-2-out-out-backback-b.config
4347
imported by: cyclical-2-out-out-backback-a.config
4448
imported by: cyclical-2-out-out-backback.project
49+
cyclical-2-out-out-backback.project
4550
# checking cyclical with hops; out, out, once back
4651
# cabal v2-build
4752
Error: [Cabal-7090]
4853
Error parsing project file <ROOT>/cyclical-2-out-out-back.project:
49-
cyclical import of cyclical-2-out-out-back-a.config;
54+
cyclical (duplicate) import of cyclical-2-out-out-back-a.config;
5055
cyclical-2-out-out-back-a.config
5156
imported by: cyclical-2-out-out-back-b.config
5257
imported by: cyclical-2-out-out-back-a.config
5358
imported by: cyclical-2-out-out-back.project
59+
cyclical-2-out-out-back-a.config
60+
imported by: cyclical-2-out-out-back.project
5461
# checking cyclical with hops; out, out to a config that imports itself
5562
# cabal v2-build
5663
Error: [Cabal-7090]
5764
Error parsing project file <ROOT>/cyclical-2-out-out-self.project:
58-
cyclical import of cyclical-2-out-out-self-b.config;
65+
cyclical (duplicate) import of cyclical-2-out-out-self-b.config;
5966
cyclical-2-out-out-self-b.config
6067
imported by: cyclical-2-out-out-self-b.config
6168
imported by: cyclical-2-out-out-self-a.config
6269
imported by: cyclical-2-out-out-self.project
70+
cyclical-2-out-out-self-b.config
71+
imported by: cyclical-2-out-out-self-a.config
72+
imported by: cyclical-2-out-out-self.project
6373
# checking that cyclical check doesn't false-positive on same file names in different folders; hoping within a folder and then into a subfolder
6474
# cabal v2-build
6575
Resolving dependencies...
@@ -76,29 +86,35 @@ Up to date
7686
# cabal v2-build
7787
Error: [Cabal-7090]
7888
Error parsing project file <ROOT>/cyclical-same-filename-out-out-self.project:
79-
cyclical import of same-filename/cyclical-same-filename-out-out-self.config;
89+
cyclical (duplicate) import of same-filename/cyclical-same-filename-out-out-self.config;
8090
same-filename/cyclical-same-filename-out-out-self.config
8191
imported by: same-filename/cyclical-same-filename-out-out-self.config
8292
imported by: cyclical-same-filename-out-out-self.config
8393
imported by: cyclical-same-filename-out-out-self.project
94+
same-filename/cyclical-same-filename-out-out-self.config
95+
imported by: cyclical-same-filename-out-out-self.config
96+
imported by: cyclical-same-filename-out-out-self.project
8497
# checking that cyclical check catches importing its importer (with the same file name)
8598
# cabal v2-build
8699
Error: [Cabal-7090]
87100
Error parsing project file <ROOT>/cyclical-same-filename-out-out-backback.project:
88-
cyclical import of cyclical-same-filename-out-out-backback.project;
101+
cyclical (duplicate) import of cyclical-same-filename-out-out-backback.project;
89102
cyclical-same-filename-out-out-backback.project
90103
imported by: same-filename/cyclical-same-filename-out-out-backback.config
91104
imported by: cyclical-same-filename-out-out-backback.config
92105
imported by: cyclical-same-filename-out-out-backback.project
106+
cyclical-same-filename-out-out-backback.project
93107
# checking that cyclical check catches importing its importer's importer (hopping over same file names)
94108
# cabal v2-build
95109
Error: [Cabal-7090]
96110
Error parsing project file <ROOT>/cyclical-same-filename-out-out-back.project:
97-
cyclical import of cyclical-same-filename-out-out-back.config;
111+
cyclical (duplicate) import of cyclical-same-filename-out-out-back.config;
98112
cyclical-same-filename-out-out-back.config
99113
imported by: same-filename/cyclical-same-filename-out-out-back.config
100114
imported by: cyclical-same-filename-out-out-back.config
101115
imported by: cyclical-same-filename-out-out-back.project
116+
cyclical-same-filename-out-out-back.config
117+
imported by: cyclical-same-filename-out-out-back.project
102118
# checking that imports work skipping into a subfolder and then back out again and again
103119
# cabal v2-build
104120
Up to date

cabal-testsuite/PackageTests/ConditionalAndImport/cabal.test.hs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,23 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
1010
-- +-- etc
1111
log "checking cyclical loopback of a project importing itself"
1212
cyclical0 <- fails $ cabal' "v2-build" [ "--project-file=cyclical-0-self.project" ]
13-
assertOutputContains "cyclical import of cyclical-0-self.project" cyclical0
13+
assertOutputContains "cyclical (duplicate) import of cyclical-0-self.project" cyclical0
1414

1515
-- +-- cyclical-1-out-back.project
1616
-- +-- cyclical-1-out-back.config (imports cyclical-1-out-back.project)
1717
-- +-- cyclical-1-out-back.project (already processed)
1818
-- +-- etc
1919
log "checking cyclical with hops; out and back"
2020
cyclical1a <- fails $ cabal' "v2-build" [ "--project-file=cyclical-1-out-back.project" ]
21-
assertOutputContains "cyclical import of cyclical-1-out-back.project" cyclical1a
21+
assertOutputContains "cyclical (duplicate) import of cyclical-1-out-back.project" cyclical1a
2222

2323
-- +-- cyclical-1-out-self.project
2424
-- +-- cyclical-1-out-self.config (imports cyclical-1-out-self.config)
2525
-- +-- cyclical-1-out-self.config (already processed)
2626
-- +-- etc
2727
log "checking cyclical with hops; out to a config that imports itself"
2828
cyclical1b <- fails $ cabal' "v2-build" [ "--project-file=cyclical-1-out-self.project" ]
29-
assertOutputContains "cyclical import of cyclical-1-out-self.config" cyclical1b
29+
assertOutputContains "cyclical (duplicate) import of cyclical-1-out-self.config" cyclical1b
3030

3131
-- +-- cyclical-2-out-out-backback.project
3232
-- +-- cyclical-2-out-out-backback-a.config
@@ -35,7 +35,7 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
3535
-- +-- etc
3636
log "checking cyclical with hops; out, out, twice back"
3737
cyclical2a <- fails $ cabal' "v2-build" [ "--project-file=cyclical-2-out-out-backback.project" ]
38-
assertOutputContains "cyclical import of cyclical-2-out-out-backback.project" cyclical2a
38+
assertOutputContains "cyclical (duplicate) import of cyclical-2-out-out-backback.project" cyclical2a
3939

4040
-- +-- cyclical-2-out-out-back.project
4141
-- +-- cyclical-2-out-out-back-a.config
@@ -44,7 +44,7 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
4444
-- +-- etc
4545
log "checking cyclical with hops; out, out, once back"
4646
cyclical2b <- fails $ cabal' "v2-build" [ "--project-file=cyclical-2-out-out-back.project" ]
47-
assertOutputContains "cyclical import of cyclical-2-out-out-back-a.config" cyclical2b
47+
assertOutputContains "cyclical (duplicate) import of cyclical-2-out-out-back-a.config" cyclical2b
4848

4949
-- +-- cyclical-2-out-out-self.project
5050
-- +-- cyclical-2-out-out-self-a.config
@@ -53,21 +53,21 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
5353
-- +-- etc
5454
log "checking cyclical with hops; out, out to a config that imports itself"
5555
cyclical2c <- fails $ cabal' "v2-build" [ "--project-file=cyclical-2-out-out-self.project" ]
56-
assertOutputContains "cyclical import of cyclical-2-out-out-self-b.config" cyclical2c
56+
assertOutputContains "cyclical (duplicate) import of cyclical-2-out-out-self-b.config" cyclical2c
5757

5858
-- +-- noncyclical-same-filename-a.project
5959
-- +-- noncyclical-same-filename-a.config
6060
-- +-- same-filename/noncyclical-same-filename-a.config (no further imports so not cyclical)
6161
log "checking that cyclical check doesn't false-positive on same file names in different folders; hoping within a folder and then into a subfolder"
6262
cyclical3b <- cabal' "v2-build" [ "--project-file=noncyclical-same-filename-a.project" ]
63-
assertOutputDoesNotContain "cyclical import of" cyclical3b
63+
assertOutputDoesNotContain "cyclical (duplicate) import of" cyclical3b
6464

6565
-- +-- noncyclical-same-filename-b.project
6666
-- +-- same-filename/noncyclical-same-filename-b.config
6767
-- +-- noncyclical-same-filename-b.config (no further imports so not cyclical)
6868
log "checking that cyclical check doesn't false-positive on same file names in different folders; hoping into a subfolder and then back out again"
6969
cyclical3c <- cabal' "v2-build" [ "--project-file=noncyclical-same-filename-b.project" ]
70-
assertOutputDoesNotContain "cyclical import of" cyclical3c
70+
assertOutputDoesNotContain "cyclical (duplicate) import of" cyclical3c
7171

7272
-- +-- cyclical-same-filename-out-out-self.project
7373
-- +-- cyclical-same-filename-out-out-self.config
@@ -76,7 +76,7 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
7676
-- +-- etc
7777
log "checking that cyclical check catches a same file name that imports itself"
7878
cyclical4a <- fails $ cabal' "v2-build" [ "--project-file=cyclical-same-filename-out-out-self.project" ]
79-
assertOutputContains "cyclical import of same-filename/cyclical-same-filename-out-out-self.config" cyclical4a
79+
assertOutputContains "cyclical (duplicate) import of same-filename/cyclical-same-filename-out-out-self.config" cyclical4a
8080

8181
-- +-- cyclical-same-filename-out-out-backback.project
8282
-- +-- cyclical-same-filename-out-out-backback.config
@@ -85,7 +85,7 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
8585
-- +-- etc
8686
log "checking that cyclical check catches importing its importer (with the same file name)"
8787
cyclical4b <- fails $ cabal' "v2-build" [ "--project-file=cyclical-same-filename-out-out-backback.project" ]
88-
assertOutputContains "cyclical import of cyclical-same-filename-out-out-backback.project" cyclical4b
88+
assertOutputContains "cyclical (duplicate) import of cyclical-same-filename-out-out-backback.project" cyclical4b
8989

9090
-- +-- cyclical-same-filename-out-out-back.project
9191
-- +-- cyclical-same-filename-out-out-back.config
@@ -94,7 +94,7 @@ main = cabalTest . withRepo "repo" . recordMode RecordMarked $ do
9494
-- +-- etc
9595
log "checking that cyclical check catches importing its importer's importer (hopping over same file names)"
9696
cyclical4c <- fails $ cabal' "v2-build" [ "--project-file=cyclical-same-filename-out-out-back.project" ]
97-
assertOutputContains "cyclical import of cyclical-same-filename-out-out-back.config" cyclical4c
97+
assertOutputContains "cyclical (duplicate) import of cyclical-same-filename-out-out-back.config" cyclical4c
9898

9999
-- +-- hops-0.project
100100
-- +-- hops/hops-1.config

0 commit comments

Comments
 (0)