1 """I provide functions to compare elements and packages."""
2
8
16
22
27
32
37
42
47
53
55 "returns the list of operation to perform on p2 to make it like p1"
56 return _diff_attr(p1, p2, "uri") \
57 + _diff_meta(p1, p2) \
58 + _diff_elt_lists(p1, p2, "imports") \
59 + _diff_elt_lists(p1, p2, "medias") \
60 + _diff_elt_lists(p1, p2, "annotations") \
61 + _diff_elt_lists(p1, p2, "relations") \
62 + _diff_elt_lists(p1, p2, "tags") \
63 + _diff_elt_lists(p1, p2, "lists") \
64 + _diff_elt_lists(p1, p2, "views") \
65 + _diff_elt_lists(p1, p2, "queries") \
66 + _diff_elt_lists(p1, p2, "resources") \
67 + _diff_external_tag_associations(p1, p2)
68
69
70
72 if getattr(elt1, attr) != getattr(elt2, attr):
73 if hasattr(elt1, "ADVENE_TYPE"):
74 obj = elt1._id
75 else:
76 obj = elt1
77 return [("<setattr>", obj, attr, getattr(elt1, attr)),]
78 return []
79
81 l1 = list(enumerate(r1.iter_member_ids()))
82 l2 = list(enumerate(r2.iter_member_ids()))
83 r = []
84 for i1, i2 in _xzip(l1, l2, lambda x: x[0]):
85 if i1 is None:
86 i2, m2 = i2
87 r.append(("remove_member", r1._id, -1))
88 elif i2 is None:
89 i1, m1 = i1
90 r.append(("insert_member", r1._id, -1, m1))
91 elif i1 != i2:
92 i1, m1 = i1
93 i2, m2 = i2
94 r.append(("update_member", r1._id, i1, m1))
95 return r
96
98 m1 = list(enumerate(l1.iter_item_ids()))
99 m2 = list(enumerate(l2.iter_item_ids()))
100 r = []
101 for i1, i2 in _xzip(m1, m2, lambda x: x[0]):
102 if i1 is None:
103 i2, j2 = i2
104 r.append(("remove_item", l1._id, -1))
105 elif i2 is None:
106 i1, j1 = i1
107 r.append(("insert_item", l1._id, -1, j1))
108 elif i1 != i2:
109 i1, j1 = i1
110 i2, j2 = i2
111 r.append(("update_item", l1._id, i1, j1))
112 return r
113
115 l1 = [ i for i in enumerate(t1.iter_element_ids(t1._owner))
116 if i[1].find(":") > 0 ]
117 l2 = [ i for i in enumerate(t2.iter_element_ids(t2._owner))
118 if i[1].find(":") > 0 ]
119 r = []
120 for e1, e2 in _xzip(l1, l2, lambda x: x):
121 if e1 is None:
122 r.append(("dissociate_tag", e2, t1._id))
123 elif e2 is None:
124 r.append(("associate_tag", e1, t1._id))
125 return r
126
127 -def _diff_contents(elt1, elt2):
128 r = _diff_attr(elt1, elt2, "content_mimetype") \
129 + _diff_attr(elt1, elt2, "content_model_id") \
130 + _diff_attr(elt1, elt2, "content_url")
131 if elt1.content_url == elt2.content_url \
132 and (not elt1.content_url or elt1.content_url.startswith("packaged:")):
133 r += _diff_attr(elt1, elt2, "content_data")
134 return r
135
146
163
177
188
190 return ("", "delete_element", elt._id)
191
193 return ("<create>", elt)
194
196 r = list(it)
197 r.sort(cmp, key, reverse)
198 return r
199
200 -def _xzip(l1, l2, idfier=lambda x:x):
201 i1 = 0; i2 = 0
202 while i1 < len(l1) and i2 < len(l2):
203 id1 = idfier(l1[i1])
204 id2 = idfier(l2[i2])
205 if id1 == id2:
206 yield l1[i1], l2[i2]
207 i1 += 1
208 i2 += 1
209 elif id1 > id2:
210 yield None, l2[i2]
211 i2 += 1
212 else:
213 yield l1[i1], None
214 i1 += 1
215 for i in l1[i1:]:
216 yield i, None
217 for i in l2[i2:]:
218 yield None, i
219