Yuya Nishihara <yuya@tcha.org> [Sun, 08 Apr 2018 15:03:00 +0900] rev 37468
py3: use system string to access email headers
Yuya Nishihara <yuya@tcha.org> [Sun, 08 Apr 2018 14:59:12 +0900] rev 37467
py3: fix string issues of email message in test-import.t
- payload can be bytes
- headers must be unicode on Python 3
- need to call msg.as_bytes() on Python 3, but msg.as_string() on Python 2,
where bytes(msg) magic works
Yuya Nishihara <yuya@tcha.org> [Sun, 08 Apr 2018 14:46:24 +0900] rev 37466
py3: use lower-cased module 'email.message' in test-import.t
Yuya Nishihara <yuya@tcha.org> [Sun, 08 Apr 2018 15:41:40 +0900] rev 37465
py3: drop b'' from error message of fancyopts
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 21:26:37 +0900] rev 37464
procutil: drop unused 'newlines' option from popen*() (API)
It's unlikely for us to use the universal_newlines option.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 21:23:42 +0900] rev 37463
procutil: make explainexit() simply return a message (API)
Almost all callers want it.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 21:21:03 +0900] rev 37462
procutil: do not convert return code of signal exit to positive number (API)
The docstring states that "codes from kill are negative", and it doesn't
make sense to make exit/signal code ambiguous.
.. api::
``hook.hook()`` and ``hook.runhooks()`` may return a negative integer
to denote that the process was killed by signal.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 21:17:50 +0900] rev 37461
procutil: fix error message of tempfile filter
First, we need to use procutil.system() to get an exit code compatible with
explainexit(). Second, explainexit() returns (msg, code) tuple.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 21:14:16 +0900] rev 37460
procutil: unify platform.explainexit()
Since 4368f582c806 "use subprocess instead of os.system", posix.explainexit()
is the superset of Windows implementation.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 21:09:21 +0900] rev 37459
procutil: rewrite popen() as a subprocess.Popen wrapper (issue4746) (API)
os.popen() of Python 3 is not the popen() we want. First, it doesn't accept
command in bytes. Second, a returned stream is always wrapped by TextIO.
So we have to reimplement our popen(). Fortunately, this fixes the bug 4746
since ours returns an exit code compatible with explainexit().
.. api::
``procutil.popen()`` no longer supports text mode I/O.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 20:50:38 +0900] rev 37458
procutil: always popen() in binary mode
On Python 3, non-binary stream is useless. Let's convert line ending by
ourselves.
Note that we don't need fromnativeeol() in patch._externalpatch() since
any whitespace characters are rstrip()-ed.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 13:46:32 +0900] rev 37457
py3: byte-stringify test-import.t
Still the test doesn't pass.
# skip-blame because just adding some b''
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 13:42:37 +0900] rev 37456
py3: convert parsed message items to bytes in patch.extract()
Appears that BytesParser() parses bytes into unicode, sigh.
Yuya Nishihara <yuya@tcha.org> [Sat, 07 Apr 2018 13:21:59 +0900] rev 37455
py3: silence warning about deprecation of imp module
Well, we could fix that, but we aren't yet to reach the state caring about
deprecation on the Python 3 line. So let's silence it for now to fix tons
of "minor" Py2/3 incompatibilities by relying on our test suite.
Martin von Zweigbergk <martinvonz@google.com> [Sat, 07 Apr 2018 00:00:33 -0700] rev 37454
tests: add another full hex node in plain text
Should have been part of D3168.
Differential Revision: https://phab.mercurial-scm.org/D3186
Martin von Zweigbergk <martinvonz@google.com> [Thu, 05 Apr 2018 16:50:19 -0700] rev 37453
infinitepush: look up bookmarks only among bookmarks
Differential Revision: https://phab.mercurial-scm.org/D3165
Martin von Zweigbergk <martinvonz@google.com> [Fri, 06 Apr 2018 10:48:11 -0700] rev 37452
destutil: look up bookmarks only among bookmarks
Differential Revision: https://phab.mercurial-scm.org/D3164
Martin von Zweigbergk <martinvonz@google.com> [Fri, 06 Apr 2018 10:49:43 -0700] rev 37451
discovery: look up bookmarks only among bookmarks
Differential Revision: https://phab.mercurial-scm.org/D3163
Martin von Zweigbergk <martinvonz@google.com> [Fri, 06 Apr 2018 11:29:30 -0700] rev 37450
bookmarks: introduce a repo._bookmarks.changectx(mark) method and use it
Many places were doing repo[mark], which usually works, but it's
slightly incorrect: if the bookmark has a name that matches a full hex
nodeid of another node, then the context for the other node will be
returned instead. Also, I'm about to remove support for
repo[<namespace thing>] :)
Differential Revision: https://phab.mercurial-scm.org/D3162
Yuya Nishihara <yuya@tcha.org> [Sun, 25 Mar 2018 18:34:07 +0900] rev 37449
revlog: detect pseudo file nodeids to raise WdirUnsupported exception
Again, I'm not sure if this is the right thing, but adding a few more pseudo
hashes wouldn't be any worse than the current state.
Differential Revision: https://phab.mercurial-scm.org/D2942
Yuya Nishihara <yuya@tcha.org> [Sun, 25 Mar 2018 18:31:22 +0900] rev 37448
node: rename wdirnodes to clarify they are for manifest/filelogs
Differential Revision: https://phab.mercurial-scm.org/D2941
Yuya Nishihara <yuya@tcha.org> [Sun, 25 Mar 2018 18:27:43 +0900] rev 37447
workingctx: build _manifest on filenode() or flags() request
I'm not sure if this is the best workaround, but this fixes the following
exception:
AttributeError: 'workingctx' object has no attribute '_manifestdelta'
The short hash '303030303030' seen in the test is node.modifiednodeid.
Differential Revision: https://phab.mercurial-scm.org/D2940
Martin von Zweigbergk <martinvonz@google.com> [Fri, 06 Apr 2018 13:11:40 -0700] rev 37446
tests: enter full hex hash in plain text in bundle part
We were looking it up be prefix by repo.__getitem__, which I'm about
to drop support for. It's easiest to just include the full hash in
plain text.
Differential Revision: https://phab.mercurial-scm.org/D3168
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 17:44:18 -0700] rev 37445
tests: call rawsize() directly
rawsize() is not reimplemented outside of revlog. I'm not sure why
this code was insisting it call a specific implementation. Changing
it to call rawsize() on the repo.file(f) result seems to work just
fine.
Differential Revision: https://phab.mercurial-scm.org/D3153
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 17:40:51 -0700] rev 37444
upgrade: sniff for filelog type
The upgrade code should never encounter a vanilla revlog
instance: only changelog, manifestrevlog, and filelog should
be seen.
The previous code assumed !changelog & !manifestrevlog meant
file data. So this change feels pretty safe. If nothing else, it
will help tease out typing issues.
Differential Revision: https://phab.mercurial-scm.org/D3152
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 16:31:45 -0700] rev 37443
revlog: move censor logic into main revlog class
Previously, the revlog class implemented dummy methods for
various censor-related functionality. Revision censoring was
(and will continue to be) only possible on filelog instances.
So filelog implemented these methods to perform something
reasonable.
A problem with implementing censoring on filelog is that
it assumes filelog is a revlog. Upcoming work to formalize
the filelog interface will make this not true.
Furthermore, the censoring logic is security-sensitive. I
think action-at-a-distance with custom implementation of core
revlog APIs in derived classes is a bit dangerous. I think at
a minimum the censor logic should live in revlog.py.
I was tempted to created a "censored revlog" class that
basically pulled these methods out of filelog. But, I wasn't
a huge fan of overriding core methods in child classes. A
reason to do that would be performance. However, the censoring
code only comes into play when:
* hash verification fails
* delta generation
* applying deltas from changegroups
The new code is conditional on an instance attribute. So the
overhead for running the censored code when the revlog isn't
censorable is an attribute lookup. All of these operations are
at least a magnitude slower than a Python attribute lookup. So
there shouldn't be a performance concern.
Differential Revision: https://phab.mercurial-scm.org/D3151
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 18:22:35 -0700] rev 37442
revlog: move parsemeta() and packmeta() from filelog (API)
filelog.parsemeta() and filelog.packmeta() are used to decode
and encode metadata for file copies and censor.
An upcoming commit will move the core logic for censoring revlogs
into revlog.py. This would create a cycle between revlog.py and
filelog.py. So we move these metadata functions to revlog.py.
.. api::
filelog.parsemeta() and filelog.packmeta() have been moved to
the revlog module.
Differential Revision: https://phab.mercurial-scm.org/D3150
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 15:18:23 -0700] rev 37441
filelog: declare that filelog implements a storage interface
Now that we have a declared interface, let's declare that filelog
implements it.
Tests have been added that confirm the object conforms to the
interface.
The existing interface checks verify there are no extra public
attributes outside the declared interface. filelog has several
extra attributes. So we added a mechanism to suppress this check.
The goal is to modify the filelog class so we can drop this check.
Differential Revision: https://phab.mercurial-scm.org/D3149
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 15:09:41 -0700] rev 37440
repository: define existing interface for file storage
Now that we have mostly successfully implemented an alternate
storage backend for files data, let's start to define the
interface for it!
This commit takes the mostly-working interface as defined by the
simple store repo and codifies it as the file storage interface.
The interface has been split into its logical components:
* index metadata
* fulltext data
* mutation
* everything else
I don't consider the existing interface to be great. But it will
help to have it more formally defined so we can start chipping away
at refactoring it.
Differential Revision: https://phab.mercurial-scm.org/D3148
Gregory Szorc <gregory.szorc@gmail.com> [Thu, 05 Apr 2018 11:16:54 -0700] rev 37439
tests: run some largefiles and lfs tests with simple store
Now that the simple store handles flags properly, a handful of
the largefiles and lfs tests pass!
Differential Revision: https://phab.mercurial-scm.org/D3147