from email.message import Message
from ... import (
diff,
errors,
)
from breezy.foreign import foreign_vcs_registry
from io import BytesIO
import time
def write_dep3_bug_line(message, bug_url, status):
if status != "fixed":
return
if bug_url.startswith("http://bugs.debian.org/"):
message.add_header("Bug-Debian", bug_url)
else:
message.add_header("Bug", bug_url)
def write_dep3_patch_header(
f, description=None, origin=None, forwarded=None,
bugs=None, authors=None, revision_id=None, last_update=None,
applied_upstream=None):
header = Message()
if description is not None:
description = description.strip("\n")
description = description.replace("\n\n", "\n.\n")
description = description.replace("\n", "\n ")
header["Description"] = description
if origin is not None:
header.add_header("Origin", origin)
if forwarded is not None:
header.add_header("Forwarded", forwarded)
if authors is not None:
for author in authors:
header.add_header("Author", author)
if bugs is not None:
for bug_url, status in bugs:
write_dep3_bug_line(header, bug_url, status)
if last_update is not None:
header.add_header(
"Last-Update",
time.strftime("%Y-%m-%d", time.gmtime(last_update)))
if applied_upstream is not None:
header.add_header("Applied-Upstream", applied_upstream)
if revision_id is not None:
try:
(foreign_revid, mapping) = foreign_vcs_registry.parse_revision_id(
revision_id)
except errors.InvalidRevisionId:
header.add_header("X-Bzr-Revision-Id", revision_id.decode('utf-8'))
else:
if mapping.vcs.abbreviation == "git":
header.add_header(
"X-Git-Commit", foreign_revid.decode('utf-8'))
f.write(str(header))
def gather_bugs_and_authors(repository, interesting_revision_ids):
authors = set()
bugs = set()
last_update = -0.0
for rev in repository.get_revisions(interesting_revision_ids):
last_update = max(rev.timestamp, last_update)
authors.update(rev.get_apparent_authors())
bugs.update(rev.iter_bugs())
if last_update == -0.0:
last_update = None
return (bugs, authors, last_update)
def determine_applied_upstream(
upstream_branch, feature_branch, feature_revid=None):
if feature_revid is None:
feature_revid = feature_branch.last_revision()
upstream_graph = feature_branch.repository.get_graph(
upstream_branch.repository)
merger = upstream_graph.find_lefthand_merger(
feature_revid, upstream_branch.last_revision())
if merger is not None:
try:
(foreign_revid, mapping) = foreign_vcs_registry.parse_revision_id(
merger)
except errors.InvalidRevisionId:
pass
else:
if mapping.vcs.abbreviation == 'git':
return "merged in commit {}".format(
foreign_revid.decode('ascii')[:7])
return "merged in revision {}".format(".".join(
str(x)
for x in upstream_branch.revision_id_to_dotted_revno(merger)))
else:
return "no"
def determine_forwarded(upstream_branch, feature_branch, feature_revid):
return None
def describe_origin(branch, revid):
public_branch_url = branch.get_public_branch()
if public_branch_url is not None:
try:
(foreign_revid, mapping) = foreign_vcs_registry.parse_revision_id(
revid)
except errors.InvalidRevisionId:
pass
else:
if mapping.vcs.abbreviation == 'git':
return "commit, {}, commit: {}".format(
public_branch_url, foreign_revid.decode('ascii')[:7])
return "commit, {}, revision: {}".format(
public_branch_url, ".".join(
str(x) for x in branch.revision_id_to_dotted_revno(revid)))
else:
try:
(foreign_revid, mapping) = foreign_vcs_registry.parse_revision_id(
revid)
except errors.InvalidRevisionId:
pass
else:
if mapping.vcs.abbreviation == 'git':
return "commit: {}".format(foreign_revid.decode('ascii')[:7])
return "commit, revision id: %s" % revid.decode('utf-8')
def write_dep3_patch(f, branch, base_revid, target_revid, description=None,
origin=None, forwarded=None, applied_upstream=None,
bugs=None, authors=None, last_update=None):
write_dep3_patch_header(
f, bugs=bugs, authors=authors,
last_update=last_update, description=description,
revision_id=target_revid, origin=origin,
applied_upstream=applied_upstream, forwarded=forwarded)
old_tree = branch.repository.revision_tree(base_revid)
new_tree = branch.repository.revision_tree(target_revid)
bf = BytesIO()
diff.show_diff_trees(old_tree, new_tree, bf, old_label='old/',
new_label='new/')
f.write(bf.getvalue().decode('utf-8'))