@@ -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 )
@@ -71,7 +73,7 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
7173
7274 Def .task {
7375 val manifests : Map [String , Manifest ] = projectRefs
74- .map(ref => ( ref / githubDependencyManifest). ? )
76+ .map(ref => ref / githubDependencyManifest)
7577 .join
7678 .value
7779 .collect { case Some (manifest) => (manifest.name, manifest) }
@@ -95,7 +97,7 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
9597 ! ignored
9698 }
9799
98- private def manifestTask : Def .Initialize [Task [Manifest ]] = Def .task {
100+ private def manifestTask : Def .Initialize [Task [Option [ Manifest ] ]] = Def .task {
99101 // updateFull is needed to have information about callers and reconstruct dependency tree
100102 val reportResult = Keys .updateFull.result.value
101103 val projectID = Keys .projectID.value
@@ -105,66 +107,74 @@ object GithubDependencyGraphPlugin extends AutoPlugin {
105107 val allDirectDependencies = Keys .allDependencies.value
106108 val baseDirectory = Keys .baseDirectory.value
107109 val logger = Keys .streams.value.log
110+ val onResolveFailure = Keys .state.value.attributes(githubSubmitInputKey).onResolveFailure
108111
109112 def getReference (module : ModuleID ): String =
110113 crossVersion(module)
111114 .withConfigurations(None )
112115 .withExtraAttributes(Map .empty)
113116 .toString
114117
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 {
118+ reportResult match {
120119 case Inc (cause) =>
121120 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)
121+ val message = s " Failed to resolve the dependencies of $moduleName"
122+ onResolveFailure match {
123+ case Some (OnFailure .warning) =>
124+ logger.warn(message)
125+ None
126+ case _ =>
127+ logger.error(message)
128+ throw cause
129+ }
130+ case Value (report) =>
131+ val alreadySeen = mutable.Set [String ]()
132+ val moduleReports = mutable.Buffer [(ModuleReport , ConfigRef )]()
133+ val allDependencies = mutable.Buffer [(String , String )]()
134+
135+ for {
136+ configReport <- report.configurations
137+ moduleReport <- configReport.modules
138+ moduleRef = getReference(moduleReport.module)
139+ if ! moduleReport.evicted && ! alreadySeen.contains(moduleRef)
140+ } {
141+ alreadySeen += moduleRef
142+ moduleReports += (moduleReport -> configReport.configuration)
143+ for (caller <- moduleReport.callers)
144+ allDependencies += (getReference(caller.caller) -> moduleRef)
161145 }
162146
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)
147+ val allDependenciesMap : Map [String , Vector [String ]] = allDependencies.view
148+ .groupBy(_._1)
149+ .mapValues {
150+ _.map { case (_, dep) => dep }.toVector
151+ }
152+ val allDirectDependenciesRefs : Set [String ] = allDirectDependencies.map(getReference).toSet
153+
154+ val resolved =
155+ for ((moduleReport, configRef) <- moduleReports)
156+ yield {
157+ val moduleRef = getReference(moduleReport.module)
158+ val packageUrl = formatPackageUrl(moduleReport)
159+ val dependencies = allDependenciesMap.getOrElse(moduleRef, Vector .empty)
160+ val relationship =
161+ if (allDirectDependenciesRefs.contains(moduleRef)) DependencyRelationship .direct
162+ else DependencyRelationship .indirect
163+ val scope =
164+ if (isRuntime(configRef)) DependencyScope .runtime
165+ else DependencyScope .development
166+ val metadata = Map (" config" -> JString (configRef.name))
167+ val node = DependencyNode (packageUrl, metadata, Some (relationship), Some (scope), dependencies)
168+ (moduleRef -> node)
169+ }
170+
171+ val projectModuleRef = getReference(projectID)
172+ // TODO: find exact build file for this project
173+ val file = githubapi.FileInfo (" build.sbt" )
174+ val metadata = Map (" baseDirectory" -> JString (baseDirectory.toString))
175+ val manifest = githubapi.Manifest (projectModuleRef, file, metadata, resolved.toMap)
176+ Some (manifest)
177+ }
168178 }
169179
170180 private def formatPackageUrl (moduleReport : ModuleReport ): String = {
0 commit comments