@@ -28,7 +28,9 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
2828 val githubSubmitInputKey : AttributeKey [SubmitInput ] = AttributeKey (" githubSubmitInput" )
2929 val githubManifestsKey : AttributeKey [Map [String , githubapi.Manifest ]] = AttributeKey (" githubDependencyManifests" )
3030 val githubProjectsKey : AttributeKey [Seq [ProjectRef ]] = AttributeKey (" githubProjectRefs" )
31- val githubDependencyManifest : TaskKey [githubapi.Manifest ] = taskKey(" The dependency manifest of the project" )
31+ val githubDependencyManifest : TaskKey [Option [githubapi.Manifest ]] = taskKey(
32+ " The dependency manifest of the project"
33+ )
3234 val githubStoreDependencyManifests : InputKey [StateTransform ] =
3335 inputKey(" Store the dependency manifests of all projects of a Scala version in the attribute map." )
3436 .withRank(KeyRanks .DTask )
@@ -74,6 +76,7 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
7476 .map(ref => (ref / githubDependencyManifest).? )
7577 .join
7678 .value
79+ .flatten
7780 .collect { case Some (manifest) => (manifest.name, manifest) }
7881 .toMap
7982 StateTransform { state =>
@@ -95,7 +98,7 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
9598 ! ignored
9699 }
97100
98- private def manifestTask : Def .Initialize [Task [Manifest ]] = Def .task {
101+ private def manifestTask : Def .Initialize [Task [Option [ Manifest ] ]] = Def .task {
99102 // updateFull is needed to have information about callers and reconstruct dependency tree
100103 val reportResult = Keys .updateFull.result.value
101104 val projectID = Keys .projectID.value
@@ -105,66 +108,74 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
105108 val allDirectDependencies = Keys .allDependencies.value
106109 val baseDirectory = Keys .baseDirectory.value
107110 val logger = Keys .streams.value.log
111+ val onResolveFailure = Keys .state.value.attributes(githubSubmitInputKey).onResolveFailure
108112
109113 def getReference (module : ModuleID ): String =
110114 crossVersion(module)
111115 .withConfigurations(None )
112116 .withExtraAttributes(Map .empty)
113117 .toString
114118
115- val alreadySeen = mutable.Set [String ]()
116- val moduleReports = mutable.Buffer [(ModuleReport , ConfigRef )]()
117- val allDependencies = mutable.Buffer [(String , String )]()
118-
119- val report = reportResult match {
119+ reportResult match {
120120 case Inc (cause) =>
121121 val moduleName = crossVersion(projectID).name
122- logger.error(s " Failed to resolve the dependencies of $moduleName" )
123- throw cause
124- case Value (report) => report
125- }
126-
127- for {
128- configReport <- report.configurations
129- moduleReport <- configReport.modules
130- moduleRef = getReference(moduleReport.module)
131- if ! moduleReport.evicted && ! alreadySeen.contains(moduleRef)
132- } {
133- alreadySeen += moduleRef
134- moduleReports += (moduleReport -> configReport.configuration)
135- for (caller <- moduleReport.callers)
136- allDependencies += (getReference(caller.caller) -> moduleRef)
137- }
138-
139- val allDependenciesMap : Map [String , Vector [String ]] = allDependencies.view
140- .groupBy(_._1)
141- .mapValues {
142- _.map { case (_, dep) => dep }.toVector
143- }
144- val allDirectDependenciesRefs : Set [String ] = allDirectDependencies.map(getReference).toSet
145-
146- val resolved =
147- for ((moduleReport, configRef) <- moduleReports)
148- yield {
149- val moduleRef = getReference(moduleReport.module)
150- val packageUrl = formatPackageUrl(moduleReport)
151- val dependencies = allDependenciesMap.getOrElse(moduleRef, Vector .empty)
152- val relationship =
153- if (allDirectDependenciesRefs.contains(moduleRef)) DependencyRelationship .direct
154- else DependencyRelationship .indirect
155- val scope =
156- if (isRuntime(configRef)) DependencyScope .runtime
157- else DependencyScope .development
158- val metadata = Map (" config" -> JString (configRef.name))
159- val node = DependencyNode (packageUrl, metadata, Some (relationship), Some (scope), dependencies)
160- (moduleRef -> node)
122+ val message = s " Failed to resolve the dependencies of $moduleName"
123+ onResolveFailure match {
124+ case Some (OnFailure .warning) =>
125+ logger.warn(message)
126+ None
127+ case _ =>
128+ logger.error(message)
129+ throw cause
130+ }
131+ case Value (report) =>
132+ val alreadySeen = mutable.Set [String ]()
133+ val moduleReports = mutable.Buffer [(ModuleReport , ConfigRef )]()
134+ val allDependencies = mutable.Buffer [(String , String )]()
135+
136+ for {
137+ configReport <- report.configurations
138+ moduleReport <- configReport.modules
139+ moduleRef = getReference(moduleReport.module)
140+ if ! moduleReport.evicted && ! alreadySeen.contains(moduleRef)
141+ } {
142+ alreadySeen += moduleRef
143+ moduleReports += (moduleReport -> configReport.configuration)
144+ for (caller <- moduleReport.callers)
145+ allDependencies += (getReference(caller.caller) -> moduleRef)
161146 }
162147
163- val projectModuleRef = getReference(projectID)
164- // TODO: find exact build file for this project
165- val file = githubapi.FileInfo (" build.sbt" )
166- val metadata = Map (" baseDirectory" -> JString (baseDirectory.toString))
167- githubapi.Manifest (projectModuleRef, file, metadata, resolved.toMap)
148+ val allDependenciesMap : Map [String , Vector [String ]] = allDependencies.view
149+ .groupBy(_._1)
150+ .mapValues {
151+ _.map { case (_, dep) => dep }.toVector
152+ }
153+ val allDirectDependenciesRefs : Set [String ] = allDirectDependencies.map(getReference).toSet
154+
155+ val resolved =
156+ for ((moduleReport, configRef) <- moduleReports)
157+ yield {
158+ val moduleRef = getReference(moduleReport.module)
159+ val packageUrl = formatPackageUrl(moduleReport)
160+ val dependencies = allDependenciesMap.getOrElse(moduleRef, Vector .empty)
161+ val relationship =
162+ if (allDirectDependenciesRefs.contains(moduleRef)) DependencyRelationship .direct
163+ else DependencyRelationship .indirect
164+ val scope =
165+ if (isRuntime(configRef)) DependencyScope .runtime
166+ else DependencyScope .development
167+ val metadata = Map (" config" -> JString (configRef.name))
168+ val node = DependencyNode (packageUrl, metadata, Some (relationship), Some (scope), dependencies)
169+ (moduleRef -> node)
170+ }
171+
172+ val projectModuleRef = getReference(projectID)
173+ // TODO: find exact build file for this project
174+ val file = githubapi.FileInfo (" build.sbt" )
175+ val metadata = Map (" baseDirectory" -> JString (baseDirectory.toString))
176+ val manifest = githubapi.Manifest (projectModuleRef, file, metadata, resolved.toMap)
177+ Some (manifest)
178+ }
168179 }
169180
170181 private def formatPackageUrl (moduleReport : ModuleReport ): String = {
0 commit comments