comparison mercurial/merge.py @ 2838:b11c014dcbd9

Merge: use single objects for tracking manifests
author Matt Mackall <mpm@selenic.com>
date Wed, 09 Aug 2006 22:07:13 -0500
parents 19b3bc840182
children 06c05c675a35 3d6efcbbd1c9
comparison
equal deleted inserted replaced
2837:19b3bc840182 2838:b11c014dcbd9
82 82
83 m1n = repo.changelog.read(p1)[0] 83 m1n = repo.changelog.read(p1)[0]
84 m2n = repo.changelog.read(p2)[0] 84 m2n = repo.changelog.read(p2)[0]
85 man = repo.manifest.ancestor(m1n, m2n) 85 man = repo.manifest.ancestor(m1n, m2n)
86 m1 = repo.manifest.read(m1n) 86 m1 = repo.manifest.read(m1n)
87 mf1 = repo.manifest.readflags(m1n)
88 m2 = repo.manifest.read(m2n).copy() 87 m2 = repo.manifest.read(m2n).copy()
89 mf2 = repo.manifest.readflags(m2n)
90 ma = repo.manifest.read(man) 88 ma = repo.manifest.read(man)
91 mfa = repo.manifest.readflags(man)
92 89
93 if not forcemerge and not overwrite: 90 if not forcemerge and not overwrite:
94 for f in unknown: 91 for f in unknown:
95 if f in m2: 92 if f in m2:
96 t1 = repo.wread(f) 93 t1 = repo.wread(f)
111 get = {} 108 get = {}
112 remove = [] 109 remove = []
113 110
114 # construct a working dir manifest 111 # construct a working dir manifest
115 mw = m1.copy() 112 mw = m1.copy()
116 mfw = mf1.copy()
117 umap = dict.fromkeys(unknown) 113 umap = dict.fromkeys(unknown)
118 114
119 for f in added + modified + unknown: 115 for f in added + modified + unknown:
120 mw[f] = "" 116 mw[f] = ""
121 mfw.set(f, util.is_exec(repo.wjoin(f), mfw.execf(f))) 117 mw.set(f, util.is_exec(repo.wjoin(f), mw.execf(f)))
122 118
123 for f in deleted + removed: 119 for f in deleted + removed:
124 if f in mw: 120 if f in mw:
125 del mw[f] 121 del mw[f]
126 122
153 # are both different from the ancestor? 149 # are both different from the ancestor?
154 if n != a and m2[f] != a: 150 if n != a and m2[f] != a:
155 repo.ui.debug(_(" %s versions differ, resolve\n") % f) 151 repo.ui.debug(_(" %s versions differ, resolve\n") % f)
156 # merge executable bits 152 # merge executable bits
157 # "if we changed or they changed, change in merge" 153 # "if we changed or they changed, change in merge"
158 a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f) 154 a, b, c = ma.execf(f), mw.execf(f), m2.execf(f)
159 mode = ((a^b) | (a^c)) ^ a 155 mode = ((a^b) | (a^c)) ^ a
160 merge[f] = (mode, m1.get(f, nullid), m2[f]) 156 merge[f] = (mode, m1.get(f, nullid), m2[f])
161 s = 1 157 s = 1
162 # are we clobbering? 158 # are we clobbering?
163 # is remote's version newer? 159 # is remote's version newer?
169 elif f in umap or f in added: 165 elif f in umap or f in added:
170 # this unknown file is the same as the checkout 166 # this unknown file is the same as the checkout
171 # we need to reset the dirstate if the file was added 167 # we need to reset the dirstate if the file was added
172 get[f] = (m2.execf(f), m2[f]) 168 get[f] = (m2.execf(f), m2[f])
173 169
174 if not s and mfw.execf(f) != mf2.execf(f): 170 if not s and mw.execf(f) != m2.execf(f):
175 if overwrite: 171 if overwrite:
176 repo.ui.debug(_(" updating permissions for %s\n") % f) 172 repo.ui.debug(_(" updating permissions for %s\n") % f)
177 util.set_exec(repo.wjoin(f), mf2.execf(f)) 173 util.set_exec(repo.wjoin(f), m2.execf(f))
178 else: 174 else:
179 a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f) 175 a, b, c = ma.execf(f), mw.execf(f), m2.execf(f)
180 mode = ((a^b) | (a^c)) ^ a 176 mode = ((a^b) | (a^c)) ^ a
181 if mode != b: 177 if mode != b:
182 repo.ui.debug(_(" updating permissions for %s\n") 178 repo.ui.debug(_(" updating permissions for %s\n")
183 % f) 179 % f)
184 util.set_exec(repo.wjoin(f), mode) 180 util.set_exec(repo.wjoin(f), mode)