1 Commits

Author SHA1 Message Date
3d1684f01b Don't calculate diffs ....
Instead of calculating diffs, just apply the revision to the branch
as-is. If things don't match, update them. Done.

Problems happens if there are devel project changes and histories
are no longer linear and the diffs are not calculated properly.
eg. trytond_stock_lot devel branch was imported incorrectly
2024-06-07 16:25:17 +02:00
2 changed files with 46 additions and 21 deletions

View File

@ -85,7 +85,7 @@ class Git:
"""Checkout into the branch HEAD"""
new_branch = False
if branch not in self.branches():
self.git_run(["switch", "-q", "--orphan", branch])
self.git_run(["branch", "-q", branch, "HEAD"])
new_branch = True
else:
ref = f"refs/heads/{branch}"
@ -180,13 +180,7 @@ class Git:
# logging.warning(f"Error removing file {path}: {e}")
def add(self, filename):
self.git_run(["add", ":(literal)" + filename])
def add_default_gitignore(self):
if not (self.path / ".gitignore").exists():
with (self.path / ".gitignore").open("w") as f:
f.write(".osc\n")
self.add(".gitignore")
self.git_run(["add", filename])
def add_default_lfs_gitattributes(self, force=False):
if not (self.path / ".gitattributes").exists() or force:
@ -241,7 +235,7 @@ class Git:
def remove(self, file: pathlib.Path):
self.git_run(
["rm", "-q", "-f", "--ignore-unmatch", ":(literal)" + file.name],
["rm", "-q", "-f", "--ignore-unmatch", file.name],
)
patterns = self.get_specific_lfs_gitattributes()
if file.name in patterns:
@ -277,7 +271,7 @@ class Git:
["remote"],
stdout=subprocess.PIPE,
).stdout.decode("utf-8"):
logging.warning("Not pushing to remote because no 'origin' configured")
logger.warning("Not pushing to remote because no 'origin' configured")
return
cmd = ["push"]

View File

@ -2,6 +2,8 @@ import logging
import os
import yaml
from hashlib import md5
from pathlib import Path
from lib.binary import is_binary_or_large
from lib.db import DB
@ -86,11 +88,6 @@ class GitExporter:
logging.debug(f"Committing {flat}")
self.commit_flat(flat, branch_state)
# make sure that we create devel branch
if not branch_state["devel"]:
logging.debug("force creating devel")
self.git.set_branch_head("devel", self.git.branch_head("factory"))
self.git.push(force=True)
def run_gc(self):
@ -138,6 +135,12 @@ class GitExporter:
return True
return flat.parent1 == branch_state[flat.branch]
def file_md5(self, file):
m = md5()
with open(file, 'rb') as f:
m.update(f.read())
return m.hexdigest()
def commit_flat(self, flat, branch_state):
parents = []
self.git.checkout(flat.branch)
@ -155,13 +158,41 @@ class GitExporter:
# create file if not existant
self.git.add_default_lfs_gitattributes(force=False)
self.git.add_default_gitignore()
to_download, to_delete = flat.commit.calc_delta(branch_state[flat.branch])
for file in to_delete:
self.git.remove(file)
for file, size, md5 in to_download:
self.commit_file(flat, file, size, md5)
new_files = flat.commit.files_list()
cur_files = os.listdir(self.git.path)
for cf in cur_files:
if cf[0] == '.':
continue
found = False
for nf in new_files:
if nf['name'] == cf:
found = True
break
if found:
# check if file is modified
file_path = self.git.path.joinpath(cf)
stat = file_path.stat()
if stat.st_size != nf['size'] or self.file_md5(file_path) != nf['md5']:
logging.debug(f"updating {file_path.name}")
self.commit_file(flat, Path(cf), nf['size'], nf['md5'])
else:
logging.debug(f"leaving {file_path.name}")
else:
# file not exist in new commit
self.git.remove(Path(cf))
# new files?
for file in new_files:
found = False
for cf in cur_files:
if file['name'] == cf:
found = True
break
if not found:
self.commit_file(flat, Path(file['name']), file['size'], file['md5'])
commit = self.git.commit(
flat.user.realname,