From 5b0150f6adc82a335c8e41048a4fedfe4d316dae Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 18 Mar 2016 12:05:36 +0100 Subject: [PATCH] lib/import: simplify logic arround merged_attribute It fixes a bug when a merged attribute is not present in the existing record. --- lib/import | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/import b/lib/import index cbdf167..6e8b079 100755 --- a/lib/import +++ b/lib/import @@ -54,7 +54,7 @@ class MyLDIFParser(ldif.LDIFParser): self.entries.append((dn, lower_keys(entry))) args = parser.parse_args() -args.merged_attribute = map(str.lower, args.merged_attribute) +args.merged_attribute = set(map(str.lower, args.merged_attribute)) # Array to store futures adds and modifies adds = [] @@ -71,16 +71,16 @@ for ldif_path in args.ldifs: result = conn.search_s(dn, ldap.SCOPE_BASE) old_attrs = lower_keys(result[0][1]) new_attrs = {} - # keep attributes to merge that are unchanged - for key in args.merged_attribute: - if key not in attrs: - new_attrs[key] = old_attrs[key] - for key in attrs: - # merge attributes with their old value + # new keys are keys from source + keys from merged_attribute + for key in set(attrs.keys()) | args.merged_attribute: + values = set() + # merge attributes with their old value if key is in merged_attribute if key in args.merged_attribute: - new_attrs[key] = list(set(old_attrs[key])|set(attrs[key])) - else: - new_attrs[key] = attrs[key] + values |= set(old_attrs.get(key, [])) + # add new values + values |= set(attrs.get(key, [])) + # flatten to list for python-ldap + new_attrs[key] = list(values) modlist = [] for key in old_attrs: if key not in new_attrs: