Follow links during exports

If package is linked, we need to follow the link and export the
linked package instead.
This commit is contained in:
2025-12-15 17:37:26 +01:00
parent aa9ba6fadb
commit 0951f26b6c
3 changed files with 24 additions and 5 deletions

View File

@@ -42,11 +42,16 @@ PROJECTS = [
] ]
def export_package(project, package, repodir, cachedir, gc): def export_package(project, package, repodir, cachedir, gc, importer:Importer):
print(f"exporting {project}/{package} to {repodir}")
exporter = GitExporter(URL_OBS, project, package, repodir, cachedir) exporter = GitExporter(URL_OBS, project, package, repodir, cachedir)
exporter.set_gc_interval(gc) exporter.set_gc_interval(gc)
exporter.export_as_git() if not exporter.export_as_git():
link = importer.find_linked_package(project, package)
if link is not None:
(project, package) = link
print(f" -> {project}/{package}")
export_package(project, package, repodir, cachedir, gc, importer)
def main(): def main():
parser = argparse.ArgumentParser(description="OBS history importer into git") parser = argparse.ArgumentParser(description="OBS history importer into git")
@@ -120,7 +125,7 @@ def main():
importer.import_into_db() importer.import_into_db()
for package in args.packages: for package in args.packages:
if not importer.package_with_scmsync(args.project, package): if not importer.package_with_scmsync(args.project, package):
export_package(args.project, package, args.repodir, args.cachedir, args.gc) export_package(args.project, package, args.repodir, args.cachedir, args.gc, importer)
else: else:
logging.debug(f"{args.project}/{package} has scmsync links - skipping export") logging.debug(f"{args.project}/{package} has scmsync links - skipping export")

View File

@@ -135,7 +135,8 @@ class GitExporter:
added_commits = False added_commits = False
if tree == None: # eg. python-M2Crypto errors if tree == None: # eg. python-M2Crypto errors
return # fall-back to linked project
return False
flats = tree.as_flat_list() flats = tree.as_flat_list()
branch_state = {"factory": None, "devel": None} branch_state = {"factory": None, "devel": None}
left_to_commit = self.check_repo_state(flats, branch_state, "factory") left_to_commit = self.check_repo_state(flats, branch_state, "factory")
@@ -186,6 +187,7 @@ class GitExporter:
#if added_commits: #if added_commits:
# self.git.push(force=True) # self.git.push(force=True)
return True
def run_gc(self): def run_gc(self):
self.gc_cnt = self.gc_interval self.gc_cnt = self.gc_interval

View File

@@ -79,6 +79,18 @@ class Importer:
(rev.dbid, linked_rev.dbid), (rev.dbid, linked_rev.dbid),
) )
def find_linked_package(self, project, package) -> (tuple[str,str]|None):
with self.db.cursor() as cur:
cur.execute(
"""SELECT DISTINCT l.project, l.package from links l JOIN revisions r
on r.id=l.revision_id WHERE r.project=%s AND r.package=%s""",
(project, package),
)
row = cur.fetchone()
if row is not None:
return row
return None
def fetch_all_linked_packages(self, project, package): def fetch_all_linked_packages(self, project, package):
with self.db.cursor() as cur: with self.db.cursor() as cur:
cur.execute( cur.execute(