194 # i18n: "rev" is a keyword |
200 # i18n: "rev" is a keyword |
195 raise error.ParseError(_("rev expects a number")) |
201 raise error.ParseError(_("rev expects a number")) |
196 return [r for r in subset if r == l] |
202 return [r for r in subset if r == l] |
197 |
203 |
198 def p1(repo, subset, x): |
204 def p1(repo, subset, x): |
|
205 """``p1(set)`` |
|
206 First parent of changesets in set. |
|
207 """ |
199 ps = set() |
208 ps = set() |
200 cl = repo.changelog |
209 cl = repo.changelog |
201 for r in getset(repo, range(len(repo)), x): |
210 for r in getset(repo, range(len(repo)), x): |
202 ps.add(cl.parentrevs(r)[0]) |
211 ps.add(cl.parentrevs(r)[0]) |
203 return [r for r in subset if r in ps] |
212 return [r for r in subset if r in ps] |
204 |
213 |
205 def p2(repo, subset, x): |
214 def p2(repo, subset, x): |
|
215 """``p2(set)`` |
|
216 Second parent of changesets in set. |
|
217 """ |
206 ps = set() |
218 ps = set() |
207 cl = repo.changelog |
219 cl = repo.changelog |
208 for r in getset(repo, range(len(repo)), x): |
220 for r in getset(repo, range(len(repo)), x): |
209 ps.add(cl.parentrevs(r)[1]) |
221 ps.add(cl.parentrevs(r)[1]) |
210 return [r for r in subset if r in ps] |
222 return [r for r in subset if r in ps] |
211 |
223 |
212 def parents(repo, subset, x): |
224 def parents(repo, subset, x): |
|
225 """``parents(set)`` |
|
226 The set of all parents for all changesets in set. |
|
227 """ |
213 ps = set() |
228 ps = set() |
214 cl = repo.changelog |
229 cl = repo.changelog |
215 for r in getset(repo, range(len(repo)), x): |
230 for r in getset(repo, range(len(repo)), x): |
216 ps.update(cl.parentrevs(r)) |
231 ps.update(cl.parentrevs(r)) |
217 return [r for r in subset if r in ps] |
232 return [r for r in subset if r in ps] |
218 |
233 |
219 def maxrev(repo, subset, x): |
234 def maxrev(repo, subset, x): |
|
235 """``max(set)`` |
|
236 Changeset with highest revision number in set. |
|
237 """ |
220 s = getset(repo, subset, x) |
238 s = getset(repo, subset, x) |
221 if s: |
239 if s: |
222 m = max(s) |
240 m = max(s) |
223 if m in subset: |
241 if m in subset: |
224 return [m] |
242 return [m] |
225 return [] |
243 return [] |
226 |
244 |
227 def minrev(repo, subset, x): |
245 def minrev(repo, subset, x): |
|
246 """``min(set)`` |
|
247 Changeset with lowest revision number in set. |
|
248 """ |
228 s = getset(repo, subset, x) |
249 s = getset(repo, subset, x) |
229 if s: |
250 if s: |
230 m = min(s) |
251 m = min(s) |
231 if m in subset: |
252 if m in subset: |
232 return [m] |
253 return [m] |
233 return [] |
254 return [] |
234 |
255 |
235 def limit(repo, subset, x): |
256 def limit(repo, subset, x): |
|
257 """``limit(set, n)`` |
|
258 First n members of set. |
|
259 """ |
236 # i18n: "limit" is a keyword |
260 # i18n: "limit" is a keyword |
237 l = getargs(x, 2, 2, _("limit requires two arguments")) |
261 l = getargs(x, 2, 2, _("limit requires two arguments")) |
238 try: |
262 try: |
239 # i18n: "limit" is a keyword |
263 # i18n: "limit" is a keyword |
240 lim = int(getstring(l[1], _("limit requires a number"))) |
264 lim = int(getstring(l[1], _("limit requires a number"))) |
242 # i18n: "limit" is a keyword |
266 # i18n: "limit" is a keyword |
243 raise error.ParseError(_("limit expects a number")) |
267 raise error.ParseError(_("limit expects a number")) |
244 return getset(repo, subset, l[0])[:lim] |
268 return getset(repo, subset, l[0])[:lim] |
245 |
269 |
246 def children(repo, subset, x): |
270 def children(repo, subset, x): |
|
271 """``children(set)`` |
|
272 Child changesets of changesets in set. |
|
273 """ |
247 cs = set() |
274 cs = set() |
248 cl = repo.changelog |
275 cl = repo.changelog |
249 s = set(getset(repo, range(len(repo)), x)) |
276 s = set(getset(repo, range(len(repo)), x)) |
250 for r in xrange(0, len(repo)): |
277 for r in xrange(0, len(repo)): |
251 for p in cl.parentrevs(r): |
278 for p in cl.parentrevs(r): |
252 if p in s: |
279 if p in s: |
253 cs.add(r) |
280 cs.add(r) |
254 return [r for r in subset if r in cs] |
281 return [r for r in subset if r in cs] |
255 |
282 |
256 def branch(repo, subset, x): |
283 def branch(repo, subset, x): |
|
284 """``branch(set)`` |
|
285 All changesets belonging to the branches of changesets in set. |
|
286 """ |
257 s = getset(repo, range(len(repo)), x) |
287 s = getset(repo, range(len(repo)), x) |
258 b = set() |
288 b = set() |
259 for r in s: |
289 for r in s: |
260 b.add(repo[r].branch()) |
290 b.add(repo[r].branch()) |
261 s = set(s) |
291 s = set(s) |
262 return [r for r in subset if r in s or repo[r].branch() in b] |
292 return [r for r in subset if r in s or repo[r].branch() in b] |
263 |
293 |
264 def ancestor(repo, subset, x): |
294 def ancestor(repo, subset, x): |
|
295 """``ancestor(single, single)`` |
|
296 Greatest common ancestor of the two changesets. |
|
297 """ |
265 # i18n: "ancestor" is a keyword |
298 # i18n: "ancestor" is a keyword |
266 l = getargs(x, 2, 2, _("ancestor requires two arguments")) |
299 l = getargs(x, 2, 2, _("ancestor requires two arguments")) |
267 r = range(len(repo)) |
300 r = range(len(repo)) |
268 a = getset(repo, r, l[0]) |
301 a = getset(repo, r, l[0]) |
269 b = getset(repo, r, l[1]) |
302 b = getset(repo, r, l[1]) |
273 an = [repo[a[0]].ancestor(repo[b[0]]).rev()] |
306 an = [repo[a[0]].ancestor(repo[b[0]]).rev()] |
274 |
307 |
275 return [r for r in an if r in subset] |
308 return [r for r in an if r in subset] |
276 |
309 |
277 def ancestors(repo, subset, x): |
310 def ancestors(repo, subset, x): |
|
311 """``ancestors(set)`` |
|
312 Changesets that are ancestors of a changeset in set. |
|
313 """ |
278 args = getset(repo, range(len(repo)), x) |
314 args = getset(repo, range(len(repo)), x) |
279 if not args: |
315 if not args: |
280 return [] |
316 return [] |
281 s = set(repo.changelog.ancestors(*args)) | set(args) |
317 s = set(repo.changelog.ancestors(*args)) | set(args) |
282 return [r for r in subset if r in s] |
318 return [r for r in subset if r in s] |
283 |
319 |
284 def descendants(repo, subset, x): |
320 def descendants(repo, subset, x): |
|
321 """``descendants(set)`` |
|
322 Changesets which are descendants of changesets in set. |
|
323 """ |
285 args = getset(repo, range(len(repo)), x) |
324 args = getset(repo, range(len(repo)), x) |
286 if not args: |
325 if not args: |
287 return [] |
326 return [] |
288 s = set(repo.changelog.descendants(*args)) | set(args) |
327 s = set(repo.changelog.descendants(*args)) | set(args) |
289 return [r for r in subset if r in s] |
328 return [r for r in subset if r in s] |
290 |
329 |
291 def follow(repo, subset, x): |
330 def follow(repo, subset, x): |
|
331 """``follow()`` |
|
332 An alias for ``::.`` (ancestors of the working copy's first parent). |
|
333 """ |
292 # i18n: "follow" is a keyword |
334 # i18n: "follow" is a keyword |
293 getargs(x, 0, 0, _("follow takes no arguments")) |
335 getargs(x, 0, 0, _("follow takes no arguments")) |
294 p = repo['.'].rev() |
336 p = repo['.'].rev() |
295 s = set(repo.changelog.ancestors(p)) | set([p]) |
337 s = set(repo.changelog.ancestors(p)) | set([p]) |
296 return [r for r in subset if r in s] |
338 return [r for r in subset if r in s] |
297 |
339 |
298 def date(repo, subset, x): |
340 def date(repo, subset, x): |
|
341 """``date(interval)`` |
|
342 Changesets within the interval, see :hg:`help dates`. |
|
343 """ |
299 # i18n: "date" is a keyword |
344 # i18n: "date" is a keyword |
300 ds = getstring(x, _("date requires a string")) |
345 ds = getstring(x, _("date requires a string")) |
301 dm = util.matchdate(ds) |
346 dm = util.matchdate(ds) |
302 return [r for r in subset if dm(repo[r].date()[0])] |
347 return [r for r in subset if dm(repo[r].date()[0])] |
303 |
348 |
304 def keyword(repo, subset, x): |
349 def keyword(repo, subset, x): |
|
350 """``keyword(string)`` |
|
351 Search commit message, user name, and names of changed files for |
|
352 string. |
|
353 """ |
305 # i18n: "keyword" is a keyword |
354 # i18n: "keyword" is a keyword |
306 kw = getstring(x, _("keyword requires a string")).lower() |
355 kw = getstring(x, _("keyword requires a string")).lower() |
307 l = [] |
356 l = [] |
308 for r in subset: |
357 for r in subset: |
309 c = repo[r] |
358 c = repo[r] |
326 l.append(r) |
379 l.append(r) |
327 continue |
380 continue |
328 return l |
381 return l |
329 |
382 |
330 def author(repo, subset, x): |
383 def author(repo, subset, x): |
|
384 """``author(string)`` |
|
385 Alias for ``user(string)``. |
|
386 """ |
331 # i18n: "author" is a keyword |
387 # i18n: "author" is a keyword |
332 n = getstring(x, _("author requires a string")).lower() |
388 n = getstring(x, _("author requires a string")).lower() |
333 return [r for r in subset if n in repo[r].user().lower()] |
389 return [r for r in subset if n in repo[r].user().lower()] |
334 |
390 |
|
391 def user(repo, subset, x): |
|
392 """``user(string)`` |
|
393 User name is string. |
|
394 """ |
|
395 return author(repo, subset, x) |
|
396 |
335 def hasfile(repo, subset, x): |
397 def hasfile(repo, subset, x): |
|
398 """``file(pattern)`` |
|
399 Changesets affecting files matched by pattern. |
|
400 """ |
336 # i18n: "file" is a keyword |
401 # i18n: "file" is a keyword |
337 pat = getstring(x, _("file requires a pattern")) |
402 pat = getstring(x, _("file requires a pattern")) |
338 m = matchmod.match(repo.root, repo.getcwd(), [pat]) |
403 m = matchmod.match(repo.root, repo.getcwd(), [pat]) |
339 s = [] |
404 s = [] |
340 for r in subset: |
405 for r in subset: |
388 s.append(r) |
456 s.append(r) |
389 continue |
457 continue |
390 return s |
458 return s |
391 |
459 |
392 def modifies(repo, subset, x): |
460 def modifies(repo, subset, x): |
|
461 """``modifies(pattern)`` |
|
462 Changesets modifying files matched by pattern. |
|
463 """ |
393 # i18n: "modifies" is a keyword |
464 # i18n: "modifies" is a keyword |
394 pat = getstring(x, _("modifies requires a pattern")) |
465 pat = getstring(x, _("modifies requires a pattern")) |
395 return checkstatus(repo, subset, pat, 0) |
466 return checkstatus(repo, subset, pat, 0) |
396 |
467 |
397 def adds(repo, subset, x): |
468 def adds(repo, subset, x): |
|
469 """``adds(pattern)`` |
|
470 Changesets that add a file matching pattern. |
|
471 """ |
398 # i18n: "adds" is a keyword |
472 # i18n: "adds" is a keyword |
399 pat = getstring(x, _("adds requires a pattern")) |
473 pat = getstring(x, _("adds requires a pattern")) |
400 return checkstatus(repo, subset, pat, 1) |
474 return checkstatus(repo, subset, pat, 1) |
401 |
475 |
402 def removes(repo, subset, x): |
476 def removes(repo, subset, x): |
|
477 """``removes(pattern)`` |
|
478 Changesets which remove files matching pattern. |
|
479 """ |
403 # i18n: "removes" is a keyword |
480 # i18n: "removes" is a keyword |
404 pat = getstring(x, _("removes requires a pattern")) |
481 pat = getstring(x, _("removes requires a pattern")) |
405 return checkstatus(repo, subset, pat, 2) |
482 return checkstatus(repo, subset, pat, 2) |
406 |
483 |
407 def merge(repo, subset, x): |
484 def merge(repo, subset, x): |
|
485 """``merge()`` |
|
486 Changeset is a merge changeset. |
|
487 """ |
408 # i18n: "merge" is a keyword |
488 # i18n: "merge" is a keyword |
409 getargs(x, 0, 0, _("merge takes no arguments")) |
489 getargs(x, 0, 0, _("merge takes no arguments")) |
410 cl = repo.changelog |
490 cl = repo.changelog |
411 return [r for r in subset if cl.parentrevs(r)[1] != -1] |
491 return [r for r in subset if cl.parentrevs(r)[1] != -1] |
412 |
492 |
413 def closed(repo, subset, x): |
493 def closed(repo, subset, x): |
|
494 """``closed()`` |
|
495 Changeset is closed. |
|
496 """ |
414 # i18n: "closed" is a keyword |
497 # i18n: "closed" is a keyword |
415 getargs(x, 0, 0, _("closed takes no arguments")) |
498 getargs(x, 0, 0, _("closed takes no arguments")) |
416 return [r for r in subset if repo[r].extra().get('close')] |
499 return [r for r in subset if repo[r].extra().get('close')] |
417 |
500 |
418 def head(repo, subset, x): |
501 def head(repo, subset, x): |
|
502 """``head()`` |
|
503 Changeset is a named branch head. |
|
504 """ |
419 # i18n: "head" is a keyword |
505 # i18n: "head" is a keyword |
420 getargs(x, 0, 0, _("head takes no arguments")) |
506 getargs(x, 0, 0, _("head takes no arguments")) |
421 hs = set() |
507 hs = set() |
422 for b, ls in repo.branchmap().iteritems(): |
508 for b, ls in repo.branchmap().iteritems(): |
423 hs.update(repo[h].rev() for h in ls) |
509 hs.update(repo[h].rev() for h in ls) |
424 return [r for r in subset if r in hs] |
510 return [r for r in subset if r in hs] |
425 |
511 |
426 def reverse(repo, subset, x): |
512 def reverse(repo, subset, x): |
|
513 """``reverse(set)`` |
|
514 Reverse order of set. |
|
515 """ |
427 l = getset(repo, subset, x) |
516 l = getset(repo, subset, x) |
428 l.reverse() |
517 l.reverse() |
429 return l |
518 return l |
430 |
519 |
431 def present(repo, subset, x): |
520 def present(repo, subset, x): |
|
521 """``present(set)`` |
|
522 An empty set, if any revision in set isn't found; otherwise, |
|
523 all revisions in set. |
|
524 """ |
432 try: |
525 try: |
433 return getset(repo, subset, x) |
526 return getset(repo, subset, x) |
434 except error.RepoLookupError: |
527 except error.RepoLookupError: |
435 return [] |
528 return [] |
436 |
529 |
437 def sort(repo, subset, x): |
530 def sort(repo, subset, x): |
|
531 """``sort(set[, [-]key...])`` |
|
532 Sort set by keys. The default sort order is ascending, specify a key |
|
533 as ``-key`` to sort in descending order. |
|
534 |
|
535 The keys can be: |
|
536 |
|
537 - ``rev`` for the revision number, |
|
538 - ``branch`` for the branch name, |
|
539 - ``desc`` for the commit message (description), |
|
540 - ``user`` for user name (``author`` can be used as an alias), |
|
541 - ``date`` for the commit date |
|
542 """ |
438 # i18n: "sort" is a keyword |
543 # i18n: "sort" is a keyword |
439 l = getargs(x, 1, 2, _("sort requires one or two arguments")) |
544 l = getargs(x, 1, 2, _("sort requires one or two arguments")) |
440 keys = "rev" |
545 keys = "rev" |
441 if len(l) == 2: |
546 if len(l) == 2: |
442 keys = getstring(l[1], _("sort spec must be a string")) |
547 keys = getstring(l[1], _("sort spec must be a string")) |
476 l.append(e) |
581 l.append(e) |
477 l.sort() |
582 l.sort() |
478 return [e[-1] for e in l] |
583 return [e[-1] for e in l] |
479 |
584 |
480 def getall(repo, subset, x): |
585 def getall(repo, subset, x): |
|
586 """``all()`` |
|
587 All changesets, the same as ``0:tip``. |
|
588 """ |
481 # i18n: "all" is a keyword |
589 # i18n: "all" is a keyword |
482 getargs(x, 0, 0, _("all takes no arguments")) |
590 getargs(x, 0, 0, _("all takes no arguments")) |
483 return subset |
591 return subset |
484 |
592 |
485 def heads(repo, subset, x): |
593 def heads(repo, subset, x): |
|
594 """``heads(set)`` |
|
595 Members of set with no children in set. |
|
596 """ |
486 s = getset(repo, subset, x) |
597 s = getset(repo, subset, x) |
487 ps = set(parents(repo, subset, x)) |
598 ps = set(parents(repo, subset, x)) |
488 return [r for r in s if r not in ps] |
599 return [r for r in s if r not in ps] |
489 |
600 |
490 def roots(repo, subset, x): |
601 def roots(repo, subset, x): |
|
602 """``roots(set)`` |
|
603 Changesets with no parent changeset in set. |
|
604 """ |
491 s = getset(repo, subset, x) |
605 s = getset(repo, subset, x) |
492 cs = set(children(repo, subset, x)) |
606 cs = set(children(repo, subset, x)) |
493 return [r for r in s if r not in cs] |
607 return [r for r in s if r not in cs] |
494 |
608 |
495 def outgoing(repo, subset, x): |
609 def outgoing(repo, subset, x): |
|
610 """``outgoing([path])`` |
|
611 Changesets not found in the specified destination repository, or the |
|
612 default push location. |
|
613 """ |
496 import hg # avoid start-up nasties |
614 import hg # avoid start-up nasties |
497 # i18n: "outgoing" is a keyword |
615 # i18n: "outgoing" is a keyword |
498 l = getargs(x, 0, 1, _("outgoing requires a repository path")) |
616 l = getargs(x, 0, 1, _("outgoing requires a repository path")) |
499 # i18n: "outgoing" is a keyword |
617 # i18n: "outgoing" is a keyword |
500 dest = l and getstring(l[0], _("outgoing requires a repository path")) or '' |
618 dest = l and getstring(l[0], _("outgoing requires a repository path")) or '' |