Tue, 06 Oct 2015 15:07:00 -0400 rebase: enable histedit for useful help with it
timeless@mozdev.org [Tue, 06 Oct 2015 15:07:00 -0400] rev 26496
rebase: enable histedit for useful help with it
Tue, 06 Oct 2015 15:01:25 -0400 rebase: suggest help -e histedit
timeless@mozdev.org [Tue, 06 Oct 2015 15:01:25 -0400] rev 26495
rebase: suggest help -e histedit Users unfamiliar with an extension should be reading the documentation for the feature, not the command.
Tue, 06 Oct 2015 15:05:40 -0400 rebase: factor out histedit help command
timeless@mozdev.org [Tue, 06 Oct 2015 15:05:40 -0400] rev 26494
rebase: factor out histedit help command
Sun, 04 Oct 2015 22:35:36 +0900 util: use tuple accessor to get accurate st_mtime value (issue4836)
Yuya Nishihara <yuya@tcha.org> [Sun, 04 Oct 2015 22:35:36 +0900] rev 26493
util: use tuple accessor to get accurate st_mtime value (issue4836) Because st.st_mtime is computed as 'sec + 1e-9 * nsec' and double is too narrow to represent nanoseconds, int(st.st_mtime) can be 'sec + 1'. Therefore, that value could be different from the one got by osutils.listdir(). This patch fixes the problem by accessing to raw st_mtime by tuple index. It catches TypeError to fall back to st.st_mtime because our osutil.stat does not support tuple index. In dirstate.normal(), 'st' is always a Python stat, but in dirstate.status(), it can be either a Python stat or an osutil.stat. Thanks to vgatien-baron@janestreet.com for finding the root cause of this subtle problem.
Sun, 04 Oct 2015 22:25:29 +0900 util: extract stub function to get mtime with second accuracy
Yuya Nishihara <yuya@tcha.org> [Sun, 04 Oct 2015 22:25:29 +0900] rev 26492
util: extract stub function to get mtime with second accuracy This function is trivial but will need a long comment why it can't use st.st_mtime. See the next patch for details.
Mon, 05 Oct 2015 14:37:59 -0700 scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com> [Mon, 05 Oct 2015 14:37:59 -0700] rev 26491
scmutil: add a way for a repo's wlock to be inherited by a subprocess This is part of a series that will allow locks to be inherited by subprocesses in limited circumstances. In the future, we'll call this for custom merge drivers.
Mon, 05 Oct 2015 14:34:52 -0700 scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com> [Mon, 05 Oct 2015 14:34:52 -0700] rev 26490
scmutil: add a way for a subprocess to be run with an inheritable lock This is part of a series that will allow locks to be inherited by subprocesses in limited circumstances. In an upcoming patch, we'll add an API for the wlock to be inherited.
Mon, 05 Oct 2015 14:27:37 -0700 localrepo: add a way to get the current wlock if it's held
Siddharth Agarwal <sid0@fb.com> [Mon, 05 Oct 2015 14:27:37 -0700] rev 26489
localrepo: add a way to get the current wlock if it's held This will be useful to pass around a reference to the lock to some functions we're going to add to scmutil. We don't want those functions to live in localrepo to avoid bloat.
Mon, 05 Oct 2015 14:26:53 -0700 localrepo: add a way to get the current lock if it's held
Siddharth Agarwal <sid0@fb.com> [Mon, 05 Oct 2015 14:26:53 -0700] rev 26488
localrepo: add a way to get the current lock if it's held We'll use this in upcoming patches to return a reference to the wlock if it's held.
Thu, 24 Sep 2015 13:58:18 -0400 test-help: verify that extension keywords appear in help templates
timeless@mozdev.org [Thu, 24 Sep 2015 13:58:18 -0400] rev 26487
test-help: verify that extension keywords appear in help templates fixed by a2291c9c85a1
Mon, 24 Aug 2015 23:30:17 -0400 templatekw: add {changes}, {distance} and {tag} to the {latesttag} keyword
Matt Harbison <matt_harbison@yahoo.com> [Mon, 24 Aug 2015 23:30:17 -0400] rev 26486
templatekw: add {changes}, {distance} and {tag} to the {latesttag} keyword
Sun, 23 Aug 2015 23:44:58 -0400 templater: introduce {latesttag()} function to match a pattern (issue4184)
Matt Harbison <matt_harbison@yahoo.com> [Sun, 23 Aug 2015 23:44:58 -0400] rev 26485
templater: introduce {latesttag()} function to match a pattern (issue4184) This allows the latest class of tag to be found, such as a release candidate or final build, instead of just the absolute latest. It doesn't appear that the existing keyword can be given an optional argument. There is a keyword, function and filter for 'date', so it doesn't seem harmful to introduce a new function with the same name as an existing keyword. Most functions are pretty Mercurial agnostic, but there is {revset()} as precedent. Even though templatekw.getlatesttags() returns a single tuple, one entry of which is a list, it is simplest to present this as a list of tags instead of a single item, with each tag having a distance and change count attribute. It is also closer to how {latesttag} returns a list of tags, and how this function works when not given a '%' operator.
Mon, 24 Aug 2015 23:07:00 -0400 templatekw: introduce showlatesttags() to handle {latesttag} keywords
Matt Harbison <matt_harbison@yahoo.com> [Mon, 24 Aug 2015 23:07:00 -0400] rev 26484
templatekw: introduce showlatesttags() to handle {latesttag} keywords The keywords {changes}, {distance} and {tag} will be available on a future template method that will allow pattern matching against tag names. For consistency, these should be available on the existing {latesttag} keyword as well. I debated whether or not to add {tag} instead of just continuing with the existing {latesttag}. But it seems clearer not to have the same name for two distinct things (a list in the LHS of %, and an individual tag value on the right). The value of latesttags[0] is the date of commit for the cset to which the tag is applied (i.e. not the date the tag was applied), and therefore isn't made visible because it doesn't seem interesting. It appears that this is merely an internal implementation detail for sorting csets in a stable manner when there are different branches.
Mon, 05 Oct 2015 21:11:50 -0400 templatekw: factor out the changessincetag calculation to a private method
Matt Harbison <matt_harbison@yahoo.com> [Mon, 05 Oct 2015 21:11:50 -0400] rev 26483
templatekw: factor out the changessincetag calculation to a private method This will be reused in the next patch.
Sun, 23 Aug 2015 23:22:55 -0400 templatekw: allow getlatesttags() to match a specific tag pattern
Matt Harbison <matt_harbison@yahoo.com> [Sun, 23 Aug 2015 23:22:55 -0400] rev 26482
templatekw: allow getlatesttags() to match a specific tag pattern This will allow the latest class of tag to be found, such as a release candidate or final build, instead of just the absolute latest. It will be exposed in a future patch. It's unfortunate that the original 'latesttags' cache can't be used to determine the proper values, but it isn't fully populated for the entire repo. For example, the {latesttagdistance} keyword on the Mecurial repo builds the cache up back to the revision for 1.4. If the pattern was 're:^0\.\d$', that wouldn't be in the cache. Maybe this can be optimized some other way, but for now, this is the simpliest implementation.
Sat, 22 Aug 2015 22:52:18 -0400 util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com> [Sat, 22 Aug 2015 22:52:18 -0400] rev 26481
util: extract stringmatcher() from revset This is used to match against tags, bookmarks, etc in revsets. It will be used in a future patch to do the same tag matching in templater.
Mon, 05 Oct 2015 17:36:32 -0700 util.chunkbuffer: avoid extra mutations when reading partial chunks
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 05 Oct 2015 17:36:32 -0700] rev 26480
util.chunkbuffer: avoid extra mutations when reading partial chunks Previously, a read(N) where N was less than the length of the first available chunk would mutate the deque instance twice and allocate a new str from the slice of the existing chunk. Profiling drawed my attention to these as a potential hot spot during changegroup reading. This patch makes the code more complicated in order to avoid the aforementioned 3 operations. On a pre-generated mozilla-central gzip bundle, this series has the following impact on `hg unbundle` performance on my MacBook Pro: before: 358.21 real 317.69 user 38.49 sys after: 301.57 real 262.69 user 37.11 sys delta: -56.64 real -55.00 user -1.38 sys
Mon, 05 Oct 2015 16:34:47 -0700 util.chunkbuffer: refactor chunk handling logic
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 05 Oct 2015 16:34:47 -0700] rev 26479
util.chunkbuffer: refactor chunk handling logic This will make the next patch easier to read. It provides no benefit on its own.
Mon, 05 Oct 2015 16:28:12 -0700 util.chunkbuffer: special case reading everything
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 05 Oct 2015 16:28:12 -0700] rev 26478
util.chunkbuffer: special case reading everything The new code results in simpler logic within the while loop. It is also faster since we avoid performing operations on the queue and buf collections. However, there shouldn't be any super hot loops for this since the whole point of chunkbuffer is to avoid reading large amounts of data at once. This does, however, make it easier to optimize chunkbuffer in a subsequent patch.
Mon, 05 Oct 2015 07:13:35 +0200 revert: add reference to backout
Mathias De Maré <mathias.demare@gmail.com> [Mon, 05 Oct 2015 07:13:35 +0200] rev 26477
revert: add reference to backout
Mon, 05 Oct 2015 07:11:48 +0200 backout: add reference to revert
Mathias De Maré <mathias.demare@gmail.com> [Mon, 05 Oct 2015 07:11:48 +0200] rev 26476
backout: add reference to revert
Fri, 25 Sep 2015 12:39:23 -0700 localrepo: allow wlock to be inherited
Siddharth Agarwal <sid0@fb.com> [Fri, 25 Sep 2015 12:39:23 -0700] rev 26475
localrepo: allow wlock to be inherited This is part of a series that will allow locks to be inherited by subprocesses in limited circumstances. When allowed, the parent process will pass down requisite information to the child process by way of this environment variable.
Sun, 04 Oct 2015 20:04:44 -0700 lock.release: don't call postrelease functions for inherited locks
Siddharth Agarwal <sid0@fb.com> [Sun, 04 Oct 2015 20:04:44 -0700] rev 26474
lock.release: don't call postrelease functions for inherited locks Review feedback from Pierre-Yves David. The postrelease functions typically assume the lock is not held at all.
Sun, 04 Oct 2015 20:02:50 -0700 lock: turn prepinherit/reacquire into a single context manager
Siddharth Agarwal <sid0@fb.com> [Sun, 04 Oct 2015 20:02:50 -0700] rev 26473
lock: turn prepinherit/reacquire into a single context manager Review feedback from Pierre-Yves David. This makes the overall code cleaner and less error-prone, and makes a previously explicitly checked error state impossible.
Sun, 04 Oct 2015 19:28:43 -0700 localrepo: add a note about parentenvvar
Siddharth Agarwal <sid0@fb.com> [Sun, 04 Oct 2015 19:28:43 -0700] rev 26472
localrepo: add a note about parentenvvar Review feedback from Pierre-Yves David.
Sun, 04 Oct 2015 12:11:44 -0700 exchange: add "streaming all changes" to bundle2 pulling
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 12:11:44 -0700] rev 26471
exchange: add "streaming all changes" to bundle2 pulling This is the beginning of client-side support for performing a stream clone using bundle2. The main bundle2 pull function checks whether to perform a streaming clone and outputs a message if so. While we have a duplicate message, it seems easier to have all the bundle2 console writing in one location and in an easy-to-read conditional block.
Sun, 04 Oct 2015 12:07:01 -0700 streamclone: move "streaming all changes" message location
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 12:07:01 -0700] rev 26470
streamclone: move "streaming all changes" message location Previously, the message was printed after we requested and started processing the remote stream. This seems like something that we should do before calling out to the remote. Moving it also makes it easier to deal with the bundle2 implementation.
Sun, 04 Oct 2015 19:06:06 -0700 streamclone: move payload header generation into own function
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 19:06:06 -0700] rev 26469
streamclone: move payload header generation into own function The stream clone data over the wire protocol contains a header line indicating total file count and data size. In bundle2, this metadata can be captured by a part parameter and doesn't need to be in the body. In preparation for bundle2, have generatev1() return the raw metadata and move the header generation to its own function.
Sun, 04 Oct 2015 18:44:46 -0700 streamclone: move payload header line consumption
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 18:44:46 -0700] rev 26468
streamclone: move payload header line consumption bundle2 parts have parameters. These are a logical place for "header" data such as the file count and payload size of stream clone data. In preparation for supporting stream clones with bundle2, move the consumption of the header line from the payload into maybeperformlegacystreamclone(). Note: the header line is still being emitted by generatev1(). This will be addressed in a subsequent patch.
Sun, 04 Oct 2015 18:35:19 -0700 streamclone: teach canperformstreamclone to be bundle2 aware
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 18:35:19 -0700] rev 26467
streamclone: teach canperformstreamclone to be bundle2 aware We add an argument to canperformstreamclone() to return False if a bundle2 stream clone is available. This will enable the legacy stream clone step to no-op when a bundle2 stream clone is supported. The commented code will be made active when bundle2 supports streaming clone. This patch does foreshadow the introduction of the "stream" bundle2 capability and its "v1" sub-capability. The bundle2 capability mirrors the existing "stream" capability and is needed so clients know whether a server explicitly supports streaming clones over bundle2 (servers up to this point support bundle2 without streaming clone support). The sub-capability will denote which data formats and variations are supported. Currently, the value "v1" denotes the existing streaming clone data format, which I intend to reuse inside a bundle2 part. My intent is to eventually introduce alternate data formats that can be produced and consumed more efficiently. Having a sub-capability means we don't need to introduce a new top-level bundle2 capability when new formats are introduced. This doesn't really have any implications beyond making the capabilities namespace more organized.
Sun, 04 Oct 2015 11:50:42 -0700 streamclone: refactor canperformstreamclone to accept a pullop
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 11:50:42 -0700] rev 26466
streamclone: refactor canperformstreamclone to accept a pullop This isn't strictly necessary. But a lot of pull functionality accepts a pulloperation so extra state can be added easily. It also enables extensions to perform more powerful things.
Sun, 04 Oct 2015 12:03:30 -0700 exchange: expose bundle2 availability on pulloperation
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 12:03:30 -0700] rev 26465
exchange: expose bundle2 availability on pulloperation Like the previous patch, the value is cached and will prevent a function level import in streamclone.py.
Sun, 04 Oct 2015 18:31:53 -0700 exchange: expose bundle2 capabilities on pulloperation
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 18:31:53 -0700] rev 26464
exchange: expose bundle2 capabilities on pulloperation This adds a cache and makes accessing the capabilities slightly simpler, as you don't need to directly go through the bundle2 module. This will also help prevent a function-level import in streamclone.py. This patch arguably isn't necessary. But I think it makes things slightly nicer.
Sun, 04 Oct 2015 21:33:29 +0900 keyword: make restrict mode False while updating files for rollback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Sun, 04 Oct 2015 21:33:29 +0900] rev 26463
keyword: make restrict mode False while updating files for rollback This is a preparation for using 'repo.rollback()' instead of aborting a current running transaction for "shelve" and "unshelve". Before this patch, updating files as a part of 'repo.rollback()' overridden by keyword extension always follows 'restrict' mode of the command currently executed. "merge", "unshelve" and so on should be 'restrict'-ed, because keyword expansion may cause unexpected conflicts at merging while these commands. But, if 'repo.rollback()' is invoked while executing 'restrict'-ed commands, modified files in the working directory are marked as "CLEAN" unexpectedly by code path below: # 'lookup' below is True at updating modified files for rollback kwcmd = self.restrict and lookup # kwexpand/kwshrink : if kwcmd: self.repo.dirstate.normal(f) On the other hand, "rollback" command isn't 'restrict'-ed, because rollbacking itself doesn't imply merging. Therefore, disabling 'restrict' mode while updating files as a part of 'repo.rollback()' regardless of current 'restrict' mode should be reasonable.
Sun, 04 Oct 2015 11:34:28 -0700 streamclone: rename and document maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 11:34:28 -0700] rev 26462
streamclone: rename and document maybeperformstreamclone() Upcoming patches will introduce bundle2 based streaming clones. Add "legacy" to the function name and add a docstring clarifying the intent of the function.
Sun, 04 Oct 2015 11:27:10 -0700 streamclone: move applyremotedata() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 11:27:10 -0700] rev 26461
streamclone: move applyremotedata() into maybeperformstreamclone() Future work around stream cloning will be implemented in a bundle2 world. This code will only be used in the legacy code path and doesn't need to be abstracted or extensible.
Sat, 03 Oct 2015 09:53:56 -0700 branchmap: move branch cache code out of streamclone.py
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 03 Oct 2015 09:53:56 -0700] rev 26460
branchmap: move branch cache code out of streamclone.py This is low-level branch map and cache manipulation code. It deserves to live next to similar code in branchmap.py. Moving it also paves the road for multiple consumers, such as a bundle2 part handler that receives branch mappings from a remote. This is largely a mechanical move, with only variable names and indentation being changed.
Fri, 02 Oct 2015 23:08:15 -0700 streamclone: move streamin() into maybeperformstreamclone()
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 23:08:15 -0700] rev 26459
streamclone: move streamin() into maybeperformstreamclone() streamin() only had a single consumer. And it always only ever will because it is strongly coupled with the current, soon-to-be-superseded-by-bundle2 functionality. The return value has been dropped because nobody was using it.
Sun, 04 Oct 2015 11:20:52 -0700 streamclone: refactor maybeperformstreamclone to take a pullop
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 11:20:52 -0700] rev 26458
streamclone: refactor maybeperformstreamclone to take a pullop Just like all the other pull steps. Consistency is good. This seems a little excessive right now since maybeperformstreamclone is such a short function. This will be addressed in a subsequent patch.
Sun, 04 Oct 2015 11:17:43 -0700 demandimport: replace more references to _demandmod instances
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 11:17:43 -0700] rev 26457
demandimport: replace more references to _demandmod instances _demandmod instances may be referenced by multiple importing modules. Before this patch, the _demandmod instance only maintained a reference to its first consumer when using the "from X import Y" syntax. This is because we only created a single _demandmod instance (attached to the parent X module). If multiple modules A and B performed "from X import Y", we'd produce a single _demandmod instance "demandmod" with the following references: X.Y = <demandmod> A.Y = <demandmod> B.Y = <demandmod> The locals from the first consumer (A) would be stored in <demandmod1>. When <demandmod1> was loaded, we'd look at the locals for the first consumer and replace the symbol, if necessary. This resulted in state: X.Y = <module> A.Y = <module> B.Y = <demandmod> B's reference to Y wasn't updated and was still using the proxy object because we just didn't record that B had a reference to <demandmod> that needed updating! With this patch, we add support for tracking which modules in addition to the initial importer have a reference to the _demandmod instance and we replace those references at module load time. In the case of posix.py, this fixes an issue where the "encoding" module was being proxied, resulting in hundreds of thousands of __getattribute__ lookups on the _demandmod instance during dirstate operations on mozilla-central, speeding up execution by many milliseconds. There are likely several other operation that benefit from this change as well. The new mechanism isn't perfect: references in locals (not globals) may likely linger. So, if there is an import inside a function and a symbol from that module is used in a hot loop, we could have unwanted overhead from proxying through _demandmod. Non-global imports are discouraged anyway. So hopefully this isn't a big deal in practice. We could potentially deploy a code checker that bans use of attribute lookups of function-level-imported modules inside loops. This deficiency in theory could be avoided by storing the set of globals and locals dicts to update in the _demandmod instance. However, I tried this and it didn't work. One reason is that some globals are _demandmod instances. We could work around this, but it's a bit more work. There also might be other module import foo at play. The solution as implemented is better than what we had and IMO is good enough for the time being. It's worth noting that this sub-optimal behavior was made worse by the introduction of absolute_import and its recommended "from . import X" syntax for importing modules from the "mercurial" package. If we ever wrote performance tests, measuring the amount of module imports and __getattribute__ proxy calls through _demandmod instances would be something I'd have it check.
Sun, 04 Oct 2015 10:36:54 -0700 demandimport: refactor processfromitem
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 04 Oct 2015 10:36:54 -0700] rev 26456
demandimport: refactor processfromitem This will match the next patch smaller and easier to read.
Sat, 03 Oct 2015 15:30:17 -0700 demandimport: consolidate code for processing items in fromlist
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 03 Oct 2015 15:30:17 -0700] rev 26455
demandimport: consolidate code for processing items in fromlist This code was mostly duplicated. An upcoming patch will add more complexity, making the duplication harder to justify. Consolidate the code.
Sat, 03 Oct 2015 15:16:33 +0900 pager: recreate stdout to make it line-buffered
Yuya Nishihara <yuya@tcha.org> [Sat, 03 Oct 2015 15:16:33 +0900] rev 26454
pager: recreate stdout to make it line-buffered We want to see partial command results as soon as possible. But the buffering mode of stdout (= pager's stdin) was set to fully-buffered because it isn't associated with a tty. So, this patch recreates new stdout object to force its buffering mode. Because two file objects are associated with the same stdout fd and their destructors will call close(), one of them must be closed carefully. Python expects that the stdout fd never be closed even after sys.stdout.close() [1], but newstdout has no such hack. So this patch calls newstdout.close() immediately before duplicating the original stdout fd to sys.stdout. operation sys.stdout newstdout fd --------------------- ---------- --------- -------- newstdout.close() open closed closed os.dup2(stdoutfd, ..) open closed open del sys.stdout closed closed open [1] [1]: https://hg.python.org/cpython/file/v2.7.10/Python/sysmodule.c#l1391
Sat, 03 Oct 2015 18:48:21 +0900 pager: rename variables of backup fds
Yuya Nishihara <yuya@tcha.org> [Sat, 03 Oct 2015 18:48:21 +0900] rev 26453
pager: rename variables of backup fds The next patch will add backup file objects, so the original variable names would be confusing.
Sat, 03 Oct 2015 15:02:52 +0900 pager: inline _pagersubprocess() into _runpager()
Yuya Nishihara <yuya@tcha.org> [Sat, 03 Oct 2015 15:02:52 +0900] rev 26452
pager: inline _pagersubprocess() into _runpager() We don't need _pagersubprocess() because the fork version was removed at 59d794154e8d.
Sat, 03 Oct 2015 23:10:40 +0900 ui: send traceback of devel warning to appropriate output stream
Yuya Nishihara <yuya@tcha.org> [Sat, 03 Oct 2015 23:10:40 +0900] rev 26451
ui: send traceback of devel warning to appropriate output stream If ui.ferr is a command-server channel, traceback should be written to it.
Sat, 03 Oct 2015 14:57:24 +0900 util.system: compare fileno to see if it needs stdout redirection
Yuya Nishihara <yuya@tcha.org> [Sat, 03 Oct 2015 14:57:24 +0900] rev 26450
util.system: compare fileno to see if it needs stdout redirection Future patches will reopen stdout to be line-buffered, so sys.stdout may be different object than sys.__stdout__.
Fri, 02 Oct 2015 23:04:52 -0700 exchange: move stream clone logic into pull code path
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 23:04:52 -0700] rev 26449
exchange: move stream clone logic into pull code path Stream clones are a special case of clones. Clones are a special case of pull. Most of the logic for deciding what to do at pull time is in exchange.py. It makes sense for the stream clone determination to live there as well. This patch moves the calling of the stream clone code into pull(). The checks in streamclone.canperformstreamclone() ensure that we don't perform a stream clone unless it is possible. A future patch will convert maybeperformstreamclone() to accept a pullop to make it consistent with everything else in pull(). It will also grow some functionality (in case you doubted the necessity of a 4 line function).
Fri, 02 Oct 2015 22:16:34 -0700 exchange: teach pull about requested stream clones
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 22:16:34 -0700] rev 26448
exchange: teach pull about requested stream clones An upcoming patch will move the invocation of stream cloning logic to the normal pull code path (from localrepository.clone). In preparation for this, we teach pull() and pulloperation about whether a streaming clone is requested. The return logic in localrepository.clone() has been reformatted slightly because of line length issues.
Fri, 02 Oct 2015 21:53:25 -0700 streamclone: add explicit check for empty local repo
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 21:53:25 -0700] rev 26447
streamclone: add explicit check for empty local repo Stream clone doesn't work with non-empty local repositories. In upcoming patches, we'll move stream cloning to the regular pull code path. Add an explicit check on the repository being empty to prevent streaming clones to non-empty repos.
Fri, 02 Oct 2015 22:22:11 -0700 streamclone: refactor code for deciding to stream clone
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 22:22:11 -0700] rev 26446
streamclone: refactor code for deciding to stream clone Having this in a standalone function will eventually enable bundle2 to share code with the bundle1 code path. While I was here, I also added some comments to add clarity.
Fri, 02 Oct 2015 21:39:04 -0700 streamclone: move streaming clone logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 21:39:04 -0700] rev 26445
streamclone: move streaming clone logic from localrepo This is the last remnants of streaming clone code in localrepo.py. This is a mostly mechanical transplant of code to a new file. Only a rewrite of "self" to "repo" was performed. The code will be significantly refactored in upcoming patches. So don't scrutinize it too closely.
Fri, 02 Oct 2015 16:24:56 -0700 streamclone: move _allowstream() from wireproto
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 16:24:56 -0700] rev 26444
streamclone: move _allowstream() from wireproto While we're moving things into streamclone.py...
Fri, 02 Oct 2015 16:05:52 -0700 streamclone: move code out of exchange.py
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 16:05:52 -0700] rev 26443
streamclone: move code out of exchange.py We bulk move functions from exchange.py related to streaming clones. Function names were renamed slightly to drop a component redundant with the module name. Docstrings and comments referencing old names and locations were updated accordingly.
Fri, 02 Oct 2015 15:58:24 -0700 streamclone: move stream_in() from localrepo
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 15:58:24 -0700] rev 26442
streamclone: move stream_in() from localrepo Another basic content move. The underscore from the function name was removed to comply with naming standards.
Fri, 02 Oct 2015 15:51:32 -0700 streamclone: move applystreamclone() from localrepo.py
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 15:51:32 -0700] rev 26441
streamclone: move applystreamclone() from localrepo.py Upcoming patches will modernize the streaming clone code. Streaming clone data and code kind of lives in its own world. exchange.py is arguably the most appropriate existing location for it. However, over a dozen patches from now it became apparent that there was a lot of code related to streaming clones and that having it contained within its own module would make it easier to comprehend. So, we establish streamclone.py. It's worth noting that streamclone.py existed a long time ago, last seen in the 1.6 release. It was removed in 04f76a954842. The function was renamed as part of the move because its old name was redundant with the new module name. The only other content change was "self" was renamed to "repo" and minor grammar in the docstring was updated.
Fri, 02 Oct 2015 15:36:00 -0700 exchange: add docstring to pull()
Gregory Szorc <gregory.szorc@gmail.com> [Fri, 02 Oct 2015 15:36:00 -0700] rev 26440
exchange: add docstring to pull() This seems like the kind of important function that should be documented better.
Fri, 25 Sep 2015 12:28:12 -0700 localrepo: allow creating inherited locks
Siddharth Agarwal <sid0@fb.com> [Fri, 25 Sep 2015 12:28:12 -0700] rev 26439
localrepo: allow creating inherited locks This is part of a series that will allow locks to be inherited by subprocesses in limited circumstances.
Fri, 25 Sep 2015 12:56:05 -0700 error: make lock inheritance contract violations a subclass of RuntimeError
Siddharth Agarwal <sid0@fb.com> [Fri, 25 Sep 2015 12:56:05 -0700] rev 26438
error: make lock inheritance contract violations a subclass of RuntimeError This is more appropriate, per Pierre-Yves David.
Sat, 26 Sep 2015 12:19:39 +0900 templatekw: hide help of "branches" by DEPRECATED marker
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:19:39 +0900] rev 26437
templatekw: hide help of "branches" by DEPRECATED marker See 43e872a35f8a for details.
Sat, 26 Sep 2015 12:39:13 +0900 templatekw: remove dockeywords hack
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:39:13 +0900] rev 26436
templatekw: remove dockeywords hack Now all template keywords are defined as real functions.
Sat, 26 Sep 2015 12:38:02 +0900 templatekw: port implementation of showparents() from changeset_templater
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:38:02 +0900] rev 26435
templatekw: port implementation of showparents() from changeset_templater It isn't cool, but we can peek at ui flag via repo.ui. So, it is possible to implement showparents() in templatekw, and therefore we can eliminate the dockeywords hack.
Sat, 26 Sep 2015 12:32:03 +0900 templatekw: reorder stub of showparents() function
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:32:03 +0900] rev 26434
templatekw: reorder stub of showparents() function It will have an implementation.
Sat, 26 Sep 2015 12:29:09 +0900 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:29:09 +0900] rev 26433
changeset_printer: move _meaningful_parentrevs() to scmutil It will be used by templatekw.
Thu, 01 Oct 2015 22:14:11 -0400 test-run-tests: add globs for Windows
Matt Harbison <matt_harbison@yahoo.com> [Thu, 01 Oct 2015 22:14:11 -0400] rev 26432
test-run-tests: add globs for Windows There are two other unrelated failures in this test. For some reason child1 has a space after it, thus 2 spaces before the glob, otherwise the glob is ignored and removed.
Thu, 01 Oct 2015 21:49:50 -0400 test-commandserver: generate files with a fixed EOL for test stability
Matt Harbison <matt_harbison@yahoo.com> [Thu, 01 Oct 2015 21:49:50 -0400] rev 26431
test-commandserver: generate files with a fixed EOL for test stability The hashes were different on Windows.
Thu, 01 Oct 2015 21:24:10 -0400 test-debugextensions: sanitize JSON output for Windows
Matt Harbison <matt_harbison@yahoo.com> [Thu, 01 Oct 2015 21:24:10 -0400] rev 26430
test-debugextensions: sanitize JSON output for Windows Windows is printing a double backslash, which isn't handled by (glob): --- c:/Users/Matt/Projects/hg/tests/test-debugextensions.t +++ c:/Users/Matt/Projects/hg/tests/test-debugextensions.t.err @@ -47,7 +47,7 @@ { "buglink": "", "name": "color", - "source": "*/hgext/color.pyc", (glob) + "source": "c:\\Users\\Matt\\Projects\\hg\\hgext\\color.pyc", "testedwith": "internal" }, {
Thu, 01 Oct 2015 21:10:38 -0400 test-strip: add glob for Windows
Matt Harbison <matt_harbison@yahoo.com> [Thu, 01 Oct 2015 21:10:38 -0400] rev 26429
test-strip: add glob for Windows
Thu, 01 Oct 2015 10:48:14 -0700 bundle2: generate check:heads in a independent function
Ryan McElroy <rmcelroy@fb.com> [Thu, 01 Oct 2015 10:48:14 -0700] rev 26428
bundle2: generate check:heads in a independent function
Thu, 01 Oct 2015 12:17:46 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Thu, 01 Oct 2015 12:17:46 -0500] rev 26427
merge with stable
Wed, 30 Sep 2015 12:36:30 -0400 cmdutil: handle multiline translations of HG: messages safely
timeless@mozdev.org [Wed, 30 Sep 2015 12:36:30 -0400] rev 26426
cmdutil: handle multiline translations of HG: messages safely Before this, if a localizer/localization included a multiline message, and didn't prefix the intermediate lines with 'HG: ', then the line would be a candidate for inclusion in the commit message -- which isn't ideal.
Tue, 29 Sep 2015 14:42:03 -0700 strip: compress bundle2 backup using BZ
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 29 Sep 2015 14:42:03 -0700] rev 26425
strip: compress bundle2 backup using BZ Storing uncompressed bundle on disk would be a regression. Strip backup using bundle2 are now compressed when requested.
Tue, 29 Sep 2015 14:41:40 -0700 writebundle: add a compression argument for the bundle2 case
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 29 Sep 2015 14:41:40 -0700] rev 26424
writebundle: add a compression argument for the bundle2 case Bundle2 compression is more complex than the bundle1 one. Therefore it is handled by the bundler itself. Moreover, on-disk bundle2 will probably have a large number of flavors so simply adding a new "format" for it does not seems the way to go. This will be used in the next changeset to compress bundle2 strip backup.
Tue, 29 Sep 2015 13:16:51 -0700 strip: use bundle2 + cg2 by default when repository use general delta
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 29 Sep 2015 13:16:51 -0700] rev 26423
strip: use bundle2 + cg2 by default when repository use general delta The bundle10 format (plain changegroup-01) does not support general delta and result into expensive delta re-computation when stripping. If the repository is general delta, we store backups as bundle20 containing a changegroup-02 payload. We remove the experimental feature related to strip backup bundle format because this achieve the same goal in a leaner way. Removing the experimental option is fine, that is why it experimental in the first place. Compression of these bundles are coming in later changesets.
Wed, 30 Sep 2015 16:01:19 -0400 run-tests: report paths saved by --keep-tmpdir
timeless@mozdev.org [Wed, 30 Sep 2015 16:01:19 -0400] rev 26422
run-tests: report paths saved by --keep-tmpdir
Wed, 30 Sep 2015 15:43:49 -0500 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com> [Wed, 30 Sep 2015 15:43:49 -0500] rev 26421
urls: bulk-change primary website URLs
Wed, 30 Sep 2015 15:31:07 -0500 urls: bulk-change BTS urls to new location
Matt Mackall <mpm@selenic.com> [Wed, 30 Sep 2015 15:31:07 -0500] rev 26420
urls: bulk-change BTS urls to new location
Thu, 01 Oct 2015 12:07:20 -0500 Added signature for changeset 9a466b9f9792 stable
Matt Mackall <mpm@selenic.com> [Thu, 01 Oct 2015 12:07:20 -0500] rev 26419
Added signature for changeset 9a466b9f9792
Thu, 01 Oct 2015 12:06:56 -0500 Added tag 3.5.2 for changeset 9a466b9f9792 stable
Matt Mackall <mpm@selenic.com> [Thu, 01 Oct 2015 12:06:56 -0500] rev 26418
Added tag 3.5.2 for changeset 9a466b9f9792
Tue, 29 Sep 2015 23:29:44 -0400 largefiles: restore archiving largefiles with hgweb (issue4859) stable 3.5.2
Matt Harbison <matt_harbison@yahoo.com> [Tue, 29 Sep 2015 23:29:44 -0400] rev 26417
largefiles: restore archiving largefiles with hgweb (issue4859) This regressed in 7699d3212994, when trying to conditionally disable archiving of largefiles. I'm not sure if wrapfunction() is the right way to do this, but it seems to work. The mysterious issue with lfstatus getting out of sync in the proxy and the unfiltered view crops up again here. See the referenced cset for more info.
Thu, 01 Oct 2015 11:09:36 -0300 i18n-pt_BR: synchronized with f31ddc9bfa5f stable
Wagner Bruna <wbruna@softwareexpress.com.br> [Thu, 01 Oct 2015 11:09:36 -0300] rev 26416
i18n-pt_BR: synchronized with f31ddc9bfa5f
Sat, 26 Sep 2015 12:17:44 +0900 help: hide deprecated filesets, revsets and template items if not verbose
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:17:44 +0900] rev 26415
help: hide deprecated filesets, revsets and template items if not verbose This allows us to hide {branches} template keyword in a better way. Currently it is achieved by copying keywords table and deleting 'branches' from it.
Sat, 26 Sep 2015 12:11:46 +0900 help: pass around ui to rewriter hooks (API)
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:11:46 +0900] rev 26414
help: pass around ui to rewriter hooks (API) makeitemsdoc() will hide DEPRECATED items conditionally.
Sat, 26 Sep 2015 12:06:30 +0900 help: pass around ui to doc loader (API)
Yuya Nishihara <yuya@tcha.org> [Sat, 26 Sep 2015 12:06:30 +0900] rev 26413
help: pass around ui to doc loader (API) This is necessary to hide DEPRECATED items conditionally. Flagged as API change because it will break "hg help git|subversion".
Sun, 27 Sep 2015 23:34:37 +0900 gendoc: use real ui in place of stdout
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Sep 2015 23:34:37 +0900] rev 26412
gendoc: use real ui in place of stdout ui attributes will be required by a help function, so a file object can't be used as a fake ui.
Sun, 27 Sep 2015 22:29:07 +0900 check-seclevel: use ui to show status and error messages
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Sep 2015 22:29:07 +0900] rev 26411
check-seclevel: use ui to show status and error messages Future patches will require ui module to be passed to a help function, so let's use it where appropriate. Additional parens are necessary to silence a check-code warning.
Thu, 24 Sep 2015 17:52:21 -0700 unbundle: test and fix for clean abort on unknown bundle2 feature
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 24 Sep 2015 17:52:21 -0700] rev 26410
unbundle: test and fix for clean abort on unknown bundle2 feature This introduce a test for the feature and fix the exception name that is different on default.
Tue, 29 Sep 2015 14:33:31 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Tue, 29 Sep 2015 14:33:31 -0500] rev 26409
merge with stable
Tue, 29 Sep 2015 21:57:08 +0900 localrepo: recreate phasecache if changelog was modified (issue4855)
Yuya Nishihara <yuya@tcha.org> [Tue, 29 Sep 2015 21:57:08 +0900] rev 26408
localrepo: recreate phasecache if changelog was modified (issue4855) Because _phaserevs and _phasesets cache revision numbers, they must be invalidated if there are new commits or stripped revisions. We could do that by calling _phasecache.invalidate(), but it wasn't simple to be integrated with the filecache mechanism. So for now, phasecache will be recreated after repo.invalidate() if 00changelog.i was modified before.
Sat, 26 Sep 2015 00:10:48 -0400 progress: force a repaint of a printed progress bar after a clear()
Augie Fackler <augie@google.com> [Sat, 26 Sep 2015 00:10:48 -0400] rev 26407
progress: force a repaint of a printed progress bar after a clear() This avoids some visual flickering of the progress bar in convert and probably some other operations. Previously, a line of output would erase the progress bar, and then it would wait `progress.refresh` seconds (default of 0.1) before redrawing the progress bar. Now if we've ever painted a progress bar, we schedule the progress bar for immediate repainting on the next progress call, which helps lend the illusion that the progress bar is "always" there. In practice, it's merely there more of the time, but it ends up being a lot easier to read during convert.
Tue, 29 Sep 2015 14:08:37 -0500 tests: fix test-bundle2-format output
Matt Mackall <mpm@selenic.com> [Tue, 29 Sep 2015 14:08:37 -0500] rev 26406
tests: fix test-bundle2-format output Forgot to amend.
Tue, 29 Sep 2015 21:57:08 +0900 localrepo: recreate phasecache if changelog was modified (issue4855) stable
Yuya Nishihara <yuya@tcha.org> [Tue, 29 Sep 2015 21:57:08 +0900] rev 26405
localrepo: recreate phasecache if changelog was modified (issue4855) Because _phaserevs and _phasesets cache revision numbers, they must be invalidated if there are new commits or stripped revisions. We could do that by calling _phasecache.invalidate(), but it wasn't simple to be integrated with the filecache mechanism. So for now, phasecache will be recreated after repo.invalidate() if 00changelog.i was modified before.
Wed, 23 Sep 2015 12:56:12 -0700 bundle2: allow compressed bundle
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 12:56:12 -0700] rev 26404
bundle2: allow compressed bundle This changeset adds support for a 'compression' parameter in bundle2 streams. When set, it controls the compression algorithm used for the payload part of the bundle2. There is currently no usage of this except in tests.
Mon, 28 Sep 2015 15:01:20 -0700 test-bundle2: dump bundle content using f --hexdump
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 28 Sep 2015 15:01:20 -0700] rev 26403
test-bundle2: dump bundle content using f --hexdump Thanks to Greg Szorc for pointing this out.
Fri, 25 Sep 2015 22:54:46 -0400 treemanifest: rework lazy-copying code (issue4840)
Augie Fackler <augie@google.com> [Fri, 25 Sep 2015 22:54:46 -0400] rev 26402
treemanifest: rework lazy-copying code (issue4840) The old lazy-copy code formed a chain of copied manifests with each copy. Under typical operation, the stack never got more than a couple of manifests deep and was fine. Under conditions like hgsubversion or convert, the stack could get hundreds of manifests deep, and eventually overflow the recursion limit for Python. I was able to consistently reproduce this by converting an hgsubversion clone of svn's history to treemanifests. This may result in fewer manifests staying in memory during operations like convert when treemanifests are in use, and should make those operations faster since there will be significantly fewer noop function calls going on. A previous attempt (never mailed) of mine to fix this problem tried to simply have all treemanifests only have a loadfunc - that caused somewhat weird problems because the gettext() callable passed into read() wasn't idempotent, so the easy solution is to have a loadfunc and a copyfunc.
Fri, 25 Sep 2015 17:18:28 -0400 manifest: rename treemanifest load functions to ease debugging
Augie Fackler <augie@google.com> [Fri, 25 Sep 2015 17:18:28 -0400] rev 26401
manifest: rename treemanifest load functions to ease debugging I'm hunting an infinite recursion bug at the moment, and having both of these methods named just _load is muddying the waters slightly.
Fri, 25 Sep 2015 17:17:36 -0400 manifest: add id(self) to treemanifest __repr__
Augie Fackler <augie@google.com> [Fri, 25 Sep 2015 17:17:36 -0400] rev 26400
manifest: add id(self) to treemanifest __repr__ Also rename __str__ to __repr__ since that's what we really want for pdb.
Mon, 28 Sep 2015 10:27:36 -0700 bundlerepo: let bundle repo look in the _mancache
Durham Goode <durham@fb.com> [Mon, 28 Sep 2015 10:27:36 -0700] rev 26399
bundlerepo: let bundle repo look in the _mancache When looking up a base revision, we were ignoring the contents that were already available in the manifest's _mancache. This patch allows us to use that data instead of reading from the revlog. This is useful in our pushrebase extension (which allows rebasing on the server side during a push) because it allows us to prefetch the bundle base manifest before aquiring the repo lock (1 second saving), which means doing less work inside the lock, which means a 20% higher commit rate.
Sun, 27 Sep 2015 22:19:54 +0900 check-seclevel: wrap entry point by function
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Sep 2015 22:19:54 +0900] rev 26398
check-seclevel: wrap entry point by function This is intended to narrow scope of local variables. The global _verbose flag will be replaced later by ui.verbose.
Sun, 27 Sep 2015 22:16:24 +0900 check-seclevel: set executable bit as it has shebang
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Sep 2015 22:16:24 +0900] rev 26397
check-seclevel: set executable bit as it has shebang
Wed, 23 Sep 2015 12:56:05 -0700 bundle20: extract core payload generation in its own function
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 12:56:05 -0700] rev 26396
bundle20: extract core payload generation in its own function We are about to allow compressing the core of the bundle2. So we extract the generation of this bits in its own parts to make this compression phases easier in a later changesets.
Wed, 23 Sep 2015 14:00:16 -0700 unbundle20: allow registering handlers for stream level parameters
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 14:00:16 -0700] rev 26395
unbundle20: allow registering handlers for stream level parameters As a comment in the code have been asking for, it is now possible to register piece of code that handle parameters for the stream. I've been wondering is such function should be class methods or not. I eventually went for externally decorated methods to stick with the culture of extensibility from an extensions that apply to bundle2.
Wed, 23 Sep 2015 11:55:27 -0700 bundle2: allow to specify unsupported value on error
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 11:55:27 -0700] rev 26394
bundle2: allow to specify unsupported value on error A client may support an argument but not some of its values (eg: coming "compression" parameters). We allow this case to be carried in the exception.
Wed, 23 Sep 2015 11:44:52 -0700 bundle2: rename error exception class for unsupported feature
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 11:44:52 -0700] rev 26393
bundle2: rename error exception class for unsupported feature The original name explicitly mention "Part", however it is also used outside of parts related feature. We rename from 'UnsupportedPartError' to 'BundleUnknownFeatureError' to fix this.
Wed, 23 Sep 2015 11:33:30 -0700 changegroup: use a different compression key for BZ in HG10
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 23 Sep 2015 11:33:30 -0700] rev 26392
changegroup: use a different compression key for BZ in HG10 For "space saving", bundle1 "strip" the first two bytes of the BZ stream since they always are 'BZ'. So the current code boostrap the uncompressor with 'BZ'. This hack is impractical in more generic case so we move it in a dedicated "decompression".
Sat, 26 Sep 2015 17:24:12 +0800 monoblue: provide links to branches, tags and bookmarks by name
Anton Shestakov <av6@dwimlabs.net> [Sat, 26 Sep 2015 17:24:12 +0800] rev 26391
monoblue: provide links to branches, tags and bookmarks by name This is adapted from cd842821db2c, that was added to paper for 3.5 release. It adds another way to refer to branches, tags and bookmarks in urls: by name. It's still possible to navigate to a specific changeset hash, but now you can get more descriptive urls straight from /summary page, for example. branchentry template (and so the whole branches table on /summary and /branches) lost the column that had a plain changeset hash, because tags and bookmarks don't have this column and also because there is already a way to address branch by its changeset hash (changeset link just next to it). Maybe we can instead bring this column with a plain changeset hash to tags and bookmarks, but this, more terse, new look feels fine.
Sat, 26 Sep 2015 17:15:58 +0800 gitweb: provide links to branches, tags and bookmarks by name
Anton Shestakov <av6@dwimlabs.net> [Sat, 26 Sep 2015 17:15:58 +0800] rev 26390
gitweb: provide links to branches, tags and bookmarks by name This is adapted from cd842821db2c, that was added to paper for 3.5 release. It adds another way to refer to branches, tags and bookmarks in urls: by name. It's still possible to navigate to a specific changeset hash, but now you can get more descriptive urls straight from /summary page, for example. branchentry template (and so the whole branches table on /summary and /branches) lost the column that had a plain changeset hash, because tags and bookmarks don't have this column and also because there is already a way to address branch by its changeset hash (changeset link just next to it). Maybe we can instead bring this column with a plain changeset hash to tags and bookmarks, but this, more terse, new look feels fine.
Fri, 25 Sep 2015 03:44:15 -0400 cmdutil: remove HG: prefix from translation strings
timeless@mozdev.org [Fri, 25 Sep 2015 03:44:15 -0400] rev 26389
cmdutil: remove HG: prefix from translation strings
Fri, 25 Sep 2015 03:47:48 -0400 i18n-zh_CN: annotate broken HG: translations
timeless@mozdev.org [Fri, 25 Sep 2015 03:47:48 -0400] rev 26388
i18n-zh_CN: annotate broken HG: translations
Thu, 24 Sep 2015 22:07:55 -0700 lock: recognize parent locks while acquiring
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 22:07:55 -0700] rev 26387
lock: recognize parent locks while acquiring This is part of a series that will allow locks to be inherited by subprocesses in limited circumstances. This patch enables the logic introduced in previous patches.
Thu, 24 Sep 2015 22:00:51 -0700 test-lock.py: fix testing for forks
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 22:00:51 -0700] rev 26386
test-lock.py: fix testing for forks The earlier test worked only because the held count went up to 2, so the first release brought it down to 1. Making a copy of the lock fixes that issue.
Thu, 24 Sep 2015 20:40:00 -0700 test-lock.py: allow PID to be changed in test state
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 20:40:00 -0700] rev 26385
test-lock.py: allow PID to be changed in test state This will be used in upcoming patches to create locks that appear as if they're being created by child processes.
Thu, 24 Sep 2015 20:22:59 -0700 test-lock.py: add a lock wrapper that allows faking the PID
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 20:22:59 -0700] rev 26384
test-lock.py: add a lock wrapper that allows faking the PID This will be used in upcoming patches to create locks that appear as if they're being created by child processes.
Thu, 24 Sep 2015 21:26:37 -0700 lock: add a wrapper to os.getpid() to make testing easier
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 21:26:37 -0700] rev 26383
lock: add a wrapper to os.getpid() to make testing easier This will allow us to fake locks across processes more easily.
Thu, 24 Sep 2015 19:52:34 -0700 test-lock.py: move temp dir generation to testcase
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 19:52:34 -0700] rev 26382
test-lock.py: move temp dir generation to testcase In upcoming patches we'll want to create multiple test state objects with a common test directory.
Thu, 24 Sep 2015 17:33:13 -0700 test-lock.py: copy-edit assertions about file existing
Siddharth Agarwal <sid0@fb.com> [Thu, 24 Sep 2015 17:33:13 -0700] rev 26381
test-lock.py: copy-edit assertions about file existing Before: expected lock to exists but actually did not exists After: expected lock to exist but actually did not exist
Sat, 26 Sep 2015 21:43:13 -0700 revlog: don't flush data file after every added revision
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 26 Sep 2015 21:43:13 -0700] rev 26380
revlog: don't flush data file after every added revision The current behavior of revlogs is to flush the data file when writing data to it. Tracing system calls revealed that changegroup processing incurred numerous write(2) calls for values much smaller than the default buffer size (Python defaults to 4096, but it can be adjusted based on detected block size at run time by CPython). The reason we flush revlogs is so readers have all data available. For example, the current code in revlog.py will re-open the revlog file (instead of seeking an existing file handle) to read the text of a revision. This happens when starting a new delta chain when adding several revisions from changegroups, for example. Yes, this is likely sub-optimal (we should probably be sharing file descriptors between readers and writers to avoid the flushing and associated overhead of re-opening files). While flushing revlogs is necessary, it appears all callers are diligent about flushing files before a read is performed (see buildtext() in _addrevision()), making the flush in _writeentry() redundant and unncessary. So, we remove it. In practice, this means we incur a write(2) a) when the buffer is full (typically 4096 bytes) b) when a new delta chain is created rather than after every added revision. This applies to every revlog, but by volume it mostly impacts filelogs. Removing the redundant flush from _writeentry() significantly reduces the number of write(2) calls during changegroup processing on my Linux machine. When applying a changegroup of the hg repo based on my local repo, the total number of write(2) calls during application of the mercurial/localrepo.py revlogs dropped from 1,320 to 217 with this patch applied. Total I/O related system calls dropped from 1,577 to 474. When unbundling a mozilla-central gzipped bundle (264,403 changesets with 1,492,215 changes to 222,507 files), total write(2) calls dropped from 1,252,881 to 827,106 and total system calls dropped from 3,601,259 to 3,178,636 - a reduction of 425,775! While the system call reduction is significant, it appears to have no impact on wall time on my Linux and Windows machines. Still, fewer syscalls is fewer syscalls. Surely this can't hurt. If nothing else, it makes examining remaining system call usage simpler and opens the door to experimenting with the performance impact of different buffer sizes.
Sun, 27 Sep 2015 16:08:18 -0700 revlog: use existing file handle when reading during _addrevision
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 16:08:18 -0700] rev 26379
revlog: use existing file handle when reading during _addrevision _addrevision() may need to read from revlogs as part of computing deltas. Previously, we would flush existing file handles and open a new, short-lived file handle to perform the reading. If we have an existing file handle, it seems logical to reuse it for reading instead of opening a new file handle. This patch makes that the new behavior. After this patch, revlog files are only reopened when adding revisions if the revlog is switched from inline to non-inline. On Linux when unbundling a bundle of the mozilla-central repo, this patch has the following impact on system call counts: Call Before After Delta write 827,639 673,390 -154,249 open 700,103 684,089 -16,014 read 74,489 74,489 0 fstat 493,924 461,896 -32,028 close 249,131 233,117 -16,014 stat 242,001 242,001 0 lstat 18,676 18,676 0 lseek 20,268 20,268 0 ioctl 14,652 13,173 -1,479 TOTAL 3,180,758 2,930,679 -250,079 It's worth noting that many of the open() calls fail due to missing files. That's why there are many more open() calls than close(). Despite the significant system call reduction, this change does not seem to have a significant performance impact on Linux. On Windows 10 (not a VM, on a SSD), this patch appears to reduce unbundle time for mozilla-central from ~960s to ~920s. This isn't as significant as I was hoping. But a decrease it is nonetheless. Still, Windows unbundle performance is still >2x slower than Linux. Despite the lack of significant gains, fewer system calls is fewer system calls. If nothing else, this will narrow the focus of potential areas to optimize in the future.
Sun, 27 Sep 2015 15:59:19 -0700 revlog: always open revlogs for reading and appending
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 15:59:19 -0700] rev 26378
revlog: always open revlogs for reading and appending An upcoming patch will teach revlogs to use the existing file handle to read revision data instead of opening a new file handle just for quick reads. For this to work, files must be opened for reading as well. This patch is merely cosmetic: there are no behavior changes.
Sun, 27 Sep 2015 15:48:35 -0700 revlog: support using an existing file handle when reading revlogs
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 27 Sep 2015 15:48:35 -0700] rev 26377
revlog: support using an existing file handle when reading revlogs Currently, the low-level revlog reading code always opens a new file handle. In some key scenarios, the revlog is already opened and an existing file handle could be used to read. This patch paves the road to that by teaching various revlog reading functions to accept an optional existing file handle to read from.
(0) -10000 -3000 -1000 -120 +120 +1000 +3000 +10000 tip