wtorek, grudnia 22, 2015

Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)

Bawiąc się kilkoma milionami linii kodu, które mamy w repo stwierdzam, że nic nie pobije grep'a w poszukiwaniu kodu po różnych projektach ;-)
Najpierw miałem skrypt, który leciał po liście projektów w repo, robił dla każdego z nich checkout,
później go buildował używając Mavena, a w końcu analizował przy pomocy javap.
Skrypt, który to robi wygląda tak:

import os

f = file("java_poms.txt")
lines = f.readlines()

out = open("decompiled.txt","w+")

def removeDir():
os.popen("rm -rf asources")

def choeckout(repo):
os.popen("hg clone "+repo+" asources")
print("Checkouted "+repo)

def make(repo):
os.chdir("asources")
os.popen("mvn clean compile -DskipTests=true")
res = os.path.isdir("target")
os.chdir("..")
print("Made "+repo)
return res

def analyze(repo):
f = os.popen("""javap -c $(find asources/target/classes/. | grep ".class$")""")
lines = f.readlines()
out.write("REPO:"+repo+"\n")
for line in lines:
out.write(line)
out.flush()
print("Analyzed "+repo)


for line in lines:
line = line.strip()
print(line)
choeckout(line)
buildSomething = make(line)
print buildSomething
if buildSomething:
analyze(line)
removeDir()

out.close()


Po paru godzinach biegania na jednym z serwerów zrobił mi gigantyczny plik, w którym mam zdekomplikowany do "assemblera" JVM kod naszych wszystkich aplikacji ;-)

Do tego mam jeszcze inne skrypty w Pythonie, które lecą po zdekompilowanym kodzie i np. budują mapę wszystkich miejsc gdzie są tworzone i wszystkich miejsc gdzie są używane message JMS, które dziedziczą po odpowiedniej klasie ;-)
W końcu jak szukam repo w którym jest dana klasa, to na razie po prostu szukam w tym wielkim pliku tekstowym nazwy klasy i sprawdzam jakie to repo ;-) [po to jest linia REPO: ;-)]

Sam plik java_poms.txt powstał przez puszczenie na serwerze gdzie jest zainstalowany Mercurial komendy:

find repos/ | grep ".hg" | grep "pom.xml"

i późniejszym wyrzuceniu nadmiarowych informacji.

W kolejnym odcinku, krótka opowieść o tym jak śledzić zależności między kilkuset repozytoriami ;-)


Podobne postybeta
SSD a programowanie
Jak walczyć z gigantycznym kodem w Java'ie, część 1.6 - podłe metody prywatne ;-)
Migracja z blog.pl do blogger.com
OS X po 1.5 miesiąca... chyba wolę Ubuntu ;-)
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)