Capturing "mix xref ..." output for use with a graph database?

I’d like to write a custom mix task to capture some “mix xref …” output and rework it for use with a graph database such as Neo4j. Looking at the docs for mix xref, I get the impression that it really wants to print on standard output. The only exception I see is a hard-coded option to (over)write xref_graph.dot in the current directory.

What is the cleanest way to run mix tasks and capture their output? Alternatively, should I simply extract the relevant code from mix xref? Suggestions welcome…

Maybe you can try using a project to convert .dot files into cypher statements, such as: GitHub - jexp/dot2cypher: Convert GraphViz dot files into Cypher CREATE statements

Another option is to add a CSV format that is just from,to,label, so it is easier to import and transform.

2 Likes

Thanks for the suggestions! I didn’t know about dot2cypher, but I’ll check into it. A generic format such as CSV or JSON would also make sense. (FWIW, Neo4j supports CSV as an import format.)

That said, xref’s stdout fixation is annoying. Also, writing files to hard-coded locations can cause collisions. What about adding an option to redirect output to a specified path?

mix xref is a command-line tool first and foremost. You should be able to redirect the output using standard Unix tools too.

1 Like

What exactly is the issue with running:

mix xref $other_arguments >my_file.dot

:question:

I know how to run commands and redirect their output, in the context of a shell script. However, I was thinking about doing this inside a custom Mix task. I’ve never done this before and I’m not finding any specific examples in the doc pages I’ve read.

Let’s say that I create Mix.Tasks.Foo and want to invoke the mix xref ... command in the run/1 function. Problem is, I’m not sure how to do this. For example, this looks rather convoluted to me:

def run(_args) do
  xref = ["-c", "mix xref ... > my_file.dot"]
  System.cmd("sh", xref)
  ...
end

I assume that I’m missing something really obvious. Clues, anyone?

https://hexdocs.pm/mix/1.14/Mix.Task.html#run/2

1 Like

I don’t see anything in that doc that would help out with output redirection. Could you explain what you have in mind?

In mix xref 1.16.1 you can use mix xref graph --format dot --output path/to/the/dot/file

1 Like