Git show : view file in my usual editor, Qt Creator

92 Views Asked by At

I use Git (2.39.2.windows.1) and Qt Creator 7.0.2 on Windows 10. I would like Git to show me files at specific revisions (as in git show <revision>:<relative/path/to/file>) in the instance of Qt Creator that is currently open.

Alternatively, Qt Creator has some Git integration, but I do no see this possiblity under Extras > Git. Is there one, actually ?

The -block option of Qt Creator offers me pretty much that. If I run

qtcreator -block path/to/file.cpp

Then I get the file opened in my Qt Creator instance until I close it there. But if I set the pager for git show to be qtcreator -block then nothing happens when I run git show <file>.

I also tried the syntax qtcreator -block $1 to specify that one argument is expected fropm the caller (that would be the copy of the file at the specified revision, retrieved by Git who calls the pager), but that does nothing more, so still nothing.

2

There are 2 best solutions below

4
Andreas Louv On BEST ANSWER

Based off the comments above it sounds like specifying either the GIT_PAGER or PAGER environment variable might be what you want:

$ export GIT_PAGER='whatever'
$ git show ...

The pager is expected to read from stdin, which means that you might need to create a small wrapper script that does that and then writes the content to a temporary file:

$ cat /path/to/my/script
#!/bin/bash
tmp=$(mktemp) # You might want to tinker with this variable to indicate the filetype
cat - > "$tmp"
qtcreator -block "$tmp" # change this line to your needs
rm -- "$tmp"

Then specify the GIT_PAGER in your rc file:

export GIT_PAGER='/path/to/my/script'

Then when running git show the pager will be picked up.

$ git show ...

This however have one huge downside which is that the GIT_PAGER environment variable will be picked up by git log, git diff, et al.

Which means that you properly want to specify the pager as a config option:

$ git config --global pager.show '/path/to/my/script'

As the config name indicates this sets the pager for the "show" sub-command.

If you don't fancy bash, then I'm sure it easy to rewrite in Python, Perl, JavaScript or whatever.

1
Charles On

Spinning off of the knowledge, insights and ideas gained from @Andreas Louv, you can make a nice name for your file this way .

Here is my small command to do that, to put in your .gitconfig :

showq = "!f() { tmp=$(echo $(git rev-parse $1) | cut -c1-7)_$(basename $2) ; git show $1:$2 > "$tmp" ; qtcreator -block "$tmp" ; rm "$tmp";}; f"

OR

showq = "!f() { tmp=$(echo "$1")_$(basename $2) ; git show $1:$2 > "$tmp" ; qtcreator -block "$tmp" ; rm "$tmp";}; f"

Explaination :

suppose I want to type :

git showq HEAD^^^^^ path/to/file.c

We can either

  • Parse HEAD^^^^^ out using git parse $1 where $1 is the first argument passed to this new function showq. This outputs the full hash, say a1b2c3d4e5f67890a1b2c3d4e5f67890a1b2c3d4. Then we echo/pipe that into cut to only take the first 7 characters, as is common with hashes. This yields a1b2c3d

OR

  • Put double quotes like this

    $(echo "$1")
    

Then we put a _.

Then for the filename (argument $2), we only take the base name.

Then we run the original git show with the proper arguments and ask it to output to a file named as constructed.

Then we call Qt Creator on that file. Qt Creator shows us we are currently looking at <7 char hash OR rev-syntax>_<basename> e.g. in our example a1b2c3d_file.c OR HEAD^^^^^_file.c. Since this has the same extension, it is parsed and colored by Qt Creator as usual.

Then we remove it.

Bingo !