Mercurial > public > mercurial-scm > hg-stable
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) |