def build_splitting_triplets(emsgs, cat, options): # Create catalogs of old and new messages. cat1 = Catalog("", create=True, monitored=False) cat2 = Catalog("", create=True, monitored=False) for emsg in emsgs: msg1, msg2, msg1_s, msg2_s = resolve_diff_pair(emsg) if msg1: cat1.add_last(msg1) if msg2: cat2.add_last(msg2) # Make headers same, to avoid any diffs there. cat1.header = cat.header cat2.header = cat.header # Write created catalogs to disk if # msgmerge may be used on files during diffing. if options.do_merge: tmpfs = [] # to avoid garbage collection until the function returns for tcat, tsuff in ((cat1, "1"), (cat2, "2")): tmpf = NamedTemporaryFile(prefix="poepatch-split-%s-" % tsuff, suffix=".po") tmpfs.append(tmpf) tcat.filename = tmpf.name tcat.sync(force=True) # Create the old-to-current and current-to-new diffs. ecat_1c = Catalog("", create=True, monitored=False) diff_cats(cat1, cat, ecat_1c, options.do_merge, wadd=False, wrem=False) ecat_c2 = Catalog("", create=True, monitored=False) diff_cats(cat, cat2, ecat_c2, options.do_merge, wadd=False, wrem=False) # Mine splitting triplets out of diffs. sdoublets_1c = {} for emsg in ecat_1c: m1_t, m_t, m1_ts, m_ts1 = resolve_diff_pair(emsg) sdoublets_1c[m_t.key] = [m1_t, m1_ts, m_t, m_ts1] sdoublets_c2 = {} for emsg in ecat_c2: m_t, m2_t, m_ts2, m2_ts = resolve_diff_pair(emsg) sdoublets_c2[m_t.key] = [m_t, m_ts2, m2_t, m2_ts] common_keys = set(sdoublets_1c).intersection(sdoublets_c2) striplets = [] for key in common_keys: m1_t, m1_ts, m_t, m_ts1 = sdoublets_1c[key] m_t, m_ts2, m2_t, m2_ts = sdoublets_c2[key] striplets.append((m1_t, m1_ts, m2_t, m2_ts, m_t, m_ts1, m_ts2)) return striplets
def unembed_ediff(path, all=False, old=False): try: cat = Catalog(path) except: warning( _("@info", "Error reading catalog '%(file)s', skipping it.", file=path)) return hmsgctxt = cat.header.get_field_value(EDST.hmsgctxt_field) if hmsgctxt is not None: cat.header.remove_field(EDST.hmsgctxt_field) uehmsg = None unembedded = {} for msg in cat: ediff_flag = None for flag in _flags_all: if flag in msg.flag: ediff_flag = flag msg.flag.remove(flag) if not ediff_flag and not all: continue if ediff_flag in (_flag_ediff_no_match, _flag_ediff_to_new): # Throw away fully rejected embeddings, i.e. reject the patch. # For split-difference embeddings, throw away the current-to-new; # this effectively rejects the patch, which is safest thing to do. cat.remove_on_sync(msg) elif hmsgctxt is not None and msg.msgctxt == hmsgctxt: if uehmsg: warning_on_msg( _("@info", "Unembedding results in duplicate header, " "previous header at %(line)d(#%(entry)d); " "skipping it.", line=uehmsg.refline, entry=uehmsg.refentry), msg, cat) return msg_ediff_to_x = not old and msg_ediff_to_new or msg_ediff_to_old hmsg = msg_ediff_to_x(clear_header_metadata(msg)) if hmsg.msgstr and hmsg.msgstr[0]: cat.header = Header(hmsg) cat.remove_on_sync(msg) uehmsg = msg else: msg1, msg2, msg1_s, msg2_s = resolve_diff_pair(msg) tmsg = (not old and (msg2, ) or (msg1, ))[0] if tmsg is not None: if tmsg.key in unembedded: msg_p = unembedded[tmsg.key] warning_on_msg( _("@info", "Unembedding results in " "duplicate message, previous message " "at %(line)d(#%(entry)d); skipping it.", line=msg_p.refline, entry=msg_p.refentry), msg, cat) return msg.set(Message(msg2)) unembedded[tmsg.key] = msg else: cat.remove_on_sync(msg) if cat.sync(): report(_("@info:progress", "Unembedded: %(file)s", file=cat.filename))