def diff_hdrs(hdr1, hdr2, vpath1, vpath2, hmsgctxt, ecat, colorize): hmsg1, hmsg2 = [ x and MessageUnsafe(x.to_msg()) or None for x in (hdr1, hdr2) ] ehmsg = hmsg2 and MessageUnsafe(hmsg2) or None ehmsg, dr = msg_ediff(hmsg1, hmsg2, emsg=ehmsg, ecat=ecat, colorize=colorize, diffr=True) if dr == 0.0: # Revert to empty message if no difference between headers. ehmsg = MessageUnsafe() # Add visual paths as old/new segments into msgid. vpaths = [vpath1, vpath2] # Always use slashes as path separator, for portability of ediffs. vpaths = [x.replace(os.path.sep, "/") for x in vpaths] ehmsg.msgid = u"- %s\n+ %s" % tuple(vpaths) # Add trailing newline if msgstr has it, again to appease msgfmt. if ehmsg.msgstr[0].endswith("\n"): ehmsg.msgid += "\n" # Add context identifying the diffed message as header. ehmsg.msgctxt = hmsgctxt # Add conspicuous separator at the top of the header. ehmsg.manual_comment.insert(0, u"=" * 76) return ehmsg, dr > 0.0
def process (self, msg, cat): if not msg.translated: return highlight = [] # Convert embedded to proper context. if _ctxtsep in msg.msgid: p = msg.msgid.find(_ctxtsep) msg = MessageUnsafe(msg) # should not modify original message msg.msgctxt = msg.msgid[:p] msg.msgid = msg.msgid[p + len(_ctxtsep):] for check in self.current_checks: self.nproblems += check(msg, cat, False, highlight) if highlight: if self.showmsg: report_msg_content(msg, cat, highlight=highlight, delim=("-" * 20)) else: report_on_msg_hl(highlight, msg, cat) if self.lokalize: report_msg_to_lokalize(msg, cat, highlight)
def clear_header_metadata(ehmsg): ehmsg = MessageUnsafe(ehmsg) ehmsg.manual_comment.pop(0) ehmsg.msgctxt = None ehmsg.msgid = u"" return ehmsg
def patch_header(cat, ehmsg, ecat, options): if not ehmsg.msgstr[0]: # no header diff, only metadata return None ehmsg_clean = clear_header_metadata(ehmsg) # Create reduced headers. hmsg1 = msg_ediff_to_old(ehmsg_clean) hmsg2 = msg_ediff_to_new(ehmsg_clean) hmsg = not cat.created() and cat.header.to_msg() or None hdrs = [] for m in (hmsg, hmsg1, hmsg2): h = m is not None and reduce_header_fields(Header(m)) or None hdrs.append(h) rhdr, rhdr1, rhdr2 = hdrs # Decide if the header can be cleanly patched. clean = False if not rhdr: clean = rhdr1 or rhdr2 else: clean = (rhdr1 and rhdr == rhdr1) or (rhdr2 and rhdr == rhdr2) if clean: if not options.embed: if hmsg2: cat.header = Header(hmsg2) else: # Catalog will be removed if no messages are rejected, # and otherwise the header should stay as-is. pass else: if cat.created(): cat.header = Header(hmsg2) ehmsg = MessageUnsafe(ehmsg) ehmsg.flag.add(_flag_ediff) hmsgctxt = get_msgctxt_for_headers(cat) ehmsg.msgctxt = hmsgctxt cat.header.set_field(EDST.hmsgctxt_field, hmsgctxt) cat.add(Message(ehmsg), 0) return None else: return ehmsg