diff options
Diffstat (limited to 'b4/diff.py')
-rw-r--r-- | b4/diff.py | 112 |
1 files changed, 2 insertions, 110 deletions
@@ -19,114 +19,6 @@ from tempfile import mkstemp logger = b4.logger -def make_fake_commit_range(gitdir, lser): - start_commit = end_commit = None - # Do we have it in cache already? - cachedir = b4.get_cache_dir() - # Use the msgid of the first non-None patch in the series - msgid = None - for lmsg in lser.patches: - if lmsg is not None: - msgid = lmsg.msgid - break - if msgid is None: - logger.critical('Cannot operate on an empty series') - return None, None - cachefile = os.path.join(cachedir, '%s.fakeam' % urllib.parse.quote_plus(msgid)) - if os.path.exists(cachefile): - stalecache = False - with open(cachefile, 'r') as fh: - cachedata = fh.read() - chunks = cachedata.strip().split() - if len(chunks) == 2: - start_commit, end_commit = chunks - else: - stalecache = True - if start_commit is not None and end_commit is not None: - # Make sure they are still there - ecode, out = b4.git_run_command(gitdir, ['cat-file', '-e', start_commit]) - if ecode > 0: - stalecache = True - else: - ecode, out = b4.git_run_command(gitdir, ['cat-file', '-e', end_commit]) - if ecode > 0: - stalecache = True - else: - logger.debug('Using previously generated range') - return start_commit, end_commit - - if stalecache: - logger.debug('Stale cache for [v%s] %s', lser.revision, lser.subject) - os.unlink(cachefile) - - logger.info('Preparing fake-am for v%s: %s', lser.revision, lser.subject) - with b4.git_temp_worktree(gitdir): - # We are in a temporary chdir at this time, so writing to a known file should be safe - mbxf = '.__git-am__' - mbx = mailbox.mbox(mbxf) - # Logic largely borrowed from gj_tools - seenfiles = set() - for lmsg in lser.patches[1:]: - logger.debug('Looking at %s', lmsg.full_subject) - lmsg.load_hashes() - if not len(lmsg.blob_indexes): - logger.critical('ERROR: some patches do not have indexes') - logger.critical(' automatic range-diff would be misleading') - return None, None - for fn, fi in lmsg.blob_indexes: - if fn in seenfiles: - # We already processed this file, so this blob won't match - continue - seenfiles.add(fn) - if set(fi) == {'0'}: - # New file creation, nothing to do here - logger.debug(' New file: %s', fn) - continue - # Try to grab full ref_id of this hash - ecode, out = b4.git_run_command(gitdir, ['rev-parse', fi]) - if ecode > 0: - logger.critical(' ERROR: Could not find matching blob for %s (%s)', fn, fi) - # TODO: better handling - return None, None - logger.debug(' Found matching blob for: %s', fn) - fullref = out.strip() - gitargs = ['update-index', '--add', '--cacheinfo', f'0644,{fullref},{fn}'] - ecode, out = b4.git_run_command(None, gitargs) - if ecode > 0: - logger.critical(' ERROR: Could not run update-index for %s (%s)', fn, fullref) - return None, None - mbx.add(lmsg.msg.as_string(policy=b4.emlpolicy).encode('utf-8')) - - mbx.close() - ecode, out = b4.git_run_command(None, ['write-tree']) - if ecode > 0: - logger.critical('ERROR: Could not write fake-am tree') - return None, None - treeid = out.strip() - # At this point we have a worktree with files that should cleanly receive a git am - gitargs = ['commit-tree', treeid + '^{tree}', '-F', '-'] - ecode, out = b4.git_run_command(None, gitargs, stdin='Initial fake commit'.encode('utf-8')) - if ecode > 0: - logger.critical('ERROR: Could not commit-tree') - return None, None - start_commit = out.strip() - b4.git_run_command(None, ['reset', '--hard', start_commit]) - ecode, out = b4.git_run_command(None, ['am', mbxf]) - if ecode > 0: - logger.critical('ERROR: Could not fake-am version %s', lser.revision) - return None, None - ecode, out = b4.git_run_command(None, ['rev-parse', 'HEAD']) - end_commit = out.strip() - logger.info(' range: %.12s..%.12s', start_commit, end_commit) - - with open(cachefile, 'w') as fh: - logger.debug('Saving into cache: %s', cachefile) - logger.debug(' %s..%s', start_commit, end_commit) - fh.write(f'{start_commit} {end_commit}\n') - - return start_commit, end_commit - - def diff_same_thread_series(cmdargs): msgid = b4.get_msgid(cmdargs) wantvers = cmdargs.wantvers @@ -221,13 +113,13 @@ def main(cmdargs): sys.exit(1) # Prepare the lower fake-am range - lsc, lec = make_fake_commit_range(cmdargs.gitdir, lser) + lsc, lec = lser.make_fake_am_range(gitdir=cmdargs.gitdir) if lsc is None or lec is None: logger.critical('---') logger.critical('Could not create fake-am range for lower series v%s', lser.revision) sys.exit(1) # Prepare the upper fake-am range - usc, uec = make_fake_commit_range(cmdargs.gitdir, user) + usc, uec = user.make_fake_am_range(gitdir=cmdargs.gitdir) if usc is None or uec is None: logger.critical('---') logger.critical('Could not create fake-am range for upper series v%s', user.revision) |