Skip to content
Snippets Groups Projects
  1. Jan 17, 2018
    • Boris Feld's avatar
      streamclone: add support for bundle2 based stream clone · 7eedbd5d4880
      Boris Feld authored
      The feature put to use the various bits introduced previously. If the server
      supports it, the client will request its stream clone through bundle2 instead of
      the legacy 'stream_out' commands. The bundle2 version use the better 'v2'
      version of stream bundles.
      
      The 'v2' format is not finalized yet. Now that there are some code running it,
      we can start working on it again.
      
      Performance numbers are available at the end of this series.
      7eedbd5d4880
    • Boris Feld's avatar
      pull: preindent some code · 40df727b6f4f
      Boris Feld authored
      Next changesets will add support for using stream cloning with bundle2. We
      introduce indentation change first for clarity.
      40df727b6f4f
    • Boris Feld's avatar
      pull: reorganize bundle2 argument bundling · 1908d360f977
      Boris Feld authored
      We are about to add the ability to use stream bundle with bundle2. Before doing
      so, we need to gather some code that will not be used in the bundle2 case. There
      is no behavior change within this changeset.
      1908d360f977
    • Boris Feld's avatar
      clone: allow bundle2's stream clone with 'server.disablefullbundle' · 133a678673cb
      Boris Feld authored
      The previous check was a bit too strict and would not recognize a get bundle
      not requesting changegroup.
      133a678673cb
    • Boris Feld's avatar
      bundle2: add support for a 'stream' parameter to 'getbundle' · c24dad55ac19
      Boris Feld authored
      This parameter can be used to request a stream bundle.
      c24dad55ac19
    • Boris Feld's avatar
      bundle2: add a 'stream' part handler for stream cloning · b996ddf5963d
      Boris Feld authored
      The part contains the necessary arguments and payload to handle a stream bundle
      v2. It will be put to use in later changesets.
      b996ddf5963d
    • Boris Feld's avatar
      streamclone: rework canperformstreamclone · bbf7abd09ff0
      Boris Feld authored
      There is code about bundle2 laying around in `canperformstreamclone` but not
      put to any uses. As we discovered with the previous patch, streambundle 'v1'
      won't work on bundle2 because they are readline based. So we jump to 'v2' as
      the first expected supported version.
      bbf7abd09ff0
    • Boris Feld's avatar
      streamclone: define first iteration of version 2 of stream format · cfdccd560b66
      Boris Feld authored
      (This patch is based on a first draft from Gregory Szorc, with deeper rework)
      
      Version 1 of the stream clone format was invented many years ago and suffers
      from a few deficiencies:
      
      1) Filenames are stored in store-encoded (on filesystem) form rather than in
         their internal form. This makes future compatibility with new store
         filename encodings more difficult.
      2) File entry "headers" consist of a newline of the file name followed by the
         string file size. Converting strings to integers is avoidable overhead. We
         can't store filenames with newlines (manifests have this limitation as
         well, so it isn't a major concern). But the big concern here is the
         necessity for readline(). Scanning for newlines means reading ahead and
         that means extra buffer allocations and slicing (in Python) and this makes
         performance suffer.
      3) Filenames aren't compressed optimally. Filenames should be compressed well
         since there is a lot of repeated data. However, since they are scattered
         all over the stream (with revlog data in between), they typically fall
         outside the window size of the compressor and don't compress.
      4) It can only exchange stored based content, being able to exchange caches
         too would be nice.
      5) It is limited to a stream-based protocol and isn't suitable for an on-disk
         format for general repository reading because the offset of individual file
         entries requires scanning the entire file to find file records.
      
      As part of enabling streaming clones to work in bundle2, #2 proved to have a
      significant negative impact on performance. Since bundle2 provides the
      opportunity to start fresh, Gregory Szorc figured he would take the
      opportunity to invent a new streaming clone data format.
      
      The new format devised in this series addresses #1, #2, and #4. It punts on #3
      because it was complex without yielding a significant gain and on #5 because
      devising a new store format that "packs" multiple revlogs into a single
      "packed revlog" is massive scope bloat. However, this v2 format might be
      suitable for streaming into a "packed revlog" with minimal processing. If it
      works, great. If not, we can always invent stream format when it is needed.
      
      This patch only introduces the bases of the format. We'll get it usable through
      bundle2 first, then we'll extend the format in future patches to bring it to its
      full potential (especially #4).
      cfdccd560b66
  2. Jan 19, 2018
  3. Jan 20, 2018
  4. Jan 19, 2018
  5. Jan 12, 2018
    • Jörg Sonnenberger's avatar
      wireproto: split streamres into legacy and modern case · a39a9df7ecca
      Jörg Sonnenberger authored
      A couple of commands currently require transmission of uncompressed
      frames with the old MIME type. Split this case from streamres into
      a new streamres_legacy class. Streamline the remaining code accordingly.
      
      Add a new flag to streamres to request uncompressed streams. This is
      useful for sending data that is already compressed like a pre-built
      bundle. Expect clients to support uncompressed data. For older clients,
      zlib will still be used.
      
      Differential Revision: https://phab.mercurial-scm.org/D1862
      a39a9df7ecca
  6. Jan 19, 2018
  7. Jan 17, 2018
  8. Jan 19, 2018
    • Pulkit Goyal's avatar
      branch: allow changing branch name to existing name if possible · e5b6ba786d83
      Pulkit Goyal authored
      With the functionality added in previous patch we can change branches of a
      revision but not everytime even if it's possible to do so. For example cosider
      the following case:
      
      o 3  added a (foo)
      o 2  added b (foo)
      o 1  added c (bar)
      o 0  added d (bar)
      
      Here if I want to change the branch of rev 2,3 to bar, it was not possible and
      it will say, "a branch with same name exists".
      
      This patch allows us to change branch of 2,3 to bar. The underlying logic for
      changing branch finds the changesets from the revs passed which have no parents
      in revs. We only support revsets which have only one such root, so to support
      this we check whether the parent of the root has the same name as that of the
      new name and if so, we can use the new name to change branches.
      
      Differential Revision: https://phab.mercurial-scm.org/D1913
      e5b6ba786d83
  9. Oct 15, 2017
    • Pulkit Goyal's avatar
      branch: add a --rev flag to change branch name of given revisions · 3bd8ab4c80a5
      Pulkit Goyal authored
      This patch adds a new --rev flag to hg branch which can be used to change branch
      of revisions. This is motivated from topic extension where you can change topic
      on revisions but this one has few restrictions which are:
      
      1) You cannot change branch name in between the stack
      2) You cannot change branch name and set it to an existing name
      3) You cannot change branch of non-linear set of commits
      4) You cannot change branch of merge commits.
      
      Tests are added for the same.
      
      .. feature::
      
         An experimental flag `--rev` to `hg branch` which can be used to change
         branch of changesets.
      
      Differential Revision: https://phab.mercurial-scm.org/D1074
      3bd8ab4c80a5
  10. Jan 16, 2018
  11. Jan 18, 2018
    • Hollis Blanchard's avatar
      sparse: --include 'dir1/dir2' should not include 'dir1/*' · 7a1806e0daea
      Hollis Blanchard authored
      In 2015 there was a workaround added (f39bace2d6cad32907c0d7961b3c0dbd64a1b7ad)
      to sparse in the hg-experimental repo. That workaround:
      a) no longer seems to be needed, since its testcase passes even with the code
         removed, and
      b) caused a new problem: --include 'dir1/dir2' ended up including dir1/*
         too. (--include 'glob:dir1/dir2' is a user-level workaround.)
      
      Remove the offending code, and add a testcase for situation B.
      7a1806e0daea
  12. Jan 14, 2018
    • Yuya Nishihara's avatar
      fileset: add kind:pat operator · 73432eee0ac4
      Yuya Nishihara authored
      ":" isn't taken as a symbol character but an infix operator so we can write
      e.g. "path:'foo bar'" as well as "'path:foo bar'". An invalid pattern kind
      is rejected in the former form as we know a kind is specified explicitly.
      
      The binding strength is copied from "x:y" range operator of revset. Perhaps
      it can be adjusted later if we want to parse "foo:bar()" as "(foo:bar)()",
      not "foo:(bar())". We can also add "kind:" postfix operator if we want.
      
      One possible confusion is that the scope of the leading "set:" vs "kind:pat"
      operator. The former is consumed by a matcher so applies to the whole fileset
      expression:
      
        $ hg files 'set:foo() or kind:bar or baz'
                        ^^^^^^^^^^^^^^^^^^^^^^^^
      
      Whereas the scope of kind:pat operator is narrow:
      
        $ hg files 'set:foo() or kind:bar or baz'
                                      ^^^
      73432eee0ac4
    • Yuya Nishihara's avatar
      minifileset: unify handling of symbol and string patterns · 06a757b9e334
      Yuya Nishihara authored
      They must be identical for fileset compatibility.
      06a757b9e334
    • Yuya Nishihara's avatar
      fileset: move import of match module to top · 9eb5c400f488
      Yuya Nishihara authored
      Actually there was no circular import issue.
      9eb5c400f488
    • Paul Morelle's avatar
      revlog: group delta computation methods under _deltacomputer object · f90f6fd130c1
      Paul Morelle authored
      Extracting these methods from revlog will allow changing the implementation of
      the deltacomputer, by providing this interface:
        __init__(self, revlog) - constructor that initialize the object from a given
                                 revlog
        buildtext(self, revinfo, fh) - builds the fulltext version of a revision from
                                       a _revisioninfo object and the file handle to
                                       the .d (or .i for inline mode) file.
        finddeltainfo(self, revinfo, fh) - find a revision in the revlog against
                                           which it is acceptable to build a delta,
                                           and build the corresponding _deltainfo.
      
      It should now be easier to write an experimental feature that would replace
      _deltacomputer by another object, for example one that would know how to
      parallelize the delta computation in order to quicken the storage of multiple
      revisions.
      f90f6fd130c1
    • Paul Morelle's avatar
      revlog: refactor out _finddeltainfo from _addrevision · d99b07bc69fb
      Paul Morelle authored
      Splicing the code into smaller chunks should help understanding it,
      and eventually override some parts in experimental branches to try
      optimization.
      d99b07bc69fb
  13. Jan 19, 2018
  14. Jan 18, 2018
  15. Jan 14, 2018
    • Matt Harbison's avatar
      lfs: add the '{lfsattrs}' template keyword to '{lfs_files}' · f58245b9e3ea
      Matt Harbison authored
      This provides access to the metadata dictionary contained within the tracked
      pointer file.  The OID is probably the most important attribute, and has its own
      keyword.  But we might as well have this for completeness.
      
      I liked {pointer} better, but couldn't make it work with the singular/plural
      forms.
      f58245b9e3ea
  16. Jan 18, 2018
  17. Jan 19, 2018
  18. Jan 17, 2018
    • Boris Feld's avatar
      atomicupdate: add an experimental option to use atomictemp when updating · 45b678bf3a78
      Boris Feld authored
      In some cases Mercurial truncating files when updating causes problems. It can
      happens when processes are currently reading the file or with big file or on
      NFS mounts.
      
      We add an experimental option to use the atomictemp option of vfs.__call__ in
      order to avoid the problem.
      
      The localrepository.wwrite seems to assume the files are created without the
      `x` flag; with atomictempfile, the new file might inherit the `x` flag from
      the destination. We force remove it afterward. This code could be refactored
      and the flag processing could be moved inside vfs.
      
      This patch should be tested with
      `--extra-config-opt experimental.update.atomic-file=True`
      as we disabled the option by default.
      
      Differential Revision: https://phab.mercurial-scm.org/D1882
      45b678bf3a78
    • Boris Feld's avatar
      write: add the possibility to pass keyword argument from batchget to vfs · 2a7e777c9eed
      Boris Feld authored
      We are going to pass atomictemp keyword argument from merge.baychget to
      vfs.__call__. Update all the frames to accept **kwargs and pass it to the next
      function.
      
      Differential Revision: https://phab.mercurial-scm.org/D1881
      2a7e777c9eed
  19. Jan 18, 2018
Loading