( )⚙ D4354 cmdutil: return a revlog from openrevlog() and split function

This is an archive of the discontinued Mercurial Phabricator instance.

cmdutil: return a revlog from openrevlog() and split function
ClosedPublic

Authored by indygreg on Aug 22 2018, 4:58 PM.

Details

Summary

The filelog class is a wrapper around a revlog instance. I have plans
to give manifests and the changelog a similar treatment.

When filelog was ported away from revlog and when I started writing
patches to do the same for manifests, I noticed that a lot of
debug* and perf* commands were relying on low-level revlog APIs
like start(), end(), deltaparent(), etc. For filelog, I added these
to the interface, even though I didn't want to because they don't
belong on a generic storage interface.

For manifest (and eventually changelog), the pain is too much to bear.
We need to cut the tight coupling.

These debug* and perf* commands use cmdutil.openrevlog() to obtain
a revlog instance.

This commit effectively renames openrevlog() to openstorage(), adds
an argument to ensure a revlog instance is returned, and introduces a
replacement openrevlog() that calls openstorage() such that a revlog
instance is returned.

By doing things this way, we allow the debug* and perf* commands to
still work on revlog-based repositories without having to expose
low-level revlog APIs in the storage interfaces.

The practical side-effect of this on the current code base is we return
a revlog instance instead of a filelog. The manifest and changelog are
not affected at this time.

Some of filelog's storage APIs are different from revlog. For example,
read() strips the optional header containing copy/rename metadata. This
may impact some perf* commands. But I don't think the impact is
worth worrying about.

Upcoming commits will port existing consumers to openstorage(), where
appropriate.

This commit does cause some test regressions when using the simple
store. These will be fixed as commands are ported to use storage APIs.

.. api:: cmdutil.openrevlog() now returns a revlog instance or aborts

Previously, it would return a storage object, which may not be a
revlog instance.

Use the new cmdutil.openstorage() API to return an object conforming
to the storage interface of the thing you are accessing if you don't
need a revlog instance.

Diff Detail

Repository
rHG Mercurial
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

indygreg created this revision.Aug 22 2018, 4:58 PM
This revision was automatically updated to reflect the committed changes.