Skip to content

Commit 244f4aa

Browse files
authored
Merge pull request #6681 from phadej/pr-6618
4267 Add --exact flag to the list command
2 parents 30da456 + 7168a78 commit 244f4aa

File tree

5 files changed

+47
-7
lines changed

5 files changed

+47
-7
lines changed

Cabal/Distribution/Simple/PackageIndex.hs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ module Distribution.Simple.PackageIndex (
7777
searchByName,
7878
SearchResult(..),
7979
searchByNameSubstring,
80+
searchByNameExact,
8081

8182
-- ** Bulk queries
8283
allPackages,
@@ -526,16 +527,25 @@ data SearchResult a = None | Unambiguous a | Ambiguous [a]
526527
-- That is, all packages that contain the given string in their name.
527528
--
528529
searchByNameSubstring :: PackageIndex a -> String -> [a]
529-
searchByNameSubstring index searchterm =
530+
searchByNameSubstring =
531+
searchByNameInternal False
532+
533+
searchByNameExact :: PackageIndex a -> String -> [a]
534+
searchByNameExact =
535+
searchByNameInternal True
536+
537+
searchByNameInternal :: Bool -> PackageIndex a -> String -> [a]
538+
searchByNameInternal exactMatch index searchterm =
530539
[ pkg
531540
-- Don't match internal packages
532541
| ((pname, LMainLibName), pvers) <- Map.toList (packageIdIndex index)
533-
, lsearchterm `isInfixOf` lowercase (unPackageName pname)
542+
, if exactMatch
543+
then searchterm == unPackageName pname
544+
else lsearchterm `isInfixOf` lowercase (unPackageName pname)
534545
, pkgs <- Map.elems pvers
535546
, pkg <- pkgs ]
536547
where lsearchterm = lowercase searchterm
537548

538-
539549
--
540550
-- * Special queries
541551
--

cabal-install/Distribution/Client/List.hs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ getPkgList verbosity packageDBs repoCtxt comp progdb listFlags pats = do
112112
[(PackageName, [Installed.InstalledPackageInfo], [UnresolvedSourcePackage])]
113113
pkgsInfoMatching =
114114
let matchingInstalled = matchingPackages
115-
InstalledPackageIndex.searchByNameSubstring
115+
ipiSearch
116116
installedPkgIndex
117117
matchingSource = matchingPackages
118118
(\ idx n ->
119119
concatMap snd
120-
(PackageIndex.searchByNameSubstring idx n))
120+
(piSearch idx n))
121121
sourcePkgIndex
122122
in mergePackages matchingInstalled matchingSource
123123

@@ -131,6 +131,11 @@ getPkgList verbosity packageDBs repoCtxt comp progdb listFlags pats = do
131131
return matches
132132
where
133133
onlyInstalled = fromFlag (listInstalled listFlags)
134+
exactMatch = fromFlag (listExactMatch listFlags)
135+
ipiSearch | exactMatch = InstalledPackageIndex.searchByNameExact
136+
| otherwise = InstalledPackageIndex.searchByNameSubstring
137+
piSearch | exactMatch = PackageIndex.searchByNameExact
138+
| otherwise = PackageIndex.searchByNameSubstring
134139
matchingPackages search index =
135140
[ pkg
136141
| pat <- pats

cabal-install/Distribution/Client/Setup.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,7 @@ instance Semigroup GetFlags where
16241624
data ListFlags = ListFlags {
16251625
listInstalled :: Flag Bool,
16261626
listSimpleOutput :: Flag Bool,
1627+
listExactMatch :: Flag Bool,
16271628
listVerbosity :: Flag Verbosity,
16281629
listPackageDBs :: [Maybe PackageDB]
16291630
} deriving Generic
@@ -1632,6 +1633,7 @@ defaultListFlags :: ListFlags
16321633
defaultListFlags = ListFlags {
16331634
listInstalled = Flag False,
16341635
listSimpleOutput = Flag False,
1636+
listExactMatch = Flag False,
16351637
listVerbosity = toFlag normal,
16361638
listPackageDBs = []
16371639
}
@@ -1667,6 +1669,10 @@ listCommand = CommandUI {
16671669
"Print in a easy-to-parse format"
16681670
listSimpleOutput (\v flags -> flags { listSimpleOutput = v })
16691671
trueArg
1672+
, option [] ["exact"]
1673+
"Print only exact match"
1674+
listExactMatch (\v flags -> flags { listExactMatch = v })
1675+
trueArg
16701676

16711677
, option "" ["package-db"]
16721678
( "Append the given package database to the list of package"

cabal-install/Distribution/Solver/Types/PackageIndex.hs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ module Distribution.Solver.Types.PackageIndex (
3939
searchByName,
4040
SearchResult(..),
4141
searchByNameSubstring,
42+
searchByNameExact,
4243

4344
-- ** Bulk queries
4445
allPackages,
@@ -312,9 +313,23 @@ data SearchResult a = None | Unambiguous a | Ambiguous [a]
312313
--
313314
searchByNameSubstring :: PackageIndex pkg
314315
-> String -> [(PackageName, [pkg])]
315-
searchByNameSubstring (PackageIndex m) searchterm =
316+
searchByNameSubstring =
317+
searchByNameInternal False
318+
319+
searchByNameExact :: PackageIndex pkg
320+
-> String -> [(PackageName, [pkg])]
321+
searchByNameExact =
322+
searchByNameInternal True
323+
324+
searchByNameInternal :: Bool
325+
-> PackageIndex pkg
326+
-> String -> [(PackageName, [pkg])]
327+
searchByNameInternal exactMatch (PackageIndex m) searchterm =
316328
[ pkgs
317329
| pkgs@(pname, _) <- Map.toList m
318-
, lsearchterm `isInfixOf` lowercase (unPackageName pname) ]
330+
, if exactMatch
331+
then searchterm == unPackageName pname
332+
else lsearchterm `isInfixOf` lowercase (unPackageName pname)
333+
]
319334
where
320335
lsearchterm = lowercase searchterm

changelog.d/issue-4267

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
synopsis: Add --exact flag to the list command
2+
packages: cabal-install
3+
prs: #6618
4+
issues: #4267

0 commit comments

Comments
 (0)