|
16 | 16 |
|
17 | 17 | package net.virtualvoid.sbt.graph |
18 | 18 |
|
| 19 | +import java.nio.file.{ Files, Path, Paths } |
| 20 | + |
19 | 21 | import net.virtualvoid.sbt.graph.GraphTransformations.reverseGraphStartingAt |
20 | 22 | import net.virtualvoid.sbt.graph.backend.{ IvyReport, SbtUpdateReport } |
21 | 23 | import net.virtualvoid.sbt.graph.model.{ FilterRule, ModuleGraph, ModuleId } |
@@ -80,7 +82,17 @@ object DependencyGraphSettings { |
80 | 82 | moduleGraph.value, |
81 | 83 | filterRulesParser.parsed: _* |
82 | 84 | ), |
83 | | - dependencyTree := streams.value.log.info(asciiTree.evaluated), |
| 85 | + dependencyTree := { |
| 86 | + dependencyTreeOutputPathParser.parsed match { |
| 87 | + case Some(path) ⇒ |
| 88 | + val os = Files.newOutputStream(path) |
| 89 | + os.write(asciiTree.evaluated.getBytes) |
| 90 | + os.close() |
| 91 | + case _ ⇒ |
| 92 | + streams.value.log.info(asciiTree.evaluated) |
| 93 | + } |
| 94 | + |
| 95 | + }, |
84 | 96 | dependencyGraphMLFile := { target.value / "dependencies-%s.graphml".format(config.toString) }, |
85 | 97 | dependencyGraphML := dependencyGraphMLTask.value, |
86 | 98 | dependencyDotFile := { target.value / "dependencies-%s.dot".format(config.toString) }, |
@@ -174,27 +186,40 @@ object DependencyGraphSettings { |
174 | 186 | }.mkString("\n\n") |
175 | 187 | streams.log.info(output) |
176 | 188 | } |
177 | | - val shouldForceParser: State ⇒ Parser[Boolean] = { (state: State) ⇒ |
178 | | - import sbt.complete.DefaultParsers._ |
179 | 189 |
|
| 190 | + import sbt.complete.DefaultParsers._ |
| 191 | + |
| 192 | + val shouldForceParser: State ⇒ Parser[Boolean] = { (state: State) ⇒ |
180 | 193 | (Space ~> token("--force")).?.map(_.isDefined) |
181 | 194 | } |
182 | 195 |
|
| 196 | + val dependencyTreeOutputPathParser: State ⇒ Parser[Option[Path]] = { (state: State) ⇒ |
| 197 | + ( |
| 198 | + Space ~ |
| 199 | + (token("--out") | token("-o")) ~> |
| 200 | + StringBasic |
| 201 | + ) |
| 202 | + .map(Paths.get(_)) |
| 203 | + .? |
| 204 | + } |
| 205 | + |
| 206 | + val filterRulesParser_ = { |
| 207 | + (Space ~> token(StringBasic, "filter")).*.map { |
| 208 | + _.map(FilterRule(_)) |
| 209 | + } |
| 210 | + } |
| 211 | + |
183 | 212 | val filterRulesParser: Def.Initialize[State ⇒ Parser[Seq[FilterRule]]] = |
184 | 213 | resolvedScoped { ctx ⇒ |
185 | 214 | (state: State) ⇒ |
186 | | - import sbt.complete.DefaultParsers._ |
187 | | - (Space ~> token(StringBasic, "filter")).*.map { |
188 | | - _.map(FilterRule(_)) |
189 | | - } |
| 215 | + filterRulesParser_ |
190 | 216 | } |
191 | 217 |
|
192 | 218 | val artifactIdParser: Def.Initialize[State ⇒ Parser[ModuleId]] = |
193 | 219 | resolvedScoped { ctx ⇒ |
194 | 220 | (state: State) ⇒ |
195 | 221 | val graph = loadFromContext(moduleGraphStore, ctx, state) getOrElse ModuleGraph(Nil, Nil) |
196 | 222 |
|
197 | | - import sbt.complete.DefaultParsers._ |
198 | 223 | graph |
199 | 224 | .nodes |
200 | 225 | .map(_.id) |
|
0 commit comments