Wed, 08 Oct 2014 02:47:00 -0700 revset-branch: remove usage of `set()`
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:47:00 -0700] rev 22867
revset-branch: remove usage of `set()` All smartset classes have fast lookup, so this function will be removed soon.
Wed, 08 Oct 2014 02:45:53 -0700 revset-rangeset: remove usage of `set()`
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:45:53 -0700] rev 22866
revset-rangeset: remove usage of `set()` All smartset classes have fast lookup, so this function will be removed soon.
Wed, 08 Oct 2014 02:45:43 -0700 revset-only: remove usage of `set()`
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 02:45:43 -0700] rev 22865
revset-only: remove usage of `set()` All smartset classes have fast lookup, so this function will be removed soon.
Thu, 09 Oct 2014 22:57:52 -0700 revset: cache most conditions used in `filter`
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 22:57:52 -0700] rev 22864
revset: cache most conditions used in `filter` Except when stated otherwise, the condition used in `smartset.filter` will be cached. A new argument has been introduced to disable that behavior. We use it for filters created from `and` and `sub` operations. This gives massive performance boosts for revsets with expensive conditions. revset: branch(stable) or branch(default) before) wall 4.329070 comb 4.320000 user 4.310000 sys 0.010000 (best of 3) after) wall 2.356451 comb 2.360000 user 2.330000 sys 0.030000 (best of 4) revset: author(mpm) or author(lmoscovicz) before) wall 4.434719 comb 4.440000 user 4.440000 sys 0.000000 (best of 3) after) wall 2.321720 comb 2.320000 user 2.320000 sys 0.000000 (best of 4)
Thu, 09 Oct 2014 04:12:20 -0700 baseset: empty or one-element sets are ascending and descending
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:12:20 -0700] rev 22863
baseset: empty or one-element sets are ascending and descending The empty set is full of interesting properties. In the ordering case, the one element set is too.
Tue, 07 Oct 2014 01:33:05 -0700 filteredset: drop explicit order management
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:33:05 -0700] rev 22862
filteredset: drop explicit order management Now that all low-level smartset classes have proper ordering and fast iteration management, we can just rely on the subset in filteredset.
Thu, 09 Oct 2014 04:24:51 -0700 revset: restore order of `or` operation as in Mercurial 2.9
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:24:51 -0700] rev 22861
revset: restore order of `or` operation as in Mercurial 2.9 Lazy revset broke the ordering of the `or` revset. We now stop assuming that two ascending revset are combine into an ascending one. Behavior in 3.0: 3:4 or 2:5 == [2, 3, 4, 5] Behavior in 2.9: 3:4 or 2:5 == [3, 4, 2, 5] We are adding a test for it. For unclear reason, the performance `or` revset with expensive filter are getting even worse than they used to be. This is probably caused by extra uncached containment check or iteration. revset #9: author(lmoscovicz) or author(mpm) before) wall 3.487583 comb 3.490000 user 3.490000 sys 0.000000 (best of 3) after) wall 4.481486 comb 4.480000 user 4.470000 sys 0.010000 (best of 3) revset #10: author(mpm) or author(lmoscovicz) before) wall 3.164839 comb 3.170000 user 3.160000 sys 0.010000 (best of 3) after) wall 4.574965 comb 4.570000 user 4.570000 sys 0.000000 (best of 3)
Thu, 09 Oct 2014 09:12:54 -0700 revset-_descendant: rework the whole sorting and combining logic
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 09:12:54 -0700] rev 22860
revset-_descendant: rework the whole sorting and combining logic We use the & operator to combine with subset (since this is more likely to be optimised than filter) and we enforce the sorting of the result. Without this enforced sorting, we may result in a different iteration order than the set _descendent was computed from. This reverts a bad `test-glog.t` change from 69402eb72115. Another side effect is that `test-mq.t` shows `qparent::` including `-1` if `qparent is -1`. This sound like a positive change. This has good and bad impacts on the benchmarks, here is a good ones: revset: 0:: before) wall 0.045489 comb 0.040000 user 0.040000 sys 0.000000 (best of 100) after) wall 0.034330 comb 0.030000 user 0.030000 sys 0.000000 (best of 100) revset: roots((0::) - (0::tip)) before) wall 0.134090 comb 0.140000 user 0.140000 sys 0.000000 (best of 63) after) wall 0.128346 comb 0.130000 user 0.130000 sys 0.000000 (best of 69) revset: ::p1(p1(tip)):: before) wall 0.143892 comb 0.140000 user 0.140000 sys 0.000000 (best of 55) after) wall 0.124502 comb 0.130000 user 0.130000 sys 0.000000 (best of 65) revset: roots((0:tip)::) before) wall 0.204966 comb 0.200000 user 0.200000 sys 0.000000 (best of 43) after) wall 0.184455 comb 0.180000 user 0.180000 sys 0.000000 (best of 47) Here is a bad one: revset: (20000::) - (20000) before) wall 0.009592 comb 0.010000 user 0.010000 sys 0.000000 (best of 222) after) wall 0.029837 comb 0.030000 user 0.030000 sys 0.000000 (best of 100)
Thu, 09 Oct 2014 20:15:41 -0700 addset: do lazy sorting
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 20:15:41 -0700] rev 22859
addset: do lazy sorting The previous implementation was consuming the whole revset when asked for any sort. The addset class is now doing lazy sorting like all other smarset classes. This has no significant impact in the benchmark as-is. But this is important to later change.
Thu, 09 Oct 2014 04:40:04 -0700 test-import.t: use proper revset order
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:40:04 -0700] rev 22858
test-import.t: use proper revset order This test, written after 3.0, is relying on addset being enforced ascending if both side are ascending. We are about to restore the ordering to 2.9 behavior (elements are ordered in the order they are specified). We fix the test before fixing the order.
Thu, 09 Oct 2014 04:29:18 -0700 baseset: drop custom __sub__ method
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:29:18 -0700] rev 22857
baseset: drop custom __sub__ method This add method is enforcing non-laziness, disabling multiple optimisations. Benchmarks do not spot any significant difference but real usecase may. This will also be important for further improvements to addset later in this series.
Thu, 09 Oct 2014 04:27:25 -0700 baseset: drop custom __and__ method
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:27:25 -0700] rev 22856
baseset: drop custom __and__ method This add method is enforcing non-laziness, disabling multiple optimisations. Benchmarks do not spot any significant regression but real usecase may. This even gives some speedup in some cases: revset #15: min(0::) before) wall 0.001247 comb 0.000000 user 0.000000 sys 0.000000 (best of 1814) after) wall 0.000942 comb 0.000000 user 0.000000 sys 0.000000 (best of 2367) This will also be important for further improvement to addset later in this series.
Thu, 09 Oct 2014 04:27:01 -0700 baseset: drop custom __add__ method
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 04:27:01 -0700] rev 22855
baseset: drop custom __add__ method This add method is enforcing non-laziness, disabling multiple optimisations. Benchmarks do not spot any significant differences but real usecase may. This will also be important for further improvements to addset later in this series.
Tue, 16 Sep 2014 17:57:44 -0700 obsolete: use format version 1 as the default for obsstore
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 17:57:44 -0700] rev 22854
obsolete: use format version 1 as the default for obsstore
Tue, 16 Sep 2014 19:13:08 -0700 test-obsolete: remove subminute timezone in test
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 19:13:08 -0700] rev 22853
test-obsolete: remove subminute timezone in test Obsmarker format "1" does not supports sub minute timezone. So we change the test to something slightly more sensible.
Tue, 16 Sep 2014 17:52:40 -0700 obsolete: add a "format.obsstore-version" config option
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 16 Sep 2014 17:52:40 -0700] rev 22852
obsolete: add a "format.obsstore-version" config option This option controls what version of the binary format to use when creating a new obsstore file. Default is still the old format. No safeguards are currently placed around the option value, but no clueless users are in danger of harm since it is undocumented.
Thu, 09 Oct 2014 00:10:10 -0700 obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 00:10:10 -0700] rev 22851
obsolete: introduce a new binary encoding for obsmarkers (version 1) This new encoding explicitly stores the date and parents allowing a significantly faster marker decoding. See inline documentation for details. This format is not yet used to store format on disk. But it will be used in bundle2 exchange if both side support it. Support for on-disk format is coming in other changesets.
Fri, 10 Oct 2014 16:43:04 -0500 obsstore: add a flag for sha256 hashes
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 10 Oct 2014 16:43:04 -0500] rev 22850
obsstore: add a flag for sha256 hashes We add flag to inform that the marker is using sha256 hashes. As format 0 is not able to handle sha256 hashes (32 bytes long), we plain crash if we even attempt to encode a sha256 with it.
Thu, 09 Oct 2014 00:15:04 -0700 obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 09 Oct 2014 00:15:04 -0700] rev 22849
obsolete: use uint## in the format documention This is shorter and kind of more readable for people who care about binary format.
Wed, 08 Oct 2014 22:34:48 -0700 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:34:48 -0700] rev 22848
obsolete: gather _fm0 meta encoding with other _fm0 code
Wed, 08 Oct 2014 22:12:06 -0700 obsolete: _rename decodemeta to _fm0decodemeta
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:12:06 -0700] rev 22847
obsolete: _rename decodemeta to _fm0decodemeta This will be format zero specific.
Wed, 08 Oct 2014 22:11:36 -0700 obsolete: _rename encodemeta to _fm0encodemeta
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:11:36 -0700] rev 22846
obsolete: _rename encodemeta to _fm0encodemeta This will be format zero specific.
Wed, 08 Oct 2014 22:10:15 -0700 obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 08 Oct 2014 22:10:15 -0700] rev 22845
obsolete: store metadata as a tuple of (key, value) pairs (API) Different formats will encode metadata in different ways. So we cannot keep the binary blob in the object anymore. We use a tuple to ensure it is immutable and hashable.
Fri, 10 Oct 2014 12:15:46 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 12:15:46 -0500] rev 22844
merge with stable
Fri, 10 Oct 2014 11:38:00 -0500 templater: fix ifcontains when list is a string (issue4399) stable
Matt Mackall <mpm@selenic.com> [Fri, 10 Oct 2014 11:38:00 -0500] rev 22843
templater: fix ifcontains when list is a string (issue4399)
Wed, 08 Oct 2014 07:47:11 -0400 shelve: don't delete "." when rebase is a no-op (issue4398) stable
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 08 Oct 2014 07:47:11 -0400] rev 22842
shelve: don't delete "." when rebase is a no-op (issue4398) When unshelving and facing a conflict, if we resolve all conflicts in favour of the committed changes instead of the shelved changes, then the ensuing implicit rebase is a no-op. That is, there is nothing to rebase. In this case, there are no extra intermediate shelve commits to strip either. Prior to this change, the commit being unshelved to would be marked for destruction in a rather catastrophic way. The relevant part of the test case failed as follows: $ hg unshelve -c unshelve of 'default' complete $ hg diff warning: ignoring unknown working parent 33f7f61e6c5e! diff --git a/a/a b/a/a new file mode 100644 --- /dev/null b/a/a @@ -0,0 1,3 @@ a c x $ hg status warning: ignoring unknown working parent 33f7f61e6c5e! M a/a ? a/a.orig ? foo/foo $ hg summary warning: ignoring unknown working parent 33f7f61e6c5e! parent: -1:000000000000 (no revision checked out) branch: default commit: 1 modified, 2 unknown (new branch head) update: 4 new changesets (update) With this change, this test case now passes.
Wed, 08 Oct 2014 14:16:53 -0700 merge: make error message consistent with other commands
Martin von Zweigbergk <martinvonz@gmail.com> [Wed, 08 Oct 2014 14:16:53 -0700] rev 22841
merge: make error message consistent with other commands If a merge is attempted when another merge is already ongoing, we give the message "outstanding uncommitted merges". Many other commands (such as backout, rebase, histedit) give the same message in singular form. Since the singular form also seems to make more sense, let's use that for 'hg merge' as well.
Fri, 10 Oct 2014 10:34:52 -0400 test-run-tests: add a test for detection of failure to start a server
Augie Fackler <raf@durin42.com> [Fri, 10 Oct 2014 10:34:52 -0400] rev 22840
test-run-tests: add a test for detection of failure to start a server This also highlights a bug: right now we print "2 failed" but we only ran one test.
Thu, 09 Oct 2014 17:00:29 -0700 run-tests: more accurate/helpful message than "diff generation failed"
Kyle Lippincott <spectral@google.com> [Thu, 09 Oct 2014 17:00:29 -0700] rev 22839
run-tests: more accurate/helpful message than "diff generation failed" Diff generation didn't really fail, it recognized that an hg serve server has failed to start, and thus skipped the diff generation intentionally. The most common reason for a server to fail to start is that the port was already in use, so output HGPORT as well, to help finding it (since pgrep -f 'hg serve' is not sufficient, if the command line is something like 'hg -R main serve')
Thu, 09 Oct 2014 15:10:40 -0400 run-tests: handle --jobs and --first gracefully
Augie Fackler <raf@durin42.com> [Thu, 09 Oct 2014 15:10:40 -0400] rev 22838
run-tests: handle --jobs and --first gracefully Without this change, --first causes currently-running tests to explode in violent and surprising ways when their temporary directory gets cleaned up. Now we just suppress failure messages from non-first failures when running in --first mode.
Mon, 06 Oct 2014 16:35:02 -0400 config: use the same hgrc for a cloned repo as for an uninitted repo
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Mon, 06 Oct 2014 16:35:02 -0400] rev 22837
config: use the same hgrc for a cloned repo as for an uninitted repo This just copies the same local sample hgrc, except it sets the default path to the repo it was cloned from. This is cut-and-paste from the local sample hgrc, but I think it's acceptable, since the two pieces of code are right next to each other and they're small. There is danger of them going out of synch, but it would complicate the code too much to get rid of this C&P. I also add ui as an import to hg.py, but with demandimport, this should not be a noticeable performance hit.
Wed, 08 Oct 2014 07:45:51 -0400 config: give a more detailed sample repo config
Jordi Gutiérrez Hermoso <jordigh@octave.org> [Wed, 08 Oct 2014 07:45:51 -0400] rev 22836
config: give a more detailed sample repo config Some examples of the typical configurations that one might want to do in an .hg/hgrc file. This includes a default-push that happens to point to the same location as my-fork. I insist on the myfork terminology for a server-side clone. Bitbucket, Github, and others have widely popularised this meaning of "fork". This also includes a gentle nudge to use a repo-specific username, which is something that people might not instinctively realise is an option.
Tue, 07 Oct 2014 01:46:53 -0700 smartset: drop infamous ascending, descending
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:46:53 -0700] rev 22835
smartset: drop infamous ascending, descending All your friends are dead.
Tue, 07 Oct 2014 01:41:14 -0700 fullreposet: use `isascending` instead of `ascending` to recognise smartsets
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:41:14 -0700] rev 22834
fullreposet: use `isascending` instead of `ascending` to recognise smartsets `ascending` is going to be removed.
Tue, 07 Oct 2014 01:41:26 -0700 fullreposet: use `sort` to enforce the order
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:41:26 -0700] rev 22833
fullreposet: use `sort` to enforce the order The `ascending` and `descending` methods are useless.
Tue, 07 Oct 2014 01:48:34 -0700 revancestors: replace `descending` with `sort(reverse=False)`
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:48:34 -0700] rev 22832
revancestors: replace `descending` with `sort(reverse=False)`
Tue, 07 Oct 2014 01:41:02 -0700 _descendants: replace `ascending()` with `sort()`
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:41:02 -0700] rev 22831
_descendants: replace `ascending()` with `sort()`
Tue, 07 Oct 2014 01:36:53 -0700 _descendants: directly use smartset
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 01:36:53 -0700] rev 22830
_descendants: directly use smartset As `addset` objects are proper smartset objects, we do not need to make any transformation of the result.
Fri, 03 Oct 2014 03:29:55 -0500 baseset: explicitly track order of the baseset
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:29:55 -0500] rev 22829
baseset: explicitly track order of the baseset A baseset starts without an explicit order. But as soon as a sort is requested, we simply register that the baseset has an order and use the ordered version of the list to behave accordingly. We will want to properly record the order at creation time in the future. This would unlock more optimisation and avoid some sorting.
Fri, 03 Oct 2014 03:31:05 -0500 baseset: fix isascending and isdescending
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:31:05 -0500] rev 22828
baseset: fix isascending and isdescending We now have sufficient information to return the proper value there.
Fri, 03 Oct 2014 03:26:18 -0500 baseset: prepare lazy ordering in __iter__
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:26:18 -0500] rev 22827
baseset: prepare lazy ordering in __iter__ We'll explicitly track the order of the baseset to take advantage of the ascending and descending lists during iteration.
Fri, 03 Oct 2014 03:19:23 -0500 baseset: implement a fastasc and fastdesc
Pierre-Yves David <pierre-yves.david@fb.com> [Fri, 03 Oct 2014 03:19:23 -0500] rev 22826
baseset: implement a fastasc and fastdesc Baseset contains already-computed revisions. It is considered "cheap" to do operations on an already-computed set. So we add attributes to hold version of the list in ascending and descending order and use them for `fastasc` and `fastdesc`. Having distinct lists is important to provide correct iteration in all cases. Altering a python list will impact an iterator connected to it. eg: not preserving order at iterator creation time >>> l = [0, 1] >>> i = iter(l) >>> l.reverse() >>> list(i) [1, 0] eg: corrupting in progress iteration >>> l = [0, 1] >>> i = iter(l) >>> i.next() 0 >>> l.reverse() >>> i.next() 0
Mon, 06 Oct 2014 11:03:30 -0700 baseset: stop inheriting from built-in list class
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:03:30 -0700] rev 22825
baseset: stop inheriting from built-in list class The baseset is doing more and more smartset magic and using its list-like property less and less. So we store the list of revisions in an explicit attribute and stop inheriting. This requires reimplementing some basic methods.
Tue, 07 Oct 2014 00:38:14 -0700 strip: stop calling `remove` on smartset
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:38:14 -0700] rev 22824
strip: stop calling `remove` on smartset The `remove` method is not part of the smartset specification. We use a plain old list comprehension instead.
Tue, 07 Oct 2014 00:31:53 -0700 rebase: transform the smartset to a list before comparing with a list
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:31:53 -0700] rev 22823
rebase: transform the smartset to a list before comparing with a list This is highly suboptimal but smartsets are not comparable to lists yet.
Tue, 07 Oct 2014 00:41:58 -0700 merge.update: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:41:58 -0700] rev 22822
merge.update: use `first` instead of direct indexing This makes it compatible with all smartset classes.
Tue, 07 Oct 2014 00:33:47 -0700 qimport: use `first` and `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:33:47 -0700] rev 22821
qimport: use `first` and `last` instead of direct indexing This makes it compatible with all smartset classes.
Tue, 07 Oct 2014 00:16:59 -0700 rebase: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:16:59 -0700] rev 22820
rebase: use `last` instead of direct indexing This makes it compatible with all smartset classes.
Tue, 07 Oct 2014 00:14:53 -0700 mq: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:14:53 -0700] rev 22819
mq: use `last` instead of direct indexing This makes it compatible with all smartset classes.
Tue, 07 Oct 2014 00:09:50 -0700 repair: use `first` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:09:50 -0700] rev 22818
repair: use `first` instead of direct indexing This makes it compatible with all smartset classes.
Mon, 06 Oct 2014 23:45:07 -0700 rangeset: use `first` and `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 23:45:07 -0700] rev 22817
rangeset: use `first` and `last` instead of direct indexing This makes it compatible with all smarsets classes.
Mon, 06 Oct 2014 23:37:39 -0700 revpair: use `first` and `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 23:37:39 -0700] rev 22816
revpair: use `first` and `last` instead of direct indexing This makes it compatible with all smarsets classes.
Mon, 06 Oct 2014 23:37:08 -0700 revsingle: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 23:37:08 -0700] rev 22815
revsingle: use `last` instead of direct indexing This makes it compatible with all smarsets classes.
Mon, 06 Oct 2014 11:43:32 -0700 revset-limit: use boolean testing instead of `len(revs) < 1`
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 11:43:32 -0700] rev 22814
revset-limit: use boolean testing instead of `len(revs) < 1` I'm not sure why we wrote it that way. But smartsets have faster/lazier non-zero testing than length computation.
Tue, 07 Oct 2014 00:18:08 -0700 filteredset: implement `first` and `last`
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 07 Oct 2014 00:18:08 -0700] rev 22813
filteredset: implement `first` and `last`
Mon, 06 Oct 2014 14:42:00 -0700 baseset: implement `first` and `last` methods
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 06 Oct 2014 14:42:00 -0700] rev 22812
baseset: implement `first` and `last` methods
(0) -10000 -3000 -1000 -300 -100 -56 +56 +100 +300 +1000 +3000 +10000 tip