249 fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3]) |
249 fns = fncache.get(rev) or filter(matchfn, getchange(rev)[3]) |
250 yield 'add', rev, fns |
250 yield 'add', rev, fns |
251 for rev in nrevs: |
251 for rev in nrevs: |
252 yield 'iter', rev, None |
252 yield 'iter', rev, None |
253 return iterate(), getchange, matchfn |
253 return iterate(), getchange, matchfn |
254 |
|
255 revrangesep = ':' |
|
256 |
|
257 def revfix(repo, val, defval): |
|
258 '''turn user-level id of changeset into rev number. |
|
259 user-level id can be tag, changeset, rev number, or negative rev |
|
260 number relative to number of revs (-1 is tip, etc).''' |
|
261 if not val: |
|
262 return defval |
|
263 try: |
|
264 num = int(val) |
|
265 if str(num) != val: |
|
266 raise ValueError |
|
267 if num < 0: |
|
268 num += repo.changelog.count() |
|
269 if num < 0: |
|
270 num = 0 |
|
271 elif num >= repo.changelog.count(): |
|
272 raise ValueError |
|
273 except ValueError: |
|
274 try: |
|
275 num = repo.changelog.rev(repo.lookup(val)) |
|
276 except KeyError: |
|
277 raise util.Abort(_('invalid revision identifier %s') % val) |
|
278 return num |
|
279 |
|
280 def revpair(ui, repo, revs): |
|
281 '''return pair of nodes, given list of revisions. second item can |
|
282 be None, meaning use working dir.''' |
|
283 if not revs: |
|
284 return repo.dirstate.parents()[0], None |
|
285 end = None |
|
286 if len(revs) == 1: |
|
287 start = revs[0] |
|
288 if revrangesep in start: |
|
289 start, end = start.split(revrangesep, 1) |
|
290 start = revfix(repo, start, 0) |
|
291 end = revfix(repo, end, repo.changelog.count() - 1) |
|
292 else: |
|
293 start = revfix(repo, start, None) |
|
294 elif len(revs) == 2: |
|
295 if revrangesep in revs[0] or revrangesep in revs[1]: |
|
296 raise util.Abort(_('too many revisions specified')) |
|
297 start = revfix(repo, revs[0], None) |
|
298 end = revfix(repo, revs[1], None) |
|
299 else: |
|
300 raise util.Abort(_('too many revisions specified')) |
|
301 if end is not None: end = repo.lookup(str(end)) |
|
302 return repo.lookup(str(start)), end |
|
303 |
|
304 def revrange(ui, repo, revs): |
|
305 """Yield revision as strings from a list of revision specifications.""" |
|
306 seen = {} |
|
307 for spec in revs: |
|
308 if revrangesep in spec: |
|
309 start, end = spec.split(revrangesep, 1) |
|
310 start = revfix(repo, start, 0) |
|
311 end = revfix(repo, end, repo.changelog.count() - 1) |
|
312 step = start > end and -1 or 1 |
|
313 for rev in xrange(start, end+step, step): |
|
314 if rev in seen: |
|
315 continue |
|
316 seen[rev] = 1 |
|
317 yield str(rev) |
|
318 else: |
|
319 rev = revfix(repo, spec, None) |
|
320 if rev in seen: |
|
321 continue |
|
322 seen[rev] = 1 |
|
323 yield str(rev) |
|
324 |
254 |
325 def write_bundle(cg, filename=None, compress=True): |
255 def write_bundle(cg, filename=None, compress=True): |
326 """Write a bundle file and return its filename. |
256 """Write a bundle file and return its filename. |
327 |
257 |
328 Existing files will not be overwritten. |
258 Existing files will not be overwritten. |
1342 |
1272 |
1343 Without the -a option, diff will avoid generating diffs of files |
1273 Without the -a option, diff will avoid generating diffs of files |
1344 it detects as binary. With -a, diff will generate a diff anyway, |
1274 it detects as binary. With -a, diff will generate a diff anyway, |
1345 probably with undesirable results. |
1275 probably with undesirable results. |
1346 """ |
1276 """ |
1347 node1, node2 = revpair(ui, repo, opts['rev']) |
1277 node1, node2 = cmdutil.revpair(ui, repo, opts['rev']) |
1348 |
1278 |
1349 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts) |
1279 fns, matchfn, anypats = cmdutil.matchpats(repo, pats, opts) |
1350 |
1280 |
1351 patch.diff(repo, node1, node2, fns, match=matchfn, |
1281 patch.diff(repo, node1, node2, fns, match=matchfn, |
1352 opts=patch.diffopts(ui, opts)) |
1282 opts=patch.diffopts(ui, opts)) |
1378 With the --switch-parent option, the diff will be against the second |
1308 With the --switch-parent option, the diff will be against the second |
1379 parent. It can be useful to review a merge. |
1309 parent. It can be useful to review a merge. |
1380 """ |
1310 """ |
1381 if not changesets: |
1311 if not changesets: |
1382 raise util.Abort(_("export requires at least one changeset")) |
1312 raise util.Abort(_("export requires at least one changeset")) |
1383 revs = list(revrange(ui, repo, changesets)) |
1313 revs = list(cmdutil.revrange(ui, repo, changesets)) |
1384 if len(revs) > 1: |
1314 if len(revs) > 1: |
1385 ui.note(_('exporting patches:\n')) |
1315 ui.note(_('exporting patches:\n')) |
1386 else: |
1316 else: |
1387 ui.note(_('exporting patch:\n')) |
1317 ui.note(_('exporting patch:\n')) |
1388 patch.export(repo, map(repo.lookup, revs), template=opts['output'], |
1318 patch.export(repo, map(repo.lookup, revs), template=opts['output'], |