##// END OF EJS Templates
commitctx: no longer use the `writecopiesto` variable in the function...
marmoute -
r45790:4eb6466e default
parent child Browse files
Show More
@@ -1,379 +1,378
1 # commit.py - fonction to perform commit
1 # commit.py - fonction to perform commit
2 #
2 #
3 # This software may be used and distributed according to the terms of the
3 # This software may be used and distributed according to the terms of the
4 # GNU General Public License version 2 or any later version.
4 # GNU General Public License version 2 or any later version.
5
5
6 from __future__ import absolute_import
6 from __future__ import absolute_import
7
7
8 import errno
8 import errno
9
9
10 from .i18n import _
10 from .i18n import _
11 from .node import (
11 from .node import (
12 hex,
12 hex,
13 nullid,
13 nullid,
14 nullrev,
14 nullrev,
15 )
15 )
16
16
17 from . import (
17 from . import (
18 context,
18 context,
19 mergestate,
19 mergestate,
20 metadata,
20 metadata,
21 phases,
21 phases,
22 scmutil,
22 scmutil,
23 subrepoutil,
23 subrepoutil,
24 )
24 )
25
25
26
26
27 def commitctx(repo, ctx, error=False, origctx=None):
27 def commitctx(repo, ctx, error=False, origctx=None):
28 """Add a new revision to the target repository.
28 """Add a new revision to the target repository.
29 Revision information is passed via the context argument.
29 Revision information is passed via the context argument.
30
30
31 ctx.files() should list all files involved in this commit, i.e.
31 ctx.files() should list all files involved in this commit, i.e.
32 modified/added/removed files. On merge, it may be wider than the
32 modified/added/removed files. On merge, it may be wider than the
33 ctx.files() to be committed, since any file nodes derived directly
33 ctx.files() to be committed, since any file nodes derived directly
34 from p1 or p2 are excluded from the committed ctx.files().
34 from p1 or p2 are excluded from the committed ctx.files().
35
35
36 origctx is for convert to work around the problem that bug
36 origctx is for convert to work around the problem that bug
37 fixes to the files list in changesets change hashes. For
37 fixes to the files list in changesets change hashes. For
38 convert to be the identity, it can pass an origctx and this
38 convert to be the identity, it can pass an origctx and this
39 function will use the same files list when it makes sense to
39 function will use the same files list when it makes sense to
40 do so.
40 do so.
41 """
41 """
42 repo = repo.unfiltered()
42 repo = repo.unfiltered()
43
43
44 p1, p2 = ctx.p1(), ctx.p2()
44 p1, p2 = ctx.p1(), ctx.p2()
45 user = ctx.user()
45 user = ctx.user()
46
46
47 if repo.filecopiesmode == b'changeset-sidedata':
47 if repo.filecopiesmode == b'changeset-sidedata':
48 writechangesetcopy = True
48 writechangesetcopy = True
49 writefilecopymeta = True
49 writefilecopymeta = True
50 writecopiesto = None
51 else:
50 else:
52 writecopiesto = repo.ui.config(b'experimental', b'copies.write-to')
51 writecopiesto = repo.ui.config(b'experimental', b'copies.write-to')
53 writefilecopymeta = writecopiesto != b'changeset-only'
52 writefilecopymeta = writecopiesto != b'changeset-only'
54 writechangesetcopy = writecopiesto in (
53 writechangesetcopy = writecopiesto in (
55 b'changeset-only',
54 b'changeset-only',
56 b'compatibility',
55 b'compatibility',
57 )
56 )
58 p1copies, p2copies = None, None
57 p1copies, p2copies = None, None
59 if writechangesetcopy:
58 if writechangesetcopy:
60 p1copies = ctx.p1copies()
59 p1copies = ctx.p1copies()
61 p2copies = ctx.p2copies()
60 p2copies = ctx.p2copies()
62 filesadded, filesremoved = None, None
61 filesadded, filesremoved = None, None
63 with repo.lock(), repo.transaction(b"commit") as tr:
62 with repo.lock(), repo.transaction(b"commit") as tr:
64 if ctx.manifestnode():
63 if ctx.manifestnode():
65 # reuse an existing manifest revision
64 # reuse an existing manifest revision
66 repo.ui.debug(b'reusing known manifest\n')
65 repo.ui.debug(b'reusing known manifest\n')
67 mn = ctx.manifestnode()
66 mn = ctx.manifestnode()
68 files = ctx.files()
67 files = ctx.files()
69 if writechangesetcopy:
68 if writechangesetcopy:
70 filesadded = ctx.filesadded()
69 filesadded = ctx.filesadded()
71 filesremoved = ctx.filesremoved()
70 filesremoved = ctx.filesremoved()
72 elif not ctx.files():
71 elif not ctx.files():
73 repo.ui.debug(b'reusing manifest from p1 (no file change)\n')
72 repo.ui.debug(b'reusing manifest from p1 (no file change)\n')
74 mn = p1.manifestnode()
73 mn = p1.manifestnode()
75 files = []
74 files = []
76 else:
75 else:
77 m1ctx = p1.manifestctx()
76 m1ctx = p1.manifestctx()
78 m2ctx = p2.manifestctx()
77 m2ctx = p2.manifestctx()
79 mctx = m1ctx.copy()
78 mctx = m1ctx.copy()
80
79
81 m = mctx.read()
80 m = mctx.read()
82 m1 = m1ctx.read()
81 m1 = m1ctx.read()
83 m2 = m2ctx.read()
82 m2 = m2ctx.read()
84
83
85 # check in files
84 # check in files
86 added = []
85 added = []
87 filesadded = []
86 filesadded = []
88 removed = list(ctx.removed())
87 removed = list(ctx.removed())
89 touched = []
88 touched = []
90 linkrev = len(repo)
89 linkrev = len(repo)
91 repo.ui.note(_(b"committing files:\n"))
90 repo.ui.note(_(b"committing files:\n"))
92 uipathfn = scmutil.getuipathfn(repo)
91 uipathfn = scmutil.getuipathfn(repo)
93 for f in sorted(ctx.modified() + ctx.added()):
92 for f in sorted(ctx.modified() + ctx.added()):
94 repo.ui.note(uipathfn(f) + b"\n")
93 repo.ui.note(uipathfn(f) + b"\n")
95 try:
94 try:
96 fctx = ctx[f]
95 fctx = ctx[f]
97 if fctx is None:
96 if fctx is None:
98 removed.append(f)
97 removed.append(f)
99 else:
98 else:
100 added.append(f)
99 added.append(f)
101 m[f], is_touched = _filecommit(
100 m[f], is_touched = _filecommit(
102 repo, fctx, m1, m2, linkrev, tr, writefilecopymeta,
101 repo, fctx, m1, m2, linkrev, tr, writefilecopymeta,
103 )
102 )
104 if is_touched:
103 if is_touched:
105 touched.append(f)
104 touched.append(f)
106 if writechangesetcopy and is_touched == 'added':
105 if writechangesetcopy and is_touched == 'added':
107 filesadded.append(f)
106 filesadded.append(f)
108 m.setflag(f, fctx.flags())
107 m.setflag(f, fctx.flags())
109 except OSError:
108 except OSError:
110 repo.ui.warn(_(b"trouble committing %s!\n") % uipathfn(f))
109 repo.ui.warn(_(b"trouble committing %s!\n") % uipathfn(f))
111 raise
110 raise
112 except IOError as inst:
111 except IOError as inst:
113 errcode = getattr(inst, 'errno', errno.ENOENT)
112 errcode = getattr(inst, 'errno', errno.ENOENT)
114 if error or errcode and errcode != errno.ENOENT:
113 if error or errcode and errcode != errno.ENOENT:
115 repo.ui.warn(
114 repo.ui.warn(
116 _(b"trouble committing %s!\n") % uipathfn(f)
115 _(b"trouble committing %s!\n") % uipathfn(f)
117 )
116 )
118 raise
117 raise
119
118
120 # update manifest
119 # update manifest
121 removed = [f for f in removed if f in m1 or f in m2]
120 removed = [f for f in removed if f in m1 or f in m2]
122 drop = sorted([f for f in removed if f in m])
121 drop = sorted([f for f in removed if f in m])
123 for f in drop:
122 for f in drop:
124 del m[f]
123 del m[f]
125 if p2.rev() != nullrev:
124 if p2.rev() != nullrev:
126 rf = metadata.get_removal_filter(ctx, (p1, p2, m1, m2))
125 rf = metadata.get_removal_filter(ctx, (p1, p2, m1, m2))
127 removed = [f for f in removed if not rf(f)]
126 removed = [f for f in removed if not rf(f)]
128
127
129 touched.extend(removed)
128 touched.extend(removed)
130
129
131 if writechangesetcopy:
130 if writechangesetcopy:
132 filesremoved = removed
131 filesremoved = removed
133
132
134 files = touched
133 files = touched
135 mn = _commit_manifest(tr, linkrev, ctx, mctx, files, added, drop)
134 mn = _commit_manifest(tr, linkrev, ctx, mctx, files, added, drop)
136
135
137 if writecopiesto == b'changeset-only':
136 if not writefilecopymeta:
138 # If writing only to changeset extras, use None to indicate that
137 # If writing only to changeset extras, use None to indicate that
139 # no entry should be written. If writing to both, write an empty
138 # no entry should be written. If writing to both, write an empty
140 # entry to prevent the reader from falling back to reading
139 # entry to prevent the reader from falling back to reading
141 # filelogs.
140 # filelogs.
142 p1copies = p1copies or None
141 p1copies = p1copies or None
143 p2copies = p2copies or None
142 p2copies = p2copies or None
144 filesadded = filesadded or None
143 filesadded = filesadded or None
145 filesremoved = filesremoved or None
144 filesremoved = filesremoved or None
146
145
147 if origctx and origctx.manifestnode() == mn:
146 if origctx and origctx.manifestnode() == mn:
148 files = origctx.files()
147 files = origctx.files()
149
148
150 # update changelog
149 # update changelog
151 repo.ui.note(_(b"committing changelog\n"))
150 repo.ui.note(_(b"committing changelog\n"))
152 repo.changelog.delayupdate(tr)
151 repo.changelog.delayupdate(tr)
153 n = repo.changelog.add(
152 n = repo.changelog.add(
154 mn,
153 mn,
155 files,
154 files,
156 ctx.description(),
155 ctx.description(),
157 tr,
156 tr,
158 p1.node(),
157 p1.node(),
159 p2.node(),
158 p2.node(),
160 user,
159 user,
161 ctx.date(),
160 ctx.date(),
162 ctx.extra().copy(),
161 ctx.extra().copy(),
163 p1copies,
162 p1copies,
164 p2copies,
163 p2copies,
165 filesadded,
164 filesadded,
166 filesremoved,
165 filesremoved,
167 )
166 )
168 xp1, xp2 = p1.hex(), p2 and p2.hex() or b''
167 xp1, xp2 = p1.hex(), p2 and p2.hex() or b''
169 repo.hook(
168 repo.hook(
170 b'pretxncommit', throw=True, node=hex(n), parent1=xp1, parent2=xp2,
169 b'pretxncommit', throw=True, node=hex(n), parent1=xp1, parent2=xp2,
171 )
170 )
172 # set the new commit is proper phase
171 # set the new commit is proper phase
173 targetphase = subrepoutil.newcommitphase(repo.ui, ctx)
172 targetphase = subrepoutil.newcommitphase(repo.ui, ctx)
174 if targetphase:
173 if targetphase:
175 # retract boundary do not alter parent changeset.
174 # retract boundary do not alter parent changeset.
176 # if a parent have higher the resulting phase will
175 # if a parent have higher the resulting phase will
177 # be compliant anyway
176 # be compliant anyway
178 #
177 #
179 # if minimal phase was 0 we don't need to retract anything
178 # if minimal phase was 0 we don't need to retract anything
180 phases.registernew(repo, tr, targetphase, [n])
179 phases.registernew(repo, tr, targetphase, [n])
181 return n
180 return n
182
181
183
182
184 def _filecommit(
183 def _filecommit(
185 repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta,
184 repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta,
186 ):
185 ):
187 """
186 """
188 commit an individual file as part of a larger transaction
187 commit an individual file as part of a larger transaction
189
188
190 input:
189 input:
191
190
192 fctx: a file context with the content we are trying to commit
191 fctx: a file context with the content we are trying to commit
193 manifest1: manifest of changeset first parent
192 manifest1: manifest of changeset first parent
194 manifest2: manifest of changeset second parent
193 manifest2: manifest of changeset second parent
195 linkrev: revision number of the changeset being created
194 linkrev: revision number of the changeset being created
196 tr: current transation
195 tr: current transation
197 individual: boolean, set to False to skip storing the copy data
196 individual: boolean, set to False to skip storing the copy data
198 (only used by the Google specific feature of using
197 (only used by the Google specific feature of using
199 changeset extra as copy source of truth).
198 changeset extra as copy source of truth).
200
199
201 output: (filenode, touched)
200 output: (filenode, touched)
202
201
203 filenode: the filenode that should be used by this changeset
202 filenode: the filenode that should be used by this changeset
204 touched: one of: None (mean untouched), 'added' or 'modified'
203 touched: one of: None (mean untouched), 'added' or 'modified'
205 """
204 """
206
205
207 fname = fctx.path()
206 fname = fctx.path()
208 fparent1 = manifest1.get(fname, nullid)
207 fparent1 = manifest1.get(fname, nullid)
209 fparent2 = manifest2.get(fname, nullid)
208 fparent2 = manifest2.get(fname, nullid)
210 touched = None
209 touched = None
211 if fparent1 == fparent2 == nullid:
210 if fparent1 == fparent2 == nullid:
212 touched = 'added'
211 touched = 'added'
213
212
214 if isinstance(fctx, context.filectx):
213 if isinstance(fctx, context.filectx):
215 # This block fast path most comparisons which are usually done. It
214 # This block fast path most comparisons which are usually done. It
216 # assumes that bare filectx is used and no merge happened, hence no
215 # assumes that bare filectx is used and no merge happened, hence no
217 # need to create a new file revision in this case.
216 # need to create a new file revision in this case.
218 node = fctx.filenode()
217 node = fctx.filenode()
219 if node in [fparent1, fparent2]:
218 if node in [fparent1, fparent2]:
220 repo.ui.debug(b'reusing %s filelog entry\n' % fname)
219 repo.ui.debug(b'reusing %s filelog entry\n' % fname)
221 if (
220 if (
222 fparent1 != nullid and manifest1.flags(fname) != fctx.flags()
221 fparent1 != nullid and manifest1.flags(fname) != fctx.flags()
223 ) or (
222 ) or (
224 fparent2 != nullid and manifest2.flags(fname) != fctx.flags()
223 fparent2 != nullid and manifest2.flags(fname) != fctx.flags()
225 ):
224 ):
226 touched = 'modified'
225 touched = 'modified'
227 return node, touched
226 return node, touched
228
227
229 flog = repo.file(fname)
228 flog = repo.file(fname)
230 meta = {}
229 meta = {}
231 cfname = fctx.copysource()
230 cfname = fctx.copysource()
232 fnode = None
231 fnode = None
233
232
234 if cfname and cfname != fname:
233 if cfname and cfname != fname:
235 # Mark the new revision of this file as a copy of another
234 # Mark the new revision of this file as a copy of another
236 # file. This copy data will effectively act as a parent
235 # file. This copy data will effectively act as a parent
237 # of this new revision. If this is a merge, the first
236 # of this new revision. If this is a merge, the first
238 # parent will be the nullid (meaning "look up the copy data")
237 # parent will be the nullid (meaning "look up the copy data")
239 # and the second one will be the other parent. For example:
238 # and the second one will be the other parent. For example:
240 #
239 #
241 # 0 --- 1 --- 3 rev1 changes file foo
240 # 0 --- 1 --- 3 rev1 changes file foo
242 # \ / rev2 renames foo to bar and changes it
241 # \ / rev2 renames foo to bar and changes it
243 # \- 2 -/ rev3 should have bar with all changes and
242 # \- 2 -/ rev3 should have bar with all changes and
244 # should record that bar descends from
243 # should record that bar descends from
245 # bar in rev2 and foo in rev1
244 # bar in rev2 and foo in rev1
246 #
245 #
247 # this allows this merge to succeed:
246 # this allows this merge to succeed:
248 #
247 #
249 # 0 --- 1 --- 3 rev4 reverts the content change from rev2
248 # 0 --- 1 --- 3 rev4 reverts the content change from rev2
250 # \ / merging rev3 and rev4 should use bar@rev2
249 # \ / merging rev3 and rev4 should use bar@rev2
251 # \- 2 --- 4 as the merge base
250 # \- 2 --- 4 as the merge base
252 #
251 #
253
252
254 cnode = manifest1.get(cfname)
253 cnode = manifest1.get(cfname)
255 newfparent = fparent2
254 newfparent = fparent2
256
255
257 if manifest2: # branch merge
256 if manifest2: # branch merge
258 if fparent2 == nullid or cnode is None: # copied on remote side
257 if fparent2 == nullid or cnode is None: # copied on remote side
259 if cfname in manifest2:
258 if cfname in manifest2:
260 cnode = manifest2[cfname]
259 cnode = manifest2[cfname]
261 newfparent = fparent1
260 newfparent = fparent1
262
261
263 # Here, we used to search backwards through history to try to find
262 # Here, we used to search backwards through history to try to find
264 # where the file copy came from if the source of a copy was not in
263 # where the file copy came from if the source of a copy was not in
265 # the parent directory. However, this doesn't actually make sense to
264 # the parent directory. However, this doesn't actually make sense to
266 # do (what does a copy from something not in your working copy even
265 # do (what does a copy from something not in your working copy even
267 # mean?) and it causes bugs (eg, issue4476). Instead, we will warn
266 # mean?) and it causes bugs (eg, issue4476). Instead, we will warn
268 # the user that copy information was dropped, so if they didn't
267 # the user that copy information was dropped, so if they didn't
269 # expect this outcome it can be fixed, but this is the correct
268 # expect this outcome it can be fixed, but this is the correct
270 # behavior in this circumstance.
269 # behavior in this circumstance.
271
270
272 if cnode:
271 if cnode:
273 repo.ui.debug(b" %s: copy %s:%s\n" % (fname, cfname, hex(cnode)))
272 repo.ui.debug(b" %s: copy %s:%s\n" % (fname, cfname, hex(cnode)))
274 if includecopymeta:
273 if includecopymeta:
275 meta[b"copy"] = cfname
274 meta[b"copy"] = cfname
276 meta[b"copyrev"] = hex(cnode)
275 meta[b"copyrev"] = hex(cnode)
277 fparent1, fparent2 = nullid, newfparent
276 fparent1, fparent2 = nullid, newfparent
278 else:
277 else:
279 repo.ui.warn(
278 repo.ui.warn(
280 _(
279 _(
281 b"warning: can't find ancestor for '%s' "
280 b"warning: can't find ancestor for '%s' "
282 b"copied from '%s'!\n"
281 b"copied from '%s'!\n"
283 )
282 )
284 % (fname, cfname)
283 % (fname, cfname)
285 )
284 )
286
285
287 elif fparent1 == nullid:
286 elif fparent1 == nullid:
288 fparent1, fparent2 = fparent2, nullid
287 fparent1, fparent2 = fparent2, nullid
289 elif fparent2 != nullid:
288 elif fparent2 != nullid:
290 # is one parent an ancestor of the other?
289 # is one parent an ancestor of the other?
291 fparentancestors = flog.commonancestorsheads(fparent1, fparent2)
290 fparentancestors = flog.commonancestorsheads(fparent1, fparent2)
292 if fparent1 in fparentancestors:
291 if fparent1 in fparentancestors:
293 fparent1, fparent2 = fparent2, nullid
292 fparent1, fparent2 = fparent2, nullid
294 elif fparent2 in fparentancestors:
293 elif fparent2 in fparentancestors:
295 fparent2 = nullid
294 fparent2 = nullid
296 elif not fparentancestors:
295 elif not fparentancestors:
297 # TODO: this whole if-else might be simplified much more
296 # TODO: this whole if-else might be simplified much more
298 ms = mergestate.mergestate.read(repo)
297 ms = mergestate.mergestate.read(repo)
299 if (
298 if (
300 fname in ms
299 fname in ms
301 and ms[fname] == mergestate.MERGE_RECORD_MERGED_OTHER
300 and ms[fname] == mergestate.MERGE_RECORD_MERGED_OTHER
302 ):
301 ):
303 fparent1, fparent2 = fparent2, nullid
302 fparent1, fparent2 = fparent2, nullid
304
303
305 # is the file changed?
304 # is the file changed?
306 text = fctx.data()
305 text = fctx.data()
307 if fparent2 != nullid or meta or flog.cmp(fparent1, text):
306 if fparent2 != nullid or meta or flog.cmp(fparent1, text):
308 if touched is None: # do not overwrite added
307 if touched is None: # do not overwrite added
309 touched = 'modified'
308 touched = 'modified'
310 fnode = flog.add(text, meta, tr, linkrev, fparent1, fparent2)
309 fnode = flog.add(text, meta, tr, linkrev, fparent1, fparent2)
311 # are just the flags changed during merge?
310 # are just the flags changed during merge?
312 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags():
311 elif fname in manifest1 and manifest1.flags(fname) != fctx.flags():
313 touched = 'modified'
312 touched = 'modified'
314 fnode = fparent1
313 fnode = fparent1
315 else:
314 else:
316 fnode = fparent1
315 fnode = fparent1
317 return fnode, touched
316 return fnode, touched
318
317
319
318
320 def _commit_manifest(tr, linkrev, ctx, mctx, files, added, drop):
319 def _commit_manifest(tr, linkrev, ctx, mctx, files, added, drop):
321 """make a new manifest entry (or reuse a new one)
320 """make a new manifest entry (or reuse a new one)
322
321
323 given an initialised manifest context and precomputed list of
322 given an initialised manifest context and precomputed list of
324 - files: files affected by the commit
323 - files: files affected by the commit
325 - added: new entries in the manifest
324 - added: new entries in the manifest
326 - drop: entries present in parents but absent of this one
325 - drop: entries present in parents but absent of this one
327
326
328 Create a new manifest revision, reuse existing ones if possible.
327 Create a new manifest revision, reuse existing ones if possible.
329
328
330 Return the nodeid of the manifest revision.
329 Return the nodeid of the manifest revision.
331 """
330 """
332 repo = ctx.repo()
331 repo = ctx.repo()
333
332
334 md = None
333 md = None
335
334
336 # all this is cached, so it is find to get them all from the ctx.
335 # all this is cached, so it is find to get them all from the ctx.
337 p1 = ctx.p1()
336 p1 = ctx.p1()
338 p2 = ctx.p2()
337 p2 = ctx.p2()
339 m1ctx = p1.manifestctx()
338 m1ctx = p1.manifestctx()
340
339
341 m1 = m1ctx.read()
340 m1 = m1ctx.read()
342
341
343 manifest = mctx.read()
342 manifest = mctx.read()
344
343
345 if not files:
344 if not files:
346 # if no "files" actually changed in terms of the changelog,
345 # if no "files" actually changed in terms of the changelog,
347 # try hard to detect unmodified manifest entry so that the
346 # try hard to detect unmodified manifest entry so that the
348 # exact same commit can be reproduced later on convert.
347 # exact same commit can be reproduced later on convert.
349 md = m1.diff(manifest, scmutil.matchfiles(repo, ctx.files()))
348 md = m1.diff(manifest, scmutil.matchfiles(repo, ctx.files()))
350 if not files and md:
349 if not files and md:
351 repo.ui.debug(
350 repo.ui.debug(
352 b'not reusing manifest (no file change in '
351 b'not reusing manifest (no file change in '
353 b'changelog, but manifest differs)\n'
352 b'changelog, but manifest differs)\n'
354 )
353 )
355 if files or md:
354 if files or md:
356 repo.ui.note(_(b"committing manifest\n"))
355 repo.ui.note(_(b"committing manifest\n"))
357 # we're using narrowmatch here since it's already applied at
356 # we're using narrowmatch here since it's already applied at
358 # other stages (such as dirstate.walk), so we're already
357 # other stages (such as dirstate.walk), so we're already
359 # ignoring things outside of narrowspec in most cases. The
358 # ignoring things outside of narrowspec in most cases. The
360 # one case where we might have files outside the narrowspec
359 # one case where we might have files outside the narrowspec
361 # at this point is merges, and we already error out in the
360 # at this point is merges, and we already error out in the
362 # case where the merge has files outside of the narrowspec,
361 # case where the merge has files outside of the narrowspec,
363 # so this is safe.
362 # so this is safe.
364 mn = mctx.write(
363 mn = mctx.write(
365 tr,
364 tr,
366 linkrev,
365 linkrev,
367 p1.manifestnode(),
366 p1.manifestnode(),
368 p2.manifestnode(),
367 p2.manifestnode(),
369 added,
368 added,
370 drop,
369 drop,
371 match=repo.narrowmatch(),
370 match=repo.narrowmatch(),
372 )
371 )
373 else:
372 else:
374 repo.ui.debug(
373 repo.ui.debug(
375 b'reusing manifest from p1 (listed files ' b'actually unchanged)\n'
374 b'reusing manifest from p1 (listed files ' b'actually unchanged)\n'
376 )
375 )
377 mn = p1.manifestnode()
376 mn = p1.manifestnode()
378
377
379 return mn
378 return mn
General Comments 0
You need to be logged in to leave comments. Login now