Repo cloner: list submodules
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import git
|
||||
from git import Repo
|
||||
from git.exc import NoSuchPathError, InvalidGitRepositoryError
|
||||
from git import RemoteProgress
|
||||
@@ -181,3 +182,37 @@ class RepoTool:
|
||||
x = hashlib.sha256(cumulative).hexdigest()
|
||||
log.debug(f"Repo fingerprint is {x}")
|
||||
return x
|
||||
|
||||
def list_submodules(self, commit: str = "HEAD") -> list:
|
||||
commit = self._repo.commit(commit)
|
||||
submodules = []
|
||||
|
||||
if '.gitmodules' in commit.tree:
|
||||
git_modules: git.Blob = commit.tree['.gitmodules']
|
||||
from io import BytesIO
|
||||
x = BytesIO(git_modules.data_stream.read())
|
||||
x.name = git_modules.name
|
||||
|
||||
parser = git.GitConfigParser(x, read_only = True)
|
||||
for section in parser.sections():
|
||||
if parser.has_option(section, "url"):
|
||||
submodules.append(parser.get_value(section, "url"))
|
||||
|
||||
return submodules
|
||||
|
||||
def list_submodules_history(self, limit_of_commits: Optional[int] = None):
|
||||
|
||||
log.info(f"Listing repository submodule history")
|
||||
iterator = self._repo.iter_commits(all = True, max_count = limit_of_commits)
|
||||
submodules = set()
|
||||
counter: int = 0
|
||||
last_status = time.time()
|
||||
status_offset = 0.5
|
||||
for commit in iterator:
|
||||
counter += 1
|
||||
commit_submodules = self.list_submodules(commit)
|
||||
submodules.update(commit_submodules)
|
||||
if time.time() >= last_status + status_offset:
|
||||
log.info(f"Submodule discovery: {counter} commits finished, {len(submodules)} discovered")
|
||||
last_status = time.time()
|
||||
return list(submodules)
|
||||
|
||||
Reference in New Issue
Block a user