mercurial/logexchange.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 16 Oct 2019 17:49:30 +0200
changeset 43254 181d28ba05da
parent 43106 d783f945a701
child 45942 89a2afe31e82
permissions -rw-r--r--
copies: avoid instancing more changectx to access parent revisions We just need to know the revision numbers of the parents, creating full context is needlessly expensive. This provide a small, but noticeable performance boost. revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29 before: ! wall 2.885636 comb 2.900000 user 2.870000 sys 0.030000 (median of 10) after: ! wall 2.702270 comb 2.710000 user 2.690000 sys 0.020000 (median of 10) revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2 before: ! wall 4.298271 comb 4.290000 user 4.240000 sys 0.050000 (median of 10) after: ! wall 3.976610 comb 3.970000 user 3.920000 sys 0.050000 (median of 10) revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0 before: ! wall 0.773397 comb 0.770000 user 0.770000 sys 0.000000 (median of 11) after: ! wall 0.701634 comb 0.700000 user 0.700000 sys 0.000000 (median of 13) revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f before: ! wall 0.013585 comb 0.010000 user 0.010000 sys 0.000000 (median of 217) after: ! wall 0.013550 comb 0.010000 user 0.010000 sys 0.000000 (median of 218) revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63 before: ! wall 0.003202 comb 0.000000 user 0.000000 sys 0.000000 (median of 929) after: ! wall 0.002993 comb 0.010000 user 0.010000 sys 0.000000 (median of 992) revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e before: ! wall 0.000077 comb 0.000000 user 0.000000 sys 0.000000 (median of 12060) after: ! wall 0.000072 comb 0.000000 user 0.000000 sys 0.000000 (median of 12804) revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe before: ! wall 0.510614 comb 0.500000 user 0.500000 sys 0.000000 (median of 18) after: ! wall 0.473681 comb 0.470000 user 0.470000 sys 0.000000 (median of 20) revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d before: ! wall 0.126552 comb 0.130000 user 0.130000 sys 0.000000 (median of 77) after: ! wall 0.115240 comb 0.110000 user 0.110000 sys 0.000000 (median of 85) Differential Revision: https://phab.mercurial-scm.org/D7122
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35240
diff changeset
     1
# logexchange.py
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     2
#
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     3
# Copyright 2017 Augie Fackler <raf@durin42.com>
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     4
# Copyright 2017 Sean Farley <sean@farley.io>
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     5
#
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     8
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     9
from __future__ import absolute_import
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    10
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    11
from .node import hex
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    12
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    13
from . import (
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    14
    pycompat,
36059
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
    15
    util,
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    16
    vfs as vfsmod,
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    17
)
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    18
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    19
# directory name in .hg/ in which remotenames files will be present
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    20
remotenamedir = b'logexchange'
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    21
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    22
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    23
def readremotenamefile(repo, filename):
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    24
    """
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35240
diff changeset
    25
    reads a file from .hg/logexchange/ directory and yields it's content
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    26
    filename: the file to be read
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    27
    yield a tuple (node, remotepath, name)
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    28
    """
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    29
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    30
    vfs = vfsmod.vfs(repo.vfs.join(remotenamedir))
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    31
    if not vfs.exists(filename):
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    32
        return
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    33
    f = vfs(filename)
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    34
    lineno = 0
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    35
    for line in f:
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    36
        line = line.strip()
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    37
        if not line:
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    38
            continue
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    39
        # contains the version number
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    40
        if lineno == 0:
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    41
            lineno += 1
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    42
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    43
            node, remote, rname = line.split(b'\0')
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    44
            yield node, remote, rname
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    45
        except ValueError:
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    46
            pass
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    47
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    48
    f.close()
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    49
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    50
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    51
def readremotenames(repo):
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    52
    """
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35240
diff changeset
    53
    read the details about the remotenames stored in .hg/logexchange/ and
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    54
    yields a tuple (node, remotepath, name). It does not yields information
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    55
    about whether an entry yielded is branch or bookmark. To get that
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    56
    information, call the respective functions.
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    57
    """
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    58
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    59
    for bmentry in readremotenamefile(repo, b'bookmarks'):
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    60
        yield bmentry
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    61
    for branchentry in readremotenamefile(repo, b'branches'):
35239
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    62
        yield branchentry
744d1c874a59 remotenames: add functions to read remotenames data from .hg/remotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35237
diff changeset
    63
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    64
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    65
def writeremotenamefile(repo, remotepath, names, nametype):
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    66
    vfs = vfsmod.vfs(repo.vfs.join(remotenamedir))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    67
    f = vfs(nametype, b'w', atomictemp=True)
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    68
    # write the storage version info on top of file
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    69
    # version '0' represents the very initial version of the storage format
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    70
    f.write(b'0\n\n')
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    71
35240
2ea6e42ed15e remotenames: consider existing data while storing newer data
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35239
diff changeset
    72
    olddata = set(readremotenamefile(repo, nametype))
2ea6e42ed15e remotenames: consider existing data while storing newer data
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35239
diff changeset
    73
    # re-save the data from a different remote than this one.
2ea6e42ed15e remotenames: consider existing data while storing newer data
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35239
diff changeset
    74
    for node, oldpath, rname in sorted(olddata):
2ea6e42ed15e remotenames: consider existing data while storing newer data
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35239
diff changeset
    75
        if oldpath != remotepath:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    76
            f.write(b'%s\0%s\0%s\n' % (node, oldpath, rname))
35240
2ea6e42ed15e remotenames: consider existing data while storing newer data
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35239
diff changeset
    77
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    78
    for name, node in sorted(pycompat.iteritems(names)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    79
        if nametype == b"branches":
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    80
            for n in node:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    81
                f.write(b'%s\0%s\0%s\n' % (n, remotepath, name))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    82
        elif nametype == b"bookmarks":
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    83
            if node:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    84
                f.write(b'%s\0%s\0%s\n' % (node, remotepath, name))
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    85
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    86
    f.close()
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    87
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
    88
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    89
def saveremotenames(repo, remotepath, branches=None, bookmarks=None):
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    90
    """
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    91
    save remotenames i.e. remotebookmarks and remotebranches in their
35347
a29fe459fc49 remotenames: rename related file and storage dir to logexchange
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35240
diff changeset
    92
    respective files under ".hg/logexchange/" directory.
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    93
    """
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    94
    wlock = repo.wlock()
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    95
    try:
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    96
        if bookmarks:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    97
            writeremotenamefile(repo, remotepath, bookmarks, b'bookmarks')
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
    98
        if branches:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    99
            writeremotenamefile(repo, remotepath, branches, b'branches')
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
   100
    finally:
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
   101
        wlock.release()
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
   102
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
   103
36059
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   104
def activepath(repo, remote):
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   105
    """returns remote path"""
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   106
    # is the remote a local peer
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   107
    local = remote.local()
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   108
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   109
    # determine the remote path from the repo, if possible; else just
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   110
    # use the string given to us
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   111
    rpath = remote
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   112
    if local:
40420
94c0421d67a0 logexchange: convert paths to unix when detecting the active path
Matt Harbison <matt_harbison@yahoo.com>
parents: 37981
diff changeset
   113
        rpath = util.pconvert(remote._repo.root)
37365
1ccd75027abb py3: use bytes instead of str in instance()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36059
diff changeset
   114
    elif not isinstance(remote, bytes):
36059
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   115
        rpath = remote._url
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   116
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   117
    # represent the remotepath with user defined path name if exists
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
    for path, url in repo.ui.configitems(b'paths'):
36059
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   119
        # remove auth info from user defined url
37981
bbdc1bc56e58 remotenames: check the remotepath with url containing user information too
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37639
diff changeset
   120
        noauthurl = util.removeauth(url)
40420
94c0421d67a0 logexchange: convert paths to unix when detecting the active path
Matt Harbison <matt_harbison@yahoo.com>
parents: 37981
diff changeset
   121
94c0421d67a0 logexchange: convert paths to unix when detecting the active path
Matt Harbison <matt_harbison@yahoo.com>
parents: 37981
diff changeset
   122
        # Standardize on unix style paths, otherwise some {remotenames} end up
94c0421d67a0 logexchange: convert paths to unix when detecting the active path
Matt Harbison <matt_harbison@yahoo.com>
parents: 37981
diff changeset
   123
        # being an absolute path on Windows.
94c0421d67a0 logexchange: convert paths to unix when detecting the active path
Matt Harbison <matt_harbison@yahoo.com>
parents: 37981
diff changeset
   124
        url = util.pconvert(bytes(url))
94c0421d67a0 logexchange: convert paths to unix when detecting the active path
Matt Harbison <matt_harbison@yahoo.com>
parents: 37981
diff changeset
   125
        noauthurl = util.pconvert(noauthurl)
37981
bbdc1bc56e58 remotenames: check the remotepath with url containing user information too
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37639
diff changeset
   126
        if url == rpath or noauthurl == rpath:
36059
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   127
            rpath = path
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   128
            break
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   129
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   130
    return rpath
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   131
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
   132
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   133
def pullremotenames(localrepo, remoterepo):
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   134
    """
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   135
    pulls bookmarks and branches information of the remote repo during a
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   136
    pull or clone operation.
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   137
    localrepo is our local repository
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   138
    remoterepo is the peer instance
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   139
    """
36059
62a428bf6359 logexchange: introduce helper function to get remote path name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35347
diff changeset
   140
    remotepath = activepath(localrepo, remoterepo)
37639
0e50dda7e9c1 logexchange: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37365
diff changeset
   141
0e50dda7e9c1 logexchange: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37365
diff changeset
   142
    with remoterepo.commandexecutor() as e:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
   143
        bookmarks = e.callcommand(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   144
            b'listkeys', {b'namespace': b'bookmarks',}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41365
diff changeset
   145
        ).result()
37639
0e50dda7e9c1 logexchange: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37365
diff changeset
   146
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   147
    # on a push, we don't want to keep obsolete heads since
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   148
    # they won't show up as heads on the next pull, so we
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   149
    # remove them here otherwise we would require the user
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   150
    # to issue a pull to refresh the storage
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   151
    bmap = {}
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   152
    repo = localrepo.unfiltered()
37639
0e50dda7e9c1 logexchange: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37365
diff changeset
   153
0e50dda7e9c1 logexchange: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37365
diff changeset
   154
    with remoterepo.commandexecutor() as e:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   155
        branchmap = e.callcommand(b'branchmap', {}).result()
37639
0e50dda7e9c1 logexchange: use command executor for wire protocol commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37365
diff changeset
   156
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
   157
    for branch, nodes in pycompat.iteritems(branchmap):
35236
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   158
        bmap[branch] = []
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   159
        for node in nodes:
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   160
            if node in repo and not repo[node].obsolete():
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   161
                bmap[branch].append(hex(node))
5a62910948d2 remotenames: move function to pull remotenames from the remoterepo to core
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
   162
35237
8df8ce2cc5dd remotenames: add functionality to store remotenames under .hg/hgremotenames/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35236
diff changeset
   163
    saveremotenames(localrepo, remotepath, bmap, bookmarks)