Skip to content

Commit 3dd1054

Browse files
ryanlinkclaude
andcommitted
[ANE-512] Fix Cargo analyzer reporting library as dependency of itself
The Cargo analyzer was incorrectly reporting library projects as dependencies of themselves when they had no external dependencies. This occurred because the buildGraph function treated all workspace members as direct dependencies without filtering out isolated workspace members from the final graph. The fix uses Graphing.shrink to filter out workspace members that have no external dependencies, while preserving workspace members that do have legitimate external dependencies. This maintains backward compatibility with existing workspace projects while fixing the self-dependency issue for isolated library projects. Fixes ISS-679 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent c91300c commit 3dd1054

1 file changed

Lines changed: 23 additions & 2 deletions

File tree

src/Strategy/Cargo.hs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ import Data.Functor (void)
4646
import Data.List.NonEmpty qualified as NonEmpty
4747
import Data.Map.Strict qualified as Map
4848
import Data.Maybe (catMaybes, fromMaybe, isJust)
49+
import Data.List (find)
4950
import Data.Set (Set)
51+
import Data.Set qualified as Set
5052
import Data.String.Conversion (toString, toText)
5153
import Data.Text (Text)
5254
import Data.Text qualified as Text
@@ -76,7 +78,7 @@ import Effect.Grapher (
7678
import Effect.ReadFS (ReadFS, doesFileExist, readContentsToml)
7779
import Errata (Errata (..))
7880
import GHC.Generics (Generic)
79-
import Graphing (Graphing, stripRoot)
81+
import Graphing (Graphing, shrink, stripRoot)
8082
import Path (Abs, Dir, File, Path, mkRelFile, parent, parseRelFile, toFilePath, (</>))
8183
import Text.Megaparsec (
8284
Parsec,
@@ -406,10 +408,29 @@ addEdge node = do
406408
edge parentId $ nodePkg dep
407409

408410
buildGraph :: CargoMetadata -> Graphing Dependency
409-
buildGraph meta = stripRoot $
411+
buildGraph meta = stripRoot . shrink isNotWorkspaceMember $
410412
run . withLabeling toDependency $ do
411413
traverse_ direct $ metadataWorkspaceMembers meta
412414
traverse_ addEdge $ resolvedNodes $ metadataResolve meta
415+
where
416+
-- Create a set of workspace members that have no external dependencies
417+
isolatedWorkspaceMembers = Set.fromList $ map packageKey $ filter hasNoDependencies $ metadataWorkspaceMembers meta
418+
packageKey :: PackageId -> (Text, Text)
419+
packageKey pkg = (pkgIdName pkg, pkgIdVersion pkg)
420+
421+
-- Check if a workspace member has no dependencies by looking at resolve nodes
422+
hasNoDependencies :: PackageId -> Bool
423+
hasNoDependencies pkgId =
424+
case find (\node -> resolveNodeId node == pkgId) (resolvedNodes $ metadataResolve meta) of
425+
Just node -> null (resolveNodeDeps node)
426+
Nothing -> True -- If not found in resolve, assume no dependencies
427+
428+
-- Filter out isolated workspace members only
429+
isNotWorkspaceMember :: Dependency -> Bool
430+
isNotWorkspaceMember dep =
431+
case dependencyVersion dep of
432+
Just (CEq version) -> (dependencyName dep, version) `Set.notMember` isolatedWorkspaceMembers
433+
_ -> True
413434

414435
-- | Custom Parsec type alias
415436
type PkgSpecParser a = Parsec Void Text a

0 commit comments

Comments
 (0)