##// END OF EJS Templates
narrow: add '--import-rules' flag to tracked command...
Pulkit Goyal -
r39471:ab20ee07 default
parent child Browse files
Show More
@@ -0,0 +1,218 b''
1 #testcases flat tree
2 $ . "$TESTDIR/narrow-library.sh"
3
4 #if tree
5 $ cat << EOF >> $HGRCPATH
6 > [experimental]
7 > treemanifest = 1
8 > EOF
9 #endif
10
11 $ hg init master
12 $ cd master
13 $ cat >> .hg/hgrc <<EOF
14 > [narrow]
15 > serveellipses=True
16 > EOF
17
18 $ mkdir inside
19 $ echo 'inside' > inside/f
20 $ hg add inside/f
21 $ hg commit -m 'add inside'
22
23 $ mkdir widest
24 $ echo 'widest' > widest/f
25 $ hg add widest/f
26 $ hg commit -m 'add widest'
27
28 $ mkdir outside
29 $ echo 'outside' > outside/f
30 $ hg add outside/f
31 $ hg commit -m 'add outside'
32
33 $ cd ..
34
35 narrow clone the inside file
36
37 $ hg clone --narrow ssh://user@dummy/master narrow --include inside
38 requesting all changes
39 adding changesets
40 adding manifests
41 adding file changes
42 added 2 changesets with 1 changes to 1 files
43 new changesets *:* (glob)
44 updating to branch default
45 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
46 $ cd narrow
47 $ hg tracked
48 I path:inside
49 $ ls
50 inside
51 $ cat inside/f
52 inside
53 $ cd ..
54
55 add more upstream files which we will include in a wider narrow spec
56
57 $ cd master
58
59 $ mkdir wider
60 $ echo 'wider' > wider/f
61 $ hg add wider/f
62 $ echo 'widest v2' > widest/f
63 $ hg commit -m 'add wider, update widest'
64
65 $ echo 'widest v3' > widest/f
66 $ hg commit -m 'update widest v3'
67
68 $ echo 'inside v2' > inside/f
69 $ hg commit -m 'update inside'
70
71 $ mkdir outside2
72 $ echo 'outside2' > outside2/f
73 $ hg add outside2/f
74 $ hg commit -m 'add outside2'
75
76 $ echo 'widest v4' > widest/f
77 $ hg commit -m 'update widest v4'
78
79 $ hg log -T "{if(ellipsis, '...')}{rev}: {desc}\n"
80 7: update widest v4
81 6: add outside2
82 5: update inside
83 4: update widest v3
84 3: add wider, update widest
85 2: add outside
86 1: add widest
87 0: add inside
88
89 $ cd ..
90
91 Testing the --import-rules flag of `hg tracked` command
92
93 $ cd narrow
94 $ hg tracked --import-rules
95 hg tracked: option --import-rules requires argument
96 hg tracked [OPTIONS]... [REMOTE]
97
98 show or change the current narrowspec
99
100 options ([+] can be repeated):
101
102 --addinclude VALUE [+] new paths to include
103 --removeinclude VALUE [+] old paths to no longer include
104 --addexclude VALUE [+] new paths to exclude
105 --import-rules VALUE import narrowspecs from a file
106 --removeexclude VALUE [+] old paths to no longer exclude
107 --clear whether to replace the existing narrowspec
108 --force-delete-local-changes forces deletion of local changes when
109 narrowing
110 -e --ssh CMD specify ssh command to use
111 --remotecmd CMD specify hg command to run on the remote side
112 --insecure do not verify server certificate (ignoring
113 web.cacerts config)
114
115 (use 'hg tracked -h' to show more help)
116 [255]
117 $ hg tracked --import-rules doesnotexist
118 abort: cannot read narrowspecs from '$TESTTMP/narrow/doesnotexist': $ENOENT$
119 [255]
120
121 $ cat > specs <<EOF
122 > %include foo
123 > [include]
124 > path:widest/
125 > [exclude]
126 > path:inside/
127 > EOF
128
129 $ hg tracked --import-rules specs
130 abort: including other spec files using '%include' is not supported in narrowspec
131 [255]
132
133 $ cat > specs <<EOF
134 > [include]
135 > outisde
136 > [exclude]
137 > inside
138 > EOF
139
140 $ hg tracked --import-rules specs
141 comparing with ssh://user@dummy/master
142 searching for changes
143 looking for local changes to affected paths
144 deleting data/inside/f.i
145 deleting meta/inside/00manifest.i (tree !)
146 no changes found
147 saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-widen.hg (glob)
148 adding changesets
149 adding manifests
150 adding file changes
151 added 2 changesets with 0 changes to 0 files
152 new changesets *:* (glob)
153 $ hg tracked
154 I path:outisde
155 X path:inside
156
157 Testing the --import-rules flag with --addinclude and --addexclude
158
159 $ cat > specs <<EOF
160 > [include]
161 > widest
162 > EOF
163
164 $ hg tracked --import-rules specs --addinclude 'wider/'
165 comparing with ssh://user@dummy/master
166 searching for changes
167 no changes found
168 saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-widen.hg (glob)
169 adding changesets
170 adding manifests
171 adding file changes
172 added 3 changesets with 1 changes to 1 files
173 new changesets *:* (glob)
174 $ hg tracked
175 I path:outisde
176 I path:wider
177 I path:widest
178 X path:inside
179
180 $ cat > specs <<EOF
181 > [exclude]
182 > outside2
183 > EOF
184
185 $ hg tracked --import-rules specs --addexclude 'widest'
186 comparing with ssh://user@dummy/master
187 searching for changes
188 looking for local changes to affected paths
189 deleting data/widest/f.i
190 deleting meta/widest/00manifest.i (tree !)
191 $ hg tracked
192 I path:outisde
193 I path:wider
194 X path:inside
195 X path:outside2
196 X path:widest
197
198 $ hg tracked --import-rules specs --clear
199 The --clear option is not yet supported.
200 [1]
201
202 Testing with passing a out of wdir file
203
204 $ cat > ../nspecs <<EOF
205 > [include]
206 > widest
207 > EOF
208
209 $ hg tracked --import-rules ../nspecs
210 comparing with ssh://user@dummy/master
211 searching for changes
212 no changes found
213 saved backup bundle to $TESTTMP/narrow/.hg/strip-backup/*-widen.hg (glob)
214 adding changesets
215 adding manifests
216 adding file changes
217 added 3 changesets with 0 changes to 0 files
218 new changesets *:* (glob)
@@ -1,430 +1,449 b''
1 1 # narrowcommands.py - command modifications for narrowhg extension
2 2 #
3 3 # Copyright 2017 Google, Inc.
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7 from __future__ import absolute_import
8 8
9 9 import itertools
10 10 import os
11 11
12 12 from mercurial.i18n import _
13 13 from mercurial import (
14 14 cmdutil,
15 15 commands,
16 16 discovery,
17 encoding,
17 18 error,
18 19 exchange,
19 20 extensions,
20 21 hg,
21 22 merge,
22 23 narrowspec,
23 24 node,
24 25 pycompat,
25 26 registrar,
26 27 repair,
27 28 repository,
28 29 repoview,
29 30 sparse,
30 31 util,
31 32 )
32 33
33 34 from . import (
34 35 narrowbundle2,
35 36 )
36 37
37 38 table = {}
38 39 command = registrar.command(table)
39 40
40 41 def setup():
41 42 """Wraps user-facing mercurial commands with narrow-aware versions."""
42 43
43 44 entry = extensions.wrapcommand(commands.table, 'clone', clonenarrowcmd)
44 45 entry[1].append(('', 'narrow', None,
45 46 _("create a narrow clone of select files")))
46 47 entry[1].append(('', 'depth', '',
47 48 _("limit the history fetched by distance from heads")))
48 49 entry[1].append(('', 'narrowspec', '',
49 50 _("read narrowspecs from file")))
50 51 # TODO(durin42): unify sparse/narrow --include/--exclude logic a bit
51 52 if 'sparse' not in extensions.enabled():
52 53 entry[1].append(('', 'include', [],
53 54 _("specifically fetch this file/directory")))
54 55 entry[1].append(
55 56 ('', 'exclude', [],
56 57 _("do not fetch this file/directory, even if included")))
57 58
58 59 entry = extensions.wrapcommand(commands.table, 'pull', pullnarrowcmd)
59 60 entry[1].append(('', 'depth', '',
60 61 _("limit the history fetched by distance from heads")))
61 62
62 63 extensions.wrapcommand(commands.table, 'archive', archivenarrowcmd)
63 64
64 65 def expandpull(pullop, includepats, excludepats):
65 66 if not narrowspec.needsexpansion(includepats):
66 67 return includepats, excludepats
67 68
68 69 heads = pullop.heads or pullop.rheads
69 70 includepats, excludepats = pullop.remote.expandnarrow(
70 71 includepats, excludepats, heads)
71 72 pullop.repo.ui.debug('Expanded narrowspec to inc=%s, exc=%s\n' % (
72 73 includepats, excludepats))
73 74 return set(includepats), set(excludepats)
74 75
75 76 def clonenarrowcmd(orig, ui, repo, *args, **opts):
76 77 """Wraps clone command, so 'hg clone' first wraps localrepo.clone()."""
77 78 opts = pycompat.byteskwargs(opts)
78 79 wrappedextraprepare = util.nullcontextmanager()
79 80 opts_narrow = opts['narrow']
80 81 narrowspecfile = opts['narrowspec']
81 82
82 83 if narrowspecfile:
83 84 filepath = os.path.join(pycompat.getcwd(), narrowspecfile)
84 85 ui.status(_("reading narrowspec from '%s'\n") % filepath)
85 86 try:
86 87 fp = open(filepath, 'rb')
87 88 except IOError:
88 89 raise error.Abort(_("file '%s' not found") % filepath)
89 90
90 91 includes, excludes, profiles = sparse.parseconfig(ui, fp.read(),
91 92 'narrow')
92 93 if profiles:
93 94 raise error.Abort(_("cannot specify other files using '%include' in"
94 95 " narrowspec"))
95 96
96 97 # narrowspec is passed so we should assume that user wants narrow clone
97 98 opts_narrow = True
98 99 opts['include'].extend(includes)
99 100 opts['exclude'].extend(excludes)
100 101
101 102 if opts_narrow:
102 103 def pullbundle2extraprepare_widen(orig, pullop, kwargs):
103 104 # Create narrow spec patterns from clone flags
104 105 includepats = narrowspec.parsepatterns(opts['include'])
105 106 excludepats = narrowspec.parsepatterns(opts['exclude'])
106 107
107 108 # If necessary, ask the server to expand the narrowspec.
108 109 includepats, excludepats = expandpull(
109 110 pullop, includepats, excludepats)
110 111
111 112 if not includepats and excludepats:
112 113 # If nothing was included, we assume the user meant to include
113 114 # everything, except what they asked to exclude.
114 115 includepats = {'path:.'}
115 116
116 117 pullop.repo.setnarrowpats(includepats, excludepats)
117 118
118 119 # This will populate 'includepats' etc with the values from the
119 120 # narrowspec we just saved.
120 121 orig(pullop, kwargs)
121 122
122 123 if opts.get('depth'):
123 124 kwargs['depth'] = opts['depth']
124 125 wrappedextraprepare = extensions.wrappedfunction(exchange,
125 126 '_pullbundle2extraprepare', pullbundle2extraprepare_widen)
126 127
127 128 def pullnarrow(orig, repo, *args, **kwargs):
128 129 if opts_narrow:
129 130 repo.requirements.add(repository.NARROW_REQUIREMENT)
130 131 repo._writerequirements()
131 132
132 133 return orig(repo, *args, **kwargs)
133 134
134 135 wrappedpull = extensions.wrappedfunction(exchange, 'pull', pullnarrow)
135 136
136 137 with wrappedextraprepare, wrappedpull:
137 138 return orig(ui, repo, *args, **pycompat.strkwargs(opts))
138 139
139 140 def pullnarrowcmd(orig, ui, repo, *args, **opts):
140 141 """Wraps pull command to allow modifying narrow spec."""
141 142 wrappedextraprepare = util.nullcontextmanager()
142 143 if repository.NARROW_REQUIREMENT in repo.requirements:
143 144
144 145 def pullbundle2extraprepare_widen(orig, pullop, kwargs):
145 146 orig(pullop, kwargs)
146 147 if opts.get(r'depth'):
147 148 kwargs['depth'] = opts[r'depth']
148 149 wrappedextraprepare = extensions.wrappedfunction(exchange,
149 150 '_pullbundle2extraprepare', pullbundle2extraprepare_widen)
150 151
151 152 with wrappedextraprepare:
152 153 return orig(ui, repo, *args, **opts)
153 154
154 155 def archivenarrowcmd(orig, ui, repo, *args, **opts):
155 156 """Wraps archive command to narrow the default includes."""
156 157 if repository.NARROW_REQUIREMENT in repo.requirements:
157 158 repo_includes, repo_excludes = repo.narrowpats
158 159 includes = set(opts.get(r'include', []))
159 160 excludes = set(opts.get(r'exclude', []))
160 161 includes, excludes, unused_invalid = narrowspec.restrictpatterns(
161 162 includes, excludes, repo_includes, repo_excludes)
162 163 if includes:
163 164 opts[r'include'] = includes
164 165 if excludes:
165 166 opts[r'exclude'] = excludes
166 167 return orig(ui, repo, *args, **opts)
167 168
168 169 def pullbundle2extraprepare(orig, pullop, kwargs):
169 170 repo = pullop.repo
170 171 if repository.NARROW_REQUIREMENT not in repo.requirements:
171 172 return orig(pullop, kwargs)
172 173
173 174 if narrowbundle2.NARROWCAP not in pullop.remotebundle2caps:
174 175 raise error.Abort(_("server doesn't support narrow clones"))
175 176 orig(pullop, kwargs)
176 177 kwargs['narrow'] = True
177 178 include, exclude = repo.narrowpats
178 179 kwargs['oldincludepats'] = include
179 180 kwargs['oldexcludepats'] = exclude
180 181 kwargs['includepats'] = include
181 182 kwargs['excludepats'] = exclude
182 183 kwargs['known'] = [node.hex(ctx.node()) for ctx in
183 184 repo.set('::%ln', pullop.common)
184 185 if ctx.node() != node.nullid]
185 186 if not kwargs['known']:
186 187 # Mercurial serialized an empty list as '' and deserializes it as
187 188 # [''], so delete it instead to avoid handling the empty string on the
188 189 # server.
189 190 del kwargs['known']
190 191
191 192 extensions.wrapfunction(exchange,'_pullbundle2extraprepare',
192 193 pullbundle2extraprepare)
193 194
194 195 def _narrow(ui, repo, remote, commoninc, oldincludes, oldexcludes,
195 196 newincludes, newexcludes, force):
196 197 oldmatch = narrowspec.match(repo.root, oldincludes, oldexcludes)
197 198 newmatch = narrowspec.match(repo.root, newincludes, newexcludes)
198 199
199 200 # This is essentially doing "hg outgoing" to find all local-only
200 201 # commits. We will then check that the local-only commits don't
201 202 # have any changes to files that will be untracked.
202 203 unfi = repo.unfiltered()
203 204 outgoing = discovery.findcommonoutgoing(unfi, remote,
204 205 commoninc=commoninc)
205 206 ui.status(_('looking for local changes to affected paths\n'))
206 207 localnodes = []
207 208 for n in itertools.chain(outgoing.missing, outgoing.excluded):
208 209 if any(oldmatch(f) and not newmatch(f) for f in unfi[n].files()):
209 210 localnodes.append(n)
210 211 revstostrip = unfi.revs('descendants(%ln)', localnodes)
211 212 hiddenrevs = repoview.filterrevs(repo, 'visible')
212 213 visibletostrip = list(repo.changelog.node(r)
213 214 for r in (revstostrip - hiddenrevs))
214 215 if visibletostrip:
215 216 ui.status(_('The following changeset(s) or their ancestors have '
216 217 'local changes not on the remote:\n'))
217 218 maxnodes = 10
218 219 if ui.verbose or len(visibletostrip) <= maxnodes:
219 220 for n in visibletostrip:
220 221 ui.status('%s\n' % node.short(n))
221 222 else:
222 223 for n in visibletostrip[:maxnodes]:
223 224 ui.status('%s\n' % node.short(n))
224 225 ui.status(_('...and %d more, use --verbose to list all\n') %
225 226 (len(visibletostrip) - maxnodes))
226 227 if not force:
227 228 raise error.Abort(_('local changes found'),
228 229 hint=_('use --force-delete-local-changes to '
229 230 'ignore'))
230 231
231 232 with ui.uninterruptable():
232 233 if revstostrip:
233 234 tostrip = [unfi.changelog.node(r) for r in revstostrip]
234 235 if repo['.'].node() in tostrip:
235 236 # stripping working copy, so move to a different commit first
236 237 urev = max(repo.revs('(::%n) - %ln + null',
237 238 repo['.'].node(), visibletostrip))
238 239 hg.clean(repo, urev)
239 240 repair.strip(ui, unfi, tostrip, topic='narrow')
240 241
241 242 todelete = []
242 243 for f, f2, size in repo.store.datafiles():
243 244 if f.startswith('data/'):
244 245 file = f[5:-2]
245 246 if not newmatch(file):
246 247 todelete.append(f)
247 248 elif f.startswith('meta/'):
248 249 dir = f[5:-13]
249 250 dirs = ['.'] + sorted(util.dirs({dir})) + [dir]
250 251 include = True
251 252 for d in dirs:
252 253 visit = newmatch.visitdir(d)
253 254 if not visit:
254 255 include = False
255 256 break
256 257 if visit == 'all':
257 258 break
258 259 if not include:
259 260 todelete.append(f)
260 261
261 262 repo.destroying()
262 263
263 264 with repo.transaction("narrowing"):
264 265 for f in todelete:
265 266 ui.status(_('deleting %s\n') % f)
266 267 util.unlinkpath(repo.svfs.join(f))
267 268 repo.store.markremoved(f)
268 269
269 270 for f in repo.dirstate:
270 271 if not newmatch(f):
271 272 repo.dirstate.drop(f)
272 273 repo.wvfs.unlinkpath(f)
273 274 repo.setnarrowpats(newincludes, newexcludes)
274 275
275 276 repo.destroyed()
276 277
277 278 def _widen(ui, repo, remote, commoninc, newincludes, newexcludes):
278 279 newmatch = narrowspec.match(repo.root, newincludes, newexcludes)
279 280
280 281 # TODO(martinvonz): Get expansion working with widening/narrowing.
281 282 if narrowspec.needsexpansion(newincludes):
282 283 raise error.Abort('Expansion not yet supported on pull')
283 284
284 285 def pullbundle2extraprepare_widen(orig, pullop, kwargs):
285 286 orig(pullop, kwargs)
286 287 # The old{in,ex}cludepats have already been set by orig()
287 288 kwargs['includepats'] = newincludes
288 289 kwargs['excludepats'] = newexcludes
289 290 kwargs['widen'] = True
290 291 wrappedextraprepare = extensions.wrappedfunction(exchange,
291 292 '_pullbundle2extraprepare', pullbundle2extraprepare_widen)
292 293
293 294 # define a function that narrowbundle2 can call after creating the
294 295 # backup bundle, but before applying the bundle from the server
295 296 def setnewnarrowpats():
296 297 repo.setnarrowpats(newincludes, newexcludes)
297 298 repo.setnewnarrowpats = setnewnarrowpats
298 299
299 300 with ui.uninterruptable():
300 301 ds = repo.dirstate
301 302 p1, p2 = ds.p1(), ds.p2()
302 303 with ds.parentchange():
303 304 ds.setparents(node.nullid, node.nullid)
304 305 common = commoninc[0]
305 306 with wrappedextraprepare:
306 307 exchange.pull(repo, remote, heads=common)
307 308 with ds.parentchange():
308 309 ds.setparents(p1, p2)
309 310
310 311 repo.setnewnarrowpats()
311 312 actions = {k: [] for k in 'a am f g cd dc r dm dg m e k p pr'.split()}
312 313 addgaction = actions['g'].append
313 314
314 315 mf = repo['.'].manifest().matches(newmatch)
315 316 for f, fn in mf.iteritems():
316 317 if f not in repo.dirstate:
317 318 addgaction((f, (mf.flags(f), False),
318 319 "add from widened narrow clone"))
319 320
320 321 merge.applyupdates(repo, actions, wctx=repo[None],
321 322 mctx=repo['.'], overwrite=False)
322 323 merge.recordupdates(repo, actions, branchmerge=False)
323 324
324 325 # TODO(rdamazio): Make new matcher format and update description
325 326 @command('tracked',
326 327 [('', 'addinclude', [], _('new paths to include')),
327 328 ('', 'removeinclude', [], _('old paths to no longer include')),
328 329 ('', 'addexclude', [], _('new paths to exclude')),
330 ('', 'import-rules', '', _('import narrowspecs from a file')),
329 331 ('', 'removeexclude', [], _('old paths to no longer exclude')),
330 332 ('', 'clear', False, _('whether to replace the existing narrowspec')),
331 333 ('', 'force-delete-local-changes', False,
332 334 _('forces deletion of local changes when narrowing')),
333 335 ] + commands.remoteopts,
334 336 _('[OPTIONS]... [REMOTE]'),
335 337 inferrepo=True)
336 338 def trackedcmd(ui, repo, remotepath=None, *pats, **opts):
337 339 """show or change the current narrowspec
338 340
339 341 With no argument, shows the current narrowspec entries, one per line. Each
340 342 line will be prefixed with 'I' or 'X' for included or excluded patterns,
341 343 respectively.
342 344
343 345 The narrowspec is comprised of expressions to match remote files and/or
344 346 directories that should be pulled into your client.
345 347 The narrowspec has *include* and *exclude* expressions, with excludes always
346 348 trumping includes: that is, if a file matches an exclude expression, it will
347 349 be excluded even if it also matches an include expression.
348 350 Excluding files that were never included has no effect.
349 351
350 352 Each included or excluded entry is in the format described by
351 353 'hg help patterns'.
352 354
353 355 The options allow you to add or remove included and excluded expressions.
354 356
355 357 If --clear is specified, then all previous includes and excludes are DROPPED
356 358 and replaced by the new ones specified to --addinclude and --addexclude.
357 359 If --clear is specified without any further options, the narrowspec will be
358 360 empty and will not match any files.
359 361 """
360 362 opts = pycompat.byteskwargs(opts)
361 363 if repository.NARROW_REQUIREMENT not in repo.requirements:
362 364 ui.warn(_('The narrow command is only supported on respositories cloned'
363 365 ' with --narrow.\n'))
364 366 return 1
365 367
366 368 # Before supporting, decide whether it "hg tracked --clear" should mean
367 369 # tracking no paths or all paths.
368 370 if opts['clear']:
369 371 ui.warn(_('The --clear option is not yet supported.\n'))
370 372 return 1
371 373
374 # import rules from a file
375 newrules = opts.get('import_rules')
376 if newrules:
377 try:
378 filepath = os.path.join(pycompat.getcwd(), newrules)
379 fdata = util.readfile(filepath)
380 except IOError as inst:
381 raise error.Abort(_("cannot read narrowspecs from '%s': %s") %
382 (filepath, encoding.strtolocal(inst.strerror)))
383 includepats, excludepats, profiles = sparse.parseconfig(ui, fdata,
384 'narrow')
385 if profiles:
386 raise error.Abort(_("including other spec files using '%include' "
387 "is not supported in narrowspec"))
388 opts['addinclude'].extend(includepats)
389 opts['addexclude'].extend(excludepats)
390
372 391 if narrowspec.needsexpansion(opts['addinclude'] + opts['addexclude']):
373 392 raise error.Abort('Expansion not yet supported on widen/narrow')
374 393
375 394 addedincludes = narrowspec.parsepatterns(opts['addinclude'])
376 395 removedincludes = narrowspec.parsepatterns(opts['removeinclude'])
377 396 addedexcludes = narrowspec.parsepatterns(opts['addexclude'])
378 397 removedexcludes = narrowspec.parsepatterns(opts['removeexclude'])
379 398 widening = addedincludes or removedexcludes
380 399 narrowing = removedincludes or addedexcludes
381 400 only_show = not widening and not narrowing
382 401
383 402 # Only print the current narrowspec.
384 403 if only_show:
385 404 include, exclude = repo.narrowpats
386 405
387 406 ui.pager('tracked')
388 407 fm = ui.formatter('narrow', opts)
389 408 for i in sorted(include):
390 409 fm.startitem()
391 410 fm.write('status', '%s ', 'I', label='narrow.included')
392 411 fm.write('pat', '%s\n', i, label='narrow.included')
393 412 for i in sorted(exclude):
394 413 fm.startitem()
395 414 fm.write('status', '%s ', 'X', label='narrow.excluded')
396 415 fm.write('pat', '%s\n', i, label='narrow.excluded')
397 416 fm.end()
398 417 return 0
399 418
400 419 with repo.wlock(), repo.lock():
401 420 cmdutil.bailifchanged(repo)
402 421
403 422 # Find the revisions we have in common with the remote. These will
404 423 # be used for finding local-only changes for narrowing. They will
405 424 # also define the set of revisions to update for widening.
406 425 remotepath = ui.expandpath(remotepath or 'default')
407 426 url, branches = hg.parseurl(remotepath)
408 427 ui.status(_('comparing with %s\n') % util.hidepassword(url))
409 428 remote = hg.peer(repo, opts, url)
410 429 commoninc = discovery.findcommonincoming(repo, remote)
411 430
412 431 oldincludes, oldexcludes = repo.narrowpats
413 432 if narrowing:
414 433 newincludes = oldincludes - removedincludes
415 434 newexcludes = oldexcludes | addedexcludes
416 435 _narrow(ui, repo, remote, commoninc, oldincludes, oldexcludes,
417 436 newincludes, newexcludes,
418 437 opts['force_delete_local_changes'])
419 438 # _narrow() updated the narrowspec and _widen() below needs to
420 439 # use the updated values as its base (otherwise removed includes
421 440 # and addedexcludes will be lost in the resulting narrowspec)
422 441 oldincludes = newincludes
423 442 oldexcludes = newexcludes
424 443
425 444 if widening:
426 445 newincludes = oldincludes | addedincludes
427 446 newexcludes = oldexcludes - removedexcludes
428 447 _widen(ui, repo, remote, commoninc, newincludes, newexcludes)
429 448
430 449 return 0
General Comments 0
You need to be logged in to leave comments. Login now