@@ -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