Only construct sets when necessary

pull/1818/head
Mark Haines 2017-01-17 15:23:07 +00:00 committed by Erik Johnston
parent a8594fd19f
commit c6064a7ba6
1 changed files with 19 additions and 14 deletions

View File

@ -453,21 +453,26 @@ def _seperate(state_sets):
unconflicted_state = dict(state_sets[0]) unconflicted_state = dict(state_sets[0])
conflicted_state = {} conflicted_state = {}
full_states = defaultdict(
set,
{k: set((v,)) for k, v in state_sets[0].iteritems()}
)
for state_set in state_sets[1:]: for state_set in state_sets[1:]:
for key, value in state_set.iteritems(): for key, value in state_set.iteritems():
ls = full_states[key] # Check if there is an unconflicted entry for the state key.
if not ls: unconflicted_value = unconflicted_state.get(key)
ls.add(value) if unconflicted_value is None:
# There isn't an unconflicted entry so check if there is a
# conflicted entry.
ls = conflicted_state.get(key)
if ls is None:
# There wasn't a conflicted entry so haven't seen this key before.
# Therefore it isn't conflicted yet.
unconflicted_state[key] = value unconflicted_state[key] = value
elif value not in ls: else:
# This key is already conflicted, add our value to the conflict set.
ls.add(value) ls.add(value)
if len(ls) == 2: elif unconflicted_value != value:
conflicted_state[key] = ls # If the unconflicted value is not the same as our value then we
# have a new conflict. So move the key from the unconflicted_state
# to the conflicted state.
conflicted_state[key] = {value, unconflicted_value}
unconflicted_state.pop(key, None) unconflicted_state.pop(key, None)
return unconflicted_state, conflicted_state return unconflicted_state, conflicted_state