103 lines
3.3 KiB
Python
103 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
|
|
# Dep: GitPython
|
|
|
|
import time
|
|
from typing import Any
|
|
from git import Repo
|
|
from pathlib import Path
|
|
|
|
import json
|
|
|
|
SOURCES = {
|
|
"a3e": "https://github.com/tanzirul/a3e",
|
|
"a5": "https://github.com/tvidas/a5",
|
|
"adagio": "https://github.com/hgascon/adagio",
|
|
"amandroid": "https://github.com/arguslab/Argus-SAF",
|
|
"anadroid": "https://github.com/maggieddie/pushdownoo",
|
|
"androguard": "https://github.com/androguard/androguard/",
|
|
"apparecium": "https://github.com/askk/apparecium",
|
|
"blueseal": "https://github.com/ub-rms/blueseal",
|
|
"choi_et_al": "https://github.com/kwanghoon/JavaAnalysis",
|
|
"didfail": "https://bitbucket.org/wklieber/didfail.git",
|
|
"droidsafe": "https://github.com/MIT-PAC/droidsafe-src",
|
|
"flowdroid": "https://github.com/secure-software-engineering/FlowDroid",
|
|
"gator": None, # "http://web.cse.ohio-state.edu/presto/software/gator/",
|
|
"ic3": "https://github.com/siis/ic3",
|
|
"iccta": "https://github.com/lilicoding/soot-infoflow-android-iccta.git",
|
|
"lotrack": "https://github.com/MaxLillack/Lotrack",
|
|
"mallodroid": "https://github.com/sfahl/mallodroid",
|
|
"redexer": "https://github.com/plum-umd/redexer",
|
|
"saaf": "https://github.com/SAAF-Developers/saaf",
|
|
"thresher": "https://github.com/cuplv/thresher",
|
|
"thresher": "https://github.com/cuplv/thresher",
|
|
"wognsen_et_al": "https://bitbucket.org/erw/dalvik-bytecode-analysis-tool.git",
|
|
}
|
|
|
|
|
|
# git clone --filter=blob:none --no-checkout --single-branch --branch master git://some.repo.git .
|
|
|
|
|
|
def rm_tree(path: Path):
|
|
"""Delete a whole tree from the file system"""
|
|
if path.is_file():
|
|
path.unlink()
|
|
else:
|
|
for child in path.iterdir():
|
|
rm_tree(child)
|
|
path.rmdir()
|
|
|
|
|
|
def get_nb_y_wo_commit(name, src) -> dict[str, Any]:
|
|
p = Path("/") / "tmp" / "git_compute_years_witout_commit"
|
|
p.mkdir(exist_ok=True)
|
|
repo_path = p / name
|
|
repo = Repo.clone_from(
|
|
src, repo_path, multi_options=["--filter=blob:none", "--no-checkout"]
|
|
)
|
|
for ref in repo.remote().refs:
|
|
repo.git.fetch(
|
|
"origin", "/".join(str(ref).split("/")[1:]), "--filter=blob:none"
|
|
)
|
|
years = set()
|
|
for c in repo.iter_commits("--all"):
|
|
years.add(time.gmtime(c.authored_date).tm_year)
|
|
first_year = min(years)
|
|
current_year = time.localtime().tm_year
|
|
nb_y_wo_commit = 0
|
|
for y in range(first_year, current_year + 1):
|
|
if y not in years:
|
|
nb_y_wo_commit += 1
|
|
print(f"Year of the first commit: {first_year}")
|
|
print(
|
|
f"NB of years without commit from {first_year} to {current_year}: {nb_y_wo_commit}"
|
|
)
|
|
|
|
rm_tree(repo_path)
|
|
return {
|
|
"name": name,
|
|
"src": src,
|
|
"year_first_commit": first_year,
|
|
"year_wo_commit": nb_y_wo_commit,
|
|
}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
results = [
|
|
{
|
|
"name": "gator",
|
|
"src": "http://web.cse.ohio-state.edu/presto/software/gator/",
|
|
"year_first_commit": 2014,
|
|
"year_wo_commit": 4,
|
|
}
|
|
]
|
|
for tool in SOURCES:
|
|
src = SOURCES[tool]
|
|
if src is None:
|
|
print(f"{tool}: Not a git repo")
|
|
else:
|
|
print(f"{tool}:")
|
|
results.append(get_nb_y_wo_commit(tool, src))
|
|
print()
|
|
|
|
print(json.dumps(results)) # TODO: write in a format good for latex
|