Wed, 03 Feb 2016 17:05:04 +0000 blackbox: store the blackbox ui object instead of the log file
timeless <timeless@mozdev.org> [Wed, 03 Feb 2016 17:05:04 +0000] rev 28247
blackbox: store the blackbox ui object instead of the log file Without this, the last logged entry didn't have access to the repository, and thus couldn't report its version (and especially that an add or similar dirtied it). A side-effect is that one repo leaks until process exit...
Tue, 09 Feb 2016 15:44:13 +0000 blackbox: log dirty state
timeless <timeless@mozdev.org> [Tue, 09 Feb 2016 15:44:13 +0000] rev 28246
blackbox: log dirty state If blackbox.dirty = True, use `+` to indicate dirty repositories.
Tue, 09 Feb 2016 19:16:06 +0000 blackbox: log working directory version
timeless <timeless@mozdev.org> [Tue, 09 Feb 2016 19:16:06 +0000] rev 28245
blackbox: log working directory version Without this, while you could see the list of commands run, it wasn't possible to identify what they were doing, because commads could rely on revsets (including remote input which varies over time).
Mon, 08 Feb 2016 03:37:26 +0000 blackbox: rename fp variable
timeless <timeless@mozdev.org> [Mon, 08 Feb 2016 03:37:26 +0000] rev 28244
blackbox: rename fp variable
Wed, 03 Feb 2016 15:41:31 +0000 blackbox: avoid creating multiple file handles for a single log
timeless <timeless@mozdev.org> [Wed, 03 Feb 2016 15:41:31 +0000] rev 28243
blackbox: avoid creating multiple file handles for a single log There are multiple ui objects in Mercurial that can relate to a repository, before this change, each one would have its own file pointer, which results in unfortunate logging behavior. Also, any log rotation results would be bad because only the active blackboxui object's file pointer would be refreshed. Note that this does not prevent two long running hg commands for the same repository from causing problems.
Wed, 24 Feb 2016 20:04:32 +0000 tests: mock getpid to reduce glob usage
timeless <timeless@mozdev.org> [Wed, 24 Feb 2016 20:04:32 +0000] rev 28242
tests: mock getpid to reduce glob usage Updating tests based on ac49ecb2a897.
Mon, 22 Feb 2016 14:43:14 -0800 changegroup: drop special-casing of flat manifests
Martin von Zweigbergk <martinvonz@google.com> [Mon, 22 Feb 2016 14:43:14 -0800] rev 28241
changegroup: drop special-casing of flat manifests Since c08814b48ae5 (changegroup: avoid iterating the whole manifest, 2015-12-04), the manifest linkrev callback iterates over only the files that were touched according the the changeset. Before that change, we iterated over all files returned in manifest.readfast(). That method returns the files in the delta, if the delta parent is a parent, otherwise it returns the full manifest. Most manifest revisions end up using one of the parents as its delta parent, so most of the time, the method returns a short manifest. It seems that that happens often enough that it doesn't really matter; I could not reproduce the timings reported in that change. Since the treemanifest code now works quite differently, and since that code also works correctly for flat manifests, let's drop the special-casing of flat manifests.
Fri, 12 Feb 2016 23:09:09 -0800 changegroup: fix treemanifests on merges
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Feb 2016 23:09:09 -0800] rev 28240
changegroup: fix treemanifests on merges The current code for generating treemanifest revisions takes the list of files in the changeset and finds the directories from them. This does not work for merges, since a merge may pick file A from one side and file B from another and neither of them would appear in the changeset's "files" list, but the manifest would still change. Fix this by instead walking the root manifest log for all needed revisions, storing all needed file and subdirectory revisions, then recursively visiting the subdirectories. This also turns out to be faster: cloning a version of hg core converted to treemanifests went from ~28s to ~19s (timing somewhat unfair: before this patch, timed until crash; after this patch, timed until manifests complete). The new algorithm is used only on treemanifest repos. Although it works equally well on flat manifests, we leave the iteration over files in the changeset for flat manifests for now.
Sun, 27 Dec 2015 20:21:37 +0900 templatekw: workaround for utf-8 round-trip of {desc}
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Dec 2015 20:21:37 +0900] rev 28239
templatekw: workaround for utf-8 round-trip of {desc} Though our encoding strategy is best effort, {desc} is a primitive keyword that should be worth enough to try hard to preserve UTF-8 bytes.
Thu, 25 Feb 2016 10:34:31 +0100 test: update test-bundle2-format.t comment
Pierre-Yves David <pierre-yves.david@fb.com> [Thu, 25 Feb 2016 10:34:31 +0100] rev 28238
test: update test-bundle2-format.t comment Now that bundle2 is used by default for all exchanges, this comment is obviously out of date. Having deep testing of the API and expected behavior of the format and its processing is still valuable, so the comment is updated.
Wed, 24 Feb 2016 14:24:00 +0000 chg: extract gethgcmd logic to a function
Jun Wu <quark@fb.com> [Wed, 24 Feb 2016 14:24:00 +0000] rev 28237
chg: extract gethgcmd logic to a function gethgcmd is to get original hg (not chg) binary name. This patch extracts the logic from execcmdserver to make it available for the following patch.
Wed, 24 Feb 2016 23:00:33 +0900 destutil: use cached branch information instead of query for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 24 Feb 2016 23:00:33 +0900] rev 28236
destutil: use cached branch information instead of query for efficiency Before this patch, calculation of "the tipmost branch head on current branch" uses revset query "max(.::(head() and branch(BRANCH)))", but this isn't efficiency, because: - head() predicate lists up heads on all branches, but - branch() predicate eliminates heads on other branches In addition to it, without "literal:" prefix for branch name, branch(BRANCH) tries to (1) look up BRANCH in "repo.branchmap()" and (2) look up BRANCH as symbol name again, if there is no branch matching against BRANCH. The latter looking up is obviously redundant. This patch uses repo.branchheads(closed=True) to get all branch heads on specified branch instead of "head() and branch(BRANCH)" revset query part. This patch also makes catching RepoLookupError meaningless, because it is only raised by revset predicate "branch()". But "currentbranch in repo.branchmap()" can detect whether currentbranch actually exists or not. Therefore, this patch replaces try/except for RepoLookupError by if/else for "currentbranch in repo.branchmap()".
Wed, 24 Feb 2016 23:00:33 +0900 destutil: replace wc.branch() invocations by cached value for efficiency
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 24 Feb 2016 23:00:33 +0900] rev 28235
destutil: replace wc.branch() invocations by cached value for efficiency
Wed, 24 Feb 2016 23:00:32 +0900 destutil: remove redundant examination
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 24 Feb 2016 23:00:32 +0900] rev 28234
destutil: remove redundant examination Before this patch, "len(heads) != len(otherheads)" is examined to detect whether message should be displayed or not. But if "repo.revs('%ln and parents()', heads)", heads should contain "parents()" and otherheads is always less than heads.
Wed, 24 Feb 2016 23:00:32 +0900 destutil: add new local variable to increase readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 24 Feb 2016 23:00:32 +0900] rev 28233
destutil: add new local variable to increase readability Before this patch, local variable 'heads' is used not only for "all branch heads" but also for "branch heads other than current parent". This patch newly adds local variable 'otherheads' for the latter purpose, to increase readability.
Fri, 12 Feb 2016 23:30:18 -0800 changegroup: write root manifests and subdir manifests in a single loop
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Feb 2016 23:30:18 -0800] rev 28232
changegroup: write root manifests and subdir manifests in a single loop This is another step towards making the manifest generation recurse along the directory trees. The loop over 'tmfnodes' now takes the form of a queue. At this point, we only add to the queue twice: we add the root manifests, and, while visiting the root manifest revisions, we add all subdirectory revisions (for treemanifest repos). Thus, any iterations over 'tmfnodes' after the first will not add any items and the "queue" will just keep shrinking.
Fri, 12 Feb 2016 23:26:15 -0800 changegroup: introduce makelookupmflinknode(dir)
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Feb 2016 23:26:15 -0800] rev 28231
changegroup: introduce makelookupmflinknode(dir) This is another step towards making the manifest generation recurse along the directory trees. It makes the two calls to _packmanifests() more similar.
Fri, 12 Feb 2016 21:21:28 -0800 changegroup: prune subdirectory dirlogs too
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Feb 2016 21:21:28 -0800] rev 28230
changegroup: prune subdirectory dirlogs too We already prune changesets, root manifests and files whose linkrev is in the set of common revisions. We should do the same for dirlogs.
Fri, 12 Feb 2016 15:42:16 -0800 changegroup: include subdirectory manifests in verbose size
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Feb 2016 15:42:16 -0800] rev 28229
changegroup: include subdirectory manifests in verbose size When verbose logging is one, we report the size in bytes of the manifest data in the changegroup. For files, we report the size per file, but I'm not sure we need that level of detail (i.e. size per directory manifest). Instead, report a single figure for the size of root manifest plus submanifests.
Fri, 12 Feb 2016 15:18:56 -0800 changegroup: make _packmanifests() dumber
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 Feb 2016 15:18:56 -0800] rev 28228
changegroup: make _packmanifests() dumber The next few patches will rewrite the manifest generation code to work with merges. We will then walk dirlogs recursively. This prepares for that by moving much of the treemanifest code out of _packmanifests() and into generatemanifests(). For this to work, it also adds _manifestsdone() method that returns the "end of manifests" close chunk for cg3 and an empty string for cg1 and cg2.
Thu, 11 Feb 2016 20:19:48 -0800 changegroup: extract generatemanifests()
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Feb 2016 20:19:48 -0800] rev 28227
changegroup: extract generatemanifests() The changegroup.generate() function is pretty long, so let's extract the manifest generation part of it.
Tue, 23 Feb 2016 10:59:25 -0800 merge: use any() instead of for loop when checking for dirty subrepos
Martin von Zweigbergk <martinvonz@google.com> [Tue, 23 Feb 2016 10:59:25 -0800] rev 28226
merge: use any() instead of for loop when checking for dirty subrepos I think it's both simpler and clearer to use any() than the current for loop. While at it, also drop the call to sorted(), since it doesn't matter which order we iterate over subrepos.
Wed, 24 Feb 2016 19:31:55 +0000 templater: fix list templating bug
Kostia Balytskyi <ikostia@fb.com> [Wed, 24 Feb 2016 19:31:55 +0000] rev 28225
templater: fix list templating bug High-level use case: printing a list of objects with formatter when each object in turn contains a list of properties (like when % template symbol is used in {things % '{thing}'} Let the top-level list contain one thing with two properties: objs = [{ 'props': [ { 'value': 1, 'show': 1 }, { 'value': 2 }] }] (please note that second property does not have 'show' key) If a templateformatter is used to print this with template "{props % '{if(show, value)}'}" current implementation will print value for both properties, which is a bug. This happens because in `templater.runmap` function we only rewrite mapping values with existing new values for each item. If some mapping value is missing in the item, it will not be removed.
Wed, 24 Feb 2016 16:58:07 +0100 histedit: also handle locally missing nodes when reading obsolescence
Pierre-Yves David <pierre-yves.david@fb.com> [Wed, 24 Feb 2016 16:58:07 +0100] rev 28224
histedit: also handle locally missing nodes when reading obsolescence The previous version of the code was interpreting markers to a missing node as a prune in all cases. The expected way to handle such situation is to keep reading markers, only turning successors into "prune" if they are at the end of a chain. We update the code and add a test for this.
Wed, 24 Feb 2016 18:42:59 +0000 chgserver: auto exit after being idle for too long or lose the socket file
Jun Wu <quark@fb.com> [Wed, 24 Feb 2016 18:42:59 +0000] rev 28223
chgserver: auto exit after being idle for too long or lose the socket file This is a part of the one server per config series. In multiple-server setup, new server may be started for a temporary config change like in command line, --config extensions.foo=bar.py. This may end up with a lot of not so useful server processes. Other questions are about socket file and process management, How to stop these processes? What if a new server wants to listen on a same address, replacing the old one? This patch introduces AutoExitMixIn, which will: 1. Exit after being idle for too long. So useless servers won't run forever. 2. Periodically check the ownership of socket file, exit if it is no longer owned. This brings strong consistency between the filesystem and the process, and handles some race conditions neatly. Since rename is atomic, a new server can just have a same server address with an old one and won't worry about how to make sure the old server is killed, address conflict, service downtime issues. The user can safely stop all servers by simply removing the socket files, without worrying about outdated or accidentally removed pidfiles.
Mon, 22 Feb 2016 23:36:04 +0100 unionrepo: properly handle hidden linkrev in revlog (issue5070) stable
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 22 Feb 2016 23:36:04 +0100] rev 28222
unionrepo: properly handle hidden linkrev in revlog (issue5070) The unionrepository have to do some special magic to handle linkrev of the unioned filerev and manifestrev. That logic was done from a repoview and obsolescence marker affecting bundled changeset could lead to a crash. We now ensure we operate on unfiltered repository.
Mon, 22 Feb 2016 23:34:54 +0100 bundlerepo: properly handle hidden linkrev in manifestlog (issue4945) stable
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 22 Feb 2016 23:34:54 +0100] rev 28221
bundlerepo: properly handle hidden linkrev in manifestlog (issue4945) The bundlerepository have to do some special magic to handle linkrev of the bundled manifest. That logic was done from a repoview and obsolescence marker affecting bundled changeset could lead to a crash. We now ensure we operate on unfiltered repository.
Mon, 22 Feb 2016 18:35:40 +0100 bundlerepo: properly handle hidden linkrev in filelog (issue4945) stable
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 22 Feb 2016 18:35:40 +0100] rev 28220
bundlerepo: properly handle hidden linkrev in filelog (issue4945) The bundlerepository have to do some special magic to handle linkrev of the bundlerepo filerev. That logic was done from a repoview and obsolescence marker affecting bundled changeset could lead to a crash. We now ensure we operate on unfiltered repository.
Wed, 24 Feb 2016 18:42:14 +0000 check-code: allow old style class with special comments
Jun Wu <quark@fb.com> [Wed, 24 Feb 2016 18:42:14 +0000] rev 28219
check-code: allow old style class with special comments The following chgserver change will use an old style class to comply with SocketServer's code style. This patch made it possible to pass check-code.
Wed, 24 Feb 2016 15:55:44 -0600 merge with stable
Matt Mackall <mpm@selenic.com> [Wed, 24 Feb 2016 15:55:44 -0600] rev 28218
merge with stable
Wed, 24 Feb 2016 10:41:15 -0800 revset: use smartset minus operator
Durham Goode <durham@fb.com> [Wed, 24 Feb 2016 10:41:15 -0800] rev 28217
revset: use smartset minus operator Previously, revsets like 'X - Y' were translated to be 'X and not Y'. This can be expensive, since if Y is a single commit then 'not Y' becomes a huge set and sometimes the query optimizer doesn't account for it well. This patch changes revsets to use the built in smartset minus operator, which is often smarter than 'X and not Y'. On a large repo this saves 2.2 seconds on rebase and histedit because "X:: - X" becomes almost instant. Relevant performance numbers from revsetbenchmark.py revset #13: roots((tip~100::) - (tip~100::tip)) plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast 0) 0.001080 0.001107 0.001102 0.001118 0.001121 0.001114 0.001141 0.001123 0.001099 0.001123 0.001137 1) 0.000708 65% 0.000738 66% 0.000735 66% 0.000739 66% 0.000784 69% 0.000780 70% 0.000807 70% 0.000756 67% 0.000727 66% 0.000759 67% 0.000808 71% revset #14: roots((0::) - (0::tip)) plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast 0) 0.131304 0.079168 0.133129 0.076560 0.048179 0.133349 0.049153 0.077097 0.129689 0.076212 0.048543 1) 0.065066 49% 0.036941 46% 0.066063 49% 0.034755 45% 0.048558 0.071091 53% 0.047679 0.034984 45% 0.064572 49% 0.035680 46% 0.048508 revset #22: (not public() - obsolete()) plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast 0) 0.000139 0.000133 0.000133 0.000138 0.000134 0.000155 0.000157 0.000152 0.000157 0.000156 0.000153 1) 0.000108 77% 0.000129 0.000129 0.000134 0.000132 0.000127 81% 0.000151 0.000147 0.000127 80% 0.000152 0.000149 revset #25: (20000::) - (20000) plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast 0) 0.050560 0.045513 0.022593 0.043588 0.021909 0.045517 0.021822 0.044660 0.049740 0.044227 0.021819 1) 0.018614 36% 0.000171 0% 0.019659 87% 0.000168 0% 0.015543 70% 0.021069 46% 0.015623 71% 0.000180 0% 0.018658 37% 0.000186 0% 0.015750 72%
Tue, 23 Feb 2016 21:38:36 +0000 histedit: make histedit aware of obsolescense not stored in state (issue4800)
Kostia Balytskyi <ikostia@fb.com> [Tue, 23 Feb 2016 21:38:36 +0000] rev 28216
histedit: make histedit aware of obsolescense not stored in state (issue4800) Before this change, when histedit exited to interactive session (during edit command for example), user could introduce obsolescence markers that would not be known to histedit. For example, user could've amended one of the commits. The fact of this amendment would not be stored in histedit's state file and later, when histedit would try to process all the replacements, one of the final successors (in histedit's opinion) would turn out to be hidden. This behavior is described in issue4800. This commit fixes it.
Tue, 09 Feb 2016 20:22:33 -0800 treemanifest: allow setting flag to 't'
Martin von Zweigbergk <martinvonz@google.com> [Tue, 09 Feb 2016 20:22:33 -0800] rev 28215
treemanifest: allow setting flag to 't' When using treemanifests, an on-disk manifest entry with the 't' flag set means that that entry is a directory and not a file. When read into memory, these become instances of the treemanifest class. The 't' flag should therefore never be visible to outside of manifest.py, so setflag() checks that it is not called with the 't' flag. However, it turns out that it will be useful for the narrowhg extension to expose the 't' flag to the user (see below), so let's drop the assertion. The narrowhg extension allows cloning only a given set of files and directories. Filelogs and dirlogs that don't match that set will not be included in the clone. The extension currently doesn't work with treemanifests. I plan on changing it so directories outside the narrow clone appear in the manifest. For example, if a directory 'outside/' is not part of the narrow clone, it will look like a file 'outside' with the 't' flag set. That will make e.g. manifestmerge() just work in most cases (and make it well prepared to handle the other cases).
Tue, 23 Feb 2016 17:22:51 -0800 treemanifest: use "cp xyz/." instead of "cp xyz/*"
Tony Tung <tonytung@merly.org> [Tue, 23 Feb 2016 17:22:51 -0800] rev 28214
treemanifest: use "cp xyz/." instead of "cp xyz/*" This is more similar to cp -T because it covers hidden files.
Sun, 27 Dec 2015 18:50:03 +0900 templatefilters: drop old jsonescape() function
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Dec 2015 18:50:03 +0900] rev 28213
templatefilters: drop old jsonescape() function It's been superseded by encoding.jsonescape(paranoid=True).
Sun, 27 Dec 2015 17:59:57 +0900 templatefilters: make json filter be byte-transparent (BC) (issue4926)
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Dec 2015 17:59:57 +0900] rev 28212
templatefilters: make json filter be byte-transparent (BC) (issue4926) This is necessary to preserve filename encoding over JSON. Instead, this patch inserts "|utf8" where non-ascii local-encoding texts can be passed to "|json". See also the commit that introduced "utf8" filter.
Mon, 04 Jan 2016 23:05:09 +0900 hgweb: add option to convert encoding of graphdata()
Yuya Nishihara <yuya@tcha.org> [Mon, 04 Jan 2016 23:05:09 +0900] rev 28211
hgweb: add option to convert encoding of graphdata() Because future patches will change "|json" filter to handle input bytes transparently, i.e. use UTF-8b encoding, "{jsdata}" must keep data in UTF-8 bytes, whereas "{nodes}" are text. This patch inserts encodestr() where localstr is likely to survive.
Mon, 04 Jan 2016 22:55:05 +0900 hgweb: remove unused argument from graphdata() factory
Yuya Nishihara <yuya@tcha.org> [Mon, 04 Jan 2016 22:55:05 +0900] rev 28210
hgweb: remove unused argument from graphdata() factory As graphdata() is wrapped by lambda, there's no reason to pass unused arguments to it.
Sun, 27 Dec 2015 17:45:05 +0900 templatefilters: add "utf8" to get utf-8 bytes from local-encoding text
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Dec 2015 17:45:05 +0900] rev 28209
templatefilters: add "utf8" to get utf-8 bytes from local-encoding text This will be applied prior to "|json" filter. This sounds like odd, but it is necessary to handle local-encoding text as well as raw filename bytes. Because filenames are bytes in Mercurial and Unix world, {filename|json} should preserve the original byte sequence, which implies {x|json} -> '"' toutf8b(x) '"' On the other hand, most template strings are in local encoding. Because "|json" filter have to be byte-transparent to filenames, we need something to annotate an input as a local string, that's what "|utf8" will do. {x|utf8|json} -> '"' toutf8b(fromlocal(x)) '"' "|utf8" is an explicit call, so aborts if input bytes can't be converted to UTF-8.
Sun, 27 Dec 2015 17:16:45 +0900 templatefilters: drop broken "jsonescape" from filters table (BC)
Yuya Nishihara <yuya@tcha.org> [Sun, 27 Dec 2015 17:16:45 +0900] rev 28208
templatefilters: drop broken "jsonescape" from filters table (BC) It's been unused, undocumented and flawed in that it expects a unicode input, never works correctly if an input has non-ascii character. We should use "json" filter instead.
Sat, 20 Feb 2016 23:57:21 -0800 treemanifest: rewrite text() using iterentries()
Martin von Zweigbergk <martinvonz@google.com> [Sat, 20 Feb 2016 23:57:21 -0800] rev 28207
treemanifest: rewrite text() using iterentries() This simplifies a bit. Note that the function is only used when manually testing with _treeinmem=True.
Sun, 07 Feb 2016 21:14:01 -0800 treemanifest: implement iterentries()
Martin von Zweigbergk <martinvonz@google.com> [Sun, 07 Feb 2016 21:14:01 -0800] rev 28206
treemanifest: implement iterentries() To make tests pass with _treeinmem manually set to True, we need to implement the recently added iterentries() on the treemanifest class too.
Thu, 11 Feb 2016 15:38:56 -0800 verify: show progress while verifying dirlogs
Martin von Zweigbergk <martinvonz@google.com> [Thu, 11 Feb 2016 15:38:56 -0800] rev 28205
verify: show progress while verifying dirlogs In repos with treemanifests, the non-root-directory dirlogs often have many more total revisions than the root manifest log has. This change adds progress out to that part of 'hg verify'. Since the verification is recursive along the directory tree, we don't know how many total revisions there are at the beginning of the command, so instead we report progress in units of directories, much like we report progress for verification of files today. I'm not very happy with passing both 'storefiles' and 'progress' into the recursive calls. I tried passing in just a 'visitdir(dir)' callback, but the results did not seem better overall. I'm happy to update if anyone has better ideas.
Wed, 03 Feb 2016 15:35:15 -0800 verify: check for orphaned dirlogs
Martin von Zweigbergk <martinvonz@google.com> [Wed, 03 Feb 2016 15:35:15 -0800] rev 28204
verify: check for orphaned dirlogs We already report orphaned filelogs, i.e. revlogs for files that are not mentioned in any manifest. This change adds checking for orphaned dirlogs, i.e. revlogs that are not mentioned in any parent-directory dirlog. Note that, for fncachestore, only files mentioned in the fncache are considered, there's not check for files in .hg/store/meta that are not mentioned in the fncache. This is no different from the current situation for filelogs.
Sun, 07 Feb 2016 21:13:24 -0800 verify: check directory manifests
Martin von Zweigbergk <martinvonz@google.com> [Sun, 07 Feb 2016 21:13:24 -0800] rev 28203
verify: check directory manifests In repos with treemanifests, there is no specific verification of directory manifest revlogs. It simply collects all file nodes by reading each manifest delta. With treemanifests, that's means calling the manifest._slowreaddelta(). If there are missing revlog entries in a subdirectory revlog, 'hg verify' will simply report the exception that occurred while trying to read the root manifest: manifest@0: reading delta 1700e2e92882: meta/b/00manifest.i@67688a370455: no node This patch changes the verify code to load only the root manifest at first and verify all revisions of it, then verify all revisions of each direct subdirectory, and so on, recursively. The above message becomes b/@0: parent-directory manifest refers to unknown revision 67688a370455 Since the new algorithm reads a single revlog at a time and in order, 'hg verify' on a treemanifest version of the hg core repo goes from ~50s to ~14s. As expected, there is no significant difference on a repo with flat manifests.
Sat, 20 Feb 2016 17:44:29 -0800 hg: perform update after pulling during clone with share (issue5103)
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Feb 2016 17:44:29 -0800] rev 28202
hg: perform update after pulling during clone with share (issue5103) When pooled storage is enabled, `hg clone` will initialize a repo from a local repo using the store sharing mechanism then pull from the originally requested repo. Before this patch, the working directory update occurred between these steps. This meant that we would only update to revisions that were already present in the local pooled storage. This patch moves the update to after we pull from the originally requested repository so we may check out a revision that didn't yet exist locally. In other words, it makes the behavior like normal `hg clone`.
Sat, 20 Feb 2016 17:41:59 -0800 hg: extract post share update logic into own function
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Feb 2016 17:41:59 -0800] rev 28201
hg: extract post share update logic into own function A future patch will introduce a new caller that needs to perform an update. Extract the code so we don't duplicate it.
Sat, 20 Feb 2016 15:54:09 -0800 merge: perform background file closing in batchget
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Feb 2016 15:54:09 -0800] rev 28200
merge: perform background file closing in batchget As 2fdbf22a1b63 demonstrated with stream clones, closing files on background threads on Windows can yield a significant speedup because closing files that have been created/appended to is slow on Windows/NTFS. Working directory updates can write thousands of files. Therefore it is susceptible to excessive slowness on Windows due to slow file closes. This patch enables background file closing when performing working directory file writes. The impact when performing an `hg up tip` on mozilla-central (136,357 files) from an empty working directory is significant: Before: 535s (8:55) After: 133s (2:13) Delta: -402s (6:42) That's a 4x speedup! By comparison, that same machine can perform the same operation in ~15s on Linux. So Windows went from ~35x to ~9x slower. Not bad but there's still work to do. As a reminder, background file closing is only activated on Windows because it is only beneficial on that platform. So this patch shouldn't change non-Windows behavior at all. It's worth noting that non-Windows systems perform working directory updates with multiple processes. Unfortunately, worker.py doesn't yet support Windows. So, there is still plenty of room for making working directory updates faster on Windows. Even if multiple processes are used on Windows, I believe background file closing will still provide a benefit, as individual processes will still be slowed down by the file close bottleneck (assuming the I/O system isn't saturated).
Sat, 20 Feb 2016 15:27:11 -0800 merge: indent code in batchget()
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Feb 2016 15:27:11 -0800] rev 28199
merge: indent code in batchget() To make the next patch easier to read.
Sat, 20 Feb 2016 15:25:27 -0800 localrepo: support background closing for wwrite()
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Feb 2016 15:25:27 -0800] rev 28198
localrepo: support background closing for wwrite() So working copy update can pass it in.
Sat, 20 Feb 2016 15:24:12 -0800 scmutil: support background closing for write()
Gregory Szorc <gregory.szorc@gmail.com> [Sat, 20 Feb 2016 15:24:12 -0800] rev 28197
scmutil: support background closing for write() Upcoming patches will add background file closer support to working copy update. This patch adds some plumbing to prepare for that.
Tue, 16 Feb 2016 11:08:52 +0000 chg: hold a lock file before connected to server
Jun Wu <quark@fb.com> [Tue, 16 Feb 2016 11:08:52 +0000] rev 28196
chg: hold a lock file before connected to server This is a part of the one server per config series. In multiple-server setup, multiple clients may try to start different servers (on demand) at the same time. The old lock will not guarantee a client to connect to the server it just started, and is not crash friendly. This patch addressed above issues by using flock and does not release the lock until the client actually connects to the server or times out.
Mon, 22 Feb 2016 17:30:02 +0000 serve: allow --daemon-postexec to be 'unlink:path' or 'none'
Jun Wu <quark@fb.com> [Mon, 22 Feb 2016 17:30:02 +0000] rev 28195
serve: allow --daemon-postexec to be 'unlink:path' or 'none' This patch changes the format of value of --daemon-postexec. Now it can be either to unlink a file, or a no-op. The following patch will make chg to use the no-op option.
Mon, 22 Feb 2016 16:59:08 +0000 serve: rename --daemon-pipefds to --daemon-postexec (BC)
Jun Wu <quark@fb.com> [Mon, 22 Feb 2016 16:59:08 +0000] rev 28194
serve: rename --daemon-pipefds to --daemon-postexec (BC) Initially we use --daemon-pipefds to pass file descriptors for synchronization. Later, in order to support Windows, --daemon-pipefds is changed to accept a file path to unlink instead. The name is outdated since then. chg client is designed to use flock, which will be held before starting a server and until the client actually connects to the server it started. The unlink synchronization approach is not so helpful in this case. To address the issues, this patch renames pipefds to postexec and the following patch will allow the value of --daemon-postexec to be things like 'unlink:/path/to/file' or 'none'.
Mon, 22 Feb 2016 23:18:19 -0800 largefiles: don't explicitly list optional parameters that are not used
Tony Tung <tonytung@merly.org> [Mon, 22 Feb 2016 23:18:19 -0800] rev 28193
largefiles: don't explicitly list optional parameters that are not used This makes it easier for changes to the API.
Tue, 23 Feb 2016 11:41:47 +0100 revert: properly revert to ancestor of p2 during merge (issue5052) stable
Pierre-Yves David <pierre-yves.david@fb.com> [Tue, 23 Feb 2016 11:41:47 +0100] rev 28192
revert: properly revert to ancestor of p2 during merge (issue5052) During merge, added (from one perspective) file can be reported as "modified". To work around that, revert was testing if modified file were present in the parent manifest and marking them as "added" in this case. However, we should be checking against the target revision manifest instead. Otherwise see file as "newly added" even if they exist in the target revision. That revert behavior regressed in 06fbd9518bc5.
Mon, 01 Feb 2016 12:36:28 +0100 help: hg.intevation.de is new primary name of hg.intevation.de (and new cert) stable
Thomas Arendsen Hein <thomas@intevation.de> [Mon, 01 Feb 2016 12:36:28 +0100] rev 28191
help: hg.intevation.de is new primary name of hg.intevation.de (and new cert) Adjust the examples (prefix and hostfingerprints) in help/config.txt https://hg.intevation.de/ is now served with a new certificate that is signed by a commercial CA, so all nearly all browsers will accept it automatically. Listing both names, hg.intevation.de and hg.intevation.org, in the section [hostfingerprints] allows using both without configuring web.cacerts and without changing existing https URLs in the [paths] section.
Mon, 08 Feb 2016 14:07:17 +0100 rebase: explicitly test abort from ambiguous destination
Pierre-Yves David <pierre-yves.david@fb.com> [Mon, 08 Feb 2016 14:07:17 +0100] rev 28190
rebase: explicitly test abort from ambiguous destination We want to explicitly test the next behavior. We add this test in its own changeset to make the test change from the behavior change as clean as possible.
Sun, 14 Feb 2016 13:25:59 +0000 rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com> [Sun, 14 Feb 2016 13:25:59 +0000] rev 28189
rebase: choose default destination the same way as 'hg merge' (BC) This changeset finally make 'hg rebase' choose its default destination using the same logic as 'hg merge'. The previous default was "tipmost changeset on the current branch", the new default is "the other head if there is only one". This change has multiple consequences: - Multiple tests which were not rebasing anything (rebasing from tipmost head) are now rebasing on the other "lower" branch. This is the expected new behavior. - A test is now explicitly aborting when there is too many heads on the branch. This is the expected behavior. - We gained a better detection of the "nothing to rebase" case while performing 'hg pull --rebase' so the message have been updated. Making clearer than an update was performed and why. This is beneficial side-effect. - Rebasing from an active bookmark will behave the same as 'hg merge' from a bookmark.
Wed, 17 Feb 2016 20:31:34 +0000 rebase: add potential divergent commit hashes to error message (issue5086)
Kostia Balytskyi <ikostia@fb.com> [Wed, 17 Feb 2016 20:31:34 +0000] rev 28188
rebase: add potential divergent commit hashes to error message (issue5086)
(0) -10000 -3000 -1000 -300 -100 -60 +60 +100 +300 +1000 +3000 +10000 tip