Skip to content
Snippets Groups Projects
  1. Apr 04, 2018
    • Gregory Szorc's avatar
      tests: disallow using simple store repo with bundlerepo · 45a4799174a1
      Gregory Szorc authored
      bundlerepo is... going to be difficult to port to an alternate
      store because it assumes revlogs for storage and essentially
      overlays the contents of a bundle onto a fake revlog-like
      primitive. It will be a good test case for our eventual new
      storage interface.
      
      Refactoring bundlerepo to make it work with non-revlog storage is
      going to be a bit of work. So for now, let's refuse to use the
      simple store repo when a bundlerepo is in play.
      
      A new test requirement advertising support for treating bundle
      files as repo instances has been added. Some tests have been
      made conditional on this feature. Additional tests will be
      annotated in subsequent commits.
      
      Having positive opt-in to repo features will be simpler in the
      long run because it will allow multiple storage backends to
      declare feature support and we won't have to annotate each test
      with the set of repo backends that are supported. Again, we'll
      probably want better integration between repo features and
      tests. But this is the easiest we can do at the moment.
      
      Differential Revision: https://phab.mercurial-scm.org/D3060
      45a4799174a1
    • Gregory Szorc's avatar
      tests: disable test-revlog-v2 when using simple store · b09a25d74592
      Gregory Szorc authored
      Because the simple store has nothing to do with revlogs.
      
      Differential Revision: https://phab.mercurial-scm.org/D3056
      b09a25d74592
    • Gregory Szorc's avatar
      e1942c196f66
  2. Apr 03, 2018
  3. Apr 04, 2018
  4. Apr 03, 2018
  5. Apr 04, 2018
    • Gregory Szorc's avatar
      tests: conditionalize tests based on presence of revlogs for files · cbc4425e81b5
      Gregory Szorc authored
      ~85 tests don't like our non-revlog file store for various reasons.
      
      This commit introduces hghave functionality for declaring and querying
      repository features. By default, we assume repositories have
      revlog-based file storage. But if the HGREPOFEATURES environment
      variable is set, we can override the default set of repository
      features. If you run the test harness with our simplestorerepo
      extension and an environment variable set to the proper value, you
      can override the hghave defaults to agree with simplestorerepo's
      version of reality.
      
      Various tests have been modified so behavior dependent on revlog-based
      file storage is marked as such.
      
      This fixes a handful of test failures with our custom file storage
      extension. But dozens remain. The point of this commit is to demonstrate
      how tests will need to be modified to account for custom storage
      implementations.
      
      TBH, I'm not convinced hghave is the proper layer for repository
      feature detection. I /think/ we'll eventually want something in
      run-tests.py itself. But that would require inventing a new primitive
      in the test harness. This is all very alpha at the moment. So I think
      hghave is an acceptable place to hang this feature detection. I think
      the right time to be thinking about integrating this into run-tests.py
      is *after* we have a stable alternate storage implementation in core.
      For now, let's try to make progress towards the idea of an alternate
      storage backend.
      
      Differential Revision: https://phab.mercurial-scm.org/D3030
      cbc4425e81b5
    • Gregory Szorc's avatar
      tests: add test extension implementing custom filelog storage · d257c5f2a940
      Gregory Szorc authored
      In order to better support partial clones, we'll need alternate
      repository storage mechanisms that aren't based on revlogs.
      
      Today, the interface for repository storage isn't very well defined.
      And there are various layering violations and assumptions made
      throughout the code that storage is backed by revlogs.
      
      In order to support alternate storage mechanisms, we'll need to
      formally declare and adhere to interfaces for storage. This will
      be a long, arduous process.
      
      This commit creates an extension that implements non-revlog storage
      for files. It defines a custom type that quacks like the existing
      revlog/filelog API but isn't backed by a revlog. The backing storage
      is - for simplicity reasons - a CBOR index and per-node files
      representing fulltext data.
      
      The localrepository class is modified so file(f) returns instances of
      this class instead of filelog instances.
      
      The purpose of this extension is to tease out what the actual filelog
      interface is - based on running the test harness - so we can formalize
      that interface and then implement a *real* alternate storage backend.
      
      Using `run-tests.py --extra-config-opt` to run the test harness
      with this extension enabled yields 83 failures out of 634 ran
      tests.
      
      The most common test failures are due to:
      
      * Issues with `hg verify`
      * LFS and largefiles (probably flags processing related)
      * Narrow.
      * Any test touching or inspecting individual filelog paths.
      * help and error output that is confused by the presence of an
        extension.
      * `hg debug*` commands doing low-level, revlog-y things.
      
      An 88% pass rate is pretty good for an initial implementation if you
      ask me!
      
      There is a bit of duplicate code in the new extension. That's by
      design: a point of this code is to tease out dependencies on revlog.
      That being said, there is opportunity to consolidate code by moving
      things out of the revlog API. For example, DAG traversal operations
      don't necessarily need to be implemented at the storage level. (Although
      for performance reasons they probably do.) Once we have a more
      well-defined interface, we could probably define the default
      implementations in terms of the base interface, pull those in via
      class inheritance, and have implementations override with faster
      versions if they so choose. (Or something like that.) But for now,
      the duplicate code should be acceptable.
      
      Differential Revision: https://phab.mercurial-scm.org/D3029
      d257c5f2a940
  6. Apr 03, 2018
    • Gregory Szorc's avatar
      tests: use `hg unbundle` instead of `hg pull` in some tests · 5d10f41ddcc4
      Gregory Szorc authored
      `hg pull <bundle>` uses the special "bundlerepo" repository. The
      bundlerepo code makes many assumptions about the storage of
      repositories. It will be difficult to teach bundlerepo to use
      non-revlog storage before a better storage interface is established.
      
      Many test failures using our "simple store" are related to
      bundlerepo: the simple store just isn't compatible with bundlerepo
      because of storage assumptions in bundlerepo.
      
      In order to mitigate the impact of bundlerepo on our code base,
      this commit changes various tests to use `hg unbundle` instead
      of `hg pull`. This bypasses the bundlerepo code.
      
      Tests exercising exchange functionality have not been altered, as
      they should be using `hg pull` and going through the bundlerepo
      code paths.
      
      Differential Revision: https://phab.mercurial-scm.org/D3059
      5d10f41ddcc4
  7. Apr 04, 2018
  8. Apr 03, 2018
  9. Apr 04, 2018
  10. Mar 17, 2018
  11. Mar 19, 2018
  12. Mar 17, 2018
    • Yuya Nishihara's avatar
      templater: abstract away from joinfmt · ebf139cbd4a1
      Yuya Nishihara authored
      Future patches will add a wrapper for a list of template mappings, which
      will implement a custom join() something like {join(mappings % template)}.
      
      The original join() function is broken down as follows:
      
        if hasattr(joinset, 'joinfmt'):
            # hybrid.join() where values must be a list or a dict
            joinitems((joinfmt(x) for x in values), sep)
        elif isinstance(joinset, templateutil.wrapped):
            # mappable.join()
            show()
        else:
            # a plain list, a generator, or a byte string; joinfmt was identity()
            joinset = templateutil.unwrapvalue(context, joinset)
            joinitems(pycompat.maybebytestr(joinset), joiner)
      ebf139cbd4a1
  13. Mar 20, 2018
  14. Mar 17, 2018
  15. Mar 18, 2018
  16. Mar 17, 2018
  17. Apr 04, 2018
  18. Mar 31, 2018
    • Gregory Szorc's avatar
      peer: make ui an attribute · e826fe7a08c7
      Gregory Szorc authored
      With abc interfaces, instance attributes could not satisfy
      @abc.abstractproperty requirements because interface conformance
      was tested at type creation time. When we created the abc
      peer interfaces, we had to make "ui" a @property to satisfy
      abc.
      
      Now that peer interfaces are using zope.interface and there is no
      import time validation (but there are tests validating instances
      conform to the interface), we can go back to using regular object
      attributes.
      
      Differential Revision: https://phab.mercurial-scm.org/D3069
      e826fe7a08c7
    • Gregory Szorc's avatar
      repository: port peer interfaces to zope.interface · 39f7d4ee8bcd
      Gregory Szorc authored
      zope.interface is superior. Let's switch to it.
      
      Unlike abc, which defines interfaces through a base class,
      zope.interface uses different types for interfaces and for
      implementations. So, we had to invent some new types to hold the
      interfaces in order to separate the interface from its default
      implementation.
      
      The names here could probably be better. I've been wanting to
      overhaul the peer interface for a while. And wire protocol version
      2 will force that work. So anticipate a refactoring of these
      interfaces in later commits.
      
      With this commit, we no longer test abc interfaces in
      test-check-interfaces.py, so code for that has been removed.
      
      Differential Revision: https://phab.mercurial-scm.org/D3068
      
      # no-check-commit because of stream_out()
      39f7d4ee8bcd
  19. Mar 30, 2018
  20. Apr 02, 2018
  21. Mar 19, 2018
  22. Apr 03, 2018
  23. Apr 02, 2018
  24. Apr 03, 2018
    • Martin von Zweigbergk's avatar
      push: avoid using repo.lookup() for converting to nodeid · 4d69668a65d8
      Martin von Zweigbergk authored
      repo.lookup(x) currently simply does repo[x].node(), which supports
      various types of inputs. As I explained in 0194dac77c93 (scmutil: add
      method for looking up a context given a revision symbol, 2018-04-02),
      I'd like to split that up so we use the new scmutil.revsymbol() for
      string inputs repo[x] for integer revnums and binary nodeids. Since
      repo.lookup() seems to exist in order to serve peer.lookup(), I think
      it should be calling revsymbol. However, we have several callers that
      use repo.lookup() with something that's not a string, so we need to
      remove those first. This patch starts doing that. Many more will
      follow.
      
      Differential Revision: https://phab.mercurial-scm.org/D3047
      4d69668a65d8
Loading