Skip to content
Snippets Groups Projects
  1. May 01, 2018
  2. Apr 30, 2018
    • Gregory Szorc's avatar
      httppeer: detect redirect to URL without query string (issue5860) · 6169d95d
      Gregory Szorc authored
      197d10e157ce subtly changed the HTTP peer's handling of HTTP redirects.
      
      Before that changeset, we instantiated an HTTP peer instance and
      performed the capabilities lookup with that instance. The old code had
      the following relevant properties:
      
      1) The HTTP request layer would automatically follow HTTP redirects.
      2) An encountered HTTP redirect would update a peer instance variable
         pointing to the repo URL.
      3) The peer would automagically perform a "capabilities" command
         request if a caller requested capabilities but capabilities were
         not yet defined.
      
      The first HTTP request issued by a peer is for ?cmd=capabilities. If
      the server responds with an HTTP redirect to a ?cmd=capabilities URL,
      the HTTP request layer automatically followed it, retrieved a valid
      capabilities response, and the peer's base URL was updated
      automatically so subsequent requests used the proper URL. In other
      words, things "just worked."
      
      In the case where the server redirected to a URL without the
      ?cmd=capabilities query string, the HTTP request layer would follow
      the redirect and likely encounter HTML. The peer's base URL would be
      updated and the unexpected Content-Type would raise a RepoError. We
      would catch RepoError and immediately call between() (testing the case
      for pre 0.9.1 servers not supporting the "capabilities" command). e.g.
      
          try:
              inst._fetchcaps()
          except error.RepoError:
              inst.between([(nullid, nullid)])
      
      between() would eventually call into _callstream(). And _callstream()
      made a call to self.capable('httpheader'). capable() would call
      self.capabilities(), which would see that no capabilities were set
      (because HTML was returned for that request) and call the "capabilities"
      command to fetch capabilities. Because the base URL had been updated
      from the redirect, this 2nd "capabilities" command would succeed and
      the client would immediately call "between," which would also succeed.
      The legacy handshake succeeded. Only because "capabilities" was
      successfully executed as a side effect did the peer recognize that it
      was talking to a modern server. In other words, this all appeared to
      work accidentally.
      
      After 197d10e157ce, we stopped calling the "capabilities" command on
      the peer instance. Instead, we made the request via a low-level opener,
      detected the redirect as part of response handling code, and passed the
      redirected URL into the constructed peer instance.
      
      For cases where the redirected URL included the query string, this
      "just worked." But for cases where the redirected URL stripped the query
      string, we threw RepoError and because we removed the "between" handshake
      fallback, we fell through to the "is a static HTTP repo" check and
      performed an HTTP request for .hg/requires.
      
      While 197d10e157ce was marked as backwards incompatible, the only
      intended backwards incompatible behavior was not performing the
      "between" fallback. It was not realized that the "between" command
      had the side-effect of recovering from an errant redirect that
      dropped the query string.
      
      This commit restores the previous behavior and allows clients to
      handle a redirect that drops the query string. In the case where
      the request is redirected and the query string is dropped, we raise
      a special case of RepoError. We then catch this special exception in
      the handshake code and perform another "capabilities" request against
      the redirected URL. If that works, all is well. Otherwise, we fall back
      to the "is a static HTTP repo" check.
      
      The new code is arguably better than before 197d10e157ce, as it is
      explicit about the expected behavior and we avoid performing a
      "between" request, saving a server round trip.
      
      Differential Revision: https://phab.mercurial-scm.org/D3433
      6169d95d
  3. May 03, 2018
  4. May 01, 2018
  5. Apr 26, 2018
  6. Apr 25, 2018
  7. Apr 24, 2018
    • Gregory Szorc's avatar
      hgweb: reuse body file object when hgwebdir calls hgweb (issue5851) · 877185de
      Gregory Szorc authored
      An unintended side-effect of f0a851542a05 was that the request body
      file object (which uses a util.cappedreader) was constructed twice
      when hgwebdir called into hgweb. Since we attempt to read all remaining
      data from this file object when Content-Length is defined and since there
      were two instances of this object and the client supplied no additional
      data to read, this resulted in deadlock.
      
      The fix implemented in this commit is to reuse the request body file
      object when it is passed from hgwebdir to hgweb.
      
      A test demonstrating `hg clone` and `hg push` via hgwebdir has been
      added. Without this patch, the test hangs when doing `hg clone`.
      Surprisingly, this must mean that we have effectively no test coverage
      of the wire protocol when run via hgwebdir.
      
      Differential Revision: https://phab.mercurial-scm.org/D3427
      877185de
    • Pulkit Goyal's avatar
      remotenames: mark the extension as EXPERIMENTAL · 678ab0de
      Pulkit Goyal authored
      I still don't feel confident about locking the behavior of all the things in
      the remotenames extension. Moreover the extension was introduced in this cycle
      only. Let's mark this extension EXPERIMENTAL for now so that we can change
      things especially the storage layer if required in next cycle.
      
      I will like to use cbor at storage layer too.
      
      Differential Revision: https://phab.mercurial-scm.org/D3426
      678ab0de
  8. Apr 25, 2018
  9. Apr 24, 2018
  10. Apr 23, 2018
    • Boris Feld's avatar
      sshpeer: reflect actual command activity one handshake · 58bbd14b
      Boris Feld authored
      The output from devel-peer-request is expected to give data about request and
      roundtrip done to the server. Changeset a9cffd14aa04 changed some of that by
      grouping hello and between commands call. However, the old sequence of command
      was "emulated" in sshpeer.
      
      Update the sshpeer to reflect this grouping of commands and update the tests
      that use it.
      58bbd14b
  11. Apr 24, 2018
  12. Apr 22, 2018
    • Gregory Szorc's avatar
      interfaceutil: module to stub out zope.interface · 856f381a
      Gregory Szorc authored
      The startup time of `hg` increased during the 4.6 development cycle. A
      cause of that was importing more modules and doing more work at module
      import time.
      
      The import of zope.interface and the declaring of various interfaces
      is partially responsible for the startup time regression.
      
      Our current usage of zope.interface doesn't do much at run time: we are
      merely declaring interfaces and stating that certain types implement
      various interfaces. Core Mercurial is not (yet) using of any of
      zope.interface features that actually require that interface plumbing be
      defined. The only place we actually need the interface metadata is in
      test-check-interfaces.py.
      
      This commit establishes a new interfaceutil module. It exposes the subset
      of the zope.interface API that we currently use. By default, the APIs
      no-op. But if an environment variable is set, we export the real
      zope.interface APIs.
      
      Existing importers of zope.interface have been converted to use the new
      module. test-check-interfaces.py has been updated to define the
      environment variable so the real zope.interface is used.
      
      The net effect of this change is we stop importing 9 zope.interface.*
      modules and we no longer perform interface bookkeeping when registering
      interfaces.
      
      On my i7-6700K on Linux, a shell loop that runs `hg log -r .` 300 times
      on a repo with 1 commit shows a significant CPU time improvement
      (average of 4 runs):
      
      4.5:    14.814s
      before: 19.028s
      after:  16.945s
      
      And with `run-tests.py -j10` (single run):
      
      4.5:    ~3100s (~51.7m)
      before: ~4450s (~74.2m)
      after:  ~3980s (~66.3m)
      
      So this claws back about half of the regressions in 4.6.
      
      Differential Revision: https://phab.mercurial-scm.org/D3419
      856f381a
  13. Apr 23, 2018
  14. Apr 20, 2018
  15. Apr 19, 2018
    • Yuya Nishihara's avatar
      test-fix: fix use of 'f --newer' to check that foo.whole is not updated · 8fa3396a
      Yuya Nishihara authored
      Here we want to assert not 'mtime(foo.whole.orig) < mtime(foo.whole)'.
      The condition has to be inverted since 'f --newer' says "newer" if the
      mtimes match.
      
      Alternatively, we could insert 'sleep 2' before 'cp' to ensure that
      foo.whole.orig is newer than foo.whole, but a fewer sleeps should be
      better.
      8fa3396a
  16. Mar 31, 2018
  17. Apr 18, 2018
  18. Mar 04, 2018
    • Augie Fackler's avatar
      rebase: introduce support for automatically rebasing orphan changes · 92213f67
      Augie Fackler authored
      _destautorebase(SRC) is based on the _destrestack(SRC) revset from
      fbamend. The supporting _possibledestination function is extracted
      from evolve, with minor cleanups.
      
      We've considered some alternatives here:
       * This change, but with --auto as the flag name. We're hedging our bets
         on this a little in this change so that if this ends up being the wrong
         direction we haven't burned the valauble --auto name on rebase.
       * --destination auto: I've got reservations about the discoverability of this,
         and we don't currently have a good story for a revset alias of sorts that
         changes behavior depending on the context in which it's used.
       * A "rebase presets" feature, where we could use the currently-an-error
         positional argument space for the rebase command to define presets, so that
         users could define a 'linearize' preset that specifies
         --revision='orphan()-obsolete()' and --dest=_destautoorphanrebase(SRC).
      
      Personally, I find the third option somewhat appealing, but am
      hesitant to "spend" the functionality space of positional arguments to
      the rebase command. We should revisit the way we expose this
      functionality sometime in the 4.7 cycle once we've had a chance to vet
      the implementation of the functionality.
      
      Differential Revision: https://phab.mercurial-scm.org/D2668
      92213f67
  19. Apr 17, 2018
  20. Apr 18, 2018
  21. Apr 17, 2018
  22. Apr 13, 2018
    • Yuya Nishihara's avatar
      log: fix crash on empty revision with --copies switch · 141017c7
      Yuya Nishihara authored
      If a revset is empty, .max() raises ValueError.
      
      I don't see any reason to recompute the revs, so I made it reuse the one
      returned by logcmdutil.getrevs(). If no revs specified by command line,
      the endrev will be smartset.spanset(repo) + 1, which is basically the same
      as len(repo), the default of getrenamedfn(). If --follow specified,
      revs.max() points to the working parent, which seems more correct.
      141017c7
    • Yuya Nishihara's avatar
      logcmdutil: rewrite jsonchangeset printer to be backed by jsonformatter · 814151cd
      Yuya Nishihara authored
      This is a bit slower than the original implementation, but I don't think
      that would actually matter. It's still faster than full templating.
      
        $ hg log -Tjson -r0:5000 --time > /dev/null
        (orig) time: real 1.550 secs (user 1.500+0.000 sys 0.040+0.000)
        (new)  time: real 1.810 secs (user 1.740+0.000 sys 0.070+0.000)
      
        cf.
        $ hg log -Tdefault -r0:5000 --time > /dev/null
        time: real 4.980 secs (user 4.850+0.000 sys 0.130+0.000)
        $ hg log -r0:5000 --time > /dev/null
        time: real 2.340 secs (user 2.220+0.000 sys 0.100+0.000)
        $ hg log -r0:5000 -q --time > /dev/null
        time: real 0.750 secs (user 0.670+0.000 sys 0.070+0.000)
      
      The test output changes because keys are sorted alphabetically.
      814151cd
    • Yuya Nishihara's avatar
      formatter: convert timestamp to int · 31750413
      Yuya Nishihara authored
      Spotted while porting jsonchangeset printer to formatter. A timestamp may be
      float type, but its meaningful part is just int.
      31750413
  23. Apr 17, 2018
  24. Apr 06, 2018
  25. Apr 15, 2018
    • Matt Harbison's avatar
      lfs: enable the final download count status message · ab04972a
      Matt Harbison authored
      At this point, I think all of the core commands are prefetching, except grep and
      verify.  Verify will need some special handling, in case the revlogs are
      corrupt.
      
      Grep has an issue that still needs to be debugged, but we probably need to give
      the behavior some thought too- it would be a shame to have to download
      everything in order to search.  I think the benefit of having this info for all
      commands outweighs extra printing in a command that is arguably not well
      behaved in this context anyway.
      ab04972a
    • Matt Harbison's avatar
      diff: invoke the file prefetch hook · 5e67c209
      Matt Harbison authored
      By invoking it this deep within the command, we pick up both subrepo and hgweb
      support, as well as --patch support for commands that implement logopts.
      5e67c209
  26. Apr 14, 2018
    • Matt Harbison's avatar
      export: invoke the file prefetch hook · b54404d6
      Matt Harbison authored
      cmdutil.exportfile() is only called by shelve, mq and patchbomb.  Those are
      unlikely to mix with lfs, but it may as well be invoked there for completeness.
      b54404d6
    • Matt Harbison's avatar
      scmutil: teach the file prefetch hook to handle multiple commits · 7269b87f
      Matt Harbison authored
      The remainder of the commands that need prefetch deal with multiple revisions.
      I initially coded this as a separate hook, but then it needed a list of files
      to handle `diff` and `grep`, so it didn't seem worth keeping them separate.
      
      Not every matcher will emit bad file messages (some are built from a list of
      files that are known to exist).  But it seems better to filter this in one place
      than to push this on either each caller or each hook implementation.
      7269b87f
  27. Apr 17, 2018
Loading