Content from 2016-08
Just a quick note on the JVM ecosystem since I've been wrestling with getting several different technologies to work together: It's a mess really.
The specific setup in this case is a mostly Java based project, sprinkled with some Kotlin code (which I only expect to grow in the future), using Maven as the build system. Added to that some Kotlin annotations (in lieu of using Kotlin in the first place).
Todays (and yesterdays) adventure was trying to get the Error Prone checker integrated with the existing system, which proved quite impossible, due to the fact that it's using a modified compiler(!) which conflicts with the use of Lombok annotation processing.
There are workarounds in the sense that Lombok can also be used to produce
processed Java files (instead of byte code generation), however it seems like
that process is less capable than the IDEA / internal processing and would have
me remove a lot of val
instances that didn't get their type inferred
properly, making it an arduous process.
Summing this up, the fact that these tools integrate on different levels of the "stack", while also making tinkering with it relatively hard due to byte code generation, complicates this endeavour greatly. In the end I resolved to drop the Error Prone integration in favour of the much easier to setup SonarQube platform. I also hope that annotation processing for Lombok will improve such that we don't need workarounds in case of "invisible" getters anymore, for example.
Copies of copies
As it so happens the ABCL main repository is held in Subversion, but since I'm
more productive with Git I usually use a conversion to Git via the git-svn
program. I've based my own copy off of slryus'
one, however I had to fetch and update my own
local copy since neither of us had done any fetching in quite some time. I'm
writing down some notes below to make sure I (or others) can repeat the process
in the future.
First we need a copy of an existing Git conversion.
git clone https://github.com/Ferada/abcl.git abcl-git
# or in case you have SSH access
git clone git@github.com:Ferada/abcl.git abcl-git
The master
branch should be a direct mirror of the SVN repository, i.e. only
have commits with git-svn
annotations, like
git-svn-id: http://abcl.org/svn/trunk/abcl@14851 1c010e3e-...
.
Next we want to initialise the SVN remote and fetch the new commits.
git svn init --prefix=abcl/ http://abcl.org/svn/trunk/abcl
git svn fetch -r 14791:14851
Note that the first revision in the fetch
command is the last one in the Git
master
branch and the other one is the current HEAD
of the SVN repository.
This process will take just a few moments, however while all the new commits
will be based off of the master
branch in Git, the first commit will be a
duplicate and have more changes than the existing commit in Git
.
2015-08-31 20:55 mevenson │ │ o │ │ │ ansi-test: reference new git repository
2015-07-01 04:16 mevenson o─┴─│─┴─┴─┘ abcl-asdf: fix usage with local repository <<<<
2015-07-01 04:16 mevenson │ I─┘ abcl-asdf: fix usage with local repository <<<<
2015-06-30 18:42 mevenson o abcl-asdf: correct metadata
The newly created first commit (14791 here) has lots of changes.
.dir-locals.el
CHANGES
COPYING
MANUAL
README
abcl.asd
abcl.bat.in
...
While the second, pre-existing one, has way less (and is just showing the same changes that are in the SVN commit).
contrib/abcl-asdf/abcl-asdf.asd
contrib/abcl-asdf/abcl-asdf.lisp
contrib/abcl-asdf/maven-embedder.lisp
To correct that and continue with a linear history I'm using the interactive rebase command.
git co -b test
git reset --hard abcl/git-svn
git rebase -i <commit _before_ the duplicated one>
Copy the hash of the correct, smaller commit and replace the pick ...
line
(at the top) that contains the duplicated commit with the one from the
cloned-from Git repository, then exit the editor. Once the rebase is done we
just need to update the ref for git-svn
.
git update-ref refs/remotes/abcl/git-svn test
Note the syntax. If done correctly it will be updated in e.g. tig
, if not
there'll be a new entry showing up in git show-ref
.
Lastly we want to rebase master
to get the new commits.
git co master
git co -D test
git rebase abcl/git-svn master
Which will look somewhat like this:
2016-06-13 08:06 mevenson o [master] {abcl/git-svn} {github/master} doc: note changes for abcl-1.3.4
2016-05-16 23:05 mevenson o Update to asdf-3.1.7
2016-05-16 21:43 mevenson o Update to jna-4.2.2
And push the updates.
git push origin master